ZGlmZiAtLWdpdCBhL0xpYi9Db25maWdQYXJzZXIucHkgYi9MaWIvQ29uZmlnUGFyc2VyLnB5CmluZGV4IDZkYzUzYjkuLjY1YzhjZTUgMTAwNjQ0Ci0tLSBhL0xpYi9Db25maWdQYXJzZXIucHkKKysrIGIvTGliL0NvbmZpZ1BhcnNlci5weQpAQCAtMTk5LDExICsxOTksMTEgQEAKICAgICAgICAgc2VsZi5saW5lID0gbGluZQogCiAKLQogY2xhc3MgUmF3Q29uZmlnUGFyc2VyOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZWZhdWx0cz1Ob25lKToKLSAgICAgICAgc2VsZi5fc2VjdGlvbnMgPSB7fQotICAgICAgICBzZWxmLl9kZWZhdWx0cyA9IHt9CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRlZmF1bHRzPU5vbmUsIGRpY3RfdHlwZT1kaWN0KToKKyAgICAgICAgc2VsZi5fZGljdCA9IGRpY3RfdHlwZQorICAgICAgICBzZWxmLl9zZWN0aW9ucyA9IHNlbGYuX2RpY3QoKQorICAgICAgICBzZWxmLl9kZWZhdWx0cyA9IHNlbGYuX2RpY3QoKQogICAgICAgICBpZiBkZWZhdWx0czoKICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGRlZmF1bHRzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgc2VsZi5fZGVmYXVsdHNbc2VsZi5vcHRpb254Zm9ybShrZXkpXSA9IHZhbHVlCkBAIC0yMjQsNyArMjI0LDcgQEAKICAgICAgICAgIiIiCiAgICAgICAgIGlmIHNlY3Rpb24gaW4gc2VsZi5fc2VjdGlvbnM6CiAgICAgICAgICAgICByYWlzZSBEdXBsaWNhdGVTZWN0aW9uRXJyb3Ioc2VjdGlvbikKLSAgICAgICAgc2VsZi5fc2VjdGlvbnNbc2VjdGlvbl0gPSB7fQorICAgICAgICBzZWxmLl9zZWN0aW9uc1tzZWN0aW9uXSA9IHNlbGYuX2RpY3QoKQogCiAgICAgZGVmIGhhc19zZWN0aW9uKHNlbGYsIHNlY3Rpb24pOgogICAgICAgICAiIiJJbmRpY2F0ZSB3aGV0aGVyIHRoZSBuYW1lZCBzZWN0aW9uIGlzIHByZXNlbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uCkBAIC0zMDcsNyArMzA3LDcgQEAKICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgaWYgc2VjdGlvbiAhPSBERUZBVUxUU0VDVDoKICAgICAgICAgICAgICAgICByYWlzZSBOb1NlY3Rpb25FcnJvcihzZWN0aW9uKQotICAgICAgICAgICAgZDIgPSB7fQorICAgICAgICAgICAgZDIgPSBzZWxmLl9kaWN0KCkKICAgICAgICAgZCA9IHNlbGYuX2RlZmF1bHRzLmNvcHkoKQogICAgICAgICBkLnVwZGF0ZShkMikKICAgICAgICAgaWYgIl9fbmFtZV9fIiBpbiBkOgpAQCAtNDUzLDcgKzQ1Myw4IEBACiAgICAgICAgICAgICAgICAgICAgIGVsaWYgc2VjdG5hbWUgPT0gREVGQVVMVFNFQ1Q6CiAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzZWN0ID0gc2VsZi5fZGVmYXVsdHMKICAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNlY3QgPSB7J19fbmFtZV9fJzogc2VjdG5hbWV9CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJzZWN0ID0gc2VsZi5fZGljdCgpCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJzZWN0WydfX25hbWVfXyddID0gc2VjdG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NlY3Rpb25zW3NlY3RuYW1lXSA9IGN1cnNlY3QKICAgICAgICAgICAgICAgICAgICAgIyBTbyBzZWN0aW9ucyBjYW4ndCBzdGFydCB3aXRoIGEgY29udGludWF0aW9uIGxpbmUKICAgICAgICAgICAgICAgICAgICAgb3B0bmFtZSA9IE5vbmUKZGlmZiAtLWdpdCBhL0xpYi9RdWV1ZS5weSBiL0xpYi9RdWV1ZS5weQppbmRleCAwZjgwNTg0Li43OWIwYWJmIDEwMDY0NAotLS0gYS9MaWIvUXVldWUucHkKKysrIGIvTGliL1F1ZXVlLnB5CkBAIC0yNiw3ICsyNiw3IEBACiAgICAgICAgIHNlbGYuX2luaXQobWF4c2l6ZSkKICAgICAgICAgIyBtdXRleCBtdXN0IGJlIGhlbGQgd2hlbmV2ZXIgdGhlIHF1ZXVlIGlzIG11dGF0aW5nLiAgQWxsIG1ldGhvZHMKICAgICAgICAgIyB0aGF0IGFjcXVpcmUgbXV0ZXggbXVzdCByZWxlYXNlIGl0IGJlZm9yZSByZXR1cm5pbmcuICBtdXRleAotICAgICAgICAjIGlzIHNoYXJlZCBiZXR3ZWVuIHRoZSB0d28gY29uZGl0aW9ucywgc28gYWNxdWlyaW5nIGFuZAorICAgICAgICAjIGlzIHNoYXJlZCBiZXR3ZWVuIHRoZSB0aHJlZSBjb25kaXRpb25zLCBzbyBhY3F1aXJpbmcgYW5kCiAgICAgICAgICMgcmVsZWFzaW5nIHRoZSBjb25kaXRpb25zIGFsc28gYWNxdWlyZXMgYW5kIHJlbGVhc2VzIG11dGV4LgogICAgICAgICBzZWxmLm11dGV4ID0gdGhyZWFkaW5nLkxvY2soKQogICAgICAgICAjIE5vdGlmeSBub3RfZW1wdHkgd2hlbmV2ZXIgYW4gaXRlbSBpcyBhZGRlZCB0byB0aGUgcXVldWU7IGEKZGlmZiAtLWdpdCBhL0xpYi9TaW1wbGVYTUxSUENTZXJ2ZXIucHkgYi9MaWIvU2ltcGxlWE1MUlBDU2VydmVyLnB5CmluZGV4IDNiMGE2YTUuLmM2ZjY5NTggMTAwNjQ0Ci0tLSBhL0xpYi9TaW1wbGVYTUxSUENTZXJ2ZXIucHkKKysrIGIvTGliL1NpbXBsZVhNTFJQQ1NlcnZlci5weQpAQCAtMjY0LDggKzI2NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZz1zZWxmLmVuY29kaW5nKQogICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAjIHJlcG9ydCBleGNlcHRpb24gYmFjayB0byBzZXJ2ZXIKKyAgICAgICAgICAgIGV4Y190eXBlLCBleGNfdmFsdWUsIGV4Y190YiA9IHN5cy5leGNfaW5mbygpCiAgICAgICAgICAgICByZXNwb25zZSA9IHhtbHJwY2xpYi5kdW1wcygKLSAgICAgICAgICAgICAgICB4bWxycGNsaWIuRmF1bHQoMSwgIiVzOiVzIiAlIHN5cy5leGNfaW5mbygpWzoyXSksCisgICAgICAgICAgICAgICAgeG1scnBjbGliLkZhdWx0KDEsICIlczolcyIgJSAoZXhjX3R5cGUsIGV4Y192YWx1ZSkpLAogICAgICAgICAgICAgICAgIGVuY29kaW5nPXNlbGYuZW5jb2RpbmcsIGFsbG93X25vbmU9c2VsZi5hbGxvd19ub25lLAogICAgICAgICAgICAgICAgICkKIApAQCAtMzY0LDkgKzM2NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgJ2ZhdWx0U3RyaW5nJyA6IGZhdWx0LmZhdWx0U3RyaW5nfQogICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgZXhjX3R5cGUsIGV4Y192YWx1ZSwgZXhjX3RiID0gc3lzLmV4Y19pbmZvKCkKICAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgeydmYXVsdENvZGUnIDogMSwKLSAgICAgICAgICAgICAgICAgICAgICdmYXVsdFN0cmluZycgOiAiJXM6JXMiICUgc3lzLmV4Y19pbmZvKClbOjJdfQorICAgICAgICAgICAgICAgICAgICAgJ2ZhdWx0U3RyaW5nJyA6ICIlczolcyIgJSAoZXhjX3R5cGUsIGV4Y192YWx1ZSl9CiAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgcmV0dXJuIHJlc3VsdHMKIApkaWZmIC0tZ2l0IGEvTGliL19zdHJwdGltZS5weSBiL0xpYi9fc3RycHRpbWUucHkKaW5kZXggY2U4NTI1Yi4uM2ZiNTYwMiAxMDA2NDQKLS0tIGEvTGliL19zdHJwdGltZS5weQorKysgYi9MaWIvX3N0cnB0aW1lLnB5CkBAIC0zMDYsNyArMzA2LDcgQEAKICAgICAgICAgX2NhY2hlX2xvY2sucmVsZWFzZSgpCiAgICAgZm91bmQgPSBmb3JtYXRfcmVnZXgubWF0Y2goZGF0YV9zdHJpbmcpCiAgICAgaWYgbm90IGZvdW5kOgotICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ0aW1lIGRhdGEgZGlkIG5vdCBtYXRjaCBmb3JtYXQ6ICBkYXRhPSVzICBmbXQ9JXMiICUKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidGltZSBkYXRhICVyIGRvZXMgbm90IG1hdGNoIGZvcm1hdCAlciIgJQogICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhX3N0cmluZywgZm9ybWF0KSkKICAgICBpZiBsZW4oZGF0YV9zdHJpbmcpICE9IGZvdW5kLmVuZCgpOgogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmNvbnZlcnRlZCBkYXRhIHJlbWFpbnM6ICVzIiAlCmRpZmYgLS1naXQgYS9MaWIvYXRleGl0LnB5IGIvTGliL2F0ZXhpdC5weQppbmRleCBjOWY0Y2M2Li45M2ZkZGY3IDEwMDY0NAotLS0gYS9MaWIvYXRleGl0LnB5CisrKyBiL0xpYi9hdGV4aXQucHkKQEAgLTQwLDggKzQwLDExIEBACiAgICAgZnVuYyAtIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhdCBleGl0CiAgICAgdGFyZ3MgLSBvcHRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byBmdW5jCiAgICAga2FyZ3MgLSBvcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cyB0byBwYXNzIHRvIGZ1bmMKKworICAgIGZ1bmMgaXMgcmV0dXJuZWQgdG8gZmFjaWxpdGF0ZSB1c2FnZSBhcyBhIGRlY29yYXRvci4KICAgICAiIiIKICAgICBfZXhpdGhhbmRsZXJzLmFwcGVuZCgoZnVuYywgdGFyZ3MsIGthcmdzKSkKKyAgICByZXR1cm4gZnVuYwogCiBpZiBoYXNhdHRyKHN5cywgImV4aXRmdW5jIik6CiAgICAgIyBBc3N1bWUgaXQncyBhbm90aGVyIHJlZ2lzdGVyZWQgZXhpdCBmdW5jdGlvbiAtIGFwcGVuZCBpdCB0byBvdXIgbGlzdApkaWZmIC0tZ2l0IGEvTGliL2Jhc2U2NC5weSBiL0xpYi9iYXNlNjQucHkKaW5kZXggYzE5NmNkOC4uNDFhNWUxNCAxMDA3NTUKLS0tIGEvTGliL2Jhc2U2NC5weQorKysgYi9MaWIvYmFzZTY0LnB5CkBAIC0zMDgsNyArMzA4LDcgQEAKIAogCiBkZWYgZW5jb2Rlc3RyaW5nKHMpOgotICAgICIiIkVuY29kZSBhIHN0cmluZy4iIiIKKyAgICAiIiJFbmNvZGUgYSBzdHJpbmcgaW50byBtdWx0aXBsZSBsaW5lcyBvZiBiYXNlLTY0IGRhdGEuIiIiCiAgICAgcGllY2VzID0gW10KICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4ocyksIE1BWEJJTlNJWkUpOgogICAgICAgICBjaHVuayA9IHNbaSA6IGkgKyBNQVhCSU5TSVpFXQpkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9kYm9iai5weSBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfZGJvYmoucHkKaW5kZXggMTMwNTg4My4uYmJhNmE1YiAxMDA2NDQKLS0tIGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9kYm9iai5weQorKysgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X2Rib2JqLnB5CkBAIC02OSw2ICs2OSwxMCBAQAogICAgICAgICBzZWxmLmRiLmNsb3NlKCkKICAgICAgICAgc2VsZi5lbnYuY2xvc2UoKQogCisgICAgZGVmIHRlc3QwM19kYm9ial90eXBlX2JlZm9yZV9vcGVuKHNlbGYpOgorICAgICAgICAjIEVuc3VyZSB0aGlzIGRvZXNuJ3QgY2F1c2UgYSBzZWdmYXVsdC4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJJbnZhbGlkQXJnRXJyb3IsIGRiLkRCKCkudHlwZSkKKwogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogZGVmIHRlc3Rfc3VpdGUoKToKZGlmZiAtLWdpdCBhL0xpYi9jZ2kucHkgYi9MaWIvY2dpLnB5CmluZGV4IGZhOGZkMTMuLjgwYjNiN2EgMTAwNzU1Ci0tLSBhL0xpYi9jZ2kucHkKKysrIGIvTGliL2NnaS5weQpAQCAtNzk5LDggKzc5OSwxMCBAQAogICAgIGZvcm0uZGljdCA9PSB7a2V5OiBbdmFsLCB2YWwsIC4uLl0sIC4uLn0KIAogICAgICIiIgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbnZpcm9uPW9zLmVudmlyb24pOgotICAgICAgICBzZWxmLmRpY3QgPSBzZWxmLmRhdGEgPSBwYXJzZShlbnZpcm9uPWVudmlyb24pCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVudmlyb249b3MuZW52aXJvbiwga2VlcF9ibGFua192YWx1ZXM9MCwgc3RyaWN0X3BhcnNpbmc9MCk6CisgICAgICAgIHNlbGYuZGljdCA9IHNlbGYuZGF0YSA9IHBhcnNlKGVudmlyb249ZW52aXJvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcF9ibGFua192YWx1ZXM9a2VlcF9ibGFua192YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdF9wYXJzaW5nPXN0cmljdF9wYXJzaW5nKQogICAgICAgICBzZWxmLnF1ZXJ5X3N0cmluZyA9IGVudmlyb25bJ1FVRVJZX1NUUklORyddCiAKIApkaWZmIC0tZ2l0IGEvTGliL2NvZGVjcy5weSBiL0xpYi9jb2RlY3MucHkKaW5kZXggMTUxOGQ3NS4uZjgzNGI4ZCAxMDA2NDQKLS0tIGEvTGliL2NvZGVjcy5weQorKysgYi9MaWIvY29kZWNzLnB5CkBAIC0zMjksNiArMzI5LDEyIEBACiAgICAgICAgICIiIgogICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLnN0cmVhbSwgbmFtZSkKIAorICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRiKToKKyAgICAgICAgc2VsZi5zdHJlYW0uY2xvc2UoKQorCiAjIyMKIAogY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjKToKQEAgLTU2OCw2ICs1NzQsMTIgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuc3RyZWFtLCBuYW1lKQogCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdGIpOgorICAgICAgICBzZWxmLnN0cmVhbS5jbG9zZSgpCisKICMjIwogCiBjbGFzcyBTdHJlYW1SZWFkZXJXcml0ZXI6CkBAIC02NDEsNiArNjUzLDE0IEBACiAgICAgICAgICIiIgogICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLnN0cmVhbSwgbmFtZSkKIAorICAgICMgdGhlc2UgYXJlIG5lZWRlZCB0byBtYWtlICJ3aXRoIGNvZGVjcy5vcGVuKC4uLikiIHdvcmsgcHJvcGVybHkKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRiKToKKyAgICAgICAgc2VsZi5zdHJlYW0uY2xvc2UoKQorCiAjIyMKIAogY2xhc3MgU3RyZWFtUmVjb2RlcjoKQEAgLTc1MSw2ICs3NzEsMTIgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuc3RyZWFtLCBuYW1lKQogCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdGIpOgorICAgICAgICBzZWxmLnN0cmVhbS5jbG9zZSgpCisKICMjIyBTaG9ydGN1dHMKIAogZGVmIG9wZW4oZmlsZW5hbWUsIG1vZGU9J3JiJywgZW5jb2Rpbmc9Tm9uZSwgZXJyb3JzPSdzdHJpY3QnLCBidWZmZXJpbmc9MSk6CkBAIC04MjQsOSArODUwLDEwIEBACiAgICAgIiIiCiAgICAgaWYgZmlsZV9lbmNvZGluZyBpcyBOb25lOgogICAgICAgICBmaWxlX2VuY29kaW5nID0gZGF0YV9lbmNvZGluZwotICAgIGluZm8gPSBsb29rdXAoZGF0YV9lbmNvZGluZykKLSAgICBzciA9IFN0cmVhbVJlY29kZXIoZmlsZSwgaW5mby5lbmNvZGUsIGluZm8uZGVjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnN0cmVhbXJlYWRlciwgaW5mby5zdHJlYW13cml0ZXIsIGVycm9ycykKKyAgICBkYXRhX2luZm8gPSBsb29rdXAoZGF0YV9lbmNvZGluZykKKyAgICBmaWxlX2luZm8gPSBsb29rdXAoZmlsZV9lbmNvZGluZykKKyAgICBzciA9IFN0cmVhbVJlY29kZXIoZmlsZSwgZGF0YV9pbmZvLmVuY29kZSwgZGF0YV9pbmZvLmRlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9pbmZvLnN0cmVhbXJlYWRlciwgZmlsZV9pbmZvLnN0cmVhbXdyaXRlciwgZXJyb3JzKQogICAgICMgQWRkIGF0dHJpYnV0ZXMgdG8gc2ltcGxpZnkgaW50cm9zcGVjdGlvbgogICAgIHNyLmRhdGFfZW5jb2RpbmcgPSBkYXRhX2VuY29kaW5nCiAgICAgc3IuZmlsZV9lbmNvZGluZyA9IGZpbGVfZW5jb2RpbmcKZGlmZiAtLWdpdCBhL0xpYi9jb2xvcnN5cy5weSBiL0xpYi9jb2xvcnN5cy5weQppbmRleCAzOWI0YjE2Li44NTE0MTdiIDEwMDY0NAotLS0gYS9MaWIvY29sb3JzeXMucHkKKysrIGIvTGliL2NvbG9yc3lzLnB5CkBAIC0xMTcsNyArMTE3LDggQEAKICAgICBwID0gdiooMS4wIC0gcykKICAgICBxID0gdiooMS4wIC0gcypmKQogICAgIHQgPSB2KigxLjAgLSBzKigxLjAtZikpCi0gICAgaWYgaSU2ID09IDA6IHJldHVybiB2LCB0LCBwCisgICAgaSA9IGklNgorICAgIGlmIGkgPT0gMDogcmV0dXJuIHYsIHQsIHAKICAgICBpZiBpID09IDE6IHJldHVybiBxLCB2LCBwCiAgICAgaWYgaSA9PSAyOiByZXR1cm4gcCwgdiwgdAogICAgIGlmIGkgPT0gMzogcmV0dXJuIHAsIHEsIHYKZGlmZiAtLWdpdCBhL0xpYi9jb21waWxlci9weWNvZGVnZW4ucHkgYi9MaWIvY29tcGlsZXIvcHljb2RlZ2VuLnB5CmluZGV4IGIwOGEzMDcuLjM1M2MyYzkgMTAwNjQ0Ci0tLSBhL0xpYi9jb21waWxlci9weWNvZGVnZW4ucHkKKysrIGIvTGliL2NvbXBpbGVyL3B5Y29kZWdlbi5weQpAQCAtNTc3LDEyICs1NzcsMTEgQEAKICAgICBkZWYgdmlzaXRMaXN0Q29tcChzZWxmLCBub2RlKToKICAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCiAgICAgICAgICMgc2V0dXAgbGlzdAotICAgICAgICBhcHBlbmQgPSAiJGFwcGVuZCVkIiAlIHNlbGYuX19saXN0X2NvdW50CisgICAgICAgIHRtcG5hbWUgPSAiJGxpc3QlZCIgJSBzZWxmLl9fbGlzdF9jb3VudAogICAgICAgICBzZWxmLl9fbGlzdF9jb3VudCA9IHNlbGYuX19saXN0X2NvdW50ICsgMQogICAgICAgICBzZWxmLmVtaXQoJ0JVSUxEX0xJU1QnLCAwKQogICAgICAgICBzZWxmLmVtaXQoJ0RVUF9UT1AnKQotICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQVRUUicsICdhcHBlbmQnKQotICAgICAgICBzZWxmLl9pbXBsaWNpdE5hbWVPcCgnU1RPUkUnLCBhcHBlbmQpCisgICAgICAgIHNlbGYuX2ltcGxpY2l0TmFtZU9wKCdTVE9SRScsIHRtcG5hbWUpCiAKICAgICAgICAgc3RhY2sgPSBbXQogICAgICAgICBmb3IgaSwgZm9yXyBpbiB6aXAocmFuZ2UobGVuKG5vZGUucXVhbHMpKSwgbm9kZS5xdWFscyk6CkBAIC01OTQsMTAgKzU5Myw5IEBACiAgICAgICAgICAgICAgICAgc2VsZi52aXNpdChpZl8sIGNvbnQpCiAgICAgICAgICAgICBzdGFjay5pbnNlcnQoMCwgKHN0YXJ0LCBjb250LCBhbmNob3IpKQogCi0gICAgICAgIHNlbGYuX2ltcGxpY2l0TmFtZU9wKCdMT0FEJywgYXBwZW5kKQorICAgICAgICBzZWxmLl9pbXBsaWNpdE5hbWVPcCgnTE9BRCcsIHRtcG5hbWUpCiAgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByKQotICAgICAgICBzZWxmLmVtaXQoJ0NBTExfRlVOQ1RJT04nLCAxKQotICAgICAgICBzZWxmLmVtaXQoJ1BPUF9UT1AnKQorICAgICAgICBzZWxmLmVtaXQoJ0xJU1RfQVBQRU5EJykKIAogICAgICAgICBmb3Igc3RhcnQsIGNvbnQsIGFuY2hvciBpbiBzdGFjazoKICAgICAgICAgICAgIGlmIGNvbnQ6CkBAIC02MDgsNyArNjA2LDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLm5leHRCbG9jayhza2lwX29uZSkKICAgICAgICAgICAgIHNlbGYuZW1pdCgnSlVNUF9BQlNPTFVURScsIHN0YXJ0KQogICAgICAgICAgICAgc2VsZi5zdGFydEJsb2NrKGFuY2hvcikKLSAgICAgICAgc2VsZi5faW1wbGljaXROYW1lT3AoJ0RFTEVURScsIGFwcGVuZCkKKyAgICAgICAgc2VsZi5faW1wbGljaXROYW1lT3AoJ0RFTEVURScsIHRtcG5hbWUpCiAKICAgICAgICAgc2VsZi5fX2xpc3RfY291bnQgPSBzZWxmLl9fbGlzdF9jb3VudCAtIDEKIApkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy9fX2luaXRfXy5weSBiL0xpYi9jdHlwZXMvX19pbml0X18ucHkKaW5kZXggNzhhMmFiOC4uZWI1ZDk3ZSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy9fX2luaXRfXy5weQorKysgYi9MaWIvY3R5cGVzL19faW5pdF9fLnB5CkBAIC00MjcsNiArNDI3LDggQEAKICAgICBjX3NpemVfdCA9IGNfdWludAogZWxpZiBzaXplb2YoY191bG9uZykgPT0gc2l6ZW9mKGNfdm9pZF9wKToKICAgICBjX3NpemVfdCA9IGNfdWxvbmcKK2VsaWYgc2l6ZW9mKGNfdWxvbmdsb25nKSA9PSBzaXplb2YoY192b2lkX3ApOgorICAgIGNfc2l6ZV90ID0gY191bG9uZ2xvbmcKIAogIyBmdW5jdGlvbnMKIApkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L19faW5pdF9fLnB5IGIvTGliL2N0eXBlcy90ZXN0L19faW5pdF9fLnB5CmluZGV4IDJhZTU0MDUuLjJiNzQ1YzIgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC9fX2luaXRfXy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvX19pbml0X18ucHkKQEAgLTM3LDcgKzM3LDggQEAKIAogZGVmIGZpbmRfcGFja2FnZV9tb2R1bGVzKHBhY2thZ2UsIG1hc2spOgogICAgIGltcG9ydCBmbm1hdGNoCi0gICAgaWYgaGFzYXR0cihwYWNrYWdlLCAiX19sb2FkZXJfXyIpOgorICAgIGlmIChoYXNhdHRyKHBhY2thZ2UsICJfX2xvYWRlcl9fIikgYW5kCisgICAgICAgICAgICBoYXNhdHRyKHBhY2thZ2UuX19sb2FkZXJfXywgJ19maWxlcycpKToKICAgICAgICAgcGF0aCA9IHBhY2thZ2UuX19uYW1lX18ucmVwbGFjZSgiLiIsIG9zLnBhdGguc2VwKQogICAgICAgICBtYXNrID0gb3MucGF0aC5qb2luKHBhdGgsIG1hc2spCiAgICAgICAgIGZvciBmbm0gaW4gcGFja2FnZS5fX2xvYWRlcl9fLl9maWxlcy5pdGVya2V5cygpOgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYml0ZmllbGRzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYml0ZmllbGRzLnB5CmluZGV4IDkyYzQ2NjkuLjI4NjdjYmYgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9iaXRmaWVsZHMucHkKQEAgLTIxNSw1ICsyMTUsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfdWJ5dGUsIDQpXQogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2J5dGUpKQogCisgICAgZGVmIHRlc3RfYW5vbl9iaXRmaWVsZHMoc2VsZik6CisgICAgICAgICMgYW5vbnltb3VzIGJpdC1maWVsZHMgZ2F2ZSBhIHN0cmFuZ2UgZXJyb3IgbWVzc2FnZQorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2J5dGUsIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY191Ynl0ZSwgNCldCisgICAgICAgIGNsYXNzIFkoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9hbm9ueW1vdXNfID0gWyJfIl0KKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiXyIsIFgpXQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FsbGJhY2tzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FsbGJhY2tzLnB5CmluZGV4IDlkOTZhNTQuLmY0N2ZjMzcgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NhbGxiYWNrcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYWxsYmFja3MucHkKQEAgLTEwMSw2ICsxMDEsMTkgQEAKICAgICAgICAgICAgIGFmdGVyID0gZ3JjKG8pCiAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoYWZ0ZXIsIG8pLCAoYmVmb3JlLCBvKSkKIAorICAgIGRlZiB0ZXN0X3Vuc3VwcG9ydGVkX3Jlc3R5cGVfMShzZWxmKToKKyAgICAgICAgIyBPbmx5ICJmdW5kYW1lbnRhbCIgcmVzdWx0IHR5cGVzIGFyZSBzdXBwb3J0ZWQgZm9yIGNhbGxiYWNrCisgICAgICAgICMgZnVuY3Rpb25zLCB0aGUgdHlwZSBtdXN0IGhhdmUgYSBub24tTlVMTCBzdGdkaWN0LT5zZXRmdW5jLgorICAgICAgICAjIFBPSU5URVIoY19kb3VibGUpLCBmb3IgZXhhbXBsZSwgaXMgbm90IHN1cHBvcnRlZC4KKworICAgICAgICBwcm90b3R5cGUgPSBzZWxmLmZ1bmN0eXBlLmltX2Z1bmMoUE9JTlRFUihjX2RvdWJsZSkpCisgICAgICAgICMgVGhlIHR5cGUgaXMgY2hlY2tlZCB3aGVuIHRoZSBwcm90b3R5cGUgaXMgY2FsbGVkCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG90eXBlLCBsYW1iZGE6IE5vbmUpCisKKyAgICBkZWYgdGVzdF91bnN1cHBvcnRlZF9yZXN0eXBlXzIoc2VsZik6CisgICAgICAgIHByb3RvdHlwZSA9IHNlbGYuZnVuY3R5cGUuaW1fZnVuYyhvYmplY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG90eXBlLCBsYW1iZGE6IE5vbmUpCisKIHRyeToKICAgICBXSU5GVU5DVFlQRQogZXhjZXB0IE5hbWVFcnJvcjoKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYXN0LnB5CmluZGV4IDA5ZTkyOGYuLjczNzFiMGYgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FzdC5weQpAQCAtNTcsNSArNTcsMjEgQEAKICAgICAgICAgY19pbnQoKQogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzo0XSwgWzEsIDIsIDk2LCA0XSkKIAorICAgIGRlZiB0ZXN0X2NoYXJfcChzZWxmKToKKyAgICAgICAgIyBUaGlzIGRpZG4ndCB3b3JrOiBiYWQgYXJndW1lbnQgdG8gaW50ZXJuYWwgZnVuY3Rpb24KKyAgICAgICAgcyA9IGNfY2hhcl9wKCJoaWhvIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2FzdChjYXN0KHMsIGNfdm9pZF9wKSwgY19jaGFyX3ApLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlobyIpCisKKyAgICB0cnk6CisgICAgICAgIGNfd2NoYXJfcAorICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBkZWYgdGVzdF93Y2hhcl9wKHNlbGYpOgorICAgICAgICAgICAgcyA9IGNfd2NoYXJfcCgiaGlobyIpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjYXN0KGNhc3QocywgY192b2lkX3ApLCBjX3djaGFyX3ApLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhpaG8iKQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHkKaW5kZXggOGE0NTMxZC4uNjEzMTYzZCAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5CkBAIC0zODEsNSArMzgxLDM1IEBACiAgICAgICAgIHMucCA9IE5vbmUKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy54LCAxMjM0NTY3OCkKIAorY2xhc3MgVGVzdFJlY3Vyc2l2ZVN0cnVjdHVyZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfY29udGFpbnNfaXRzZWxmKHNlbGYpOgorICAgICAgICBjbGFzcyBSZWN1cnNpdmUoU3RydWN0dXJlKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBSZWN1cnNpdmUuX2ZpZWxkc18gPSBbKCJuZXh0IiwgUmVjdXJzaXZlKV0KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yLCBkZXRhaWxzOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCJTdHJ1Y3R1cmUgb3IgdW5pb24gY2Fubm90IGNvbnRhaW4gaXRzZWxmIiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cihkZXRhaWxzKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU3RydWN0dXJlIG9yIHVuaW9uIGNhbm5vdCBjb250YWluIGl0c2VsZiIpCisKKworICAgIGRlZiB0ZXN0X3ZpY2VfdmVyc2Eoc2VsZik6CisgICAgICAgIGNsYXNzIEZpcnN0KFN0cnVjdHVyZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIFNlY29uZChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIEZpcnN0Ll9maWVsZHNfID0gWygic2Vjb25kIiwgU2Vjb25kKV0KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBTZWNvbmQuX2ZpZWxkc18gPSBbKCJmaXJzdCIsIEZpcnN0KV0KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yLCBkZXRhaWxzOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCJfZmllbGRzXyBpcyBmaW5hbCIgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoZGV0YWlscykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkF0dHJpYnV0ZUVycm9yIG5vdCByYWlzZWQiKQorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF93aW4zMi5weQppbmRleCBkYjUzMGQzLi4xMGRlYWNhIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF93aW4zMi5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF93aW4zMi5weQpAQCAtNiw3ICs2LDggQEAKIAogaW1wb3J0IF9jdHlwZXNfdGVzdAogCi1pZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKK2lmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiIGFuZCBzaXplb2YoY192b2lkX3ApID09IHNpemVvZihjX2ludCk6CisgICAgIyBPbmx5IHdpbmRvd3MgMzItYml0IGhhcyBkaWZmZXJlbnQgY2FsbGluZyBjb252ZW50aW9ucy4KIAogICAgIGNsYXNzIFdpbmRvd3NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgICAgIGRlZiB0ZXN0X2NhbGxjb252XzEoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvZGVjaW1hbC5weSBiL0xpYi9kZWNpbWFsLnB5CmluZGV4IDJmMmE2MTcuLjg2NDU1ZjMgMTAwNjQ0Ci0tLSBhL0xpYi9kZWNpbWFsLnB5CisrKyBiL0xpYi9kZWNpbWFsLnB5CkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICAnUk9VTkRfRkxPT1InLCAnUk9VTkRfVVAnLCAnUk9VTkRfSEFMRl9ET1dOJywKIAogICAgICMgRnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgY29udGV4dHMKLSAgICAnc2V0Y29udGV4dCcsICdnZXRjb250ZXh0JworICAgICdzZXRjb250ZXh0JywgJ2dldGNvbnRleHQnLCAnbG9jYWxjb250ZXh0JwogXQogCiBpbXBvcnQgY29weSBhcyBfY29weQpAQCAtNDU4LDYgKzQ1OCw0OSBAQAogCiAgICAgZGVsIHRocmVhZGluZywgbG9jYWwgICAgICAgICMgRG9uJ3QgY29udGFtaW5hdGUgdGhlIG5hbWVzcGFjZQogCitkZWYgbG9jYWxjb250ZXh0KGN0eD1Ob25lKToKKyAgICAiIiJSZXR1cm4gYSBjb250ZXh0IG1hbmFnZXIgZm9yIGEgY29weSBvZiB0aGUgc3VwcGxpZWQgY29udGV4dAorCisgICAgVXNlcyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgY29udGV4dCBpZiBubyBjb250ZXh0IGlzIHNwZWNpZmllZAorICAgIFRoZSByZXR1cm5lZCBjb250ZXh0IG1hbmFnZXIgY3JlYXRlcyBhIGxvY2FsIGRlY2ltYWwgY29udGV4dAorICAgIGluIGEgd2l0aCBzdGF0ZW1lbnQ6CisgICAgICAgIGRlZiBzaW4oeCk6CisgICAgICAgICAgICAgd2l0aCBsb2NhbGNvbnRleHQoKSBhcyBjdHg6CisgICAgICAgICAgICAgICAgIGN0eC5wcmVjICs9IDIKKyAgICAgICAgICAgICAgICAgIyBSZXN0IG9mIHNpbiBjYWxjdWxhdGlvbiBhbGdvcml0aG0KKyAgICAgICAgICAgICAgICAgIyB1c2VzIGEgcHJlY2lzaW9uIDIgZ3JlYXRlciB0aGFuIG5vcm1hbAorICAgICAgICAgICAgIHJldHVybiArcyAjIENvbnZlcnQgcmVzdWx0IHRvIG5vcm1hbCBwcmVjaXNpb24KKworICAgICAgICAgZGVmIHNpbih4KToKKyAgICAgICAgICAgICB3aXRoIGxvY2FsY29udGV4dChFeHRlbmRlZENvbnRleHQpOgorICAgICAgICAgICAgICAgICAjIFJlc3Qgb2Ygc2luIGNhbGN1bGF0aW9uIGFsZ29yaXRobQorICAgICAgICAgICAgICAgICAjIHVzZXMgdGhlIEV4dGVuZGVkIENvbnRleHQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgIyBHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBTcGVjaWZpY2F0aW9uCisgICAgICAgICAgICAgcmV0dXJuICtzICMgQ29udmVydCByZXN1bHQgdG8gbm9ybWFsIGNvbnRleHQKKworICAgICIiIgorICAgICMgVGhlIHN0cmluZyBiZWxvdyBjYW4ndCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jc3RyaW5nIHVudGlsIFB5dGhvbiAyLjYKKyAgICAjIGFzIHRoZSBkb2N0ZXN0IG1vZHVsZSBkb2Vzbid0IHVuZGVyc3RhbmQgX19mdXR1cmVfXyBzdGF0ZW1lbnRzCisgICAgIiIiCisgICAgPj4+IGZyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKKyAgICA+Pj4gcHJpbnQgZ2V0Y29udGV4dCgpLnByZWMKKyAgICAyOAorICAgID4+PiB3aXRoIGxvY2FsY29udGV4dCgpOgorICAgIC4uLiAgICAgY3R4ID0gZ2V0Y29udGV4dCgpCisgICAgLi4uICAgICBjdHgucHJlYygpICs9IDIKKyAgICAuLi4gICAgIHByaW50IGN0eC5wcmVjCisgICAgLi4uCisgICAgMzAKKyAgICA+Pj4gd2l0aCBsb2NhbGNvbnRleHQoRXh0ZW5kZWRDb250ZXh0KToKKyAgICAuLi4gICAgIHByaW50IGdldGNvbnRleHQoKS5wcmVjCisgICAgLi4uCisgICAgOQorICAgID4+PiBwcmludCBnZXRjb250ZXh0KCkucHJlYworICAgIDI4CisgICAgIiIiCisgICAgaWYgY3R4IGlzIE5vbmU6IGN0eCA9IGdldGNvbnRleHQoKQorICAgIHJldHVybiBfQ29udGV4dE1hbmFnZXIoY3R4KQorCiAKICMjIyMjIERlY2ltYWwgY2xhc3MgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCkBAIC0yMTkyLDIzICsyMjM1LDE0IEBACiAKIGRlbCBuYW1lLCB2YWwsIGdsb2JhbG5hbWUsIHJvdW5kaW5nX2Z1bmN0aW9ucwogCi1jbGFzcyBDb250ZXh0TWFuYWdlcihvYmplY3QpOgotICAgICIiIkhlbHBlciBjbGFzcyB0byBzaW1wbGlmeSBDb250ZXh0IG1hbmFnZW1lbnQuCitjbGFzcyBfQ29udGV4dE1hbmFnZXIob2JqZWN0KToKKyAgICAiIiJDb250ZXh0IG1hbmFnZXIgY2xhc3MgdG8gc3VwcG9ydCBsb2NhbGNvbnRleHQoKS4KIAotICAgIFNhbXBsZSB1c2FnZToKLQotICAgIHdpdGggZGVjaW1hbC5FeHRlbmRlZENvbnRleHQ6Ci0gICAgICAgIHMgPSAuLi4KLSAgICByZXR1cm4gK3MgIyBDb252ZXJ0IHJlc3VsdCB0byBub3JtYWwgcHJlY2lzaW9uCi0KLSAgICB3aXRoIGRlY2ltYWwuZ2V0Y29udGV4dCgpIGFzIGN0eDoKLSAgICAgICAgY3R4LnByZWMgKz0gMgotICAgICAgICBzID0gLi4uCi0gICAgcmV0dXJuICtzCi0KKyAgICAgIFNldHMgYSBjb3B5IG9mIHRoZSBzdXBwbGllZCBjb250ZXh0IGluIF9fZW50ZXJfXygpIGFuZCByZXN0b3JlcworICAgICAgdGhlIHByZXZpb3VzIGRlY2ltYWwgY29udGV4dCBpbiBfX2V4aXRfXygpCiAgICAgIiIiCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5ld19jb250ZXh0KToKLSAgICAgICAgc2VsZi5uZXdfY29udGV4dCA9IG5ld19jb250ZXh0CisgICAgICAgIHNlbGYubmV3X2NvbnRleHQgPSBuZXdfY29udGV4dC5jb3B5KCkKICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgICBzZWxmLnNhdmVkX2NvbnRleHQgPSBnZXRjb250ZXh0KCkKICAgICAgICAgc2V0Y29udGV4dChzZWxmLm5ld19jb250ZXh0KQpAQCAtMjI2Nyw5ICsyMzAxLDYgQEAKICAgICAgICAgcy5hcHBlbmQoJ3RyYXBzPVsnICsgJywgJy5qb2luKFt0Ll9fbmFtZV9fIGZvciB0LCB2IGluIHNlbGYudHJhcHMuaXRlbXMoKSBpZiB2XSkgKyAnXScpCiAgICAgICAgIHJldHVybiAnLCAnLmpvaW4ocykgKyAnKScKIAotICAgIGRlZiBnZXRfbWFuYWdlcihzZWxmKToKLSAgICAgICAgcmV0dXJuIENvbnRleHRNYW5hZ2VyKHNlbGYuY29weSgpKQotCiAgICAgZGVmIGNsZWFyX2ZsYWdzKHNlbGYpOgogICAgICAgICAiIiJSZXNldCBhbGwgZmxhZ3MgdG8gemVybyIiIgogICAgICAgICBmb3IgZmxhZyBpbiBzZWxmLmZsYWdzOgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9ycG0ucHkKaW5kZXggNWIwOTk2NS4uNmYwZTBkOCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfcnBtLnB5CkBAIC0zMzcsMzcgKzMzNyw0NyBAQAogICAgICAgICBpZiBub3Qgc2VsZi5rZWVwX3RlbXA6CiAgICAgICAgICAgICBycG1fY21kLmFwcGVuZCgnLS1jbGVhbicpCiAgICAgICAgIHJwbV9jbWQuYXBwZW5kKHNwZWNfcGF0aCkKKyAgICAgICAgIyBEZXRlcm1pbmUgdGhlIGJpbmFyeSBycG0gbmFtZXMgdGhhdCBzaG91bGQgYmUgYnVpbHQgb3V0IG9mIHRoaXMgc3BlYworICAgICAgICAjIGZpbGUKKyAgICAgICAgIyBOb3RlIHRoYXQgc29tZSBvZiB0aGVzZSBtYXkgbm90IGJlIHJlYWxseSBidWlsdCAoaWYgdGhlIGZpbGUKKyAgICAgICAgIyBsaXN0IGlzIGVtcHR5KQorICAgICAgICBudnJfc3RyaW5nID0gIiV7bmFtZX0tJXt2ZXJzaW9ufS0le3JlbGVhc2V9IgorICAgICAgICBzcmNfcnBtID0gbnZyX3N0cmluZyArICIuc3JjLnJwbSIKKyAgICAgICAgbm9uX3NyY19ycG0gPSAiJXthcmNofS8iICsgbnZyX3N0cmluZyArICIuJXthcmNofS5ycG0iCisgICAgICAgIHFfY21kID0gciJycG0gLXEgLS1xZiAnJXMgJXNcbicgLS1zcGVjZmlsZSAnJXMnIiAlICgKKyAgICAgICAgICAgIHNyY19ycG0sIG5vbl9zcmNfcnBtLCBzcGVjX3BhdGgpCisKKyAgICAgICAgb3V0ID0gb3MucG9wZW4ocV9jbWQpCisgICAgICAgIGJpbmFyeV9ycG1zID0gW10KKyAgICAgICAgc291cmNlX3JwbSA9IE5vbmUKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGxpbmUgPSBvdXQucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGwgPSBzdHJpbmcuc3BsaXQoc3RyaW5nLnN0cmlwKGxpbmUpKQorICAgICAgICAgICAgYXNzZXJ0KGxlbihsKSA9PSAyKQorICAgICAgICAgICAgYmluYXJ5X3JwbXMuYXBwZW5kKGxbMV0pCisgICAgICAgICAgICAjIFRoZSBzb3VyY2UgcnBtIGlzIG5hbWVkIGFmdGVyIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgc3BlYyBmaWxlCisgICAgICAgICAgICBpZiBzb3VyY2VfcnBtIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc291cmNlX3JwbSA9IGxbMF0KKworICAgICAgICBzdGF0dXMgPSBvdXQuY2xvc2UoKQorICAgICAgICBpZiBzdGF0dXM6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFeGVjRXJyb3IoIkZhaWxlZCB0byBleGVjdXRlOiAlcyIgJSByZXByKHFfY21kKSkKKwogICAgICAgICBzZWxmLnNwYXduKHJwbV9jbWQpCiAKLSAgICAgICAgIyBYWFggdGhpcyBpcyBhIG5hc3R5IGhhY2sgLS0gd2UgcmVhbGx5IHNob3VsZCBoYXZlIGEgcHJvcGVyIHdheSB0bwotICAgICAgICAjIGZpbmQgb3V0IHRoZSBuYW1lcyBvZiB0aGUgUlBNIGZpbGVzIGNyZWF0ZWQ7IGFsc28sIHRoaXMgYXNzdW1lcwotICAgICAgICAjIHRoYXQgUlBNIGNyZWF0ZXMgZXhhY3RseSBvbmUgc291cmNlIGFuZCBvbmUgYmluYXJ5IFJQTS4KICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmJpbmFyeV9vbmx5OgotICAgICAgICAgICAgICAgIHNycG1zID0gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihycG1fZGlyWydTUlBNUyddLCAiKi5ycG0iKSkKLSAgICAgICAgICAgICAgICBhc3NlcnQgbGVuKHNycG1zKSA9PSAxLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIG51bWJlciBvZiBTUlBNIGZpbGVzIGZvdW5kOiAlcyIgJSBzcnBtcwotICAgICAgICAgICAgICAgIGRpc3RfZmlsZSA9ICgnYmRpc3RfcnBtJywgJ2FueScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Rpc3RfcGF0aChzcnBtc1swXSkpCi0gICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uZGlzdF9maWxlcy5hcHBlbmQoZGlzdF9maWxlKQotICAgICAgICAgICAgICAgIHNlbGYubW92ZV9maWxlKHNycG1zWzBdLCBzZWxmLmRpc3RfZGlyKQorICAgICAgICAgICAgICAgIHNycG0gPSBvcy5wYXRoLmpvaW4ocnBtX2RpclsnU1JQTVMnXSwgc291cmNlX3JwbSkKKyAgICAgICAgICAgICAgICBhc3NlcnQob3MucGF0aC5leGlzdHMoc3JwbSkpCisgICAgICAgICAgICAgICAgc2VsZi5tb3ZlX2ZpbGUoc3JwbSwgc2VsZi5kaXN0X2RpcikKIAogICAgICAgICAgICAgaWYgbm90IHNlbGYuc291cmNlX29ubHk6Ci0gICAgICAgICAgICAgICAgcnBtcyA9IGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4ocnBtX2RpclsnUlBNUyddLCAiKi8qLnJwbSIpKQotICAgICAgICAgICAgICAgIGRlYnVnaW5mbyA9IGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4ocnBtX2RpclsnUlBNUyddLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiovKmRlYnVnaW5mbyoucnBtIikpCi0gICAgICAgICAgICAgICAgaWYgZGVidWdpbmZvOgotICAgICAgICAgICAgICAgICAgICBycG1zLnJlbW92ZShkZWJ1Z2luZm9bMF0pCi0gICAgICAgICAgICAgICAgYXNzZXJ0IGxlbihycG1zKSA9PSAxLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIG51bWJlciBvZiBSUE0gZmlsZXMgZm91bmQ6ICVzIiAlIHJwbXMKLSAgICAgICAgICAgICAgICBkaXN0X2ZpbGUgPSAoJ2JkaXN0X3JwbScsIGdldF9weXRob25fdmVyc2lvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kaXN0X3BhdGgocnBtc1swXSkpCi0gICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uZGlzdF9maWxlcy5hcHBlbmQoZGlzdF9maWxlKQotICAgICAgICAgICAgICAgIHNlbGYubW92ZV9maWxlKHJwbXNbMF0sIHNlbGYuZGlzdF9kaXIpCi0gICAgICAgICAgICAgICAgaWYgZGVidWdpbmZvOgotICAgICAgICAgICAgICAgICAgICBkaXN0X2ZpbGUgPSAoJ2JkaXN0X3JwbScsIGdldF9weXRob25fdmVyc2lvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGlzdF9wYXRoKGRlYnVnaW5mb1swXSkpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYubW92ZV9maWxlKGRlYnVnaW5mb1swXSwgc2VsZi5kaXN0X2RpcikKKyAgICAgICAgICAgICAgICBmb3IgcnBtIGluIGJpbmFyeV9ycG1zOgorICAgICAgICAgICAgICAgICAgICBycG0gPSBvcy5wYXRoLmpvaW4ocnBtX2RpclsnUlBNUyddLCBycG0pCisgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJwbSk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1vdmVfZmlsZShycG0sIHNlbGYuZGlzdF9kaXIpCiAgICAgIyBydW4oKQogCiAgICAgZGVmIF9kaXN0X3BhdGgoc2VsZiwgcGF0aCk6CkBAIC0zODEsNiArMzkxLDcgQEAKICAgICAgICAgc3BlY19maWxlID0gWwogICAgICAgICAgICAgJyVkZWZpbmUgbmFtZSAnICsgc2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSwKICAgICAgICAgICAgICclZGVmaW5lIHZlcnNpb24gJyArIHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCkucmVwbGFjZSgnLScsJ18nKSwKKyAgICAgICAgICAgICclZGVmaW5lIHVubWFuZ2xlZF92ZXJzaW9uICcgKyBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpLAogICAgICAgICAgICAgJyVkZWZpbmUgcmVsZWFzZSAnICsgc2VsZi5yZWxlYXNlLnJlcGxhY2UoJy0nLCdfJyksCiAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICdTdW1tYXJ5OiAnICsgc2VsZi5kaXN0cmlidXRpb24uZ2V0X2Rlc2NyaXB0aW9uKCksCkBAIC00MDIsOSArNDEzLDkgQEAKICAgICAgICAgIyBidXQgb25seSBhZnRlciBpdCBoYXMgcnVuOiBhbmQgd2UgY3JlYXRlIHRoZSBzcGVjIGZpbGUgYmVmb3JlCiAgICAgICAgICMgcnVubmluZyAic2Rpc3QiLCBpbiBjYXNlIG9mIC0tc3BlYy1vbmx5LgogICAgICAgICBpZiBzZWxmLnVzZV9iemlwMjoKLSAgICAgICAgICAgIHNwZWNfZmlsZS5hcHBlbmQoJ1NvdXJjZTA6ICV7bmFtZX0tJXt2ZXJzaW9ufS50YXIuYnoyJykKKyAgICAgICAgICAgIHNwZWNfZmlsZS5hcHBlbmQoJ1NvdXJjZTA6ICV7bmFtZX0tJXt1bm1hbmdsZWRfdmVyc2lvbn0udGFyLmJ6MicpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzcGVjX2ZpbGUuYXBwZW5kKCdTb3VyY2UwOiAle25hbWV9LSV7dmVyc2lvbn0udGFyLmd6JykKKyAgICAgICAgICAgIHNwZWNfZmlsZS5hcHBlbmQoJ1NvdXJjZTA6ICV7bmFtZX0tJXt1bm1hbmdsZWRfdmVyc2lvbn0udGFyLmd6JykKIAogICAgICAgICBzcGVjX2ZpbGUuZXh0ZW5kKFsKICAgICAgICAgICAgICdMaWNlbnNlOiAnICsgc2VsZi5kaXN0cmlidXRpb24uZ2V0X2xpY2Vuc2UoKSwKQEAgLTQ3OSw3ICs0OTAsNyBAQAogICAgICAgICAjIGFyZSBqdXN0IHRleHQgdGhhdCB3ZSBkcm9wIGluIGFzLWlzLiAgSG1tbS4KIAogICAgICAgICBzY3JpcHRfb3B0aW9ucyA9IFsKLSAgICAgICAgICAgICgncHJlcCcsICdwcmVwX3NjcmlwdCcsICIlc2V0dXAiKSwKKyAgICAgICAgICAgICgncHJlcCcsICdwcmVwX3NjcmlwdCcsICIlc2V0dXAgLW4gJXtuYW1lfS0le3VubWFuZ2xlZF92ZXJzaW9ufSIpLAogICAgICAgICAgICAgKCdidWlsZCcsICdidWlsZF9zY3JpcHQnLCBkZWZfYnVpbGQpLAogICAgICAgICAgICAgKCdpbnN0YWxsJywgJ2luc3RhbGxfc2NyaXB0JywKICAgICAgICAgICAgICAoIiVzIGluc3RhbGwgIgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9leHQucHkKaW5kZXggY2Q2NzU0NC4uZjc5ZWVlMyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfZXh0LnB5CkBAIC0xODYsNyArMTg2LDcgQEAKICAgICAgICAgIyBmb3IgZXh0ZW5zaW9ucyB1bmRlciBDeWd3aW4gYW5kIEF0aGVPUyBQeXRob24ncyBsaWJyYXJ5IGRpcmVjdG9yeSBtdXN0IGJlCiAgICAgICAgICMgYXBwZW5kZWQgdG8gbGlicmFyeV9kaXJzCiAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybVs6Nl0gPT0gJ2N5Z3dpbicgb3Igc3lzLnBsYXRmb3JtWzo2XSA9PSAnYXRoZW9zJyBvciBcCi0gICAgICAgICAgICAgICAoc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2xpbnV4JykgYW5kCisgICAgICAgICAgICAgICAoKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdsaW51eCcpIG9yIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdnbnUnKSkgYW5kCiAgICAgICAgICAgICAgICAgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdQeV9FTkFCTEVfU0hBUkVEJykpOgogICAgICAgICAgICAgaWYgc3RyaW5nLmZpbmQoc3lzLmV4ZWN1dGFibGUsIHN5cy5leGVjX3ByZWZpeCkgIT0gLTE6CiAgICAgICAgICAgICAgICAgIyBidWlsZGluZyB0aGlyZCBwYXJ0eSBleHRlbnNpb25zCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5CmluZGV4IGMzMWFjMjkuLmM4ODgwMzEgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5CkBAIC0zNSw2ICszNSw5IEBACiAgICAgICAgICAgICBkaXJfdXRpbC5yZW1vdmVfdHJlZSh0YXJnZXQsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHRhcmdldCk6CiAgICAgICAgICAgICBzZWxmLmV4ZWN1dGUob3MudW5saW5rLChzZWxmLnRhcmdldCwpLCJSZW1vdmluZyAiK3RhcmdldCkKKyAgICAgICAgZWxpZiBub3Qgb3MucGF0aC5pc2RpcihzZWxmLmluc3RhbGxfZGlyKToKKyAgICAgICAgICAgIHNlbGYuZXhlY3V0ZShvcy5tYWtlZGlycywgKHNlbGYuaW5zdGFsbF9kaXIsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQ3JlYXRpbmcgIitzZWxmLmluc3RhbGxfZGlyKQogICAgICAgICBsb2cuaW5mbygiV3JpdGluZyAlcyIsIHRhcmdldCkKICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgIGYgPSBvcGVuKHRhcmdldCwgJ3cnKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL3JlZ2lzdGVyLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL3JlZ2lzdGVyLnB5CmluZGV4IGY4OTEyNjIuLjMxNzc0NzYgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9yZWdpc3Rlci5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvcmVnaXN0ZXIucHkKQEAgLTI1Niw3ICsyNTYsNyBAQAogICAgICAgICBib2R5ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQogICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkYXRhLml0ZW1zKCk6CiAgICAgICAgICAgICAjIGhhbmRsZSBtdWx0aXBsZSBlbnRyaWVzIGZvciB0aGUgc2FtZSBuYW1lCi0gICAgICAgICAgICBpZiB0eXBlKHZhbHVlKSAhPSB0eXBlKFtdKToKKyAgICAgICAgICAgIGlmIHR5cGUodmFsdWUpIG5vdCBpbiAodHlwZShbXSksIHR5cGUoICgpICkpOgogICAgICAgICAgICAgICAgIHZhbHVlID0gW3ZhbHVlXQogICAgICAgICAgICAgZm9yIHZhbHVlIGluIHZhbHVlOgogICAgICAgICAgICAgICAgIHZhbHVlID0gdW5pY29kZSh2YWx1ZSkuZW5jb2RlKCJ1dGYtOCIpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvd2luaW5zdC04LmV4ZSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC93aW5pbnN0LTguZXhlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MDNiZmEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvd2luaW5zdC04LmV4ZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3N5c2NvbmZpZy5weSBiL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CmluZGV4IDk2OTIzYmQuLjg5ODlkOTIgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CkBAIC01MDksNyArNTA5LDEwIEBACiAgICAgICAgICAgICAgICAgIyBhcmUgaW4gQ0ZMQUdTIG9yIExERkxBR1MgYW5kIHJlbW92ZSB0aGVtIGlmIHRoZXkgYXJlLgogICAgICAgICAgICAgICAgICMgVGhpcyBpcyBuZWVkZWQgd2hlbiBidWlsZGluZyBleHRlbnNpb25zIG9uIGEgMTAuMyBzeXN0ZW0KICAgICAgICAgICAgICAgICAjIHVzaW5nIGEgdW5pdmVyc2FsIGJ1aWxkIG9mIHB5dGhvbi4KLSAgICAgICAgICAgICAgICBmb3Iga2V5IGluICgnTERGTEFHUycsICdCQVNFQ0ZMQUdTJyk6CisgICAgICAgICAgICAgICAgZm9yIGtleSBpbiAoJ0xERkxBR1MnLCAnQkFTRUNGTEFHUycsCisgICAgICAgICAgICAgICAgICAgICAgICAjIGEgbnVtYmVyIG9mIGRlcml2ZWQgdmFyaWFibGVzLiBUaGVzZSBuZWVkIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAjIHBhdGNoZWQgdXAgYXMgd2VsbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICdDRkxBR1MnLCAnUFlfQ0ZMQUdTJywgJ0JMRFNIQVJFRCcpOgogICAgICAgICAgICAgICAgICAgICBmbGFncyA9IF9jb25maWdfdmFyc1trZXldCiAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKCctYXJjaFxzK1x3K1xzJywgJyAnLCBmbGFncykKICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1pc3lzcm9vdCBbXiBcdF0qJywgJyAnLCBmbGFncykKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdW5peGNjb21waWxlci5weSBiL0xpYi9kaXN0dXRpbHMvdW5peGNjb21waWxlci5weQppbmRleCA2Y2QxNGY3Li43NWU4YTUzIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3VuaXhjY29tcGlsZXIucHkKKysrIGIvTGliL2Rpc3R1dGlscy91bml4Y2NvbXBpbGVyLnB5CkBAIC04Miw2ICs4MiwyMiBAQAogICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIHBhc3MKIAorICAgICMgQ2hlY2sgaWYgdGhlIFNESyB0aGF0IGlzIHVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uIGFjdHVhbGx5IGV4aXN0cywKKyAgICAjIHRoZSB1bml2ZXJzYWwgYnVpbGQgcmVxdWlyZXMgdGhlIHVzYWdlIG9mIGEgdW5pdmVyc2FsIFNESyBhbmQgbm90IGFsbAorICAgICMgdXNlcnMgaGF2ZSB0aGF0IGluc3RhbGxlZCBieSBkZWZhdWx0LgorICAgIHN5c3Jvb3QgPSBOb25lCisgICAgaWYgJy1pc3lzcm9vdCcgaW4gY2NfYXJnczoKKyAgICAgICAgaWR4ID0gY2NfYXJncy5pbmRleCgnLWlzeXNyb290JykKKyAgICAgICAgc3lzcm9vdCA9IGNjX2FyZ3NbaWR4KzFdCisgICAgZWxpZiAnLWlzeXNyb290JyBpbiBjb21waWxlcl9zbzoKKyAgICAgICAgaWR4ID0gY29tcGlsZXJfc28uaW5kZXgoJy1pc3lzcm9vdCcpCisgICAgICAgIHN5c3Jvb3QgPSBjb21waWxlcl9zb1tpZHgrMV0KKworICAgIGlmIHN5c3Jvb3QgYW5kIG5vdCBvcy5wYXRoLmlzZGlyKHN5c3Jvb3QpOgorICAgICAgICBsb2cud2FybigiQ29tcGlsaW5nIHdpdGggYW4gU0RLIHRoYXQgZG9lc24ndCBzZWVtIHRvIGV4aXN0OiAlcyIsCisgICAgICAgICAgICAgICAgc3lzcm9vdCkKKyAgICAgICAgbG9nLndhcm4oIlBsZWFzZSBjaGVjayB5b3VyIFhjb2RlIGluc3RhbGxhdGlvbiIpCisKICAgICByZXR1cm4gY29tcGlsZXJfc28KIAogY2xhc3MgVW5peENDb21waWxlcihDQ29tcGlsZXIpOgpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3V0aWxzLnB5IGIvTGliL2VtYWlsL3V0aWxzLnB5CmluZGV4IDI2ZWJiMGUuLmVlOTUyZDMgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC91dGlscy5weQorKysgYi9MaWIvZW1haWwvdXRpbHMucHkKQEAgLTIzNSwxMCArMjM1LDYgQEAKICAgICBwYXJ0cyA9IHMuc3BsaXQoVElDSywgMikKICAgICBpZiBsZW4ocGFydHMpIDw9IDI6CiAgICAgICAgIHJldHVybiBOb25lLCBOb25lLCBzCi0gICAgaWYgbGVuKHBhcnRzKSA+IDM6Ci0gICAgICAgIGNoYXJzZXQsIGxhbmd1YWdlID0gcGFydHNbOjJdCi0gICAgICAgIHMgPSBUSUNLLmpvaW4ocGFydHNbMjpdKQotICAgICAgICByZXR1cm4gY2hhcnNldCwgbGFuZ3VhZ2UsIHMKICAgICByZXR1cm4gcGFydHMKIAogCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL19faW5pdF9fLnB5IGIvTGliL2VuY29kaW5ncy9fX2luaXRfXy5weQppbmRleCBiMGNhMzY0Li5mMWU3ZWNjIDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL19faW5pdF9fLnB5CisrKyBiL0xpYi9lbmNvZGluZ3MvX19pbml0X18ucHkKQEAgLTI4LDcgKzI4LDcgQEAKIAogIiIiIyIKIAotaW1wb3J0IGNvZGVjcywgdHlwZXMKK2ltcG9ydCBjb2RlY3MKIGZyb20gLiBpbXBvcnQgYWxpYXNlcwogCiBfY2FjaGUgPSB7fQpAQCAtNjAsNyArNjAsNyBAQAogICAgICIiIgogICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYW4gOC1iaXQgc3RyaW5nLCBiZWNhdXNlIC50cmFuc2xhdGUoKSB3b3JrcwogICAgICMgZGlmZmVyZW50bHkgZm9yIFVuaWNvZGUgc3RyaW5ncy4KLSAgICBpZiB0eXBlKGVuY29kaW5nKSBpcyB0eXBlcy5Vbmljb2RlVHlwZToKKyAgICBpZiBpc2luc3RhbmNlKGVuY29kaW5nLCB1bmljb2RlKToKICAgICAgICAgIyBOb3RlIHRoYXQgLmVuY29kZSgnbGF0aW4tMScpIGRvZXMgKm5vdCogdXNlIHRoZSBjb2RlYwogICAgICAgICAjIHJlZ2lzdHJ5LCBzbyB0aGlzIGNhbGwgZG9lc24ndCByZWN1cnNlLiAoU2VlIHVuaWNvZGVvYmplY3QuYwogICAgICAgICAjIFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoKSBmb3IgZGV0YWlscykKQEAgLTkwLDcgKzkwLDcgQEAKICAgICBlbHNlOgogICAgICAgICBtb2RuYW1lcyA9IFtub3JtX2VuY29kaW5nXQogICAgIGZvciBtb2RuYW1lIGluIG1vZG5hbWVzOgotICAgICAgICBpZiBub3QgbW9kbmFtZToKKyAgICAgICAgaWYgbm90IG1vZG5hbWUgb3IgJy4nIGluIG1vZG5hbWU6CiAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKCdlbmNvZGluZ3MuJyArIG1vZG5hbWUsCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL2J6Ml9jb2RlYy5weSBiL0xpYi9lbmNvZGluZ3MvYnoyX2NvZGVjLnB5CmluZGV4IDgxZTg0YjYuLjA1NGIzNmIgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvYnoyX2NvZGVjLnB5CisrKyBiL0xpYi9lbmNvZGluZ3MvYnoyX2NvZGVjLnB5CkBAIC01MiwxNCArNTIsMzUgQEAKICAgICAgICAgcmV0dXJuIGJ6Ml9kZWNvZGUoaW5wdXQsIGVycm9ycykKIAogY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICBhc3NlcnQgZXJyb3JzID09ICdzdHJpY3QnCisgICAgICAgIHNlbGYuZXJyb3JzID0gZXJyb3JzCisgICAgICAgIHNlbGYuY29tcHJlc3NvYmogPSBiejIuQloyQ29tcHJlc3NvcigpCisKICAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6Ci0gICAgICAgIGFzc2VydCBzZWxmLmVycm9ycyA9PSAnc3RyaWN0JwotICAgICAgICByZXR1cm4gYnoyLmNvbXByZXNzKGlucHV0KQorICAgICAgICBpZiBmaW5hbDoKKyAgICAgICAgICAgIGMgPSBzZWxmLmNvbXByZXNzb2JqLmNvbXByZXNzKGlucHV0KQorICAgICAgICAgICAgcmV0dXJuIGMgKyBzZWxmLmNvbXByZXNzb2JqLmZsdXNoKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbXByZXNzb2JqLmNvbXByZXNzKGlucHV0KQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBzZWxmLmNvbXByZXNzb2JqID0gYnoyLkJaMkNvbXByZXNzb3IoKQogCiBjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIGFzc2VydCBlcnJvcnMgPT0gJ3N0cmljdCcKKyAgICAgICAgc2VsZi5lcnJvcnMgPSBlcnJvcnMKKyAgICAgICAgc2VsZi5kZWNvbXByZXNzb2JqID0gYnoyLkJaMkRlY29tcHJlc3NvcigpCisKICAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6Ci0gICAgICAgIGFzc2VydCBzZWxmLmVycm9ycyA9PSAnc3RyaWN0JwotICAgICAgICByZXR1cm4gYnoyLmRlY29tcHJlc3MoaW5wdXQpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRlY29tcHJlc3NvYmouZGVjb21wcmVzcyhpbnB1dCkKKyAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgcmV0dXJuICcnCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYuZGVjb21wcmVzc29iaiA9IGJ6Mi5CWjJEZWNvbXByZXNzb3IoKQogCiBjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CiAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy91dGZfOF9zaWcucHkgYi9MaWIvZW5jb2RpbmdzL3V0Zl84X3NpZy5weQppbmRleCBmMDVmNmI4Li5kNzUxZGE2IDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL3V0Zl84X3NpZy5weQorKysgYi9MaWIvZW5jb2RpbmdzL3V0Zl84X3NpZy5weQpAQCAtMTYsNyArMTYsNyBAQAogCiBkZWYgZGVjb2RlKGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgogICAgIHByZWZpeCA9IDAKLSAgICBpZiBpbnB1dC5zdGFydHN3aXRoKGNvZGVjcy5CT01fVVRGOCk6CisgICAgaWYgaW5wdXRbOjNdID09IGNvZGVjcy5CT01fVVRGODoKICAgICAgICAgaW5wdXQgPSBpbnB1dFszOl0KICAgICAgICAgcHJlZml4ID0gMwogICAgIChvdXRwdXQsIGNvbnN1bWVkKSA9IGNvZGVjcy51dGZfOF9kZWNvZGUoaW5wdXQsIGVycm9ycywgVHJ1ZSkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvemxpYl9jb2RlYy5weSBiL0xpYi9lbmNvZGluZ3MvemxpYl9jb2RlYy5weQppbmRleCAyNjk0ZjE1Li4zNDE5ZjlmIDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL3psaWJfY29kZWMucHkKKysrIGIvTGliL2VuY29kaW5ncy96bGliX2NvZGVjLnB5CkBAIC01MSwxNCArNTEsMzYgQEAKICAgICAgICAgcmV0dXJuIHpsaWJfZGVjb2RlKGlucHV0LCBlcnJvcnMpCiAKIGNsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgYXNzZXJ0IGVycm9ycyA9PSAnc3RyaWN0JworICAgICAgICBzZWxmLmVycm9ycyA9IGVycm9ycworICAgICAgICBzZWxmLmNvbXByZXNzb2JqID0gemxpYi5jb21wcmVzc29iaigpCisKICAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6Ci0gICAgICAgIGFzc2VydCBzZWxmLmVycm9ycyA9PSAnc3RyaWN0JwotICAgICAgICByZXR1cm4gemxpYi5jb21wcmVzcyhpbnB1dCkKKyAgICAgICAgaWYgZmluYWw6CisgICAgICAgICAgICBjID0gc2VsZi5jb21wcmVzc29iai5jb21wcmVzcyhpbnB1dCkKKyAgICAgICAgICAgIHJldHVybiBjICsgc2VsZi5jb21wcmVzc29iai5mbHVzaCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21wcmVzc29iai5jb21wcmVzcyhpbnB1dCkKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgc2VsZi5jb21wcmVzc29iaiA9IHpsaWIuY29tcHJlc3NvYmooKQogCiBjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIGFzc2VydCBlcnJvcnMgPT0gJ3N0cmljdCcKKyAgICAgICAgc2VsZi5lcnJvcnMgPSBlcnJvcnMKKyAgICAgICAgc2VsZi5kZWNvbXByZXNzb2JqID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKwogICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKLSAgICAgICAgYXNzZXJ0IHNlbGYuZXJyb3JzID09ICdzdHJpY3QnCi0gICAgICAgIHJldHVybiB6bGliLmRlY29tcHJlc3MoaW5wdXQpCisgICAgICAgIGlmIGZpbmFsOgorICAgICAgICAgICAgYyA9IHNlbGYuZGVjb21wcmVzc29iai5kZWNvbXByZXNzKGlucHV0KQorICAgICAgICAgICAgcmV0dXJuIGMgKyBzZWxmLmRlY29tcHJlc3NvYmouZmx1c2goKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVjb21wcmVzc29iai5kZWNvbXByZXNzKGlucHV0KQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBzZWxmLmRlY29tcHJlc3NvYmogPSB6bGliLmRlY29tcHJlc3NvYmooKQogCiBjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CiAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvTGliL2Z0cGxpYi5weSBiL0xpYi9mdHBsaWIucHkKaW5kZXggOTM3ZWU0ZS4uOWNiNjdkZCAxMDA2NDQKLS0tIGEvTGliL2Z0cGxpYi5weQorKysgYi9MaWIvZnRwbGliLnB5CkBAIC0zMjUsNiArMzI1LDE0IEBACiAgICAgICAgICAgICBpZiByZXN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHNlbGYuc2VuZGNtZCgiUkVTVCAlcyIgJSByZXN0KQogICAgICAgICAgICAgcmVzcCA9IHNlbGYuc2VuZGNtZChjbWQpCisgICAgICAgICAgICAjIFNvbWUgc2VydmVycyBhcHBhcmVudGx5IHNlbmQgYSAyMDAgcmVwbHkgdG8KKyAgICAgICAgICAgICMgYSBMSVNUIG9yIFNUT1IgY29tbWFuZCwgYmVmb3JlIHRoZSAxNTAgcmVwbHkKKyAgICAgICAgICAgICMgKGFuZCB3YXkgYmVmb3JlIHRoZSAyMjYgcmVwbHkpLiBUaGlzIHNlZW1zIHRvCisgICAgICAgICAgICAjIGJlIGluIHZpb2xhdGlvbiBvZiB0aGUgcHJvdG9jb2wgKHdoaWNoIG9ubHkgYWxsb3dzCisgICAgICAgICAgICAjIDF4eCBvciBlcnJvciBtZXNzYWdlcyBmb3IgTElTVCksIHNvIHdlIGp1c3QgZGlzY2FyZAorICAgICAgICAgICAgIyB0aGlzIHJlc3BvbnNlLgorICAgICAgICAgICAgaWYgcmVzcFswXSA9PSAnMic6CisgICAgICAgICAgICAgICByZXNwID0gc2VsZi5nZXRyZXNwKCkKICAgICAgICAgICAgIGlmIHJlc3BbMF0gIT0gJzEnOgogICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yX3JlcGx5LCByZXNwCiAgICAgICAgIGVsc2U6CkBAIC0zMzIsNiArMzQwLDkgQEAKICAgICAgICAgICAgIGlmIHJlc3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgc2VsZi5zZW5kY21kKCJSRVNUICVzIiAlIHJlc3QpCiAgICAgICAgICAgICByZXNwID0gc2VsZi5zZW5kY21kKGNtZCkKKyAgICAgICAgICAgICMgU2VlIGFib3ZlLgorICAgICAgICAgICAgaWYgcmVzcFswXSA9PSAnMic6CisgICAgICAgICAgICAgICByZXNwID0gc2VsZi5nZXRyZXNwKCkKICAgICAgICAgICAgIGlmIHJlc3BbMF0gIT0gJzEnOgogICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yX3JlcGx5LCByZXNwCiAgICAgICAgICAgICBjb25uLCBzb2NrYWRkciA9IHNvY2suYWNjZXB0KCkKZGlmZiAtLWdpdCBhL0xpYi9mdW5jdG9vbHMucHkgYi9MaWIvZnVuY3Rvb2xzLnB5CmluZGV4IDEyYTUyN2UuLmE1NGYwMzAgMTAwNjQ0Ci0tLSBhL0xpYi9mdW5jdG9vbHMucHkKKysrIGIvTGliL2Z1bmN0b29scy5weQpAQCAtMjUsMTQgKzI1LDE0IEBACiAgICAgICAgYXNzaWduZWQgaXMgYSB0dXBsZSBuYW1pbmcgdGhlIGF0dHJpYnV0ZXMgYXNzaWduZWQgZGlyZWN0bHkKICAgICAgICBmcm9tIHRoZSB3cmFwcGVkIGZ1bmN0aW9uIHRvIHRoZSB3cmFwcGVyIGZ1bmN0aW9uIChkZWZhdWx0cyB0bwogICAgICAgIGZ1bmN0b29scy5XUkFQUEVSX0FTU0lHTk1FTlRTKQotICAgICAgIHVwZGF0ZWQgaXMgYSB0dXBsZSBuYW1pbmcgdGhlIGF0dHJpYnV0ZXMgb2ZmIHRoZSB3cmFwcGVyIHRoYXQKKyAgICAgICB1cGRhdGVkIGlzIGEgdHVwbGUgbmFtaW5nIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSB3cmFwcGVyIHRoYXQKICAgICAgICBhcmUgdXBkYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBmcm9tIHRoZSB3cmFwcGVkCiAgICAgICAgZnVuY3Rpb24gKGRlZmF1bHRzIHRvIGZ1bmN0b29scy5XUkFQUEVSX1VQREFURVMpCiAgICAgIiIiCiAgICAgZm9yIGF0dHIgaW4gYXNzaWduZWQ6CiAgICAgICAgIHNldGF0dHIod3JhcHBlciwgYXR0ciwgZ2V0YXR0cih3cmFwcGVkLCBhdHRyKSkKICAgICBmb3IgYXR0ciBpbiB1cGRhdGVkOgotICAgICAgICBnZXRhdHRyKHdyYXBwZXIsIGF0dHIpLnVwZGF0ZShnZXRhdHRyKHdyYXBwZWQsIGF0dHIpKQorICAgICAgICBnZXRhdHRyKHdyYXBwZXIsIGF0dHIpLnVwZGF0ZShnZXRhdHRyKHdyYXBwZWQsIGF0dHIsIHt9KSkKICAgICAjIFJldHVybiB0aGUgd3JhcHBlciBzbyB0aGlzIGNhbiBiZSB1c2VkIGFzIGEgZGVjb3JhdG9yIHZpYSBwYXJ0aWFsKCkKICAgICByZXR1cm4gd3JhcHBlcgogCmRpZmYgLS1naXQgYS9MaWIvZ2VuZXJpY3BhdGgucHkgYi9MaWIvZ2VuZXJpY3BhdGgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3NGNlZgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9nZW5lcmljcGF0aC5weQpAQCAtMCwwICsxLDc3IEBACisiIiIKK1BhdGggb3BlcmF0aW9ucyBjb21tb24gdG8gbW9yZSB0aGFuIG9uZSBPUworRG8gbm90IHVzZSBkaXJlY3RseS4gIFRoZSBPUyBzcGVjaWZpYyBtb2R1bGVzIGltcG9ydCB0aGUgYXBwcm9wcmlhdGUKK2Z1bmN0aW9ucyBmcm9tIHRoaXMgbW9kdWxlIHRoZW1zZWx2ZXMuCisiIiIKK2ltcG9ydCBvcworaW1wb3J0IHN0YXQKKworX19hbGxfXyA9IFsnY29tbW9ucHJlZml4JywgJ2V4aXN0cycsICdnZXRhdGltZScsICdnZXRjdGltZScsICdnZXRtdGltZScsCisgICAgICAgICAgICdnZXRzaXplJywgJ2lzZGlyJywgJ2lzZmlsZSddCisKKworIyBEb2VzIGEgcGF0aCBleGlzdD8KKyMgVGhpcyBpcyBmYWxzZSBmb3IgZGFuZ2xpbmcgc3ltYm9saWMgbGlua3Mgb24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgdGhlbS4KK2RlZiBleGlzdHMocGF0aCk6CisgICAgIiIiVGVzdCB3aGV0aGVyIGEgcGF0aCBleGlzdHMuICBSZXR1cm5zIEZhbHNlIGZvciBicm9rZW4gc3ltYm9saWMgbGlua3MiIiIKKyAgICB0cnk6CisgICAgICAgIHN0ID0gb3Muc3RhdChwYXRoKQorICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIFRydWUKKworCisjIFRoaXMgZm9sbG93cyBzeW1ib2xpYyBsaW5rcywgc28gYm90aCBpc2xpbmsoKSBhbmQgaXNkaXIoKSBjYW4gYmUgdHJ1ZQorIyBmb3IgdGhlIHNhbWUgcGF0aCBvbm8gc3lzdGVtcyB0aGF0IHN1cHBvcnQgc3ltbGlua3MKK2RlZiBpc2ZpbGUocGF0aCk6CisgICAgIiIiVGVzdCB3aGV0aGVyIGEgcGF0aCBpcyBhIHJlZ3VsYXIgZmlsZSIiIgorICAgIHRyeToKKyAgICAgICAgc3QgPSBvcy5zdGF0KHBhdGgpCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gc3RhdC5TX0lTUkVHKHN0LnN0X21vZGUpCisKKworIyBJcyBhIHBhdGggYSBkaXJlY3Rvcnk/CisjIFRoaXMgZm9sbG93cyBzeW1ib2xpYyBsaW5rcywgc28gYm90aCBpc2xpbmsoKSBhbmQgaXNkaXIoKQorIyBjYW4gYmUgdHJ1ZSBmb3IgdGhlIHNhbWUgcGF0aCBvbiBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBzeW1saW5rcworZGVmIGlzZGlyKHMpOgorICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBwYXRobmFtZSByZWZlcnMgdG8gYW4gZXhpc3RpbmcgZGlyZWN0b3J5LiIiIgorICAgIHRyeToKKyAgICAgICAgc3QgPSBvcy5zdGF0KHMpCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gc3RhdC5TX0lTRElSKHN0LnN0X21vZGUpCisKKworZGVmIGdldHNpemUoZmlsZW5hbWUpOgorICAgICIiIlJldHVybiB0aGUgc2l6ZSBvZiBhIGZpbGUsIHJlcG9ydGVkIGJ5IG9zLnN0YXQoKS4iIiIKKyAgICByZXR1cm4gb3Muc3RhdChmaWxlbmFtZSkuc3Rfc2l6ZQorCisKK2RlZiBnZXRtdGltZShmaWxlbmFtZSk6CisgICAgIiIiUmV0dXJuIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lIG9mIGEgZmlsZSwgcmVwb3J0ZWQgYnkgb3Muc3RhdCgpLiIiIgorICAgIHJldHVybiBvcy5zdGF0KGZpbGVuYW1lKS5zdF9tdGltZQorCisKK2RlZiBnZXRhdGltZShmaWxlbmFtZSk6CisgICAgIiIiUmV0dXJuIHRoZSBsYXN0IGFjY2VzcyB0aW1lIG9mIGEgZmlsZSwgcmVwb3J0ZWQgYnkgb3Muc3RhdCgpLiIiIgorICAgIHJldHVybiBvcy5zdGF0KGZpbGVuYW1lKS5zdF9hdGltZQorCisKK2RlZiBnZXRjdGltZShmaWxlbmFtZSk6CisgICAgIiIiUmV0dXJuIHRoZSBtZXRhZGF0YSBjaGFuZ2UgdGltZSBvZiBhIGZpbGUsIHJlcG9ydGVkIGJ5IG9zLnN0YXQoKS4iIiIKKyAgICByZXR1cm4gb3Muc3RhdChmaWxlbmFtZSkuc3RfY3RpbWUKKworCisjIFJldHVybiB0aGUgbG9uZ2VzdCBwcmVmaXggb2YgYWxsIGxpc3QgZWxlbWVudHMuCitkZWYgY29tbW9ucHJlZml4KG0pOgorICAgICJHaXZlbiBhIGxpc3Qgb2YgcGF0aG5hbWVzLCByZXR1cm5zIHRoZSBsb25nZXN0IGNvbW1vbiBsZWFkaW5nIGNvbXBvbmVudCIKKyAgICBpZiBub3QgbTogcmV0dXJuICcnCisgICAgczEgPSBtaW4obSkKKyAgICBzMiA9IG1heChtKQorICAgIG4gPSBtaW4obGVuKHMxKSwgbGVuKHMyKSkKKyAgICBmb3IgaSBpbiB4cmFuZ2Uobik6CisgICAgICAgIGlmIHMxW2ldICE9IHMyW2ldOgorICAgICAgICAgICAgcmV0dXJuIHMxWzppXQorICAgIHJldHVybiBzMVs6bl0KZGlmZiAtLWdpdCBhL0xpYi9nemlwLnB5IGIvTGliL2d6aXAucHkKaW5kZXggMGJmMjllOC4uYzM3ZDVhMSAxMDA2NDQKLS0tIGEvTGliL2d6aXAucHkKKysrIGIvTGliL2d6aXAucHkKQEAgLTM3MSw3ICszNzEsMTIgQEAKICAgICAgICAgc2VsZi5leHRyYXNpemUgPSAwCiAgICAgICAgIHNlbGYub2Zmc2V0ID0gMAogCi0gICAgZGVmIHNlZWsoc2VsZiwgb2Zmc2V0KToKKyAgICBkZWYgc2VlayhzZWxmLCBvZmZzZXQsIHdoZW5jZT0wKToKKyAgICAgICAgaWYgd2hlbmNlOgorICAgICAgICAgICAgaWYgd2hlbmNlID09IDE6CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2VsZi5vZmZzZXQgKyBvZmZzZXQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignU2VlayBmcm9tIGVuZCBub3Qgc3VwcG9ydGVkJykKICAgICAgICAgaWYgc2VsZi5tb2RlID09IFdSSVRFOgogICAgICAgICAgICAgaWYgb2Zmc2V0IDwgc2VsZi5vZmZzZXQ6CiAgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignTmVnYXRpdmUgc2VlayBpbiB3cml0ZSBtb2RlJykKZGlmZiAtLWdpdCBhL0xpYi9oYXNobGliLnB5IGIvTGliL2hhc2hsaWIucHkKaW5kZXggNzg5ZTI0ZS4uNzhiNWMwZSAxMDA2NDQKLS0tIGEvTGliL2hhc2hsaWIucHkKKysrIGIvTGliL2hhc2hsaWIucHkKQEAgLTE4LDggKzE4LDM3IEBACiBNb3JlIGFsZ29yaXRobXMgbWF5IGJlIGF2YWlsYWJsZSBvbiB5b3VyIHBsYXRmb3JtIGJ1dCB0aGUgYWJvdmUgYXJlCiBndWFyYW50ZWVkIHRvIGV4aXN0LgogCi1DaG9vc2UgeW91ciBoYXNoIGZ1bmN0aW9uIHdpc2VseS4gIFNvbWUgaGF2ZSBrbm93biB3ZWFrbmVzc2VzLgorQ2hvb3NlIHlvdXIgaGFzaCBmdW5jdGlvbiB3aXNlbHkuICBTb21lIGhhdmUga25vd24gY29sbGlzaW9uIHdlYWtuZXNzZXMuCiBzaGEzODQgYW5kIHNoYTUxMiB3aWxsIGJlIHNsb3cgb24gMzIgYml0IHBsYXRmb3Jtcy4KKworSGFzaCBvYmplY3RzIGhhdmUgdGhlc2UgbWV0aG9kczoKKyAtIHVwZGF0ZShhcmcpOiBVcGRhdGUgdGhlIGhhc2ggb2JqZWN0IHdpdGggdGhlIHN0cmluZyBhcmcuIFJlcGVhdGVkIGNhbGxzCisgICAgICAgICAgICAgICAgYXJlIGVxdWl2YWxlbnQgdG8gYSBzaW5nbGUgY2FsbCB3aXRoIHRoZSBjb25jYXRlbmF0aW9uIG9mIGFsbAorICAgICAgICAgICAgICAgIHRoZSBhcmd1bWVudHMuCisgLSBkaWdlc3QoKTogICAgUmV0dXJuIHRoZSBkaWdlc3Qgb2YgdGhlIHN0cmluZ3MgcGFzc2VkIHRvIHRoZSB1cGRhdGUoKSBtZXRob2QKKyAgICAgICAgICAgICAgICBzbyBmYXIuIFRoaXMgbWF5IGNvbnRhaW4gbm9uLUFTQ0lJIGNoYXJhY3RlcnMsIGluY2x1ZGluZworICAgICAgICAgICAgICAgIE5VTCBieXRlcy4KKyAtIGhleGRpZ2VzdCgpOiBMaWtlIGRpZ2VzdCgpIGV4Y2VwdCB0aGUgZGlnZXN0IGlzIHJldHVybmVkIGFzIGEgc3RyaW5nIG9mCisgICAgICAgICAgICAgICAgZG91YmxlIGxlbmd0aCwgY29udGFpbmluZyBvbmx5IGhleGFkZWNpbWFsIGRpZ2l0cy4KKyAtIGNvcHkoKTogICAgICBSZXR1cm4gYSBjb3B5IChjbG9uZSkgb2YgdGhlIGhhc2ggb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VkIHRvCisgICAgICAgICAgICAgICAgZWZmaWNpZW50bHkgY29tcHV0ZSB0aGUgZGlnZXN0cyBvZiBzdHJpbmdzIHRoYXQgc2hhcmUgYSBjb21tb24KKyAgICAgICAgICAgICAgICBpbml0aWFsIHN1YnN0cmluZy4KKworRm9yIGV4YW1wbGUsIHRvIG9idGFpbiB0aGUgZGlnZXN0IG9mIHRoZSBzdHJpbmcgJ05vYm9keSBpbnNwZWN0cyB0aGUKK3NwYW1taXNoIHJlcGV0aXRpb24nOgorCisgICAgPj4+IGltcG9ydCBoYXNobGliCisgICAgPj4+IG0gPSBoYXNobGliLm1kNSgpCisgICAgPj4+IG0udXBkYXRlKCJOb2JvZHkgaW5zcGVjdHMiKQorICAgID4+PiBtLnVwZGF0ZSgiIHRoZSBzcGFtbWlzaCByZXBldGl0aW9uIikKKyAgICA+Pj4gbS5kaWdlc3QoKQorICAgICdceGJiZFx4OWNceDgzXHhkZFx4MWVceGE1XHhjOVx4ZDlceGRlXHhjOVx4YTFceDhkXHhmMFx4ZmZceGU5JworCitNb3JlIGNvbmRlbnNlZDoKKworICAgID4+PiBoYXNobGliLnNoYTIyNCgiTm9ib2R5IGluc3BlY3RzIHRoZSBzcGFtbWlzaCByZXBldGl0aW9uIikuaGV4ZGlnZXN0KCkKKyAgICAnYTQzMzdiYzQ1YThmYzU0NGMwM2Y1MmRjNTUwY2Q2ZTFlODcwMjFiYzg5NjU4OGJkNzllOTAxZTInCisKICIiIgogCiAKZGlmZiAtLWdpdCBhL0xpYi9odHRwbGliLnB5IGIvTGliL2h0dHBsaWIucHkKaW5kZXggNWFlNWVmYy4uMWUwMDM3ZiAxMDA2NDQKLS0tIGEvTGliL2h0dHBsaWIucHkKKysrIGIvTGliL2h0dHBsaWIucHkKQEAgLTcwNCw3ICs3MDQsMTUgQEAKICAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKICAgICAgICAgICAgIHByaW50ICJzZW5kOiIsIHJlcHIoc3RyKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLnNvY2suc2VuZGFsbChzdHIpCisgICAgICAgICAgICBibG9ja3NpemU9ODE5MgorICAgICAgICAgICAgaWYgaGFzYXR0cihzdHIsJ3JlYWQnKSA6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDogcHJpbnQgInNlbmRJbmcgYSByZWFkKClhYmxlIgorICAgICAgICAgICAgICAgIGRhdGE9c3RyLnJlYWQoYmxvY2tzaXplKQorICAgICAgICAgICAgICAgIHdoaWxlIGRhdGE6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc29jay5zZW5kYWxsKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIGRhdGE9c3RyLnJlYWQoYmxvY2tzaXplKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2suc2VuZGFsbChzdHIpCiAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIHY6CiAgICAgICAgICAgICBpZiB2WzBdID09IDMyOiAgICAgICMgQnJva2VuIHBpcGUKICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKQEAgLTg3OSw3ICs4ODcsMjEgQEAKICAgICAgICAgc2VsZi5wdXRyZXF1ZXN0KG1ldGhvZCwgdXJsLCAqKnNraXBzKQogCiAgICAgICAgIGlmIGJvZHkgYW5kICgnY29udGVudC1sZW5ndGgnIG5vdCBpbiBoZWFkZXJfbmFtZXMpOgotICAgICAgICAgICAgc2VsZi5wdXRoZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgc3RyKGxlbihib2R5KSkpCisgICAgICAgICAgICB0aGVsZW49Tm9uZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRoZWxlbj1zdHIobGVuKGJvZHkpKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgdGU6CisgICAgICAgICAgICAgICAgIyBJZiB0aGlzIGlzIGEgZmlsZS1saWtlIG9iamVjdCwgdHJ5IHRvCisgICAgICAgICAgICAgICAgIyBmc3RhdCBpdHMgZmlsZSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgaW1wb3J0IG9zCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB0aGVsZW4gPSBzdHIob3MuZnN0YXQoYm9keS5maWxlbm8oKSkuc3Rfc2l6ZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBPU0Vycm9yKToKKyAgICAgICAgICAgICAgICAgICAgIyBEb24ndCBzZW5kIGEgbGVuZ3RoIGlmIHRoaXMgZmFpbGVkCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWdsZXZlbCA+IDA6IHByaW50ICJDYW5ub3Qgc3RhdCEhIgorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIHRoZWxlbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnB1dGhlYWRlcignQ29udGVudC1MZW5ndGgnLHRoZWxlbikKICAgICAgICAgZm9yIGhkciwgdmFsdWUgaW4gaGVhZGVycy5pdGVyaXRlbXMoKToKICAgICAgICAgICAgIHNlbGYucHV0aGVhZGVyKGhkciwgdmFsdWUpCiAgICAgICAgIHNlbGYuZW5kaGVhZGVycygpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9Db2RlQ29udGV4dC5weSBiL0xpYi9pZGxlbGliL0NvZGVDb250ZXh0LnB5CmluZGV4IDc0ZDViNzAuLjQzNjIwNmYgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0NvZGVDb250ZXh0LnB5CisrKyBiL0xpYi9pZGxlbGliL0NvZGVDb250ZXh0LnB5CkBAIC01NCwyNSArNTQsNjggQEAKIAogICAgIGRlZiB0b2dnbGVfY29kZV9jb250ZXh0X2V2ZW50KHNlbGYsIGV2ZW50PU5vbmUpOgogICAgICAgICBpZiBub3Qgc2VsZi5sYWJlbDoKLSAgICAgICAgICAgIHNlbGYucGFkX2ZyYW1lID0gVGtpbnRlci5GcmFtZShzZWxmLmVkaXR3aW4udG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnPXNlbGYuYmdjb2xvciwgYm9yZGVyPTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsaWVmPSJzdW5rZW4iKQotICAgICAgICAgICAgc2VsZi5sYWJlbCA9IFRraW50ZXIuTGFiZWwoc2VsZi5wYWRfZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9IlxuIiAqIChzZWxmLmNvbnRleHRfZGVwdGggLSAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yPSJ3IiwganVzdGlmeT0ibGVmdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQ9c2VsZi50ZXh0Zm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmc9c2VsZi5iZ2NvbG9yLCBmZz1zZWxmLmZnY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcj0wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0xLCAjIERvbid0IHJlcXVlc3QgbW9yZSB0aGFuIHdlIGdldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICBzZWxmLmxhYmVsLnBhY2soc2lkZT0idG9wIiwgZmlsbD0ieCIsIGV4cGFuZD1UcnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZHg9NCwgcGFkeT0wKQotICAgICAgICAgICAgc2VsZi5wYWRfZnJhbWUucGFjayhzaWRlPSJ0b3AiLCBmaWxsPSJ4IiwgZXhwYW5kPUZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWR4PTAsIHBhZHk9MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXI9c2VsZi5lZGl0d2luLnN0YXR1c19iYXIpCisgICAgICAgICAgICAjIFRoZSBmb2xsb3dpbmcgY29kZSBhdHRlbXB0cyB0byBmaWd1cmUgb3V0IHRoZSByZXF1aXJlZCBib3JkZXIKKyAgICAgICAgICAgICMgd2lkdGggYW5kIHZlcnRpY2FsIHBhZGRpbmcgcmVxdWlyZWQgZm9yIHRoZSBDb2RlQ29udGV4dCB3aWRnZXQKKyAgICAgICAgICAgICMgdG8gYmUgcGVyZmVjdGx5IGFsaWduZWQgd2l0aCB0aGUgdGV4dCBpbiB0aGUgbWFpbiBUZXh0IHdpZGdldC4KKyAgICAgICAgICAgICMgVGhpcyBpcyBkb25lIGJ5IHJldHJpZXZpbmcgdGhlIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgZnJvbSB0aGUKKyAgICAgICAgICAgICMgZWRpdHdpbi50ZXh0IGFuZCBlZGl0d2luLnRleHRfZnJhbWUgd2lkZ2V0cy4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgQWxsIHZhbHVlcyBhcmUgcGFzc2VkIHRocm91Z2ggaW50KHN0cig8dmFsdWU+KSksIHNpbmNlIHNvbWUKKyAgICAgICAgICAgICMgdmFsdWVzIG1heSBiZSBwaXhlbCBvYmplY3RzLCB3aGljaCBjYW4ndCBzaW1wbHkgYmUgYWRkZWQgYWRkZWQKKyAgICAgICAgICAgICMgdG8gaW50cy4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgVGhpcyBjb2RlIGlzIGNvbnNpZGVyZWQgc29tZXdoYXQgdW5zdGFibGUgc2luY2UgaXQgcmVsaWVzIG9uCisgICAgICAgICAgICAjIHNvbWUgb2YgVGsncyBpbm5lciB3b3JraW5ncy4gSG93ZXZlciBpdHMgZWZmZWN0IGlzIG1lcmVseQorICAgICAgICAgICAgIyBjb3NtZXRpYzsgZmFpbHVyZSB3aWxsIG9ubHkgY2F1c2UgdGhlIENvZGVDb250ZXh0IHRleHQgdG8gYmUKKyAgICAgICAgICAgICMgc29tZXdoYXQgbWlzYWxpZ25lZCB3aXRoIHRoZSB0ZXh0IGluIHRoZSBtYWluIFRleHQgd2lkZ2V0LgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBUbyBhdm9pZCBwb3NzaWJsZSBlcnJvcnMsIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBpbm5lciB3b3JraW5ncworICAgICAgICAgICAgIyBvZiBUayBhcmUgZXhlY3V0ZWQgaW5zaWRlIHRyeS9leGNlcHQgYmxvY2tzLgorICAgICAgICAgICAgCisgICAgICAgICAgICB3aWRnZXRzX2Zvcl93aWR0aF9jYWxjID0gc2VsZi5lZGl0d2luLnRleHQsIHNlbGYuZWRpdHdpbi50ZXh0X2ZyYW1lCisKKyAgICAgICAgICAgICMgY2FsY3VsYXRlIHRoZSByZXF1aXJlZCB2ZXJ0aWNhbCBwYWRkaW5nCisgICAgICAgICAgICBwYWR4ID0gMAorICAgICAgICAgICAgZm9yIHdpZGdldCBpbiB3aWRnZXRzX2Zvcl93aWR0aF9jYWxjOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgIyByZXRyaWV2ZSB0aGUgInBhZHgiIGF0dHJpYnRlIGZyb20gd2lkZ2V0J3MgcGFjayBpbmZvCisgICAgICAgICAgICAgICAgICAgIHBhZHggKz0gaW50KHN0ciggd2lkZ2V0LnBhY2tfaW5mbygpWydwYWR4J10gKSkKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICMgcmV0cmlldmUgdGhlIHdpZGdldCdzICJwYWR4IiBhdHRyaWJ0ZQorICAgICAgICAgICAgICAgICAgICBwYWR4ICs9IGludChzdHIoIHdpZGdldC5jZ2V0KCdwYWR4JykgKSkKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgIyBjYWxjdWxhdGUgdGhlIHJlcXVpcmVkIGJvcmRlciB3aWR0aAorICAgICAgICAgICAgYm9yZGVyX3dpZHRoID0gMAorICAgICAgICAgICAgZm9yIHdpZGdldCBpbiB3aWRnZXRzX2Zvcl93aWR0aF9jYWxjOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgIyByZXRyaWV2ZSB0aGUgd2lkZ2V0J3MgImJvcmRlciIgYXR0cmlidGUKKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyX3dpZHRoICs9IGludChzdHIoIHdpZGdldC5jZ2V0KCdib3JkZXInKSApKQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBzZWxmLmxhYmVsID0gVGtpbnRlci5MYWJlbChzZWxmLmVkaXR3aW4udG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0iXG4iICogKHNlbGYuY29udGV4dF9kZXB0aCAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yPSJ3IiwganVzdGlmeT0ibGVmdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250PXNlbGYudGV4dGZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZz1zZWxmLmJnY29sb3IsIGZnPXNlbGYuZmdjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTEsICNkb24ndCByZXF1ZXN0IG1vcmUgdGhhbiB3ZSBnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZHg9cGFkeCwgI2xpbmUgdXAgd2l0aCB0ZXh0IHdpZGdldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyPWJvcmRlcl93aWR0aCwgI21hdGNoIGJvcmRlciB3aWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsaWVmPSJzdW5rZW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorCisgICAgICAgICAgICAjIENvZGVDb250ZXh0J3MgbGFiZWwgd2lkZ2V0IGlzIHBhY2tlZCBiZWZvcmUgYW5kIGFib3ZlIHRoZQorICAgICAgICAgICAgIyB0ZXh0X2ZyYW1lIHdpZGdldCwgdGh1cyBlbnN1cmluZyB0aGF0IGl0IHdpbGwgYXBwZWFyIGRpcmVjdGx5CisgICAgICAgICAgICAjIGFib3ZlIGl0LgorICAgICAgICAgICAgc2VsZi5sYWJlbC5wYWNrKHNpZGU9InRvcCIsIGZpbGw9IngiLCBleHBhbmQ9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlPXNlbGYuZWRpdHdpbi50ZXh0X2ZyYW1lKQorICAgICAgICAgICAgCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmxhYmVsLmRlc3Ryb3koKQotICAgICAgICAgICAgc2VsZi5wYWRfZnJhbWUuZGVzdHJveSgpCiAgICAgICAgICAgICBzZWxmLmxhYmVsID0gTm9uZQogICAgICAgICBpZGxlQ29uZi5TZXRPcHRpb24oImV4dGVuc2lvbnMiLCAiQ29kZUNvbnRleHQiLCAidmlzaWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoc2VsZi5sYWJlbCBpcyBub3QgTm9uZSkpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9FZGl0b3JXaW5kb3cucHkgYi9MaWIvaWRsZWxpYi9FZGl0b3JXaW5kb3cucHkKaW5kZXggYmM2MWFmYi4uMTg0MWIxYyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvRWRpdG9yV2luZG93LnB5CisrKyBiL0xpYi9pZGxlbGliL0VkaXRvcldpbmRvdy5weQpAQCAtMTAyLDggKzEwMiw4IEBACiAgICAgICAgICAgICBzZWxmLnRvcC5pbnN0YW5jZV9kaWN0ID0ge30KICAgICAgICAgc2VsZi5yZWNlbnRfZmlsZXNfcGF0aCA9IG9zLnBhdGguam9pbihpZGxlQ29uZi5HZXRVc2VyQ2ZnRGlyKCksCiAgICAgICAgICAgICAgICAgJ3JlY2VudC1maWxlcy5sc3QnKQotICAgICAgICBzZWxmLnZiYXIgPSB2YmFyID0gU2Nyb2xsYmFyKHRvcCwgbmFtZT0ndmJhcicpCiAgICAgICAgIHNlbGYudGV4dF9mcmFtZSA9IHRleHRfZnJhbWUgPSBGcmFtZSh0b3ApCisgICAgICAgIHNlbGYudmJhciA9IHZiYXIgPSBTY3JvbGxiYXIodGV4dF9mcmFtZSwgbmFtZT0ndmJhcicpCiAgICAgICAgIHNlbGYud2lkdGggPSBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdFZGl0b3JXaW5kb3cnLCd3aWR0aCcpCiAgICAgICAgIHNlbGYudGV4dCA9IHRleHQgPSBNdWx0aUNhbGxDcmVhdG9yKFRleHQpKAogICAgICAgICAgICAgICAgIHRleHRfZnJhbWUsIG5hbWU9J3RleHQnLCBwYWR4PTUsIHdyYXA9J25vbmUnLApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvTkVXUy50eHQgYi9MaWIvaWRsZWxpYi9ORVdTLnR4dAppbmRleCAzYjNkNzlhLi40M2U1YjQ1IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9ORVdTLnR4dAorKysgYi9MaWIvaWRsZWxpYi9ORVdTLnR4dApAQCAtMyw2ICszLDEzIEBACiAKICpSZWxlYXNlIGRhdGU6IFhYLVhYWC0yMDBYKgogCistIFBhdGNoICMxMzYyOTc1OiBSZXdvcmsgQ29kZUNvbnRleHQgaW5kZW50YXRpb24gYWxnb3JpdGhtIHRvCisgIGF2b2lkIGhhcmQtY29kaW5nIHBpeGVsIHdpZHRocy4KKworLSBTb21lIHN5bnRheCBlcnJvcnMgd2VyZSBiZWluZyBjYXVnaHQgYnkgdG9rZW5pemUgZHVyaW5nIHRoZSB0YWJuYW5ueQorICBjaGVjaywgcmVzdWx0aW5nIGluIG9ic2N1cmUgZXJyb3IgbWVzc2FnZXMuICBEbyB0aGUgc3ludGF4IGNoZWNrCisgIGZpcnN0LiAgQnVnIDE1NjI3MTYsIDE1NjI3MTkKKwogLSBJRExFJ3MgdmVyc2lvbiBudW1iZXIgdGFrZXMgYSBiaWcganVtcCB0byBtYXRjaCB0aGUgdmVyc2lvbiBudW1iZXIgb2YKICAgdGhlIFB5dGhvbiByZWxlYXNlIG9mIHdoaWNoIGl0J3MgYSBwYXJ0LgogCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9QeVNoZWxsLnB5IGIvTGliL2lkbGVsaWIvUHlTaGVsbC5weQppbmRleCA3MDliM2E3Li4yMGQwMGJlIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9QeVNoZWxsLnB5CisrKyBiL0xpYi9pZGxlbGliL1B5U2hlbGwucHkKQEAgLTM1MSw2ICszNTEsOCBAQAogCiAgICAgZGVmIGJ1aWxkX3N1YnByb2Nlc3NfYXJnbGlzdChzZWxmKToKICAgICAgICAgdyA9IFsnLVcnICsgcyBmb3IgcyBpbiBzeXMud2Fybm9wdGlvbnNdCisgICAgICAgIGlmIDEvMiA+IDA6ICMgYWNjb3VudCBmb3IgbmV3IGRpdmlzaW9uCisgICAgICAgICAgICB3LmFwcGVuZCgnLVFuZXcnKQogICAgICAgICAjIE1heWJlIElETEUgaXMgaW5zdGFsbGVkIGFuZCBpcyBiZWluZyBhY2Nlc3NlZCB2aWEgc3lzLnBhdGgsCiAgICAgICAgICMgb3IgbWF5YmUgaXQncyBub3QgaW5zdGFsbGVkIGFuZCB0aGUgaWRsZS5weSBzY3JpcHQgaXMgYmVpbmcKICAgICAgICAgIyBydW4gZnJvbSB0aGUgSURMRSBzb3VyY2UgZGlyZWN0b3J5LgpAQCAtNzI2LDYgKzcyOCw4IEBACiAgICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICAgaWYgdXNlX3N1YnByb2Nlc3M6CisgICAgICAgICAgICAgICAgICAgICMgV2hlbiBydW4gdy9vIHN1YnByb2Nlc3MsIGJvdGggdXNlciBhbmQgSURMRSBlcnJvcnMKKyAgICAgICAgICAgICAgICAgICAgIyBhcmUgcHJpbnRlZCBoZXJlOyBza2lwIG1lc3NhZ2UgaW4gdGhhdCBjYXNlLgogICAgICAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnRrY29uc29sZS5zdGRlcnIsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklETEUgaW50ZXJuYWwgZXJyb3IgaW4gcnVuY29kZSgpIgogICAgICAgICAgICAgICAgIHNlbGYuc2hvd3RyYWNlYmFjaygpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5IGIvTGliL2lkbGVsaWIvU2NyaXB0QmluZGluZy5weQppbmRleCBmMzI1YWQxLi4zNzQ2ZWI4IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5CisrKyBiL0xpYi9pZGxlbGliL1NjcmlwdEJpbmRpbmcucHkKQEAgLTU3LDkgKzU3LDEwIEBACiAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5nZXRmaWxlbmFtZSgpCiAgICAgICAgIGlmIG5vdCBmaWxlbmFtZToKICAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3Qgc2VsZi5jaGVja3N5bnRheChmaWxlbmFtZSk6CisgICAgICAgICAgICByZXR1cm4KICAgICAgICAgaWYgbm90IHNlbGYudGFibmFubnkoZmlsZW5hbWUpOgogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuY2hlY2tzeW50YXgoZmlsZW5hbWUpCiAKICAgICBkZWYgdGFibmFubnkoc2VsZiwgZmlsZW5hbWUpOgogICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3InKQpAQCAtNzYsOSArNzcsNiBAQAogICAgICAgICAgICAgc2VsZi5lZGl0d2luLmdvdG9saW5lKG5hZy5nZXRfbGluZW5vKCkpCiAgICAgICAgICAgICBzZWxmLmVycm9yYm94KCJUYWIvc3BhY2UgZXJyb3IiLCBpbmRlbnRfbWVzc2FnZSkKICAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICBleGNlcHQgSW5kZW50YXRpb25FcnJvcjoKLSAgICAgICAgICAgICMgRnJvbSB0b2tlbml6ZSgpLCBsZXQgY29tcGlsZSgpIGluIGNoZWNrc3ludGF4IGZpbmQgaXQgYWdhaW4uCi0gICAgICAgICAgICBwYXNzCiAgICAgICAgIHJldHVybiBUcnVlCiAKICAgICBkZWYgY2hlY2tzeW50YXgoc2VsZiwgZmlsZW5hbWUpOgpAQCAtMTM5LDExICsxMzcsMTEgQEAKICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmdldGZpbGVuYW1lKCkKICAgICAgICAgaWYgbm90IGZpbGVuYW1lOgogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIG5vdCBzZWxmLnRhYm5hbm55KGZpbGVuYW1lKToKLSAgICAgICAgICAgIHJldHVybgogICAgICAgICBjb2RlID0gc2VsZi5jaGVja3N5bnRheChmaWxlbmFtZSkKICAgICAgICAgaWYgbm90IGNvZGU6CiAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IHNlbGYudGFibmFubnkoZmlsZW5hbWUpOgorICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHNoZWxsID0gc2VsZi5zaGVsbAogICAgICAgICBpbnRlcnAgPSBzaGVsbC5pbnRlcnAKICAgICAgICAgaWYgUHlTaGVsbC51c2Vfc3VicHJvY2VzczoKZGlmZiAtLWdpdCBhL0xpYi9pbnNwZWN0LnB5IGIvTGliL2luc3BlY3QucHkKaW5kZXggMGI0OThiNS4uOTg2YTQxNSAxMDA2NDQKLS0tIGEvTGliL2luc3BlY3QucHkKKysrIGIvTGliL2luc3BlY3QucHkKQEAgLTQwMyw2ICs0MDMsNyBAQAogICAgIHJldHVybiBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChfZmlsZW5hbWUpKQogCiBtb2R1bGVzYnlmaWxlID0ge30KK19maWxlc2J5bW9kbmFtZSA9IHt9CiAKIGRlZiBnZXRtb2R1bGUob2JqZWN0LCBfZmlsZW5hbWU9Tm9uZSk6CiAgICAgIiIiUmV0dXJuIHRoZSBtb2R1bGUgYW4gb2JqZWN0IHdhcyBkZWZpbmVkIGluLCBvciBOb25lIGlmIG5vdCBmb3VuZC4iIiIKQEAgLTQxMCwxOSArNDExLDMyIEBACiAgICAgICAgIHJldHVybiBvYmplY3QKICAgICBpZiBoYXNhdHRyKG9iamVjdCwgJ19fbW9kdWxlX18nKToKICAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzLmdldChvYmplY3QuX19tb2R1bGVfXykKKyAgICAjIFRyeSB0aGUgZmlsZW5hbWUgdG8gbW9kdWxlbmFtZSBjYWNoZQorICAgIGlmIF9maWxlbmFtZSBpcyBub3QgTm9uZSBhbmQgX2ZpbGVuYW1lIGluIG1vZHVsZXNieWZpbGU6CisgICAgICAgIHJldHVybiBzeXMubW9kdWxlcy5nZXQobW9kdWxlc2J5ZmlsZVtfZmlsZW5hbWVdKQorICAgICMgVHJ5IHRoZSBjYWNoZSBhZ2FpbiB3aXRoIHRoZSBhYnNvbHV0ZSBmaWxlIG5hbWUKICAgICB0cnk6CiAgICAgICAgIGZpbGUgPSBnZXRhYnNmaWxlKG9iamVjdCwgX2ZpbGVuYW1lKQogICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgIHJldHVybiBOb25lCiAgICAgaWYgZmlsZSBpbiBtb2R1bGVzYnlmaWxlOgogICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXMuZ2V0KG1vZHVsZXNieWZpbGVbZmlsZV0pCi0gICAgZm9yIG1vZHVsZSBpbiBzeXMubW9kdWxlcy52YWx1ZXMoKToKKyAgICAjIFVwZGF0ZSB0aGUgZmlsZW5hbWUgdG8gbW9kdWxlIG5hbWUgY2FjaGUgYW5kIGNoZWNrIHlldCBhZ2FpbgorICAgICMgQ29weSBzeXMubW9kdWxlcyBpbiBvcmRlciB0byBjb3BlIHdpdGggY2hhbmdlcyB3aGlsZSBpdGVyYXRpbmcKKyAgICBmb3IgbW9kbmFtZSwgbW9kdWxlIGluIHN5cy5tb2R1bGVzLml0ZW1zKCk6CiAgICAgICAgIGlmIGlzbW9kdWxlKG1vZHVsZSkgYW5kIGhhc2F0dHIobW9kdWxlLCAnX19maWxlX18nKToKKyAgICAgICAgICAgIGYgPSBtb2R1bGUuX19maWxlX18KKyAgICAgICAgICAgIGlmIGYgPT0gX2ZpbGVzYnltb2RuYW1lLmdldChtb2RuYW1lLCBOb25lKToKKyAgICAgICAgICAgICAgICAjIEhhdmUgYWxyZWFkeSBtYXBwZWQgdGhpcyBtb2R1bGUsIHNvIHNraXAgaXQKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgX2ZpbGVzYnltb2RuYW1lW21vZG5hbWVdID0gZgogICAgICAgICAgICAgZiA9IGdldGFic2ZpbGUobW9kdWxlKQorICAgICAgICAgICAgIyBBbHdheXMgbWFwIHRvIHRoZSBuYW1lIHRoZSBtb2R1bGUga25vd3MgaXRzZWxmIGJ5CiAgICAgICAgICAgICBtb2R1bGVzYnlmaWxlW2ZdID0gbW9kdWxlc2J5ZmlsZVsKICAgICAgICAgICAgICAgICBvcy5wYXRoLnJlYWxwYXRoKGYpXSA9IG1vZHVsZS5fX25hbWVfXwogICAgIGlmIGZpbGUgaW4gbW9kdWxlc2J5ZmlsZToKICAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzLmdldChtb2R1bGVzYnlmaWxlW2ZpbGVdKQorICAgICMgQ2hlY2sgdGhlIG1haW4gbW9kdWxlCiAgICAgbWFpbiA9IHN5cy5tb2R1bGVzWydfX21haW5fXyddCiAgICAgaWYgbm90IGhhc2F0dHIob2JqZWN0LCAnX19uYW1lX18nKToKICAgICAgICAgcmV0dXJuIE5vbmUKQEAgLTQzMCw2ICs0NDQsNyBAQAogICAgICAgICBtYWlub2JqZWN0ID0gZ2V0YXR0cihtYWluLCBvYmplY3QuX19uYW1lX18pCiAgICAgICAgIGlmIG1haW5vYmplY3QgaXMgb2JqZWN0OgogICAgICAgICAgICAgcmV0dXJuIG1haW4KKyAgICAjIENoZWNrIGJ1aWx0aW5zCiAgICAgYnVpbHRpbiA9IHN5cy5tb2R1bGVzWydfX2J1aWx0aW5fXyddCiAgICAgaWYgaGFzYXR0cihidWlsdGluLCBvYmplY3QuX19uYW1lX18pOgogICAgICAgICBidWlsdGlub2JqZWN0ID0gZ2V0YXR0cihidWlsdGluLCBvYmplY3QuX19uYW1lX18pCkBAIC00NDQsNyArNDU5LDcgQEAKICAgICBpbiB0aGUgZmlsZSBhbmQgdGhlIGxpbmUgbnVtYmVyIGluZGV4ZXMgYSBsaW5lIGluIHRoYXQgbGlzdC4gIEFuIElPRXJyb3IKICAgICBpcyByYWlzZWQgaWYgdGhlIHNvdXJjZSBjb2RlIGNhbm5vdCBiZSByZXRyaWV2ZWQuIiIiCiAgICAgZmlsZSA9IGdldHNvdXJjZWZpbGUob2JqZWN0KSBvciBnZXRmaWxlKG9iamVjdCkKLSAgICBtb2R1bGUgPSBnZXRtb2R1bGUob2JqZWN0KQorICAgIG1vZHVsZSA9IGdldG1vZHVsZShvYmplY3QsIGZpbGUpCiAgICAgaWYgbW9kdWxlOgogICAgICAgICBsaW5lcyA9IGxpbmVjYWNoZS5nZXRsaW5lcyhmaWxlLCBtb2R1bGUuX19kaWN0X18pCiAgICAgZWxzZToKQEAgLTQ1Nyw5ICs0NzIsMjQgQEAKIAogICAgIGlmIGlzY2xhc3Mob2JqZWN0KToKICAgICAgICAgbmFtZSA9IG9iamVjdC5fX25hbWVfXwotICAgICAgICBwYXQgPSByZS5jb21waWxlKHInXlxzKmNsYXNzXHMqJyArIG5hbWUgKyByJ1xiJykKKyAgICAgICAgcGF0ID0gcmUuY29tcGlsZShyJ14oXHMqKWNsYXNzXHMqJyArIG5hbWUgKyByJ1xiJykKKyAgICAgICAgIyBtYWtlIHNvbWUgZWZmb3J0IHRvIGZpbmQgdGhlIGJlc3QgbWF0Y2hpbmcgY2xhc3MgZGVmaW5pdGlvbjoKKyAgICAgICAgIyB1c2UgdGhlIG9uZSB3aXRoIHRoZSBsZWFzdCBpbmRlbnRhdGlvbiwgd2hpY2ggaXMgdGhlIG9uZQorICAgICAgICAjIHRoYXQncyBtb3N0IHByb2JhYmx5IG5vdCBpbnNpZGUgYSBmdW5jdGlvbiBkZWZpbml0aW9uLgorICAgICAgICBjYW5kaWRhdGVzID0gW10KICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGxpbmVzKSk6Ci0gICAgICAgICAgICBpZiBwYXQubWF0Y2gobGluZXNbaV0pOiByZXR1cm4gbGluZXMsIGkKKyAgICAgICAgICAgIG1hdGNoID0gcGF0Lm1hdGNoKGxpbmVzW2ldKQorICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgIyBpZiBpdCdzIGF0IHRvcGxldmVsLCBpdCdzIGFscmVhZHkgdGhlIGJlc3Qgb25lCisgICAgICAgICAgICAgICAgaWYgbGluZXNbaV1bMF0gPT0gJ2MnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGluZXMsIGkKKyAgICAgICAgICAgICAgICAjIGVsc2UgYWRkIHdoaXRlc3BhY2UgdG8gY2FuZGlkYXRlIGxpc3QKKyAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLmFwcGVuZCgobWF0Y2guZ3JvdXAoMSksIGkpKQorICAgICAgICBpZiBjYW5kaWRhdGVzOgorICAgICAgICAgICAgIyB0aGlzIHdpbGwgc29ydCBieSB3aGl0ZXNwYWNlLCBhbmQgYnkgbGluZSBudW1iZXIsCisgICAgICAgICAgICAjIGxlc3Mgd2hpdGVzcGFjZSBmaXJzdAorICAgICAgICAgICAgY2FuZGlkYXRlcy5zb3J0KCkKKyAgICAgICAgICAgIHJldHVybiBsaW5lcywgY2FuZGlkYXRlc1swXVsxXQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignY291bGQgbm90IGZpbmQgY2xhc3MgZGVmaW5pdGlvbicpCiAKZGlmZiAtLWdpdCBhL0xpYi9saWItdGsvVGl4LnB5IGIvTGliL2xpYi10ay9UaXgucHkKaW5kZXggMWQyZmRhZC4uYWQ2MTI2YSAxMDA3NTUKLS0tIGEvTGliL2xpYi10ay9UaXgucHkKKysrIGIvTGliL2xpYi10ay9UaXgucHkKQEAgLTQyMSw3ICs0MjEsNyBAQAogICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgIHBsaXN0ID0gW10KIAotICAgICAgICBpZiAobm90IGNoZWNrX2ludGVybWVkaWF0ZSkgb3IgbGVuKHBsaXN0KSA8IDI6CisgICAgICAgIGlmIG5vdCBjaGVja19pbnRlcm1lZGlhdGU6CiAgICAgICAgICAgICAjIGltbWVkaWF0ZSBkZXNjZW5kYW50CiAgICAgICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCBOb25lLCBOb25lLCB7J25hbWUnIDogbmFtZX0pCiAgICAgICAgIGVsc2U6CkBAIC00MzcsNiArNDM3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gVGl4U3ViV2lkZ2V0KHBhcmVudCwgcGxpc3RbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95X3BoeXNpY2FsbHk9MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2ludGVybWVkaWF0ZT0wKQorICAgICAgICAgICAgIyBUaGUgVGsgd2lkZ2V0IG5hbWUgaXMgaW4gcGxpc3QsIG5vdCBpbiBuYW1lCisgICAgICAgICAgICBpZiBwbGlzdDoKKyAgICAgICAgICAgICAgICBuYW1lID0gcGxpc3RbLTFdCiAgICAgICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgcGFyZW50LCBOb25lLCBOb25lLCB7J25hbWUnIDogbmFtZX0pCiAgICAgICAgIHNlbGYuZGVzdHJveV9waHlzaWNhbGx5ID0gZGVzdHJveV9waHlzaWNhbGx5CiAKZGlmZiAtLWdpdCBhL0xpYi9saWItdGsvVGtpbnRlci5weSBiL0xpYi9saWItdGsvVGtpbnRlci5weQppbmRleCBiZWExMzBjLi5mODUzOGVkIDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL1RraW50ZXIucHkKKysrIGIvTGliL2xpYi10ay9Ua2ludGVyLnB5CkBAIC0zMDE3LDcgKzMwMTcsNyBAQAogICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NjYW4nLCAnZHJhZ3RvJywgeCwgeSkKICAgICBkZWYgc2VhcmNoKHNlbGYsIHBhdHRlcm4sIGluZGV4LCBzdG9waW5kZXg9Tm9uZSwKICAgICAgICAgICAgZm9yd2FyZHM9Tm9uZSwgYmFja3dhcmRzPU5vbmUsIGV4YWN0PU5vbmUsCi0gICAgICAgICAgIHJlZ2V4cD1Ob25lLCBub2Nhc2U9Tm9uZSwgY291bnQ9Tm9uZSk6CisgICAgICAgICAgIHJlZ2V4cD1Ob25lLCBub2Nhc2U9Tm9uZSwgY291bnQ9Tm9uZSwgZWxpZGU9Tm9uZSk6CiAgICAgICAgICIiIlNlYXJjaCBQQVRURVJOIGJlZ2lubmluZyBmcm9tIElOREVYIHVudGlsIFNUT1BJTkRFWC4KICAgICAgICAgUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGEgbWF0Y2ggb3IgYW4gZW1wdHkgc3RyaW5nLiIiIgogICAgICAgICBhcmdzID0gW3NlbGYuX3csICdzZWFyY2gnXQpAQCAtMzAyNiw2ICszMDI2LDcgQEAKICAgICAgICAgaWYgZXhhY3Q6IGFyZ3MuYXBwZW5kKCctZXhhY3QnKQogICAgICAgICBpZiByZWdleHA6IGFyZ3MuYXBwZW5kKCctcmVnZXhwJykKICAgICAgICAgaWYgbm9jYXNlOiBhcmdzLmFwcGVuZCgnLW5vY2FzZScpCisgICAgICAgIGlmIGVsaWRlOiBhcmdzLmFwcGVuZCgnLWVsaWRlJykKICAgICAgICAgaWYgY291bnQ6IGFyZ3MuYXBwZW5kKCctY291bnQnKTsgYXJncy5hcHBlbmQoY291bnQpCiAgICAgICAgIGlmIHBhdHRlcm5bMF0gPT0gJy0nOiBhcmdzLmFwcGVuZCgnLS0nKQogICAgICAgICBhcmdzLmFwcGVuZChwYXR0ZXJuKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay90a01lc3NhZ2VCb3gucHkgYi9MaWIvbGliLXRrL3RrTWVzc2FnZUJveC5weQppbmRleCBhZmYwNjliLi5kMTRjYTg2IDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL3RrTWVzc2FnZUJveC5weQorKysgYi9MaWIvbGliLXRrL3RrTWVzc2FnZUJveC5weQpAQCAtMTAyLDYgKzEwMiwxNSBAQAogICAgIHMgPSBfc2hvdyh0aXRsZSwgbWVzc2FnZSwgUVVFU1RJT04sIFlFU05PLCAqKm9wdGlvbnMpCiAgICAgcmV0dXJuIHMgPT0gWUVTCiAKK2RlZiBhc2t5ZXNub2NhbmNlbCh0aXRsZT1Ob25lLCBtZXNzYWdlPU5vbmUsICoqb3B0aW9ucyk6CisgICAgIkFzayBhIHF1ZXN0aW9uOyByZXR1cm4gdHJ1ZSBpZiB0aGUgYW5zd2VyIGlzIHllcywgTm9uZSBpZiBjYW5jZWxsZWQuIgorICAgIHMgPSBfc2hvdyh0aXRsZSwgbWVzc2FnZSwgUVVFU1RJT04sIFlFU05PQ0FOQ0VMLCAqKm9wdGlvbnMpCisgICAgIyBzIG1pZ2h0IGJlIGEgVGNsIGluZGV4IG9iamVjdCwgc28gY29udmVydCBpdCB0byBhIHN0cmluZworICAgIHMgPSBzdHIocykKKyAgICBpZiBzID09IENBTkNFTDoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gcyA9PSBZRVMKKwogZGVmIGFza3JldHJ5Y2FuY2VsKHRpdGxlPU5vbmUsIG1lc3NhZ2U9Tm9uZSwgKipvcHRpb25zKToKICAgICAiQXNrIGlmIG9wZXJhdGlvbiBzaG91bGQgYmUgcmV0cmllZDsgcmV0dXJuIHRydWUgaWYgdGhlIGFuc3dlciBpcyB5ZXMiCiAgICAgcyA9IF9zaG93KHRpdGxlLCBtZXNzYWdlLCBXQVJOSU5HLCBSRVRSWUNBTkNFTCwgKipvcHRpb25zKQpAQCAtMTE5LDQgKzEyOCw1IEBACiAgICAgcHJpbnQgInF1ZXN0aW9uIiwgYXNrcXVlc3Rpb24oIlNwYW0iLCAiUXVlc3Rpb24/IikKICAgICBwcmludCAicHJvY2VlZCIsIGFza29rY2FuY2VsKCJTcGFtIiwgIlByb2NlZWQ/IikKICAgICBwcmludCAieWVzL25vIiwgYXNreWVzbm8oIlNwYW0iLCAiR290IGl0PyIpCisgICAgcHJpbnQgInllcy9uby9jYW5jZWwiLCBhc2t5ZXNub2NhbmNlbCgiU3BhbSIsICJXYW50IGl0PyIpCiAgICAgcHJpbnQgInRyeSBhZ2FpbiIsIGFza3JldHJ5Y2FuY2VsKCJTcGFtIiwgIlRyeSBhZ2Fpbj8iKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay90a1NpbXBsZURpYWxvZy5weSBiL0xpYi9saWItdGsvdGtTaW1wbGVEaWFsb2cucHkKaW5kZXggN2I3MDQxMS4uMzQxMWQ5NCAxMDA2NDQKLS0tIGEvTGliL2xpYi10ay90a1NpbXBsZURpYWxvZy5weQorKysgYi9MaWIvbGliLXRrL3RrU2ltcGxlRGlhbG9nLnB5CkBAIC00Niw4ICs0NiwxMyBAQAogICAgICAgICAgICAgdGl0bGUgLS0gdGhlIGRpYWxvZyB0aXRsZQogICAgICAgICAnJycKICAgICAgICAgVG9wbGV2ZWwuX19pbml0X18oc2VsZiwgcGFyZW50KQotICAgICAgICBzZWxmLnRyYW5zaWVudChwYXJlbnQpCiAKKyAgICAgICAgIyBJZiB0aGUgbWFzdGVyIGlzIG5vdCB2aWV3YWJsZSwgZG9uJ3QKKyAgICAgICAgIyBtYWtlIHRoZSBjaGlsZCB0cmFuc2llbnQsIG9yIGVsc2UgaXQKKyAgICAgICAgIyB3b3VsZCBiZSBvcGVuZWQgd2l0aGRyYXduCisgICAgICAgIGlmIHBhcmVudC53aW5mb192aWV3YWJsZSgpOiAgCisgICAgICAgICAgICBzZWxmLnRyYW5zaWVudChwYXJlbnQpCisgCiAgICAgICAgIGlmIHRpdGxlOgogICAgICAgICAgICAgc2VsZi50aXRsZSh0aXRsZSkKIApAQCAtMTI0LDkgKzEyOSwxMCBAQAogICAgICAgICBzZWxmLndpdGhkcmF3KCkKICAgICAgICAgc2VsZi51cGRhdGVfaWRsZXRhc2tzKCkKIAotICAgICAgICBzZWxmLmFwcGx5KCkKLQotICAgICAgICBzZWxmLmNhbmNlbCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXBwbHkoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5jYW5jZWwoKQogCiAgICAgZGVmIGNhbmNlbChzZWxmLCBldmVudD1Ob25lKToKIApkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay90dXJ0bGUucHkgYi9MaWIvbGliLXRrL3R1cnRsZS5weQppbmRleCAwMWE1NWIxLi5mY2RlOWFmIDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL3R1cnRsZS5weQorKysgYi9MaWIvbGliLXRrL3R1cnRsZS5weQpAQCAtMTUsNiArMTUsNyBAQAogIiIiCiAKIGZyb20gbWF0aCBpbXBvcnQgKiAjIEFsc28gZm9yIGV4cG9ydAorZnJvbSB0aW1lIGltcG9ydCBzbGVlcAogaW1wb3J0IFRraW50ZXIKIAogc3BlZWRzID0gWydmYXN0ZXN0JywgJ2Zhc3QnLCAnbm9ybWFsJywgJ3Nsb3cnLCAnc2xvd2VzdCddCkBAIC05NDksNyArOTUwLDYgQEAKIAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIGZyb20gdGltZSBpbXBvcnQgc2xlZXAKICAgICBkZW1vKCkKICAgICBzbGVlcCgzKQogICAgIGRlbW8yKCkKZGlmZiAtLWdpdCBhL0xpYi9sb2dnaW5nL19faW5pdF9fLnB5IGIvTGliL2xvZ2dpbmcvX19pbml0X18ucHkKaW5kZXggOTUzYWZlOS4uYjU3YTlhZiAxMDA2NDQKLS0tIGEvTGliL2xvZ2dpbmcvX19pbml0X18ucHkKKysrIGIvTGliL2xvZ2dpbmcvX19pbml0X18ucHkKQEAgLTIxNCw3ICsyMTQsNyBAQAogICAgIGluZm9ybWF0aW9uIHRvIGJlIGxvZ2dlZC4KICAgICAiIiIKICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbGV2ZWwsIHBhdGhuYW1lLCBsaW5lbm8sCi0gICAgICAgICAgICAgICAgIG1zZywgYXJncywgZXhjX2luZm8sIGZ1bmMpOgorICAgICAgICAgICAgICAgICBtc2csIGFyZ3MsIGV4Y19pbmZvLCBmdW5jPU5vbmUpOgogICAgICAgICAiIiIKICAgICAgICAgSW5pdGlhbGl6ZSBhIGxvZ2dpbmcgcmVjb3JkIHdpdGggaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24uCiAgICAgICAgICIiIgpAQCAtOTEwLDEwICs5MTAsMTEgQEAKICAgICAgICAgRW5zdXJlIHRoYXQgY2hpbGRyZW4gb2YgdGhlIHBsYWNlaG9sZGVyIHBoIGFyZSBjb25uZWN0ZWQgdG8gdGhlCiAgICAgICAgIHNwZWNpZmllZCBsb2dnZXIuCiAgICAgICAgICIiIgotICAgICAgICAjZm9yIGMgaW4gcGgubG9nZ2VyczoKKyAgICAgICAgbmFtZSA9IGFsb2dnZXIubmFtZQorICAgICAgICBuYW1lbGVuID0gbGVuKG5hbWUpCiAgICAgICAgIGZvciBjIGluIHBoLmxvZ2dlck1hcC5rZXlzKCk6Ci0gICAgICAgICAgICAjIFhYWCBJcyB0aGUgZm9sbG93aW5nIGNvcnJlY3Q/ICBTaG91bGRuJ3QgaXQgYmUgPj0gMD8KLSAgICAgICAgICAgIGlmIHN0cmluZy5maW5kKGMucGFyZW50Lm5hbWUsIGFsb2dnZXIubmFtZSkgIT0gMDoKKyAgICAgICAgICAgICNUaGUgaWYgbWVhbnMgLi4uIGlmIG5vdCBjLnBhcmVudC5uYW1lLnN0YXJ0c3dpdGgobm0pCisgICAgICAgICAgICBpZiBjLnBhcmVudC5uYW1lWzpuYW1lbGVuXSAhPSBuYW1lOgogICAgICAgICAgICAgICAgIGFsb2dnZXIucGFyZW50ID0gYy5wYXJlbnQKICAgICAgICAgICAgICAgICBjLnBhcmVudCA9IGFsb2dnZXIKIApkaWZmIC0tZ2l0IGEvTGliL2xvZ2dpbmcvY29uZmlnLnB5IGIvTGliL2xvZ2dpbmcvY29uZmlnLnB5CmluZGV4IGEzMWU4ZDAuLmE5OTcwZDAgMTAwNjQ0Ci0tLSBhL0xpYi9sb2dnaW5nL2NvbmZpZy5weQorKysgYi9MaWIvbG9nZ2luZy9jb25maWcucHkKQEAgLTI3LDcgKzI3LDcgQEAKIFRvIHVzZSwgc2ltcGx5ICdpbXBvcnQgbG9nZ2luZycgYW5kIGxvZyBhd2F5IQogIiIiCiAKLWltcG9ydCBzeXMsIGxvZ2dpbmcsIGxvZ2dpbmcuaGFuZGxlcnMsIHN0cmluZywgc29ja2V0LCBzdHJ1Y3QsIG9zLCB0cmFjZWJhY2sKK2ltcG9ydCBzeXMsIGxvZ2dpbmcsIGxvZ2dpbmcuaGFuZGxlcnMsIHN0cmluZywgc29ja2V0LCBzdHJ1Y3QsIG9zLCB0cmFjZWJhY2ssIHR5cGVzCiAKIHRyeToKICAgICBpbXBvcnQgdGhyZWFkCkBAIC0xMTAsNyArMTEwLDcgQEAKICAgICBmbGlzdCA9IHN0cmluZy5zcGxpdChmbGlzdCwgIiwiKQogICAgIGZvcm1hdHRlcnMgPSB7fQogICAgIGZvciBmb3JtIGluIGZsaXN0OgotICAgICAgICBzZWN0bmFtZSA9ICJmb3JtYXR0ZXJfJXMiICUgZm9ybQorICAgICAgICBzZWN0bmFtZSA9ICJmb3JtYXR0ZXJfJXMiICUgc3RyaW5nLnN0cmlwKGZvcm0pCiAgICAgICAgIG9wdHMgPSBjcC5vcHRpb25zKHNlY3RuYW1lKQogICAgICAgICBpZiAiZm9ybWF0IiBpbiBvcHRzOgogICAgICAgICAgICAgZnMgPSBjcC5nZXQoc2VjdG5hbWUsICJmb3JtYXQiLCAxKQpAQCAtMTM5LDcgKzEzOSw3IEBACiAgICAgaGFuZGxlcnMgPSB7fQogICAgIGZpeHVwcyA9IFtdICNmb3IgaW50ZXItaGFuZGxlciByZWZlcmVuY2VzCiAgICAgZm9yIGhhbmQgaW4gaGxpc3Q6Ci0gICAgICAgIHNlY3RuYW1lID0gImhhbmRsZXJfJXMiICUgaGFuZAorICAgICAgICBzZWN0bmFtZSA9ICJoYW5kbGVyXyVzIiAlIHN0cmluZy5zdHJpcChoYW5kKQogICAgICAgICBrbGFzcyA9IGNwLmdldChzZWN0bmFtZSwgImNsYXNzIikKICAgICAgICAgb3B0cyA9IGNwLm9wdGlvbnMoc2VjdG5hbWUpCiAgICAgICAgIGlmICJmb3JtYXR0ZXIiIGluIG9wdHM6CkBAIC0xNzYsNiArMTc2LDcgQEAKICAgICAjIGNvbmZpZ3VyZSB0aGUgcm9vdCBmaXJzdAogICAgIGxsaXN0ID0gY3AuZ2V0KCJsb2dnZXJzIiwgImtleXMiKQogICAgIGxsaXN0ID0gc3RyaW5nLnNwbGl0KGxsaXN0LCAiLCIpCisgICAgbGxpc3QgPSBtYXAobGFtYmRhIHg6IHN0cmluZy5zdHJpcCh4KSwgbGxpc3QpCiAgICAgbGxpc3QucmVtb3ZlKCJyb290IikKICAgICBzZWN0bmFtZSA9ICJsb2dnZXJfcm9vdCIKICAgICByb290ID0gbG9nZ2luZy5yb290CkBAIC0xOTAsNyArMTkxLDcgQEAKICAgICBpZiBsZW4oaGxpc3QpOgogICAgICAgICBobGlzdCA9IHN0cmluZy5zcGxpdChobGlzdCwgIiwiKQogICAgICAgICBmb3IgaGFuZCBpbiBobGlzdDoKLSAgICAgICAgICAgIGxvZy5hZGRIYW5kbGVyKGhhbmRsZXJzW2hhbmRdKQorICAgICAgICAgICAgbG9nLmFkZEhhbmRsZXIoaGFuZGxlcnNbc3RyaW5nLnN0cmlwKGhhbmQpXSkKIAogICAgICNhbmQgbm93IHRoZSBvdGhlcnMuLi4KICAgICAjd2UgZG9uJ3Qgd2FudCB0byBsb3NlIHRoZSBleGlzdGluZyBsb2dnZXJzLApAQCAtMjI1LDcgKzIyNiw3IEBACiAgICAgICAgIGlmIGxlbihobGlzdCk6CiAgICAgICAgICAgICBobGlzdCA9IHN0cmluZy5zcGxpdChobGlzdCwgIiwiKQogICAgICAgICAgICAgZm9yIGhhbmQgaW4gaGxpc3Q6Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcnNbaGFuZF0pCisgICAgICAgICAgICAgICAgbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcnNbc3RyaW5nLnN0cmlwKGhhbmQpXSkKIAogICAgICNEaXNhYmxlIGFueSBvbGQgbG9nZ2Vycy4gVGhlcmUncyBubyBwb2ludCBkZWxldGluZwogICAgICN0aGVtIGFzIG90aGVyIHRocmVhZHMgbWF5IGNvbnRpbnVlIHRvIGhvbGQgcmVmZXJlbmNlcwpkaWZmIC0tZ2l0IGEvTGliL2xvZ2dpbmcvaGFuZGxlcnMucHkgYi9MaWIvbG9nZ2luZy9oYW5kbGVycy5weQppbmRleCBhMDI1NWNlLi4xN2VjYThhIDEwMDY0NAotLS0gYS9MaWIvbG9nZ2luZy9oYW5kbGVycy5weQorKysgYi9MaWIvbG9nZ2luZy9oYW5kbGVycy5weQpAQCAtNTkwLDExICs1OTAsMTEgQEAKICAgICAgICAgc2VsZi5hZGRyZXNzID0gYWRkcmVzcwogICAgICAgICBzZWxmLmZhY2lsaXR5ID0gZmFjaWxpdHkKICAgICAgICAgaWYgdHlwZShhZGRyZXNzKSA9PSB0eXBlcy5TdHJpbmdUeXBlOgotICAgICAgICAgICAgc2VsZi5fY29ubmVjdF91bml4c29ja2V0KGFkZHJlc3MpCiAgICAgICAgICAgICBzZWxmLnVuaXhzb2NrZXQgPSAxCisgICAgICAgICAgICBzZWxmLl9jb25uZWN0X3VuaXhzb2NrZXQoYWRkcmVzcykKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfREdSQU0pCiAgICAgICAgICAgICBzZWxmLnVuaXhzb2NrZXQgPSAwCisgICAgICAgICAgICBzZWxmLnNvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX0RHUkFNKQogCiAgICAgICAgIHNlbGYuZm9ybWF0dGVyID0gTm9uZQogCmRpZmYgLS1naXQgYS9MaWIvbWFjcGF0aC5weSBiL0xpYi9tYWNwYXRoLnB5CmluZGV4IGY5M2NlYjEuLmQzODlkNzAgMTAwNjQ0Ci0tLSBhL0xpYi9tYWNwYXRoLnB5CisrKyBiL0xpYi9tYWNwYXRoLnB5CkBAIC0yLDYgKzIsNyBAQAogCiBpbXBvcnQgb3MKIGZyb20gc3RhdCBpbXBvcnQgKgorZnJvbSBnZW5lcmljcGF0aCBpbXBvcnQgKgogCiBfX2FsbF9fID0gWyJub3JtY2FzZSIsImlzYWJzIiwiam9pbiIsInNwbGl0ZHJpdmUiLCJzcGxpdCIsInNwbGl0ZXh0IiwKICAgICAgICAgICAgImJhc2VuYW1lIiwiZGlybmFtZSIsImNvbW1vbnByZWZpeCIsImdldHNpemUiLCJnZXRtdGltZSIsCkBAIC0xMDEsMzEgKzEwMiw2IEBACiAgICAgY29tcG9uZW50cyA9IHNwbGl0KHMpCiAgICAgcmV0dXJuIGxlbihjb21wb25lbnRzKSA9PSAyIGFuZCBjb21wb25lbnRzWzFdID09ICcnCiAKLWRlZiBpc2RpcihzKToKLSAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgcGF0aG5hbWUgcmVmZXJzIHRvIGFuIGV4aXN0aW5nIGRpcmVjdG9yeS4iIiIKLQotICAgIHRyeToKLSAgICAgICAgc3QgPSBvcy5zdGF0KHMpCi0gICAgZXhjZXB0IG9zLmVycm9yOgotICAgICAgICByZXR1cm4gMAotICAgIHJldHVybiBTX0lTRElSKHN0LnN0X21vZGUpCi0KLQotIyBHZXQgc2l6ZSwgbXRpbWUsIGF0aW1lIG9mIGZpbGVzLgotCi1kZWYgZ2V0c2l6ZShmaWxlbmFtZSk6Ci0gICAgIiIiUmV0dXJuIHRoZSBzaXplIG9mIGEgZmlsZSwgcmVwb3J0ZWQgYnkgb3Muc3RhdCgpLiIiIgotICAgIHJldHVybiBvcy5zdGF0KGZpbGVuYW1lKS5zdF9zaXplCi0KLWRlZiBnZXRtdGltZShmaWxlbmFtZSk6Ci0gICAgIiIiUmV0dXJuIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lIG9mIGEgZmlsZSwgcmVwb3J0ZWQgYnkgb3Muc3RhdCgpLiIiIgotICAgIHJldHVybiBvcy5zdGF0KGZpbGVuYW1lKS5zdF9tdGltZQotCi1kZWYgZ2V0YXRpbWUoZmlsZW5hbWUpOgotICAgICIiIlJldHVybiB0aGUgbGFzdCBhY2Nlc3MgdGltZSBvZiBhIGZpbGUsIHJlcG9ydGVkIGJ5IG9zLnN0YXQoKS4iIiIKLSAgICByZXR1cm4gb3Muc3RhdChmaWxlbmFtZSkuc3RfYXRpbWUKLQotCiBkZWYgaXNsaW5rKHMpOgogICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBwYXRobmFtZSByZWZlcnMgdG8gYSBzeW1ib2xpYyBsaW5rLiIiIgogCkBAIC0xMzUsMjkgKzExMSw2IEBACiAgICAgZXhjZXB0OgogICAgICAgICByZXR1cm4gRmFsc2UKIAotCi1kZWYgaXNmaWxlKHMpOgotICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBwYXRobmFtZSByZWZlcnMgdG8gYW4gZXhpc3RpbmcgcmVndWxhciBmaWxlLiIiIgotCi0gICAgdHJ5OgotICAgICAgICBzdCA9IG9zLnN0YXQocykKLSAgICBleGNlcHQgb3MuZXJyb3I6Ci0gICAgICAgIHJldHVybiBGYWxzZQotICAgIHJldHVybiBTX0lTUkVHKHN0LnN0X21vZGUpCi0KLWRlZiBnZXRjdGltZShmaWxlbmFtZSk6Ci0gICAgIiIiUmV0dXJuIHRoZSBjcmVhdGlvbiB0aW1lIG9mIGEgZmlsZSwgcmVwb3J0ZWQgYnkgb3Muc3RhdCgpLiIiIgotICAgIHJldHVybiBvcy5zdGF0KGZpbGVuYW1lKS5zdF9jdGltZQotCi1kZWYgZXhpc3RzKHMpOgotICAgICIiIlRlc3Qgd2hldGhlciBhIHBhdGggZXhpc3RzLiAgUmV0dXJucyBGYWxzZSBmb3IgYnJva2VuIHN5bWJvbGljIGxpbmtzIiIiCi0KLSAgICB0cnk6Ci0gICAgICAgIHN0ID0gb3Muc3RhdChzKQotICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgcmV0dXJuIFRydWUKLQogIyBJcyBgc3RhdGAvYGxzdGF0YCBhIG1lYW5pbmdmdWwgZGlmZmVyZW5jZSBvbiB0aGUgTWFjPyAgVGhpcyBpcyBzYWZlIGluIGFueQogIyBjYXNlLgogCkBAIC0xNzAsMjAgKzEyMyw2IEBACiAgICAgICAgIHJldHVybiBGYWxzZQogICAgIHJldHVybiBUcnVlCiAKLSMgUmV0dXJuIHRoZSBsb25nZXN0IHByZWZpeCBvZiBhbGwgbGlzdCBlbGVtZW50cy4KLQotZGVmIGNvbW1vbnByZWZpeChtKToKLSAgICAiR2l2ZW4gYSBsaXN0IG9mIHBhdGhuYW1lcywgcmV0dXJucyB0aGUgbG9uZ2VzdCBjb21tb24gbGVhZGluZyBjb21wb25lbnQiCi0gICAgaWYgbm90IG06IHJldHVybiAnJwotICAgIHMxID0gbWluKG0pCi0gICAgczIgPSBtYXgobSkKLSAgICBuID0gbWluKGxlbihzMSksIGxlbihzMikpCi0gICAgZm9yIGkgaW4geHJhbmdlKG4pOgotICAgICAgICBpZiBzMVtpXSAhPSBzMltpXToKLSAgICAgICAgICAgIHJldHVybiBzMVs6aV0KLSAgICByZXR1cm4gczFbOm5dCi0KLQogZGVmIGV4cGFuZHZhcnMocGF0aCk6CiAgICAgIiIiRHVtbXkgdG8gcmV0YWluIGludGVyZmFjZS1jb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMuIiIiCiAgICAgcmV0dXJuIHBhdGgKZGlmZiAtLWdpdCBhL0xpYi9tYWlsYm94LnB5IGIvTGliL21haWxib3gucHkKaW5kZXggZWQ3YzdkMS4uMDg0MzQzMCAxMDA3NTUKLS0tIGEvTGliL21haWxib3gucHkKKysrIGIvTGliL21haWxib3gucHkKQEAgLTIsNiArMiwxMiBAQAogCiAiIiJSZWFkL3dyaXRlIHN1cHBvcnQgZm9yIE1haWxkaXIsIG1ib3gsIE1ILCBCYWJ5bCwgYW5kIE1NREYgbWFpbGJveGVzLiIiIgogCisjIE5vdGVzIGZvciBhdXRob3JzIG9mIG5ldyBtYWlsYm94IHN1YmNsYXNzZXM6CisjCisjIFJlbWVtYmVyIHRvIGZzeW5jKCkgY2hhbmdlcyB0byBkaXNrIGJlZm9yZSBjbG9zaW5nIGEgbW9kaWZpZWQgZmlsZQorIyBvciByZXR1cm5pbmcgZnJvbSBhIGZsdXNoKCkgbWV0aG9kLiAgU2VlIGZ1bmN0aW9ucyBfc3luY19mbHVzaCgpIGFuZAorIyBfc3luY19jbG9zZSgpLgorCiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKIGltcG9ydCB0aW1lCkBAIC0yMzUsNyArMjQxLDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc2VsZi5fZHVtcF9tZXNzYWdlKG1lc3NhZ2UsIHRtcF9maWxlKQogICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgdG1wX2ZpbGUuY2xvc2UoKQorICAgICAgICAgICAgX3N5bmNfY2xvc2UodG1wX2ZpbGUpCiAgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTWFpbGRpck1lc3NhZ2UpOgogICAgICAgICAgICAgc3ViZGlyID0gbWVzc2FnZS5nZXRfc3ViZGlyKCkKICAgICAgICAgICAgIHN1ZmZpeCA9IHNlbGYuY29sb24gKyBtZXNzYWdlLmdldF9pbmZvKCkKQEAgLTI0Niw3ICsyNTIsMTkgQEAKICAgICAgICAgICAgIHN1ZmZpeCA9ICcnCiAgICAgICAgIHVuaXEgPSBvcy5wYXRoLmJhc2VuYW1lKHRtcF9maWxlLm5hbWUpLnNwbGl0KHNlbGYuY29sb24pWzBdCiAgICAgICAgIGRlc3QgPSBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3ViZGlyLCB1bmlxICsgc3VmZml4KQotICAgICAgICBvcy5yZW5hbWUodG1wX2ZpbGUubmFtZSwgZGVzdCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgJ2xpbmsnKToKKyAgICAgICAgICAgICAgICBvcy5saW5rKHRtcF9maWxlLm5hbWUsIGRlc3QpCisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRtcF9maWxlLm5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9zLnJlbmFtZSh0bXBfZmlsZS5uYW1lLCBkZXN0KQorICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgIG9zLnJlbW92ZSh0bXBfZmlsZS5uYW1lKQorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FRVhJU1Q6CisgICAgICAgICAgICAgICAgcmFpc2UgRXh0ZXJuYWxDbGFzaEVycm9yKCdOYW1lIGNsYXNoIHdpdGggZXhpc3RpbmcgbWVzc2FnZTogJXMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgZGVzdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNYWlsZGlyTWVzc2FnZSk6CiAgICAgICAgICAgICBvcy51dGltZShkZXN0LCAob3MucGF0aC5nZXRhdGltZShkZXN0KSwgbWVzc2FnZS5nZXRfZGF0ZSgpKSkKICAgICAgICAgcmV0dXJuIHVuaXEKQEAgLTM2NCwxMiArMzgyLDE0IEBACiAKICAgICBkZWYgZ2V0X2ZvbGRlcihzZWxmLCBmb2xkZXIpOgogICAgICAgICAiIiJSZXR1cm4gYSBNYWlsZGlyIGluc3RhbmNlIGZvciB0aGUgbmFtZWQgZm9sZGVyLiIiIgotICAgICAgICByZXR1cm4gTWFpbGRpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJy4nICsgZm9sZGVyKSwgY3JlYXRlPUZhbHNlKQorICAgICAgICByZXR1cm4gTWFpbGRpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJy4nICsgZm9sZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeT1zZWxmLl9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGU9RmFsc2UpCiAKICAgICBkZWYgYWRkX2ZvbGRlcihzZWxmLCBmb2xkZXIpOgogICAgICAgICAiIiJDcmVhdGUgYSBmb2xkZXIgYW5kIHJldHVybiBhIE1haWxkaXIgaW5zdGFuY2UgcmVwcmVzZW50aW5nIGl0LiIiIgogICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICcuJyArIGZvbGRlcikKLSAgICAgICAgcmVzdWx0ID0gTWFpbGRpcihwYXRoKQorICAgICAgICByZXN1bHQgPSBNYWlsZGlyKHBhdGgsIGZhY3Rvcnk9c2VsZi5fZmFjdG9yeSkKICAgICAgICAgbWFpbGRpcmZvbGRlcl9wYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICdtYWlsZGlyZm9sZGVyJykKICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG1haWxkaXJmb2xkZXJfcGF0aCk6CiAgICAgICAgICAgICBvcy5jbG9zZShvcy5vcGVuKG1haWxkaXJmb2xkZXJfcGF0aCwgb3MuT19DUkVBVCB8IG9zLk9fV1JPTkxZKSkKQEAgLTQyMCwxMiArNDQwLDE3IEBACiAgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgogICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CiAgICAgICAgICAgICAgICAgTWFpbGRpci5fY291bnQgKz0gMQotICAgICAgICAgICAgICAgIHJldHVybiBvcGVuKHBhdGgsICd3YisnKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVfY2FyZWZ1bGx5KHBhdGgpCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUVYSVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIEV4dGVybmFsQ2xhc2hFcnJvcignTmFtZSBjbGFzaCBwcmV2ZW50ZWQgZmlsZSBjcmVhdGlvbjogJXMnICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKQorCisgICAgICAgICMgRmFsbCB0aHJvdWdoIHRvIGhlcmUgaWYgc3RhdCBzdWNjZWVkZWQgb3Igb3BlbiByYWlzZWQgRUVYSVNULgorICAgICAgICByYWlzZSBFeHRlcm5hbENsYXNoRXJyb3IoJ05hbWUgY2xhc2ggcHJldmVudGVkIGZpbGUgY3JlYXRpb246ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKQogCiAgICAgZGVmIF9yZWZyZXNoKHNlbGYpOgogICAgICAgICAiIiJVcGRhdGUgdGFibGUgb2YgY29udGVudHMgbWFwcGluZy4iIiIKQEAgLTU2MCw3ICs1ODUsOCBAQAogICAgICAgICAgICAgbmV3X2ZpbGUuY2xvc2UoKQogICAgICAgICAgICAgb3MucmVtb3ZlKG5ld19maWxlLm5hbWUpCiAgICAgICAgICAgICByYWlzZQotICAgICAgICBuZXdfZmlsZS5jbG9zZSgpCisgICAgICAgIF9zeW5jX2Nsb3NlKG5ld19maWxlKQorICAgICAgICAjIHNlbGYuX2ZpbGUgaXMgYWJvdXQgdG8gZ2V0IHJlcGxhY2VkLCBzbyBubyBuZWVkIHRvIHN5bmMuCiAgICAgICAgIHNlbGYuX2ZpbGUuY2xvc2UoKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBvcy5yZW5hbWUobmV3X2ZpbGUubmFtZSwgc2VsZi5fcGF0aCkKQEAgLTU3NSw3ICs2MDEsNyBAQAogICAgICAgICBzZWxmLl90b2MgPSBuZXdfdG9jCiAgICAgICAgIHNlbGYuX3BlbmRpbmcgPSBGYWxzZQogICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6Ci0gICAgICAgICAgICBfbG9ja19maWxlKG5ld19maWxlLCBkb3Rsb2NrPUZhbHNlKQorICAgICAgICAgICAgX2xvY2tfZmlsZShzZWxmLl9maWxlLCBkb3Rsb2NrPUZhbHNlKQogCiAgICAgZGVmIF9wcmVfbWFpbGJveF9ob29rKHNlbGYsIGYpOgogICAgICAgICAiIiJDYWxsZWQgYmVmb3JlIHdyaXRpbmcgdGhlIG1haWxib3ggdG8gZmlsZSBmLiIiIgpAQCAtNTk0LDcgKzYyMCw3IEBACiAgICAgICAgIHNlbGYuZmx1c2goKQogICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CiAgICAgICAgICAgICBzZWxmLnVubG9jaygpCi0gICAgICAgIHNlbGYuX2ZpbGUuY2xvc2UoKQorICAgICAgICBzZWxmLl9maWxlLmNsb3NlKCkgICMgU3luYyBoYXMgYmVlbiBkb25lIGJ5IHNlbGYuZmx1c2goKSBhYm92ZS4KIAogICAgIGRlZiBfbG9va3VwKHNlbGYsIGtleT1Ob25lKToKICAgICAgICAgIiIiUmV0dXJuIChzdGFydCwgc3RvcCkgb3IgcmFpc2UgS2V5RXJyb3IuIiIiCkBAIC03ODQsNyArODEwLDcgQEAKICAgICAgICAgICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CiAgICAgICAgICAgICAgICAgICAgIF91bmxvY2tfZmlsZShmKQogICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBfc3luY19jbG9zZShmKQogICAgICAgICByZXR1cm4gbmV3X2tleQogCiAgICAgZGVmIHJlbW92ZShzZWxmLCBrZXkpOgpAQCAtODMxLDcgKzg1Nyw3IEBACiAgICAgICAgICAgICAgICAgaWYgc2VsZi5fbG9ja2VkOgogICAgICAgICAgICAgICAgICAgICBfdW5sb2NrX2ZpbGUoZikKICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgX3N5bmNfY2xvc2UoZikKIAogICAgIGRlZiBnZXRfbWVzc2FnZShzZWxmLCBrZXkpOgogICAgICAgICAiIiJSZXR1cm4gYSBNZXNzYWdlIHJlcHJlc2VudGF0aW9uIG9yIHJhaXNlIGEgS2V5RXJyb3IuIiIiCkBAIC05MTgsNyArOTQ0LDcgQEAKICAgICAgICAgIiIiVW5sb2NrIHRoZSBtYWlsYm94IGlmIGl0IGlzIGxvY2tlZC4iIiIKICAgICAgICAgaWYgc2VsZi5fbG9ja2VkOgogICAgICAgICAgICAgX3VubG9ja19maWxlKHNlbGYuX2ZpbGUpCi0gICAgICAgICAgICBzZWxmLl9maWxlLmNsb3NlKCkKKyAgICAgICAgICAgIF9zeW5jX2Nsb3NlKHNlbGYuX2ZpbGUpCiAgICAgICAgICAgICBkZWwgc2VsZi5fZmlsZQogICAgICAgICAgICAgc2VsZi5fbG9ja2VkID0gRmFsc2UKIApAQCAtOTQxLDExICs5NjcsMTMgQEAKIAogICAgIGRlZiBnZXRfZm9sZGVyKHNlbGYsIGZvbGRlcik6CiAgICAgICAgICIiIlJldHVybiBhbiBNSCBpbnN0YW5jZSBmb3IgdGhlIG5hbWVkIGZvbGRlci4iIiIKLSAgICAgICAgcmV0dXJuIE1IKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBmb2xkZXIpLCBjcmVhdGU9RmFsc2UpCisgICAgICAgIHJldHVybiBNSChvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgZm9sZGVyKSwKKyAgICAgICAgICAgICAgICAgIGZhY3Rvcnk9c2VsZi5fZmFjdG9yeSwgY3JlYXRlPUZhbHNlKQogCiAgICAgZGVmIGFkZF9mb2xkZXIoc2VsZiwgZm9sZGVyKToKICAgICAgICAgIiIiQ3JlYXRlIGEgZm9sZGVyIGFuZCByZXR1cm4gYW4gTUggaW5zdGFuY2UgcmVwcmVzZW50aW5nIGl0LiIiIgotICAgICAgICByZXR1cm4gTUgob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIGZvbGRlcikpCisgICAgICAgIHJldHVybiBNSChvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgZm9sZGVyKSwKKyAgICAgICAgICAgICAgICAgIGZhY3Rvcnk9c2VsZi5fZmFjdG9yeSkKIAogICAgIGRlZiByZW1vdmVfZm9sZGVyKHNlbGYsIGZvbGRlcik6CiAgICAgICAgICIiIkRlbGV0ZSB0aGUgbmFtZWQgZm9sZGVyLCB3aGljaCBtdXN0IGJlIGVtcHR5LiIiIgpAQCAtMTAxMyw3ICsxMDQxLDcgQEAKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCdcbicpCiAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIF9zeW5jX2Nsb3NlKGYpCiAKICAgICBkZWYgcGFjayhzZWxmKToKICAgICAgICAgIiIiUmUtbmFtZSBtZXNzYWdlcyB0byBlbGltaW5hdGUgbnVtYmVyaW5nIGdhcHMuIEludmFsaWRhdGVzIGtleXMuIiIiCkBAIC0xMDIzLDI3ICsxMDUxLDEzIEBACiAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5pdGVya2V5cygpOgogICAgICAgICAgICAgaWYga2V5IC0gMSAhPSBwcmV2OgogICAgICAgICAgICAgICAgIGNoYW5nZXMuYXBwZW5kKChrZXksIHByZXYgKyAxKSkKLSAgICAgICAgICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3RyKGtleSkpLCAncisnKQotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fbG9ja2VkOgotICAgICAgICAgICAgICAgICAgICAgICAgX2xvY2tfZmlsZShmKQotICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAnbGluaycpOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmxpbmsob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN0cihrZXkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIocHJldiArIDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ29zMmVteCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2Fubm90IHVubGluayBhbiBvcGVuIGZpbGUgb24gT1MvMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN0cihrZXkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucmVuYW1lKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIocHJldiArIDEpKSkKLSAgICAgICAgICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdW5sb2NrX2ZpbGUoZikKLSAgICAgICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAnbGluaycpOgorICAgICAgICAgICAgICAgICAgICBvcy5saW5rKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN0cihwcmV2ICsgMSkpKQorICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN0cihrZXkpKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBvcy5yZW5hbWUob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN0cihrZXkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIocHJldiArIDEpKSkKICAgICAgICAgICAgIHByZXYgKz0gMQogICAgICAgICBzZWxmLl9uZXh0X2tleSA9IHByZXYgKyAxCiAgICAgICAgIGlmIGxlbihjaGFuZ2VzKSA9PSAwOgpAQCAtMTg2Nyw2ICsxODgxLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LmdldGhvc3RuYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuZ2V0cGlkKCkpKQogCitkZWYgX3N5bmNfZmx1c2goZik6CisgICAgIiIiRW5zdXJlIGNoYW5nZXMgdG8gZmlsZSBmIGFyZSBwaHlzaWNhbGx5IG9uIGRpc2suIiIiCisgICAgZi5mbHVzaCgpCisgICAgb3MuZnN5bmMoZi5maWxlbm8oKSkKKworZGVmIF9zeW5jX2Nsb3NlKGYpOgorICAgICIiIkNsb3NlIGZpbGUgZiwgZW5zdXJpbmcgYWxsIGNoYW5nZXMgYXJlIHBoeXNpY2FsbHkgb24gZGlzay4iIiIKKyAgICBfc3luY19mbHVzaChmKQorICAgIGYuY2xvc2UoKQogCiAjIyBTdGFydDogY2xhc3NlcyBmcm9tIHRoZSBvcmlnaW5hbCBtb2R1bGUgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KS4KIApkaWZmIC0tZ2l0IGEvTGliL250cGF0aC5weSBiL0xpYi9udHBhdGgucHkKaW5kZXggN2E3OWI1My4uYjMyZWMxNiAxMDA2NDQKLS0tIGEvTGliL250cGF0aC5weQorKysgYi9MaWIvbnRwYXRoLnB5CkBAIC04LDYgKzgsNyBAQAogaW1wb3J0IG9zCiBpbXBvcnQgc3RhdAogaW1wb3J0IHN5cworZnJvbSBnZW5lcmljcGF0aCBpbXBvcnQgKgogCiBfX2FsbF9fID0gWyJub3JtY2FzZSIsImlzYWJzIiwiam9pbiIsInNwbGl0ZHJpdmUiLCJzcGxpdCIsInNwbGl0ZXh0IiwKICAgICAgICAgICAgImJhc2VuYW1lIiwiZGlybmFtZSIsImNvbW1vbnByZWZpeCIsImdldHNpemUiLCJnZXRtdGltZSIsCkBAIC0yMDYsODYgKzIwNywxOCBAQAogICAgICIiIlJldHVybnMgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgb2YgYSBwYXRobmFtZSIiIgogICAgIHJldHVybiBzcGxpdChwKVswXQogCi0KLSMgUmV0dXJuIHRoZSBsb25nZXN0IHByZWZpeCBvZiBhbGwgbGlzdCBlbGVtZW50cy4KLQotZGVmIGNvbW1vbnByZWZpeChtKToKLSAgICAiR2l2ZW4gYSBsaXN0IG9mIHBhdGhuYW1lcywgcmV0dXJucyB0aGUgbG9uZ2VzdCBjb21tb24gbGVhZGluZyBjb21wb25lbnQiCi0gICAgaWYgbm90IG06IHJldHVybiAnJwotICAgIHMxID0gbWluKG0pCi0gICAgczIgPSBtYXgobSkKLSAgICBuID0gbWluKGxlbihzMSksIGxlbihzMikpCi0gICAgZm9yIGkgaW4geHJhbmdlKG4pOgotICAgICAgICBpZiBzMVtpXSAhPSBzMltpXToKLSAgICAgICAgICAgIHJldHVybiBzMVs6aV0KLSAgICByZXR1cm4gczFbOm5dCi0KLQotIyBHZXQgc2l6ZSwgbXRpbWUsIGF0aW1lIG9mIGZpbGVzLgotCi1kZWYgZ2V0c2l6ZShmaWxlbmFtZSk6Ci0gICAgIiIiUmV0dXJuIHRoZSBzaXplIG9mIGEgZmlsZSwgcmVwb3J0ZWQgYnkgb3Muc3RhdCgpIiIiCi0gICAgcmV0dXJuIG9zLnN0YXQoZmlsZW5hbWUpLnN0X3NpemUKLQotZGVmIGdldG10aW1lKGZpbGVuYW1lKToKLSAgICAiIiJSZXR1cm4gdGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgb2YgYSBmaWxlLCByZXBvcnRlZCBieSBvcy5zdGF0KCkiIiIKLSAgICByZXR1cm4gb3Muc3RhdChmaWxlbmFtZSkuc3RfbXRpbWUKLQotZGVmIGdldGF0aW1lKGZpbGVuYW1lKToKLSAgICAiIiJSZXR1cm4gdGhlIGxhc3QgYWNjZXNzIHRpbWUgb2YgYSBmaWxlLCByZXBvcnRlZCBieSBvcy5zdGF0KCkiIiIKLSAgICByZXR1cm4gb3Muc3RhdChmaWxlbmFtZSkuc3RfYXRpbWUKLQotZGVmIGdldGN0aW1lKGZpbGVuYW1lKToKLSAgICAiIiJSZXR1cm4gdGhlIGNyZWF0aW9uIHRpbWUgb2YgYSBmaWxlLCByZXBvcnRlZCBieSBvcy5zdGF0KCkuIiIiCi0gICAgcmV0dXJuIG9zLnN0YXQoZmlsZW5hbWUpLnN0X2N0aW1lCi0KICMgSXMgYSBwYXRoIGEgc3ltYm9saWMgbGluaz8KICMgVGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2Ugb24gc3lzdGVtcyB3aGVyZSBwb3NpeC5sc3RhdCBkb2Vzbid0IGV4aXN0LgogCiBkZWYgaXNsaW5rKHBhdGgpOgotICAgICIiIlRlc3QgZm9yIHN5bWJvbGljIGxpbmsuICBPbiBXaW5kb3dzTlQvOTUgYWx3YXlzIHJldHVybnMgZmFsc2UiIiIKKyAgICAiIiJUZXN0IGZvciBzeW1ib2xpYyBsaW5rLgorICAgIE9uIFdpbmRvd3NOVC85NSBhbmQgT1MvMiBhbHdheXMgcmV0dXJucyBmYWxzZQorICAgICIiIgogICAgIHJldHVybiBGYWxzZQogCi0KLSMgRG9lcyBhIHBhdGggZXhpc3Q/Ci0KLWRlZiBleGlzdHMocGF0aCk6Ci0gICAgIiIiVGVzdCB3aGV0aGVyIGEgcGF0aCBleGlzdHMiIiIKLSAgICB0cnk6Ci0gICAgICAgIHN0ID0gb3Muc3RhdChwYXRoKQotICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgcmV0dXJuIFRydWUKLQorIyBhbGlhcyBleGlzdHMgdG8gbGV4aXN0cwogbGV4aXN0cyA9IGV4aXN0cwogCi0KLSMgSXMgYSBwYXRoIGEgZG9zIGRpcmVjdG9yeT8KLSMgVGhpcyBmb2xsb3dzIHN5bWJvbGljIGxpbmtzLCBzbyBib3RoIGlzbGluaygpIGFuZCBpc2RpcigpIGNhbiBiZSB0cnVlCi0jIGZvciB0aGUgc2FtZSBwYXRoLgotCi1kZWYgaXNkaXIocGF0aCk6Ci0gICAgIiIiVGVzdCB3aGV0aGVyIGEgcGF0aCBpcyBhIGRpcmVjdG9yeSIiIgotICAgIHRyeToKLSAgICAgICAgc3QgPSBvcy5zdGF0KHBhdGgpCi0gICAgZXhjZXB0IG9zLmVycm9yOgotICAgICAgICByZXR1cm4gRmFsc2UKLSAgICByZXR1cm4gc3RhdC5TX0lTRElSKHN0LnN0X21vZGUpCi0KLQotIyBJcyBhIHBhdGggYSByZWd1bGFyIGZpbGU/Ci0jIFRoaXMgZm9sbG93cyBzeW1ib2xpYyBsaW5rcywgc28gYm90aCBpc2xpbmsoKSBhbmQgaXNkaXIoKSBjYW4gYmUgdHJ1ZQotIyBmb3IgdGhlIHNhbWUgcGF0aC4KLQotZGVmIGlzZmlsZShwYXRoKToKLSAgICAiIiJUZXN0IHdoZXRoZXIgYSBwYXRoIGlzIGEgcmVndWxhciBmaWxlIiIiCi0gICAgdHJ5OgotICAgICAgICBzdCA9IG9zLnN0YXQocGF0aCkKLSAgICBleGNlcHQgb3MuZXJyb3I6Ci0gICAgICAgIHJldHVybiBGYWxzZQotICAgIHJldHVybiBzdGF0LlNfSVNSRUcoc3Quc3RfbW9kZSkKLQotCiAjIElzIGEgcGF0aCBhIG1vdW50IHBvaW50PyAgRWl0aGVyIGEgcm9vdCAod2l0aCBvciB3aXRob3V0IGRyaXZlIGxldHRlcikKICMgb3IgYW4gVU5DIHBhdGggd2l0aCBhdCBtb3N0IGEgLyBvciBcIGFmdGVyIHRoZSBtb3VudCBwb2ludC4KIApkaWZmIC0tZ2l0IGEvTGliL29zLnB5IGIvTGliL29zLnB5CmluZGV4IDVlZTNkNGIuLjM1Zjk3ZmIgMTAwNjQ0Ci0tLSBhL0xpYi9vcy5weQorKysgYi9MaWIvb3MucHkKQEAgLTE1NiwxMSArMTU2LDE3IEBACiAgICAgcmVjdXJzaXZlLgogCiAgICAgIiIiCisgICAgZnJvbSBlcnJubyBpbXBvcnQgRUVYSVNUCiAgICAgaGVhZCwgdGFpbCA9IHBhdGguc3BsaXQobmFtZSkKICAgICBpZiBub3QgdGFpbDoKICAgICAgICAgaGVhZCwgdGFpbCA9IHBhdGguc3BsaXQoaGVhZCkKICAgICBpZiBoZWFkIGFuZCB0YWlsIGFuZCBub3QgcGF0aC5leGlzdHMoaGVhZCk6Ci0gICAgICAgIG1ha2VkaXJzKGhlYWQsIG1vZGUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1ha2VkaXJzKGhlYWQsIG1vZGUpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgICAgICAgIyBiZSBoYXBweSBpZiBzb21lb25lIGFscmVhZHkgY3JlYXRlZCB0aGUgcGF0aAorICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBFRVhJU1Q6CisgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgaWYgdGFpbCA9PSBjdXJkaXI6ICAgICAgICAgICAjIHh4eC9uZXdkaXIvLiBleGlzdHMgaWYgeHh4L25ld2RpciBleGlzdHMKICAgICAgICAgICAgIHJldHVybgogICAgIG1rZGlyKG5hbWUsIG1vZGUpCmRpZmYgLS1naXQgYS9MaWIvb3MyZW14cGF0aC5weSBiL0xpYi9vczJlbXhwYXRoLnB5CmluZGV4IGE4NDE0MjIuLjRlODVjNGQgMTAwNjQ0Ci0tLSBhL0xpYi9vczJlbXhwYXRoLnB5CisrKyBiL0xpYi9vczJlbXhwYXRoLnB5CkBAIC03LDYgKzcsOSBAQAogCiBpbXBvcnQgb3MKIGltcG9ydCBzdGF0Citmcm9tIGdlbmVyaWNwYXRoIGltcG9ydCAqCitmcm9tIG50cGF0aCBpbXBvcnQgKGV4cGFuZHVzZXIsIGV4cGFuZHZhcnMsIGlzYWJzLCBpc2xpbmssIHNwbGl0ZHJpdmUsCisgICAgICAgICAgICAgICAgICAgIHNwbGl0ZXh0LCBzcGxpdCwgd2FsaykKIAogX19hbGxfXyA9IFsibm9ybWNhc2UiLCJpc2FicyIsImpvaW4iLCJzcGxpdGRyaXZlIiwic3BsaXQiLCJzcGxpdGV4dCIsCiAgICAgICAgICAgICJiYXNlbmFtZSIsImRpcm5hbWUiLCJjb21tb25wcmVmaXgiLCJnZXRzaXplIiwiZ2V0bXRpbWUiLApAQCAtMzYsMTggKzM5LDYgQEAKICAgICByZXR1cm4gcy5yZXBsYWNlKCdcXCcsICcvJykubG93ZXIoKQogCiAKLSMgUmV0dXJuIHdoZXRoZXIgYSBwYXRoIGlzIGFic29sdXRlLgotIyBUcml2aWFsIGluIFBvc2l4LCBoYXJkZXIgb24gdGhlIE1hYyBvciBNUy1ET1MuCi0jIEZvciBET1MgaXQgaXMgYWJzb2x1dGUgaWYgaXQgc3RhcnRzIHdpdGggYSBzbGFzaCBvciBiYWNrc2xhc2ggKGN1cnJlbnQKLSMgdm9sdW1lKSwgb3IgaWYgYSBwYXRobmFtZSBhZnRlciB0aGUgdm9sdW1lIGxldHRlciBhbmQgY29sb24gLyBVTkMgcmVzb3VyY2UKLSMgc3RhcnRzIHdpdGggYSBzbGFzaCBvciBiYWNrc2xhc2guCi0KLWRlZiBpc2FicyhzKToKLSAgICAiIiJUZXN0IHdoZXRoZXIgYSBwYXRoIGlzIGFic29sdXRlIiIiCi0gICAgcyA9IHNwbGl0ZHJpdmUocylbMV0KLSAgICByZXR1cm4gcyAhPSAnJyBhbmQgc1s6MV0gaW4gJy9cXCcKLQotCiAjIEpvaW4gdHdvIChvciBtb3JlKSBwYXRocy4KIAogZGVmIGpvaW4oYSwgKnApOgpAQCAtNjMsMTcgKzU0LDYgQEAKICAgICByZXR1cm4gcGF0aAogCiAKLSMgU3BsaXQgYSBwYXRoIGluIGEgZHJpdmUgc3BlY2lmaWNhdGlvbiAoYSBkcml2ZSBsZXR0ZXIgZm9sbG93ZWQgYnkgYQotIyBjb2xvbikgYW5kIHRoZSBwYXRoIHNwZWNpZmljYXRpb24uCi0jIEl0IGlzIGFsd2F5cyB0cnVlIHRoYXQgZHJpdmVzcGVjICsgcGF0aHNwZWMgPT0gcAotZGVmIHNwbGl0ZHJpdmUocCk6Ci0gICAgIiIiU3BsaXQgYSBwYXRobmFtZSBpbnRvIGRyaXZlIGFuZCBwYXRoIHNwZWNpZmllcnMuIFJldHVybnMgYSAyLXR1cGxlCi0iKGRyaXZlLHBhdGgpIjsgIGVpdGhlciBwYXJ0IG1heSBiZSBlbXB0eSIiIgotICAgIGlmIHBbMToyXSA9PSAnOic6Ci0gICAgICAgIHJldHVybiBwWzA6Ml0sIHBbMjpdCi0gICAgcmV0dXJuICcnLCBwCi0KLQogIyBQYXJzZSBVTkMgcGF0aHMKIGRlZiBzcGxpdHVuYyhwKToKICAgICAiIiJTcGxpdCBhIHBhdGhuYW1lIGludG8gVU5DIG1vdW50IHBvaW50IGFuZCByZWxhdGl2ZSBwYXRoIHNwZWNpZmllcnMuCkBAIC0xMDMsNTcgKzgzLDYgQEAKICAgICByZXR1cm4gJycsIHAKIAogCi0jIFNwbGl0IGEgcGF0aCBpbiBoZWFkIChldmVyeXRoaW5nIHVwIHRvIHRoZSBsYXN0ICcvJykgYW5kIHRhaWwgKHRoZQotIyByZXN0KS4gIEFmdGVyIHRoZSB0cmFpbGluZyAnLycgaXMgc3RyaXBwZWQsIHRoZSBpbnZhcmlhbnQKLSMgam9pbihoZWFkLCB0YWlsKSA9PSBwIGhvbGRzLgotIyBUaGUgcmVzdWx0aW5nIGhlYWQgd29uJ3QgZW5kIGluICcvJyB1bmxlc3MgaXQgaXMgdGhlIHJvb3QuCi0KLWRlZiBzcGxpdChwKToKLSAgICAiIiJTcGxpdCBhIHBhdGhuYW1lLgotCi0gICAgUmV0dXJuIHR1cGxlIChoZWFkLCB0YWlsKSB3aGVyZSB0YWlsIGlzIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpbmFsIHNsYXNoLgotICAgIEVpdGhlciBwYXJ0IG1heSBiZSBlbXB0eS4iIiIKLQotICAgIGQsIHAgPSBzcGxpdGRyaXZlKHApCi0gICAgIyBzZXQgaSB0byBpbmRleCBiZXlvbmQgcCdzIGxhc3Qgc2xhc2gKLSAgICBpID0gbGVuKHApCi0gICAgd2hpbGUgaSBhbmQgcFtpLTFdIG5vdCBpbiAnL1xcJzoKLSAgICAgICAgaSA9IGkgLSAxCi0gICAgaGVhZCwgdGFpbCA9IHBbOmldLCBwW2k6XSAgIyBub3cgdGFpbCBoYXMgbm8gc2xhc2hlcwotICAgICMgcmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBoZWFkLCB1bmxlc3MgaXQncyBhbGwgc2xhc2hlcwotICAgIGhlYWQyID0gaGVhZAotICAgIHdoaWxlIGhlYWQyIGFuZCBoZWFkMlstMV0gaW4gJy9cXCc6Ci0gICAgICAgIGhlYWQyID0gaGVhZDJbOi0xXQotICAgIGhlYWQgPSBoZWFkMiBvciBoZWFkCi0gICAgcmV0dXJuIGQgKyBoZWFkLCB0YWlsCi0KLQotIyBTcGxpdCBhIHBhdGggaW4gcm9vdCBhbmQgZXh0ZW5zaW9uLgotIyBUaGUgZXh0ZW5zaW9uIGlzIGV2ZXJ5dGhpbmcgc3RhcnRpbmcgYXQgdGhlIGxhc3QgZG90IGluIHRoZSBsYXN0Ci0jIHBhdGhuYW1lIGNvbXBvbmVudDsgdGhlIHJvb3QgaXMgZXZlcnl0aGluZyBiZWZvcmUgdGhhdC4KLSMgSXQgaXMgYWx3YXlzIHRydWUgdGhhdCByb290ICsgZXh0ID09IHAuCi0KLWRlZiBzcGxpdGV4dChwKToKLSAgICAiIiJTcGxpdCB0aGUgZXh0ZW5zaW9uIGZyb20gYSBwYXRobmFtZS4KLQotICAgIEV4dGVuc2lvbiBpcyBldmVyeXRoaW5nIGZyb20gdGhlIGxhc3QgZG90IHRvIHRoZSBlbmQuCi0gICAgUmV0dXJuIChyb290LCBleHQpLCBlaXRoZXIgcGFydCBtYXkgYmUgZW1wdHkuIiIiCi0gICAgcm9vdCwgZXh0ID0gJycsICcnCi0gICAgZm9yIGMgaW4gcDoKLSAgICAgICAgaWYgYyBpbiBbJy8nLCdcXCddOgotICAgICAgICAgICAgcm9vdCwgZXh0ID0gcm9vdCArIGV4dCArIGMsICcnCi0gICAgICAgIGVsaWYgYyA9PSAnLic6Ci0gICAgICAgICAgICBpZiBleHQ6Ci0gICAgICAgICAgICAgICAgcm9vdCwgZXh0ID0gcm9vdCArIGV4dCwgYwotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBleHQgPSBjCi0gICAgICAgIGVsaWYgZXh0OgotICAgICAgICAgICAgZXh0ID0gZXh0ICsgYwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcm9vdCA9IHJvb3QgKyBjCi0gICAgcmV0dXJuIHJvb3QsIGV4dAotCi0KICMgUmV0dXJuIHRoZSB0YWlsIChiYXNlbmFtZSkgcGFydCBvZiBhIHBhdGguCiAKIGRlZiBiYXNlbmFtZShwKToKQEAgLTE2OCw4NCArOTcsMTIgQEAKICAgICByZXR1cm4gc3BsaXQocClbMF0KIAogCi0jIFJldHVybiB0aGUgbG9uZ2VzdCBwcmVmaXggb2YgYWxsIGxpc3QgZWxlbWVudHMuCi0KLWRlZiBjb21tb25wcmVmaXgobSk6Ci0gICAgIkdpdmVuIGEgbGlzdCBvZiBwYXRobmFtZXMsIHJldHVybnMgdGhlIGxvbmdlc3QgY29tbW9uIGxlYWRpbmcgY29tcG9uZW50IgotICAgIGlmIG5vdCBtOiByZXR1cm4gJycKLSAgICBzMSA9IG1pbihtKQotICAgIHMyID0gbWF4KG0pCi0gICAgbiA9IG1pbihsZW4oczEpLCBsZW4oczIpKQotICAgIGZvciBpIGluIHhyYW5nZShuKToKLSAgICAgICAgaWYgczFbaV0gIT0gczJbaV06Ci0gICAgICAgICAgICByZXR1cm4gczFbOmldCi0gICAgcmV0dXJuIHMxWzpuXQotCi0KLSMgR2V0IHNpemUsIG10aW1lLCBhdGltZSBvZiBmaWxlcy4KLQotZGVmIGdldHNpemUoZmlsZW5hbWUpOgotICAgICIiIlJldHVybiB0aGUgc2l6ZSBvZiBhIGZpbGUsIHJlcG9ydGVkIGJ5IG9zLnN0YXQoKSIiIgotICAgIHJldHVybiBvcy5zdGF0KGZpbGVuYW1lKS5zdF9zaXplCi0KLWRlZiBnZXRtdGltZShmaWxlbmFtZSk6Ci0gICAgIiIiUmV0dXJuIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lIG9mIGEgZmlsZSwgcmVwb3J0ZWQgYnkgb3Muc3RhdCgpIiIiCi0gICAgcmV0dXJuIG9zLnN0YXQoZmlsZW5hbWUpLnN0X210aW1lCi0KLWRlZiBnZXRhdGltZShmaWxlbmFtZSk6Ci0gICAgIiIiUmV0dXJuIHRoZSBsYXN0IGFjY2VzcyB0aW1lIG9mIGEgZmlsZSwgcmVwb3J0ZWQgYnkgb3Muc3RhdCgpIiIiCi0gICAgcmV0dXJuIG9zLnN0YXQoZmlsZW5hbWUpLnN0X2F0aW1lCi0KLWRlZiBnZXRjdGltZShmaWxlbmFtZSk6Ci0gICAgIiIiUmV0dXJuIHRoZSBjcmVhdGlvbiB0aW1lIG9mIGEgZmlsZSwgcmVwb3J0ZWQgYnkgb3Muc3RhdCgpLiIiIgotICAgIHJldHVybiBvcy5zdGF0KGZpbGVuYW1lKS5zdF9jdGltZQotCi0jIElzIGEgcGF0aCBhIHN5bWJvbGljIGxpbms/Ci0jIFRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlIG9uIHN5c3RlbXMgd2hlcmUgcG9zaXgubHN0YXQgZG9lc24ndCBleGlzdC4KLQotZGVmIGlzbGluayhwYXRoKToKLSAgICAiIiJUZXN0IGZvciBzeW1ib2xpYyBsaW5rLiAgT24gT1MvMiBhbHdheXMgcmV0dXJucyBmYWxzZSIiIgotICAgIHJldHVybiBGYWxzZQotCi0KLSMgRG9lcyBhIHBhdGggZXhpc3Q/Ci0jIFRoaXMgaXMgZmFsc2UgZm9yIGRhbmdsaW5nIHN5bWJvbGljIGxpbmtzLgotCi1kZWYgZXhpc3RzKHBhdGgpOgotICAgICIiIlRlc3Qgd2hldGhlciBhIHBhdGggZXhpc3RzIiIiCi0gICAgdHJ5OgotICAgICAgICBzdCA9IG9zLnN0YXQocGF0aCkKLSAgICBleGNlcHQgb3MuZXJyb3I6Ci0gICAgICAgIHJldHVybiBGYWxzZQotICAgIHJldHVybiBUcnVlCi0KKyMgYWxpYXMgZXhpc3RzIHRvIGxleGlzdHMKIGxleGlzdHMgPSBleGlzdHMKIAogCiAjIElzIGEgcGF0aCBhIGRpcmVjdG9yeT8KIAotZGVmIGlzZGlyKHBhdGgpOgotICAgICIiIlRlc3Qgd2hldGhlciBhIHBhdGggaXMgYSBkaXJlY3RvcnkiIiIKLSAgICB0cnk6Ci0gICAgICAgIHN0ID0gb3Muc3RhdChwYXRoKQotICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgcmV0dXJuIHN0YXQuU19JU0RJUihzdC5zdF9tb2RlKQotCi0KLSMgSXMgYSBwYXRoIGEgcmVndWxhciBmaWxlPwotIyBUaGlzIGZvbGxvd3Mgc3ltYm9saWMgbGlua3MsIHNvIGJvdGggaXNsaW5rKCkgYW5kIGlzZGlyKCkgY2FuIGJlIHRydWUKLSMgZm9yIHRoZSBzYW1lIHBhdGguCi0KLWRlZiBpc2ZpbGUocGF0aCk6Ci0gICAgIiIiVGVzdCB3aGV0aGVyIGEgcGF0aCBpcyBhIHJlZ3VsYXIgZmlsZSIiIgotICAgIHRyeToKLSAgICAgICAgc3QgPSBvcy5zdGF0KHBhdGgpCi0gICAgZXhjZXB0IG9zLmVycm9yOgotICAgICAgICByZXR1cm4gRmFsc2UKLSAgICByZXR1cm4gc3RhdC5TX0lTUkVHKHN0LnN0X21vZGUpCi0KLQogIyBJcyBhIHBhdGggYSBtb3VudCBwb2ludD8gIEVpdGhlciBhIHJvb3QgKHdpdGggb3Igd2l0aG91dCBkcml2ZSBsZXR0ZXIpCiAjIG9yIGFuIFVOQyBwYXRoIHdpdGggYXQgbW9zdCBhIC8gb3IgXCBhZnRlciB0aGUgbW91bnQgcG9pbnQuCiAKQEAgLTI1OCwxMzEgKzExNSw2IEBACiAgICAgcmV0dXJuIGxlbihwKSA9PSAxIGFuZCBwWzBdIGluICcvXFwnCiAKIAotIyBEaXJlY3RvcnkgdHJlZSB3YWxrLgotIyBGb3IgZWFjaCBkaXJlY3RvcnkgdW5kZXIgdG9wIChpbmNsdWRpbmcgdG9wIGl0c2VsZiwgYnV0IGV4Y2x1ZGluZwotIyAnLicgYW5kICcuLicpLCBmdW5jKGFyZywgZGlybmFtZSwgZmlsZW5hbWVzKSBpcyBjYWxsZWQsIHdoZXJlCi0jIGRpcm5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBhbmQgZmlsZW5hbWVzIGlzIHRoZSBsaXN0Ci0jIG9mIGZpbGVzIChhbmQgc3ViZGlyZWN0b3JpZXMgZXRjLikgaW4gdGhlIGRpcmVjdG9yeS4KLSMgVGhlIGZ1bmMgbWF5IG1vZGlmeSB0aGUgZmlsZW5hbWVzIGxpc3QsIHRvIGltcGxlbWVudCBhIGZpbHRlciwKLSMgb3IgdG8gaW1wb3NlIGEgZGlmZmVyZW50IG9yZGVyIG9mIHZpc2l0aW5nLgotCi1kZWYgd2Fsayh0b3AsIGZ1bmMsIGFyZyk6Ci0gICAgIiIiRGlyZWN0b3J5IHRyZWUgd2FsayB3aHRoIGNhbGxiYWNrIGZ1bmN0aW9uLgotCi0gICAgd2Fsayh0b3AsIGZ1bmMsIGFyZykgY2FsbHMgZnVuYyhhcmcsIGQsIGZpbGVzKSBmb3IgZWFjaCBkaXJlY3RvcnkgZAotICAgIGluIHRoZSB0cmVlIHJvb3RlZCBhdCB0b3AgKGluY2x1ZGluZyB0b3AgaXRzZWxmKTsgZmlsZXMgaXMgYSBsaXN0Ci0gICAgb2YgYWxsIHRoZSBmaWxlcyBhbmQgc3ViZGlycyBpbiBkaXJlY3RvcnkgZC4iIiIKLSAgICB0cnk6Ci0gICAgICAgIG5hbWVzID0gb3MubGlzdGRpcih0b3ApCi0gICAgZXhjZXB0IG9zLmVycm9yOgotICAgICAgICByZXR1cm4KLSAgICBmdW5jKGFyZywgdG9wLCBuYW1lcykKLSAgICBleGNlcHRpb25zID0gKCcuJywgJy4uJykKLSAgICBmb3IgbmFtZSBpbiBuYW1lczoKLSAgICAgICAgaWYgbmFtZSBub3QgaW4gZXhjZXB0aW9uczoKLSAgICAgICAgICAgIG5hbWUgPSBqb2luKHRvcCwgbmFtZSkKLSAgICAgICAgICAgIGlmIGlzZGlyKG5hbWUpOgotICAgICAgICAgICAgICAgIHdhbGsobmFtZSwgZnVuYywgYXJnKQotCi0KLSMgRXhwYW5kIHBhdGhzIGJlZ2lubmluZyB3aXRoICd+JyBvciAnfnVzZXInLgotIyAnficgbWVhbnMgJEhPTUU7ICd+dXNlcicgbWVhbnMgdGhhdCB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCi0jIElmIHRoZSBwYXRoIGRvZXNuJ3QgYmVnaW4gd2l0aCAnficsIG9yIGlmIHRoZSB1c2VyIG9yICRIT01FIGlzIHVua25vd24sCi0jIHRoZSBwYXRoIGlzIHJldHVybmVkIHVuY2hhbmdlZCAobGVhdmluZyBlcnJvciByZXBvcnRpbmcgdG8gd2hhdGV2ZXIKLSMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIGV4cGFuZGVkIHBhdGggYXMgYXJndW1lbnQpLgotIyBTZWUgYWxzbyBtb2R1bGUgJ2dsb2InIGZvciBleHBhbnNpb24gb2YgKiwgPyBhbmQgWy4uLl0gaW4gcGF0aG5hbWVzLgotIyAoQSBmdW5jdGlvbiBzaG91bGQgYWxzbyBiZSBkZWZpbmVkIHRvIGRvIGZ1bGwgKnNoLXN0eWxlIGVudmlyb25tZW50Ci0jIHZhcmlhYmxlIGV4cGFuc2lvbi4pCi0KLWRlZiBleHBhbmR1c2VyKHBhdGgpOgotICAgICIiIkV4cGFuZCB+IGFuZCB+dXNlciBjb25zdHJ1Y3RzLgotCi0gICAgSWYgdXNlciBvciAkSE9NRSBpcyB1bmtub3duLCBkbyBub3RoaW5nLiIiIgotICAgIGlmIHBhdGhbOjFdICE9ICd+JzoKLSAgICAgICAgcmV0dXJuIHBhdGgKLSAgICBpLCBuID0gMSwgbGVuKHBhdGgpCi0gICAgd2hpbGUgaSA8IG4gYW5kIHBhdGhbaV0gbm90IGluICcvXFwnOgotICAgICAgICBpID0gaSArIDEKLSAgICBpZiBpID09IDE6Ci0gICAgICAgIGlmICdIT01FJyBpbiBvcy5lbnZpcm9uOgotICAgICAgICAgICAgdXNlcmhvbWUgPSBvcy5lbnZpcm9uWydIT01FJ10KLSAgICAgICAgZWxpZiBub3QgJ0hPTUVQQVRIJyBpbiBvcy5lbnZpcm9uOgotICAgICAgICAgICAgcmV0dXJuIHBhdGgKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBkcml2ZSA9IG9zLmVudmlyb25bJ0hPTUVEUklWRSddCi0gICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICAgICAgZHJpdmUgPSAnJwotICAgICAgICAgICAgdXNlcmhvbWUgPSBqb2luKGRyaXZlLCBvcy5lbnZpcm9uWydIT01FUEFUSCddKQotICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiBwYXRoCi0gICAgcmV0dXJuIHVzZXJob21lICsgcGF0aFtpOl0KLQotCi0jIEV4cGFuZCBwYXRocyBjb250YWluaW5nIHNoZWxsIHZhcmlhYmxlIHN1YnN0aXR1dGlvbnMuCi0jIFRoZSBmb2xsb3dpbmcgcnVsZXMgYXBwbHk6Ci0jICAgICAgIC0gbm8gZXhwYW5zaW9uIHdpdGhpbiBzaW5nbGUgcXVvdGVzCi0jICAgICAgIC0gbm8gZXNjYXBlIGNoYXJhY3RlciwgZXhjZXB0IGZvciAnJCQnIHdoaWNoIGlzIHRyYW5zbGF0ZWQgaW50byAnJCcKLSMgICAgICAgLSAke3Zhcm5hbWV9IGlzIGFjY2VwdGVkLgotIyAgICAgICAtIHZhcm5hbWVzIGNhbiBiZSBtYWRlIG91dCBvZiBsZXR0ZXJzLCBkaWdpdHMgYW5kIHRoZSBjaGFyYWN0ZXIgJ18nCi0jIFhYWCBXaXRoIENPTU1BTkQuQ09NIHlvdSBjYW4gdXNlIGFueSBjaGFyYWN0ZXJzIGluIGEgdmFyaWFibGUgbmFtZSwKLSMgWFhYIGV4Y2VwdCAnXnw8Pj0nLgotCi1kZWYgZXhwYW5kdmFycyhwYXRoKToKLSAgICAiIiJFeHBhbmQgc2hlbGwgdmFyaWFibGVzIG9mIGZvcm0gJHZhciBhbmQgJHt2YXJ9LgotCi0gICAgVW5rbm93biB2YXJpYWJsZXMgYXJlIGxlZnQgdW5jaGFuZ2VkLiIiIgotICAgIGlmICckJyBub3QgaW4gcGF0aDoKLSAgICAgICAgcmV0dXJuIHBhdGgKLSAgICBpbXBvcnQgc3RyaW5nCi0gICAgdmFyY2hhcnMgPSBzdHJpbmcubGV0dGVycyArIHN0cmluZy5kaWdpdHMgKyAnXy0nCi0gICAgcmVzID0gJycKLSAgICBpbmRleCA9IDAKLSAgICBwYXRobGVuID0gbGVuKHBhdGgpCi0gICAgd2hpbGUgaW5kZXggPCBwYXRobGVuOgotICAgICAgICBjID0gcGF0aFtpbmRleF0KLSAgICAgICAgaWYgYyA9PSAnXCcnOiAgICMgbm8gZXhwYW5zaW9uIHdpdGhpbiBzaW5nbGUgcXVvdGVzCi0gICAgICAgICAgICBwYXRoID0gcGF0aFtpbmRleCArIDE6XQotICAgICAgICAgICAgcGF0aGxlbiA9IGxlbihwYXRoKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGluZGV4ID0gcGF0aC5pbmRleCgnXCcnKQotICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArICdcJycgKyBwYXRoWzppbmRleCArIDFdCi0gICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgICAgICByZXMgPSByZXMgKyBwYXRoCi0gICAgICAgICAgICAgICAgaW5kZXggPSBwYXRobGVuIC0gMQotICAgICAgICBlbGlmIGMgPT0gJyQnOiAgIyB2YXJpYWJsZSBvciAnJCQnCi0gICAgICAgICAgICBpZiBwYXRoW2luZGV4ICsgMTppbmRleCArIDJdID09ICckJzoKLSAgICAgICAgICAgICAgICByZXMgPSByZXMgKyBjCi0gICAgICAgICAgICAgICAgaW5kZXggPSBpbmRleCArIDEKLSAgICAgICAgICAgIGVsaWYgcGF0aFtpbmRleCArIDE6aW5kZXggKyAyXSA9PSAneyc6Ci0gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGhbaW5kZXgrMjpdCi0gICAgICAgICAgICAgICAgcGF0aGxlbiA9IGxlbihwYXRoKQotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBwYXRoLmluZGV4KCd9JykKLSAgICAgICAgICAgICAgICAgICAgdmFyID0gcGF0aFs6aW5kZXhdCi0gICAgICAgICAgICAgICAgICAgIGlmIHZhciBpbiBvcy5lbnZpcm9uOgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVzICsgb3MuZW52aXJvblt2YXJdCi0gICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArIHBhdGgKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBwYXRobGVuIC0gMQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICB2YXIgPSAnJwotICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxCi0gICAgICAgICAgICAgICAgYyA9IHBhdGhbaW5kZXg6aW5kZXggKyAxXQotICAgICAgICAgICAgICAgIHdoaWxlIGMgIT0gJycgYW5kIGMgaW4gdmFyY2hhcnM6Ci0gICAgICAgICAgICAgICAgICAgIHZhciA9IHZhciArIGMKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpbmRleCArIDEKLSAgICAgICAgICAgICAgICAgICAgYyA9IHBhdGhbaW5kZXg6aW5kZXggKyAxXQotICAgICAgICAgICAgICAgIGlmIHZhciBpbiBvcy5lbnZpcm9uOgotICAgICAgICAgICAgICAgICAgICByZXMgPSByZXMgKyBvcy5lbnZpcm9uW3Zhcl0KLSAgICAgICAgICAgICAgICBpZiBjICE9ICcnOgotICAgICAgICAgICAgICAgICAgICByZXMgPSByZXMgKyBjCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXMgPSByZXMgKyBjCi0gICAgICAgIGluZGV4ID0gaW5kZXggKyAxCi0gICAgcmV0dXJuIHJlcwotCi0KICMgTm9ybWFsaXplIGEgcGF0aCwgZS5nLiBBLy9CLCBBLy4vQiBhbmQgQS9mb28vLi4vQiBhbGwgYmVjb21lIEEvQi4KIAogZGVmIG5vcm1wYXRoKHBhdGgpOgpkaWZmIC0tZ2l0IGEvTGliL3BkYi5weSBiL0xpYi9wZGIucHkKaW5kZXggMmJjODM2Zi4uODgzMDNkMCAxMDA3NTUKLS0tIGEvTGliL3BkYi5weQorKysgYi9MaWIvcGRiLnB5CkBAIC0yOCw3ICsyOCw3IEBACiAgICAgcmV0dXJuIHN5cy5zdGRpbi5yZWFkbGluZSgpCiAKIGRlZiBmaW5kX2Z1bmN0aW9uKGZ1bmNuYW1lLCBmaWxlbmFtZSk6Ci0gICAgY3JlID0gcmUuY29tcGlsZShyJ2RlZlxzKyVzXHMqWyhdJyAlIGZ1bmNuYW1lKQorICAgIGNyZSA9IHJlLmNvbXBpbGUocidkZWZccyslc1xzKlsoXScgJSByZS5lc2NhcGUoZnVuY25hbWUpKQogICAgIHRyeToKICAgICAgICAgZnAgPSBvcGVuKGZpbGVuYW1lKQogICAgIGV4Y2VwdCBJT0Vycm9yOgpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvQXBwbGVTY3JpcHRfU3VpdGUucHkgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9BcHBsZVNjcmlwdF9TdWl0ZS5weQppbmRleCA1ZDAyZWEzLi43NzNkMWQ3IDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9BcHBsZVNjcmlwdF9TdWl0ZS5weQorKysgYi9MaWIvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9BcHBsZVNjcmlwdF9TdWl0ZS5weQpAQCAtMzAxLDcgKzMwMSw3IEBACiAgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCiAKICAgICBkZWYgYXNfKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgotICAgICAgICAiIiJhc186IENvZXJjaW9uCisgICAgICAgICIiImFzOiBDb2VyY2lvbgogICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogYW4gQUUgb2JqZWN0IHJlZmVyZW5jZQogICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CiAgICAgICAgIFJldHVybnM6IGFueXRoaW5nCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1zdW5vczUvU1RST1BUUy5weSBiL0xpYi9wbGF0LXN1bm9zNS9TVFJPUFRTLnB5CmluZGV4IGU5NWRiOTMuLjQ5NzBiZDcgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LXN1bm9zNS9TVFJPUFRTLnB5CisrKyBiL0xpYi9wbGF0LXN1bm9zNS9TVFJPUFRTLnB5CkBAIC0xNTUwLDcgKzE1NTAsNyBAQAogQVNfUEFHTENLID0gMHg4MAogQVNfQ0xBSU1HQVAgPSAweDQwCiBBU19VTk1BUFdBSVQgPSAweDIwCi1kZWYgQVNfVFlQRV82NEJJVChhcyk6IHJldHVybiBcCitkZWYgQVNfVFlQRV82NEJJVChhc18pOiByZXR1cm4gXAogCiBBU19MUkVQX0xJTktFRExJU1QgPSAwCiBBU19MUkVQX1NLSVBMSVNUID0gMQpkaWZmIC0tZ2l0IGEvTGliL3Bvc2l4cGF0aC5weSBiL0xpYi9wb3NpeHBhdGgucHkKaW5kZXggOWVhYzZiYy4uMTUyMTIzNiAxMDA2NDQKLS0tIGEvTGliL3Bvc2l4cGF0aC5weQorKysgYi9MaWIvcG9zaXhwYXRoLnB5CkBAIC0xMiw2ICsxMiw3IEBACiAKIGltcG9ydCBvcwogaW1wb3J0IHN0YXQKK2Zyb20gZ2VuZXJpY3BhdGggaW1wb3J0ICoKIAogX19hbGxfXyA9IFsibm9ybWNhc2UiLCJpc2FicyIsImpvaW4iLCJzcGxpdGRyaXZlIiwic3BsaXQiLCJzcGxpdGV4dCIsCiAgICAgICAgICAgICJiYXNlbmFtZSIsImRpcm5hbWUiLCJjb21tb25wcmVmaXgiLCJnZXRzaXplIiwiZ2V0bXRpbWUiLApAQCAtMTA1LDUxICsxMDYsMjUgQEAKICAgICByZXR1cm4gJycsIHAKIAogCi0jIFJldHVybiB0aGUgdGFpbCAoYmFzZW5hbWUpIHBhcnQgb2YgYSBwYXRoLgorIyBSZXR1cm4gdGhlIHRhaWwgKGJhc2VuYW1lKSBwYXJ0IG9mIGEgcGF0aCwgc2FtZSBhcyBzcGxpdChwYXRoKVsxXS4KIAogZGVmIGJhc2VuYW1lKHApOgogICAgICIiIlJldHVybnMgdGhlIGZpbmFsIGNvbXBvbmVudCBvZiBhIHBhdGhuYW1lIiIiCi0gICAgcmV0dXJuIHNwbGl0KHApWzFdCisgICAgaSA9IHAucmZpbmQoJy8nKSArIDEKKyAgICByZXR1cm4gcFtpOl0KIAogCi0jIFJldHVybiB0aGUgaGVhZCAoZGlybmFtZSkgcGFydCBvZiBhIHBhdGguCisjIFJldHVybiB0aGUgaGVhZCAoZGlybmFtZSkgcGFydCBvZiBhIHBhdGgsIHNhbWUgYXMgc3BsaXQocGF0aClbMF0uCiAKIGRlZiBkaXJuYW1lKHApOgogICAgICIiIlJldHVybnMgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgb2YgYSBwYXRobmFtZSIiIgotICAgIHJldHVybiBzcGxpdChwKVswXQorICAgIGkgPSBwLnJmaW5kKCcvJykgKyAxCisgICAgaGVhZCA9IHBbOmldCisgICAgaWYgaGVhZCBhbmQgaGVhZCAhPSAnLycqbGVuKGhlYWQpOgorICAgICAgICBoZWFkID0gaGVhZC5yc3RyaXAoJy8nKQorICAgIHJldHVybiBoZWFkCiAKIAotIyBSZXR1cm4gdGhlIGxvbmdlc3QgcHJlZml4IG9mIGFsbCBsaXN0IGVsZW1lbnRzLgotCi1kZWYgY29tbW9ucHJlZml4KG0pOgotICAgICJHaXZlbiBhIGxpc3Qgb2YgcGF0aG5hbWVzLCByZXR1cm5zIHRoZSBsb25nZXN0IGNvbW1vbiBsZWFkaW5nIGNvbXBvbmVudCIKLSAgICBpZiBub3QgbTogcmV0dXJuICcnCi0gICAgczEgPSBtaW4obSkKLSAgICBzMiA9IG1heChtKQotICAgIG4gPSBtaW4obGVuKHMxKSwgbGVuKHMyKSkKLSAgICBmb3IgaSBpbiB4cmFuZ2Uobik6Ci0gICAgICAgIGlmIHMxW2ldICE9IHMyW2ldOgotICAgICAgICAgICAgcmV0dXJuIHMxWzppXQotICAgIHJldHVybiBzMVs6bl0KLQotIyBHZXQgc2l6ZSwgbXRpbWUsIGF0aW1lIG9mIGZpbGVzLgotCi1kZWYgZ2V0c2l6ZShmaWxlbmFtZSk6Ci0gICAgIiIiUmV0dXJuIHRoZSBzaXplIG9mIGEgZmlsZSwgcmVwb3J0ZWQgYnkgb3Muc3RhdCgpLiIiIgotICAgIHJldHVybiBvcy5zdGF0KGZpbGVuYW1lKS5zdF9zaXplCi0KLWRlZiBnZXRtdGltZShmaWxlbmFtZSk6Ci0gICAgIiIiUmV0dXJuIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lIG9mIGEgZmlsZSwgcmVwb3J0ZWQgYnkgb3Muc3RhdCgpLiIiIgotICAgIHJldHVybiBvcy5zdGF0KGZpbGVuYW1lKS5zdF9tdGltZQotCi1kZWYgZ2V0YXRpbWUoZmlsZW5hbWUpOgotICAgICIiIlJldHVybiB0aGUgbGFzdCBhY2Nlc3MgdGltZSBvZiBhIGZpbGUsIHJlcG9ydGVkIGJ5IG9zLnN0YXQoKS4iIiIKLSAgICByZXR1cm4gb3Muc3RhdChmaWxlbmFtZSkuc3RfYXRpbWUKLQotZGVmIGdldGN0aW1lKGZpbGVuYW1lKToKLSAgICAiIiJSZXR1cm4gdGhlIG1ldGFkYXRhIGNoYW5nZSB0aW1lIG9mIGEgZmlsZSwgcmVwb3J0ZWQgYnkgb3Muc3RhdCgpLiIiIgotICAgIHJldHVybiBvcy5zdGF0KGZpbGVuYW1lKS5zdF9jdGltZQotCiAjIElzIGEgcGF0aCBhIHN5bWJvbGljIGxpbms/CiAjIFRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlIG9uIHN5c3RlbXMgd2hlcmUgb3MubHN0YXQgZG9lc24ndCBleGlzdC4KIApAQCAtMTYxLDE5ICsxMzYsNiBAQAogICAgICAgICByZXR1cm4gRmFsc2UKICAgICByZXR1cm4gc3RhdC5TX0lTTE5LKHN0LnN0X21vZGUpCiAKLQotIyBEb2VzIGEgcGF0aCBleGlzdD8KLSMgVGhpcyBpcyBmYWxzZSBmb3IgZGFuZ2xpbmcgc3ltYm9saWMgbGlua3MuCi0KLWRlZiBleGlzdHMocGF0aCk6Ci0gICAgIiIiVGVzdCB3aGV0aGVyIGEgcGF0aCBleGlzdHMuICBSZXR1cm5zIEZhbHNlIGZvciBicm9rZW4gc3ltYm9saWMgbGlua3MiIiIKLSAgICB0cnk6Ci0gICAgICAgIHN0ID0gb3Muc3RhdChwYXRoKQotICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgcmV0dXJuIFRydWUKLQotCiAjIEJlaW5nIHRydWUgZm9yIGRhbmdsaW5nIHN5bWJvbGljIGxpbmtzIGlzIGFsc28gdXNlZnVsLgogCiBkZWYgbGV4aXN0cyhwYXRoKToKQEAgLTE4NSwzMiArMTQ3LDYgQEAKICAgICByZXR1cm4gVHJ1ZQogCiAKLSMgSXMgYSBwYXRoIGEgZGlyZWN0b3J5PwotIyBUaGlzIGZvbGxvd3Mgc3ltYm9saWMgbGlua3MsIHNvIGJvdGggaXNsaW5rKCkgYW5kIGlzZGlyKCkgY2FuIGJlIHRydWUKLSMgZm9yIHRoZSBzYW1lIHBhdGguCi0KLWRlZiBpc2RpcihwYXRoKToKLSAgICAiIiJUZXN0IHdoZXRoZXIgYSBwYXRoIGlzIGEgZGlyZWN0b3J5IiIiCi0gICAgdHJ5OgotICAgICAgICBzdCA9IG9zLnN0YXQocGF0aCkKLSAgICBleGNlcHQgb3MuZXJyb3I6Ci0gICAgICAgIHJldHVybiBGYWxzZQotICAgIHJldHVybiBzdGF0LlNfSVNESVIoc3Quc3RfbW9kZSkKLQotCi0jIElzIGEgcGF0aCBhIHJlZ3VsYXIgZmlsZT8KLSMgVGhpcyBmb2xsb3dzIHN5bWJvbGljIGxpbmtzLCBzbyBib3RoIGlzbGluaygpIGFuZCBpc2ZpbGUoKSBjYW4gYmUgdHJ1ZQotIyBmb3IgdGhlIHNhbWUgcGF0aC4KLQotZGVmIGlzZmlsZShwYXRoKToKLSAgICAiIiJUZXN0IHdoZXRoZXIgYSBwYXRoIGlzIGEgcmVndWxhciBmaWxlIiIiCi0gICAgdHJ5OgotICAgICAgICBzdCA9IG9zLnN0YXQocGF0aCkKLSAgICBleGNlcHQgb3MuZXJyb3I6Ci0gICAgICAgIHJldHVybiBGYWxzZQotICAgIHJldHVybiBzdGF0LlNfSVNSRUcoc3Quc3RfbW9kZSkKLQotCiAjIEFyZSB0d28gZmlsZW5hbWVzIHJlYWxseSBwb2ludGluZyB0byB0aGUgc2FtZSBmaWxlPwogCiBkZWYgc2FtZWZpbGUoZjEsIGYyKToKQEAgLTMyOCw4ICsyNjQsNyBAQAogICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICByZXR1cm4gcGF0aAogICAgICAgICB1c2VyaG9tZSA9IHB3ZW50LnB3X2RpcgotICAgIGlmIHVzZXJob21lLmVuZHN3aXRoKCcvJyk6Ci0gICAgICAgIGkgKz0gMQorICAgIHVzZXJob21lID0gdXNlcmhvbWUucnN0cmlwKCcvJykKICAgICByZXR1cm4gdXNlcmhvbWUgKyBwYXRoW2k6XQogCiAKZGlmZiAtLWdpdCBhL0xpYi9wc3RhdHMucHkgYi9MaWIvcHN0YXRzLnB5CmluZGV4IDJhY2RhZGMuLmJhMGI4MDQgMTAwNjQ0Ci0tLSBhL0xpYi9wc3RhdHMucHkKKysrIGIvTGliL3BzdGF0cy5weQpAQCAtMTE2LDcgKzExNiw3IEBACiAKICAgICBkZWYgbG9hZF9zdGF0cyhzZWxmLCBhcmcpOgogICAgICAgICBpZiBub3QgYXJnOiAgc2VsZi5zdGF0cyA9IHt9Ci0gICAgICAgIGVsaWYgdHlwZShhcmcpID09IHR5cGUoIiIpOgorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoYXJnLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgIGYgPSBvcGVuKGFyZywgJ3JiJykKICAgICAgICAgICAgIHNlbGYuc3RhdHMgPSBtYXJzaGFsLmxvYWQoZikKICAgICAgICAgICAgIGYuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvTGliL3B0eS5weSBiL0xpYi9wdHkucHkKaW5kZXggZmFlMTYyZC4uODg5MTEzYyAxMDA2NDQKLS0tIGEvTGliL3B0eS5weQorKysgYi9MaWIvcHR5LnB5CkBAIC0xMTgsNiArMTE4LDEwIEBACiAgICAgICAgIGlmIChzbGF2ZV9mZCA+IFNUREVSUl9GSUxFTk8pOgogICAgICAgICAgICAgb3MuY2xvc2UgKHNsYXZlX2ZkKQogCisgICAgICAgICMgRXhwbGljaXRseSBvcGVuIHRoZSB0dHkgdG8gbWFrZSBpdCBiZWNvbWUgYSBjb250cm9sbGluZyB0dHkuCisgICAgICAgIHRtcF9mZCA9IG9zLm9wZW4ob3MudHR5bmFtZShTVERPVVRfRklMRU5PKSwgb3MuT19SRFdSKQorICAgICAgICBvcy5jbG9zZSh0bXBfZmQpCisKICAgICAjIFBhcmVudCBhbmQgY2hpbGQgcHJvY2Vzcy4KICAgICByZXR1cm4gcGlkLCBtYXN0ZXJfZmQKIApkaWZmIC0tZ2l0IGEvTGliL3B5Y2xici5weSBiL0xpYi9weWNsYnIucHkKaW5kZXggMDczMTIyNC4uMDc5YjM4YyAxMDA2NDQKLS0tIGEvTGliL3B5Y2xici5weQorKysgYi9MaWIvcHljbGJyLnB5CkBAIC0xNzIsNyArMTcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgIyBlbHNlIGl0J3MgYSBuZXN0ZWQgZGVmCiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgIyBpdCdzIGEgZnVuY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgZGljdFttZXRoX25hbWVdID0gRnVuY3Rpb24obW9kdWxlLCBtZXRoX25hbWUsIGZpbGUsIGxpbmVubykKKyAgICAgICAgICAgICAgICAgICAgZGljdFttZXRoX25hbWVdID0gRnVuY3Rpb24oZnVsbG1vZHVsZSwgbWV0aF9uYW1lLCBmaWxlLCBsaW5lbm8pCiAgICAgICAgICAgICAgICAgc3RhY2suYXBwZW5kKChOb25lLCB0aGlzaW5kZW50KSkgIyBNYXJrZXIgZm9yIG5lc3RlZCBmbnMKICAgICAgICAgICAgIGVsaWYgdG9rZW4gPT0gJ2NsYXNzJzoKICAgICAgICAgICAgICAgICBsaW5lbm8sIHRoaXNpbmRlbnQgPSBzdGFydApkaWZmIC0tZ2l0IGEvTGliL3NnbWxsaWIucHkgYi9MaWIvc2dtbGxpYi5weQppbmRleCAzMDIwZDExLi4zYWI1N2MyIDEwMDY0NAotLS0gYS9MaWIvc2dtbGxpYi5weQorKysgYi9MaWIvc2dtbGxpYi5weQpAQCAtMjksMTIgKzI5LDcgQEAKIHNob3J0dGFnb3BlbiA9IHJlLmNvbXBpbGUoJzxbYS16QS1aXVstLmEtekEtWjAtOV0qLycpCiBzaG9ydHRhZyA9IHJlLmNvbXBpbGUoJzwoW2EtekEtWl1bLS5hLXpBLVowLTldKikvKFteL10qKS8nKQogcGljbG9zZSA9IHJlLmNvbXBpbGUoJz4nKQotc3RhcnR0YWcgPSByZS5jb21waWxlKHInPFthLXpBLVpdWy1fLjphLXpBLVowLTldKlxzKignCi0gICAgICAgIHInXHMqKFthLXpBLVpfXVstOi5hLXpBLVpfMC05XSopKFxzKj1ccyonCi0gICAgICAgIHInKFwnW15cJ10qXCd8IlteIl0qInxbLWEtekEtWjAtOS4vLDo7KyolPyEmJFwoXClfIz1+QF0nCi0gICAgICAgIHInW11bXC1hLXpBLVowLTkuLyw6OysqJT8hJiRcKFwpXyM9flwnIkBdKig/PVtccz4vPF0pKSk/JwotICAgIHInKSpccyovP1xzKig/PVs8Pl0pJykKLWVuZHRhZyA9IHJlLmNvbXBpbGUocic8Lz9bYS16QS1aXVstXy46YS16QS1aMC05XSpccyovP1xzKig/PVs8Pl0pJykKK2VuZGJyYWNrZXQgPSByZS5jb21waWxlKCdbPD5dJykKIHRhZ2ZpbmQgPSByZS5jb21waWxlKCdbYS16QS1aXVstXy5hLXpBLVowLTldKicpCiBhdHRyZmluZCA9IHJlLmNvbXBpbGUoCiAgICAgcidccyooW2EtekEtWl9dWy06LmEtekEtWl8wLTldKikoXHMqPVxzKicKQEAgLTI1NCwxMCArMjQ5LDE0IEBACiAgICAgICAgICAgICBzZWxmLmZpbmlzaF9zaG9ydHRhZyh0YWcsIGRhdGEpCiAgICAgICAgICAgICBzZWxmLl9fc3RhcnR0YWdfdGV4dCA9IHJhd2RhdGFbc3RhcnRfcG9zOm1hdGNoLmVuZCgxKSArIDFdCiAgICAgICAgICAgICByZXR1cm4gawotICAgICAgICBtYXRjaCA9IHN0YXJ0dGFnLm1hdGNoKHJhd2RhdGEsIGkpCisgICAgICAgICMgWFhYIFRoZSBmb2xsb3dpbmcgc2hvdWxkIHNraXAgbWF0Y2hpbmcgcXVvdGVzICgnIG9yICIpCisgICAgICAgICMgQXMgYSBzaG9ydGN1dCB3YXkgdG8gZXhpdCwgdGhpcyBpc24ndCBzbyBiYWQsIGJ1dCBzaG91bGRuJ3QKKyAgICAgICAgIyBiZSB1c2VkIHRvIGxvY2F0ZSB0aGUgYWN0dWFsIGVuZCBvZiB0aGUgc3RhcnQgdGFnIHNpbmNlIHRoZQorICAgICAgICAjIDwgb3IgPiBjaGFyYWN0ZXJzIG1heSBiZSBlbWJlZGRlZCBpbiBhbiBhdHRyaWJ1dGUgdmFsdWUuCisgICAgICAgIG1hdGNoID0gZW5kYnJhY2tldC5zZWFyY2gocmF3ZGF0YSwgaSsxKQogICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgICByZXR1cm4gLTEKLSAgICAgICAgaiA9IG1hdGNoLmVuZCgwKQorICAgICAgICBqID0gbWF0Y2guc3RhcnQoMCkKICAgICAgICAgIyBOb3cgcGFyc2UgdGhlIGRhdGEgYmV0d2VlbiBpKzEgYW5kIGogaW50byBhIHRhZyBhbmQgYXR0cnMKICAgICAgICAgYXR0cnMgPSBbXQogICAgICAgICBpZiByYXdkYXRhW2k6aSsyXSA9PSAnPD4nOgpAQCAtMzA2LDEwICszMDUsMTAgQEAKICAgICAjIEludGVybmFsIC0tIHBhcnNlIGVuZHRhZwogICAgIGRlZiBwYXJzZV9lbmR0YWcoc2VsZiwgaSk6CiAgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKLSAgICAgICAgbWF0Y2ggPSBlbmR0YWcubWF0Y2gocmF3ZGF0YSwgaSkKKyAgICAgICAgbWF0Y2ggPSBlbmRicmFja2V0LnNlYXJjaChyYXdkYXRhLCBpKzEpCiAgICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgIHJldHVybiAtMQotICAgICAgICBqID0gbWF0Y2guZW5kKDApCisgICAgICAgIGogPSBtYXRjaC5zdGFydCgwKQogICAgICAgICB0YWcgPSByYXdkYXRhW2krMjpqXS5zdHJpcCgpLmxvd2VyKCkKICAgICAgICAgaWYgcmF3ZGF0YVtqXSA9PSAnPic6CiAgICAgICAgICAgICBqID0gaisxCmRpZmYgLS1naXQgYS9MaWIvc210cGxpYi5weSBiL0xpYi9zbXRwbGliLnB5CmluZGV4IDljOGM0ZmEuLmE3MzA1Y2UgMTAwNzU1Ci0tLSBhL0xpYi9zbXRwbGliLnB5CisrKyBiL0xpYi9zbXRwbGliLnB5CkBAIC01Miw5ICs1MiwxMCBAQAogX19hbGxfXyA9IFsiU01UUEV4Y2VwdGlvbiIsIlNNVFBTZXJ2ZXJEaXNjb25uZWN0ZWQiLCJTTVRQUmVzcG9uc2VFeGNlcHRpb24iLAogICAgICAgICAgICAiU01UUFNlbmRlclJlZnVzZWQiLCJTTVRQUmVjaXBpZW50c1JlZnVzZWQiLCJTTVRQRGF0YUVycm9yIiwKICAgICAgICAgICAgIlNNVFBDb25uZWN0RXJyb3IiLCJTTVRQSGVsb0Vycm9yIiwiU01UUEF1dGhlbnRpY2F0aW9uRXJyb3IiLAotICAgICAgICAgICAicXVvdGVhZGRyIiwicXVvdGVkYXRhIiwiU01UUCJdCisgICAgICAgICAgICJxdW90ZWFkZHIiLCJxdW90ZWRhdGEiLCJTTVRQIiwiU01UUF9TU0wiXQogCiBTTVRQX1BPUlQgPSAyNQorU01UUF9TU0xfUE9SVCA9IDQ2NQogQ1JMRj0iXHJcbiIKIAogT0xEU1RZTEVfQVVUSCA9IHJlLmNvbXBpbGUociJhdXRoPSguKikiLCByZS5JKQpAQCAtMjQwLDYgKzI0MSw3IEBACiAKICAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuZXNtdHBfZmVhdHVyZXMgPSB7fQorICAgICAgICBzZWxmLmRlZmF1bHRfcG9ydCA9IFNNVFBfUE9SVAogICAgICAgICBpZiBob3N0OgogICAgICAgICAgICAgKGNvZGUsIG1zZykgPSBzZWxmLmNvbm5lY3QoaG9zdCwgcG9ydCkKICAgICAgICAgICAgIGlmIGNvZGUgIT0gMjIwOgpAQCAtMjcxLDYgKzI3MywxMyBAQAogICAgICAgICAiIiIKICAgICAgICAgc2VsZi5kZWJ1Z2xldmVsID0gZGVidWdsZXZlbAogCisgICAgZGVmIF9nZXRfc29ja2V0KHNlbGYsYWYsIHNvY2t0eXBlLCBwcm90byxzYSk6CisgICAgICAgICMgVGhpcyBtYWtlcyBpdCBzaW1wbGVyIGZvciBTTVRQX1NTTCB0byB1c2UgdGhlIFNNVFAgY29ubmVjdCBjb2RlCisgICAgICAgICMgYW5kIGp1c3QgYWx0ZXIgdGhlIHNvY2tldCBjb25uZWN0aW9uIGJpdC4KKyAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LnNvY2tldChhZiwgc29ja3R5cGUsIHByb3RvKQorICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOiBwcmludD4+c3RkZXJyLCAnY29ubmVjdDonLCAoaG9zdCwgcG9ydCkKKyAgICAgICAgc2VsZi5zb2NrLmNvbm5lY3Qoc2EpCisKICAgICBkZWYgY29ubmVjdChzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0ID0gMCk6CiAgICAgICAgICIiIkNvbm5lY3QgdG8gYSBob3N0IG9uIGEgZ2l2ZW4gcG9ydC4KIApAQCAtMjg5LDE2ICsyOTgsMTQgQEAKICAgICAgICAgICAgICAgICB0cnk6IHBvcnQgPSBpbnQocG9ydCkKICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgcmFpc2Ugc29ja2V0LmVycm9yLCAibm9ubnVtZXJpYyBwb3J0IgotICAgICAgICBpZiBub3QgcG9ydDogcG9ydCA9IFNNVFBfUE9SVAorICAgICAgICBpZiBub3QgcG9ydDogcG9ydCA9IHNlbGYuZGVmYXVsdF9wb3J0CiAgICAgICAgIGlmIHNlbGYuZGVidWdsZXZlbCA+IDA6IHByaW50Pj5zdGRlcnIsICdjb25uZWN0OicsIChob3N0LCBwb3J0KQogICAgICAgICBtc2cgPSAiZ2V0YWRkcmluZm8gcmV0dXJucyBhbiBlbXB0eSBsaXN0IgogICAgICAgICBzZWxmLnNvY2sgPSBOb25lCiAgICAgICAgIGZvciByZXMgaW4gc29ja2V0LmdldGFkZHJpbmZvKGhvc3QsIHBvcnQsIDAsIHNvY2tldC5TT0NLX1NUUkVBTSk6CiAgICAgICAgICAgICBhZiwgc29ja3R5cGUsIHByb3RvLCBjYW5vbm5hbWUsIHNhID0gcmVzCiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LnNvY2tldChhZiwgc29ja3R5cGUsIHByb3RvKQotICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWdsZXZlbCA+IDA6IHByaW50Pj5zdGRlcnIsICdjb25uZWN0OicsIHNhCi0gICAgICAgICAgICAgICAgc2VsZi5zb2NrLmNvbm5lY3Qoc2EpCisgICAgICAgICAgICAgICAgc2VsZi5fZ2V0X3NvY2tldChhZixzb2NrdHlwZSxwcm90byxzYSkKICAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIG1zZzoKICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOiBwcmludD4+c3RkZXJyLCAnY29ubmVjdCBmYWlsOicsIG1zZwogICAgICAgICAgICAgICAgIGlmIHNlbGYuc29jazoKQEAgLTcxNiw2ICs3MjMsMjggQEAKICAgICAgICAgc2VsZi5kb2NtZCgicXVpdCIpCiAgICAgICAgIHNlbGYuY2xvc2UoKQogCitjbGFzcyBTTVRQX1NTTChTTVRQKToKKyAgICAiIiIgVGhpcyBpcyBhIHN1YmNsYXNzIGRlcml2ZWQgZnJvbSBTTVRQIHRoYXQgY29ubmVjdHMgb3ZlciBhbiBTU0wgZW5jcnlwdGVkCisgICAgc29ja2V0ICh0byB1c2UgdGhpcyBjbGFzcyB5b3UgbmVlZCBhIHNvY2tldCBtb2R1bGUgdGhhdCB3YXMgY29tcGlsZWQgd2l0aCBTU0wKKyAgICBzdXBwb3J0KS4gSWYgaG9zdCBpcyBub3Qgc3BlY2lmaWVkLCAnJyAodGhlIGxvY2FsIGhvc3QpIGlzIHVzZWQuIElmIHBvcnQgaXMKKyAgICBvbWl0dGVkLCB0aGUgc3RhbmRhcmQgU01UUC1vdmVyLVNTTCBwb3J0ICg0NjUpIGlzIHVzZWQuIGtleWZpbGUgYW5kIGNlcnRmaWxlCisgICAgYXJlIGFsc28gb3B0aW9uYWwgLSB0aGV5IGNhbiBjb250YWluIGEgUEVNIGZvcm1hdHRlZCBwcml2YXRlIGtleSBhbmQKKyAgICBjZXJ0aWZpY2F0ZSBjaGFpbiBmaWxlIGZvciB0aGUgU1NMIGNvbm5lY3Rpb24uCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QgPSAnJywgcG9ydCA9IDAsIGxvY2FsX2hvc3RuYW1lID0gTm9uZSwKKyAgICAgICAgICAgICAgICAga2V5ZmlsZSA9IE5vbmUsIGNlcnRmaWxlID0gTm9uZSk6CisgICAgICAgIHNlbGYua2V5ZmlsZSA9IGtleWZpbGUKKyAgICAgICAgc2VsZi5jZXJ0ZmlsZSA9IGNlcnRmaWxlCisgICAgICAgIFNNVFAuX19pbml0X18oc2VsZixob3N0LHBvcnQsbG9jYWxfaG9zdG5hbWUpCisgICAgICAgIHNlbGYuZGVmYXVsdF9wb3J0ID0gU01UUF9TU0xfUE9SVAorCisgICAgZGVmIF9nZXRfc29ja2V0KHNlbGYsYWYsIHNvY2t0eXBlLCBwcm90byxzYSk6CisgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5zb2NrZXQoYWYsIHNvY2t0eXBlLCBwcm90bykKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDogcHJpbnQ+PnN0ZGVyciwgJ2Nvbm5lY3Q6JywgKGhvc3QsIHBvcnQpCisgICAgICAgIHNlbGYuc29jay5jb25uZWN0KHNhKQorICAgICAgICBzc2xvYmogPSBzb2NrZXQuc3NsKHNlbGYuc29jaywgc2VsZi5rZXlmaWxlLCBzZWxmLmNlcnRmaWxlKQorICAgICAgICBzZWxmLnNvY2sgPSBTU0xGYWtlU29ja2V0KHNlbGYuc29jaywgc3Nsb2JqKQorICAgICAgICBzZWxmLmZpbGUgPSBTU0xGYWtlRmlsZShzc2xvYmopCiAKICMgVGVzdCB0aGUgc2VuZG1haWwgbWV0aG9kLCB3aGljaCB0ZXN0cyBtb3N0IG9mIHRoZSBvdGhlcnMuCiAjIE5vdGU6IFRoaXMgYWx3YXlzIHNlbmRzIHRvIGxvY2FsaG9zdC4KZGlmZiAtLWdpdCBhL0xpYi9zdWJwcm9jZXNzLnB5IGIvTGliL3N1YnByb2Nlc3MucHkKaW5kZXggNTVlMjY3Zi4uNjhhYjA1ZSAxMDA2NDQKLS0tIGEvTGliL3N1YnByb2Nlc3MucHkKKysrIGIvTGliL3N1YnByb2Nlc3MucHkKQEAgLTk2Niw2ICs5NjYsOCBAQAogCiAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZ3MsIHR5cGVzLlN0cmluZ1R5cGVzKToKICAgICAgICAgICAgICAgICBhcmdzID0gW2FyZ3NdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFyZ3MgPSBsaXN0KGFyZ3MpCiAKICAgICAgICAgICAgIGlmIHNoZWxsOgogICAgICAgICAgICAgICAgIGFyZ3MgPSBbIi9iaW4vc2giLCAiLWMiXSArIGFyZ3MKQEAgLTEwMDEsMTQgKzEwMDMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgZXJyd3JpdGU6CiAgICAgICAgICAgICAgICAgICAgICAgICBvcy5kdXAyKGVycndyaXRlLCAyKQogCi0gICAgICAgICAgICAgICAgICAgICMgQ2xvc2UgcGlwZSBmZHMuICBNYWtlIHN1cmUgd2UgZG9lc24ndCBjbG9zZSB0aGUgc2FtZQotICAgICAgICAgICAgICAgICAgICAjIGZkIG1vcmUgdGhhbiBvbmNlLgotICAgICAgICAgICAgICAgICAgICBpZiBwMmNyZWFkOgotICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UocDJjcmVhZCkKLSAgICAgICAgICAgICAgICAgICAgaWYgYzJwd3JpdGUgYW5kIGMycHdyaXRlIG5vdCBpbiAocDJjcmVhZCwpOgotICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoYzJwd3JpdGUpCi0gICAgICAgICAgICAgICAgICAgIGlmIGVycndyaXRlIGFuZCBlcnJ3cml0ZSBub3QgaW4gKHAyY3JlYWQsIGMycHdyaXRlKToKLSAgICAgICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKGVycndyaXRlKQorICAgICAgICAgICAgICAgICAgICAjIENsb3NlIHBpcGUgZmRzLiAgTWFrZSBzdXJlIHdlIGRvbid0IGNsb3NlIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgICAgICMgZmQgbW9yZSB0aGFuIG9uY2UsIG9yIHN0YW5kYXJkIGZkcy4KKyAgICAgICAgICAgICAgICAgICAgZm9yIGZkIGluIHNldCgocDJjcmVhZCwgYzJwd3JpdGUsIGVycndyaXRlKSktc2V0KCgwLDEsMikpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZmQ6IG9zLmNsb3NlKGZkKQogCiAgICAgICAgICAgICAgICAgICAgICMgQ2xvc2UgYWxsIG90aGVyIGZkcywgaWYgYXNrZWQgZm9yCiAgICAgICAgICAgICAgICAgICAgIGlmIGNsb3NlX2ZkczoKZGlmZiAtLWdpdCBhL0xpYi90YXJmaWxlLnB5IGIvTGliL3RhcmZpbGUucHkKaW5kZXggZDIzODA2My4uMTQ1NTNhNyAxMDA2NDQKLS0tIGEvTGliL3RhcmZpbGUucHkKKysrIGIvTGliL3RhcmZpbGUucHkKQEAgLTQ5LDYgKzQ5LDcgQEAKIGltcG9ydCBlcnJubwogaW1wb3J0IHRpbWUKIGltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBjb3B5CiAKIGlmIHN5cy5wbGF0Zm9ybSA9PSAnbWFjJzoKICAgICAjIFRoaXMgbW9kdWxlIG5lZWRzIHdvcmsgZm9yIE1hY09TOSwgZXNwZWNpYWxseSBpbiB0aGUgYXJlYSBvZiBwYXRobmFtZQpAQCAtMTM4LDcgKzEzOSw3IEBACiBkZWYgc3RuKHMsIGxlbmd0aCk6CiAgICAgIiIiQ29udmVydCBhIHB5dGhvbiBzdHJpbmcgdG8gYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGJ1ZmZlci4KICAgICAiIiIKLSAgICByZXR1cm4gc1s6bGVuZ3RoLTFdICsgKGxlbmd0aCAtIGxlbihzKSAtIDEpICogTlVMICsgTlVMCisgICAgcmV0dXJuIHNbOmxlbmd0aF0gKyAobGVuZ3RoIC0gbGVuKHMpKSAqIE5VTAogCiBkZWYgbnRpKHMpOgogICAgICIiIkNvbnZlcnQgYSBudW1iZXIgZmllbGQgdG8gYSBweXRob24gbnVtYmVyLgpAQCAtMTQ2LDcgKzE0Nyw3IEBACiAgICAgIyBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIGVuY29kaW5ncyBmb3IgYSBudW1iZXIgZmllbGQsIHNlZQogICAgICMgaXRuKCkgYmVsb3cuCiAgICAgaWYgc1swXSAhPSBjaHIoMDIwMCk6Ci0gICAgICAgIG4gPSBpbnQocy5yc3RyaXAoTlVMKSBvciAiMCIsIDgpCisgICAgICAgIG4gPSBpbnQocy5yc3RyaXAoTlVMICsgIiAiKSBvciAiMCIsIDgpCiAgICAgZWxzZToKICAgICAgICAgbiA9IDBMCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4ocykgLSAxKToKQEAgLTc5NSw3ICs3OTYsNiBAQAogICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUYXJJbmZvIG9iamVjdC4gbmFtZSBpcyB0aGUgb3B0aW9uYWwgbmFtZQogICAgICAgICAgICBvZiB0aGUgbWVtYmVyLgogICAgICAgICAiIiIKLQogICAgICAgICBzZWxmLm5hbWUgPSBuYW1lICAgICAgICAjIG1lbWJlciBuYW1lIChkaXJuYW1lcyBtdXN0IGVuZCB3aXRoICcvJykKICAgICAgICAgc2VsZi5tb2RlID0gMDY2NiAgICAgICAgIyBmaWxlIHBlcm1pc3Npb25zCiAgICAgICAgIHNlbGYudWlkID0gMCAgICAgICAgICAgICMgdXNlciBpZApAQCAtODA5LDggKzgwOSw2IEBACiAgICAgICAgIHNlbGYuZ25hbWUgPSAiZ3JvdXAiICAgICMgZ3JvdXAgbmFtZQogICAgICAgICBzZWxmLmRldm1ham9yID0gMCAgICAgICAjIGRldmljZSBtYWpvciBudW1iZXIKICAgICAgICAgc2VsZi5kZXZtaW5vciA9IDAgICAgICAgIyBkZXZpY2UgbWlub3IgbnVtYmVyCi0gICAgICAgIHNlbGYucHJlZml4ID0gIiIgICAgICAgICMgcHJlZml4IHRvIGZpbGVuYW1lIG9yIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWJvdXQgc3BhcnNlIGZpbGVzCiAKICAgICAgICAgc2VsZi5vZmZzZXQgPSAwICAgICAgICAgIyB0aGUgdGFyIGhlYWRlciBzdGFydHMgaGVyZQogICAgICAgICBzZWxmLm9mZnNldF9kYXRhID0gMCAgICAjIHRoZSBmaWxlJ3MgZGF0YSBzdGFydHMgaGVyZQpAQCAtODQyLDI0ICs4NDAsNzQgQEAKICAgICAgICAgdGFyaW5mby5nbmFtZSA9IGJ1ZlsyOTc6MzI5XS5yc3RyaXAoTlVMKQogICAgICAgICB0YXJpbmZvLmRldm1ham9yID0gbnRpKGJ1ZlszMjk6MzM3XSkKICAgICAgICAgdGFyaW5mby5kZXZtaW5vciA9IG50aShidWZbMzM3OjM0NV0pCi0gICAgICAgIHRhcmluZm8ucHJlZml4ID0gYnVmWzM0NTo1MDBdCisgICAgICAgIHByZWZpeCA9IGJ1ZlszNDU6NTAwXS5yc3RyaXAoTlVMKQorCisgICAgICAgIGlmIHByZWZpeCBhbmQgbm90IHRhcmluZm8uaXNzcGFyc2UoKToKKyAgICAgICAgICAgIHRhcmluZm8ubmFtZSA9IHByZWZpeCArICIvIiArIHRhcmluZm8ubmFtZQogCiAgICAgICAgIGlmIHRhcmluZm8uY2hrc3VtIG5vdCBpbiBjYWxjX2Noa3N1bXMoYnVmKToKICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImludmFsaWQgaGVhZGVyIikKICAgICAgICAgcmV0dXJuIHRhcmluZm8KIAogICAgIGRlZiB0b2J1ZihzZWxmLCBwb3NpeD1GYWxzZSk6Ci0gICAgICAgICIiIlJldHVybiBhIHRhciBoZWFkZXIgYmxvY2sgYXMgYSA1MTIgYnl0ZSBzdHJpbmcuCisgICAgICAgICIiIlJldHVybiBhIHRhciBoZWFkZXIgYXMgYSBzdHJpbmcgb2YgNTEyIGJ5dGUgYmxvY2tzLgogICAgICAgICAiIiIKKyAgICAgICAgYnVmID0gIiIKKyAgICAgICAgdHlwZSA9IHNlbGYudHlwZQorICAgICAgICBwcmVmaXggPSAiIgorCisgICAgICAgIGlmIHNlbGYubmFtZS5lbmRzd2l0aCgiLyIpOgorICAgICAgICAgICAgdHlwZSA9IERJUlRZUEUKKworICAgICAgICBpZiB0eXBlIGluIChHTlVUWVBFX0xPTkdOQU1FLCBHTlVUWVBFX0xPTkdMSU5LKToKKyAgICAgICAgICAgICMgUHJldmVudCAiLi8uL0BMb25nTGluayIgZnJvbSBiZWluZyBub3JtYWxpemVkLgorICAgICAgICAgICAgbmFtZSA9IHNlbGYubmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZSA9IG5vcm1wYXRoKHNlbGYubmFtZSkKKworICAgICAgICBpZiB0eXBlID09IERJUlRZUEU6CisgICAgICAgICAgICAjIGRpcmVjdG9yaWVzIHNob3VsZCBlbmQgd2l0aCAnLycKKyAgICAgICAgICAgIG5hbWUgKz0gIi8iCisKKyAgICAgICAgbGlua25hbWUgPSBzZWxmLmxpbmtuYW1lCisgICAgICAgIGlmIGxpbmtuYW1lOgorICAgICAgICAgICAgIyBpZiBsaW5rbmFtZSBpcyBlbXB0eSB3ZSBlbmQgdXAgd2l0aCBhICcuJworICAgICAgICAgICAgbGlua25hbWUgPSBub3JtcGF0aChsaW5rbmFtZSkKKworICAgICAgICBpZiBwb3NpeDoKKyAgICAgICAgICAgIGlmIHNlbGYuc2l6ZSA+IE1BWFNJWkVfTUVNQkVSOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpbGUgaXMgdG9vIGxhcmdlICg+PSA4IEdCKSIpCisKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLmxpbmtuYW1lKSA+IExFTkdUSF9MSU5LOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImxpbmtuYW1lIGlzIHRvbyBsb25nICg+JWQpIiAlIChMRU5HVEhfTElOSykpCisKKyAgICAgICAgICAgIGlmIGxlbihuYW1lKSA+IExFTkdUSF9OQU1FOgorICAgICAgICAgICAgICAgIHByZWZpeCA9IG5hbWVbOkxFTkdUSF9QUkVGSVggKyAxXQorICAgICAgICAgICAgICAgIHdoaWxlIHByZWZpeCBhbmQgcHJlZml4Wy0xXSAhPSAiLyI6CisgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeFs6LTFdCisKKyAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVtsZW4ocHJlZml4KTpdCisgICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4WzotMV0KKworICAgICAgICAgICAgICAgIGlmIG5vdCBwcmVmaXggb3IgbGVuKG5hbWUpID4gTEVOR1RIX05BTUU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5hbWUgaXMgdG9vIGxvbmciKQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBsZW4oc2VsZi5saW5rbmFtZSkgPiBMRU5HVEhfTElOSzoKKyAgICAgICAgICAgICAgICBidWYgKz0gc2VsZi5fY3JlYXRlX2dudWxvbmcoc2VsZi5saW5rbmFtZSwgR05VVFlQRV9MT05HTElOSykKKworICAgICAgICAgICAgaWYgbGVuKG5hbWUpID4gTEVOR1RIX05BTUU6CisgICAgICAgICAgICAgICAgYnVmICs9IHNlbGYuX2NyZWF0ZV9nbnVsb25nKG5hbWUsIEdOVVRZUEVfTE9OR05BTUUpCisKICAgICAgICAgcGFydHMgPSBbCi0gICAgICAgICAgICBzdG4oc2VsZi5uYW1lLCAxMDApLAorICAgICAgICAgICAgc3RuKG5hbWUsIDEwMCksCiAgICAgICAgICAgICBpdG4oc2VsZi5tb2RlICYgMDc3NzcsIDgsIHBvc2l4KSwKICAgICAgICAgICAgIGl0bihzZWxmLnVpZCwgOCwgcG9zaXgpLAogICAgICAgICAgICAgaXRuKHNlbGYuZ2lkLCA4LCBwb3NpeCksCiAgICAgICAgICAgICBpdG4oc2VsZi5zaXplLCAxMiwgcG9zaXgpLAogICAgICAgICAgICAgaXRuKHNlbGYubXRpbWUsIDEyLCBwb3NpeCksCiAgICAgICAgICAgICAiICAgICAgICAiLCAjIGNoZWNrc3VtIGZpZWxkCi0gICAgICAgICAgICBzZWxmLnR5cGUsCisgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgc3RuKHNlbGYubGlua25hbWUsIDEwMCksCiAgICAgICAgICAgICBzdG4oTUFHSUMsIDYpLAogICAgICAgICAgICAgc3RuKFZFUlNJT04sIDIpLApAQCAtODY3LDE1ICs5MTUsMzggQEAKICAgICAgICAgICAgIHN0bihzZWxmLmduYW1lLCAzMiksCiAgICAgICAgICAgICBpdG4oc2VsZi5kZXZtYWpvciwgOCwgcG9zaXgpLAogICAgICAgICAgICAgaXRuKHNlbGYuZGV2bWlub3IsIDgsIHBvc2l4KSwKLSAgICAgICAgICAgIHN0bihzZWxmLnByZWZpeCwgMTU1KQorICAgICAgICAgICAgc3RuKHByZWZpeCwgMTU1KQogICAgICAgICBdCiAKLSAgICAgICAgYnVmID0gc3RydWN0LnBhY2soIiVkcyIgJSBCTE9DS1NJWkUsICIiLmpvaW4ocGFydHMpKQotICAgICAgICBjaGtzdW0gPSBjYWxjX2Noa3N1bXMoYnVmKVswXQotICAgICAgICBidWYgPSBidWZbOjE0OF0gKyAiJTA2b1wwIiAlIGNoa3N1bSArIGJ1ZlsxNTU6XQorICAgICAgICBidWYgKz0gc3RydWN0LnBhY2soIiVkcyIgJSBCTE9DS1NJWkUsICIiLmpvaW4ocGFydHMpKQorICAgICAgICBjaGtzdW0gPSBjYWxjX2Noa3N1bXMoYnVmWy1CTE9DS1NJWkU6XSlbMF0KKyAgICAgICAgYnVmID0gYnVmWzotMzY0XSArICIlMDZvXDAiICUgY2hrc3VtICsgYnVmWy0zNTc6XQogICAgICAgICBzZWxmLmJ1ZiA9IGJ1ZgogICAgICAgICByZXR1cm4gYnVmCiAKKyAgICBkZWYgX2NyZWF0ZV9nbnVsb25nKHNlbGYsIG5hbWUsIHR5cGUpOgorICAgICAgICAiIiJDcmVhdGUgYSBHTlUgbG9uZ25hbWUvbG9uZ2xpbmsgaGVhZGVyIGZyb20gbmFtZS4KKyAgICAgICAgICAgSXQgY29uc2lzdHMgb2YgYW4gZXh0ZW5kZWQgdGFyIGhlYWRlciwgd2l0aCB0aGUgbGVuZ3RoCisgICAgICAgICAgIG9mIHRoZSBsb25nbmFtZSBhcyBzaXplLCBmb2xsb3dlZCBieSBkYXRhIGJsb2NrcywKKyAgICAgICAgICAgd2hpY2ggY29udGFpbiB0aGUgbG9uZ25hbWUgYXMgYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSArPSBOVUwKKworICAgICAgICB0YXJpbmZvID0gc2VsZi5fX2NsYXNzX18oKQorICAgICAgICB0YXJpbmZvLm5hbWUgPSAiLi8uL0BMb25nTGluayIKKyAgICAgICAgdGFyaW5mby50eXBlID0gdHlwZQorICAgICAgICB0YXJpbmZvLm1vZGUgPSAwCisgICAgICAgIHRhcmluZm8uc2l6ZSA9IGxlbihuYW1lKQorCisgICAgICAgICMgY3JlYXRlIGV4dGVuZGVkIGhlYWRlcgorICAgICAgICBidWYgPSB0YXJpbmZvLnRvYnVmKCkKKyAgICAgICAgIyBjcmVhdGUgbmFtZSBibG9ja3MKKyAgICAgICAgYnVmICs9IG5hbWUKKyAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2QobGVuKG5hbWUpLCBCTE9DS1NJWkUpCisgICAgICAgIGlmIHJlbWFpbmRlciA+IDA6CisgICAgICAgICAgICBidWYgKz0gKEJMT0NLU0laRSAtIHJlbWFpbmRlcikgKiBOVUwKKyAgICAgICAgcmV0dXJuIGJ1ZgorCiAgICAgZGVmIGlzcmVnKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi50eXBlIGluIFJFR1VMQVJfVFlQRVMKICAgICBkZWYgaXNmaWxlKHNlbGYpOgpAQCAtMTM3OSw1MCArMTQ1MCwxMSBAQAogICAgICAgICAiIiIKICAgICAgICAgc2VsZi5fY2hlY2soImF3IikKIAotICAgICAgICB0YXJpbmZvLm5hbWUgPSBub3JtcGF0aCh0YXJpbmZvLm5hbWUpCi0gICAgICAgIGlmIHRhcmluZm8uaXNkaXIoKToKLSAgICAgICAgICAgICMgZGlyZWN0b3JpZXMgc2hvdWxkIGVuZCB3aXRoICcvJwotICAgICAgICAgICAgdGFyaW5mby5uYW1lICs9ICIvIgorICAgICAgICB0YXJpbmZvID0gY29weS5jb3B5KHRhcmluZm8pCiAKLSAgICAgICAgaWYgdGFyaW5mby5saW5rbmFtZToKLSAgICAgICAgICAgIHRhcmluZm8ubGlua25hbWUgPSBub3JtcGF0aCh0YXJpbmZvLmxpbmtuYW1lKQotCi0gICAgICAgIGlmIHRhcmluZm8uc2l6ZSA+IE1BWFNJWkVfTUVNQkVSOgotICAgICAgICAgICAgaWYgc2VsZi5wb3NpeDoKLSAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmaWxlIGlzIHRvbyBsYXJnZSAoPj0gOCBHQikiKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgInRhcmZpbGU6IENyZWF0ZWQgR05VIHRhciBsYXJnZWZpbGUgaGVhZGVyIikKLQotCi0gICAgICAgIGlmIGxlbih0YXJpbmZvLmxpbmtuYW1lKSA+IExFTkdUSF9MSU5LOgotICAgICAgICAgICAgaWYgc2VsZi5wb3NpeDoKLSAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJsaW5rbmFtZSBpcyB0b28gbG9uZyAoPiVkKSIgJSAoTEVOR1RIX0xJTkspKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLl9jcmVhdGVfZ251bG9uZyh0YXJpbmZvLmxpbmtuYW1lLCBHTlVUWVBFX0xPTkdMSU5LKQotICAgICAgICAgICAgICAgIHRhcmluZm8ubGlua25hbWUgPSB0YXJpbmZvLmxpbmtuYW1lWzpMRU5HVEhfTElOSyAtMV0KLSAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgInRhcmZpbGU6IENyZWF0ZWQgR05VIHRhciBleHRlbnNpb24gTE9OR0xJTksiKQotCi0gICAgICAgIGlmIGxlbih0YXJpbmZvLm5hbWUpID4gTEVOR1RIX05BTUU6Ci0gICAgICAgICAgICBpZiBzZWxmLnBvc2l4OgotICAgICAgICAgICAgICAgIHByZWZpeCA9IHRhcmluZm8ubmFtZVs6TEVOR1RIX1BSRUZJWCArIDFdCi0gICAgICAgICAgICAgICAgd2hpbGUgcHJlZml4IGFuZCBwcmVmaXhbLTFdICE9ICIvIjoKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4WzotMV0KLQotICAgICAgICAgICAgICAgIG5hbWUgPSB0YXJpbmZvLm5hbWVbbGVuKHByZWZpeCk6XQotICAgICAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeFs6LTFdCi0KLSAgICAgICAgICAgICAgICBpZiBub3QgcHJlZml4IG9yIGxlbihuYW1lKSA+IExFTkdUSF9OQU1FOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJuYW1lIGlzIHRvbyBsb25nICg+JWQpIiAlIChMRU5HVEhfTkFNRSkpCi0KLSAgICAgICAgICAgICAgICB0YXJpbmZvLm5hbWUgICA9IG5hbWUKLSAgICAgICAgICAgICAgICB0YXJpbmZvLnByZWZpeCA9IHByZWZpeAotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLl9jcmVhdGVfZ251bG9uZyh0YXJpbmZvLm5hbWUsIEdOVVRZUEVfTE9OR05BTUUpCi0gICAgICAgICAgICAgICAgdGFyaW5mby5uYW1lID0gdGFyaW5mby5uYW1lWzpMRU5HVEhfTkFNRSAtIDFdCi0gICAgICAgICAgICAgICAgc2VsZi5fZGJnKDIsICJ0YXJmaWxlOiBDcmVhdGVkIEdOVSB0YXIgZXh0ZW5zaW9uIExPTkdOQU1FIikKLQotICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUodGFyaW5mby50b2J1ZihzZWxmLnBvc2l4KSkKLSAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCisgICAgICAgIGJ1ZiA9IHRhcmluZm8udG9idWYoc2VsZi5wb3NpeCkKKyAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKGJ1ZikKKyAgICAgICAgc2VsZi5vZmZzZXQgKz0gbGVuKGJ1ZikKIAogICAgICAgICAjIElmIHRoZXJlJ3MgZGF0YSB0byBmb2xsb3csIGFwcGVuZCBpdC4KICAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKQEAgLTE3ODEsMTIgKzE4MTMsNiBAQAogICAgICAgICBpZiB0YXJpbmZvLmlzcmVnKCkgYW5kIHRhcmluZm8ubmFtZS5lbmRzd2l0aCgiLyIpOgogICAgICAgICAgICAgdGFyaW5mby50eXBlID0gRElSVFlQRQogCi0gICAgICAgICMgVGhlIHByZWZpeCBmaWVsZCBpcyB1c2VkIGZvciBmaWxlbmFtZXMgPiAxMDAgaW4KLSAgICAgICAgIyB0aGUgUE9TSVggc3RhbmRhcmQuCi0gICAgICAgICMgbmFtZSA9IHByZWZpeCArICcvJyArIG5hbWUKLSAgICAgICAgdGFyaW5mby5uYW1lID0gbm9ybXBhdGgob3MucGF0aC5qb2luKHRhcmluZm8ucHJlZml4LnJzdHJpcChOVUwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mby5uYW1lKSkKLQogICAgICAgICAjIERpcmVjdG9yeSBuYW1lcyBzaG91bGQgaGF2ZSBhICcvJyBhdCB0aGUgZW5kLgogICAgICAgICBpZiB0YXJpbmZvLmlzZGlyKCk6CiAgICAgICAgICAgICB0YXJpbmZvLm5hbWUgKz0gIi8iCkBAIC0xOTExLDEwICsxOTM3LDYgQEAKICAgICAgICAgc2VsZi5vZmZzZXQgKz0gc2VsZi5fYmxvY2sodGFyaW5mby5zaXplKQogICAgICAgICB0YXJpbmZvLnNpemUgPSBvcmlnc2l6ZQogCi0gICAgICAgICMgQ2xlYXIgdGhlIHByZWZpeCBmaWVsZCBzbyB0aGF0IGl0IGlzIG5vdCB1c2VkCi0gICAgICAgICMgYXMgYSBwYXRobmFtZSBpbiBuZXh0KCkuCi0gICAgICAgIHRhcmluZm8ucHJlZml4ID0gIiIKLQogICAgICAgICByZXR1cm4gdGFyaW5mbwogCiAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xOTcyLDMxICsxOTk0LDYgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiBUYXJJdGVyKHNlbGYpCiAKLSAgICBkZWYgX2NyZWF0ZV9nbnVsb25nKHNlbGYsIG5hbWUsIHR5cGUpOgotICAgICAgICAiIiJXcml0ZSBhIEdOVSBsb25nbmFtZS9sb25nbGluayBtZW1iZXIgdG8gdGhlIFRhckZpbGUuCi0gICAgICAgICAgIEl0IGNvbnNpc3RzIG9mIGFuIGV4dGVuZGVkIHRhciBoZWFkZXIsIHdpdGggdGhlIGxlbmd0aAotICAgICAgICAgICBvZiB0aGUgbG9uZ25hbWUgYXMgc2l6ZSwgZm9sbG93ZWQgYnkgZGF0YSBibG9ja3MsCi0gICAgICAgICAgIHdoaWNoIGNvbnRhaW4gdGhlIGxvbmduYW1lIGFzIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4KLSAgICAgICAgIiIiCi0gICAgICAgIG5hbWUgKz0gTlVMCi0KLSAgICAgICAgdGFyaW5mbyA9IFRhckluZm8oKQotICAgICAgICB0YXJpbmZvLm5hbWUgPSAiLi8uL0BMb25nTGluayIKLSAgICAgICAgdGFyaW5mby50eXBlID0gdHlwZQotICAgICAgICB0YXJpbmZvLm1vZGUgPSAwCi0gICAgICAgIHRhcmluZm8uc2l6ZSA9IGxlbihuYW1lKQotCi0gICAgICAgICMgd3JpdGUgZXh0ZW5kZWQgaGVhZGVyCi0gICAgICAgIHNlbGYuZmlsZW9iai53cml0ZSh0YXJpbmZvLnRvYnVmKCkpCi0gICAgICAgIHNlbGYub2Zmc2V0ICs9IEJMT0NLU0laRQotICAgICAgICAjIHdyaXRlIG5hbWUgYmxvY2tzCi0gICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShuYW1lKQotICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZCh0YXJpbmZvLnNpemUsIEJMT0NLU0laRSkKLSAgICAgICAgaWYgcmVtYWluZGVyID4gMDoKLSAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShOVUwgKiAoQkxPQ0tTSVpFIC0gcmVtYWluZGVyKSkKLSAgICAgICAgICAgIGJsb2NrcyArPSAxCi0gICAgICAgIHNlbGYub2Zmc2V0ICs9IGJsb2NrcyAqIEJMT0NLU0laRQotCiAgICAgZGVmIF9kYmcoc2VsZiwgbGV2ZWwsIG1zZyk6CiAgICAgICAgICIiIldyaXRlIGRlYnVnZ2luZyBvdXRwdXQgdG8gc3lzLnN0ZGVyci4KICAgICAgICAgIiIiCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9SRUFETUUgYi9MaWIvdGVzdC9SRUFETUUKaW5kZXggNDk2YzQwMC4uMjdmNjk2YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvUkVBRE1FCisrKyBiL0xpYi90ZXN0L1JFQURNRQpAQCAtMzc5LDggKzM3OSw4IEBACiAgICAgICBwb2ludCBudW1iZXJzIHdoZW4geW91IGV4cGVjdCB0aGVtIHRvIG9ubHkgYmUgYXBwcm94aW1hdGVseSBlcXVhbAogICAgICAgd2l0aGluZyBhIGZ1enogZmFjdG9yIChgYHRlc3Rfc3VwcG9ydC5GVVpaYGAsIHdoaWNoIGRlZmF1bHRzIHRvIDFlLTYpLgogCi0gICAgKiBgYGNoZWNrX3N5bnRheChzdGF0ZW1lbnQpYGAgLSBtYWtlIHN1cmUgdGhhdCB0aGUgc3RhdGVtZW50IGlzICpub3QqCi0gICAgICBjb3JyZWN0IFB5dGhvbiBzeW50YXguCisgICAgKiBgYGNoZWNrX3N5bnRheF9lcnJvcih0ZXN0Y2FzZSwgc3RhdGVtZW50KWBgIC0gbWFrZSBzdXJlIHRoYXQgdGhlCisgICAgICBzdGF0ZW1lbnQgaXMgKm5vdCogY29ycmVjdCBQeXRob24gc3ludGF4LgogCiAKIFB5dGhvbiBhbmQgQyBzdGF0ZW1lbnQgY292ZXJhZ2UgcmVzdWx0cyBhcmUgY3VycmVudGx5IGF2YWlsYWJsZSBhdApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY3Jhc2hlcnMvYm9ndXNfc3JlX2J5dGVjb2RlLnB5IGIvTGliL3Rlc3QvY3Jhc2hlcnMvYm9ndXNfc3JlX2J5dGVjb2RlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZmM3MzAKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9jcmFzaGVycy9ib2d1c19zcmVfYnl0ZWNvZGUucHkKQEAgLTAsMCArMSw0NyBAQAorIiIiCitUaGUgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZSBpbiAnX3NyZScgY2FuIHNlZ2ZhdWx0IHdoZW4gaW50ZXJwcmV0aW5nCitib2d1cyBieXRlY29kZS4KKworSXQgaXMgdW5jbGVhciB3aGV0aGVyIHRoaXMgaXMgYSByZWFsIGJ1ZyBvciBhICJ3b24ndCBmaXgiIGNhc2UgbGlrZQorYm9ndXNfY29kZV9vYmoucHksIGJlY2F1c2UgaXQgcmVxdWlyZXMgYnl0ZWNvZGUgdGhhdCBpcyBidWlsdCBieSBoYW5kLAorYXMgb3Bwb3NlZCB0byBjb21waWxlZCBieSAncmUnIGZyb20gYSBzdHJpbmctc291cmNlIHJlZ2V4cC4gIFRoZQorZGlmZmVyZW5jZSB3aXRoIGJvZ3VzX2NvZGVfb2JqLCB0aG91Z2gsIGlzIHRoYXQgdGhlIG9ubHkgZXhpc3RpbmcgcmVnZXhwCitjb21waWxlciBpcyB3cml0dGVuIGluIFB5dGhvbiwgc28gdGhhdCB0aGUgQyBjb2RlIGhhcyBubyBjaG9pY2UgYnV0CithY2NlcHQgYXJiaXRyYXJ5IGJ5dGVjb2RlIGZyb20gUHl0aG9uLWxldmVsLgorCitUaGUgdGVzdCBiZWxvdyBidWlsZHMgYW5kIHJ1bnMgcmFuZG9tIGJ5dGVjb2RlcyB1bnRpbCAnbWF0Y2gnIGNyYXNoZXMKK1B5dGhvbi4gIEkgaGF2ZSBub3QgaW52ZXN0aWdhdGVkIHdoeSBleGFjdGx5IHNlZ2ZhdWx0cyBvY2N1ciBub3IgaG93CitoYXJkIHRoZXkgd291bGQgYmUgdG8gZml4LiAgSGVyZSBhcmUgYSBmZXcgZXhhbXBsZXMgb2YgJ2NvZGUnIHRoYXQKK3NlZ2ZhdWx0IGZvciBtZToKKworICAgIFsyMSwgNTA4MTQsIDgsIDI5LCAxNl0KKyAgICBbMjEsIDM5NjcsIDI2LCAxMCwgMjMsIDU0MTEzXQorICAgIFsyOSwgMjMsIDAsIDIsIDVdCisgICAgWzMxLCA2NDM1MSwgMCwgMjgsIDMsIDIyMjgxLCAyMCwgNDQ2MywgOSwgMjUsIDU5MTU0LCAxNTI0NSwgMiwKKyAgICAgICAgICAgICAgICAgIDE2MzQzLCAzLCAxMTYwMCwgMjQzODAsIDEwLCAzNzU1NiwgMTAsIDMxLCAxNSwgMzFdCisKK0hlcmUgaXMgYWxzbyBhICdjb2RlJyB0aGF0IHRyaWdnZXJzIGFuIGluZmluaXRlIHVuaW50ZXJydXB0aWJsZSBsb29wOgorCisgICAgWzI5LCAxLCA4LCAyMSwgMSwgNDMwODMsIDZdCisKKyIiIgorCitpbXBvcnQgX3NyZSwgcmFuZG9tCisKK2RlZiBwaWNrKCk6CisgICAgbiA9IHJhbmRvbS5yYW5kcmFuZ2UoLTY1NTM2LCA2NTUzNikKKyAgICBpZiBuIDwgMDoKKyAgICAgICAgbiAmPSAzMQorICAgIHJldHVybiBuCisKK3NzID0gWyIiLCAid29ybGQiLCAieCIgKiA1MDBdCisKK3doaWxlIDE6CisgICAgY29kZSA9IFtwaWNrKCkgZm9yIGkgaW4gcmFuZ2UocmFuZG9tLnJhbmRyYW5nZSg1LCAyNSkpXQorICAgIHByaW50IGNvZGUKKyAgICBwYXQgPSBfc3JlLmNvbXBpbGUoTm9uZSwgMCwgY29kZSkKKyAgICBmb3IgcyBpbiBzczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGF0Lm1hdGNoKHMpCisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jcmFzaGVycy9pbmZpbml0ZV9sb29wX3JlLnB5IGIvTGliL3Rlc3QvY3Jhc2hlcnMvaW5maW5pdGVfbG9vcF9yZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWVjYzU2Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvY3Jhc2hlcnMvaW5maW5pdGVfbG9vcF9yZS5weQpAQCAtMCwwICsxLDE2IEBACisKKyMgVGhpcyB3YXMgdGFrZW4gZnJvbSBodHRwOi8vcHl0aG9uLm9yZy9zZi8xNTQxNjk3CisjIEl0J3Mgbm90IHRlY2huaWNhbGx5IGEgY3Jhc2hlci4gIEl0IG1heSBub3QgZXZlbiB0cnVseSBiZSBpbmZpbml0ZSwKKyMgaG93ZXZlciwgSSBoYXZlbid0IHdhaXRlZCBhIGxvbmcgdGltZSB0byBzZWUgdGhlIHJlc3VsdC4gIEl0IHRha2VzCisjIDEwMCUgb2YgQ1BVIHdoaWxlIHJ1bm5pbmcgdGhpcyBhbmQgc2hvdWxkIGJlIGZpeGVkLgorCitpbXBvcnQgcmUKK3N0YXJ0dGFnID0gcmUuY29tcGlsZShyJzxbYS16QS1aXVstXy46YS16QS1aMC05XSpccyooJworICAgICAgICByJ1xzKihbYS16QS1aX11bLTouYS16QS1aXzAtOV0qKShccyo9XHMqJworICAgICAgICByJyhcJ1teXCddKlwnfCJbXiJdKiJ8Wy1hLXpBLVowLTkuLyw6OysqJT8hJiRcKFwpXyM9fkBdJworICAgICAgICByJ1tdW1wtYS16QS1aMC05Li8sOjsrKiU/ISYkXChcKV8jPX5cJyJAXSooPz1bXHM+LzxdKSkpPycKKyAgICByJykqXHMqLz9ccyooPz1bPD5dKScpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgZm9vID0gJzx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHN0eWxlPSJib3JkZXItY29sbGFwc2UnCisgICAgc3RhcnR0YWcubWF0Y2goZm9vKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY3Jhc2hlcnMvbG9vc2luZ19tcm9fcmVmLnB5IGIvTGliL3Rlc3QvY3Jhc2hlcnMvbG9vc2luZ19tcm9fcmVmLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYjgwNDcKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9jcmFzaGVycy9sb29zaW5nX21yb19yZWYucHkKQEAgLTAsMCArMSwzNiBAQAorIiIiCitUaGVyZSBpcyBhIHdheSB0byBwdXQga2V5cyBvZiBhbnkgdHlwZSBpbiBhIHR5cGUncyBkaWN0aW9uYXJ5LgorSSB0aGluayB0aGlzIGFsbG93cyB2YXJpb3VzIGtpbmRzIG9mIGNyYXNoZXMsIGJ1dCBzbyBmYXIgSSBoYXZlIG9ubHkKK2ZvdW5kIGEgY29udm9sdXRlZCBhdHRhY2sgb2YgX1B5VHlwZV9Mb29rdXAoKSwgd2hpY2ggdXNlcyB0aGUgbXJvIG9mIHRoZQordHlwZSB3aXRob3V0IGhvbGRpbmcgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIGl0LiAgUHJvYmFibHkgd29ya3Mgd2l0aAorc3VwZXIuX19nZXRhdHRyaWJ1dGVfXygpIHRvbywgd2hpY2ggdXNlcyB0aGUgc2FtZSBraW5kIG9mIGNvZGUuCisiIiIKKworY2xhc3MgTXlLZXkob2JqZWN0KToKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBoYXNoKCdteWtleScpCisKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICMgdGhlIGZvbGxvd2luZyBsaW5lIGRlY3JlZnMgdGhlIHByZXZpb3VzIFguX19tcm9fXworICAgICAgICBYLl9fYmFzZXNfXyA9IChCYXNlMiwpCisgICAgICAgICMgdHJhc2ggYWxsIHR1cGxlcyBvZiBsZW5ndGggMywgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGl0ZW1zIG9mCisgICAgICAgICMgdGhlIHByZXZpb3VzIFguX19tcm9fXyBhcmUgcmVhbGx5IGdhcmJhZ2UKKyAgICAgICAgeiA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwMDApOgorICAgICAgICAgICAgei5hcHBlbmQoKGksIE5vbmUsIE5vbmUpKQorICAgICAgICByZXR1cm4gLTEKKworCitjbGFzcyBCYXNlKG9iamVjdCk6CisgICAgbXlrZXkgPSAnZnJvbSBCYXNlJworCitjbGFzcyBCYXNlMihvYmplY3QpOgorICAgIG15a2V5ID0gJ2Zyb20gQmFzZTInCisKK2NsYXNzIFgoQmFzZSk6CisgICAgIyB5b3UgY2FuJ3QgYWRkIGEgbm9uLXN0cmluZyBrZXkgdG8gWC5fX2RpY3RfXywgYnV0IGl0IGNhbiBiZQorICAgICMgdGhlcmUgZnJvbSB0aGUgYmVnaW5uaW5nIDotKQorICAgIGxvY2FscygpW015S2V5KCldID0gNQorCitwcmludCBYLm15a2V5CisjIEkgZ2V0IGEgc2VnZmF1bHQsIG9yIGEgc2xpZ2h0bHkgd3JvbmcgYXNzZXJ0aW9uIGVycm9yIGluIGEgZGVidWcgYnVpbGQuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9saXN0X3Rlc3RzLnB5IGIvTGliL3Rlc3QvbGlzdF90ZXN0cy5weQppbmRleCA0NTNjNTFjLi5mYzFhNmMzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9saXN0X3Rlc3RzLnB5CisrKyBiL0xpYi90ZXN0L2xpc3RfdGVzdHMucHkKQEAgLTI2OSw3ICsyNjksNiBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuaW5zZXJ0KQogCiAgICAgZGVmIHRlc3RfcG9wKHNlbGYpOgotICAgICAgICBmcm9tIGRlY2ltYWwgaW1wb3J0IERlY2ltYWwKICAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFstMSwgMCwgMV0pCiAgICAgICAgIGEucG9wKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbLTEsIDBdKQpAQCAtMjgxLDggKzI4MCw2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGEucG9wKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEucG9wLCA0MiwgNDIpCiAgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMCwgMTAsIDIwLCAzMCwgNDBdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEucG9wKERlY2ltYWwoMikpLCAyMCkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYS5wb3AsIERlY2ltYWwoMjUpKQogCiAgICAgZGVmIHRlc3RfcmVtb3ZlKHNlbGYpOgogICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzAsIDAsIDFdKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfTWltZVdyaXRlciBiL0xpYi90ZXN0L291dHB1dC90ZXN0X01pbWVXcml0ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliOTdkOTMuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfTWltZVdyaXRlcgorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi10ZXN0X01pbWVXcml0ZXIKLUZyb206IGJ3YXJzYXdAY25yaS5yZXN0b24udmEudXMKLURhdGU6IE1vbiBGZWIgMTIgMTc6MjE6NDggRVNUIDE5OTYKLVRvOiBrc3Mtc3VibWl0QGNucmkucmVzdG9uLnZhLnVzCi1NSU1FLVZlcnNpb246IDEuMAotQ29udGVudC1UeXBlOiBtdWx0aXBhcnQva25vd2JvdDsKLSAgICBib3VuZGFyeT0iODAxc3BhbTk5OSI7Ci0gICAgdmVyc2lvbj0iMC4xIgotCi1UaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgotCi0tLTgwMXNwYW05OTkKLUNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2tub3dib3QtbWV0YWRhdGE7Ci0gICAgYm91bmRhcnk9IjgwMnNwYW05OTkiCi0KLQotLS04MDJzcGFtOTk5Ci1Db250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyCi1LUC1NZXRhZGF0YS1UeXBlOiBzaW1wbGUKLUtQLUFjY2VzczogcmVhZC1vbmx5Ci0KLUtQTUQtSW50ZXJwcmV0ZXI6IHB5dGhvbgotS1BNRC1JbnRlcnByZXRlci1WZXJzaW9uOiAxLjMKLUtQTUQtT3duZXItTmFtZTogQmFycnkgV2Fyc2F3Ci1LUE1ELU93bmVyLVJlbmRlenZvdXM6IGJ3YXJzYXdAY25yaS5yZXN0b24udmEudXMKLUtQTUQtSG9tZS1LU1M6IGtzcy5jbnJpLnJlc3Rvbi52YS51cwotS1BNRC1JZGVudGlmaWVyOiBoZGw6Ly9jbnJpLmtzcy9teV9maXJzdF9rbm93Ym90Ci1LUE1ELUxhdW5jaC1EYXRlOiBNb24gRmViIDEyIDE2OjM5OjAzIEVTVCAxOTk2Ci0KLS0tODAyc3BhbTk5OQotQ29udGVudC1UeXBlOiB0ZXh0L2lzbAotS1AtTWV0YWRhdGEtVHlwZTogY29tcGxleAotS1AtTWV0YWRhdGEtS2V5OiBjb25uZWN0aW9uCi1LUC1BY2Nlc3M6IHJlYWQtb25seQotS1AtQ29ubmVjdGlvbi1EZXNjcmlwdGlvbjogQmFycnkncyBCaWcgQmFzcyBCdXNpbmVzcwotS1AtQ29ubmVjdGlvbi1JZDogQjQKLUtQLUNvbm5lY3Rpb24tRGlyZWN0aW9uOiBjbGllbnQKLQotSU5URVJGQUNFIFNlbGxlci0xOwotCi1UWVBFIFNlbGxlciA9IE9CSkVDVAotICAgIERPQ1VNRU5UQVRJT04gIkEgc2ltcGxlIFNlbGxlciBpbnRlcmZhY2UgdG8gdGVzdCBJTFUiCi0gICAgTUVUSE9EUwotICAgICAgICAgICAgcHJpY2UoKTpJTlRFR0VSLAotICAgIEVORDsKLQotLS04MDJzcGFtOTk5Ci1Db250ZW50LVR5cGU6IG1lc3NhZ2UvZXh0ZXJuYWwtYm9keTsKLSAgICBhY2Nlc3MtdHlwZT0iVVJMIjsKLSAgICBVUkw9ImhkbDovL2Nucmkua3NzL2dlbmVyaWMta25vd2JvdCIKLQotQ29udGVudC1UeXBlOiB0ZXh0L2lzbAotS1AtTWV0YWRhdGEtVHlwZTogY29tcGxleAotS1AtTWV0YWRhdGEtS2V5OiBnZW5lcmljLWludGVyZmFjZQotS1AtQWNjZXNzOiByZWFkLW9ubHkKLUtQLUNvbm5lY3Rpb24tRGVzY3JpcHRpb246IEdlbmVyaWMgSW50ZXJmYWNlIGZvciBBbGwgS25vd2JvdHMKLUtQLUNvbm5lY3Rpb24tSWQ6IGdlbmVyaWMta3AKLUtQLUNvbm5lY3Rpb24tRGlyZWN0aW9uOiBjbGllbnQKLQotCi0tLTgwMnNwYW05OTktLQotCi0tLTgwMXNwYW05OTkKLUNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2tub3dib3QtY29kZTsKLSAgICBib3VuZGFyeT0iODAzc3BhbTk5OSIKLQotCi0tLTgwM3NwYW05OTkKLUNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgotS1AtTW9kdWxlLU5hbWU6IEJ1eWVyS1AKLQotY2xhc3MgQnV5ZXI6Ci0gICAgZGVmIF9fc2V0dXBfXyhzZWxmLCBtYXhwcmljZSk6Ci0gICAgICAgIHNlbGYuX21heHByaWNlID0gbWF4cHJpY2UKLQotICAgIGRlZiBfX21haW5fXyhzZWxmLCBrb3MpOgotICAgICAgICAiIiJFbnRyeSBwb2ludCB1cG9uIGFycml2YWwgYXQgYSBuZXcgS09TLiIiIgotICAgICAgICBicm9rZXIgPSBrb3MuYnJva2VyKCkKLSAgICAgICAgIyBCNCA9PSBCYXJyeSdzIEJpZyBCYXNzIEJ1c2luZXNzIDotKQotICAgICAgICBzZWxsZXIgPSBicm9rZXIubG9va3VwKCdTZWxsZXJfMS5TZWxsZXInLCAnQjQnKQotICAgICAgICBpZiBzZWxsZXI6Ci0gICAgICAgICAgICBwcmljZSA9IHNlbGxlci5wcmljZSgpCi0gICAgICAgICAgICBwcmludCAnU2VsbGVyIHdhbnRzICQnLCBwcmljZSwgJy4uLiAnCi0gICAgICAgICAgICBpZiBwcmljZSA+IHNlbGYuX21heHByaWNlOgotICAgICAgICAgICAgICAgIHByaW50ICd0b28gbXVjaCEnCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHByaW50ICJJJ2xsIHRha2UgaXQhIgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQgJ25vIHNlbGxlciBmb3VuZCBoZXJlJwotCi0tLTgwM3NwYW05OTktLQotCi0tLTgwMXNwYW05OTkKLUNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2tub3dib3Qtc3RhdGU7Ci0gICAgYm91bmRhcnk9IjgwNHNwYW05OTkiCi1LUC1NYWluLU1vZHVsZTogbWFpbgotCi0KLS0tODA0c3BhbTk5OQotQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCi1LUC1Nb2R1bGUtTmFtZTogbWFpbgotCi0jIGluc3RhbnRpYXRlIGEgYnV5ZXIgaW5zdGFuY2UgYW5kIHB1dCBpdCBpbiBhIG1hZ2ljIHBsYWNlIGZvciB0aGUgS09TCi0jIHRvIGZpbmQuCi1fX2twX18gPSBCdXllcigpCi1fX2twX18uX19zZXR1cF9fKDUwMCkKLQotLS04MDRzcGFtOTk5LS0KLQotLS04MDFzcGFtOTk5LS0KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L291dHB1dC90ZXN0X2NnaSBiL0xpYi90ZXN0L291dHB1dC90ZXN0X2NnaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZlZGRmYS4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9jZ2kKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi10ZXN0X2NnaQotJycgPT4gW10KLScmJyA9PiBbXQotJyYmJyA9PiBbXQotJz0nID0+IFsoJycsICcnKV0KLSc9YScgPT4gWygnJywgJ2EnKV0KLSdhJyA9PiBbKCdhJywgJycpXQotJ2E9JyA9PiBbKCdhJywgJycpXQotJ2E9JyA9PiBbKCdhJywgJycpXQotJyZhPWInID0+IFsoJ2EnLCAnYicpXQotJ2E9YStiJmI9YitjJyA9PiBbKCdhJywgJ2EgYicpLCAoJ2InLCAnYiBjJyldCi0nYT0xJmE9MicgPT4gWygnYScsICcxJyksICgnYScsICcyJyldCi0nJwotJyYnCi0nJiYnCi0nOycKLSc7JjsnCi0nPScKLSc9Jj0nCi0nPTs9JwotJz1hJwotJyY9YScKLSc9YSYnCi0nPSZhJwotJ2I9YScKLSdiKz1hJwotJ2E9Yj1hJwotJ2E9K2I9YScKLScmYj1hJwotJ2ImPWEnCi0nYT1hK2ImYj1iK2MnCi0nYT1hK2ImYT1iK2EnCi0neD0xJnk9Mi4wJno9Mi0zLiUyYjAnCi0neD0xO3k9Mi4wJno9Mi0zLiUyYjAnCi0neD0xO3k9Mi4wO3o9Mi0zLiUyYjAnCi0nSGJjNTE2MTE2OGM1NDIzMzM2MzMzMTVkZWUxMTgyMjI3OmtleV9zdG9yZV9zZXFpZD00MDAwMDYmY3V5ZXI9ciZ2aWV3PWJ1c3RvbWVyJm9yZGVyX2lkPTBiYjJlMjQ4NjM4ODMzZDQ4Y2I3ZmVkMzAwMDAwZjFiJmV4cGlyZT05NjQ1NDYyNjMmbG9iYWxlPWVuLVVTJmtpZD0xMzAwMDMuMzAwMDM4JnNzPWVudicKLSdncm91cF9pZD01NDcwJnNldD1jdXN0b20mX2Fzc2lnbmVkX3RvPTMxMzkyJl9zdGF0dXM9MSZfY2F0ZWdvcnk9MTAwJlNVQk1JVD1Ccm93c2UnCi1UZXN0aW5nIGxvZwotVGVzdGluZyBpbml0bG9nIDEKLVRlc3RpbmcgbG9nIDIKLVRlc3QgRmllbGRTdG9yYWdlIG1ldGhvZHMgdGhhdCB1c2UgcmVhZGxpbmUKLVRlc3QgYmFzaWMgRmllbGRTdG9yYWdlIG11bHRpcGFydCBwYXJzaW5nCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9jb29raWUgYi9MaWIvdGVzdC9vdXRwdXQvdGVzdF9jb29raWUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YzczMjguLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfY29va2llCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotdGVzdF9jb29raWUKLTxTaW1wbGVDb29raWU6IGNoaXBzPSdhaG95JyB2aWVubmE9J2Zpbmdlcic+Ci1TZXQtQ29va2llOiBjaGlwcz1haG95Ci1TZXQtQ29va2llOiB2aWVubmE9ZmluZ2VyCi0gIGNoaXBzICdhaG95JyAnYWhveScKLVNldC1Db29raWU6IGNoaXBzPWFob3kKLSAgdmllbm5hICdmaW5nZXInICdmaW5nZXInCi1TZXQtQ29va2llOiB2aWVubmE9ZmluZ2VyCi08U2ltcGxlQ29va2llOiBrZWVibGVyPSdFPW1jMjsgTD0iTG92ZXMiOyBmdWRnZT1cbjsnPgotU2V0LUNvb2tpZToga2VlYmxlcj0iRT1tYzI7IEw9XCJMb3Zlc1wiOyBmdWRnZT1cMDEyOyIKLSAga2VlYmxlciAnRT1tYzI7IEw9IkxvdmVzIjsgZnVkZ2U9XG47JyAnRT1tYzI7IEw9IkxvdmVzIjsgZnVkZ2U9XG47JwotU2V0LUNvb2tpZToga2VlYmxlcj0iRT1tYzI7IEw9XCJMb3Zlc1wiOyBmdWRnZT1cMDEyOyIKLTxTaW1wbGVDb29raWU6IGtlZWJsZXI9J0U9bWMyJz4KLVNldC1Db29raWU6IGtlZWJsZXI9RT1tYzIKLSAga2VlYmxlciAnRT1tYzInICdFPW1jMicKLVNldC1Db29raWU6IGtlZWJsZXI9RT1tYzIKLVNldC1Db29raWU6IEN1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgUGF0aD0vYWNtZQotCi0gICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICAgICAgPCEtLSBiZWdpbiBoaWRpbmcKLSAgICAgICAgZG9jdW1lbnQuY29va2llID0gIkN1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgUGF0aD0vYWNtZTsgVmVyc2lvbj0xIjsKLSAgICAgICAgLy8gZW5kIGhpZGluZyAtLT4KLSAgICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgIAotCi0gICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICAgICAgPCEtLSBiZWdpbiBoaWRpbmcKLSAgICAgICAgZG9jdW1lbnQuY29va2llID0gIkN1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgUGF0aD0vYWNtZSI7Ci0gICAgICAgIC8vIGVuZCBoaWRpbmcgLS0+Ci0gICAgICAgIDwvc2NyaXB0PgotICAgICAgICAKLUlmIGFueXRoaW5nIGJsb3dzIHVwIGFmdGVyIHRoaXMgbGluZSwgaXQncyBmcm9tIENvb2tpZSdzIGRvY3Rlc3QuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9nbG9iYWwgYi9MaWIvdGVzdC9vdXRwdXQvdGVzdF9nbG9iYWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MjdhMjkuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfZ2xvYmFsCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi10ZXN0X2dsb2JhbAotZ290IFN5bnRheEVycm9yIGFzIGV4cGVjdGVkCi1nb3QgU3ludGF4RXJyb3IgYXMgZXhwZWN0ZWQKLWdvdCBTeW50YXhFcnJvciBhcyBleHBlY3RlZAotYXMgZXhwZWN0ZWQsIG5vIFN5bnRheEVycm9yCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9ncmFtbWFyIGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfZ3JhbW1hcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzMzI3Ni4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9ncmFtbWFyCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotdGVzdF9ncmFtbWFyCi0xLiBQYXJzZXIKLTEuMSBUb2tlbnMKLTEuMS4xIEJhY2tzbGFzaGVzCi0xLjEuMiBOdW1lcmljIGxpdGVyYWxzCi0xLjEuMi4xIFBsYWluIGludGVnZXJzCi0xLjEuMi4yIExvbmcgaW50ZWdlcnMKLTEuMS4yLjMgRmxvYXRpbmcgcG9pbnQKLTEuMS4zIFN0cmluZyBsaXRlcmFscwotMS4xLjQgRWxsaXBzaXMgbGl0ZXJhbAotMS4yIEdyYW1tYXIKLXNpbmdsZV9pbnB1dAotZmlsZV9pbnB1dAotZXhwcl9pbnB1dAotZXZhbF9pbnB1dAotZnVuY2RlZgotbGFtYmRlZgotc2ltcGxlX3N0bXQKLWV4cHJfc3RtdAotcHJpbnRfc3RtdAotMSAyIDMKLTEgMiAzCi0xIDEgMQotZXh0ZW5kZWQgcHJpbnRfc3RtdAotMSAyIDMKLTEgMiAzCi0xIDEgMQotaGVsbG8gd29ybGQKLWRlbF9zdG10Ci1wYXNzX3N0bXQKLWZsb3dfc3RtdAotYnJlYWtfc3RtdAotY29udGludWVfc3RtdAotY29udGludWUgKyB0cnkvZXhjZXB0IG9rCi1jb250aW51ZSArIHRyeS9maW5hbGx5IG9rCi10ZXN0aW5nIGNvbnRpbnVlIGFuZCBicmVhayBpbiB0cnkvZXhjZXB0IGluIGxvb3AKLXJldHVybl9zdG10Ci15aWVsZF9zdG10Ci1yYWlzZV9zdG10Ci1pbXBvcnRfbmFtZQotaW1wb3J0X2Zyb20KLWdsb2JhbF9zdG10Ci1hc3NlcnRfc3RtdAotaWZfc3RtdAotd2hpbGVfc3RtdAotZm9yX3N0bXQKLXRyeV9zdG10Ci1zdWl0ZQotdGVzdAotY29tcGFyaXNvbgotYmluYXJ5IG1hc2sgb3BzCi1zaGlmdCBvcHMKLWFkZGl0aXZlIG9wcwotbXVsdGlwbGljYXRpdmUgb3BzCi11bmFyeSBvcHMKLXNlbGVjdG9ycwotCi1bMSwgKDEsKSwgKDEsIDIpLCAoMSwgMiwgMyldCi1hdG9tcwotY2xhc3NkZWYKLVsnQXBwbGUnLCAnQmFuYW5hJywgJ0NvY28gIG51dCddCi1bMywgNiwgOSwgMTIsIDE1XQotWzMsIDQsIDVdCi1bKDEsICdBcHBsZScpLCAoMSwgJ0JhbmFuYScpLCAoMSwgJ0NvY29udXQnKSwgKDIsICdBcHBsZScpLCAoMiwgJ0JhbmFuYScpLCAoMiwgJ0NvY29udXQnKSwgKDMsICdBcHBsZScpLCAoMywgJ0JhbmFuYScpLCAoMywgJ0NvY29udXQnKSwgKDQsICdBcHBsZScpLCAoNCwgJ0JhbmFuYScpLCAoNCwgJ0NvY29udXQnKSwgKDUsICdBcHBsZScpLCAoNSwgJ0JhbmFuYScpLCAoNSwgJ0NvY29udXQnKV0KLVsoMSwgJ0JhbmFuYScpLCAoMSwgJ0NvY29udXQnKSwgKDIsICdCYW5hbmEnKSwgKDIsICdDb2NvbnV0JyksICgzLCAnQmFuYW5hJyksICgzLCAnQ29jb251dCcpLCAoNCwgJ0JhbmFuYScpLCAoNCwgJ0NvY29udXQnKSwgKDUsICdCYW5hbmEnKSwgKDUsICdDb2NvbnV0JyldCi1bWzFdLCBbMSwgMV0sIFsxLCAyLCA0XSwgWzEsIDMsIDksIDI3XSwgWzEsIDQsIDE2LCA2NCwgMjU2XV0KLVtGYWxzZSwgRmFsc2UsIEZhbHNlXQotW1sxLCAyXSwgWzMsIDRdLCBbNSwgNl1dCi1bKCdCb2VpbmcnLCAnQWlybGluZXInKSwgKCdCb2VpbmcnLCAnRW5naW5lJyksICgnRm9yZCcsICdFbmdpbmUnKSwgKCdNYWNkb25hbGRzJywgJ0NoZWVzZWJ1cmdlcicpXQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfaHR0cGxpYiBiL0xpYi90ZXN0L291dHB1dC90ZXN0X2h0dHBsaWIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMmI4NzYuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfaHR0cGxpYgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXRlc3RfaHR0cGxpYgotcmVwbHk6ICdIVFRQLzEuMSAyMDAgT2tcclxuJwotVGV4dAotcmVwbHk6ICdIVFRQLzEuMSA0MDAuMTAwIE5vdCBPa1xyXG4nCi1CYWRTdGF0dXNMaW5lIHJhaXNlZCBhcyBleHBlY3RlZAotSW52YWxpZFVSTCByYWlzZWQgYXMgZXhwZWN0ZWQKLUludmFsaWRVUkwgcmFpc2VkIGFzIGV4cGVjdGVkCi1yZXBseTogJ0hUVFAvMS4xIDIwMCBPS1xyXG4nCi1oZWFkZXI6IFNldC1Db29raWU6IEN1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIgotaGVhZGVyOiBTZXQtQ29va2llOiBQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiCi1yZXBseTogJ0hUVFAvMS4xIDIwMCBPS1xyXG4nCi1oZWFkZXI6IENvbnRlbnQtTGVuZ3RoOiAxNDQzMgotCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9tYXRoIGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfbWF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM4Zjc3Yy4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9tYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotdGVzdF9tYXRoCi1tYXRoIG1vZHVsZSwgdGVzdGluZyB3aXRoIGVwcyAxZS0wNQotY29uc3RhbnRzCi1hY29zCi1hc2luCi1hdGFuCi1hdGFuMgotY2VpbAotY29zCi1jb3NoCi1kZWdyZWVzCi1leHAKLWZhYnMKLWZsb29yCi1mbW9kCi1mcmV4cAotaHlwb3QKLWxkZXhwCi1sb2cKLWxvZzEwCi1tb2RmCi1wb3cKLXJhZGlhbnMKLXNpbgotc2luaAotc3FydAotdGFuCi10YW5oCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9tbWFwIGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfbW1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1Zjg0MC4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9tbWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotdGVzdF9tbWFwCi08dHlwZSAnbW1hcC5tbWFwJz4KLSAgUG9zaXRpb24gb2YgZm9vOiAxLjAgcGFnZXMKLSAgTGVuZ3RoIG9mIGZpbGU6IDIuMCBwYWdlcwotICBDb250ZW50cyBvZiBieXRlIDA6ICdceDAwJwotICBDb250ZW50cyBvZiBmaXJzdCAzIGJ5dGVzOiAnXHgwMFx4MDBceDAwJwotCi0gIE1vZGlmeWluZyBmaWxlJ3MgY29udGVudC4uLgotICBDb250ZW50cyBvZiBieXRlIDA6ICczJwotICBDb250ZW50cyBvZiBmaXJzdCAzIGJ5dGVzOiAnM1x4MDBceDAwJwotICBDb250ZW50cyBvZiBzZWNvbmQgcGFnZTogJ1x4MDBmb29iYXJceDAwJwotICBSZWdleCBtYXRjaCBvbiBtbWFwIChwYWdlIHN0YXJ0LCBsZW5ndGggb2YgbWF0Y2gpOiAxLjAgNgotICBTZWVrIHRvIHplcm90aCBieXRlCi0gIFNlZWsgdG8gNDJuZCBieXRlCi0gIFNlZWsgdG8gbGFzdCBieXRlCi0gIFRyeSB0byBzZWVrIHRvIG5lZ2F0aXZlIHBvc2l0aW9uLi4uCi0gIFRyeSB0byBzZWVrIGJleW9uZCBlbmQgb2YgbW1hcC4uLgotICBUcnkgdG8gc2VlayB0byBuZWdhdGl2ZSBwb3NpdGlvbi4uLgotICBBdHRlbXB0aW5nIHJlc2l6ZSgpCi0gIENyZWF0aW5nIDEwIGJ5dGUgdGVzdCBkYXRhIGZpbGUuCi0gIE9wZW5pbmcgbW1hcCB3aXRoIGFjY2Vzcz1BQ0NFU1NfUkVBRAotICBFbnN1cmluZyB0aGF0IHJlYWRvbmx5IG1tYXAgY2FuJ3QgYmUgc2xpY2UgYXNzaWduZWQuCi0gIEVuc3VyaW5nIHRoYXQgcmVhZG9ubHkgbW1hcCBjYW4ndCBiZSBpdGVtIGFzc2lnbmVkLgotICBFbnN1cmluZyB0aGF0IHJlYWRvbmx5IG1tYXAgY2FuJ3QgYmUgd3JpdGUoKSB0by4KLSAgRW5zdXJpbmcgdGhhdCByZWFkb25seSBtbWFwIGNhbid0IGJlIHdyaXRlX2J5dGUoKSB0by4KLSAgRW5zdXJpbmcgdGhhdCByZWFkb25seSBtbWFwIGNhbid0IGJlIHJlc2l6ZWQuCi0gIE9wZW5pbmcgbW1hcCB3aXRoIHNpemUgdG9vIGJpZwotICBPcGVuaW5nIG1tYXAgd2l0aCBhY2Nlc3M9QUNDRVNTX1dSSVRFCi0gIE1vZGlmeWluZyB3cml0ZS10aHJvdWdoIG1lbW9yeSBtYXAuCi0gIE9wZW5pbmcgbW1hcCB3aXRoIGFjY2Vzcz1BQ0NFU1NfQ09QWQotICBNb2RpZnlpbmcgY29weS1vbi13cml0ZSBtZW1vcnkgbWFwLgotICBFbnN1cmluZyBjb3B5LW9uLXdyaXRlIG1hcHMgY2Fubm90IGJlIHJlc2l6ZWQuCi0gIEVuc3VyaW5nIGludmFsaWQgYWNjZXNzIHBhcmFtZXRlciByYWlzZXMgZXhjZXB0aW9uLgotICBUcnkgb3BlbmluZyBhIGJhZCBmaWxlIGRlc2NyaXB0b3IuLi4KLSAgRW5zdXJpbmcgdGhhdCBwYXNzaW5nIDAgYXMgbWFwIGxlbmd0aCBzZXRzIG1hcCBzaXplIHRvIGN1cnJlbnQgZmlsZSBzaXplLgotICBFbnN1cmluZyB0aGF0IHBhc3NpbmcgMCBhcyBtYXAgbGVuZ3RoIHNldHMgbWFwIHNpemUgdG8gY3VycmVudCBmaWxlIHNpemUuCi0gIGFub255bW91cyBtbWFwLm1tYXAoLTEsIFBBR0VTSVpFKS4uLgotIFRlc3QgcGFzc2VkCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9uaXMgYi9MaWIvdGVzdC9vdXRwdXQvdGVzdF9uaXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NTNhYjQuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfbmlzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi10ZXN0X25pcwotbmlzLm1hcHMoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3Rfb3Bjb2RlcyBiL0xpYi90ZXN0L291dHB1dC90ZXN0X29wY29kZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ODU1NzEuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3Rfb3Bjb2RlcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotdGVzdF9vcGNvZGVzCi0yLiBPcGNvZGVzCi1YWFggTm90IHlldCBmdWxseSBpbXBsZW1lbnRlZAotMi4xIHRyeSBpbnNpZGUgZm9yIGxvb3AKLTIuMiByYWlzZSBjbGFzcyBleGNlcHRpb25zCi0yLjMgY29tcGFyaW5nIGZ1bmN0aW9uIG9iamVjdHMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L291dHB1dC90ZXN0X29wZW5wdHkgYi9MaWIvdGVzdC9vdXRwdXQvdGVzdF9vcGVucHR5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGI4YjVlLi4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L291dHB1dC90ZXN0X29wZW5wdHkKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXRlc3Rfb3BlbnB0eQotUGluZyEKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L291dHB1dC90ZXN0X3BvbGwgYi9MaWIvdGVzdC9vdXRwdXQvdGVzdF9wb2xsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTYxZDM3Li4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L291dHB1dC90ZXN0X3BvbGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi10ZXN0X3BvbGwKLVJ1bm5pbmcgcG9sbCB0ZXN0IDEKLSBUaGlzIGlzIGEgdGVzdC4KLSBUaGlzIGlzIGEgdGVzdC4KLSBUaGlzIGlzIGEgdGVzdC4KLSBUaGlzIGlzIGEgdGVzdC4KLSBUaGlzIGlzIGEgdGVzdC4KLSBUaGlzIGlzIGEgdGVzdC4KLSBUaGlzIGlzIGEgdGVzdC4KLSBUaGlzIGlzIGEgdGVzdC4KLSBUaGlzIGlzIGEgdGVzdC4KLSBUaGlzIGlzIGEgdGVzdC4KLSBUaGlzIGlzIGEgdGVzdC4KLSBUaGlzIGlzIGEgdGVzdC4KLVBvbGwgdGVzdCAxIGNvbXBsZXRlCi1SdW5uaW5nIHBvbGwgdGVzdCAyCi1Qb2xsIHRlc3QgMiBjb21wbGV0ZQotUnVubmluZyBwb2xsIHRlc3QgMwotUG9sbCB0ZXN0IDMgY29tcGxldGUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L291dHB1dC90ZXN0X3JlZ2V4IGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfcmVnZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZWIyNmYuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfcmVnZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi10ZXN0X3JlZ2V4Ci1ubyBtYXRjaDogLTEKLXN1Y2Nlc3NmdWwgc2VhcmNoOiA2Ci1jYXVnaHQgZXhwZWN0ZWQgZXhjZXB0aW9uCi1mYWlsZWQgYXdrIHN5bnRheDogLTEKLXN1Y2Nlc3NmdWwgYXdrIHN5bnRheDogMgotZmFpbGVkIGF3ayBzeW50YXg6IC0xCi1tYXRjaGluZyB3aXRoIGdyb3VwIG5hbWVzIGFuZCBjb21waWxlKCkKLS0xCi1jYXVnaHQgZXhwZWN0ZWQgZXhjZXB0aW9uCi1tYXRjaGluZyB3aXRoIGdyb3VwIG5hbWVzIGFuZCBzeW1jb21wKCkKLTcKLTgwMSA5OTkKLTgwMQotKCc4MDEnLCAnOTk5JykKLSgnODAxJywgJzk5OScpCi1yZWFscGF0OiBcKFswLTldK1wpICpcKFswLTldK1wpCi1ncm91cGluZGV4OiB7J29uZSc6IDEsICd0d28nOiAyfQotbm90IGNhc2UgZm9sZGVkIHNlYXJjaDogLTEKLWNhc2UgZm9sZGVkIHNlYXJjaDogNgotX19tZW1iZXJzX186IFsnbGFzdCcsICdyZWdzJywgJ3RyYW5zbGF0ZScsICdncm91cGluZGV4JywgJ3JlYWxwYXQnLCAnZ2l2ZW5wYXQnXQotcmVnczogKCg2LCAxMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSksICgtMSwgLTEpLCAoLTEsIC0xKSwgKC0xLCAtMSkpCi1sYXN0OiBIRUxMTyBXT1JMRAotdHJhbnNsYXRlOiAyNTYKLWdpdmVucGF0OiB3b3JsZAotbWF0Y2ggd2l0aCBwb3M6IC0xCi1zZWFyY2ggd2l0aCBwb3M6IDE4Ci1ib2d1cyBncm91cDogKCd3b3JsZCcsIE5vbmUsIE5vbmUpCi1ubyBuYW1lOiBjYXVnaHQgZXhwZWN0ZWQgZXhjZXB0aW9uCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9zY29wZSBiL0xpYi90ZXN0L291dHB1dC90ZXN0X3Njb3BlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDM5ZTQ0Li4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L291dHB1dC90ZXN0X3Njb3BlCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotdGVzdF9zY29wZQotMS4gc2ltcGxlIG5lc3RpbmcKLTIuIGV4dHJhIG5lc3RpbmcKLTMuIHNpbXBsZSBuZXN0aW5nICsgcmViaW5kaW5nCi00LiBuZXN0aW5nIHdpdGggZ2xvYmFsIGJ1dCBubyBmcmVlCi01LiBuZXN0aW5nIHRocm91Z2ggY2xhc3MKLTYuIG5lc3RpbmcgcGx1cyBmcmVlIHJlZiB0byBnbG9iYWwKLTcuIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlCi04LiBtaXhlZCBmcmVldmFycyBhbmQgY2VsbHZhcnMKLTkuIGZyZWUgdmFyaWFibGUgaW4gbWV0aG9kCi0xMC4gcmVjdXJzaW9uCi0xMS4gdW5vcHRpbWl6ZWQgbmFtZXNwYWNlcwotMTIuIGxhbWJkYXMKLTEzLiBVbmJvdW5kTG9jYWwKLTE0LiBjb21wbGV4IGRlZmluaXRpb25zCi0xNS4gc2NvcGUgb2YgZ2xvYmFsIHN0YXRlbWVudHMKLTE2LiBjaGVjayBsZWFrcwotMTcuIGNsYXNzIGFuZCBnbG9iYWwKLTE4LiB2ZXJpZnkgdGhhdCBsb2NhbHMoKSB3b3JrcwotMTkuIHZhciBpcyBib3VuZCBhbmQgZnJlZSBpbiBjbGFzcwotMjAuIGludGVyYWN0aW9uIHdpdGggdHJhY2UgZnVuY3Rpb24KLTIwLiBldmFsIGFuZCBleGVjIHdpdGggZnJlZSB2YXJpYWJsZXMKLTIxLiBsaXN0IGNvbXByZWhlbnNpb24gd2l0aCBsb2NhbCB2YXJpYWJsZXMKLTIyLiBldmFsIHdpdGggZnJlZSB2YXJpYWJsZXMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L291dHB1dC90ZXN0X3Rva2VuaXplIGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfdG9rZW5pemUKaW5kZXggMGMxNDMwOC4uNGEzZDU4YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfdG9rZW5pemUKKysrIGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfdG9rZW5pemUKQEAgLTEsMTUgKzEsMjMgQEAKIHRlc3RfdG9rZW5pemUKLTEsMC0xLDM1OglDT01NRU5UCSIjIFRlc3RzIGZvciB0aGUgJ3Rva2VuaXplJyBtb2R1bGUuXG4iCi0yLDAtMiw0MzoJQ09NTUVOVAknIyBMYXJnZSBiaXRzIHN0b2xlbiBmcm9tIHRlc3RfZ3JhbW1hci5weS4gXG4nCisxLDAtMSwzNDoJQ09NTUVOVAkiIyBUZXN0cyBmb3IgdGhlICd0b2tlbml6ZScgbW9kdWxlLiIKKzEsMzQtMSwzNToJTkwJJ1xuJworMiwwLTIsNDI6CUNPTU1FTlQJJyMgTGFyZ2UgYml0cyBzdG9sZW4gZnJvbSB0ZXN0X2dyYW1tYXIucHkuICcKKzIsNDItMiw0MzoJTkwJJ1xuJwogMywwLTMsMToJTkwJJ1xuJwotNCwwLTQsMTE6CUNPTU1FTlQJJyMgQ29tbWVudHNcbicKKzQsMC00LDEwOglDT01NRU5UCScjIENvbW1lbnRzJworNCwxMC00LDExOglOTAknXG4nCiA1LDAtNSwzOglTVFJJTkcJJyIjIicKIDUsMy01LDQ6CU5FV0xJTkUJJ1xuJwotNiwwLTYsMzoJQ09NTUVOVAkiIydcbiIKLTcsMC03LDM6CUNPTU1FTlQJJyMiXG4nCi04LDAtOCwzOglDT01NRU5UCScjXFxcbicKLTksNy05LDk6CUNPTU1FTlQJJyNcbicKLTEwLDQtMTAsMTA6CUNPTU1FTlQJJyMgYWJjXG4nCis2LDAtNiwyOglDT01NRU5UCSIjJyIKKzYsMi02LDM6CU5MCSdcbicKKzcsMC03LDI6CUNPTU1FTlQJJyMiJworNywyLTcsMzoJTkwJJ1xuJworOCwwLTgsMjoJQ09NTUVOVAknI1xcJworOCwyLTgsMzoJTkwJJ1xuJworOSw3LTksODoJQ09NTUVOVAknIycKKzksOC05LDk6CU5MCSdcbicKKzEwLDQtMTAsOToJQ09NTUVOVAknIyBhYmMnCisxMCw5LTEwLDEwOglOTAknXG4nCiAxMSwwLTEyLDQ6CVNUUklORwkiJycnI1xuIycnJyIKIDEyLDQtMTIsNToJTkVXTElORQknXG4nCiAxMywwLTEzLDE6CU5MCSdcbicKQEAgLTE5LDcgKzI3LDggQEAKIDE0LDctMTQsODoJQ09NTUVOVAknIycKIDE0LDgtMTQsOToJTkVXTElORQknXG4nCiAxNSwwLTE1LDE6CU5MCSdcbicKLTE2LDAtMTYsMjU6CUNPTU1FTlQJJyMgQmFsYW5jaW5nIGNvbnRpbnVhdGlvblxuJworMTYsMC0xNiwyNDoJQ09NTUVOVAknIyBCYWxhbmNpbmcgY29udGludWF0aW9uJworMTYsMjQtMTYsMjU6CU5MCSdcbicKIDE3LDAtMTcsMToJTkwJJ1xuJwogMTgsMC0xOCwxOglOQU1FCSdhJwogMTgsMi0xOCwzOglPUAknPScKQEAgLTkzLDcgKzEwMiw4IEBACiAyOSwyLTI5LDM6CU9QCScpJwogMjksMy0yOSw0OglORVdMSU5FCSdcbicKIDMwLDAtMzAsMToJTkwJJ1xuJwotMzEsMC0zMSwzNzoJQ09NTUVOVAknIyBCYWNrc2xhc2ggbWVhbnMgbGluZSBjb250aW51YXRpb246XG4nCiszMSwwLTMxLDM2OglDT01NRU5UCScjIEJhY2tzbGFzaCBtZWFucyBsaW5lIGNvbnRpbnVhdGlvbjonCiszMSwzNi0zMSwzNzoJTkwJJ1xuJwogMzIsMC0zMiwxOglOQU1FCSd4JwogMzIsMi0zMiwzOglPUAknPScKIDMyLDQtMzIsNToJTlVNQkVSCScxJwpAQCAtMTAxLDEzICsxMTEsMTUgQEAKIDMzLDItMzMsMzoJTlVNQkVSCScxJwogMzMsMy0zMyw0OglORVdMSU5FCSdcbicKIDM0LDAtMzQsMToJTkwJJ1xuJwotMzUsMC0zNSw1NToJQ09NTUVOVAknIyBCYWNrc2xhc2ggZG9lcyBub3QgbWVhbnMgY29udGludWF0aW9uIGluIGNvbW1lbnRzIDpcXFxuJworMzUsMC0zNSw1NDoJQ09NTUVOVAknIyBCYWNrc2xhc2ggZG9lcyBub3QgbWVhbnMgY29udGludWF0aW9uIGluIGNvbW1lbnRzIDpcXCcKKzM1LDU0LTM1LDU1OglOTAknXG4nCiAzNiwwLTM2LDE6CU5BTUUJJ3gnCiAzNiwyLTM2LDM6CU9QCSc9JwogMzYsNC0zNiw1OglOVU1CRVIJJzAnCiAzNiw1LTM2LDY6CU5FV0xJTkUJJ1xuJwogMzcsMC0zNywxOglOTAknXG4nCi0zOCwwLTM4LDIwOglDT01NRU5UCScjIE9yZGluYXJ5IGludGVnZXJzXG4nCiszOCwwLTM4LDE5OglDT01NRU5UCScjIE9yZGluYXJ5IGludGVnZXJzJworMzgsMTktMzgsMjA6CU5MCSdcbicKIDM5LDAtMzksNDoJTlVNQkVSCScweGZmJwogMzksNS0zOSw3OglPUAknIT0nCiAzOSw4LTM5LDExOglOVU1CRVIJJzI1NScKQEAgLTEzOCw3ICsxNTAsOCBAQAogNDQsMTUtNDQsMTY6CU5VTUJFUgknMScKIDQ0LDE2LTQ0LDE3OglORVdMSU5FCSdcbicKIDQ1LDAtNDUsMToJTkwJJ1xuJwotNDYsMC00NiwxNjoJQ09NTUVOVAknIyBMb25nIGludGVnZXJzXG4nCis0NiwwLTQ2LDE1OglDT01NRU5UCScjIExvbmcgaW50ZWdlcnMnCis0NiwxNS00NiwxNjoJTkwJJ1xuJwogNDcsMC00NywxOglOQU1FCSd4JwogNDcsMi00NywzOglPUAknPScKIDQ3LDQtNDcsNjoJTlVNQkVSCScwTCcKQEAgLTE3Miw3ICsxODUsOCBAQAogNTQsNC01NCwzNToJTlVNQkVSCScxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBsJwogNTQsMzUtNTQsMzY6CU5FV0xJTkUJJ1xuJwogNTUsMC01NSwxOglOTAknXG4nCi01NiwwLTU2LDI1OglDT01NRU5UCScjIEZsb2F0aW5nLXBvaW50IG51bWJlcnNcbicKKzU2LDAtNTYsMjQ6CUNPTU1FTlQJJyMgRmxvYXRpbmctcG9pbnQgbnVtYmVycycKKzU2LDI0LTU2LDI1OglOTAknXG4nCiA1NywwLTU3LDE6CU5BTUUJJ3gnCiA1NywyLTU3LDM6CU9QCSc9JwogNTcsNC01Nyw4OglOVU1CRVIJJzMuMTQnCkBAIC0xODUsNyArMTk5LDggQEAKIDU5LDItNTksMzoJT1AJJz0nCiA1OSw0LTU5LDk6CU5VTUJFUgknMC4zMTQnCiA1OSw5LTU5LDEwOglORVdMSU5FCSdcbicKLTYwLDAtNjAsMTg6CUNPTU1FTlQJJyMgWFhYIHggPSAwMDAuMzE0XG4nCis2MCwwLTYwLDE3OglDT01NRU5UCScjIFhYWCB4ID0gMDAwLjMxNCcKKzYwLDE3LTYwLDE4OglOTAknXG4nCiA2MSwwLTYxLDE6CU5BTUUJJ3gnCiA2MSwyLTYxLDM6CU9QCSc9JwogNjEsNC02MSw4OglOVU1CRVIJJy4zMTQnCkBAIC0yMTksNyArMjM0LDggQEAKIDY4LDQtNjgsOToJTlVNQkVSCSczLjFlNCcKIDY4LDktNjgsMTA6CU5FV0xJTkUJJ1xuJwogNjksMC02OSwxOglOTAknXG4nCi03MCwwLTcwLDE4OglDT01NRU5UCScjIFN0cmluZyBsaXRlcmFsc1xuJworNzAsMC03MCwxNzoJQ09NTUVOVAknIyBTdHJpbmcgbGl0ZXJhbHMnCis3MCwxNy03MCwxODoJTkwJJ1xuJwogNzEsMC03MSwxOglOQU1FCSd4JwogNzEsMi03MSwzOglPUAknPScKIDcxLDQtNzEsNjoJU1RSSU5HCSInJyIKQEAgLTM2Nyw3ICszODMsOCBAQAogMTI1LDYtMTI2LDM6CVNUUklORwkidVInJydzcGFtXG4nJyciCiAxMjYsMy0xMjYsNDoJTkVXTElORQknXG4nCiAxMjcsMC0xMjcsMToJTkwJJ1xuJwotMTI4LDAtMTI4LDE0OglDT01NRU5UCScjIEluZGVudGF0aW9uXG4nCisxMjgsMC0xMjgsMTM6CUNPTU1FTlQJJyMgSW5kZW50YXRpb24nCisxMjgsMTMtMTI4LDE0OglOTAknXG4nCiAxMjksMC0xMjksMjoJTkFNRQknaWYnCiAxMjksMy0xMjksNDoJTlVNQkVSCScxJwogMTI5LDQtMTI5LDU6CU9QCSc6JwpAQCAtNDM5LDcgKzQ1Niw4IEBACiAxNDIsMTQtMTQyLDE1OglOVU1CRVIJJzInCiAxNDIsMTUtMTQyLDE2OglORVdMSU5FCSdcbicKIDE0MywwLTE0MywxOglOTAknXG4nCi0xNDQsMC0xNDQsMTI6CUNPTU1FTlQJJyMgT3BlcmF0b3JzXG4nCisxNDQsMC0xNDQsMTE6CUNPTU1FTlQJJyMgT3BlcmF0b3JzJworMTQ0LDExLTE0NCwxMjoJTkwJJ1xuJwogMTQ1LDAtMTQ1LDE6CU5MCSdcbicKIDE0NiwwLTE0NiwwOglERURFTlQJJycKIDE0NiwwLTE0NiwwOglERURFTlQJJycKQEAgLTUwMSw3ICs1MTksOCBAQAogMTQ5LDI3LTE0OSwyODoJT1AJJyknCiAxNDksMjgtMTQ5LDI5OglORVdMSU5FCSdcbicKIDE1MCwwLTE1MCwxOglOTAknXG4nCi0xNTEsMC0xNTEsMTM6CUNPTU1FTlQJJyMgY29tcGFyaXNvblxuJworMTUxLDAtMTUxLDEyOglDT01NRU5UCScjIGNvbXBhcmlzb24nCisxNTEsMTItMTUxLDEzOglOTAknXG4nCiAxNTIsMC0xNTIsMjoJTkFNRQknaWYnCiAxNTIsMy0xNTIsNDoJTlVNQkVSCScxJwogMTUyLDUtMTUyLDY6CU9QCSc8JwpAQCAtNTMyLDcgKzU1MSw4IEBACiAxNTIsNjctMTUyLDcxOglOQU1FCSdwYXNzJwogMTUyLDcxLTE1Miw3MjoJTkVXTElORQknXG4nCiAxNTMsMC0xNTMsMToJTkwJJ1xuJwotMTU0LDAtMTU0LDk6CUNPTU1FTlQJJyMgYmluYXJ5XG4nCisxNTQsMC0xNTQsODoJQ09NTUVOVAknIyBiaW5hcnknCisxNTQsOC0xNTQsOToJTkwJJ1xuJwogMTU1LDAtMTU1LDE6CU5BTUUJJ3gnCiAxNTUsMi0xNTUsMzoJT1AJJz0nCiAxNTUsNC0xNTUsNToJTlVNQkVSCScxJwpAQCAtNTUyLDcgKzU3Miw4IEBACiAxNTcsOC0xNTcsOToJTlVNQkVSCScxJwogMTU3LDktMTU3LDEwOglORVdMSU5FCSdcbicKIDE1OCwwLTE1OCwxOglOTAknXG4nCi0xNTksMC0xNTksODoJQ09NTUVOVAknIyBzaGlmdFxuJworMTU5LDAtMTU5LDc6CUNPTU1FTlQJJyMgc2hpZnQnCisxNTksNy0xNTksODoJTkwJJ1xuJwogMTYwLDAtMTYwLDE6CU5BTUUJJ3gnCiAxNjAsMi0xNjAsMzoJT1AJJz0nCiAxNjAsNC0xNjAsNToJTlVNQkVSCScxJwpAQCAtNTYyLDcgKzU4Myw4IEBACiAxNjAsMTQtMTYwLDE1OglOVU1CRVIJJzEnCiAxNjAsMTUtMTYwLDE2OglORVdMSU5FCSdcbicKIDE2MSwwLTE2MSwxOglOTAknXG4nCi0xNjIsMC0xNjIsMTE6CUNPTU1FTlQJJyMgYWRkaXRpdmVcbicKKzE2MiwwLTE2MiwxMDoJQ09NTUVOVAknIyBhZGRpdGl2ZScKKzE2MiwxMC0xNjIsMTE6CU5MCSdcbicKIDE2MywwLTE2MywxOglOQU1FCSd4JwogMTYzLDItMTYzLDM6CU9QCSc9JwogMTYzLDQtMTYzLDU6CU5VTUJFUgknMScKQEAgLTU3Niw3ICs1OTgsOCBAQAogMTYzLDIwLTE2MywyMToJTlVNQkVSCScxJwogMTYzLDIxLTE2MywyMjoJTkVXTElORQknXG4nCiAxNjQsMC0xNjQsMToJTkwJJ1xuJwotMTY1LDAtMTY1LDE3OglDT01NRU5UCScjIG11bHRpcGxpY2F0aXZlXG4nCisxNjUsMC0xNjUsMTY6CUNPTU1FTlQJJyMgbXVsdGlwbGljYXRpdmUnCisxNjUsMTYtMTY1LDE3OglOTAknXG4nCiAxNjYsMC0xNjYsMToJTkFNRQkneCcKIDE2NiwyLTE2NiwzOglPUAknPScKIDE2Niw0LTE2Niw1OglOVU1CRVIJJzEnCkBAIC01ODgsNyArNjExLDggQEAKIDE2NiwxNi0xNjYsMTc6CU5VTUJFUgknMScKIDE2NiwxNy0xNjYsMTg6CU5FV0xJTkUJJ1xuJwogMTY3LDAtMTY3LDE6CU5MCSdcbicKLTE2OCwwLTE2OCw4OglDT01NRU5UCScjIHVuYXJ5XG4nCisxNjgsMC0xNjgsNzoJQ09NTUVOVAknIyB1bmFyeScKKzE2OCw3LTE2OCw4OglOTAknXG4nCiAxNjksMC0xNjksMToJTkFNRQkneCcKIDE2OSwyLTE2OSwzOglPUAknPScKIDE2OSw0LTE2OSw1OglPUAknficKQEAgLTYyNiw3ICs2NTAsOCBAQAogMTcwLDI0LTE3MCwyNToJTlVNQkVSCScxJwogMTcwLDI1LTE3MCwyNjoJTkVXTElORQknXG4nCiAxNzEsMC0xNzEsMToJTkwJJ1xuJwotMTcyLDAtMTcyLDExOglDT01NRU5UCScjIHNlbGVjdG9yXG4nCisxNzIsMC0xNzIsMTA6CUNPTU1FTlQJJyMgc2VsZWN0b3InCisxNzIsMTAtMTcyLDExOglOTAknXG4nCiAxNzMsMC0xNzMsNjoJTkFNRQknaW1wb3J0JwogMTczLDctMTczLDEwOglOQU1FCSdzeXMnCiAxNzMsMTAtMTczLDExOglPUAknLCcKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L291dHB1dC90ZXN0X3R5cGVzIGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfdHlwZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OWNlMGQuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfdHlwZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi10ZXN0X3R5cGVzCi02LiBCdWlsdC1pbiB0eXBlcwotNi4xIFRydXRoIHZhbHVlIHRlc3RpbmcKLTYuMiBCb29sZWFuIG9wZXJhdGlvbnMKLTYuMyBDb21wYXJpc29ucwotNi40IE51bWVyaWMgdHlwZXMgKG1vc3RseSBjb252ZXJzaW9ucykKLTYuNC4xIDMyLWJpdCBpbnRlZ2VycwotNi40LjIgTG9uZyBpbnRlZ2VycwotNi40LjMgRmxvYXRpbmcgcG9pbnQgbnVtYmVycwotNi41IFNlcXVlbmNlIHR5cGVzCi02LjUuMSBTdHJpbmdzCi02LjUuMiBUdXBsZXMgW3NlZSB0ZXN0X3R1cGxlLnB5XQotNi41LjMgTGlzdHMgW3NlZSB0ZXN0X2xpc3QucHldCi02LjYgTWFwcGluZ3MgPT0gRGljdGlvbmFyaWVzIFtzZWUgdGVzdF9kaWN0LnB5XQotQnVmZmVycwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfeGRybGliIGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfeGRybGliCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODZjYWE5Li4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L291dHB1dC90ZXN0X3hkcmxpYgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLXRlc3RfeGRybGliCi1wYWNrIHRlc3QgMCBzdWNjZWVkZWQKLXBhY2sgdGVzdCAxIHN1Y2NlZWRlZAotcGFjayB0ZXN0IDIgc3VjY2VlZGVkCi1wYWNrIHRlc3QgMyBzdWNjZWVkZWQKLXBhY2sgdGVzdCA0IHN1Y2NlZWRlZAotcGFjayB0ZXN0IDUgc3VjY2VlZGVkCi1wYWNrIHRlc3QgNiBzdWNjZWVkZWQKLXBhY2sgdGVzdCA3IHN1Y2NlZWRlZAotcGFjayB0ZXN0IDggc3VjY2VlZGVkCi11bnBhY2sgdGVzdCAwIHN1Y2NlZWRlZCA6IDkKLXVucGFjayB0ZXN0IDEgc3VjY2VlZGVkIDogVHJ1ZQotdW5wYWNrIHRlc3QgMiBzdWNjZWVkZWQgOiBGYWxzZQotdW5wYWNrIHRlc3QgMyBzdWNjZWVkZWQgOiA0NQotdW5wYWNrIHRlc3QgNCBzdWNjZWVkZWQgOiAxLjg5OTk5OTk3NjE2Ci11bnBhY2sgdGVzdCA1IHN1Y2NlZWRlZCA6IDEuOQotdW5wYWNrIHRlc3QgNiBzdWNjZWVkZWQgOiBoZWxsbyB3b3JsZAotdW5wYWNrIHRlc3QgNyBzdWNjZWVkZWQgOiBbMCwgMSwgMiwgMywgNF0KLXVucGFjayB0ZXN0IDggc3VjY2VlZGVkIDogWyd3aGF0JywgJ2lzJywgJ2hhcG5pbicsICdkb2N0b3InXQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvb3V0c3RhbmRpbmdfYnVncy5weSBiL0xpYi90ZXN0L291dHN0YW5kaW5nX2J1Z3MucHkKaW5kZXggN2UzN2M4NS4uMDRhZmNiZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3Qvb3V0c3RhbmRpbmdfYnVncy5weQorKysgYi9MaWIvdGVzdC9vdXRzdGFuZGluZ19idWdzLnB5CkBAIC05LDE5ICs5LDE0IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKLWNsYXNzIFRlc3RCdWcxMzg1MDQwKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgdGVzdFN5bnRheEVycm9yKHNlbGYpOgotICAgICAgICBpbXBvcnQgY29tcGlsZXIKLQotICAgICAgICAjIFRoZSBmb2xsb3dpbmcgc25pcHBldCBnaXZlcyBhIFN5bnRheEVycm9yIGluIHRoZSBpbnRlcnByZXRlcgotICAgICAgICAjCi0gICAgICAgICMgSWYgeW91IGNvbXBpbGUgYW5kIGV4ZWMgaXQsIHRoZSBjYWxsIGZvbyg3KSByZXR1cm5zICg3LCAxKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgY29tcGlsZXIuY29tcGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZiBmb28oYT0xLCBiKTogcmV0dXJuIGEsIGJcblxuIiwgIjxzdHJpbmc+IiwgImV4ZWMiKQorIworIyBObyB0ZXN0IGNhc2VzIGZvciBvdXRzdGFuZGluZyBidWdzIGF0IHRoZSBtb21lbnQuCisjCiAKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdEJ1ZzEzODUwNDApCisgICAgI3Rlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKQorICAgIHBhc3MKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvc2dtbF9pbnB1dC5odG1sIGIvTGliL3Rlc3Qvc2dtbF9pbnB1dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZDJlNmMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9zZ21sX2lucHV0Lmh0bWwKQEAgLTAsMCArMSwyMTIgQEAKKzxodG1sPgorIDxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cDovL29nYW1lMTgyLmRlL2VwaWNibHVlL2Zvcm1hdGUuY3NzIj4KKyAgPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJqcy9mbG90dGVuLmpzIj48L3NjcmlwdD4KKyA8L2hlYWQ+CisgPGJvZHk+CisgICAgPHNjcmlwdCBsYW5ndWFnZT1KYXZhU2NyaXB0PiBpZiAocGFyZW50LmZyYW1lcy5sZW5ndGggPT0gMCkgeyB0b3AubG9jYXRpb24uaHJlZiA9ICJodHRwOi8vZXMub2dhbWUub3JnLyI7IH0gPC9zY3JpcHQ+IDxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgorZnVuY3Rpb24gaGFoYSh6MSkgeworICBldmFsKCJsb2NhdGlvbj0nIit6MS5vcHRpb25zW3oxLnNlbGVjdGVkSW5kZXhdLnZhbHVlKyInIik7Cit9Cis8L3NjcmlwdD4KKzxjZW50ZXI+Cis8dGFibGU+CisgPHRyPgorICA8dGQ+PC90ZD4KKyAgPHRkPgorICAgPGNlbnRlcj4KKyAgIDx0YWJsZT4KKyAgICA8dHI+CisgICAgIDx0ZD48aW1nIHNyYz0iaHR0cDovL29nYW1lMTgyLmRlL2VwaWNibHVlL3BsYW5ldGVuL3NtYWxsL3NfZHNjaGp1bmdlbHBsYW5ldDA0LmpwZyIgd2lkdGg9IjUwIiBoZWlnaHQ9IjUwIj48L3RkPgorICAgICA8dGQ+CisgICAgICA8dGFibGUgYm9yZGVyPSIxIj4KKyAgICAgICA8c2VsZWN0IHNpemU9IjEiIG9uY2hhbmdlPSJoYWhhKHRoaXMpIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iL2dhbWUvZmxvdHRlbjEucGhwP3Nlc3Npb249ODkxMmFlOTEyZmVjJmNwPTMzODc1MzQxJm1vZGU9RmxvdHRlJmdpZD0mbWVzc2FnZXppZWw9JnJlPTAiIHNlbGVjdGVkPkFsaWVuIHNleCBmcmllbmQgICAgWzI6MjUwOjZdPC9vcHRpb24+IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIvZ2FtZS9mbG90dGVuMS5waHA/c2Vzc2lvbj04OTEyYWU5MTJmZWMmY3A9MzM5MDUxMDAmbW9kZT1GbG90dGUmZ2lkPSZtZXNzYWdlemllbD0mcmU9MCIgPjE5ODkgICAgWzI6MjQ4OjE0XTwvb3B0aW9uPiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iL2dhbWUvZmxvdHRlbjEucGhwP3Nlc3Npb249ODkxMmFlOTEyZmVjJmNwPTM0NTcwODA4Jm1vZGU9RmxvdHRlJmdpZD0mbWVzc2FnZXppZWw9JnJlPTAiID4xOTkwICAgIFsyOjI0ODo2XTwvb3B0aW9uPiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iL2dhbWUvZmxvdHRlbjEucGhwP3Nlc3Npb249ODkxMmFlOTEyZmVjJmNwPTM0NTcwODU4Jm1vZGU9RmxvdHRlJmdpZD0mbWVzc2FnZXppZWw9JnJlPTAiID4xOTkxICAgIFsyOjI1NDo2XTwvb3B0aW9uPiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iL2dhbWUvZmxvdHRlbjEucGhwP3Nlc3Npb249ODkxMmFlOTEyZmVjJmNwPTM0NTcyOTI5Jm1vZGU9RmxvdHRlJmdpZD0mbWVzc2FnZXppZWw9JnJlPTAiID5Db2xvbmlhICAgIFsyOjI1MzoxMl08L29wdGlvbj4gCisgICAgICAgICAgICAgICA8L3NlbGVjdD4KKyAgICAgIDwvdGFibGU+CisgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKyAgPC9jZW50ZXI+CisgIDwvdGQ+CisgIDx0ZD4KKyAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0cj4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiPjwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUiPgorICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iaHR0cDovL29nYW1lMTgyLmRlL2VwaWNibHVlL2ltYWdlcy9tZXRhbGwuZ2lmIiB3aWR0aD0iNDIiIGhlaWdodD0iMjIiPgorICAgICA8L3RkPgorICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9Ijg1Ij4KKyAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly9vZ2FtZTE4Mi5kZS9lcGljYmx1ZS9pbWFnZXMva3Jpc3RhbGwuZ2lmIiB3aWR0aD0iNDIiIGhlaWdodD0iMjIiPgorICAgICA8L3RkPgorICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9Ijg1Ij4KKyAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly9vZ2FtZTE4Mi5kZS9lcGljYmx1ZS9pbWFnZXMvZGV1dGVyaXVtLmdpZiIgd2lkdGg9IjQyIiBoZWlnaHQ9IjIyIj4KKyAgICAgPC90ZD4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI4NSI+CisgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vb2dhbWUxODIuZGUvZXBpY2JsdWUvaW1hZ2VzL2VuZXJnaWUuZ2lmIiB3aWR0aD0iNDIiIGhlaWdodD0iMjIiPgorICAgICA8L3RkPgorICAgICA8dGQgYWxpZ249ImNlbnRlciI+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxpPjxiPiZuYnNwOyZuYnNwOzwvYj48L2k+PC90ZD4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI4NSI+PGk+PGI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPk1ldGFsPC9mb250PjwvYj48L2k+PC90ZD4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI4NSI+PGk+PGI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkNyaXN0YWw8L2ZvbnQ+PC9iPjwvaT48L3RkPgorICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9Ijg1Ij48aT48Yj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+RGV1dGVyaW88L2ZvbnQ+PC9iPjwvaT48L3RkPgorICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9Ijg1Ij48aT48Yj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+RW5lcmftYTwvZm9udD48L2I+PC9pPjwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48aT48Yj4mbmJzcDsmbmJzcDs8L2I+PC9pPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48L3RkPgorICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9Ijg1Ij4xNjAuNjM2PC90ZD4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI4NSI+My40MDY8L3RkPgorICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9Ijg1Ij4zOS4yMzA8L3RkPgorICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9Ijg1Ij48Zm9udCBjb2xvcj0jZmYwMDAwPi04MDwvZm9udD4vMy45NjU8L3RkPgorICAgICA8dGQgYWxpZ249ImNlbnRlciI+PC90ZD4KKyAgICA8L3RyPgorICAgPC90YWJsZT4KKyAgPC90cj4KKyA8L3RhYmxlPgorICA8L2NlbnRlcj4KKzxiciAvPgorICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KKyAgPCEtLQorICAgICBmdW5jdGlvbiBsaW5rX3RvX2dhbWVwYXkoKSB7CisgICAgc2VsZi5sb2NhdGlvbiA9ICJodHRwczovL3d3dy5nYW1lcGF5LmRlLz9sYW5nPWVzJnNlcnZlcklEPTgmdXNlcklEPTEyOTM2MCZnYW1lSUQ9b2dhbWUmZ3VpPXYyJmNoa3N1bT1hOTc1MWFmYTllMzdlNmIxYjgyNjM1NmJjY2E0NTY3NSI7CisgIH0KKy8vLS0+CisgIDwvc2NyaXB0PgorPGNlbnRlcj4KKyAgPHRhYmxlIHdpZHRoPSI1MTkiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIxIj4KKyAgIDx0ciBoZWlnaHQ9IjIwIj4KKyAgPHRkIGNvbHNwYW49IjgiIGNsYXNzPSJjIj5GbG90YXMgKG1heC4gOSk8L3RkPgorICAgPC90cj4KKyAgICAgPHRyIGhlaWdodD0iMjAiPgorICAgIDx0aD5OdW0uPC90aD4KKyAgICA8dGg+TWlzafNuPC90aD4KKyAgICA8dGg+Q2FudGlkYWQ8L3RoPgorICAgIDx0aD5Db21pZW56bzwvdGg+CisgICAgPHRoPlNhbGlkYTwvdGg+CisgICAgPHRoPk9iamV0aXZvPC90aD4KKyAgICA8dGg+TGxlZ2FkYTwvdGg+CisgICAgPHRoPk9yZGVuPC90aD4gICAKKyAgIDwvdHI+CisgICAgIDx0ciBoZWlnaHQ9IjIwIj4KKyAgICA8dGg+MTwvdGg+CisgICAgPHRoPiAgCisgICAgICA8YSB0aXRsZT0iIj5Fc3Bpb25hamU8L2E+CisgICAgICA8YSB0aXRsZT0iRmxvdGEgZW4gZWwgcGxhbmV0YSI+KEYpPC9hPgorICAgIDwvdGg+CisgICAgPHRoPiA8YSB0aXRsZT0iU29uZGEgZGUgZXNwaW9uYWplOiAzIAorIj4zPC9hPjwvdGg+CisgICAgPHRoPlsyOjI1MDo2XTwvdGg+CisgICAgPHRoPldlZCBBdWcgOSAxODowMDowMjwvdGg+CisgICAgPHRoPlsyOjI0Mjo1XTwvdGg+CisgICAgPHRoPldlZCBBdWcgOSAxODowMTowMjwvdGg+CisgICAgPHRoPgorICAgICAgICAgPGZvcm0gYWN0aW9uPSJmbG90dGVuMS5waHA/c2Vzc2lvbj04OTEyYWU5MTJmZWMiIG1ldGhvZD0iUE9TVCI+CisJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ib3JkZXJfcmV0dXJuIiB2YWx1ZT0iMjUwNTQ0OTAiIC8+CisgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJFbnZpYXIgZGUgcmVncmVzbyIgLz4KKyAgICAgPC9mb3JtPgorICAgICAgICAgICAgPC90aD4KKyAgIDwvdHI+CisgICA8dHIgaGVpZ2h0PSIyMCI+CisgICAgPHRoPjI8L3RoPgorICAgIDx0aD4gIAorICAgICAgPGEgdGl0bGU9IiI+RXNwaW9uYWplPC9hPgorICAgICAgPGEgdGl0bGU9IlZvbHZlciBhbCBwbGFuZXRhIj4oVik8L2E+CisgICAgPC90aD4KKyAgICA8dGg+IDxhIHRpdGxlPSJTb25kYSBkZSBlc3Bpb25hamU6IDMgCisiPjM8L2E+PC90aD4KKyAgICA8dGg+WzI6MjUwOjZdPC90aD4KKyAgICA8dGg+V2VkIEF1ZyA5IDE3OjU5OjU1PC90aD4KKyAgICA8dGg+WzI6MjQyOjFdPC90aD4KKyAgICA8dGg+V2VkIEF1ZyA5IDE4OjAxOjU1PC90aD4KKyAgICA8dGg+CisgICAgICAgICAgICA8L3RoPgorICAgPC90cj4KKyAgPC90YWJsZT4KKworCisgIAorPGZvcm0gYWN0aW9uPSJmbG90dGVuMi5waHA/c2Vzc2lvbj04OTEyYWU5MTJmZWMiIG1ldGhvZD0iUE9TVCI+CisgIDx0YWJsZSB3aWR0aD0iNTE5IiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMSI+CisgICAgICAgPHRyIGhlaWdodD0iMjAiPgorICA8dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImMiPk51ZXZhIG1pc2nzbjogZWxlZ2lyIG5hdmVzPC90ZD4KKyAgIDwvdHI+CisgICA8dHIgaGVpZ2h0PSIyMCI+CisgIDx0aD5OYXZlczwvdGg+CisgIDx0aD5EaXNwb25pYmxlczwvdGg+Cis8IS0tICAgIDx0aD5HZXNjaC48L3RoPiAtLT4KKyAgICA8dGg+LTwvdGg+CisgICAgPHRoPi08L3RoPgorICAgPC90cj4KKyAgIDx0ciBoZWlnaHQ9IjIwIj4KKyAgICA8dGg+PGEgdGl0bGU9IlZlbG9jaWRhZDogODUwMCI+TmF2ZSBwZXF1ZfFhIGRlIGNhcmdhPC9hPjwvdGg+IAorICAgIDx0aD4xMDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im1heHNoaXAyMDIiIHZhbHVlPSIxMCIvPjwvdGg+Cis8IS0tICAgIDx0aD44NTAwIC0tPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjb25zdW1wdGlvbjIwMiIgdmFsdWU9IjEwIi8+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNwZWVkMjAyIiB2YWx1ZT0iODUwMCIgLz48L3RoPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjYXBhY2l0eTIwMiIgdmFsdWU9IjUwMDAiIC8+PC90aD4KKyAgICAgPHRoPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWF4U2hpcCgnc2hpcDIwMicpOyIgPm3heDwvYT4gPC90aD4KKyAgICAgPHRoPjxpbnB1dCBuYW1lPSJzaGlwMjAyIiBzaXplPSIxMCIgdmFsdWU9IjAiIGFsdD0iTmF2ZSBwZXF1ZfFhIGRlIGNhcmdhIDEwIi8+PC90aD4KKyAgIDwvdHI+CisgICA8dHIgaGVpZ2h0PSIyMCI+CisgICAgPHRoPjxhIHRpdGxlPSJWZWxvY2lkYWQ6IDEyNzUwIj5OYXZlIGdyYW5kZSBkZSBjYXJnYTwvYT48L3RoPiAKKyAgICA8dGg+MTk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJtYXhzaGlwMjAzIiB2YWx1ZT0iMTkiLz48L3RoPgorPCEtLSAgICA8dGg+MTI3NTAgLS0+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNvbnN1bXB0aW9uMjAzIiB2YWx1ZT0iNTAiLz4KKyAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3BlZWQyMDMiIHZhbHVlPSIxMjc1MCIgLz48L3RoPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjYXBhY2l0eTIwMyIgdmFsdWU9IjI1MDAwIiAvPjwvdGg+CisgICAgIDx0aD48YSBocmVmPSJqYXZhc2NyaXB0Om1heFNoaXAoJ3NoaXAyMDMnKTsiID5t4Xg8L2E+IDwvdGg+CisgICAgIDx0aD48aW5wdXQgbmFtZT0ic2hpcDIwMyIgc2l6ZT0iMTAiIHZhbHVlPSIwIiBhbHQ9Ik5hdmUgZ3JhbmRlIGRlIGNhcmdhIDE5Ii8+PC90aD4KKyAgIDwvdHI+CisgICA8dHIgaGVpZ2h0PSIyMCI+CisgICAgPHRoPjxhIHRpdGxlPSJWZWxvY2lkYWQ6IDI3MDAwIj5DcnVjZXJvPC9hPjwvdGg+IAorICAgIDx0aD42PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibWF4c2hpcDIwNiIgdmFsdWU9IjYiLz48L3RoPgorPCEtLSAgICA8dGg+MjcwMDAgLS0+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNvbnN1bXB0aW9uMjA2IiB2YWx1ZT0iMzAwIi8+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNwZWVkMjA2IiB2YWx1ZT0iMjcwMDAiIC8+PC90aD4KKyAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY2FwYWNpdHkyMDYiIHZhbHVlPSI4MDAiIC8+PC90aD4KKyAgICAgPHRoPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWF4U2hpcCgnc2hpcDIwNicpOyIgPm3heDwvYT4gPC90aD4KKyAgICAgPHRoPjxpbnB1dCBuYW1lPSJzaGlwMjA2IiBzaXplPSIxMCIgdmFsdWU9IjAiIGFsdD0iQ3J1Y2VybyA2Ii8+PC90aD4KKyAgIDwvdHI+CisgICA8dHIgaGVpZ2h0PSIyMCI+CisgICAgPHRoPjxhIHRpdGxlPSJWZWxvY2lkYWQ6IDM0MDAiPlJlY2ljbGFkb3I8L2E+PC90aD4gCisgICAgPHRoPjE8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJtYXhzaGlwMjA5IiB2YWx1ZT0iMSIvPjwvdGg+Cis8IS0tICAgIDx0aD4zNDAwIC0tPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjb25zdW1wdGlvbjIwOSIgdmFsdWU9IjMwMCIvPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcGVlZDIwOSIgdmFsdWU9IjM0MDAiIC8+PC90aD4KKyAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY2FwYWNpdHkyMDkiIHZhbHVlPSIyMDAwMCIgLz48L3RoPgorICAgICA8dGg+PGEgaHJlZj0iamF2YXNjcmlwdDptYXhTaGlwKCdzaGlwMjA5Jyk7IiA+beF4PC9hPiA8L3RoPgorICAgICA8dGg+PGlucHV0IG5hbWU9InNoaXAyMDkiIHNpemU9IjEwIiB2YWx1ZT0iMCIgYWx0PSJSZWNpY2xhZG9yIDEiLz48L3RoPgorICAgPC90cj4KKyAgIDx0ciBoZWlnaHQ9IjIwIj4KKyAgICA8dGg+PGEgdGl0bGU9IlZlbG9jaWRhZDogMTcwMDAwMDAwIj5Tb25kYSBkZSBlc3Bpb25hamU8L2E+PC90aD4gCisgICAgPHRoPjEzOTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im1heHNoaXAyMTAiIHZhbHVlPSIxMzkiLz48L3RoPgorPCEtLSAgICA8dGg+MTcwMDAwMDAwIC0tPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjb25zdW1wdGlvbjIxMCIgdmFsdWU9IjEiLz4KKyAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3BlZWQyMTAiIHZhbHVlPSIxNzAwMDAwMDAiIC8+PC90aD4KKyAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY2FwYWNpdHkyMTAiIHZhbHVlPSI1IiAvPjwvdGg+CisgICAgIDx0aD48YSBocmVmPSJqYXZhc2NyaXB0Om1heFNoaXAoJ3NoaXAyMTAnKTsiID5t4Xg8L2E+IDwvdGg+CisgICAgIDx0aD48aW5wdXQgbmFtZT0ic2hpcDIxMCIgc2l6ZT0iMTAiIHZhbHVlPSIwIiBhbHQ9IlNvbmRhIGRlIGVzcGlvbmFqZSAxMzkiLz48L3RoPgorICAgPC90cj4KKyAgIDx0ciBoZWlnaHQ9IjIwIj4KKyAgPHRoIGNvbHNwYW49IjIiPjxhIGhyZWY9ImphdmFzY3JpcHQ6bm9TaGlwcygpOyIgPk5pbmd1bmEgbmF2ZTwvYT48L3RoPgorICA8dGggY29sc3Bhbj0iMiI+PGEgaHJlZj0iamF2YXNjcmlwdDptYXhTaGlwcygpOyIgPlRvZGFzIGxhcyBuYXZlczwvYT48L3RoPgorICAgPC90cj4KKyAgICA8dHIgaGVpZ2h0PSIyMCI+CisgICAgPHRoIGNvbHNwYW49IjQiPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDb250aW51YXIiIC8+PC90aD4KKyAgIDwvdHI+Cis8dHI+PHRoIGNvbHNwYW49ND4KKzxpZnJhbWUgaWQ9J2E0NGZiNTIyJyBuYW1lPSdhNDRmYjUyMicgc3JjPSdodHRwOi8vYWRzLmdhbWVmb3JnZWFkcy5kZS9hZGZyYW1lLnBocD9uPWE0NGZiNTIyJmFtcDt3aGF0PXpvbmU6NTc4JyBmcmFtZXNwYWNpbmc9JzAnIGZyYW1lYm9yZGVyPSdubycgc2Nyb2xsaW5nPSdubycgd2lkdGg9JzQ2OCcgaGVpZ2h0PSc2MCc+PC9pZnJhbWU+Cis8YnI+PGNlbnRlcj48L2NlbnRlcj48L2JyPgorPC90aD48L3RyPgorPC9mb3JtPgorPC90YWJsZT4KKyA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9MaWIvdGVzdC9zdHJpbmdfdGVzdHMucHkgYi9MaWIvdGVzdC9zdHJpbmdfdGVzdHMucHkKaW5kZXggNzM0NDdhZC4uMWFhNjhkZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3Qvc3RyaW5nX3Rlc3RzLnB5CisrKyBiL0xpYi90ZXN0L3N0cmluZ190ZXN0cy5weQpAQCAtMTA2OSw3ICsxMDY5LDcgQEAKICAgICAgICAgIyBmcm9tIHJheW1vbmQncyBvcmlnaW5hbCBzcGVjaWZpY2F0aW9uCiAgICAgICAgIFMgPSAnaHR0cDovL3d3dy5weXRob24ub3JnJwogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoKCdodHRwJywgJzovLycsICd3d3cucHl0aG9uLm9yZycpLCBTLCAncnBhcnRpdGlvbicsICc6Ly8nKQotICAgICAgICBzZWxmLmNoZWNrZXF1YWwoKCdodHRwOi8vd3d3LnB5dGhvbi5vcmcnLCAnJywgJycpLCBTLCAncnBhcnRpdGlvbicsICc/JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCgnJywgJycsICdodHRwOi8vd3d3LnB5dGhvbi5vcmcnKSwgUywgJ3JwYXJ0aXRpb24nLCAnPycpCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgoJycsICdodHRwOi8vJywgJ3d3dy5weXRob24ub3JnJyksIFMsICdycGFydGl0aW9uJywgJ2h0dHA6Ly8nKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoKCdodHRwOi8vd3d3LnB5dGhvbi4nLCAnb3JnJywgJycpLCBTLCAncnBhcnRpdGlvbicsICdvcmcnKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X01pbWVXcml0ZXIucHkgYi9MaWIvdGVzdC90ZXN0X01pbWVXcml0ZXIucHkKaW5kZXggNTA0MTEwNS4uZmVjYTE2MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9NaW1lV3JpdGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfTWltZVdyaXRlci5weQpAQCAtNyw2ICs3LDggQEAKIAogIiIiCiAKK2ltcG9ydCB1bml0dGVzdCwgc3lzLCBTdHJpbmdJTworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CiAKIGZyb20gTWltZVdyaXRlciBpbXBvcnQgTWltZVdyaXRlcgogCkBAIC03Nyw5NCArNzksMjEzIEBACiAgICAgICAgIF0KIAogCi1kZWYgbWFpbigpOgotICAgIGltcG9ydCBzeXMKK09VVFBVVCA9ICcnJ1wKK0Zyb206IGJ3YXJzYXdAY25yaS5yZXN0b24udmEudXMKK0RhdGU6IE1vbiBGZWIgMTIgMTc6MjE6NDggRVNUIDE5OTYKK1RvOiBrc3Mtc3VibWl0QGNucmkucmVzdG9uLnZhLnVzCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQva25vd2JvdDsKKyAgICBib3VuZGFyeT0iODAxc3BhbTk5OSI7CisgICAgdmVyc2lvbj0iMC4xIgogCi0gICAgIyBUb3BsZXZlbCBoZWFkZXJzCitUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgogCi0gICAgdG9wbGV2ZWwgPSBNaW1lV3JpdGVyKHN5cy5zdGRvdXQpCi0gICAgdG9wbGV2ZWwuYWRkaGVhZGVyKCJGcm9tIiwgImJ3YXJzYXdAY25yaS5yZXN0b24udmEudXMiKQotICAgIHRvcGxldmVsLmFkZGhlYWRlcigiRGF0ZSIsICJNb24gRmViIDEyIDE3OjIxOjQ4IEVTVCAxOTk2IikKLSAgICB0b3BsZXZlbC5hZGRoZWFkZXIoIlRvIiwgImtzcy1zdWJtaXRAY25yaS5yZXN0b24udmEudXMiKQotICAgIHRvcGxldmVsLmFkZGhlYWRlcigiTUlNRS1WZXJzaW9uIiwgIjEuMCIpCi0KLSAgICAjIFRvcGxldmVsIGJvZHkgcGFydHMKLQotICAgIGYgPSB0b3BsZXZlbC5zdGFydG11bHRpcGFydGJvZHkoImtub3dib3QiLCAiODAxc3BhbTk5OSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKCJ2ZXJzaW9uIiwgIjAuMSIpXSwgcHJlZml4PTApCi0gICAgZi53cml0ZSgiVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC5cbiIpCi0KLSAgICAjIEZpcnN0IHRvcGxldmVsIGJvZHkgcGFydDogbWV0YWRhdGEKLQotICAgIG1kID0gdG9wbGV2ZWwubmV4dHBhcnQoKQotICAgIG1kLnN0YXJ0bXVsdGlwYXJ0Ym9keSgia25vd2JvdC1tZXRhZGF0YSIsICI4MDJzcGFtOTk5IikKLQotICAgICMgTWV0YWRhdGEgcGFydCAxCi0KLSAgICBtZDEgPSBtZC5uZXh0cGFydCgpCi0gICAgbWQxLmFkZGhlYWRlcigiS1AtTWV0YWRhdGEtVHlwZSIsICJzaW1wbGUiKQotICAgIG1kMS5hZGRoZWFkZXIoIktQLUFjY2VzcyIsICJyZWFkLW9ubHkiKQotICAgIG0gPSBNaW1lV3JpdGVyKG1kMS5zdGFydGJvZHkoIm1lc3NhZ2UvcmZjODIyIikpCi0gICAgZm9yIGtleSwgdmFsdWUgaW4gU0lNUExFX01FVEFEQVRBOgotICAgICAgICBtLmFkZGhlYWRlcigiS1BNRC0iICsga2V5LCB2YWx1ZSkKLSAgICBtLmZsdXNoaGVhZGVycygpCi0gICAgZGVsIG1kMQotCi0gICAgIyBNZXRhZGF0YSBwYXJ0IDIKLQotICAgIG1kMiA9IG1kLm5leHRwYXJ0KCkKLSAgICBmb3Iga2V5LCB2YWx1ZSBpbiBDT01QTEVYX01FVEFEQVRBOgotICAgICAgICBtZDIuYWRkaGVhZGVyKCJLUC0iICsga2V5LCB2YWx1ZSkKLSAgICBmID0gbWQyLnN0YXJ0Ym9keSgidGV4dC9pc2wiKQotICAgIGYud3JpdGUoU0VMTEVSKQotICAgIGRlbCBtZDIKLQotICAgICMgTWV0YWRhdGEgcGFydCAzCi0KLSAgICBtZDMgPSBtZC5uZXh0cGFydCgpCi0gICAgZiA9IG1kMy5zdGFydGJvZHkoIm1lc3NhZ2UvZXh0ZXJuYWwtYm9keSIsCi0gICAgICAgICAgICAgICAgICAgICAgWygiYWNjZXNzLXR5cGUiLCAiVVJMIiksCi0gICAgICAgICAgICAgICAgICAgICAgICgiVVJMIiwgImhkbDovL2Nucmkua3NzL2dlbmVyaWMta25vd2JvdCIpXSkKLSAgICBtID0gTWltZVdyaXRlcihmKQotICAgIGZvciBrZXksIHZhbHVlIGluIEVYVEVSTkFMX01FVEFEQVRBOgotICAgICAgICBtZDMuYWRkaGVhZGVyKCJLUC0iICsga2V5LCB2YWx1ZSkKLSAgICBtZDMuc3RhcnRib2R5KCJ0ZXh0L2lzbCIpCi0gICAgIyBQaGFudG9tIGJvZHkgZG9lc24ndCBuZWVkIHRvIGJlIHdyaXR0ZW4KLQotICAgIG1kLmxhc3RwYXJ0KCkKLQotICAgICMgU2Vjb25kIHRvcGxldmVsIGJvZHkgcGFydDogY29kZQotCi0gICAgY29kZSA9IHRvcGxldmVsLm5leHRwYXJ0KCkKLSAgICBjb2RlLnN0YXJ0bXVsdGlwYXJ0Ym9keSgia25vd2JvdC1jb2RlIiwgIjgwM3NwYW05OTkiKQotCi0gICAgIyBDb2RlOiBidXllciBwcm9ncmFtIHNvdXJjZQotCi0gICAgYnV5ZXIgPSBjb2RlLm5leHRwYXJ0KCkKLSAgICBidXllci5hZGRoZWFkZXIoIktQLU1vZHVsZS1OYW1lIiwgIkJ1eWVyS1AiKQotICAgIGYgPSBidXllci5zdGFydGJvZHkoInRleHQvcGxhaW4iKQotICAgIGYud3JpdGUoQlVZRVIpCi0KLSAgICBjb2RlLmxhc3RwYXJ0KCkKLQotICAgICMgVGhpcmQgdG9wbGV2ZWwgYm9keSBwYXJ0OiBzdGF0ZQotCi0gICAgc3RhdGUgPSB0b3BsZXZlbC5uZXh0cGFydCgpCi0gICAgc3RhdGUuYWRkaGVhZGVyKCJLUC1NYWluLU1vZHVsZSIsICJtYWluIikKLSAgICBzdGF0ZS5zdGFydG11bHRpcGFydGJvZHkoImtub3dib3Qtc3RhdGUiLCAiODA0c3BhbTk5OSIpCi0KLSAgICAjIFN0YXRlOiBhIGJ1bmNoIG9mIGFzc2lnbm1lbnRzCi0KLSAgICBzdCA9IHN0YXRlLm5leHRwYXJ0KCkKLSAgICBzdC5hZGRoZWFkZXIoIktQLU1vZHVsZS1OYW1lIiwgIm1haW4iKQotICAgIGYgPSBzdC5zdGFydGJvZHkoInRleHQvcGxhaW4iKQotICAgIGYud3JpdGUoU1RBVEUpCi0KLSAgICBzdGF0ZS5sYXN0cGFydCgpCi0KLSAgICAjIEVuZCB0b3BsZXZlbCBib2R5IHBhcnRzCi0KLSAgICB0b3BsZXZlbC5sYXN0cGFydCgpCistLTgwMXNwYW05OTkKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2tub3dib3QtbWV0YWRhdGE7CisgICAgYm91bmRhcnk9IjgwMnNwYW05OTkiCiAKIAotbWFpbigpCistLTgwMnNwYW05OTkKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKK0tQLU1ldGFkYXRhLVR5cGU6IHNpbXBsZQorS1AtQWNjZXNzOiByZWFkLW9ubHkKKworS1BNRC1JbnRlcnByZXRlcjogcHl0aG9uCitLUE1ELUludGVycHJldGVyLVZlcnNpb246IDEuMworS1BNRC1Pd25lci1OYW1lOiBCYXJyeSBXYXJzYXcKK0tQTUQtT3duZXItUmVuZGV6dm91czogYndhcnNhd0BjbnJpLnJlc3Rvbi52YS51cworS1BNRC1Ib21lLUtTUzoga3NzLmNucmkucmVzdG9uLnZhLnVzCitLUE1ELUlkZW50aWZpZXI6IGhkbDovL2Nucmkua3NzL215X2ZpcnN0X2tub3dib3QKK0tQTUQtTGF1bmNoLURhdGU6IE1vbiBGZWIgMTIgMTY6Mzk6MDMgRVNUIDE5OTYKKworLS04MDJzcGFtOTk5CitDb250ZW50LVR5cGU6IHRleHQvaXNsCitLUC1NZXRhZGF0YS1UeXBlOiBjb21wbGV4CitLUC1NZXRhZGF0YS1LZXk6IGNvbm5lY3Rpb24KK0tQLUFjY2VzczogcmVhZC1vbmx5CitLUC1Db25uZWN0aW9uLURlc2NyaXB0aW9uOiBCYXJyeSdzIEJpZyBCYXNzIEJ1c2luZXNzCitLUC1Db25uZWN0aW9uLUlkOiBCNAorS1AtQ29ubmVjdGlvbi1EaXJlY3Rpb246IGNsaWVudAorCitJTlRFUkZBQ0UgU2VsbGVyLTE7CisKK1RZUEUgU2VsbGVyID0gT0JKRUNUCisgICAgRE9DVU1FTlRBVElPTiAiQSBzaW1wbGUgU2VsbGVyIGludGVyZmFjZSB0byB0ZXN0IElMVSIKKyAgICBNRVRIT0RTCisgICAgICAgICAgICBwcmljZSgpOklOVEVHRVIsCisgICAgRU5EOworCistLTgwMnNwYW05OTkKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9leHRlcm5hbC1ib2R5OworICAgIGFjY2Vzcy10eXBlPSJVUkwiOworICAgIFVSTD0iaGRsOi8vY25yaS5rc3MvZ2VuZXJpYy1rbm93Ym90IgorCitDb250ZW50LVR5cGU6IHRleHQvaXNsCitLUC1NZXRhZGF0YS1UeXBlOiBjb21wbGV4CitLUC1NZXRhZGF0YS1LZXk6IGdlbmVyaWMtaW50ZXJmYWNlCitLUC1BY2Nlc3M6IHJlYWQtb25seQorS1AtQ29ubmVjdGlvbi1EZXNjcmlwdGlvbjogR2VuZXJpYyBJbnRlcmZhY2UgZm9yIEFsbCBLbm93Ym90cworS1AtQ29ubmVjdGlvbi1JZDogZ2VuZXJpYy1rcAorS1AtQ29ubmVjdGlvbi1EaXJlY3Rpb246IGNsaWVudAorCisKKy0tODAyc3BhbTk5OS0tCisKKy0tODAxc3BhbTk5OQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQva25vd2JvdC1jb2RlOworICAgIGJvdW5kYXJ5PSI4MDNzcGFtOTk5IgorCisKKy0tODAzc3BhbTk5OQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCitLUC1Nb2R1bGUtTmFtZTogQnV5ZXJLUAorCitjbGFzcyBCdXllcjoKKyAgICBkZWYgX19zZXR1cF9fKHNlbGYsIG1heHByaWNlKToKKyAgICAgICAgc2VsZi5fbWF4cHJpY2UgPSBtYXhwcmljZQorCisgICAgZGVmIF9fbWFpbl9fKHNlbGYsIGtvcyk6CisgICAgICAgICIiIkVudHJ5IHBvaW50IHVwb24gYXJyaXZhbCBhdCBhIG5ldyBLT1MuIiIiCisgICAgICAgIGJyb2tlciA9IGtvcy5icm9rZXIoKQorICAgICAgICAjIEI0ID09IEJhcnJ5J3MgQmlnIEJhc3MgQnVzaW5lc3MgOi0pCisgICAgICAgIHNlbGxlciA9IGJyb2tlci5sb29rdXAoJ1NlbGxlcl8xLlNlbGxlcicsICdCNCcpCisgICAgICAgIGlmIHNlbGxlcjoKKyAgICAgICAgICAgIHByaWNlID0gc2VsbGVyLnByaWNlKCkKKyAgICAgICAgICAgIHByaW50ICdTZWxsZXIgd2FudHMgJCcsIHByaWNlLCAnLi4uICcKKyAgICAgICAgICAgIGlmIHByaWNlID4gc2VsZi5fbWF4cHJpY2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ3RvbyBtdWNoIScKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIkknbGwgdGFrZSBpdCEiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAnbm8gc2VsbGVyIGZvdW5kIGhlcmUnCisKKy0tODAzc3BhbTk5OS0tCisKKy0tODAxc3BhbTk5OQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQva25vd2JvdC1zdGF0ZTsKKyAgICBib3VuZGFyeT0iODA0c3BhbTk5OSIKK0tQLU1haW4tTW9kdWxlOiBtYWluCisKKworLS04MDRzcGFtOTk5CitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KK0tQLU1vZHVsZS1OYW1lOiBtYWluCisKKyMgaW5zdGFudGlhdGUgYSBidXllciBpbnN0YW5jZSBhbmQgcHV0IGl0IGluIGEgbWFnaWMgcGxhY2UgZm9yIHRoZSBLT1MKKyMgdG8gZmluZC4KK19fa3BfXyA9IEJ1eWVyKCkKK19fa3BfXy5fX3NldHVwX18oNTAwKQorCistLTgwNHNwYW05OTktLQorCistLTgwMXNwYW05OTktLQorJycnCisKK2NsYXNzIE1pbWV3cml0ZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICBidWYgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisKKyAgICAgICAgIyBUb3BsZXZlbCBoZWFkZXJzCisKKyAgICAgICAgdG9wbGV2ZWwgPSBNaW1lV3JpdGVyKGJ1ZikKKyAgICAgICAgdG9wbGV2ZWwuYWRkaGVhZGVyKCJGcm9tIiwgImJ3YXJzYXdAY25yaS5yZXN0b24udmEudXMiKQorICAgICAgICB0b3BsZXZlbC5hZGRoZWFkZXIoIkRhdGUiLCAiTW9uIEZlYiAxMiAxNzoyMTo0OCBFU1QgMTk5NiIpCisgICAgICAgIHRvcGxldmVsLmFkZGhlYWRlcigiVG8iLCAia3NzLXN1Ym1pdEBjbnJpLnJlc3Rvbi52YS51cyIpCisgICAgICAgIHRvcGxldmVsLmFkZGhlYWRlcigiTUlNRS1WZXJzaW9uIiwgIjEuMCIpCisKKyAgICAgICAgIyBUb3BsZXZlbCBib2R5IHBhcnRzCisKKyAgICAgICAgZiA9IHRvcGxldmVsLnN0YXJ0bXVsdGlwYXJ0Ym9keSgia25vd2JvdCIsICI4MDFzcGFtOTk5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKCJ2ZXJzaW9uIiwgIjAuMSIpXSwgcHJlZml4PTApCisgICAgICAgIGYud3JpdGUoIlRoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuXG4iKQorCisgICAgICAgICMgRmlyc3QgdG9wbGV2ZWwgYm9keSBwYXJ0OiBtZXRhZGF0YQorCisgICAgICAgIG1kID0gdG9wbGV2ZWwubmV4dHBhcnQoKQorICAgICAgICBtZC5zdGFydG11bHRpcGFydGJvZHkoImtub3dib3QtbWV0YWRhdGEiLCAiODAyc3BhbTk5OSIpCisKKyAgICAgICAgIyBNZXRhZGF0YSBwYXJ0IDEKKworICAgICAgICBtZDEgPSBtZC5uZXh0cGFydCgpCisgICAgICAgIG1kMS5hZGRoZWFkZXIoIktQLU1ldGFkYXRhLVR5cGUiLCAic2ltcGxlIikKKyAgICAgICAgbWQxLmFkZGhlYWRlcigiS1AtQWNjZXNzIiwgInJlYWQtb25seSIpCisgICAgICAgIG0gPSBNaW1lV3JpdGVyKG1kMS5zdGFydGJvZHkoIm1lc3NhZ2UvcmZjODIyIikpCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIFNJTVBMRV9NRVRBREFUQToKKyAgICAgICAgICAgIG0uYWRkaGVhZGVyKCJLUE1ELSIgKyBrZXksIHZhbHVlKQorICAgICAgICBtLmZsdXNoaGVhZGVycygpCisgICAgICAgIGRlbCBtZDEKKworICAgICAgICAjIE1ldGFkYXRhIHBhcnQgMgorCisgICAgICAgIG1kMiA9IG1kLm5leHRwYXJ0KCkKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gQ09NUExFWF9NRVRBREFUQToKKyAgICAgICAgICAgIG1kMi5hZGRoZWFkZXIoIktQLSIgKyBrZXksIHZhbHVlKQorICAgICAgICBmID0gbWQyLnN0YXJ0Ym9keSgidGV4dC9pc2wiKQorICAgICAgICBmLndyaXRlKFNFTExFUikKKyAgICAgICAgZGVsIG1kMgorCisgICAgICAgICMgTWV0YWRhdGEgcGFydCAzCisKKyAgICAgICAgbWQzID0gbWQubmV4dHBhcnQoKQorICAgICAgICBmID0gbWQzLnN0YXJ0Ym9keSgibWVzc2FnZS9leHRlcm5hbC1ib2R5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWygiYWNjZXNzLXR5cGUiLCAiVVJMIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoIlVSTCIsICJoZGw6Ly9jbnJpLmtzcy9nZW5lcmljLWtub3dib3QiKV0pCisgICAgICAgIG0gPSBNaW1lV3JpdGVyKGYpCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIEVYVEVSTkFMX01FVEFEQVRBOgorICAgICAgICAgICAgbWQzLmFkZGhlYWRlcigiS1AtIiArIGtleSwgdmFsdWUpCisgICAgICAgIG1kMy5zdGFydGJvZHkoInRleHQvaXNsIikKKyAgICAgICAgIyBQaGFudG9tIGJvZHkgZG9lc24ndCBuZWVkIHRvIGJlIHdyaXR0ZW4KKworICAgICAgICBtZC5sYXN0cGFydCgpCisKKyAgICAgICAgIyBTZWNvbmQgdG9wbGV2ZWwgYm9keSBwYXJ0OiBjb2RlCisKKyAgICAgICAgY29kZSA9IHRvcGxldmVsLm5leHRwYXJ0KCkKKyAgICAgICAgY29kZS5zdGFydG11bHRpcGFydGJvZHkoImtub3dib3QtY29kZSIsICI4MDNzcGFtOTk5IikKKworICAgICAgICAjIENvZGU6IGJ1eWVyIHByb2dyYW0gc291cmNlCisKKyAgICAgICAgYnV5ZXIgPSBjb2RlLm5leHRwYXJ0KCkKKyAgICAgICAgYnV5ZXIuYWRkaGVhZGVyKCJLUC1Nb2R1bGUtTmFtZSIsICJCdXllcktQIikKKyAgICAgICAgZiA9IGJ1eWVyLnN0YXJ0Ym9keSgidGV4dC9wbGFpbiIpCisgICAgICAgIGYud3JpdGUoQlVZRVIpCisKKyAgICAgICAgY29kZS5sYXN0cGFydCgpCisKKyAgICAgICAgIyBUaGlyZCB0b3BsZXZlbCBib2R5IHBhcnQ6IHN0YXRlCisKKyAgICAgICAgc3RhdGUgPSB0b3BsZXZlbC5uZXh0cGFydCgpCisgICAgICAgIHN0YXRlLmFkZGhlYWRlcigiS1AtTWFpbi1Nb2R1bGUiLCAibWFpbiIpCisgICAgICAgIHN0YXRlLnN0YXJ0bXVsdGlwYXJ0Ym9keSgia25vd2JvdC1zdGF0ZSIsICI4MDRzcGFtOTk5IikKKworICAgICAgICAjIFN0YXRlOiBhIGJ1bmNoIG9mIGFzc2lnbm1lbnRzCisKKyAgICAgICAgc3QgPSBzdGF0ZS5uZXh0cGFydCgpCisgICAgICAgIHN0LmFkZGhlYWRlcigiS1AtTW9kdWxlLU5hbWUiLCAibWFpbiIpCisgICAgICAgIGYgPSBzdC5zdGFydGJvZHkoInRleHQvcGxhaW4iKQorICAgICAgICBmLndyaXRlKFNUQVRFKQorCisgICAgICAgIHN0YXRlLmxhc3RwYXJ0KCkKKworICAgICAgICAjIEVuZCB0b3BsZXZlbCBib2R5IHBhcnRzCisKKyAgICAgICAgdG9wbGV2ZWwubGFzdHBhcnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLmdldHZhbHVlKCksIE9VVFBVVCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChNaW1ld3JpdGVyVGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9TdHJpbmdJTy5weSBiL0xpYi90ZXN0L3Rlc3RfU3RyaW5nSU8ucHkKaW5kZXggY2MzMzY3Zi4uOWY3OWIwMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9TdHJpbmdJTy5weQorKysgYi9MaWIvdGVzdC90ZXN0X1N0cmluZ0lPLnB5CkBAIC02Miw2ICs2Miw3IEBACiAgICAgICAgIGVxKGYuZ2V0dmFsdWUoKSwgJ2FiY2RlJykKICAgICAgICAgZi53cml0ZSgneHl6JykKICAgICAgICAgZXEoZi5nZXR2YWx1ZSgpLCAnYWJjZGV4eXonKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBmLnRydW5jYXRlLCAtMSkKICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYud3JpdGUsICdmcm9ibml0eicpCiAKQEAgLTEyMCw2ICsxMjEsMjggQEAKIGNsYXNzIFRlc3RjU3RyaW5nSU8oVGVzdEdlbmVyaWNTdHJpbmdJTyk6CiAgICAgTU9EVUxFID0gY1N0cmluZ0lPCiAKKyAgICBkZWYgdGVzdF91bmljb2RlKHNlbGYpOgorCisgICAgICAgIGlmIG5vdCB0ZXN0X3N1cHBvcnQuaGF2ZV91bmljb2RlOiByZXR1cm4KKworICAgICAgICAjIFRoZSBjU3RyaW5nSU8gbW9kdWxlIGNvbnZlcnRzIFVuaWNvZGUgc3RyaW5ncyB0byBjaGFyYWN0ZXIKKyAgICAgICAgIyBzdHJpbmdzIHdoZW4gd3JpdGluZyB0aGVtIHRvIGNTdHJpbmdJTyBvYmplY3RzLgorICAgICAgICAjIENoZWNrIHRoYXQgdGhpcyB3b3Jrcy4KKworICAgICAgICBmID0gc2VsZi5NT0RVTEUuU3RyaW5nSU8oKQorICAgICAgICBmLndyaXRlKHVuaWNvZGUoc2VsZi5fbGluZVs6NV0pKQorICAgICAgICBzID0gZi5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgJ2FiY2RlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHMpLCB0eXBlcy5TdHJpbmdUeXBlKQorCisgICAgICAgIGYgPSBzZWxmLk1PRFVMRS5TdHJpbmdJTyh1bmljb2RlKHNlbGYuX2xpbmVbOjVdKSkKKyAgICAgICAgcyA9IGYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsICdhYmNkZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzKSwgdHlwZXMuU3RyaW5nVHlwZSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IsIHNlbGYuTU9EVUxFLlN0cmluZ0lPLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlKCdceGY0JywgJ2xhdGluLTEnKSkKKwogaW1wb3J0IHN5cwogaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKICAgICAjIEp5dGhvbiBkb2Vzbid0IGhhdmUgYSBidWZmZXIgb2JqZWN0LCBzbyB3ZSBqdXN0IGRvIGEgdXNlbGVzcwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9fX2Z1dHVyZV9fLnB5IGIvTGliL3Rlc3QvdGVzdF9fX2Z1dHVyZV9fLnB5CmluZGV4IDdkMmIyYWUuLjUwYTJjNzQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfX19mdXR1cmVfXy5weQorKysgYi9MaWIvdGVzdC90ZXN0X19fZnV0dXJlX18ucHkKQEAgLTEsNTkgKzEsNjMgQEAKICMhIC91c3IvYmluL2VudiBweXRob24KLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIHZlcmlmeQotZnJvbSB0eXBlcyBpbXBvcnQgVHVwbGVUeXBlLCBTdHJpbmdUeXBlLCBJbnRUeXBlCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBpbXBvcnQgX19mdXR1cmVfXwogCiBHT09EX1NFUklBTFMgPSAoImFscGhhIiwgImJldGEiLCAiY2FuZGlkYXRlIiwgImZpbmFsIikKIAogZmVhdHVyZXMgPSBfX2Z1dHVyZV9fLmFsbF9mZWF0dXJlX25hbWVzCiAKLSMgVmVyaWZ5IHRoYXQgYWxsX2ZlYXR1cmVfbmFtZXMgYXBwZWFycyBjb3JyZWN0LgotZ2l2ZW5fZmVhdHVyZV9uYW1lcyA9IGZlYXR1cmVzWzpdCi1mb3IgbmFtZSBpbiBkaXIoX19mdXR1cmVfXyk6Ci0gICAgb2JqID0gZ2V0YXR0cihfX2Z1dHVyZV9fLCBuYW1lLCBOb25lKQotICAgIGlmIG9iaiBpcyBub3QgTm9uZSBhbmQgaXNpbnN0YW5jZShvYmosIF9fZnV0dXJlX18uX0ZlYXR1cmUpOgotICAgICAgICB2ZXJpZnkobmFtZSBpbiBnaXZlbl9mZWF0dXJlX25hbWVzLAotICAgICAgICAgICAgICAgIiVyIHNob3VsZCBoYXZlIGJlZW4gaW4gYWxsX2ZlYXR1cmVfbmFtZXMiICUgbmFtZSkKLSAgICAgICAgZ2l2ZW5fZmVhdHVyZV9uYW1lcy5yZW1vdmUobmFtZSkKLXZlcmlmeShsZW4oZ2l2ZW5fZmVhdHVyZV9uYW1lcykgPT0gMCwKLSAgICAgICAiYWxsX2ZlYXR1cmVfbmFtZXMgaGFzIHRvbyBtdWNoOiAlciIgJSBnaXZlbl9mZWF0dXJlX25hbWVzKQotZGVsIGdpdmVuX2ZlYXR1cmVfbmFtZXMKK2NsYXNzIEZ1dHVyZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCi1mb3IgZmVhdHVyZSBpbiBmZWF0dXJlczoKLSAgICB2YWx1ZSA9IGdldGF0dHIoX19mdXR1cmVfXywgZmVhdHVyZSkKLSAgICBpZiB2ZXJib3NlOgotICAgICAgICBwcmludCAiQ2hlY2tpbmcgX19mdXR1cmVfXyAiLCBmZWF0dXJlLCAidmFsdWUiLCB2YWx1ZQorICAgIGRlZiB0ZXN0X25hbWVzKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IGFsbF9mZWF0dXJlX25hbWVzIGFwcGVhcnMgY29ycmVjdC4KKyAgICAgICAgZ2l2ZW5fZmVhdHVyZV9uYW1lcyA9IGZlYXR1cmVzWzpdCisgICAgICAgIGZvciBuYW1lIGluIGRpcihfX2Z1dHVyZV9fKToKKyAgICAgICAgICAgIG9iaiA9IGdldGF0dHIoX19mdXR1cmVfXywgbmFtZSwgTm9uZSkKKyAgICAgICAgICAgIGlmIG9iaiBpcyBub3QgTm9uZSBhbmQgaXNpbnN0YW5jZShvYmosIF9fZnV0dXJlX18uX0ZlYXR1cmUpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgICAgICAgICAgICAgbmFtZSBpbiBnaXZlbl9mZWF0dXJlX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAiJXIgc2hvdWxkIGhhdmUgYmVlbiBpbiBhbGxfZmVhdHVyZV9uYW1lcyIgJSBuYW1lCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGdpdmVuX2ZlYXR1cmVfbmFtZXMucmVtb3ZlKG5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGdpdmVuX2ZlYXR1cmVfbmFtZXMpLCAwLAorICAgICAgICAgICAgICAgImFsbF9mZWF0dXJlX25hbWVzIGhhcyB0b28gbXVjaDogJXIiICUgZ2l2ZW5fZmVhdHVyZV9uYW1lcykKIAotICAgIG9wdGlvbmFsID0gdmFsdWUuZ2V0T3B0aW9uYWxSZWxlYXNlKCkKLSAgICBtYW5kYXRvcnkgPSB2YWx1ZS5nZXRNYW5kYXRvcnlSZWxlYXNlKCkKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICBmb3IgZmVhdHVyZSBpbiBmZWF0dXJlczoKKyAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihfX2Z1dHVyZV9fLCBmZWF0dXJlKQogCi0gICAgdmVyaWZ5KHR5cGUob3B0aW9uYWwpIGlzIFR1cGxlVHlwZSwgIm9wdGlvbmFsIGlzbid0IHR1cGxlIikKLSAgICB2ZXJpZnkobGVuKG9wdGlvbmFsKSA9PSA1LCAib3B0aW9uYWwgaXNuJ3QgNS10dXBsZSIpCi0gICAgbWFqb3IsIG1pbm9yLCBtaWNybywgbGV2ZWwsIHNlcmlhbCA9IG9wdGlvbmFsCi0gICAgdmVyaWZ5KHR5cGUobWFqb3IpIGlzIEludFR5cGUsICJvcHRpb25hbCBtYWpvciBpc24ndCBpbnQiKQotICAgIHZlcmlmeSh0eXBlKG1pbm9yKSBpcyBJbnRUeXBlLCAib3B0aW9uYWwgbWlub3IgaXNuJ3QgaW50IikKLSAgICB2ZXJpZnkodHlwZShtaWNybykgaXMgSW50VHlwZSwgIm9wdGlvbmFsIG1pY3JvIGlzbid0IGludCIpCi0gICAgdmVyaWZ5KGlzaW5zdGFuY2UobGV2ZWwsIGJhc2VzdHJpbmcpLCAib3B0aW9uYWwgbGV2ZWwgaXNuJ3Qgc3RyaW5nIikKLSAgICB2ZXJpZnkobGV2ZWwgaW4gR09PRF9TRVJJQUxTLAotICAgICAgICAgICAib3B0aW9uYWwgbGV2ZWwgc3RyaW5nIGhhcyB1bmtub3duIHZhbHVlIikKLSAgICB2ZXJpZnkodHlwZShzZXJpYWwpIGlzIEludFR5cGUsICJvcHRpb25hbCBzZXJpYWwgaXNuJ3QgaW50IikKKyAgICAgICAgICAgIG9wdGlvbmFsID0gdmFsdWUuZ2V0T3B0aW9uYWxSZWxlYXNlKCkKKyAgICAgICAgICAgIG1hbmRhdG9yeSA9IHZhbHVlLmdldE1hbmRhdG9yeVJlbGVhc2UoKQogCi0gICAgdmVyaWZ5KHR5cGUobWFuZGF0b3J5KSBpcyBUdXBsZVR5cGUgb3IKLSAgICAgICAgICAgbWFuZGF0b3J5IGlzIE5vbmUsICJtYW5kYXRvcnkgaXNuJ3QgdHVwbGUgb3IgTm9uZSIpCi0gICAgaWYgbWFuZGF0b3J5IGlzIG5vdCBOb25lOgotICAgICAgICB2ZXJpZnkobGVuKG1hbmRhdG9yeSkgPT0gNSwgIm1hbmRhdG9yeSBpc24ndCA1LXR1cGxlIikKLSAgICAgICAgbWFqb3IsIG1pbm9yLCBtaWNybywgbGV2ZWwsIHNlcmlhbCA9IG1hbmRhdG9yeQotICAgICAgICB2ZXJpZnkodHlwZShtYWpvcikgaXMgSW50VHlwZSwgIm1hbmRhdG9yeSBtYWpvciBpc24ndCBpbnQiKQotICAgICAgICB2ZXJpZnkodHlwZShtaW5vcikgaXMgSW50VHlwZSwgIm1hbmRhdG9yeSBtaW5vciBpc24ndCBpbnQiKQotICAgICAgICB2ZXJpZnkodHlwZShtaWNybykgaXMgSW50VHlwZSwgIm1hbmRhdG9yeSBtaWNybyBpc24ndCBpbnQiKQotICAgICAgICB2ZXJpZnkoaXNpbnN0YW5jZShsZXZlbCwgYmFzZXN0cmluZyksICJtYW5kYXRvcnkgbGV2ZWwgaXNuJ3Qgc3RyaW5nIikKLSAgICAgICAgdmVyaWZ5KGxldmVsIGluIEdPT0RfU0VSSUFMUywKLSAgICAgICAgICAgICAgICJtYW5kYXRvcnkgc2VyaWFsIHN0cmluZyBoYXMgdW5rbm93biB2YWx1ZSIpCi0gICAgICAgIHZlcmlmeSh0eXBlKHNlcmlhbCkgaXMgSW50VHlwZSwgIm1hbmRhdG9yeSBzZXJpYWwgaXNuJ3QgaW50IikKLSAgICAgICAgdmVyaWZ5KG9wdGlvbmFsIDwgbWFuZGF0b3J5LAotICAgICAgICAgICAgICAgIm9wdGlvbmFsIG5vdCBsZXNzIHRoYW4gbWFuZGF0b3J5LCBhbmQgbWFuZGF0b3J5IG5vdCBOb25lIikKKyAgICAgICAgICAgIGEgPSBzZWxmLmFzc2VydF8KKyAgICAgICAgICAgIGUgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICAgICBkZWYgY2hlY2sodCwgbmFtZSk6CisgICAgICAgICAgICAgICAgYShpc2luc3RhbmNlKHQsIHR1cGxlKSwgIiVzIGlzbid0IHR1cGxlIiAlIG5hbWUpCisgICAgICAgICAgICAgICAgZShsZW4odCksIDUsICIlcyBpc24ndCA1LXR1cGxlIiAlIG5hbWUpCisgICAgICAgICAgICAgICAgKG1ham9yLCBtaW5vciwgbWljcm8sIGxldmVsLCBzZXJpYWwpID0gdAorICAgICAgICAgICAgICAgIGEoaXNpbnN0YW5jZShtYWpvciwgaW50KSwgIiVzIG1ham9yIGlzbid0IGludCIgICUgbmFtZSkKKyAgICAgICAgICAgICAgICBhKGlzaW5zdGFuY2UobWlub3IsIGludCksICIlcyBtaW5vciBpc24ndCBpbnQiICUgbmFtZSkKKyAgICAgICAgICAgICAgICBhKGlzaW5zdGFuY2UobWljcm8sIGludCksICIlcyBtaWNybyBpc24ndCBpbnQiICUgbmFtZSkKKyAgICAgICAgICAgICAgICBhKGlzaW5zdGFuY2UobGV2ZWwsIGJhc2VzdHJpbmcpLAorICAgICAgICAgICAgICAgICAgICAiJXMgbGV2ZWwgaXNuJ3Qgc3RyaW5nIiAlIG5hbWUpCisgICAgICAgICAgICAgICAgYShsZXZlbCBpbiBHT09EX1NFUklBTFMsCisgICAgICAgICAgICAgICAgICAgICAgICIlcyBsZXZlbCBzdHJpbmcgaGFzIHVua25vd24gdmFsdWUiICUgbmFtZSkKKyAgICAgICAgICAgICAgICBhKGlzaW5zdGFuY2Uoc2VyaWFsLCBpbnQpLCAiJXMgc2VyaWFsIGlzbid0IGludCIgJSBuYW1lKQogCi0gICAgdmVyaWZ5KGhhc2F0dHIodmFsdWUsICJjb21waWxlcl9mbGFnIiksCi0gICAgICAgICAgICJmZWF0dXJlIGlzIG1pc3NpbmcgYSAuY29tcGlsZXJfZmxhZyBhdHRyIikKLSAgICB2ZXJpZnkodHlwZShnZXRhdHRyKHZhbHVlLCAiY29tcGlsZXJfZmxhZyIpKSBpcyBJbnRUeXBlLAotICAgICAgICAgICAiLmNvbXBpbGVyX2ZsYWcgaXNuJ3QgaW50IikKKyAgICAgICAgICAgIGNoZWNrKG9wdGlvbmFsLCAib3B0aW9uYWwiKQorICAgICAgICAgICAgaWYgbWFuZGF0b3J5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGNoZWNrKG1hbmRhdG9yeSwgIm1hbmRhdG9yeSIpCisgICAgICAgICAgICAgICAgYShvcHRpb25hbCA8IG1hbmRhdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbmFsIG5vdCBsZXNzIHRoYW4gbWFuZGF0b3J5LCBhbmQgbWFuZGF0b3J5IG5vdCBOb25lIikKKworICAgICAgICAgICAgYShoYXNhdHRyKHZhbHVlLCAiY29tcGlsZXJfZmxhZyIpLAorICAgICAgICAgICAgICAgICAgICJmZWF0dXJlIGlzIG1pc3NpbmcgYSAuY29tcGlsZXJfZmxhZyBhdHRyIikKKyAgICAgICAgICAgIGEoaXNpbnN0YW5jZShnZXRhdHRyKHZhbHVlLCAiY29tcGlsZXJfZmxhZyIpLCBpbnQpLAorICAgICAgICAgICAgICAgICAgICIuY29tcGlsZXJfZmxhZyBpc24ndCBpbnQiKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChGdXR1cmVUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2FycmF5LnB5IGIvTGliL3Rlc3QvdGVzdF9hcnJheS5weQppbmRleCA2YWRiZjMzLi41Yzc5YjQ4IDEwMDc1NQotLS0gYS9MaWIvdGVzdC90ZXN0X2FycmF5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkKQEAgLTg1LDYgKzg1LDEzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoYSksIGlkKGIpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIpCiAKKyAgICBkZWYgdGVzdF9kZWVwY29weShzZWxmKToKKyAgICAgICAgaW1wb3J0IGNvcHkKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYiA9IGNvcHkuZGVlcGNvcHkoYSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChhKSwgaWQoYikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKKwogICAgIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKICAgICAgICAgZm9yIHByb3RvY29sIGluICgwLCAxLCAyKToKICAgICAgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2JpbmFzY2lpLnB5IGIvTGliL3Rlc3QvdGVzdF9iaW5hc2NpaS5weQppbmRleCA4ZGY0NTA0Li44MjcyYWQ5IDEwMDc1NQotLS0gYS9MaWIvdGVzdC90ZXN0X2JpbmFzY2lpLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYmluYXNjaWkucHkKQEAgLTEzNCw3ICsxMzQsNyBAQAogICAgICAgICAgICAgcGFzcwogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJiaW5hc2NpaS5hMmJfcXAoKip7MToxfSkgZGlkbid0IHJhaXNlIFR5cGVFcnJvciIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYTJiX3FwKCI9ICIpLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5hMmJfcXAoIj0gIiksICI9ICIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYTJiX3FwKCI9PSIpLCAiPSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYTJiX3FwKCI9QVgiKSwgIj1BWCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYmluYXNjaWkuYjJhX3FwLCBmb289ImJhciIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2J1ZmlvLnB5IGIvTGliL3Rlc3QvdGVzdF9idWZpby5weQppbmRleCA2MTFjZDY5Li4xNGE5MjZhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2J1ZmlvLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYnVmaW8ucHkKQEAgLTEsNjAgKzEsNjYgQEAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmlmeSwgVGVzdEZhaWxlZCwgVEVTVEZOCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKICMgU2ltcGxlIHRlc3QgdG8gZW5zdXJlIHRoYXQgb3B0aW1pemF0aW9ucyBpbiBmaWxlb2JqZWN0LmMgZGVsaXZlcgogIyB0aGUgZXhwZWN0ZWQgcmVzdWx0cy4gIEZvciBiZXN0IHRlc3RpbmcsIHJ1biB0aGlzIHVuZGVyIGEgZGVidWctYnVpbGQKICMgUHl0aG9uIHRvbyAodG8gZXhlcmNpc2UgYXNzZXJ0cyBpbiB0aGUgQyBjb2RlKS4KIAotIyBSZXBlYXQgc3RyaW5nICdwYXR0ZXJuJyBhcyBvZnRlbiBhcyBuZWVkZWQgdG8gcmVhY2ggdG90YWwgbGVuZ3RoCi0jICdsZW5ndGgnLiAgVGhlbiBjYWxsIHRyeV9vbmUgd2l0aCB0aGF0IHN0cmluZywgYSBzdHJpbmcgb25lIGxhcmdlcgotIyB0aGFuIHRoYXQsIGFuZCBhIHN0cmluZyBvbmUgc21hbGxlciB0aGFuIHRoYXQuICBUaGUgbWFpbiBkcml2ZXIKLSMgZmVlZHMgdGhpcyBhbGwgc21hbGwgc2l6ZXMgYW5kIHZhcmlvdXMgcG93ZXJzIG9mIDIsIHNvIHdlIGV4ZXJjaXNlCi0jIGFsbCBsaWtlbHkgc3RkaW8gYnVmZmVyIHNpemVzLCBhbmQgIm9mZiBieSBvbmUiIGVycm9ycyBvbiBib3RoCi0jIHNpZGVzLgotZGVmIGRyaXZlX29uZShwYXR0ZXJuLCBsZW5ndGgpOgotICAgIHEsIHIgPSBkaXZtb2QobGVuZ3RoLCBsZW4ocGF0dGVybikpCi0gICAgdGVzdHN0cmluZyA9IHBhdHRlcm4gKiBxICsgcGF0dGVybls6cl0KLSAgICB2ZXJpZnkobGVuKHRlc3RzdHJpbmcpID09IGxlbmd0aCkKLSAgICB0cnlfb25lKHRlc3RzdHJpbmcpCi0gICAgdHJ5X29uZSh0ZXN0c3RyaW5nICsgIngiKQotICAgIHRyeV9vbmUodGVzdHN0cmluZ1s6LTFdKQorbGVuZ3RocyA9IHJhbmdlKDEsIDI1NykgKyBbNTEyLCAxMDAwLCAxMDI0LCAyMDQ4LCA0MDk2LCA4MTkyLCAxMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2Mzg0LCAzMjc2OCwgNjU1MzYsIDEwMDAwMDBdCiAKLSMgV3JpdGUgcyArICJcbiIgKyBzIHRvIGZpbGUsIHRoZW4gb3BlbiBpdCBhbmQgZW5zdXJlIHRoYXQgc3VjY2Vzc2l2ZQotIyAucmVhZGxpbmUoKXMgZGVsaXZlciB3aGF0IHdlIHdyb3RlLgotZGVmIHRyeV9vbmUocyk6Ci0gICAgIyBTaW5jZSBDIGRvZXNuJ3QgZ3VhcmFudGVlIHdlIGNhbiB3cml0ZS9yZWFkIGFyYml0cmFyeSBieXRlcyBpbiB0ZXh0Ci0gICAgIyBmaWxlcywgdXNlIGJpbmFyeSBtb2RlLgotICAgIGYgPSBvcGVuKFRFU1RGTiwgIndiIikKLSAgICAjIHdyaXRlIG9uY2Ugd2l0aCBcbiBhbmQgb25jZSB3aXRob3V0Ci0gICAgZi53cml0ZShzKQotICAgIGYud3JpdGUoIlxuIikKLSAgICBmLndyaXRlKHMpCi0gICAgZi5jbG9zZSgpCi0gICAgZiA9IG9wZW4oVEVTVEZOLCAicmIiKQotICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKLSAgICBpZiBsaW5lICE9IHMgKyAiXG4iOgotICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJFeHBlY3RlZCAlciBnb3QgJXIiICUgKHMgKyAiXG4iLCBsaW5lKSkKLSAgICBsaW5lID0gZi5yZWFkbGluZSgpCi0gICAgaWYgbGluZSAhPSBzOgotICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJFeHBlY3RlZCAlciBnb3QgJXIiICUgKHMsIGxpbmUpKQotICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKLSAgICBpZiBsaW5lOgotICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJFeHBlY3RlZCBFT0YgYnV0IGdvdCAlciIgJSBsaW5lKQotICAgIGYuY2xvc2UoKQorY2xhc3MgQnVmZmVyU2l6ZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0cnlfb25lKHNlbGYsIHMpOgorICAgICAgICAjIFdyaXRlIHMgKyAiXG4iICsgcyB0byBmaWxlLCB0aGVuIG9wZW4gaXQgYW5kIGVuc3VyZSB0aGF0IHN1Y2Nlc3NpdmUKKyAgICAgICAgIyAucmVhZGxpbmUoKXMgZGVsaXZlciB3aGF0IHdlIHdyb3RlLgogCi0jIEEgcGF0dGVybiB3aXRoIHByaW1lIGxlbmd0aCwgdG8gYXZvaWQgc2ltcGxlIHJlbGF0aW9uc2hpcHMgd2l0aAotIyBzdGRpbyBidWZmZXIgc2l6ZXMuCi1wcmltZXBhdCA9ICIxMjM0NTY3ODkwXDAwXDAxXDAyXDAzXDA0XDA1XDA2IgorICAgICAgICAjIFNpbmNlIEMgZG9lc24ndCBndWFyYW50ZWUgd2UgY2FuIHdyaXRlL3JlYWQgYXJiaXRyYXJ5IGJ5dGVzIGluIHRleHQKKyAgICAgICAgIyBmaWxlcywgdXNlIGJpbmFyeSBtb2RlLgorICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIHdyaXRlIG9uY2Ugd2l0aCBcbiBhbmQgb25jZSB3aXRob3V0CisgICAgICAgICAgICBmLndyaXRlKHMpCisgICAgICAgICAgICBmLndyaXRlKCJcbiIpCisgICAgICAgICAgICBmLndyaXRlKHMpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpCisgICAgICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIHMgKyAiXG4iKQorICAgICAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBzKQorICAgICAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBsaW5lKSAjIE11c3QgYmUgYXQgRU9GCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCiAKLW51bGxwYXQgPSAiXDAiICogMTAwMAorICAgIGRlZiBkcml2ZV9vbmUoc2VsZiwgcGF0dGVybik6CisgICAgICAgIGZvciBsZW5ndGggaW4gbGVuZ3RoczoKKyAgICAgICAgICAgICMgUmVwZWF0IHN0cmluZyAncGF0dGVybicgYXMgb2Z0ZW4gYXMgbmVlZGVkIHRvIHJlYWNoIHRvdGFsIGxlbmd0aAorICAgICAgICAgICAgIyAnbGVuZ3RoJy4gIFRoZW4gY2FsbCB0cnlfb25lIHdpdGggdGhhdCBzdHJpbmcsIGEgc3RyaW5nIG9uZSBsYXJnZXIKKyAgICAgICAgICAgICMgdGhhbiB0aGF0LCBhbmQgYSBzdHJpbmcgb25lIHNtYWxsZXIgdGhhbiB0aGF0LiAgVHJ5IHRoaXMgd2l0aCBhbGwKKyAgICAgICAgICAgICMgc21hbGwgc2l6ZXMgYW5kIHZhcmlvdXMgcG93ZXJzIG9mIDIsIHNvIHdlIGV4ZXJjaXNlIGFsbCBsaWtlbHkKKyAgICAgICAgICAgICMgc3RkaW8gYnVmZmVyIHNpemVzLCBhbmQgIm9mZiBieSBvbmUiIGVycm9ycyBvbiBib3RoIHNpZGVzLgorICAgICAgICAgICAgcSwgciA9IGRpdm1vZChsZW5ndGgsIGxlbihwYXR0ZXJuKSkKKyAgICAgICAgICAgIHRlc3RzdHJpbmcgPSBwYXR0ZXJuICogcSArIHBhdHRlcm5bOnJdCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0ZXN0c3RyaW5nKSwgbGVuZ3RoKQorICAgICAgICAgICAgc2VsZi50cnlfb25lKHRlc3RzdHJpbmcpCisgICAgICAgICAgICBzZWxmLnRyeV9vbmUodGVzdHN0cmluZyArICJ4IikKKyAgICAgICAgICAgIHNlbGYudHJ5X29uZSh0ZXN0c3RyaW5nWzotMV0pCiAKLXRyeToKLSAgICBmb3Igc2l6ZSBpbiByYW5nZSgxLCAyNTcpICsgWzUxMiwgMTAwMCwgMTAyNCwgMjA0OCwgNDA5NiwgODE5MiwgMTAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgMTYzODQsIDMyNzY4LCA2NTUzNiwgMTAwMDAwMF06Ci0gICAgICAgIGRyaXZlX29uZShwcmltZXBhdCwgc2l6ZSkKLSAgICAgICAgZHJpdmVfb25lKG51bGxwYXQsIHNpemUpCi1maW5hbGx5OgotICAgIHRyeToKLSAgICAgICAgaW1wb3J0IG9zCi0gICAgICAgIG9zLnVubGluayhURVNURk4pCi0gICAgZXhjZXB0OgotICAgICAgICBwYXNzCisgICAgZGVmIHRlc3RfcHJpbWVwYXQoc2VsZik6CisgICAgICAgICMgQSBwYXR0ZXJuIHdpdGggcHJpbWUgbGVuZ3RoLCB0byBhdm9pZCBzaW1wbGUgcmVsYXRpb25zaGlwcyB3aXRoCisgICAgICAgICMgc3RkaW8gYnVmZmVyIHNpemVzLgorICAgICAgICBzZWxmLmRyaXZlX29uZSgiMTIzNDU2Nzg5MFwwMFwwMVwwMlwwM1wwNFwwNVwwNiIpCisKKyAgICBkZWYgdGVzdF9udWxscGF0KHNlbGYpOgorICAgICAgICBzZWxmLmRyaXZlX29uZSgiXDAiICogMTAwMCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQnVmZmVyU2l6ZVRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weSBiL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weQppbmRleCA3YjI0NWQxLi4zODUwMzFmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5CkBAIC0xMTYsNiArMTE2LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoMCksIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWJzKDEyMzQpLCAxMjM0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicygtMTIzNCksIDEyMzQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhYnMoLXN5cy5tYXhpbnQtMSkgPiAwKQogICAgICAgICAjIGZsb2F0CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWJzKDAuMCksIDAuMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoMy4xNCksIDMuMTQpCkBAIC0xNTUsNiArMTU2LDExIEBACiAgICAgICAgIFMgPSBbMTAsIDIwLCAzMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbnkoeCA+IDQyIGZvciB4IGluIFMpLCBGYWxzZSkKIAorICAgIGRlZiB0ZXN0X25lZyhzZWxmKToKKyAgICAgICAgeCA9IC1zeXMubWF4aW50LTEKKyAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoeCwgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgteCwgc3lzLm1heGludCsxKQorCiAgICAgZGVmIHRlc3RfY2FsbGFibGUoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0XyhjYWxsYWJsZShsZW4pKQogICAgICAgICBkZWYgZigpOiBwYXNzCkBAIC02ODYsOSArNjkyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAKICAgICAgICAgcyA9IHJlcHIoLTEtc3lzLm1heGludCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQocykrMSwgLXN5cy5tYXhpbnQpCisgICAgICAgIHggPSBpbnQocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4KzEsIC1zeXMubWF4aW50KQorICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh4LCBpbnQpKQogICAgICAgICAjIHNob3VsZCByZXR1cm4gbG9uZwotICAgICAgICBpbnQoc1sxOl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KHNbMTpdKSwgc3lzLm1heGludCsxKQogCiAgICAgICAgICMgc2hvdWxkIHJldHVybiBsb25nCiAgICAgICAgIHggPSBpbnQoMWUxMDApCkBAIC03MDYsNiArNzE0LDExIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgJzEyM1wwJykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAnNTMnLCA0MCkKIAorICAgICAgICAjIFNGIGJ1ZyAxNTQ1NDk3OiBlbWJlZGRlZCBOVUxzIHdlcmUgbm90IGRldGVjdGVkIHdpdGgKKyAgICAgICAgIyBleHBsaWNpdCBiYXNlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgJzEyM1wwJywgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgJzEyM1x4MDAgMjQ1JywgMjApCisKICAgICAgICAgeCA9IGludCgnMScgKiA2MDApCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHgsIGxvbmcpKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NmZ3BhcnNlci5weSBiL0xpYi90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5CmluZGV4IDY2ZmVjZjEuLjM5NzlmMTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5CkBAIC0xLDkgKzEsMjkgQEAKIGltcG9ydCBDb25maWdQYXJzZXIKIGltcG9ydCBTdHJpbmdJTwogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgVXNlckRpY3QKIAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIAorY2xhc3MgU29ydGVkRGljdChVc2VyRGljdC5Vc2VyRGljdCk6CisgICAgZGVmIGl0ZW1zKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLmRhdGEuaXRlbXMoKQorICAgICAgICByZXN1bHQuc29ydCgpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLmRhdGEua2V5cygpCisgICAgICAgIHJlc3VsdC5zb3J0KCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIAorICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuaXRlbXMoKQorICAgICAgICByZXR1cm4gW2lbMV0gZm9yIGkgaW4gdmFsdWVzXQorCisgICAgZGVmIGl0ZXJpdGVtcyhzZWxmKTogcmV0dXJuIGl0ZXIoc2VsZi5pdGVtcygpKQorICAgIGRlZiBpdGVya2V5cyhzZWxmKTogcmV0dXJuIGl0ZXIoc2VsZi5rZXlzKCkpCisgICAgX19pdGVyX18gPSBpdGVya2V5cworICAgIGRlZiBpdGVydmFsdWVzKHNlbGYpOiByZXR1cm4gaXRlcihzZWxmLnZhbHVlcygpKQogCiBjbGFzcyBUZXN0Q2FzZUJhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBuZXdjb25maWcoc2VsZiwgZGVmYXVsdHM9Tm9uZSk6CkBAIC00MTQsMTIgKzQzNCwzNiBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNmLnNldCwgInNlY3QiLCAib3B0aW9uMiIsIDEuMCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjZi5zZXQsICJzZWN0IiwgIm9wdGlvbjIiLCBvYmplY3QoKSkKIAorY2xhc3MgU29ydGVkVGVzdENhc2UoUmF3Q29uZmlnUGFyc2VyVGVzdENhc2UpOgorICAgIGRlZiBuZXdjb25maWcoc2VsZiwgZGVmYXVsdHM9Tm9uZSk6CisgICAgICAgIHNlbGYuY2YgPSBzZWxmLmNvbmZpZ19jbGFzcyhkZWZhdWx0cz1kZWZhdWx0cywgZGljdF90eXBlPVNvcnRlZERpY3QpCisgICAgICAgIHJldHVybiBzZWxmLmNmCisKKyAgICBkZWYgdGVzdF9zb3J0ZWQoc2VsZik6CisgICAgICAgIHNlbGYuZnJvbXN0cmluZygiW2JdXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAibzQ9MVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIm8zPTJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvMj0zXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAibzE9NFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIlthXVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIms9dlxuIikgICAgICAgIAorICAgICAgICBvdXRwdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHNlbGYuY2Yud3JpdGUob3V0cHV0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvdXRwdXQuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlthXVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiayA9IHZcblxuIiAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIltiXVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAibzEgPSA0XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvMiA9IDNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm8zID0gMlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAibzQgPSAxXG5cbiIpCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAogICAgICAgICBDb25maWdQYXJzZXJUZXN0Q2FzZSwKICAgICAgICAgUmF3Q29uZmlnUGFyc2VyVGVzdENhc2UsCi0gICAgICAgIFNhZmVDb25maWdQYXJzZXJUZXN0Q2FzZQorICAgICAgICBTYWZlQ29uZmlnUGFyc2VyVGVzdENhc2UsCisgICAgICAgIFNvcnRlZFRlc3RDYXNlCiAgICAgKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jZ2kucHkgYi9MaWIvdGVzdC90ZXN0X2NnaS5weQppbmRleCBmOTNmYTU1Li41MmU1ZTkxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NnaS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NnaS5weQpAQCAtMSw4ICsxLDkgQEAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmlmeSwgdmVyYm9zZQorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CiBpbXBvcnQgY2dpCiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKIGltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHVuaXR0ZXN0CiBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogCiBjbGFzcyBIYWNrZWRTeXNNb2R1bGU6CkBAIC0xMjcsMTE5ICsxMjgsMTI0IEBACiBkZWYgZmlyc3Rfc2Vjb25kX2VsdHMobGlzdCk6CiAgICAgcmV0dXJuIG1hcChsYW1iZGEgcDoocFswXSwgcFsxXVswXSksIGxpc3QpCiAKLWRlZiBtYWluKCk6Ci0gICAgZm9yIG9yaWcsIGV4cGVjdCBpbiBwYXJzZV9xc2xfdGVzdF9jYXNlczoKLSAgICAgICAgcmVzdWx0ID0gY2dpLnBhcnNlX3FzbChvcmlnLCBrZWVwX2JsYW5rX3ZhbHVlcz1UcnVlKQotICAgICAgICBwcmludCByZXByKG9yaWcpLCAnPT4nLCByZXN1bHQKLSAgICAgICAgdmVyaWZ5KHJlc3VsdCA9PSBleHBlY3QsICJFcnJvciBwYXJzaW5nICVzIiAlIHJlcHIob3JpZykpCitjbGFzcyBDZ2lUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgICBmb3Igb3JpZywgZXhwZWN0IGluIHBhcnNlX3N0cmljdF90ZXN0X2Nhc2VzOgotICAgICAgICAjIFRlc3QgYmFzaWMgcGFyc2luZwotICAgICAgICBwcmludCByZXByKG9yaWcpCi0gICAgICAgIGQgPSBkb190ZXN0KG9yaWcsICJHRVQiKQotICAgICAgICB2ZXJpZnkoZCA9PSBleHBlY3QsICJFcnJvciBwYXJzaW5nICVzIiAlIHJlcHIob3JpZykpCi0gICAgICAgIGQgPSBkb190ZXN0KG9yaWcsICJQT1NUIikKLSAgICAgICAgdmVyaWZ5KGQgPT0gZXhwZWN0LCAiRXJyb3IgcGFyc2luZyAlcyIgJSByZXByKG9yaWcpKQorICAgIGRlZiB0ZXN0X3FzbChzZWxmKToKKyAgICAgICAgZm9yIG9yaWcsIGV4cGVjdCBpbiBwYXJzZV9xc2xfdGVzdF9jYXNlczoKKyAgICAgICAgICAgIHJlc3VsdCA9IGNnaS5wYXJzZV9xc2wob3JpZywga2VlcF9ibGFua192YWx1ZXM9VHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3QsICJFcnJvciBwYXJzaW5nICVzIiAlIHJlcHIob3JpZykpCiAKLSAgICAgICAgZW52ID0geydRVUVSWV9TVFJJTkcnOiBvcmlnfQotICAgICAgICBmY2QgPSBjZ2kuRm9ybUNvbnRlbnREaWN0KGVudikKLSAgICAgICAgc2QgPSBjZ2kuU3ZGb3JtQ29udGVudERpY3QoZW52KQotICAgICAgICBmcyA9IGNnaS5GaWVsZFN0b3JhZ2UoZW52aXJvbj1lbnYpCi0gICAgICAgIGlmIHR5cGUoZXhwZWN0KSA9PSB0eXBlKHt9KToKLSAgICAgICAgICAgICMgdGVzdCBkaWN0IGludGVyZmFjZQotICAgICAgICAgICAgdmVyaWZ5KGxlbihleHBlY3QpID09IGxlbihmY2QpKQotICAgICAgICAgICAgdmVyaWZ5KG5vcm0oZXhwZWN0LmtleXMoKSkgPT0gbm9ybShmY2Qua2V5cygpKSkKLSAgICAgICAgICAgIHZlcmlmeShub3JtKGV4cGVjdC52YWx1ZXMoKSkgPT0gbm9ybShmY2QudmFsdWVzKCkpKQotICAgICAgICAgICAgdmVyaWZ5KG5vcm0oZXhwZWN0Lml0ZW1zKCkpID09IG5vcm0oZmNkLml0ZW1zKCkpKQotICAgICAgICAgICAgdmVyaWZ5KGZjZC5nZXQoIm5vbmV4aXN0ZW50IGZpZWxkIiwgImRlZmF1bHQiKSA9PSAiZGVmYXVsdCIpCi0gICAgICAgICAgICB2ZXJpZnkobGVuKHNkKSA9PSBsZW4oZnMpKQotICAgICAgICAgICAgdmVyaWZ5KG5vcm0oc2Qua2V5cygpKSA9PSBub3JtKGZzLmtleXMoKSkpCi0gICAgICAgICAgICB2ZXJpZnkoZnMuZ2V0dmFsdWUoIm5vbmV4aXN0ZW50IGZpZWxkIiwgImRlZmF1bHQiKSA9PSAiZGVmYXVsdCIpCi0gICAgICAgICAgICAjIHRlc3QgaW5kaXZpZHVhbCBmaWVsZHMKLSAgICAgICAgICAgIGZvciBrZXkgaW4gZXhwZWN0LmtleXMoKToKLSAgICAgICAgICAgICAgICBleHBlY3RfdmFsID0gZXhwZWN0W2tleV0KLSAgICAgICAgICAgICAgICB2ZXJpZnkoa2V5IGluIGZjZCkKLSAgICAgICAgICAgICAgICB2ZXJpZnkobm9ybShmY2Rba2V5XSkgPT0gbm9ybShleHBlY3Rba2V5XSkpCi0gICAgICAgICAgICAgICAgdmVyaWZ5KGZjZC5nZXQoa2V5LCAiZGVmYXVsdCIpID09IGZjZFtrZXldKQotICAgICAgICAgICAgICAgIHZlcmlmeShrZXkgaW4gZnMpCi0gICAgICAgICAgICAgICAgaWYgbGVuKGV4cGVjdF92YWwpID4gMToKLSAgICAgICAgICAgICAgICAgICAgc2luZ2xlX3ZhbHVlID0gMAorICAgIGRlZiB0ZXN0X3N0cmljdChzZWxmKToKKyAgICAgICAgZm9yIG9yaWcsIGV4cGVjdCBpbiBwYXJzZV9zdHJpY3RfdGVzdF9jYXNlczoKKyAgICAgICAgICAgICMgVGVzdCBiYXNpYyBwYXJzaW5nCisgICAgICAgICAgICBkID0gZG9fdGVzdChvcmlnLCAiR0VUIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZXhwZWN0LCAiRXJyb3IgcGFyc2luZyAlcyIgJSByZXByKG9yaWcpKQorICAgICAgICAgICAgZCA9IGRvX3Rlc3Qob3JpZywgIlBPU1QiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBleHBlY3QsICJFcnJvciBwYXJzaW5nICVzIiAlIHJlcHIob3JpZykpCisKKyAgICAgICAgICAgIGVudiA9IHsnUVVFUllfU1RSSU5HJzogb3JpZ30KKyAgICAgICAgICAgIGZjZCA9IGNnaS5Gb3JtQ29udGVudERpY3QoZW52KQorICAgICAgICAgICAgc2QgPSBjZ2kuU3ZGb3JtQ29udGVudERpY3QoZW52KQorICAgICAgICAgICAgZnMgPSBjZ2kuRmllbGRTdG9yYWdlKGVudmlyb249ZW52KQorICAgICAgICAgICAgaWYgdHlwZShleHBlY3QpID09IHR5cGUoe30pOgorICAgICAgICAgICAgICAgICMgdGVzdCBkaWN0IGludGVyZmFjZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGV4cGVjdCksIGxlbihmY2QpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9ybShleHBlY3Qua2V5cygpKSwgbm9ybShmY2Qua2V5cygpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vcm0oZXhwZWN0LnZhbHVlcygpKSwgbm9ybShmY2QudmFsdWVzKCkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9ybShleHBlY3QuaXRlbXMoKSksIG5vcm0oZmNkLml0ZW1zKCkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmNkLmdldCgibm9uZXhpc3RlbnQgZmllbGQiLCAiZGVmYXVsdCIpLCAiZGVmYXVsdCIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2QpLCBsZW4oZnMpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9ybShzZC5rZXlzKCkpLCBub3JtKGZzLmtleXMoKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcy5nZXR2YWx1ZSgibm9uZXhpc3RlbnQgZmllbGQiLCAiZGVmYXVsdCIpLCAiZGVmYXVsdCIpCisgICAgICAgICAgICAgICAgIyB0ZXN0IGluZGl2aWR1YWwgZmllbGRzCisgICAgICAgICAgICAgICAgZm9yIGtleSBpbiBleHBlY3Qua2V5cygpOgorICAgICAgICAgICAgICAgICAgICBleHBlY3RfdmFsID0gZXhwZWN0W2tleV0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGtleSBpbiBmY2QpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9ybShmY2Rba2V5XSksIG5vcm0oZXhwZWN0W2tleV0pKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZjZC5nZXQoa2V5LCAiZGVmYXVsdCIpLCBmY2Rba2V5XSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGtleSBpbiBmcykKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGV4cGVjdF92YWwpID4gMToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZV92YWx1ZSA9IDAKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZV92YWx1ZSA9IDEKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gc2Rba2V5XQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbElmKHNpbmdsZV92YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnMuZ2V0dmFsdWUoa2V5KSwgZXhwZWN0X3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhzaW5nbGVfdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgZXhwZWN0X3ZhbFswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnMuZ2V0dmFsdWUoa2V5KSwgZXhwZWN0X3ZhbFswXSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtKHNkLmdldGxpc3Qoa2V5KSksIG5vcm0oZXhwZWN0X3ZhbCkpCisgICAgICAgICAgICAgICAgICAgIGlmIHNpbmdsZV92YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9ybShzZC52YWx1ZXMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfZWx0cyhub3JtKGV4cGVjdC52YWx1ZXMoKSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtKHNkLml0ZW1zKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3NlY29uZF9lbHRzKG5vcm0oZXhwZWN0Lml0ZW1zKCkpKSkKKworICAgIGRlZiB0ZXN0X3dlaXJkX2Zvcm1jb250ZW50ZGljdChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoZSB3ZWlyZCBGb3JtQ29udGVudERpY3QgY2xhc3NlcworICAgICAgICBlbnYgPSB7J1FVRVJZX1NUUklORyc6ICJ4PTEmeT0yLjAmej0yLTMuJTJiMCYxPTFhYmMifQorICAgICAgICBleHBlY3QgPSB7J3gnOiAxLCAneSc6IDIuMCwgJ3onOiAnMi0zLiswJywgJzEnOiAnMWFiYyd9CisgICAgICAgIGQgPSBjZ2kuSW50ZXJwRm9ybUNvbnRlbnREaWN0KGVudikKKyAgICAgICAgZm9yIGssIHYgaW4gZXhwZWN0Lml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRba10sIHYpCisgICAgICAgIGZvciBrLCB2IGluIGQuaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0W2tdLCB2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vcm0oZXhwZWN0LnZhbHVlcygpKSwgbm9ybShkLnZhbHVlcygpKSkKKworICAgIGRlZiB0ZXN0X2xvZyhzZWxmKToKKyAgICAgICAgY2dpLmxvZygiVGVzdGluZyIpCisKKyAgICAgICAgY2dpLmxvZ2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBjZ2kuaW5pdGxvZygiJXMiLCAiVGVzdGluZyBpbml0bG9nIDEiKQorICAgICAgICBjZ2kubG9nKCIlcyIsICJUZXN0aW5nIGxvZyAyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjZ2kubG9nZnAuZ2V0dmFsdWUoKSwgIlRlc3RpbmcgaW5pdGxvZyAxXG5UZXN0aW5nIGxvZyAyXG4iKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cygiL2Rldi9udWxsIik6CisgICAgICAgICAgICBjZ2kubG9nZnAgPSBOb25lCisgICAgICAgICAgICBjZ2kubG9nZmlsZSA9ICIvZGV2L251bGwiCisgICAgICAgICAgICBjZ2kuaW5pdGxvZygiJXMiLCAiVGVzdGluZyBsb2cgMyIpCisgICAgICAgICAgICBjZ2kubG9nKCJUZXN0aW5nIGxvZyA0IikKKworICAgIGRlZiB0ZXN0X2ZpZWxkc3RvcmFnZV9yZWFkbGluZShzZWxmKToKKyAgICAgICAgIyBGaWVsZFN0b3JhZ2UgdXNlcyByZWFkbGluZSwgd2hpY2ggaGFzIHRoZSBjYXBhY2l0eSB0byByZWFkIGFsbAorICAgICAgICAjIGNvbnRlbnRzIG9mIHRoZSBpbnB1dCBmaWxlIGludG8gbWVtb3J5OyB3ZSB1c2UgcmVhZGxpbmUncyBzaXplIGFyZ3VtZW50CisgICAgICAgICMgdG8gcHJldmVudCB0aGF0IGZvciBmaWxlcyB0aGF0IGRvIG5vdCBjb250YWluIGFueSBuZXdsaW5lcyBpbgorICAgICAgICAjIG5vbi1HRVQvSEVBRCByZXF1ZXN0cworICAgICAgICBjbGFzcyBUZXN0UmVhZGxpbmVGaWxlOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUpOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZSA9IGZpbGUKKyAgICAgICAgICAgICAgICBzZWxmLm51bWNhbGxzID0gMAorCisgICAgICAgICAgICBkZWYgcmVhZGxpbmUoc2VsZiwgc2l6ZT1Ob25lKToKKyAgICAgICAgICAgICAgICBzZWxmLm51bWNhbGxzICs9IDEKKyAgICAgICAgICAgICAgICBpZiBzaXplOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlLnJlYWRsaW5lKHNpemUpCiAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgc2luZ2xlX3ZhbHVlID0gMQotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgdmFsID0gc2Rba2V5XQotICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgotICAgICAgICAgICAgICAgICAgICB2ZXJpZnkobm90IHNpbmdsZV92YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgdmVyaWZ5KGZzLmdldHZhbHVlKGtleSkgPT0gZXhwZWN0X3ZhbCkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICB2ZXJpZnkoc2luZ2xlX3ZhbHVlKQotICAgICAgICAgICAgICAgICAgICB2ZXJpZnkodmFsID09IGV4cGVjdF92YWxbMF0pCi0gICAgICAgICAgICAgICAgICAgIHZlcmlmeShmcy5nZXR2YWx1ZShrZXkpID09IGV4cGVjdF92YWxbMF0pCi0gICAgICAgICAgICAgICAgdmVyaWZ5KG5vcm0oc2QuZ2V0bGlzdChrZXkpKSA9PSBub3JtKGV4cGVjdF92YWwpKQotICAgICAgICAgICAgICAgIGlmIHNpbmdsZV92YWx1ZToKLSAgICAgICAgICAgICAgICAgICAgdmVyaWZ5KG5vcm0oc2QudmFsdWVzKCkpID09IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2VsdHMobm9ybShleHBlY3QudmFsdWVzKCkpKSkKLSAgICAgICAgICAgICAgICAgICAgdmVyaWZ5KG5vcm0oc2QuaXRlbXMoKSkgPT0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Rfc2Vjb25kX2VsdHMobm9ybShleHBlY3QuaXRlbXMoKSkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlLnJlYWRsaW5lKCkKIAotICAgICMgVGVzdCB0aGUgd2VpcmQgRm9ybUNvbnRlbnREaWN0IGNsYXNzZXMKLSAgICBlbnYgPSB7J1FVRVJZX1NUUklORyc6ICJ4PTEmeT0yLjAmej0yLTMuJTJiMCYxPTFhYmMifQotICAgIGV4cGVjdCA9IHsneCc6IDEsICd5JzogMi4wLCAneic6ICcyLTMuKzAnLCAnMSc6ICcxYWJjJ30KLSAgICBkID0gY2dpLkludGVycEZvcm1Db250ZW50RGljdChlbnYpCi0gICAgZm9yIGssIHYgaW4gZXhwZWN0Lml0ZW1zKCk6Ci0gICAgICAgIHZlcmlmeShkW2tdID09IHYpCi0gICAgZm9yIGssIHYgaW4gZC5pdGVtcygpOgotICAgICAgICB2ZXJpZnkoZXhwZWN0W2tdID09IHYpCi0gICAgdmVyaWZ5KG5vcm0oZXhwZWN0LnZhbHVlcygpKSA9PSBub3JtKGQudmFsdWVzKCkpKQorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgICAgIGZpbGUgPSBzZWxmLl9fZGljdF9fWydmaWxlJ10KKyAgICAgICAgICAgICAgICBhID0gZ2V0YXR0cihmaWxlLCBuYW1lKQorICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGEsIGludCk6CisgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgYSkKKyAgICAgICAgICAgICAgICByZXR1cm4gYQogCi0gICAgcHJpbnQgIlRlc3RpbmcgbG9nIgotICAgIGNnaS5sb2coIlRlc3RpbmciKQotICAgIGNnaS5sb2dmcCA9IHN5cy5zdGRvdXQKLSAgICBjZ2kuaW5pdGxvZygiJXMiLCAiVGVzdGluZyBpbml0bG9nIDEiKQotICAgIGNnaS5sb2coIiVzIiwgIlRlc3RpbmcgbG9nIDIiKQotICAgIGlmIG9zLnBhdGguZXhpc3RzKCIvZGV2L251bGwiKToKLSAgICAgICAgY2dpLmxvZ2ZwID0gTm9uZQotICAgICAgICBjZ2kubG9nZmlsZSA9ICIvZGV2L251bGwiCi0gICAgICAgIGNnaS5pbml0bG9nKCIlcyIsICJUZXN0aW5nIGxvZyAzIikKLSAgICAgICAgY2dpLmxvZygiVGVzdGluZyBsb2cgNCIpCisgICAgICAgIGYgPSBUZXN0UmVhZGxpbmVGaWxlKHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUoKSkKKyAgICAgICAgZi53cml0ZSgneCcgKiAyNTYgKiAxMDI0KQorICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgZW52ID0geydSRVFVRVNUX01FVEhPRCc6J1BVVCd9CisgICAgICAgIGZzID0gY2dpLkZpZWxkU3RvcmFnZShmcD1mLCBlbnZpcm9uPWVudikKKyAgICAgICAgIyBpZiB3ZSdyZSBub3QgY2h1bmtpbmcgcHJvcGVybHksIHJlYWRsaW5lIGlzIG9ubHkgY2FsbGVkIHR3aWNlCisgICAgICAgICMgKGJ5IHJlYWRfYmluYXJ5KTsgaWYgd2UgYXJlIGNodW5raW5nIHByb3Blcmx5LCBpdCB3aWxsIGJlIGNhbGxlZCA1IHRpbWVzCisgICAgICAgICMgYXMgbG9uZyBhcyB0aGUgY2h1bmtzaXplIGlzIDEgPDwgMTYuCisgICAgICAgIHNlbGYuYXNzZXJ0XyhmLm51bWNhbGxzID4gMikKIAotICAgIHByaW50ICJUZXN0IEZpZWxkU3RvcmFnZSBtZXRob2RzIHRoYXQgdXNlIHJlYWRsaW5lIgotICAgICMgRmllbGRTdG9yYWdlIHVzZXMgcmVhZGxpbmUsIHdoaWNoIGhhcyB0aGUgY2FwYWNpdHkgdG8gcmVhZCBhbGwKLSAgICAjIGNvbnRlbnRzIG9mIHRoZSBpbnB1dCBmaWxlIGludG8gbWVtb3J5OyB3ZSB1c2UgcmVhZGxpbmUncyBzaXplIGFyZ3VtZW50Ci0gICAgIyB0byBwcmV2ZW50IHRoYXQgZm9yIGZpbGVzIHRoYXQgZG8gbm90IGNvbnRhaW4gYW55IG5ld2xpbmVzIGluCi0gICAgIyBub24tR0VUL0hFQUQgcmVxdWVzdHMKLSAgICBjbGFzcyBUZXN0UmVhZGxpbmVGaWxlOgotICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSk6Ci0gICAgICAgICAgICBzZWxmLmZpbGUgPSBmaWxlCi0gICAgICAgICAgICBzZWxmLm51bWNhbGxzID0gMAotCi0gICAgICAgIGRlZiByZWFkbGluZShzZWxmLCBzaXplPU5vbmUpOgotICAgICAgICAgICAgc2VsZi5udW1jYWxscyArPSAxCi0gICAgICAgICAgICBpZiBzaXplOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbGUucmVhZGxpbmUoc2l6ZSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZS5yZWFkbGluZSgpCi0KLSAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgotICAgICAgICAgICAgZmlsZSA9IHNlbGYuX19kaWN0X19bJ2ZpbGUnXQotICAgICAgICAgICAgYSA9IGdldGF0dHIoZmlsZSwgbmFtZSkKLSAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGEsIGludCk6Ci0gICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBhKQotICAgICAgICAgICAgcmV0dXJuIGEKLQotICAgIGYgPSBUZXN0UmVhZGxpbmVGaWxlKHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUoKSkKLSAgICBmLndyaXRlKCd4JyAqIDI1NiAqIDEwMjQpCi0gICAgZi5zZWVrKDApCi0gICAgZW52ID0geydSRVFVRVNUX01FVEhPRCc6J1BVVCd9Ci0gICAgZnMgPSBjZ2kuRmllbGRTdG9yYWdlKGZwPWYsIGVudmlyb249ZW52KQotICAgICMgaWYgd2UncmUgbm90IGNodW5raW5nIHByb3Blcmx5LCByZWFkbGluZSBpcyBvbmx5IGNhbGxlZCB0d2ljZQotICAgICMgKGJ5IHJlYWRfYmluYXJ5KTsgaWYgd2UgYXJlIGNodW5raW5nIHByb3Blcmx5LCBpdCB3aWxsIGJlIGNhbGxlZCA1IHRpbWVzCi0gICAgIyBhcyBsb25nIGFzIHRoZSBjaHVua3NpemUgaXMgMSA8PCAxNi4KLSAgICB2ZXJpZnkoZi5udW1jYWxscyA+IDIpCi0KLSAgICBwcmludCAiVGVzdCBiYXNpYyBGaWVsZFN0b3JhZ2UgbXVsdGlwYXJ0IHBhcnNpbmciCi0gICAgZW52ID0geydSRVFVRVNUX01FVEhPRCc6J1BPU1QnLCAnQ09OVEVOVF9UWVBFJzonbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tNzIxODM3MzczMzUwNzA1NTI2Njg4MTY0Njg0JywgJ0NPTlRFTlRfTEVOR1RIJzonNTU4J30KLSAgICBwb3N0ZGF0YSA9ICIiIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tNzIxODM3MzczMzUwNzA1NTI2Njg4MTY0Njg0CisgICAgZGVmIHRlc3RfZmllbGRzdG9yYWdlX211bHRpcGFydChzZWxmKToKKyAgICAgICAgI1Rlc3QgYmFzaWMgRmllbGRTdG9yYWdlIG11bHRpcGFydCBwYXJzaW5nCisgICAgICAgIGVudiA9IHsnUkVRVUVTVF9NRVRIT0QnOidQT1NUJywgJ0NPTlRFTlRfVFlQRSc6J211bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTcyMTgzNzM3MzM1MDcwNTUyNjY4ODE2NDY4NCcsICdDT05URU5UX0xFTkdUSCc6JzU1OCd9CisgICAgICAgIHBvc3RkYXRhID0gIiIiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS03MjE4MzczNzMzNTA3MDU1MjY2ODgxNjQ2ODQKIENvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iaWQiCiAKIDEyMzQKQEAgLTI1OSwxNSArMjY1LDE5IEBACiAgQWRkXHgyMAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS03MjE4MzczNzMzNTA3MDU1MjY2ODgxNjQ2ODQtLQogIiIiCi0gICAgZnMgPSBjZ2kuRmllbGRTdG9yYWdlKGZwPVN0cmluZ0lPKHBvc3RkYXRhKSwgZW52aXJvbj1lbnYpCi0gICAgdmVyaWZ5KGxlbihmcy5saXN0KSA9PSA0KQotICAgIGV4cGVjdCA9IFt7J25hbWUnOidpZCcsICdmaWxlbmFtZSc6Tm9uZSwgJ3ZhbHVlJzonMTIzNCd9LAotICAgICAgICAgICAgICB7J25hbWUnOid0aXRsZScsICdmaWxlbmFtZSc6Tm9uZSwgJ3ZhbHVlJzonJ30sCi0gICAgICAgICAgICAgIHsnbmFtZSc6J2ZpbGUnLCAnZmlsZW5hbWUnOid0ZXN0LnR4dCcsJ3ZhbHVlJzonVGVzdGluZyAxMjMuXG4nfSwKLSAgICAgICAgICAgICAgeyduYW1lJzonc3VibWl0JywgJ2ZpbGVuYW1lJzpOb25lLCAndmFsdWUnOicgQWRkICd9XQotICAgIGZvciB4IGluIHJhbmdlKGxlbihmcy5saXN0KSk6Ci0gICAgICAgIGZvciBrLCBleHAgaW4gZXhwZWN0W3hdLml0ZW1zKCk6Ci0gICAgICAgICAgICBnb3QgPSBnZXRhdHRyKGZzLmxpc3RbeF0sIGspCi0gICAgICAgICAgICB2ZXJpZnkoZ290ID09IGV4cCkKKyAgICAgICAgZnMgPSBjZ2kuRmllbGRTdG9yYWdlKGZwPVN0cmluZ0lPKHBvc3RkYXRhKSwgZW52aXJvbj1lbnYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihmcy5saXN0KSwgNCkKKyAgICAgICAgZXhwZWN0ID0gW3snbmFtZSc6J2lkJywgJ2ZpbGVuYW1lJzpOb25lLCAndmFsdWUnOicxMjM0J30sCisgICAgICAgICAgICAgICAgICB7J25hbWUnOid0aXRsZScsICdmaWxlbmFtZSc6Tm9uZSwgJ3ZhbHVlJzonJ30sCisgICAgICAgICAgICAgICAgICB7J25hbWUnOidmaWxlJywgJ2ZpbGVuYW1lJzondGVzdC50eHQnLCd2YWx1ZSc6J1Rlc3RpbmcgMTIzLlxuJ30sCisgICAgICAgICAgICAgICAgICB7J25hbWUnOidzdWJtaXQnLCAnZmlsZW5hbWUnOk5vbmUsICd2YWx1ZSc6JyBBZGQgJ31dCisgICAgICAgIGZvciB4IGluIHJhbmdlKGxlbihmcy5saXN0KSk6CisgICAgICAgICAgICBmb3IgaywgZXhwIGluIGV4cGVjdFt4XS5pdGVtcygpOgorICAgICAgICAgICAgICAgIGdvdCA9IGdldGF0dHIoZnMubGlzdFt4XSwgaykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhnb3QsIGV4cCkKIAotbWFpbigpCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KENnaVRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NsYXNzLnB5IGIvTGliL3Rlc3QvdGVzdF9jbGFzcy5weQppbmRleCBmMzM0NjJhLi4zMjAxZGQ4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NsYXNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2xhc3MucHkKQEAgLTE4Niw2ICsxODYsMTQgQEAKIAogIyBMaXN0L2RpY3Qgb3BlcmF0aW9ucwogCitjbGFzcyBFbXB0eTogcGFzcworCit0cnk6CisgICAgMSBpbiBFbXB0eSgpCisgICAgcHJpbnQgJ2ZhaWxlZCwgc2hvdWxkIGhhdmUgcmFpc2VkIFR5cGVFcnJvcicKK2V4Y2VwdCBUeXBlRXJyb3I6CisgICAgcGFzcworCiAxIGluIHRlc3RtZQogCiB0ZXN0bWVbMV0KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfY24ucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2NuLnB5CmluZGV4IDFiZjg1ODMuLmM1NThmMWIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfY24ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weQpAQCAtMzIsNiArMzIsNyBAQAogICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzRceGM4IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1ODA0YVx1ZmZmZCIpLAogICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAiaWdub3JlIiwgIHUiYWJjXHU4MDRhIiksCiAgICAgICAgICgiXHg4M1x4MzRceDgzXHgzMSIsICJzdHJpY3QiLCBOb25lKSwKKyAgICAgICAgKHUiXHUzMGZiIiwgInN0cmljdCIsIE5vbmUpLAogICAgICkKIAogY2xhc3MgVGVzdF9HQjE4MDMwKHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNDUsNiArNDYsNyBAQAogICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzRceGM4IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1ODA0YVx1ZmZmZCIpLAogICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAiaWdub3JlIiwgIHUiYWJjXHU4MDRhIiksCiAgICAgICAgICgiYWJjXHg4NFx4MzlceDg0XHgzOVx4YzFceGM0IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1ODA0YSIpLAorICAgICAgICAodSJcdTMwZmIiLCAic3RyaWN0IiwgIlx4ODE5XHhhNzkiKSwKICAgICApCiAgICAgaGFzX2lzbzEwNjQ2ID0gVHJ1ZQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjcy5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CmluZGV4IDgxNTM5NzkuLjNjODAwZjggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CkBAIC00MjUsNiArNDI1LDEwIEBACiAgICAgICAgICAgICBdCiAgICAgICAgICkKIAorICAgIGRlZiB0ZXN0X2J1ZzE2MDE1MDEoc2VsZik6CisgICAgICAgICMgU0YgYnVnICMxNjAxNTAxOiBjaGVjayB0aGF0IHRoZSBjb2RlYyB3b3JrcyB3aXRoIGEgYnVmZmVyCisgICAgICAgIHVuaWNvZGUoIlx4ZWZceGJiXHhiZiIsICJ1dGYtOC1zaWciKQorCiBjbGFzcyBFc2NhcGVEZWNvZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9lbXB0eShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY29kZWNzLmVzY2FwZV9kZWNvZGUoIiIpLCAoIiIsIDApKQpAQCAtOTEwLDYgKzkxNCwxOCBAQAogICAgICAgICBmID0gc2VsZi5yZWFkZXIoc2VsZi5zdHJlYW0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYucmVhZGxpbmVzKCksIFt1J1x1ZDU1Y1xuJywgdSdcdWFlMDAnXSkKIAorY2xhc3MgRW5jb2RlZEZpbGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBmID0gU3RyaW5nSU8uU3RyaW5nSU8oJ1x4ZWRceDk1XHg5Y1xuXHhlYVx4YjhceDgwJykKKyAgICAgICAgZWYgPSBjb2RlY3MuRW5jb2RlZEZpbGUoZiwgJ3V0Zi0xNi1sZScsICd1dGYtOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGVmLnJlYWQoKSwgJ1xcXHhkNVxuXHgwMFx4MDBceGFlJykKKworICAgICAgICBmID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBlZiA9IGNvZGVjcy5FbmNvZGVkRmlsZShmLCAndXRmLTgnLCAnbGF0aW4xJykKKyAgICAgICAgZWYud3JpdGUoJ1x4YzNceGJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZi5nZXR2YWx1ZSgpLCAnXHhmYycpCisKIGNsYXNzIFN0cjJTdHJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6CkBAIC0xMDUwLDYgKzEwNjYsMTQgQEAKICAgICAicHVueWNvZGUiLAogICAgICJ1bmljb2RlX2ludGVybmFsIgogXQorYnJva2VuX2luY3JlbWVudGFsX2NvZGVycyA9IGJyb2tlbl91bmljb2RlX3dpdGhfc3RyZWFtc1s6XQorCisjIFRoZSBmb2xsb3dpbmcgZW5jb2RpbmdzIG9ubHkgc3VwcG9ydCAic3RyaWN0IiBtb2RlCitvbmx5X3N0cmljdF9tb2RlID0gWworICAgICJpZG5hIiwKKyAgICAiemxpYl9jb2RlYyIsCisgICAgImJ6Ml9jb2RlYyIsCitdCiAKIHRyeToKICAgICBpbXBvcnQgYnoyCkBAIC0xMDk5LDYgKzExMjMsNyBAQAogICAgICAgICAgICAgICAgICAgICBkZWNvZGVkcmVzdWx0ICs9IHJlYWRlci5yZWFkKCkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWRyZXN1bHQsIHMsICIlciAhPSAlciAoZW5jb2Rpbmc9JXIpIiAlIChkZWNvZGVkcmVzdWx0LCBzLCBlbmNvZGluZykpCiAKKyAgICAgICAgICAgIGlmIGVuY29kaW5nIG5vdCBpbiBicm9rZW5faW5jcmVtZW50YWxfY29kZXJzOgogICAgICAgICAgICAgICAgICMgY2hlY2sgaW5jcmVtZW50YWwgZGVjb2Rlci9lbmNvZGVyIChmZXRjaGVkIHZpYSB0aGUgUHl0aG9uCiAgICAgICAgICAgICAgICAgIyBhbmQgQyBBUEkpIGFuZCBpdGVyZW5jb2RlKCkvaXRlcmRlY29kZSgpCiAgICAgICAgICAgICAgICAgdHJ5OgpAQCAtMTEzOSw2ICsxMTY0LDI0IEBACiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHUiIi5qb2luKGNvZGVjcy5pdGVyZGVjb2RlKGNvZGVjcy5pdGVyZW5jb2RlKHUiIiwgZW5jb2RpbmcpLCBlbmNvZGluZykpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCB1IiIpCiAKKyAgICAgICAgICAgICAgICBpZiBlbmNvZGluZyBub3QgaW4gb25seV9zdHJpY3RfbW9kZToKKyAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpbmNyZW1lbnRhbCBkZWNvZGVyL2VuY29kZXIgd2l0aCBlcnJvcnMgYXJndW1lbnQKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGVuY29kZXIoZW5jb2RpbmcpKCJpZ25vcmUiKQorICAgICAgICAgICAgICAgICAgICAgICAgY2VuY29kZXIgPSBfdGVzdGNhcGkuY29kZWNfaW5jcmVtZW50YWxlbmNvZGVyKGVuY29kaW5nLCAiaWdub3JlIikKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOiAjIG5vIEluY3JlbWVudGFsRW5jb2RlcgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCA9ICIiLmpvaW4oZW5jb2Rlci5lbmNvZGUoYykgZm9yIGMgaW4gcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxkZWNvZGVyKGVuY29kaW5nKSgiaWdub3JlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgPSB1IiIuam9pbihkZWNvZGVyLmRlY29kZShjKSBmb3IgYyBpbiBlbmNvZGVkcmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVkcmVzdWx0LCBzLCAiJXIgIT0gJXIgKGVuY29kaW5nPSVyKSIgJSAoZGVjb2RlZHJlc3VsdCwgcywgZW5jb2RpbmcpKQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkcmVzdWx0ID0gIiIuam9pbihjZW5jb2Rlci5lbmNvZGUoYykgZm9yIGMgaW4gcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNkZWNvZGVyID0gX3Rlc3RjYXBpLmNvZGVjX2luY3JlbWVudGFsZGVjb2RlcihlbmNvZGluZywgImlnbm9yZSIpCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkcmVzdWx0ID0gdSIiLmpvaW4oY2RlY29kZXIuZGVjb2RlKGMpIGZvciBjIGluIGVuY29kZWRyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWRyZXN1bHQsIHMsICIlciAhPSAlciAoZW5jb2Rpbmc9JXIpIiAlIChkZWNvZGVkcmVzdWx0LCBzLCBlbmNvZGluZykpCisKICAgICBkZWYgdGVzdF9zZWVrKHNlbGYpOgogICAgICAgICAjIGFsbCBjb2RlY3Mgc2hvdWxkIGJlIGFibGUgdG8gZW5jb2RlIHRoZXNlCiAgICAgICAgIHMgPSB1IiVzXG4lc1xuIiAlICgxMDAqdSJhYmMxMjMiLCAxMDAqdSJkZWY0NTYiKQpAQCAtMTIxNCw2ICsxMjU3LDE5IEBACiAgICAgICAgICAgICAodSIiLCBsZW4oYWxsYnl0ZXMpKQogICAgICAgICApCiAKK2NsYXNzIFdpdGhTdG10VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZW5jb2RlZGZpbGUoc2VsZik6CisgICAgICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTygiXHhjM1x4YmMiKQorICAgICAgICB3aXRoIGNvZGVjcy5FbmNvZGVkRmlsZShmLCAibGF0aW4tMSIsICJ1dGYtOCIpIGFzIGVmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZWYucmVhZCgpLCAiXHhmYyIpCisKKyAgICBkZWYgdGVzdF9zdHJlYW1yZWFkZXJ3cml0ZXIoc2VsZik6CisgICAgICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTygiXHhjM1x4YmMiKQorICAgICAgICBpbmZvID0gY29kZWNzLmxvb2t1cCgidXRmLTgiKQorICAgICAgICB3aXRoIGNvZGVjcy5TdHJlYW1SZWFkZXJXcml0ZXIoZiwgaW5mby5zdHJlYW1yZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnN0cmVhbXdyaXRlciwgJ3N0cmljdCcpIGFzIHNydzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNydy5yZWFkKCksIHUiXHhmYyIpCisKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCkBAIC0xMjM0LDEwICsxMjkwLDEyIEBACiAgICAgICAgIElETkFDb2RlY1Rlc3QsCiAgICAgICAgIENvZGVjc01vZHVsZVRlc3QsCiAgICAgICAgIFN0cmVhbVJlYWRlclRlc3QsCisgICAgICAgIEVuY29kZWRGaWxlVGVzdCwKICAgICAgICAgU3RyMlN0clRlc3QsCiAgICAgICAgIEJhc2ljVW5pY29kZVRlc3QsCiAgICAgICAgIEJhc2ljU3RyVGVzdCwKLSAgICAgICAgQ2hhcm1hcFRlc3QKKyAgICAgICAgQ2hhcm1hcFRlc3QsCisgICAgICAgIFdpdGhTdG10VGVzdCwKICAgICApCiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb21wbGV4X2FyZ3MucHkgYi9MaWIvdGVzdC90ZXN0X2NvbXBsZXhfYXJncy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmQ1MGE5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9jb21wbGV4X2FyZ3MucHkKQEAgLTAsMCArMSw5MSBAQAorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2NsYXNzIENvbXBsZXhBcmdzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrKHNlbGYsIGZ1bmMsIGV4cGVjdGVkLCAqYXJncyk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYygqYXJncyksIGV4cGVjdGVkKQorCisgICAgIyBUaGVzZSBmdW5jdGlvbnMgYXJlIHRlc3RlZCBiZWxvdyBhcyBsYW1iZGFzIHRvby4gIElmIHlvdSBhZGQgYSBmdW5jdGlvbiB0ZXN0LAorICAgICMgYWxzbyBhZGQgYSBzaW1pbGFyIGxhbWJkYSB0ZXN0LgorCisgICAgZGVmIHRlc3RfZnVuY19wYXJlbnNfbm9fdW5wYWNraW5nKHNlbGYpOgorICAgICAgICBkZWYgZigoKCgoeCkpKSkpOiByZXR1cm4geAorICAgICAgICBzZWxmLmNoZWNrKGYsIDEsIDEpCisgICAgICAgICMgSW5uZXIgcGFyZW5zIGFyZSBlbGlkZWQsIHNhbWUgYXM6IGYoeCwpCisgICAgICAgIGRlZiBmKCgoeCkpLCk6IHJldHVybiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgMiwgMikKKworICAgIGRlZiB0ZXN0X2Z1bmNfMShzZWxmKToKKyAgICAgICAgZGVmIGYoKCgoKHgpLCkpKSk6IHJldHVybiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgMywgKDMsKSkKKyAgICAgICAgZGVmIGYoKCgoKHgpKSwpKSk6IHJldHVybiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgNCwgKDQsKSkKKyAgICAgICAgZGVmIGYoKCgoKHgpKSksKSk6IHJldHVybiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgNSwgKDUsKSkKKyAgICAgICAgZGVmIGYoKCh4KSwpKTogcmV0dXJuIHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCA2LCAoNiwpKQorCisgICAgZGVmIHRlc3RfZnVuY18yKHNlbGYpOgorICAgICAgICBkZWYgZigoKCgoeCkpLCksKSk6IHJldHVybiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgMiwgKCgyLCksKSkKKworICAgIGRlZiB0ZXN0X2Z1bmNfMyhzZWxmKToKKyAgICAgICAgZGVmIGYoKCgoKCh4KSksKSwpLCkpOiByZXR1cm4geAorICAgICAgICBzZWxmLmNoZWNrKGYsIDMsICgoKDMsKSwpLCkpCisKKyAgICBkZWYgdGVzdF9mdW5jX2NvbXBsZXgoc2VsZik6CisgICAgICAgIGRlZiBmKCgoKCgoeCkpLCksKSwpLCBhLCBiLCBjKTogcmV0dXJuIHgsIGEsIGIsIGMKKyAgICAgICAgc2VsZi5jaGVjayhmLCAoMywgOSwgOCwgNyksICgoKDMsKSwpLCksIDksIDgsIDcpCisKKyAgICAgICAgZGVmIGYoKCgoKCgoeCkpLCkpLCksKSwgYSwgYiwgYyk6IHJldHVybiB4LCBhLCBiLCBjCisgICAgICAgIHNlbGYuY2hlY2soZiwgKDMsIDksIDgsIDcpLCAoKCgzLCksKSwpLCA5LCA4LCA3KQorCisgICAgICAgIGRlZiBmKGEsIGIsIGMsICgoKCgoKHgpKSwpKSwpLCkpOiByZXR1cm4gYSwgYiwgYywgeAorICAgICAgICBzZWxmLmNoZWNrKGYsICg5LCA4LCA3LCAzKSwgOSwgOCwgNywgKCgoMywpLCksKSkKKworICAgICMgRHVwbGljYXRlIHRoZSB0ZXN0cyBhYm92ZSwgYnV0IGZvciBsYW1iZGEuICBJZiB5b3UgYWRkIGEgbGFtYmRhIHRlc3QsCisgICAgIyBhbHNvIGFkZCBhIHNpbWlsYXIgZnVuY3Rpb24gdGVzdCBhYm92ZS4KKworICAgIGRlZiB0ZXN0X2xhbWJkYV9wYXJlbnNfbm9fdW5wYWNraW5nKHNlbGYpOgorICAgICAgICBmID0gbGFtYmRhICgoKCgoeCkpKSkpOiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgMSwgMSkKKyAgICAgICAgIyBJbm5lciBwYXJlbnMgYXJlIGVsaWRlZCwgc2FtZSBhczogZih4LCkKKyAgICAgICAgZiA9IGxhbWJkYSAoKHgpKSw6IHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCAyLCAyKQorCisgICAgZGVmIHRlc3RfbGFtYmRhXzEoc2VsZik6CisgICAgICAgIGYgPSBsYW1iZGEgKCgoKCh4KSwpKSkpOiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgMywgKDMsKSkKKyAgICAgICAgZiA9IGxhbWJkYSAoKCgoKHgpKSwpKSk6IHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCA0LCAoNCwpKQorICAgICAgICBmID0gbGFtYmRhICgoKCgoeCkpKSwpKTogeAorICAgICAgICBzZWxmLmNoZWNrKGYsIDUsICg1LCkpCisgICAgICAgIGYgPSBsYW1iZGEgKCgoeCksKSk6IHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCA2LCAoNiwpKQorCisgICAgZGVmIHRlc3RfbGFtYmRhXzIoc2VsZik6CisgICAgICAgIGYgPSBsYW1iZGEgKCgoKCh4KSksKSwpKTogeAorICAgICAgICBzZWxmLmNoZWNrKGYsIDIsICgoMiwpLCkpCisKKyAgICBkZWYgdGVzdF9sYW1iZGFfMyhzZWxmKToKKyAgICAgICAgZiA9IGxhbWJkYSAoKCgoKCh4KSksKSwpLCkpOiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgMywgKCgoMywpLCksKSkKKworICAgIGRlZiB0ZXN0X2xhbWJkYV9jb21wbGV4KHNlbGYpOgorICAgICAgICBmID0gbGFtYmRhICgoKCgoeCkpLCksKSwpLCBhLCBiLCBjOiAoeCwgYSwgYiwgYykKKyAgICAgICAgc2VsZi5jaGVjayhmLCAoMywgOSwgOCwgNyksICgoKDMsKSwpLCksIDksIDgsIDcpCisKKyAgICAgICAgZiA9IGxhbWJkYSAoKCgoKCh4KSksKSksKSwpLCBhLCBiLCBjOiAoeCwgYSwgYiwgYykKKyAgICAgICAgc2VsZi5jaGVjayhmLCAoMywgOSwgOCwgNyksICgoKDMsKSwpLCksIDksIDgsIDcpCisKKyAgICAgICAgZiA9IGxhbWJkYSBhLCBiLCBjLCAoKCgoKCh4KSksKSksKSwpOiAoYSwgYiwgYywgeCkKKyAgICAgICAgc2VsZi5jaGVjayhmLCAoOSwgOCwgNywgMyksIDksIDgsIDcsICgoKDMsKSwpLCkpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQ29tcGxleEFyZ3NUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5IGIvTGliL3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5CmluZGV4IDJjZjM5YWUuLjc0Nzc4NWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29udGV4dGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkKQEAgLTMzMCwzMiArMzMwLDYgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICBzZWxmLmJvaWxlclBsYXRlKGxvY2ssIGxvY2tlZCkKIAotY2xhc3MgRGVjaW1hbENvbnRleHRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgICAjIFhYWCBTb21lYm9keSBzaG91bGQgd3JpdGUgbW9yZSB0aG9yb3VnaCB0ZXN0cyBmb3IgdGhpcwotCi0gICAgZGVmIHRlc3RCYXNpYyhzZWxmKToKLSAgICAgICAgY3R4ID0gZGVjaW1hbC5nZXRjb250ZXh0KCkKLSAgICAgICAgb3JpZ19jb250ZXh0ID0gY3R4LmNvcHkoKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjdHgucHJlYyA9IHNhdmVfcHJlYyA9IGRlY2ltYWwuRXh0ZW5kZWRDb250ZXh0LnByZWMgKyA1Ci0gICAgICAgICAgICB3aXRoIGRlY2ltYWwuRXh0ZW5kZWRDb250ZXh0LmdldF9tYW5hZ2VyKCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNpbWFsLmdldGNvbnRleHQoKS5wcmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5FeHRlbmRlZENvbnRleHQucHJlYykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjaW1hbC5nZXRjb250ZXh0KCkucHJlYywgc2F2ZV9wcmVjKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHdpdGggZGVjaW1hbC5FeHRlbmRlZENvbnRleHQuZ2V0X21hbmFnZXIoKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNpbWFsLmdldGNvbnRleHQoKS5wcmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwuRXh0ZW5kZWRDb250ZXh0LnByZWMpCi0gICAgICAgICAgICAgICAgICAgIDEvMAotICAgICAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjaW1hbC5nZXRjb250ZXh0KCkucHJlYywgc2F2ZV9wcmVjKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBkZWNpbWFsLnNldGNvbnRleHQob3JpZ19jb250ZXh0KQotCi0KICMgVGhpcyBpcyBuZWVkZWQgdG8gbWFrZSB0aGUgdGVzdCBhY3R1YWxseSBydW4gdW5kZXIgcmVncnRlc3QucHkhCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3N1aXRlKApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb29raWUucHkgYi9MaWIvdGVzdC90ZXN0X2Nvb2tpZS5weQppbmRleCBjMjBiZWVlLi5lN2MwY2YxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Nvb2tpZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Nvb2tpZS5weQpAQCAtMSw2ICsxLDcgQEAKICMgU2ltcGxlIHRlc3Qgc3VpdGUgZm9yIENvb2tpZS5weQogCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJpZnksIHZlcmJvc2UsIHJ1bl9kb2N0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIHJ1bl9kb2N0ZXN0CitpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBDb29raWUKIAogaW1wb3J0IHdhcm5pbmdzCkBAIC04LDQzICs5LDc0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiLiogY2xhc3MgaXMgaW5zZWN1cmUuKiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCiAKLSMgQ3VycmVudGx5IHRoaXMgb25seSB0ZXN0cyBTaW1wbGVDb29raWUKK2NsYXNzIENvb2tpZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIEN1cnJlbnRseSB0aGlzIG9ubHkgdGVzdHMgU2ltcGxlQ29va2llCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIGNhc2VzID0gWworICAgICAgICAgICAgeyAnZGF0YSc6ICdjaGlwcz1haG95OyB2aWVubmE9ZmluZ2VyJywKKyAgICAgICAgICAgICAgJ2RpY3QnOiB7J2NoaXBzJzonYWhveScsICd2aWVubmEnOidmaW5nZXInfSwKKyAgICAgICAgICAgICAgJ3JlcHInOiAiPFNpbXBsZUNvb2tpZTogY2hpcHM9J2Fob3knIHZpZW5uYT0nZmluZ2VyJz4iLAorICAgICAgICAgICAgICAnb3V0cHV0JzogJ1NldC1Db29raWU6IGNoaXBzPWFob3lcblNldC1Db29raWU6IHZpZW5uYT1maW5nZXInLAorICAgICAgICAgICAgfSwKIAotY2FzZXMgPSBbCi0gICAgKCdjaGlwcz1haG95OyB2aWVubmE9ZmluZ2VyJywgeydjaGlwcyc6J2Fob3knLCAndmllbm5hJzonZmluZ2VyJ30pLAotICAgICgna2VlYmxlcj0iRT1tYzI7IEw9XFwiTG92ZXNcXCI7IGZ1ZGdlPVxcMDEyOyInLAotICAgICB7J2tlZWJsZXInIDogJ0U9bWMyOyBMPSJMb3ZlcyI7IGZ1ZGdlPVwwMTI7J30pLAorICAgICAgICAgICAgeyAnZGF0YSc6ICdrZWVibGVyPSJFPW1jMjsgTD1cXCJMb3Zlc1xcIjsgZnVkZ2U9XFwwMTI7IicsCisgICAgICAgICAgICAgICdkaWN0JzogeydrZWVibGVyJyA6ICdFPW1jMjsgTD0iTG92ZXMiOyBmdWRnZT1cMDEyOyd9LAorICAgICAgICAgICAgICAncmVwcic6ICcnJzxTaW1wbGVDb29raWU6IGtlZWJsZXI9J0U9bWMyOyBMPSJMb3ZlcyI7IGZ1ZGdlPVxcbjsnPicnJywKKyAgICAgICAgICAgICAgJ291dHB1dCc6ICdTZXQtQ29va2llOiBrZWVibGVyPSJFPW1jMjsgTD1cXCJMb3Zlc1xcIjsgZnVkZ2U9XFwwMTI7IicsCisgICAgICAgICAgICB9LAogCi0gICAgIyBDaGVjayBpbGxlZ2FsIGNvb2tpZXMgdGhhdCBoYXZlIGFuICc9JyBjaGFyIGluIGFuIHVucXVvdGVkIHZhbHVlCi0gICAgKCdrZWVibGVyPUU9bWMyJywgeydrZWVibGVyJyA6ICdFPW1jMid9KQotICAgIF0KKyAgICAgICAgICAgICMgQ2hlY2sgaWxsZWdhbCBjb29raWVzIHRoYXQgaGF2ZSBhbiAnPScgY2hhciBpbiBhbiB1bnF1b3RlZCB2YWx1ZQorICAgICAgICAgICAgeyAnZGF0YSc6ICdrZWVibGVyPUU9bWMyJywKKyAgICAgICAgICAgICAgJ2RpY3QnOiB7J2tlZWJsZXInIDogJ0U9bWMyJ30sCisgICAgICAgICAgICAgICdyZXByJzogIjxTaW1wbGVDb29raWU6IGtlZWJsZXI9J0U9bWMyJz4iLAorICAgICAgICAgICAgICAnb3V0cHV0JzogJ1NldC1Db29raWU6IGtlZWJsZXI9RT1tYzInLAorICAgICAgICAgICAgfQorICAgICAgICBdCiAKLWZvciBkYXRhLCBkaWN0IGluIGNhc2VzOgotICAgIEMgPSBDb29raWUuU2ltcGxlQ29va2llKCkgOyBDLmxvYWQoZGF0YSkKLSAgICBwcmludCByZXByKEMpCi0gICAgcHJpbnQgQy5vdXRwdXQoc2VwPSdcbicpCi0gICAgZm9yIGssIHYgaW4gc29ydGVkKGRpY3QuaXRlcml0ZW1zKCkpOgotICAgICAgICBwcmludCAnICcsIGssIHJlcHIoIENba10udmFsdWUgKSwgcmVwcih2KQotICAgICAgICB2ZXJpZnkoQ1trXS52YWx1ZSA9PSB2KQotICAgICAgICBwcmludCBDW2tdCisgICAgICAgIGZvciBjYXNlIGluIGNhc2VzOgorICAgICAgICAgICAgQyA9IENvb2tpZS5TaW1wbGVDb29raWUoKQorICAgICAgICAgICAgQy5sb2FkKGNhc2VbJ2RhdGEnXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihDKSwgY2FzZVsncmVwciddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLm91dHB1dChzZXA9J1xuJyksIGNhc2VbJ291dHB1dCddKQorICAgICAgICAgICAgZm9yIGssIHYgaW4gc29ydGVkKGNhc2VbJ2RpY3QnXS5pdGVyaXRlbXMoKSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDW2tdLnZhbHVlLCB2KQogCi1DID0gQ29va2llLlNpbXBsZUNvb2tpZSgpCi1DLmxvYWQoJ0N1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgVmVyc2lvbj0xOyBQYXRoPS9hY21lJykKKyAgICBkZWYgdGVzdF9sb2FkKHNlbGYpOgorICAgICAgICBDID0gQ29va2llLlNpbXBsZUNvb2tpZSgpCisgICAgICAgIEMubG9hZCgnQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyBWZXJzaW9uPTE7IFBhdGg9L2FjbWUnKQogCi12ZXJpZnkoQ1snQ3VzdG9tZXInXS52YWx1ZSA9PSAnV0lMRV9FX0NPWU9URScpCi12ZXJpZnkoQ1snQ3VzdG9tZXInXVsndmVyc2lvbiddID09ICcxJykKLXZlcmlmeShDWydDdXN0b21lciddWydwYXRoJ10gPT0gJy9hY21lJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDWydDdXN0b21lciddLnZhbHVlLCAnV0lMRV9FX0NPWU9URScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ1snQ3VzdG9tZXInXVsndmVyc2lvbiddLCAnMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ1snQ3VzdG9tZXInXVsncGF0aCddLCAnL2FjbWUnKQogCi1wcmludCBDLm91dHB1dChbJ3BhdGgnXSkKLXByaW50IEMuanNfb3V0cHV0KCkKLXByaW50IEMuanNfb3V0cHV0KFsncGF0aCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMub3V0cHV0KFsncGF0aCddKSwKKyAgICAgICAgICAgICdTZXQtQ29va2llOiBDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7IFBhdGg9L2FjbWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMuanNfb3V0cHV0KCksICIiIgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICAgIDwhLS0gYmVnaW4gaGlkaW5nCisgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9ICJDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7IFBhdGg9L2FjbWU7IFZlcnNpb249MSI7CisgICAgICAgIC8vIGVuZCBoaWRpbmcgLS0+CisgICAgICAgIDwvc2NyaXB0PgorICAgICAgICAiIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5qc19vdXRwdXQoWydwYXRoJ10pLCAiIiIKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgICAgICA8IS0tIGJlZ2luIGhpZGluZworICAgICAgICBkb2N1bWVudC5jb29raWUgPSAiQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyBQYXRoPS9hY21lIjsKKyAgICAgICAgLy8gZW5kIGhpZGluZyAtLT4KKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICAgICIiIikKIAotIyBUcnkgY29va2llIHdpdGggcXVvdGVkIG1ldGEtZGF0YQotQyA9IENvb2tpZS5TaW1wbGVDb29raWUoKQotQy5sb2FkKCdDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSInKQotdmVyaWZ5KENbJ0N1c3RvbWVyJ10udmFsdWUgPT0gJ1dJTEVfRV9DT1lPVEUnKQotdmVyaWZ5KENbJ0N1c3RvbWVyJ11bJ3ZlcnNpb24nXSA9PSAnMScpCi12ZXJpZnkoQ1snQ3VzdG9tZXInXVsncGF0aCddID09ICcvYWNtZScpCisgICAgZGVmIHRlc3RfcXVvdGVkX21ldGEoc2VsZik6CisgICAgICAgICMgVHJ5IGNvb2tpZSB3aXRoIHF1b3RlZCBtZXRhLWRhdGEKKyAgICAgICAgQyA9IENvb2tpZS5TaW1wbGVDb29raWUoKQorICAgICAgICBDLmxvYWQoJ0N1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ1snQ3VzdG9tZXInXS52YWx1ZSwgJ1dJTEVfRV9DT1lPVEUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENbJ0N1c3RvbWVyJ11bJ3ZlcnNpb24nXSwgJzEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENbJ0N1c3RvbWVyJ11bJ3BhdGgnXSwgJy9hY21lJykKIAotcHJpbnQgIklmIGFueXRoaW5nIGJsb3dzIHVwIGFmdGVyIHRoaXMgbGluZSwgaXQncyBmcm9tIENvb2tpZSdzIGRvY3Rlc3QuIgotcnVuX2RvY3Rlc3QoQ29va2llKQorZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChDb29raWVUZXN0cykKKyAgICBydW5fZG9jdGVzdChDb29raWUpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGF0ZXRpbWUucHkgYi9MaWIvdGVzdC90ZXN0X2RhdGV0aW1lLnB5CmluZGV4IDc2NWJkYWYuLjMzMjkxMDQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGF0ZXRpbWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kYXRldGltZS5weQpAQCAtODUyLDYgKzg1Miw3IEBACiAgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDIwMDUsIDMsIDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5zdHJmdGltZSgibTolbSBkOiVkIHk6JXkiKSwgIm06MDMgZDowMiB5OjA1IikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnN0cmZ0aW1lKCIiKSwgIiIpICMgU0YgYnVnICM3NjEzMzcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnN0cmZ0aW1lKCd4JyoxMDAwKSwgJ3gnKjEwMDApICMgU0YgYnVnICMxNTU2Nzg0CiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0LnN0cmZ0aW1lKSAjIG5lZWRzIGFuIGFyZwogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQuc3RyZnRpbWUsICJvbmUiLCAidHdvIikgIyB0b28gbWFueSBhcmdzCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkgYi9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkKaW5kZXggNTVhNTNkMy4uNTBkZjkzZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weQpAQCAtMjMsNiArMjMsNyBAQAogeW91J3JlIHdvcmtpbmcgdGhyb3VnaCBJRExFLCB5b3UgY2FuIGltcG9ydCB0aGlzIHRlc3QgbW9kdWxlIGFuZCBjYWxsIHRlc3RfbWFpbigpCiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50LgogIiIiCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CiAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IGdsb2IKQEAgLTEwNTcsNiArMTA1OCwzMiBAQAogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGMuZmxhZ3MpLCBpZChkLmZsYWdzKSkKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChjLnRyYXBzKSwgaWQoZC50cmFwcykpCiAKK2NsYXNzIFdpdGhTdGF0ZW1lbnRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIENhbid0IGRvIHRoZXNlIGFzIGRvY3N0cmluZ3MgdW50aWwgUHl0aG9uIDIuNgorICAgICMgYXMgZG9jdGVzdCBjYW4ndCBoYW5kbGUgX19mdXR1cmVfXyBzdGF0ZW1lbnRzCisKKyAgICBkZWYgdGVzdF9sb2NhbGNvbnRleHQoc2VsZik6CisgICAgICAgICMgVXNlIGEgY29weSBvZiB0aGUgY3VycmVudCBjb250ZXh0IGluIHRoZSBibG9jaworICAgICAgICBvcmlnX2N0eCA9IGdldGNvbnRleHQoKQorICAgICAgICB3aXRoIGxvY2FsY29udGV4dCgpIGFzIGVudGVyX2N0eDoKKyAgICAgICAgICAgIHNldF9jdHggPSBnZXRjb250ZXh0KCkKKyAgICAgICAgZmluYWxfY3R4ID0gZ2V0Y29udGV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhvcmlnX2N0eCBpcyBmaW5hbF9jdHgsICdkaWQgbm90IHJlc3RvcmUgY29udGV4dCBjb3JyZWN0bHknKQorICAgICAgICBzZWxmLmFzc2VydF8ob3JpZ19jdHggaXMgbm90IHNldF9jdHgsICdkaWQgbm90IGNvcHkgdGhlIGNvbnRleHQnKQorICAgICAgICBzZWxmLmFzc2VydF8oc2V0X2N0eCBpcyBlbnRlcl9jdHgsICdfX2VudGVyX18gcmV0dXJuZWQgd3JvbmcgY29udGV4dCcpCisKKyAgICBkZWYgdGVzdF9sb2NhbGNvbnRleHRhcmcoc2VsZik6CisgICAgICAgICMgVXNlIGEgY29weSBvZiB0aGUgc3VwcGxpZWQgY29udGV4dCBpbiB0aGUgYmxvY2sKKyAgICAgICAgb3JpZ19jdHggPSBnZXRjb250ZXh0KCkKKyAgICAgICAgbmV3X2N0eCA9IENvbnRleHQocHJlYz00MikKKyAgICAgICAgd2l0aCBsb2NhbGNvbnRleHQobmV3X2N0eCkgYXMgZW50ZXJfY3R4OgorICAgICAgICAgICAgc2V0X2N0eCA9IGdldGNvbnRleHQoKQorICAgICAgICBmaW5hbF9jdHggPSBnZXRjb250ZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG9yaWdfY3R4IGlzIGZpbmFsX2N0eCwgJ2RpZCBub3QgcmVzdG9yZSBjb250ZXh0IGNvcnJlY3RseScpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZXRfY3R4LnByZWMgPT0gbmV3X2N0eC5wcmVjLCAnZGlkIG5vdCBzZXQgY29ycmVjdCBjb250ZXh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5ld19jdHggaXMgbm90IHNldF9jdHgsICdkaWQgbm90IGNvcHkgdGhlIGNvbnRleHQnKQorICAgICAgICBzZWxmLmFzc2VydF8oc2V0X2N0eCBpcyBlbnRlcl9jdHgsICdfX2VudGVyX18gcmV0dXJuZWQgd3JvbmcgY29udGV4dCcpCisKIGRlZiB0ZXN0X21haW4oYXJpdGg9RmFsc2UsIHZlcmJvc2U9Tm9uZSk6CiAgICAgIiIiIEV4ZWN1dGUgdGhlIHRlc3RzLgogCkBAIC0xMDc3LDYgKzExMDQsNyBAQAogICAgICAgICBEZWNpbWFsUHl0aG9uQVBJdGVzdHMsCiAgICAgICAgIENvbnRleHRBUEl0ZXN0cywKICAgICAgICAgRGVjaW1hbFRlc3QsCisgICAgICAgIFdpdGhTdGF0ZW1lbnRUZXN0LAogICAgIF0KIAogICAgIHRyeToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkgYi9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CmluZGV4IGQzYWU0NTUuLjI5NjhlM2QgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZXNjci5weQpAQCAtMjAxNyw2ICsyMDE3LDEzIEBACiAKICAgICB2ZXJpcyhTdWIudGVzdCgpLCBCYXNlLmFQcm9wKQogCisgICAgIyBWZXJpZnkgdGhhdCBzdXBlcigpIGRvZXNuJ3QgYWxsb3cga2V5d29yZCBhcmdzCisgICAgdHJ5OgorICAgICAgICBzdXBlcihCYXNlLCBrdz0xKQorICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAic3VwZXIgc2hvdWxkbid0IGFjY2VwdCBrZXl3b3JkIGFyZ3MiCiAKIGRlZiBpbmhlcml0cygpOgogICAgIGlmIHZlcmJvc2U6IHByaW50ICJUZXN0aW5nIGluaGVyaXRhbmNlIGZyb20gYmFzaWMgdHlwZXMuLi4iCkBAIC0zNTAxLDYgKzM1MDgsMTMgQEAKICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgInNob3VsZG4ndCBiZSBhYmxlIHRvIGFzc2lnbiB0byBsaXN0Ll9fYmFzZXNfXyIKIAogICAgIHRyeToKKyAgICAgICAgRC5fX2Jhc2VzX18gPSAoQzIsIGxpc3QpCisgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGFzc2VydCAwLCAiYmVzdF9iYXNlIGNhbGN1bGF0aW9uIGZvdW5kIHdhbnRpbmciCisKKyAgICB0cnk6CiAgICAgICAgIGRlbCBELl9fYmFzZXNfXwogICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGljdC5weSBiL0xpYi90ZXN0L3Rlc3RfZGljdC5weQppbmRleCA3MTdlZDVlLi5mZjZjY2RlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RpY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kaWN0LnB5CkBAIC00MzksNiArNDM5LDE2IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWxfKCJnWzQyXSBkaWRuJ3QgcmFpc2UgS2V5RXJyb3IiKQogCisgICAgZGVmIHRlc3RfdHVwbGVfa2V5ZXJyb3Ioc2VsZik6CisgICAgICAgICMgU0YgIzE1NzY2NTcKKyAgICAgICAgZCA9IHt9CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRbKDEsKV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3MsICgoMSwpLCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIm1pc3NpbmcgS2V5RXJyb3IiKQorCiAKIGZyb20gdGVzdCBpbXBvcnQgbWFwcGluZ190ZXN0cwogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHkgYi9MaWIvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHkKaW5kZXggYjVjNTY3Ni4uYWJjZTQxZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weQpAQCAtMTk2LDE3ICsxOTYsMjEgQEAKICAgICAgICAgICAgIHRlc3RfY2FwaTIoKQogICAgICAgICAgICAgdGVzdF9jYXBpMygpCiAKKyAgICBkZWYgdGVzdF9XaW5kb3dzRXJyb3Ioc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIFdpbmRvd3NFcnJvcgorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyKFdpbmRvd3NFcnJvcigxMDAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAwMSIpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHIoV2luZG93c0Vycm9yKDEwMDEsICJtZXNzYWdlIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltFcnJvciAxMDAxXSBtZXNzYWdlIikKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFdpbmRvd3NFcnJvcigxMDAxLCAibWVzc2FnZSIpLmVycm5vLCAyMikKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFdpbmRvd3NFcnJvcigxMDAxLCAibWVzc2FnZSIpLndpbmVycm9yLCAxMDAxKQorCiAgICAgZGVmIHRlc3RBdHRyaWJ1dGVzKHNlbGYpOgogICAgICAgICAjIHRlc3QgdGhhdCBleGNlcHRpb24gYXR0cmlidXRlcyBhcmUgaGFwcHkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc3RyKHUnSGVsbG8gXHUwMEUxJykKLSAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKLSAgICAgICAgICAgIHNhbXBsZVVuaWNvZGVFbmNvZGVFcnJvciA9IGUKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB1bmljb2RlKCdceGZmJykKLSAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKLSAgICAgICAgICAgIHNhbXBsZVVuaWNvZGVEZWNvZGVFcnJvciA9IGUKIAogICAgICAgICBleGNlcHRpb25MaXN0ID0gWwogICAgICAgICAgICAgKEJhc2VFeGNlcHRpb24sICgpLCB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgpfSksCkBAIC0yMTgsMTEgKzIyMiwxNiBAQAogICAgICAgICAgICAgKFN5c3RlbUV4aXQsICgnZm9vJywpLAogICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnZm9vJywgJ2FyZ3MnIDogKCdmb28nLCksICdjb2RlJyA6ICdmb28nfSksCiAgICAgICAgICAgICAoSU9FcnJvciwgKCdmb28nLCksCi0gICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICdmb28nLCAnYXJncycgOiAoJ2ZvbycsKX0pLAorICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnZm9vJywgJ2FyZ3MnIDogKCdmb28nLCksICdmaWxlbmFtZScgOiBOb25lLAorICAgICAgICAgICAgICAgICAnZXJybm8nIDogTm9uZSwgJ3N0cmVycm9yJyA6IE5vbmV9KSwKICAgICAgICAgICAgIChJT0Vycm9yLCAoJ2ZvbycsICdiYXInKSwKLSAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgnZm9vJywgJ2JhcicpfSksCisgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoJ2ZvbycsICdiYXInKSwgJ2ZpbGVuYW1lJyA6IE5vbmUsCisgICAgICAgICAgICAgICAgICdlcnJubycgOiAnZm9vJywgJ3N0cmVycm9yJyA6ICdiYXInfSksCiAgICAgICAgICAgICAoSU9FcnJvciwgKCdmb28nLCAnYmFyJywgJ2JheicpLAotICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKCdmb28nLCAnYmFyJyl9KSwKKyAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgnZm9vJywgJ2JhcicpLCAnZmlsZW5hbWUnIDogJ2JheicsCisgICAgICAgICAgICAgICAgICdlcnJubycgOiAnZm9vJywgJ3N0cmVycm9yJyA6ICdiYXInfSksCisgICAgICAgICAgICAoSU9FcnJvciwgKCdmb28nLCAnYmFyJywgJ2JheicsICdxdXV4JyksCisgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoJ2ZvbycsICdiYXInLCAnYmF6JywgJ3F1dXgnKX0pLAogICAgICAgICAgICAgKEVudmlyb25tZW50RXJyb3IsICgnZXJybm9TdHInLCAnc3RyRXJyb3JTdHInLCAnZmlsZW5hbWVTdHInKSwKICAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgnZXJybm9TdHInLCAnc3RyRXJyb3JTdHInKSwKICAgICAgICAgICAgICAgICAgJ3N0cmVycm9yJyA6ICdzdHJFcnJvclN0cicsICdlcnJubycgOiAnZXJybm9TdHInLApAQCAtMjQ5LDE2ICsyNTgsMTYgQEAKICAgICAgICAgICAgICAgICAgJ3ByaW50X2ZpbGVfYW5kX2xpbmUnIDogTm9uZSwgJ21zZycgOiAnbXNnU3RyJywKICAgICAgICAgICAgICAgICAgJ2ZpbGVuYW1lJyA6IE5vbmUsICdsaW5lbm8nIDogTm9uZSwgJ29mZnNldCcgOiBOb25lfSksCiAgICAgICAgICAgICAoVW5pY29kZUVycm9yLCAoKSwgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoKSx9KSwKLSAgICAgICAgICAgIChzYW1wbGVVbmljb2RlRW5jb2RlRXJyb3IsCi0gICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoJ2FzY2lpJywgdSdIZWxsbyBceGUxJywgNiwgNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KScpLAotICAgICAgICAgICAgICAgICAnZW5jb2RpbmcnIDogJ2FzY2lpJywgJ29iamVjdCcgOiB1J0hlbGxvIFx4ZTEnLAotICAgICAgICAgICAgICAgICAnc3RhcnQnIDogNiwgJ3JlYXNvbicgOiAnb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KSd9KSwKLSAgICAgICAgICAgIChzYW1wbGVVbmljb2RlRGVjb2RlRXJyb3IsCisgICAgICAgICAgICAoVW5pY29kZUVuY29kZUVycm9yLCAoJ2FzY2lpJywgdSdhJywgMCwgMSwgJ29yZGluYWwgbm90IGluIHJhbmdlJyksCisgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoJ2FzY2lpJywgdSdhJywgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3JkaW5hbCBub3QgaW4gcmFuZ2UnKSwKKyAgICAgICAgICAgICAgICAgJ2VuY29kaW5nJyA6ICdhc2NpaScsICdvYmplY3QnIDogdSdhJywKKyAgICAgICAgICAgICAgICAgJ3N0YXJ0JyA6IDAsICdyZWFzb24nIDogJ29yZGluYWwgbm90IGluIHJhbmdlJ30pLAorICAgICAgICAgICAgKFVuaWNvZGVEZWNvZGVFcnJvciwgKCdhc2NpaScsICdceGZmJywgMCwgMSwgJ29yZGluYWwgbm90IGluIHJhbmdlJyksCiAgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoJ2FzY2lpJywgJ1x4ZmYnLCAwLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29yZGluYWwgbm90IGluIHJhbmdlJyksCiAgICAgICAgICAgICAgICAgICdlbmNvZGluZycgOiAnYXNjaWknLCAnb2JqZWN0JyA6ICdceGZmJywKLSAgICAgICAgICAgICAgICAgJ3N0YXJ0JyA6IDAsICdyZWFzb24nIDogJ29yZGluYWwgbm90IGluIHJhbmdlKDEyOCknfSksCisgICAgICAgICAgICAgICAgICdzdGFydCcgOiAwLCAncmVhc29uJyA6ICdvcmRpbmFsIG5vdCBpbiByYW5nZSd9KSwKICAgICAgICAgICAgIChVbmljb2RlVHJhbnNsYXRlRXJyb3IsICh1Ilx1MzA0MiIsIDAsIDEsICJvdWNoIiksCiAgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAodSdcdTMwNDInLCAwLCAxLCAnb3VjaCcpLAogICAgICAgICAgICAgICAgICAnb2JqZWN0JyA6IHUnXHUzMDQyJywgJ3JlYXNvbicgOiAnb3VjaCcsCkBAIC0yNzQsMTggKzI4MywxNCBAQAogICAgICAgICBleGNlcHQgTmFtZUVycm9yOgogICAgICAgICAgICAgcGFzcwogCi0gICAgICAgIGZvciBhcmdzIGluIGV4Y2VwdGlvbkxpc3Q6Ci0gICAgICAgICAgICBleHBlY3RlZCA9IGFyZ3NbLTFdCisgICAgICAgIGZvciBleGMsIGFyZ3MsIGV4cGVjdGVkIGluIGV4Y2VwdGlvbkxpc3Q6CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgZXhjID0gYXJnc1swXQotICAgICAgICAgICAgICAgIGlmIGxlbihhcmdzKSA9PSAyOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBleGMKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBleGMoKmFyZ3NbMV0pCisgICAgICAgICAgICAgICAgcmFpc2UgZXhjKCphcmdzKQogICAgICAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb24sIGU6Ci0gICAgICAgICAgICAgICAgaWYgKGUgaXMgbm90IGV4YyBhbmQgICAgICMgbmVlZGVkIGZvciBzYW1wbGVVbmljb2RlIGVycm9ycwotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShlKSBpcyBub3QgZXhjKToKKyAgICAgICAgICAgICAgICBpZiB0eXBlKGUpIGlzIG5vdCBleGM6CiAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgIyBWZXJpZnkgbW9kdWxlIG5hbWUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0eXBlKGUpLl9fbW9kdWxlX18sICdleGNlcHRpb25zJykKICAgICAgICAgICAgICAgICAjIFZlcmlmeSBubyByZWYgbGVha3MgaW4gRXhjX3N0cigpCiAgICAgICAgICAgICAgICAgcyA9IHN0cihlKQogICAgICAgICAgICAgICAgIGZvciBjaGVja0FyZ05hbWUgaW4gZXhwZWN0ZWQ6CkBAIC0zMzIsNiArMzM3LDE1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgZykKIAorICAgIGRlZiB0ZXN0VW5pY29kZVN0clVzYWdlKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBib3RoIGluc3RhbmNlcyBhbmQgY2xhc3NlcyBoYXZlIGEgc3RyIGFuZCB1bmljb2RlCisgICAgICAgICMgcmVwcmVzZW50YXRpb24uCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHIoRXhjZXB0aW9uKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHVuaWNvZGUoRXhjZXB0aW9uKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN0cihFeGNlcHRpb24oJ2EnKSkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyh1bmljb2RlKEV4Y2VwdGlvbih1J2EnKSkpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChFeGNlcHRpb25UZXN0cykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mY250bC5weSBiL0xpYi90ZXN0L3Rlc3RfZmNudGwucHkKaW5kZXggNThhNTdiNS4uMmQ4MDBiMiAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvdGVzdF9mY250bC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZjbnRsLnB5CkBAIC0yNSw3ICsyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICdmcmVlYnNkMicsICdmcmVlYnNkMycsICdmcmVlYnNkNCcsICdmcmVlYnNkNScsCiAgICAgICAgICAgICAgICAgICAgICdmcmVlYnNkNicsICdmcmVlYnNkNycsCiAgICAgICAgICAgICAgICAgICAgICdic2RvczInLCAnYnNkb3MzJywgJ2JzZG9zNCcsCi0gICAgICAgICAgICAgICAgICAgICdvcGVuYnNkJywgJ29wZW5ic2QyJywgJ29wZW5ic2QzJyk6CisgICAgICAgICAgICAgICAgICAgICdvcGVuYnNkJywgJ29wZW5ic2QyJywgJ29wZW5ic2QzJywgJ29wZW5ic2Q0Jyk6CiAgICAgaWYgc3RydWN0LmNhbGNzaXplKCdsJykgPT0gODoKICAgICAgICAgb2ZmX3QgPSAnbCcKICAgICAgICAgcGlkX3QgPSAnaScKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZm9ybWF0LnB5IGIvTGliL3Rlc3QvdGVzdF9mb3JtYXQucHkKaW5kZXggYTliMzE3MC4uOGJmNWQ2ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mb3JtYXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mb3JtYXQucHkKQEAgLTIxOSw4ICsyMTksOCBAQAogICAgIHRlc3RfZXhjKHVuaWNvZGUoJ2FiYyAlXHUzMDAwJywncmF3LXVuaWNvZGUtZXNjYXBlJyksIDEsIFZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIGZvcm1hdCBjaGFyYWN0ZXIgJz8nICgweDMwMDApIGF0IGluZGV4IDUiKQogCi10ZXN0X2V4YygnJWQnLCAnMScsIFR5cGVFcnJvciwgImludCBhcmd1bWVudCByZXF1aXJlZCIpCi10ZXN0X2V4YygnJWcnLCAnMScsIFR5cGVFcnJvciwgImZsb2F0IGFyZ3VtZW50IHJlcXVpcmVkIikKK3Rlc3RfZXhjKCclZCcsICcxJywgVHlwZUVycm9yLCAiaW50IGFyZ3VtZW50IHJlcXVpcmVkLCBub3Qgc3RyIikKK3Rlc3RfZXhjKCclZycsICcxJywgVHlwZUVycm9yLCAiZmxvYXQgYXJndW1lbnQgcmVxdWlyZWQsIG5vdCBzdHIiKQogdGVzdF9leGMoJ25vIGZvcm1hdCcsICcxJywgVHlwZUVycm9yLAogICAgICAgICAgIm5vdCBhbGwgYXJndW1lbnRzIGNvbnZlcnRlZCBkdXJpbmcgc3RyaW5nIGZvcm1hdHRpbmciKQogdGVzdF9leGMoJ25vIGZvcm1hdCcsIHUnMScsIFR5cGVFcnJvciwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZnVuY3Rvb2xzLnB5IGIvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKaW5kZXggMDFkNmNkMi4uZWRjMTdmYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKQEAgLTIxMCw2ICsyMTAsMTMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLmF0dHIsICdUaGlzIGlzIGEgZGlmZmVyZW50IHRlc3QnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuZGljdF9hdHRyLCBmLmRpY3RfYXR0cikKIAorICAgIGRlZiB0ZXN0X2J1aWx0aW5fdXBkYXRlKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAjMTU3NjI0MQorICAgICAgICBkZWYgd3JhcHBlcigpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBmdW5jdG9vbHMudXBkYXRlX3dyYXBwZXIod3JhcHBlciwgbWF4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuX19uYW1lX18sICdtYXgnKQorICAgICAgICBzZWxmLmFzc2VydF8od3JhcHBlci5fX2RvY19fLnN0YXJ0c3dpdGgoJ21heCgnKSkKIAogY2xhc3MgVGVzdFdyYXBzKFRlc3RVcGRhdGVXcmFwcGVyKToKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mdXR1cmUucHkgYi9MaWIvdGVzdC90ZXN0X2Z1dHVyZS5weQppbmRleCBmNTQ2MmUyLi45YTVmODI5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Z1dHVyZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Z1dHVyZS5weQpAQCAtODIsNiArODIsMjcgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgZXhjZXB0aW9uIGRpZG4ndCBvY2N1ciIpCiAKKyAgICBkZWYgdGVzdF9wYXJzZXJoYWNrKHNlbGYpOgorICAgICAgICAjIHRlc3QgdGhhdCB0aGUgcGFyc2VyLmM6OmZ1dHVyZV9oYWNrIGZ1bmN0aW9uIHdvcmtzIGFzIGV4cGVjdGVkCisgICAgICAgICMgTm90ZTogYWx0aG91Z2ggdGhpcyB0ZXN0IG11c3QgcGFzcywgaXQncyBub3QgdGVzdGluZyB0aGUgb3JpZ2luYWwKKyAgICAgICAgIyAgICAgICBidWcgYXMgb2YgMi42IHNpbmNlIHRoZSB3aXRoIHN0YXRlbWVudCBpcyBub3Qgb3B0aW9uYWwgYW5kCisgICAgICAgICMgICAgICAgdGhlIHBhcnNlciBoYWNrIGRpc2FibGVkLiBJZiBhIG5ldyBrZXl3b3JkIGlzIGludHJvZHVjZWQgaW4KKyAgICAgICAgIyAgICAgICAyLjYsIGNoYW5nZSB0aGlzIHRvIHJlZmVyIHRvIHRoZSBuZXcgZnV0dXJlIGltcG9ydC4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhlYygiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbiwgd2l0aF9zdGF0ZW1lbnQ7IHdpdGggPSAwIikKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzeW50YXggZXJyb3IgZGlkbid0IG9jY3VyIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBleGVjKCJmcm9tIF9fZnV0dXJlX18gaW1wb3J0ICh3aXRoX3N0YXRlbWVudCwgZGl2aXNpb24pOyB3aXRoID0gMCIpCisgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic3ludGF4IGVycm9yIGRpZG4ndCBvY2N1ciIpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoRnV0dXJlVGVzdCkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZW5lcmljcGF0aC5weSBiL0xpYi90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNjNDYwNwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHkKQEAgLTAsMCArMSwxODQgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCBvcworaW1wb3J0IGdlbmVyaWNwYXRoCisKK2NsYXNzIEFsbENvbW1vblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGFzc2VydElzKHNlbGYsIGEsIGIpOgorICAgICAgICBzZWxmLmFzc2VydF8oYSBpcyBiKQorCisgICAgZGVmIHRlc3RfY29tbW9ucHJlZml4KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgZ2VuZXJpY3BhdGguY29tbW9ucHJlZml4KFtdKSwKKyAgICAgICAgICAgICIiCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGdlbmVyaWNwYXRoLmNvbW1vbnByZWZpeChbIi9ob21lL3N3ZW5zb24vc3BhbSIsICIvaG9tZS9zd2VuL3NwYW0iXSksCisgICAgICAgICAgICAiL2hvbWUvc3dlbiIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgZ2VuZXJpY3BhdGguY29tbW9ucHJlZml4KFsiL2hvbWUvc3dlbi9zcGFtIiwgIi9ob21lL3N3ZW4vZWdncyJdKSwKKyAgICAgICAgICAgICIvaG9tZS9zd2VuLyIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgZ2VuZXJpY3BhdGguY29tbW9ucHJlZml4KFsiL2hvbWUvc3dlbi9zcGFtIiwgIi9ob21lL3N3ZW4vc3BhbSJdKSwKKyAgICAgICAgICAgICIvaG9tZS9zd2VuL3NwYW0iCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2dldHNpemUoc2VsZik6CisgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoImZvbyIpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2VuZXJpY3BhdGguZ2V0c2l6ZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKSwgMykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlZDoKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfdGltZShzZWxmKToKKyAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgiZm9vIikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgImFiIikKKyAgICAgICAgICAgIGYud3JpdGUoImJhciIpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpCisgICAgICAgICAgICBkID0gZi5yZWFkKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCAiZm9vYmFyIikKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICAgICAgICAgIGdlbmVyaWNwYXRoLmdldGN0aW1lKHRlc3Rfc3VwcG9ydC5URVNURk4pIDw9CisgICAgICAgICAgICAgICAgZ2VuZXJpY3BhdGguZ2V0bXRpbWUodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgICkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlZDoKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfZXhpc3RzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzKGdlbmVyaWNwYXRoLmV4aXN0cyh0ZXN0X3N1cHBvcnQuVEVTVEZOKSwgRmFsc2UpCisgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoImZvbyIpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoZ2VuZXJpY3BhdGguZXhpc3RzKHRlc3Rfc3VwcG9ydC5URVNURk4pLCBUcnVlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgbm90IGYuY2xvc2UoKToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZW5lcmljcGF0aC5leGlzdHMpCisKKyAgICBkZWYgdGVzdF9pc2RpcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhnZW5lcmljcGF0aC5pc2Rpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKSwgRmFsc2UpCisgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoImZvbyIpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoZ2VuZXJpY3BhdGguaXNkaXIodGVzdF9zdXBwb3J0LlRFU1RGTiksIEZhbHNlKQorICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBvcy5ta2Rpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhnZW5lcmljcGF0aC5pc2Rpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKSwgVHJ1ZSkKKyAgICAgICAgICAgIG9zLnJtZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3QgZi5jbG9zZSgpOgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5ybWRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdlbmVyaWNwYXRoLmlzZGlyKQorCisgICAgZGVmIHRlc3RfaXNmaWxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzKGdlbmVyaWNwYXRoLmlzZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKSwgRmFsc2UpCisgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoImZvbyIpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoZ2VuZXJpY3BhdGguaXNmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4pLCBUcnVlKQorICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBvcy5ta2Rpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhnZW5lcmljcGF0aC5pc2ZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiksIEZhbHNlKQorICAgICAgICAgICAgb3Mucm1kaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlKCk6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnJtZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2VuZXJpY3BhdGguaXNkaXIpCisKKyAgICAgICAgZGVmIHRlc3Rfc2FtZWZpbGUoc2VsZik6CisgICAgICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiLCAid2IiKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYud3JpdGUoImZvbyIpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcygKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY3BhdGguc2FtZWZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTiArICIxIgorICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICAgICBUcnVlCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBsaW5rcywgYXNzdW1lIHRoYXQgb3Muc3RhdCBkb2Vzbid0IHJldHVybiByZXNvbmFibGUKKyAgICAgICAgICAgICAgICAjIGlub2RlIGluZm9ybWF0aW9uIGFuZCB0aHVzLCB0aGF0IHNhbWVmaWxlKCkgZG9lc24ndCB3b3JrCisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgInN5bWxpbmsiKToKKyAgICAgICAgICAgICAgICAgICAgb3Muc3ltbGluaygKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIsCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjIiCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcygKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWNwYXRoLnNhbWVmaWxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIgorICAgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRydWUKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIikKKyAgICAgICAgICAgICAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIiwgIndiIikKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgiYmFyIikKKyAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljcGF0aC5zYW1lZmlsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgICAgICBGYWxzZQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlKCk6CisgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIpCisgICAgICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIikKKyAgICAgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZW5lcmljcGF0aC5zYW1lZmlsZSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQWxsQ29tbW9uVGVzdCkKKworaWYgX19uYW1lX189PSJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2xvYmFsLnB5IGIvTGliL3Rlc3QvdGVzdF9nbG9iYWwucHkKaW5kZXggNGNjOTUzYy4uMjJlNGIyNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nbG9iYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nbG9iYWwucHkKQEAgLTEsNTEgKzEsNTEgQEAKICIiIlZlcmlmeSB0aGF0IHdhcm5pbmdzIGFyZSBpc3N1ZWQgZm9yIGdsb2JhbCBzdGF0ZW1lbnRzIGZvbGxvd2luZyB1c2UuIiIiCiAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGNoZWNrX3N5bnRheAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBjaGVja19zeW50YXhfZXJyb3IKK2ltcG9ydCB1bml0dGVzdAogCiBpbXBvcnQgd2FybmluZ3MKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJlcnJvciIsIG1vZHVsZT0iPHRlc3Qgc3RyaW5nPiIpCiAKLXdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJlcnJvciIsIG1vZHVsZT0iPHRlc3QgY29kZT4iKQorY2xhc3MgR2xvYmFsVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCi1kZWYgY29tcGlsZV9hbmRfY2hlY2sodGV4dCwgc2hvdWxkX2ZhaWw9MSk6Ci0gICAgdHJ5OgotICAgICAgICBjb21waWxlKHRleHQsICI8dGVzdCBjb2RlPiIsICJleGVjIikKLSAgICBleGNlcHQgU3ludGF4RXJyb3IsIG1zZzoKLSAgICAgICAgaWYgc2hvdWxkX2ZhaWw6Ci0gICAgICAgICAgICBwcmludCAiZ290IFN5bnRheEVycm9yIGFzIGV4cGVjdGVkIgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQgInJhaXNlZCB1bmV4cGVjdGVkIFN5bnRheEVycm9yOiIsIHRleHQKLSAgICBlbHNlOgotICAgICAgICBpZiBzaG91bGRfZmFpbDoKLSAgICAgICAgICAgIHByaW50ICJzaG91bGQgaGF2ZSByYWlzZWQgU3ludGF4RXJyb3I6IiwgdGV4dAotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQgImFzIGV4cGVjdGVkLCBubyBTeW50YXhFcnJvciIKLQotcHJvZ190ZXh0XzEgPSAiIiIKKyAgICBkZWYgdGVzdDEoc2VsZik6CisgICAgICAgIHByb2dfdGV4dF8xID0gIiIiXAogZGVmIHdyb25nMSgpOgogICAgIGEgPSAxCiAgICAgYiA9IDIKICAgICBnbG9iYWwgYQogICAgIGdsb2JhbCBiCiAiIiIKLWNvbXBpbGVfYW5kX2NoZWNrKHByb2dfdGV4dF8xKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgcHJvZ190ZXh0XzEpCiAKLXByb2dfdGV4dF8yID0gIiIiCisgICAgZGVmIHRlc3QyKHNlbGYpOgorICAgICAgICBwcm9nX3RleHRfMiA9ICIiIlwKIGRlZiB3cm9uZzIoKToKICAgICBwcmludCB4CiAgICAgZ2xvYmFsIHgKICIiIgotY29tcGlsZV9hbmRfY2hlY2socHJvZ190ZXh0XzIpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCBwcm9nX3RleHRfMikKIAotcHJvZ190ZXh0XzMgPSAiIiIKKyAgICBkZWYgdGVzdDMoc2VsZik6CisgICAgICAgIHByb2dfdGV4dF8zID0gIiIiXAogZGVmIHdyb25nMygpOgogICAgIHByaW50IHgKICAgICB4ID0gMgogICAgIGdsb2JhbCB4CiAiIiIKLWNvbXBpbGVfYW5kX2NoZWNrKHByb2dfdGV4dF8zKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgcHJvZ190ZXh0XzMpCiAKLXByb2dfdGV4dF80ID0gIiIiCisgICAgZGVmIHRlc3Q0KHNlbGYpOgorICAgICAgICBwcm9nX3RleHRfNCA9ICIiIlwKIGdsb2JhbCB4CiB4ID0gMgogIiIiCi1jb21waWxlX2FuZF9jaGVjayhwcm9nX3RleHRfNCwgMCkKKyAgICAgICAgIyB0aGlzIHNob3VsZCB3b3JrCisgICAgICAgIGNvbXBpbGUocHJvZ190ZXh0XzQsICI8dGVzdCBzdHJpbmc+IiwgImV4ZWMiKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoR2xvYmFsVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weSBiL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weQppbmRleCBjYTg0YzU2Li5mNGEwNDc4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5CkBAIC04LDgzMCArOCw4OTcgQEAKICMgcmVncmVzc2lvbiB0ZXN0LCB0aGUgZmlsdGVyd2FybmluZ3MoKSBjYWxsIGhhcyBiZWVuIGFkZGVkIHRvCiAjIHJlZ3J0ZXN0LnB5LgogCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0RmFpbGVkLCB2ZXJpZnksIHZlcmVxLCBjaGVja19zeW50YXgKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgY2hlY2tfc3ludGF4X2Vycm9yCitpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBzeXMKKyMgdGVzdGluZyBpbXBvcnQgKgorZnJvbSBzeXMgaW1wb3J0ICoKIAotcHJpbnQgJzEuIFBhcnNlcicKK2NsYXNzIFRva2VuVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCi1wcmludCAnMS4xIFRva2VucycKKyAgICBkZWYgdGVzdEJhY2tzbGFzaChzZWxmKToKKyAgICAgICAgIyBCYWNrc2xhc2ggbWVhbnMgbGluZSBjb250aW51YXRpb246CisgICAgICAgIHggPSAxIFwKKyAgICAgICAgKyAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIDIsICdiYWNrc2xhc2ggZm9yIGxpbmUgY29udGludWF0aW9uJykKIAotcHJpbnQgJzEuMS4xIEJhY2tzbGFzaGVzJworICAgICAgICAjIEJhY2tzbGFzaCBkb2VzIG5vdCBtZWFucyBjb250aW51YXRpb24gaW4gY29tbWVudHMgOlwKKyAgICAgICAgeCA9IDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgMCwgJ2JhY2tzbGFzaCBlbmRpbmcgY29tbWVudCcpCiAKLSMgQmFja3NsYXNoIG1lYW5zIGxpbmUgY29udGludWF0aW9uOgoteCA9IDEgXAotKyAxCi1pZiB4ICE9IDI6IHJhaXNlIFRlc3RGYWlsZWQsICdiYWNrc2xhc2ggZm9yIGxpbmUgY29udGludWF0aW9uJworICAgIGRlZiB0ZXN0UGxhaW5JbnRlZ2VycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMHhmZiwgMjU1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygwMzc3LCAyNTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIxNDc0ODM2NDcsIDAxNzc3Nzc3Nzc3NykKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IG1heGludAorICAgICAgICBpZiBtYXhpbnQgPT0gMjE0NzQ4MzY0NzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKC0yMTQ3NDgzNjQ3LTEsIC0wMjAwMDAwMDAwMDApCisgICAgICAgICAgICAjIFhYWCAtMjE0NzQ4MzY0OAorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDAzNzc3Nzc3Nzc3NyA+IDApCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oMHhmZmZmZmZmZiA+IDApCisgICAgICAgICAgICBmb3IgcyBpbiAnMjE0NzQ4MzY0OCcsICcwNDAwMDAwMDAwMDAnLCAnMHgxMDAwMDAwMDAnOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgeCA9IGV2YWwocykKKyAgICAgICAgICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJPdmVyZmxvd0Vycm9yIG9uIGh1Z2UgaW50ZWdlciBsaXRlcmFsICVyIiAlIHMpCisgICAgICAgIGVsaWYgbWF4aW50ID09IDkyMjMzNzIwMzY4NTQ3NzU4MDc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscygtOTIyMzM3MjAzNjg1NDc3NTgwNy0xLCAtMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDApCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oMDE3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcgPiAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDB4ZmZmZmZmZmZmZmZmZmZmZiA+IDApCisgICAgICAgICAgICBmb3IgcyBpbiAnOTIyMzM3MjAzNjg1NDc3NTgwOCcsICcwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsIFwKKyAgICAgICAgICAgICAgICAgICAgICcweDEwMDAwMDAwMDAwMDAwMDAwJzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHggPSBldmFsKHMpCisgICAgICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiT3ZlcmZsb3dFcnJvciBvbiBodWdlIGludGVnZXIgbGl0ZXJhbCAlciIgJSBzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdXZWlyZCBtYXhpbnQgdmFsdWUgJXInICUgbWF4aW50KQogCi0jIEJhY2tzbGFzaCBkb2VzIG5vdCBtZWFucyBjb250aW51YXRpb24gaW4gY29tbWVudHMgOlwKLXggPSAwCi1pZiB4ICE9IDA6IHJhaXNlIFRlc3RGYWlsZWQsICdiYWNrc2xhc2ggZW5kaW5nIGNvbW1lbnQnCisgICAgZGVmIHRlc3RMb25nSW50ZWdlcnMoc2VsZik6CisgICAgICAgIHggPSAwTAorICAgICAgICB4ID0gMGwKKyAgICAgICAgeCA9IDB4ZmZmZmZmZmZmZmZmZmZmZkwKKyAgICAgICAgeCA9IDB4ZmZmZmZmZmZmZmZmZmZmZmwKKyAgICAgICAgeCA9IDA3Nzc3Nzc3Nzc3Nzc3Nzc3N0wKKyAgICAgICAgeCA9IDA3Nzc3Nzc3Nzc3Nzc3Nzc3N2wKKyAgICAgICAgeCA9IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MEwKKyAgICAgICAgeCA9IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MGwKIAotcHJpbnQgJzEuMS4yIE51bWVyaWMgbGl0ZXJhbHMnCisgICAgZGVmIHRlc3RGbG9hdHMoc2VsZik6CisgICAgICAgIHggPSAzLjE0CisgICAgICAgIHggPSAzMTQuCisgICAgICAgIHggPSAwLjMxNAorICAgICAgICAjIFhYWCB4ID0gMDAwLjMxNAorICAgICAgICB4ID0gLjMxNAorICAgICAgICB4ID0gM2UxNAorICAgICAgICB4ID0gM0UxNAorICAgICAgICB4ID0gM2UtMTQKKyAgICAgICAgeCA9IDNlKzE0CisgICAgICAgIHggPSAzLmUxNAorICAgICAgICB4ID0gLjNlMTQKKyAgICAgICAgeCA9IDMuMWU0CiAKLXByaW50ICcxLjEuMi4xIFBsYWluIGludGVnZXJzJwotaWYgMHhmZiAhPSAyNTU6IHJhaXNlIFRlc3RGYWlsZWQsICdoZXggaW50JwotaWYgMDM3NyAhPSAyNTU6IHJhaXNlIFRlc3RGYWlsZWQsICdvY3RhbCBpbnQnCi1pZiAgMjE0NzQ4MzY0NyAgICE9IDAxNzc3Nzc3Nzc3NzogcmFpc2UgVGVzdEZhaWxlZCwgJ2xhcmdlIHBvc2l0aXZlIGludCcKLXRyeToKLSAgICBmcm9tIHN5cyBpbXBvcnQgbWF4aW50Ci1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgbWF4aW50ID0gMjE0NzQ4MzY0NwotaWYgbWF4aW50ID09IDIxNDc0ODM2NDc6Ci0gICAgIyBUaGUgZm9sbG93aW5nIHRlc3Qgd2lsbCBzdGFydCB0byBmYWlsIGluIFB5dGhvbiAyLjQ7Ci0gICAgIyBjaGFuZ2UgdGhlIDAyMDAwMDAwMDAwMCB0byAtMDIwMDAwMDAwMDAwCi0gICAgaWYgLTIxNDc0ODM2NDctMSAhPSAtMDIwMDAwMDAwMDAwOiByYWlzZSBUZXN0RmFpbGVkLCAnbWF4IG5lZ2F0aXZlIGludCcKLSAgICAjIFhYWCAtMjE0NzQ4MzY0OAotICAgIGlmIDAzNzc3Nzc3Nzc3NyA8IDA6IHJhaXNlIFRlc3RGYWlsZWQsICdsYXJnZSBvY3QnCi0gICAgaWYgMHhmZmZmZmZmZiA8IDA6IHJhaXNlIFRlc3RGYWlsZWQsICdsYXJnZSBoZXgnCi0gICAgZm9yIHMgaW4gJzIxNDc0ODM2NDgnLCAnMDQwMDAwMDAwMDAwJywgJzB4MTAwMDAwMDAwJzoKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgeCA9IGV2YWwocykKLSAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6Ci0gICAgICAgICAgICBwcmludCAiT3ZlcmZsb3dFcnJvciBvbiBodWdlIGludGVnZXIgbGl0ZXJhbCAiICsgcmVwcihzKQotZWxpZiBldmFsKCdtYXhpbnQgPT0gOTIyMzM3MjAzNjg1NDc3NTgwNycpOgotICAgIGlmIGV2YWwoJy05MjIzMzcyMDM2ODU0Nzc1ODA3LTEgIT0gLTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyk6Ci0gICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsICdtYXggbmVnYXRpdmUgaW50JwotICAgIGlmIGV2YWwoJzAxNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3JykgPCAwOiByYWlzZSBUZXN0RmFpbGVkLCAnbGFyZ2Ugb2N0JwotICAgIGlmIGV2YWwoJzB4ZmZmZmZmZmZmZmZmZmZmZicpIDwgMDogcmFpc2UgVGVzdEZhaWxlZCwgJ2xhcmdlIGhleCcKLSAgICBmb3IgcyBpbiAnOTIyMzM3MjAzNjg1NDc3NTgwOCcsICcwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsIFwKLSAgICAgICAgICAgICAnMHgxMDAwMDAwMDAwMDAwMDAwMCc6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHggPSBldmFsKHMpCi0gICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgotICAgICAgICAgICAgcHJpbnQgIk92ZXJmbG93RXJyb3Igb24gaHVnZSBpbnRlZ2VyIGxpdGVyYWwgIiArIHJlcHIocykKLWVsc2U6Ci0gICAgcHJpbnQgJ1dlaXJkIG1heGludCB2YWx1ZScsIG1heGludAotCi1wcmludCAnMS4xLjIuMiBMb25nIGludGVnZXJzJwoteCA9IDBMCi14ID0gMGwKLXggPSAweGZmZmZmZmZmZmZmZmZmZmZMCi14ID0gMHhmZmZmZmZmZmZmZmZmZmZmbAoteCA9IDA3Nzc3Nzc3Nzc3Nzc3Nzc3N0wKLXggPSAwNzc3Nzc3Nzc3Nzc3Nzc3NzdsCi14ID0gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwTAoteCA9IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MGwKLQotcHJpbnQgJzEuMS4yLjMgRmxvYXRpbmcgcG9pbnQnCi14ID0gMy4xNAoteCA9IDMxNC4KLXggPSAwLjMxNAotIyBYWFggeCA9IDAwMC4zMTQKLXggPSAuMzE0Ci14ID0gM2UxNAoteCA9IDNFMTQKLXggPSAzZS0xNAoteCA9IDNlKzE0Ci14ID0gMy5lMTQKLXggPSAuM2UxNAoteCA9IDMuMWU0Ci0KLXByaW50ICcxLjEuMyBTdHJpbmcgbGl0ZXJhbHMnCi0KLXggPSAnJzsgeSA9ICIiOyB2ZXJpZnkobGVuKHgpID09IDAgYW5kIHggPT0geSkKLXggPSAnXCcnOyB5ID0gIiciOyB2ZXJpZnkobGVuKHgpID09IDEgYW5kIHggPT0geSBhbmQgb3JkKHgpID09IDM5KQoteCA9ICciJzsgeSA9ICJcIiI7IHZlcmlmeShsZW4oeCkgPT0gMSBhbmQgeCA9PSB5IGFuZCBvcmQoeCkgPT0gMzQpCi14ID0gImRvZXNuJ3QgXCJzaHJpbmtcIiBkb2VzIGl0IgoteSA9ICdkb2VzblwndCAic2hyaW5rIiBkb2VzIGl0JwotdmVyaWZ5KGxlbih4KSA9PSAyNCBhbmQgeCA9PSB5KQoteCA9ICJkb2VzIFwic2hyaW5rXCIgZG9lc24ndCBpdCIKLXkgPSAnZG9lcyAic2hyaW5rIiBkb2VzblwndCBpdCcKLXZlcmlmeShsZW4oeCkgPT0gMjQgYW5kIHggPT0geSkKLXggPSAiIiIKKyAgICBkZWYgdGVzdFN0cmluZ0xpdGVyYWxzKHNlbGYpOgorICAgICAgICB4ID0gJyc7IHkgPSAiIjsgc2VsZi5hc3NlcnRfKGxlbih4KSA9PSAwIGFuZCB4ID09IHkpCisgICAgICAgIHggPSAnXCcnOyB5ID0gIiciOyBzZWxmLmFzc2VydF8obGVuKHgpID09IDEgYW5kIHggPT0geSBhbmQgb3JkKHgpID09IDM5KQorICAgICAgICB4ID0gJyInOyB5ID0gIlwiIjsgc2VsZi5hc3NlcnRfKGxlbih4KSA9PSAxIGFuZCB4ID09IHkgYW5kIG9yZCh4KSA9PSAzNCkKKyAgICAgICAgeCA9ICJkb2Vzbid0IFwic2hyaW5rXCIgZG9lcyBpdCIKKyAgICAgICAgeSA9ICdkb2VzblwndCAic2hyaW5rIiBkb2VzIGl0JworICAgICAgICBzZWxmLmFzc2VydF8obGVuKHgpID09IDI0IGFuZCB4ID09IHkpCisgICAgICAgIHggPSAiZG9lcyBcInNocmlua1wiIGRvZXNuJ3QgaXQiCisgICAgICAgIHkgPSAnZG9lcyAic2hyaW5rIiBkb2VzblwndCBpdCcKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbih4KSA9PSAyNCBhbmQgeCA9PSB5KQorICAgICAgICB4ID0gIiIiCiBUaGUgInF1aWNrIgogYnJvd24gZm94CiBqdW1wcyBvdmVyCiB0aGUgJ2xhenknIGRvZy4KICIiIgoteSA9ICdcblRoZSAicXVpY2siXG5icm93biBmb3hcbmp1bXBzIG92ZXJcbnRoZSBcJ2xhenlcJyBkb2cuXG4nCi12ZXJpZnkoeCA9PSB5KQoteSA9ICcnJworICAgICAgICB5ID0gJ1xuVGhlICJxdWljayJcbmJyb3duIGZveFxuanVtcHMgb3ZlclxudGhlIFwnbGF6eVwnIGRvZy5cbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgeSkKKyAgICAgICAgeSA9ICcnJwogVGhlICJxdWljayIKIGJyb3duIGZveAoganVtcHMgb3ZlcgogdGhlICdsYXp5JyBkb2cuCi0nJyc7IHZlcmlmeSh4ID09IHkpCi15ID0gIlxuXAorJycnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIHkpCisgICAgICAgIHkgPSAiXG5cCiBUaGUgXCJxdWlja1wiXG5cCiBicm93biBmb3hcblwKIGp1bXBzIG92ZXJcblwKIHRoZSAnbGF6eScgZG9nLlxuXAotIjsgdmVyaWZ5KHggPT0geSkKLXkgPSAnXG5cCisiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIHkpCisgICAgICAgIHkgPSAnXG5cCiBUaGUgXCJxdWlja1wiXG5cCiBicm93biBmb3hcblwKIGp1bXBzIG92ZXJcblwKIHRoZSBcJ2xhenlcJyBkb2cuXG5cCi0nOyB2ZXJpZnkoeCA9PSB5KQorJworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LCB5KQorCisgICAgZGVmIHRlc3RFbGxpcHNpcyhzZWxmKToKKyAgICAgICAgeCA9IC4uLgorICAgICAgICBzZWxmLmFzc2VydF8oeCBpcyBFbGxpcHNpcykKKworY2xhc3MgR3JhbW1hclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgICMgc2luZ2xlX2lucHV0OiBORVdMSU5FIHwgc2ltcGxlX3N0bXQgfCBjb21wb3VuZF9zdG10IE5FV0xJTkUKKyAgICAjIFhYWCBjYW4ndCB0ZXN0IGluIGEgc2NyaXB0IC0tIHRoaXMgcnVsZSBpcyBvbmx5IHVzZWQgd2hlbiBpbnRlcmFjdGl2ZQorCisgICAgIyBmaWxlX2lucHV0OiAoTkVXTElORSB8IHN0bXQpKiBFTkRNQVJLRVIKKyAgICAjIEJlaW5nIHRlc3RlZCBhcyB0aGlzIHZlcnkgbW9tZW50IHRoaXMgdmVyeSBtb2R1bGUKKworICAgICMgZXhwcl9pbnB1dDogdGVzdGxpc3QgTkVXTElORQorICAgICMgWFhYIEhhcmQgdG8gdGVzdCAtLSB1c2VkIG9ubHkgaW4gY2FsbHMgdG8gaW5wdXQoKQorCisgICAgZGVmIHRlc3RFdmFsSW5wdXQoc2VsZik6CisgICAgICAgICMgdGVzdGxpc3QgRU5ETUFSS0VSCisgICAgICAgIHggPSBldmFsKCcxLCAwIG9yIDEnKQorCisgICAgZGVmIHRlc3RGdW5jZGVmKHNlbGYpOgorICAgICAgICAjIyMgJ2RlZicgTkFNRSBwYXJhbWV0ZXJzICc6JyBzdWl0ZQorICAgICAgICAjIyMgcGFyYW1ldGVyczogJygnIFt2YXJhcmdzbGlzdF0gJyknCisgICAgICAgICMjIyB2YXJhcmdzbGlzdDogKGZwZGVmIFsnPScgdGVzdF0gJywnKSoKKyAgICAgICAgIyMjICAgICAgICAgICAoJyonIChOQU1FfCcsJyBmcGRlZiBbJz0nIHRlc3RdKSBbJywnICgnKionfCcqJyAnKicpIE5BTUVdCisgICAgICAgICMjIyAgICAgICAgICAgIHwgKCcqKid8JyonICcqJykgTkFNRSkKKyAgICAgICAgIyMjICAgICAgICAgICAgfCBmcGRlZiBbJz0nIHRlc3RdICgnLCcgZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCddCisgICAgICAgICMjIyBmcGRlZjogTkFNRSB8ICcoJyBmcGxpc3QgJyknCisgICAgICAgICMjIyBmcGxpc3Q6IGZwZGVmICgnLCcgZnBkZWYpKiBbJywnXQorICAgICAgICAjIyMgYXJnbGlzdDogKGFyZ3VtZW50ICcsJykqIChhcmd1bWVudCB8IConIHRlc3QgWycsJyAnKionIHRlc3RdIHwgJyoqJyB0ZXN0KQorICAgICAgICAjIyMgYXJndW1lbnQ6IFt0ZXN0ICc9J10gdGVzdCAgICMgUmVhbGx5IFtrZXl3b3JkICc9J10gdGVzdAorICAgICAgICBkZWYgZjEoKTogcGFzcworICAgICAgICBmMSgpCisgICAgICAgIGYxKCooKSkKKyAgICAgICAgZjEoKigpLCAqKnt9KQorICAgICAgICBkZWYgZjIob25lX2FyZ3VtZW50KTogcGFzcworICAgICAgICBkZWYgZjModHdvLCBhcmd1bWVudHMpOiBwYXNzCisgICAgICAgIGRlZiBmNCh0d28sIChjb21wb3VuZCwgKGFyZ3VtZW50LCBsaXN0KSkpOiBwYXNzCisgICAgICAgIGRlZiBmNSgoY29tcG91bmQsIGZpcnN0KSwgdHdvKTogcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmMi5mdW5jX2NvZGUuY29fdmFybmFtZXMsICgnb25lX2FyZ3VtZW50JywpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmMy5mdW5jX2NvZGUuY29fdmFybmFtZXMsICgndHdvJywgJ2FyZ3VtZW50cycpKQorICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZjQuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLAorICAgICAgICAgICAgICAgICAgICgndHdvJywgJyhjb21wb3VuZCwgKGFyZ3VtZW50LCBsaXN0KSknLCAnY29tcG91bmQnLCAnYXJndW1lbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlzdCcsKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGY1LmZ1bmNfY29kZS5jb192YXJuYW1lcywKKyAgICAgICAgICAgICAgICAgICAoJyhjb21wb3VuZCwgZmlyc3QpJywgJ3R3bycsICdjb21wb3VuZCcsICdmaXJzdCcpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZjQuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLAorICAgICAgICAgICAgICAgICAgKCd0d28nLCAnLjEnLCAnY29tcG91bmQnLCAnYXJndW1lbnQnLCAgJ2xpc3QnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGY1LmZ1bmNfY29kZS5jb192YXJuYW1lcywKKyAgICAgICAgICAgICAgICAgICgnLjAnLCAndHdvJywgJ2NvbXBvdW5kJywgJ2ZpcnN0JykpCisgICAgICAgIGRlZiBhMShvbmVfYXJnLCk6IHBhc3MKKyAgICAgICAgZGVmIGEyKHR3bywgYXJncywpOiBwYXNzCisgICAgICAgIGRlZiB2MCgqcmVzdCk6IHBhc3MKKyAgICAgICAgZGVmIHYxKGEsICpyZXN0KTogcGFzcworICAgICAgICBkZWYgdjIoYSwgYiwgKnJlc3QpOiBwYXNzCisgICAgICAgIGRlZiB2MyhhLCAoYiwgYyksICpyZXN0KTogcmV0dXJuIGEsIGIsIGMsIHJlc3QKKworICAgICAgICBmMSgpCisgICAgICAgIGYyKDEpCisgICAgICAgIGYyKDEsKQorICAgICAgICBmMygxLCAyKQorICAgICAgICBmMygxLCAyLCkKKyAgICAgICAgZjQoMSwgKDIsICgzLCA0KSkpCisgICAgICAgIHYwKCkKKyAgICAgICAgdjAoMSkKKyAgICAgICAgdjAoMSwpCisgICAgICAgIHYwKDEsMikKKyAgICAgICAgdjAoMSwyLDMsNCw1LDYsNyw4LDksMCkKKyAgICAgICAgdjEoMSkKKyAgICAgICAgdjEoMSwpCisgICAgICAgIHYxKDEsMikKKyAgICAgICAgdjEoMSwyLDMpCisgICAgICAgIHYxKDEsMiwzLDQsNSw2LDcsOCw5LDApCisgICAgICAgIHYyKDEsMikKKyAgICAgICAgdjIoMSwyLDMpCisgICAgICAgIHYyKDEsMiwzLDQpCisgICAgICAgIHYyKDEsMiwzLDQsNSw2LDcsOCw5LDApCisgICAgICAgIHYzKDEsKDIsMykpCisgICAgICAgIHYzKDEsKDIsMyksNCkKKyAgICAgICAgdjMoMSwoMiwzKSw0LDUsNiw3LDgsOSwwKQorCisgICAgICAgICMgY2V2YWwgdW5wYWNrcyB0aGUgZm9ybWFsIGFyZ3VtZW50cyBpbnRvIHRoZSBmaXJzdCBhcmdjb3VudCBuYW1lczsKKyAgICAgICAgIyB0aHVzLCB0aGUgbmFtZXMgbmVzdGVkIGluc2lkZSB0dXBsZXMgbXVzdCBhcHBlYXIgYWZ0ZXIgdGhlc2UgbmFtZXMuCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh2My5mdW5jX2NvZGUuY29fdmFybmFtZXMsICgnYScsICcoYiwgYyknLCAncmVzdCcsICdiJywgJ2MnKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHYzLmZ1bmNfY29kZS5jb192YXJuYW1lcywgKCdhJywgJy4xJywgJ3Jlc3QnLCAnYicsICdjJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHYzKDEsICgyLCAzKSwgNCksICgxLCAyLCAzLCAoNCwpKSkKKyAgICAgICAgZGVmIGQwMShhPTEpOiBwYXNzCisgICAgICAgIGQwMSgpCisgICAgICAgIGQwMSgxKQorICAgICAgICBkMDEoKigxLCkpCisgICAgICAgIGQwMSgqKnsnYSc6Mn0pCisgICAgICAgIGRlZiBkMTEoYSwgYj0xKTogcGFzcworICAgICAgICBkMTEoMSkKKyAgICAgICAgZDExKDEsIDIpCisgICAgICAgIGQxMSgxLCAqKnsnYic6Mn0pCisgICAgICAgIGRlZiBkMjEoYSwgYiwgYz0xKTogcGFzcworICAgICAgICBkMjEoMSwgMikKKyAgICAgICAgZDIxKDEsIDIsIDMpCisgICAgICAgIGQyMSgqKDEsIDIsIDMpKQorICAgICAgICBkMjEoMSwgKigyLCAzKSkKKyAgICAgICAgZDIxKDEsIDIsICooMywpKQorICAgICAgICBkMjEoMSwgMiwgKip7J2MnOjN9KQorICAgICAgICBkZWYgZDAyKGE9MSwgYj0yKTogcGFzcworICAgICAgICBkMDIoKQorICAgICAgICBkMDIoMSkKKyAgICAgICAgZDAyKDEsIDIpCisgICAgICAgIGQwMigqKDEsIDIpKQorICAgICAgICBkMDIoMSwgKigyLCkpCisgICAgICAgIGQwMigxLCAqKnsnYic6Mn0pCisgICAgICAgIGQwMigqKnsnYSc6IDEsICdiJzogMn0pCisgICAgICAgIGRlZiBkMTIoYSwgYj0xLCBjPTIpOiBwYXNzCisgICAgICAgIGQxMigxKQorICAgICAgICBkMTIoMSwgMikKKyAgICAgICAgZDEyKDEsIDIsIDMpCisgICAgICAgIGRlZiBkMjIoYSwgYiwgYz0xLCBkPTIpOiBwYXNzCisgICAgICAgIGQyMigxLCAyKQorICAgICAgICBkMjIoMSwgMiwgMykKKyAgICAgICAgZDIyKDEsIDIsIDMsIDQpCisgICAgICAgIGRlZiBkMDF2KGE9MSwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQwMXYoKQorICAgICAgICBkMDF2KDEpCisgICAgICAgIGQwMXYoMSwgMikKKyAgICAgICAgZDAxdigqKDEsIDIsIDMsIDQpKQorICAgICAgICBkMDF2KCooMSwpKQorICAgICAgICBkMDF2KCoqeydhJzoyfSkKKyAgICAgICAgZGVmIGQxMXYoYSwgYj0xLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZDExdigxKQorICAgICAgICBkMTF2KDEsIDIpCisgICAgICAgIGQxMXYoMSwgMiwgMykKKyAgICAgICAgZGVmIGQyMXYoYSwgYiwgYz0xLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZDIxdigxLCAyKQorICAgICAgICBkMjF2KDEsIDIsIDMpCisgICAgICAgIGQyMXYoMSwgMiwgMywgNCkKKyAgICAgICAgZDIxdigqKDEsIDIsIDMsIDQpKQorICAgICAgICBkMjF2KDEsIDIsICoqeydjJzogM30pCisgICAgICAgIGRlZiBkMDJ2KGE9MSwgYj0yLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZDAydigpCisgICAgICAgIGQwMnYoMSkKKyAgICAgICAgZDAydigxLCAyKQorICAgICAgICBkMDJ2KDEsIDIsIDMpCisgICAgICAgIGQwMnYoMSwgKigyLCAzLCA0KSkKKyAgICAgICAgZDAydigqKnsnYSc6IDEsICdiJzogMn0pCisgICAgICAgIGRlZiBkMTJ2KGEsIGI9MSwgYz0yLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZDEydigxKQorICAgICAgICBkMTJ2KDEsIDIpCisgICAgICAgIGQxMnYoMSwgMiwgMykKKyAgICAgICAgZDEydigxLCAyLCAzLCA0KQorICAgICAgICBkMTJ2KCooMSwgMiwgMywgNCkpCisgICAgICAgIGQxMnYoMSwgMiwgKigzLCA0LCA1KSkKKyAgICAgICAgZDEydigxLCAqKDIsKSwgKip7J2MnOiAzfSkKKyAgICAgICAgZGVmIGQyMnYoYSwgYiwgYz0xLCBkPTIsICpyZXN0KTogcGFzcworICAgICAgICBkMjJ2KDEsIDIpCisgICAgICAgIGQyMnYoMSwgMiwgMykKKyAgICAgICAgZDIydigxLCAyLCAzLCA0KQorICAgICAgICBkMjJ2KDEsIDIsIDMsIDQsIDUpCisgICAgICAgIGQyMnYoKigxLCAyLCAzLCA0KSkKKyAgICAgICAgZDIydigxLCAyLCAqKDMsIDQsIDUpKQorICAgICAgICBkMjJ2KDEsICooMiwgMyksICoqeydkJzogNH0pCisgICAgICAgIGRlZiBkMzF2KCh4KSk6IHBhc3MKKyAgICAgICAgZDMxdigxKQorICAgICAgICBkZWYgZDMydigoeCwpKTogcGFzcworICAgICAgICBkMzJ2KCgxLCkpCisgICAgICAgICMga2V5d29yZCBvbmx5IGFyZ3VtZW50IHRlc3RzCisgICAgICAgIGRlZiBwb3Mwa2V5MSgqLCBrZXkpOiByZXR1cm4ga2V5CisgICAgICAgIHBvczBrZXkxKGtleT0xMDApCisgICAgICAgIGRlZiBwb3Mya2V5MihwMSwgcDIsICosIGsxLCBrMj0xMDApOiByZXR1cm4gcDEscDIsazEsazIKKyAgICAgICAgcG9zMmtleTIoMSwgMiwgazE9MTAwKQorICAgICAgICBwb3Mya2V5MigxLCAyLCBrMT0xMDAsIGsyPTIwMCkKKyAgICAgICAgcG9zMmtleTIoMSwgMiwgazI9MTAwLCBrMT0yMDApCisgICAgICAgIGRlZiBwb3Mya2V5MmRpY3QocDEsIHAyLCAqLCBrMT0xMDAsIGsyLCAqKmt3YXJnKTogcmV0dXJuIHAxLHAyLGsxLGsyLGt3YXJnCisgICAgICAgIHBvczJrZXkyZGljdCgxLDIsazI9MTAwLHRva3dhcmcxPTEwMCx0b2t3YXJnMj0yMDApCisgICAgICAgIHBvczJrZXkyZGljdCgxLDIsdG9rd2FyZzE9MTAwLHRva3dhcmcyPTIwMCwgazI9MTAwKQorCisgICAgZGVmIHRlc3RMYW1iZGVmKHNlbGYpOgorICAgICAgICAjIyMgbGFtYmRlZjogJ2xhbWJkYScgW3ZhcmFyZ3NsaXN0XSAnOicgdGVzdAorICAgICAgICBsMSA9IGxhbWJkYSA6IDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobDEoKSwgMCkKKyAgICAgICAgbDIgPSBsYW1iZGEgOiBhW2RdICMgWFhYIGp1c3QgdGVzdGluZyB0aGUgZXhwcmVzc2lvbgorICAgICAgICBsMyA9IGxhbWJkYSA6IFsyIDwgeCBmb3IgeCBpbiBbLTEsIDMsIDBMXV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobDMoKSwgWzAsIDEsIDBdKQorICAgICAgICBsNCA9IGxhbWJkYSB4ID0gbGFtYmRhIHkgPSBsYW1iZGEgej0xIDogeiA6IHkoKSA6IHgoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsNCgpLCAxKQorICAgICAgICBsNSA9IGxhbWJkYSB4LCB5LCB6PTI6IHggKyB5ICsgegorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsNSgxLCAyKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobDUoMSwgMiwgMyksIDYpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAibGFtYmRhIHg6IHggPSAyIikKKyAgICAgICAgbDYgPSBsYW1iZGEgeCwgeSwgKiwgaz0yMDogeCt5K2sKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobDYoMSwyKSwgMSsyKzIwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsNigxLDIsaz0xMCksIDErMisxMCkKIAogCi1wcmludCAnMS4xLjQgRWxsaXBzaXMgbGl0ZXJhbCcKKyAgICAjIyMgc3RtdDogc2ltcGxlX3N0bXQgfCBjb21wb3VuZF9zdG10CisgICAgIyBUZXN0ZWQgYmVsb3cKIAoteCA9IC4uLgotdmVyaWZ5KHggPT0gRWxsaXBzaXMpCisgICAgZGVmIHRlc3RTaW1wbGVTdG10KHNlbGYpOgorICAgICAgICAjIyMgc2ltcGxlX3N0bXQ6IHNtYWxsX3N0bXQgKCc7JyBzbWFsbF9zdG10KSogWyc7J10KKyAgICAgICAgeCA9IDE7IHBhc3M7IGRlbCB4CisgICAgICAgIGRlZiBmb28oKToKKyAgICAgICAgICAgICMgdmVyaWZ5IHN0YXRtZW50cyB0aGF0IGVuZCB3aXRoIHNlbWktY29sb25zCisgICAgICAgICAgICB4ID0gMTsgcGFzczsgZGVsIHg7CisgICAgICAgIGZvbygpCiAKKyAgICAjIyMgc21hbGxfc3RtdDogZXhwcl9zdG10IHwgcHJpbnRfc3RtdCAgfCBwYXNzX3N0bXQgfCBkZWxfc3RtdCB8IGZsb3dfc3RtdCB8IGltcG9ydF9zdG10IHwgZ2xvYmFsX3N0bXQgfCBhY2Nlc3Nfc3RtdCAKKyAgICAjIFRlc3RlZCBiZWxvdwogCi1wcmludCAnMS4yIEdyYW1tYXInCisgICAgZGVmIHRlc3RFeHByU3RtdChzZWxmKToKKyAgICAgICAgIyAoZXhwcmxpc3QgJz0nKSogZXhwcmxpc3QKKyAgICAgICAgMQorICAgICAgICAxLCAyLCAzCisgICAgICAgIHggPSAxCisgICAgICAgIHggPSAxLCAyLCAzCisgICAgICAgIHggPSB5ID0geiA9IDEsIDIsIDMKKyAgICAgICAgeCwgeSwgeiA9IDEsIDIsIDMKKyAgICAgICAgYWJjID0gYSwgYiwgYyA9IHgsIHksIHogPSB4eXogPSAxLCAyLCAoMywgNCkKIAotcHJpbnQgJ3NpbmdsZV9pbnB1dCcgIyBORVdMSU5FIHwgc2ltcGxlX3N0bXQgfCBjb21wb3VuZF9zdG10IE5FV0xJTkUKLSMgWFhYIGNhbid0IHRlc3QgaW4gYSBzY3JpcHQgLS0gdGhpcyBydWxlIGlzIG9ubHkgdXNlZCB3aGVuIGludGVyYWN0aXZlCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAieCArIDEgPSAxIikKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJhICsgMSA9IGIgKyAyIikKIAotcHJpbnQgJ2ZpbGVfaW5wdXQnICMgKE5FV0xJTkUgfCBzdG10KSogRU5ETUFSS0VSCi0jIEJlaW5nIHRlc3RlZCBhcyB0aGlzIHZlcnkgbW9tZW50IHRoaXMgdmVyeSBtb2R1bGUKKyAgICBkZWYgdGVzdFByaW50U3RtdChzZWxmKToKKyAgICAgICAgIyAncHJpbnQnICh0ZXN0ICcsJykqIFt0ZXN0XQorICAgICAgICBpbXBvcnQgU3RyaW5nSU8KIAotcHJpbnQgJ2V4cHJfaW5wdXQnICMgdGVzdGxpc3QgTkVXTElORQotIyBYWFggSGFyZCB0byB0ZXN0IC0tIHVzZWQgb25seSBpbiBjYWxscyB0byBpbnB1dCgpCisgICAgICAgICMgQ2FuJ3QgdGVzdCBwcmludGluZyB0byByZWFsIHN0ZG91dCB3aXRob3V0IGNvbXBhcmluZyBvdXRwdXQKKyAgICAgICAgIyB3aGljaCBpcyBub3QgYXZhaWxhYmxlIGluIHVuaXR0ZXN0LgorICAgICAgICBzYXZlX3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgc3lzLnN0ZG91dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKIAotcHJpbnQgJ2V2YWxfaW5wdXQnICMgdGVzdGxpc3QgRU5ETUFSS0VSCi14ID0gZXZhbCgnMSwgMCBvciAxJykKKyAgICAgICAgcHJpbnQgMSwgMiwgMworICAgICAgICBwcmludCAxLCAyLCAzLAorICAgICAgICBwcmludAorICAgICAgICBwcmludCAwIG9yIDEsIDAgb3IgMSwKKyAgICAgICAgcHJpbnQgMCBvciAxCiAKLXByaW50ICdmdW5jZGVmJwotIyMjICdkZWYnIE5BTUUgcGFyYW1ldGVycyAnOicgc3VpdGUKLSMjIyBwYXJhbWV0ZXJzOiAnKCcgW3ZhcmFyZ3NsaXN0XSAnKScKLSMjIyB2YXJhcmdzbGlzdDogKGZwZGVmIFsnPScgdGVzdF0gJywnKSogCi0jIyMgICAgICAgICAgICgnKicgKE5BTUV8JywnIGZwZGVmIFsnPScgdGVzdF0pIFsnLCcgKCcqKid8JyonICcqJykgTkFNRV0KLSMjIyAgICAgICAgICAgIHwgKCcqKid8JyonICcqJykgTkFNRSkKLSMjIyAgICAgICAgICAgIHwgZnBkZWYgWyc9JyB0ZXN0XSAoJywnIGZwZGVmIFsnPScgdGVzdF0pKiBbJywnXQotIyMjIGZwZGVmOiBOQU1FIHwgJygnIGZwbGlzdCAnKScKLSMjIyBmcGxpc3Q6IGZwZGVmICgnLCcgZnBkZWYpKiBbJywnXQotIyMjIGFyZ2xpc3Q6IChhcmd1bWVudCAnLCcpKiAoYXJndW1lbnQgfCAqJyB0ZXN0IFsnLCcgJyoqJyB0ZXN0XSB8ICcqKicgdGVzdCkKLSMjIyBhcmd1bWVudDogW3Rlc3QgJz0nXSB0ZXN0ICAgIyBSZWFsbHkgW2tleXdvcmQgJz0nXSB0ZXN0Ci1kZWYgZjEoKTogcGFzcwotZjEoKQotZjEoKigpKQotZjEoKigpLCAqKnt9KQotZGVmIGYyKG9uZV9hcmd1bWVudCk6IHBhc3MKLWRlZiBmMyh0d28sIGFyZ3VtZW50cyk6IHBhc3MKLWRlZiBmNCh0d28sIChjb21wb3VuZCwgKGFyZ3VtZW50LCBsaXN0KSkpOiBwYXNzCi1kZWYgZjUoKGNvbXBvdW5kLCBmaXJzdCksIHR3byk6IHBhc3MKLXZlcmVxKGYyLmZ1bmNfY29kZS5jb192YXJuYW1lcywgKCdvbmVfYXJndW1lbnQnLCkpCi12ZXJlcShmMy5mdW5jX2NvZGUuY29fdmFybmFtZXMsICgndHdvJywgJ2FyZ3VtZW50cycpKQotaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKLSAgICB2ZXJlcShmNC5mdW5jX2NvZGUuY29fdmFybmFtZXMsCi0gICAgICAgICAgICgndHdvJywgJyhjb21wb3VuZCwgKGFyZ3VtZW50LCBsaXN0KSknLCAnY29tcG91bmQnLCAnYXJndW1lbnQnLAotICAgICAgICAgICAgICAgICAgICAgICAgJ2xpc3QnLCkpCi0gICAgdmVyZXEoZjUuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLAotICAgICAgICAgICAoJyhjb21wb3VuZCwgZmlyc3QpJywgJ3R3bycsICdjb21wb3VuZCcsICdmaXJzdCcpKQotZWxzZToKLSAgICB2ZXJlcShmNC5mdW5jX2NvZGUuY29fdmFybmFtZXMsCi0gICAgICAgICAgKCd0d28nLCAnLjEnLCAnY29tcG91bmQnLCAnYXJndW1lbnQnLCAgJ2xpc3QnKSkKLSAgICB2ZXJlcShmNS5mdW5jX2NvZGUuY29fdmFybmFtZXMsCi0gICAgICAgICAgKCcuMCcsICd0d28nLCAnY29tcG91bmQnLCAnZmlyc3QnKSkKLWRlZiBhMShvbmVfYXJnLCk6IHBhc3MKLWRlZiBhMih0d28sIGFyZ3MsKTogcGFzcwotZGVmIHYwKCpyZXN0KTogcGFzcwotZGVmIHYxKGEsICpyZXN0KTogcGFzcwotZGVmIHYyKGEsIGIsICpyZXN0KTogcGFzcwotZGVmIHYzKGEsIChiLCBjKSwgKnJlc3QpOiByZXR1cm4gYSwgYiwgYywgcmVzdAotIyBjZXZhbCB1bnBhY2tzIHRoZSBmb3JtYWwgYXJndW1lbnRzIGludG8gdGhlIGZpcnN0IGFyZ2NvdW50IG5hbWVzOwotIyB0aHVzLCB0aGUgbmFtZXMgbmVzdGVkIGluc2lkZSB0dXBsZXMgbXVzdCBhcHBlYXIgYWZ0ZXIgdGhlc2UgbmFtZXMuCi1pZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgotICAgIHZlcmlmeSh2My5mdW5jX2NvZGUuY29fdmFybmFtZXMgPT0gKCdhJywgJyhiLCBjKScsICdyZXN0JywgJ2InLCAnYycpKQotZWxzZToKLSAgICB2ZXJlcSh2My5mdW5jX2NvZGUuY29fdmFybmFtZXMsICgnYScsICcuMScsICdyZXN0JywgJ2InLCAnYycpKQotdmVyaWZ5KHYzKDEsICgyLCAzKSwgNCkgPT0gKDEsIDIsIDMsICg0LCkpKQotZGVmIGQwMShhPTEpOiBwYXNzCi1kMDEoKQotZDAxKDEpCi1kMDEoKigxLCkpCi1kMDEoKip7J2EnOjJ9KQotZGVmIGQxMShhLCBiPTEpOiBwYXNzCi1kMTEoMSkKLWQxMSgxLCAyKQotZDExKDEsICoqeydiJzoyfSkKLWRlZiBkMjEoYSwgYiwgYz0xKTogcGFzcwotZDIxKDEsIDIpCi1kMjEoMSwgMiwgMykKLWQyMSgqKDEsIDIsIDMpKQotZDIxKDEsICooMiwgMykpCi1kMjEoMSwgMiwgKigzLCkpCi1kMjEoMSwgMiwgKip7J2MnOjN9KQotZGVmIGQwMihhPTEsIGI9Mik6IHBhc3MKLWQwMigpCi1kMDIoMSkKLWQwMigxLCAyKQotZDAyKCooMSwgMikpCi1kMDIoMSwgKigyLCkpCi1kMDIoMSwgKip7J2InOjJ9KQotZDAyKCoqeydhJzogMSwgJ2InOiAyfSkKLWRlZiBkMTIoYSwgYj0xLCBjPTIpOiBwYXNzCi1kMTIoMSkKLWQxMigxLCAyKQotZDEyKDEsIDIsIDMpCi1kZWYgZDIyKGEsIGIsIGM9MSwgZD0yKTogcGFzcwotZDIyKDEsIDIpCi1kMjIoMSwgMiwgMykKLWQyMigxLCAyLCAzLCA0KQotZGVmIGQwMXYoYT0xLCAqcmVzdCk6IHBhc3MKLWQwMXYoKQotZDAxdigxKQotZDAxdigxLCAyKQotZDAxdigqKDEsIDIsIDMsIDQpKQotZDAxdigqKDEsKSkKLWQwMXYoKip7J2EnOjJ9KQotZGVmIGQxMXYoYSwgYj0xLCAqcmVzdCk6IHBhc3MKLWQxMXYoMSkKLWQxMXYoMSwgMikKLWQxMXYoMSwgMiwgMykKLWRlZiBkMjF2KGEsIGIsIGM9MSwgKnJlc3QpOiBwYXNzCi1kMjF2KDEsIDIpCi1kMjF2KDEsIDIsIDMpCi1kMjF2KDEsIDIsIDMsIDQpCi1kMjF2KCooMSwgMiwgMywgNCkpCi1kMjF2KDEsIDIsICoqeydjJzogM30pCi1kZWYgZDAydihhPTEsIGI9MiwgKnJlc3QpOiBwYXNzCi1kMDJ2KCkKLWQwMnYoMSkKLWQwMnYoMSwgMikKLWQwMnYoMSwgMiwgMykKLWQwMnYoMSwgKigyLCAzLCA0KSkKLWQwMnYoKip7J2EnOiAxLCAnYic6IDJ9KQotZGVmIGQxMnYoYSwgYj0xLCBjPTIsICpyZXN0KTogcGFzcwotZDEydigxKQotZDEydigxLCAyKQotZDEydigxLCAyLCAzKQotZDEydigxLCAyLCAzLCA0KQotZDEydigqKDEsIDIsIDMsIDQpKQotZDEydigxLCAyLCAqKDMsIDQsIDUpKQotZDEydigxLCAqKDIsKSwgKip7J2MnOiAzfSkKLWRlZiBkMjJ2KGEsIGIsIGM9MSwgZD0yLCAqcmVzdCk6IHBhc3MKLWQyMnYoMSwgMikKLWQyMnYoMSwgMiwgMykKLWQyMnYoMSwgMiwgMywgNCkKLWQyMnYoMSwgMiwgMywgNCwgNSkKLWQyMnYoKigxLCAyLCAzLCA0KSkKLWQyMnYoMSwgMiwgKigzLCA0LCA1KSkKLWQyMnYoMSwgKigyLCAzKSwgKip7J2QnOiA0fSkKLWRlZiBkMzF2KCh4KSk6IHBhc3MKLWQzMXYoMSkKLWRlZiBkMzJ2KCh4LCkpOiBwYXNzCi1kMzJ2KCgxLCkpCi0ja2V5d29yZCBvbmx5IGFyZ3VtZW50IHRlc3RzCi1kZWYgcG9zMGtleTEoKiwga2V5KTogcmV0dXJuIGtleQotcG9zMGtleTEoa2V5PTEwMCkKLWRlZiBwb3Mya2V5MihwMSwgcDIsICosIGsxLCBrMj0xMDApOiByZXR1cm4gcDEscDIsazEsazIKLXBvczJrZXkyKDEsIDIsIGsxPTEwMCkKLXBvczJrZXkyKDEsIDIsIGsxPTEwMCwgazI9MjAwKQotcG9zMmtleTIoMSwgMiwgazI9MTAwLCBrMT0yMDApCi1kZWYgcG9zMmtleTJkaWN0KHAxLCBwMiwgKiwgazE9MTAwLCBrMiwgKiprd2FyZyk6IHJldHVybiBwMSxwMixrMSxrMixrd2FyZwotcG9zMmtleTJkaWN0KDEsMixrMj0xMDAsdG9rd2FyZzE9MTAwLHRva3dhcmcyPTIwMCkKLXBvczJrZXkyZGljdCgxLDIsdG9rd2FyZzE9MTAwLHRva3dhcmcyPTIwMCwgazI9MTAwKQorICAgICAgICAjICdwcmludCcgJz4+JyB0ZXN0ICcsJworICAgICAgICBwcmludCA+PiBzeXMuc3Rkb3V0LCAxLCAyLCAzCisgICAgICAgIHByaW50ID4+IHN5cy5zdGRvdXQsIDEsIDIsIDMsCisgICAgICAgIHByaW50ID4+IHN5cy5zdGRvdXQKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZG91dCwgMCBvciAxLCAwIG9yIDEsCisgICAgICAgIHByaW50ID4+IHN5cy5zdGRvdXQsIDAgb3IgMQogCi0jIyMgbGFtYmRlZjogJ2xhbWJkYScgW3ZhcmFyZ3NsaXN0XSAnOicgdGVzdAotcHJpbnQgJ2xhbWJkZWYnCi1sMSA9IGxhbWJkYSA6IDAKLXZlcmlmeShsMSgpID09IDApCi1sMiA9IGxhbWJkYSA6IGFbZF0gIyBYWFgganVzdCB0ZXN0aW5nIHRoZSBleHByZXNzaW9uCi1sMyA9IGxhbWJkYSA6IFsyIDwgeCBmb3IgeCBpbiBbLTEsIDMsIDBMXV0KLXZlcmlmeShsMygpID09IFswLCAxLCAwXSkKLWw0ID0gbGFtYmRhIHggPSBsYW1iZGEgeSA9IGxhbWJkYSB6PTEgOiB6IDogeSgpIDogeCgpCi12ZXJpZnkobDQoKSA9PSAxKQotbDUgPSBsYW1iZGEgeCwgeSwgej0yOiB4ICsgeSArIHoKLXZlcmlmeShsNSgxLCAyKSA9PSA1KQotdmVyaWZ5KGw1KDEsIDIsIDMpID09IDYpCi1jaGVja19zeW50YXgoImxhbWJkYSB4OiB4ID0gMiIpCi1sNiA9IGxhbWJkYSB4LCB5LCAqLCBrPTIwOiB4K3krawotdmVyaWZ5KGw2KDEsMikgPT0gMSsyKzIwKQotdmVyaWZ5KGw2KDEsMixrPTEwKSA9PSAxKzIrMTApCisgICAgICAgICMgdGVzdCBwcmludGluZyB0byBhbiBpbnN0YW5jZQorICAgICAgICBjbGFzcyBHdWxwOgorICAgICAgICAgICAgZGVmIHdyaXRlKHNlbGYsIG1zZyk6IHBhc3MKIAotIyMjIHN0bXQ6IHNpbXBsZV9zdG10IHwgY29tcG91bmRfc3RtdAotIyBUZXN0ZWQgYmVsb3cKKyAgICAgICAgZ3VscCA9IEd1bHAoKQorICAgICAgICBwcmludCA+PiBndWxwLCAxLCAyLCAzCisgICAgICAgIHByaW50ID4+IGd1bHAsIDEsIDIsIDMsCisgICAgICAgIHByaW50ID4+IGd1bHAKKyAgICAgICAgcHJpbnQgPj4gZ3VscCwgMCBvciAxLCAwIG9yIDEsCisgICAgICAgIHByaW50ID4+IGd1bHAsIDAgb3IgMQogCi0jIyMgc2ltcGxlX3N0bXQ6IHNtYWxsX3N0bXQgKCc7JyBzbWFsbF9zdG10KSogWyc7J10KLXByaW50ICdzaW1wbGVfc3RtdCcKLXggPSAxOyBwYXNzOyBkZWwgeAotZGVmIGZvbygpOgotICAgICMgdmVyaWZ5IHN0YXRtZW50cyB0aGF0IGVuZCB3aXRoIHNlbWktY29sb25zCi0gICAgeCA9IDE7IHBhc3M7IGRlbCB4OwotZm9vKCkKKyAgICAgICAgIyB0ZXN0IHByaW50ID4+IE5vbmUKKyAgICAgICAgZGVmIGRyaXZlcigpOgorICAgICAgICAgICAgb2xkc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IEd1bHAoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRlbGxtZShHdWxwKCkpCisgICAgICAgICAgICAgICAgdGVsbG1lKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IG9sZHN0ZG91dAogCi0jIyMgc21hbGxfc3RtdDogZXhwcl9zdG10IHwgcHJpbnRfc3RtdCAgfCBwYXNzX3N0bXQgfCBkZWxfc3RtdCB8IGZsb3dfc3RtdCB8IGltcG9ydF9zdG10IHwgZ2xvYmFsX3N0bXQgfCBhY2Nlc3Nfc3RtdCB8IGV4ZWNfc3RtdAotIyBUZXN0ZWQgYmVsb3cKKyAgICAgICAgIyB3ZSBzaG91bGQgc2VlIHRoaXMgb25jZQorICAgICAgICBkZWYgdGVsbG1lKGZpbGU9c3lzLnN0ZG91dCk6CisgICAgICAgICAgICBwcmludCA+PiBmaWxlLCAnaGVsbG8gd29ybGQnCiAKLXByaW50ICdleHByX3N0bXQnICMgKGV4cHJsaXN0ICc9JykqIGV4cHJsaXN0Ci0xCi0xLCAyLCAzCi14ID0gMQoteCA9IDEsIDIsIDMKLXggPSB5ID0geiA9IDEsIDIsIDMKLXgsIHksIHogPSAxLCAyLCAzCi1hYmMgPSBhLCBiLCBjID0geCwgeSwgeiA9IHh5eiA9IDEsIDIsICgzLCA0KQotIyBOQiB0aGVzZSB2YXJpYWJsZXMgYXJlIGRlbGV0ZWQgYmVsb3cKKyAgICAgICAgZHJpdmVyKCkKIAotY2hlY2tfc3ludGF4KCJ4ICsgMSA9IDEiKQotY2hlY2tfc3ludGF4KCJhICsgMSA9IGIgKyAyIikKKyAgICAgICAgIyB3ZSBzaG91bGQgbm90IHNlZSB0aGlzIGF0IGFsbAorICAgICAgICBkZWYgdGVsbG1lKGZpbGU9Tm9uZSk6CisgICAgICAgICAgICBwcmludCA+PiBmaWxlLCAnZ29vZGJ5ZSB1bml2ZXJzZScKIAotcHJpbnQgJ3ByaW50X3N0bXQnICMgJ3ByaW50JyAodGVzdCAnLCcpKiBbdGVzdF0KLXByaW50IDEsIDIsIDMKLXByaW50IDEsIDIsIDMsCi1wcmludAotcHJpbnQgMCBvciAxLCAwIG9yIDEsCi1wcmludCAwIG9yIDEKKyAgICAgICAgZHJpdmVyKCkKIAotcHJpbnQgJ2V4dGVuZGVkIHByaW50X3N0bXQnICMgJ3ByaW50JyAnPj4nIHRlc3QgJywnCi1pbXBvcnQgc3lzCi1wcmludCA+PiBzeXMuc3Rkb3V0LCAxLCAyLCAzCi1wcmludCA+PiBzeXMuc3Rkb3V0LCAxLCAyLCAzLAotcHJpbnQgPj4gc3lzLnN0ZG91dAotcHJpbnQgPj4gc3lzLnN0ZG91dCwgMCBvciAxLCAwIG9yIDEsCi1wcmludCA+PiBzeXMuc3Rkb3V0LCAwIG9yIDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuc3Rkb3V0LmdldHZhbHVlKCksICcnJ1wKKzEgMiAzCisxIDIgMworMSAxIDEKKzEgMiAzCisxIDIgMworMSAxIDEKK2hlbGxvIHdvcmxkCisnJycpCisgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlX3N0ZG91dAogCi0jIHRlc3QgcHJpbnRpbmcgdG8gYW4gaW5zdGFuY2UKLWNsYXNzIEd1bHA6Ci0gICAgZGVmIHdyaXRlKHNlbGYsIG1zZyk6IHBhc3MKKyAgICAgICAgIyBzeW50YXggZXJyb3JzCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAncHJpbnQgLCcpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAncHJpbnQgPj4geCwnKQogCi1ndWxwID0gR3VscCgpCi1wcmludCA+PiBndWxwLCAxLCAyLCAzCi1wcmludCA+PiBndWxwLCAxLCAyLCAzLAotcHJpbnQgPj4gZ3VscAotcHJpbnQgPj4gZ3VscCwgMCBvciAxLCAwIG9yIDEsCi1wcmludCA+PiBndWxwLCAwIG9yIDEKKyAgICBkZWYgdGVzdERlbFN0bXQoc2VsZik6CisgICAgICAgICMgJ2RlbCcgZXhwcmxpc3QKKyAgICAgICAgYWJjID0gWzEsMiwzXQorICAgICAgICB4LCB5LCB6ID0gYWJjCisgICAgICAgIHh5eiA9IHgsIHksIHoKIAotIyB0ZXN0IHByaW50ID4+IE5vbmUKLWRlZiBkcml2ZXIoKToKLSAgICBvbGRzdGRvdXQgPSBzeXMuc3Rkb3V0Ci0gICAgc3lzLnN0ZG91dCA9IEd1bHAoKQotICAgIHRyeToKLSAgICAgICAgdGVsbG1lKEd1bHAoKSkKLSAgICAgICAgdGVsbG1lKCkKLSAgICBmaW5hbGx5OgotICAgICAgICBzeXMuc3Rkb3V0ID0gb2xkc3Rkb3V0CisgICAgICAgIGRlbCBhYmMKKyAgICAgICAgZGVsIHgsIHksICh6LCB4eXopCiAKLSMgd2Ugc2hvdWxkIHNlZSB0aGlzIG9uY2UKLWRlZiB0ZWxsbWUoZmlsZT1zeXMuc3Rkb3V0KToKLSAgICBwcmludCA+PiBmaWxlLCAnaGVsbG8gd29ybGQnCisgICAgZGVmIHRlc3RQYXNzU3RtdChzZWxmKToKKyAgICAgICAgIyAncGFzcycKKyAgICAgICAgcGFzcwogCi1kcml2ZXIoKQorICAgICMgZmxvd19zdG10OiBicmVha19zdG10IHwgY29udGludWVfc3RtdCB8IHJldHVybl9zdG10IHwgcmFpc2Vfc3RtdAorICAgICMgVGVzdGVkIGJlbG93CiAKLSMgd2Ugc2hvdWxkIG5vdCBzZWUgdGhpcyBhdCBhbGwKLWRlZiB0ZWxsbWUoZmlsZT1Ob25lKToKLSAgICBwcmludCA+PiBmaWxlLCAnZ29vZGJ5ZSB1bml2ZXJzZScKKyAgICBkZWYgdGVzdEJyZWFrU3RtdChzZWxmKToKKyAgICAgICAgIyAnYnJlYWsnCisgICAgICAgIHdoaWxlIDE6IGJyZWFrCiAKLWRyaXZlcigpCisgICAgZGVmIHRlc3RDb250aW51ZVN0bXQoc2VsZik6CisgICAgICAgICMgJ2NvbnRpbnVlJworICAgICAgICBpID0gMQorICAgICAgICB3aGlsZSBpOiBpID0gMDsgY29udGludWUKIAotIyBzeW50YXggZXJyb3JzCi1jaGVja19zeW50YXgoJ3ByaW50ICwnKQotY2hlY2tfc3ludGF4KCdwcmludCA+PiB4LCcpCisgICAgICAgIG1zZyA9ICIiCisgICAgICAgIHdoaWxlIG5vdCBtc2c6CisgICAgICAgICAgICBtc2cgPSAib2siCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBtc2cgPSAiY29udGludWUgZmFpbGVkIHRvIGNvbnRpbnVlIGluc2lkZSB0cnkiCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgbXNnID0gImNvbnRpbnVlIGluc2lkZSB0cnkgY2FsbGVkIGV4Y2VwdCBibG9jayIKKyAgICAgICAgaWYgbXNnICE9ICJvayI6CisgICAgICAgICAgICBzZWxmLmZhaWwobXNnKQogCi1wcmludCAnZGVsX3N0bXQnICMgJ2RlbCcgZXhwcmxpc3QKLWRlbCBhYmMKLWRlbCB4LCB5LCAoeiwgeHl6KQorICAgICAgICBtc2cgPSAiIgorICAgICAgICB3aGlsZSBub3QgbXNnOgorICAgICAgICAgICAgbXNnID0gImZpbmFsbHkgYmxvY2sgbm90IGNhbGxlZCIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBtc2cgPSAib2siCisgICAgICAgIGlmIG1zZyAhPSAib2siOgorICAgICAgICAgICAgc2VsZi5mYWlsKG1zZykKIAotcHJpbnQgJ3Bhc3Nfc3RtdCcgIyAncGFzcycKLXBhc3MKKyAgICBkZWYgdGVzdF9icmVha19jb250aW51ZV9sb29wKHNlbGYpOgorICAgICAgICAjIFRoaXMgdGVzdCB3YXJyYW50cyBhbiBleHBsYW5hdGlvbi4gSXQgaXMgYSB0ZXN0IHNwZWNpZmljYWxseSBmb3IgU0YgYnVncworICAgICAgICAjICM0NjMzNTkgYW5kICM0NjI5MzcuIFRoZSBidWcgaXMgdGhhdCBhICdicmVhaycgc3RhdGVtZW50IGV4ZWN1dGVkIG9yCisgICAgICAgICMgZXhjZXB0aW9uIHJhaXNlZCBpbnNpZGUgYSB0cnkvZXhjZXB0IGluc2lkZSBhIGxvb3AsICphZnRlciogYSBjb250aW51ZQorICAgICAgICAjIHN0YXRlbWVudCBoYXMgYmVlbiBleGVjdXRlZCBpbiB0aGF0IGxvb3AsIHdpbGwgY2F1c2UgdGhlIHdyb25nIG51bWJlciBvZgorICAgICAgICAjIGFyZ3VtZW50cyB0byBiZSBwb3BwZWQgb2ZmIHRoZSBzdGFjayBhbmQgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIgcmVzZXQgdG8KKyAgICAgICAgIyBhIHZlcnkgc21hbGwgbnVtYmVyICh1c3VhbGx5IDAuKSBCZWNhdXNlIG9mIHRoaXMsIHRoZSBmb2xsb3dpbmcgdGVzdAorICAgICAgICAjICptdXN0KiB3cml0dGVuIGFzIGEgZnVuY3Rpb24sIGFuZCB0aGUgdHJhY2tpbmcgdmFycyAqbXVzdCogYmUgZnVuY3Rpb24KKyAgICAgICAgIyBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcy4gT3RoZXJ3aXNlLCB0aGUgdGVzdCB3aWxsIGxvb3AgYW5kIGxvb3AuCiAKLXByaW50ICdmbG93X3N0bXQnICMgYnJlYWtfc3RtdCB8IGNvbnRpbnVlX3N0bXQgfCByZXR1cm5fc3RtdCB8IHJhaXNlX3N0bXQKLSMgVGVzdGVkIGJlbG93CisgICAgICAgIGRlZiB0ZXN0X2lubmVyKGV4dHJhX2J1cm5pbmdfb2lsID0gMSwgY291bnQ9MCk6CisgICAgICAgICAgICBiaWdfaGlwcG8gPSAyCisgICAgICAgICAgICB3aGlsZSBiaWdfaGlwcG86CisgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaWYgZXh0cmFfYnVybmluZ19vaWwgYW5kIGJpZ19oaXBwbyA9PSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfYnVybmluZ19vaWwgLT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgYmlnX2hpcHBvIC09IDEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBpZiBjb3VudCA+IDIgb3IgYmlnX2hpcHBvICE9IDE6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJjb250aW51ZSB0aGVuIGJyZWFrIGluIHRyeS9leGNlcHQgaW4gbG9vcCBicm9rZW4hIikKKyAgICAgICAgdGVzdF9pbm5lcigpCiAKLXByaW50ICdicmVha19zdG10JyAjICdicmVhaycKLXdoaWxlIDE6IGJyZWFrCisgICAgZGVmIHRlc3RSZXR1cm4oc2VsZik6CisgICAgICAgICMgJ3JldHVybicgW3Rlc3RsaXN0XQorICAgICAgICBkZWYgZzEoKTogcmV0dXJuCisgICAgICAgIGRlZiBnMigpOiByZXR1cm4gMQorICAgICAgICBnMSgpCisgICAgICAgIHggPSBnMigpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiY2xhc3MgZm9vOnJldHVybiAxIikKIAotcHJpbnQgJ2NvbnRpbnVlX3N0bXQnICMgJ2NvbnRpbnVlJwotaSA9IDEKLXdoaWxlIGk6IGkgPSAwOyBjb250aW51ZQorICAgIGRlZiB0ZXN0WWllbGQoc2VsZik6CisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiY2xhc3MgZm9vOnlpZWxkIDEiKQogCi1tc2cgPSAiIgotd2hpbGUgbm90IG1zZzoKLSAgICBtc2cgPSAiY29udGludWUgKyB0cnkvZXhjZXB0IG9rIgotICAgIHRyeToKLSAgICAgICAgY29udGludWUKLSAgICAgICAgbXNnID0gImNvbnRpbnVlIGZhaWxlZCB0byBjb250aW51ZSBpbnNpZGUgdHJ5IgotICAgIGV4Y2VwdDoKLSAgICAgICAgbXNnID0gImNvbnRpbnVlIGluc2lkZSB0cnkgY2FsbGVkIGV4Y2VwdCBibG9jayIKLXByaW50IG1zZworICAgIGRlZiB0ZXN0UmFpc2Uoc2VsZik6CisgICAgICAgICMgJ3JhaXNlJyB0ZXN0IFsnLCcgdGVzdF0KKyAgICAgICAgdHJ5OiByYWlzZSBSdW50aW1lRXJyb3IsICdqdXN0IHRlc3RpbmcnCisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6IHBhc3MKKyAgICAgICAgdHJ5OiByYWlzZSBLZXlib2FyZEludGVycnVwdAorICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6IHBhc3MKIAotbXNnID0gIiIKLXdoaWxlIG5vdCBtc2c6Ci0gICAgbXNnID0gImZpbmFsbHkgYmxvY2sgbm90IGNhbGxlZCIKLSAgICB0cnk6Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgZmluYWxseToKLSAgICAgICAgbXNnID0gImNvbnRpbnVlICsgdHJ5L2ZpbmFsbHkgb2siCi1wcmludCBtc2cKKyAgICBkZWYgdGVzdEltcG9ydChzZWxmKToKKyAgICAgICAgIyAnaW1wb3J0JyBkb3R0ZWRfYXNfbmFtZXMKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBpbXBvcnQgdGltZSwgc3lzCisgICAgICAgICMgJ2Zyb20nIGRvdHRlZF9uYW1lICdpbXBvcnQnICgnKicgfCAnKCcgaW1wb3J0X2FzX25hbWVzICcpJyB8IGltcG9ydF9hc19uYW1lcykKKyAgICAgICAgZnJvbSB0aW1lIGltcG9ydCB0aW1lCisgICAgICAgIGZyb20gdGltZSBpbXBvcnQgKHRpbWUpCisgICAgICAgICMgbm90IHRlc3RhYmxlIGluc2lkZSBhIGZ1bmN0aW9uLCBidXQgYWxyZWFkeSBkb25lIGF0IHRvcCBvZiB0aGUgbW9kdWxlCisgICAgICAgICMgZnJvbSBzeXMgaW1wb3J0ICoKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IHBhdGgsIGFyZ3YKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IChwYXRoLCBhcmd2KQorICAgICAgICBmcm9tIHN5cyBpbXBvcnQgKHBhdGgsIGFyZ3YsKQogCisgICAgZGVmIHRlc3RHbG9iYWwoc2VsZik6CisgICAgICAgICMgJ2dsb2JhbCcgTkFNRSAoJywnIE5BTUUpKgorICAgICAgICBnbG9iYWwgYQorICAgICAgICBnbG9iYWwgYSwgYgorICAgICAgICBnbG9iYWwgb25lLCB0d28sIHRocmVlLCBmb3VyLCBmaXZlLCBzaXgsIHNldmVuLCBlaWdodCwgbmluZSwgdGVuCiAKLSMgVGhpcyB0ZXN0IHdhcnJhbnRzIGFuIGV4cGxhbmF0aW9uLiBJdCBpcyBhIHRlc3Qgc3BlY2lmaWNhbGx5IGZvciBTRiBidWdzCi0jICM0NjMzNTkgYW5kICM0NjI5MzcuIFRoZSBidWcgaXMgdGhhdCBhICdicmVhaycgc3RhdGVtZW50IGV4ZWN1dGVkIG9yCi0jIGV4Y2VwdGlvbiByYWlzZWQgaW5zaWRlIGEgdHJ5L2V4Y2VwdCBpbnNpZGUgYSBsb29wLCAqYWZ0ZXIqIGEgY29udGludWUKLSMgc3RhdGVtZW50IGhhcyBiZWVuIGV4ZWN1dGVkIGluIHRoYXQgbG9vcCwgd2lsbCBjYXVzZSB0aGUgd3JvbmcgbnVtYmVyIG9mCi0jIGFyZ3VtZW50cyB0byBiZSBwb3BwZWQgb2ZmIHRoZSBzdGFjayBhbmQgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIgcmVzZXQgdG8KLSMgYSB2ZXJ5IHNtYWxsIG51bWJlciAodXN1YWxseSAwLikgQmVjYXVzZSBvZiB0aGlzLCB0aGUgZm9sbG93aW5nIHRlc3QKLSMgKm11c3QqIHdyaXR0ZW4gYXMgYSBmdW5jdGlvbiwgYW5kIHRoZSB0cmFja2luZyB2YXJzICptdXN0KiBiZSBmdW5jdGlvbgotIyBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcy4gT3RoZXJ3aXNlLCB0aGUgdGVzdCB3aWxsIGxvb3AgYW5kIGxvb3AuCi0KLXByaW50ICJ0ZXN0aW5nIGNvbnRpbnVlIGFuZCBicmVhayBpbiB0cnkvZXhjZXB0IGluIGxvb3AiCi1kZWYgdGVzdF9icmVha19jb250aW51ZV9sb29wKGV4dHJhX2J1cm5pbmdfb2lsID0gMSwgY291bnQ9MCk6Ci0gICAgYmlnX2hpcHBvID0gMgotICAgIHdoaWxlIGJpZ19oaXBwbzoKLSAgICAgICAgY291bnQgKz0gMQorICAgIGRlZiB0ZXN0QXNzZXJ0KHNlbGYpOgorICAgICAgICAjIGFzc2VydF9zdG10OiAnYXNzZXJ0JyB0ZXN0IFsnLCcgdGVzdF0KKyAgICAgICAgYXNzZXJ0IDEKKyAgICAgICAgYXNzZXJ0IDEsIDEKKyAgICAgICAgYXNzZXJ0IGxhbWJkYSB4OngKKyAgICAgICAgYXNzZXJ0IDEsIGxhbWJkYSB4OngrMQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpZiBleHRyYV9idXJuaW5nX29pbCBhbmQgYmlnX2hpcHBvID09IDE6Ci0gICAgICAgICAgICAgICAgZXh0cmFfYnVybmluZ19vaWwgLT0gMQotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBiaWdfaGlwcG8gLT0gMQotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgcmFpc2UKLSAgICBpZiBjb3VudCA+IDIgb3IgYmlnX2hpcHBvICE9IDE6Ci0gICAgICAgIHByaW50ICJjb250aW51ZSB0aGVuIGJyZWFrIGluIHRyeS9leGNlcHQgaW4gbG9vcCBicm9rZW4hIgotdGVzdF9icmVha19jb250aW51ZV9sb29wKCkKKyAgICAgICAgICAgIGFzc2VydCAwLCAibXNnIgorICAgICAgICBleGNlcHQgQXNzZXJ0aW9uRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhlLmFyZ3NbMF0sICJtc2ciKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiQXNzZXJ0aW9uRXJyb3Igbm90IHJhaXNlZCBieSBhc3NlcnQgMCIpCiAKLXByaW50ICdyZXR1cm5fc3RtdCcgIyAncmV0dXJuJyBbdGVzdGxpc3RdCi1kZWYgZzEoKTogcmV0dXJuCi1kZWYgZzIoKTogcmV0dXJuIDEKLWcxKCkKLXggPSBnMigpCi1jaGVja19zeW50YXgoImNsYXNzIGZvbzpyZXR1cm4gMSIpCisgICAgIyMjIGNvbXBvdW5kX3N0bXQ6IGlmX3N0bXQgfCB3aGlsZV9zdG10IHwgZm9yX3N0bXQgfCB0cnlfc3RtdCB8IGZ1bmNkZWYgfCBjbGFzc2RlZgorICAgICMgVGVzdGVkIGJlbG93CiAKLXByaW50ICd5aWVsZF9zdG10JwotY2hlY2tfc3ludGF4KCJjbGFzcyBmb286eWllbGQgMSIpCisgICAgZGVmIHRlc3RJZihzZWxmKToKKyAgICAgICAgIyAnaWYnIHRlc3QgJzonIHN1aXRlICgnZWxpZicgdGVzdCAnOicgc3VpdGUpKiBbJ2Vsc2UnICc6JyBzdWl0ZV0KKyAgICAgICAgaWYgMTogcGFzcworICAgICAgICBpZiAxOiBwYXNzCisgICAgICAgIGVsc2U6IHBhc3MKKyAgICAgICAgaWYgMDogcGFzcworICAgICAgICBlbGlmIDA6IHBhc3MKKyAgICAgICAgaWYgMDogcGFzcworICAgICAgICBlbGlmIDA6IHBhc3MKKyAgICAgICAgZWxpZiAwOiBwYXNzCisgICAgICAgIGVsaWYgMDogcGFzcworICAgICAgICBlbHNlOiBwYXNzCiAKLXByaW50ICdyYWlzZV9zdG10JyAjICdyYWlzZScgdGVzdCBbJywnIHRlc3RdCi10cnk6IHJhaXNlIFJ1bnRpbWVFcnJvciwgJ2p1c3QgdGVzdGluZycKLWV4Y2VwdCBSdW50aW1lRXJyb3I6IHBhc3MKLXRyeTogcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQKLWV4Y2VwdCBLZXlib2FyZEludGVycnVwdDogcGFzcworICAgIGRlZiB0ZXN0V2hpbGUoc2VsZik6CisgICAgICAgICMgJ3doaWxlJyB0ZXN0ICc6JyBzdWl0ZSBbJ2Vsc2UnICc6JyBzdWl0ZV0KKyAgICAgICAgd2hpbGUgMDogcGFzcworICAgICAgICB3aGlsZSAwOiBwYXNzCisgICAgICAgIGVsc2U6IHBhc3MKIAotcHJpbnQgJ2ltcG9ydF9uYW1lJyAjICdpbXBvcnQnIGRvdHRlZF9hc19uYW1lcwotaW1wb3J0IHN5cwotaW1wb3J0IHRpbWUsIHN5cwotcHJpbnQgJ2ltcG9ydF9mcm9tJyAjICdmcm9tJyBkb3R0ZWRfbmFtZSAnaW1wb3J0JyAoJyonIHwgJygnIGltcG9ydF9hc19uYW1lcyAnKScgfCBpbXBvcnRfYXNfbmFtZXMpCi1mcm9tIHRpbWUgaW1wb3J0IHRpbWUKLWZyb20gdGltZSBpbXBvcnQgKHRpbWUpCi1mcm9tIHN5cyBpbXBvcnQgKgotZnJvbSBzeXMgaW1wb3J0IHBhdGgsIGFyZ3YKLWZyb20gc3lzIGltcG9ydCAocGF0aCwgYXJndikKLWZyb20gc3lzIGltcG9ydCAocGF0aCwgYXJndiwpCisgICAgZGVmIHRlc3RGb3Ioc2VsZik6CisgICAgICAgICMgJ2ZvcicgZXhwcmxpc3QgJ2luJyBleHBybGlzdCAnOicgc3VpdGUgWydlbHNlJyAnOicgc3VpdGVdCisgICAgICAgIGZvciBpIGluIDEsIDIsIDM6IHBhc3MKKyAgICAgICAgZm9yIGksIGosIGsgaW4gKCk6IHBhc3MKKyAgICAgICAgZWxzZTogcGFzcworICAgICAgICBjbGFzcyBTcXVhcmVzOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1heCk6CisgICAgICAgICAgICAgICAgc2VsZi5tYXggPSBtYXgKKyAgICAgICAgICAgICAgICBzZWxmLnNvZmFyID0gW10KKyAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gbGVuKHNlbGYuc29mYXIpCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgaWYgbm90IDAgPD0gaSA8IHNlbGYubWF4OiByYWlzZSBJbmRleEVycm9yCisgICAgICAgICAgICAgICAgbiA9IGxlbihzZWxmLnNvZmFyKQorICAgICAgICAgICAgICAgIHdoaWxlIG4gPD0gaToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2Zhci5hcHBlbmQobipuKQorICAgICAgICAgICAgICAgICAgICBuID0gbisxCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc29mYXJbaV0KKyAgICAgICAgbiA9IDAKKyAgICAgICAgZm9yIHggaW4gU3F1YXJlcygxMCk6IG4gPSBuK3gKKyAgICAgICAgaWYgbiAhPSAyODU6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2ZvciBvdmVyIGdyb3dpbmcgc2VxdWVuY2UnKQogCi1wcmludCAnZ2xvYmFsX3N0bXQnICMgJ2dsb2JhbCcgTkFNRSAoJywnIE5BTUUpKgotZGVmIGYoKToKLSAgICBnbG9iYWwgYQotICAgIGdsb2JhbCBhLCBiCi0gICAgZ2xvYmFsIG9uZSwgdHdvLCB0aHJlZSwgZm91ciwgZml2ZSwgc2l4LCBzZXZlbiwgZWlnaHQsIG5pbmUsIHRlbgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBmb3IgeCwgaW4gWygxLCksICgyLCksICgzLCldOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgWzEsIDIsIDNdKQogCi1wcmludCAiYXNzZXJ0X3N0bXQiICMgYXNzZXJ0X3N0bXQ6ICdhc3NlcnQnIHRlc3QgWycsJyB0ZXN0XQotYXNzZXJ0IDEKLWFzc2VydCAxLCAxCi1hc3NlcnQgbGFtYmRhIHg6eAotYXNzZXJ0IDEsIGxhbWJkYSB4OngrMQorICAgIGRlZiB0ZXN0VHJ5KHNlbGYpOgorICAgICAgICAjIyMgdHJ5X3N0bXQ6ICd0cnknICc6JyBzdWl0ZSAoZXhjZXB0X2NsYXVzZSAnOicgc3VpdGUpKyBbJ2Vsc2UnICc6JyBzdWl0ZV0KKyAgICAgICAgIyMjICAgICAgICAgfCAndHJ5JyAnOicgc3VpdGUgJ2ZpbmFsbHknICc6JyBzdWl0ZQorICAgICAgICAjIyMgZXhjZXB0X2NsYXVzZTogJ2V4Y2VwdCcgW2V4cHIgWycsJyBleHByXV0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgMS8wCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OiAxLzAKKyAgICAgICAgZXhjZXB0IEVPRkVycm9yOiBwYXNzCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIG1zZzogcGFzcworICAgICAgICBleGNlcHQgUnVudGltZUVycm9yLCBtc2c6IHBhc3MKKyAgICAgICAgZXhjZXB0OiBwYXNzCisgICAgICAgIGVsc2U6IHBhc3MKKyAgICAgICAgdHJ5OiAxLzAKKyAgICAgICAgZXhjZXB0IChFT0ZFcnJvciwgVHlwZUVycm9yLCBaZXJvRGl2aXNpb25FcnJvcik6IHBhc3MKKyAgICAgICAgdHJ5OiAxLzAKKyAgICAgICAgZXhjZXB0IChFT0ZFcnJvciwgVHlwZUVycm9yLCBaZXJvRGl2aXNpb25FcnJvciksIG1zZzogcGFzcworICAgICAgICB0cnk6IHBhc3MKKyAgICAgICAgZmluYWxseTogcGFzcwogCi0jIyMgY29tcG91bmRfc3RtdDogaWZfc3RtdCB8IHdoaWxlX3N0bXQgfCBmb3Jfc3RtdCB8IHRyeV9zdG10IHwgZnVuY2RlZiB8IGNsYXNzZGVmCi0jIFRlc3RlZCBiZWxvdworICAgIGRlZiB0ZXN0U3VpdGUoc2VsZik6CisgICAgICAgICMgc2ltcGxlX3N0bXQgfCBORVdMSU5FIElOREVOVCBORVdMSU5FKiAoc3RtdCBORVdMSU5FKikrIERFREVOVAorICAgICAgICBpZiAxOiBwYXNzCisgICAgICAgIGlmIDE6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIDE6CisgICAgICAgICAgICAjCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjCisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjCisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjCiAKLXByaW50ICdpZl9zdG10JyAjICdpZicgdGVzdCAnOicgc3VpdGUgKCdlbGlmJyB0ZXN0ICc6JyBzdWl0ZSkqIFsnZWxzZScgJzonIHN1aXRlXQotaWYgMTogcGFzcwotaWYgMTogcGFzcwotZWxzZTogcGFzcwotaWYgMDogcGFzcwotZWxpZiAwOiBwYXNzCi1pZiAwOiBwYXNzCi1lbGlmIDA6IHBhc3MKLWVsaWYgMDogcGFzcwotZWxpZiAwOiBwYXNzCi1lbHNlOiBwYXNzCisgICAgZGVmIHRlc3RUZXN0KHNlbGYpOgorICAgICAgICAjIyMgYW5kX3Rlc3QgKCdvcicgYW5kX3Rlc3QpKgorICAgICAgICAjIyMgYW5kX3Rlc3Q6IG5vdF90ZXN0ICgnYW5kJyBub3RfdGVzdCkqCisgICAgICAgICMjIyBub3RfdGVzdDogJ25vdCcgbm90X3Rlc3QgfCBjb21wYXJpc29uCisgICAgICAgIGlmIG5vdCAxOiBwYXNzCisgICAgICAgIGlmIDEgYW5kIDE6IHBhc3MKKyAgICAgICAgaWYgMSBvciAxOiBwYXNzCisgICAgICAgIGlmIG5vdCBub3Qgbm90IDE6IHBhc3MKKyAgICAgICAgaWYgbm90IDEgYW5kIDEgYW5kIDE6IHBhc3MKKyAgICAgICAgaWYgMSBhbmQgMSBvciAxIGFuZCAxIGFuZCAxIG9yIG5vdCAxIGFuZCAxOiBwYXNzCiAKLXByaW50ICd3aGlsZV9zdG10JyAjICd3aGlsZScgdGVzdCAnOicgc3VpdGUgWydlbHNlJyAnOicgc3VpdGVdCi13aGlsZSAwOiBwYXNzCi13aGlsZSAwOiBwYXNzCi1lbHNlOiBwYXNzCisgICAgZGVmIHRlc3RDb21wYXJpc29uKHNlbGYpOgorICAgICAgICAjIyMgY29tcGFyaXNvbjogZXhwciAoY29tcF9vcCBleHByKSoKKyAgICAgICAgIyMjIGNvbXBfb3A6ICc8J3wnPid8Jz09J3wnPj0nfCc8PSd8JyE9J3wnaW4nfCdub3QnICdpbid8J2lzJ3wnaXMnICdub3QnCisgICAgICAgIGlmIDE6IHBhc3MKKyAgICAgICAgeCA9ICgxID09IDEpCisgICAgICAgIGlmIDEgPT0gMTogcGFzcworICAgICAgICBpZiAxICE9IDE6IHBhc3MKKyAgICAgICAgaWYgMSA8IDE6IHBhc3MKKyAgICAgICAgaWYgMSA+IDE6IHBhc3MKKyAgICAgICAgaWYgMSA8PSAxOiBwYXNzCisgICAgICAgIGlmIDEgPj0gMTogcGFzcworICAgICAgICBpZiAxIGlzIDE6IHBhc3MKKyAgICAgICAgaWYgMSBpcyBub3QgMTogcGFzcworICAgICAgICBpZiAxIGluICgpOiBwYXNzCisgICAgICAgIGlmIDEgbm90IGluICgpOiBwYXNzCisgICAgICAgIGlmIDEgPCAxID4gMSA9PSAxID49IDEgPD0gMSAhPSAxIGluIDEgbm90IGluIDEgaXMgMSBpcyBub3QgMTogcGFzcwogCi1wcmludCAnZm9yX3N0bXQnICMgJ2ZvcicgZXhwcmxpc3QgJ2luJyBleHBybGlzdCAnOicgc3VpdGUgWydlbHNlJyAnOicgc3VpdGVdCi1mb3IgaSBpbiAxLCAyLCAzOiBwYXNzCi1mb3IgaSwgaiwgayBpbiAoKTogcGFzcwotZWxzZTogcGFzcwotY2xhc3MgU3F1YXJlczoKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbWF4KToKLSAgICAgICAgc2VsZi5tYXggPSBtYXgKLSAgICAgICAgc2VsZi5zb2ZhciA9IFtdCi0gICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiBsZW4oc2VsZi5zb2ZhcikKLSAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6Ci0gICAgICAgIGlmIG5vdCAwIDw9IGkgPCBzZWxmLm1heDogcmFpc2UgSW5kZXhFcnJvcgotICAgICAgICBuID0gbGVuKHNlbGYuc29mYXIpCi0gICAgICAgIHdoaWxlIG4gPD0gaToKLSAgICAgICAgICAgIHNlbGYuc29mYXIuYXBwZW5kKG4qbikKLSAgICAgICAgICAgIG4gPSBuKzEKLSAgICAgICAgcmV0dXJuIHNlbGYuc29mYXJbaV0KLW4gPSAwCi1mb3IgeCBpbiBTcXVhcmVzKDEwKTogbiA9IG4reAotaWYgbiAhPSAyODU6IHJhaXNlIFRlc3RGYWlsZWQsICdmb3Igb3ZlciBncm93aW5nIHNlcXVlbmNlJworICAgIGRlZiB0ZXN0QmluYXJ5TWFza09wcyhzZWxmKToKKyAgICAgICAgeCA9IDEgJiAxCisgICAgICAgIHggPSAxIF4gMQorICAgICAgICB4ID0gMSB8IDEKIAotcmVzdWx0ID0gW10KLWZvciB4LCBpbiBbKDEsKSwgKDIsKSwgKDMsKV06Ci0gICAgcmVzdWx0LmFwcGVuZCh4KQotdmVyZXEocmVzdWx0LCBbMSwgMiwgM10pCisgICAgZGVmIHRlc3RTaGlmdE9wcyhzZWxmKToKKyAgICAgICAgeCA9IDEgPDwgMQorICAgICAgICB4ID0gMSA+PiAxCisgICAgICAgIHggPSAxIDw8IDEgPj4gMQogCi1wcmludCAndHJ5X3N0bXQnCi0jIyMgdHJ5X3N0bXQ6ICd0cnknICc6JyBzdWl0ZSAoZXhjZXB0X2NsYXVzZSAnOicgc3VpdGUpKyBbJ2Vsc2UnICc6JyBzdWl0ZV0KLSMjIyAgICAgICAgIHwgJ3RyeScgJzonIHN1aXRlICdmaW5hbGx5JyAnOicgc3VpdGUKLSMjIyBleGNlcHRfY2xhdXNlOiAnZXhjZXB0JyBbZXhwciBbJywnIGV4cHJdXQotdHJ5OgotICAgIDEvMAotZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgotICAgIHBhc3MKLWVsc2U6Ci0gICAgcGFzcwotdHJ5OiAxLzAKLWV4Y2VwdCBFT0ZFcnJvcjogcGFzcwotZXhjZXB0IFR5cGVFcnJvciwgbXNnOiBwYXNzCi1leGNlcHQgUnVudGltZUVycm9yLCBtc2c6IHBhc3MKLWV4Y2VwdDogcGFzcwotZWxzZTogcGFzcwotdHJ5OiAxLzAKLWV4Y2VwdCAoRU9GRXJyb3IsIFR5cGVFcnJvciwgWmVyb0RpdmlzaW9uRXJyb3IpOiBwYXNzCi10cnk6IDEvMAotZXhjZXB0IChFT0ZFcnJvciwgVHlwZUVycm9yLCBaZXJvRGl2aXNpb25FcnJvciksIG1zZzogcGFzcwotdHJ5OiBwYXNzCi1maW5hbGx5OiBwYXNzCisgICAgZGVmIHRlc3RBZGRpdGl2ZU9wcyhzZWxmKToKKyAgICAgICAgeCA9IDEKKyAgICAgICAgeCA9IDEgKyAxCisgICAgICAgIHggPSAxIC0gMSAtIDEKKyAgICAgICAgeCA9IDEgLSAxICsgMSAtIDEgKyAxCiAKLXByaW50ICdzdWl0ZScgIyBzaW1wbGVfc3RtdCB8IE5FV0xJTkUgSU5ERU5UIE5FV0xJTkUqIChzdG10IE5FV0xJTkUqKSsgREVERU5UCi1pZiAxOiBwYXNzCi1pZiAxOgotICAgIHBhc3MKLWlmIDE6Ci0gICAgIwotICAgICMKLSAgICAjCi0gICAgcGFzcwotICAgIHBhc3MKLSAgICAjCi0gICAgcGFzcwotICAgICMKKyAgICBkZWYgdGVzdE11bHRpcGxpY2F0aXZlT3BzKHNlbGYpOgorICAgICAgICB4ID0gMSAqIDEKKyAgICAgICAgeCA9IDEgLyAxCisgICAgICAgIHggPSAxICUgMQorICAgICAgICB4ID0gMSAvIDEgKiAxICUgMQogCi1wcmludCAndGVzdCcKLSMjIyBhbmRfdGVzdCAoJ29yJyBhbmRfdGVzdCkqCi0jIyMgYW5kX3Rlc3Q6IG5vdF90ZXN0ICgnYW5kJyBub3RfdGVzdCkqCi0jIyMgbm90X3Rlc3Q6ICdub3QnIG5vdF90ZXN0IHwgY29tcGFyaXNvbgotaWYgbm90IDE6IHBhc3MKLWlmIDEgYW5kIDE6IHBhc3MKLWlmIDEgb3IgMTogcGFzcwotaWYgbm90IG5vdCBub3QgMTogcGFzcwotaWYgbm90IDEgYW5kIDEgYW5kIDE6IHBhc3MKLWlmIDEgYW5kIDEgb3IgMSBhbmQgMSBhbmQgMSBvciBub3QgMSBhbmQgMTogcGFzcworICAgIGRlZiB0ZXN0VW5hcnlPcHMoc2VsZik6CisgICAgICAgIHggPSArMQorICAgICAgICB4ID0gLTEKKyAgICAgICAgeCA9IH4xCisgICAgICAgIHggPSB+MSBeIDEgJiAxIHwgMSAmIDEgXiAtMQorICAgICAgICB4ID0gLTEqMS8xICsgMSoxIC0gLS0tMSoxCiAKLXByaW50ICdjb21wYXJpc29uJwotIyMjIGNvbXBhcmlzb246IGV4cHIgKGNvbXBfb3AgZXhwcikqCi0jIyMgY29tcF9vcDogJzwnfCc+J3wnPT0nfCc+PSd8Jzw9J3wnIT0nfCdpbid8J25vdCcgJ2luJ3wnaXMnfCdpcycgJ25vdCcKLWlmIDE6IHBhc3MKLXggPSAoMSA9PSAxKQotaWYgMSA9PSAxOiBwYXNzCi1pZiAxICE9IDE6IHBhc3MKLWlmIDEgPCAxOiBwYXNzCi1pZiAxID4gMTogcGFzcwotaWYgMSA8PSAxOiBwYXNzCi1pZiAxID49IDE6IHBhc3MKLWlmIDEgaXMgMTogcGFzcwotaWYgMSBpcyBub3QgMTogcGFzcwotaWYgMSBpbiAoKTogcGFzcwotaWYgMSBub3QgaW4gKCk6IHBhc3MKLWlmIDEgPCAxID4gMSA9PSAxID49IDEgPD0gMSAhPSAxIGluIDEgbm90IGluIDEgaXMgMSBpcyBub3QgMTogcGFzcworICAgIGRlZiB0ZXN0U2VsZWN0b3JzKHNlbGYpOgorICAgICAgICAjIyMgdHJhaWxlcjogJygnIFt0ZXN0bGlzdF0gJyknIHwgJ1snIHN1YnNjcmlwdCAnXScgfCAnLicgTkFNRQorICAgICAgICAjIyMgc3Vic2NyaXB0OiBleHByIHwgW2V4cHJdICc6JyBbZXhwcl0KIAotcHJpbnQgJ2JpbmFyeSBtYXNrIG9wcycKLXggPSAxICYgMQoteCA9IDEgXiAxCi14ID0gMSB8IDEKKyAgICAgICAgaW1wb3J0IHN5cywgdGltZQorICAgICAgICBjID0gc3lzLnBhdGhbMF0KKyAgICAgICAgeCA9IHRpbWUudGltZSgpCisgICAgICAgIHggPSBzeXMubW9kdWxlc1sndGltZSddLnRpbWUoKQorICAgICAgICBhID0gJzAxMjM0JworICAgICAgICBjID0gYVswXQorICAgICAgICBjID0gYVstMV0KKyAgICAgICAgcyA9IGFbMDo1XQorICAgICAgICBzID0gYVs6NV0KKyAgICAgICAgcyA9IGFbMDpdCisgICAgICAgIHMgPSBhWzpdCisgICAgICAgIHMgPSBhWy01Ol0KKyAgICAgICAgcyA9IGFbOi0xXQorICAgICAgICBzID0gYVstNDotM10KKyAgICAgICAgIyBBIHJvdWdoIHRlc3Qgb2YgU0YgYnVnIDEzMzM5ODIuICBodHRwOi8vcHl0aG9uLm9yZy9zZi8xMzMzOTgyCisgICAgICAgICMgVGhlIHRlc3RpbmcgaGVyZSBpcyBmYWlybHkgaW5jb21wbGV0ZS4KKyAgICAgICAgIyBUZXN0IGNhc2VzIHNob3VsZCBpbmNsdWRlOiBjb21tYXMgd2l0aCAxIGFuZCAyIGNvbG9ucworICAgICAgICBkID0ge30KKyAgICAgICAgZFsxXSA9IDEKKyAgICAgICAgZFsxLF0gPSAyCisgICAgICAgIGRbMSwyXSA9IDMKKyAgICAgICAgZFsxLDIsM10gPSA0CisgICAgICAgIEwgPSBsaXN0KGQpCisgICAgICAgIEwuc29ydChrZXk9bGFtYmRhIHg6IHggaWYgaXNpbnN0YW5jZSh4LCB0dXBsZSkgZWxzZSAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc3RyKEwpLCAnWzEsICgxLCksICgxLCAyKSwgKDEsIDIsIDMpXScpCiAKLXByaW50ICdzaGlmdCBvcHMnCi14ID0gMSA8PCAxCi14ID0gMSA+PiAxCi14ID0gMSA8PCAxID4+IDEKKyAgICBkZWYgdGVzdEF0b21zKHNlbGYpOgorICAgICAgICAjIyMgYXRvbTogJygnIFt0ZXN0bGlzdF0gJyknIHwgJ1snIFt0ZXN0bGlzdF0gJ10nIHwgJ3snIFtkaWN0c2V0bWFrZXJdICd9JyB8IE5BTUUgfCBOVU1CRVIgfCBTVFJJTkcKKyAgICAgICAgIyMjIGRpY3RzZXRtYWtlcjogKHRlc3QgJzonIHRlc3QgKCcsJyB0ZXN0ICc6JyB0ZXN0KSogWycsJ10pIHwgKHRlc3QgKCcsJyB0ZXN0KSogWycsJ10pCiAKLXByaW50ICdhZGRpdGl2ZSBvcHMnCi14ID0gMQoteCA9IDEgKyAxCi14ID0gMSAtIDEgLSAxCi14ID0gMSAtIDEgKyAxIC0gMSArIDEKKyAgICAgICAgeCA9ICgxKQorICAgICAgICB4ID0gKDEgb3IgMiBvciAzKQorICAgICAgICB4ID0gKDEgb3IgMiBvciAzLCAyLCAzKQogCi1wcmludCAnbXVsdGlwbGljYXRpdmUgb3BzJwoteCA9IDEgKiAxCi14ID0gMSAvIDEKLXggPSAxICUgMQoteCA9IDEgLyAxICogMSAlIDEKKyAgICAgICAgeCA9IFtdCisgICAgICAgIHggPSBbMV0KKyAgICAgICAgeCA9IFsxIG9yIDIgb3IgM10KKyAgICAgICAgeCA9IFsxIG9yIDIgb3IgMywgMiwgM10KKyAgICAgICAgeCA9IFtdCiAKLXByaW50ICd1bmFyeSBvcHMnCi14ID0gKzEKLXggPSAtMQoteCA9IH4xCi14ID0gfjEgXiAxICYgMSB8IDEgJiAxIF4gLTEKLXggPSAtMSoxLzEgKyAxKjEgLSAtLS0xKjEKKyAgICAgICAgeCA9IHt9CisgICAgICAgIHggPSB7J29uZSc6IDF9CisgICAgICAgIHggPSB7J29uZSc6IDEsfQorICAgICAgICB4ID0geydvbmUnIG9yICd0d28nOiAxIG9yIDJ9CisgICAgICAgIHggPSB7J29uZSc6IDEsICd0d28nOiAyfQorICAgICAgICB4ID0geydvbmUnOiAxLCAndHdvJzogMix9CisgICAgICAgIHggPSB7J29uZSc6IDEsICd0d28nOiAyLCAndGhyZWUnOiAzLCAnZm91cic6IDQsICdmaXZlJzogNSwgJ3NpeCc6IDZ9CiAKLXByaW50ICdzZWxlY3RvcnMnCi0jIyMgdHJhaWxlcjogJygnIFt0ZXN0bGlzdF0gJyknIHwgJ1snIHN1YnNjcmlwdCAnXScgfCAnLicgTkFNRQotIyMjIHN1YnNjcmlwdDogZXhwciB8IFtleHByXSAnOicgW2V4cHJdCi1mMSgpCi1mMigxKQotZjIoMSwpCi1mMygxLCAyKQotZjMoMSwgMiwpCi1mNCgxLCAoMiwgKDMsIDQpKSkKLXYwKCkKLXYwKDEpCi12MCgxLCkKLXYwKDEsMikKLXYwKDEsMiwzLDQsNSw2LDcsOCw5LDApCi12MSgxKQotdjEoMSwpCi12MSgxLDIpCi12MSgxLDIsMykKLXYxKDEsMiwzLDQsNSw2LDcsOCw5LDApCi12MigxLDIpCi12MigxLDIsMykKLXYyKDEsMiwzLDQpCi12MigxLDIsMyw0LDUsNiw3LDgsOSwwKQotdjMoMSwoMiwzKSkKLXYzKDEsKDIsMyksNCkKLXYzKDEsKDIsMyksNCw1LDYsNyw4LDksMCkKLXByaW50Ci1pbXBvcnQgc3lzLCB0aW1lCi1jID0gc3lzLnBhdGhbMF0KLXggPSB0aW1lLnRpbWUoKQoteCA9IHN5cy5tb2R1bGVzWyd0aW1lJ10udGltZSgpCi1hID0gJzAxMjM0JwotYyA9IGFbMF0KLWMgPSBhWy0xXQotcyA9IGFbMDo1XQotcyA9IGFbOjVdCi1zID0gYVswOl0KLXMgPSBhWzpdCi1zID0gYVstNTpdCi1zID0gYVs6LTFdCi1zID0gYVstNDotM10KLSMgQSByb3VnaCB0ZXN0IG9mIFNGIGJ1ZyAxMzMzOTgyLiAgaHR0cDovL3B5dGhvbi5vcmcvc2YvMTMzMzk4MgotIyBUaGUgdGVzdGluZyBoZXJlIGlzIGZhaXJseSBpbmNvbXBsZXRlLgotIyBUZXN0IGNhc2VzIHNob3VsZCBpbmNsdWRlOiBjb21tYXMgd2l0aCAxIGFuZCAyIGNvbG9ucwotZCA9IHt9Ci1kWzFdID0gMQotZFsxLF0gPSAyCi1kWzEsMl0gPSAzCi1kWzEsMiwzXSA9IDQKLUwgPSBsaXN0KGQpCi1MLnNvcnQoa2V5PWxhbWJkYSB4OiB4IGlmIGlzaW5zdGFuY2UoeCwgdHVwbGUpIGVsc2UgKCkpCi1wcmludCBMCisgICAgICAgIHggPSB7J29uZSd9CisgICAgICAgIHggPSB7J29uZScsIDEsfQorICAgICAgICB4ID0geydvbmUnLCAndHdvJywgJ3RocmVlJ30KKyAgICAgICAgeCA9IHsyLCAzLCA0LH0KKworICAgICAgICB4ID0geAorICAgICAgICB4ID0gJ3gnCisgICAgICAgIHggPSAxMjMKKworICAgICMjIyBleHBybGlzdDogZXhwciAoJywnIGV4cHIpKiBbJywnXQorICAgICMjIyB0ZXN0bGlzdDogdGVzdCAoJywnIHRlc3QpKiBbJywnXQorICAgICMgVGhlc2UgaGF2ZSBiZWVuIGV4ZXJjaXNlZCBlbm91Z2ggYWJvdmUKKworICAgIGRlZiB0ZXN0Q2xhc3NkZWYoc2VsZik6CisgICAgICAgICMgJ2NsYXNzJyBOQU1FIFsnKCcgW3Rlc3RsaXN0XSAnKSddICc6JyBzdWl0ZQorICAgICAgICBjbGFzcyBCOiBwYXNzCisgICAgICAgIGNsYXNzIEIyKCk6IHBhc3MKKyAgICAgICAgY2xhc3MgQzEoQik6IHBhc3MKKyAgICAgICAgY2xhc3MgQzIoQik6IHBhc3MKKyAgICAgICAgY2xhc3MgRChDMSwgQzIsIEIpOiBwYXNzCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgbWV0aDEoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiBtZXRoMihzZWxmLCBhcmcpOiBwYXNzCisgICAgICAgICAgICBkZWYgbWV0aDMoc2VsZiwgYTEsIGEyKTogcGFzcworCisgICAgZGVmIHRlc3RMaXN0Y29tcHMoc2VsZik6CisgICAgICAgICMgbGlzdCBjb21wcmVoZW5zaW9uIHRlc3RzCisgICAgICAgIG51bXMgPSBbMSwgMiwgMywgNCwgNV0KKyAgICAgICAgc3RycyA9IFsiQXBwbGUiLCAiQmFuYW5hIiwgIkNvY29udXQiXQorICAgICAgICBzcGNzID0gWyIgIEFwcGxlIiwgIiBCYW5hbmEgIiwgIkNvY28gIG51dCAgIl0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtzLnN0cmlwKCkgZm9yIHMgaW4gc3Bjc10sIFsnQXBwbGUnLCAnQmFuYW5hJywgJ0NvY28gIG51dCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFszICogeCBmb3IgeCBpbiBudW1zXSwgWzMsIDYsIDksIDEyLCAxNV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3ggZm9yIHggaW4gbnVtcyBpZiB4ID4gMl0sIFszLCA0LCA1XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbKGksIHMpIGZvciBpIGluIG51bXMgZm9yIHMgaW4gc3Ryc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgWygxLCAnQXBwbGUnKSwgKDEsICdCYW5hbmEnKSwgKDEsICdDb2NvbnV0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAnQXBwbGUnKSwgKDIsICdCYW5hbmEnKSwgKDIsICdDb2NvbnV0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgzLCAnQXBwbGUnKSwgKDMsICdCYW5hbmEnKSwgKDMsICdDb2NvbnV0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICg0LCAnQXBwbGUnKSwgKDQsICdCYW5hbmEnKSwgKDQsICdDb2NvbnV0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICg1LCAnQXBwbGUnKSwgKDUsICdCYW5hbmEnKSwgKDUsICdDb2NvbnV0JyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsoaSwgcykgZm9yIGkgaW4gbnVtcyBmb3IgcyBpbiBbZiBmb3IgZiBpbiBzdHJzIGlmICJuIiBpbiBmXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgWygxLCAnQmFuYW5hJyksICgxLCAnQ29jb251dCcpLCAoMiwgJ0JhbmFuYScpLCAoMiwgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDMsICdCYW5hbmEnKSwgKDMsICdDb2NvbnV0JyksICg0LCAnQmFuYW5hJyksICg0LCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoNSwgJ0JhbmFuYScpLCAoNSwgJ0NvY29udXQnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyhsYW1iZGEgYTpbYSoqaSBmb3IgaSBpbiByYW5nZShhKzEpXSkoaikgZm9yIGogaW4gcmFuZ2UoNSldLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtbMV0sIFsxLCAxXSwgWzEsIDIsIDRdLCBbMSwgMywgOSwgMjddLCBbMSwgNCwgMTYsIDY0LCAyNTZdXSkKKworICAgICAgICBkZWYgdGVzdF9pbl9mdW5jKGwpOgorICAgICAgICAgICAgcmV0dXJuIFswIDwgeCA8IDMgZm9yIHggaW4gbCBpZiB4ID4gMl0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfaW5fZnVuYyhudW1zKSwgW0ZhbHNlLCBGYWxzZSwgRmFsc2VdKQorCisgICAgICAgIGRlZiB0ZXN0X25lc3RlZF9mcm9udCgpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbW3kgZm9yIHkgaW4gW3gsIHggKyAxXV0gZm9yIHggaW4gWzEsMyw1XV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbMSwgMl0sIFszLCA0XSwgWzUsIDZdXSkKKworICAgICAgICB0ZXN0X25lc3RlZF9mcm9udCgpCisKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJbaSwgcyBmb3IgaSBpbiBudW1zIGZvciBzIGluIHN0cnNdIikKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJbeCBpZiB5XSIpCisKKyAgICAgICAgc3VwcGxpZXJzID0gWworICAgICAgICAgICgxLCAiQm9laW5nIiksCisgICAgICAgICAgKDIsICJGb3JkIiksCisgICAgICAgICAgKDMsICJNYWNkb25hbGRzIikKKyAgICAgICAgXQorCisgICAgICAgIHBhcnRzID0gWworICAgICAgICAgICgxMCwgIkFpcmxpbmVyIiksCisgICAgICAgICAgKDIwLCAiRW5naW5lIiksCisgICAgICAgICAgKDMwLCAiQ2hlZXNlYnVyZ2VyIikKKyAgICAgICAgXQorCisgICAgICAgIHN1cHBhcnQgPSBbCisgICAgICAgICAgKDEsIDEwKSwgKDEsIDIwKSwgKDIsIDIwKSwgKDMsIDMwKQorICAgICAgICBdCisKKyAgICAgICAgeCA9IFsKKyAgICAgICAgICAoc25hbWUsIHBuYW1lKQorICAgICAgICAgICAgZm9yIChzbm8sIHNuYW1lKSBpbiBzdXBwbGllcnMKKyAgICAgICAgICAgICAgZm9yIChwbm8sIHBuYW1lKSBpbiBwYXJ0cworICAgICAgICAgICAgICAgIGZvciAoc3Bfc25vLCBzcF9wbm8pIGluIHN1cHBhcnQKKyAgICAgICAgICAgICAgICAgIGlmIHNubyA9PSBzcF9zbm8gYW5kIHBubyA9PSBzcF9wbm8KKyAgICAgICAgXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgWygnQm9laW5nJywgJ0FpcmxpbmVyJyksICgnQm9laW5nJywgJ0VuZ2luZScpLCAoJ0ZvcmQnLCAnRW5naW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnTWFjZG9uYWxkcycsICdDaGVlc2VidXJnZXInKV0pCisKKyAgICBkZWYgdGVzdEdlbmV4cHMoc2VsZik6CisgICAgICAgICMgZ2VuZXJhdG9yIGV4cHJlc3Npb24gdGVzdHMKKyAgICAgICAgZyA9IChbeCBmb3IgeCBpbiByYW5nZSgxMCldIGZvciB4IGluIHJhbmdlKDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGcubmV4dCgpLCBbeCBmb3IgeCBpbiByYW5nZSgxMCldKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBnLm5leHQoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCdzaG91bGQgcHJvZHVjZSBTdG9wSXRlcmF0aW9uIGV4Y2VwdGlvbicpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGEgPSAxCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGcgPSAoYSBmb3IgZCBpbiBhKQorICAgICAgICAgICAgZy5uZXh0KCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnc2hvdWxkIHByb2R1Y2UgVHlwZUVycm9yJykKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoKHgsIHkpIGZvciB4IGluICdhYmNkJyBmb3IgeSBpbiAnYWJjZCcpLCBbKHgsIHkpIGZvciB4IGluICdhYmNkJyBmb3IgeSBpbiAnYWJjZCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoKHgsIHkpIGZvciB4IGluICdhYicgZm9yIHkgaW4gJ3h5JyksIFsoeCwgeSkgZm9yIHggaW4gJ2FiJyBmb3IgeSBpbiAneHknXSkKKworICAgICAgICBhID0gW3ggZm9yIHggaW4gcmFuZ2UoMTApXQorICAgICAgICBiID0gKHggZm9yIHggaW4gKHkgZm9yIHkgaW4gYSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKGIpLCBzdW0oW3ggZm9yIHggaW4gcmFuZ2UoMTApXSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCoqMiBmb3IgeCBpbiByYW5nZSgxMCkpLCBzdW0oW3gqKjIgZm9yIHggaW4gcmFuZ2UoMTApXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKHgqeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCUyKSwgc3VtKFt4KnggZm9yIHggaW4gcmFuZ2UoMTApIGlmIHglMl0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4IGZvciB4IGluICh5IGZvciB5IGluIHJhbmdlKDEwKSkpLCBzdW0oW3ggZm9yIHggaW4gcmFuZ2UoMTApXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKHggZm9yIHggaW4gKHkgZm9yIHkgaW4gKHogZm9yIHogaW4gcmFuZ2UoMTApKSkpLCBzdW0oW3ggZm9yIHggaW4gcmFuZ2UoMTApXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKHggZm9yIHggaW4gW3kgZm9yIHkgaW4gKHogZm9yIHogaW4gcmFuZ2UoMTApKV0pLCBzdW0oW3ggZm9yIHggaW4gcmFuZ2UoMTApXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKHggZm9yIHggaW4gKHkgZm9yIHkgaW4gKHogZm9yIHogaW4gcmFuZ2UoMTApIGlmIFRydWUpKSBpZiBUcnVlKSwgc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4IGZvciB4IGluICh5IGZvciB5IGluICh6IGZvciB6IGluIHJhbmdlKDEwKSBpZiBUcnVlKSBpZiBGYWxzZSkgaWYgVHJ1ZSksIDApCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiZm9vKHggZm9yIHggaW4gcmFuZ2UoMTApLCAxMDApIikKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJmb28oMTAwLCB4IGZvciB4IGluIHJhbmdlKDEwKSkiKQorCisgICAgZGVmIHRlc3RDb21wcmVoZW5zaW9uU3BlY2lhbHMoc2VsZik6CisgICAgICAgICMgdGVzdCBmb3Igb3V0bW9zdCBpdGVyYWJsZSBwcmVjb21wdXRhdGlvbgorICAgICAgICB4ID0gMTA7IGcgPSAoaSBmb3IgaSBpbiByYW5nZSh4KSk7IHggPSA1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpc3QoZykpLCAxMCkKKworICAgICAgICAjIFRoaXMgc2hvdWxkIGhvbGQsIHNpbmNlIHdlJ3JlIG9ubHkgcHJlY29tcHV0aW5nIG91dG1vc3QgaXRlcmFibGUuCisgICAgICAgIHggPSAxMDsgdCA9IEZhbHNlOyBnID0gKChpLGopIGZvciBpIGluIHJhbmdlKHgpIGlmIHQgZm9yIGogaW4gcmFuZ2UoeCkpCisgICAgICAgIHggPSA1OyB0ID0gVHJ1ZTsKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbKGksaikgZm9yIGkgaW4gcmFuZ2UoMTApIGZvciBqIGluIHJhbmdlKDUpXSwgbGlzdChnKSkKKworICAgICAgICAjIEdyYW1tYXIgYWxsb3dzIG11bHRpcGxlIGFkamFjZW50ICdpZidzIGluIGxpc3Rjb21wcyBhbmQgZ2VuZXhwcywKKyAgICAgICAgIyBldmVuIHRob3VnaCBpdCdzIHNpbGx5LiBNYWtlIHN1cmUgaXQgd29ya3MgKGlmZWxzZSBicm9rZSB0aGlzLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbIHggZm9yIHggaW4gcmFuZ2UoMTApIGlmIHggJSAyIGlmIHggJSAzIF0sIFsxLCA1LCA3XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHggZm9yIHggaW4gcmFuZ2UoMTApIGlmIHggJSAyIGlmIHggJSAzKSwgWzEsIDUsIDddKQorCisgICAgICAgICMgdmVyaWZ5IHVucGFja2luZyBzaW5nbGUgZWxlbWVudCB0dXBsZXMgaW4gbGlzdGNvbXAvZ2VuZXhwLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFt4IGZvciB4LCBpbiBbKDQsKSwgKDUsKSwgKDYsKV1dLCBbNCwgNSwgNl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh4IGZvciB4LCBpbiBbKDcsKSwgKDgsKSwgKDksKV0pLCBbNywgOCwgOV0pCisKKyAgICBkZWYgdGVzdElmRWxzZUV4cHIoc2VsZik6CisgICAgICAgICMgVGVzdCBpZmVsc2UgZXhwcmVzc2lvbnMgaW4gdmFyaW91cyBjYXNlcworICAgICAgICBkZWYgX2NoZWNrZXZhbChtc2csIHJldCk6CisgICAgICAgICAgICAiaGVscGVyIHRvIGNoZWNrIHRoYXQgZXZhbHVhdGlvbiBvZiBleHByZXNzaW9ucyBpcyBkb25lIGNvcnJlY3RseSIKKyAgICAgICAgICAgIHByaW50IHgKKyAgICAgICAgICAgIHJldHVybiByZXQKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsgeCgpIGZvciB4IGluIGxhbWJkYTogVHJ1ZSwgbGFtYmRhOiBGYWxzZSBpZiB4KCkgXSwgW1RydWVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsgeCgpIGZvciB4IGluIChsYW1iZGE6IFRydWUsIGxhbWJkYTogRmFsc2UpIGlmIHgoKSBdLCBbVHJ1ZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyB4KEZhbHNlKSBmb3IgeCBpbiAobGFtYmRhIHg6IEZhbHNlIGlmIHggZWxzZSBUcnVlLCBsYW1iZGEgeDogVHJ1ZSBpZiB4IGVsc2UgRmFsc2UpIGlmIHgoRmFsc2UpIF0sIFtUcnVlXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNSBpZiAxIGVsc2UgX2NoZWNrZXZhbCgiY2hlY2sgMSIsIDApKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoX2NoZWNrZXZhbCgiY2hlY2sgMiIsIDApIGlmIDAgZWxzZSA1KSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNSBhbmQgNiBpZiAwIGVsc2UgMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCg1IGFuZCA2KSBpZiAwIGVsc2UgMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDUgYW5kICg2IGlmIDEgZWxzZSAxKSksIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDAgb3IgX2NoZWNrZXZhbCgiY2hlY2sgMyIsIDIpIGlmIDAgZWxzZSAzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMSBvciBfY2hlY2tldmFsKCJjaGVjayA0IiwgMikgaWYgMSBlbHNlIF9jaGVja2V2YWwoImNoZWNrIDUiLCAzKSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDAgb3IgNSBpZiAxIGVsc2UgX2NoZWNrZXZhbCgiY2hlY2sgNiIsIDMpKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgobm90IDUgaWYgMSBlbHNlIDEpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgobm90IDUgaWYgMCBlbHNlIDEpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2ICsgMSBpZiAxIGVsc2UgMiksIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDYgLSAxIGlmIDEgZWxzZSAyKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNiAqIDIgaWYgMSBlbHNlIDQpLCAxMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNiAvIDIgaWYgMSBlbHNlIDMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2IDwgNCBpZiAwIGVsc2UgMiksIDIpCiAKIAotcHJpbnQgJ2F0b21zJwotIyMjIGF0b206ICcoJyBbdGVzdGxpc3RdICcpJyB8ICdbJyBbdGVzdGxpc3RdICddJyB8ICd7JyBbZGljdHNldG1ha2VyXSAnfScgfCBOQU1FIHwgTlVNQkVSIHwgU1RSSU5HCi0jIyMgZGljdHNldG1ha2VyOiAodGVzdCAnOicgdGVzdCAoJywnIHRlc3QgJzonIHRlc3QpKiBbJywnXSkgfCAodGVzdCAoJywnIHRlc3QpKiBbJywnXSkKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVG9rZW5UZXN0cywgR3JhbW1hclRlc3RzKQogCi14ID0gKDEpCi14ID0gKDEgb3IgMiBvciAzKQoteCA9ICgxIG9yIDIgb3IgMywgMiwgMykKLQoteCA9IFtdCi14ID0gWzFdCi14ID0gWzEgb3IgMiBvciAzXQoteCA9IFsxIG9yIDIgb3IgMywgMiwgM10KLXggPSBbXQotCi14ID0ge30KLXggPSB7J29uZSc6IDF9Ci14ID0geydvbmUnOiAxLH0KLXggPSB7J29uZScgb3IgJ3R3byc6IDEgb3IgMn0KLXggPSB7J29uZSc6IDEsICd0d28nOiAyfQoteCA9IHsnb25lJzogMSwgJ3R3byc6IDIsfQoteCA9IHsnb25lJzogMSwgJ3R3byc6IDIsICd0aHJlZSc6IDMsICdmb3VyJzogNCwgJ2ZpdmUnOiA1LCAnc2l4JzogNn0KLQoteCA9IHsnb25lJ30KLXggPSB7J29uZScsIDEsfQoteCA9IHsnb25lJywgJ3R3bycsICd0aHJlZSd9Ci14ID0gezIsIDMsIDQsfQotCi14ID0geAoteCA9ICd4JwoteCA9IDEyMwotCi0jIyMgZXhwcmxpc3Q6IGV4cHIgKCcsJyBleHByKSogWycsJ10KLSMjIyB0ZXN0bGlzdDogdGVzdCAoJywnIHRlc3QpKiBbJywnXQotIyBUaGVzZSBoYXZlIGJlZW4gZXhlcmNpc2VkIGVub3VnaCBhYm92ZQotCi1wcmludCAnY2xhc3NkZWYnICMgJ2NsYXNzJyBOQU1FIFsnKCcgW3Rlc3RsaXN0XSAnKSddICc6JyBzdWl0ZQotY2xhc3MgQjogcGFzcwotY2xhc3MgQjIoKTogcGFzcwotY2xhc3MgQzEoQik6IHBhc3MKLWNsYXNzIEMyKEIpOiBwYXNzCi1jbGFzcyBEKEMxLCBDMiwgQik6IHBhc3MKLWNsYXNzIEM6Ci0gICAgZGVmIG1ldGgxKHNlbGYpOiBwYXNzCi0gICAgZGVmIG1ldGgyKHNlbGYsIGFyZyk6IHBhc3MKLSAgICBkZWYgbWV0aDMoc2VsZiwgYTEsIGEyKTogcGFzcwotCi0jIGxpc3QgY29tcHJlaGVuc2lvbiB0ZXN0cwotbnVtcyA9IFsxLCAyLCAzLCA0LCA1XQotc3RycyA9IFsiQXBwbGUiLCAiQmFuYW5hIiwgIkNvY29udXQiXQotc3BjcyA9IFsiICBBcHBsZSIsICIgQmFuYW5hICIsICJDb2NvICBudXQgICJdCi0KLXByaW50IFtzLnN0cmlwKCkgZm9yIHMgaW4gc3Bjc10KLXByaW50IFszICogeCBmb3IgeCBpbiBudW1zXQotcHJpbnQgW3ggZm9yIHggaW4gbnVtcyBpZiB4ID4gMl0KLXByaW50IFsoaSwgcykgZm9yIGkgaW4gbnVtcyBmb3IgcyBpbiBzdHJzXQotcHJpbnQgWyhpLCBzKSBmb3IgaSBpbiBudW1zIGZvciBzIGluIFtmIGZvciBmIGluIHN0cnMgaWYgIm4iIGluIGZdXQotcHJpbnQgWyhsYW1iZGEgYTpbYSoqaSBmb3IgaSBpbiByYW5nZShhKzEpXSkoaikgZm9yIGogaW4gcmFuZ2UoNSldCi0KLWRlZiB0ZXN0X2luX2Z1bmMobCk6Ci0gICAgcmV0dXJuIFswIDwgeCA8IDMgZm9yIHggaW4gbCBpZiB4ID4gMl0KLQotcHJpbnQgdGVzdF9pbl9mdW5jKG51bXMpCi0KLWRlZiB0ZXN0X25lc3RlZF9mcm9udCgpOgotICAgIHByaW50IFtbeSBmb3IgeSBpbiBbeCwgeCArIDFdXSBmb3IgeCBpbiBbMSwzLDVdXQotCi10ZXN0X25lc3RlZF9mcm9udCgpCi0KLWNoZWNrX3N5bnRheCgiW2ksIHMgZm9yIGkgaW4gbnVtcyBmb3IgcyBpbiBzdHJzXSIpCi1jaGVja19zeW50YXgoIlt4IGlmIHldIikKLQotc3VwcGxpZXJzID0gWwotICAoMSwgIkJvZWluZyIpLAotICAoMiwgIkZvcmQiKSwKLSAgKDMsICJNYWNkb25hbGRzIikKLV0KLQotcGFydHMgPSBbCi0gICgxMCwgIkFpcmxpbmVyIiksCi0gICgyMCwgIkVuZ2luZSIpLAotICAoMzAsICJDaGVlc2VidXJnZXIiKQotXQotCi1zdXBwYXJ0ID0gWwotICAoMSwgMTApLCAoMSwgMjApLCAoMiwgMjApLCAoMywgMzApCi1dCi0KLXByaW50IFsKLSAgKHNuYW1lLCBwbmFtZSkKLSAgICBmb3IgKHNubywgc25hbWUpIGluIHN1cHBsaWVycwotICAgICAgZm9yIChwbm8sIHBuYW1lKSBpbiBwYXJ0cwotICAgICAgICBmb3IgKHNwX3Nubywgc3BfcG5vKSBpbiBzdXBwYXJ0Ci0gICAgICAgICAgaWYgc25vID09IHNwX3NubyBhbmQgcG5vID09IHNwX3BubwotXQotCi0jIGdlbmVyYXRvciBleHByZXNzaW9uIHRlc3RzCi1nID0gKFt4IGZvciB4IGluIHJhbmdlKDEwKV0gZm9yIHggaW4gcmFuZ2UoMSkpCi12ZXJpZnkoZy5uZXh0KCkgPT0gW3ggZm9yIHggaW4gcmFuZ2UoMTApXSkKLXRyeToKLSAgICBnLm5leHQoKQotICAgIHJhaXNlIFRlc3RGYWlsZWQsICdzaG91bGQgcHJvZHVjZSBTdG9wSXRlcmF0aW9uIGV4Y2VwdGlvbicKLWV4Y2VwdCBTdG9wSXRlcmF0aW9uOgotICAgIHBhc3MKLQotYSA9IDEKLXRyeToKLSAgICBnID0gKGEgZm9yIGQgaW4gYSkKLSAgICBnLm5leHQoKQotICAgIHJhaXNlIFRlc3RGYWlsZWQsICdzaG91bGQgcHJvZHVjZSBUeXBlRXJyb3InCi1leGNlcHQgVHlwZUVycm9yOgotICAgIHBhc3MKLQotdmVyaWZ5KGxpc3QoKHgsIHkpIGZvciB4IGluICdhYmNkJyBmb3IgeSBpbiAnYWJjZCcpID09IFsoeCwgeSkgZm9yIHggaW4gJ2FiY2QnIGZvciB5IGluICdhYmNkJ10pCi12ZXJpZnkobGlzdCgoeCwgeSkgZm9yIHggaW4gJ2FiJyBmb3IgeSBpbiAneHknKSA9PSBbKHgsIHkpIGZvciB4IGluICdhYicgZm9yIHkgaW4gJ3h5J10pCi0KLWEgPSBbeCBmb3IgeCBpbiByYW5nZSgxMCldCi1iID0gKHggZm9yIHggaW4gKHkgZm9yIHkgaW4gYSkpCi12ZXJpZnkoc3VtKGIpID09IHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKLQotdmVyaWZ5KHN1bSh4KioyIGZvciB4IGluIHJhbmdlKDEwKSkgPT0gc3VtKFt4KioyIGZvciB4IGluIHJhbmdlKDEwKV0pKQotdmVyaWZ5KHN1bSh4KnggZm9yIHggaW4gcmFuZ2UoMTApIGlmIHglMikgPT0gc3VtKFt4KnggZm9yIHggaW4gcmFuZ2UoMTApIGlmIHglMl0pKQotdmVyaWZ5KHN1bSh4IGZvciB4IGluICh5IGZvciB5IGluIHJhbmdlKDEwKSkpID09IHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKLXZlcmlmeShzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkpKSkgPT0gc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQotdmVyaWZ5KHN1bSh4IGZvciB4IGluIFt5IGZvciB5IGluICh6IGZvciB6IGluIHJhbmdlKDEwKSldKSA9PSBzdW0oW3ggZm9yIHggaW4gcmFuZ2UoMTApXSkpCi12ZXJpZnkoc3VtKHggZm9yIHggaW4gKHkgZm9yIHkgaW4gKHogZm9yIHogaW4gcmFuZ2UoMTApIGlmIFRydWUpKSBpZiBUcnVlKSA9PSBzdW0oW3ggZm9yIHggaW4gcmFuZ2UoMTApXSkpCi12ZXJpZnkoc3VtKHggZm9yIHggaW4gKHkgZm9yIHkgaW4gKHogZm9yIHogaW4gcmFuZ2UoMTApIGlmIFRydWUpIGlmIEZhbHNlKSBpZiBUcnVlKSA9PSAwKQotY2hlY2tfc3ludGF4KCJmb28oeCBmb3IgeCBpbiByYW5nZSgxMCksIDEwMCkiKQotY2hlY2tfc3ludGF4KCJmb28oMTAwLCB4IGZvciB4IGluIHJhbmdlKDEwKSkiKQotCi0jIHRlc3QgZm9yIG91dG1vc3QgaXRlcmFibGUgcHJlY29tcHV0YXRpb24KLXggPSAxMDsgZyA9IChpIGZvciBpIGluIHJhbmdlKHgpKTsgeCA9IDUKLXZlcmlmeShsZW4obGlzdChnKSkgPT0gMTApCi0KLSMgVGhpcyBzaG91bGQgaG9sZCwgc2luY2Ugd2UncmUgb25seSBwcmVjb21wdXRpbmcgb3V0bW9zdCBpdGVyYWJsZS4KLXggPSAxMDsgdCA9IEZhbHNlOyBnID0gKChpLGopIGZvciBpIGluIHJhbmdlKHgpIGlmIHQgZm9yIGogaW4gcmFuZ2UoeCkpCi14ID0gNTsgdCA9IFRydWU7Ci12ZXJpZnkoWyhpLGopIGZvciBpIGluIHJhbmdlKDEwKSBmb3IgaiBpbiByYW5nZSg1KV0gPT0gbGlzdChnKSkKLQotIyBHcmFtbWFyIGFsbG93cyBtdWx0aXBsZSBhZGphY2VudCAnaWYncyBpbiBsaXN0Y29tcHMgYW5kIGdlbmV4cHMsCi0jIGV2ZW4gdGhvdWdoIGl0J3Mgc2lsbHkuIE1ha2Ugc3VyZSBpdCB3b3JrcyAoaWZlbHNlIGJyb2tlIHRoaXMuKQotdmVyaWZ5KFsgeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCAlIDIgaWYgeCAlIDMgXSwgWzEsIDUsIDddKQotdmVyaWZ5KCh4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4ICUgMiBpZiB4ICUgMyksIFsxLCA1LCA3XSkKLQotIyBUZXN0IGlmZWxzZSBleHByZXNzaW9ucyBpbiB2YXJpb3VzIGNhc2VzCi1kZWYgX2NoZWNrZXZhbChtc2csIHJldCk6Ci0gICAgImhlbHBlciB0byBjaGVjayB0aGF0IGV2YWx1YXRpb24gb2YgZXhwcmVzc2lvbnMgaXMgZG9uZSBjb3JyZWN0bHkiCi0gICAgcHJpbnQgeAotICAgIHJldHVybiByZXQKLQotdmVyaWZ5KFsgeCgpIGZvciB4IGluIGxhbWJkYTogVHJ1ZSwgbGFtYmRhOiBGYWxzZSBpZiB4KCkgXSA9PSBbVHJ1ZV0pCi12ZXJpZnkoWyB4KCkgZm9yIHggaW4gKGxhbWJkYTogVHJ1ZSwgbGFtYmRhOiBGYWxzZSkgaWYgeCgpIF0gPT0gW1RydWVdKQotdmVyaWZ5KFsgeChGYWxzZSkgZm9yIHggaW4gKGxhbWJkYSB4OiBGYWxzZSBpZiB4IGVsc2UgVHJ1ZSwgbGFtYmRhIHg6IFRydWUgaWYgeCBlbHNlIEZhbHNlKSBpZiB4KEZhbHNlKSBdID09IFtUcnVlXSkKLXZlcmlmeSgoNSBpZiAxIGVsc2UgX2NoZWNrZXZhbCgiY2hlY2sgMSIsIDApKSA9PSA1KQotdmVyaWZ5KChfY2hlY2tldmFsKCJjaGVjayAyIiwgMCkgaWYgMCBlbHNlIDUpID09IDUpCi12ZXJpZnkoKDUgYW5kIDYgaWYgMCBlbHNlIDEpID09IDEpCi12ZXJpZnkoKCg1IGFuZCA2KSBpZiAwIGVsc2UgMSkgPT0gMSkKLXZlcmlmeSgoNSBhbmQgKDYgaWYgMSBlbHNlIDEpKSA9PSA2KQotdmVyaWZ5KCgwIG9yIF9jaGVja2V2YWwoImNoZWNrIDMiLCAyKSBpZiAwIGVsc2UgMykgPT0gMykKLXZlcmlmeSgoMSBvciBfY2hlY2tldmFsKCJjaGVjayA0IiwgMikgaWYgMSBlbHNlIF9jaGVja2V2YWwoImNoZWNrIDUiLCAzKSkgPT0gMSkKLXZlcmlmeSgoMCBvciA1IGlmIDEgZWxzZSBfY2hlY2tldmFsKCJjaGVjayA2IiwgMykpID09IDUpCi12ZXJpZnkoKG5vdCA1IGlmIDEgZWxzZSAxKSA9PSBGYWxzZSkKLXZlcmlmeSgobm90IDUgaWYgMCBlbHNlIDEpID09IDEpCi12ZXJpZnkoKDYgKyAxIGlmIDEgZWxzZSAyKSA9PSA3KQotdmVyaWZ5KCg2IC0gMSBpZiAxIGVsc2UgMikgPT0gNSkKLXZlcmlmeSgoNiAqIDIgaWYgMSBlbHNlIDQpID09IDEyKQotdmVyaWZ5KCg2IC8gMiBpZiAxIGVsc2UgMykgPT0gMykKLXZlcmlmeSgoNiA8IDQgaWYgMCBlbHNlIDIpID09IDIpCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2d6aXAucHkgYi9MaWIvdGVzdC90ZXN0X2d6aXAucHkKaW5kZXggMGY4ZTAzZS4uOTk4OWE5MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nemlwLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ3ppcC5weQpAQCAtMTI4LDYgKzEyOCwxNyBAQAogICAgICAgICAgICAgZi5zZWVrKG5ld3BvcykgICMgcG9zaXRpdmUgc2VlawogICAgICAgICBmLmNsb3NlKCkKIAorICAgIGRlZiB0ZXN0X3NlZWtfd2hlbmNlKHNlbGYpOgorICAgICAgICBzZWxmLnRlc3Rfd3JpdGUoKQorICAgICAgICAjIFRyeSBzZWVrKHdoZW5jZT0xKSwgcmVhZCB0ZXN0CisKKyAgICAgICAgZiA9IGd6aXAuR3ppcEZpbGUoc2VsZi5maWxlbmFtZSkKKyAgICAgICAgZi5yZWFkKDEwKQorICAgICAgICBmLnNlZWsoMTAsIHdoZW5jZT0xKQorICAgICAgICB5ID0gZi5yZWFkKDEwKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeSwgZGF0YTFbMjA6MzBdKQorICAgICAgICAKICAgICBkZWYgdGVzdF9zZWVrX3dyaXRlKHNlbGYpOgogICAgICAgICAjIFRyeSBzZWVrLCB3cml0ZSB0ZXN0CiAgICAgICAgIGYgPSBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUsICd3JykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaHR0cGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfaHR0cGxpYi5weQppbmRleCA5MGJhZTg4Li45MGE0ZTU1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2h0dHBsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9odHRwbGliLnB5CkBAIC0xMCw5ICsxMCwxMCBAQAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXh0LCBmaWxlY2xhc3M9U3RyaW5nSU8uU3RyaW5nSU8pOgogICAgICAgICBzZWxmLnRleHQgPSB0ZXh0CiAgICAgICAgIHNlbGYuZmlsZWNsYXNzID0gZmlsZWNsYXNzCisgICAgICAgIHNlbGYuZGF0YSA9ICcnCiAKICAgICBkZWYgc2VuZGFsbChzZWxmLCBkYXRhKToKLSAgICAgICAgc2VsZi5kYXRhID0gZGF0YQorICAgICAgICBzZWxmLmRhdGEgKz0gZGF0YQogCiAgICAgZGVmIG1ha2VmaWxlKHNlbGYsIG1vZGUsIGJ1ZnNpemU9Tm9uZSk6CiAgICAgICAgIGlmIG1vZGUgIT0gJ3InIGFuZCBtb2RlICE9ICdyYic6CkBAIC03MCwxMDMgKzcxLDg2IEBACiAgICAgICAgICAgICAgICAgY29ubi5yZXF1ZXN0KCdQT1NUJywgJy8nLCBib2R5LCBoZWFkZXJzKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5fYnVmZmVyLmNvdW50W2hlYWRlci5sb3dlcigpXSwgMSkKIAotIyBDb2xsZWN0IG91dHB1dCB0byBhIGJ1ZmZlciBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY29wZSB3aXRoIGxpbmUtZW5kaW5nCi0jIGlzc3VlcyBhY3Jvc3MgcGxhdGZvcm1zLiAgU3BlY2lmaWNhbGx5LCB0aGUgaGVhZGVycyB3aWxsIGhhdmUgXHJcbiBwYWlycwotIyBhbmQgc29tZSBwbGF0Zm9ybXMgd2lsbCBzdHJpcCB0aGVtIGZyb20gdGhlIG91dHB1dCBmaWxlLgorY2xhc3MgQmFzaWNUZXN0KFRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9zdGF0dXNfbGluZXMoc2VsZik6CisgICAgICAgICMgVGVzdCBIVFRQIHN0YXR1cyBsaW5lcwogCi1kZWYgdGVzdCgpOgotICAgIGJ1ZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKLSAgICBfc3Rkb3V0ID0gc3lzLnN0ZG91dAotICAgIHRyeToKLSAgICAgICAgc3lzLnN0ZG91dCA9IGJ1ZgotICAgICAgICBfdGVzdCgpCi0gICAgZmluYWxseToKLSAgICAgICAgc3lzLnN0ZG91dCA9IF9zdGRvdXQKLQotICAgICMgcHJpbnQgaW5kaXZpZHVhbCBsaW5lcyB3aXRoIGVuZGluZ3Mgc3RyaXBwZWQKLSAgICBzID0gYnVmLmdldHZhbHVlKCkKLSAgICBmb3IgbGluZSBpbiBzLnNwbGl0KCJcbiIpOgotICAgICAgICBwcmludCBsaW5lLnN0cmlwKCkKLQotZGVmIF90ZXN0KCk6Ci0gICAgIyBUZXN0IEhUVFAgc3RhdHVzIGxpbmVzCi0KLSAgICBib2R5ID0gIkhUVFAvMS4xIDIwMCBPa1xyXG5cclxuVGV4dCIKLSAgICBzb2NrID0gRmFrZVNvY2tldChib2R5KQotICAgIHJlc3AgPSBodHRwbGliLkhUVFBSZXNwb25zZShzb2NrLCAxKQotICAgIHJlc3AuYmVnaW4oKQotICAgIHByaW50IHJlc3AucmVhZCgpCi0gICAgcmVzcC5jbG9zZSgpCi0KLSAgICBib2R5ID0gIkhUVFAvMS4xIDQwMC4xMDAgTm90IE9rXHJcblxyXG5UZXh0IgotICAgIHNvY2sgPSBGYWtlU29ja2V0KGJvZHkpCi0gICAgcmVzcCA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHNvY2ssIDEpCi0gICAgdHJ5OgorICAgICAgICBib2R5ID0gIkhUVFAvMS4xIDIwMCBPa1xyXG5cclxuVGV4dCIKKyAgICAgICAgc29jayA9IEZha2VTb2NrZXQoYm9keSkKKyAgICAgICAgcmVzcCA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHNvY2spCiAgICAgICAgIHJlc3AuYmVnaW4oKQotICAgIGV4Y2VwdCBodHRwbGliLkJhZFN0YXR1c0xpbmU6Ci0gICAgICAgIHByaW50ICJCYWRTdGF0dXNMaW5lIHJhaXNlZCBhcyBleHBlY3RlZCIKLSAgICBlbHNlOgotICAgICAgICBwcmludCAiRXhwZWN0IEJhZFN0YXR1c0xpbmUiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5yZWFkKCksICdUZXh0JykKKyAgICAgICAgcmVzcC5jbG9zZSgpCiAKLSAgICAjIENoZWNrIGludmFsaWQgaG9zdF9wb3J0CisgICAgICAgIGJvZHkgPSAiSFRUUC8xLjEgNDAwLjEwMCBOb3QgT2tcclxuXHJcblRleHQiCisgICAgICAgIHNvY2sgPSBGYWtlU29ja2V0KGJvZHkpCisgICAgICAgIHJlc3AgPSBodHRwbGliLkhUVFBSZXNwb25zZShzb2NrKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhodHRwbGliLkJhZFN0YXR1c0xpbmUsIHJlc3AuYmVnaW4pCiAKLSAgICBmb3IgaHAgaW4gKCJ3d3cucHl0aG9uLm9yZzphYmMiLCAid3d3LnB5dGhvbi5vcmc6Iik6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGggPSBodHRwbGliLkhUVFAoaHApCi0gICAgICAgIGV4Y2VwdCBodHRwbGliLkludmFsaWRVUkw6Ci0gICAgICAgICAgICBwcmludCAiSW52YWxpZFVSTCByYWlzZWQgYXMgZXhwZWN0ZWQiCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCAiRXhwZWN0IEludmFsaWRVUkwiCisgICAgZGVmIHRlc3RfaG9zdF9wb3J0KHNlbGYpOgorICAgICAgICAjIENoZWNrIGludmFsaWQgaG9zdF9wb3J0CiAKLSAgICBmb3IgaHAsaCxwIGluICgoIltmZTgwOjoyMDc6ZTlmZjpmZTliXTo4MDAwIiwgImZlODA6OjIwNzplOWZmOmZlOWIiLCA4MDAwKSwKLSAgICAgICAgICAgICAgICAgICAoInd3dy5weXRob24ub3JnOjgwIiwgInd3dy5weXRob24ub3JnIiwgODApLAotICAgICAgICAgICAgICAgICAgICgid3d3LnB5dGhvbi5vcmciLCAid3d3LnB5dGhvbi5vcmciLCA4MCksCi0gICAgICAgICAgICAgICAgICAgKCJbZmU4MDo6MjA3OmU5ZmY6ZmU5Yl0iLCAiZmU4MDo6MjA3OmU5ZmY6ZmU5YiIsIDgwKSk6Ci0gICAgICAgIHRyeToKKyAgICAgICAgZm9yIGhwIGluICgid3d3LnB5dGhvbi5vcmc6YWJjIiwgInd3dy5weXRob24ub3JnOiIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoaHR0cGxpYi5JbnZhbGlkVVJMLCBodHRwbGliLkhUVFAsIGhwKQorCisgICAgICAgIGZvciBocCwgaCwgcCBpbiAoKCJbZmU4MDo6MjA3OmU5ZmY6ZmU5Yl06ODAwMCIsICJmZTgwOjoyMDc6ZTlmZjpmZTliIiwgODAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCJ3d3cucHl0aG9uLm9yZzo4MCIsICJ3d3cucHl0aG9uLm9yZyIsIDgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoInd3dy5weXRob24ub3JnIiwgInd3dy5weXRob24ub3JnIiwgODApLAorICAgICAgICAgICAgICAgICAgICAgICAgICgiW2ZlODA6OjIwNzplOWZmOmZlOWJdIiwgImZlODA6OjIwNzplOWZmOmZlOWIiLCA4MCkpOgogICAgICAgICAgICAgaHR0cCA9IGh0dHBsaWIuSFRUUChocCkKLSAgICAgICAgZXhjZXB0IGh0dHBsaWIuSW52YWxpZFVSTDoKLSAgICAgICAgICAgIHByaW50ICJJbnZhbGlkVVJMIHJhaXNlZCBlcnJvbmVvdXNseSIKLSAgICAgICAgYyA9IGh0dHAuX2Nvbm4KLSAgICAgICAgaWYgaCAhPSBjLmhvc3Q6IHJhaXNlIEFzc2VydGlvbkVycm9yLCAoIkhvc3QgaW5jb3JyZWN0bHkgcGFyc2VkIiwgaCwgYy5ob3N0KQotICAgICAgICBpZiBwICE9IGMucG9ydDogcmFpc2UgQXNzZXJ0aW9uRXJyb3IsICgiUG9ydCBpbmNvcnJlY3RseSBwYXJzZWQiLCBwLCBjLmhvc3QpCisgICAgICAgICAgICBjID0gaHR0cC5fY29ubgorICAgICAgICAgICAgaWYgaCAhPSBjLmhvc3Q6IHNlbGYuZmFpbCgiSG9zdCBpbmNvcnJlY3RseSBwYXJzZWQ6ICVzICE9ICVzIiAlIChoLCBjLmhvc3QpKQorICAgICAgICAgICAgaWYgcCAhPSBjLnBvcnQ6IHNlbGYuZmFpbCgiUG9ydCBpbmNvcnJlY3RseSBwYXJzZWQ6ICVzICE9ICVzIiAlIChwLCBjLmhvc3QpKQogCi0gICAgIyB0ZXN0IHJlc3BvbnNlIHdpdGggbXVsdGlwbGUgbWVzc2FnZSBoZWFkZXJzIHdpdGggdGhlIHNhbWUgZmllbGQgbmFtZS4KLSAgICB0ZXh0ID0gKCdIVFRQLzEuMSAyMDAgT0tcclxuJwotICAgICAgICAgICAgJ1NldC1Db29raWU6IEN1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIlxyXG4nCi0gICAgICAgICAgICAnU2V0LUNvb2tpZTogUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgVmVyc2lvbj0iMSI7JwotICAgICAgICAgICAgJyBQYXRoPSIvYWNtZSJcclxuJwotICAgICAgICAgICAgJ1xyXG4nCi0gICAgICAgICAgICAnTm8gYm9keVxyXG4nKQotICAgIGhkciA9ICgnQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiJwotICAgICAgICAgICAnLCAnCi0gICAgICAgICAgICdQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiJykKLSAgICBzID0gRmFrZVNvY2tldCh0ZXh0KQotICAgIHIgPSBodHRwbGliLkhUVFBSZXNwb25zZShzLCAxKQotICAgIHIuYmVnaW4oKQotICAgIGNvb2tpZXMgPSByLmdldGhlYWRlcigiU2V0LUNvb2tpZSIpCi0gICAgaWYgY29va2llcyAhPSBoZHI6Ci0gICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yLCAibXVsdGlwbGUgaGVhZGVycyBub3QgY29tYmluZWQgcHJvcGVybHkiCisgICAgZGVmIHRlc3RfcmVzcG9uc2VfaGVhZGVycyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IHJlc3BvbnNlIHdpdGggbXVsdGlwbGUgbWVzc2FnZSBoZWFkZXJzIHdpdGggdGhlIHNhbWUgZmllbGQgbmFtZS4KKyAgICAgICAgdGV4dCA9ICgnSFRUUC8xLjEgMjAwIE9LXHJcbicKKyAgICAgICAgICAgICAgICAnU2V0LUNvb2tpZTogQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiXHJcbicKKyAgICAgICAgICAgICAgICAnU2V0LUNvb2tpZTogUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgVmVyc2lvbj0iMSI7JworICAgICAgICAgICAgICAgICcgUGF0aD0iL2FjbWUiXHJcbicKKyAgICAgICAgICAgICAgICAnXHJcbicKKyAgICAgICAgICAgICAgICAnTm8gYm9keVxyXG4nKQorICAgICAgICBoZHIgPSAoJ0N1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicKKyAgICAgICAgICAgICAgICcsICcKKyAgICAgICAgICAgICAgICdQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiJykKKyAgICAgICAgcyA9IEZha2VTb2NrZXQodGV4dCkKKyAgICAgICAgciA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHMpCisgICAgICAgIHIuYmVnaW4oKQorICAgICAgICBjb29raWVzID0gci5nZXRoZWFkZXIoIlNldC1Db29raWUiKQorICAgICAgICBpZiBjb29raWVzICE9IGhkcjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibXVsdGlwbGUgaGVhZGVycyBub3QgY29tYmluZWQgcHJvcGVybHkiKQogCi0gICAgIyBUZXN0IHRoYXQgdGhlIGxpYnJhcnkgZG9lc24ndCBhdHRlbXB0IHRvIHJlYWQgYW55IGRhdGEKLSAgICAjIGZyb20gYSBIRUFEIHJlcXVlc3QuICAoVGlja2xlcyBTRiBidWcgIzYyMjA0Mi4pCi0gICAgc29jayA9IEZha2VTb2NrZXQoCi0gICAgICAgICdIVFRQLzEuMSAyMDAgT0tcclxuJwotICAgICAgICAnQ29udGVudC1MZW5ndGg6IDE0NDMyXHJcbicKLSAgICAgICAgJ1xyXG4nLAotICAgICAgICBOb0VPRlN0cmluZ0lPKQotICAgIHJlc3AgPSBodHRwbGliLkhUVFBSZXNwb25zZShzb2NrLCAxLCBtZXRob2Q9IkhFQUQiKQotICAgIHJlc3AuYmVnaW4oKQotICAgIGlmIHJlc3AucmVhZCgpICE9ICIiOgotICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvciwgIkRpZCBub3QgZXhwZWN0IHJlc3BvbnNlIGZyb20gSEVBRCByZXF1ZXN0IgotICAgIHJlc3AuY2xvc2UoKQorICAgIGRlZiB0ZXN0X3JlYWRfaGVhZChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgdGhlIGxpYnJhcnkgZG9lc24ndCBhdHRlbXB0IHRvIHJlYWQgYW55IGRhdGEKKyAgICAgICAgIyBmcm9tIGEgSEVBRCByZXF1ZXN0LiAgKFRpY2tsZXMgU0YgYnVnICM2MjIwNDIuKQorICAgICAgICBzb2NrID0gRmFrZVNvY2tldCgKKyAgICAgICAgICAgICdIVFRQLzEuMSAyMDAgT0tcclxuJworICAgICAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoOiAxNDQzMlxyXG4nCisgICAgICAgICAgICAnXHJcbicsCisgICAgICAgICAgICBOb0VPRlN0cmluZ0lPKQorICAgICAgICByZXNwID0gaHR0cGxpYi5IVFRQUmVzcG9uc2Uoc29jaywgbWV0aG9kPSJIRUFEIikKKyAgICAgICAgcmVzcC5iZWdpbigpCisgICAgICAgIGlmIHJlc3AucmVhZCgpICE9ICIiOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWQgbm90IGV4cGVjdCByZXNwb25zZSBmcm9tIEhFQUQgcmVxdWVzdCIpCisgICAgICAgIHJlc3AuY2xvc2UoKQogCisgICAgZGVmIHRlc3Rfc2VuZF9maWxlKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9ICdHRVQgL2ZvbyBIVFRQLzEuMVxyXG5Ib3N0OiBleGFtcGxlLmNvbVxyXG4nIFwKKyAgICAgICAgICAgICAgICAgICAnQWNjZXB0LUVuY29kaW5nOiBpZGVudGl0eVxyXG5Db250ZW50LUxlbmd0aDonCisKKyAgICAgICAgYm9keSA9IG9wZW4oX19maWxlX18sICdyYicpCisgICAgICAgIGNvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKCdleGFtcGxlLmNvbScpCisgICAgICAgIHNvY2sgPSBGYWtlU29ja2V0KGJvZHkpCisgICAgICAgIGNvbm4uc29jayA9IHNvY2sKKyAgICAgICAgY29ubi5yZXF1ZXN0KCdHRVQnLCAnL2ZvbycsIGJvZHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrLmRhdGEuc3RhcnRzd2l0aChleHBlY3RlZCkpCiAKIGNsYXNzIE9mZmxpbmVUZXN0KFRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9yZXNwb25zZXMoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGh0dHBsaWIucmVzcG9uc2VzW2h0dHBsaWIuTk9UX0ZPVU5EXSwgIk5vdCBGb3VuZCIpCiAKIGRlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKLSAgICB0ZXN0cyA9IFtIZWFkZXJUZXN0cyxPZmZsaW5lVGVzdF0KLSAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0cykKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEhlYWRlclRlc3RzLCBPZmZsaW5lVGVzdCwgQmFzaWNUZXN0KQogCi10ZXN0KCkKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXAucHkKaW5kZXggODkzYmEyNC4uNjJiMTRlMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXAucHkKQEAgLTEsNDMgKzEsNDcgQEAKIGltcG9ydCBpbXAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RGYWlsZWQsIFRlc3RTa2lwcGVkCi10cnk6Ci0gICAgaW1wb3J0IHRocmVhZAotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIHJhaXNlIFRlc3RTa2lwcGVkKCJ0ZXN0IG9ubHkgdmFsaWQgd2hlbiB0aHJlYWQgc3VwcG9ydCBpcyBhdmFpbGFibGUiKQoraW1wb3J0IHRocmVhZAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogCi1kZWYgdmVyaWZ5X2xvY2tfc3RhdGUoZXhwZWN0ZWQpOgotICAgIGlmIGltcC5sb2NrX2hlbGQoKSAhPSBleHBlY3RlZDoKLSAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgiZXhwZWN0ZWQgaW1wLmxvY2tfaGVsZCgpIHRvIGJlICVyIiAlIGV4cGVjdGVkKQogCi1kZWYgdGVzdExvY2soKToKLSAgICBMT09QUyA9IDUwCitjbGFzcyBMb2NrVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCi0gICAgIyBUaGUgaW1wb3J0IGxvY2sgbWF5IGFscmVhZHkgYmUgaGVsZCwgZS5nLiBpZiB0aGUgdGVzdCBzdWl0ZSBpcyBydW4KLSAgICAjIHZpYSAiaW1wb3J0IHRlc3QuYXV0b3Rlc3QiLgotICAgIGxvY2tfaGVsZF9hdF9zdGFydCA9IGltcC5sb2NrX2hlbGQoKQotICAgIHZlcmlmeV9sb2NrX3N0YXRlKGxvY2tfaGVsZF9hdF9zdGFydCkKKyAgICAiIiJWZXJ5IGJhc2ljIHRlc3Qgb2YgaW1wb3J0IGxvY2sgZnVuY3Rpb25zLiIiIgogCi0gICAgZm9yIGkgaW4gcmFuZ2UoTE9PUFMpOgotICAgICAgICBpbXAuYWNxdWlyZV9sb2NrKCkKLSAgICAgICAgdmVyaWZ5X2xvY2tfc3RhdGUoVHJ1ZSkKKyAgICBkZWYgdmVyaWZ5X2xvY2tfc3RhdGUoc2VsZiwgZXhwZWN0ZWQpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChpbXAubG9ja19oZWxkKCksIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgaW1wLmxvY2tfaGVsZCgpIHRvIGJlICVyIiAlIGV4cGVjdGVkKQorICAgIGRlZiB0ZXN0TG9jayhzZWxmKToKKyAgICAgICAgTE9PUFMgPSA1MAogCi0gICAgZm9yIGkgaW4gcmFuZ2UoTE9PUFMpOgotICAgICAgICBpbXAucmVsZWFzZV9sb2NrKCkKKyAgICAgICAgIyBUaGUgaW1wb3J0IGxvY2sgbWF5IGFscmVhZHkgYmUgaGVsZCwgZS5nLiBpZiB0aGUgdGVzdCBzdWl0ZSBpcyBydW4KKyAgICAgICAgIyB2aWEgImltcG9ydCB0ZXN0LmF1dG90ZXN0Ii4KKyAgICAgICAgbG9ja19oZWxkX2F0X3N0YXJ0ID0gaW1wLmxvY2tfaGVsZCgpCisgICAgICAgIHNlbGYudmVyaWZ5X2xvY2tfc3RhdGUobG9ja19oZWxkX2F0X3N0YXJ0KQogCi0gICAgIyBUaGUgb3JpZ2luYWwgc3RhdGUgc2hvdWxkIGJlIHJlc3RvcmVkIG5vdy4KLSAgICB2ZXJpZnlfbG9ja19zdGF0ZShsb2NrX2hlbGRfYXRfc3RhcnQpCisgICAgICAgIGZvciBpIGluIHJhbmdlKExPT1BTKToKKyAgICAgICAgICAgIGltcC5hY3F1aXJlX2xvY2soKQorICAgICAgICAgICAgc2VsZi52ZXJpZnlfbG9ja19zdGF0ZShUcnVlKQogCi0gICAgaWYgbm90IGxvY2tfaGVsZF9hdF9zdGFydDoKLSAgICAgICAgdHJ5OgorICAgICAgICBmb3IgaSBpbiByYW5nZShMT09QUyk6CiAgICAgICAgICAgICBpbXAucmVsZWFzZV9sb2NrKCkKLSAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoInJlbGVhc2VfbG9jaygpIHdpdGhvdXQgbG9jayBzaG91bGQgcmFpc2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUnVudGltZUVycm9yIikKKworICAgICAgICAjIFRoZSBvcmlnaW5hbCBzdGF0ZSBzaG91bGQgYmUgcmVzdG9yZWQgbm93LgorICAgICAgICBzZWxmLnZlcmlmeV9sb2NrX3N0YXRlKGxvY2tfaGVsZF9hdF9zdGFydCkKKworICAgICAgICBpZiBub3QgbG9ja19oZWxkX2F0X3N0YXJ0OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcC5yZWxlYXNlX2xvY2soKQorICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVsZWFzZV9sb2NrKCkgd2l0aG91dCBsb2NrIHNob3VsZCByYWlzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJ1bnRpbWVFcnJvciIpCiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICB0ZXN0TG9jaygpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgICAgICAgICBMb2NrVGVzdHMsCisgICAgICAgICAgICApCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnQucHkKaW5kZXggYjY0YzIzYi4uZTM3Mzc4ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnQucHkKQEAgLTEsMjEgKzEsMTEgQEAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgVGVzdEZhaWxlZAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QKIAoraW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgb3MKIGltcG9ydCByYW5kb20KIGltcG9ydCBzeXMKIGltcG9ydCBweV9jb21waWxlCiAKLSMgQnJpZWYgZGlncmVzc2lvbiB0byB0ZXN0IHRoYXQgaW1wb3J0IGlzIGNhc2Utc2Vuc2l0aXZlOiAgaWYgd2UgZ290IHRoaXMKLSMgZmFyLCB3ZSBrbm93IGZvciBzdXJlIHRoYXQgInJhbmRvbSIgZXhpc3RzLgotdHJ5OgotICAgIGltcG9ydCBSQW5Eb00KLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBwYXNzCi1lbHNlOgotICAgIHJhaXNlIFRlc3RGYWlsZWQoImltcG9ydCBvZiBSQW5Eb00gc2hvdWxkIGhhdmUgZmFpbGVkIChjYXNlIG1pc21hdGNoKSIpCi0KLSMgQW5vdGhlciBicmllZiBkaWdyZXNzaW9uIHRvIHRlc3QgdGhlIGFjY3VyYWN5IG9mIG1hbmlmZXN0IGZsb2F0IGNvbnN0YW50cy4KLWZyb20gdGVzdCBpbXBvcnQgZG91YmxlX2NvbnN0ICAjIGRvbid0IGJsaW5rIC0tIHRoYXQgKndhcyogdGhlIHRlc3QKIAogZGVmIHJlbW92ZV9maWxlcyhuYW1lKToKICAgICBmb3IgZiBpbiAobmFtZSArIG9zLmV4dHNlcCArICJweSIsCkBAIC0yNiwxOTkgKzE2LDIwNiBAQAogICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmKToKICAgICAgICAgICAgIG9zLnJlbW92ZShmKQogCi1kZWYgdGVzdF93aXRoX2V4dGVuc2lvbihleHQpOiAjIGV4dCBub3JtYWxseSAiLnB5IjsgcGVyaGFwcyAiLnB5dyIKLSAgICBzb3VyY2UgPSBURVNURk4gKyBleHQKLSAgICBweW8gPSBURVNURk4gKyBvcy5leHRzZXAgKyAicHlvIgotICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6Ci0gICAgICAgIHB5YyA9IFRFU1RGTiArICIkcHkuY2xhc3MiCi0gICAgZWxzZToKLSAgICAgICAgcHljID0gVEVTVEZOICsgb3MuZXh0c2VwICsgInB5YyIKIAotICAgIGYgPSBvcGVuKHNvdXJjZSwgInciKQotICAgIHByaW50ID4+IGYsICIjIFRoaXMgdGVzdHMgUHl0aG9uJ3MgYWJpbGl0eSB0byBpbXBvcnQgYSIsIGV4dCwgImZpbGUuIgotICAgIGEgPSByYW5kb20ucmFuZHJhbmdlKDEwMDApCi0gICAgYiA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMCkKLSAgICBwcmludCA+PiBmLCAiYSA9IiwgYQotICAgIHByaW50ID4+IGYsICJiID0iLCBiCi0gICAgZi5jbG9zZSgpCitjbGFzcyBJbXBvcnRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotICAgIHRyeToKKyAgICBkZWYgdGVzdENhc2VTZW5zaXRpdml0eShzZWxmKToKKyAgICAgICAgIyBCcmllZiBkaWdyZXNzaW9uIHRvIHRlc3QgdGhhdCBpbXBvcnQgaXMgY2FzZS1zZW5zaXRpdmU6ICBpZiB3ZSBnb3QgdGhpcworICAgICAgICAjIGZhciwgd2Uga25vdyBmb3Igc3VyZSB0aGF0ICJyYW5kb20iIGV4aXN0cy4KICAgICAgICAgdHJ5OgotICAgICAgICAgICAgbW9kID0gX19pbXBvcnRfXyhURVNURk4pCi0gICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciwgZXJyOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW1wb3J0IGZyb20gJXMgZmFpbGVkOiAlcyIgJSAoZXh0LCBlcnIpKQotCi0gICAgICAgIGlmIG1vZC5hICE9IGEgb3IgbW9kLmIgIT0gYjoKLSAgICAgICAgICAgIHByaW50IGEsICIhPSIsIG1vZC5hCi0gICAgICAgICAgICBwcmludCBiLCAiIT0iLCBtb2QuYgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kdWxlIGxvYWRlZCAoJXMpIGJ1dCBjb250ZW50cyBpbnZhbGlkIiAlIG1vZCkKLSAgICBmaW5hbGx5OgotICAgICAgICBvcy51bmxpbmsoc291cmNlKQotCi0gICAgdHJ5OgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZWxvYWQobW9kKQotICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsIGVycjoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImltcG9ydCBmcm9tIC5weWMvLnB5byBmYWlsZWQ6ICVzIiAlIGVycikKLSAgICBmaW5hbGx5OgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBvcy51bmxpbmsocHljKQotICAgICAgICBleGNlcHQgb3MuZXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG9zLnVubGluayhweW8pCi0gICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZGVsIHN5cy5tb2R1bGVzW1RFU1RGTl0KLQotc3lzLnBhdGguaW5zZXJ0KDAsIG9zLmN1cmRpcikKLXRyeToKLSAgICB0ZXN0X3dpdGhfZXh0ZW5zaW9uKG9zLmV4dHNlcCArICJweSIpCi0gICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoIndpbiIpOgotICAgICAgICBmb3IgZXh0IGluICIuUFkiLCAiLlB5IiwgIi5wWSIsICIucHl3IiwgIi5QWVciLCAiLnBZdyI6Ci0gICAgICAgICAgICB0ZXN0X3dpdGhfZXh0ZW5zaW9uKGV4dCkKLWZpbmFsbHk6Ci0gICAgZGVsIHN5cy5wYXRoWzBdCi0KLSMgVmVyaWZ5IHRoYXQgdGhlIGltcCBtb2R1bGUgY2FuIGNvcnJlY3RseSBsb2FkIGFuZCBmaW5kIC5weSBmaWxlcwotaW1wb3J0IGltcAoteCA9IGltcC5maW5kX21vZHVsZSgib3MiKQotb3MgPSBpbXAubG9hZF9tb2R1bGUoIm9zIiwgKngpCi0KLWRlZiB0ZXN0X21vZHVsZV93aXRoX2xhcmdlX3N0YWNrKG1vZHVsZSk6Ci0gICAgIyBjcmVhdGUgbW9kdWxlIHcvbGlzdCBvZiA2NTAwMCBlbGVtZW50cyB0byB0ZXN0IGJ1ZyAjNTYxODU4Ci0gICAgZmlsZW5hbWUgPSBtb2R1bGUgKyBvcy5leHRzZXAgKyAncHknCi0KLSAgICAjIGNyZWF0ZSBhIGZpbGUgd2l0aCBhIGxpc3Qgb2YgNjUwMDAgZWxlbWVudHMKLSAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3crJykKLSAgICBmLndyaXRlKCdkID0gW1xuJykKLSAgICBmb3IgaSBpbiByYW5nZSg2NTAwMCk6Ci0gICAgICAgIGYud3JpdGUoJyIiLFxuJykKLSAgICBmLndyaXRlKCddJykKLSAgICBmLmNsb3NlKCkKLQotICAgICMgY29tcGlsZSAmIHJlbW92ZSAucHkgZmlsZSwgd2Ugb25seSBuZWVkIC5weWMgKG9yIC5weW8pCi0gICAgZiA9IG9wZW4oZmlsZW5hbWUsICdyJykKLSAgICBweV9jb21waWxlLmNvbXBpbGUoZmlsZW5hbWUpCi0gICAgZi5jbG9zZSgpCi0gICAgb3MudW5saW5rKGZpbGVuYW1lKQotCi0gICAgIyBuZWVkIHRvIGJlIGFibGUgdG8gbG9hZCBmcm9tIGN1cnJlbnQgZGlyCi0gICAgc3lzLnBhdGguYXBwZW5kKCcnKQotCi0gICAgIyB0aGlzIHVzZWQgdG8gY3Jhc2gKLSAgICBleGVjKCdpbXBvcnQgJyArIG1vZHVsZSkKLQotICAgICMgY2xlYW51cAotICAgIGRlbCBzeXMucGF0aFstMV0KLSAgICBmb3IgZXh0IGluICdweWMnLCAncHlvJzoKLSAgICAgICAgZm5hbWUgPSBtb2R1bGUgKyBvcy5leHRzZXAgKyBleHQKLSAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZm5hbWUpOgotICAgICAgICAgICAgb3MudW5saW5rKGZuYW1lKQotCi10ZXN0X21vZHVsZV93aXRoX2xhcmdlX3N0YWNrKCdsb25nbGlzdCcpCi0KLWRlZiB0ZXN0X2ZhaWxpbmdfaW1wb3J0X3N0aWNrcygpOgotICAgIHNvdXJjZSA9IFRFU1RGTiArIG9zLmV4dHNlcCArICJweSIKLSAgICBmID0gb3Blbihzb3VyY2UsICJ3IikKLSAgICBwcmludCA+PiBmLCAiYSA9IDEvMCIKLSAgICBmLmNsb3NlKCkKLQotICAgICMgTmV3IGluIDIuNCwgd2Ugc2hvdWxkbid0IGJlIGFibGUgdG8gaW1wb3J0IHRoYXQgbm8gbWF0dGVyIGhvdyBvZnRlbgotICAgICMgd2UgdHJ5LgotICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5jdXJkaXIpCi0gICAgdHJ5OgotICAgICAgICBmb3IgaSBpbiAxLCAyLCAzOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG1vZCA9IF9faW1wb3J0X18oVEVTVEZOKQotICAgICAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgotICAgICAgICAgICAgICAgIGlmIFRFU1RGTiBpbiBzeXMubW9kdWxlczoKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgiZGFtYWdlZCBtb2R1bGUgaW4gc3lzLm1vZHVsZXMiLCBpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJ3YXMgYWJsZSB0byBpbXBvcnQgYSBkYW1hZ2VkIG1vZHVsZSIsIGkpCi0gICAgZmluYWxseToKLSAgICAgICAgc3lzLnBhdGgucG9wKDApCi0gICAgICAgIHJlbW92ZV9maWxlcyhURVNURk4pCi0KLXRlc3RfZmFpbGluZ19pbXBvcnRfc3RpY2tzKCkKLQotZGVmIHRlc3RfZmFpbGluZ19yZWxvYWQoKToKLSAgICAjIEEgZmFpbGluZyByZWxvYWQgc2hvdWxkIGxlYXZlIHRoZSBtb2R1bGUgb2JqZWN0IGluIHN5cy5tb2R1bGVzLgotICAgIHNvdXJjZSA9IFRFU1RGTiArIG9zLmV4dHNlcCArICJweSIKLSAgICBmID0gb3Blbihzb3VyY2UsICJ3IikKLSAgICBwcmludCA+PiBmLCAiYSA9IDEiCi0gICAgcHJpbnQgPj4gZiwgImIgPSAyIgotICAgIGYuY2xvc2UoKQotCi0gICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLmN1cmRpcikKLSAgICB0cnk6Ci0gICAgICAgIG1vZCA9IF9faW1wb3J0X18oVEVTVEZOKQotICAgICAgICBpZiBURVNURk4gbm90IGluIHN5cy5tb2R1bGVzOgotICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgiZXhwZWN0ZWQgbW9kdWxlIGluIHN5cy5tb2R1bGVzIikKLSAgICAgICAgaWYgbW9kLmEgIT0gMSBvciBtb2QuYiAhPSAyOgotICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgibW9kdWxlIGhhcyB3cm9uZyBhdHRyaWJ1dGUgdmFsdWVzIikKLQotICAgICAgICAjIE9uIFdpblhQLCBqdXN0IHJlcGxhY2luZyB0aGUgLnB5IGZpbGUgd2Fzbid0IGVub3VnaCB0bwotICAgICAgICAjIGNvbnZpbmNlIHJlbG9hZCgpIHRvIHJlcGFyc2UgaXQuICBNYXliZSB0aGUgdGltZXN0YW1wIGRpZG4ndAotICAgICAgICAjIG1vdmUgZW5vdWdoLiAgV2UgZm9yY2UgaXQgdG8gZ2V0IHJlcGFyc2VkIGJ5IHJlbW92aW5nIHRoZQotICAgICAgICAjIGNvbXBpbGVkIGZpbGUgdG9vLgotICAgICAgICByZW1vdmVfZmlsZXMoVEVTVEZOKQotCi0gICAgICAgICMgTm93IGRhbWFnZSB0aGUgbW9kdWxlLgotICAgICAgICBmID0gb3Blbihzb3VyY2UsICJ3IikKLSAgICAgICAgcHJpbnQgPj4gZiwgImEgPSAxMCIKLSAgICAgICAgcHJpbnQgPj4gZiwgImIgPSAyMC8vMCIKLSAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJlbG9hZChtb2QpCi0gICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKyAgICAgICAgICAgIGltcG9ydCBSQW5Eb00KKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgid2FzIGFibGUgdG8gcmVsb2FkIGEgZGFtYWdlZCBtb2R1bGUiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJpbXBvcnQgb2YgUkFuRG9NIHNob3VsZCBoYXZlIGZhaWxlZCAoY2FzZSBtaXNtYXRjaCkiKQogCi0gICAgICAgICMgQnV0IHdlIHN0aWxsIGV4cGVjdCB0aGUgbW9kdWxlIHRvIGJlIGluIHN5cy5tb2R1bGVzLgotICAgICAgICBtb2QgPSBzeXMubW9kdWxlcy5nZXQoVEVTVEZOKQotICAgICAgICBpZiBtb2QgaXMgTm9uZToKLSAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoImV4cGVjdGVkIG1vZHVsZSB0byBzdGlsbCBiZSBpbiBzeXMubW9kdWxlcyIpCi0gICAgICAgICMgV2Ugc2hvdWxkIGhhdmUgcmVwbGFjZWQgYSB3LyAxMCwgYnV0IHRoZSBvbGQgYiB2YWx1ZSBzaG91bGQKLSAgICAgICAgIyBzdGljay4KLSAgICAgICAgaWYgbW9kLmEgIT0gMTAgb3IgbW9kLmIgIT0gMjoKLSAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoIm1vZHVsZSBoYXMgd3JvbmcgYXR0cmlidXRlIHZhbHVlcyIpCisgICAgZGVmIHRlc3REb3VibGVDb25zdChzZWxmKToKKyAgICAgICAgIyBBbm90aGVyIGJyaWVmIGRpZ3Jlc3Npb24gdG8gdGVzdCB0aGUgYWNjdXJhY3kgb2YgbWFuaWZlc3QgZmxvYXQgY29uc3RhbnRzLgorICAgICAgICBmcm9tIHRlc3QgaW1wb3J0IGRvdWJsZV9jb25zdCAgIyBkb24ndCBibGluayAtLSB0aGF0ICp3YXMqIHRoZSB0ZXN0CiAKLSAgICBmaW5hbGx5OgotICAgICAgICBzeXMucGF0aC5wb3AoMCkKLSAgICAgICAgcmVtb3ZlX2ZpbGVzKFRFU1RGTikKLSAgICAgICAgaWYgVEVTVEZOIGluIHN5cy5tb2R1bGVzOgotICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW1RFU1RGTl0KKyAgICBkZWYgdGVzdEltcG9ydChzZWxmKToKKyAgICAgICAgZGVmIHRlc3Rfd2l0aF9leHRlbnNpb24oZXh0KToKKyAgICAgICAgICAgICMgZXh0IG5vcm1hbGx5ICIucHkiOyBwZXJoYXBzICIucHl3IgorICAgICAgICAgICAgc291cmNlID0gVEVTVEZOICsgZXh0CisgICAgICAgICAgICBweW8gPSBURVNURk4gKyBvcy5leHRzZXAgKyAicHlvIgorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKKyAgICAgICAgICAgICAgICBweWMgPSBURVNURk4gKyAiJHB5LmNsYXNzIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBweWMgPSBURVNURk4gKyBvcy5leHRzZXAgKyAicHljIgogCi10ZXN0X2ZhaWxpbmdfcmVsb2FkKCkKKyAgICAgICAgICAgIGYgPSBvcGVuKHNvdXJjZSwgInciKQorICAgICAgICAgICAgcHJpbnQgPj4gZiwgIiMgVGhpcyB0ZXN0cyBQeXRob24ncyBhYmlsaXR5IHRvIGltcG9ydCBhIiwgZXh0LCAiZmlsZS4iCisgICAgICAgICAgICBhID0gcmFuZG9tLnJhbmRyYW5nZSgxMDAwKQorICAgICAgICAgICAgYiA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMCkKKyAgICAgICAgICAgIHByaW50ID4+IGYsICJhID0iLCBhCisgICAgICAgICAgICBwcmludCA+PiBmLCAiYiA9IiwgYgorICAgICAgICAgICAgZi5jbG9zZSgpCiAKLWRlZiB0ZXN0X2ltcG9ydF9uYW1lX2JpbmRpbmcoKToKLSAgICAjIGltcG9ydCB4LnkueiBiaW5kcyB4IGluIHRoZSBjdXJyZW50IG5hbWVzcGFjZQotICAgIGltcG9ydCB0ZXN0IGFzIHgKLSAgICBpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQKLSAgICBhc3NlcnQgeCBpcyB0ZXN0LCB4Ll9fbmFtZV9fCi0gICAgYXNzZXJ0IGhhc2F0dHIodGVzdC50ZXN0X3N1cHBvcnQsICJfX2ZpbGVfXyIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKFRFU1RGTikKKyAgICAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJpbXBvcnQgZnJvbSAlcyBmYWlsZWQ6ICVzIiAlIChleHQsIGVycikpCiAKLSAgICAjIGltcG9ydCB4LnkueiBhcyB3IGJpbmRzIHogYXMgdwotICAgIGltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydCBhcyB5Ci0gICAgYXNzZXJ0IHkgaXMgdGVzdC50ZXN0X3N1cHBvcnQsIHkuX19uYW1lX18KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtb2QuYSwgYSwKKyAgICAgICAgICAgICAgICAgICAgIm1vZHVsZSBsb2FkZWQgKCVzKSBidXQgY29udGVudHMgaW52YWxpZCIgJSBtb2QpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobW9kLmIsIGIsCisgICAgICAgICAgICAgICAgICAgICJtb2R1bGUgbG9hZGVkICglcykgYnV0IGNvbnRlbnRzIGludmFsaWQiICUgbW9kKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoc291cmNlKQogCi10ZXN0X2ltcG9ydF9uYW1lX2JpbmRpbmcoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmVsb2FkKG1vZCkKKyAgICAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJpbXBvcnQgZnJvbSAucHljLy5weW8gZmFpbGVkOiAlcyIgJSBlcnIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHB5YykKKyAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHB5bykKKyAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1tURVNURk5dCiAKLWRlZiB0ZXN0X2ltcG9ydF9pbml0bGVzc19kaXJlY3Rvcnlfd2FybmluZygpOgotICAgIGltcG9ydCB3YXJuaW5ncwotICAgIG9sZGZpbHRlcnMgPSB3YXJuaW5ncy5maWx0ZXJzWzpdCi0gICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdlcnJvcicsIEltcG9ydFdhcm5pbmcpOwotICAgIHRyeToKLSAgICAgICAgIyBKdXN0IGEgcmFuZG9tIG5vbi1wYWNrYWdlIGRpcmVjdG9yeSB3ZSBhbHdheXMgZXhwZWN0IHRvIGJlCi0gICAgICAgICMgc29tZXdoZXJlIGluIHN5cy5wYXRoLi4uCi0gICAgICAgIF9faW1wb3J0X18oInNpdGUtcGFja2FnZXMiKQotICAgIGV4Y2VwdCBJbXBvcnRXYXJuaW5nOgotICAgICAgICBwYXNzCi0gICAgZWxzZToKLSAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IKLSAgICBmaW5hbGx5OgotICAgICAgICB3YXJuaW5ncy5maWx0ZXJzID0gb2xkZmlsdGVycworICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MuY3VyZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0X3dpdGhfZXh0ZW5zaW9uKG9zLmV4dHNlcCArICJweSIpCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgid2luIik6CisgICAgICAgICAgICAgICAgZm9yIGV4dCBpbiAiLlBZIiwgIi5QeSIsICIucFkiLCAiLnB5dyIsICIuUFlXIiwgIi5wWXciOgorICAgICAgICAgICAgICAgICAgICB0ZXN0X3dpdGhfZXh0ZW5zaW9uKGV4dCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRlbCBzeXMucGF0aFswXQogCi10ZXN0X2ltcG9ydF9pbml0bGVzc19kaXJlY3Rvcnlfd2FybmluZygpCisgICAgZGVmIHRlc3RJbXBNb2R1bGUoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgdGhlIGltcCBtb2R1bGUgY2FuIGNvcnJlY3RseSBsb2FkIGFuZCBmaW5kIC5weSBmaWxlcworICAgICAgICBpbXBvcnQgaW1wCisgICAgICAgIHggPSBpbXAuZmluZF9tb2R1bGUoIm9zIikKKyAgICAgICAgb3MgPSBpbXAubG9hZF9tb2R1bGUoIm9zIiwgKngpCisKKyAgICBkZWYgdGVzdF9tb2R1bGVfd2l0aF9sYXJnZV9zdGFjayhzZWxmLCBtb2R1bGU9J2xvbmdsaXN0Jyk6CisgICAgICAgICMgY3JlYXRlIG1vZHVsZSB3L2xpc3Qgb2YgNjUwMDAgZWxlbWVudHMgdG8gdGVzdCBidWcgIzU2MTg1OAorICAgICAgICBmaWxlbmFtZSA9IG1vZHVsZSArIG9zLmV4dHNlcCArICdweScKKworICAgICAgICAjIGNyZWF0ZSBhIGZpbGUgd2l0aCBhIGxpc3Qgb2YgNjUwMDAgZWxlbWVudHMKKyAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICd3KycpCisgICAgICAgIGYud3JpdGUoJ2QgPSBbXG4nKQorICAgICAgICBmb3IgaSBpbiByYW5nZSg2NTAwMCk6CisgICAgICAgICAgICBmLndyaXRlKCciIixcbicpCisgICAgICAgIGYud3JpdGUoJ10nKQorICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAjIGNvbXBpbGUgJiByZW1vdmUgLnB5IGZpbGUsIHdlIG9ubHkgbmVlZCAucHljIChvciAucHlvKQorICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3InKQorICAgICAgICBweV9jb21waWxlLmNvbXBpbGUoZmlsZW5hbWUpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCisKKyAgICAgICAgIyBuZWVkIHRvIGJlIGFibGUgdG8gbG9hZCBmcm9tIGN1cnJlbnQgZGlyCisgICAgICAgIHN5cy5wYXRoLmFwcGVuZCgnJykKKworICAgICAgICAjIHRoaXMgdXNlZCB0byBjcmFzaAorICAgICAgICBleGVjKCdpbXBvcnQgJyArIG1vZHVsZSkKKworICAgICAgICAjIGNsZWFudXAKKyAgICAgICAgZGVsIHN5cy5wYXRoWy0xXQorICAgICAgICBmb3IgZXh0IGluICdweWMnLCAncHlvJzoKKyAgICAgICAgICAgIGZuYW1lID0gbW9kdWxlICsgb3MuZXh0c2VwICsgZXh0CisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmbmFtZSk6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKGZuYW1lKQorCisgICAgZGVmIHRlc3RfZmFpbGluZ19pbXBvcnRfc3RpY2tzKHNlbGYpOgorICAgICAgICBzb3VyY2UgPSBURVNURk4gKyBvcy5leHRzZXAgKyAicHkiCisgICAgICAgIGYgPSBvcGVuKHNvdXJjZSwgInciKQorICAgICAgICBwcmludCA+PiBmLCAiYSA9IDEvMCIKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgIyBOZXcgaW4gMi40LCB3ZSBzaG91bGRuJ3QgYmUgYWJsZSB0byBpbXBvcnQgdGhhdCBubyBtYXR0ZXIgaG93IG9mdGVuCisgICAgICAgICMgd2UgdHJ5LgorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MuY3VyZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgaSBpbiAxLCAyLCAzOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbW9kID0gX19pbXBvcnRfXyhURVNURk4pCisgICAgICAgICAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgICAgICAgICAgICAgICAgICBpZiBURVNURk4gaW4gc3lzLm1vZHVsZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImRhbWFnZWQgbW9kdWxlIGluIHN5cy5tb2R1bGVzIG9uICVpLiB0cnkiICUgaSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIndhcyBhYmxlIHRvIGltcG9ydCBhIGRhbWFnZWQgbW9kdWxlIG9uICVpLiB0cnkiICUgaSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5wYXRoLnBvcCgwKQorICAgICAgICAgICAgcmVtb3ZlX2ZpbGVzKFRFU1RGTikKKworICAgIGRlZiB0ZXN0X2ZhaWxpbmdfcmVsb2FkKHNlbGYpOgorICAgICAgICAjIEEgZmFpbGluZyByZWxvYWQgc2hvdWxkIGxlYXZlIHRoZSBtb2R1bGUgb2JqZWN0IGluIHN5cy5tb2R1bGVzLgorICAgICAgICBzb3VyY2UgPSBURVNURk4gKyBvcy5leHRzZXAgKyAicHkiCisgICAgICAgIGYgPSBvcGVuKHNvdXJjZSwgInciKQorICAgICAgICBwcmludCA+PiBmLCAiYSA9IDEiCisgICAgICAgIHByaW50ID4+IGYsICJiID0gMiIKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLmN1cmRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbW9kID0gX19pbXBvcnRfXyhURVNURk4pCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oVEVTVEZOIGluIHN5cy5tb2R1bGVzLCAiZXhwZWN0ZWQgbW9kdWxlIGluIHN5cy5tb2R1bGVzIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1vZC5hLCAxLCAibW9kdWxlIGhhcyB3cm9uZyBhdHRyaWJ1dGUgdmFsdWVzIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1vZC5iLCAyLCAibW9kdWxlIGhhcyB3cm9uZyBhdHRyaWJ1dGUgdmFsdWVzIikKKworICAgICAgICAgICAgIyBPbiBXaW5YUCwganVzdCByZXBsYWNpbmcgdGhlIC5weSBmaWxlIHdhc24ndCBlbm91Z2ggdG8KKyAgICAgICAgICAgICMgY29udmluY2UgcmVsb2FkKCkgdG8gcmVwYXJzZSBpdC4gIE1heWJlIHRoZSB0aW1lc3RhbXAgZGlkbid0CisgICAgICAgICAgICAjIG1vdmUgZW5vdWdoLiAgV2UgZm9yY2UgaXQgdG8gZ2V0IHJlcGFyc2VkIGJ5IHJlbW92aW5nIHRoZQorICAgICAgICAgICAgIyBjb21waWxlZCBmaWxlIHRvby4KKyAgICAgICAgICAgIHJlbW92ZV9maWxlcyhURVNURk4pCisKKyAgICAgICAgICAgICMgTm93IGRhbWFnZSB0aGUgbW9kdWxlLgorICAgICAgICAgICAgZiA9IG9wZW4oc291cmNlLCAidyIpCisgICAgICAgICAgICBwcmludCA+PiBmLCAiYSA9IDEwIgorICAgICAgICAgICAgcHJpbnQgPj4gZiwgImIgPSAyMC8vMCIKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgcmVsb2FkLCBtb2QpCisKKyAgICAgICAgICAgICMgQnV0IHdlIHN0aWxsIGV4cGVjdCB0aGUgbW9kdWxlIHRvIGJlIGluIHN5cy5tb2R1bGVzLgorICAgICAgICAgICAgbW9kID0gc3lzLm1vZHVsZXMuZ2V0KFRFU1RGTikKKyAgICAgICAgICAgIHNlbGYuZmFpbElmKG1vZCBpcyBOb25lLCAiZXhwZWN0ZWQgbW9kdWxlIHRvIHN0aWxsIGJlIGluIHN5cy5tb2R1bGVzIikKKworICAgICAgICAgICAgIyBXZSBzaG91bGQgaGF2ZSByZXBsYWNlZCBhIHcvIDEwLCBidXQgdGhlIG9sZCBiIHZhbHVlIHNob3VsZAorICAgICAgICAgICAgIyBzdGljay4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1vZC5hLCAxMCwgIm1vZHVsZSBoYXMgd3JvbmcgYXR0cmlidXRlIHZhbHVlcyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtb2QuYiwgMiwgIm1vZHVsZSBoYXMgd3JvbmcgYXR0cmlidXRlIHZhbHVlcyIpCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5wYXRoLnBvcCgwKQorICAgICAgICAgICAgcmVtb3ZlX2ZpbGVzKFRFU1RGTikKKyAgICAgICAgICAgIGlmIFRFU1RGTiBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbVEVTVEZOXQorCisgICAgZGVmIHRlc3RfaW1wb3J0X25hbWVfYmluZGluZyhzZWxmKToKKyAgICAgICAgIyBpbXBvcnQgeC55LnogYmluZHMgeCBpbiB0aGUgY3VycmVudCBuYW1lc3BhY2UKKyAgICAgICAgaW1wb3J0IHRlc3QgYXMgeAorICAgICAgICBpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQKKyAgICAgICAgc2VsZi5hc3NlcnRfKHggaXMgdGVzdCwgeC5fX25hbWVfXykKKyAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIodGVzdC50ZXN0X3N1cHBvcnQsICJfX2ZpbGVfXyIpKQorCisgICAgICAgICMgaW1wb3J0IHgueS56IGFzIHcgYmluZHMgeiBhcyB3CisgICAgICAgIGltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydCBhcyB5CisgICAgICAgIHNlbGYuYXNzZXJ0Xyh5IGlzIHRlc3QudGVzdF9zdXBwb3J0LCB5Ll9fbmFtZV9fKQorCisgICAgZGVmIHRlc3RfaW1wb3J0X2luaXRsZXNzX2RpcmVjdG9yeV93YXJuaW5nKHNlbGYpOgorICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgb2xkZmlsdGVycyA9IHdhcm5pbmdzLmZpbHRlcnNbOl0KKyAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdlcnJvcicsIEltcG9ydFdhcm5pbmcpOworICAgICAgICB0cnk6CisgICAgICAgICAgICAjIEp1c3QgYSByYW5kb20gbm9uLXBhY2thZ2UgZGlyZWN0b3J5IHdlIGFsd2F5cyBleHBlY3QgdG8gYmUKKyAgICAgICAgICAgICMgc29tZXdoZXJlIGluIHN5cy5wYXRoLi4uCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRXYXJuaW5nLCBfX2ltcG9ydF9fLCAic2l0ZS1wYWNrYWdlcyIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJzID0gb2xkZmlsdGVycworCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgcnVuX3VuaXR0ZXN0KEltcG9ydFRlc3QpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weSBiL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQppbmRleCBlNTk0NmU5Li4wNzFlNTIxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CkBAIC0xODAsNyArMTgwLDE4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRjb21tZW50cyhtb2QuU3R1cGlkR2l0KSwgJyMgbGluZSAyMFxuJykKIAogICAgIGRlZiB0ZXN0X2dldG1vZHVsZShzZWxmKToKKyAgICAgICAgIyBDaGVjayBhY3R1YWwgbW9kdWxlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRtb2R1bGUobW9kKSwgbW9kKQorICAgICAgICAjIENoZWNrIGNsYXNzICh1c2VzIF9fbW9kdWxlX18gYXR0cmlidXRlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0bW9kdWxlKG1vZC5TdHVwaWRHaXQpLCBtb2QpCisgICAgICAgICMgQ2hlY2sgYSBtZXRob2QgKG5vIF9fbW9kdWxlX18gYXR0cmlidXRlLCBmYWxscyBiYWNrIHRvIGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0bW9kdWxlKG1vZC5TdHVwaWRHaXQuYWJ1c2UpLCBtb2QpCisgICAgICAgICMgRG8gaXQgYWdhaW4gKGNoZWNrIHRoZSBjYWNoaW5nIGlzbid0IGJyb2tlbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldG1vZHVsZShtb2QuU3R1cGlkR2l0LmFidXNlKSwgbW9kKQorICAgICAgICAjIENoZWNrIGEgYnVpbHRpbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0bW9kdWxlKHN0ciksIHN5cy5tb2R1bGVzWyJfX2J1aWx0aW5fXyJdKQorICAgICAgICAjIENoZWNrIGZpbGVuYW1lIG92ZXJyaWRlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRtb2R1bGUoTm9uZSwgbW9kZmlsZSksIG1vZCkKIAogICAgIGRlZiB0ZXN0X2dldHNvdXJjZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRTb3VyY2VFcXVhbChnaXQuYWJ1c2UsIDI5LCAzOSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5IGIvTGliL3Rlc3QvdGVzdF9pdGVydG9vbHMucHkKaW5kZXggOGY4ZmM3My4uOGUxMTE4YSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pdGVydG9vbHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pdGVydG9vbHMucHkKQEAgLTYxLDYgKzYxLDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjKSwgJ2NvdW50KDMpJykKICAgICAgICAgYy5uZXh0KCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGMpLCAnY291bnQoNCknKQorICAgICAgICBjID0gY291bnQoLTkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjKSwgJ2NvdW50KC05KScpCisgICAgICAgIGMubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5uZXh0KCksIC04KQogCiAgICAgZGVmIHRlc3RfY3ljbGUoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSgxMCwgY3ljbGUoJ2FiYycpKSwgbGlzdCgnYWJjYWJjYWJjYScpKQpAQCAtMzc1LDYgKzM3OSw3IEBACiAKICAgICAgICAgIyB0ZXN0IHZhbHVlcyBvZiBuCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdGVlLCAnYWJjJywgJ2ludmFsaWQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0ZWUsIFtdLCAtMSkKICAgICAgICAgZm9yIG4gaW4geHJhbmdlKDUpOgogICAgICAgICAgICAgcmVzdWx0ID0gdGVlKCdhYmMnLCBuKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJlc3VsdCksIHR1cGxlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9sb25nLnB5IGIvTGliL3Rlc3QvdGVzdF9sb25nLnB5CmluZGV4IDkyZmU3YTEuLmUwYzc4MWYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbG9uZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2xvbmcucHkKQEAgLTI0NywxNyArMjQ3LDIzIEBACiAgICAgICAgICAgICAibG9uZygtc3lzLm1heGludC0xKSAhPSAtc3lzLm1heGludC0xIikKIAogICAgICAgICAjIGxvbmcgLT4gaW50IHNob3VsZCBub3QgZmFpbCBmb3IgaHVnZXBvc19hc2xvbmcgb3IgaHVnZW5lZ19hc2xvbmcKKyAgICAgICAgeCA9IGludChodWdlcG9zX2FzbG9uZykKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoaHVnZXBvc19hc2xvbmcpLCBodWdlcG9zLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBodWdlcG9zLAogICAgICAgICAgICAgICAgICAgImNvbnZlcnRpbmcgc3lzLm1heGludCB0byBsb25nIGFuZCBiYWNrIHRvIGludCBmYWlscyIpCiAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJpbnQobG9uZyhzeXMubWF4aW50KSkgb3ZlcmZsb3dlZCEiKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh4LCBpbnQpOgorICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgiaW50KGxvbmcoc3lzLm1heGludCkpIHNob3VsZCBoYXZlIHJldHVybmVkIGludCIpCisgICAgICAgIHggPSBpbnQoaHVnZW5lZ19hc2xvbmcpCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGh1Z2VuZWdfYXNsb25nKSwgaHVnZW5lZywKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgaHVnZW5lZywKICAgICAgICAgICAgICAgICAgICJjb252ZXJ0aW5nIC1zeXMubWF4aW50LTEgdG8gbG9uZyBhbmQgYmFjayB0byBpbnQgZmFpbHMiKQogICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKICAgICAgICAgICAgIHNlbGYuZmFpbCgiaW50KGxvbmcoLXN5cy5tYXhpbnQtMSkpIG92ZXJmbG93ZWQhIikKLQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh4LCBpbnQpOgorICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgiaW50KGxvbmcoLXN5cy5tYXhpbnQtMSkpIHNob3VsZCBoYXZlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJldHVybmVkIGludCIpCiAgICAgICAgICMgYnV0IGxvbmcgLT4gaW50IHNob3VsZCBvdmVyZmxvdyBmb3IgaHVnZXBvcysxIGFuZCBodWdlbmVnLTEKICAgICAgICAgeCA9IGh1Z2Vwb3NfYXNsb25nICsgMQogICAgICAgICB0cnk6CkBAIC0yODIsNiArMjg4LDE3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKHkpIGlzIGxvbmcsCiAgICAgICAgICAgICAib3ZlcmZsb3dpbmcgaW50IGNvbnZlcnNpb24gbXVzdCByZXR1cm4gbG9uZyBub3QgbG9uZyBzdWJ0eXBlIikKIAorICAgICAgICAjIGxvbmcgLT4gUHlfc3NpemVfdCBjb252ZXJzaW9uCisgICAgICAgIGNsYXNzIFgob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldHNsaWNlX18oc2VsZiwgaSwgaik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGksIGoKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgoKVstNUw6N0xdLCAoLTUsIDcpKQorICAgICAgICAjIHVzZSB0aGUgY2xhbXBpbmcgZWZmZWN0IHRvIHRlc3QgdGhlIHNtYWxsZXN0IGFuZCBsYXJnZXN0IGxvbmdzCisgICAgICAgICMgdGhhdCBmaXQgYSBQeV9zc2l6ZV90CisgICAgICAgIHNsaWNlbWluLCBzbGljZW1heCA9IFgoKVstMkwqKjEwMDoyTCoqMTAwXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgoKVtzbGljZW1pbjpzbGljZW1heF0sIChzbGljZW1pbiwgc2xpY2VtYXgpKQorCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRlc3RzIG9mIGF1dG8gaW50LT5sb25nIGNvbnZlcnNpb24KIAogICAgIGRlZiB0ZXN0X2F1dG9fb3ZlcmZsb3coc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21haWxib3gucHkgYi9MaWIvdGVzdC90ZXN0X21haWxib3gucHkKaW5kZXggMTgzNzMwNi4uZGVmNThjYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tYWlsYm94LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weQpAQCAtNjY2LDYgKzY2NiwxOSBAQAogICAgICAgICBzZWxmLl9ib3gubG9jaygpCiAgICAgICAgIHNlbGYuX2JveC51bmxvY2soKQogCisgICAgZGVmIHRlc3RfZm9sZGVyIChzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciBidWcgIzE1Njk3OTA6IHZlcmlmeSB0aGF0IGZvbGRlcnMgcmV0dXJuZWQgYnkgLmdldF9mb2xkZXIoKQorICAgICAgICAjIHVzZSB0aGUgc2FtZSBmYWN0b3J5IGZ1bmN0aW9uLgorICAgICAgICBkZWYgZHVtbXlfZmFjdG9yeSAocyk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBib3ggPSBzZWxmLl9mYWN0b3J5KHNlbGYuX3BhdGgsIGZhY3Rvcnk9ZHVtbXlfZmFjdG9yeSkKKyAgICAgICAgZm9sZGVyID0gYm94LmFkZF9mb2xkZXIoJ2ZvbGRlcjEnKQorICAgICAgICBzZWxmLmFzc2VydF8oZm9sZGVyLl9mYWN0b3J5IGlzIGR1bW15X2ZhY3RvcnkpCisgICAgICAgIAorICAgICAgICBmb2xkZXIxX2FsaWFzID0gYm94LmdldF9mb2xkZXIoJ2ZvbGRlcjEnKQorICAgICAgICBzZWxmLmFzc2VydF8oZm9sZGVyMV9hbGlhcy5fZmFjdG9yeSBpcyBkdW1teV9mYWN0b3J5KQorCisgICAgICAgIAogCiBjbGFzcyBfVGVzdE1ib3hNTURGKFRlc3RNYWlsYm94KToKIApAQCAtNzQwLDYgKzc1MywyMiBAQAogICAgICAgICBzZWxmLl9ib3gubG9jaygpCiAgICAgICAgIHNlbGYuX2JveC51bmxvY2soKQogCisgICAgZGVmIHRlc3RfcmVsb2NrKHNlbGYpOgorICAgICAgICAjIFRlc3QgY2FzZSBmb3IgYnVnICMxNTc1NTA2OiB0aGUgbWFpbGJveCBjbGFzcyB3YXMgbG9ja2luZyB0aGUKKyAgICAgICAgIyB3cm9uZyBmaWxlIG9iamVjdCBpbiBpdHMgZmx1c2goKSBtZXRob2QuCisgICAgICAgIG1zZyA9ICJTdWJqZWN0OiBzdWJcblxuYm9keVxuIgorICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChtc2cpCisgICAgICAgIHNlbGYuX2JveC5mbHVzaCgpCisgICAgICAgIHNlbGYuX2JveC5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5fYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoKQorICAgICAgICBzZWxmLl9ib3gubG9jaygpCisgICAgICAgIGtleTIgPSBzZWxmLl9ib3guYWRkKG1zZykKKyAgICAgICAgc2VsZi5fYm94LmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5fbG9ja2VkKQorICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQorCisKIAogY2xhc3MgVGVzdE1ib3goX1Rlc3RNYm94TU1ERik6CiAKQEAgLTc2Niw3ICs3OTUsMTEgQEAKIAogICAgIGRlZiB0ZXN0X2dldF9mb2xkZXIoc2VsZik6CiAgICAgICAgICMgT3BlbiBmb2xkZXJzCi0gICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCdmb28uYmFyJykKKyAgICAgICAgZGVmIGR1bW15X2ZhY3RvcnkgKHMpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgc2VsZi5fYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoLCBkdW1teV9mYWN0b3J5KQorICAgICAgICAKKyAgICAgICAgbmV3X2ZvbGRlciA9IHNlbGYuX2JveC5hZGRfZm9sZGVyKCdmb28uYmFyJykKICAgICAgICAgZm9sZGVyMCA9IHNlbGYuX2JveC5nZXRfZm9sZGVyKCdmb28uYmFyJykKICAgICAgICAgZm9sZGVyMC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAnYmFyJykKICAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICdmb28uYmFyJykpKQpAQCAtNzc0LDYgKzgwNywxMSBAQAogICAgICAgICBzZWxmLmFzc2VydF8oZm9sZGVyMS5nZXRfc3RyaW5nKGZvbGRlcjEua2V5cygpWzBdKSA9PSBcCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdiYXInKQogCisgICAgICAgICMgVGVzdCBmb3IgYnVnICMxNTY5NzkwOiB2ZXJpZnkgdGhhdCBmb2xkZXJzIHJldHVybmVkIGJ5IC5nZXRfZm9sZGVyKCkKKyAgICAgICAgIyB1c2UgdGhlIHNhbWUgZmFjdG9yeSBmdW5jdGlvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRfKG5ld19mb2xkZXIuX2ZhY3RvcnkgaXMgc2VsZi5fYm94Ll9mYWN0b3J5KQorICAgICAgICBzZWxmLmFzc2VydF8oZm9sZGVyMC5fZmFjdG9yeSBpcyBzZWxmLl9ib3guX2ZhY3RvcnkpCisKICAgICBkZWYgdGVzdF9hZGRfYW5kX3JlbW92ZV9mb2xkZXJzKHNlbGYpOgogICAgICAgICAjIERlbGV0ZSBmb2xkZXJzCiAgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCdvbmUnKQpAQCAtODQyLDYgKzg4MCwyMSBAQAogICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PQogICAgICAgICAgICAgICAgICAgICAgeydmb28nOlsxLCAyLCAzXSwgJ3Vuc2Vlbic6WzFdLCAnYmFyJzpbM10sICdyZXBsaWVkJzpbM119KQogCisgICAgICAgICMgVGVzdCBjYXNlIGZvciBwYWNraW5nIHdoaWxlIGhvbGRpbmcgdGhlIG1haWxib3ggbG9ja2VkLgorICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChtc2cxKQorICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChtc2cxKQorICAgICAgICBrZXkyID0gc2VsZi5fYm94LmFkZChtc2cxKQorICAgICAgICBrZXkzID0gc2VsZi5fYm94LmFkZChtc2cxKQorCisgICAgICAgIHNlbGYuX2JveC5yZW1vdmUoa2V5MCkKKyAgICAgICAgc2VsZi5fYm94LnJlbW92ZShrZXkyKQorICAgICAgICBzZWxmLl9ib3gubG9jaygpCisgICAgICAgIHNlbGYuX2JveC5wYWNrKCkKKyAgICAgICAgc2VsZi5fYm94LnVubG9jaygpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3NlcXVlbmNlcygpID09CisgICAgICAgICAgICAgICAgICAgICB7J2Zvbyc6WzEsIDIsIDMsIDQsIDVdLAorICAgICAgICAgICAgICAgICAgICAgICd1bnNlZW4nOlsxXSwgJ2Jhcic6WzNdLCAncmVwbGllZCc6WzNdfSkKKyAgICAgICAgCiAgICAgZGVmIF9nZXRfbG9ja19wYXRoKHNlbGYpOgogICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICcubWhfc2VxdWVuY2VzLmxvY2snKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21hdGgucHkgYi9MaWIvdGVzdC90ZXN0X21hdGgucHkKaW5kZXggYTA5MjI2NS4uYTQ1ZmMzNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tYXRoLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWF0aC5weQpAQCAtMSwyMDggKzEsMjQxIEBACiAjIFB5dGhvbiB0ZXN0IHNldCAtLSBtYXRoIG1vZHVsZQogIyBYWFhYIFNob3VsZCBub3QgZG8gdGVzdHMgYXJvdW5kIHplcm8gb25seQogCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0RmFpbGVkLCB2ZXJib3NlCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIHZlcmJvc2UKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG1hdGgKIAogc2Vwcz0nMWUtMDUnCiBlcHMgPSBldmFsKHNlcHMpCi1wcmludCAnbWF0aCBtb2R1bGUsIHRlc3Rpbmcgd2l0aCBlcHMnLCBzZXBzCi1pbXBvcnQgbWF0aAogCi1kZWYgdGVzdGl0KG5hbWUsIHZhbHVlLCBleHBlY3RlZCk6Ci0gICAgaWYgYWJzKHZhbHVlLWV4cGVjdGVkKSA+IGVwczoKLSAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgJyVzIHJldHVybmVkICVmLCBleHBlY3RlZCAlZiclXAotICAgICAgICAgICAgICAobmFtZSwgdmFsdWUsIGV4cGVjdGVkKQorY2xhc3MgTWF0aFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotcHJpbnQgJ2NvbnN0YW50cycKLXRlc3RpdCgncGknLCBtYXRoLnBpLCAzLjE0MTU5MjYpCi10ZXN0aXQoJ2UnLCBtYXRoLmUsIDIuNzE4MjgxOCkKKyAgICBkZWYgZnRlc3Qoc2VsZiwgbmFtZSwgdmFsdWUsIGV4cGVjdGVkKToKKyAgICAgICAgaWYgYWJzKHZhbHVlLWV4cGVjdGVkKSA+IGVwczoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnJXMgcmV0dXJuZWQgJWYsIGV4cGVjdGVkICVmJyVcCisgICAgICAgICAgICAgICAgICAgICAgKG5hbWUsIHZhbHVlLCBleHBlY3RlZCkpCiAKLXByaW50ICdhY29zJwotdGVzdGl0KCdhY29zKC0xKScsIG1hdGguYWNvcygtMSksIG1hdGgucGkpCi10ZXN0aXQoJ2Fjb3MoMCknLCBtYXRoLmFjb3MoMCksIG1hdGgucGkvMikKLXRlc3RpdCgnYWNvcygxKScsIG1hdGguYWNvcygxKSwgMCkKKyAgICBkZWYgdGVzdENvbnN0YW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5mdGVzdCgncGknLCBtYXRoLnBpLCAzLjE0MTU5MjYpCisgICAgICAgIHNlbGYuZnRlc3QoJ2UnLCBtYXRoLmUsIDIuNzE4MjgxOCkKIAotcHJpbnQgJ2FzaW4nCi10ZXN0aXQoJ2FzaW4oLTEpJywgbWF0aC5hc2luKC0xKSwgLW1hdGgucGkvMikKLXRlc3RpdCgnYXNpbigwKScsIG1hdGguYXNpbigwKSwgMCkKLXRlc3RpdCgnYXNpbigxKScsIG1hdGguYXNpbigxKSwgbWF0aC5waS8yKQorICAgIGRlZiB0ZXN0QWNvcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmFjb3MpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Fjb3MoLTEpJywgbWF0aC5hY29zKC0xKSwgbWF0aC5waSkKKyAgICAgICAgc2VsZi5mdGVzdCgnYWNvcygwKScsIG1hdGguYWNvcygwKSwgbWF0aC5waS8yKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhY29zKDEpJywgbWF0aC5hY29zKDEpLCAwKQogCi1wcmludCAnYXRhbicKLXRlc3RpdCgnYXRhbigtMSknLCBtYXRoLmF0YW4oLTEpLCAtbWF0aC5waS80KQotdGVzdGl0KCdhdGFuKDApJywgbWF0aC5hdGFuKDApLCAwKQotdGVzdGl0KCdhdGFuKDEpJywgbWF0aC5hdGFuKDEpLCBtYXRoLnBpLzQpCisgICAgZGVmIHRlc3RBc2luKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguYXNpbikKKyAgICAgICAgc2VsZi5mdGVzdCgnYXNpbigtMSknLCBtYXRoLmFzaW4oLTEpLCAtbWF0aC5waS8yKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhc2luKDApJywgbWF0aC5hc2luKDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhc2luKDEpJywgbWF0aC5hc2luKDEpLCBtYXRoLnBpLzIpCiAKLXByaW50ICdhdGFuMicKLXRlc3RpdCgnYXRhbjIoLTEsIDApJywgbWF0aC5hdGFuMigtMSwgMCksIC1tYXRoLnBpLzIpCi10ZXN0aXQoJ2F0YW4yKC0xLCAxKScsIG1hdGguYXRhbjIoLTEsIDEpLCAtbWF0aC5waS80KQotdGVzdGl0KCdhdGFuMigwLCAxKScsIG1hdGguYXRhbjIoMCwgMSksIDApCi10ZXN0aXQoJ2F0YW4yKDEsIDEpJywgbWF0aC5hdGFuMigxLCAxKSwgbWF0aC5waS80KQotdGVzdGl0KCdhdGFuMigxLCAwKScsIG1hdGguYXRhbjIoMSwgMCksIG1hdGgucGkvMikKKyAgICBkZWYgdGVzdEF0YW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5hdGFuKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuKC0xKScsIG1hdGguYXRhbigtMSksIC1tYXRoLnBpLzQpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4oMCknLCBtYXRoLmF0YW4oMCksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4oMSknLCBtYXRoLmF0YW4oMSksIG1hdGgucGkvNCkKIAotcHJpbnQgJ2NlaWwnCi10ZXN0aXQoJ2NlaWwoMC41KScsIG1hdGguY2VpbCgwLjUpLCAxKQotdGVzdGl0KCdjZWlsKDEuMCknLCBtYXRoLmNlaWwoMS4wKSwgMSkKLXRlc3RpdCgnY2VpbCgxLjUpJywgbWF0aC5jZWlsKDEuNSksIDIpCi10ZXN0aXQoJ2NlaWwoLTAuNSknLCBtYXRoLmNlaWwoLTAuNSksIDApCi10ZXN0aXQoJ2NlaWwoLTEuMCknLCBtYXRoLmNlaWwoLTEuMCksIC0xKQotdGVzdGl0KCdjZWlsKC0xLjUpJywgbWF0aC5jZWlsKC0xLjUpLCAtMSkKKyAgICBkZWYgdGVzdEF0YW4yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguYXRhbjIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKC0xLCAwKScsIG1hdGguYXRhbjIoLTEsIDApLCAtbWF0aC5waS8yKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigtMSwgMSknLCBtYXRoLmF0YW4yKC0xLCAxKSwgLW1hdGgucGkvNCkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoMCwgMSknLCBtYXRoLmF0YW4yKDAsIDEpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigxLCAxKScsIG1hdGguYXRhbjIoMSwgMSksIG1hdGgucGkvNCkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoMSwgMCknLCBtYXRoLmF0YW4yKDEsIDApLCBtYXRoLnBpLzIpCiAKLXByaW50ICdjb3MnCi10ZXN0aXQoJ2NvcygtcGkvMiknLCBtYXRoLmNvcygtbWF0aC5waS8yKSwgMCkKLXRlc3RpdCgnY29zKDApJywgbWF0aC5jb3MoMCksIDEpCi10ZXN0aXQoJ2NvcyhwaS8yKScsIG1hdGguY29zKG1hdGgucGkvMiksIDApCi10ZXN0aXQoJ2NvcyhwaSknLCBtYXRoLmNvcyhtYXRoLnBpKSwgLTEpCisgICAgZGVmIHRlc3RDZWlsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguY2VpbCkKKyAgICAgICAgc2VsZi5mdGVzdCgnY2VpbCgwLjUpJywgbWF0aC5jZWlsKDAuNSksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2NlaWwoMS4wKScsIG1hdGguY2VpbCgxLjApLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjZWlsKDEuNSknLCBtYXRoLmNlaWwoMS41KSwgMikKKyAgICAgICAgc2VsZi5mdGVzdCgnY2VpbCgtMC41KScsIG1hdGguY2VpbCgtMC41KSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnY2VpbCgtMS4wKScsIG1hdGguY2VpbCgtMS4wKSwgLTEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2NlaWwoLTEuNSknLCBtYXRoLmNlaWwoLTEuNSksIC0xKQogCi1wcmludCAnY29zaCcKLXRlc3RpdCgnY29zaCgwKScsIG1hdGguY29zaCgwKSwgMSkKLXRlc3RpdCgnY29zaCgyKS0yKmNvc2goMSkqKjInLCBtYXRoLmNvc2goMiktMiptYXRoLmNvc2goMSkqKjIsIC0xKSAjIFRoYW5rcyB0byBMYW1iZXJ0CisgICAgZGVmIHRlc3RDb3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5jb3MpCisgICAgICAgIHNlbGYuZnRlc3QoJ2NvcygtcGkvMiknLCBtYXRoLmNvcygtbWF0aC5waS8yKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnY29zKDApJywgbWF0aC5jb3MoMCksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2NvcyhwaS8yKScsIG1hdGguY29zKG1hdGgucGkvMiksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2NvcyhwaSknLCBtYXRoLmNvcyhtYXRoLnBpKSwgLTEpCiAKLXByaW50ICdkZWdyZWVzJwotdGVzdGl0KCdkZWdyZWVzKHBpKScsIG1hdGguZGVncmVlcyhtYXRoLnBpKSwgMTgwLjApCi10ZXN0aXQoJ2RlZ3JlZXMocGkvMiknLCBtYXRoLmRlZ3JlZXMobWF0aC5waS8yKSwgOTAuMCkKLXRlc3RpdCgnZGVncmVlcygtcGkvNCknLCBtYXRoLmRlZ3JlZXMoLW1hdGgucGkvNCksIC00NS4wKQorICAgIGRlZiB0ZXN0Q29zaChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmNvc2gpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Nvc2goMCknLCBtYXRoLmNvc2goMCksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Nvc2goMiktMipjb3NoKDEpKioyJywgbWF0aC5jb3NoKDIpLTIqbWF0aC5jb3NoKDEpKioyLCAtMSkgIyBUaGFua3MgdG8gTGFtYmVydAogCi1wcmludCAnZXhwJwotdGVzdGl0KCdleHAoLTEpJywgbWF0aC5leHAoLTEpLCAxL21hdGguZSkKLXRlc3RpdCgnZXhwKDApJywgbWF0aC5leHAoMCksIDEpCi10ZXN0aXQoJ2V4cCgxKScsIG1hdGguZXhwKDEpLCBtYXRoLmUpCisgICAgZGVmIHRlc3REZWdyZWVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguZGVncmVlcykKKyAgICAgICAgc2VsZi5mdGVzdCgnZGVncmVlcyhwaSknLCBtYXRoLmRlZ3JlZXMobWF0aC5waSksIDE4MC4wKQorICAgICAgICBzZWxmLmZ0ZXN0KCdkZWdyZWVzKHBpLzIpJywgbWF0aC5kZWdyZWVzKG1hdGgucGkvMiksIDkwLjApCisgICAgICAgIHNlbGYuZnRlc3QoJ2RlZ3JlZXMoLXBpLzQpJywgbWF0aC5kZWdyZWVzKC1tYXRoLnBpLzQpLCAtNDUuMCkKIAotcHJpbnQgJ2ZhYnMnCi10ZXN0aXQoJ2ZhYnMoLTEpJywgbWF0aC5mYWJzKC0xKSwgMSkKLXRlc3RpdCgnZmFicygwKScsIG1hdGguZmFicygwKSwgMCkKLXRlc3RpdCgnZmFicygxKScsIG1hdGguZmFicygxKSwgMSkKKyAgICBkZWYgdGVzdEV4cChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmV4cCkKKyAgICAgICAgc2VsZi5mdGVzdCgnZXhwKC0xKScsIG1hdGguZXhwKC0xKSwgMS9tYXRoLmUpCisgICAgICAgIHNlbGYuZnRlc3QoJ2V4cCgwKScsIG1hdGguZXhwKDApLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdleHAoMSknLCBtYXRoLmV4cCgxKSwgbWF0aC5lKQogCi1wcmludCAnZmxvb3InCi10ZXN0aXQoJ2Zsb29yKDAuNSknLCBtYXRoLmZsb29yKDAuNSksIDApCi10ZXN0aXQoJ2Zsb29yKDEuMCknLCBtYXRoLmZsb29yKDEuMCksIDEpCi10ZXN0aXQoJ2Zsb29yKDEuNSknLCBtYXRoLmZsb29yKDEuNSksIDEpCi10ZXN0aXQoJ2Zsb29yKC0wLjUpJywgbWF0aC5mbG9vcigtMC41KSwgLTEpCi10ZXN0aXQoJ2Zsb29yKC0xLjApJywgbWF0aC5mbG9vcigtMS4wKSwgLTEpCi10ZXN0aXQoJ2Zsb29yKC0xLjUpJywgbWF0aC5mbG9vcigtMS41KSwgLTIpCisgICAgZGVmIHRlc3RGYWJzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguZmFicykKKyAgICAgICAgc2VsZi5mdGVzdCgnZmFicygtMSknLCBtYXRoLmZhYnMoLTEpLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmYWJzKDApJywgbWF0aC5mYWJzKDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmYWJzKDEpJywgbWF0aC5mYWJzKDEpLCAxKQogCi1wcmludCAnZm1vZCcKLXRlc3RpdCgnZm1vZCgxMCwxKScsIG1hdGguZm1vZCgxMCwxKSwgMCkKLXRlc3RpdCgnZm1vZCgxMCwwLjUpJywgbWF0aC5mbW9kKDEwLDAuNSksIDApCi10ZXN0aXQoJ2Ztb2QoMTAsMS41KScsIG1hdGguZm1vZCgxMCwxLjUpLCAxKQotdGVzdGl0KCdmbW9kKC0xMCwxKScsIG1hdGguZm1vZCgtMTAsMSksIDApCi10ZXN0aXQoJ2Ztb2QoLTEwLDAuNSknLCBtYXRoLmZtb2QoLTEwLDAuNSksIDApCi10ZXN0aXQoJ2Ztb2QoLTEwLDEuNSknLCBtYXRoLmZtb2QoLTEwLDEuNSksIC0xKQorICAgIGRlZiB0ZXN0Rmxvb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5mbG9vcikKKyAgICAgICAgc2VsZi5mdGVzdCgnZmxvb3IoMC41KScsIG1hdGguZmxvb3IoMC41KSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnZmxvb3IoMS4wKScsIG1hdGguZmxvb3IoMS4wKSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnZmxvb3IoMS41KScsIG1hdGguZmxvb3IoMS41KSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnZmxvb3IoLTAuNSknLCBtYXRoLmZsb29yKC0wLjUpLCAtMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnZmxvb3IoLTEuMCknLCBtYXRoLmZsb29yKC0xLjApLCAtMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnZmxvb3IoLTEuNSknLCBtYXRoLmZsb29yKC0xLjUpLCAtMikKIAotcHJpbnQgJ2ZyZXhwJwotZGVmIHRlc3RmcmV4cChuYW1lLCAobWFudCwgZXhwKSwgKGVtYW50LCBlZXhwKSk6Ci0gICAgaWYgYWJzKG1hbnQtZW1hbnQpID4gZXBzIG9yIGV4cCAhPSBlZXhwOgotICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAnJXMgcmV0dXJuZWQgJXIsIGV4cGVjdGVkICVyJyVcCi0gICAgICAgICAgICAgIChuYW1lLCAobWFudCwgZXhwKSwgKGVtYW50LGVleHApKQorICAgIGRlZiB0ZXN0Rm1vZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmZtb2QpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Ztb2QoMTAsMSknLCBtYXRoLmZtb2QoMTAsMSksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2Ztb2QoMTAsMC41KScsIG1hdGguZm1vZCgxMCwwLjUpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbW9kKDEwLDEuNSknLCBtYXRoLmZtb2QoMTAsMS41KSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnZm1vZCgtMTAsMSknLCBtYXRoLmZtb2QoLTEwLDEpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbW9kKC0xMCwwLjUpJywgbWF0aC5mbW9kKC0xMCwwLjUpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbW9kKC0xMCwxLjUpJywgbWF0aC5mbW9kKC0xMCwxLjUpLCAtMSkKIAotdGVzdGZyZXhwKCdmcmV4cCgtMSknLCBtYXRoLmZyZXhwKC0xKSwgKC0wLjUsIDEpKQotdGVzdGZyZXhwKCdmcmV4cCgwKScsIG1hdGguZnJleHAoMCksICgwLCAwKSkKLXRlc3RmcmV4cCgnZnJleHAoMSknLCBtYXRoLmZyZXhwKDEpLCAoMC41LCAxKSkKLXRlc3RmcmV4cCgnZnJleHAoMiknLCBtYXRoLmZyZXhwKDIpLCAoMC41LCAyKSkKKyAgICBkZWYgdGVzdEZyZXhwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguZnJleHApCiAKLXByaW50ICdoeXBvdCcKLXRlc3RpdCgnaHlwb3QoMCwwKScsIG1hdGguaHlwb3QoMCwwKSwgMCkKLXRlc3RpdCgnaHlwb3QoMyw0KScsIG1hdGguaHlwb3QoMyw0KSwgNSkKKyAgICAgICAgZGVmIHRlc3RmcmV4cChuYW1lLCAobWFudCwgZXhwKSwgKGVtYW50LCBlZXhwKSk6CisgICAgICAgICAgICBpZiBhYnMobWFudC1lbWFudCkgPiBlcHMgb3IgZXhwICE9IGVleHA6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCclcyByZXR1cm5lZCAlciwgZXhwZWN0ZWQgJXInJVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWUsIChtYW50LCBleHApLCAoZW1hbnQsZWV4cCkpKQogCi1wcmludCAnbGRleHAnCi10ZXN0aXQoJ2xkZXhwKDAsMSknLCBtYXRoLmxkZXhwKDAsMSksIDApCi10ZXN0aXQoJ2xkZXhwKDEsMSknLCBtYXRoLmxkZXhwKDEsMSksIDIpCi10ZXN0aXQoJ2xkZXhwKDEsLTEpJywgbWF0aC5sZGV4cCgxLC0xKSwgMC41KQotdGVzdGl0KCdsZGV4cCgtMSwxKScsIG1hdGgubGRleHAoLTEsMSksIC0yKQorICAgICAgICB0ZXN0ZnJleHAoJ2ZyZXhwKC0xKScsIG1hdGguZnJleHAoLTEpLCAoLTAuNSwgMSkpCisgICAgICAgIHRlc3RmcmV4cCgnZnJleHAoMCknLCBtYXRoLmZyZXhwKDApLCAoMCwgMCkpCisgICAgICAgIHRlc3RmcmV4cCgnZnJleHAoMSknLCBtYXRoLmZyZXhwKDEpLCAoMC41LCAxKSkKKyAgICAgICAgdGVzdGZyZXhwKCdmcmV4cCgyKScsIG1hdGguZnJleHAoMiksICgwLjUsIDIpKQogCi1wcmludCAnbG9nJwotdGVzdGl0KCdsb2coMS9lKScsIG1hdGgubG9nKDEvbWF0aC5lKSwgLTEpCi10ZXN0aXQoJ2xvZygxKScsIG1hdGgubG9nKDEpLCAwKQotdGVzdGl0KCdsb2coZSknLCBtYXRoLmxvZyhtYXRoLmUpLCAxKQotdGVzdGl0KCdsb2coMzIsMiknLCBtYXRoLmxvZygzMiwyKSwgNSkKLXRlc3RpdCgnbG9nKDEwKio0MCwgMTApJywgbWF0aC5sb2coMTAqKjQwLCAxMCksIDQwKQotdGVzdGl0KCdsb2coMTAqKjQwLCAxMCoqMjApJywgbWF0aC5sb2coMTAqKjQwLCAxMCoqMjApLCAyKQorICAgIGRlZiB0ZXN0SHlwb3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5oeXBvdCkKKyAgICAgICAgc2VsZi5mdGVzdCgnaHlwb3QoMCwwKScsIG1hdGguaHlwb3QoMCwwKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnaHlwb3QoMyw0KScsIG1hdGguaHlwb3QoMyw0KSwgNSkKIAotcHJpbnQgJ2xvZzEwJwotdGVzdGl0KCdsb2cxMCgwLjEpJywgbWF0aC5sb2cxMCgwLjEpLCAtMSkKLXRlc3RpdCgnbG9nMTAoMSknLCBtYXRoLmxvZzEwKDEpLCAwKQotdGVzdGl0KCdsb2cxMCgxMCknLCBtYXRoLmxvZzEwKDEwKSwgMSkKKyAgICBkZWYgdGVzdExkZXhwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgubGRleHApCisgICAgICAgIHNlbGYuZnRlc3QoJ2xkZXhwKDAsMSknLCBtYXRoLmxkZXhwKDAsMSksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2xkZXhwKDEsMSknLCBtYXRoLmxkZXhwKDEsMSksIDIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2xkZXhwKDEsLTEpJywgbWF0aC5sZGV4cCgxLC0xKSwgMC41KQorICAgICAgICBzZWxmLmZ0ZXN0KCdsZGV4cCgtMSwxKScsIG1hdGgubGRleHAoLTEsMSksIC0yKQogCi1wcmludCAnbW9kZicKLWRlZiB0ZXN0bW9kZihuYW1lLCAodjEsIHYyKSwgKGUxLCBlMikpOgotICAgIGlmIGFicyh2MS1lMSkgPiBlcHMgb3IgYWJzKHYyLWUyKToKLSAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgJyVzIHJldHVybmVkICVyLCBleHBlY3RlZCAlciclXAotICAgICAgICAgICAgICAobmFtZSwgKHYxLHYyKSwgKGUxLGUyKSkKKyAgICBkZWYgdGVzdExvZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmxvZykKKyAgICAgICAgc2VsZi5mdGVzdCgnbG9nKDEvZSknLCBtYXRoLmxvZygxL21hdGguZSksIC0xKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsb2coMSknLCBtYXRoLmxvZygxKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnbG9nKGUpJywgbWF0aC5sb2cobWF0aC5lKSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnbG9nKDMyLDIpJywgbWF0aC5sb2coMzIsMiksIDUpCisgICAgICAgIHNlbGYuZnRlc3QoJ2xvZygxMCoqNDAsIDEwKScsIG1hdGgubG9nKDEwKio0MCwgMTApLCA0MCkKKyAgICAgICAgc2VsZi5mdGVzdCgnbG9nKDEwKio0MCwgMTAqKjIwKScsIG1hdGgubG9nKDEwKio0MCwgMTAqKjIwKSwgMikKIAotdGVzdG1vZGYoJ21vZGYoMS41KScsIG1hdGgubW9kZigxLjUpLCAoMC41LCAxLjApKQotdGVzdG1vZGYoJ21vZGYoLTEuNSknLCBtYXRoLm1vZGYoLTEuNSksICgtMC41LCAtMS4wKSkKKyAgICBkZWYgdGVzdExvZzEwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgubG9nMTApCisgICAgICAgIHNlbGYuZnRlc3QoJ2xvZzEwKDAuMSknLCBtYXRoLmxvZzEwKDAuMSksIC0xKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsb2cxMCgxKScsIG1hdGgubG9nMTAoMSksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2xvZzEwKDEwKScsIG1hdGgubG9nMTAoMTApLCAxKQogCi1wcmludCAncG93JwotdGVzdGl0KCdwb3coMCwxKScsIG1hdGgucG93KDAsMSksIDApCi10ZXN0aXQoJ3BvdygxLDApJywgbWF0aC5wb3coMSwwKSwgMSkKLXRlc3RpdCgncG93KDIsMSknLCBtYXRoLnBvdygyLDEpLCAyKQotdGVzdGl0KCdwb3coMiwtMSknLCBtYXRoLnBvdygyLC0xKSwgMC41KQorICAgIGRlZiB0ZXN0TW9kZihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLm1vZGYpCiAKLXByaW50ICdyYWRpYW5zJwotdGVzdGl0KCdyYWRpYW5zKDE4MCknLCBtYXRoLnJhZGlhbnMoMTgwKSwgbWF0aC5waSkKLXRlc3RpdCgncmFkaWFucyg5MCknLCBtYXRoLnJhZGlhbnMoOTApLCBtYXRoLnBpLzIpCi10ZXN0aXQoJ3JhZGlhbnMoLTQ1KScsIG1hdGgucmFkaWFucygtNDUpLCAtbWF0aC5waS80KQorICAgICAgICBkZWYgdGVzdG1vZGYobmFtZSwgKHYxLCB2MiksIChlMSwgZTIpKToKKyAgICAgICAgICAgIGlmIGFicyh2MS1lMSkgPiBlcHMgb3IgYWJzKHYyLWUyKToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJyVzIHJldHVybmVkICVyLCBleHBlY3RlZCAlciclXAorICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZSwgKHYxLHYyKSwgKGUxLGUyKSkpCiAKLXByaW50ICdzaW4nCi10ZXN0aXQoJ3NpbigwKScsIG1hdGguc2luKDApLCAwKQotdGVzdGl0KCdzaW4ocGkvMiknLCBtYXRoLnNpbihtYXRoLnBpLzIpLCAxKQotdGVzdGl0KCdzaW4oLXBpLzIpJywgbWF0aC5zaW4oLW1hdGgucGkvMiksIC0xKQorICAgICAgICB0ZXN0bW9kZignbW9kZigxLjUpJywgbWF0aC5tb2RmKDEuNSksICgwLjUsIDEuMCkpCisgICAgICAgIHRlc3Rtb2RmKCdtb2RmKC0xLjUpJywgbWF0aC5tb2RmKC0xLjUpLCAoLTAuNSwgLTEuMCkpCiAKLXByaW50ICdzaW5oJwotdGVzdGl0KCdzaW5oKDApJywgbWF0aC5zaW5oKDApLCAwKQotdGVzdGl0KCdzaW5oKDEpKioyLWNvc2goMSkqKjInLCBtYXRoLnNpbmgoMSkqKjItbWF0aC5jb3NoKDEpKioyLCAtMSkKLXRlc3RpdCgnc2luaCgxKStzaW5oKC0xKScsIG1hdGguc2luaCgxKSttYXRoLnNpbmgoLTEpLCAwKQorICAgIGRlZiB0ZXN0UG93KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgucG93KQorICAgICAgICBzZWxmLmZ0ZXN0KCdwb3coMCwxKScsIG1hdGgucG93KDAsMSksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ3BvdygxLDApJywgbWF0aC5wb3coMSwwKSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgncG93KDIsMSknLCBtYXRoLnBvdygyLDEpLCAyKQorICAgICAgICBzZWxmLmZ0ZXN0KCdwb3coMiwtMSknLCBtYXRoLnBvdygyLC0xKSwgMC41KQogCi1wcmludCAnc3FydCcKLXRlc3RpdCgnc3FydCgwKScsIG1hdGguc3FydCgwKSwgMCkKLXRlc3RpdCgnc3FydCgxKScsIG1hdGguc3FydCgxKSwgMSkKLXRlc3RpdCgnc3FydCg0KScsIG1hdGguc3FydCg0KSwgMikKKyAgICBkZWYgdGVzdFJhZGlhbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5yYWRpYW5zKQorICAgICAgICBzZWxmLmZ0ZXN0KCdyYWRpYW5zKDE4MCknLCBtYXRoLnJhZGlhbnMoMTgwKSwgbWF0aC5waSkKKyAgICAgICAgc2VsZi5mdGVzdCgncmFkaWFucyg5MCknLCBtYXRoLnJhZGlhbnMoOTApLCBtYXRoLnBpLzIpCisgICAgICAgIHNlbGYuZnRlc3QoJ3JhZGlhbnMoLTQ1KScsIG1hdGgucmFkaWFucygtNDUpLCAtbWF0aC5waS80KQogCi1wcmludCAndGFuJwotdGVzdGl0KCd0YW4oMCknLCBtYXRoLnRhbigwKSwgMCkKLXRlc3RpdCgndGFuKHBpLzQpJywgbWF0aC50YW4obWF0aC5waS80KSwgMSkKLXRlc3RpdCgndGFuKC1waS80KScsIG1hdGgudGFuKC1tYXRoLnBpLzQpLCAtMSkKKyAgICBkZWYgdGVzdFNpbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLnNpbikKKyAgICAgICAgc2VsZi5mdGVzdCgnc2luKDApJywgbWF0aC5zaW4oMCksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ3NpbihwaS8yKScsIG1hdGguc2luKG1hdGgucGkvMiksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ3NpbigtcGkvMiknLCBtYXRoLnNpbigtbWF0aC5waS8yKSwgLTEpCiAKLXByaW50ICd0YW5oJwotdGVzdGl0KCd0YW5oKDApJywgbWF0aC50YW5oKDApLCAwKQotdGVzdGl0KCd0YW5oKDEpK3RhbmgoLTEpJywgbWF0aC50YW5oKDEpK21hdGgudGFuaCgtMSksIDApCisgICAgZGVmIHRlc3RTaW5oKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguc2luaCkKKyAgICAgICAgc2VsZi5mdGVzdCgnc2luaCgwKScsIG1hdGguc2luaCgwKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnc2luaCgxKSoqMi1jb3NoKDEpKioyJywgbWF0aC5zaW5oKDEpKioyLW1hdGguY29zaCgxKSoqMiwgLTEpCisgICAgICAgIHNlbGYuZnRlc3QoJ3NpbmgoMSkrc2luaCgtMSknLCBtYXRoLnNpbmgoMSkrbWF0aC5zaW5oKC0xKSwgMCkKIAotIyBSRURfRkxBRyAxNi1PY3QtMjAwMCBUaW0KLSMgV2hpbGUgMi4wIGlzIG1vcmUgY29uc2lzdGVudCBhYm91dCBleGNlcHRpb25zIHRoYW4gcHJldmlvdXMgcmVsZWFzZXMsIGl0Ci0jIHN0aWxsIGZhaWxzIHRoaXMgcGFydCBvZiB0aGUgdGVzdCBvbiBzb21lIHBsYXRmb3Jtcy4gIEZvciBub3csIHdlIG9ubHkKLSMgKnJ1biogdGVzdF9leGNlcHRpb25zKCkgaW4gdmVyYm9zZSBtb2RlLCBzbyB0aGF0IHRoaXMgaXNuJ3Qgbm9ybWFsbHkKLSMgdGVzdGVkLgorICAgIGRlZiB0ZXN0U3FydChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLnNxcnQpCisgICAgICAgIHNlbGYuZnRlc3QoJ3NxcnQoMCknLCBtYXRoLnNxcnQoMCksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ3NxcnQoMSknLCBtYXRoLnNxcnQoMSksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ3NxcnQoNCknLCBtYXRoLnNxcnQoNCksIDIpCiAKLWRlZiB0ZXN0X2V4Y2VwdGlvbnMoKToKLSAgICBwcmludCAnZXhjZXB0aW9ucycKLSAgICB0cnk6Ci0gICAgICAgIHggPSBtYXRoLmV4cCgtMTAwMDAwMDAwMCkKLSAgICBleGNlcHQ6Ci0gICAgICAgICMgbWF0aG1vZHVsZS5jIGlzIGZhaWxpbmcgdG8gd2VlZCBvdXQgdW5kZXJmbG93cyBmcm9tIGxpYm0sIG9yCi0gICAgICAgICMgd2UndmUgZ290IGFuIGZwIGZvcm1hdCB3aXRoIGh1Z2UgZHluYW1pYyByYW5nZQotICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJ1bmRlcmZsb3dpbmcgZXhwKCkgc2hvdWxkIG5vdCBoYXZlIHJhaXNlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImFuIGV4Y2VwdGlvbiIpCi0gICAgaWYgeCAhPSAwOgotICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJ1bmRlcmZsb3dpbmcgZXhwKCkgc2hvdWxkIGhhdmUgcmV0dXJuZWQgMCIpCisgICAgZGVmIHRlc3RUYW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC50YW4pCisgICAgICAgIHNlbGYuZnRlc3QoJ3RhbigwKScsIG1hdGgudGFuKDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCd0YW4ocGkvNCknLCBtYXRoLnRhbihtYXRoLnBpLzQpLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCd0YW4oLXBpLzQpJywgbWF0aC50YW4oLW1hdGgucGkvNCksIC0xKQogCi0gICAgIyBJZiB0aGlzIGZhaWxzLCBwcm9iYWJseSB1c2luZyBhIHN0cmljdCBJRUVFLTc1NCBjb25mb3JtaW5nIGxpYm0sIGFuZCB4Ci0gICAgIyBpcyArSW5mIGFmdGVyd2FyZHMuICBCdXQgUHl0aG9uIHdhbnRzIG92ZXJmbG93cyBkZXRlY3RlZCBieSBkZWZhdWx0LgotICAgIHRyeToKLSAgICAgICAgeCA9IG1hdGguZXhwKDEwMDAwMDAwMDApCi0gICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJvdmVyZmxvd2luZyBleHAoKSBkaWRuJ3QgdHJpZ2dlciBPdmVyZmxvd0Vycm9yIikKKyAgICBkZWYgdGVzdFRhbmgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC50YW5oKQorICAgICAgICBzZWxmLmZ0ZXN0KCd0YW5oKDApJywgbWF0aC50YW5oKDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCd0YW5oKDEpK3RhbmgoLTEpJywgbWF0aC50YW5oKDEpK21hdGgudGFuaCgtMSksIDApCiAKLSAgICAjIElmIHRoaXMgZmFpbHMsIGl0IGNvdWxkIGJlIGEgcHV6emxlLiAgT25lIG9kZCBwb3NzaWJpbGl0eSBpcyB0aGF0Ci0gICAgIyBtYXRobW9kdWxlLmMncyBtYWNyb3MgYXJlIGdldHRpbmcgY29uZnVzZWQgd2hpbGUgY29tcGFyaW5nCi0gICAgIyBJbmYgKEhVR0VfVkFMKSB0byBhIE5hTiwgYW5kIGFydGlmaWNpYWxseSBzZXR0aW5nIGVycm5vIHRvIEVSQU5HRQotICAgICMgYXMgYSByZXN1bHQgKGFuZCBzbyByYWlzaW5nIE92ZXJmbG93RXJyb3IgaW5zdGVhZCkuCi0gICAgdHJ5OgotICAgICAgICB4ID0gbWF0aC5zcXJ0KC0xLjApCi0gICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJzcXJ0KC0xKSBkaWRuJ3QgcmFpc2UgVmFsdWVFcnJvciIpCisgICAgIyBSRURfRkxBRyAxNi1PY3QtMjAwMCBUaW0KKyAgICAjIFdoaWxlIDIuMCBpcyBtb3JlIGNvbnNpc3RlbnQgYWJvdXQgZXhjZXB0aW9ucyB0aGFuIHByZXZpb3VzIHJlbGVhc2VzLCBpdAorICAgICMgc3RpbGwgZmFpbHMgdGhpcyBwYXJ0IG9mIHRoZSB0ZXN0IG9uIHNvbWUgcGxhdGZvcm1zLiAgRm9yIG5vdywgd2Ugb25seQorICAgICMgKnJ1biogdGVzdF9leGNlcHRpb25zKCkgaW4gdmVyYm9zZSBtb2RlLCBzbyB0aGF0IHRoaXMgaXNuJ3Qgbm9ybWFsbHkKKyAgICAjIHRlc3RlZC4KIAotaWYgdmVyYm9zZToKLSAgICB0ZXN0X2V4Y2VwdGlvbnMoKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeCA9IG1hdGguZXhwKC0xMDAwMDAwMDAwKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICMgbWF0aG1vZHVsZS5jIGlzIGZhaWxpbmcgdG8gd2VlZCBvdXQgdW5kZXJmbG93cyBmcm9tIGxpYm0sIG9yCisgICAgICAgICAgICAgICAgIyB3ZSd2ZSBnb3QgYW4gZnAgZm9ybWF0IHdpdGggaHVnZSBkeW5hbWljIHJhbmdlCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ1bmRlcmZsb3dpbmcgZXhwKCkgc2hvdWxkIG5vdCBoYXZlIHJhaXNlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhbiBleGNlcHRpb24iKQorICAgICAgICAgICAgaWYgeCAhPSAwOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgidW5kZXJmbG93aW5nIGV4cCgpIHNob3VsZCBoYXZlIHJldHVybmVkIDAiKQorCisgICAgICAgICAgICAjIElmIHRoaXMgZmFpbHMsIHByb2JhYmx5IHVzaW5nIGEgc3RyaWN0IElFRUUtNzU0IGNvbmZvcm1pbmcgbGlibSwgYW5kIHgKKyAgICAgICAgICAgICMgaXMgK0luZiBhZnRlcndhcmRzLiAgQnV0IFB5dGhvbiB3YW50cyBvdmVyZmxvd3MgZGV0ZWN0ZWQgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB4ID0gbWF0aC5leHAoMTAwMDAwMDAwMCkKKyAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJvdmVyZmxvd2luZyBleHAoKSBkaWRuJ3QgdHJpZ2dlciBPdmVyZmxvd0Vycm9yIikKKworICAgICAgICAgICAgIyBJZiB0aGlzIGZhaWxzLCBpdCBjb3VsZCBiZSBhIHB1enpsZS4gIE9uZSBvZGQgcG9zc2liaWxpdHkgaXMgdGhhdAorICAgICAgICAgICAgIyBtYXRobW9kdWxlLmMncyBtYWNyb3MgYXJlIGdldHRpbmcgY29uZnVzZWQgd2hpbGUgY29tcGFyaW5nCisgICAgICAgICAgICAjIEluZiAoSFVHRV9WQUwpIHRvIGEgTmFOLCBhbmQgYXJ0aWZpY2lhbGx5IHNldHRpbmcgZXJybm8gdG8gRVJBTkdFCisgICAgICAgICAgICAjIGFzIGEgcmVzdWx0IChhbmQgc28gcmFpc2luZyBPdmVyZmxvd0Vycm9yIGluc3RlYWQpLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHggPSBtYXRoLnNxcnQoLTEuMCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzcXJ0KC0xKSBkaWRuJ3QgcmFpc2UgVmFsdWVFcnJvciIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChNYXRoVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbW1hcC5weSBiL0xpYi90ZXN0L3Rlc3RfbW1hcC5weQppbmRleCBkMmEyNDc3Li4wYjUzODIzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21tYXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tbWFwLnB5CkBAIC0xLDE5MCArMSwxNTggQEAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmlmeSwgdmVyZXEsIFRFU1RGTgorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QKIGltcG9ydCBtbWFwCitpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBvcywgcmUKIAogUEFHRVNJWkUgPSBtbWFwLlBBR0VTSVpFCiAKLWRlZiB0ZXN0X2JvdGgoKToKLSAgICAiVGVzdCBtbWFwIG1vZHVsZSBvbiBVbml4IHN5c3RlbXMgYW5kIFdpbmRvd3MiCitjbGFzcyBNbWFwVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCi0gICAgIyBDcmVhdGUgYSBmaWxlIHRvIGJlIG1tYXAnZWQuCi0gICAgaWYgb3MucGF0aC5leGlzdHMoVEVTVEZOKToKLSAgICAgICAgb3MudW5saW5rKFRFU1RGTikKLSAgICBmID0gb3BlbihURVNURk4sICd3KycpCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhURVNURk4pOgorICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKIAotICAgIHRyeTogICAgIyB1bmxpbmsgVEVTVEZOIG5vIG1hdHRlciB3aGF0Ci0gICAgICAgICMgV3JpdGUgMiBwYWdlcyB3b3J0aCBvZiBkYXRhIHRvIHRoZSBmaWxlCi0gICAgICAgIGYud3JpdGUoJ1wwJyogUEFHRVNJWkUpCi0gICAgICAgIGYud3JpdGUoJ2ZvbycpCi0gICAgICAgIGYud3JpdGUoJ1wwJyogKFBBR0VTSVpFLTMpICkKLSAgICAgICAgZi5mbHVzaCgpCi0gICAgICAgIG0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgMiAqIFBBR0VTSVpFKQotICAgICAgICBmLmNsb3NlKCkKLQotICAgICAgICAjIFNpbXBsZSBzYW5pdHkgY2hlY2tzCi0KLSAgICAgICAgcHJpbnQgdHlwZShtKSAgIyBTRiBidWcgMTI4NzEzOiAgc2VnZmF1bHRlZCBvbiBMaW51eAotICAgICAgICBwcmludCAnICBQb3NpdGlvbiBvZiBmb286JywgbS5maW5kKCdmb28nKSAvIGZsb2F0KFBBR0VTSVpFKSwgJ3BhZ2VzJwotICAgICAgICB2ZXJlcShtLmZpbmQoJ2ZvbycpLCBQQUdFU0laRSkKLQotICAgICAgICBwcmludCAnICBMZW5ndGggb2YgZmlsZTonLCBsZW4obSkgLyBmbG9hdChQQUdFU0laRSksICdwYWdlcycKLSAgICAgICAgdmVyZXEobGVuKG0pLCAyKlBBR0VTSVpFKQotCi0gICAgICAgIHByaW50ICcgIENvbnRlbnRzIG9mIGJ5dGUgMDonLCByZXByKG1bMF0pCi0gICAgICAgIHZlcmVxKG1bMF0sICdcMCcpCi0gICAgICAgIHByaW50ICcgIENvbnRlbnRzIG9mIGZpcnN0IDMgYnl0ZXM6JywgcmVwcihtWzA6M10pCi0gICAgICAgIHZlcmVxKG1bMDozXSwgJ1wwXDBcMCcpCi0KLSAgICAgICAgIyBNb2RpZnkgdGhlIGZpbGUncyBjb250ZW50Ci0gICAgICAgIHByaW50ICJcbiAgTW9kaWZ5aW5nIGZpbGUncyBjb250ZW50Li4uIgotICAgICAgICBtWzBdID0gJzMnCi0gICAgICAgIG1bUEFHRVNJWkUgKzM6IFBBR0VTSVpFICszKzNdID0gJ2JhcicKLQotICAgICAgICAjIENoZWNrIHRoYXQgdGhlIG1vZGlmaWNhdGlvbiB3b3JrZWQKLSAgICAgICAgcHJpbnQgJyAgQ29udGVudHMgb2YgYnl0ZSAwOicsIHJlcHIobVswXSkKLSAgICAgICAgdmVyZXEobVswXSwgJzMnKQotICAgICAgICBwcmludCAnICBDb250ZW50cyBvZiBmaXJzdCAzIGJ5dGVzOicsIHJlcHIobVswOjNdKQotICAgICAgICB2ZXJlcShtWzA6M10sICczXDBcMCcpCi0gICAgICAgIHByaW50ICcgIENvbnRlbnRzIG9mIHNlY29uZCBwYWdlOicsICByZXByKG1bUEFHRVNJWkUtMSA6IFBBR0VTSVpFICsgN10pCi0gICAgICAgIHZlcmVxKG1bUEFHRVNJWkUtMSA6IFBBR0VTSVpFICsgN10sICdcMGZvb2JhclwwJykKLQotICAgICAgICBtLmZsdXNoKCkKLQotICAgICAgICAjIFRlc3QgZG9pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2ggaW4gYW4gbW1hcCdlZCBmaWxlCi0gICAgICAgIG1hdGNoID0gcmUuc2VhcmNoKCdbQS1aYS16XSsnLCBtKQotICAgICAgICBpZiBtYXRjaCBpcyBOb25lOgotICAgICAgICAgICAgcHJpbnQgJyAgRVJST1I6IHJlZ2V4IG1hdGNoIG9uIG1tYXAgZmFpbGVkIScKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHN0YXJ0LCBlbmQgPSBtYXRjaC5zcGFuKDApCi0gICAgICAgICAgICBsZW5ndGggPSBlbmQgLSBzdGFydAotCi0gICAgICAgICAgICBwcmludCAnICBSZWdleCBtYXRjaCBvbiBtbWFwIChwYWdlIHN0YXJ0LCBsZW5ndGggb2YgbWF0Y2gpOicsCi0gICAgICAgICAgICBwcmludCBzdGFydCAvIGZsb2F0KFBBR0VTSVpFKSwgbGVuZ3RoCi0KLSAgICAgICAgICAgIHZlcmVxKHN0YXJ0LCBQQUdFU0laRSkKLSAgICAgICAgICAgIHZlcmVxKGVuZCwgUEFHRVNJWkUgKyA2KQotCi0gICAgICAgICMgdGVzdCBzZWVraW5nIGFyb3VuZCAodHJ5IHRvIG92ZXJmbG93IHRoZSBzZWVrIGltcGxlbWVudGF0aW9uKQotICAgICAgICBtLnNlZWsoMCwwKQotICAgICAgICBwcmludCAnICBTZWVrIHRvIHplcm90aCBieXRlJwotICAgICAgICB2ZXJlcShtLnRlbGwoKSwgMCkKLSAgICAgICAgbS5zZWVrKDQyLDEpCi0gICAgICAgIHByaW50ICcgIFNlZWsgdG8gNDJuZCBieXRlJwotICAgICAgICB2ZXJlcShtLnRlbGwoKSwgNDIpCi0gICAgICAgIG0uc2VlaygwLDIpCi0gICAgICAgIHByaW50ICcgIFNlZWsgdG8gbGFzdCBieXRlJwotICAgICAgICB2ZXJlcShtLnRlbGwoKSwgbGVuKG0pKQotCi0gICAgICAgIHByaW50ICcgIFRyeSB0byBzZWVrIHRvIG5lZ2F0aXZlIHBvc2l0aW9uLi4uJwotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBtLnNlZWsoLTEpCi0gICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgdmVyaWZ5KDAsICdleHBlY3RlZCBhIFZhbHVlRXJyb3IgYnV0IGRpZCBub3QgZ2V0IGl0JykKLQotICAgICAgICBwcmludCAnICBUcnkgdG8gc2VlayBiZXlvbmQgZW5kIG9mIG1tYXAuLi4nCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG0uc2VlaygxLDIpCi0gICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgdmVyaWZ5KDAsICdleHBlY3RlZCBhIFZhbHVlRXJyb3IgYnV0IGRpZCBub3QgZ2V0IGl0JykKLQotICAgICAgICBwcmludCAnICBUcnkgdG8gc2VlayB0byBuZWdhdGl2ZSBwb3NpdGlvbi4uLicKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgbS5zZWVrKC1sZW4obSktMSwyKQotICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHZlcmlmeSgwLCAnZXhwZWN0ZWQgYSBWYWx1ZUVycm9yIGJ1dCBkaWQgbm90IGdldCBpdCcpCi0KLSAgICAgICAgIyBUcnkgcmVzaXppbmcgbWFwCi0gICAgICAgIHByaW50ICcgIEF0dGVtcHRpbmcgcmVzaXplKCknCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG0ucmVzaXplKDUxMikKLSAgICAgICAgZXhjZXB0IFN5c3RlbUVycm9yOgotICAgICAgICAgICAgIyByZXNpemUoKSBub3Qgc3VwcG9ydGVkCi0gICAgICAgICAgICAjIE5vIG1lc3NhZ2VzIGFyZSBwcmludGVkLCBzaW5jZSB0aGUgb3V0cHV0IG9mIHRoaXMgdGVzdCBzdWl0ZQotICAgICAgICAgICAgIyB3b3VsZCB0aGVuIGJlIGRpZmZlcmVudCBhY3Jvc3MgcGxhdGZvcm1zLgotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgIyByZXNpemUoKSBpcyBzdXBwb3J0ZWQKLSAgICAgICAgICAgIHZlcmlmeShsZW4obSkgPT0gNTEyLAotICAgICAgICAgICAgICAgICAgICAibGVuKG0pIGlzICVkLCBidXQgZXhwZWN0aW5nIDUxMiIgJSAobGVuKG0pLCkgKQotICAgICAgICAgICAgIyBDaGVjayB0aGF0IHdlIGNhbiBubyBsb25nZXIgc2VlayBiZXlvbmQgdGhlIG5ldyBzaXplLgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG0uc2Vlayg1MTMsMCkKLSAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgdmVyaWZ5KDAsICdDb3VsZCBzZWVrIGJleW9uZCB0aGUgbmV3IHNpemUnKQotCi0gICAgICAgICAgICAjIENoZWNrIHRoYXQgdGhlIHVuZGVybHlpbmcgZmlsZSBpcyB0cnVuY2F0ZWQgdG9vCi0gICAgICAgICAgICAjIChidWcgIzcyODUxNSkKLSAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTikKLSAgICAgICAgICAgIGYuc2VlaygwLCAyKQotICAgICAgICAgICAgdmVyaWZ5KGYudGVsbCgpID09IDUxMiwgJ1VuZGVybHlpbmcgZmlsZSBub3QgdHJ1bmNhdGVkJykKLSAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgdmVyaWZ5KG0uc2l6ZSgpID09IDUxMiwgJ05ldyBzaXplIG5vdCByZWZsZWN0ZWQgaW4gZmlsZScpCi0KLSAgICAgICAgbS5jbG9zZSgpCi0KLSAgICBmaW5hbGx5OgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQogICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgIHBhc3MKIAotICAgICMgVGVzdCBmb3IgImFjY2VzcyIga2V5d29yZCBwYXJhbWV0ZXIKLSAgICB0cnk6CisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgICMgVGVzdCBtbWFwIG1vZHVsZSBvbiBVbml4IHN5c3RlbXMgYW5kIFdpbmRvd3MKKworICAgICAgICAjIENyZWF0ZSBhIGZpbGUgdG8gYmUgbW1hcCdlZC4KKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAndysnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFdyaXRlIDIgcGFnZXMgd29ydGggb2YgZGF0YSB0byB0aGUgZmlsZQorICAgICAgICAgICAgZi53cml0ZSgnXDAnKiBQQUdFU0laRSkKKyAgICAgICAgICAgIGYud3JpdGUoJ2ZvbycpCisgICAgICAgICAgICBmLndyaXRlKCdcMCcqIChQQUdFU0laRS0zKSApCisgICAgICAgICAgICBmLmZsdXNoKCkKKyAgICAgICAgICAgIG0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgMiAqIFBBR0VTSVpFKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgICMgU2ltcGxlIHNhbml0eSBjaGVja3MKKworICAgICAgICAgICAgdHAgPSBzdHIodHlwZShtKSkgICMgU0YgYnVnIDEyODcxMzogIHNlZ2ZhdWx0ZWQgb24gTGludXgKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5maW5kKCdmb28nKSwgUEFHRVNJWkUpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG0pLCAyKlBBR0VTSVpFKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bMF0sICdcMCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bMDozXSwgJ1wwXDBcMCcpCisKKyAgICAgICAgICAgICMgTW9kaWZ5IHRoZSBmaWxlJ3MgY29udGVudAorICAgICAgICAgICAgbVswXSA9ICczJworICAgICAgICAgICAgbVtQQUdFU0laRSArMzogUEFHRVNJWkUgKzMrM10gPSAnYmFyJworCisgICAgICAgICAgICAjIENoZWNrIHRoYXQgdGhlIG1vZGlmaWNhdGlvbiB3b3JrZWQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVswXSwgJzMnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtWzA6M10sICczXDBcMCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bUEFHRVNJWkUtMSA6IFBBR0VTSVpFICsgN10sICdcMGZvb2JhclwwJykKKworICAgICAgICAgICAgbS5mbHVzaCgpCisKKyAgICAgICAgICAgICMgVGVzdCBkb2luZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCBpbiBhbiBtbWFwJ2VkIGZpbGUKKyAgICAgICAgICAgIG1hdGNoID0gcmUuc2VhcmNoKCdbQS1aYS16XSsnLCBtKQorICAgICAgICAgICAgaWYgbWF0Y2ggaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ3JlZ2V4IG1hdGNoIG9uIG1tYXAgZmFpbGVkIScpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQgPSBtYXRjaC5zcGFuKDApCisgICAgICAgICAgICAgICAgbGVuZ3RoID0gZW5kIC0gc3RhcnQKKworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhcnQsIFBBR0VTSVpFKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5kLCBQQUdFU0laRSArIDYpCisKKyAgICAgICAgICAgICMgdGVzdCBzZWVraW5nIGFyb3VuZCAodHJ5IHRvIG92ZXJmbG93IHRoZSBzZWVrIGltcGxlbWVudGF0aW9uKQorICAgICAgICAgICAgbS5zZWVrKDAsMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS50ZWxsKCksIDApCisgICAgICAgICAgICBtLnNlZWsoNDIsMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS50ZWxsKCksIDQyKQorICAgICAgICAgICAgbS5zZWVrKDAsMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS50ZWxsKCksIGxlbihtKSkKKworICAgICAgICAgICAgIyBUcnkgdG8gc2VlayB0byBuZWdhdGl2ZSBwb3NpdGlvbi4uLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbS5zZWVrLCAtMSkKKworICAgICAgICAgICAgIyBUcnkgdG8gc2VlayBiZXlvbmQgZW5kIG9mIG1tYXAuLi4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG0uc2VlaywgMSwgMikKKworICAgICAgICAgICAgIyBUcnkgdG8gc2VlayB0byBuZWdhdGl2ZSBwb3NpdGlvbi4uLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbS5zZWVrLCAtbGVuKG0pLTEsIDIpCisKKyAgICAgICAgICAgICMgVHJ5IHJlc2l6aW5nIG1hcAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG0ucmVzaXplKDUxMikKKyAgICAgICAgICAgIGV4Y2VwdCBTeXN0ZW1FcnJvcjoKKyAgICAgICAgICAgICAgICAjIHJlc2l6ZSgpIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAjIE5vIG1lc3NhZ2VzIGFyZSBwcmludGVkLCBzaW5jZSB0aGUgb3V0cHV0IG9mIHRoaXMgdGVzdCBzdWl0ZQorICAgICAgICAgICAgICAgICMgd291bGQgdGhlbiBiZSBkaWZmZXJlbnQgYWNyb3NzIHBsYXRmb3Jtcy4KKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgcmVzaXplKCkgaXMgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obSksIDUxMikKKyAgICAgICAgICAgICAgICAjIENoZWNrIHRoYXQgd2UgY2FuIG5vIGxvbmdlciBzZWVrIGJleW9uZCB0aGUgbmV3IHNpemUuCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbS5zZWVrLCA1MTMsIDApCisKKyAgICAgICAgICAgICAgICAjIENoZWNrIHRoYXQgdGhlIHVuZGVybHlpbmcgZmlsZSBpcyB0cnVuY2F0ZWQgdG9vCisgICAgICAgICAgICAgICAgIyAoYnVnICM3Mjg1MTUpCisgICAgICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOKQorICAgICAgICAgICAgICAgIGYuc2VlaygwLCAyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDUxMikKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uc2l6ZSgpLCA1MTIpCisKKyAgICAgICAgICAgIG0uY2xvc2UoKQorCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9hY2Nlc3NfcGFyYW1ldGVyKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yICJhY2Nlc3MiIGtleXdvcmQgcGFyYW1ldGVyCiAgICAgICAgIG1hcHNpemUgPSAxMAotICAgICAgICBwcmludCAiICBDcmVhdGluZyIsIG1hcHNpemUsICJieXRlIHRlc3QgZGF0YSBmaWxlLiIKICAgICAgICAgb3BlbihURVNURk4sICJ3YiIpLndyaXRlKCJhIiptYXBzaXplKQotICAgICAgICBwcmludCAiICBPcGVuaW5nIG1tYXAgd2l0aCBhY2Nlc3M9QUNDRVNTX1JFQUQiCiAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInJiIikKICAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCBtYXBzaXplLCBhY2Nlc3M9bW1hcC5BQ0NFU1NfUkVBRCkKLSAgICAgICAgdmVyaWZ5KG1bOl0gPT0gJ2EnKm1hcHNpemUsICJSZWFkb25seSBtZW1vcnkgbWFwIGRhdGEgaW5jb3JyZWN0LiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVs6XSwgJ2EnKm1hcHNpemUsICJSZWFkb25seSBtZW1vcnkgbWFwIGRhdGEgaW5jb3JyZWN0LiIpCiAKLSAgICAgICAgcHJpbnQgIiAgRW5zdXJpbmcgdGhhdCByZWFkb25seSBtbWFwIGNhbid0IGJlIHNsaWNlIGFzc2lnbmVkLiIKKyAgICAgICAgIyBFbnN1cmluZyB0aGF0IHJlYWRvbmx5IG1tYXAgY2FuJ3QgYmUgc2xpY2UgYXNzaWduZWQKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbVs6XSA9ICdiJyptYXBzaXplCiAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB2ZXJpZnkoMCwgIkFibGUgdG8gd3JpdGUgdG8gcmVhZG9ubHkgbWVtb3J5IG1hcCIpCisgICAgICAgICAgICBzZWxmLmZhaWwoIkFibGUgdG8gd3JpdGUgdG8gcmVhZG9ubHkgbWVtb3J5IG1hcCIpCiAKLSAgICAgICAgcHJpbnQgIiAgRW5zdXJpbmcgdGhhdCByZWFkb25seSBtbWFwIGNhbid0IGJlIGl0ZW0gYXNzaWduZWQuIgorICAgICAgICAjIEVuc3VyaW5nIHRoYXQgcmVhZG9ubHkgbW1hcCBjYW4ndCBiZSBpdGVtIGFzc2lnbmVkCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG1bMF0gPSAnYicKICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHZlcmlmeSgwLCAiQWJsZSB0byB3cml0ZSB0byByZWFkb25seSBtZW1vcnkgbWFwIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiQWJsZSB0byB3cml0ZSB0byByZWFkb25seSBtZW1vcnkgbWFwIikKIAotICAgICAgICBwcmludCAiICBFbnN1cmluZyB0aGF0IHJlYWRvbmx5IG1tYXAgY2FuJ3QgYmUgd3JpdGUoKSB0by4iCisgICAgICAgICMgRW5zdXJpbmcgdGhhdCByZWFkb25seSBtbWFwIGNhbid0IGJlIHdyaXRlKCkgdG8KICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbS5zZWVrKDAsMCkKICAgICAgICAgICAgIG0ud3JpdGUoJ2FiYycpCiAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB2ZXJpZnkoMCwgIkFibGUgdG8gd3JpdGUgdG8gcmVhZG9ubHkgbWVtb3J5IG1hcCIpCisgICAgICAgICAgICBzZWxmLmZhaWwoIkFibGUgdG8gd3JpdGUgdG8gcmVhZG9ubHkgbWVtb3J5IG1hcCIpCiAKLSAgICAgICAgcHJpbnQgIiAgRW5zdXJpbmcgdGhhdCByZWFkb25seSBtbWFwIGNhbid0IGJlIHdyaXRlX2J5dGUoKSB0by4iCisgICAgICAgICMgRW5zdXJpbmcgdGhhdCByZWFkb25seSBtbWFwIGNhbid0IGJlIHdyaXRlX2J5dGUoKSB0bwogICAgICAgICB0cnk6CiAgICAgICAgICAgICBtLnNlZWsoMCwwKQogICAgICAgICAgICAgbS53cml0ZV9ieXRlKCdkJykKICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHZlcmlmeSgwLCAiQWJsZSB0byB3cml0ZSB0byByZWFkb25seSBtZW1vcnkgbWFwIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiQWJsZSB0byB3cml0ZSB0byByZWFkb25seSBtZW1vcnkgbWFwIikKIAotICAgICAgICBwcmludCAiICBFbnN1cmluZyB0aGF0IHJlYWRvbmx5IG1tYXAgY2FuJ3QgYmUgcmVzaXplZC4iCisgICAgICAgICMgRW5zdXJpbmcgdGhhdCByZWFkb25seSBtbWFwIGNhbid0IGJlIHJlc2l6ZWQKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbS5yZXNpemUoMiptYXBzaXplKQogICAgICAgICBleGNlcHQgU3lzdGVtRXJyb3I6ICAgIyByZXNpemUgaXMgbm90IHVuaXZlcnNhbGx5IHN1cHBvcnRlZApAQCAtMTkyLDEyICsxNjAsMTIgQEAKICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHZlcmlmeSgwLCAiQWJsZSB0byByZXNpemUgcmVhZG9ubHkgbWVtb3J5IG1hcCIpCisgICAgICAgICAgICBzZWxmLmZhaWwoIkFibGUgdG8gcmVzaXplIHJlYWRvbmx5IG1lbW9yeSBtYXAiKQogICAgICAgICBkZWwgbSwgZgotICAgICAgICB2ZXJpZnkob3BlbihURVNURk4sICJyYiIpLnJlYWQoKSA9PSAnYScqbWFwc2l6ZSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVuKFRFU1RGTiwgInJiIikucmVhZCgpLCAnYScqbWFwc2l6ZSwKICAgICAgICAgICAgICAgICJSZWFkb25seSBtZW1vcnkgbWFwIGRhdGEgZmlsZSB3YXMgbW9kaWZpZWQiKQogCi0gICAgICAgIHByaW50ICIgIE9wZW5pbmcgbW1hcCB3aXRoIHNpemUgdG9vIGJpZyIKKyAgICAgICAgIyBPcGVuaW5nIG1tYXAgd2l0aCBzaXplIHRvbyBiaWcKICAgICAgICAgaW1wb3J0IHN5cwogICAgICAgICBmID0gb3BlbihURVNURk4sICJyK2IiKQogICAgICAgICB0cnk6CkBAIC0yMDgsMTEgKzE3NiwxMSBAQAogICAgICAgICAgICAgIyBsYXRlciB0ZXN0cyBhc3N1bWUgdGhhdCB0aGUgbGVuZ3RoIGhhc24ndCBjaGFuZ2VkLiAgV2UgbmVlZCB0bwogICAgICAgICAgICAgIyByZXBhaXIgdGhhdC4KICAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCd3aW4nKToKLSAgICAgICAgICAgICAgICB2ZXJpZnkoMCwgIk9wZW5pbmcgbW1hcCB3aXRoIHNpemUrMSBzaG91bGQgd29yayBvbiBXaW5kb3dzLiIpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJPcGVuaW5nIG1tYXAgd2l0aCBzaXplKzEgc2hvdWxkIHdvcmsgb24gV2luZG93cy4iKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgIyB3ZSBleHBlY3QgYSBWYWx1ZUVycm9yIG9uIFVuaXgsIGJ1dCBub3Qgb24gV2luZG93cwogICAgICAgICAgICAgaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCd3aW4nKToKLSAgICAgICAgICAgICAgICB2ZXJpZnkoMCwgIk9wZW5pbmcgbW1hcCB3aXRoIHNpemUrMSBzaG91bGQgcmFpc2UgVmFsdWVFcnJvci4iKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiT3BlbmluZyBtbWFwIHdpdGggc2l6ZSsxIHNob3VsZCByYWlzZSBWYWx1ZUVycm9yLiIpCiAgICAgICAgICAgICBtLmNsb3NlKCkKICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCd3aW4nKToKQEAgLTIyMSwxMiArMTg5LDEyIEBACiAgICAgICAgICAgICBmLnRydW5jYXRlKG1hcHNpemUpCiAgICAgICAgICAgICBmLmNsb3NlKCkKIAotICAgICAgICBwcmludCAiICBPcGVuaW5nIG1tYXAgd2l0aCBhY2Nlc3M9QUNDRVNTX1dSSVRFIgorICAgICAgICAjIE9wZW5pbmcgbW1hcCB3aXRoIGFjY2Vzcz1BQ0NFU1NfV1JJVEUKICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAicitiIikKICAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCBtYXBzaXplLCBhY2Nlc3M9bW1hcC5BQ0NFU1NfV1JJVEUpCi0gICAgICAgIHByaW50ICIgIE1vZGlmeWluZyB3cml0ZS10aHJvdWdoIG1lbW9yeSBtYXAuIgorICAgICAgICAjIE1vZGlmeWluZyB3cml0ZS10aHJvdWdoIG1lbW9yeSBtYXAKICAgICAgICAgbVs6XSA9ICdjJyptYXBzaXplCi0gICAgICAgIHZlcmlmeShtWzpdID09ICdjJyptYXBzaXplLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bOl0sICdjJyptYXBzaXplLAogICAgICAgICAgICAgICAgIldyaXRlLXRocm91Z2ggbWVtb3J5IG1hcCBtZW1vcnkgbm90IHVwZGF0ZWQgcHJvcGVybHkuIikKICAgICAgICAgbS5mbHVzaCgpCiAgICAgICAgIG0uY2xvc2UoKQpAQCAtMjM0LDY2ICsyMDIsNDUgQEAKICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAncmInKQogICAgICAgICBzdHVmZiA9IGYucmVhZCgpCiAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICB2ZXJpZnkoc3R1ZmYgPT0gJ2MnKm1hcHNpemUsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3R1ZmYsICdjJyptYXBzaXplLAogICAgICAgICAgICAgICAgIldyaXRlLXRocm91Z2ggbWVtb3J5IG1hcCBkYXRhIGZpbGUgbm90IHVwZGF0ZWQgcHJvcGVybHkuIikKIAotICAgICAgICBwcmludCAiICBPcGVuaW5nIG1tYXAgd2l0aCBhY2Nlc3M9QUNDRVNTX0NPUFkiCisgICAgICAgICMgT3BlbmluZyBtbWFwIHdpdGggYWNjZXNzPUFDQ0VTU19DT1BZCiAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInIrYiIpCiAgICAgICAgIG0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgbWFwc2l6ZSwgYWNjZXNzPW1tYXAuQUNDRVNTX0NPUFkpCi0gICAgICAgIHByaW50ICIgIE1vZGlmeWluZyBjb3B5LW9uLXdyaXRlIG1lbW9yeSBtYXAuIgorICAgICAgICAjIE1vZGlmeWluZyBjb3B5LW9uLXdyaXRlIG1lbW9yeSBtYXAKICAgICAgICAgbVs6XSA9ICdkJyptYXBzaXplCi0gICAgICAgIHZlcmlmeShtWzpdID09ICdkJyAqIG1hcHNpemUsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVs6XSwgJ2QnICogbWFwc2l6ZSwKICAgICAgICAgICAgICAgICJDb3B5LW9uLXdyaXRlIG1lbW9yeSBtYXAgZGF0YSBub3Qgd3JpdHRlbiBjb3JyZWN0bHkuIikKICAgICAgICAgbS5mbHVzaCgpCi0gICAgICAgIHZlcmlmeShvcGVuKFRFU1RGTiwgInJiIikucmVhZCgpID09ICdjJyptYXBzaXplLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZW4oVEVTVEZOLCAicmIiKS5yZWFkKCksICdjJyptYXBzaXplLAogICAgICAgICAgICAgICAgIkNvcHktb24td3JpdGUgdGVzdCBkYXRhIGZpbGUgc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4iKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBwcmludCAiICBFbnN1cmluZyBjb3B5LW9uLXdyaXRlIG1hcHMgY2Fubm90IGJlIHJlc2l6ZWQuIgotICAgICAgICAgICAgbS5yZXNpemUoMiptYXBzaXplKQotICAgICAgICBleGNlcHQgVHlwZUVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgdmVyaWZ5KDAsICJDb3B5LW9uLXdyaXRlIG1tYXAgcmVzaXplIGRpZCBub3QgcmFpc2UgZXhjZXB0aW9uLiIpCisgICAgICAgICMgRW5zdXJpbmcgY29weS1vbi13cml0ZSBtYXBzIGNhbm5vdCBiZSByZXNpemVkCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbS5yZXNpemUsIDIqbWFwc2l6ZSkKICAgICAgICAgZGVsIG0sIGYKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcHJpbnQgIiAgRW5zdXJpbmcgaW52YWxpZCBhY2Nlc3MgcGFyYW1ldGVyIHJhaXNlcyBleGNlcHRpb24uIgotICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAicitiIikKLSAgICAgICAgICAgIG0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgbWFwc2l6ZSwgYWNjZXNzPTQpCi0gICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgdmVyaWZ5KDAsICJJbnZhbGlkIGFjY2VzcyBjb2RlIHNob3VsZCBoYXZlIHJhaXNlZCBleGNlcHRpb24uIikKKworICAgICAgICAjIEVuc3VyaW5nIGludmFsaWQgYWNjZXNzIHBhcmFtZXRlciByYWlzZXMgZXhjZXB0aW9uCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInIrYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1tYXAubW1hcCwgZi5maWxlbm8oKSwgbWFwc2l6ZSwgYWNjZXNzPTQpCisgICAgICAgIGYuY2xvc2UoKQogCiAgICAgICAgIGlmIG9zLm5hbWUgPT0gInBvc2l4IjoKICAgICAgICAgICAgICMgVHJ5IGluY29tcGF0aWJsZSBmbGFncywgcHJvdCBhbmQgYWNjZXNzIHBhcmFtZXRlcnMuCiAgICAgICAgICAgICBmID0gb3BlbihURVNURk4sICJyK2IiKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgbWFwc2l6ZSwgZmxhZ3M9bW1hcC5NQVBfUFJJVkFURSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1tYXAubW1hcCwgZi5maWxlbm8oKSwgbWFwc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzPW1tYXAuTUFQX1BSSVZBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90PW1tYXAuUFJPVF9SRUFELCBhY2Nlc3M9bW1hcC5BQ0NFU1NfV1JJVEUpCi0gICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHZlcmlmeSgwLCAiSW5jb21wYXRpYmxlIHBhcmFtZXRlcnMgc2hvdWxkIHJhaXNlIFZhbHVlRXJyb3IuIikKICAgICAgICAgICAgIGYuY2xvc2UoKQotICAgIGZpbmFsbHk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCi0gICAgICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICAgICAgcGFzcwogCi0gICAgcHJpbnQgJyAgVHJ5IG9wZW5pbmcgYSBiYWQgZmlsZSBkZXNjcmlwdG9yLi4uJwotICAgIHRyeToKLSAgICAgICAgbW1hcC5tbWFwKC0yLCA0MDk2KQotICAgIGV4Y2VwdCBtbWFwLmVycm9yOgotICAgICAgICBwYXNzCi0gICAgZWxzZToKLSAgICAgICAgdmVyaWZ5KDAsICdleHBlY3RlZCBhIG1tYXAuZXJyb3IgYnV0IGRpZCBub3QgZ2V0IGl0JykKKyAgICBkZWYgdGVzdF9iYWRfZmlsZV9kZXNjKHNlbGYpOgorICAgICAgICAjIFRyeSBvcGVuaW5nIGEgYmFkIGZpbGUgZGVzY3JpcHRvci4uLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhtbWFwLmVycm9yLCBtbWFwLm1tYXAsIC0yLCA0MDk2KQogCi0gICAgIyBEbyBhIHRvdWdoZXIgLmZpbmQoKSB0ZXN0LiAgU0YgYnVnIDUxNTk0MyBwb2ludGVkIG91dCB0aGF0LCBpbiAyLjIsCi0gICAgIyBzZWFyY2hpbmcgZm9yIGRhdGEgd2l0aCBlbWJlZGRlZCBcMCBieXRlcyBkaWRuJ3Qgd29yay4KLSAgICBmID0gb3BlbihURVNURk4sICd3KycpCisgICAgZGVmIHRlc3RfdG91Z2hlcl9maW5kKHNlbGYpOgorICAgICAgICAjIERvIGEgdG91Z2hlciAuZmluZCgpIHRlc3QuICBTRiBidWcgNTE1OTQzIHBvaW50ZWQgb3V0IHRoYXQsIGluIDIuMiwKKyAgICAgICAgIyBzZWFyY2hpbmcgZm9yIGRhdGEgd2l0aCBlbWJlZGRlZCBcMCBieXRlcyBkaWRuJ3Qgd29yay4KKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAndysnKQogCi0gICAgdHJ5OiAgICAjIHVubGluayBURVNURk4gbm8gbWF0dGVyIHdoYXQKICAgICAgICAgZGF0YSA9ICdhYWJhYWNceDAwZGVlZlx4MDBceDAwYWFceDAwJwogICAgICAgICBuID0gbGVuKGRhdGEpCiAgICAgICAgIGYud3JpdGUoZGF0YSkKQEAgLTMwNCwxNyArMjUxLDE0IEBACiAgICAgICAgIGZvciBzdGFydCBpbiByYW5nZShuKzEpOgogICAgICAgICAgICAgZm9yIGZpbmlzaCBpbiByYW5nZShzdGFydCwgbisxKToKICAgICAgICAgICAgICAgICBzbGljZSA9IGRhdGFbc3RhcnQgOiBmaW5pc2hdCi0gICAgICAgICAgICAgICAgdmVyZXEobS5maW5kKHNsaWNlKSwgZGF0YS5maW5kKHNsaWNlKSkKLSAgICAgICAgICAgICAgICB2ZXJlcShtLmZpbmQoc2xpY2UgKyAneCcpLCAtMSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZmluZChzbGljZSksIGRhdGEuZmluZChzbGljZSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmZpbmQoc2xpY2UgKyAneCcpLCAtMSkKICAgICAgICAgbS5jbG9zZSgpCiAKLSAgICBmaW5hbGx5OgotICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQorICAgIGRlZiB0ZXN0X2RvdWJsZV9jbG9zZShzZWxmKToKKyAgICAgICAgIyBtYWtlIHN1cmUgYSBkb3VibGUgY2xvc2UgZG9lc24ndCBjcmFzaCBvbiBTb2xhcmlzIChCdWcjIDY2NTkxMykKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAndysnKQogCi0gICAgIyBtYWtlIHN1cmUgYSBkb3VibGUgY2xvc2UgZG9lc24ndCBjcmFzaCBvbiBTb2xhcmlzIChCdWcjIDY2NTkxMykKLSAgICBmID0gb3BlbihURVNURk4sICd3KycpCi0KLSAgICB0cnk6ICAgICMgdW5saW5rIFRFU1RGTiBubyBtYXR0ZXIgd2hhdAogICAgICAgICBmLndyaXRlKDIqKjE2ICogJ2EnKSAjIEFyYml0cmFyeSBjaGFyYWN0ZXIKICAgICAgICAgZi5jbG9zZSgpCiAKQEAgLTMyNCw3MiArMjY4LDQ2IEBACiAgICAgICAgIG1mLmNsb3NlKCkKICAgICAgICAgZi5jbG9zZSgpCiAKLSAgICBmaW5hbGx5OgotICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQorICAgIGRlZiB0ZXN0X2VudGlyZV9maWxlKHNlbGYpOgorICAgICAgICAjIHRlc3QgbWFwcGluZyBvZiBlbnRpcmUgZmlsZSBieSBwYXNzaW5nIDAgZm9yIG1hcCBsZW5ndGgKKyAgICAgICAgaWYgaGFzYXR0cihvcywgInN0YXQiKToKKyAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgIncrIikKIAotICAgICMgdGVzdCBtYXBwaW5nIG9mIGVudGlyZSBmaWxlIGJ5IHBhc3NpbmcgMCBmb3IgbWFwIGxlbmd0aAotICAgIGlmIGhhc2F0dHIob3MsICJzdGF0Iik6Ci0gICAgICAgIHByaW50ICIgIEVuc3VyaW5nIHRoYXQgcGFzc2luZyAwIGFzIG1hcCBsZW5ndGggc2V0cyBtYXAgc2l6ZSB0byBjdXJyZW50IGZpbGUgc2l6ZS4iCi0gICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgIncrIikKLQotICAgICAgICB0cnk6CiAgICAgICAgICAgICBmLndyaXRlKDIqKjE2ICogJ20nKSAjIEFyYml0cmFyeSBjaGFyYWN0ZXIKICAgICAgICAgICAgIGYuY2xvc2UoKQogCiAgICAgICAgICAgICBmID0gb3BlbihURVNURk4sICJyYisiKQogICAgICAgICAgICAgbWYgPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgMCkKLSAgICAgICAgICAgIHZlcmlmeShsZW4obWYpID09IDIqKjE2LCAiTWFwIHNpemUgc2hvdWxkIGVxdWFsIGZpbGUgc2l6ZS4iKQotICAgICAgICAgICAgdmVyZXEobWYucmVhZCgyKioxNiksIDIqKjE2ICogIm0iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obWYpLCAyKioxNiwgIk1hcCBzaXplIHNob3VsZCBlcXVhbCBmaWxlIHNpemUuIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWYucmVhZCgyKioxNiksIDIqKjE2ICogIm0iKQogICAgICAgICAgICAgbWYuY2xvc2UoKQogICAgICAgICAgICAgZi5jbG9zZSgpCiAKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCisgICAgZGVmIHRlc3RfbW92ZShzZWxmKToKKyAgICAgICAgIyBtYWtlIG1vdmUgd29ya3MgZXZlcnl3aGVyZSAoNjQtYml0IGZvcm1hdCBwcm9ibGVtIGVhcmxpZXIpCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3crJykKIAotICAgICMgdGVzdCBtYXBwaW5nIG9mIGVudGlyZSBmaWxlIGJ5IHBhc3NpbmcgMCBmb3IgbWFwIGxlbmd0aAotICAgIGlmIGhhc2F0dHIob3MsICJzdGF0Iik6Ci0gICAgICAgIHByaW50ICIgIEVuc3VyaW5nIHRoYXQgcGFzc2luZyAwIGFzIG1hcCBsZW5ndGggc2V0cyBtYXAgc2l6ZSB0byBjdXJyZW50IGZpbGUgc2l6ZS4iCi0gICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgIncrIikKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZi53cml0ZSgyKioxNiAqICdtJykgIyBBcmJpdHJhcnkgY2hhcmFjdGVyCi0gICAgICAgICAgICBmLmNsb3NlKCkKLQotICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAicmIrIikKLSAgICAgICAgICAgIG1mID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIDApCi0gICAgICAgICAgICB2ZXJpZnkobGVuKG1mKSA9PSAyKioxNiwgIk1hcCBzaXplIHNob3VsZCBlcXVhbCBmaWxlIHNpemUuIikKLSAgICAgICAgICAgIHZlcmVxKG1mLnJlYWQoMioqMTYpLCAyKioxNiAqICJtIikKLSAgICAgICAgICAgIG1mLmNsb3NlKCkKLSAgICAgICAgICAgIGYuY2xvc2UoKQotCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQotCi0gICAgIyBtYWtlIG1vdmUgd29ya3MgZXZlcnl3aGVyZSAoNjQtYml0IGZvcm1hdCBwcm9ibGVtIGVhcmxpZXIpCi0gICAgZiA9IG9wZW4oVEVTVEZOLCAndysnKQotCi0gICAgdHJ5OiAgICAjIHVubGluayBURVNURk4gbm8gbWF0dGVyIHdoYXQKICAgICAgICAgZi53cml0ZSgiQUJDREVhYmNkZSIpICMgQXJiaXRyYXJ5IGNoYXJhY3RlcgogICAgICAgICBmLmZsdXNoKCkKIAogICAgICAgICBtZiA9IG1tYXAubW1hcChmLmZpbGVubygpLCAxMCkKICAgICAgICAgbWYubW92ZSg1LCAwLCA1KQotICAgICAgICB2ZXJpZnkobWZbOl0gPT0gIkFCQ0RFQUJDREUiLCAiTWFwIG1vdmUgc2hvdWxkIGhhdmUgZHVwbGljYXRlZCBmcm9udCA1IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZls6XSwgIkFCQ0RFQUJDREUiLCAiTWFwIG1vdmUgc2hvdWxkIGhhdmUgZHVwbGljYXRlZCBmcm9udCA1IikKICAgICAgICAgbWYuY2xvc2UoKQogICAgICAgICBmLmNsb3NlKCkKIAotICAgIGZpbmFsbHk6Ci0gICAgICAgIG9zLnVubGluayhURVNURk4pCisgICAgZGVmIHRlc3RfYW5vbnltb3VzKHNlbGYpOgorICAgICAgICAjIGFub255bW91cyBtbWFwLm1tYXAoLTEsIFBBR0UpCisgICAgICAgIG0gPSBtbWFwLm1tYXAoLTEsIFBBR0VTSVpFKQorICAgICAgICBmb3IgeCBpbiB4cmFuZ2UoUEFHRVNJWkUpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtW3hdLCAnXDAnLCAiYW5vbnltb3VzbHkgbW1hcCdlZCBjb250ZW50cyBzaG91bGQgYmUgemVybyIpCiAKLWRlZiB0ZXN0X2Fub24oKToKLSAgICBwcmludCAiICBhbm9ueW1vdXMgbW1hcC5tbWFwKC0xLCBQQUdFU0laRSkuLi4iCi0gICAgbSA9IG1tYXAubW1hcCgtMSwgUEFHRVNJWkUpCi0gICAgZm9yIHggaW4geHJhbmdlKFBBR0VTSVpFKToKLSAgICAgICAgdmVyaWZ5KG1beF0gPT0gJ1wwJywgImFub255bW91c2x5IG1tYXAnZWQgY29udGVudHMgc2hvdWxkIGJlIHplcm8iKQorICAgICAgICBmb3IgeCBpbiB4cmFuZ2UoUEFHRVNJWkUpOgorICAgICAgICAgICAgbVt4XSA9IGNoID0gY2hyKHggJiAyNTUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1beF0sIGNoKQogCi0gICAgZm9yIHggaW4geHJhbmdlKFBBR0VTSVpFKToKLSAgICAgICAgbVt4XSA9IGNoID0gY2hyKHggJiAyNTUpCi0gICAgICAgIHZlcmVxKG1beF0sIGNoKQorZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChNbWFwVGVzdHMpCiAKLXRlc3RfYm90aCgpCi10ZXN0X2Fub24oKQotcHJpbnQgJyBUZXN0IHBhc3NlZCcKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbW9kdWxlZmluZGVyLnB5IGIvTGliL3Rlc3QvdGVzdF9tb2R1bGVmaW5kZXIucHkKaW5kZXggMGI4ZTQ1MS4uN2RhMjQxYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tb2R1bGVmaW5kZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tb2R1bGVmaW5kZXIucHkKQEAgLTUwLDcgKzUwLDcgQEAKIG1heWJlX3Rlc3RfbmV3ID0gWwogICAgICJhLm1vZHVsZSIsCiAgICAgWyJhIiwgImEubW9kdWxlIiwgInN5cyIsCi0gICAgICJiIl0sCisgICAgICJiIiwgIl9fZnV0dXJlX18iXSwKICAgICBbImMiXSwgWyJiLnNvbWV0aGluZyJdLAogICAgICIiIlwKIGEvX19pbml0X18ucHkKQEAgLTU4LDYgKzU4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBiIGltcG9ydCBzb21ldGhpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBjIGltcG9ydCBzb21ldGhpbmcKIGIvX19pbml0X18ucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBzeXMgaW1wb3J0ICoKICIiIl0KIApAQCAtODYsMTIgKzg3LDEzIEBACiAgICAgImEubW9kdWxlIiwKICAgICBbImEiLCAiYS5tb2R1bGUiLAogICAgICAiYiIsICJiLngiLCAiYi55IiwgImIueiIsCi0gICAgICJzeXMiLCAiZXhjZXB0aW9ucyJdLAorICAgICAiX19mdXR1cmVfXyIsICJzeXMiLCAiZXhjZXB0aW9ucyJdLAogICAgIFsiYmxhaGJsYWgiLCAieiJdLCBbXSwKICAgICAiIiJcCiBteW1vZHVsZS5weQogYS9fX2luaXRfXy5weQogYS9tb2R1bGUucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHN5cyAjIHN5cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgYmxhaGJsYWggIyBmYWlscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgZXhjZXB0aW9ucyAjIGV4Y2VwdGlvbnMKQEAgLTExNSw3ICsxMTcsOCBAQAogCiByZWxhdGl2ZV9pbXBvcnRfdGVzdCA9IFsKICAgICAiYS5tb2R1bGUiLAotICAgIFsiYSIsICJhLm1vZHVsZSIsCisgICAgWyJfX2Z1dHVyZV9fIiwKKyAgICAgImEiLCAiYS5tb2R1bGUiLAogICAgICAiYS5iIiwgImEuYi55IiwgImEuYi56IiwKICAgICAgImEuYi5jIiwgImEuYi5jLm1vZHVsZUMiLAogICAgICAiYS5iLmMuZCIsICJhLmIuYy5lIiwKQEAgLTEyNyw2ICsxMzAsNyBAQAogYS9fX2luaXRfXy5weQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIC5iIGltcG9ydCB5LCB6ICMgYS5iLnksIGEuYi56CiBhL21vZHVsZS5weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCAjIF9fZnV0dXJlX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGV4Y2VwdGlvbnMgIyBleGNlcHRpb25zCiBhL2V4Y2VwdGlvbnMucHkKIGEvc3lzLnB5CkBAIC0yNTMsNiArMjU3LDcgQEAKICAgICAgICAgICAgIHNlbGYuX2RvX3Rlc3QocmVsYXRpdmVfaW1wb3J0X3Rlc3RfMikKIAogZGVmIHRlc3RfbWFpbigpOgorICAgIGRpc3R1dGlscy5sb2cuc2V0X3RocmVzaG9sZChkaXN0dXRpbHMubG9nLldBUk4pCiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChNb2R1bGVGaW5kZXJUZXN0KQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weSBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKaW5kZXggOTVmNGIzOC4uZmI3ZjgyZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5CkBAIC0yMDIsNiArMjAyLDIyIEBACiAgICAgICAgIHVuaSA9IHUnOmh1NDp1bml0XHhlOSBkZSBmYW1pbGxlJwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzbzIwMjJqcDIuZGVjb2RlKCdpc28yMDIyLWpwLTInKSwgdW5pKQogCisgICAgZGVmIHRlc3RfaXNvMjAyMl9qcF9nMChzZWxmKToKKyAgICAgICAgc2VsZi5mYWlsSWYoJ1x4MGUnIGluIHUnXE57U09GVCBIWVBIRU59Jy5lbmNvZGUoJ2lzby0yMDIyLWpwLTInKSkKKyAgICAgICAgZm9yIGVuY29kaW5nIGluICgnaXNvLTIwMjItanAtMjAwNCcsICdpc28tMjAyMi1qcC0zJyk6CisgICAgICAgICAgICBlID0gdSdcdTM0MDYnLmVuY29kZShlbmNvZGluZykKKyAgICAgICAgICAgIHNlbGYuZmFpbElmKGZpbHRlcihsYW1iZGEgeDogeCA+PSAnXHg4MCcsIGUpKQorCisgICAgZGVmIHRlc3RfYnVnMTU3MjgzMihzZWxmKToKKyAgICAgICAgaWYgc3lzLm1heHVuaWNvZGUgPj0gMHgxMDAwMDoKKyAgICAgICAgICAgIG15dW5pY2hyID0gdW5pY2hyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBteXVuaWNociA9IGxhbWJkYSB4OiB1bmljaHIoMHhEN0MwKyh4Pj4xMCkpICsgdW5pY2hyKDB4REMwMCsoeCYweDNGRikpCisKKyAgICAgICAgZm9yIHggaW4geHJhbmdlKDB4MTAwMDAsIDB4MTEwMDAwKToKKyAgICAgICAgICAgICMgQW55IElTTyAyMDIyIGNvZGVjIHdpbGwgY2F1c2UgdGhlIHNlZ2ZhdWx0CisgICAgICAgICAgICBteXVuaWNocih4KS5lbmNvZGUoJ2lzb18yMDIyX2pwJywgJ2lnbm9yZScpCisKIGRlZiB0ZXN0X21haW4oKToKICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCiAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoVGVzdF9NdWx0aWJ5dGVDb2RlYykpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X211dGFudHMucHkgYi9MaWIvdGVzdC90ZXN0X211dGFudHMucHkKaW5kZXggOGFmZGE3NS4uNjIxNTIyNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tdXRhbnRzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbXV0YW50cy5weQpAQCAtOTIsOCArOTIsOCBAQAogICAgICAgICAjI3NlbGYuaGFzaGNvZGUgPSByYW5kb20ucmFuZHJhbmdlKDEwMDAwMDAwMDApCiAKICAgICBkZWYgX19oYXNoX18oc2VsZik6Ci0gICAgICAgICMjcmV0dXJuIHNlbGYuaGFzaGNvZGUKICAgICAgICAgcmV0dXJuIDQyCisgICAgICAgIHJldHVybiBzZWxmLmhhc2hjb2RlCiAKICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAgbWF5YmVfbXV0YXRlKCkgICAjIFRoZSBwb2ludCBvZiB0aGUgdGVzdC4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbmV3LnB5IGIvTGliL3Rlc3QvdGVzdF9uZXcucHkKaW5kZXggM2MxNmJmNS4uZTkwZmQ2NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9uZXcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9uZXcucHkKQEAgLTQ3LDYgKzQ3LDE0IEBACiBlbHNlOgogICAgIHJhaXNlIFRlc3RGYWlsZWQsICJkYW5nZXJvdXMgaW5zdGFuY2UgbWV0aG9kIGNyZWF0aW9uIGFsbG93ZWQiCiAKKyMgVmVyaWZ5IHRoYXQgaW5zdGFuY2VtZXRob2QoKSBkb2Vzbid0IGFsbG93IGtleXdvcmQgYXJncwordHJ5OgorICAgIG5ldy5pbnN0YW5jZW1ldGhvZChicmVha195b2xrcywgYywga3c9MSkKK2V4Y2VwdCBUeXBlRXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICByYWlzZSBUZXN0RmFpbGVkLCAiaW5zdGFuY2VtZXRob2Qgc2hvdWxkbid0IGFjY2VwdCBrZXl3b3JkIGFyZ3MiCisKICMgSXQncyB1bmNsZWFyIHdoYXQgdGhlIHNlbWFudGljcyBzaG91bGQgYmUgZm9yIGEgY29kZSBvYmplY3QgY29tcGlsZWQgYXQKICMgbW9kdWxlIHNjb3BlLCBidXQgYm91bmQgYW5kIHJ1biBpbiBhIGZ1bmN0aW9uLiAgSW4gQ1B5dGhvbiwgYGMnIGlzIGdsb2JhbAogIyAoYnkgYWNjaWRlbnQ/KSB3aGlsZSBpbiBKeXRob24sIGBjJyBpcyBsb2NhbC4gIFRoZSBpbnRlbnQgb2YgdGhlIHRlc3QKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbmlzLnB5IGIvTGliL3Rlc3QvdGVzdF9uaXMucHkKaW5kZXggZjUyMjRmZS4uNTkwODY4ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9uaXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9uaXMucHkKQEAgLTEsMzIgKzEsNDEgQEAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIFRlc3RGYWlsZWQsIFRlc3RTa2lwcGVkCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBydW5fdW5pdHRlc3QKK2ltcG9ydCB1bml0dGVzdAogaW1wb3J0IG5pcwogCi1wcmludCAnbmlzLm1hcHMoKScKLXRyeToKLSAgICBtYXBzID0gbmlzLm1hcHMoKQotZXhjZXB0IG5pcy5lcnJvciwgbXNnOgotICAgICMgTklTIGlzIHByb2JhYmx5IG5vdCBhY3RpdmUsIHNvIHRoaXMgdGVzdCBpc24ndCB1c2VmdWwKLSAgICBpZiB2ZXJib3NlOgotICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCBtc2cKLSAgICAjIG9ubHkgZG8gdGhpcyBpZiBydW5uaW5nIHVuZGVyIHRoZSByZWdyZXNzaW9uIHN1aXRlCi0gICAgcmFpc2UgVGVzdFNraXBwZWQsIG1zZworY2xhc3MgTmlzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X21hcHMoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1hcHMgPSBuaXMubWFwcygpCisgICAgICAgIGV4Y2VwdCBuaXMuZXJyb3IsIG1zZzoKKyAgICAgICAgICAgICMgTklTIGlzIHByb2JhYmx5IG5vdCBhY3RpdmUsIHNvIHRoaXMgdGVzdCBpc24ndCB1c2VmdWwKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCIoZmFpbGluZyBiZWNhdXNlIG9mIHZlcmJvc2UgbW9kZSkgJXMiICUgbXNnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgT24gc29tZSBzeXN0ZW1zLCB0aGlzIG1hcCBpcyBvbmx5IGFjY2Vzc2libGUgdG8gdGhlCisgICAgICAgICAgICAjIHN1cGVyIHVzZXIKKyAgICAgICAgICAgIG1hcHMucmVtb3ZlKCJwYXNzd2QuYWRqdW5jdC5ieW5hbWUiKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKIAotZG9uZSA9IDAKLWZvciBuaXNtYXAgaW4gbWFwczoKLSAgICBpZiB2ZXJib3NlOgotICAgICAgICBwcmludCBuaXNtYXAKLSAgICBtYXBwaW5nID0gbmlzLmNhdChuaXNtYXApCi0gICAgZm9yIGssIHYgaW4gbWFwcGluZy5pdGVtcygpOgotICAgICAgICBpZiB2ZXJib3NlOgotICAgICAgICAgICAgcHJpbnQgJyAgICAnLCBrLCB2Ci0gICAgICAgIGlmIG5vdCBrOgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgaWYgbmlzLm1hdGNoKGssIG5pc21hcCkgIT0gdjoKLSAgICAgICAgICAgIHByaW50ICJOSVMgbWF0Y2ggZmFpbGVkIGZvciBrZXkgYCVzJyBpbiBtYXAgYCVzJyIgJSAoaywgbmlzbWFwKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgIyBqdXN0IHRlc3QgdGhlIG9uZSBrZXksIG90aGVyd2lzZSB0aGlzIHRlc3QgY291bGQgdGFrZSBhCi0gICAgICAgICAgICAjIHZlcnkgbG9uZyB0aW1lCi0gICAgICAgICAgICBkb25lID0gMQotICAgICAgICAgICAgYnJlYWsKLSAgICBpZiBkb25lOgotICAgICAgICBicmVhaworICAgICAgICBkb25lID0gMAorICAgICAgICBmb3IgbmlzbWFwIGluIG1hcHM6CisgICAgICAgICAgICBtYXBwaW5nID0gbmlzLmNhdChuaXNtYXApCisgICAgICAgICAgICBmb3IgaywgdiBpbiBtYXBwaW5nLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgbm90IGs6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgbmlzLm1hdGNoKGssIG5pc21hcCkgIT0gdjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJOSVMgbWF0Y2ggZmFpbGVkIGZvciBrZXkgYCVzJyBpbiBtYXAgYCVzJyIgJSAoaywgbmlzbWFwKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIGp1c3QgdGVzdCB0aGUgb25lIGtleSwgb3RoZXJ3aXNlIHRoaXMgdGVzdCBjb3VsZCB0YWtlIGEKKyAgICAgICAgICAgICAgICAgICAgIyB2ZXJ5IGxvbmcgdGltZQorICAgICAgICAgICAgICAgICAgICBkb25lID0gMQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgZG9uZToKKyAgICAgICAgICAgICAgICBicmVhaworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KE5pc1Rlc3RzKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X29wY29kZXMucHkgYi9MaWIvdGVzdC90ZXN0X29wY29kZXMucHkKaW5kZXggNzQyMjY3Zi4uMWEyZjVkNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcGNvZGVzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfb3Bjb2Rlcy5weQpAQCAtMSwxMDEgKzEsMTEwIEBACiAjIFB5dGhvbiB0ZXN0IHNldCAtLSBwYXJ0IDIsIG9wY29kZXMKIAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdEZhaWxlZAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgT3Bjb2RlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF90cnlfaW5zaWRlX2Zvcl9sb29wKHNlbGYpOgorICAgICAgICBuID0gMAorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICBuID0gbitpCisgICAgICAgICAgICB0cnk6IDEvMAorICAgICAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjogcGFzcworICAgICAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOiBwYXNzCisgICAgICAgICAgICB0cnk6IHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDogcGFzcworICAgICAgICAgICAgdHJ5OiBwYXNzCisgICAgICAgICAgICBmaW5hbGx5OiBwYXNzCisgICAgICAgICAgICBuID0gbitpCisgICAgICAgIGlmIG4gIT0gOTA6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ3RyeSBpbnNpZGUgZm9yJykKKworICAgIGRlZiB0ZXN0X3JhaXNlX2NsYXNzX2V4Y2VwdGlvbnMoc2VsZik6CisKKyAgICAgICAgY2xhc3MgQUNsYXNzKEV4Y2VwdGlvbik6IHBhc3MKKyAgICAgICAgY2xhc3MgQkNsYXNzKEFDbGFzcyk6IHBhc3MKKyAgICAgICAgY2xhc3MgQ0NsYXNzKEV4Y2VwdGlvbik6IHBhc3MKKyAgICAgICAgY2xhc3MgRENsYXNzKEFDbGFzcyk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaWdub3JlKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgdHJ5OiByYWlzZSBBQ2xhc3MoKQorICAgICAgICBleGNlcHQ6IHBhc3MKKworICAgICAgICB0cnk6IHJhaXNlIEFDbGFzcygpCisgICAgICAgIGV4Y2VwdCBBQ2xhc3M6IHBhc3MKKworICAgICAgICB0cnk6IHJhaXNlIEJDbGFzcygpCisgICAgICAgIGV4Y2VwdCBBQ2xhc3M6IHBhc3MKKworICAgICAgICB0cnk6IHJhaXNlIEJDbGFzcygpCisgICAgICAgIGV4Y2VwdCBDQ2xhc3M6IHNlbGYuZmFpbCgpCisgICAgICAgIGV4Y2VwdDogcGFzcworCisgICAgICAgIGEgPSBBQ2xhc3MoKQorICAgICAgICBiID0gQkNsYXNzKCkKKworICAgICAgICB0cnk6IHJhaXNlIEFDbGFzcywgYgorICAgICAgICBleGNlcHQgQkNsYXNzLCB2OgorICAgICAgICAgICAgaWYgdiAhPSBiOiBzZWxmLmZhaWwoInYhPWIiKQorICAgICAgICBlbHNlOiBzZWxmLmZhaWwoIm5vIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgdHJ5OiByYWlzZSBiCisgICAgICAgIGV4Y2VwdCBBQ2xhc3MsIHY6CisgICAgICAgICAgICBpZiB2ICE9IGI6IHNlbGYuZmFpbCgidiE9YiBBQ2xhc3MiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBleGNlcHRpb24iKQorCisgICAgICAgICMgbm90IGVub3VnaCBhcmd1bWVudHMKKyAgICAgICAgIyN0cnk6ICByYWlzZSBCQ2xhc3MsIGEKKyAgICAgICAgIyNleGNlcHQgVHlwZUVycm9yOiBwYXNzCisgICAgICAgICMjZWxzZTogc2VsZi5mYWlsKCJubyBleGNlcHRpb24iKQorCisgICAgICAgIHRyeTogIHJhaXNlIERDbGFzcywgYQorICAgICAgICBleGNlcHQgRENsYXNzLCB2OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodiwgRENsYXNzKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gZXhjZXB0aW9uIikKKworICAgIGRlZiB0ZXN0X2NvbXBhcmVfZnVuY3Rpb25fb2JqZWN0cyhzZWxmKToKKworICAgICAgICBmID0gZXZhbCgnbGFtYmRhOiBOb25lJykKKyAgICAgICAgZyA9IGV2YWwoJ2xhbWJkYTogTm9uZScpCisgICAgICAgIHNlbGYuZmFpbElmKGYgPT0gZykKKworICAgICAgICBmID0gZXZhbCgnbGFtYmRhIGE6IGEnKQorICAgICAgICBnID0gZXZhbCgnbGFtYmRhIGE6IGEnKQorICAgICAgICBzZWxmLmZhaWxJZihmID09IGcpCisKKyAgICAgICAgZiA9IGV2YWwoJ2xhbWJkYSBhPTE6IGEnKQorICAgICAgICBnID0gZXZhbCgnbGFtYmRhIGE9MTogYScpCisgICAgICAgIHNlbGYuZmFpbElmKGYgPT0gZykKKworICAgICAgICBmID0gZXZhbCgnbGFtYmRhOiAwJykKKyAgICAgICAgZyA9IGV2YWwoJ2xhbWJkYTogMScpCisgICAgICAgIHNlbGYuZmFpbElmKGYgPT0gZykKKworICAgICAgICBmID0gZXZhbCgnbGFtYmRhOiBOb25lJykKKyAgICAgICAgZyA9IGV2YWwoJ2xhbWJkYSBhOiBOb25lJykKKyAgICAgICAgc2VsZi5mYWlsSWYoZiA9PSBnKQorCisgICAgICAgIGYgPSBldmFsKCdsYW1iZGEgYTogTm9uZScpCisgICAgICAgIGcgPSBldmFsKCdsYW1iZGEgYjogTm9uZScpCisgICAgICAgIHNlbGYuZmFpbElmKGYgPT0gZykKKworICAgICAgICBmID0gZXZhbCgnbGFtYmRhIGE6IE5vbmUnKQorICAgICAgICBnID0gZXZhbCgnbGFtYmRhIGE9Tm9uZTogTm9uZScpCisgICAgICAgIHNlbGYuZmFpbElmKGYgPT0gZykKKworICAgICAgICBmID0gZXZhbCgnbGFtYmRhIGE9MDogTm9uZScpCisgICAgICAgIGcgPSBldmFsKCdsYW1iZGEgYT0xOiBOb25lJykKKyAgICAgICAgc2VsZi5mYWlsSWYoZiA9PSBnKQogCiAKLXByaW50ICcyLiBPcGNvZGVzJwotcHJpbnQgJ1hYWCBOb3QgeWV0IGZ1bGx5IGltcGxlbWVudGVkJworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChPcGNvZGVUZXN0KQogCi1wcmludCAnMi4xIHRyeSBpbnNpZGUgZm9yIGxvb3AnCi1uID0gMAotZm9yIGkgaW4gcmFuZ2UoMTApOgotICAgIG4gPSBuK2kKLSAgICB0cnk6IDEvMAotICAgIGV4Y2VwdCBOYW1lRXJyb3I6IHBhc3MKLSAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKLSAgICBleGNlcHQgVHlwZUVycm9yOiBwYXNzCi0gICAgdHJ5OiBwYXNzCi0gICAgZXhjZXB0OiBwYXNzCi0gICAgdHJ5OiBwYXNzCi0gICAgZmluYWxseTogcGFzcwotICAgIG4gPSBuK2kKLWlmIG4gIT0gOTA6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZCwgJ3RyeSBpbnNpZGUgZm9yJwotCi0KLXByaW50ICcyLjIgcmFpc2UgY2xhc3MgZXhjZXB0aW9ucycKLQotY2xhc3MgQUNsYXNzKEV4Y2VwdGlvbik6IHBhc3MKLWNsYXNzIEJDbGFzcyhBQ2xhc3MpOiBwYXNzCi1jbGFzcyBDQ2xhc3MoRXhjZXB0aW9uKTogcGFzcwotY2xhc3MgRENsYXNzKEFDbGFzcyk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGlnbm9yZSk6Ci0gICAgICAgIHBhc3MKLQotdHJ5OiByYWlzZSBBQ2xhc3MoKQotZXhjZXB0OiBwYXNzCi0KLXRyeTogcmFpc2UgQUNsYXNzKCkKLWV4Y2VwdCBBQ2xhc3M6IHBhc3MKLQotdHJ5OiByYWlzZSBCQ2xhc3MoKQotZXhjZXB0IEFDbGFzczogcGFzcwotCi10cnk6IHJhaXNlIEJDbGFzcygpCi1leGNlcHQgQ0NsYXNzOiByYWlzZSBUZXN0RmFpbGVkCi1leGNlcHQ6IHBhc3MKLQotYSA9IEFDbGFzcygpCi1iID0gQkNsYXNzKCkKLQotdHJ5OiByYWlzZSBBQ2xhc3MsIGIKLWV4Y2VwdCBCQ2xhc3MsIHY6Ci0gICAgaWYgdiAhPSBiOiByYWlzZSBUZXN0RmFpbGVkLCAidiE9YiIKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICJubyBleGNlcHRpb24iCi0KLXRyeTogcmFpc2UgYgotZXhjZXB0IEFDbGFzcywgdjoKLSAgICBpZiB2ICE9IGI6IHJhaXNlIFRlc3RGYWlsZWQsICJ2IT1iIEFDbGFzcyIKLQotIyBub3QgZW5vdWdoIGFyZ3VtZW50cwotIyN0cnk6ICByYWlzZSBCQ2xhc3MsIGEKLSMjZXhjZXB0IFR5cGVFcnJvcjogcGFzcwotCi10cnk6ICByYWlzZSBEQ2xhc3MsIGEKLWV4Y2VwdCBEQ2xhc3MsIHY6Ci0gICAgaWYgbm90IGlzaW5zdGFuY2UodiwgRENsYXNzKToKLSAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgInYgbm90IERDbGFzcyIKLQotcHJpbnQgJzIuMyBjb21wYXJpbmcgZnVuY3Rpb24gb2JqZWN0cycKLQotZiA9IGV2YWwoJ2xhbWJkYTogTm9uZScpCi1nID0gZXZhbCgnbGFtYmRhOiBOb25lJykKLWlmIGYgPT0gZzogcmFpc2UgVGVzdEZhaWxlZCwgImZ1bmN0aW9ucyBzaG91bGQgbm90IGJlIHNhbWUiCi0KLWYgPSBldmFsKCdsYW1iZGEgYTogYScpCi1nID0gZXZhbCgnbGFtYmRhIGE6IGEnKQotaWYgZiA9PSBnOiByYWlzZSBUZXN0RmFpbGVkLCAiZnVuY3Rpb25zIHNob3VsZCBub3QgYmUgc2FtZSIKLQotZiA9IGV2YWwoJ2xhbWJkYSBhPTE6IGEnKQotZyA9IGV2YWwoJ2xhbWJkYSBhPTE6IGEnKQotaWYgZiA9PSBnOiByYWlzZSBUZXN0RmFpbGVkLCAiZnVuY3Rpb25zIHNob3VsZCBub3QgYmUgc2FtZSIKLQotZiA9IGV2YWwoJ2xhbWJkYTogMCcpCi1nID0gZXZhbCgnbGFtYmRhOiAxJykKLWlmIGYgPT0gZzogcmFpc2UgVGVzdEZhaWxlZAotCi1mID0gZXZhbCgnbGFtYmRhOiBOb25lJykKLWcgPSBldmFsKCdsYW1iZGEgYTogTm9uZScpCi1pZiBmID09IGc6IHJhaXNlIFRlc3RGYWlsZWQKLQotZiA9IGV2YWwoJ2xhbWJkYSBhOiBOb25lJykKLWcgPSBldmFsKCdsYW1iZGEgYjogTm9uZScpCi1pZiBmID09IGc6IHJhaXNlIFRlc3RGYWlsZWQKLQotZiA9IGV2YWwoJ2xhbWJkYSBhOiBOb25lJykKLWcgPSBldmFsKCdsYW1iZGEgYT1Ob25lOiBOb25lJykKLWlmIGYgPT0gZzogcmFpc2UgVGVzdEZhaWxlZAotCi1mID0gZXZhbCgnbGFtYmRhIGE9MDogTm9uZScpCi1nID0gZXZhbCgnbGFtYmRhIGE9MTogTm9uZScpCi1pZiBmID09IGc6IHJhaXNlIFRlc3RGYWlsZWQKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3BlbnB0eS5weSBiL0xpYi90ZXN0L3Rlc3Rfb3BlbnB0eS5weQppbmRleCBhOGI4NTUwLi42NDcxZjU4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X29wZW5wdHkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcGVucHR5LnB5CkBAIC0xLDE5ICsxLDIzIEBACiAjIFRlc3QgdG8gc2VlIGlmIG9wZW5wdHkgd29ya3MuIChCdXQgZG9uJ3Qgd29ycnkgaWYgaXQgaXNuJ3QgYXZhaWxhYmxlLikKIAotaW1wb3J0IG9zCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBUZXN0RmFpbGVkLCBUZXN0U2tpcHBlZAoraW1wb3J0IG9zLCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBUZXN0U2tpcHBlZAogCi10cnk6Ci0gICAgaWYgdmVyYm9zZToKLSAgICAgICAgcHJpbnQgIkNhbGxpbmcgb3Mub3BlbnB0eSgpIgotICAgIG1hc3Rlciwgc2xhdmUgPSBvcy5vcGVucHR5KCkKLSAgICBpZiB2ZXJib3NlOgotICAgICAgICBwcmludCAiKG1hc3Rlciwgc2xhdmUpID0gKCVkLCAlZCkiJShtYXN0ZXIsIHNsYXZlKQotZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgoraWYgbm90IGhhc2F0dHIob3MsICJvcGVucHR5Iik6CiAgICAgcmFpc2UgVGVzdFNraXBwZWQsICJObyBvcGVucHR5KCkgYXZhaWxhYmxlLiIKIAotaWYgbm90IG9zLmlzYXR0eShzbGF2ZSk6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZCwgIlNsYXZlLWVuZCBvZiBwdHkgaXMgbm90IGEgdGVybWluYWwuIgogCi1vcy53cml0ZShzbGF2ZSwgJ1BpbmchJykKLXByaW50IG9zLnJlYWQobWFzdGVyLCAxMDI0KQorY2xhc3MgT3BlbnB0eVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICBtYXN0ZXIsIHNsYXZlID0gb3Mub3BlbnB0eSgpCisgICAgICAgIGlmIG5vdCBvcy5pc2F0dHkoc2xhdmUpOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJTbGF2ZS1lbmQgb2YgcHR5IGlzIG5vdCBhIHRlcm1pbmFsLiIpCisKKyAgICAgICAgb3Mud3JpdGUoc2xhdmUsICdQaW5nIScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucmVhZChtYXN0ZXIsIDEwMjQpLCAnUGluZyEnKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KE9wZW5wdHlUZXN0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X29zLnB5IGIvTGliL3Rlc3QvdGVzdF9vcy5weQppbmRleCBiZjBlMTk2Li4xYzg3ZDA2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X29zLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfb3MucHkKQEAgLTIyMyw2ICsyMjMsMjMgQEAKICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgIHBhc3MKIAorICAgIGRlZiB0ZXN0X3V0aW1lX2RpcihzZWxmKToKKyAgICAgICAgZGVsdGEgPSAxMDAwMDAwCisgICAgICAgIHN0ID0gb3Muc3RhdCh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAjIHJvdW5kIHRvIGludCwgYmVjYXVzZSBzb21lIHN5c3RlbXMgbWF5IHN1cHBvcnQgc3ViLXNlY29uZAorICAgICAgICAjIHRpbWUgc3RhbXBzIGluIHN0YXQsIGJ1dCBub3QgaW4gdXRpbWUuCisgICAgICAgIG9zLnV0aW1lKHRlc3Rfc3VwcG9ydC5URVNURk4sIChzdC5zdF9hdGltZSwgaW50KHN0LnN0X210aW1lLWRlbHRhKSkpCisgICAgICAgIHN0MiA9IG9zLnN0YXQodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc3QyLnN0X210aW1lLCBpbnQoc3Quc3RfbXRpbWUtZGVsdGEpKQorCisgICAgIyBSZXN0cmljdCB0ZXN0IHRvIFdpbjMyLCBzaW5jZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgb3RoZXIKKyAgICAjIHN5c3RlbXMgc3VwcG9ydCBjZW50aXNlY29uZHMKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgZGVmIHRlc3RfMTU2NTE1MChzZWxmKToKKyAgICAgICAgICAgIHQxID0gMTE1OTE5NTAzOS4yNQorICAgICAgICAgICAgb3MudXRpbWUoc2VsZi5mbmFtZSwgKHQxLCB0MSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvcy5zdGF0KHNlbGYuZm5hbWUpLnN0X210aW1lLCB0MSkKKwogZnJvbSB0ZXN0IGltcG9ydCBtYXBwaW5nX3Rlc3RzCiAKIGNsYXNzIEVudmlyb25UZXN0cyhtYXBwaW5nX3Rlc3RzLkJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BhcnNlci5weSBiL0xpYi90ZXN0L3Rlc3RfcGFyc2VyLnB5CmluZGV4IDk2Mzg0Y2QuLjBiZjEyMTggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGFyc2VyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGFyc2VyLnB5CkBAIC0xODMsNiArMTgzLDQ0IEBACiAgICAgZGVmIHRlc3RfYXNzZXJ0KHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJhc3NlcnQgYWxvIDwgYWhpIGFuZCBibG8gPCBiaGlcbiIpCiAKKyAgICBkZWYgdGVzdF9wb3NpdGlvbihzZWxmKToKKyAgICAgICAgIyBBbiBhYnNvbHV0ZWx5IG1pbmltYWwgdGVzdCBvZiBwb3NpdGlvbiBpbmZvcm1hdGlvbi4gIEJldHRlcgorICAgICAgICAjIHRlc3RzIHdvdWxkIGJlIGEgYmlnIHByb2plY3QuCisgICAgICAgIGNvZGUgPSAiZGVmIGYoeCk6XG4gICAgcmV0dXJuIHggKyAxXG4iCisgICAgICAgIHN0MSA9IHBhcnNlci5zdWl0ZShjb2RlKQorICAgICAgICBzdDIgPSBzdDEudG90dXBsZShsaW5lX2luZm89MSwgY29sX2luZm89MSkKKworICAgICAgICBkZWYgd2Fsayh0cmVlKToKKyAgICAgICAgICAgIG5vZGVfdHlwZSA9IHRyZWVbMF0KKyAgICAgICAgICAgIG5leHQgPSB0cmVlWzFdCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5leHQsIHR1cGxlKToKKyAgICAgICAgICAgICAgICBmb3IgZWx0IGluIHRyZWVbMTpdOgorICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiB3YWxrKGVsdCk6CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB4CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHlpZWxkIHRyZWUKKworICAgICAgICB0ZXJtaW5hbHMgPSBsaXN0KHdhbGsoc3QyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbCisgICAgICAgICAgICAoMSwgJ2RlZicsIDEsIDApLAorICAgICAgICAgICAgKDEsICdmJywgMSwgNCksCisgICAgICAgICAgICAoNywgJygnLCAxLCA1KSwKKyAgICAgICAgICAgICgxLCAneCcsIDEsIDYpLAorICAgICAgICAgICAgKDgsICcpJywgMSwgNyksCisgICAgICAgICAgICAoMTEsICc6JywgMSwgOCksCisgICAgICAgICAgICAoNCwgJycsIDEsIDkpLAorICAgICAgICAgICAgKDUsICcnLCAyLCAtMSksCisgICAgICAgICAgICAoMSwgJ3JldHVybicsIDIsIDQpLAorICAgICAgICAgICAgKDEsICd4JywgMiwgMTEpLAorICAgICAgICAgICAgKDE0LCAnKycsIDIsIDEzKSwKKyAgICAgICAgICAgICgyLCAnMScsIDIsIDE1KSwKKyAgICAgICAgICAgICg0LCAnJywgMiwgMTYpLAorICAgICAgICAgICAgKDYsICcnLCAyLCAtMSksCisgICAgICAgICAgICAoNCwgJycsIDIsIC0xKSwKKyAgICAgICAgICAgICgwLCAnJywgMiwgLTEpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbHMpCisKKwogIwogIyAgU2Vjb25kLCB3ZSB0YWtlICppbnZhbGlkKiB0cmVlcyBhbmQgbWFrZSBzdXJlIHdlIGdldCBQYXJzZXJFcnJvcgogIyAgcmVqZWN0aW9ucyBmb3IgdGhlbS4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5IGIvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkKaW5kZXggYmU3ZDRlOC4uNzc5YTIwYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkKQEAgLTE2MCw2ICsxNjAsNDEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRfKCcoTm9uZSknIG5vdCBpbiBhc20pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXNtLnNwbGl0KCkuY291bnQoJ1JFVFVSTl9WQUxVRScpLCAxKQogCisgICAgZGVmIHRlc3RfZWxpbV9qdW1wX3RvX3JldHVybihzZWxmKToKKyAgICAgICAgIyBKVU1QX0ZPUldBUkQgdG8gUkVUVVJOIC0tPiAgUkVUVVJOCisgICAgICAgIGRlZiBmKGNvbmQsIHRydWVfdmFsdWUsIGZhbHNlX3ZhbHVlKToKKyAgICAgICAgICAgIHJldHVybiB0cnVlX3ZhbHVlIGlmIGNvbmQgZWxzZSBmYWxzZV92YWx1ZQorICAgICAgICBhc20gPSBkaXNhc3NlbWJsZShmKQorICAgICAgICBzZWxmLmFzc2VydF8oJ0pVTVBfRk9SV0FSRCcgbm90IGluIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCdKVU1QX0FCU09MVVRFJyBub3QgaW4gYXNtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzbS5zcGxpdCgpLmNvdW50KCdSRVRVUk5fVkFMVUUnKSwgMikKKworICAgIGRlZiB0ZXN0X2VsaW1fanVtcF9hZnRlcl9yZXR1cm4xKHNlbGYpOgorICAgICAgICAjIEVsaW1pbmF0ZSBkZWFkIGNvZGU6IGp1bXBzIGltbWVkaWF0ZWx5IGFmdGVyIHJldHVybnMgY2FuJ3QgYmUgcmVhY2hlZAorICAgICAgICBkZWYgZihjb25kMSwgY29uZDIpOgorICAgICAgICAgICAgaWYgY29uZDE6IHJldHVybiAxCisgICAgICAgICAgICBpZiBjb25kMjogcmV0dXJuIDIKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIDMKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgaWYgY29uZDE6IHJldHVybiA0CisgICAgICAgICAgICAgICAgcmV0dXJuIDUKKyAgICAgICAgICAgIHJldHVybiA2CisgICAgICAgIGFzbSA9IGRpc2Fzc2VtYmxlKGYpCisgICAgICAgIHNlbGYuYXNzZXJ0XygnSlVNUF9GT1JXQVJEJyBub3QgaW4gYXNtKQorICAgICAgICBzZWxmLmFzc2VydF8oJ0pVTVBfQUJTT0xVVEUnIG5vdCBpbiBhc20pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXNtLnNwbGl0KCkuY291bnQoJ1JFVFVSTl9WQUxVRScpLCA2KQorCisgICAgZGVmIHRlc3RfZWxpbV9qdW1wX2FmdGVyX3JldHVybjIoc2VsZik6CisgICAgICAgICMgRWxpbWluYXRlIGRlYWQgY29kZToganVtcHMgaW1tZWRpYXRlbHkgYWZ0ZXIgcmV0dXJucyBjYW4ndCBiZSByZWFjaGVkCisgICAgICAgIGRlZiBmKGNvbmQxLCBjb25kMik6CisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGlmIGNvbmQxOiByZXR1cm4gNAorICAgICAgICBhc20gPSBkaXNhc3NlbWJsZShmKQorICAgICAgICBzZWxmLmFzc2VydF8oJ0pVTVBfRk9SV0FSRCcgbm90IGluIGFzbSkKKyAgICAgICAgIyBUaGVyZSBzaG91bGQgYmUgb25lIGp1bXAgZm9yIHRoZSB3aGlsZSBsb29wLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzbS5zcGxpdCgpLmNvdW50KCdKVU1QX0FCU09MVVRFJyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXNtLnNwbGl0KCkuY291bnQoJ1JFVFVSTl9WQUxVRScpLCAyKQogCiAKIGRlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGVwMzUyLnB5IGIvTGliL3Rlc3QvdGVzdF9wZXAzNTIucHkKaW5kZXggNzNjZmZkMi4uNzU2MTBiNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wZXAzNTIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wZXAzNTIucHkKQEAgLTE1LDggKzE1LDcgQEAKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoRXhjZXB0aW9uLCBvYmplY3QpKQogCiAgICAgZGVmIHZlcmlmeV9pbnN0YW5jZV9pbnRlcmZhY2Uoc2VsZiwgaW5zKToKLSAgICAgICAgZm9yIGF0dHIgaW4gKCJhcmdzIiwgIm1lc3NhZ2UiLCAiX19zdHJfXyIsICJfX3VuaWNvZGVfXyIsICJfX3JlcHJfXyIsCi0gICAgICAgICAgICAgICAgIl9fZ2V0aXRlbV9fIik6CisgICAgICAgIGZvciBhdHRyIGluICgiYXJncyIsICJtZXNzYWdlIiwgIl9fc3RyX18iLCAiX19yZXByX18iLCAiX19nZXRpdGVtX18iKToKICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhoYXNhdHRyKGlucywgYXR0ciksICIlcyBtaXNzaW5nICVzIGF0dHJpYnV0ZSIgJQogICAgICAgICAgICAgICAgICAgICAoaW5zLl9fY2xhc3NfXy5fX25hbWVfXywgYXR0cikpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcG9sbC5weSBiL0xpYi90ZXN0L3Rlc3RfcG9sbC5weQppbmRleCAzYTQ4YmNlLi42MGNkM2Y0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BvbGwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wb2xsLnB5CkBAIC0xLDcgKzEsNyBAQAogIyBUZXN0IGNhc2UgZm9yIHRoZSBvcy5wb2xsKCkgZnVuY3Rpb24KIAotaW1wb3J0IHN5cywgb3MsIHNlbGVjdCwgcmFuZG9tCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJpZnksIHZlcmJvc2UsIFRlc3RTa2lwcGVkLCBURVNURk4KK2ltcG9ydCBzeXMsIG9zLCBzZWxlY3QsIHJhbmRvbSwgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCBURVNURk4sIHJ1bl91bml0dGVzdAogCiB0cnk6CiAgICAgc2VsZWN0LnBvbGwKQEAgLTE2LDE3NyArMTYsMTQxIEBACiAgICAgICAgICAgICBtYXRjaC5hcHBlbmQoZmQpCiAgICAgcmV0dXJuIG1hdGNoCiAKLWRlZiB0ZXN0X3BvbGwxKCk6Ci0gICAgIiIiQmFzaWMgZnVuY3Rpb25hbCB0ZXN0IG9mIHBvbGwgb2JqZWN0CitjbGFzcyBQb2xsVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCi0gICAgQ3JlYXRlIGEgYnVuY2ggb2YgcGlwZSBhbmQgdGVzdCB0aGF0IHBvbGwgd29ya3Mgd2l0aCB0aGVtLgotICAgICIiIgotICAgIHByaW50ICdSdW5uaW5nIHBvbGwgdGVzdCAxJwotICAgIHAgPSBzZWxlY3QucG9sbCgpCisgICAgZGVmIHRlc3RfcG9sbDEoc2VsZik6CisgICAgICAgICMgQmFzaWMgZnVuY3Rpb25hbCB0ZXN0IG9mIHBvbGwgb2JqZWN0CisgICAgICAgICMgQ3JlYXRlIGEgYnVuY2ggb2YgcGlwZSBhbmQgdGVzdCB0aGF0IHBvbGwgd29ya3Mgd2l0aCB0aGVtLgogCi0gICAgTlVNX1BJUEVTID0gMTIKLSAgICBNU0cgPSAiIFRoaXMgaXMgYSB0ZXN0LiIKLSAgICBNU0dfTEVOID0gbGVuKE1TRykKLSAgICByZWFkZXJzID0gW10KLSAgICB3cml0ZXJzID0gW10KLSAgICByMncgPSB7fQotICAgIHcyciA9IHt9CisgICAgICAgIHAgPSBzZWxlY3QucG9sbCgpCiAKLSAgICBmb3IgaSBpbiByYW5nZShOVU1fUElQRVMpOgotICAgICAgICByZCwgd3IgPSBvcy5waXBlKCkKLSAgICAgICAgcC5yZWdpc3RlcihyZCwgc2VsZWN0LlBPTExJTikKLSAgICAgICAgcC5yZWdpc3Rlcih3ciwgc2VsZWN0LlBPTExPVVQpCi0gICAgICAgIHJlYWRlcnMuYXBwZW5kKHJkKQotICAgICAgICB3cml0ZXJzLmFwcGVuZCh3cikKLSAgICAgICAgcjJ3W3JkXSA9IHdyCi0gICAgICAgIHcyclt3cl0gPSByZAorICAgICAgICBOVU1fUElQRVMgPSAxMgorICAgICAgICBNU0cgPSAiIFRoaXMgaXMgYSB0ZXN0LiIKKyAgICAgICAgTVNHX0xFTiA9IGxlbihNU0cpCisgICAgICAgIHJlYWRlcnMgPSBbXQorICAgICAgICB3cml0ZXJzID0gW10KKyAgICAgICAgcjJ3ID0ge30KKyAgICAgICAgdzJyID0ge30KIAotICAgIHdoaWxlIHdyaXRlcnM6Ci0gICAgICAgIHJlYWR5ID0gcC5wb2xsKCkKLSAgICAgICAgcmVhZHlfd3JpdGVycyA9IGZpbmRfcmVhZHlfbWF0Y2hpbmcocmVhZHksIHNlbGVjdC5QT0xMT1VUKQotICAgICAgICBpZiBub3QgcmVhZHlfd3JpdGVyczoKLSAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIm5vIHBpcGVzIHJlYWR5IGZvciB3cml0aW5nIgotICAgICAgICB3ciA9IHJhbmRvbS5jaG9pY2UocmVhZHlfd3JpdGVycykKLSAgICAgICAgb3Mud3JpdGUod3IsIE1TRykKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTlVNX1BJUEVTKToKKyAgICAgICAgICAgIHJkLCB3ciA9IG9zLnBpcGUoKQorICAgICAgICAgICAgcC5yZWdpc3RlcihyZCwgc2VsZWN0LlBPTExJTikKKyAgICAgICAgICAgIHAucmVnaXN0ZXIod3IsIHNlbGVjdC5QT0xMT1VUKQorICAgICAgICAgICAgcmVhZGVycy5hcHBlbmQocmQpCisgICAgICAgICAgICB3cml0ZXJzLmFwcGVuZCh3cikKKyAgICAgICAgICAgIHIyd1tyZF0gPSB3cgorICAgICAgICAgICAgdzJyW3dyXSA9IHJkCiAKLSAgICAgICAgcmVhZHkgPSBwLnBvbGwoKQotICAgICAgICByZWFkeV9yZWFkZXJzID0gZmluZF9yZWFkeV9tYXRjaGluZyhyZWFkeSwgc2VsZWN0LlBPTExJTikKLSAgICAgICAgaWYgbm90IHJlYWR5X3JlYWRlcnM6Ci0gICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJubyBwaXBlcyByZWFkeSBmb3IgcmVhZGluZyIKLSAgICAgICAgcmQgPSByYW5kb20uY2hvaWNlKHJlYWR5X3JlYWRlcnMpCi0gICAgICAgIGJ1ZiA9IG9zLnJlYWQocmQsIE1TR19MRU4pCi0gICAgICAgIHZlcmlmeShsZW4oYnVmKSA9PSBNU0dfTEVOKQotICAgICAgICBwcmludCBidWYKLSAgICAgICAgb3MuY2xvc2UocjJ3W3JkXSkgOyBvcy5jbG9zZSggcmQgKQotICAgICAgICBwLnVucmVnaXN0ZXIoIHIyd1tyZF0gKQotICAgICAgICBwLnVucmVnaXN0ZXIoIHJkICkKLSAgICAgICAgd3JpdGVycy5yZW1vdmUocjJ3W3JkXSkKKyAgICAgICAgYnVmcyA9IFtdCiAKLSAgICBwb2xsX3VuaXRfdGVzdHMoKQotICAgIHByaW50ICdQb2xsIHRlc3QgMSBjb21wbGV0ZScKKyAgICAgICAgd2hpbGUgd3JpdGVyczoKKyAgICAgICAgICAgIHJlYWR5ID0gcC5wb2xsKCkKKyAgICAgICAgICAgIHJlYWR5X3dyaXRlcnMgPSBmaW5kX3JlYWR5X21hdGNoaW5nKHJlYWR5LCBzZWxlY3QuUE9MTE9VVCkKKyAgICAgICAgICAgIGlmIG5vdCByZWFkeV93cml0ZXJzOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIm5vIHBpcGVzIHJlYWR5IGZvciB3cml0aW5nIgorICAgICAgICAgICAgd3IgPSByYW5kb20uY2hvaWNlKHJlYWR5X3dyaXRlcnMpCisgICAgICAgICAgICBvcy53cml0ZSh3ciwgTVNHKQogCi1kZWYgcG9sbF91bml0X3Rlc3RzKCk6Ci0gICAgIyByZXR1cm5zIE5WQUwgZm9yIGludmFsaWQgZmlsZSBkZXNjcmlwdG9yCi0gICAgRkQgPSA0MgotICAgIHRyeToKLSAgICAgICAgb3MuY2xvc2UoRkQpCi0gICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICBwID0gc2VsZWN0LnBvbGwoKQotICAgIHAucmVnaXN0ZXIoRkQpCi0gICAgciA9IHAucG9sbCgpCi0gICAgdmVyaWZ5KHJbMF0gPT0gKEZELCBzZWxlY3QuUE9MTE5WQUwpKQorICAgICAgICAgICAgcmVhZHkgPSBwLnBvbGwoKQorICAgICAgICAgICAgcmVhZHlfcmVhZGVycyA9IGZpbmRfcmVhZHlfbWF0Y2hpbmcocmVhZHksIHNlbGVjdC5QT0xMSU4pCisgICAgICAgICAgICBpZiBub3QgcmVhZHlfcmVhZGVyczoKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJubyBwaXBlcyByZWFkeSBmb3IgcmVhZGluZyIKKyAgICAgICAgICAgIHJkID0gcmFuZG9tLmNob2ljZShyZWFkeV9yZWFkZXJzKQorICAgICAgICAgICAgYnVmID0gb3MucmVhZChyZCwgTVNHX0xFTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJ1ZiksIE1TR19MRU4pCisgICAgICAgICAgICBidWZzLmFwcGVuZChidWYpCisgICAgICAgICAgICBvcy5jbG9zZShyMndbcmRdKSA7IG9zLmNsb3NlKCByZCApCisgICAgICAgICAgICBwLnVucmVnaXN0ZXIoIHIyd1tyZF0gKQorICAgICAgICAgICAgcC51bnJlZ2lzdGVyKCByZCApCisgICAgICAgICAgICB3cml0ZXJzLnJlbW92ZShyMndbcmRdKQogCi0gICAgZiA9IG9wZW4oVEVTVEZOLCAndycpCi0gICAgZmQgPSBmLmZpbGVubygpCi0gICAgcCA9IHNlbGVjdC5wb2xsKCkKLSAgICBwLnJlZ2lzdGVyKGYpCi0gICAgciA9IHAucG9sbCgpCi0gICAgdmVyaWZ5KHJbMF1bMF0gPT0gZmQpCi0gICAgZi5jbG9zZSgpCi0gICAgciA9IHAucG9sbCgpCi0gICAgdmVyaWZ5KHJbMF0gPT0gKGZkLCBzZWxlY3QuUE9MTE5WQUwpKQotICAgIG9zLnVubGluayhURVNURk4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmcywgW01TR10gKiBOVU1fUElQRVMpCiAKLSAgICAjIHR5cGUgZXJyb3IgZm9yIGludmFsaWQgYXJndW1lbnRzCi0gICAgcCA9IHNlbGVjdC5wb2xsKCkKLSAgICB0cnk6Ci0gICAgICAgIHAucmVnaXN0ZXIocCkKLSAgICBleGNlcHQgVHlwZUVycm9yOgotICAgICAgICBwYXNzCi0gICAgZWxzZToKLSAgICAgICAgcHJpbnQgIkJvZ3VzIHJlZ2lzdGVyIGNhbGwgZGlkIG5vdCByYWlzZSBUeXBlRXJyb3IiCi0gICAgdHJ5OgotICAgICAgICBwLnVucmVnaXN0ZXIocCkKLSAgICBleGNlcHQgVHlwZUVycm9yOgotICAgICAgICBwYXNzCi0gICAgZWxzZToKLSAgICAgICAgcHJpbnQgIkJvZ3VzIHVucmVnaXN0ZXIgY2FsbCBkaWQgbm90IHJhaXNlIFR5cGVFcnJvciIKKyAgICBkZWYgcG9sbF91bml0X3Rlc3RzKHNlbGYpOgorICAgICAgICAjIHJldHVybnMgTlZBTCBmb3IgaW52YWxpZCBmaWxlIGRlc2NyaXB0b3IKKyAgICAgICAgRkQgPSA0MgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5jbG9zZShGRCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHAgPSBzZWxlY3QucG9sbCgpCisgICAgICAgIHAucmVnaXN0ZXIoRkQpCisgICAgICAgIHIgPSBwLnBvbGwoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJbMF0sIChGRCwgc2VsZWN0LlBPTExOVkFMKSkKIAotICAgICMgY2FuJ3QgdW5yZWdpc3RlciBub24tZXhpc3RlbnQgb2JqZWN0Ci0gICAgcCA9IHNlbGVjdC5wb2xsKCkKLSAgICB0cnk6Ci0gICAgICAgIHAudW5yZWdpc3RlcigzKQotICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIHByaW50ICJCb2d1cyB1bnJlZ2lzdGVyIGNhbGwgZGlkIG5vdCByYWlzZSBLZXlFcnJvciIKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAndycpCisgICAgICAgIGZkID0gZi5maWxlbm8oKQorICAgICAgICBwID0gc2VsZWN0LnBvbGwoKQorICAgICAgICBwLnJlZ2lzdGVyKGYpCisgICAgICAgIHIgPSBwLnBvbGwoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJbMF1bMF0sIGZkKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgciA9IHAucG9sbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoclswXSwgKGZkLCBzZWxlY3QuUE9MTE5WQUwpKQorICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQogCi0gICAgIyBUZXN0IGVycm9yIGNhc2VzCi0gICAgcG9sbHN0ZXIgPSBzZWxlY3QucG9sbCgpCi0gICAgY2xhc3MgTm9wZToKLSAgICAgICAgcGFzcworICAgICAgICAjIHR5cGUgZXJyb3IgZm9yIGludmFsaWQgYXJndW1lbnRzCisgICAgICAgIHAgPSBzZWxlY3QucG9sbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcC5yZWdpc3RlciwgcCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwLnVucmVnaXN0ZXIsIHApCiAKLSAgICBjbGFzcyBBbG1vc3Q6Ci0gICAgICAgIGRlZiBmaWxlbm8oc2VsZik6Ci0gICAgICAgICAgICByZXR1cm4gJ2ZpbGVubycKKyAgICAgICAgIyBjYW4ndCB1bnJlZ2lzdGVyIG5vbi1leGlzdGVudCBvYmplY3QKKyAgICAgICAgcCA9IHNlbGVjdC5wb2xsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHAudW5yZWdpc3RlciwgMykKIAotICAgIHRyeToKLSAgICAgICAgcG9sbHN0ZXIucmVnaXN0ZXIoIE5vcGUoKSwgMCApCi0gICAgZXhjZXB0IFR5cGVFcnJvcjogcGFzcwotICAgIGVsc2U6IHByaW50ICdleHBlY3RlZCBUeXBlRXJyb3IgZXhjZXB0aW9uLCBub3QgcmFpc2VkJworICAgICAgICAjIFRlc3QgZXJyb3IgY2FzZXMKKyAgICAgICAgcG9sbHN0ZXIgPSBzZWxlY3QucG9sbCgpCisgICAgICAgIGNsYXNzIE5vcGU6CisgICAgICAgICAgICBwYXNzCiAKLSAgICB0cnk6Ci0gICAgICAgIHBvbGxzdGVyLnJlZ2lzdGVyKCBBbG1vc3QoKSwgMCApCi0gICAgZXhjZXB0IFR5cGVFcnJvcjogcGFzcwotICAgIGVsc2U6IHByaW50ICdleHBlY3RlZCBUeXBlRXJyb3IgZXhjZXB0aW9uLCBub3QgcmFpc2VkJworICAgICAgICBjbGFzcyBBbG1vc3Q6CisgICAgICAgICAgICBkZWYgZmlsZW5vKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAnZmlsZW5vJwogCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcG9sbHN0ZXIucmVnaXN0ZXIsIE5vcGUoKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwb2xsc3Rlci5yZWdpc3RlciwgQWxtb3N0KCksIDApCiAKLSMgQW5vdGhlciB0ZXN0IGNhc2UgZm9yIHBvbGwoKS4gIFRoaXMgaXMgY29waWVkIGZyb20gdGhlIHRlc3QgY2FzZSBmb3IKLSMgc2VsZWN0KCksIG1vZGlmaWVkIHRvIHVzZSBwb2xsKCkgaW5zdGVhZC4KKyAgICAjIEFub3RoZXIgdGVzdCBjYXNlIGZvciBwb2xsKCkuICBUaGlzIGlzIGNvcGllZCBmcm9tIHRoZSB0ZXN0IGNhc2UgZm9yCisgICAgIyBzZWxlY3QoKSwgbW9kaWZpZWQgdG8gdXNlIHBvbGwoKSBpbnN0ZWFkLgogCi1kZWYgdGVzdF9wb2xsMigpOgotICAgIHByaW50ICdSdW5uaW5nIHBvbGwgdGVzdCAyJwotICAgIGNtZCA9ICdmb3IgaSBpbiAwIDEgMiAzIDQgNSA2IDcgOCA5OyBkbyBlY2hvIHRlc3RpbmcuLi47IHNsZWVwIDE7IGRvbmUnCi0gICAgcCA9IG9zLnBvcGVuKGNtZCwgJ3InKQotICAgIHBvbGxzdGVyID0gc2VsZWN0LnBvbGwoKQotICAgIHBvbGxzdGVyLnJlZ2lzdGVyKCBwLCBzZWxlY3QuUE9MTElOICkKLSAgICBmb3IgdG91dCBpbiAoMCwgMTAwMCwgMjAwMCwgNDAwMCwgODAwMCwgMTYwMDApICsgKC0xLCkqMTA6Ci0gICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICBwcmludCAndGltZW91dCA9JywgdG91dAotICAgICAgICBmZGxpc3QgPSBwb2xsc3Rlci5wb2xsKHRvdXQpCi0gICAgICAgIGlmIChmZGxpc3QgPT0gW10pOgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgZmQsIGZsYWdzID0gZmRsaXN0WzBdCi0gICAgICAgIGlmIGZsYWdzICYgc2VsZWN0LlBPTExIVVA6Ci0gICAgICAgICAgICBsaW5lID0gcC5yZWFkbGluZSgpCi0gICAgICAgICAgICBpZiBsaW5lICE9ICIiOgotICAgICAgICAgICAgICAgIHByaW50ICdlcnJvcjogcGlwZSBzZWVtcyB0byBiZSBjbG9zZWQsIGJ1dCBzdGlsbCByZXR1cm5zIGRhdGEnCi0gICAgICAgICAgICBjb250aW51ZQorICAgIGRlZiB0ZXN0X3BvbGwyKHNlbGYpOgorICAgICAgICBjbWQgPSAnZm9yIGkgaW4gMCAxIDIgMyA0IDUgNiA3IDggOTsgZG8gZWNobyB0ZXN0aW5nLi4uOyBzbGVlcCAxOyBkb25lJworICAgICAgICBwID0gb3MucG9wZW4oY21kLCAncicpCisgICAgICAgIHBvbGxzdGVyID0gc2VsZWN0LnBvbGwoKQorICAgICAgICBwb2xsc3Rlci5yZWdpc3RlciggcCwgc2VsZWN0LlBPTExJTiApCisgICAgICAgIGZvciB0b3V0IGluICgwLCAxMDAwLCAyMDAwLCA0MDAwLCA4MDAwLCAxNjAwMCkgKyAoLTEsKSoxMDoKKyAgICAgICAgICAgIGZkbGlzdCA9IHBvbGxzdGVyLnBvbGwodG91dCkKKyAgICAgICAgICAgIGlmIChmZGxpc3QgPT0gW10pOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmZCwgZmxhZ3MgPSBmZGxpc3RbMF0KKyAgICAgICAgICAgIGlmIGZsYWdzICYgc2VsZWN0LlBPTExIVVA6CisgICAgICAgICAgICAgICAgbGluZSA9IHAucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIGxpbmUgIT0gIiI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnZXJyb3I6IHBpcGUgc2VlbXMgdG8gYmUgY2xvc2VkLCBidXQgc3RpbGwgcmV0dXJucyBkYXRhJykKKyAgICAgICAgICAgICAgICBjb250aW51ZQogCi0gICAgICAgIGVsaWYgZmxhZ3MgJiBzZWxlY3QuUE9MTElOOgotICAgICAgICAgICAgbGluZSA9IHAucmVhZGxpbmUoKQotICAgICAgICAgICAgaWYgdmVyYm9zZToKLSAgICAgICAgICAgICAgICBwcmludCByZXByKGxpbmUpCi0gICAgICAgICAgICBpZiBub3QgbGluZToKLSAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgotICAgICAgICAgICAgICAgICAgICBwcmludCAnRU9GJwotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQgJ1VuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIGZyb20gc2VsZWN0LnBvbGw6JywgZmRsaXN0Ci0gICAgcC5jbG9zZSgpCi0gICAgcHJpbnQgJ1BvbGwgdGVzdCAyIGNvbXBsZXRlJworICAgICAgICAgICAgZWxpZiBmbGFncyAmIHNlbGVjdC5QT0xMSU46CisgICAgICAgICAgICAgICAgbGluZSA9IHAucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgZnJvbSBzZWxlY3QucG9sbDogJXMnICUgZmRsaXN0KQorICAgICAgICBwLmNsb3NlKCkKIAotZGVmIHRlc3RfcG9sbDMoKToKLSAgICAjIHRlc3QgaW50IG92ZXJmbG93Ci0gICAgcHJpbnQgJ1J1bm5pbmcgcG9sbCB0ZXN0IDMnCi0gICAgcG9sbHN0ZXIgPSBzZWxlY3QucG9sbCgpCi0gICAgcG9sbHN0ZXIucmVnaXN0ZXIoMSkKKyAgICBkZWYgdGVzdF9wb2xsMyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IGludCBvdmVyZmxvdworICAgICAgICBwb2xsc3RlciA9IHNlbGVjdC5wb2xsKCkKKyAgICAgICAgcG9sbHN0ZXIucmVnaXN0ZXIoMSkKIAotICAgIHRyeToKLSAgICAgICAgcG9sbHN0ZXIucG9sbCgxTCA8PCA2NCkKLSAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIHByaW50ICdFeHBlY3RlZCBPdmVyZmxvd0Vycm9yIHdpdGggZXhjZXNzaXZlIHRpbWVvdXQnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHBvbGxzdGVyLnBvbGwsIDFMIDw8IDY0KQogCi0gICAgeCA9IDIgKyAzCi0gICAgaWYgeCAhPSA1OgotICAgICAgICBwcmludCAnT3ZlcmZsb3cgbXVzdCBoYXZlIG9jY3VycmVkJwotICAgIHByaW50ICdQb2xsIHRlc3QgMyBjb21wbGV0ZScKKyAgICAgICAgeCA9IDIgKyAzCisgICAgICAgIGlmIHggIT0gNToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnT3ZlcmZsb3cgbXVzdCBoYXZlIG9jY3VycmVkJykKIAorZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChQb2xsVGVzdHMpCiAKLXRlc3RfcG9sbDEoKQotdGVzdF9wb2xsMigpCi10ZXN0X3BvbGwzKCkKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHljbGJyLnB5IGIvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKaW5kZXggMDE3MDNiNS4uN2M5ZDRhYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKQEAgLTk1LDYgKzk1LDkgQEAKICAgICAgICAgICAgIHB5X2l0ZW0gPSBnZXRhdHRyKG1vZHVsZSwgbmFtZSkKICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHB5Y2xici5GdW5jdGlvbik6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UocHlfaXRlbSwgKEZ1bmN0aW9uVHlwZSwgQnVpbHRpbkZ1bmN0aW9uVHlwZSkpKQorICAgICAgICAgICAgICAgIGlmIHB5X2l0ZW0uX19tb2R1bGVfXyAhPSBtb2R1bGVOYW1lOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAgICMgc2tpcCBmdW5jdGlvbnMgdGhhdCBjYW1lIGZyb20gc29tZXdoZXJlIGVsc2UKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhweV9pdGVtLl9fbW9kdWxlX18sIHZhbHVlLm1vZHVsZSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UocHlfaXRlbSwgKENsYXNzVHlwZSwgdHlwZSkpKQogICAgICAgICAgICAgICAgIGlmIHB5X2l0ZW0uX19tb2R1bGVfXyAhPSBtb2R1bGVOYW1lOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zY29wZS5weSBiL0xpYi90ZXN0L3Rlc3Rfc2NvcGUucHkKaW5kZXggZTRlNTkyYS4uNzc3ZTg1YSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zY29wZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Njb3BlLnB5CkBAIC0xLDE4NiArMSwxOTAgQEAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmlmeSwgVGVzdEZhaWxlZCwgY2hlY2tfc3ludGF4LCB2ZXJlcQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBjaGVja19zeW50YXhfZXJyb3IsIHJ1bl91bml0dGVzdAogCiBpbXBvcnQgd2FybmluZ3MKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCByImltcG9ydCBcKiIsIFN5bnRheFdhcm5pbmcsICI8dGVzdCBzdHJpbmc+IikKIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCByImltcG9ydCBcKiIsIFN5bnRheFdhcm5pbmcsICI8c3RyaW5nPiIpCiAKLXByaW50ICIxLiBzaW1wbGUgbmVzdGluZyIKK2NsYXNzIFNjb3BlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCi1kZWYgbWFrZV9hZGRlcih4KToKLSAgICBkZWYgYWRkZXIoeSk6Ci0gICAgICAgIHJldHVybiB4ICsgeQotICAgIHJldHVybiBhZGRlcgorICAgIGRlZiB0ZXN0U2ltcGxlTmVzdGluZyhzZWxmKToKIAotaW5jID0gbWFrZV9hZGRlcigxKQotcGx1czEwID0gbWFrZV9hZGRlcigxMCkKLQotdmVyZXEoaW5jKDEpLCAyKQotdmVyZXEocGx1czEwKC0yKSwgOCkKLQotcHJpbnQgIjIuIGV4dHJhIG5lc3RpbmciCi0KLWRlZiBtYWtlX2FkZGVyMih4KToKLSAgICBkZWYgZXh0cmEoKTogIyBjaGVjayBmcmVldmFycyBwYXNzaW5nIHRocm91Z2ggbm9uLXVzZSBzY29wZXMKLSAgICAgICAgZGVmIGFkZGVyKHkpOgotICAgICAgICAgICAgcmV0dXJuIHggKyB5Ci0gICAgICAgIHJldHVybiBhZGRlcgotICAgIHJldHVybiBleHRyYSgpCi0KLWluYyA9IG1ha2VfYWRkZXIyKDEpCi1wbHVzMTAgPSBtYWtlX2FkZGVyMigxMCkKLQotdmVyZXEoaW5jKDEpLCAyKQotdmVyZXEocGx1czEwKC0yKSwgOCkKLQotcHJpbnQgIjMuIHNpbXBsZSBuZXN0aW5nICsgcmViaW5kaW5nIgotCi1kZWYgbWFrZV9hZGRlcjMoeCk6Ci0gICAgZGVmIGFkZGVyKHkpOgotICAgICAgICByZXR1cm4geCArIHkKLSAgICB4ID0geCArIDEgIyBjaGVjayB0cmFja2luZyBvZiBhc3NpZ25tZW50IHRvIHggaW4gZGVmaW5pbmcgc2NvcGUKLSAgICByZXR1cm4gYWRkZXIKLQotaW5jID0gbWFrZV9hZGRlcjMoMCkKLXBsdXMxMCA9IG1ha2VfYWRkZXIzKDkpCi0KLXZlcmVxKGluYygxKSwgMikKLXZlcmVxKHBsdXMxMCgtMiksIDgpCi0KLXByaW50ICI0LiBuZXN0aW5nIHdpdGggZ2xvYmFsIGJ1dCBubyBmcmVlIgotCi1kZWYgbWFrZV9hZGRlcjQoKTogIyBYWFggYWRkIGV4dGEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24KLSAgICBkZWYgbmVzdCgpOgotICAgICAgICBkZWYgbmVzdCgpOgorICAgICAgICBkZWYgbWFrZV9hZGRlcih4KToKICAgICAgICAgICAgIGRlZiBhZGRlcih5KToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2xvYmFsX3ggKyB5ICMgY2hlY2sgdGhhdCBwbGFpbiBvbGQgZ2xvYmFscyB3b3JrCisgICAgICAgICAgICAgICAgcmV0dXJuIHggKyB5CiAgICAgICAgICAgICByZXR1cm4gYWRkZXIKLSAgICAgICAgcmV0dXJuIG5lc3QoKQotICAgIHJldHVybiBuZXN0KCkKIAotZ2xvYmFsX3ggPSAxCi1hZGRlciA9IG1ha2VfYWRkZXI0KCkKLXZlcmVxKGFkZGVyKDEpLCAyKQorICAgICAgICBpbmMgPSBtYWtlX2FkZGVyKDEpCisgICAgICAgIHBsdXMxMCA9IG1ha2VfYWRkZXIoMTApCiAKLWdsb2JhbF94ID0gMTAKLXZlcmVxKGFkZGVyKC0yKSwgOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmMoMSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGx1czEwKC0yKSwgOCkKIAotcHJpbnQgIjUuIG5lc3RpbmcgdGhyb3VnaCBjbGFzcyIKKyAgICBkZWYgdGVzdEV4dHJhTmVzdGluZyhzZWxmKToKIAotZGVmIG1ha2VfYWRkZXI1KHgpOgotICAgIGNsYXNzIEFkZGVyOgotICAgICAgICBkZWYgX19jYWxsX18oc2VsZiwgeSk6Ci0gICAgICAgICAgICByZXR1cm4geCArIHkKLSAgICByZXR1cm4gQWRkZXIoKQorICAgICAgICBkZWYgbWFrZV9hZGRlcjIoeCk6CisgICAgICAgICAgICBkZWYgZXh0cmEoKTogIyBjaGVjayBmcmVldmFycyBwYXNzaW5nIHRocm91Z2ggbm9uLXVzZSBzY29wZXMKKyAgICAgICAgICAgICAgICBkZWYgYWRkZXIoeSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB4ICsgeQorICAgICAgICAgICAgICAgIHJldHVybiBhZGRlcgorICAgICAgICAgICAgcmV0dXJuIGV4dHJhKCkKIAotaW5jID0gbWFrZV9hZGRlcjUoMSkKLXBsdXMxMCA9IG1ha2VfYWRkZXI1KDEwKQorICAgICAgICBpbmMgPSBtYWtlX2FkZGVyMigxKQorICAgICAgICBwbHVzMTAgPSBtYWtlX2FkZGVyMigxMCkKIAotdmVyZXEoaW5jKDEpLCAyKQotdmVyZXEocGx1czEwKC0yKSwgOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmMoMSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGx1czEwKC0yKSwgOCkKIAotcHJpbnQgIjYuIG5lc3RpbmcgcGx1cyBmcmVlIHJlZiB0byBnbG9iYWwiCisgICAgZGVmIHRlc3RTaW1wbGVBbmRSZWJpbmRpbmcoc2VsZik6CiAKLWRlZiBtYWtlX2FkZGVyNih4KToKLSAgICBnbG9iYWwgZ2xvYmFsX25lc3RfeAotICAgIGRlZiBhZGRlcih5KToKLSAgICAgICAgcmV0dXJuIGdsb2JhbF9uZXN0X3ggKyB5Ci0gICAgZ2xvYmFsX25lc3RfeCA9IHgKLSAgICByZXR1cm4gYWRkZXIKKyAgICAgICAgZGVmIG1ha2VfYWRkZXIzKHgpOgorICAgICAgICAgICAgZGVmIGFkZGVyKHkpOgorICAgICAgICAgICAgICAgIHJldHVybiB4ICsgeQorICAgICAgICAgICAgeCA9IHggKyAxICMgY2hlY2sgdHJhY2tpbmcgb2YgYXNzaWdubWVudCB0byB4IGluIGRlZmluaW5nIHNjb3BlCisgICAgICAgICAgICByZXR1cm4gYWRkZXIKIAotaW5jID0gbWFrZV9hZGRlcjYoMSkKLXBsdXMxMCA9IG1ha2VfYWRkZXI2KDEwKQorICAgICAgICBpbmMgPSBtYWtlX2FkZGVyMygwKQorICAgICAgICBwbHVzMTAgPSBtYWtlX2FkZGVyMyg5KQogCi12ZXJlcShpbmMoMSksIDExKSAjIHRoZXJlJ3Mgb25seSBvbmUgZ2xvYmFsCi12ZXJlcShwbHVzMTAoLTIpLCA4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluYygxKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbHVzMTAoLTIpLCA4KQogCi1wcmludCAiNy4gbmVhcmVzdCBlbmNsb3Npbmcgc2NvcGUiCisgICAgZGVmIHRlc3ROZXN0aW5nR2xvYmFsTm9GcmVlKHNlbGYpOgogCi1kZWYgZih4KToKLSAgICBkZWYgZyh5KToKLSAgICAgICAgeCA9IDQyICMgY2hlY2sgdGhhdCB0aGlzIG1hc2tzIGJpbmRpbmcgaW4gZigpCi0gICAgICAgIGRlZiBoKHopOgotICAgICAgICAgICAgcmV0dXJuIHggKyB6Ci0gICAgICAgIHJldHVybiBoCi0gICAgcmV0dXJuIGcoMikKKyAgICAgICAgZGVmIG1ha2VfYWRkZXI0KCk6ICMgWFhYIGFkZCBleHRhIGxldmVsIG9mIGluZGlyZWN0aW9uCisgICAgICAgICAgICBkZWYgbmVzdCgpOgorICAgICAgICAgICAgICAgIGRlZiBuZXN0KCk6CisgICAgICAgICAgICAgICAgICAgIGRlZiBhZGRlcih5KToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnbG9iYWxfeCArIHkgIyBjaGVjayB0aGF0IHBsYWluIG9sZCBnbG9iYWxzIHdvcmsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZGVyCisgICAgICAgICAgICAgICAgcmV0dXJuIG5lc3QoKQorICAgICAgICAgICAgcmV0dXJuIG5lc3QoKQogCi10ZXN0X2Z1bmMgPSBmKDEwKQotdmVyZXEodGVzdF9mdW5jKDUpLCA0NykKKyAgICAgICAgZ2xvYmFsX3ggPSAxCisgICAgICAgIGFkZGVyID0gbWFrZV9hZGRlcjQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFkZGVyKDEpLCAyKQogCi1wcmludCAiOC4gbWl4ZWQgZnJlZXZhcnMgYW5kIGNlbGx2YXJzIgorICAgICAgICBnbG9iYWxfeCA9IDEwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWRkZXIoLTIpLCA4KQogCi1kZWYgaWRlbnRpdHkoeCk6Ci0gICAgcmV0dXJuIHgKKyAgICBkZWYgdGVzdE5lc3RpbmdUaHJvdWdoQ2xhc3Moc2VsZik6CiAKLWRlZiBmKHgsIHksIHopOgotICAgIGRlZiBnKGEsIGIsIGMpOgotICAgICAgICBhID0gYSArIHggIyAzCi0gICAgICAgIGRlZiBoKCk6Ci0gICAgICAgICAgICAjIHogKiAoNCArIDkpCi0gICAgICAgICAgICAjIDMgKiAxMwotICAgICAgICAgICAgcmV0dXJuIGlkZW50aXR5KHogKiAoYiArIHkpKQotICAgICAgICB5ID0gYyArIHogIyA5Ci0gICAgICAgIHJldHVybiBoCi0gICAgcmV0dXJuIGcKKyAgICAgICAgZGVmIG1ha2VfYWRkZXI1KHgpOgorICAgICAgICAgICAgY2xhc3MgQWRkZXI6CisgICAgICAgICAgICAgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHkpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4geCArIHkKKyAgICAgICAgICAgIHJldHVybiBBZGRlcigpCiAKLWcgPSBmKDEsIDIsIDMpCi1oID0gZygyLCA0LCA2KQotdmVyZXEoaCgpLCAzOSkKKyAgICAgICAgaW5jID0gbWFrZV9hZGRlcjUoMSkKKyAgICAgICAgcGx1czEwID0gbWFrZV9hZGRlcjUoMTApCiAKLXByaW50ICI5LiBmcmVlIHZhcmlhYmxlIGluIG1ldGhvZCIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmMoMSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGx1czEwKC0yKSwgOCkKIAotZGVmIHRlc3QoKToKLSAgICBtZXRob2RfYW5kX3ZhciA9ICJ2YXIiCi0gICAgY2xhc3MgVGVzdDoKLSAgICAgICAgZGVmIG1ldGhvZF9hbmRfdmFyKHNlbGYpOgotICAgICAgICAgICAgcmV0dXJuICJtZXRob2QiCi0gICAgICAgIGRlZiB0ZXN0KHNlbGYpOgotICAgICAgICAgICAgcmV0dXJuIG1ldGhvZF9hbmRfdmFyCi0gICAgICAgIGRlZiBhY3R1YWxfZ2xvYmFsKHNlbGYpOgotICAgICAgICAgICAgcmV0dXJuIHN0cigiZ2xvYmFsIikKLSAgICAgICAgZGVmIHN0cihzZWxmKToKLSAgICAgICAgICAgIHJldHVybiBzdHIoc2VsZikKLSAgICByZXR1cm4gVGVzdCgpCisgICAgZGVmIHRlc3ROZXN0aW5nUGx1c0ZyZWVSZWZUb0dsb2JhbChzZWxmKToKIAotdCA9IHRlc3QoKQotdmVyZXEodC50ZXN0KCksICJ2YXIiKQotdmVyZXEodC5tZXRob2RfYW5kX3ZhcigpLCAibWV0aG9kIikKLXZlcmVxKHQuYWN0dWFsX2dsb2JhbCgpLCAiZ2xvYmFsIikKKyAgICAgICAgZGVmIG1ha2VfYWRkZXI2KHgpOgorICAgICAgICAgICAgZ2xvYmFsIGdsb2JhbF9uZXN0X3gKKyAgICAgICAgICAgIGRlZiBhZGRlcih5KToKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2xvYmFsX25lc3RfeCArIHkKKyAgICAgICAgICAgIGdsb2JhbF9uZXN0X3ggPSB4CisgICAgICAgICAgICByZXR1cm4gYWRkZXIKIAotbWV0aG9kX2FuZF92YXIgPSAidmFyIgotY2xhc3MgVGVzdDoKLSAgICAjIHRoaXMgY2xhc3MgaXMgbm90IG5lc3RlZCwgc28gdGhlIHJ1bGVzIGFyZSBkaWZmZXJlbnQKLSAgICBkZWYgbWV0aG9kX2FuZF92YXIoc2VsZik6Ci0gICAgICAgIHJldHVybiAibWV0aG9kIgotICAgIGRlZiB0ZXN0KHNlbGYpOgotICAgICAgICByZXR1cm4gbWV0aG9kX2FuZF92YXIKLSAgICBkZWYgYWN0dWFsX2dsb2JhbChzZWxmKToKLSAgICAgICAgcmV0dXJuIHN0cigiZ2xvYmFsIikKLSAgICBkZWYgc3RyKHNlbGYpOgotICAgICAgICByZXR1cm4gc3RyKHNlbGYpCisgICAgICAgIGluYyA9IG1ha2VfYWRkZXI2KDEpCisgICAgICAgIHBsdXMxMCA9IG1ha2VfYWRkZXI2KDEwKQogCi10ID0gVGVzdCgpCi12ZXJlcSh0LnRlc3QoKSwgInZhciIpCi12ZXJlcSh0Lm1ldGhvZF9hbmRfdmFyKCksICJtZXRob2QiKQotdmVyZXEodC5hY3R1YWxfZ2xvYmFsKCksICJnbG9iYWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluYygxKSwgMTEpICMgdGhlcmUncyBvbmx5IG9uZSBnbG9iYWwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbHVzMTAoLTIpLCA4KQogCi1wcmludCAiMTAuIHJlY3Vyc2lvbiIKKyAgICBkZWYgdGVzdE5lYXJlc3RFbmNsb3NpbmdTY29wZShzZWxmKToKIAotZGVmIGYoeCk6Ci0gICAgZGVmIGZhY3Qobik6Ci0gICAgICAgIGlmIG4gPT0gMDoKLSAgICAgICAgICAgIHJldHVybiAxCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gbiAqIGZhY3QobiAtIDEpCi0gICAgaWYgeCA+PSAwOgotICAgICAgICByZXR1cm4gZmFjdCh4KQotICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ4IG11c3QgYmUgPj0gMCIKKyAgICAgICAgZGVmIGYoeCk6CisgICAgICAgICAgICBkZWYgZyh5KToKKyAgICAgICAgICAgICAgICB4ID0gNDIgIyBjaGVjayB0aGF0IHRoaXMgbWFza3MgYmluZGluZyBpbiBmKCkKKyAgICAgICAgICAgICAgICBkZWYgaCh6KToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHggKyB6CisgICAgICAgICAgICAgICAgcmV0dXJuIGgKKyAgICAgICAgICAgIHJldHVybiBnKDIpCiAKLXZlcmVxKGYoNiksIDcyMCkKKyAgICAgICAgdGVzdF9mdW5jID0gZigxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0X2Z1bmMoNSksIDQ3KQorCisgICAgZGVmIHRlc3RNaXhlZEZyZWV2YXJzQW5kQ2VsbHZhcnMoc2VsZik6CisKKyAgICAgICAgZGVmIGlkZW50aXR5KHgpOgorICAgICAgICAgICAgcmV0dXJuIHgKKworICAgICAgICBkZWYgZih4LCB5LCB6KToKKyAgICAgICAgICAgIGRlZiBnKGEsIGIsIGMpOgorICAgICAgICAgICAgICAgIGEgPSBhICsgeCAjIDMKKyAgICAgICAgICAgICAgICBkZWYgaCgpOgorICAgICAgICAgICAgICAgICAgICAjIHogKiAoNCArIDkpCisgICAgICAgICAgICAgICAgICAgICMgMyAqIDEzCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpZGVudGl0eSh6ICogKGIgKyB5KSkKKyAgICAgICAgICAgICAgICB5ID0gYyArIHogIyA5CisgICAgICAgICAgICAgICAgcmV0dXJuIGgKKyAgICAgICAgICAgIHJldHVybiBnCisKKyAgICAgICAgZyA9IGYoMSwgMiwgMykKKyAgICAgICAgaCA9IGcoMiwgNCwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoKCksIDM5KQorCisgICAgZGVmIHRlc3RGcmVlVmFySW5NZXRob2Qoc2VsZik6CisKKyAgICAgICAgZGVmIHRlc3QoKToKKyAgICAgICAgICAgIG1ldGhvZF9hbmRfdmFyID0gInZhciIKKyAgICAgICAgICAgIGNsYXNzIFRlc3Q6CisgICAgICAgICAgICAgICAgZGVmIG1ldGhvZF9hbmRfdmFyKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGhvZCIKKyAgICAgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZF9hbmRfdmFyCisgICAgICAgICAgICAgICAgZGVmIGFjdHVhbF9nbG9iYWwoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIoImdsb2JhbCIpCisgICAgICAgICAgICAgICAgZGVmIHN0cihzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmKQorICAgICAgICAgICAgcmV0dXJuIFRlc3QoKQorCisgICAgICAgIHQgPSB0ZXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRlc3QoKSwgInZhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5tZXRob2RfYW5kX3ZhcigpLCAibWV0aG9kIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmFjdHVhbF9nbG9iYWwoKSwgImdsb2JhbCIpCisKKyAgICAgICAgbWV0aG9kX2FuZF92YXIgPSAidmFyIgorICAgICAgICBjbGFzcyBUZXN0OgorICAgICAgICAgICAgIyB0aGlzIGNsYXNzIGlzIG5vdCBuZXN0ZWQsIHNvIHRoZSBydWxlcyBhcmUgZGlmZmVyZW50CisgICAgICAgICAgICBkZWYgbWV0aG9kX2FuZF92YXIoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJtZXRob2QiCisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kX2FuZF92YXIKKyAgICAgICAgICAgIGRlZiBhY3R1YWxfZ2xvYmFsKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzdHIoImdsb2JhbCIpCisgICAgICAgICAgICBkZWYgc3RyKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzdHIoc2VsZikKKworICAgICAgICB0ID0gVGVzdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC50ZXN0KCksICJ2YXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubWV0aG9kX2FuZF92YXIoKSwgIm1ldGhvZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5hY3R1YWxfZ2xvYmFsKCksICJnbG9iYWwiKQorCisgICAgZGVmIHRlc3RSZWN1cnNpb24oc2VsZik6CisKKyAgICAgICAgZGVmIGYoeCk6CisgICAgICAgICAgICBkZWYgZmFjdChuKToKKyAgICAgICAgICAgICAgICBpZiBuID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gKiBmYWN0KG4gLSAxKQorICAgICAgICAgICAgaWYgeCA+PSAwOgorICAgICAgICAgICAgICAgIHJldHVybiBmYWN0KHgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ4IG11c3QgYmUgPj0gMCIKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoNiksIDcyMCkKIAogCi1wcmludCAiMTEuIHVub3B0aW1pemVkIG5hbWVzcGFjZXMiCisgICAgZGVmIHRlc3RVbm9wdGltaXplZE5hbWVzcGFjZXMoc2VsZik6CiAKLWNoZWNrX3N5bnRheCgiIiJcCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiIiJcCiBkZWYgdW5vcHRpbWl6ZWRfY2xhc2gxKHN0cmlwKToKICAgICBkZWYgZihzKToKICAgICAgICAgZnJvbSBzdHJpbmcgaW1wb3J0ICoKQEAgLTE4OCw3ICsxOTIsNyBAQAogICAgIHJldHVybiBmCiAiIiIpCiAKLWNoZWNrX3N5bnRheCgiIiJcCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiIiJcCiBkZWYgdW5vcHRpbWl6ZWRfY2xhc2gyKCk6CiAgICAgZnJvbSBzdHJpbmcgaW1wb3J0ICoKICAgICBkZWYgZihzKToKQEAgLTE5Niw3ICsyMDAsNyBAQAogICAgIHJldHVybiBmCiAiIiIpCiAKLWNoZWNrX3N5bnRheCgiIiJcCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiIiJcCiBkZWYgdW5vcHRpbWl6ZWRfY2xhc2gyKCk6CiAgICAgZnJvbSBzdHJpbmcgaW1wb3J0ICoKICAgICBkZWYgZygpOgpAQCAtMjA1LDIzICsyMDksMjMgQEAKICAgICAgICAgcmV0dXJuIGYKICIiIikKIAotY2hlY2tfc3ludGF4KCIiIlwKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICIiIlwKIGRlZiBmKHgpOgogICAgIGRlZiBnKCk6CiAgICAgICAgIHJldHVybiB4CiAgICAgZGVsIHggIyBjYW4ndCBkZWwgbmFtZQogIiIiKQogCi1jaGVja19zeW50YXgoIiIiXAorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgIiIiXAogZGVmIGYoKToKICAgICBkZWYgZygpOgotICAgICAgICAgZnJvbSBzdHJpbmcgaW1wb3J0ICoKLSAgICAgICAgIHJldHVybiBzdHJpcCAjIGdsb2JhbCBvciBsb2NhbD8KKyAgICAgICAgZnJvbSBzdHJpbmcgaW1wb3J0ICoKKyAgICAgICAgcmV0dXJuIHN0cmlwICMgZ2xvYmFsIG9yIGxvY2FsPwogIiIiKQogCi0jIGFuZCB2ZXJpZnkgYSBmZXcgY2FzZXMgdGhhdCBzaG91bGQgd29yaworICAgICAgICAjIGFuZCB2ZXJpZnkgYSBmZXcgY2FzZXMgdGhhdCBzaG91bGQgd29yawogCi1leGVjKCIiIgorICAgICAgICBleGVjKCIiIgogZGVmIG5vcHJvYmxlbTEoKToKICAgICBmcm9tIHN0cmluZyBpbXBvcnQgKgogICAgIGYgPSBsYW1iZGEgeDp4CkBAIC0yMzgsNTkgKzI0Miw2MCBAQAogICAgICAgICB5ID0geAogIiIiKQogCi1wcmludCAiMTIuIGxhbWJkYXMiCisgICAgZGVmIHRlc3RMYW1iZGFzKHNlbGYpOgogCi1mMSA9IGxhbWJkYSB4OiBsYW1iZGEgeTogeCArIHkKLWluYyA9IGYxKDEpCi1wbHVzMTAgPSBmMSgxMCkKLXZlcmVxKGluYygxKSwgMikKLXZlcmVxKHBsdXMxMCg1KSwgMTUpCisgICAgICAgIGYxID0gbGFtYmRhIHg6IGxhbWJkYSB5OiB4ICsgeQorICAgICAgICBpbmMgPSBmMSgxKQorICAgICAgICBwbHVzMTAgPSBmMSgxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmMoMSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGx1czEwKDUpLCAxNSkKIAotZjIgPSBsYW1iZGEgeDogKGxhbWJkYSA6IGxhbWJkYSB5OiB4ICsgeSkoKQotaW5jID0gZjIoMSkKLXBsdXMxMCA9IGYyKDEwKQotdmVyZXEoaW5jKDEpLCAyKQotdmVyZXEocGx1czEwKDUpLCAxNSkKKyAgICAgICAgZjIgPSBsYW1iZGEgeDogKGxhbWJkYSA6IGxhbWJkYSB5OiB4ICsgeSkoKQorICAgICAgICBpbmMgPSBmMigxKQorICAgICAgICBwbHVzMTAgPSBmMigxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmMoMSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGx1czEwKDUpLCAxNSkKIAotZjMgPSBsYW1iZGEgeDogbGFtYmRhIHk6IGdsb2JhbF94ICsgeQotZ2xvYmFsX3ggPSAxCi1pbmMgPSBmMyhOb25lKQotdmVyZXEoaW5jKDIpLCAzKQorICAgICAgICBmMyA9IGxhbWJkYSB4OiBsYW1iZGEgeTogZ2xvYmFsX3ggKyB5CisgICAgICAgIGdsb2JhbF94ID0gMQorICAgICAgICBpbmMgPSBmMyhOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluYygyKSwgMykKIAotZjggPSBsYW1iZGEgeCwgeSwgejogbGFtYmRhIGEsIGIsIGM6IGxhbWJkYSA6IHogKiAoYiArIHkpCi1nID0gZjgoMSwgMiwgMykKLWggPSBnKDIsIDQsIDYpCi12ZXJlcShoKCksIDE4KQorICAgICAgICBmOCA9IGxhbWJkYSB4LCB5LCB6OiBsYW1iZGEgYSwgYiwgYzogbGFtYmRhIDogeiAqIChiICsgeSkKKyAgICAgICAgZyA9IGY4KDEsIDIsIDMpCisgICAgICAgIGggPSBnKDIsIDQsIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaCgpLCAxOCkKIAotcHJpbnQgIjEzLiBVbmJvdW5kTG9jYWwiCisgICAgZGVmIHRlc3RVbmJvdW5kTG9jYWwoc2VsZik6CiAKLWRlZiBlcnJvckluT3V0ZXIoKToKLSAgICBwcmludCB5Ci0gICAgZGVmIGlubmVyKCk6Ci0gICAgICAgIHJldHVybiB5Ci0gICAgeSA9IDEKKyAgICAgICAgZGVmIGVycm9ySW5PdXRlcigpOgorICAgICAgICAgICAgcHJpbnQgeQorICAgICAgICAgICAgZGVmIGlubmVyKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHkKKyAgICAgICAgICAgIHkgPSAxCiAKLWRlZiBlcnJvckluSW5uZXIoKToKLSAgICBkZWYgaW5uZXIoKToKLSAgICAgICAgcmV0dXJuIHkKLSAgICBpbm5lcigpCi0gICAgeSA9IDEKKyAgICAgICAgZGVmIGVycm9ySW5Jbm5lcigpOgorICAgICAgICAgICAgZGVmIGlubmVyKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHkKKyAgICAgICAgICAgIGlubmVyKCkKKyAgICAgICAgICAgIHkgPSAxCiAKLXRyeToKLSAgICBlcnJvckluT3V0ZXIoKQotZXhjZXB0IFVuYm91bmRMb2NhbEVycm9yOgotICAgIHBhc3MKLWVsc2U6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZAorICAgICAgICB0cnk6CisgICAgICAgICAgICBlcnJvckluT3V0ZXIoKQorICAgICAgICBleGNlcHQgVW5ib3VuZExvY2FsRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoKQogCi10cnk6Ci0gICAgZXJyb3JJbklubmVyKCkKLWV4Y2VwdCBOYW1lRXJyb3I6Ci0gICAgcGFzcwotZWxzZToKLSAgICByYWlzZSBUZXN0RmFpbGVkCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVycm9ySW5Jbm5lcigpCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoKQogCi0jIHRlc3QgZm9yIGJ1ZyAjMTUwMTkzNDogaW5jb3JyZWN0IExPQUQvU1RPUkVfR0xPQkFMIGdlbmVyYXRpb24KKyAgICAgICAgIyB0ZXN0IGZvciBidWcgIzE1MDE5MzQ6IGluY29ycmVjdCBMT0FEL1NUT1JFX0dMT0JBTCBnZW5lcmF0aW9uCisgICAgICAgIGV4ZWMoIiIiCiBnbG9iYWxfeCA9IDEKIGRlZiBmKCk6CiAgICAgZ2xvYmFsX3ggKz0gMQpAQCAtMjk5LDM0ICszMDQsMzYgQEAKIGV4Y2VwdCBVbmJvdW5kTG9jYWxFcnJvcjoKICAgICBwYXNzCiBlbHNlOgotICAgIHJhaXNlIFRlc3RGYWlsZWQsICdzY29wZSBvZiBnbG9iYWxfeCBub3QgY29ycmVjdGx5IGRldGVybWluZWQnCisgICAgZmFpbCgnc2NvcGUgb2YgZ2xvYmFsX3ggbm90IGNvcnJlY3RseSBkZXRlcm1pbmVkJykKKyIiIiwgeydmYWlsJzogc2VsZi5mYWlsfSkKIAotcHJpbnQgIjE0LiBjb21wbGV4IGRlZmluaXRpb25zIgorICAgIGRlZiB0ZXN0Q29tcGxleERlZmluaXRpb25zKHNlbGYpOgogCi1kZWYgbWFrZVJldHVybmVyKCpsc3QpOgotICAgIGRlZiByZXR1cm5lcigpOgotICAgICAgICByZXR1cm4gbHN0Ci0gICAgcmV0dXJuIHJldHVybmVyCisgICAgICAgIGRlZiBtYWtlUmV0dXJuZXIoKmxzdCk6CisgICAgICAgICAgICBkZWYgcmV0dXJuZXIoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbHN0CisgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXIKIAotdmVyZXEobWFrZVJldHVybmVyKDEsMiwzKSgpLCAoMSwyLDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1ha2VSZXR1cm5lcigxLDIsMykoKSwgKDEsMiwzKSkKIAotZGVmIG1ha2VSZXR1cm5lcjIoKiprd2FyZ3MpOgotICAgIGRlZiByZXR1cm5lcigpOgotICAgICAgICByZXR1cm4ga3dhcmdzCi0gICAgcmV0dXJuIHJldHVybmVyCisgICAgICAgIGRlZiBtYWtlUmV0dXJuZXIyKCoqa3dhcmdzKToKKyAgICAgICAgICAgIGRlZiByZXR1cm5lcigpOgorICAgICAgICAgICAgICAgIHJldHVybiBrd2FyZ3MKKyAgICAgICAgICAgIHJldHVybiByZXR1cm5lcgogCi12ZXJlcShtYWtlUmV0dXJuZXIyKGE9MTEpKClbJ2EnXSwgMTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFrZVJldHVybmVyMihhPTExKSgpWydhJ10sIDExKQogCi1kZWYgbWFrZUFkZFBhaXIoKGEsIGIpKToKLSAgICBkZWYgYWRkUGFpcigoYywgZCkpOgotICAgICAgICByZXR1cm4gKGEgKyBjLCBiICsgZCkKLSAgICByZXR1cm4gYWRkUGFpcgorICAgICAgICBkZWYgbWFrZUFkZFBhaXIoKGEsIGIpKToKKyAgICAgICAgICAgIGRlZiBhZGRQYWlyKChjLCBkKSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIChhICsgYywgYiArIGQpCisgICAgICAgICAgICByZXR1cm4gYWRkUGFpcgogCi12ZXJlcShtYWtlQWRkUGFpcigoMSwgMikpKCgxMDAsIDIwMCkpLCAoMTAxLDIwMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFrZUFkZFBhaXIoKDEsIDIpKSgoMTAwLCAyMDApKSwgKDEwMSwyMDIpKQogCi1wcmludCAiMTUuIHNjb3BlIG9mIGdsb2JhbCBzdGF0ZW1lbnRzIgorICAgIGRlZiB0ZXN0U2NvcGVPZkdsb2JhbFN0bXQoc2VsZik6CiAjIEV4YW1wbGVzIHBvc3RlZCBieSBTYW11ZWxlIFBlZHJvbmkgdG8gcHl0aG9uLWRldiBvbiAzLzEvMjAwMQogCisgICAgICAgIGV4ZWMoIiIiXAogIyBJCiB4ID0gNwogZGVmIGYoKToKQEAgLTMzOSw4ICszNDYsOCBAQAogICAgICAgICAgICAgcmV0dXJuIGgoKQogICAgICAgICByZXR1cm4gaSgpCiAgICAgcmV0dXJuIGcoKQotdmVyZXEoZigpLCA3KQotdmVyZXEoeCwgNykKK3NlbGYuYXNzZXJ0RXF1YWwoZigpLCA3KQorc2VsZi5hc3NlcnRFcXVhbCh4LCA3KQogCiAjIElJCiB4ID0gNwpAQCAtMzU0LDggKzM2MSw4IEBACiAgICAgICAgICAgICByZXR1cm4gaCgpCiAgICAgICAgIHJldHVybiBpKCkKICAgICByZXR1cm4gZygpCi12ZXJlcShmKCksIDIpCi12ZXJlcSh4LCA3KQorc2VsZi5hc3NlcnRFcXVhbChmKCksIDIpCitzZWxmLmFzc2VydEVxdWFsKHgsIDcpCiAKICMgSUlJCiB4ID0gNwpAQCAtMzcwLDggKzM3Nyw4IEBACiAgICAgICAgICAgICByZXR1cm4gaCgpCiAgICAgICAgIHJldHVybiBpKCkKICAgICByZXR1cm4gZygpCi12ZXJlcShmKCksIDIpCi12ZXJlcSh4LCAyKQorc2VsZi5hc3NlcnRFcXVhbChmKCksIDIpCitzZWxmLmFzc2VydEVxdWFsKHgsIDIpCiAKICMgSVYKIHggPSA3CkBAIC0zODYsOCArMzkzLDggQEAKICAgICAgICAgICAgIHJldHVybiBoKCkKICAgICAgICAgcmV0dXJuIGkoKQogICAgIHJldHVybiBnKCkKLXZlcmVxKGYoKSwgMikKLXZlcmVxKHgsIDIpCitzZWxmLmFzc2VydEVxdWFsKGYoKSwgMikKK3NlbGYuYXNzZXJ0RXF1YWwoeCwgMikKIAogIyBYWFggd2hhdCBhYm91dCBnbG9iYWwgc3RhdGVtZW50cyBpbiBjbGFzcyBibG9ja3M/CiAjIGRvIHRoZXkgYWZmZWN0IG1ldGhvZHM/CkBAIC00MDIsMzQgKzQwOSwzNiBAQAogICAgICAgICByZXR1cm4geAogCiBnID0gR2xvYmFsKCkKLXZlcmVxKGcuZ2V0KCksIDEzKQorc2VsZi5hc3NlcnRFcXVhbChnLmdldCgpLCAxMykKIGcuc2V0KDE1KQotdmVyZXEoZy5nZXQoKSwgMTMpCitzZWxmLmFzc2VydEVxdWFsKGcuZ2V0KCksIDEzKQorIiIiKQogCi1wcmludCAiMTYuIGNoZWNrIGxlYWtzIgorICAgIGRlZiB0ZXN0TGVha3Moc2VsZik6CiAKLWNsYXNzIEZvbzoKLSAgICBjb3VudCA9IDAKKyAgICAgICAgY2xhc3MgRm9vOgorICAgICAgICAgICAgY291bnQgPSAwCiAKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIEZvby5jb3VudCArPSAxCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgRm9vLmNvdW50ICs9IDEKIAotICAgIGRlZiBfX2RlbF9fKHNlbGYpOgotICAgICAgICBGb28uY291bnQgLT0gMQorICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICAgICAgRm9vLmNvdW50IC09IDEKIAotZGVmIGYxKCk6Ci0gICAgeCA9IEZvbygpCi0gICAgZGVmIGYyKCk6Ci0gICAgICAgIHJldHVybiB4Ci0gICAgZjIoKQorICAgICAgICBkZWYgZjEoKToKKyAgICAgICAgICAgIHggPSBGb28oKQorICAgICAgICAgICAgZGVmIGYyKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgICAgIGYyKCkKIAotZm9yIGkgaW4gcmFuZ2UoMTAwKToKLSAgICBmMSgpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwMCk6CisgICAgICAgICAgICBmMSgpCiAKLXZlcmVxKEZvby5jb3VudCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGb28uY291bnQsIDApCiAKLXByaW50ICIxNy4gY2xhc3MgYW5kIGdsb2JhbCIKKyAgICBkZWYgdGVzdENsYXNzQW5kR2xvYmFsKHNlbGYpOgogCisgICAgICAgIGV4ZWMoIiIiXAogZGVmIHRlc3QoeCk6CiAgICAgY2xhc3MgRm9vOgogICAgICAgICBnbG9iYWwgeApAQCAtNDM4LDkgKzQ0Nyw5IEBACiAgICAgcmV0dXJuIEZvbygpCiAKIHggPSAwCi12ZXJlcSh0ZXN0KDYpKDIpLCA4KQorc2VsZi5hc3NlcnRFcXVhbCh0ZXN0KDYpKDIpLCA4KQogeCA9IC0xCi12ZXJlcSh0ZXN0KDMpKDIpLCA1KQorc2VsZi5hc3NlcnRFcXVhbCh0ZXN0KDMpKDIpLCA1KQogCiBsb29rZWRfdXBfYnlfbG9hZF9uYW1lID0gRmFsc2UKIGNsYXNzIFg6CkBAIC00NDksMTA0ICs0NTgsMTA2IEBACiAgICAgbG9jYWxzKClbJ2xvb2tlZF91cF9ieV9sb2FkX25hbWUnXSA9IFRydWUKICAgICBwYXNzZWQgPSBsb29rZWRfdXBfYnlfbG9hZF9uYW1lCiAKLXZlcmlmeShYLnBhc3NlZCkKK3NlbGYuYXNzZXJ0XyhYLnBhc3NlZCkKKyIiIikKIAotcHJpbnQgIjE4LiB2ZXJpZnkgdGhhdCBsb2NhbHMoKSB3b3JrcyIKKyAgICBkZWYgdGVzdExvY2Fsc0Z1bmN0aW9uKHNlbGYpOgogCi1kZWYgZih4KToKLSAgICBkZWYgZyh5KToKLSAgICAgICAgZGVmIGgoeik6Ci0gICAgICAgICAgICByZXR1cm4geSArIHoKLSAgICAgICAgdyA9IHggKyB5Ci0gICAgICAgIHkgKz0gMwotICAgICAgICByZXR1cm4gbG9jYWxzKCkKLSAgICByZXR1cm4gZworICAgICAgICBkZWYgZih4KToKKyAgICAgICAgICAgIGRlZiBnKHkpOgorICAgICAgICAgICAgICAgIGRlZiBoKHopOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4geSArIHoKKyAgICAgICAgICAgICAgICB3ID0geCArIHkKKyAgICAgICAgICAgICAgICB5ICs9IDMKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxzKCkKKyAgICAgICAgICAgIHJldHVybiBnCiAKLWQgPSBmKDIpKDQpCi12ZXJpZnkoJ2gnIGluIGQpCi1kZWwgZFsnaCddCi12ZXJlcShkLCB7J3gnOiAyLCAneSc6IDcsICd3JzogNn0pCisgICAgICAgIGQgPSBmKDIpKDQpCisgICAgICAgIHNlbGYuYXNzZXJ0XygnaCcgaW4gZCkKKyAgICAgICAgZGVsIGRbJ2gnXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHsneCc6IDIsICd5JzogNywgJ3cnOiA2fSkKIAotcHJpbnQgIjE5LiB2YXIgaXMgYm91bmQgYW5kIGZyZWUgaW4gY2xhc3MiCisgICAgZGVmIHRlc3RCb3VuZEFuZEZyZWUoc2VsZik6CisgICAgICAgICMgdmFyIGlzIGJvdW5kIGFuZCBmcmVlIGluIGNsYXNzCiAKLWRlZiBmKHgpOgotICAgIGNsYXNzIEM6Ci0gICAgICAgIGRlZiBtKHNlbGYpOgotICAgICAgICAgICAgcmV0dXJuIHgKLSAgICAgICAgYSA9IHgKLSAgICByZXR1cm4gQworICAgICAgICBkZWYgZih4KToKKyAgICAgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICAgICAgZGVmIG0oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB4CisgICAgICAgICAgICAgICAgYSA9IHgKKyAgICAgICAgICAgIHJldHVybiBDCiAKLWluc3QgPSBmKDMpKCkKLXZlcmVxKGluc3QuYSwgaW5zdC5tKCkpCisgICAgICAgIGluc3QgPSBmKDMpKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnN0LmEsIGluc3QubSgpKQogCi1wcmludCAiMjAuIGludGVyYWN0aW9uIHdpdGggdHJhY2UgZnVuY3Rpb24iCisgICAgZGVmIHRlc3RJbnRlcmFjdGlvbldpdGhUcmFjZUZ1bmMoc2VsZik6CiAKLWltcG9ydCBzeXMKLWRlZiB0cmFjZXIoYSxiLGMpOgotICAgIHJldHVybiB0cmFjZXIKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBkZWYgdHJhY2VyKGEsYixjKToKKyAgICAgICAgICAgIHJldHVybiB0cmFjZXIKIAotZGVmIGFkYXB0Z2V0dGVyKG5hbWUsIGtsYXNzLCBnZXR0ZXIpOgotICAgIGtpbmQsIGRlcyA9IGdldHRlcgotICAgIGlmIGtpbmQgPT0gMTogICAgICAgIyBBViBoYXBwZW5zIHdoZW4gc3RlcHBpbmcgZnJvbSB0aGlzIGxpbmUgdG8gbmV4dAotICAgICAgICBpZiBkZXMgPT0gIiI6Ci0gICAgICAgICAgICBkZXMgPSAiXyVzX18lcyIgJSAoa2xhc3MuX19uYW1lX18sIG5hbWUpCi0gICAgICAgIHJldHVybiBsYW1iZGEgb2JqOiBnZXRhdHRyKG9iaiwgZGVzKQorICAgICAgICBkZWYgYWRhcHRnZXR0ZXIobmFtZSwga2xhc3MsIGdldHRlcik6CisgICAgICAgICAgICBraW5kLCBkZXMgPSBnZXR0ZXIKKyAgICAgICAgICAgIGlmIGtpbmQgPT0gMTogICAgICAgIyBBViBoYXBwZW5zIHdoZW4gc3RlcHBpbmcgZnJvbSB0aGlzIGxpbmUgdG8gbmV4dAorICAgICAgICAgICAgICAgIGlmIGRlcyA9PSAiIjoKKyAgICAgICAgICAgICAgICAgICAgZGVzID0gIl8lc19fJXMiICUgKGtsYXNzLl9fbmFtZV9fLCBuYW1lKQorICAgICAgICAgICAgICAgIHJldHVybiBsYW1iZGEgb2JqOiBnZXRhdHRyKG9iaiwgZGVzKQogCi1jbGFzcyBUZXN0Q2xhc3M6Ci0gICAgcGFzcworICAgICAgICBjbGFzcyBUZXN0Q2xhc3M6CisgICAgICAgICAgICBwYXNzCiAKLXN5cy5zZXR0cmFjZSh0cmFjZXIpCi1hZGFwdGdldHRlcigiZm9vIiwgVGVzdENsYXNzLCAoMSwgIiIpKQotc3lzLnNldHRyYWNlKE5vbmUpCisgICAgICAgIHN5cy5zZXR0cmFjZSh0cmFjZXIpCisgICAgICAgIGFkYXB0Z2V0dGVyKCJmb28iLCBUZXN0Q2xhc3MsICgxLCAiIikpCisgICAgICAgIHN5cy5zZXR0cmFjZShOb25lKQogCi10cnk6IHN5cy5zZXR0cmFjZSgpCi1leGNlcHQgVHlwZUVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAnc3lzLnNldHRyYWNlKCkgZGlkIG5vdCByYWlzZSBUeXBlRXJyb3InCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3lzLnNldHRyYWNlKQogCi1wcmludCAiMjAuIGV2YWwgYW5kIGV4ZWMgd2l0aCBmcmVlIHZhcmlhYmxlcyIKKyAgICBkZWYgdGVzdEV2YWxFeGVjRnJlZVZhcnMoc2VsZik6CiAKLWRlZiBmKHgpOgotICAgIHJldHVybiBsYW1iZGE6IHggKyAxCisgICAgICAgIGRlZiBmKHgpOgorICAgICAgICAgICAgcmV0dXJuIGxhbWJkYTogeCArIDEKIAotZyA9IGYoMykKLXRyeToKLSAgICBldmFsKGcuZnVuY19jb2RlKQotZXhjZXB0IFR5cGVFcnJvcjoKLSAgICBwYXNzCi1lbHNlOgotICAgIHByaW50ICJldmFsKCkgc2hvdWxkIGhhdmUgZmFpbGVkLCBiZWNhdXNlIGNvZGUgY29udGFpbmVkIGZyZWUgdmFycyIKKyAgICAgICAgZyA9IGYoMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBldmFsLCBnLmZ1bmNfY29kZSkKIAotdHJ5OgotICAgIGV4ZWMoZy5mdW5jX2NvZGUpCi1leGNlcHQgVHlwZUVycm9yOgotICAgIHBhc3MKLWVsc2U6Ci0gICAgcHJpbnQgImV4ZWMgc2hvdWxkIGhhdmUgZmFpbGVkLCBiZWNhdXNlIGNvZGUgY29udGFpbmVkIGZyZWUgdmFycyIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhlYyhnLmZ1bmNfY29kZSwge30pCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4ZWMgc2hvdWxkIGhhdmUgZmFpbGVkLCBiZWNhdXNlIGNvZGUgY29udGFpbmVkIGZyZWUgdmFycyIpCiAKLXByaW50ICIyMS4gbGlzdCBjb21wcmVoZW5zaW9uIHdpdGggbG9jYWwgdmFyaWFibGVzIgorICAgIGRlZiB0ZXN0TGlzdENvbXBMb2NhbFZhcnMoc2VsZik6CiAKLXRyeToKLSAgICBwcmludCBiYWQKLWV4Y2VwdCBOYW1lRXJyb3I6Ci0gICAgcGFzcwotZWxzZToKLSAgICBwcmludCAiYmFkIHNob3VsZCBub3QgYmUgZGVmaW5lZCIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJpbnQgYmFkCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAiYmFkIHNob3VsZCBub3QgYmUgZGVmaW5lZCIKIAotZGVmIHgoKToKLSAgICBbYmFkIGZvciBzIGluICdhIGInIGZvciBiYWQgaW4gcy5zcGxpdCgpXQorICAgICAgICBkZWYgeCgpOgorICAgICAgICAgICAgW2JhZCBmb3IgcyBpbiAnYSBiJyBmb3IgYmFkIGluIHMuc3BsaXQoKV0KIAoteCgpCi10cnk6Ci0gICAgcHJpbnQgYmFkCi1leGNlcHQgTmFtZUVycm9yOgotICAgIHBhc3MKKyAgICAgICAgeCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByaW50IGJhZAorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcGFzcwogCi1wcmludCAiMjIuIGV2YWwgd2l0aCBmcmVlIHZhcmlhYmxlcyIKKyAgICBkZWYgdGVzdEV2YWxGcmVlVmFycyhzZWxmKToKIAotZGVmIGYoeCk6Ci0gICAgZGVmIGcoKToKLSAgICAgICAgeAotICAgICAgICBldmFsKCJ4ICsgMSIpCi0gICAgcmV0dXJuIGcKKyAgICAgICAgZGVmIGYoeCk6CisgICAgICAgICAgICBkZWYgZygpOgorICAgICAgICAgICAgICAgIHgKKyAgICAgICAgICAgICAgICBldmFsKCJ4ICsgMSIpCisgICAgICAgICAgICByZXR1cm4gZwogCi1mKDQpKCkKKyAgICAgICAgZig0KSgpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChTY29wZVRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NldC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CmluZGV4IDAzNjIxYTYuLmE0ODMwZDQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CkBAIC0yOTgsNiArMjk4LDE3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSBub3QgaW4gcykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHNlbGYucy5yZW1vdmUsIHNlbGYudGhldHlwZShzZWxmLndvcmQpKQogCisgICAgZGVmIHRlc3RfcmVtb3ZlX2tleWVycm9yX3VucGFja2luZyhzZWxmKToKKyAgICAgICAgIyBidWc6ICB3d3cucHl0aG9uLm9yZy9zZi8xNTc2NjU3CisgICAgICAgIGZvciB2MSBpbiBbJ1EnLCAoMSwpXToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnMucmVtb3ZlKHYxKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yLCBlOgorICAgICAgICAgICAgICAgIHYyID0gZS5hcmdzWzBdCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2MSwgdjIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgpCisKICAgICBkZWYgdGVzdF9kaXNjYXJkKHNlbGYpOgogICAgICAgICBzZWxmLnMuZGlzY2FyZCgnYScpCiAgICAgICAgIHNlbGYuYXNzZXJ0XygnYScgbm90IGluIHNlbGYucykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2dtbGxpYi5weSBiL0xpYi90ZXN0L3Rlc3Rfc2dtbGxpYi5weQppbmRleCAyOGEyMWE0Li5iNjk4NjM2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NnbWxsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zZ21sbGliLnB5CkBAIC0yODYsMjEgKzI4Niw2IEBACiAgICAgICAgICAgICAoJ2NvZGVwb2ludCcsICdjb252ZXJ0JywgNDIpLAogICAgICAgICAgICAgXSkKIAotICAgIGRlZiB0ZXN0X2F0dHJfdmFsdWVzX3F1b3RlZF9tYXJrdXAoc2VsZik6Ci0gICAgICAgICIiIk11bHRpLWxpbmUgYW5kIG1hcmt1cCBpbiBhdHRyaWJ1dGUgdmFsdWVzIiIiCi0gICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIHRpdGxlPSdmb29cbjxicj5iYXInPnRleHQ8L2E+IiIiLAotICAgICAgICAgICAgWygic3RhcnR0YWciLCAiYSIsIFsoInRpdGxlIiwgImZvb1xuPGJyPmJhciIpXSksCi0gICAgICAgICAgICAgKCJkYXRhIiwgInRleHQiKSwKLSAgICAgICAgICAgICAoImVuZHRhZyIsICJhIildKQotICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiIiI8YSB0aXRsZT0nbGVzcyA8IHRoYW4nPnRleHQ8L2E+IiIiLAotICAgICAgICAgICAgWygic3RhcnR0YWciLCAiYSIsIFsoInRpdGxlIiwgImxlc3MgPCB0aGFuIildKSwKLSAgICAgICAgICAgICAoImRhdGEiLCAidGV4dCIpLAotICAgICAgICAgICAgICgiZW5kdGFnIiwgImEiKV0pCi0gICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIHRpdGxlPSdncmVhdGVyID4gdGhhbic+dGV4dDwvYT4iIiIsCi0gICAgICAgICAgICBbKCJzdGFydHRhZyIsICJhIiwgWygidGl0bGUiLCAiZ3JlYXRlciA+IHRoYW4iKV0pLAotICAgICAgICAgICAgICgiZGF0YSIsICJ0ZXh0IiksCi0gICAgICAgICAgICAgKCJlbmR0YWciLCAiYSIpXSkKLQogICAgIGRlZiB0ZXN0X2F0dHJfZnVua3lfbmFtZXMoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIGEuYj0ndicgYzpkPXYgZS1mPXY+IiIiLCBbCiAgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImEiLCBbKCJhLmIiLCAidiIpLCAoImM6ZCIsICJ2IiksICgiZS1mIiwgInYiKV0pLApAQCAtMzc2LDYgKzM2MSwxOSBAQAogICAgICAgICAgICAgKCdkZWNsJywgJ0RPQ1RZUEUgZG9jIFs8IUFUVExJU1QgZG9jIGF0dHIgKGEgfCBiKSA+XScpLAogICAgICAgICAgICAgXSkKIAorICAgIGRlZiB0ZXN0X3JlYWRfY2h1bmtzKHNlbGYpOgorICAgICAgICAjIFNGIGJ1ZyAjMTU0MTY5NywgdGhpcyBjYXVzZWQgc2dtbCBwYXJzZXIgdG8gaGFuZworICAgICAgICAjIEp1c3QgdmVyaWZ5IHRoaXMgY29kZSBkb2Vzbid0IGNhdXNlIGEgaGFuZy4KKyAgICAgICAgQ0hVTksgPSAxMDI0ICAjIGluY3JlYXNpbmcgdGhpcyB0byA4MjEyIG1ha2VzIHRoZSBwcm9ibGVtIGdvIGF3YXkKKworICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuZmluZGZpbGUoJ3NnbWxfaW5wdXQuaHRtbCcpKQorICAgICAgICBmcCA9IHNnbWxsaWIuU0dNTFBhcnNlcigpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBkYXRhID0gZi5yZWFkKENIVU5LKQorICAgICAgICAgICAgZnAuZmVlZChkYXRhKQorICAgICAgICAgICAgaWYgbGVuKGRhdGEpICE9IENIVU5LOgorICAgICAgICAgICAgICAgIGJyZWFrCisKICAgICAjIFhYWCBUaGVzZSB0ZXN0cyBoYXZlIGJlZW4gZGlzYWJsZWQgYnkgcHJlZml4aW5nIHRoZWlyIG5hbWVzIHdpdGgKICAgICAjIGFuIHVuZGVyc2NvcmUuICBUaGUgZmlyc3QgdHdvIGV4ZXJjaXNlIG91dHN0YW5kaW5nIGJ1Z3MgaW4gdGhlCiAgICAgIyBzZ21sbGliIG1vZHVsZSwgYW5kIHRoZSB0aGlyZCBleGhpYml0cyBxdWVzdGlvbmFibGUgYmVoYXZpb3IKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2hhLnB5IGIvTGliL3Rlc3QvdGVzdF9zaGEucHkKaW5kZXggYzQzOGNjNi4uZWEyMjRlNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zaGEucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zaGEucHkKQEAgLTExLDkgKzExLDIzIEBACiAKIGNsYXNzIFNIQVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgY2hlY2soc2VsZiwgZGF0YSwgZGlnZXN0KToKLSAgICAgICAgY29tcHV0ZWQgPSBzaGEubmV3KGRhdGEpLmhleGRpZ2VzdCgpCisgICAgICAgICMgQ2hlY2sgZGlnZXN0IG1hdGNoZXMgdGhlIGV4cGVjdGVkIHZhbHVlCisgICAgICAgIG9iaiA9IHNoYS5uZXcoZGF0YSkKKyAgICAgICAgY29tcHV0ZWQgPSBvYmouaGV4ZGlnZXN0KCkKICAgICAgICAgc2VsZi5hc3NlcnRfKGNvbXB1dGVkID09IGRpZ2VzdCkKIAorICAgICAgICAjIFZlcmlmeSB0aGF0IHRoZSB2YWx1ZSBkb2Vzbid0IGNoYW5nZSBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZQorICAgICAgICAjIGRpZ2VzdCBvcGVyYXRpb25zLgorICAgICAgICBjb21wdXRlZF9hZ2FpbiA9IG9iai5oZXhkaWdlc3QoKQorICAgICAgICBzZWxmLmFzc2VydF8oY29tcHV0ZWQgPT0gY29tcHV0ZWRfYWdhaW4pCisKKyAgICAgICAgIyBDaGVjayBoZXhkaWdlc3QoKSBvdXRwdXQgbWF0Y2hlcyBkaWdlc3QoKSdzIG91dHB1dAorICAgICAgICBkaWdlc3QgPSBvYmouZGlnZXN0KCkKKyAgICAgICAgaGV4ZCA9ICIiCisgICAgICAgIGZvciBjIGluIGRpZ2VzdDoKKyAgICAgICAgICAgIGhleGQgKz0gJyUwMngnICUgb3JkKGMpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhjb21wdXRlZCA9PSBoZXhkKQorCiAgICAgZGVmIHRlc3RfY2FzZV8xKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrKCJhYmMiLAogICAgICAgICAgICAgICAgICAgICJhOTk5M2UzNjQ3MDY4MTZhYmEzZTI1NzE3ODUwYzI2YzljZDBkODlkIikKQEAgLTI2LDYgKzQwLDkgQEAKICAgICAgICAgc2VsZi5jaGVjaygiYSIgKiAxMDAwMDAwLAogICAgICAgICAgICAgICAgICAgICIzNGFhOTczY2Q0YzRkYWE0ZjYxZWViMmJkYmFkMjczMTY1MzQwMTZmIikKIAorICAgIGRlZiB0ZXN0X2Nhc2VfNChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjayhjaHIoMHhBQSkgKiA4MCwKKyAgICAgICAgICAgICAgICAgICAnNGNhMGVmMzhmMTc5NGIyOGE4ZjhlZTExMGVlNzlkNDhjZTEzYmUyNScpCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFNIQVRlc3RDYXNlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdHJ1Y3RtZW1iZXJzLnB5IGIvTGliL3Rlc3QvdGVzdF9zdHJ1Y3RtZW1iZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZGQyYWMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X3N0cnVjdG1lbWJlcnMucHkKQEAgLTAsMCArMSw4MCBAQAorZnJvbSBfdGVzdGNhcGkgaW1wb3J0IHRlc3Rfc3RydWN0bWVtYmVyc1R5cGUsIFwKKyAgICBDSEFSX01BWCwgQ0hBUl9NSU4sIFVDSEFSX01BWCwgXAorICAgIFNIUlRfTUFYLCBTSFJUX01JTiwgVVNIUlRfTUFYLCBcCisgICAgSU5UX01BWCwgSU5UX01JTiwgVUlOVF9NQVgsIFwKKyAgICBMT05HX01BWCwgTE9OR19NSU4sIFVMT05HX01BWAorCitpbXBvcnQgd2FybmluZ3MsIGV4Y2VwdGlvbnMsIHVuaXR0ZXN0LCB0ZXN0LnRlc3Rfd2FybmluZ3MKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK3RzPXRlc3Rfc3RydWN0bWVtYmVyc1R5cGUoMSwyLDMsNCw1LDYsNyw4LDkuOTk5OTksMTAuMTAxMDEwMTAxMCkKKworY2xhc3MgUmVhZFdyaXRlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3R5cGVzKHNlbGYpOgorICAgICAgICB0cy5UX0JZVEU9Q0hBUl9NQVgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModHMuVF9CWVRFLCBDSEFSX01BWCkKKyAgICAgICAgdHMuVF9CWVRFPUNIQVJfTUlOCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRzLlRfQllURSwgQ0hBUl9NSU4pCisgICAgICAgIHRzLlRfVUJZVEU9VUNIQVJfTUFYCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRzLlRfVUJZVEUsIFVDSEFSX01BWCkKKworICAgICAgICB0cy5UX1NIT1JUPVNIUlRfTUFYCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRzLlRfU0hPUlQsIFNIUlRfTUFYKQorICAgICAgICB0cy5UX1NIT1JUPVNIUlRfTUlOCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRzLlRfU0hPUlQsIFNIUlRfTUlOKQorICAgICAgICB0cy5UX1VTSE9SVD1VU0hSVF9NQVgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModHMuVF9VU0hPUlQsIFVTSFJUX01BWCkKKworICAgICAgICB0cy5UX0lOVD1JTlRfTUFYCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRzLlRfSU5ULCBJTlRfTUFYKQorICAgICAgICB0cy5UX0lOVD1JTlRfTUlOCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRzLlRfSU5ULCBJTlRfTUlOKQorICAgICAgICB0cy5UX1VJTlQ9VUlOVF9NQVgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModHMuVF9VSU5ULCBVSU5UX01BWCkKKworICAgICAgICB0cy5UX0xPTkc9TE9OR19NQVgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModHMuVF9MT05HLCBMT05HX01BWCkKKyAgICAgICAgdHMuVF9MT05HPUxPTkdfTUlOCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRzLlRfTE9ORywgTE9OR19NSU4pCisgICAgICAgIHRzLlRfVUxPTkc9VUxPTkdfTUFYCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRzLlRfVUxPTkcsIFVMT05HX01BWCkKKworY2xhc3MgVGVzdFdhcm5pbmdzKHRlc3QudGVzdF93YXJuaW5ncy5UZXN0TW9kdWxlKToKKyAgICBkZWYgaGFzX3dhcm5lZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0LnRlc3Rfd2FybmluZ3MubXNnLmNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnMuUnVudGltZVdhcm5pbmcuX19uYW1lX18pCisKKyAgICBkZWYgdGVzdF9ieXRlX21heChzZWxmKToKKyAgICAgICAgdHMuVF9CWVRFPUNIQVJfTUFYKzEKKyAgICAgICAgc2VsZi5oYXNfd2FybmVkKCkKKworICAgIGRlZiB0ZXN0X2J5dGVfbWluKHNlbGYpOgorICAgICAgICB0cy5UX0JZVEU9Q0hBUl9NSU4tMQorICAgICAgICBzZWxmLmhhc193YXJuZWQoKQorCisgICAgZGVmIHRlc3RfdWJ5dGVfbWF4KHNlbGYpOgorICAgICAgICB0cy5UX1VCWVRFPVVDSEFSX01BWCsxCisgICAgICAgIHNlbGYuaGFzX3dhcm5lZCgpCisKKyAgICBkZWYgdGVzdF9zaG9ydF9tYXgoc2VsZik6CisgICAgICAgIHRzLlRfU0hPUlQ9U0hSVF9NQVgrMQorICAgICAgICBzZWxmLmhhc193YXJuZWQoKQorCisgICAgZGVmIHRlc3Rfc2hvcnRfbWluKHNlbGYpOgorICAgICAgICB0cy5UX1NIT1JUPVNIUlRfTUlOLTEKKyAgICAgICAgc2VsZi5oYXNfd2FybmVkKCkKKworICAgIGRlZiB0ZXN0X3VzaG9ydF9tYXgoc2VsZik6CisgICAgICAgIHRzLlRfVVNIT1JUPVVTSFJUX01BWCsxCisgICAgICAgIHNlbGYuaGFzX3dhcm5lZCgpCisKKworCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgUmVhZFdyaXRlVGVzdHMsCisgICAgICAgIFRlc3RXYXJuaW5ncworICAgICAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weSBiL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weQppbmRleCA4YzhhYzQwLi42NGY4ZDQwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5CkBAIC0yMzQsNiArMjM0LDEyIEBACiAgICAgICAgIHN0cmlwcGVkID0gcmVtb3ZlX3N0ZGVycl9kZWJ1Z19kZWNvcmF0aW9ucyhvdXRwdXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaXBwZWQsICJhcHBsZW9yYW5nZSIpCiAKKyAgICBkZWYgdGVzdF9zdGRvdXRfZmlsZWRlc19vZl9zdGRvdXQoc2VsZik6CisgICAgICAgICMgc3Rkb3V0IGlzIHNldCB0byAxICgjMTUzMTg2MikuCisgICAgICAgIGNtZCA9IHIiaW1wb3J0IHN5cywgb3M7IHN5cy5leGl0KG9zLndyaXRlKHN5cy5zdGRvdXQuZmlsZW5vKCksICcuXG4nKSkiCisgICAgICAgIHJjID0gc3VicHJvY2Vzcy5jYWxsKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgY21kXSwgc3Rkb3V0PTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJjLCAyKQorCiAgICAgZGVmIHRlc3RfY3dkKHNlbGYpOgogICAgICAgICB0bXBkaXIgPSBvcy5nZXRlbnYoIlRFTVAiLCAiL3RtcCIpCiAgICAgICAgICMgV2UgY2Fubm90IHVzZSBvcy5wYXRoLnJlYWxwYXRoIHRvIGNhbm9uaWNhbGl6ZSB0aGUgcGF0aCwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weQppbmRleCBkMjYwZmM1Li4yODI5YzU1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5CkBAIC0yNDQsMTMgKzI0NCwxMyBAQAogICAgIHdpdGhjb21tYXMgPSAiLCAiLmpvaW4ocmVwcnBhaXJzKQogICAgIHJldHVybiAieyVzfSIgJSB3aXRoY29tbWFzCiAKLWRlZiBjaGVja19zeW50YXgoc3RhdGVtZW50KToKK2RlZiBjaGVja19zeW50YXhfZXJyb3IodGVzdGNhc2UsIHN0YXRlbWVudCk6CiAgICAgdHJ5OgotICAgICAgICBjb21waWxlKHN0YXRlbWVudCwgJzxzdHJpbmc+JywgJ2V4ZWMnKQorICAgICAgICBjb21waWxlKHN0YXRlbWVudCwgJzx0ZXN0IHN0cmluZz4nLCAnZXhlYycpCiAgICAgZXhjZXB0IFN5bnRheEVycm9yOgogICAgICAgICBwYXNzCiAgICAgZWxzZToKLSAgICAgICAgcHJpbnQgJ01pc3NpbmcgU3ludGF4RXJyb3I6ICIlcyInICUgc3RhdGVtZW50CisgICAgICAgIHRlc3RjYXNlLmZhaWwoJ01pc3NpbmcgU3ludGF4RXJyb3I6ICIlcyInICUgc3RhdGVtZW50KQogCiBkZWYgb3Blbl91cmxyZXNvdXJjZSh1cmwpOgogICAgIGltcG9ydCB1cmxsaWIsIHVybHBhcnNlCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N5bnRheC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3ludGF4LnB5CmluZGV4IGFjYjNmMTAuLmEwZWFhYzYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3ludGF4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3ludGF4LnB5CkBAIC0yMzUsNiArMjM1LDEzOCBAQAogPj4+IGYoKSArPSAxCiBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiBTeW50YXhFcnJvcjogaWxsZWdhbCBleHByZXNzaW9uIGZvciBhdWdtZW50ZWQgYXNzaWdubWVudCAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFszM10+LCBsaW5lIDEpCisKKworVGVzdCBjb250aW51ZSBpbiBmaW5hbGx5IGluIHdlaXJkIGNvbWJpbmF0aW9ucy4KKworY29udGludWUgaW4gZm9yIGxvb3AgdW5kZXIgZmluYWxseSBzaG91dWxkIGJlIG9rLgorCisgICAgPj4+IGRlZiB0ZXN0KCk6CisgICAgLi4uICAgICB0cnk6CisgICAgLi4uICAgICAgICAgcGFzcworICAgIC4uLiAgICAgZmluYWxseToKKyAgICAuLi4gICAgICAgICBmb3IgYWJjIGluIHJhbmdlKDEwKToKKyAgICAuLi4gICAgICAgICAgICAgY29udGludWUKKyAgICAuLi4gICAgIHByaW50IGFiYworICAgID4+PiB0ZXN0KCkKKyAgICA5CisKK1N0YXJ0IHNpbXBsZSwgYSBjb250aW51ZSBpbiBhIGZpbmFsbHkgc2hvdWxkIG5vdCBiZSBhbGxvd2VkLgorCisgICAgPj4+IGRlZiB0ZXN0KCk6CisgICAgLi4uICAgIGZvciBhYmMgaW4gcmFuZ2UoMTApOgorICAgIC4uLiAgICAgICAgdHJ5OgorICAgIC4uLiAgICAgICAgICAgIHBhc3MKKyAgICAuLi4gICAgICAgIGZpbmFsbHk6CisgICAgLi4uICAgICAgICAgICAgY29udGludWUKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBTeW50YXhFcnJvcjogJ2NvbnRpbnVlJyBub3Qgc3VwcG9ydGVkIGluc2lkZSAnZmluYWxseScgY2xhdXNlICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzM2XT4sIGxpbmUgNikKKworVGhpcyBpcyBlc3NlbnRpYWxseSBhIGNvbnRpbnVlIGluIGEgZmluYWxseSB3aGljaCBzaG91bGQgbm90IGJlIGFsbG93ZWQuCisKKyAgICA+Pj4gZGVmIHRlc3QoKToKKyAgICAuLi4gICAgZm9yIGFiYyBpbiByYW5nZSgxMCk6CisgICAgLi4uICAgICAgICB0cnk6CisgICAgLi4uICAgICAgICAgICAgcGFzcworICAgIC4uLiAgICAgICAgZmluYWxseToKKyAgICAuLi4gICAgICAgICAgICB0cnk6CisgICAgLi4uICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgLi4uICAgICAgICAgICAgZXhjZXB0OgorICAgIC4uLiAgICAgICAgICAgICAgICBwYXNzCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgU3ludGF4RXJyb3I6ICdjb250aW51ZScgbm90IHN1cHBvcnRlZCBpbnNpZGUgJ2ZpbmFsbHknIGNsYXVzZSAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFszN10+LCBsaW5lIDcpCisKKyAgICA+Pj4gZGVmIGZvbygpOgorICAgIC4uLiAgICAgdHJ5OgorICAgIC4uLiAgICAgICAgIHBhc3MKKyAgICAuLi4gICAgIGZpbmFsbHk6CisgICAgLi4uICAgICAgICAgY29udGludWUKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBTeW50YXhFcnJvcjogJ2NvbnRpbnVlJyBub3Qgc3VwcG9ydGVkIGluc2lkZSAnZmluYWxseScgY2xhdXNlICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzM4XT4sIGxpbmUgNSkKKworICAgID4+PiBkZWYgZm9vKCk6CisgICAgLi4uICAgICBmb3IgYSBpbiAoKToKKyAgICAuLi4gICAgICAgdHJ5OgorICAgIC4uLiAgICAgICAgICAgcGFzcworICAgIC4uLiAgICAgICBmaW5hbGx5OgorICAgIC4uLiAgICAgICAgICAgY29udGludWUKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBTeW50YXhFcnJvcjogJ2NvbnRpbnVlJyBub3Qgc3VwcG9ydGVkIGluc2lkZSAnZmluYWxseScgY2xhdXNlICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzM5XT4sIGxpbmUgNikKKworICAgID4+PiBkZWYgZm9vKCk6CisgICAgLi4uICAgICBmb3IgYSBpbiAoKToKKyAgICAuLi4gICAgICAgICB0cnk6CisgICAgLi4uICAgICAgICAgICAgIHBhc3MKKyAgICAuLi4gICAgICAgICBmaW5hbGx5OgorICAgIC4uLiAgICAgICAgICAgICB0cnk6CisgICAgLi4uICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgIC4uLiAgICAgICAgICAgICBmaW5hbGx5OgorICAgIC4uLiAgICAgICAgICAgICAgICAgcGFzcworICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFN5bnRheEVycm9yOiAnY29udGludWUnIG5vdCBzdXBwb3J0ZWQgaW5zaWRlICdmaW5hbGx5JyBjbGF1c2UgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbNDBdPiwgbGluZSA3KQorCisgICAgPj4+IGRlZiBmb28oKToKKyAgICAuLi4gIGZvciBhIGluICgpOgorICAgIC4uLiAgIHRyeTogcGFzcworICAgIC4uLiAgIGZpbmFsbHk6CisgICAgLi4uICAgIHRyeToKKyAgICAuLi4gICAgIHBhc3MKKyAgICAuLi4gICAgZXhjZXB0OgorICAgIC4uLiAgICAgY29udGludWUKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBTeW50YXhFcnJvcjogJ2NvbnRpbnVlJyBub3Qgc3VwcG9ydGVkIGluc2lkZSAnZmluYWxseScgY2xhdXNlICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzQxXT4sIGxpbmUgOCkKKworVGhlcmUgaXMgb25lIHRlc3QgZm9yIGEgYnJlYWsgdGhhdCBpcyBub3QgaW4gYSBsb29wLiAgVGhlIGNvbXBpbGVyCit1c2VzIGEgc2luZ2xlIGRhdGEgc3RydWN0dXJlIHRvIGtlZXAgdHJhY2sgb2YgdHJ5LWZpbmFsbHkgYW5kIGxvb3BzLAorc28gd2UgbmVlZCB0byBiZSBzdXJlIHRoYXQgYSBicmVhayBpcyBhY3R1YWxseSBpbnNpZGUgYSBsb29wLiAgSWYgaXQKK2lzbid0LCB0aGVyZSBzaG91bGQgYmUgYSBzeW50YXggZXJyb3IuCisKKyAgID4+PiB0cnk6CisgICAuLi4gICAgIHByaW50IDEKKyAgIC4uLiAgICAgYnJlYWsKKyAgIC4uLiAgICAgcHJpbnQgMgorICAgLi4uIGZpbmFsbHk6CisgICAuLi4gICAgIHByaW50IDMKKyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgLi4uCisgICBTeW50YXhFcnJvcjogJ2JyZWFrJyBvdXRzaWRlIGxvb3AgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbNDJdPiwgbGluZSAzKQorCitUaGlzIHNob3VsZCBwcm9iYWJseSByYWlzZSBhIGJldHRlciBlcnJvciB0aGFuIGEgU3lzdGVtRXJyb3IgKG9yIG5vbmUgYXQgYWxsKS4KK0luIDIuNSB0aGVyZSB3YXMgYSBtaXNzaW5nIGV4Y2VwdGlvbiBhbmQgYW4gYXNzZXJ0IHdhcyB0cmlnZ2VyZWQgaW4gYSBkZWJ1ZworYnVpbGQuICBUaGUgbnVtYmVyIG9mIGJsb2NrcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBDT19NQVhCTE9DS1MuICBTRiAjMTU2NTUxNAorCisgICA+Pj4gd2hpbGUgMToKKyAgIC4uLiAgd2hpbGUgMjoKKyAgIC4uLiAgIHdoaWxlIDM6CisgICAuLi4gICAgd2hpbGUgNDoKKyAgIC4uLiAgICAgd2hpbGUgNToKKyAgIC4uLiAgICAgIHdoaWxlIDY6CisgICAuLi4gICAgICAgd2hpbGUgODoKKyAgIC4uLiAgICAgICAgd2hpbGUgOToKKyAgIC4uLiAgICAgICAgIHdoaWxlIDEwOgorICAgLi4uICAgICAgICAgIHdoaWxlIDExOgorICAgLi4uICAgICAgICAgICB3aGlsZSAxMjoKKyAgIC4uLiAgICAgICAgICAgIHdoaWxlIDEzOgorICAgLi4uICAgICAgICAgICAgIHdoaWxlIDE0OgorICAgLi4uICAgICAgICAgICAgICB3aGlsZSAxNToKKyAgIC4uLiAgICAgICAgICAgICAgIHdoaWxlIDE2OgorICAgLi4uICAgICAgICAgICAgICAgIHdoaWxlIDE3OgorICAgLi4uICAgICAgICAgICAgICAgICB3aGlsZSAxODoKKyAgIC4uLiAgICAgICAgICAgICAgICAgIHdoaWxlIDE5OgorICAgLi4uICAgICAgICAgICAgICAgICAgIHdoaWxlIDIwOgorICAgLi4uICAgICAgICAgICAgICAgICAgICB3aGlsZSAyMToKKyAgIC4uLiAgICAgICAgICAgICAgICAgICAgIHdoaWxlIDIyOgorICAgLi4uICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgIC4uLgorICAgU3lzdGVtRXJyb3I6IHRvbyBtYW55IHN0YXRpY2FsbHkgbmVzdGVkIGJsb2NrcworCiAiIiIKIAogaW1wb3J0IHJlCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKaW5kZXggYTQ3YWZhNC4uMGNlYmIyOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQpAQCAtMjgwLDYgKzI4MCwzMiBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLmRzdC5hZGRmaWxlKHRhcmluZm8sIGYpCiAKKworY2xhc3MgV3JpdGUxMDBUZXN0KEJhc2VUZXN0KToKKyAgICAjIFRoZSBuYW1lIGZpZWxkIGluIGEgdGFyIGhlYWRlciBzdG9yZXMgc3RyaW5ncyBvZiBhdCBtb3N0IDEwMCBjaGFycy4KKyAgICAjIElmIGEgc3RyaW5nIGlzIHNob3J0ZXIgdGhhbiAxMDAgY2hhcnMgaXQgaGFzIHRvIGJlIHBhZGRlZCB3aXRoICdcMCcsCisgICAgIyB3aGljaCBpbXBsaWVzIHRoYXQgYSBzdHJpbmcgb2YgZXhhY3RseSAxMDAgY2hhcnMgaXMgc3RvcmVkIHdpdGhvdXQKKyAgICAjIGEgdHJhaWxpbmcgJ1wwJy4KKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5uYW1lID0gIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IgorICAgICAgICBzZWxmLm5hbWUgKz0gIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IgorCisgICAgICAgIHNlbGYudGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUoKSwgInciKQorICAgICAgICB0ID0gdGFyZmlsZS5UYXJJbmZvKHNlbGYubmFtZSkKKyAgICAgICAgc2VsZi50YXIuYWRkZmlsZSh0KQorICAgICAgICBzZWxmLnRhci5jbG9zZSgpCisKKyAgICAgICAgc2VsZi50YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSgpKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnRhci5jbG9zZSgpCisKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRhci5nZXRuYW1lcygpWzBdLCBzZWxmLm5hbWUsCisgICAgICAgICAgICAgICAgImZhaWxlZCB0byBzdG9yZSAxMDAgY2hhciBmaWxlbmFtZSIpCisKKwogY2xhc3MgV3JpdGVTaXplMFRlc3QoQmFzZVRlc3QpOgogICAgIG1vZGUgPSAndycKIApAQCAtMzYyLDEzICszODgsNiBAQAogICAgICAgIGlzIHRlc3RlZCBhcyB3ZWxsLgogICAgICIiIgogCi0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLnRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lKCksICJ3IikKLSAgICAgICAgc2VsZi50YXIucG9zaXggPSBGYWxzZQotCi0gICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICBzZWxmLnRhci5jbG9zZSgpCi0KICAgICBkZWYgX2xlbmd0aChzZWxmLCBzKToKICAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2QobGVuKHMpICsgMSwgNTEyKQogICAgICAgICBpZiByZW1haW5kZXI6CkBAIC0zOTcsMTIgKzQxNiwyMyBAQAogICAgICAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9IGxpbmsKICAgICAgICAgICAgIHRhcmluZm8udHlwZSA9IHRhcmZpbGUuTE5LVFlQRQogCi0gICAgICAgIHNlbGYudGFyLmFkZGZpbGUodGFyaW5mbykKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUoKSwgInciKQorICAgICAgICB0YXIucG9zaXggPSBGYWxzZQorICAgICAgICB0YXIuYWRkZmlsZSh0YXJpbmZvKQogCiAgICAgICAgIHYxID0gc2VsZi5fY2FsY19zaXplKG5hbWUsIGxpbmspCi0gICAgICAgIHYyID0gc2VsZi50YXIub2Zmc2V0CisgICAgICAgIHYyID0gdGFyLm9mZnNldAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYxLCB2MiwgIkdOVSBsb25nbmFtZS9sb25nbGluayBjcmVhdGlvbiBmYWlsZWQiKQogCisgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUoKSkKKyAgICAgICAgbWVtYmVyID0gdGFyLm5leHQoKQorICAgICAgICBzZWxmLmZhaWxJZihtZW1iZXIgaXMgTm9uZSwgInVuYWJsZSB0byByZWFkIGxvbmduYW1lIG1lbWJlciIpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLm5hbWUgPT0gbWVtYmVyLm5hbWUgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgIHRhcmluZm8ubGlua25hbWUgPT0gbWVtYmVyLmxpbmtuYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIHJlYWQgbG9uZ25hbWUgbWVtYmVyIikKKwogICAgIGRlZiB0ZXN0X2xvbmduYW1lXzEwMjMoc2VsZik6CiAgICAgICAgIHNlbGYuX3Rlc3QoKCJsb25nbmFtLyIgKiAxMjcpICsgImxvbmduYW0iKQogCkBAIC02MjMsNiArNjUzLDcgQEAKICAgICAgICAgUmVhZEFzdGVyaXNrVGVzdCwKICAgICAgICAgUmVhZFN0cmVhbUFzdGVyaXNrVGVzdCwKICAgICAgICAgV3JpdGVUZXN0LAorICAgICAgICBXcml0ZTEwMFRlc3QsCiAgICAgICAgIFdyaXRlU2l6ZTBUZXN0LAogICAgICAgICBXcml0ZVN0cmVhbVRlc3QsCiAgICAgICAgIFdyaXRlR05VTG9uZ1Rlc3QsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RlbXBmaWxlLnB5IGIvTGliL3Rlc3QvdGVzdF90ZW1wZmlsZS5weQppbmRleCBhZWFhNzdlLi4yMDQ3YTYzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RlbXBmaWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGVtcGZpbGUucHkKQEAgLTI3LDcgKzI3LDcgQEAKICMgbnVtYmVyIG9mIGZpbGVzIHRoYXQgY2FuIGJlIG9wZW5lZCBhdCBvbmUgdGltZSAoc2VlIHVsaW1pdCAtbikKIGlmIHN5cy5wbGF0Zm9ybSA9PSAnbWFjJzoKICAgICBURVNUX0ZJTEVTID0gMzIKLWVsaWYgc3lzLnBsYXRmb3JtID09ICdvcGVuYnNkMyc6CitlbGlmIHN5cy5wbGF0Zm9ybSBpbiAoJ29wZW5ic2QzJywgJ29wZW5ic2Q0Jyk6CiAgICAgVEVTVF9GSUxFUyA9IDQ4CiBlbHNlOgogICAgIFRFU1RfRklMRVMgPSAxMDAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGltZS5weSBiL0xpYi90ZXN0L3Rlc3RfdGltZS5weQppbmRleCA0ZmQ3ODM0Li4xODEyOWRhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RpbWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90aW1lLnB5CkBAIC0xMDIsMTUgKzEwMiwxOSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RlZCwgcmVzdWx0KQogCiAgICAgZGVmIHRlc3Rfc3RycHRpbWUoc2VsZik6CisgICAgICAgICMgU2hvdWxkIGJlIGFibGUgdG8gZ28gcm91bmQtdHJpcCBmcm9tIHN0cmZ0aW1lIHRvIHN0cnB0aW1lIHdpdGhvdXQKKyAgICAgICAgIyB0aHJvd2luZyBhbiBleGNlcHRpb24uCiAgICAgICAgIHR0ID0gdGltZS5nbXRpbWUoc2VsZi50KQogICAgICAgICBmb3IgZGlyZWN0aXZlIGluICgnYScsICdBJywgJ2InLCAnQicsICdjJywgJ2QnLCAnSCcsICdJJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onLCAnbScsICdNJywgJ3AnLCAnUycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJywgJ3cnLCAnVycsICd4JywgJ1gnLCAneScsICdZJywgJ1onLCAnJScpOgotICAgICAgICAgICAgZm9ybWF0ID0gJyAlJyArIGRpcmVjdGl2ZQorICAgICAgICAgICAgZm9ybWF0ID0gJyUnICsgZGlyZWN0aXZlCisgICAgICAgICAgICBzdHJmX291dHB1dCA9IHRpbWUuc3RyZnRpbWUoZm9ybWF0LCB0dCkKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICB0aW1lLnN0cnB0aW1lKHRpbWUuc3RyZnRpbWUoZm9ybWF0LCB0dCksIGZvcm1hdCkKKyAgICAgICAgICAgICAgICB0aW1lLnN0cnB0aW1lKHN0cmZfb3V0cHV0LCBmb3JtYXQpCiAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ2NvbnZlcnNpb24gc3BlY2lmaWVyOiAlciBmYWlsZWQuJyAlIGZvcm1hdCkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImNvbnZlcnNpb24gc3BlY2lmaWVyICVyIGZhaWxlZCB3aXRoICclcycgaW5wdXQuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQsIHN0cmZfb3V0cHV0KSkKIAogICAgIGRlZiB0ZXN0X2FzY3RpbWUoc2VsZik6CiAgICAgICAgIHRpbWUuYXNjdGltZSh0aW1lLmdtdGltZShzZWxmLnQpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90b2tlbml6ZS5weSBiL0xpYi90ZXN0L3Rlc3RfdG9rZW5pemUucHkKaW5kZXggYjA2NDk2Ny4uYmU2YzE4ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90b2tlbml6ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Rva2VuaXplLnB5CkBAIC0xLDkgKzEsOTMgQEAKLWltcG9ydCBvcywgZ2xvYiwgcmFuZG9tCisiIiJUZXN0cyBmb3IgdGhlIHRva2VuaXplIG1vZHVsZS4KKworVGhlIHRlc3RzIHdlcmUgb3JpZ2luYWxseSB3cml0dGVuIGluIHRoZSBvbGQgUHl0aG9uIHN0eWxlLCB3aGVyZSB0aGUKK3Rlc3Qgb3V0cHV0IHdhcyBjb21wYXJlZCB0byBhIGdvbGRlbiBmaWxlLiAgVGhpcyBkb2NzdHJpbmcgcmVwcmVzZW50cwordGhlIGZpcnN0IHN0ZXBzIHRvd2FyZHMgcmV3cml0aW5nIHRoZSBlbnRpcmUgdGVzdCBhcyBhIGRvY3Rlc3QuCisKK1RoZSB0ZXN0cyBjYW4gYmUgcmVhbGx5IHNpbXBsZS4gIEdpdmVuIGEgc21hbGwgZnJhZ21lbnQgb2Ygc291cmNlCitjb2RlLCBwcmludCBvdXQgYSB0YWJsZSB3aXRoIHRoZSB0b2tlbnMuICBUaGUgRU5ETUFSSyBpcyBvbWl0dGVkIGZvcgorYnJldml0eS4KKworPj4+IGR1bXBfdG9rZW5zKCIxICsgMSIpCitOVU1CRVIgICAgICAnMScgICAgICAgICAgICgxLCAwKSAoMSwgMSkKK09QICAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDIpICgxLCAzKQorTlVNQkVSICAgICAgJzEnICAgICAgICAgICAoMSwgNCkgKDEsIDUpCisKK0EgY29tbWVudCBnZW5lcmF0ZXMgYSB0b2tlbiBoZXJlLCB1bmxpa2UgaW4gdGhlIHBhcnNlciBtb2R1bGUuICBUaGUKK2NvbW1lbnQgdG9rZW4gaXMgZm9sbG93ZWQgYnkgYW4gTkwgb3IgYSBORVdMSU5FIHRva2VuLCBkZXBlbmRpbmcgb24KK3doZXRoZXIgdGhlIGxpbmUgY29udGFpbnMgdGhlIGNvbXBsZXRpb24gb2YgYSBzdGF0ZW1lbnQuCisKKz4+PiBkdW1wX3Rva2VucygiaWYgRmFsc2U6XFxuIgorLi4uICAgICAgICAgICAgICIgICAgIyBOTFxcbiIKKy4uLiAgICAgICAgICAgICAiICAgIFRydWUgPSBGYWxzZSAjIE5FV0xJTkVcXG4iKQorTkFNRSAgICAgICAgJ2lmJyAgICAgICAgICAoMSwgMCkgKDEsIDIpCitOQU1FICAgICAgICAnRmFsc2UnICAgICAgICgxLCAzKSAoMSwgOCkKK09QICAgICAgICAgICc6JyAgICAgICAgICAgKDEsIDgpICgxLCA5KQorTkVXTElORSAgICAgJ1xcbicgICAgICAgICAgKDEsIDkpICgxLCAxMCkKK0NPTU1FTlQgICAgICcjIE5MJyAgICAgICAgKDIsIDQpICgyLCA4KQorTkwgICAgICAgICAgJ1xcbicgICAgICAgICAgKDIsIDgpICgyLCA5KQorSU5ERU5UICAgICAgJyAgICAnICAgICAgICAoMywgMCkgKDMsIDQpCitOQU1FICAgICAgICAnVHJ1ZScgICAgICAgICgzLCA0KSAoMywgOCkKK09QICAgICAgICAgICc9JyAgICAgICAgICAgKDMsIDkpICgzLCAxMCkKK05BTUUgICAgICAgICdGYWxzZScgICAgICAgKDMsIDExKSAoMywgMTYpCitDT01NRU5UICAgICAnIyBORVdMSU5FJyAgICgzLCAxNykgKDMsIDI2KQorTkVXTElORSAgICAgJ1xcbicgICAgICAgICAgKDMsIDI2KSAoMywgMjcpCitERURFTlQgICAgICAnJyAgICAgICAgICAgICg0LCAwKSAoNCwgMCkKKworCitUaGVyZSB3aWxsIGJlIGEgYnVuY2ggbW9yZSB0ZXN0cyBvZiBzcGVjaWZpYyBzb3VyY2UgcGF0dGVybnMuCisKK1RoZSB0b2tlbml6ZSBtb2R1bGUgYWxzbyBkZWZpbmVzIGFuIHVudG9rZW5pemUgZnVuY3Rpb24gdGhhdCBzaG91bGQKK3JlZ2VuZXJhdGUgdGhlIG9yaWdpbmFsIHByb2dyYW0gdGV4dCBmcm9tIHRoZSB0b2tlbnMuCisKK1RoZXJlIGFyZSBzb21lIHN0YW5kYXJkIGZvcm1hdHRpbmcgcHJhY3RpY2VzIHRoYXQgYXJlIGVhc3kgdG8gZ2V0IHJpZ2h0LgorCis+Pj4gcm91bmR0cmlwKCJpZiB4ID09IDE6XFxuIgorLi4uICAgICAgICAgICAiICAgIHByaW50IHhcXG4iKQoraWYgeCA9PSAxOgorICAgIHByaW50IHgKKworU29tZSBwZW9wbGUgdXNlIGRpZmZlcmVudCBmb3JtYXR0aW5nIGNvbnZlbnRpb25zLCB3aGljaCBtYWtlcwordW50b2tlbml6ZSBhIGxpdHRsZSB0cmlja2llci4gIE5vdGUgdGhhdCB0aGlzIHRlc3QgaW52b2x2ZXMgdHJhaWxpbmcKK3doaXRlc3BhY2UgYWZ0ZXIgdGhlIGNvbG9uLiAgTm90ZSB0aGF0IHdlIHVzZSBoZXggZXNjYXBlcyB0byBtYWtlIHRoZQordHdvIHRyYWlsaW5nIGJsYW5rcyBhcHBhcmVudCBpbiB0aGUgZXhwZWN0ZWQgb3V0cHV0LgorCis+Pj4gcm91bmR0cmlwKCJpZiAgIHggID09ICAxICA6ICBcXG4iCisuLi4gICAgICAgICAgICIgIHByaW50IHhcXG4iKQoraWYgICB4ICA9PSAgMSAgOlx4MjBceDIwCisgIHByaW50IHgKKworQ29tbWVudHMgbmVlZCB0byBnbyBpbiB0aGUgcmlnaHQgcGxhY2UuCisKKz4+PiByb3VuZHRyaXAoImlmIHggPT0gMTpcXG4iCisuLi4gICAgICAgICAgICIgICAgIyBBIGNvbW1lbnQgYnkgaXRzZWxmLlxcbiIKKy4uLiAgICAgICAgICAgIiAgICBwcmludCB4ICAjIENvbW1lbnQgaGVyZSwgdG9vLlxcbiIKKy4uLiAgICAgICAgICAgIiAgICAjIEFub3RoZXIgY29tbWVudC5cXG4iCisuLi4gICAgICAgICAgICJhZnRlcl9pZiA9IFRydWVcXG4iKQoraWYgeCA9PSAxOgorICAgICMgQSBjb21tZW50IGJ5IGl0c2VsZi4KKyAgICBwcmludCB4ICAjIENvbW1lbnQgaGVyZSwgdG9vLgorICAgICMgQW5vdGhlciBjb21tZW50LgorYWZ0ZXJfaWYgPSBUcnVlCisKKz4+PiByb3VuZHRyaXAoImlmICh4ICAjIFRoZSBjb21tZW50cyBuZWVkIHRvIGdvIGluIHRoZSByaWdodCBwbGFjZVxcbiIKKy4uLiAgICAgICAgICAgIiAgICA9PSAxKTpcXG4iCisuLi4gICAgICAgICAgICIgICAgcHJpbnQgJ3ggPT0gMSdcXG4iKQoraWYgKHggICMgVGhlIGNvbW1lbnRzIG5lZWQgdG8gZ28gaW4gdGhlIHJpZ2h0IHBsYWNlCisgICAgPT0gMSk6CisgICAgcHJpbnQgJ3ggPT0gMScKKworIiIiCisKK2ltcG9ydCBvcywgZ2xvYiwgcmFuZG9tLCB0aW1lLCBzeXMKIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgKHZlcmJvc2UsIGZpbmRmaWxlLCBpc19yZXNvdXJjZV9lbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RGYWlsZWQpCi1mcm9tIHRva2VuaXplIGltcG9ydCAodG9rZW5pemUsIGdlbmVyYXRlX3Rva2VucywgdW50b2tlbml6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBOVU1CRVIsIE5BTUUsIE9QLCBTVFJJTkcpCitmcm9tIHRva2VuaXplIGltcG9ydCAodG9rZW5pemUsIGdlbmVyYXRlX3Rva2VucywgdW50b2tlbml6ZSwgdG9rX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgRU5ETUFSS0VSLCBOVU1CRVIsIE5BTUUsIE9QLCBTVFJJTkcsIENPTU1FTlQpCisKKyMgSG93IG11Y2ggdGltZSBpbiBzZWNvbmRzIGNhbiBwYXNzIGJlZm9yZSB3ZSBwcmludCBhICdTdGlsbCB3b3JraW5nJyBtZXNzYWdlLgorX1BSSU5UX1dPUktJTkdfTVNHX0lOVEVSVkFMID0gNSAqIDYwCiAKICMgVGVzdCByb3VuZHRyaXAgZm9yIGB1bnRva2VuaXplYC4gIGBmYCBpcyBhIGZpbGUgcGF0aC4gIFRoZSBzb3VyY2UgY29kZSBpbiBmCiAjIGlzIHRva2VuaXplZCwgY29udmVydGVkIGJhY2sgdG8gc291cmNlIGNvZGUgdmlhIHRva2VuaXplLnVudG9rZW5pemUoKSwKQEAgLTI0LDYgKzEwOCwyMyBAQAogICAgIGlmIHQxICE9IHQyOgogICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJ1bnRva2VuaXplKCkgcm91bmR0cmlwIGZhaWxlZCBmb3IgJXIiICUgZikKIAorZGVmIGR1bXBfdG9rZW5zKHMpOgorICAgICIiIlByaW50IG91dCB0aGUgdG9rZW5zIGluIHMgaW4gYSB0YWJsZSBmb3JtYXQuCisKKyAgICBUaGUgRU5ETUFSS0VSIGlzIG9taXR0ZWQuCisgICAgIiIiCisgICAgZiA9IFN0cmluZ0lPKHMpCisgICAgZm9yIHR5cGUsIHRva2VuLCBzdGFydCwgZW5kLCBsaW5lIGluIGdlbmVyYXRlX3Rva2VucyhmLnJlYWRsaW5lKToKKyAgICAgICAgaWYgdHlwZSA9PSBFTkRNQVJLRVI6CisgICAgICAgICAgICBicmVhaworICAgICAgICB0eXBlID0gdG9rX25hbWVbdHlwZV0KKyAgICAgICAgcHJpbnQgIiUodHlwZSktMTAuMTBzICAlKHRva2VuKS0xMy4xM3IgJShzdGFydClzICUoZW5kKXMiICUgbG9jYWxzKCkKKworZGVmIHJvdW5kdHJpcChzKToKKyAgICBmID0gU3RyaW5nSU8ocykKKyAgICBzb3VyY2UgPSB1bnRva2VuaXplKGdlbmVyYXRlX3Rva2VucyhmLnJlYWRsaW5lKSkKKyAgICBwcmludCBzb3VyY2UsCisKICMgVGhpcyBpcyBhbiBleGFtcGxlIGZyb20gdGhlIGRvY3MsIHNldCB1cCBhcyBhIGRvY3Rlc3QuCiBkZWYgZGVjaXN0bXQocyk6CiAgICAgIiIiU3Vic3RpdHV0ZSBEZWNpbWFscyBmb3IgZmxvYXRzIGluIGEgc3RyaW5nIG9mIHN0YXRlbWVudHMuCkBAIC02Niw2ICsxNjcsOCBAQAogICAgIGlmIHZlcmJvc2U6CiAgICAgICAgIHByaW50ICdzdGFydGluZy4uLicKIAorICAgIG5leHRfdGltZSA9IHRpbWUudGltZSgpICsgX1BSSU5UX1dPUktJTkdfTVNHX0lOVEVSVkFMCisKICAgICAjIFRoaXMgZGlzcGxheXMgdGhlIHRva2VuaXphdGlvbiBvZiB0b2tlbml6ZV90ZXN0cy5weSB0byBzdGRvdXQsIGFuZAogICAgICMgcmVncnRlc3QucHkgY2hlY2tzIHRoYXQgdGhpcyBlcXVhbHMgdGhlIGV4cGVjdGVkIG91dHB1dCAoaW4gdGhlCiAgICAgIyB0ZXN0L291dHB1dC8gZGlyZWN0b3J5KS4KQEAgLTg1LDYgKzE4OCwxMiBAQAogICAgICAgICB0ZXN0ZmlsZXMgPSByYW5kb20uc2FtcGxlKHRlc3RmaWxlcywgMTApCiAKICAgICBmb3IgZiBpbiB0ZXN0ZmlsZXM6CisgICAgICAgICMgUHJpbnQgc3RpbGwgd29ya2luZyBtZXNzYWdlIHNpbmNlIHRoaXMgdGVzdCBjYW4gYmUgcmVhbGx5IHNsb3cKKyAgICAgICAgaWYgbmV4dF90aW1lIDw9IHRpbWUudGltZSgpOgorICAgICAgICAgICAgbmV4dF90aW1lID0gdGltZS50aW1lKCkgKyBfUFJJTlRfV09SS0lOR19NU0dfSU5URVJWQUwKKyAgICAgICAgICAgIHByaW50ID4+c3lzLl9fc3Rkb3V0X18sICcgIHRlc3RfbWFpbiBzdGlsbCB3b3JraW5nLCBiZSBwYXRpZW50Li4uJworICAgICAgICAgICAgc3lzLl9fc3Rkb3V0X18uZmx1c2goKQorCiAgICAgICAgIHRlc3Rfcm91bmR0cmlwKGYpCiAKICAgICAjIFRlc3QgZGV0ZWN0b24gb2YgSW5kZW50YXRpb25FcnJvci4KQEAgLTEwNSw3ICsyMTQsNyBAQAogICAgICMgUnVuIHRoZSBkb2N0ZXN0cyBpbiB0aGlzIG1vZHVsZS4KICAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfdG9rZW5pemUgICMgaS5lLiwgdGhpcyBtb2R1bGUKICAgICBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fZG9jdGVzdAotICAgIHJ1bl9kb2N0ZXN0KHRlc3RfdG9rZW5pemUpCisgICAgcnVuX2RvY3Rlc3QodGVzdF90b2tlbml6ZSwgdmVyYm9zZSkKIAogICAgIGlmIHZlcmJvc2U6CiAgICAgICAgIHByaW50ICdmaW5pc2hlZCcKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5IGIvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKaW5kZXggOWJhMWRjYS4uNDhjNWQxOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKQEAgLTEyMiw2ICsxMjIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWC5fX25hbWVfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3ZhbHVlKSkKIAorICAgIGRlZiB0ZXN0X3dpdGhvdXRfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBlcnIgPSB0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLCBbJ05vbmVcbiddKQorCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICBydW5fdW5pdHRlc3QoVHJhY2ViYWNrQ2FzZXMpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3R5cGVzLnB5IGIvTGliL3Rlc3QvdGVzdF90eXBlcy5weQppbmRleCBmMGJkZmRlLi44ZDI2OTE0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3R5cGVzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdHlwZXMucHkKQEAgLTEsMjg1ICsxLDI3MSBAQAogIyBQeXRob24gdGVzdCBzZXQgLS0gcGFydCA2LCBidWlsdC1pbiB0eXBlcwogCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCAqCi0KLXByaW50ICc2LiBCdWlsdC1pbiB0eXBlcycKLQotcHJpbnQgJzYuMSBUcnV0aCB2YWx1ZSB0ZXN0aW5nJwotaWYgTm9uZTogcmFpc2UgVGVzdEZhaWxlZCwgJ05vbmUgaXMgdHJ1ZSBpbnN0ZWFkIG9mIGZhbHNlJwotaWYgMDogcmFpc2UgVGVzdEZhaWxlZCwgJzAgaXMgdHJ1ZSBpbnN0ZWFkIG9mIGZhbHNlJwotaWYgMEw6IHJhaXNlIFRlc3RGYWlsZWQsICcwTCBpcyB0cnVlIGluc3RlYWQgb2YgZmFsc2UnCi1pZiAwLjA6IHJhaXNlIFRlc3RGYWlsZWQsICcwLjAgaXMgdHJ1ZSBpbnN0ZWFkIG9mIGZhbHNlJwotaWYgJyc6IHJhaXNlIFRlc3RGYWlsZWQsICdcJ1wnIGlzIHRydWUgaW5zdGVhZCBvZiBmYWxzZScKLWlmIG5vdCAxOiByYWlzZSBUZXN0RmFpbGVkLCAnMSBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnCi1pZiBub3QgMUw6IHJhaXNlIFRlc3RGYWlsZWQsICcxTCBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnCi1pZiBub3QgMS4wOiByYWlzZSBUZXN0RmFpbGVkLCAnMS4wIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScKLWlmIG5vdCAneCc6IHJhaXNlIFRlc3RGYWlsZWQsICdcJ3hcJyBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnCi1pZiBub3Qgeyd4JzogMX06IHJhaXNlIFRlc3RGYWlsZWQsICd7XCd4XCc6IDF9IGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScKLWRlZiBmKCk6IHBhc3MKLWNsYXNzIEM6IHBhc3MKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgaGF2ZV91bmljb2RlCitpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBzeXMKLXggPSBDKCkKLWlmIG5vdCBmOiByYWlzZSBUZXN0RmFpbGVkLCAnZiBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnCi1pZiBub3QgQzogcmFpc2UgVGVzdEZhaWxlZCwgJ0MgaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJwotaWYgbm90IHN5czogcmFpc2UgVGVzdEZhaWxlZCwgJ3N5cyBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnCi1pZiBub3QgeDogcmFpc2UgVGVzdEZhaWxlZCwgJ3ggaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJwogCi1wcmludCAnNi4yIEJvb2xlYW4gb3BlcmF0aW9ucycKLWlmIDAgb3IgMDogcmFpc2UgVGVzdEZhaWxlZCwgJzAgb3IgMCBpcyB0cnVlIGluc3RlYWQgb2YgZmFsc2UnCi1pZiAxIGFuZCAxOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAnMSBhbmQgMSBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnCi1pZiBub3QgMTogcmFpc2UgVGVzdEZhaWxlZCwgJ25vdCAxIGlzIHRydWUgaW5zdGVhZCBvZiBmYWxzZScKK2NsYXNzIFR5cGVzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCi1wcmludCAnNi4zIENvbXBhcmlzb25zJwotaWYgMCA8IDEgPD0gMSA9PSAxID49IDEgPiAwICE9IDE6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICdpbnQgY29tcGFyaXNvbnMgZmFpbGVkJwotaWYgMEwgPCAxTCA8PSAxTCA9PSAxTCA+PSAxTCA+IDBMICE9IDFMOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAnbG9uZyBpbnQgY29tcGFyaXNvbnMgZmFpbGVkJwotaWYgMC4wIDwgMS4wIDw9IDEuMCA9PSAxLjAgPj0gMS4wID4gMC4wICE9IDEuMDogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgJ2Zsb2F0IGNvbXBhcmlzb25zIGZhaWxlZCcKLWlmICcnIDwgJ2EnIDw9ICdhJyA9PSAnYScgPCAnYWJjJyA8ICdhYmQnIDwgJ2InOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAnc3RyaW5nIGNvbXBhcmlzb25zIGZhaWxlZCcKLWlmIE5vbmUgaXMgTm9uZTogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgJ2lkZW50aXR5IHRlc3QgZmFpbGVkJworICAgIGRlZiB0ZXN0X3RydXRoX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgaWYgTm9uZTogc2VsZi5mYWlsKCdOb25lIGlzIHRydWUgaW5zdGVhZCBvZiBmYWxzZScpCisgICAgICAgIGlmIDA6IHNlbGYuZmFpbCgnMCBpcyB0cnVlIGluc3RlYWQgb2YgZmFsc2UnKQorICAgICAgICBpZiAwTDogc2VsZi5mYWlsKCcwTCBpcyB0cnVlIGluc3RlYWQgb2YgZmFsc2UnKQorICAgICAgICBpZiAwLjA6IHNlbGYuZmFpbCgnMC4wIGlzIHRydWUgaW5zdGVhZCBvZiBmYWxzZScpCisgICAgICAgIGlmICcnOiBzZWxmLmZhaWwoJ1wnXCcgaXMgdHJ1ZSBpbnN0ZWFkIG9mIGZhbHNlJykKKyAgICAgICAgaWYgbm90IDE6IHNlbGYuZmFpbCgnMSBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnKQorICAgICAgICBpZiBub3QgMUw6IHNlbGYuZmFpbCgnMUwgaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJykKKyAgICAgICAgaWYgbm90IDEuMDogc2VsZi5mYWlsKCcxLjAgaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJykKKyAgICAgICAgaWYgbm90ICd4Jzogc2VsZi5mYWlsKCdcJ3hcJyBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnKQorICAgICAgICBpZiBub3Qgeyd4JzogMX06IHNlbGYuZmFpbCgne1wneFwnOiAxfSBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnKQorICAgICAgICBkZWYgZigpOiBwYXNzCisgICAgICAgIGNsYXNzIEM6IHBhc3MKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICB4ID0gQygpCisgICAgICAgIGlmIG5vdCBmOiBzZWxmLmZhaWwoJ2YgaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJykKKyAgICAgICAgaWYgbm90IEM6IHNlbGYuZmFpbCgnQyBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnKQorICAgICAgICBpZiBub3Qgc3lzOiBzZWxmLmZhaWwoJ3N5cyBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnKQorICAgICAgICBpZiBub3QgeDogc2VsZi5mYWlsKCd4IGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScpCiAKLXRyeTogZmxvYXQoJycpCi1leGNlcHQgVmFsdWVFcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgImZsb2F0KCcnKSBkaWRuJ3QgcmFpc2UgVmFsdWVFcnJvciIKKyAgICBkZWYgdGVzdF9ib29sZWFuX29wcyhzZWxmKToKKyAgICAgICAgaWYgMCBvciAwOiBzZWxmLmZhaWwoJzAgb3IgMCBpcyB0cnVlIGluc3RlYWQgb2YgZmFsc2UnKQorICAgICAgICBpZiAxIGFuZCAxOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnMSBhbmQgMSBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnKQorICAgICAgICBpZiBub3QgMTogc2VsZi5mYWlsKCdub3QgMSBpcyB0cnVlIGluc3RlYWQgb2YgZmFsc2UnKQogCi10cnk6IGZsb2F0KCc1XDAnKQotZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICJmbG9hdCgnNVwwJykgZGlkbid0IHJhaXNlIFZhbHVlRXJyb3IiCisgICAgZGVmIHRlc3RfY29tcGFyaXNvbnMoc2VsZik6CisgICAgICAgIGlmIDAgPCAxIDw9IDEgPT0gMSA+PSAxID4gMCAhPSAxOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnaW50IGNvbXBhcmlzb25zIGZhaWxlZCcpCisgICAgICAgIGlmIDBMIDwgMUwgPD0gMUwgPT0gMUwgPj0gMUwgPiAwTCAhPSAxTDogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2xvbmcgaW50IGNvbXBhcmlzb25zIGZhaWxlZCcpCisgICAgICAgIGlmIDAuMCA8IDEuMCA8PSAxLjAgPT0gMS4wID49IDEuMCA+IDAuMCAhPSAxLjA6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCdmbG9hdCBjb21wYXJpc29ucyBmYWlsZWQnKQorICAgICAgICBpZiAnJyA8ICdhJyA8PSAnYScgPT0gJ2EnIDwgJ2FiYycgPCAnYWJkJyA8ICdiJzogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ3N0cmluZyBjb21wYXJpc29ucyBmYWlsZWQnKQorICAgICAgICBpZiBOb25lIGlzIE5vbmU6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCdpZGVudGl0eSB0ZXN0IGZhaWxlZCcpCiAKLXRyeTogNS4wIC8gMC4wCi1leGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICI1LjAgLyAwLjAgZGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIgorICAgIGRlZiB0ZXN0X2Zsb2F0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAnNVwwJykKIAotdHJ5OiA1LjAgLy8gMC4wCi1leGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICI1LjAgLy8gMC4wIGRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIKKyAgICBkZWYgdGVzdF96ZXJvX2RpdmlzaW9uKHNlbGYpOgorICAgICAgICB0cnk6IDUuMCAvIDAuMAorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCI1LjAgLyAwLjAgZGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIikKIAotdHJ5OiA1LjAgJSAwLjAKLWV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgIjUuMCAlIDAuMCBkaWRuJ3QgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IiCisgICAgICAgIHRyeTogNS4wIC8vIDAuMAorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCI1LjAgLy8gMC4wIGRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIpCiAKLXRyeTogNSAvIDBMCi1leGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICI1IC8gMEwgZGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIgorICAgICAgICB0cnk6IDUuMCAlIDAuMAorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCI1LjAgJSAwLjAgZGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIikKIAotdHJ5OiA1IC8vIDBMCi1leGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICI1IC8vIDBMIGRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIKKyAgICAgICAgdHJ5OiA1IC8gMEwKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiNSAvIDBMIGRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIpCiAKLXRyeTogNSAlIDBMCi1leGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICI1ICUgMEwgZGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIgorICAgICAgICB0cnk6IDUgLy8gMEwKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiNSAvLyAwTCBkaWRuJ3QgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IiKQogCi1wcmludCAnNi40IE51bWVyaWMgdHlwZXMgKG1vc3RseSBjb252ZXJzaW9ucyknCi1pZiAwICE9IDBMIG9yIDAgIT0gMC4wIG9yIDBMICE9IDAuMDogcmFpc2UgVGVzdEZhaWxlZCwgJ21peGVkIGNvbXBhcmlzb25zJwotaWYgMSAhPSAxTCBvciAxICE9IDEuMCBvciAxTCAhPSAxLjA6IHJhaXNlIFRlc3RGYWlsZWQsICdtaXhlZCBjb21wYXJpc29ucycKLWlmIC0xICE9IC0xTCBvciAtMSAhPSAtMS4wIG9yIC0xTCAhPSAtMS4wOgotICAgIHJhaXNlIFRlc3RGYWlsZWQsICdpbnQvbG9uZy9mbG9hdCB2YWx1ZSBub3QgZXF1YWwnCi0jIGNhbGxpbmcgYnVpbHQtaW4gdHlwZXMgd2l0aG91dCBhcmd1bWVudCBtdXN0IHJldHVybiAwCi1pZiBpbnQoKSAhPSAwOiByYWlzZSBUZXN0RmFpbGVkLCAnaW50KCkgZG9lcyBub3QgcmV0dXJuIDAnCi1pZiBsb25nKCkgIT0gMEw6IHJhaXNlIFRlc3RGYWlsZWQsICdsb25nKCkgZG9lcyBub3QgcmV0dXJuIDBMJwotaWYgZmxvYXQoKSAhPSAwLjA6IHJhaXNlIFRlc3RGYWlsZWQsICdmbG9hdCgpIGRvZXMgbm90IHJldHVybiAwLjAnCi1pZiBpbnQoMS45KSA9PSAxID09IGludCgxLjEpIGFuZCBpbnQoLTEuMSkgPT0gLTEgPT0gaW50KC0xLjkpOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAnaW50KCkgZG9lcyBub3Qgcm91bmQgcHJvcGVybHknCi1pZiBsb25nKDEuOSkgPT0gMUwgPT0gbG9uZygxLjEpIGFuZCBsb25nKC0xLjEpID09IC0xTCA9PSBsb25nKC0xLjkpOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAnbG9uZygpIGRvZXMgbm90IHJvdW5kIHByb3Blcmx5JwotaWYgZmxvYXQoMSkgPT0gMS4wIGFuZCBmbG9hdCgtMSkgPT0gLTEuMCBhbmQgZmxvYXQoMCkgPT0gMC4wOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAnZmxvYXQoKSBkb2VzIG5vdCB3b3JrIHByb3Blcmx5JwotcHJpbnQgJzYuNC4xIDMyLWJpdCBpbnRlZ2VycycKLSMgRW5zdXJlIHRoZSBmaXJzdCAyNTYgaW50ZWdlcnMgYXJlIHNoYXJlZAotYSA9IDI1NgotYiA9IDEyOCoyCi1pZiBhIGlzIG5vdCBiOiByYWlzZSBUZXN0RmFpbGVkLCAnMjU2IGlzIG5vdCBzaGFyZWQnCi1pZiAxMiArIDI0ICE9IDM2OiByYWlzZSBUZXN0RmFpbGVkLCAnaW50IG9wJwotaWYgMTIgKyAoLTI0KSAhPSAtMTI6IHJhaXNlIFRlc3RGYWlsZWQsICdpbnQgb3AnCi1pZiAoLTEyKSArIDI0ICE9IDEyOiByYWlzZSBUZXN0RmFpbGVkLCAnaW50IG9wJwotaWYgKC0xMikgKyAoLTI0KSAhPSAtMzY6IHJhaXNlIFRlc3RGYWlsZWQsICdpbnQgb3AnCi1pZiBub3QgMTIgPCAyNDogcmFpc2UgVGVzdEZhaWxlZCwgJ2ludCBvcCcKLWlmIG5vdCAtMjQgPCAtMTI6IHJhaXNlIFRlc3RGYWlsZWQsICdpbnQgb3AnCi0jIFRlc3QgZm9yIGEgcGFydGljdWxhciBidWcgaW4gaW50ZWdlciBtdWx0aXBseQoteHNpemUsIHlzaXplLCB6c2l6ZSA9IDIzOCwgMzU2LCA0Ci1pZiBub3QgKHhzaXplKnlzaXplKnpzaXplID09IHpzaXplKnhzaXplKnlzaXplID09IDMzODkxMik6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZCwgJ2ludCBtdWwgY29tbXV0YXRpdml0eScKLSMgQW5kIGFub3RoZXIuCi1tID0gLXN5cy5tYXhpbnQgLSAxCi1mb3IgZGl2aXNvciBpbiAxLCAyLCA0LCA4LCAxNiwgMzI6Ci0gICAgaiA9IG0gLy8gZGl2aXNvcgotICAgIHByb2QgPSBkaXZpc29yICogagotICAgIGlmIHByb2QgIT0gbToKLSAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgIiVyICogJXIgPT0gJXIgIT0gJXIiICUgKGRpdmlzb3IsIGosIHByb2QsIG0pCi0gICAgaWYgdHlwZShwcm9kKSBpcyBub3QgaW50OgotICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAoImV4cGVjdGVkIHR5cGUocHJvZCkgdG8gYmUgaW50LCBub3QgJXIiICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUocHJvZCkpCi0jIENoZWNrIGZvciBleHBlY3RlZCAqIG92ZXJmbG93IHRvIGxvbmcuCi1mb3IgZGl2aXNvciBpbiAxLCAyLCA0LCA4LCAxNiwgMzI6Ci0gICAgaiA9IG0gLy8gZGl2aXNvciAtIDEKLSAgICBwcm9kID0gZGl2aXNvciAqIGoKLSAgICBpZiB0eXBlKHByb2QpIGlzIG5vdCBsb25nOgotICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAoImV4cGVjdGVkIHR5cGUoJXIpIHRvIGJlIGxvbmcsIG5vdCAlciIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2QsIHR5cGUocHJvZCkpKQotIyBDaGVjayBmb3IgZXhwZWN0ZWQgKiBvdmVyZmxvdyB0byBsb25nLgotbSA9IHN5cy5tYXhpbnQKLWZvciBkaXZpc29yIGluIDEsIDIsIDQsIDgsIDE2LCAzMjoKLSAgICBqID0gbSAvLyBkaXZpc29yICsgMQotICAgIHByb2QgPSBkaXZpc29yICogagotICAgIGlmIHR5cGUocHJvZCkgaXMgbm90IGxvbmc6Ci0gICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsICgiZXhwZWN0ZWQgdHlwZSglcikgdG8gYmUgbG9uZywgbm90ICVyIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZCwgdHlwZShwcm9kKSkpCisgICAgICAgIHRyeTogNSAlIDBMCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoIjUgJSAwTCBkaWRuJ3QgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IiKQogCi1wcmludCAnNi40LjIgTG9uZyBpbnRlZ2VycycKLWlmIDEyTCArIDI0TCAhPSAzNkw6IHJhaXNlIFRlc3RGYWlsZWQsICdsb25nIG9wJwotaWYgMTJMICsgKC0yNEwpICE9IC0xMkw6IHJhaXNlIFRlc3RGYWlsZWQsICdsb25nIG9wJwotaWYgKC0xMkwpICsgMjRMICE9IDEyTDogcmFpc2UgVGVzdEZhaWxlZCwgJ2xvbmcgb3AnCi1pZiAoLTEyTCkgKyAoLTI0TCkgIT0gLTM2TDogcmFpc2UgVGVzdEZhaWxlZCwgJ2xvbmcgb3AnCi1pZiBub3QgMTJMIDwgMjRMOiByYWlzZSBUZXN0RmFpbGVkLCAnbG9uZyBvcCcKLWlmIG5vdCAtMjRMIDwgLTEyTDogcmFpc2UgVGVzdEZhaWxlZCwgJ2xvbmcgb3AnCi14ID0gc3lzLm1heGludAotaWYgaW50KGxvbmcoeCkpICE9IHg6IHJhaXNlIFRlc3RGYWlsZWQsICdsb25nIG9wJwotdHJ5OiB5ID0gaW50KGxvbmcoeCkrMUwpCi1leGNlcHQgT3ZlcmZsb3dFcnJvcjogcmFpc2UgVGVzdEZhaWxlZCwgJ2xvbmcgb3AnCi1pZiBub3QgaXNpbnN0YW5jZSh5LCBsb25nKTogcmFpc2UgVGVzdEZhaWxlZCwgJ2xvbmcgb3AnCi14ID0gLXgKLWlmIGludChsb25nKHgpKSAhPSB4OiByYWlzZSBUZXN0RmFpbGVkLCAnbG9uZyBvcCcKLXggPSB4LTEKLWlmIGludChsb25nKHgpKSAhPSB4OiByYWlzZSBUZXN0RmFpbGVkLCAnbG9uZyBvcCcKLXRyeTogeSA9IGludChsb25nKHgpLTFMKQotZXhjZXB0IE92ZXJmbG93RXJyb3I6IHJhaXNlIFRlc3RGYWlsZWQsICdsb25nIG9wJwotaWYgbm90IGlzaW5zdGFuY2UoeSwgbG9uZyk6IHJhaXNlIFRlc3RGYWlsZWQsICdsb25nIG9wJworICAgIGRlZiB0ZXN0X251bWVyaWNfdHlwZXMoc2VsZik6CisgICAgICAgIGlmIDAgIT0gMEwgb3IgMCAhPSAwLjAgb3IgMEwgIT0gMC4wOiBzZWxmLmZhaWwoJ21peGVkIGNvbXBhcmlzb25zJykKKyAgICAgICAgaWYgMSAhPSAxTCBvciAxICE9IDEuMCBvciAxTCAhPSAxLjA6IHNlbGYuZmFpbCgnbWl4ZWQgY29tcGFyaXNvbnMnKQorICAgICAgICBpZiAtMSAhPSAtMUwgb3IgLTEgIT0gLTEuMCBvciAtMUwgIT0gLTEuMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnaW50L2xvbmcvZmxvYXQgdmFsdWUgbm90IGVxdWFsJykKKyAgICAgICAgIyBjYWxsaW5nIGJ1aWx0LWluIHR5cGVzIHdpdGhvdXQgYXJndW1lbnQgbXVzdCByZXR1cm4gMAorICAgICAgICBpZiBpbnQoKSAhPSAwOiBzZWxmLmZhaWwoJ2ludCgpIGRvZXMgbm90IHJldHVybiAwJykKKyAgICAgICAgaWYgbG9uZygpICE9IDBMOiBzZWxmLmZhaWwoJ2xvbmcoKSBkb2VzIG5vdCByZXR1cm4gMEwnKQorICAgICAgICBpZiBmbG9hdCgpICE9IDAuMDogc2VsZi5mYWlsKCdmbG9hdCgpIGRvZXMgbm90IHJldHVybiAwLjAnKQorICAgICAgICBpZiBpbnQoMS45KSA9PSAxID09IGludCgxLjEpIGFuZCBpbnQoLTEuMSkgPT0gLTEgPT0gaW50KC0xLjkpOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnaW50KCkgZG9lcyBub3Qgcm91bmQgcHJvcGVybHknKQorICAgICAgICBpZiBsb25nKDEuOSkgPT0gMUwgPT0gbG9uZygxLjEpIGFuZCBsb25nKC0xLjEpID09IC0xTCA9PSBsb25nKC0xLjkpOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnbG9uZygpIGRvZXMgbm90IHJvdW5kIHByb3Blcmx5JykKKyAgICAgICAgaWYgZmxvYXQoMSkgPT0gMS4wIGFuZCBmbG9hdCgtMSkgPT0gLTEuMCBhbmQgZmxvYXQoMCkgPT0gMC4wOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnZmxvYXQoKSBkb2VzIG5vdCB3b3JrIHByb3Blcmx5JykKIAotdHJ5OiA1IDw8IC01Ci1leGNlcHQgVmFsdWVFcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgJ2ludCBuZWdhdGl2ZSBzaGlmdCA8PCcKKyAgICBkZWYgdGVzdF9ub3JtYWxfaW50ZWdlcnMoc2VsZik6CisgICAgICAgICMgRW5zdXJlIHRoZSBmaXJzdCAyNTYgaW50ZWdlcnMgYXJlIHNoYXJlZAorICAgICAgICBhID0gMjU2CisgICAgICAgIGIgPSAxMjgqMgorICAgICAgICBpZiBhIGlzIG5vdCBiOiBzZWxmLmZhaWwoJzI1NiBpcyBub3Qgc2hhcmVkJykKKyAgICAgICAgaWYgMTIgKyAyNCAhPSAzNjogc2VsZi5mYWlsKCdpbnQgb3AnKQorICAgICAgICBpZiAxMiArICgtMjQpICE9IC0xMjogc2VsZi5mYWlsKCdpbnQgb3AnKQorICAgICAgICBpZiAoLTEyKSArIDI0ICE9IDEyOiBzZWxmLmZhaWwoJ2ludCBvcCcpCisgICAgICAgIGlmICgtMTIpICsgKC0yNCkgIT0gLTM2OiBzZWxmLmZhaWwoJ2ludCBvcCcpCisgICAgICAgIGlmIG5vdCAxMiA8IDI0OiBzZWxmLmZhaWwoJ2ludCBvcCcpCisgICAgICAgIGlmIG5vdCAtMjQgPCAtMTI6IHNlbGYuZmFpbCgnaW50IG9wJykKKyAgICAgICAgIyBUZXN0IGZvciBhIHBhcnRpY3VsYXIgYnVnIGluIGludGVnZXIgbXVsdGlwbHkKKyAgICAgICAgeHNpemUsIHlzaXplLCB6c2l6ZSA9IDIzOCwgMzU2LCA0CisgICAgICAgIGlmIG5vdCAoeHNpemUqeXNpemUqenNpemUgPT0genNpemUqeHNpemUqeXNpemUgPT0gMzM4OTEyKToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnaW50IG11bCBjb21tdXRhdGl2aXR5JykKKyAgICAgICAgIyBBbmQgYW5vdGhlci4KKyAgICAgICAgbSA9IC1zeXMubWF4aW50IC0gMQorICAgICAgICBmb3IgZGl2aXNvciBpbiAxLCAyLCA0LCA4LCAxNiwgMzI6CisgICAgICAgICAgICBqID0gbSAvLyBkaXZpc29yCisgICAgICAgICAgICBwcm9kID0gZGl2aXNvciAqIGoKKyAgICAgICAgICAgIGlmIHByb2QgIT0gbToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVyICogJXIgPT0gJXIgIT0gJXIiICUgKGRpdmlzb3IsIGosIHByb2QsIG0pKQorICAgICAgICAgICAgaWYgdHlwZShwcm9kKSBpcyBub3QgaW50OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgdHlwZShwcm9kKSB0byBiZSBpbnQsIG5vdCAlciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKHByb2QpKQorICAgICAgICAjIENoZWNrIGZvciBleHBlY3RlZCAqIG92ZXJmbG93IHRvIGxvbmcuCisgICAgICAgIGZvciBkaXZpc29yIGluIDEsIDIsIDQsIDgsIDE2LCAzMjoKKyAgICAgICAgICAgIGogPSBtIC8vIGRpdmlzb3IgLSAxCisgICAgICAgICAgICBwcm9kID0gZGl2aXNvciAqIGoKKyAgICAgICAgICAgIGlmIHR5cGUocHJvZCkgaXMgbm90IGxvbmc6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCB0eXBlKCVyKSB0byBiZSBsb25nLCBub3QgJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2QsIHR5cGUocHJvZCkpKQorICAgICAgICAjIENoZWNrIGZvciBleHBlY3RlZCAqIG92ZXJmbG93IHRvIGxvbmcuCisgICAgICAgIG0gPSBzeXMubWF4aW50CisgICAgICAgIGZvciBkaXZpc29yIGluIDEsIDIsIDQsIDgsIDE2LCAzMjoKKyAgICAgICAgICAgIGogPSBtIC8vIGRpdmlzb3IgKyAxCisgICAgICAgICAgICBwcm9kID0gZGl2aXNvciAqIGoKKyAgICAgICAgICAgIGlmIHR5cGUocHJvZCkgaXMgbm90IGxvbmc6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCB0eXBlKCVyKSB0byBiZSBsb25nLCBub3QgJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2QsIHR5cGUocHJvZCkpKQogCi10cnk6IDVMIDw8IC01TAotZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICdsb25nIG5lZ2F0aXZlIHNoaWZ0IDw8JworICAgIGRlZiB0ZXN0X2xvbmdfaW50ZWdlcnMoc2VsZik6CisgICAgICAgIGlmIDEyTCArIDI0TCAhPSAzNkw6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIGlmIDEyTCArICgtMjRMKSAhPSAtMTJMOiBzZWxmLmZhaWwoJ2xvbmcgb3AnKQorICAgICAgICBpZiAoLTEyTCkgKyAyNEwgIT0gMTJMOiBzZWxmLmZhaWwoJ2xvbmcgb3AnKQorICAgICAgICBpZiAoLTEyTCkgKyAoLTI0TCkgIT0gLTM2TDogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgaWYgbm90IDEyTCA8IDI0TDogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgaWYgbm90IC0yNEwgPCAtMTJMOiBzZWxmLmZhaWwoJ2xvbmcgb3AnKQorICAgICAgICB4ID0gc3lzLm1heGludAorICAgICAgICBpZiBpbnQobG9uZyh4KSkgIT0geDogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgdHJ5OiB5ID0gaW50KGxvbmcoeCkrMUwpCisgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOiBzZWxmLmZhaWwoJ2xvbmcgb3AnKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh5LCBsb25nKTogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgeCA9IC14CisgICAgICAgIGlmIGludChsb25nKHgpKSAhPSB4OiBzZWxmLmZhaWwoJ2xvbmcgb3AnKQorICAgICAgICB4ID0geC0xCisgICAgICAgIGlmIGludChsb25nKHgpKSAhPSB4OiBzZWxmLmZhaWwoJ2xvbmcgb3AnKQorICAgICAgICB0cnk6IHkgPSBpbnQobG9uZyh4KS0xTCkKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHksIGxvbmcpOiBzZWxmLmZhaWwoJ2xvbmcgb3AnKQogCi10cnk6IDUgPj4gLTUKLWV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAnaW50IG5lZ2F0aXZlIHNoaWZ0ID4+JworICAgICAgICB0cnk6IDUgPDwgLTUKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCdpbnQgbmVnYXRpdmUgc2hpZnQgPDwnKQogCi10cnk6IDVMID4+IC01TAotZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICdsb25nIG5lZ2F0aXZlIHNoaWZ0ID4+JworICAgICAgICB0cnk6IDVMIDw8IC01TAorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2xvbmcgbmVnYXRpdmUgc2hpZnQgPDwnKQogCi1wcmludCAnNi40LjMgRmxvYXRpbmcgcG9pbnQgbnVtYmVycycKLWlmIDEyLjAgKyAyNC4wICE9IDM2LjA6IHJhaXNlIFRlc3RGYWlsZWQsICdmbG9hdCBvcCcKLWlmIDEyLjAgKyAoLTI0LjApICE9IC0xMi4wOiByYWlzZSBUZXN0RmFpbGVkLCAnZmxvYXQgb3AnCi1pZiAoLTEyLjApICsgMjQuMCAhPSAxMi4wOiByYWlzZSBUZXN0RmFpbGVkLCAnZmxvYXQgb3AnCi1pZiAoLTEyLjApICsgKC0yNC4wKSAhPSAtMzYuMDogcmFpc2UgVGVzdEZhaWxlZCwgJ2Zsb2F0IG9wJwotaWYgbm90IDEyLjAgPCAyNC4wOiByYWlzZSBUZXN0RmFpbGVkLCAnZmxvYXQgb3AnCi1pZiBub3QgLTI0LjAgPCAtMTIuMDogcmFpc2UgVGVzdEZhaWxlZCwgJ2Zsb2F0IG9wJworICAgICAgICB0cnk6IDUgPj4gLTUKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCdpbnQgbmVnYXRpdmUgc2hpZnQgPj4nKQogCi1wcmludCAnNi41IFNlcXVlbmNlIHR5cGVzJworICAgICAgICB0cnk6IDVMID4+IC01TAorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2xvbmcgbmVnYXRpdmUgc2hpZnQgPj4nKQogCi1wcmludCAnNi41LjEgU3RyaW5ncycKLWlmIGxlbignJykgIT0gMDogcmFpc2UgVGVzdEZhaWxlZCwgJ2xlbihcJ1wnKScKLWlmIGxlbignYScpICE9IDE6IHJhaXNlIFRlc3RGYWlsZWQsICdsZW4oXCdhXCcpJwotaWYgbGVuKCdhYmNkZWYnKSAhPSA2OiByYWlzZSBUZXN0RmFpbGVkLCAnbGVuKFwnYWJjZGVmXCcpJwotaWYgJ3h5eicgKyAnYWJjZGUnICE9ICd4eXphYmNkZSc6IHJhaXNlIFRlc3RGYWlsZWQsICdzdHJpbmcgY29uY2F0ZW5hdGlvbicKLWlmICd4eXonKjMgIT0gJ3h5enh5enh5eic6IHJhaXNlIFRlc3RGYWlsZWQsICdzdHJpbmcgcmVwZXRpdGlvbiAqMycKLWlmIDAqJ2FiY2RlJyAhPSAnJzogcmFpc2UgVGVzdEZhaWxlZCwgJ3N0cmluZyByZXBldGl0aW9uIDAqJwotaWYgbWluKCdhYmMnKSAhPSAnYScgb3IgbWF4KCdhYmMnKSAhPSAnYyc6IHJhaXNlIFRlc3RGYWlsZWQsICdtaW4vbWF4IHN0cmluZycKLWlmICdhJyBpbiAnYWJjJyBhbmQgJ2InIGluICdhYmMnIGFuZCAnYycgaW4gJ2FiYycgYW5kICdkJyBub3QgaW4gJ2FiYyc6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICdpbi9ub3QgaW4gc3RyaW5nJwoteCA9ICd4JyoxMDMKLWlmICclcyEnJXggIT0geCsnISc6IHJhaXNlIFRlc3RGYWlsZWQsICduYXN0eSBzdHJpbmcgZm9ybWF0dGluZyBidWcnCisgICAgZGVmIHRlc3RfZmxvYXRzKHNlbGYpOgorICAgICAgICBpZiAxMi4wICsgMjQuMCAhPSAzNi4wOiBzZWxmLmZhaWwoJ2Zsb2F0IG9wJykKKyAgICAgICAgaWYgMTIuMCArICgtMjQuMCkgIT0gLTEyLjA6IHNlbGYuZmFpbCgnZmxvYXQgb3AnKQorICAgICAgICBpZiAoLTEyLjApICsgMjQuMCAhPSAxMi4wOiBzZWxmLmZhaWwoJ2Zsb2F0IG9wJykKKyAgICAgICAgaWYgKC0xMi4wKSArICgtMjQuMCkgIT0gLTM2LjA6IHNlbGYuZmFpbCgnZmxvYXQgb3AnKQorICAgICAgICBpZiBub3QgMTIuMCA8IDI0LjA6IHNlbGYuZmFpbCgnZmxvYXQgb3AnKQorICAgICAgICBpZiBub3QgLTI0LjAgPCAtMTIuMDogc2VsZi5mYWlsKCdmbG9hdCBvcCcpCiAKLSNleHRlbmRlZCBzbGljZXMgZm9yIHN0cmluZ3MKLWEgPSAnMDEyMzQ1Njc4OScKLXZlcmVxKGFbOjpdLCBhKQotdmVyZXEoYVs6OjJdLCAnMDI0NjgnKQotdmVyZXEoYVsxOjoyXSwgJzEzNTc5JykKLXZlcmVxKGFbOjotMV0sJzk4NzY1NDMyMTAnKQotdmVyZXEoYVs6Oi0yXSwgJzk3NTMxJykKLXZlcmVxKGFbMzo6LTJdLCAnMzEnKQotdmVyZXEoYVstMTAwOjEwMDpdLCBhKQotdmVyZXEoYVsxMDA6LTEwMDotMV0sIGFbOjotMV0pCi12ZXJlcShhWy0xMDBMOjEwMEw6MkxdLCAnMDI0NjgnKQorICAgIGRlZiB0ZXN0X3N0cmluZ3Moc2VsZik6CisgICAgICAgIGlmIGxlbignJykgIT0gMDogc2VsZi5mYWlsKCdsZW4oXCdcJyknKQorICAgICAgICBpZiBsZW4oJ2EnKSAhPSAxOiBzZWxmLmZhaWwoJ2xlbihcJ2FcJyknKQorICAgICAgICBpZiBsZW4oJ2FiY2RlZicpICE9IDY6IHNlbGYuZmFpbCgnbGVuKFwnYWJjZGVmXCcpJykKKyAgICAgICAgaWYgJ3h5eicgKyAnYWJjZGUnICE9ICd4eXphYmNkZSc6IHNlbGYuZmFpbCgnc3RyaW5nIGNvbmNhdGVuYXRpb24nKQorICAgICAgICBpZiAneHl6JyozICE9ICd4eXp4eXp4eXonOiBzZWxmLmZhaWwoJ3N0cmluZyByZXBldGl0aW9uICozJykKKyAgICAgICAgaWYgMConYWJjZGUnICE9ICcnOiBzZWxmLmZhaWwoJ3N0cmluZyByZXBldGl0aW9uIDAqJykKKyAgICAgICAgaWYgbWluKCdhYmMnKSAhPSAnYScgb3IgbWF4KCdhYmMnKSAhPSAnYyc6IHNlbGYuZmFpbCgnbWluL21heCBzdHJpbmcnKQorICAgICAgICBpZiAnYScgaW4gJ2FiYycgYW5kICdiJyBpbiAnYWJjJyBhbmQgJ2MnIGluICdhYmMnIGFuZCAnZCcgbm90IGluICdhYmMnOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnaW4vbm90IGluIHN0cmluZycpCisgICAgICAgIHggPSAneCcqMTAzCisgICAgICAgIGlmICclcyEnJXggIT0geCsnISc6IHNlbGYuZmFpbCgnbmFzdHkgc3RyaW5nIGZvcm1hdHRpbmcgYnVnJykKIAotaWYgaGF2ZV91bmljb2RlOgotICAgIGEgPSB1bmljb2RlKCcwMTIzNDU2Nzg5JywgJ2FzY2lpJykKLSAgICB2ZXJlcShhWzo6XSwgYSkKLSAgICB2ZXJlcShhWzo6Ml0sIHVuaWNvZGUoJzAyNDY4JywgJ2FzY2lpJykpCi0gICAgdmVyZXEoYVsxOjoyXSwgdW5pY29kZSgnMTM1NzknLCAnYXNjaWknKSkKLSAgICB2ZXJlcShhWzo6LTFdLCB1bmljb2RlKCc5ODc2NTQzMjEwJywgJ2FzY2lpJykpCi0gICAgdmVyZXEoYVs6Oi0yXSwgdW5pY29kZSgnOTc1MzEnLCAnYXNjaWknKSkKLSAgICB2ZXJlcShhWzM6Oi0yXSwgdW5pY29kZSgnMzEnLCAnYXNjaWknKSkKLSAgICB2ZXJlcShhWy0xMDA6MTAwOl0sIGEpCi0gICAgdmVyZXEoYVsxMDA6LTEwMDotMV0sIGFbOjotMV0pCi0gICAgdmVyZXEoYVstMTAwTDoxMDBMOjJMXSwgdW5pY29kZSgnMDI0NjgnLCAnYXNjaWknKSkKKyAgICAgICAgI2V4dGVuZGVkIHNsaWNlcyBmb3Igc3RyaW5ncworICAgICAgICBhID0gJzAxMjM0NTY3ODknCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6Ol0sIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6OjJdLCAnMDI0NjgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMTo6Ml0sICcxMzU3OScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6Oi0xXSwnOTg3NjU0MzIxMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6Oi0yXSwgJzk3NTMxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzM6Oi0yXSwgJzMxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWy0xMDA6MTAwOl0sIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVsxMDA6LTEwMDotMV0sIGFbOjotMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVstMTAwTDoxMDBMOjJMXSwgJzAyNDY4JykKKworICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBhID0gdW5pY29kZSgnMDEyMzQ1Njc4OScsICdhc2NpaScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjpdLCBhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzo6Ml0sIHVuaWNvZGUoJzAyNDY4JywgJ2FzY2lpJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMTo6Ml0sIHVuaWNvZGUoJzEzNTc5JywgJ2FzY2lpJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjotMV0sIHVuaWNvZGUoJzk4NzY1NDMyMTAnLCAnYXNjaWknKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6Oi0yXSwgdW5pY29kZSgnOTc1MzEnLCAnYXNjaWknKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVszOjotMl0sIHVuaWNvZGUoJzMxJywgJ2FzY2lpJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTEwMDoxMDA6XSwgYSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVsxMDA6LTEwMDotMV0sIGFbOjotMV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTEwMEw6MTAwTDoyTF0sIHVuaWNvZGUoJzAyNDY4JywgJ2FzY2lpJykpCiAKIAotcHJpbnQgJzYuNS4yIFR1cGxlcyBbc2VlIHRlc3RfdHVwbGUucHldJworICAgIGRlZiB0ZXN0X3R5cGVfZnVuY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHlwZSwgMSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0eXBlLCAxLCAyLCAzLCA0KQogCi1wcmludCAnNi41LjMgTGlzdHMgW3NlZSB0ZXN0X2xpc3QucHldJworICAgIGRlZiB0ZXN0X2J1ZmZlcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmZlciwgJ2FzZGYnLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBidWZmZXIsIE5vbmUpCiAKLXByaW50ICc2LjYgTWFwcGluZ3MgPT0gRGljdGlvbmFyaWVzIFtzZWUgdGVzdF9kaWN0LnB5XScKKyAgICAgICAgYSA9IGJ1ZmZlcignYXNkZicpCisgICAgICAgIGhhc2goYSkKKyAgICAgICAgYiA9IGEgKiA1CisgICAgICAgIGlmIGEgPT0gYjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnYnVmZmVycyBzaG91bGQgbm90IGJlIGVxdWFsJykKKyAgICAgICAgaWYgc3RyKGIpICE9ICgnYXNkZicgKiA1KToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgncmVwZWF0ZWQgYnVmZmVyIGhhcyB3cm9uZyBjb250ZW50JykKKyAgICAgICAgaWYgc3RyKGEgKiAwKSAhPSAnJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgncmVwZWF0ZWQgYnVmZmVyIHplcm8gdGltZXMgaGFzIHdyb25nIGNvbnRlbnQnKQorICAgICAgICBpZiBzdHIoYSArIGJ1ZmZlcignZGVmJykpICE9ICdhc2RmZGVmJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnY29uY2F0ZW5hdGlvbiBvZiBidWZmZXJzIHlpZWxkcyB3cm9uZyBjb250ZW50JykKKyAgICAgICAgaWYgc3RyKGJ1ZmZlcihhKSkgIT0gJ2FzZGYnOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdjb21wb3NpbmcgYnVmZmVycyBmYWlsZWQnKQorICAgICAgICBpZiBzdHIoYnVmZmVyKGEsIDIpKSAhPSAnZGYnOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdzcGVjaWZ5aW5nIGJ1ZmZlciBvZmZzZXQgZmFpbGVkJykKKyAgICAgICAgaWYgc3RyKGJ1ZmZlcihhLCAwLCAyKSkgIT0gJ2FzJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnc3BlY2lmeWluZyBidWZmZXIgc2l6ZSBmYWlsZWQnKQorICAgICAgICBpZiBzdHIoYnVmZmVyKGEsIDEsIDIpKSAhPSAnc2QnOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdzcGVjaWZ5aW5nIGJ1ZmZlciBvZmZzZXQgYW5kIHNpemUgZmFpbGVkJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnVmZmVyLCBidWZmZXIoJ2FzZGYnLCAxKSwgLTEpCisgICAgICAgIGlmIHN0cihidWZmZXIoYnVmZmVyKCdhc2RmJywgMCwgMiksIDApKSAhPSAnYXMnOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdjb21wb3NpbmcgbGVuZ3RoLXNwZWNpZmllZCBidWZmZXIgZmFpbGVkJykKKyAgICAgICAgaWYgc3RyKGJ1ZmZlcihidWZmZXIoJ2FzZGYnLCAwLCAyKSwgMCwgNTAwMCkpICE9ICdhcyc6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2NvbXBvc2luZyBsZW5ndGgtc3BlY2lmaWVkIGJ1ZmZlciBmYWlsZWQnKQorICAgICAgICBpZiBzdHIoYnVmZmVyKGJ1ZmZlcignYXNkZicsIDAsIDIpLCAwLCAtMSkpICE9ICdhcyc6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2NvbXBvc2luZyBsZW5ndGgtc3BlY2lmaWVkIGJ1ZmZlciBmYWlsZWQnKQorICAgICAgICBpZiBzdHIoYnVmZmVyKGJ1ZmZlcignYXNkZicsIDAsIDIpLCAxLCAyKSkgIT0gJ3MnOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdjb21wb3NpbmcgbGVuZ3RoLXNwZWNpZmllZCBidWZmZXIgZmFpbGVkJykKIAorICAgICAgICB0cnk6IGFbMV0gPSAnZycKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoImJ1ZmZlciBhc3NpZ25tZW50IHNob3VsZCByYWlzZSBUeXBlRXJyb3IiKQogCi10cnk6IHR5cGUoMSwgMikKLWV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICd0eXBlKCksIHcvMiBhcmdzIGV4cGVjdGVkIFR5cGVFcnJvcicKKyAgICAgICAgdHJ5OiBhWzA6MV0gPSAnZycKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoImJ1ZmZlciBzbGljZSBhc3NpZ25tZW50IHNob3VsZCByYWlzZSBUeXBlRXJyb3IiKQogCi10cnk6IHR5cGUoMSwgMiwgMywgNCkKLWV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICd0eXBlKCksIHcvNCBhcmdzIGV4cGVjdGVkIFR5cGVFcnJvcicKKyAgICAgICAgIyBhcnJheS5hcnJheSgpIHJldHVybnMgYW4gb2JqZWN0IHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IGEgY2hhciBidWZmZXIsCisgICAgICAgICMgc29tZXRoaW5nIHdoaWNoIGludCgpIHVzZXMgZm9yIGNvbnZlcnNpb24uCisgICAgICAgIGltcG9ydCBhcnJheQorICAgICAgICB0cnk6IGludChidWZmZXIoYXJyYXkuYXJyYXkoJ2MnKSkpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCJjaGFyIGJ1ZmZlciAoYXQgQyBsZXZlbCkgbm90IHdvcmtpbmciKQogCi1wcmludCAnQnVmZmVycycKLXRyeTogYnVmZmVyKCdhc2RmJywgLTEpCi1leGNlcHQgVmFsdWVFcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgImJ1ZmZlcignYXNkZicsIC0xKSBzaG91bGQgcmFpc2UgVmFsdWVFcnJvciIKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVHlwZXNUZXN0cykKIAotdHJ5OiBidWZmZXIoTm9uZSkKLWV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICJidWZmZXIoTm9uZSkgc2hvdWxkIHJhaXNlIFR5cGVFcnJvciIKLQotYSA9IGJ1ZmZlcignYXNkZicpCi1oYXNoKGEpCi1iID0gYSAqIDUKLWlmIGEgPT0gYjoKLSAgICByYWlzZSBUZXN0RmFpbGVkLCAnYnVmZmVycyBzaG91bGQgbm90IGJlIGVxdWFsJwotaWYgc3RyKGIpICE9ICgnYXNkZicgKiA1KToKLSAgICByYWlzZSBUZXN0RmFpbGVkLCAncmVwZWF0ZWQgYnVmZmVyIGhhcyB3cm9uZyBjb250ZW50JwotaWYgc3RyKGEgKiAwKSAhPSAnJzoKLSAgICByYWlzZSBUZXN0RmFpbGVkLCAncmVwZWF0ZWQgYnVmZmVyIHplcm8gdGltZXMgaGFzIHdyb25nIGNvbnRlbnQnCi1pZiBzdHIoYSArIGJ1ZmZlcignZGVmJykpICE9ICdhc2RmZGVmJzoKLSAgICByYWlzZSBUZXN0RmFpbGVkLCAnY29uY2F0ZW5hdGlvbiBvZiBidWZmZXJzIHlpZWxkcyB3cm9uZyBjb250ZW50JwotaWYgc3RyKGJ1ZmZlcihhKSkgIT0gJ2FzZGYnOgotICAgIHJhaXNlIFRlc3RGYWlsZWQsICdjb21wb3NpbmcgYnVmZmVycyBmYWlsZWQnCi1pZiBzdHIoYnVmZmVyKGEsIDIpKSAhPSAnZGYnOgotICAgIHJhaXNlIFRlc3RGYWlsZWQsICdzcGVjaWZ5aW5nIGJ1ZmZlciBvZmZzZXQgZmFpbGVkJwotaWYgc3RyKGJ1ZmZlcihhLCAwLCAyKSkgIT0gJ2FzJzoKLSAgICByYWlzZSBUZXN0RmFpbGVkLCAnc3BlY2lmeWluZyBidWZmZXIgc2l6ZSBmYWlsZWQnCi1pZiBzdHIoYnVmZmVyKGEsIDEsIDIpKSAhPSAnc2QnOgotICAgIHJhaXNlIFRlc3RGYWlsZWQsICdzcGVjaWZ5aW5nIGJ1ZmZlciBvZmZzZXQgYW5kIHNpemUgZmFpbGVkJwotdHJ5OiBidWZmZXIoYnVmZmVyKCdhc2RmJywgMSksIC0xKQotZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICJidWZmZXIoYnVmZmVyKCdhc2RmJywgMSksIC0xKSBzaG91bGQgcmFpc2UgVmFsdWVFcnJvciIKLWlmIHN0cihidWZmZXIoYnVmZmVyKCdhc2RmJywgMCwgMiksIDApKSAhPSAnYXMnOgotICAgIHJhaXNlIFRlc3RGYWlsZWQsICdjb21wb3NpbmcgbGVuZ3RoLXNwZWNpZmllZCBidWZmZXIgZmFpbGVkJwotaWYgc3RyKGJ1ZmZlcihidWZmZXIoJ2FzZGYnLCAwLCAyKSwgMCwgNTAwMCkpICE9ICdhcyc6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZCwgJ2NvbXBvc2luZyBsZW5ndGgtc3BlY2lmaWVkIGJ1ZmZlciBmYWlsZWQnCi1pZiBzdHIoYnVmZmVyKGJ1ZmZlcignYXNkZicsIDAsIDIpLCAwLCAtMSkpICE9ICdhcyc6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZCwgJ2NvbXBvc2luZyBsZW5ndGgtc3BlY2lmaWVkIGJ1ZmZlciBmYWlsZWQnCi1pZiBzdHIoYnVmZmVyKGJ1ZmZlcignYXNkZicsIDAsIDIpLCAxLCAyKSkgIT0gJ3MnOgotICAgIHJhaXNlIFRlc3RGYWlsZWQsICdjb21wb3NpbmcgbGVuZ3RoLXNwZWNpZmllZCBidWZmZXIgZmFpbGVkJwotCi10cnk6IGFbMV0gPSAnZycKLWV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICJidWZmZXIgYXNzaWdubWVudCBzaG91bGQgcmFpc2UgVHlwZUVycm9yIgotCi10cnk6IGFbMDoxXSA9ICdnJwotZXhjZXB0IFR5cGVFcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgImJ1ZmZlciBzbGljZSBhc3NpZ25tZW50IHNob3VsZCByYWlzZSBUeXBlRXJyb3IiCi0KLSMgYXJyYXkuYXJyYXkoKSByZXR1cm5zIGFuIG9iamVjdCB0aGF0IGRvZXMgbm90IGltcGxlbWVudCBhIGNoYXIgYnVmZmVyLAotIyBzb21ldGhpbmcgd2hpY2ggaW50KCkgdXNlcyBmb3IgY29udmVyc2lvbi4KLWltcG9ydCBhcnJheQotdHJ5OiBpbnQoYnVmZmVyKGFycmF5LmFycmF5KCdjJykpKQotZXhjZXB0IFR5cGVFcnJvciA6cGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgImNoYXIgYnVmZmVyIChhdCBDIGxldmVsKSBub3Qgd29ya2luZyIKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdW5pY29kZS5weSBiL0xpYi90ZXN0L3Rlc3RfdW5pY29kZS5weQppbmRleCA1MTdlY2ZkLi4zOGZmOWFjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VuaWNvZGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91bmljb2RlLnB5CkBAIC05Miw2ICs5Miw5IEBACiAgICAgICAgICAgICAgICAgIlxceGZlXFx4ZmYnIikKICAgICAgICAgICAgIHRlc3RyZXByID0gcmVwcih1Jycuam9pbihtYXAodW5pY2hyLCB4cmFuZ2UoMjU2KSkpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0cmVwciwgbGF0aW4xcmVwcikKKyAgICAgICAgICAgICMgVGVzdCByZXByIHdvcmtzIG9uIHdpZGUgdW5pY29kZSBlc2NhcGVzIHdpdGhvdXQgb3ZlcmZsb3cuCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodSJcVTAwMDEwMDAwIiAqIDM5ICsgdSJcdWZmZmYiICogNDA5NiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHIodSJcVTAwMDEwMDAwIiAqIDM5ICsgdSJcdWZmZmYiICogNDA5NikpCiAKICAgICBkZWYgdGVzdF9pdGVyYXRvcnMoc2VsZik6CiAgICAgICAgICMgTWFrZSBzdXJlIHVuaWNvZGUgb2JqZWN0cyBoYXZlIGFuIF9faXRlcl9fIG1ldGhvZApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF94ZHJsaWIucHkgYi9MaWIvdGVzdC90ZXN0X3hkcmxpYi5weQppbmRleCBlOTUxN2M1Li44ZmM4OGE1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3hkcmxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3hkcmxpYi5weQpAQCAtMSwzICsxLDU2IEBACitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CisKIGltcG9ydCB4ZHJsaWIKIAoteGRybGliLl90ZXN0KCkKK2NsYXNzIFhEUlRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfeGRyKHNlbGYpOgorICAgICAgICBwID0geGRybGliLlBhY2tlcigpCisKKyAgICAgICAgcyA9ICdoZWxsbyB3b3JsZCcKKyAgICAgICAgYSA9IFsnd2hhdCcsICdpcycsICdoYXBuaW4nLCAnZG9jdG9yJ10KKworICAgICAgICBwLnBhY2tfaW50KDQyKQorICAgICAgICBwLnBhY2tfdWludCg5KQorICAgICAgICBwLnBhY2tfYm9vbChUcnVlKQorICAgICAgICBwLnBhY2tfYm9vbChGYWxzZSkKKyAgICAgICAgcC5wYWNrX3VoeXBlcig0NUwpCisgICAgICAgIHAucGFja19mbG9hdCgxLjkpCisgICAgICAgIHAucGFja19kb3VibGUoMS45KQorICAgICAgICBwLnBhY2tfc3RyaW5nKHMpCisgICAgICAgIHAucGFja19saXN0KHJhbmdlKDUpLCBwLnBhY2tfdWludCkKKyAgICAgICAgcC5wYWNrX2FycmF5KGEsIHAucGFja19zdHJpbmcpCisKKyAgICAgICAgIyBub3cgdmVyaWZ5CisgICAgICAgIGRhdGEgPSBwLmdldF9idWZmZXIoKQorICAgICAgICB1cCA9IHhkcmxpYi5VbnBhY2tlcihkYXRhKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXAuZ2V0X3Bvc2l0aW9uKCksIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cC51bnBhY2tfaW50KCksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVwLnVucGFja191aW50KCksIDkpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh1cC51bnBhY2tfYm9vbCgpIGlzIFRydWUpCisKKyAgICAgICAgIyByZW1lbWJlciBwb3NpdGlvbgorICAgICAgICBwb3MgPSB1cC5nZXRfcG9zaXRpb24oKQorICAgICAgICBzZWxmLmFzc2VydF8odXAudW5wYWNrX2Jvb2woKSBpcyBGYWxzZSkKKworICAgICAgICAjIHJld2luZCBhbmQgdW5wYWNrIGFnYWluCisgICAgICAgIHVwLnNldF9wb3NpdGlvbihwb3MpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh1cC51bnBhY2tfYm9vbCgpIGlzIEZhbHNlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXAudW5wYWNrX3VoeXBlcigpLCA0NUwpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwodXAudW5wYWNrX2Zsb2F0KCksIDEuOSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCh1cC51bnBhY2tfZG91YmxlKCksIDEuOSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cC51bnBhY2tfc3RyaW5nKCksIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXAudW5wYWNrX2xpc3QodXAudW5wYWNrX3VpbnQpLCByYW5nZSg1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cC51bnBhY2tfYXJyYXkodXAudW5wYWNrX3N0cmluZyksIGEpCisgICAgICAgIHVwLmRvbmUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFT0ZFcnJvciwgdXAudW5wYWNrX3VpbnQpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFhEUlRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfeG1scnBjLnB5IGIvTGliL3Rlc3QvdGVzdF94bWxycGMucHkKaW5kZXggNjRkOGZlOC4uY2NjMWI2MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF94bWxycGMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF94bWxycGMucHkKQEAgLTg2LDYgKzg2LDE1IEBACiAgICAgICAgIHMgPSB4bWxycGNsaWIuZHVtcHMoKG5ld19kLCksIG1ldGhvZHJlc3BvbnNlPVRydWUpCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHMsIHN0cikpCiAKKyAgICBkZWYgdGVzdF9uZXdzdHlsZV9jbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgVChvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0ID0gVCgpCisgICAgICAgIHQueCA9IDEwMAorICAgICAgICB0LnkgPSAiSGVsbG8iCisgICAgICAgICgodDIsKSwgZHVtbXkpID0geG1scnBjbGliLmxvYWRzKHhtbHJwY2xpYi5kdW1wcygodCwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModDIsIHQuX19kaWN0X18pCisKICAgICBkZWYgdGVzdF9kdW1wX2JpZ19sb25nKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCB4bWxycGNsaWIuZHVtcHMsICgyTCoqOTksKSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rva2VuaXplLnB5IGIvTGliL3Rva2VuaXplLnB5CmluZGV4IDVkNjUyNjcuLjEyNTM4MjIgMTAwNjQ0Ci0tLSBhL0xpYi90b2tlbml6ZS5weQorKysgYi9MaWIvdG9rZW5pemUucHkKQEAgLTI0LDcgKzI0LDcgQEAKIAogX19hdXRob3JfXyA9ICdLYS1QaW5nIFllZSA8cGluZ0BsZncub3JnPicKIF9fY3JlZGl0c19fID0gXAotICAgICdHdlIsIEVTUiwgVGltIFBldGVycywgVGhvbWFzIFdvdXRlcnMsIEZyZWQgRHJha2UsIFNraXAgTW9udGFuYXJvJworICAgICdHdlIsIEVTUiwgVGltIFBldGVycywgVGhvbWFzIFdvdXRlcnMsIEZyZWQgRHJha2UsIFNraXAgTW9udGFuYXJvLCBSYXltb25kIEhldHRpbmdlcicKIAogaW1wb3J0IHN0cmluZywgcmUKIGZyb20gdG9rZW4gaW1wb3J0ICoKQEAgLTE1OSwxNCArMTU5LDczIEBACiAgICAgZm9yIHRva2VuX2luZm8gaW4gZ2VuZXJhdGVfdG9rZW5zKHJlYWRsaW5lKToKICAgICAgICAgdG9rZW5lYXRlcigqdG9rZW5faW5mbykKIAorY2xhc3MgVW50b2tlbml6ZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudG9rZW5zID0gW10KKyAgICAgICAgc2VsZi5wcmV2X3JvdyA9IDEKKyAgICAgICAgc2VsZi5wcmV2X2NvbCA9IDAKKworICAgIGRlZiBhZGRfd2hpdGVzcGFjZShzZWxmLCBzdGFydCk6CisgICAgICAgIHJvdywgY29sID0gc3RhcnQKKyAgICAgICAgYXNzZXJ0IHJvdyA8PSBzZWxmLnByZXZfcm93CisgICAgICAgIGNvbF9vZmZzZXQgPSBjb2wgLSBzZWxmLnByZXZfY29sCisgICAgICAgIGlmIGNvbF9vZmZzZXQ6CisgICAgICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQoIiAiICogY29sX29mZnNldCkKKworICAgIGRlZiB1bnRva2VuaXplKHNlbGYsIGl0ZXJhYmxlKToKKyAgICAgICAgZm9yIHQgaW4gaXRlcmFibGU6CisgICAgICAgICAgICBpZiBsZW4odCkgPT0gMjoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbXBhdCh0LCBpdGVyYWJsZSkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdG9rX3R5cGUsIHRva2VuLCBzdGFydCwgZW5kLCBsaW5lID0gdAorICAgICAgICAgICAgc2VsZi5hZGRfd2hpdGVzcGFjZShzdGFydCkKKyAgICAgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZCh0b2tlbikKKyAgICAgICAgICAgIHNlbGYucHJldl9yb3csIHNlbGYucHJldl9jb2wgPSBlbmQKKyAgICAgICAgICAgIGlmIHRva190eXBlIGluIChORVdMSU5FLCBOTCk6CisgICAgICAgICAgICAgICAgc2VsZi5wcmV2X3JvdyArPSAxCisgICAgICAgICAgICAgICAgc2VsZi5wcmV2X2NvbCA9IDAKKyAgICAgICAgcmV0dXJuICIiLmpvaW4oc2VsZi50b2tlbnMpCisKKyAgICBkZWYgY29tcGF0KHNlbGYsIHRva2VuLCBpdGVyYWJsZSk6CisgICAgICAgIHN0YXJ0bGluZSA9IEZhbHNlCisgICAgICAgIGluZGVudHMgPSBbXQorICAgICAgICB0b2tzX2FwcGVuZCA9IHNlbGYudG9rZW5zLmFwcGVuZAorICAgICAgICB0b2tudW0sIHRva3ZhbCA9IHRva2VuCisgICAgICAgIGlmIHRva251bSBpbiAoTkFNRSwgTlVNQkVSKToKKyAgICAgICAgICAgIHRva3ZhbCArPSAnICcKKyAgICAgICAgaWYgdG9rbnVtIGluIChORVdMSU5FLCBOTCk6CisgICAgICAgICAgICBzdGFydGxpbmUgPSBUcnVlCisgICAgICAgIGZvciB0b2sgaW4gaXRlcmFibGU6CisgICAgICAgICAgICB0b2tudW0sIHRva3ZhbCA9IHRva1s6Ml0KKworICAgICAgICAgICAgaWYgdG9rbnVtIGluIChOQU1FLCBOVU1CRVIpOgorICAgICAgICAgICAgICAgIHRva3ZhbCArPSAnICcKKworICAgICAgICAgICAgaWYgdG9rbnVtID09IElOREVOVDoKKyAgICAgICAgICAgICAgICBpbmRlbnRzLmFwcGVuZCh0b2t2YWwpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgdG9rbnVtID09IERFREVOVDoKKyAgICAgICAgICAgICAgICBpbmRlbnRzLnBvcCgpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgdG9rbnVtIGluIChORVdMSU5FLCBOTCk6CisgICAgICAgICAgICAgICAgc3RhcnRsaW5lID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiBzdGFydGxpbmUgYW5kIGluZGVudHM6CisgICAgICAgICAgICAgICAgdG9rc19hcHBlbmQoaW5kZW50c1stMV0pCisgICAgICAgICAgICAgICAgc3RhcnRsaW5lID0gRmFsc2UKKyAgICAgICAgICAgIHRva3NfYXBwZW5kKHRva3ZhbCkKIAogZGVmIHVudG9rZW5pemUoaXRlcmFibGUpOgogICAgICIiIlRyYW5zZm9ybSB0b2tlbnMgYmFjayBpbnRvIFB5dGhvbiBzb3VyY2UgY29kZS4KIAogICAgIEVhY2ggZWxlbWVudCByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUgbXVzdCBiZSBhIHRva2VuIHNlcXVlbmNlCi0gICAgd2l0aCBhdCBsZWFzdCB0d28gZWxlbWVudHMsIGEgdG9rZW4gbnVtYmVyIGFuZCB0b2tlbiB2YWx1ZS4KKyAgICB3aXRoIGF0IGxlYXN0IHR3byBlbGVtZW50cywgYSB0b2tlbiBudW1iZXIgYW5kIHRva2VuIHZhbHVlLiAgSWYKKyAgICBvbmx5IHR3byB0b2tlbnMgYXJlIHBhc3NlZCwgdGhlIHJlc3VsdGluZyBvdXRwdXQgaXMgcG9vci4KIAotICAgIFJvdW5kLXRyaXAgaW52YXJpYW50OgorICAgIFJvdW5kLXRyaXAgaW52YXJpYW50IGZvciBmdWxsIGlucHV0OgorICAgICAgICBVbnRva2VuaXplZCBzb3VyY2Ugd2lsbCBtYXRjaCBpbnB1dCBzb3VyY2UgZXhhY3RseQorCisgICAgUm91bmQtdHJpcCBpbnZhcmlhbnQgZm9yIGxpbWl0ZWQgaW50cHV0OgogICAgICAgICAjIE91dHB1dCB0ZXh0IHdpbGwgdG9rZW5pemUgdGhlIGJhY2sgdG8gdGhlIGlucHV0CiAgICAgICAgIHQxID0gW3Rva1s6Ml0gZm9yIHRvayBpbiBnZW5lcmF0ZV90b2tlbnMoZi5yZWFkbGluZSldCiAgICAgICAgIG5ld2NvZGUgPSB1bnRva2VuaXplKHQxKQpAQCAtMTc0LDMxICsyMzMsOCBAQAogICAgICAgICB0MiA9IFt0b2tbOjJdIGZvciB0b2tpbiBnZW5lcmF0ZV90b2tlbnMocmVhZGxpbmUpXQogICAgICAgICBhc3NlcnQgdDEgPT0gdDIKICAgICAiIiIKLQotICAgIHN0YXJ0bGluZSA9IEZhbHNlCi0gICAgaW5kZW50cyA9IFtdCi0gICAgdG9rcyA9IFtdCi0gICAgdG9rc19hcHBlbmQgPSB0b2tzLmFwcGVuZAotICAgIGZvciB0b2sgaW4gaXRlcmFibGU6Ci0gICAgICAgIHRva251bSwgdG9rdmFsID0gdG9rWzoyXQotCi0gICAgICAgIGlmIHRva251bSBpbiAoTkFNRSwgTlVNQkVSKToKLSAgICAgICAgICAgIHRva3ZhbCArPSAnICcKLQotICAgICAgICBpZiB0b2tudW0gPT0gSU5ERU5UOgotICAgICAgICAgICAgaW5kZW50cy5hcHBlbmQodG9rdmFsKQotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgZWxpZiB0b2tudW0gPT0gREVERU5UOgotICAgICAgICAgICAgaW5kZW50cy5wb3AoKQotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgZWxpZiB0b2tudW0gaW4gKE5FV0xJTkUsIENPTU1FTlQsIE5MKToKLSAgICAgICAgICAgIHN0YXJ0bGluZSA9IFRydWUKLSAgICAgICAgZWxpZiBzdGFydGxpbmUgYW5kIGluZGVudHM6Ci0gICAgICAgICAgICB0b2tzX2FwcGVuZChpbmRlbnRzWy0xXSkKLSAgICAgICAgICAgIHN0YXJ0bGluZSA9IEZhbHNlCi0gICAgICAgIHRva3NfYXBwZW5kKHRva3ZhbCkKLSAgICByZXR1cm4gJycuam9pbih0b2tzKQotCisgICAgdXQgPSBVbnRva2VuaXplcigpCisgICAgcmV0dXJuIHV0LnVudG9rZW5pemUoaXRlcmFibGUpCiAKIGRlZiBnZW5lcmF0ZV90b2tlbnMocmVhZGxpbmUpOgogICAgICIiIgpAQCAtMjM3LDcgKzI3Myw3IEBACiAgICAgICAgICAgICBpZiBlbmRtYXRjaDoKICAgICAgICAgICAgICAgICBwb3MgPSBlbmQgPSBlbmRtYXRjaC5lbmQoMCkKICAgICAgICAgICAgICAgICB5aWVsZCAoU1RSSU5HLCBjb250c3RyICsgbGluZVs6ZW5kXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0YXJ0LCAobG51bSwgZW5kKSwgY29udGxpbmUgKyBsaW5lKQorICAgICAgICAgICAgICAgICAgICAgICBzdHJzdGFydCwgKGxudW0sIGVuZCksIGNvbnRsaW5lICsgbGluZSkKICAgICAgICAgICAgICAgICBjb250c3RyLCBuZWVkY29udCA9ICcnLCAwCiAgICAgICAgICAgICAgICAgY29udGxpbmUgPSBOb25lCiAgICAgICAgICAgICBlbGlmIG5lZWRjb250IGFuZCBsaW5lWy0yOl0gIT0gJ1xcXG4nIGFuZCBsaW5lWy0zOl0gIT0gJ1xcXHJcbic6CkBAIC0yNjMsNyArMjk5LDE1IEBACiAgICAgICAgICAgICBpZiBwb3MgPT0gbWF4OiBicmVhawogCiAgICAgICAgICAgICBpZiBsaW5lW3Bvc10gaW4gJyNcclxuJzogICAgICAgICAgICMgc2tpcCBjb21tZW50cyBvciBibGFuayBsaW5lcwotICAgICAgICAgICAgICAgIHlpZWxkICgoTkwsIENPTU1FTlQpW2xpbmVbcG9zXSA9PSAnIyddLCBsaW5lW3BvczpdLAorICAgICAgICAgICAgICAgIGlmIGxpbmVbcG9zXSA9PSAnIyc6CisgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRfdG9rZW4gPSBsaW5lW3BvczpdLnJzdHJpcCgnXHJcbicpCisgICAgICAgICAgICAgICAgICAgIG5sX3BvcyA9IHBvcyArIGxlbihjb21tZW50X3Rva2VuKQorICAgICAgICAgICAgICAgICAgICB5aWVsZCAoQ09NTUVOVCwgY29tbWVudF90b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsbnVtLCBwb3MpLCAobG51bSwgcG9zICsgbGVuKGNvbW1lbnRfdG9rZW4pKSwgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgKE5MLCBsaW5lW25sX3BvczpdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxudW0sIG5sX3BvcyksIChsbnVtLCBsZW4obGluZSkpLCBsaW5lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkICgoTkwsIENPTU1FTlQpW2xpbmVbcG9zXSA9PSAnIyddLCBsaW5lW3BvczpdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxudW0sIHBvcyksIChsbnVtLCBsZW4obGluZSkpLCBsaW5lKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAKQEAgLTI5NCw5ICszMzgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAoaW5pdGlhbCA9PSAnLicgYW5kIHRva2VuICE9ICcuJyk6ICAgICAgIyBvcmRpbmFyeSBudW1iZXIKICAgICAgICAgICAgICAgICAgICAgeWllbGQgKE5VTUJFUiwgdG9rZW4sIHNwb3MsIGVwb3MsIGxpbmUpCiAgICAgICAgICAgICAgICAgZWxpZiBpbml0aWFsIGluICdcclxuJzoKLSAgICAgICAgICAgICAgICAgICAgeWllbGQgKHBhcmVubGV2ID4gMCBhbmQgTkwgb3IgTkVXTElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiwgc3BvcywgZXBvcywgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgKE5MIGlmIHBhcmVubGV2ID4gMCBlbHNlIE5FV0xJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiwgc3BvcywgZXBvcywgbGluZSkKICAgICAgICAgICAgICAgICBlbGlmIGluaXRpYWwgPT0gJyMnOgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbm90IHRva2VuLmVuZHN3aXRoKCJcbiIpCiAgICAgICAgICAgICAgICAgICAgIHlpZWxkIChDT01NRU5ULCB0b2tlbiwgc3BvcywgZXBvcywgbGluZSkKICAgICAgICAgICAgICAgICBlbGlmIHRva2VuIGluIHRyaXBsZV9xdW90ZWQ6CiAgICAgICAgICAgICAgICAgICAgIGVuZHByb2cgPSBlbmRwcm9nc1t0b2tlbl0KZGlmZiAtLWdpdCBhL0xpYi90cmFjZWJhY2sucHkgYi9MaWIvdHJhY2ViYWNrLnB5CmluZGV4IGViMmZkZjYuLmUzOTVhZDcgMTAwNjQ0Ci0tLSBhL0xpYi90cmFjZWJhY2sucHkKKysrIGIvTGliL3RyYWNlYmFjay5weQpAQCAtMTYyLDYgKzE2MiwxMSBAQAogCiAgICAgIiIiCiAKKyAgICAjIEdyYWNlZnVsbHkgaGFuZGxlICh0aGUgd2F5IFB5dGhvbiAyLjQgYW5kIGVhcmxpZXIgZGlkKSB0aGUgY2FzZSBvZgorICAgICMgYmVpbmcgY2FsbGVkIHdpdGggKE5vbmUsIE5vbmUpLgorICAgIGlmIGV0eXBlIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBbX2Zvcm1hdF9maW5hbF9leGNfbGluZShldHlwZSwgdmFsdWUpXQorCiAgICAgc3R5cGUgPSBldHlwZS5fX25hbWVfXwogICAgIHNtb2QgPSBldHlwZS5fX21vZHVsZV9fCiAgICAgaWYgc21vZCBub3QgaW4gKCJleGNlcHRpb25zIiwgIl9fbWFpbl9fIiwgIl9fYnVpbHRpbl9fIik6CmRpZmYgLS1naXQgYS9MaWIvdXJsbGliLnB5IGIvTGliL3VybGxpYi5weQppbmRleCBlMDFmNDIxLi45MGY3YWEwIDEwMDY0NAotLS0gYS9MaWIvdXJsbGliLnB5CisrKyBiL0xpYi91cmxsaWIucHkKQEAgLTMwMiwxMyArMzAyLDEzIEBACiAKICAgICAgICAgaWYgcHJveHlfcGFzc3dkOgogICAgICAgICAgICAgaW1wb3J0IGJhc2U2NAotICAgICAgICAgICAgcHJveHlfYXV0aCA9IGJhc2U2NC5lbmNvZGVzdHJpbmcocHJveHlfcGFzc3dkKS5zdHJpcCgpCisgICAgICAgICAgICBwcm94eV9hdXRoID0gYmFzZTY0LmI2NGVuY29kZShwcm94eV9wYXNzd2QpLnN0cmlwKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHByb3h5X2F1dGggPSBOb25lCiAKICAgICAgICAgaWYgdXNlcl9wYXNzd2Q6CiAgICAgICAgICAgICBpbXBvcnQgYmFzZTY0Ci0gICAgICAgICAgICBhdXRoID0gYmFzZTY0LmVuY29kZXN0cmluZyh1c2VyX3Bhc3N3ZCkuc3RyaXAoKQorICAgICAgICAgICAgYXV0aCA9IGJhc2U2NC5iNjRlbmNvZGUodXNlcl9wYXNzd2QpLnN0cmlwKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGF1dGggPSBOb25lCiAgICAgICAgIGggPSBodHRwbGliLkhUVFAoaG9zdCkKQEAgLTM4NywxMiArMzg3LDEyIEBACiAgICAgICAgICAgICBpZiBub3QgaG9zdDogcmFpc2UgSU9FcnJvciwgKCdodHRwcyBlcnJvcicsICdubyBob3N0IGdpdmVuJykKICAgICAgICAgICAgIGlmIHByb3h5X3Bhc3N3ZDoKICAgICAgICAgICAgICAgICBpbXBvcnQgYmFzZTY0Ci0gICAgICAgICAgICAgICAgcHJveHlfYXV0aCA9IGJhc2U2NC5lbmNvZGVzdHJpbmcocHJveHlfcGFzc3dkKS5zdHJpcCgpCisgICAgICAgICAgICAgICAgcHJveHlfYXV0aCA9IGJhc2U2NC5iNjRlbmNvZGUocHJveHlfcGFzc3dkKS5zdHJpcCgpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHByb3h5X2F1dGggPSBOb25lCiAgICAgICAgICAgICBpZiB1c2VyX3Bhc3N3ZDoKICAgICAgICAgICAgICAgICBpbXBvcnQgYmFzZTY0Ci0gICAgICAgICAgICAgICAgYXV0aCA9IGJhc2U2NC5lbmNvZGVzdHJpbmcodXNlcl9wYXNzd2QpLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBhdXRoID0gYmFzZTY0LmI2NGVuY29kZSh1c2VyX3Bhc3N3ZCkuc3RyaXAoKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBhdXRoID0gTm9uZQogICAgICAgICAgICAgaCA9IGh0dHBsaWIuSFRUUFMoaG9zdCwgMCwKZGlmZiAtLWdpdCBhL0xpYi91cmxsaWIyLnB5IGIvTGliL3VybGxpYjIucHkKaW5kZXggMWUxOWYzMy4uYTg4MGU2NCAxMDA2NDQKLS0tIGEvTGliL3VybGxpYjIucHkKKysrIGIvTGliL3VybGxpYjIucHkKQEAgLTY3NCw3ICs2NzQsNyBAQAogICAgICAgICAgICAgcHJveHlfdHlwZSA9IG9yaWdfdHlwZQogICAgICAgICBpZiB1c2VyIGFuZCBwYXNzd29yZDoKICAgICAgICAgICAgIHVzZXJfcGFzcyA9ICclczolcycgJSAodW5xdW90ZSh1c2VyKSwgdW5xdW90ZShwYXNzd29yZCkpCi0gICAgICAgICAgICBjcmVkcyA9IGJhc2U2NC5lbmNvZGVzdHJpbmcodXNlcl9wYXNzKS5zdHJpcCgpCisgICAgICAgICAgICBjcmVkcyA9IGJhc2U2NC5iNjRlbmNvZGUodXNlcl9wYXNzKS5zdHJpcCgpCiAgICAgICAgICAgICByZXEuYWRkX2hlYWRlcignUHJveHktYXV0aG9yaXphdGlvbicsICdCYXNpYyAnICsgY3JlZHMpCiAgICAgICAgIGhvc3Rwb3J0ID0gdW5xdW90ZShob3N0cG9ydCkKICAgICAgICAgcmVxLnNldF9wcm94eShob3N0cG9ydCwgcHJveHlfdHlwZSkKQEAgLTc5OCw3ICs3OTgsNyBAQAogICAgICAgICB1c2VyLCBwdyA9IHNlbGYucGFzc3dkLmZpbmRfdXNlcl9wYXNzd29yZChyZWFsbSwgaG9zdCkKICAgICAgICAgaWYgcHcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICByYXcgPSAiJXM6JXMiICUgKHVzZXIsIHB3KQotICAgICAgICAgICAgYXV0aCA9ICdCYXNpYyAlcycgJSBiYXNlNjQuZW5jb2Rlc3RyaW5nKHJhdykuc3RyaXAoKQorICAgICAgICAgICAgYXV0aCA9ICdCYXNpYyAlcycgJSBiYXNlNjQuYjY0ZW5jb2RlKHJhdykuc3RyaXAoKQogICAgICAgICAgICAgaWYgcmVxLmhlYWRlcnMuZ2V0KHNlbGYuYXV0aF9oZWFkZXIsIE5vbmUpID09IGF1dGg6CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgIHJlcS5hZGRfaGVhZGVyKHNlbGYuYXV0aF9oZWFkZXIsIGF1dGgpCmRpZmYgLS1naXQgYS9MaWIvdXUucHkgYi9MaWIvdXUucHkKaW5kZXggM2NjZWRiMC4uZGE4OWY3MiAxMDA3NTUKLS0tIGEvTGliL3V1LnB5CisrKyBiL0xpYi91dS5weQpAQCAtMTE0LDYgKzExNCw3IEBACiAgICAgIwogICAgICMgT3BlbiB0aGUgb3V0cHV0IGZpbGUKICAgICAjCisgICAgb3BlbmVkID0gRmFsc2UKICAgICBpZiBvdXRfZmlsZSA9PSAnLSc6CiAgICAgICAgIG91dF9maWxlID0gc3lzLnN0ZG91dAogICAgIGVsaWYgaXNpbnN0YW5jZShvdXRfZmlsZSwgYmFzZXN0cmluZyk6CkBAIC0xMjMsNiArMTI0LDcgQEAKICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBvdXRfZmlsZSA9IGZwCisgICAgICAgIG9wZW5lZCA9IFRydWUKICAgICAjCiAgICAgIyBNYWluIGRlY29kaW5nIGxvb3AKICAgICAjCkBAIC0xNDAsNiArMTQyLDggQEAKICAgICAgICAgcyA9IGluX2ZpbGUucmVhZGxpbmUoKQogICAgIGlmIG5vdCBzOgogICAgICAgICByYWlzZSBFcnJvcignVHJ1bmNhdGVkIGlucHV0IGZpbGUnKQorICAgIGlmIG9wZW5lZDoKKyAgICAgICAgb3V0X2ZpbGUuY2xvc2UoKQogCiBkZWYgdGVzdCgpOgogICAgICIiInV1ZW5jb2RlL3V1ZGVjb2RlIG1haW4gcHJvZ3JhbSIiIgpkaWZmIC0tZ2l0IGEvTGliL3dlYmJyb3dzZXIucHkgYi9MaWIvd2ViYnJvd3Nlci5weQppbmRleCA5ZmQxNjE1Li4wZDVmNDRmIDEwMDY0NAotLS0gYS9MaWIvd2ViYnJvd3Nlci5weQorKysgYi9MaWIvd2ViYnJvd3Nlci5weQpAQCAtMTY1LDcgKzE2NSwxMCBAQAogICAgICAgICBjbWRsaW5lID0gW3NlbGYubmFtZV0gKyBbYXJnLnJlcGxhY2UoIiVzIiwgdXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFyZyBpbiBzZWxmLmFyZ3NdCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZGxpbmUsIGNsb3NlX2Zkcz1UcnVlKQorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAnd2luJzoKKyAgICAgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWRsaW5lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWRsaW5lLCBjbG9zZV9mZHM9VHJ1ZSkKICAgICAgICAgICAgIHJldHVybiBub3QgcC53YWl0KCkKICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKQEAgLTE3OCwxMSArMTgxLDE0IEBACiAgICAgZGVmIG9wZW4oc2VsZiwgdXJsLCBuZXc9MCwgYXV0b3JhaXNlPTEpOgogICAgICAgICBjbWRsaW5lID0gW3NlbGYubmFtZV0gKyBbYXJnLnJlcGxhY2UoIiVzIiwgdXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFyZyBpbiBzZWxmLmFyZ3NdCi0gICAgICAgIHNldHNpZCA9IGdldGF0dHIob3MsICdzZXRzaWQnLCBOb25lKQotICAgICAgICBpZiBub3Qgc2V0c2lkOgotICAgICAgICAgICAgc2V0c2lkID0gZ2V0YXR0cihvcywgJ3NldHBncnAnLCBOb25lKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWRsaW5lLCBjbG9zZV9mZHM9VHJ1ZSwgcHJlZXhlY19mbj1zZXRzaWQpCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm1bOjNdID09ICd3aW4nOgorICAgICAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZGxpbmUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNldHNpZCA9IGdldGF0dHIob3MsICdzZXRzaWQnLCBOb25lKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZXRzaWQ6CisgICAgICAgICAgICAgICAgICAgIHNldHNpZCA9IGdldGF0dHIob3MsICdzZXRwZ3JwJywgTm9uZSkKKyAgICAgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWRsaW5lLCBjbG9zZV9mZHM9VHJ1ZSwgcHJlZXhlY19mbj1zZXRzaWQpCiAgICAgICAgICAgICByZXR1cm4gKHAucG9sbCgpIGlzIE5vbmUpCiAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCkBAIC00NDEsNyArNDQ3LDcgQEAKIAogICAgICAgICAjIGlmIHN1Y2Nlc3NmdWwsIHJlZ2lzdGVyIGl0CiAgICAgICAgIGlmIHJldG5jb2RlIGlzIE5vbmUgYW5kIGNvbW1kOgotICAgICAgICAgICAgcmVnaXN0ZXIoImdub21lIiwgTm9uZSwgQmFja2dyb3VuZEJyb3dzZXIoY29tbWQpKQorICAgICAgICAgICAgcmVnaXN0ZXIoImdub21lIiwgTm9uZSwgQmFja2dyb3VuZEJyb3dzZXIoY29tbWQuc3BsaXQoKSkpCiAKICAgICAjIEZpcnN0LCB0aGUgTW96aWxsYS9OZXRzY2FwZSBicm93c2VycwogICAgIGZvciBicm93c2VyIGluICgibW96aWxsYS1maXJlZm94IiwgImZpcmVmb3giLApkaWZmIC0tZ2l0IGEvTGliL3hkcmxpYi5weSBiL0xpYi94ZHJsaWIucHkKaW5kZXggYjM0OWViOS4uNzk2ZGZhZiAxMDA2NDQKLS0tIGEvTGliL3hkcmxpYi5weQorKysgYi9MaWIveGRybGliLnB5CkBAIC0yMjcsNjEgKzIyNywzIEBACiAgICAgZGVmIHVucGFja19hcnJheShzZWxmLCB1bnBhY2tfaXRlbSk6CiAgICAgICAgIG4gPSBzZWxmLnVucGFja191aW50KCkKICAgICAgICAgcmV0dXJuIHNlbGYudW5wYWNrX2ZhcnJheShuLCB1bnBhY2tfaXRlbSkKLQotCi0jIHRlc3Qgc3VpdGUKLWRlZiBfdGVzdCgpOgotICAgIHAgPSBQYWNrZXIoKQotICAgIHBhY2t0ZXN0ID0gWwotICAgICAgICAocC5wYWNrX3VpbnQsICAgICg5LCkpLAotICAgICAgICAocC5wYWNrX2Jvb2wsICAgIChUcnVlLCkpLAotICAgICAgICAocC5wYWNrX2Jvb2wsICAgIChGYWxzZSwpKSwKLSAgICAgICAgKHAucGFja191aHlwZXIsICAoNDVMLCkpLAotICAgICAgICAocC5wYWNrX2Zsb2F0LCAgICgxLjksKSksCi0gICAgICAgIChwLnBhY2tfZG91YmxlLCAgKDEuOSwpKSwKLSAgICAgICAgKHAucGFja19zdHJpbmcsICAoJ2hlbGxvIHdvcmxkJywpKSwKLSAgICAgICAgKHAucGFja19saXN0LCAgICAocmFuZ2UoNSksIHAucGFja191aW50KSksCi0gICAgICAgIChwLnBhY2tfYXJyYXksICAgKFsnd2hhdCcsICdpcycsICdoYXBuaW4nLCAnZG9jdG9yJ10sIHAucGFja19zdHJpbmcpKSwKLSAgICAgICAgXQotICAgIHN1Y2NlZWRsaXN0ID0gWzFdICogbGVuKHBhY2t0ZXN0KQotICAgIGNvdW50ID0gMAotICAgIGZvciBtZXRob2QsIGFyZ3MgaW4gcGFja3Rlc3Q6Ci0gICAgICAgIHByaW50ICdwYWNrIHRlc3QnLCBjb3VudCwKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgbWV0aG9kKCphcmdzKQotICAgICAgICAgICAgcHJpbnQgJ3N1Y2NlZWRlZCcKLSAgICAgICAgZXhjZXB0IENvbnZlcnNpb25FcnJvciwgdmFyOgotICAgICAgICAgICAgcHJpbnQgJ0NvbnZlcnNpb25FcnJvcjonLCB2YXIubXNnCi0gICAgICAgICAgICBzdWNjZWVkbGlzdFtjb3VudF0gPSAwCi0gICAgICAgIGNvdW50ID0gY291bnQgKyAxCi0gICAgZGF0YSA9IHAuZ2V0X2J1ZmZlcigpCi0gICAgIyBub3cgdmVyaWZ5Ci0gICAgdXAgPSBVbnBhY2tlcihkYXRhKQotICAgIHVucGFja3Rlc3QgPSBbCi0gICAgICAgICh1cC51bnBhY2tfdWludCwgICAoKSwgbGFtYmRhIHg6IHggPT0gOSksCi0gICAgICAgICh1cC51bnBhY2tfYm9vbCwgICAoKSwgbGFtYmRhIHg6IHggaXMgVHJ1ZSksCi0gICAgICAgICh1cC51bnBhY2tfYm9vbCwgICAoKSwgbGFtYmRhIHg6IHggaXMgRmFsc2UpLAotICAgICAgICAodXAudW5wYWNrX3VoeXBlciwgKCksIGxhbWJkYSB4OiB4ID09IDQ1TCksCi0gICAgICAgICh1cC51bnBhY2tfZmxvYXQsICAoKSwgbGFtYmRhIHg6IDEuODkgPCB4IDwgMS45MSksCi0gICAgICAgICh1cC51bnBhY2tfZG91YmxlLCAoKSwgbGFtYmRhIHg6IDEuODkgPCB4IDwgMS45MSksCi0gICAgICAgICh1cC51bnBhY2tfc3RyaW5nLCAoKSwgbGFtYmRhIHg6IHggPT0gJ2hlbGxvIHdvcmxkJyksCi0gICAgICAgICh1cC51bnBhY2tfbGlzdCwgICAodXAudW5wYWNrX3VpbnQsKSwgbGFtYmRhIHg6IHggPT0gcmFuZ2UoNSkpLAotICAgICAgICAodXAudW5wYWNrX2FycmF5LCAgKHVwLnVucGFja19zdHJpbmcsKSwKLSAgICAgICAgIGxhbWJkYSB4OiB4ID09IFsnd2hhdCcsICdpcycsICdoYXBuaW4nLCAnZG9jdG9yJ10pLAotICAgICAgICBdCi0gICAgY291bnQgPSAwCi0gICAgZm9yIG1ldGhvZCwgYXJncywgcHJlZCBpbiB1bnBhY2t0ZXN0OgotICAgICAgICBwcmludCAndW5wYWNrIHRlc3QnLCBjb3VudCwKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgaWYgc3VjY2VlZGxpc3RbY291bnRdOgotICAgICAgICAgICAgICAgIHggPSBtZXRob2QoKmFyZ3MpCi0gICAgICAgICAgICAgICAgcHJpbnQgcHJlZCh4KSBhbmQgJ3N1Y2NlZWRlZCcgb3IgJ2ZhaWxlZCcsICc6JywgeAotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCAnc2tpcHBpbmcnCi0gICAgICAgIGV4Y2VwdCBDb252ZXJzaW9uRXJyb3IsIHZhcjoKLSAgICAgICAgICAgIHByaW50ICdDb252ZXJzaW9uRXJyb3I6JywgdmFyLm1zZwotICAgICAgICBjb3VudCA9IGNvdW50ICsgMQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgX3Rlc3QoKQpkaWZmIC0tZ2l0IGEvTGliL3htbHJwY2xpYi5weSBiL0xpYi94bWxycGNsaWIucHkKaW5kZXggNzI4NjZmMS4uZGEzZDM5NiAxMDA2NDQKLS0tIGEvTGliL3htbHJwY2xpYi5weQorKysgYi9MaWIveG1scnBjbGliLnB5CkBAIC01OTMsOSArNTkzLDIxIEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGYgPSBzZWxmLmRpc3BhdGNoW3R5cGUodmFsdWUpXQogICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJjYW5ub3QgbWFyc2hhbCAlcyBvYmplY3RzIiAlIHR5cGUodmFsdWUpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBmKHNlbGYsIHZhbHVlLCB3cml0ZSkKKyAgICAgICAgICAgICMgY2hlY2sgaWYgdGhpcyBvYmplY3QgY2FuIGJlIG1hcnNoYWxsZWQgYXMgYSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2YWx1ZS5fX2RpY3RfXworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgImNhbm5vdCBtYXJzaGFsICVzIG9iamVjdHMiICUgdHlwZSh2YWx1ZSkKKyAgICAgICAgICAgICMgY2hlY2sgaWYgdGhpcyBjbGFzcyBpcyBhIHN1Yi1jbGFzcyBvZiBhIGJhc2ljIHR5cGUsCisgICAgICAgICAgICAjIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8gbWFyc2hhbCB0aGVzZSB0eXBlcworICAgICAgICAgICAgIyAoZS5nLiBhIHN0cmluZyBzdWItY2xhc3MpCisgICAgICAgICAgICBmb3IgdHlwZV8gaW4gdHlwZSh2YWx1ZSkuX19tcm9fXzoKKyAgICAgICAgICAgICAgICBpZiB0eXBlXyBpbiBzZWxmLmRpc3BhdGNoLmtleXMoKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiY2Fubm90IG1hcnNoYWwgJXMgb2JqZWN0cyIgJSB0eXBlKHZhbHVlKQorICAgICAgICAgICAgIyBYWFgodHdvdXRlcnMpOiB1c2luZyAiX2FyYml0cmFyeV9pbnN0YW5jZSIgYXMga2V5IGFzIGEgcXVpY2stZml4CisgICAgICAgICAgICAjIGZvciB0aGUgcDN5ayBtZXJnZSwgdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgZml4ZWQgbW9yZSBuZWF0bHkuCisgICAgICAgICAgICBmID0gc2VsZi5kaXNwYXRjaFsiX2FyYml0cmFyeV9pbnN0YW5jZSJdCisgICAgICAgIGYoc2VsZiwgdmFsdWUsIHdyaXRlKQogCiAgICAgZGVmIGR1bXBfbmlsIChzZWxmLCB2YWx1ZSwgd3JpdGUpOgogICAgICAgICBpZiBub3Qgc2VsZi5hbGxvd19ub25lOgpAQCAtNzEzLDYgKzcyNSw5IEBACiAgICAgICAgICAgICBzZWxmLmR1bXBfc3RydWN0KHZhbHVlLl9fZGljdF9fLCB3cml0ZSkKICAgICBkaXNwYXRjaFtEYXRlVGltZV0gPSBkdW1wX2luc3RhbmNlCiAgICAgZGlzcGF0Y2hbQmluYXJ5XSA9IGR1bXBfaW5zdGFuY2UKKyAgICAjIFhYWCh0d291dGVycyk6IHVzaW5nICJfYXJiaXRyYXJ5X2luc3RhbmNlIiBhcyBrZXkgYXMgYSBxdWljay1maXgKKyAgICAjIGZvciB0aGUgcDN5ayBtZXJnZSwgdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgZml4ZWQgbW9yZSBuZWF0bHkuCisgICAgZGlzcGF0Y2hbIl9hcmJpdHJhcnlfaW5zdGFuY2UiXSA9IGR1bXBfaW5zdGFuY2UKIAogIyMKICMgWE1MLVJQQyB1bm1hcnNoYWxsZXIuCg==