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+CisgICAgICAgICIiIikKIAotIyBUcnkgY29va2llIHdpdGggcXVvdGVkIG1ldGEtZGF0YQotQyA9IENvb2tpZS5TaW1wbGVDb29raWUoKQotQy5sb2FkKCdDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSInKQotdmVyaWZ5KENbJ0N1c3RvbWVyJ10udmFsdWUgPT0gJ1dJTEVfRV9DT1lPVEUnKQotdmVyaWZ5KENbJ0N1c3RvbWVyJ11bJ3ZlcnNpb24nXSA9PSAnMScpCi12ZXJpZnkoQ1snQ3VzdG9tZXInXVsncGF0aCddID09ICcvYWNtZScpCisgICAgZGVmIHRlc3RfcXVvdGVkX21ldGEoc2VsZik6CisgICAgICAgICMgVHJ5IGNvb2tpZSB3aXRoIHF1b3RlZCBtZXRhLWRhdGEKKyAgICAgICAgQyA9IENvb2tpZS5TaW1wbGVDb29raWUoKQorICAgICAgICBDLmxvYWQoJ0N1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ1snQ3VzdG9tZXInXS52YWx1ZSwgJ1dJTEVfRV9DT1lPVEUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENbJ0N1c3RvbWVyJ11bJ3ZlcnNpb24nXSwgJzEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENbJ0N1c3RvbWVyJ11bJ3BhdGgnXSwgJy9hY21lJykKIAotcHJpbnQgIklmIGFueXRoaW5nIGJsb3dzIHVwIGFmdGVyIHRoaXMgbGluZSwgaXQncyBmcm9tIENvb2tpZSdzIGRvY3Rlc3QuIgotcnVuX2RvY3Rlc3QoQ29va2llKQorZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChDb29raWVUZXN0cykKKyAgICBydW5fZG9jdGVzdChDb29raWUpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGF0ZXRpbWUucHkgYi9MaWIvdGVzdC90ZXN0X2RhdGV0aW1lLnB5CmluZGV4IDc2NWJkYWYuLjMzMjkxMDQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGF0ZXRpbWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kYXRldGltZS5weQpAQCAtODUyLDYgKzg1Miw3IEBACiAgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDIwMDUsIDMsIDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5zdHJmdGltZSgibTolbSBkOiVkIHk6JXkiKSwgIm06MDMgZDowMiB5OjA1IikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnN0cmZ0aW1lKCIiKSwgIiIpICMgU0YgYnVnICM3NjEzMzcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnN0cmZ0aW1lKCd4JyoxMDAwKSwgJ3gnKjEwMDApICMgU0YgYnVnICMxNTU2Nzg0CiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0LnN0cmZ0aW1lKSAjIG5lZWRzIGFuIGFyZwogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQuc3RyZnRpbWUsICJvbmUiLCAidHdvIikgIyB0b28gbWFueSBhcmdzCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkgYi9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkKaW5kZXggNTVhNTNkMy4uNTBkZjkzZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weQpAQCAtMjMsNiArMjMsNyBAQAogeW91J3JlIHdvcmtpbmcgdGhyb3VnaCBJRExFLCB5b3UgY2FuIGltcG9ydCB0aGlzIHRlc3QgbW9kdWxlIGFuZCBjYWxsIHRlc3RfbWFpbigpCiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50LgogIiIiCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CiAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IGdsb2IKQEAgLTEwNTcsNiArMTA1OCwzMiBAQAogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGMuZmxhZ3MpLCBpZChkLmZsYWdzKSkKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChjLnRyYXBzKSwgaWQoZC50cmFwcykpCiAKK2NsYXNzIFdpdGhTdGF0ZW1lbnRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIENhbid0IGRvIHRoZXNlIGFzIGRvY3N0cmluZ3MgdW50aWwgUHl0aG9uIDIuNgorICAgICMgYXMgZG9jdGVzdCBjYW4ndCBoYW5kbGUgX19mdXR1cmVfXyBzdGF0ZW1lbnRzCisKKyAgICBkZWYgdGVzdF9sb2NhbGNvbnRleHQoc2VsZik6CisgICAgICAgICMgVXNlIGEgY29weSBvZiB0aGUgY3VycmVudCBjb250ZXh0IGluIHRoZSBibG9jaworICAgICAgICBvcmlnX2N0eCA9IGdldGNvbnRleHQoKQorICAgICAgICB3aXRoIGxvY2FsY29udGV4dCgpIGFzIGVudGVyX2N0eDoKKyAgICAgICAgICAgIHNldF9jdHggPSBnZXRjb250ZXh0KCkKKyAgICAgICAgZmluYWxfY3R4ID0gZ2V0Y29udGV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhvcmlnX2N0eCBpcyBmaW5hbF9jdHgsICdkaWQgbm90IHJlc3RvcmUgY29udGV4dCBjb3JyZWN0bHknKQorICAgICAgICBzZWxmLmFzc2VydF8ob3JpZ19jdHggaXMgbm90IHNldF9jdHgsICdkaWQgbm90IGNvcHkgdGhlIGNvbnRleHQnKQorICAgICAgICBzZWxmLmFzc2VydF8oc2V0X2N0eCBpcyBlbnRlcl9jdHgsICdfX2VudGVyX18gcmV0dXJuZWQgd3JvbmcgY29udGV4dCcpCisKKyAgICBkZWYgdGVzdF9sb2NhbGNvbnRleHRhcmcoc2VsZik6CisgICAgICAgICMgVXNlIGEgY29weSBvZiB0aGUgc3VwcGxpZWQgY29udGV4dCBpbiB0aGUgYmxvY2sKKyAgICAgICAgb3JpZ19jdHggPSBnZXRjb250ZXh0KCkKKyAgICAgICAgbmV3X2N0eCA9IENvbnRleHQocHJlYz00MikKKyAgICAgICAgd2l0aCBsb2NhbGNvbnRleHQobmV3X2N0eCkgYXMgZW50ZXJfY3R4OgorICAgICAgICAgICAgc2V0X2N0eCA9IGdldGNvbnRleHQoKQorICAgICAgICBmaW5hbF9jdHggPSBnZXRjb250ZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG9yaWdfY3R4IGlzIGZpbmFsX2N0eCwgJ2RpZCBub3QgcmVzdG9yZSBjb250ZXh0IGNvcnJlY3RseScpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZXRfY3R4LnByZWMgPT0gbmV3X2N0eC5wcmVjLCAnZGlkIG5vdCBzZXQgY29ycmVjdCBjb250ZXh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5ld19jdHggaXMgbm90IHNldF9jdHgsICdkaWQgbm90IGNvcHkgdGhlIGNvbnRleHQnKQorICAgICAgICBzZWxmLmFzc2VydF8oc2V0X2N0eCBpcyBlbnRlcl9jdHgsICdfX2VudGVyX18gcmV0dXJuZWQgd3JvbmcgY29udGV4dCcpCisKIGRlZiB0ZXN0X21haW4oYXJpdGg9RmFsc2UsIHZlcmJvc2U9Tm9uZSk6CiAgICAgIiIiIEV4ZWN1dGUgdGhlIHRlc3RzLgogCkBAIC0xMDc3LDYgKzExMDQsNyBAQAogICAgICAgICBEZWNpbWFsUHl0aG9uQVBJdGVzdHMsCiAgICAgICAgIENvbnRleHRBUEl0ZXN0cywKICAgICAgICAgRGVjaW1hbFRlc3QsCisgICAgICAgIFdpdGhTdGF0ZW1lbnRUZXN0LAogICAgIF0KIAogICAgIHRyeToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkgYi9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CmluZGV4IGQzYWU0NTUuLjI5NjhlM2QgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZXNjci5weQpAQCAtMjAxNyw2ICsyMDE3LDEzIEBACiAKICAgICB2ZXJpcyhTdWIudGVzdCgpLCBCYXNlLmFQcm9wKQogCisgICAgIyBWZXJpZnkgdGhhdCBzdXBlcigpIGRvZXNuJ3QgYWxsb3cga2V5d29yZCBhcmdzCisgICAgdHJ5OgorICAgICAgICBzdXBlcihCYXNlLCBrdz0xKQorICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAic3VwZXIgc2hvdWxkbid0IGFjY2VwdCBrZXl3b3JkIGFyZ3MiCiAKIGRlZiBpbmhlcml0cygpOgogICAgIGlmIHZlcmJvc2U6IHByaW50ICJUZXN0aW5nIGluaGVyaXRhbmNlIGZyb20gYmFzaWMgdHlwZXMuLi4iCkBAIC0zNTAxLDYgKzM1MDgsMTMgQEAKICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgInNob3VsZG4ndCBiZSBhYmxlIHRvIGFzc2lnbiB0byBsaXN0Ll9fYmFzZXNfXyIKIAogICAgIHRyeToKKyAgICAgICAgRC5fX2Jhc2VzX18gPSAoQzIsIGxpc3QpCisgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGFzc2VydCAwLCAiYmVzdF9iYXNlIGNhbGN1bGF0aW9uIGZvdW5kIHdhbnRpbmciCisKKyAgICB0cnk6CiAgICAgICAgIGRlbCBELl9fYmFzZXNfXwogICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGljdC5weSBiL0xpYi90ZXN0L3Rlc3RfZGljdC5weQppbmRleCA3MTdlZDVlLi5mZjZjY2RlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RpY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kaWN0LnB5CkBAIC00MzksNiArNDM5LDE2IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWxfKCJnWzQyXSBkaWRuJ3QgcmFpc2UgS2V5RXJyb3IiKQogCisgICAgZGVmIHRlc3RfdHVwbGVfa2V5ZXJyb3Ioc2VsZik6CisgICAgICAgICMgU0YgIzE1NzY2NTcKKyAgICAgICAgZCA9IHt9CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRbKDEsKV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3MsICgoMSwpLCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIm1pc3NpbmcgS2V5RXJyb3IiKQorCiAKIGZyb20gdGVzdCBpbXBvcnQgbWFwcGluZ190ZXN0cwogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHkgYi9MaWIvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHkKaW5kZXggYjVjNTY3Ni4uYWJjZTQxZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weQpAQCAtMTk2LDE3ICsxOTYsMjEgQEAKICAgICAgICAgICAgIHRlc3RfY2FwaTIoKQogICAgICAgICAgICAgdGVzdF9jYXBpMygpCiAKKyAgICBkZWYgdGVzdF9XaW5kb3dzRXJyb3Ioc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIFdpbmRvd3NFcnJvcgorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyKFdpbmRvd3NFcnJvcigxMDAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAwMSIpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHIoV2luZG93c0Vycm9yKDEwMDEsICJtZXNzYWdlIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltFcnJvciAxMDAxXSBtZXNzYWdlIikKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFdpbmRvd3NFcnJvcigxMDAxLCAibWVzc2FnZSIpLmVycm5vLCAyMikKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFdpbmRvd3NFcnJvcigxMDAxLCAibWVzc2FnZSIpLndpbmVycm9yLCAxMDAxKQorCiAgICAgZGVmIHRlc3RBdHRyaWJ1dGVzKHNlbGYpOgogICAgICAgICAjIHRlc3QgdGhhdCBleGNlcHRpb24gYXR0cmlidXRlcyBhcmUgaGFwcHkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc3RyKHUnSGVsbG8gXHUwMEUxJykKLSAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKLSAgICAgICAgICAgIHNhbXBsZVVuaWNvZGVFbmNvZGVFcnJvciA9IGUKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB1bmljb2RlKCdceGZmJykKLSAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKLSAgICAgICAgICAgIHNhbXBsZVVuaWNvZGVEZWNvZGVFcnJvciA9IGUKIAogICAgICAgICBleGNlcHRpb25MaXN0ID0gWwogICAgICAgICAgICAgKEJhc2VFeGNlcHRpb24sICgpLCB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgpfSksCkBAIC0yMTgsMTEgKzIyMiwxNiBAQAogICAgICAgICAgICAgKFN5c3RlbUV4aXQsICgnZm9vJywpLAogICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnZm9vJywgJ2FyZ3MnIDogKCdmb28nLCksICdjb2RlJyA6ICdmb28nfSksCiAgICAgICAgICAgICAoSU9FcnJvciwgKCdmb28nLCksCi0gICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICdmb28nLCAnYXJncycgOiAoJ2ZvbycsKX0pLAorICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnZm9vJywgJ2FyZ3MnIDogKCdmb28nLCksICdmaWxlbmFtZScgOiBOb25lLAorICAgICAgICAgICAgICAgICAnZXJybm8nIDogTm9uZSwgJ3N0cmVycm9yJyA6IE5vbmV9KSwKICAgICAgICAgICAgIChJT0Vycm9yLCAoJ2ZvbycsICdiYXInKSwKLSAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgnZm9vJywgJ2JhcicpfSksCisgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoJ2ZvbycsICdiYXInKSwgJ2ZpbGVuYW1lJyA6IE5vbmUsCisgICAgICAgICAgICAgICAgICdlcnJubycgOiAnZm9vJywgJ3N0cmVycm9yJyA6ICdiYXInfSksCiAgICAgICAgICAgICAoSU9FcnJvciwgKCdmb28nLCAnYmFyJywgJ2JheicpLAotICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKCdmb28nLCAnYmFyJyl9KSwKKyAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgnZm9vJywgJ2JhcicpLCAnZmlsZW5hbWUnIDogJ2JheicsCisgICAgICAgICAgICAgICAgICdlcnJubycgOiAnZm9vJywgJ3N0cmVycm9yJyA6ICdiYXInfSksCisgICAgICAgICAgICAoSU9FcnJvciwgKCdmb28nLCAnYmFyJywgJ2JheicsICdxdXV4JyksCisgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoJ2ZvbycsICdiYXInLCAnYmF6JywgJ3F1dXgnKX0pLAogICAgICAgICAgICAgKEVudmlyb25tZW50RXJyb3IsICgnZXJybm9TdHInLCAnc3RyRXJyb3JTdHInLCAnZmlsZW5hbWVTdHInKSwKICAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgnZXJybm9TdHInLCAnc3RyRXJyb3JTdHInKSwKICAgICAgICAgICAgICAgICAgJ3N0cmVycm9yJyA6ICdzdHJFcnJvclN0cicsICdlcnJubycgOiAnZXJybm9TdHInLApAQCAtMjQ5LDE2ICsyNTgsMTYgQEAKICAgICAgICAgICAgICAgICAgJ3ByaW50X2ZpbGVfYW5kX2xpbmUnIDogTm9uZSwgJ21zZycgOiAnbXNnU3RyJywKICAgICAgICAgICAgICAgICAgJ2ZpbGVuYW1lJyA6IE5vbmUsICdsaW5lbm8nIDogTm9uZSwgJ29mZnNldCcgOiBOb25lfSksCiAgICAgICAgICAgICAoVW5pY29kZUVycm9yLCAoKSwgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoKSx9KSwKLSAgICAgICAgICAgIChzYW1wbGVVbmljb2RlRW5jb2RlRXJyb3IsCi0gICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoJ2FzY2lpJywgdSdIZWxsbyBceGUxJywgNiwgNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KScpLAotICAgICAgICAgICAgICAgICAnZW5jb2RpbmcnIDogJ2FzY2lpJywgJ29iamVjdCcgOiB1J0hlbGxvIFx4ZTEnLAotICAgICAgICAgICAgICAgICAnc3RhcnQnIDogNiwgJ3JlYXNvbicgOiAnb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KSd9KSwKLSAgICAgICAgICAgIChzYW1wbGVVbmljb2RlRGVjb2RlRXJyb3IsCisgICAgICAgICAgICAoVW5pY29kZUVuY29kZUVycm9yLCAoJ2FzY2lpJywgdSdhJywgMCwgMSwgJ29yZGluYWwgbm90IGluIHJhbmdlJyksCisgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoJ2FzY2lpJywgdSdhJywgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3JkaW5hbCBub3QgaW4gcmFuZ2UnKSwKKyAgICAgICAgICAgICAgICAgJ2VuY29kaW5nJyA6ICdhc2NpaScsICdvYmplY3QnIDogdSdhJywKKyAgICAgICAgICAgICAgICAgJ3N0YXJ0JyA6IDAsICdyZWFzb24nIDogJ29yZGluYWwgbm90IGluIHJhbmdlJ30pLAorICAgICAgICAgICAgKFVuaWNvZGVEZWNvZGVFcnJvciwgKCdhc2NpaScsICdceGZmJywgMCwgMSwgJ29yZGluYWwgbm90IGluIHJhbmdlJyksCiAgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoJ2FzY2lpJywgJ1x4ZmYnLCAwLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29yZGluYWwgbm90IGluIHJhbmdlJyksCiAgICAgICAgICAgICAgICAgICdlbmNvZGluZycgOiAnYXNjaWknLCAnb2JqZWN0JyA6ICdceGZmJywKLSAgICAgICAgICAgICAgICAgJ3N0YXJ0JyA6IDAsICdyZWFzb24nIDogJ29yZGluYWwgbm90IGluIHJhbmdlKDEyOCknfSksCisgICAgICAgICAgICAgICAgICdzdGFydCcgOiAwLCAncmVhc29uJyA6ICdvcmRpbmFsIG5vdCBpbiByYW5nZSd9KSwKICAgICAgICAgICAgIChVbmljb2RlVHJhbnNsYXRlRXJyb3IsICh1Ilx1MzA0MiIsIDAsIDEsICJvdWNoIiksCiAgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAodSdcdTMwNDInLCAwLCAxLCAnb3VjaCcpLAogICAgICAgICAgICAgICAgICAnb2JqZWN0JyA6IHUnXHUzMDQyJywgJ3JlYXNvbicgOiAnb3VjaCcsCkBAIC0yNzQsMTggKzI4MywxNCBAQAogICAgICAgICBleGNlcHQgTmFtZUVycm9yOgogICAgICAgICAgICAgcGFzcwogCi0gICAgICAgIGZvciBhcmdzIGluIGV4Y2VwdGlvbkxpc3Q6Ci0gICAgICAgICAgICBleHBlY3RlZCA9IGFyZ3NbLTFdCisgICAgICAgIGZvciBleGMsIGFyZ3MsIGV4cGVjdGVkIGluIGV4Y2VwdGlvbkxpc3Q6CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgZXhjID0gYXJnc1swXQotICAgICAgICAgICAgICAgIGlmIGxlbihhcmdzKSA9PSAyOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBleGMKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBleGMoKmFyZ3NbMV0pCisgICAgICAgICAgICAgICAgcmFpc2UgZXhjKCphcmdzKQogICAgICAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb24sIGU6Ci0gICAgICAgICAgICAgICAgaWYgKGUgaXMgbm90IGV4YyBhbmQgICAgICMgbmVlZGVkIGZvciBzYW1wbGVVbmljb2RlIGVycm9ycwotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShlKSBpcyBub3QgZXhjKToKKyAgICAgICAgICAgICAgICBpZiB0eXBlKGUpIGlzIG5vdCBleGM6CiAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgIyBWZXJpZnkgbW9kdWxlIG5hbWUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0eXBlKGUpLl9fbW9kdWxlX18sICdleGNlcHRpb25zJykKICAgICAgICAgICAgICAgICAjIFZlcmlmeSBubyByZWYgbGVha3MgaW4gRXhjX3N0cigpCiAgICAgICAgICAgICAgICAgcyA9IHN0cihlKQogICAgICAgICAgICAgICAgIGZvciBjaGVja0FyZ05hbWUgaW4gZXhwZWN0ZWQ6CkBAIC0zMzIsNiArMzM3LDE1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgZykKIAorICAgIGRlZiB0ZXN0VW5pY29kZVN0clVzYWdlKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBib3RoIGluc3RhbmNlcyBhbmQgY2xhc3NlcyBoYXZlIGEgc3RyIGFuZCB1bmljb2RlCisgICAgICAgICMgcmVwcmVzZW50YXRpb24uCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHIoRXhjZXB0aW9uKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHVuaWNvZGUoRXhjZXB0aW9uKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN0cihFeGNlcHRpb24oJ2EnKSkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyh1bmljb2RlKEV4Y2VwdGlvbih1J2EnKSkpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChFeGNlcHRpb25UZXN0cykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mY250bC5weSBiL0xpYi90ZXN0L3Rlc3RfZmNudGwucHkKaW5kZXggNThhNTdiNS4uMmQ4MDBiMiAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvdGVzdF9mY250bC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZjbnRsLnB5CkBAIC0yNSw3ICsyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICdmcmVlYnNkMicsICdmcmVlYnNkMycsICdmcmVlYnNkNCcsICdmcmVlYnNkNScsCiAgICAgICAgICAgICAgICAgICAgICdmcmVlYnNkNicsICdmcmVlYnNkNycsCiAgICAgICAgICAgICAgICAgICAgICdic2RvczInLCAnYnNkb3MzJywgJ2JzZG9zNCcsCi0gICAgICAgICAgICAgICAgICAgICdvcGVuYnNkJywgJ29wZW5ic2QyJywgJ29wZW5ic2QzJyk6CisgICAgICAgICAgICAgICAgICAgICdvcGVuYnNkJywgJ29wZW5ic2QyJywgJ29wZW5ic2QzJywgJ29wZW5ic2Q0Jyk6CiAgICAgaWYgc3RydWN0LmNhbGNzaXplKCdsJykgPT0gODoKICAgICAgICAgb2ZmX3QgPSAnbCcKICAgICAgICAgcGlkX3QgPSAnaScKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZm9ybWF0LnB5IGIvTGliL3Rlc3QvdGVzdF9mb3JtYXQucHkKaW5kZXggYTliMzE3MC4uOGJmNWQ2ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mb3JtYXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mb3JtYXQucHkKQEAgLTIxOSw4ICsyMTksOCBAQAogICAgIHRlc3RfZXhjKHVuaWNvZGUoJ2FiYyAlXHUzMDAwJywncmF3LXVuaWNvZGUtZXNjYXBlJyksIDEsIFZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIGZvcm1hdCBjaGFyYWN0ZXIgJz8nICgweDMwMDApIGF0IGluZGV4IDUiKQogCi10ZXN0X2V4YygnJWQnLCAnMScsIFR5cGVFcnJvciwgImludCBhcmd1bWVudCByZXF1aXJlZCIpCi10ZXN0X2V4YygnJWcnLCAnMScsIFR5cGVFcnJvciwgImZsb2F0IGFyZ3VtZW50IHJlcXVpcmVkIikKK3Rlc3RfZXhjKCclZCcsICcxJywgVHlwZUVycm9yLCAiaW50IGFyZ3VtZW50IHJlcXVpcmVkLCBub3Qgc3RyIikKK3Rlc3RfZXhjKCclZycsICcxJywgVHlwZUVycm9yLCAiZmxvYXQgYXJndW1lbnQgcmVxdWlyZWQsIG5vdCBzdHIiKQogdGVzdF9leGMoJ25vIGZvcm1hdCcsICcxJywgVHlwZUVycm9yLAogICAgICAgICAgIm5vdCBhbGwgYXJndW1lbnRzIGNvbnZlcnRlZCBkdXJpbmcgc3RyaW5nIGZvcm1hdHRpbmciKQogdGVzdF9leGMoJ25vIGZvcm1hdCcsIHUnMScsIFR5cGVFcnJvciwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZnVuY3Rvb2xzLnB5IGIvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKaW5kZXggMDFkNmNkMi4uZWRjMTdmYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKQEAgLTIxMCw2ICsyMTAsMTMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLmF0dHIsICdUaGlzIGlzIGEgZGlmZmVyZW50IHRlc3QnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuZGljdF9hdHRyLCBmLmRpY3RfYXR0cikKIAorICAgIGRlZiB0ZXN0X2J1aWx0aW5fdXBkYXRlKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAjMTU3NjI0MQorICAgICAgICBkZWYgd3JhcHBlcigpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBmdW5jdG9vbHMudXBkYXRlX3dyYXBwZXIod3JhcHBlciwgbWF4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuX19uYW1lX18sICdtYXgnKQorICAgICAgICBzZWxmLmFzc2VydF8od3JhcHBlci5fX2RvY19fLnN0YXJ0c3dpdGgoJ21heCgnKSkKIAogY2xhc3MgVGVzdFdyYXBzKFRlc3RVcGRhdGVXcmFwcGVyKToKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mdXR1cmUucHkgYi9MaWIvdGVzdC90ZXN0X2Z1dHVyZS5weQppbmRleCBmNTQ2MmUyMC4uOWE1ZjgyOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mdXR1cmUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mdXR1cmUucHkKQEAgLTgyLDYgKzgyLDI3IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIGV4Y2VwdGlvbiBkaWRuJ3Qgb2NjdXIiKQogCisgICAgZGVmIHRlc3RfcGFyc2VyaGFjayhzZWxmKToKKyAgICAgICAgIyB0ZXN0IHRoYXQgdGhlIHBhcnNlci5jOjpmdXR1cmVfaGFjayBmdW5jdGlvbiB3b3JrcyBhcyBleHBlY3RlZAorICAgICAgICAjIE5vdGU6IGFsdGhvdWdoIHRoaXMgdGVzdCBtdXN0IHBhc3MsIGl0J3Mgbm90IHRlc3RpbmcgdGhlIG9yaWdpbmFsCisgICAgICAgICMgICAgICAgYnVnIGFzIG9mIDIuNiBzaW5jZSB0aGUgd2l0aCBzdGF0ZW1lbnQgaXMgbm90IG9wdGlvbmFsIGFuZAorICAgICAgICAjICAgICAgIHRoZSBwYXJzZXIgaGFjayBkaXNhYmxlZC4gSWYgYSBuZXcga2V5d29yZCBpcyBpbnRyb2R1Y2VkIGluCisgICAgICAgICMgICAgICAgMi42LCBjaGFuZ2UgdGhpcyB0byByZWZlciB0byB0aGUgbmV3IGZ1dHVyZSBpbXBvcnQuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMoImZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24sIHdpdGhfc3RhdGVtZW50OyB3aXRoID0gMCIpCisgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic3ludGF4IGVycm9yIGRpZG4ndCBvY2N1ciIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhlYygiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCAod2l0aF9zdGF0ZW1lbnQsIGRpdmlzaW9uKTsgd2l0aCA9IDAiKQorICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInN5bnRheCBlcnJvciBkaWRuJ3Qgb2NjdXIiKQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEZ1dHVyZVRlc3QpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHkgYi9MaWIvdGVzdC90ZXN0X2dlbmVyaWNwYXRoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYzQ2MDcKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X2dlbmVyaWNwYXRoLnB5CkBAIC0wLDAgKzEsMTg0IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgb3MKK2ltcG9ydCBnZW5lcmljcGF0aAorCitjbGFzcyBBbGxDb21tb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBhc3NlcnRJcyhzZWxmLCBhLCBiKToKKyAgICAgICAgc2VsZi5hc3NlcnRfKGEgaXMgYikKKworICAgIGRlZiB0ZXN0X2NvbW1vbnByZWZpeChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGdlbmVyaWNwYXRoLmNvbW1vbnByZWZpeChbXSksCisgICAgICAgICAgICAiIgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBnZW5lcmljcGF0aC5jb21tb25wcmVmaXgoWyIvaG9tZS9zd2Vuc29uL3NwYW0iLCAiL2hvbWUvc3dlbi9zcGFtIl0pLAorICAgICAgICAgICAgIi9ob21lL3N3ZW4iCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGdlbmVyaWNwYXRoLmNvbW1vbnByZWZpeChbIi9ob21lL3N3ZW4vc3BhbSIsICIvaG9tZS9zd2VuL2VnZ3MiXSksCisgICAgICAgICAgICAiL2hvbWUvc3dlbi8iCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGdlbmVyaWNwYXRoLmNvbW1vbnByZWZpeChbIi9ob21lL3N3ZW4vc3BhbSIsICIvaG9tZS9zd2VuL3NwYW0iXSksCisgICAgICAgICAgICAiL2hvbWUvc3dlbi9zcGFtIgorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9nZXRzaXplKHNlbGYpOgorICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKCJmb28iKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdlbmVyaWNwYXRoLmdldHNpemUodGVzdF9zdXBwb3J0LlRFU1RGTiksIDMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3QgZi5jbG9zZWQ6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X3RpbWUoc2VsZik6CisgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoImZvbyIpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJhYiIpCisgICAgICAgICAgICBmLndyaXRlKCJiYXIiKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKQorICAgICAgICAgICAgZCA9IGYucmVhZCgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgImZvb2JhciIpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgICAgICAgICBnZW5lcmljcGF0aC5nZXRjdGltZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKSA8PQorICAgICAgICAgICAgICAgIGdlbmVyaWNwYXRoLmdldG10aW1lKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3QgZi5jbG9zZWQ6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X2V4aXN0cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhnZW5lcmljcGF0aC5leGlzdHModGVzdF9zdXBwb3J0LlRFU1RGTiksIEZhbHNlKQorICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKCJmb28iKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGdlbmVyaWNwYXRoLmV4aXN0cyh0ZXN0X3N1cHBvcnQuVEVTVEZOKSwgVHJ1ZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlKCk6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2VuZXJpY3BhdGguZXhpc3RzKQorCisgICAgZGVmIHRlc3RfaXNkaXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZ2VuZXJpY3BhdGguaXNkaXIodGVzdF9zdXBwb3J0LlRFU1RGTiksIEZhbHNlKQorICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKCJmb28iKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGdlbmVyaWNwYXRoLmlzZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKKyAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgb3MubWtkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoZ2VuZXJpY3BhdGguaXNkaXIodGVzdF9zdXBwb3J0LlRFU1RGTiksIFRydWUpCisgICAgICAgICAgICBvcy5ybWRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgbm90IGYuY2xvc2UoKToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3Mucm1kaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZW5lcmljcGF0aC5pc2RpcikKKworICAgIGRlZiB0ZXN0X2lzZmlsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhnZW5lcmljcGF0aC5pc2ZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiksIEZhbHNlKQorICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKCJmb28iKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGdlbmVyaWNwYXRoLmlzZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKSwgVHJ1ZSkKKyAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgb3MubWtkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoZ2VuZXJpY3BhdGguaXNmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKKyAgICAgICAgICAgIG9zLnJtZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3QgZi5jbG9zZSgpOgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5ybWRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdlbmVyaWNwYXRoLmlzZGlyKQorCisgICAgICAgIGRlZiB0ZXN0X3NhbWVmaWxlKHNlbGYpOgorICAgICAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiArICIxIiwgIndiIikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmLndyaXRlKCJmb28iKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoCisgICAgICAgICAgICAgICAgICAgIGdlbmVyaWNwYXRoLnNhbWVmaWxlKAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTiArICIxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIKKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgVHJ1ZQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAjIElmIHdlIGRvbid0IGhhdmUgbGlua3MsIGFzc3VtZSB0aGF0IG9zLnN0YXQgZG9lc24ndCByZXR1cm4gcmVzb25hYmxlCisgICAgICAgICAgICAgICAgIyBpbm9kZSBpbmZvcm1hdGlvbiBhbmQgdGh1cywgdGhhdCBzYW1lZmlsZSgpIGRvZXNuJ3Qgd29yaworICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICJzeW1saW5rIik6CisgICAgICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsoCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIgorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljcGF0aC5zYW1lZmlsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgICAgICBUcnVlCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIpCisgICAgICAgICAgICAgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIsICJ3YiIpCisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoImJhciIpCisgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKAorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY3BhdGguc2FtZWZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTiArICIxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjIiCisgICAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpZiBub3QgZi5jbG9zZSgpOgorICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIpCisgICAgICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2VuZXJpY3BhdGguc2FtZWZpbGUpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEFsbENvbW1vblRlc3QpCisKK2lmIF9fbmFtZV9fPT0iX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dsb2JhbC5weSBiL0xpYi90ZXN0L3Rlc3RfZ2xvYmFsLnB5CmluZGV4IDRjYzk1M2MuLjIyZTRiMjUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2xvYmFsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ2xvYmFsLnB5CkBAIC0xLDUxICsxLDUxIEBACiAiIiJWZXJpZnkgdGhhdCB3YXJuaW5ncyBhcmUgaXNzdWVkIGZvciBnbG9iYWwgc3RhdGVtZW50cyBmb2xsb3dpbmcgdXNlLiIiIgogCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBjaGVja19zeW50YXgKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgY2hlY2tfc3ludGF4X2Vycm9yCitpbXBvcnQgdW5pdHRlc3QKIAogaW1wb3J0IHdhcm5pbmdzCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiZXJyb3IiLCBtb2R1bGU9Ijx0ZXN0IHN0cmluZz4iKQogCi13YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiZXJyb3IiLCBtb2R1bGU9Ijx0ZXN0IGNvZGU+IikKK2NsYXNzIEdsb2JhbFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotZGVmIGNvbXBpbGVfYW5kX2NoZWNrKHRleHQsIHNob3VsZF9mYWlsPTEpOgotICAgIHRyeToKLSAgICAgICAgY29tcGlsZSh0ZXh0LCAiPHRlc3QgY29kZT4iLCAiZXhlYyIpCi0gICAgZXhjZXB0IFN5bnRheEVycm9yLCBtc2c6Ci0gICAgICAgIGlmIHNob3VsZF9mYWlsOgotICAgICAgICAgICAgcHJpbnQgImdvdCBTeW50YXhFcnJvciBhcyBleHBlY3RlZCIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50ICJyYWlzZWQgdW5leHBlY3RlZCBTeW50YXhFcnJvcjoiLCB0ZXh0Ci0gICAgZWxzZToKLSAgICAgICAgaWYgc2hvdWxkX2ZhaWw6Ci0gICAgICAgICAgICBwcmludCAic2hvdWxkIGhhdmUgcmFpc2VkIFN5bnRheEVycm9yOiIsIHRleHQKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50ICJhcyBleHBlY3RlZCwgbm8gU3ludGF4RXJyb3IiCi0KLXByb2dfdGV4dF8xID0gIiIiCisgICAgZGVmIHRlc3QxKHNlbGYpOgorICAgICAgICBwcm9nX3RleHRfMSA9ICIiIlwKIGRlZiB3cm9uZzEoKToKICAgICBhID0gMQogICAgIGIgPSAyCiAgICAgZ2xvYmFsIGEKICAgICBnbG9iYWwgYgogIiIiCi1jb21waWxlX2FuZF9jaGVjayhwcm9nX3RleHRfMSkKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsIHByb2dfdGV4dF8xKQogCi1wcm9nX3RleHRfMiA9ICIiIgorICAgIGRlZiB0ZXN0MihzZWxmKToKKyAgICAgICAgcHJvZ190ZXh0XzIgPSAiIiJcCiBkZWYgd3JvbmcyKCk6CiAgICAgcHJpbnQgeAogICAgIGdsb2JhbCB4CiAiIiIKLWNvbXBpbGVfYW5kX2NoZWNrKHByb2dfdGV4dF8yKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgcHJvZ190ZXh0XzIpCiAKLXByb2dfdGV4dF8zID0gIiIiCisgICAgZGVmIHRlc3QzKHNlbGYpOgorICAgICAgICBwcm9nX3RleHRfMyA9ICIiIlwKIGRlZiB3cm9uZzMoKToKICAgICBwcmludCB4CiAgICAgeCA9IDIKICAgICBnbG9iYWwgeAogIiIiCi1jb21waWxlX2FuZF9jaGVjayhwcm9nX3RleHRfMykKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsIHByb2dfdGV4dF8zKQogCi1wcm9nX3RleHRfNCA9ICIiIgorICAgIGRlZiB0ZXN0NChzZWxmKToKKyAgICAgICAgcHJvZ190ZXh0XzQgPSAiIiJcCiBnbG9iYWwgeAogeCA9IDIKICIiIgotY29tcGlsZV9hbmRfY2hlY2socHJvZ190ZXh0XzQsIDApCisgICAgICAgICMgdGhpcyBzaG91bGQgd29yaworICAgICAgICBjb21waWxlKHByb2dfdGV4dF80LCAiPHRlc3Qgc3RyaW5nPiIsICJleGVjIikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KEdsb2JhbFRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkgYi9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkKaW5kZXggY2E4NGM1Ni4uZjRhMDQ3OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weQpAQCAtOCw4MzAgKzgsODk3IEBACiAjIHJlZ3Jlc3Npb24gdGVzdCwgdGhlIGZpbHRlcndhcm5pbmdzKCkgY2FsbCBoYXMgYmVlbiBhZGRlZCB0bwogIyByZWdydGVzdC5weS4KIAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdEZhaWxlZCwgdmVyaWZ5LCB2ZXJlcSwgY2hlY2tfc3ludGF4Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGNoZWNrX3N5bnRheF9lcnJvcgoraW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgc3lzCisjIHRlc3RpbmcgaW1wb3J0ICoKK2Zyb20gc3lzIGltcG9ydCAqCiAKLXByaW50ICcxLiBQYXJzZXInCitjbGFzcyBUb2tlblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotcHJpbnQgJzEuMSBUb2tlbnMnCisgICAgZGVmIHRlc3RCYWNrc2xhc2goc2VsZik6CisgICAgICAgICMgQmFja3NsYXNoIG1lYW5zIGxpbmUgY29udGludWF0aW9uOgorICAgICAgICB4ID0gMSBcCisgICAgICAgICsgMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LCAyLCAnYmFja3NsYXNoIGZvciBsaW5lIGNvbnRpbnVhdGlvbicpCiAKLXByaW50ICcxLjEuMSBCYWNrc2xhc2hlcycKKyAgICAgICAgIyBCYWNrc2xhc2ggZG9lcyBub3QgbWVhbnMgY29udGludWF0aW9uIGluIGNvbW1lbnRzIDpcCisgICAgICAgIHggPSAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIDAsICdiYWNrc2xhc2ggZW5kaW5nIGNvbW1lbnQnKQogCi0jIEJhY2tzbGFzaCBtZWFucyBsaW5lIGNvbnRpbnVhdGlvbjoKLXggPSAxIFwKLSsgMQotaWYgeCAhPSAyOiByYWlzZSBUZXN0RmFpbGVkLCAnYmFja3NsYXNoIGZvciBsaW5lIGNvbnRpbnVhdGlvbicKKyAgICBkZWYgdGVzdFBsYWluSW50ZWdlcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDB4ZmYsIDI1NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMDM3NywgMjU1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygyMTQ3NDgzNjQ3LCAwMTc3Nzc3Nzc3NzcpCisgICAgICAgIGZyb20gc3lzIGltcG9ydCBtYXhpbnQKKyAgICAgICAgaWYgbWF4aW50ID09IDIxNDc0ODM2NDc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscygtMjE0NzQ4MzY0Ny0xLCAtMDIwMDAwMDAwMDAwKQorICAgICAgICAgICAgIyBYWFggLTIxNDc0ODM2NDgKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygwMzc3Nzc3Nzc3NzcgPiAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDB4ZmZmZmZmZmYgPiAwKQorICAgICAgICAgICAgZm9yIHMgaW4gJzIxNDc0ODM2NDgnLCAnMDQwMDAwMDAwMDAwJywgJzB4MTAwMDAwMDAwJzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHggPSBldmFsKHMpCisgICAgICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiT3ZlcmZsb3dFcnJvciBvbiBodWdlIGludGVnZXIgbGl0ZXJhbCAlciIgJSBzKQorICAgICAgICBlbGlmIG1heGludCA9PSA5MjIzMzcyMDM2ODU0Nzc1ODA3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoLTkyMjMzNzIwMzY4NTQ3NzU4MDctMSwgLTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDAxNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3ID4gMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygweGZmZmZmZmZmZmZmZmZmZmYgPiAwKQorICAgICAgICAgICAgZm9yIHMgaW4gJzkyMjMzNzIwMzY4NTQ3NzU4MDgnLCAnMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLCBcCisgICAgICAgICAgICAgICAgICAgICAnMHgxMDAwMDAwMDAwMDAwMDAwMCc6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB4ID0gZXZhbChzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk92ZXJmbG93RXJyb3Igb24gaHVnZSBpbnRlZ2VyIGxpdGVyYWwgJXIiICUgcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnV2VpcmQgbWF4aW50IHZhbHVlICVyJyAlIG1heGludCkKIAotIyBCYWNrc2xhc2ggZG9lcyBub3QgbWVhbnMgY29udGludWF0aW9uIGluIGNvbW1lbnRzIDpcCi14ID0gMAotaWYgeCAhPSAwOiByYWlzZSBUZXN0RmFpbGVkLCAnYmFja3NsYXNoIGVuZGluZyBjb21tZW50JworICAgIGRlZiB0ZXN0TG9uZ0ludGVnZXJzKHNlbGYpOgorICAgICAgICB4ID0gMEwKKyAgICAgICAgeCA9IDBsCisgICAgICAgIHggPSAweGZmZmZmZmZmZmZmZmZmZmZMCisgICAgICAgIHggPSAweGZmZmZmZmZmZmZmZmZmZmZsCisgICAgICAgIHggPSAwNzc3Nzc3Nzc3Nzc3Nzc3NzdMCisgICAgICAgIHggPSAwNzc3Nzc3Nzc3Nzc3Nzc3NzdsCisgICAgICAgIHggPSAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBMCisgICAgICAgIHggPSAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBsCiAKLXByaW50ICcxLjEuMiBOdW1lcmljIGxpdGVyYWxzJworICAgIGRlZiB0ZXN0RmxvYXRzKHNlbGYpOgorICAgICAgICB4ID0gMy4xNAorICAgICAgICB4ID0gMzE0LgorICAgICAgICB4ID0gMC4zMTQKKyAgICAgICAgIyBYWFggeCA9IDAwMC4zMTQKKyAgICAgICAgeCA9IC4zMTQKKyAgICAgICAgeCA9IDNlMTQKKyAgICAgICAgeCA9IDNFMTQKKyAgICAgICAgeCA9IDNlLTE0CisgICAgICAgIHggPSAzZSsxNAorICAgICAgICB4ID0gMy5lMTQKKyAgICAgICAgeCA9IC4zZTE0CisgICAgICAgIHggPSAzLjFlNAogCi1wcmludCAnMS4xLjIuMSBQbGFpbiBpbnRlZ2VycycKLWlmIDB4ZmYgIT0gMjU1OiByYWlzZSBUZXN0RmFpbGVkLCAnaGV4IGludCcKLWlmIDAzNzcgIT0gMjU1OiByYWlzZSBUZXN0RmFpbGVkLCAnb2N0YWwgaW50JwotaWYgIDIxNDc0ODM2NDcgICAhPSAwMTc3Nzc3Nzc3Nzc6IHJhaXNlIFRlc3RGYWlsZWQsICdsYXJnZSBwb3NpdGl2ZSBpbnQnCi10cnk6Ci0gICAgZnJvbSBzeXMgaW1wb3J0IG1heGludAotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIG1heGludCA9IDIxNDc0ODM2NDcKLWlmIG1heGludCA9PSAyMTQ3NDgzNjQ3OgotICAgICMgVGhlIGZvbGxvd2luZyB0ZXN0IHdpbGwgc3RhcnQgdG8gZmFpbCBpbiBQeXRob24gMi40OwotICAgICMgY2hhbmdlIHRoZSAwMjAwMDAwMDAwMDAgdG8gLTAyMDAwMDAwMDAwMAotICAgIGlmIC0yMTQ3NDgzNjQ3LTEgIT0gLTAyMDAwMDAwMDAwMDogcmFpc2UgVGVzdEZhaWxlZCwgJ21heCBuZWdhdGl2ZSBpbnQnCi0gICAgIyBYWFggLTIxNDc0ODM2NDgKLSAgICBpZiAwMzc3Nzc3Nzc3NzcgPCAwOiByYWlzZSBUZXN0RmFpbGVkLCAnbGFyZ2Ugb2N0JwotICAgIGlmIDB4ZmZmZmZmZmYgPCAwOiByYWlzZSBUZXN0RmFpbGVkLCAnbGFyZ2UgaGV4JwotICAgIGZvciBzIGluICcyMTQ3NDgzNjQ4JywgJzA0MDAwMDAwMDAwMCcsICcweDEwMDAwMDAwMCc6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHggPSBldmFsKHMpCi0gICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgotICAgICAgICAgICAgcHJpbnQgIk92ZXJmbG93RXJyb3Igb24gaHVnZSBpbnRlZ2VyIGxpdGVyYWwgIiArIHJlcHIocykKLWVsaWYgZXZhbCgnbWF4aW50ID09IDkyMjMzNzIwMzY4NTQ3NzU4MDcnKToKLSAgICBpZiBldmFsKCctOTIyMzM3MjAzNjg1NDc3NTgwNy0xICE9IC0wMTAwMDAwMDAwMDAwMDAwMDAwMDAwMCcpOgotICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAnbWF4IG5lZ2F0aXZlIGludCcKLSAgICBpZiBldmFsKCcwMTc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NycpIDwgMDogcmFpc2UgVGVzdEZhaWxlZCwgJ2xhcmdlIG9jdCcKLSAgICBpZiBldmFsKCcweGZmZmZmZmZmZmZmZmZmZmYnKSA8IDA6IHJhaXNlIFRlc3RGYWlsZWQsICdsYXJnZSBoZXgnCi0gICAgZm9yIHMgaW4gJzkyMjMzNzIwMzY4NTQ3NzU4MDgnLCAnMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLCBcCi0gICAgICAgICAgICAgJzB4MTAwMDAwMDAwMDAwMDAwMDAnOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB4ID0gZXZhbChzKQotICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKLSAgICAgICAgICAgIHByaW50ICJPdmVyZmxvd0Vycm9yIG9uIGh1Z2UgaW50ZWdlciBsaXRlcmFsICIgKyByZXByKHMpCi1lbHNlOgotICAgIHByaW50ICdXZWlyZCBtYXhpbnQgdmFsdWUnLCBtYXhpbnQKLQotcHJpbnQgJzEuMS4yLjIgTG9uZyBpbnRlZ2VycycKLXggPSAwTAoteCA9IDBsCi14ID0gMHhmZmZmZmZmZmZmZmZmZmZmTAoteCA9IDB4ZmZmZmZmZmZmZmZmZmZmZmwKLXggPSAwNzc3Nzc3Nzc3Nzc3Nzc3NzdMCi14ID0gMDc3Nzc3Nzc3Nzc3Nzc3Nzc3bAoteCA9IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MEwKLXggPSAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBsCi0KLXByaW50ICcxLjEuMi4zIEZsb2F0aW5nIHBvaW50JwoteCA9IDMuMTQKLXggPSAzMTQuCi14ID0gMC4zMTQKLSMgWFhYIHggPSAwMDAuMzE0Ci14ID0gLjMxNAoteCA9IDNlMTQKLXggPSAzRTE0Ci14ID0gM2UtMTQKLXggPSAzZSsxNAoteCA9IDMuZTE0Ci14ID0gLjNlMTQKLXggPSAzLjFlNAotCi1wcmludCAnMS4xLjMgU3RyaW5nIGxpdGVyYWxzJwotCi14ID0gJyc7IHkgPSAiIjsgdmVyaWZ5KGxlbih4KSA9PSAwIGFuZCB4ID09IHkpCi14ID0gJ1wnJzsgeSA9ICInIjsgdmVyaWZ5KGxlbih4KSA9PSAxIGFuZCB4ID09IHkgYW5kIG9yZCh4KSA9PSAzOSkKLXggPSAnIic7IHkgPSAiXCIiOyB2ZXJpZnkobGVuKHgpID09IDEgYW5kIHggPT0geSBhbmQgb3JkKHgpID09IDM0KQoteCA9ICJkb2Vzbid0IFwic2hyaW5rXCIgZG9lcyBpdCIKLXkgPSAnZG9lc25cJ3QgInNocmluayIgZG9lcyBpdCcKLXZlcmlmeShsZW4oeCkgPT0gMjQgYW5kIHggPT0geSkKLXggPSAiZG9lcyBcInNocmlua1wiIGRvZXNuJ3QgaXQiCi15ID0gJ2RvZXMgInNocmluayIgZG9lc25cJ3QgaXQnCi12ZXJpZnkobGVuKHgpID09IDI0IGFuZCB4ID09IHkpCi14ID0gIiIiCisgICAgZGVmIHRlc3RTdHJpbmdMaXRlcmFscyhzZWxmKToKKyAgICAgICAgeCA9ICcnOyB5ID0gIiI7IHNlbGYuYXNzZXJ0XyhsZW4oeCkgPT0gMCBhbmQgeCA9PSB5KQorICAgICAgICB4ID0gJ1wnJzsgeSA9ICInIjsgc2VsZi5hc3NlcnRfKGxlbih4KSA9PSAxIGFuZCB4ID09IHkgYW5kIG9yZCh4KSA9PSAzOSkKKyAgICAgICAgeCA9ICciJzsgeSA9ICJcIiI7IHNlbGYuYXNzZXJ0XyhsZW4oeCkgPT0gMSBhbmQgeCA9PSB5IGFuZCBvcmQoeCkgPT0gMzQpCisgICAgICAgIHggPSAiZG9lc24ndCBcInNocmlua1wiIGRvZXMgaXQiCisgICAgICAgIHkgPSAnZG9lc25cJ3QgInNocmluayIgZG9lcyBpdCcKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbih4KSA9PSAyNCBhbmQgeCA9PSB5KQorICAgICAgICB4ID0gImRvZXMgXCJzaHJpbmtcIiBkb2Vzbid0IGl0IgorICAgICAgICB5ID0gJ2RvZXMgInNocmluayIgZG9lc25cJ3QgaXQnCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oeCkgPT0gMjQgYW5kIHggPT0geSkKKyAgICAgICAgeCA9ICIiIgogVGhlICJxdWljayIKIGJyb3duIGZveAoganVtcHMgb3ZlcgogdGhlICdsYXp5JyBkb2cuCiAiIiIKLXkgPSAnXG5UaGUgInF1aWNrIlxuYnJvd24gZm94XG5qdW1wcyBvdmVyXG50aGUgXCdsYXp5XCcgZG9nLlxuJwotdmVyaWZ5KHggPT0geSkKLXkgPSAnJycKKyAgICAgICAgeSA9ICdcblRoZSAicXVpY2siXG5icm93biBmb3hcbmp1bXBzIG92ZXJcbnRoZSBcJ2xhenlcJyBkb2cuXG4nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIHkpCisgICAgICAgIHkgPSAnJycKIFRoZSAicXVpY2siCiBicm93biBmb3gKIGp1bXBzIG92ZXIKIHRoZSAnbGF6eScgZG9nLgotJycnOyB2ZXJpZnkoeCA9PSB5KQoteSA9ICJcblwKKycnJworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LCB5KQorICAgICAgICB5ID0gIlxuXAogVGhlIFwicXVpY2tcIlxuXAogYnJvd24gZm94XG5cCiBqdW1wcyBvdmVyXG5cCiB0aGUgJ2xhenknIGRvZy5cblwKLSI7IHZlcmlmeSh4ID09IHkpCi15ID0gJ1xuXAorIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LCB5KQorICAgICAgICB5ID0gJ1xuXAogVGhlIFwicXVpY2tcIlxuXAogYnJvd24gZm94XG5cCiBqdW1wcyBvdmVyXG5cCiB0aGUgXCdsYXp5XCcgZG9nLlxuXAotJzsgdmVyaWZ5KHggPT0geSkKKycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgeSkKKworICAgIGRlZiB0ZXN0RWxsaXBzaXMoc2VsZik6CisgICAgICAgIHggPSAuLi4KKyAgICAgICAgc2VsZi5hc3NlcnRfKHggaXMgRWxsaXBzaXMpCisKK2NsYXNzIEdyYW1tYXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIHNpbmdsZV9pbnB1dDogTkVXTElORSB8IHNpbXBsZV9zdG10IHwgY29tcG91bmRfc3RtdCBORVdMSU5FCisgICAgIyBYWFggY2FuJ3QgdGVzdCBpbiBhIHNjcmlwdCAtLSB0aGlzIHJ1bGUgaXMgb25seSB1c2VkIHdoZW4gaW50ZXJhY3RpdmUKKworICAgICMgZmlsZV9pbnB1dDogKE5FV0xJTkUgfCBzdG10KSogRU5ETUFSS0VSCisgICAgIyBCZWluZyB0ZXN0ZWQgYXMgdGhpcyB2ZXJ5IG1vbWVudCB0aGlzIHZlcnkgbW9kdWxlCisKKyAgICAjIGV4cHJfaW5wdXQ6IHRlc3RsaXN0IE5FV0xJTkUKKyAgICAjIFhYWCBIYXJkIHRvIHRlc3QgLS0gdXNlZCBvbmx5IGluIGNhbGxzIHRvIGlucHV0KCkKKworICAgIGRlZiB0ZXN0RXZhbElucHV0KHNlbGYpOgorICAgICAgICAjIHRlc3RsaXN0IEVORE1BUktFUgorICAgICAgICB4ID0gZXZhbCgnMSwgMCBvciAxJykKKworICAgIGRlZiB0ZXN0RnVuY2RlZihzZWxmKToKKyAgICAgICAgIyMjICdkZWYnIE5BTUUgcGFyYW1ldGVycyAnOicgc3VpdGUKKyAgICAgICAgIyMjIHBhcmFtZXRlcnM6ICcoJyBbdmFyYXJnc2xpc3RdICcpJworICAgICAgICAjIyMgdmFyYXJnc2xpc3Q6IChmcGRlZiBbJz0nIHRlc3RdICcsJykqCisgICAgICAgICMjIyAgICAgICAgICAgKCcqJyAoTkFNRXwnLCcgZnBkZWYgWyc9JyB0ZXN0XSkgWycsJyAoJyoqJ3wnKicgJyonKSBOQU1FXQorICAgICAgICAjIyMgICAgICAgICAgICB8ICgnKionfCcqJyAnKicpIE5BTUUpCisgICAgICAgICMjIyAgICAgICAgICAgIHwgZnBkZWYgWyc9JyB0ZXN0XSAoJywnIGZwZGVmIFsnPScgdGVzdF0pKiBbJywnXQorICAgICAgICAjIyMgZnBkZWY6IE5BTUUgfCAnKCcgZnBsaXN0ICcpJworICAgICAgICAjIyMgZnBsaXN0OiBmcGRlZiAoJywnIGZwZGVmKSogWycsJ10KKyAgICAgICAgIyMjIGFyZ2xpc3Q6IChhcmd1bWVudCAnLCcpKiAoYXJndW1lbnQgfCAqJyB0ZXN0IFsnLCcgJyoqJyB0ZXN0XSB8ICcqKicgdGVzdCkKKyAgICAgICAgIyMjIGFyZ3VtZW50OiBbdGVzdCAnPSddIHRlc3QgICAjIFJlYWxseSBba2V5d29yZCAnPSddIHRlc3QKKyAgICAgICAgZGVmIGYxKCk6IHBhc3MKKyAgICAgICAgZjEoKQorICAgICAgICBmMSgqKCkpCisgICAgICAgIGYxKCooKSwgKip7fSkKKyAgICAgICAgZGVmIGYyKG9uZV9hcmd1bWVudCk6IHBhc3MKKyAgICAgICAgZGVmIGYzKHR3bywgYXJndW1lbnRzKTogcGFzcworICAgICAgICBkZWYgZjQodHdvLCAoY29tcG91bmQsIChhcmd1bWVudCwgbGlzdCkpKTogcGFzcworICAgICAgICBkZWYgZjUoKGNvbXBvdW5kLCBmaXJzdCksIHR3byk6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZjIuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLCAoJ29uZV9hcmd1bWVudCcsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZjMuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLCAoJ3R3bycsICdhcmd1bWVudHMnKSkKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGY0LmZ1bmNfY29kZS5jb192YXJuYW1lcywKKyAgICAgICAgICAgICAgICAgICAoJ3R3bycsICcoY29tcG91bmQsIChhcmd1bWVudCwgbGlzdCkpJywgJ2NvbXBvdW5kJywgJ2FyZ3VtZW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpc3QnLCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmNS5mdW5jX2NvZGUuY29fdmFybmFtZXMsCisgICAgICAgICAgICAgICAgICAgKCcoY29tcG91bmQsIGZpcnN0KScsICd0d28nLCAnY29tcG91bmQnLCAnZmlyc3QnKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGY0LmZ1bmNfY29kZS5jb192YXJuYW1lcywKKyAgICAgICAgICAgICAgICAgICgndHdvJywgJy4xJywgJ2NvbXBvdW5kJywgJ2FyZ3VtZW50JywgICdsaXN0JykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmNS5mdW5jX2NvZGUuY29fdmFybmFtZXMsCisgICAgICAgICAgICAgICAgICAoJy4wJywgJ3R3bycsICdjb21wb3VuZCcsICdmaXJzdCcpKQorICAgICAgICBkZWYgYTEob25lX2FyZywpOiBwYXNzCisgICAgICAgIGRlZiBhMih0d28sIGFyZ3MsKTogcGFzcworICAgICAgICBkZWYgdjAoKnJlc3QpOiBwYXNzCisgICAgICAgIGRlZiB2MShhLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZGVmIHYyKGEsIGIsICpyZXN0KTogcGFzcworICAgICAgICBkZWYgdjMoYSwgKGIsIGMpLCAqcmVzdCk6IHJldHVybiBhLCBiLCBjLCByZXN0CisKKyAgICAgICAgZjEoKQorICAgICAgICBmMigxKQorICAgICAgICBmMigxLCkKKyAgICAgICAgZjMoMSwgMikKKyAgICAgICAgZjMoMSwgMiwpCisgICAgICAgIGY0KDEsICgyLCAoMywgNCkpKQorICAgICAgICB2MCgpCisgICAgICAgIHYwKDEpCisgICAgICAgIHYwKDEsKQorICAgICAgICB2MCgxLDIpCisgICAgICAgIHYwKDEsMiwzLDQsNSw2LDcsOCw5LDApCisgICAgICAgIHYxKDEpCisgICAgICAgIHYxKDEsKQorICAgICAgICB2MSgxLDIpCisgICAgICAgIHYxKDEsMiwzKQorICAgICAgICB2MSgxLDIsMyw0LDUsNiw3LDgsOSwwKQorICAgICAgICB2MigxLDIpCisgICAgICAgIHYyKDEsMiwzKQorICAgICAgICB2MigxLDIsMyw0KQorICAgICAgICB2MigxLDIsMyw0LDUsNiw3LDgsOSwwKQorICAgICAgICB2MygxLCgyLDMpKQorICAgICAgICB2MygxLCgyLDMpLDQpCisgICAgICAgIHYzKDEsKDIsMyksNCw1LDYsNyw4LDksMCkKKworICAgICAgICAjIGNldmFsIHVucGFja3MgdGhlIGZvcm1hbCBhcmd1bWVudHMgaW50byB0aGUgZmlyc3QgYXJnY291bnQgbmFtZXM7CisgICAgICAgICMgdGh1cywgdGhlIG5hbWVzIG5lc3RlZCBpbnNpZGUgdHVwbGVzIG11c3QgYXBwZWFyIGFmdGVyIHRoZXNlIG5hbWVzLgorICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModjMuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLCAoJ2EnLCAnKGIsIGMpJywgJ3Jlc3QnLCAnYicsICdjJykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh2My5mdW5jX2NvZGUuY29fdmFybmFtZXMsICgnYScsICcuMScsICdyZXN0JywgJ2InLCAnYycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh2MygxLCAoMiwgMyksIDQpLCAoMSwgMiwgMywgKDQsKSkpCisgICAgICAgIGRlZiBkMDEoYT0xKTogcGFzcworICAgICAgICBkMDEoKQorICAgICAgICBkMDEoMSkKKyAgICAgICAgZDAxKCooMSwpKQorICAgICAgICBkMDEoKip7J2EnOjJ9KQorICAgICAgICBkZWYgZDExKGEsIGI9MSk6IHBhc3MKKyAgICAgICAgZDExKDEpCisgICAgICAgIGQxMSgxLCAyKQorICAgICAgICBkMTEoMSwgKip7J2InOjJ9KQorICAgICAgICBkZWYgZDIxKGEsIGIsIGM9MSk6IHBhc3MKKyAgICAgICAgZDIxKDEsIDIpCisgICAgICAgIGQyMSgxLCAyLCAzKQorICAgICAgICBkMjEoKigxLCAyLCAzKSkKKyAgICAgICAgZDIxKDEsICooMiwgMykpCisgICAgICAgIGQyMSgxLCAyLCAqKDMsKSkKKyAgICAgICAgZDIxKDEsIDIsICoqeydjJzozfSkKKyAgICAgICAgZGVmIGQwMihhPTEsIGI9Mik6IHBhc3MKKyAgICAgICAgZDAyKCkKKyAgICAgICAgZDAyKDEpCisgICAgICAgIGQwMigxLCAyKQorICAgICAgICBkMDIoKigxLCAyKSkKKyAgICAgICAgZDAyKDEsICooMiwpKQorICAgICAgICBkMDIoMSwgKip7J2InOjJ9KQorICAgICAgICBkMDIoKip7J2EnOiAxLCAnYic6IDJ9KQorICAgICAgICBkZWYgZDEyKGEsIGI9MSwgYz0yKTogcGFzcworICAgICAgICBkMTIoMSkKKyAgICAgICAgZDEyKDEsIDIpCisgICAgICAgIGQxMigxLCAyLCAzKQorICAgICAgICBkZWYgZDIyKGEsIGIsIGM9MSwgZD0yKTogcGFzcworICAgICAgICBkMjIoMSwgMikKKyAgICAgICAgZDIyKDEsIDIsIDMpCisgICAgICAgIGQyMigxLCAyLCAzLCA0KQorICAgICAgICBkZWYgZDAxdihhPTEsICpyZXN0KTogcGFzcworICAgICAgICBkMDF2KCkKKyAgICAgICAgZDAxdigxKQorICAgICAgICBkMDF2KDEsIDIpCisgICAgICAgIGQwMXYoKigxLCAyLCAzLCA0KSkKKyAgICAgICAgZDAxdigqKDEsKSkKKyAgICAgICAgZDAxdigqKnsnYSc6Mn0pCisgICAgICAgIGRlZiBkMTF2KGEsIGI9MSwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQxMXYoMSkKKyAgICAgICAgZDExdigxLCAyKQorICAgICAgICBkMTF2KDEsIDIsIDMpCisgICAgICAgIGRlZiBkMjF2KGEsIGIsIGM9MSwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQyMXYoMSwgMikKKyAgICAgICAgZDIxdigxLCAyLCAzKQorICAgICAgICBkMjF2KDEsIDIsIDMsIDQpCisgICAgICAgIGQyMXYoKigxLCAyLCAzLCA0KSkKKyAgICAgICAgZDIxdigxLCAyLCAqKnsnYyc6IDN9KQorICAgICAgICBkZWYgZDAydihhPTEsIGI9MiwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQwMnYoKQorICAgICAgICBkMDJ2KDEpCisgICAgICAgIGQwMnYoMSwgMikKKyAgICAgICAgZDAydigxLCAyLCAzKQorICAgICAgICBkMDJ2KDEsICooMiwgMywgNCkpCisgICAgICAgIGQwMnYoKip7J2EnOiAxLCAnYic6IDJ9KQorICAgICAgICBkZWYgZDEydihhLCBiPTEsIGM9MiwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQxMnYoMSkKKyAgICAgICAgZDEydigxLCAyKQorICAgICAgICBkMTJ2KDEsIDIsIDMpCisgICAgICAgIGQxMnYoMSwgMiwgMywgNCkKKyAgICAgICAgZDEydigqKDEsIDIsIDMsIDQpKQorICAgICAgICBkMTJ2KDEsIDIsICooMywgNCwgNSkpCisgICAgICAgIGQxMnYoMSwgKigyLCksICoqeydjJzogM30pCisgICAgICAgIGRlZiBkMjJ2KGEsIGIsIGM9MSwgZD0yLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZDIydigxLCAyKQorICAgICAgICBkMjJ2KDEsIDIsIDMpCisgICAgICAgIGQyMnYoMSwgMiwgMywgNCkKKyAgICAgICAgZDIydigxLCAyLCAzLCA0LCA1KQorICAgICAgICBkMjJ2KCooMSwgMiwgMywgNCkpCisgICAgICAgIGQyMnYoMSwgMiwgKigzLCA0LCA1KSkKKyAgICAgICAgZDIydigxLCAqKDIsIDMpLCAqKnsnZCc6IDR9KQorICAgICAgICBkZWYgZDMxdigoeCkpOiBwYXNzCisgICAgICAgIGQzMXYoMSkKKyAgICAgICAgZGVmIGQzMnYoKHgsKSk6IHBhc3MKKyAgICAgICAgZDMydigoMSwpKQorICAgICAgICAjIGtleXdvcmQgb25seSBhcmd1bWVudCB0ZXN0cworICAgICAgICBkZWYgcG9zMGtleTEoKiwga2V5KTogcmV0dXJuIGtleQorICAgICAgICBwb3Mwa2V5MShrZXk9MTAwKQorICAgICAgICBkZWYgcG9zMmtleTIocDEsIHAyLCAqLCBrMSwgazI9MTAwKTogcmV0dXJuIHAxLHAyLGsxLGsyCisgICAgICAgIHBvczJrZXkyKDEsIDIsIGsxPTEwMCkKKyAgICAgICAgcG9zMmtleTIoMSwgMiwgazE9MTAwLCBrMj0yMDApCisgICAgICAgIHBvczJrZXkyKDEsIDIsIGsyPTEwMCwgazE9MjAwKQorICAgICAgICBkZWYgcG9zMmtleTJkaWN0KHAxLCBwMiwgKiwgazE9MTAwLCBrMiwgKiprd2FyZyk6IHJldHVybiBwMSxwMixrMSxrMixrd2FyZworICAgICAgICBwb3Mya2V5MmRpY3QoMSwyLGsyPTEwMCx0b2t3YXJnMT0xMDAsdG9rd2FyZzI9MjAwKQorICAgICAgICBwb3Mya2V5MmRpY3QoMSwyLHRva3dhcmcxPTEwMCx0b2t3YXJnMj0yMDAsIGsyPTEwMCkKKworICAgIGRlZiB0ZXN0TGFtYmRlZihzZWxmKToKKyAgICAgICAgIyMjIGxhbWJkZWY6ICdsYW1iZGEnIFt2YXJhcmdzbGlzdF0gJzonIHRlc3QKKyAgICAgICAgbDEgPSBsYW1iZGEgOiAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGwxKCksIDApCisgICAgICAgIGwyID0gbGFtYmRhIDogYVtkXSAjIFhYWCBqdXN0IHRlc3RpbmcgdGhlIGV4cHJlc3Npb24KKyAgICAgICAgbDMgPSBsYW1iZGEgOiBbMiA8IHggZm9yIHggaW4gWy0xLCAzLCAwTF1dCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGwzKCksIFswLCAxLCAwXSkKKyAgICAgICAgbDQgPSBsYW1iZGEgeCA9IGxhbWJkYSB5ID0gbGFtYmRhIHo9MSA6IHogOiB5KCkgOiB4KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobDQoKSwgMSkKKyAgICAgICAgbDUgPSBsYW1iZGEgeCwgeSwgej0yOiB4ICsgeSArIHoKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobDUoMSwgMiksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGw1KDEsIDIsIDMpLCA2KQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImxhbWJkYSB4OiB4ID0gMiIpCisgICAgICAgIGw2ID0gbGFtYmRhIHgsIHksICosIGs9MjA6IHgreStrCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGw2KDEsMiksIDErMisyMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobDYoMSwyLGs9MTApLCAxKzIrMTApCiAKIAotcHJpbnQgJzEuMS40IEVsbGlwc2lzIGxpdGVyYWwnCisgICAgIyMjIHN0bXQ6IHNpbXBsZV9zdG10IHwgY29tcG91bmRfc3RtdAorICAgICMgVGVzdGVkIGJlbG93CiAKLXggPSAuLi4KLXZlcmlmeSh4ID09IEVsbGlwc2lzKQorICAgIGRlZiB0ZXN0U2ltcGxlU3RtdChzZWxmKToKKyAgICAgICAgIyMjIHNpbXBsZV9zdG10OiBzbWFsbF9zdG10ICgnOycgc21hbGxfc3RtdCkqIFsnOyddCisgICAgICAgIHggPSAxOyBwYXNzOyBkZWwgeAorICAgICAgICBkZWYgZm9vKCk6CisgICAgICAgICAgICAjIHZlcmlmeSBzdGF0bWVudHMgdGhhdCBlbmQgd2l0aCBzZW1pLWNvbG9ucworICAgICAgICAgICAgeCA9IDE7IHBhc3M7IGRlbCB4OworICAgICAgICBmb28oKQogCisgICAgIyMjIHNtYWxsX3N0bXQ6IGV4cHJfc3RtdCB8IHByaW50X3N0bXQgIHwgcGFzc19zdG10IHwgZGVsX3N0bXQgfCBmbG93X3N0bXQgfCBpbXBvcnRfc3RtdCB8IGdsb2JhbF9zdG10IHwgYWNjZXNzX3N0bXQgCisgICAgIyBUZXN0ZWQgYmVsb3cKIAotcHJpbnQgJzEuMiBHcmFtbWFyJworICAgIGRlZiB0ZXN0RXhwclN0bXQoc2VsZik6CisgICAgICAgICMgKGV4cHJsaXN0ICc9JykqIGV4cHJsaXN0CisgICAgICAgIDEKKyAgICAgICAgMSwgMiwgMworICAgICAgICB4ID0gMQorICAgICAgICB4ID0gMSwgMiwgMworICAgICAgICB4ID0geSA9IHogPSAxLCAyLCAzCisgICAgICAgIHgsIHksIHogPSAxLCAyLCAzCisgICAgICAgIGFiYyA9IGEsIGIsIGMgPSB4LCB5LCB6ID0geHl6ID0gMSwgMiwgKDMsIDQpCiAKLXByaW50ICdzaW5nbGVfaW5wdXQnICMgTkVXTElORSB8IHNpbXBsZV9zdG10IHwgY29tcG91bmRfc3RtdCBORVdMSU5FCi0jIFhYWCBjYW4ndCB0ZXN0IGluIGEgc2NyaXB0IC0tIHRoaXMgcnVsZSBpcyBvbmx5IHVzZWQgd2hlbiBpbnRlcmFjdGl2ZQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgInggKyAxID0gMSIpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiYSArIDEgPSBiICsgMiIpCiAKLXByaW50ICdmaWxlX2lucHV0JyAjIChORVdMSU5FIHwgc3RtdCkqIEVORE1BUktFUgotIyBCZWluZyB0ZXN0ZWQgYXMgdGhpcyB2ZXJ5IG1vbWVudCB0aGlzIHZlcnkgbW9kdWxlCisgICAgZGVmIHRlc3RQcmludFN0bXQoc2VsZik6CisgICAgICAgICMgJ3ByaW50JyAodGVzdCAnLCcpKiBbdGVzdF0KKyAgICAgICAgaW1wb3J0IFN0cmluZ0lPCiAKLXByaW50ICdleHByX2lucHV0JyAjIHRlc3RsaXN0IE5FV0xJTkUKLSMgWFhYIEhhcmQgdG8gdGVzdCAtLSB1c2VkIG9ubHkgaW4gY2FsbHMgdG8gaW5wdXQoKQorICAgICAgICAjIENhbid0IHRlc3QgcHJpbnRpbmcgdG8gcmVhbCBzdGRvdXQgd2l0aG91dCBjb21wYXJpbmcgb3V0cHV0CisgICAgICAgICMgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSBpbiB1bml0dGVzdC4KKyAgICAgICAgc2F2ZV9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHN5cy5zdGRvdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCiAKLXByaW50ICdldmFsX2lucHV0JyAjIHRlc3RsaXN0IEVORE1BUktFUgoteCA9IGV2YWwoJzEsIDAgb3IgMScpCisgICAgICAgIHByaW50IDEsIDIsIDMKKyAgICAgICAgcHJpbnQgMSwgMiwgMywKKyAgICAgICAgcHJpbnQKKyAgICAgICAgcHJpbnQgMCBvciAxLCAwIG9yIDEsCisgICAgICAgIHByaW50IDAgb3IgMQogCi1wcmludCAnZnVuY2RlZicKLSMjIyAnZGVmJyBOQU1FIHBhcmFtZXRlcnMgJzonIHN1aXRlCi0jIyMgcGFyYW1ldGVyczogJygnIFt2YXJhcmdzbGlzdF0gJyknCi0jIyMgdmFyYXJnc2xpc3Q6IChmcGRlZiBbJz0nIHRlc3RdICcsJykqIAotIyMjICAgICAgICAgICAoJyonIChOQU1FfCcsJyBmcGRlZiBbJz0nIHRlc3RdKSBbJywnICgnKionfCcqJyAnKicpIE5BTUVdCi0jIyMgICAgICAgICAgICB8ICgnKionfCcqJyAnKicpIE5BTUUpCi0jIyMgICAgICAgICAgICB8IGZwZGVmIFsnPScgdGVzdF0gKCcsJyBmcGRlZiBbJz0nIHRlc3RdKSogWycsJ10KLSMjIyBmcGRlZjogTkFNRSB8ICcoJyBmcGxpc3QgJyknCi0jIyMgZnBsaXN0OiBmcGRlZiAoJywnIGZwZGVmKSogWycsJ10KLSMjIyBhcmdsaXN0OiAoYXJndW1lbnQgJywnKSogKGFyZ3VtZW50IHwgKicgdGVzdCBbJywnICcqKicgdGVzdF0gfCAnKionIHRlc3QpCi0jIyMgYXJndW1lbnQ6IFt0ZXN0ICc9J10gdGVzdCAgICMgUmVhbGx5IFtrZXl3b3JkICc9J10gdGVzdAotZGVmIGYxKCk6IHBhc3MKLWYxKCkKLWYxKCooKSkKLWYxKCooKSwgKip7fSkKLWRlZiBmMihvbmVfYXJndW1lbnQpOiBwYXNzCi1kZWYgZjModHdvLCBhcmd1bWVudHMpOiBwYXNzCi1kZWYgZjQodHdvLCAoY29tcG91bmQsIChhcmd1bWVudCwgbGlzdCkpKTogcGFzcwotZGVmIGY1KChjb21wb3VuZCwgZmlyc3QpLCB0d28pOiBwYXNzCi12ZXJlcShmMi5mdW5jX2NvZGUuY29fdmFybmFtZXMsICgnb25lX2FyZ3VtZW50JywpKQotdmVyZXEoZjMuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLCAoJ3R3bycsICdhcmd1bWVudHMnKSkKLWlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6Ci0gICAgdmVyZXEoZjQuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLAotICAgICAgICAgICAoJ3R3bycsICcoY29tcG91bmQsIChhcmd1bWVudCwgbGlzdCkpJywgJ2NvbXBvdW5kJywgJ2FyZ3VtZW50JywKLSAgICAgICAgICAgICAgICAgICAgICAgICdsaXN0JywpKQotICAgIHZlcmVxKGY1LmZ1bmNfY29kZS5jb192YXJuYW1lcywKLSAgICAgICAgICAgKCcoY29tcG91bmQsIGZpcnN0KScsICd0d28nLCAnY29tcG91bmQnLCAnZmlyc3QnKSkKLWVsc2U6Ci0gICAgdmVyZXEoZjQuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLAotICAgICAgICAgICgndHdvJywgJy4xJywgJ2NvbXBvdW5kJywgJ2FyZ3VtZW50JywgICdsaXN0JykpCi0gICAgdmVyZXEoZjUuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLAotICAgICAgICAgICgnLjAnLCAndHdvJywgJ2NvbXBvdW5kJywgJ2ZpcnN0JykpCi1kZWYgYTEob25lX2FyZywpOiBwYXNzCi1kZWYgYTIodHdvLCBhcmdzLCk6IHBhc3MKLWRlZiB2MCgqcmVzdCk6IHBhc3MKLWRlZiB2MShhLCAqcmVzdCk6IHBhc3MKLWRlZiB2MihhLCBiLCAqcmVzdCk6IHBhc3MKLWRlZiB2MyhhLCAoYiwgYyksICpyZXN0KTogcmV0dXJuIGEsIGIsIGMsIHJlc3QKLSMgY2V2YWwgdW5wYWNrcyB0aGUgZm9ybWFsIGFyZ3VtZW50cyBpbnRvIHRoZSBmaXJzdCBhcmdjb3VudCBuYW1lczsKLSMgdGh1cywgdGhlIG5hbWVzIG5lc3RlZCBpbnNpZGUgdHVwbGVzIG11c3QgYXBwZWFyIGFmdGVyIHRoZXNlIG5hbWVzLgotaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKLSAgICB2ZXJpZnkodjMuZnVuY19jb2RlLmNvX3Zhcm5hbWVzID09ICgnYScsICcoYiwgYyknLCAncmVzdCcsICdiJywgJ2MnKSkKLWVsc2U6Ci0gICAgdmVyZXEodjMuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLCAoJ2EnLCAnLjEnLCAncmVzdCcsICdiJywgJ2MnKSkKLXZlcmlmeSh2MygxLCAoMiwgMyksIDQpID09ICgxLCAyLCAzLCAoNCwpKSkKLWRlZiBkMDEoYT0xKTogcGFzcwotZDAxKCkKLWQwMSgxKQotZDAxKCooMSwpKQotZDAxKCoqeydhJzoyfSkKLWRlZiBkMTEoYSwgYj0xKTogcGFzcwotZDExKDEpCi1kMTEoMSwgMikKLWQxMSgxLCAqKnsnYic6Mn0pCi1kZWYgZDIxKGEsIGIsIGM9MSk6IHBhc3MKLWQyMSgxLCAyKQotZDIxKDEsIDIsIDMpCi1kMjEoKigxLCAyLCAzKSkKLWQyMSgxLCAqKDIsIDMpKQotZDIxKDEsIDIsICooMywpKQotZDIxKDEsIDIsICoqeydjJzozfSkKLWRlZiBkMDIoYT0xLCBiPTIpOiBwYXNzCi1kMDIoKQotZDAyKDEpCi1kMDIoMSwgMikKLWQwMigqKDEsIDIpKQotZDAyKDEsICooMiwpKQotZDAyKDEsICoqeydiJzoyfSkKLWQwMigqKnsnYSc6IDEsICdiJzogMn0pCi1kZWYgZDEyKGEsIGI9MSwgYz0yKTogcGFzcwotZDEyKDEpCi1kMTIoMSwgMikKLWQxMigxLCAyLCAzKQotZGVmIGQyMihhLCBiLCBjPTEsIGQ9Mik6IHBhc3MKLWQyMigxLCAyKQotZDIyKDEsIDIsIDMpCi1kMjIoMSwgMiwgMywgNCkKLWRlZiBkMDF2KGE9MSwgKnJlc3QpOiBwYXNzCi1kMDF2KCkKLWQwMXYoMSkKLWQwMXYoMSwgMikKLWQwMXYoKigxLCAyLCAzLCA0KSkKLWQwMXYoKigxLCkpCi1kMDF2KCoqeydhJzoyfSkKLWRlZiBkMTF2KGEsIGI9MSwgKnJlc3QpOiBwYXNzCi1kMTF2KDEpCi1kMTF2KDEsIDIpCi1kMTF2KDEsIDIsIDMpCi1kZWYgZDIxdihhLCBiLCBjPTEsICpyZXN0KTogcGFzcwotZDIxdigxLCAyKQotZDIxdigxLCAyLCAzKQotZDIxdigxLCAyLCAzLCA0KQotZDIxdigqKDEsIDIsIDMsIDQpKQotZDIxdigxLCAyLCAqKnsnYyc6IDN9KQotZGVmIGQwMnYoYT0xLCBiPTIsICpyZXN0KTogcGFzcwotZDAydigpCi1kMDJ2KDEpCi1kMDJ2KDEsIDIpCi1kMDJ2KDEsIDIsIDMpCi1kMDJ2KDEsICooMiwgMywgNCkpCi1kMDJ2KCoqeydhJzogMSwgJ2InOiAyfSkKLWRlZiBkMTJ2KGEsIGI9MSwgYz0yLCAqcmVzdCk6IHBhc3MKLWQxMnYoMSkKLWQxMnYoMSwgMikKLWQxMnYoMSwgMiwgMykKLWQxMnYoMSwgMiwgMywgNCkKLWQxMnYoKigxLCAyLCAzLCA0KSkKLWQxMnYoMSwgMiwgKigzLCA0LCA1KSkKLWQxMnYoMSwgKigyLCksICoqeydjJzogM30pCi1kZWYgZDIydihhLCBiLCBjPTEsIGQ9MiwgKnJlc3QpOiBwYXNzCi1kMjJ2KDEsIDIpCi1kMjJ2KDEsIDIsIDMpCi1kMjJ2KDEsIDIsIDMsIDQpCi1kMjJ2KDEsIDIsIDMsIDQsIDUpCi1kMjJ2KCooMSwgMiwgMywgNCkpCi1kMjJ2KDEsIDIsICooMywgNCwgNSkpCi1kMjJ2KDEsICooMiwgMyksICoqeydkJzogNH0pCi1kZWYgZDMxdigoeCkpOiBwYXNzCi1kMzF2KDEpCi1kZWYgZDMydigoeCwpKTogcGFzcwotZDMydigoMSwpKQotI2tleXdvcmQgb25seSBhcmd1bWVudCB0ZXN0cwotZGVmIHBvczBrZXkxKCosIGtleSk6IHJldHVybiBrZXkKLXBvczBrZXkxKGtleT0xMDApCi1kZWYgcG9zMmtleTIocDEsIHAyLCAqLCBrMSwgazI9MTAwKTogcmV0dXJuIHAxLHAyLGsxLGsyCi1wb3Mya2V5MigxLCAyLCBrMT0xMDApCi1wb3Mya2V5MigxLCAyLCBrMT0xMDAsIGsyPTIwMCkKLXBvczJrZXkyKDEsIDIsIGsyPTEwMCwgazE9MjAwKQotZGVmIHBvczJrZXkyZGljdChwMSwgcDIsICosIGsxPTEwMCwgazIsICoqa3dhcmcpOiByZXR1cm4gcDEscDIsazEsazIsa3dhcmcKLXBvczJrZXkyZGljdCgxLDIsazI9MTAwLHRva3dhcmcxPTEwMCx0b2t3YXJnMj0yMDApCi1wb3Mya2V5MmRpY3QoMSwyLHRva3dhcmcxPTEwMCx0b2t3YXJnMj0yMDAsIGsyPTEwMCkKKyAgICAgICAgIyAncHJpbnQnICc+PicgdGVzdCAnLCcKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZG91dCwgMSwgMiwgMworICAgICAgICBwcmludCA+PiBzeXMuc3Rkb3V0LCAxLCAyLCAzLAorICAgICAgICBwcmludCA+PiBzeXMuc3Rkb3V0CisgICAgICAgIHByaW50ID4+IHN5cy5zdGRvdXQsIDAgb3IgMSwgMCBvciAxLAorICAgICAgICBwcmludCA+PiBzeXMuc3Rkb3V0LCAwIG9yIDEKIAotIyMjIGxhbWJkZWY6ICdsYW1iZGEnIFt2YXJhcmdzbGlzdF0gJzonIHRlc3QKLXByaW50ICdsYW1iZGVmJwotbDEgPSBsYW1iZGEgOiAwCi12ZXJpZnkobDEoKSA9PSAwKQotbDIgPSBsYW1iZGEgOiBhW2RdICMgWFhYIGp1c3QgdGVzdGluZyB0aGUgZXhwcmVzc2lvbgotbDMgPSBsYW1iZGEgOiBbMiA8IHggZm9yIHggaW4gWy0xLCAzLCAwTF1dCi12ZXJpZnkobDMoKSA9PSBbMCwgMSwgMF0pCi1sNCA9IGxhbWJkYSB4ID0gbGFtYmRhIHkgPSBsYW1iZGEgej0xIDogeiA6IHkoKSA6IHgoKQotdmVyaWZ5KGw0KCkgPT0gMSkKLWw1ID0gbGFtYmRhIHgsIHksIHo9MjogeCArIHkgKyB6Ci12ZXJpZnkobDUoMSwgMikgPT0gNSkKLXZlcmlmeShsNSgxLCAyLCAzKSA9PSA2KQotY2hlY2tfc3ludGF4KCJsYW1iZGEgeDogeCA9IDIiKQotbDYgPSBsYW1iZGEgeCwgeSwgKiwgaz0yMDogeCt5K2sKLXZlcmlmeShsNigxLDIpID09IDErMisyMCkKLXZlcmlmeShsNigxLDIsaz0xMCkgPT0gMSsyKzEwKQorICAgICAgICAjIHRlc3QgcHJpbnRpbmcgdG8gYW4gaW5zdGFuY2UKKyAgICAgICAgY2xhc3MgR3VscDoKKyAgICAgICAgICAgIGRlZiB3cml0ZShzZWxmLCBtc2cpOiBwYXNzCiAKLSMjIyBzdG10OiBzaW1wbGVfc3RtdCB8IGNvbXBvdW5kX3N0bXQKLSMgVGVzdGVkIGJlbG93CisgICAgICAgIGd1bHAgPSBHdWxwKCkKKyAgICAgICAgcHJpbnQgPj4gZ3VscCwgMSwgMiwgMworICAgICAgICBwcmludCA+PiBndWxwLCAxLCAyLCAzLAorICAgICAgICBwcmludCA+PiBndWxwCisgICAgICAgIHByaW50ID4+IGd1bHAsIDAgb3IgMSwgMCBvciAxLAorICAgICAgICBwcmludCA+PiBndWxwLCAwIG9yIDEKIAotIyMjIHNpbXBsZV9zdG10OiBzbWFsbF9zdG10ICgnOycgc21hbGxfc3RtdCkqIFsnOyddCi1wcmludCAnc2ltcGxlX3N0bXQnCi14ID0gMTsgcGFzczsgZGVsIHgKLWRlZiBmb28oKToKLSAgICAjIHZlcmlmeSBzdGF0bWVudHMgdGhhdCBlbmQgd2l0aCBzZW1pLWNvbG9ucwotICAgIHggPSAxOyBwYXNzOyBkZWwgeDsKLWZvbygpCisgICAgICAgICMgdGVzdCBwcmludCA+PiBOb25lCisgICAgICAgIGRlZiBkcml2ZXIoKToKKyAgICAgICAgICAgIG9sZHN0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBHdWxwKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0ZWxsbWUoR3VscCgpKQorICAgICAgICAgICAgICAgIHRlbGxtZSgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBvbGRzdGRvdXQKIAotIyMjIHNtYWxsX3N0bXQ6IGV4cHJfc3RtdCB8IHByaW50X3N0bXQgIHwgcGFzc19zdG10IHwgZGVsX3N0bXQgfCBmbG93X3N0bXQgfCBpbXBvcnRfc3RtdCB8IGdsb2JhbF9zdG10IHwgYWNjZXNzX3N0bXQgfCBleGVjX3N0bXQKLSMgVGVzdGVkIGJlbG93CisgICAgICAgICMgd2Ugc2hvdWxkIHNlZSB0aGlzIG9uY2UKKyAgICAgICAgZGVmIHRlbGxtZShmaWxlPXN5cy5zdGRvdXQpOgorICAgICAgICAgICAgcHJpbnQgPj4gZmlsZSwgJ2hlbGxvIHdvcmxkJwogCi1wcmludCAnZXhwcl9zdG10JyAjIChleHBybGlzdCAnPScpKiBleHBybGlzdAotMQotMSwgMiwgMwoteCA9IDEKLXggPSAxLCAyLCAzCi14ID0geSA9IHogPSAxLCAyLCAzCi14LCB5LCB6ID0gMSwgMiwgMwotYWJjID0gYSwgYiwgYyA9IHgsIHksIHogPSB4eXogPSAxLCAyLCAoMywgNCkKLSMgTkIgdGhlc2UgdmFyaWFibGVzIGFyZSBkZWxldGVkIGJlbG93CisgICAgICAgIGRyaXZlcigpCiAKLWNoZWNrX3N5bnRheCgieCArIDEgPSAxIikKLWNoZWNrX3N5bnRheCgiYSArIDEgPSBiICsgMiIpCisgICAgICAgICMgd2Ugc2hvdWxkIG5vdCBzZWUgdGhpcyBhdCBhbGwKKyAgICAgICAgZGVmIHRlbGxtZShmaWxlPU5vbmUpOgorICAgICAgICAgICAgcHJpbnQgPj4gZmlsZSwgJ2dvb2RieWUgdW5pdmVyc2UnCiAKLXByaW50ICdwcmludF9zdG10JyAjICdwcmludCcgKHRlc3QgJywnKSogW3Rlc3RdCi1wcmludCAxLCAyLCAzCi1wcmludCAxLCAyLCAzLAotcHJpbnQKLXByaW50IDAgb3IgMSwgMCBvciAxLAotcHJpbnQgMCBvciAxCisgICAgICAgIGRyaXZlcigpCiAKLXByaW50ICdleHRlbmRlZCBwcmludF9zdG10JyAjICdwcmludCcgJz4+JyB0ZXN0ICcsJwotaW1wb3J0IHN5cwotcHJpbnQgPj4gc3lzLnN0ZG91dCwgMSwgMiwgMwotcHJpbnQgPj4gc3lzLnN0ZG91dCwgMSwgMiwgMywKLXByaW50ID4+IHN5cy5zdGRvdXQKLXByaW50ID4+IHN5cy5zdGRvdXQsIDAgb3IgMSwgMCBvciAxLAotcHJpbnQgPj4gc3lzLnN0ZG91dCwgMCBvciAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLnN0ZG91dC5nZXR2YWx1ZSgpLCAnJydcCisxIDIgMworMSAyIDMKKzEgMSAxCisxIDIgMworMSAyIDMKKzEgMSAxCitoZWxsbyB3b3JsZAorJycnKQorICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZV9zdGRvdXQKIAotIyB0ZXN0IHByaW50aW5nIHRvIGFuIGluc3RhbmNlCi1jbGFzcyBHdWxwOgotICAgIGRlZiB3cml0ZShzZWxmLCBtc2cpOiBwYXNzCisgICAgICAgICMgc3ludGF4IGVycm9ycworICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgJ3ByaW50ICwnKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgJ3ByaW50ID4+IHgsJykKIAotZ3VscCA9IEd1bHAoKQotcHJpbnQgPj4gZ3VscCwgMSwgMiwgMwotcHJpbnQgPj4gZ3VscCwgMSwgMiwgMywKLXByaW50ID4+IGd1bHAKLXByaW50ID4+IGd1bHAsIDAgb3IgMSwgMCBvciAxLAotcHJpbnQgPj4gZ3VscCwgMCBvciAxCisgICAgZGVmIHRlc3REZWxTdG10KHNlbGYpOgorICAgICAgICAjICdkZWwnIGV4cHJsaXN0CisgICAgICAgIGFiYyA9IFsxLDIsM10KKyAgICAgICAgeCwgeSwgeiA9IGFiYworICAgICAgICB4eXogPSB4LCB5LCB6CiAKLSMgdGVzdCBwcmludCA+PiBOb25lCi1kZWYgZHJpdmVyKCk6Ci0gICAgb2xkc3Rkb3V0ID0gc3lzLnN0ZG91dAotICAgIHN5cy5zdGRvdXQgPSBHdWxwKCkKLSAgICB0cnk6Ci0gICAgICAgIHRlbGxtZShHdWxwKCkpCi0gICAgICAgIHRlbGxtZSgpCi0gICAgZmluYWxseToKLSAgICAgICAgc3lzLnN0ZG91dCA9IG9sZHN0ZG91dAorICAgICAgICBkZWwgYWJjCisgICAgICAgIGRlbCB4LCB5LCAoeiwgeHl6KQogCi0jIHdlIHNob3VsZCBzZWUgdGhpcyBvbmNlCi1kZWYgdGVsbG1lKGZpbGU9c3lzLnN0ZG91dCk6Ci0gICAgcHJpbnQgPj4gZmlsZSwgJ2hlbGxvIHdvcmxkJworICAgIGRlZiB0ZXN0UGFzc1N0bXQoc2VsZik6CisgICAgICAgICMgJ3Bhc3MnCisgICAgICAgIHBhc3MKIAotZHJpdmVyKCkKKyAgICAjIGZsb3dfc3RtdDogYnJlYWtfc3RtdCB8IGNvbnRpbnVlX3N0bXQgfCByZXR1cm5fc3RtdCB8IHJhaXNlX3N0bXQKKyAgICAjIFRlc3RlZCBiZWxvdwogCi0jIHdlIHNob3VsZCBub3Qgc2VlIHRoaXMgYXQgYWxsCi1kZWYgdGVsbG1lKGZpbGU9Tm9uZSk6Ci0gICAgcHJpbnQgPj4gZmlsZSwgJ2dvb2RieWUgdW5pdmVyc2UnCisgICAgZGVmIHRlc3RCcmVha1N0bXQoc2VsZik6CisgICAgICAgICMgJ2JyZWFrJworICAgICAgICB3aGlsZSAxOiBicmVhawogCi1kcml2ZXIoKQorICAgIGRlZiB0ZXN0Q29udGludWVTdG10KHNlbGYpOgorICAgICAgICAjICdjb250aW51ZScKKyAgICAgICAgaSA9IDEKKyAgICAgICAgd2hpbGUgaTogaSA9IDA7IGNvbnRpbnVlCiAKLSMgc3ludGF4IGVycm9ycwotY2hlY2tfc3ludGF4KCdwcmludCAsJykKLWNoZWNrX3N5bnRheCgncHJpbnQgPj4geCwnKQorICAgICAgICBtc2cgPSAiIgorICAgICAgICB3aGlsZSBub3QgbXNnOgorICAgICAgICAgICAgbXNnID0gIm9rIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgbXNnID0gImNvbnRpbnVlIGZhaWxlZCB0byBjb250aW51ZSBpbnNpZGUgdHJ5IgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIG1zZyA9ICJjb250aW51ZSBpbnNpZGUgdHJ5IGNhbGxlZCBleGNlcHQgYmxvY2siCisgICAgICAgIGlmIG1zZyAhPSAib2siOgorICAgICAgICAgICAgc2VsZi5mYWlsKG1zZykKIAotcHJpbnQgJ2RlbF9zdG10JyAjICdkZWwnIGV4cHJsaXN0Ci1kZWwgYWJjCi1kZWwgeCwgeSwgKHosIHh5eikKKyAgICAgICAgbXNnID0gIiIKKyAgICAgICAgd2hpbGUgbm90IG1zZzoKKyAgICAgICAgICAgIG1zZyA9ICJmaW5hbGx5IGJsb2NrIG5vdCBjYWxsZWQiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgbXNnID0gIm9rIgorICAgICAgICBpZiBtc2cgIT0gIm9rIjoKKyAgICAgICAgICAgIHNlbGYuZmFpbChtc2cpCiAKLXByaW50ICdwYXNzX3N0bXQnICMgJ3Bhc3MnCi1wYXNzCisgICAgZGVmIHRlc3RfYnJlYWtfY29udGludWVfbG9vcChzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3Qgd2FycmFudHMgYW4gZXhwbGFuYXRpb24uIEl0IGlzIGEgdGVzdCBzcGVjaWZpY2FsbHkgZm9yIFNGIGJ1Z3MKKyAgICAgICAgIyAjNDYzMzU5IGFuZCAjNDYyOTM3LiBUaGUgYnVnIGlzIHRoYXQgYSAnYnJlYWsnIHN0YXRlbWVudCBleGVjdXRlZCBvcgorICAgICAgICAjIGV4Y2VwdGlvbiByYWlzZWQgaW5zaWRlIGEgdHJ5L2V4Y2VwdCBpbnNpZGUgYSBsb29wLCAqYWZ0ZXIqIGEgY29udGludWUKKyAgICAgICAgIyBzdGF0ZW1lbnQgaGFzIGJlZW4gZXhlY3V0ZWQgaW4gdGhhdCBsb29wLCB3aWxsIGNhdXNlIHRoZSB3cm9uZyBudW1iZXIgb2YKKyAgICAgICAgIyBhcmd1bWVudHMgdG8gYmUgcG9wcGVkIG9mZiB0aGUgc3RhY2sgYW5kIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIHJlc2V0IHRvCisgICAgICAgICMgYSB2ZXJ5IHNtYWxsIG51bWJlciAodXN1YWxseSAwLikgQmVjYXVzZSBvZiB0aGlzLCB0aGUgZm9sbG93aW5nIHRlc3QKKyAgICAgICAgIyAqbXVzdCogd3JpdHRlbiBhcyBhIGZ1bmN0aW9uLCBhbmQgdGhlIHRyYWNraW5nIHZhcnMgKm11c3QqIGJlIGZ1bmN0aW9uCisgICAgICAgICMgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMuIE90aGVyd2lzZSwgdGhlIHRlc3Qgd2lsbCBsb29wIGFuZCBsb29wLgogCi1wcmludCAnZmxvd19zdG10JyAjIGJyZWFrX3N0bXQgfCBjb250aW51ZV9zdG10IHwgcmV0dXJuX3N0bXQgfCByYWlzZV9zdG10Ci0jIFRlc3RlZCBiZWxvdworICAgICAgICBkZWYgdGVzdF9pbm5lcihleHRyYV9idXJuaW5nX29pbCA9IDEsIGNvdW50PTApOgorICAgICAgICAgICAgYmlnX2hpcHBvID0gMgorICAgICAgICAgICAgd2hpbGUgYmlnX2hpcHBvOgorICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIGV4dHJhX2J1cm5pbmdfb2lsIGFuZCBiaWdfaGlwcG8gPT0gMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2J1cm5pbmdfb2lsIC09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGJpZ19oaXBwbyAtPSAxCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgaWYgY291bnQgPiAyIG9yIGJpZ19oaXBwbyAhPSAxOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiY29udGludWUgdGhlbiBicmVhayBpbiB0cnkvZXhjZXB0IGluIGxvb3AgYnJva2VuISIpCisgICAgICAgIHRlc3RfaW5uZXIoKQogCi1wcmludCAnYnJlYWtfc3RtdCcgIyAnYnJlYWsnCi13aGlsZSAxOiBicmVhaworICAgIGRlZiB0ZXN0UmV0dXJuKHNlbGYpOgorICAgICAgICAjICdyZXR1cm4nIFt0ZXN0bGlzdF0KKyAgICAgICAgZGVmIGcxKCk6IHJldHVybgorICAgICAgICBkZWYgZzIoKTogcmV0dXJuIDEKKyAgICAgICAgZzEoKQorICAgICAgICB4ID0gZzIoKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImNsYXNzIGZvbzpyZXR1cm4gMSIpCiAKLXByaW50ICdjb250aW51ZV9zdG10JyAjICdjb250aW51ZScKLWkgPSAxCi13aGlsZSBpOiBpID0gMDsgY29udGludWUKKyAgICBkZWYgdGVzdFlpZWxkKHNlbGYpOgorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImNsYXNzIGZvbzp5aWVsZCAxIikKIAotbXNnID0gIiIKLXdoaWxlIG5vdCBtc2c6Ci0gICAgbXNnID0gImNvbnRpbnVlICsgdHJ5L2V4Y2VwdCBvayIKLSAgICB0cnk6Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICAgIG1zZyA9ICJjb250aW51ZSBmYWlsZWQgdG8gY29udGludWUgaW5zaWRlIHRyeSIKLSAgICBleGNlcHQ6Ci0gICAgICAgIG1zZyA9ICJjb250aW51ZSBpbnNpZGUgdHJ5IGNhbGxlZCBleGNlcHQgYmxvY2siCi1wcmludCBtc2cKKyAgICBkZWYgdGVzdFJhaXNlKHNlbGYpOgorICAgICAgICAjICdyYWlzZScgdGVzdCBbJywnIHRlc3RdCisgICAgICAgIHRyeTogcmFpc2UgUnVudGltZUVycm9yLCAnanVzdCB0ZXN0aW5nJworICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOiBwYXNzCisgICAgICAgIHRyeTogcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OiBwYXNzCiAKLW1zZyA9ICIiCi13aGlsZSBub3QgbXNnOgotICAgIG1zZyA9ICJmaW5hbGx5IGJsb2NrIG5vdCBjYWxsZWQiCi0gICAgdHJ5OgotICAgICAgICBjb250aW51ZQotICAgIGZpbmFsbHk6Ci0gICAgICAgIG1zZyA9ICJjb250aW51ZSArIHRyeS9maW5hbGx5IG9rIgotcHJpbnQgbXNnCisgICAgZGVmIHRlc3RJbXBvcnQoc2VsZik6CisgICAgICAgICMgJ2ltcG9ydCcgZG90dGVkX2FzX25hbWVzCisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgaW1wb3J0IHRpbWUsIHN5cworICAgICAgICAjICdmcm9tJyBkb3R0ZWRfbmFtZSAnaW1wb3J0JyAoJyonIHwgJygnIGltcG9ydF9hc19uYW1lcyAnKScgfCBpbXBvcnRfYXNfbmFtZXMpCisgICAgICAgIGZyb20gdGltZSBpbXBvcnQgdGltZQorICAgICAgICBmcm9tIHRpbWUgaW1wb3J0ICh0aW1lKQorICAgICAgICAjIG5vdCB0ZXN0YWJsZSBpbnNpZGUgYSBmdW5jdGlvbiwgYnV0IGFscmVhZHkgZG9uZSBhdCB0b3Agb2YgdGhlIG1vZHVsZQorICAgICAgICAjIGZyb20gc3lzIGltcG9ydCAqCisgICAgICAgIGZyb20gc3lzIGltcG9ydCBwYXRoLCBhcmd2CisgICAgICAgIGZyb20gc3lzIGltcG9ydCAocGF0aCwgYXJndikKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IChwYXRoLCBhcmd2LCkKIAorICAgIGRlZiB0ZXN0R2xvYmFsKHNlbGYpOgorICAgICAgICAjICdnbG9iYWwnIE5BTUUgKCcsJyBOQU1FKSoKKyAgICAgICAgZ2xvYmFsIGEKKyAgICAgICAgZ2xvYmFsIGEsIGIKKyAgICAgICAgZ2xvYmFsIG9uZSwgdHdvLCB0aHJlZSwgZm91ciwgZml2ZSwgc2l4LCBzZXZlbiwgZWlnaHQsIG5pbmUsIHRlbgogCi0jIFRoaXMgdGVzdCB3YXJyYW50cyBhbiBleHBsYW5hdGlvbi4gSXQgaXMgYSB0ZXN0IHNwZWNpZmljYWxseSBmb3IgU0YgYnVncwotIyAjNDYzMzU5IGFuZCAjNDYyOTM3LiBUaGUgYnVnIGlzIHRoYXQgYSAnYnJlYWsnIHN0YXRlbWVudCBleGVjdXRlZCBvcgotIyBleGNlcHRpb24gcmFpc2VkIGluc2lkZSBhIHRyeS9leGNlcHQgaW5zaWRlIGEgbG9vcCwgKmFmdGVyKiBhIGNvbnRpbnVlCi0jIHN0YXRlbWVudCBoYXMgYmVlbiBleGVjdXRlZCBpbiB0aGF0IGxvb3AsIHdpbGwgY2F1c2UgdGhlIHdyb25nIG51bWJlciBvZgotIyBhcmd1bWVudHMgdG8gYmUgcG9wcGVkIG9mZiB0aGUgc3RhY2sgYW5kIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIHJlc2V0IHRvCi0jIGEgdmVyeSBzbWFsbCBudW1iZXIgKHVzdWFsbHkgMC4pIEJlY2F1c2Ugb2YgdGhpcywgdGhlIGZvbGxvd2luZyB0ZXN0Ci0jICptdXN0KiB3cml0dGVuIGFzIGEgZnVuY3Rpb24sIGFuZCB0aGUgdHJhY2tpbmcgdmFycyAqbXVzdCogYmUgZnVuY3Rpb24KLSMgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMuIE90aGVyd2lzZSwgdGhlIHRlc3Qgd2lsbCBsb29wIGFuZCBsb29wLgotCi1wcmludCAidGVzdGluZyBjb250aW51ZSBhbmQgYnJlYWsgaW4gdHJ5L2V4Y2VwdCBpbiBsb29wIgotZGVmIHRlc3RfYnJlYWtfY29udGludWVfbG9vcChleHRyYV9idXJuaW5nX29pbCA9IDEsIGNvdW50PTApOgotICAgIGJpZ19oaXBwbyA9IDIKLSAgICB3aGlsZSBiaWdfaGlwcG86Ci0gICAgICAgIGNvdW50ICs9IDEKKyAgICBkZWYgdGVzdEFzc2VydChzZWxmKToKKyAgICAgICAgIyBhc3NlcnRfc3RtdDogJ2Fzc2VydCcgdGVzdCBbJywnIHRlc3RdCisgICAgICAgIGFzc2VydCAxCisgICAgICAgIGFzc2VydCAxLCAxCisgICAgICAgIGFzc2VydCBsYW1iZGEgeDp4CisgICAgICAgIGFzc2VydCAxLCBsYW1iZGEgeDp4KzEKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgaWYgZXh0cmFfYnVybmluZ19vaWwgYW5kIGJpZ19oaXBwbyA9PSAxOgotICAgICAgICAgICAgICAgIGV4dHJhX2J1cm5pbmdfb2lsIC09IDEKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgYmlnX2hpcHBvIC09IDEKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHJhaXNlCi0gICAgaWYgY291bnQgPiAyIG9yIGJpZ19oaXBwbyAhPSAxOgotICAgICAgICBwcmludCAiY29udGludWUgdGhlbiBicmVhayBpbiB0cnkvZXhjZXB0IGluIGxvb3AgYnJva2VuISIKLXRlc3RfYnJlYWtfY29udGludWVfbG9vcCgpCisgICAgICAgICAgICBhc3NlcnQgMCwgIm1zZyIKKyAgICAgICAgZXhjZXB0IEFzc2VydGlvbkVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZS5hcmdzWzBdLCAibXNnIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkFzc2VydGlvbkVycm9yIG5vdCByYWlzZWQgYnkgYXNzZXJ0IDAiKQogCi1wcmludCAncmV0dXJuX3N0bXQnICMgJ3JldHVybicgW3Rlc3RsaXN0XQotZGVmIGcxKCk6IHJldHVybgotZGVmIGcyKCk6IHJldHVybiAxCi1nMSgpCi14ID0gZzIoKQotY2hlY2tfc3ludGF4KCJjbGFzcyBmb286cmV0dXJuIDEiKQorICAgICMjIyBjb21wb3VuZF9zdG10OiBpZl9zdG10IHwgd2hpbGVfc3RtdCB8IGZvcl9zdG10IHwgdHJ5X3N0bXQgfCBmdW5jZGVmIHwgY2xhc3NkZWYKKyAgICAjIFRlc3RlZCBiZWxvdwogCi1wcmludCAneWllbGRfc3RtdCcKLWNoZWNrX3N5bnRheCgiY2xhc3MgZm9vOnlpZWxkIDEiKQorICAgIGRlZiB0ZXN0SWYoc2VsZik6CisgICAgICAgICMgJ2lmJyB0ZXN0ICc6JyBzdWl0ZSAoJ2VsaWYnIHRlc3QgJzonIHN1aXRlKSogWydlbHNlJyAnOicgc3VpdGVdCisgICAgICAgIGlmIDE6IHBhc3MKKyAgICAgICAgaWYgMTogcGFzcworICAgICAgICBlbHNlOiBwYXNzCisgICAgICAgIGlmIDA6IHBhc3MKKyAgICAgICAgZWxpZiAwOiBwYXNzCisgICAgICAgIGlmIDA6IHBhc3MKKyAgICAgICAgZWxpZiAwOiBwYXNzCisgICAgICAgIGVsaWYgMDogcGFzcworICAgICAgICBlbGlmIDA6IHBhc3MKKyAgICAgICAgZWxzZTogcGFzcwogCi1wcmludCAncmFpc2Vfc3RtdCcgIyAncmFpc2UnIHRlc3QgWycsJyB0ZXN0XQotdHJ5OiByYWlzZSBSdW50aW1lRXJyb3IsICdqdXN0IHRlc3RpbmcnCi1leGNlcHQgUnVudGltZUVycm9yOiBwYXNzCi10cnk6IHJhaXNlIEtleWJvYXJkSW50ZXJydXB0Ci1leGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6IHBhc3MKKyAgICBkZWYgdGVzdFdoaWxlKHNlbGYpOgorICAgICAgICAjICd3aGlsZScgdGVzdCAnOicgc3VpdGUgWydlbHNlJyAnOicgc3VpdGVdCisgICAgICAgIHdoaWxlIDA6IHBhc3MKKyAgICAgICAgd2hpbGUgMDogcGFzcworICAgICAgICBlbHNlOiBwYXNzCiAKLXByaW50ICdpbXBvcnRfbmFtZScgIyAnaW1wb3J0JyBkb3R0ZWRfYXNfbmFtZXMKLWltcG9ydCBzeXMKLWltcG9ydCB0aW1lLCBzeXMKLXByaW50ICdpbXBvcnRfZnJvbScgIyAnZnJvbScgZG90dGVkX25hbWUgJ2ltcG9ydCcgKCcqJyB8ICcoJyBpbXBvcnRfYXNfbmFtZXMgJyknIHwgaW1wb3J0X2FzX25hbWVzKQotZnJvbSB0aW1lIGltcG9ydCB0aW1lCi1mcm9tIHRpbWUgaW1wb3J0ICh0aW1lKQotZnJvbSBzeXMgaW1wb3J0ICoKLWZyb20gc3lzIGltcG9ydCBwYXRoLCBhcmd2Ci1mcm9tIHN5cyBpbXBvcnQgKHBhdGgsIGFyZ3YpCi1mcm9tIHN5cyBpbXBvcnQgKHBhdGgsIGFyZ3YsKQorICAgIGRlZiB0ZXN0Rm9yKHNlbGYpOgorICAgICAgICAjICdmb3InIGV4cHJsaXN0ICdpbicgZXhwcmxpc3QgJzonIHN1aXRlIFsnZWxzZScgJzonIHN1aXRlXQorICAgICAgICBmb3IgaSBpbiAxLCAyLCAzOiBwYXNzCisgICAgICAgIGZvciBpLCBqLCBrIGluICgpOiBwYXNzCisgICAgICAgIGVsc2U6IHBhc3MKKyAgICAgICAgY2xhc3MgU3F1YXJlczoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXgpOgorICAgICAgICAgICAgICAgIHNlbGYubWF4ID0gbWF4CisgICAgICAgICAgICAgICAgc2VsZi5zb2ZhciA9IFtdCisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKTogcmV0dXJuIGxlbihzZWxmLnNvZmFyKQorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICAgICAgICAgIGlmIG5vdCAwIDw9IGkgPCBzZWxmLm1heDogcmFpc2UgSW5kZXhFcnJvcgorICAgICAgICAgICAgICAgIG4gPSBsZW4oc2VsZi5zb2ZhcikKKyAgICAgICAgICAgICAgICB3aGlsZSBuIDw9IGk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc29mYXIuYXBwZW5kKG4qbikKKyAgICAgICAgICAgICAgICAgICAgbiA9IG4rMQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnNvZmFyW2ldCisgICAgICAgIG4gPSAwCisgICAgICAgIGZvciB4IGluIFNxdWFyZXMoMTApOiBuID0gbit4CisgICAgICAgIGlmIG4gIT0gMjg1OgorICAgICAgICAgICAgc2VsZi5mYWlsKCdmb3Igb3ZlciBncm93aW5nIHNlcXVlbmNlJykKIAotcHJpbnQgJ2dsb2JhbF9zdG10JyAjICdnbG9iYWwnIE5BTUUgKCcsJyBOQU1FKSoKLWRlZiBmKCk6Ci0gICAgZ2xvYmFsIGEKLSAgICBnbG9iYWwgYSwgYgotICAgIGdsb2JhbCBvbmUsIHR3bywgdGhyZWUsIGZvdXIsIGZpdmUsIHNpeCwgc2V2ZW4sIGVpZ2h0LCBuaW5lLCB0ZW4KKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIHgsIGluIFsoMSwpLCAoMiwpLCAoMywpXToKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFsxLCAyLCAzXSkKIAotcHJpbnQgImFzc2VydF9zdG10IiAjIGFzc2VydF9zdG10OiAnYXNzZXJ0JyB0ZXN0IFsnLCcgdGVzdF0KLWFzc2VydCAxCi1hc3NlcnQgMSwgMQotYXNzZXJ0IGxhbWJkYSB4OngKLWFzc2VydCAxLCBsYW1iZGEgeDp4KzEKKyAgICBkZWYgdGVzdFRyeShzZWxmKToKKyAgICAgICAgIyMjIHRyeV9zdG10OiAndHJ5JyAnOicgc3VpdGUgKGV4Y2VwdF9jbGF1c2UgJzonIHN1aXRlKSsgWydlbHNlJyAnOicgc3VpdGVdCisgICAgICAgICMjIyAgICAgICAgIHwgJ3RyeScgJzonIHN1aXRlICdmaW5hbGx5JyAnOicgc3VpdGUKKyAgICAgICAgIyMjIGV4Y2VwdF9jbGF1c2U6ICdleGNlcHQnIFtleHByIFsnLCcgZXhwcl1dCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIDEvMAorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeTogMS8wCisgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjogcGFzcworICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBtc2c6IHBhc3MKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvciwgbXNnOiBwYXNzCisgICAgICAgIGV4Y2VwdDogcGFzcworICAgICAgICBlbHNlOiBwYXNzCisgICAgICAgIHRyeTogMS8wCisgICAgICAgIGV4Y2VwdCAoRU9GRXJyb3IsIFR5cGVFcnJvciwgWmVyb0RpdmlzaW9uRXJyb3IpOiBwYXNzCisgICAgICAgIHRyeTogMS8wCisgICAgICAgIGV4Y2VwdCAoRU9GRXJyb3IsIFR5cGVFcnJvciwgWmVyb0RpdmlzaW9uRXJyb3IpLCBtc2c6IHBhc3MKKyAgICAgICAgdHJ5OiBwYXNzCisgICAgICAgIGZpbmFsbHk6IHBhc3MKIAotIyMjIGNvbXBvdW5kX3N0bXQ6IGlmX3N0bXQgfCB3aGlsZV9zdG10IHwgZm9yX3N0bXQgfCB0cnlfc3RtdCB8IGZ1bmNkZWYgfCBjbGFzc2RlZgotIyBUZXN0ZWQgYmVsb3cKKyAgICBkZWYgdGVzdFN1aXRlKHNlbGYpOgorICAgICAgICAjIHNpbXBsZV9zdG10IHwgTkVXTElORSBJTkRFTlQgTkVXTElORSogKHN0bXQgTkVXTElORSopKyBERURFTlQKKyAgICAgICAgaWYgMTogcGFzcworICAgICAgICBpZiAxOgorICAgICAgICAgICAgcGFzcworICAgICAgICBpZiAxOgorICAgICAgICAgICAgIworICAgICAgICAgICAgIworICAgICAgICAgICAgIworICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIworICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIwogCi1wcmludCAnaWZfc3RtdCcgIyAnaWYnIHRlc3QgJzonIHN1aXRlICgnZWxpZicgdGVzdCAnOicgc3VpdGUpKiBbJ2Vsc2UnICc6JyBzdWl0ZV0KLWlmIDE6IHBhc3MKLWlmIDE6IHBhc3MKLWVsc2U6IHBhc3MKLWlmIDA6IHBhc3MKLWVsaWYgMDogcGFzcwotaWYgMDogcGFzcwotZWxpZiAwOiBwYXNzCi1lbGlmIDA6IHBhc3MKLWVsaWYgMDogcGFzcwotZWxzZTogcGFzcworICAgIGRlZiB0ZXN0VGVzdChzZWxmKToKKyAgICAgICAgIyMjIGFuZF90ZXN0ICgnb3InIGFuZF90ZXN0KSoKKyAgICAgICAgIyMjIGFuZF90ZXN0OiBub3RfdGVzdCAoJ2FuZCcgbm90X3Rlc3QpKgorICAgICAgICAjIyMgbm90X3Rlc3Q6ICdub3QnIG5vdF90ZXN0IHwgY29tcGFyaXNvbgorICAgICAgICBpZiBub3QgMTogcGFzcworICAgICAgICBpZiAxIGFuZCAxOiBwYXNzCisgICAgICAgIGlmIDEgb3IgMTogcGFzcworICAgICAgICBpZiBub3Qgbm90IG5vdCAxOiBwYXNzCisgICAgICAgIGlmIG5vdCAxIGFuZCAxIGFuZCAxOiBwYXNzCisgICAgICAgIGlmIDEgYW5kIDEgb3IgMSBhbmQgMSBhbmQgMSBvciBub3QgMSBhbmQgMTogcGFzcwogCi1wcmludCAnd2hpbGVfc3RtdCcgIyAnd2hpbGUnIHRlc3QgJzonIHN1aXRlIFsnZWxzZScgJzonIHN1aXRlXQotd2hpbGUgMDogcGFzcwotd2hpbGUgMDogcGFzcwotZWxzZTogcGFzcworICAgIGRlZiB0ZXN0Q29tcGFyaXNvbihzZWxmKToKKyAgICAgICAgIyMjIGNvbXBhcmlzb246IGV4cHIgKGNvbXBfb3AgZXhwcikqCisgICAgICAgICMjIyBjb21wX29wOiAnPCd8Jz4nfCc9PSd8Jz49J3wnPD0nfCchPSd8J2luJ3wnbm90JyAnaW4nfCdpcyd8J2lzJyAnbm90JworICAgICAgICBpZiAxOiBwYXNzCisgICAgICAgIHggPSAoMSA9PSAxKQorICAgICAgICBpZiAxID09IDE6IHBhc3MKKyAgICAgICAgaWYgMSAhPSAxOiBwYXNzCisgICAgICAgIGlmIDEgPCAxOiBwYXNzCisgICAgICAgIGlmIDEgPiAxOiBwYXNzCisgICAgICAgIGlmIDEgPD0gMTogcGFzcworICAgICAgICBpZiAxID49IDE6IHBhc3MKKyAgICAgICAgaWYgMSBpcyAxOiBwYXNzCisgICAgICAgIGlmIDEgaXMgbm90IDE6IHBhc3MKKyAgICAgICAgaWYgMSBpbiAoKTogcGFzcworICAgICAgICBpZiAxIG5vdCBpbiAoKTogcGFzcworICAgICAgICBpZiAxIDwgMSA+IDEgPT0gMSA+PSAxIDw9IDEgIT0gMSBpbiAxIG5vdCBpbiAxIGlzIDEgaXMgbm90IDE6IHBhc3MKIAotcHJpbnQgJ2Zvcl9zdG10JyAjICdmb3InIGV4cHJsaXN0ICdpbicgZXhwcmxpc3QgJzonIHN1aXRlIFsnZWxzZScgJzonIHN1aXRlXQotZm9yIGkgaW4gMSwgMiwgMzogcGFzcwotZm9yIGksIGosIGsgaW4gKCk6IHBhc3MKLWVsc2U6IHBhc3MKLWNsYXNzIFNxdWFyZXM6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG1heCk6Ci0gICAgICAgIHNlbGYubWF4ID0gbWF4Ci0gICAgICAgIHNlbGYuc29mYXIgPSBbXQotICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gbGVuKHNlbGYuc29mYXIpCi0gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgotICAgICAgICBpZiBub3QgMCA8PSBpIDwgc2VsZi5tYXg6IHJhaXNlIEluZGV4RXJyb3IKLSAgICAgICAgbiA9IGxlbihzZWxmLnNvZmFyKQotICAgICAgICB3aGlsZSBuIDw9IGk6Ci0gICAgICAgICAgICBzZWxmLnNvZmFyLmFwcGVuZChuKm4pCi0gICAgICAgICAgICBuID0gbisxCi0gICAgICAgIHJldHVybiBzZWxmLnNvZmFyW2ldCi1uID0gMAotZm9yIHggaW4gU3F1YXJlcygxMCk6IG4gPSBuK3gKLWlmIG4gIT0gMjg1OiByYWlzZSBUZXN0RmFpbGVkLCAnZm9yIG92ZXIgZ3Jvd2luZyBzZXF1ZW5jZScKKyAgICBkZWYgdGVzdEJpbmFyeU1hc2tPcHMoc2VsZik6CisgICAgICAgIHggPSAxICYgMQorICAgICAgICB4ID0gMSBeIDEKKyAgICAgICAgeCA9IDEgfCAxCiAKLXJlc3VsdCA9IFtdCi1mb3IgeCwgaW4gWygxLCksICgyLCksICgzLCldOgotICAgIHJlc3VsdC5hcHBlbmQoeCkKLXZlcmVxKHJlc3VsdCwgWzEsIDIsIDNdKQorICAgIGRlZiB0ZXN0U2hpZnRPcHMoc2VsZik6CisgICAgICAgIHggPSAxIDw8IDEKKyAgICAgICAgeCA9IDEgPj4gMQorICAgICAgICB4ID0gMSA8PCAxID4+IDEKIAotcHJpbnQgJ3RyeV9zdG10JwotIyMjIHRyeV9zdG10OiAndHJ5JyAnOicgc3VpdGUgKGV4Y2VwdF9jbGF1c2UgJzonIHN1aXRlKSsgWydlbHNlJyAnOicgc3VpdGVdCi0jIyMgICAgICAgICB8ICd0cnknICc6JyBzdWl0ZSAnZmluYWxseScgJzonIHN1aXRlCi0jIyMgZXhjZXB0X2NsYXVzZTogJ2V4Y2VwdCcgW2V4cHIgWycsJyBleHByXV0KLXRyeToKLSAgICAxLzAKLWV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKLSAgICBwYXNzCi1lbHNlOgotICAgIHBhc3MKLXRyeTogMS8wCi1leGNlcHQgRU9GRXJyb3I6IHBhc3MKLWV4Y2VwdCBUeXBlRXJyb3IsIG1zZzogcGFzcwotZXhjZXB0IFJ1bnRpbWVFcnJvciwgbXNnOiBwYXNzCi1leGNlcHQ6IHBhc3MKLWVsc2U6IHBhc3MKLXRyeTogMS8wCi1leGNlcHQgKEVPRkVycm9yLCBUeXBlRXJyb3IsIFplcm9EaXZpc2lvbkVycm9yKTogcGFzcwotdHJ5OiAxLzAKLWV4Y2VwdCAoRU9GRXJyb3IsIFR5cGVFcnJvciwgWmVyb0RpdmlzaW9uRXJyb3IpLCBtc2c6IHBhc3MKLXRyeTogcGFzcwotZmluYWxseTogcGFzcworICAgIGRlZiB0ZXN0QWRkaXRpdmVPcHMoc2VsZik6CisgICAgICAgIHggPSAxCisgICAgICAgIHggPSAxICsgMQorICAgICAgICB4ID0gMSAtIDEgLSAxCisgICAgICAgIHggPSAxIC0gMSArIDEgLSAxICsgMQogCi1wcmludCAnc3VpdGUnICMgc2ltcGxlX3N0bXQgfCBORVdMSU5FIElOREVOVCBORVdMSU5FKiAoc3RtdCBORVdMSU5FKikrIERFREVOVAotaWYgMTogcGFzcwotaWYgMToKLSAgICBwYXNzCi1pZiAxOgotICAgICMKLSAgICAjCi0gICAgIwotICAgIHBhc3MKLSAgICBwYXNzCi0gICAgIwotICAgIHBhc3MKLSAgICAjCisgICAgZGVmIHRlc3RNdWx0aXBsaWNhdGl2ZU9wcyhzZWxmKToKKyAgICAgICAgeCA9IDEgKiAxCisgICAgICAgIHggPSAxIC8gMQorICAgICAgICB4ID0gMSAlIDEKKyAgICAgICAgeCA9IDEgLyAxICogMSAlIDEKIAotcHJpbnQgJ3Rlc3QnCi0jIyMgYW5kX3Rlc3QgKCdvcicgYW5kX3Rlc3QpKgotIyMjIGFuZF90ZXN0OiBub3RfdGVzdCAoJ2FuZCcgbm90X3Rlc3QpKgotIyMjIG5vdF90ZXN0OiAnbm90JyBub3RfdGVzdCB8IGNvbXBhcmlzb24KLWlmIG5vdCAxOiBwYXNzCi1pZiAxIGFuZCAxOiBwYXNzCi1pZiAxIG9yIDE6IHBhc3MKLWlmIG5vdCBub3Qgbm90IDE6IHBhc3MKLWlmIG5vdCAxIGFuZCAxIGFuZCAxOiBwYXNzCi1pZiAxIGFuZCAxIG9yIDEgYW5kIDEgYW5kIDEgb3Igbm90IDEgYW5kIDE6IHBhc3MKKyAgICBkZWYgdGVzdFVuYXJ5T3BzKHNlbGYpOgorICAgICAgICB4ID0gKzEKKyAgICAgICAgeCA9IC0xCisgICAgICAgIHggPSB+MQorICAgICAgICB4ID0gfjEgXiAxICYgMSB8IDEgJiAxIF4gLTEKKyAgICAgICAgeCA9IC0xKjEvMSArIDEqMSAtIC0tLTEqMQogCi1wcmludCAnY29tcGFyaXNvbicKLSMjIyBjb21wYXJpc29uOiBleHByIChjb21wX29wIGV4cHIpKgotIyMjIGNvbXBfb3A6ICc8J3wnPid8Jz09J3wnPj0nfCc8PSd8JyE9J3wnaW4nfCdub3QnICdpbid8J2lzJ3wnaXMnICdub3QnCi1pZiAxOiBwYXNzCi14ID0gKDEgPT0gMSkKLWlmIDEgPT0gMTogcGFzcwotaWYgMSAhPSAxOiBwYXNzCi1pZiAxIDwgMTogcGFzcwotaWYgMSA+IDE6IHBhc3MKLWlmIDEgPD0gMTogcGFzcwotaWYgMSA+PSAxOiBwYXNzCi1pZiAxIGlzIDE6IHBhc3MKLWlmIDEgaXMgbm90IDE6IHBhc3MKLWlmIDEgaW4gKCk6IHBhc3MKLWlmIDEgbm90IGluICgpOiBwYXNzCi1pZiAxIDwgMSA+IDEgPT0gMSA+PSAxIDw9IDEgIT0gMSBpbiAxIG5vdCBpbiAxIGlzIDEgaXMgbm90IDE6IHBhc3MKKyAgICBkZWYgdGVzdFNlbGVjdG9ycyhzZWxmKToKKyAgICAgICAgIyMjIHRyYWlsZXI6ICcoJyBbdGVzdGxpc3RdICcpJyB8ICdbJyBzdWJzY3JpcHQgJ10nIHwgJy4nIE5BTUUKKyAgICAgICAgIyMjIHN1YnNjcmlwdDogZXhwciB8IFtleHByXSAnOicgW2V4cHJdCiAKLXByaW50ICdiaW5hcnkgbWFzayBvcHMnCi14ID0gMSAmIDEKLXggPSAxIF4gMQoteCA9IDEgfCAxCisgICAgICAgIGltcG9ydCBzeXMsIHRpbWUKKyAgICAgICAgYyA9IHN5cy5wYXRoWzBdCisgICAgICAgIHggPSB0aW1lLnRpbWUoKQorICAgICAgICB4ID0gc3lzLm1vZHVsZXNbJ3RpbWUnXS50aW1lKCkKKyAgICAgICAgYSA9ICcwMTIzNCcKKyAgICAgICAgYyA9IGFbMF0KKyAgICAgICAgYyA9IGFbLTFdCisgICAgICAgIHMgPSBhWzA6NV0KKyAgICAgICAgcyA9IGFbOjVdCisgICAgICAgIHMgPSBhWzA6XQorICAgICAgICBzID0gYVs6XQorICAgICAgICBzID0gYVstNTpdCisgICAgICAgIHMgPSBhWzotMV0KKyAgICAgICAgcyA9IGFbLTQ6LTNdCisgICAgICAgICMgQSByb3VnaCB0ZXN0IG9mIFNGIGJ1ZyAxMzMzOTgyLiAgaHR0cDovL3B5dGhvbi5vcmcvc2YvMTMzMzk4MgorICAgICAgICAjIFRoZSB0ZXN0aW5nIGhlcmUgaXMgZmFpcmx5IGluY29tcGxldGUuCisgICAgICAgICMgVGVzdCBjYXNlcyBzaG91bGQgaW5jbHVkZTogY29tbWFzIHdpdGggMSBhbmQgMiBjb2xvbnMKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGRbMV0gPSAxCisgICAgICAgIGRbMSxdID0gMgorICAgICAgICBkWzEsMl0gPSAzCisgICAgICAgIGRbMSwyLDNdID0gNAorICAgICAgICBMID0gbGlzdChkKQorICAgICAgICBMLnNvcnQoa2V5PWxhbWJkYSB4OiB4IGlmIGlzaW5zdGFuY2UoeCwgdHVwbGUpIGVsc2UgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHN0cihMKSwgJ1sxLCAoMSwpLCAoMSwgMiksICgxLCAyLCAzKV0nKQogCi1wcmludCAnc2hpZnQgb3BzJwoteCA9IDEgPDwgMQoteCA9IDEgPj4gMQoteCA9IDEgPDwgMSA+PiAxCisgICAgZGVmIHRlc3RBdG9tcyhzZWxmKToKKyAgICAgICAgIyMjIGF0b206ICcoJyBbdGVzdGxpc3RdICcpJyB8ICdbJyBbdGVzdGxpc3RdICddJyB8ICd7JyBbZGljdHNldG1ha2VyXSAnfScgfCBOQU1FIHwgTlVNQkVSIHwgU1RSSU5HCisgICAgICAgICMjIyBkaWN0c2V0bWFrZXI6ICh0ZXN0ICc6JyB0ZXN0ICgnLCcgdGVzdCAnOicgdGVzdCkqIFsnLCddKSB8ICh0ZXN0ICgnLCcgdGVzdCkqIFsnLCddKQogCi1wcmludCAnYWRkaXRpdmUgb3BzJwoteCA9IDEKLXggPSAxICsgMQoteCA9IDEgLSAxIC0gMQoteCA9IDEgLSAxICsgMSAtIDEgKyAxCisgICAgICAgIHggPSAoMSkKKyAgICAgICAgeCA9ICgxIG9yIDIgb3IgMykKKyAgICAgICAgeCA9ICgxIG9yIDIgb3IgMywgMiwgMykKIAotcHJpbnQgJ211bHRpcGxpY2F0aXZlIG9wcycKLXggPSAxICogMQoteCA9IDEgLyAxCi14ID0gMSAlIDEKLXggPSAxIC8gMSAqIDEgJSAxCisgICAgICAgIHggPSBbXQorICAgICAgICB4ID0gWzFdCisgICAgICAgIHggPSBbMSBvciAyIG9yIDNdCisgICAgICAgIHggPSBbMSBvciAyIG9yIDMsIDIsIDNdCisgICAgICAgIHggPSBbXQogCi1wcmludCAndW5hcnkgb3BzJwoteCA9ICsxCi14ID0gLTEKLXggPSB+MQoteCA9IH4xIF4gMSAmIDEgfCAxICYgMSBeIC0xCi14ID0gLTEqMS8xICsgMSoxIC0gLS0tMSoxCisgICAgICAgIHggPSB7fQorICAgICAgICB4ID0geydvbmUnOiAxfQorICAgICAgICB4ID0geydvbmUnOiAxLH0KKyAgICAgICAgeCA9IHsnb25lJyBvciAndHdvJzogMSBvciAyfQorICAgICAgICB4ID0geydvbmUnOiAxLCAndHdvJzogMn0KKyAgICAgICAgeCA9IHsnb25lJzogMSwgJ3R3byc6IDIsfQorICAgICAgICB4ID0geydvbmUnOiAxLCAndHdvJzogMiwgJ3RocmVlJzogMywgJ2ZvdXInOiA0LCAnZml2ZSc6IDUsICdzaXgnOiA2fQogCi1wcmludCAnc2VsZWN0b3JzJwotIyMjIHRyYWlsZXI6ICcoJyBbdGVzdGxpc3RdICcpJyB8ICdbJyBzdWJzY3JpcHQgJ10nIHwgJy4nIE5BTUUKLSMjIyBzdWJzY3JpcHQ6IGV4cHIgfCBbZXhwcl0gJzonIFtleHByXQotZjEoKQotZjIoMSkKLWYyKDEsKQotZjMoMSwgMikKLWYzKDEsIDIsKQotZjQoMSwgKDIsICgzLCA0KSkpCi12MCgpCi12MCgxKQotdjAoMSwpCi12MCgxLDIpCi12MCgxLDIsMyw0LDUsNiw3LDgsOSwwKQotdjEoMSkKLXYxKDEsKQotdjEoMSwyKQotdjEoMSwyLDMpCi12MSgxLDIsMyw0LDUsNiw3LDgsOSwwKQotdjIoMSwyKQotdjIoMSwyLDMpCi12MigxLDIsMyw0KQotdjIoMSwyLDMsNCw1LDYsNyw4LDksMCkKLXYzKDEsKDIsMykpCi12MygxLCgyLDMpLDQpCi12MygxLCgyLDMpLDQsNSw2LDcsOCw5LDApCi1wcmludAotaW1wb3J0IHN5cywgdGltZQotYyA9IHN5cy5wYXRoWzBdCi14ID0gdGltZS50aW1lKCkKLXggPSBzeXMubW9kdWxlc1sndGltZSddLnRpbWUoKQotYSA9ICcwMTIzNCcKLWMgPSBhWzBdCi1jID0gYVstMV0KLXMgPSBhWzA6NV0KLXMgPSBhWzo1XQotcyA9IGFbMDpdCi1zID0gYVs6XQotcyA9IGFbLTU6XQotcyA9IGFbOi0xXQotcyA9IGFbLTQ6LTNdCi0jIEEgcm91Z2ggdGVzdCBvZiBTRiBidWcgMTMzMzk4Mi4gIGh0dHA6Ly9weXRob24ub3JnL3NmLzEzMzM5ODIKLSMgVGhlIHRlc3RpbmcgaGVyZSBpcyBmYWlybHkgaW5jb21wbGV0ZS4KLSMgVGVzdCBjYXNlcyBzaG91bGQgaW5jbHVkZTogY29tbWFzIHdpdGggMSBhbmQgMiBjb2xvbnMKLWQgPSB7fQotZFsxXSA9IDEKLWRbMSxdID0gMgotZFsxLDJdID0gMwotZFsxLDIsM10gPSA0Ci1MID0gbGlzdChkKQotTC5zb3J0KGtleT1sYW1iZGEgeDogeCBpZiBpc2luc3RhbmNlKHgsIHR1cGxlKSBlbHNlICgpKQotcHJpbnQgTAorICAgICAgICB4ID0geydvbmUnfQorICAgICAgICB4ID0geydvbmUnLCAxLH0KKyAgICAgICAgeCA9IHsnb25lJywgJ3R3bycsICd0aHJlZSd9CisgICAgICAgIHggPSB7MiwgMywgNCx9CisKKyAgICAgICAgeCA9IHgKKyAgICAgICAgeCA9ICd4JworICAgICAgICB4ID0gMTIzCisKKyAgICAjIyMgZXhwcmxpc3Q6IGV4cHIgKCcsJyBleHByKSogWycsJ10KKyAgICAjIyMgdGVzdGxpc3Q6IHRlc3QgKCcsJyB0ZXN0KSogWycsJ10KKyAgICAjIFRoZXNlIGhhdmUgYmVlbiBleGVyY2lzZWQgZW5vdWdoIGFib3ZlCisKKyAgICBkZWYgdGVzdENsYXNzZGVmKHNlbGYpOgorICAgICAgICAjICdjbGFzcycgTkFNRSBbJygnIFt0ZXN0bGlzdF0gJyknXSAnOicgc3VpdGUKKyAgICAgICAgY2xhc3MgQjogcGFzcworICAgICAgICBjbGFzcyBCMigpOiBwYXNzCisgICAgICAgIGNsYXNzIEMxKEIpOiBwYXNzCisgICAgICAgIGNsYXNzIEMyKEIpOiBwYXNzCisgICAgICAgIGNsYXNzIEQoQzEsIEMyLCBCKTogcGFzcworICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIG1ldGgxKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgbWV0aDIoc2VsZiwgYXJnKTogcGFzcworICAgICAgICAgICAgZGVmIG1ldGgzKHNlbGYsIGExLCBhMik6IHBhc3MKKworICAgIGRlZiB0ZXN0TGlzdGNvbXBzKHNlbGYpOgorICAgICAgICAjIGxpc3QgY29tcHJlaGVuc2lvbiB0ZXN0cworICAgICAgICBudW1zID0gWzEsIDIsIDMsIDQsIDVdCisgICAgICAgIHN0cnMgPSBbIkFwcGxlIiwgIkJhbmFuYSIsICJDb2NvbnV0Il0KKyAgICAgICAgc3BjcyA9IFsiICBBcHBsZSIsICIgQmFuYW5hICIsICJDb2NvICBudXQgICJdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbcy5zdHJpcCgpIGZvciBzIGluIHNwY3NdLCBbJ0FwcGxlJywgJ0JhbmFuYScsICdDb2NvICBudXQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbMyAqIHggZm9yIHggaW4gbnVtc10sIFszLCA2LCA5LCAxMiwgMTVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFt4IGZvciB4IGluIG51bXMgaWYgeCA+IDJdLCBbMywgNCwgNV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyhpLCBzKSBmb3IgaSBpbiBudW1zIGZvciBzIGluIHN0cnNdLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoMSwgJ0FwcGxlJyksICgxLCAnQmFuYW5hJyksICgxLCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ0FwcGxlJyksICgyLCAnQmFuYW5hJyksICgyLCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgJ0FwcGxlJyksICgzLCAnQmFuYW5hJyksICgzLCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ0FwcGxlJyksICg0LCAnQmFuYW5hJyksICg0LCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoNSwgJ0FwcGxlJyksICg1LCAnQmFuYW5hJyksICg1LCAnQ29jb251dCcpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbKGksIHMpIGZvciBpIGluIG51bXMgZm9yIHMgaW4gW2YgZm9yIGYgaW4gc3RycyBpZiAibiIgaW4gZl1dLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoMSwgJ0JhbmFuYScpLCAoMSwgJ0NvY29udXQnKSwgKDIsICdCYW5hbmEnKSwgKDIsICdDb2NvbnV0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgzLCAnQmFuYW5hJyksICgzLCAnQ29jb251dCcpLCAoNCwgJ0JhbmFuYScpLCAoNCwgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdCYW5hbmEnKSwgKDUsICdDb2NvbnV0JyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsobGFtYmRhIGE6W2EqKmkgZm9yIGkgaW4gcmFuZ2UoYSsxKV0pKGopIGZvciBqIGluIHJhbmdlKDUpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbWzFdLCBbMSwgMV0sIFsxLCAyLCA0XSwgWzEsIDMsIDksIDI3XSwgWzEsIDQsIDE2LCA2NCwgMjU2XV0pCisKKyAgICAgICAgZGVmIHRlc3RfaW5fZnVuYyhsKToKKyAgICAgICAgICAgIHJldHVybiBbMCA8IHggPCAzIGZvciB4IGluIGwgaWYgeCA+IDJdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0X2luX2Z1bmMobnVtcyksIFtGYWxzZSwgRmFsc2UsIEZhbHNlXSkKKworICAgICAgICBkZWYgdGVzdF9uZXN0ZWRfZnJvbnQoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW1t5IGZvciB5IGluIFt4LCB4ICsgMV1dIGZvciB4IGluIFsxLDMsNV1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbWzEsIDJdLCBbMywgNF0sIFs1LCA2XV0pCisKKyAgICAgICAgdGVzdF9uZXN0ZWRfZnJvbnQoKQorCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiW2ksIHMgZm9yIGkgaW4gbnVtcyBmb3IgcyBpbiBzdHJzXSIpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiW3ggaWYgeV0iKQorCisgICAgICAgIHN1cHBsaWVycyA9IFsKKyAgICAgICAgICAoMSwgIkJvZWluZyIpLAorICAgICAgICAgICgyLCAiRm9yZCIpLAorICAgICAgICAgICgzLCAiTWFjZG9uYWxkcyIpCisgICAgICAgIF0KKworICAgICAgICBwYXJ0cyA9IFsKKyAgICAgICAgICAoMTAsICJBaXJsaW5lciIpLAorICAgICAgICAgICgyMCwgIkVuZ2luZSIpLAorICAgICAgICAgICgzMCwgIkNoZWVzZWJ1cmdlciIpCisgICAgICAgIF0KKworICAgICAgICBzdXBwYXJ0ID0gWworICAgICAgICAgICgxLCAxMCksICgxLCAyMCksICgyLCAyMCksICgzLCAzMCkKKyAgICAgICAgXQorCisgICAgICAgIHggPSBbCisgICAgICAgICAgKHNuYW1lLCBwbmFtZSkKKyAgICAgICAgICAgIGZvciAoc25vLCBzbmFtZSkgaW4gc3VwcGxpZXJzCisgICAgICAgICAgICAgIGZvciAocG5vLCBwbmFtZSkgaW4gcGFydHMKKyAgICAgICAgICAgICAgICBmb3IgKHNwX3Nubywgc3BfcG5vKSBpbiBzdXBwYXJ0CisgICAgICAgICAgICAgICAgICBpZiBzbm8gPT0gc3Bfc25vIGFuZCBwbm8gPT0gc3BfcG5vCisgICAgICAgIF0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIFsoJ0JvZWluZycsICdBaXJsaW5lcicpLCAoJ0JvZWluZycsICdFbmdpbmUnKSwgKCdGb3JkJywgJ0VuZ2luZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ01hY2RvbmFsZHMnLCAnQ2hlZXNlYnVyZ2VyJyldKQorCisgICAgZGVmIHRlc3RHZW5leHBzKHNlbGYpOgorICAgICAgICAjIGdlbmVyYXRvciBleHByZXNzaW9uIHRlc3RzCisgICAgICAgIGcgPSAoW3ggZm9yIHggaW4gcmFuZ2UoMTApXSBmb3IgeCBpbiByYW5nZSgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnLm5leHQoKSwgW3ggZm9yIHggaW4gcmFuZ2UoMTApXSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZy5uZXh0KCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnc2hvdWxkIHByb2R1Y2UgU3RvcEl0ZXJhdGlvbiBleGNlcHRpb24nKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBhID0gMQorICAgICAgICB0cnk6CisgICAgICAgICAgICBnID0gKGEgZm9yIGQgaW4gYSkKKyAgICAgICAgICAgIGcubmV4dCgpCisgICAgICAgICAgICBzZWxmLmZhaWwoJ3Nob3VsZCBwcm9kdWNlIFR5cGVFcnJvcicpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KCh4LCB5KSBmb3IgeCBpbiAnYWJjZCcgZm9yIHkgaW4gJ2FiY2QnKSwgWyh4LCB5KSBmb3IgeCBpbiAnYWJjZCcgZm9yIHkgaW4gJ2FiY2QnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KCh4LCB5KSBmb3IgeCBpbiAnYWInIGZvciB5IGluICd4eScpLCBbKHgsIHkpIGZvciB4IGluICdhYicgZm9yIHkgaW4gJ3h5J10pCisKKyAgICAgICAgYSA9IFt4IGZvciB4IGluIHJhbmdlKDEwKV0KKyAgICAgICAgYiA9ICh4IGZvciB4IGluICh5IGZvciB5IGluIGEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bShiKSwgc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKHgqKjIgZm9yIHggaW4gcmFuZ2UoMTApKSwgc3VtKFt4KioyIGZvciB4IGluIHJhbmdlKDEwKV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4KnggZm9yIHggaW4gcmFuZ2UoMTApIGlmIHglMiksIHN1bShbeCp4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4JTJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiByYW5nZSgxMCkpKSwgc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4IGZvciB4IGluICh5IGZvciB5IGluICh6IGZvciB6IGluIHJhbmdlKDEwKSkpKSwgc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4IGZvciB4IGluIFt5IGZvciB5IGluICh6IGZvciB6IGluIHJhbmdlKDEwKSldKSwgc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4IGZvciB4IGluICh5IGZvciB5IGluICh6IGZvciB6IGluIHJhbmdlKDEwKSBpZiBUcnVlKSkgaWYgVHJ1ZSksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkgaWYgVHJ1ZSkgaWYgRmFsc2UpIGlmIFRydWUpLCAwKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImZvbyh4IGZvciB4IGluIHJhbmdlKDEwKSwgMTAwKSIpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiZm9vKDEwMCwgeCBmb3IgeCBpbiByYW5nZSgxMCkpIikKKworICAgIGRlZiB0ZXN0Q29tcHJlaGVuc2lvblNwZWNpYWxzKHNlbGYpOgorICAgICAgICAjIHRlc3QgZm9yIG91dG1vc3QgaXRlcmFibGUgcHJlY29tcHV0YXRpb24KKyAgICAgICAgeCA9IDEwOyBnID0gKGkgZm9yIGkgaW4gcmFuZ2UoeCkpOyB4ID0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaXN0KGcpKSwgMTApCisKKyAgICAgICAgIyBUaGlzIHNob3VsZCBob2xkLCBzaW5jZSB3ZSdyZSBvbmx5IHByZWNvbXB1dGluZyBvdXRtb3N0IGl0ZXJhYmxlLgorICAgICAgICB4ID0gMTA7IHQgPSBGYWxzZTsgZyA9ICgoaSxqKSBmb3IgaSBpbiByYW5nZSh4KSBpZiB0IGZvciBqIGluIHJhbmdlKHgpKQorICAgICAgICB4ID0gNTsgdCA9IFRydWU7CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyhpLGopIGZvciBpIGluIHJhbmdlKDEwKSBmb3IgaiBpbiByYW5nZSg1KV0sIGxpc3QoZykpCisKKyAgICAgICAgIyBHcmFtbWFyIGFsbG93cyBtdWx0aXBsZSBhZGphY2VudCAnaWYncyBpbiBsaXN0Y29tcHMgYW5kIGdlbmV4cHMsCisgICAgICAgICMgZXZlbiB0aG91Z2ggaXQncyBzaWxseS4gTWFrZSBzdXJlIGl0IHdvcmtzIChpZmVsc2UgYnJva2UgdGhpcy4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyB4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4ICUgMiBpZiB4ICUgMyBdLCBbMSwgNSwgN10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4ICUgMiBpZiB4ICUgMyksIFsxLCA1LCA3XSkKKworICAgICAgICAjIHZlcmlmeSB1bnBhY2tpbmcgc2luZ2xlIGVsZW1lbnQgdHVwbGVzIGluIGxpc3Rjb21wL2dlbmV4cC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbeCBmb3IgeCwgaW4gWyg0LCksICg1LCksICg2LCldXSwgWzQsIDUsIDZdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoeCBmb3IgeCwgaW4gWyg3LCksICg4LCksICg5LCldKSwgWzcsIDgsIDldKQorCisgICAgZGVmIHRlc3RJZkVsc2VFeHByKHNlbGYpOgorICAgICAgICAjIFRlc3QgaWZlbHNlIGV4cHJlc3Npb25zIGluIHZhcmlvdXMgY2FzZXMKKyAgICAgICAgZGVmIF9jaGVja2V2YWwobXNnLCByZXQpOgorICAgICAgICAgICAgImhlbHBlciB0byBjaGVjayB0aGF0IGV2YWx1YXRpb24gb2YgZXhwcmVzc2lvbnMgaXMgZG9uZSBjb3JyZWN0bHkiCisgICAgICAgICAgICBwcmludCB4CisgICAgICAgICAgICByZXR1cm4gcmV0CisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbIHgoKSBmb3IgeCBpbiBsYW1iZGE6IFRydWUsIGxhbWJkYTogRmFsc2UgaWYgeCgpIF0sIFtUcnVlXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbIHgoKSBmb3IgeCBpbiAobGFtYmRhOiBUcnVlLCBsYW1iZGE6IEZhbHNlKSBpZiB4KCkgXSwgW1RydWVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsgeChGYWxzZSkgZm9yIHggaW4gKGxhbWJkYSB4OiBGYWxzZSBpZiB4IGVsc2UgVHJ1ZSwgbGFtYmRhIHg6IFRydWUgaWYgeCBlbHNlIEZhbHNlKSBpZiB4KEZhbHNlKSBdLCBbVHJ1ZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDUgaWYgMSBlbHNlIF9jaGVja2V2YWwoImNoZWNrIDEiLCAwKSksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKF9jaGVja2V2YWwoImNoZWNrIDIiLCAwKSBpZiAwIGVsc2UgNSksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDUgYW5kIDYgaWYgMCBlbHNlIDEpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgoNSBhbmQgNikgaWYgMCBlbHNlIDEpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg1IGFuZCAoNiBpZiAxIGVsc2UgMSkpLCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgwIG9yIF9jaGVja2V2YWwoImNoZWNrIDMiLCAyKSBpZiAwIGVsc2UgMyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEgb3IgX2NoZWNrZXZhbCgiY2hlY2sgNCIsIDIpIGlmIDEgZWxzZSBfY2hlY2tldmFsKCJjaGVjayA1IiwgMykpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgwIG9yIDUgaWYgMSBlbHNlIF9jaGVja2V2YWwoImNoZWNrIDYiLCAzKSksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKG5vdCA1IGlmIDEgZWxzZSAxKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKG5vdCA1IGlmIDAgZWxzZSAxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNiArIDEgaWYgMSBlbHNlIDIpLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2IC0gMSBpZiAxIGVsc2UgMiksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDYgKiAyIGlmIDEgZWxzZSA0KSwgMTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDYgLyAyIGlmIDEgZWxzZSAzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNiA8IDQgaWYgMCBlbHNlIDIpLCAyKQogCiAKLXByaW50ICdhdG9tcycKLSMjIyBhdG9tOiAnKCcgW3Rlc3RsaXN0XSAnKScgfCAnWycgW3Rlc3RsaXN0XSAnXScgfCAneycgW2RpY3RzZXRtYWtlcl0gJ30nIHwgTkFNRSB8IE5VTUJFUiB8IFNUUklORwotIyMjIGRpY3RzZXRtYWtlcjogKHRlc3QgJzonIHRlc3QgKCcsJyB0ZXN0ICc6JyB0ZXN0KSogWycsJ10pIHwgKHRlc3QgKCcsJyB0ZXN0KSogWycsJ10pCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFRva2VuVGVzdHMsIEdyYW1tYXJUZXN0cykKIAoteCA9ICgxKQoteCA9ICgxIG9yIDIgb3IgMykKLXggPSAoMSBvciAyIG9yIDMsIDIsIDMpCi0KLXggPSBbXQoteCA9IFsxXQoteCA9IFsxIG9yIDIgb3IgM10KLXggPSBbMSBvciAyIG9yIDMsIDIsIDNdCi14ID0gW10KLQoteCA9IHt9Ci14ID0geydvbmUnOiAxfQoteCA9IHsnb25lJzogMSx9Ci14ID0geydvbmUnIG9yICd0d28nOiAxIG9yIDJ9Ci14ID0geydvbmUnOiAxLCAndHdvJzogMn0KLXggPSB7J29uZSc6IDEsICd0d28nOiAyLH0KLXggPSB7J29uZSc6IDEsICd0d28nOiAyLCAndGhyZWUnOiAzLCAnZm91cic6IDQsICdmaXZlJzogNSwgJ3NpeCc6IDZ9Ci0KLXggPSB7J29uZSd9Ci14ID0geydvbmUnLCAxLH0KLXggPSB7J29uZScsICd0d28nLCAndGhyZWUnfQoteCA9IHsyLCAzLCA0LH0KLQoteCA9IHgKLXggPSAneCcKLXggPSAxMjMKLQotIyMjIGV4cHJsaXN0OiBleHByICgnLCcgZXhwcikqIFsnLCddCi0jIyMgdGVzdGxpc3Q6IHRlc3QgKCcsJyB0ZXN0KSogWycsJ10KLSMgVGhlc2UgaGF2ZSBiZWVuIGV4ZXJjaXNlZCBlbm91Z2ggYWJvdmUKLQotcHJpbnQgJ2NsYXNzZGVmJyAjICdjbGFzcycgTkFNRSBbJygnIFt0ZXN0bGlzdF0gJyknXSAnOicgc3VpdGUKLWNsYXNzIEI6IHBhc3MKLWNsYXNzIEIyKCk6IHBhc3MKLWNsYXNzIEMxKEIpOiBwYXNzCi1jbGFzcyBDMihCKTogcGFzcwotY2xhc3MgRChDMSwgQzIsIEIpOiBwYXNzCi1jbGFzcyBDOgotICAgIGRlZiBtZXRoMShzZWxmKTogcGFzcwotICAgIGRlZiBtZXRoMihzZWxmLCBhcmcpOiBwYXNzCi0gICAgZGVmIG1ldGgzKHNlbGYsIGExLCBhMik6IHBhc3MKLQotIyBsaXN0IGNvbXByZWhlbnNpb24gdGVzdHMKLW51bXMgPSBbMSwgMiwgMywgNCwgNV0KLXN0cnMgPSBbIkFwcGxlIiwgIkJhbmFuYSIsICJDb2NvbnV0Il0KLXNwY3MgPSBbIiAgQXBwbGUiLCAiIEJhbmFuYSAiLCAiQ29jbyAgbnV0ICAiXQotCi1wcmludCBbcy5zdHJpcCgpIGZvciBzIGluIHNwY3NdCi1wcmludCBbMyAqIHggZm9yIHggaW4gbnVtc10KLXByaW50IFt4IGZvciB4IGluIG51bXMgaWYgeCA+IDJdCi1wcmludCBbKGksIHMpIGZvciBpIGluIG51bXMgZm9yIHMgaW4gc3Ryc10KLXByaW50IFsoaSwgcykgZm9yIGkgaW4gbnVtcyBmb3IgcyBpbiBbZiBmb3IgZiBpbiBzdHJzIGlmICJuIiBpbiBmXV0KLXByaW50IFsobGFtYmRhIGE6W2EqKmkgZm9yIGkgaW4gcmFuZ2UoYSsxKV0pKGopIGZvciBqIGluIHJhbmdlKDUpXQotCi1kZWYgdGVzdF9pbl9mdW5jKGwpOgotICAgIHJldHVybiBbMCA8IHggPCAzIGZvciB4IGluIGwgaWYgeCA+IDJdCi0KLXByaW50IHRlc3RfaW5fZnVuYyhudW1zKQotCi1kZWYgdGVzdF9uZXN0ZWRfZnJvbnQoKToKLSAgICBwcmludCBbW3kgZm9yIHkgaW4gW3gsIHggKyAxXV0gZm9yIHggaW4gWzEsMyw1XV0KLQotdGVzdF9uZXN0ZWRfZnJvbnQoKQotCi1jaGVja19zeW50YXgoIltpLCBzIGZvciBpIGluIG51bXMgZm9yIHMgaW4gc3Ryc10iKQotY2hlY2tfc3ludGF4KCJbeCBpZiB5XSIpCi0KLXN1cHBsaWVycyA9IFsKLSAgKDEsICJCb2VpbmciKSwKLSAgKDIsICJGb3JkIiksCi0gICgzLCAiTWFjZG9uYWxkcyIpCi1dCi0KLXBhcnRzID0gWwotICAoMTAsICJBaXJsaW5lciIpLAotICAoMjAsICJFbmdpbmUiKSwKLSAgKDMwLCAiQ2hlZXNlYnVyZ2VyIikKLV0KLQotc3VwcGFydCA9IFsKLSAgKDEsIDEwKSwgKDEsIDIwKSwgKDIsIDIwKSwgKDMsIDMwKQotXQotCi1wcmludCBbCi0gIChzbmFtZSwgcG5hbWUpCi0gICAgZm9yIChzbm8sIHNuYW1lKSBpbiBzdXBwbGllcnMKLSAgICAgIGZvciAocG5vLCBwbmFtZSkgaW4gcGFydHMKLSAgICAgICAgZm9yIChzcF9zbm8sIHNwX3BubykgaW4gc3VwcGFydAotICAgICAgICAgIGlmIHNubyA9PSBzcF9zbm8gYW5kIHBubyA9PSBzcF9wbm8KLV0KLQotIyBnZW5lcmF0b3IgZXhwcmVzc2lvbiB0ZXN0cwotZyA9IChbeCBmb3IgeCBpbiByYW5nZSgxMCldIGZvciB4IGluIHJhbmdlKDEpKQotdmVyaWZ5KGcubmV4dCgpID09IFt4IGZvciB4IGluIHJhbmdlKDEwKV0pCi10cnk6Ci0gICAgZy5uZXh0KCkKLSAgICByYWlzZSBUZXN0RmFpbGVkLCAnc2hvdWxkIHByb2R1Y2UgU3RvcEl0ZXJhdGlvbiBleGNlcHRpb24nCi1leGNlcHQgU3RvcEl0ZXJhdGlvbjoKLSAgICBwYXNzCi0KLWEgPSAxCi10cnk6Ci0gICAgZyA9IChhIGZvciBkIGluIGEpCi0gICAgZy5uZXh0KCkKLSAgICByYWlzZSBUZXN0RmFpbGVkLCAnc2hvdWxkIHByb2R1Y2UgVHlwZUVycm9yJwotZXhjZXB0IFR5cGVFcnJvcjoKLSAgICBwYXNzCi0KLXZlcmlmeShsaXN0KCh4LCB5KSBmb3IgeCBpbiAnYWJjZCcgZm9yIHkgaW4gJ2FiY2QnKSA9PSBbKHgsIHkpIGZvciB4IGluICdhYmNkJyBmb3IgeSBpbiAnYWJjZCddKQotdmVyaWZ5KGxpc3QoKHgsIHkpIGZvciB4IGluICdhYicgZm9yIHkgaW4gJ3h5JykgPT0gWyh4LCB5KSBmb3IgeCBpbiAnYWInIGZvciB5IGluICd4eSddKQotCi1hID0gW3ggZm9yIHggaW4gcmFuZ2UoMTApXQotYiA9ICh4IGZvciB4IGluICh5IGZvciB5IGluIGEpKQotdmVyaWZ5KHN1bShiKSA9PSBzdW0oW3ggZm9yIHggaW4gcmFuZ2UoMTApXSkpCi0KLXZlcmlmeShzdW0oeCoqMiBmb3IgeCBpbiByYW5nZSgxMCkpID09IHN1bShbeCoqMiBmb3IgeCBpbiByYW5nZSgxMCldKSkKLXZlcmlmeShzdW0oeCp4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4JTIpID09IHN1bShbeCp4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4JTJdKSkKLXZlcmlmeShzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiByYW5nZSgxMCkpKSA9PSBzdW0oW3ggZm9yIHggaW4gcmFuZ2UoMTApXSkpCi12ZXJpZnkoc3VtKHggZm9yIHggaW4gKHkgZm9yIHkgaW4gKHogZm9yIHogaW4gcmFuZ2UoMTApKSkpID09IHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKLXZlcmlmeShzdW0oeCBmb3IgeCBpbiBbeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkpXSkgPT0gc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQotdmVyaWZ5KHN1bSh4IGZvciB4IGluICh5IGZvciB5IGluICh6IGZvciB6IGluIHJhbmdlKDEwKSBpZiBUcnVlKSkgaWYgVHJ1ZSkgPT0gc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQotdmVyaWZ5KHN1bSh4IGZvciB4IGluICh5IGZvciB5IGluICh6IGZvciB6IGluIHJhbmdlKDEwKSBpZiBUcnVlKSBpZiBGYWxzZSkgaWYgVHJ1ZSkgPT0gMCkKLWNoZWNrX3N5bnRheCgiZm9vKHggZm9yIHggaW4gcmFuZ2UoMTApLCAxMDApIikKLWNoZWNrX3N5bnRheCgiZm9vKDEwMCwgeCBmb3IgeCBpbiByYW5nZSgxMCkpIikKLQotIyB0ZXN0IGZvciBvdXRtb3N0IGl0ZXJhYmxlIHByZWNvbXB1dGF0aW9uCi14ID0gMTA7IGcgPSAoaSBmb3IgaSBpbiByYW5nZSh4KSk7IHggPSA1Ci12ZXJpZnkobGVuKGxpc3QoZykpID09IDEwKQotCi0jIFRoaXMgc2hvdWxkIGhvbGQsIHNpbmNlIHdlJ3JlIG9ubHkgcHJlY29tcHV0aW5nIG91dG1vc3QgaXRlcmFibGUuCi14ID0gMTA7IHQgPSBGYWxzZTsgZyA9ICgoaSxqKSBmb3IgaSBpbiByYW5nZSh4KSBpZiB0IGZvciBqIGluIHJhbmdlKHgpKQoteCA9IDU7IHQgPSBUcnVlOwotdmVyaWZ5KFsoaSxqKSBmb3IgaSBpbiByYW5nZSgxMCkgZm9yIGogaW4gcmFuZ2UoNSldID09IGxpc3QoZykpCi0KLSMgR3JhbW1hciBhbGxvd3MgbXVsdGlwbGUgYWRqYWNlbnQgJ2lmJ3MgaW4gbGlzdGNvbXBzIGFuZCBnZW5leHBzLAotIyBldmVuIHRob3VnaCBpdCdzIHNpbGx5LiBNYWtlIHN1cmUgaXQgd29ya3MgKGlmZWxzZSBicm9rZSB0aGlzLikKLXZlcmlmeShbIHggZm9yIHggaW4gcmFuZ2UoMTApIGlmIHggJSAyIGlmIHggJSAzIF0sIFsxLCA1LCA3XSkKLXZlcmlmeSgoeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCAlIDIgaWYgeCAlIDMpLCBbMSwgNSwgN10pCi0KLSMgVGVzdCBpZmVsc2UgZXhwcmVzc2lvbnMgaW4gdmFyaW91cyBjYXNlcwotZGVmIF9jaGVja2V2YWwobXNnLCByZXQpOgotICAgICJoZWxwZXIgdG8gY2hlY2sgdGhhdCBldmFsdWF0aW9uIG9mIGV4cHJlc3Npb25zIGlzIGRvbmUgY29ycmVjdGx5IgotICAgIHByaW50IHgKLSAgICByZXR1cm4gcmV0Ci0KLXZlcmlmeShbIHgoKSBmb3IgeCBpbiBsYW1iZGE6IFRydWUsIGxhbWJkYTogRmFsc2UgaWYgeCgpIF0gPT0gW1RydWVdKQotdmVyaWZ5KFsgeCgpIGZvciB4IGluIChsYW1iZGE6IFRydWUsIGxhbWJkYTogRmFsc2UpIGlmIHgoKSBdID09IFtUcnVlXSkKLXZlcmlmeShbIHgoRmFsc2UpIGZvciB4IGluIChsYW1iZGEgeDogRmFsc2UgaWYgeCBlbHNlIFRydWUsIGxhbWJkYSB4OiBUcnVlIGlmIHggZWxzZSBGYWxzZSkgaWYgeChGYWxzZSkgXSA9PSBbVHJ1ZV0pCi12ZXJpZnkoKDUgaWYgMSBlbHNlIF9jaGVja2V2YWwoImNoZWNrIDEiLCAwKSkgPT0gNSkKLXZlcmlmeSgoX2NoZWNrZXZhbCgiY2hlY2sgMiIsIDApIGlmIDAgZWxzZSA1KSA9PSA1KQotdmVyaWZ5KCg1IGFuZCA2IGlmIDAgZWxzZSAxKSA9PSAxKQotdmVyaWZ5KCgoNSBhbmQgNikgaWYgMCBlbHNlIDEpID09IDEpCi12ZXJpZnkoKDUgYW5kICg2IGlmIDEgZWxzZSAxKSkgPT0gNikKLXZlcmlmeSgoMCBvciBfY2hlY2tldmFsKCJjaGVjayAzIiwgMikgaWYgMCBlbHNlIDMpID09IDMpCi12ZXJpZnkoKDEgb3IgX2NoZWNrZXZhbCgiY2hlY2sgNCIsIDIpIGlmIDEgZWxzZSBfY2hlY2tldmFsKCJjaGVjayA1IiwgMykpID09IDEpCi12ZXJpZnkoKDAgb3IgNSBpZiAxIGVsc2UgX2NoZWNrZXZhbCgiY2hlY2sgNiIsIDMpKSA9PSA1KQotdmVyaWZ5KChub3QgNSBpZiAxIGVsc2UgMSkgPT0gRmFsc2UpCi12ZXJpZnkoKG5vdCA1IGlmIDAgZWxzZSAxKSA9PSAxKQotdmVyaWZ5KCg2ICsgMSBpZiAxIGVsc2UgMikgPT0gNykKLXZlcmlmeSgoNiAtIDEgaWYgMSBlbHNlIDIpID09IDUpCi12ZXJpZnkoKDYgKiAyIGlmIDEgZWxzZSA0KSA9PSAxMikKLXZlcmlmeSgoNiAvIDIgaWYgMSBlbHNlIDMpID09IDMpCi12ZXJpZnkoKDYgPCA0IGlmIDAgZWxzZSAyKSA9PSAyKQoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nemlwLnB5IGIvTGliL3Rlc3QvdGVzdF9nemlwLnB5CmluZGV4IDBmOGUwM2UuLjk5ODlhOTIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ3ppcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2d6aXAucHkKQEAgLTEyOCw2ICsxMjgsMTcgQEAKICAgICAgICAgICAgIGYuc2VlayhuZXdwb3MpICAjIHBvc2l0aXZlIHNlZWsKICAgICAgICAgZi5jbG9zZSgpCiAKKyAgICBkZWYgdGVzdF9zZWVrX3doZW5jZShzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X3dyaXRlKCkKKyAgICAgICAgIyBUcnkgc2Vlayh3aGVuY2U9MSksIHJlYWQgdGVzdAorCisgICAgICAgIGYgPSBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUpCisgICAgICAgIGYucmVhZCgxMCkKKyAgICAgICAgZi5zZWVrKDEwLCB3aGVuY2U9MSkKKyAgICAgICAgeSA9IGYucmVhZCgxMCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHksIGRhdGExWzIwOjMwXSkKKyAgICAgICAgCiAgICAgZGVmIHRlc3Rfc2Vla193cml0ZShzZWxmKToKICAgICAgICAgIyBUcnkgc2Vlaywgd3JpdGUgdGVzdAogICAgICAgICBmID0gZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lLCAndycpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2h0dHBsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2h0dHBsaWIucHkKaW5kZXggOTBiYWU4OC4uOTBhNGU1NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9odHRwbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaHR0cGxpYi5weQpAQCAtMTAsOSArMTAsMTAgQEAKICAgICBkZWYgX19pbml0X18oc2VsZiwgdGV4dCwgZmlsZWNsYXNzPVN0cmluZ0lPLlN0cmluZ0lPKToKICAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAogICAgICAgICBzZWxmLmZpbGVjbGFzcyA9IGZpbGVjbGFzcworICAgICAgICBzZWxmLmRhdGEgPSAnJwogCiAgICAgZGVmIHNlbmRhbGwoc2VsZiwgZGF0YSk6Ci0gICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKKyAgICAgICAgc2VsZi5kYXRhICs9IGRhdGEKIAogICAgIGRlZiBtYWtlZmlsZShzZWxmLCBtb2RlLCBidWZzaXplPU5vbmUpOgogICAgICAgICBpZiBtb2RlICE9ICdyJyBhbmQgbW9kZSAhPSAncmInOgpAQCAtNzAsMTAzICs3MSw4NiBAQAogICAgICAgICAgICAgICAgIGNvbm4ucmVxdWVzdCgnUE9TVCcsICcvJywgYm9keSwgaGVhZGVycykKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbm4uX2J1ZmZlci5jb3VudFtoZWFkZXIubG93ZXIoKV0sIDEpCiAKLSMgQ29sbGVjdCBvdXRwdXQgdG8gYSBidWZmZXIgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNvcGUgd2l0aCBsaW5lLWVuZGluZwotIyBpc3N1ZXMgYWNyb3NzIHBsYXRmb3Jtcy4gIFNwZWNpZmljYWxseSwgdGhlIGhlYWRlcnMgd2lsbCBoYXZlIFxyXG4gcGFpcnMKLSMgYW5kIHNvbWUgcGxhdGZvcm1zIHdpbGwgc3RyaXAgdGhlbSBmcm9tIHRoZSBvdXRwdXQgZmlsZS4KK2NsYXNzIEJhc2ljVGVzdChUZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfc3RhdHVzX2xpbmVzKHNlbGYpOgorICAgICAgICAjIFRlc3QgSFRUUCBzdGF0dXMgbGluZXMKIAotZGVmIHRlc3QoKToKLSAgICBidWYgPSBTdHJpbmdJTy5TdHJpbmdJTygpCi0gICAgX3N0ZG91dCA9IHN5cy5zdGRvdXQKLSAgICB0cnk6Ci0gICAgICAgIHN5cy5zdGRvdXQgPSBidWYKLSAgICAgICAgX3Rlc3QoKQotICAgIGZpbmFsbHk6Ci0gICAgICAgIHN5cy5zdGRvdXQgPSBfc3Rkb3V0Ci0KLSAgICAjIHByaW50IGluZGl2aWR1YWwgbGluZXMgd2l0aCBlbmRpbmdzIHN0cmlwcGVkCi0gICAgcyA9IGJ1Zi5nZXR2YWx1ZSgpCi0gICAgZm9yIGxpbmUgaW4gcy5zcGxpdCgiXG4iKToKLSAgICAgICAgcHJpbnQgbGluZS5zdHJpcCgpCi0KLWRlZiBfdGVzdCgpOgotICAgICMgVGVzdCBIVFRQIHN0YXR1cyBsaW5lcwotCi0gICAgYm9keSA9ICJIVFRQLzEuMSAyMDAgT2tcclxuXHJcblRleHQiCi0gICAgc29jayA9IEZha2VTb2NrZXQoYm9keSkKLSAgICByZXNwID0gaHR0cGxpYi5IVFRQUmVzcG9uc2Uoc29jaywgMSkKLSAgICByZXNwLmJlZ2luKCkKLSAgICBwcmludCByZXNwLnJlYWQoKQotICAgIHJlc3AuY2xvc2UoKQotCi0gICAgYm9keSA9ICJIVFRQLzEuMSA0MDAuMTAwIE5vdCBPa1xyXG5cclxuVGV4dCIKLSAgICBzb2NrID0gRmFrZVNvY2tldChib2R5KQotICAgIHJlc3AgPSBodHRwbGliLkhUVFBSZXNwb25zZShzb2NrLCAxKQotICAgIHRyeToKKyAgICAgICAgYm9keSA9ICJIVFRQLzEuMSAyMDAgT2tcclxuXHJcblRleHQiCisgICAgICAgIHNvY2sgPSBGYWtlU29ja2V0KGJvZHkpCisgICAgICAgIHJlc3AgPSBodHRwbGliLkhUVFBSZXNwb25zZShzb2NrKQogICAgICAgICByZXNwLmJlZ2luKCkKLSAgICBleGNlcHQgaHR0cGxpYi5CYWRTdGF0dXNMaW5lOgotICAgICAgICBwcmludCAiQmFkU3RhdHVzTGluZSByYWlzZWQgYXMgZXhwZWN0ZWQiCi0gICAgZWxzZToKLSAgICAgICAgcHJpbnQgIkV4cGVjdCBCYWRTdGF0dXNMaW5lIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3AucmVhZCgpLCAnVGV4dCcpCisgICAgICAgIHJlc3AuY2xvc2UoKQogCi0gICAgIyBDaGVjayBpbnZhbGlkIGhvc3RfcG9ydAorICAgICAgICBib2R5ID0gIkhUVFAvMS4xIDQwMC4xMDAgTm90IE9rXHJcblxyXG5UZXh0IgorICAgICAgICBzb2NrID0gRmFrZVNvY2tldChib2R5KQorICAgICAgICByZXNwID0gaHR0cGxpYi5IVFRQUmVzcG9uc2Uoc29jaykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoaHR0cGxpYi5CYWRTdGF0dXNMaW5lLCByZXNwLmJlZ2luKQogCi0gICAgZm9yIGhwIGluICgid3d3LnB5dGhvbi5vcmc6YWJjIiwgInd3dy5weXRob24ub3JnOiIpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBoID0gaHR0cGxpYi5IVFRQKGhwKQotICAgICAgICBleGNlcHQgaHR0cGxpYi5JbnZhbGlkVVJMOgotICAgICAgICAgICAgcHJpbnQgIkludmFsaWRVUkwgcmFpc2VkIGFzIGV4cGVjdGVkIgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQgIkV4cGVjdCBJbnZhbGlkVVJMIgorICAgIGRlZiB0ZXN0X2hvc3RfcG9ydChzZWxmKToKKyAgICAgICAgIyBDaGVjayBpbnZhbGlkIGhvc3RfcG9ydAogCi0gICAgZm9yIGhwLGgscCBpbiAoKCJbZmU4MDo6MjA3OmU5ZmY6ZmU5Yl06ODAwMCIsICJmZTgwOjoyMDc6ZTlmZjpmZTliIiwgODAwMCksCi0gICAgICAgICAgICAgICAgICAgKCJ3d3cucHl0aG9uLm9yZzo4MCIsICJ3d3cucHl0aG9uLm9yZyIsIDgwKSwKLSAgICAgICAgICAgICAgICAgICAoInd3dy5weXRob24ub3JnIiwgInd3dy5weXRob24ub3JnIiwgODApLAotICAgICAgICAgICAgICAgICAgICgiW2ZlODA6OjIwNzplOWZmOmZlOWJdIiwgImZlODA6OjIwNzplOWZmOmZlOWIiLCA4MCkpOgotICAgICAgICB0cnk6CisgICAgICAgIGZvciBocCBpbiAoInd3dy5weXRob24ub3JnOmFiYyIsICJ3d3cucHl0aG9uLm9yZzoiKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGh0dHBsaWIuSW52YWxpZFVSTCwgaHR0cGxpYi5IVFRQLCBocCkKKworICAgICAgICBmb3IgaHAsIGgsIHAgaW4gKCgiW2ZlODA6OjIwNzplOWZmOmZlOWJdOjgwMDAiLCAiZmU4MDo6MjA3OmU5ZmY6ZmU5YiIsIDgwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICgid3d3LnB5dGhvbi5vcmc6ODAiLCAid3d3LnB5dGhvbi5vcmciLCA4MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCJ3d3cucHl0aG9uLm9yZyIsICJ3d3cucHl0aG9uLm9yZyIsIDgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoIltmZTgwOjoyMDc6ZTlmZjpmZTliXSIsICJmZTgwOjoyMDc6ZTlmZjpmZTliIiwgODApKToKICAgICAgICAgICAgIGh0dHAgPSBodHRwbGliLkhUVFAoaHApCi0gICAgICAgIGV4Y2VwdCBodHRwbGliLkludmFsaWRVUkw6Ci0gICAgICAgICAgICBwcmludCAiSW52YWxpZFVSTCByYWlzZWQgZXJyb25lb3VzbHkiCi0gICAgICAgIGMgPSBodHRwLl9jb25uCi0gICAgICAgIGlmIGggIT0gYy5ob3N0OiByYWlzZSBBc3NlcnRpb25FcnJvciwgKCJIb3N0IGluY29ycmVjdGx5IHBhcnNlZCIsIGgsIGMuaG9zdCkKLSAgICAgICAgaWYgcCAhPSBjLnBvcnQ6IHJhaXNlIEFzc2VydGlvbkVycm9yLCAoIlBvcnQgaW5jb3JyZWN0bHkgcGFyc2VkIiwgcCwgYy5ob3N0KQorICAgICAgICAgICAgYyA9IGh0dHAuX2Nvbm4KKyAgICAgICAgICAgIGlmIGggIT0gYy5ob3N0OiBzZWxmLmZhaWwoIkhvc3QgaW5jb3JyZWN0bHkgcGFyc2VkOiAlcyAhPSAlcyIgJSAoaCwgYy5ob3N0KSkKKyAgICAgICAgICAgIGlmIHAgIT0gYy5wb3J0OiBzZWxmLmZhaWwoIlBvcnQgaW5jb3JyZWN0bHkgcGFyc2VkOiAlcyAhPSAlcyIgJSAocCwgYy5ob3N0KSkKIAotICAgICMgdGVzdCByZXNwb25zZSB3aXRoIG11bHRpcGxlIG1lc3NhZ2UgaGVhZGVycyB3aXRoIHRoZSBzYW1lIGZpZWxkIG5hbWUuCi0gICAgdGV4dCA9ICgnSFRUUC8xLjEgMjAwIE9LXHJcbicKLSAgICAgICAgICAgICdTZXQtQ29va2llOiBDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSJcclxuJwotICAgICAgICAgICAgJ1NldC1Db29raWU6IFBhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7IFZlcnNpb249IjEiOycKLSAgICAgICAgICAgICcgUGF0aD0iL2FjbWUiXHJcbicKLSAgICAgICAgICAgICdcclxuJwotICAgICAgICAgICAgJ05vIGJvZHlcclxuJykKLSAgICBoZHIgPSAoJ0N1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicKLSAgICAgICAgICAgJywgJwotICAgICAgICAgICAnUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpCi0gICAgcyA9IEZha2VTb2NrZXQodGV4dCkKLSAgICByID0gaHR0cGxpYi5IVFRQUmVzcG9uc2UocywgMSkKLSAgICByLmJlZ2luKCkKLSAgICBjb29raWVzID0gci5nZXRoZWFkZXIoIlNldC1Db29raWUiKQotICAgIGlmIGNvb2tpZXMgIT0gaGRyOgotICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvciwgIm11bHRpcGxlIGhlYWRlcnMgbm90IGNvbWJpbmVkIHByb3Blcmx5IgorICAgIGRlZiB0ZXN0X3Jlc3BvbnNlX2hlYWRlcnMoc2VsZik6CisgICAgICAgICMgdGVzdCByZXNwb25zZSB3aXRoIG11bHRpcGxlIG1lc3NhZ2UgaGVhZGVycyB3aXRoIHRoZSBzYW1lIGZpZWxkIG5hbWUuCisgICAgICAgIHRleHQgPSAoJ0hUVFAvMS4xIDIwMCBPS1xyXG4nCisgICAgICAgICAgICAgICAgJ1NldC1Db29raWU6IEN1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIlxyXG4nCisgICAgICAgICAgICAgICAgJ1NldC1Db29raWU6IFBhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7IFZlcnNpb249IjEiOycKKyAgICAgICAgICAgICAgICAnIFBhdGg9Ii9hY21lIlxyXG4nCisgICAgICAgICAgICAgICAgJ1xyXG4nCisgICAgICAgICAgICAgICAgJ05vIGJvZHlcclxuJykKKyAgICAgICAgaGRyID0gKCdDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSInCisgICAgICAgICAgICAgICAnLCAnCisgICAgICAgICAgICAgICAnUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpCisgICAgICAgIHMgPSBGYWtlU29ja2V0KHRleHQpCisgICAgICAgIHIgPSBodHRwbGliLkhUVFBSZXNwb25zZShzKQorICAgICAgICByLmJlZ2luKCkKKyAgICAgICAgY29va2llcyA9IHIuZ2V0aGVhZGVyKCJTZXQtQ29va2llIikKKyAgICAgICAgaWYgY29va2llcyAhPSBoZHI6CisgICAgICAgICAgICBzZWxmLmZhaWwoIm11bHRpcGxlIGhlYWRlcnMgbm90IGNvbWJpbmVkIHByb3Blcmx5IikKIAotICAgICMgVGVzdCB0aGF0IHRoZSBsaWJyYXJ5IGRvZXNuJ3QgYXR0ZW1wdCB0byByZWFkIGFueSBkYXRhCi0gICAgIyBmcm9tIGEgSEVBRCByZXF1ZXN0LiAgKFRpY2tsZXMgU0YgYnVnICM2MjIwNDIuKQotICAgIHNvY2sgPSBGYWtlU29ja2V0KAotICAgICAgICAnSFRUUC8xLjEgMjAwIE9LXHJcbicKLSAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoOiAxNDQzMlxyXG4nCi0gICAgICAgICdcclxuJywKLSAgICAgICAgTm9FT0ZTdHJpbmdJTykKLSAgICByZXNwID0gaHR0cGxpYi5IVFRQUmVzcG9uc2Uoc29jaywgMSwgbWV0aG9kPSJIRUFEIikKLSAgICByZXNwLmJlZ2luKCkKLSAgICBpZiByZXNwLnJlYWQoKSAhPSAiIjoKLSAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IsICJEaWQgbm90IGV4cGVjdCByZXNwb25zZSBmcm9tIEhFQUQgcmVxdWVzdCIKLSAgICByZXNwLmNsb3NlKCkKKyAgICBkZWYgdGVzdF9yZWFkX2hlYWQoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHRoZSBsaWJyYXJ5IGRvZXNuJ3QgYXR0ZW1wdCB0byByZWFkIGFueSBkYXRhCisgICAgICAgICMgZnJvbSBhIEhFQUQgcmVxdWVzdC4gIChUaWNrbGVzIFNGIGJ1ZyAjNjIyMDQyLikKKyAgICAgICAgc29jayA9IEZha2VTb2NrZXQoCisgICAgICAgICAgICAnSFRUUC8xLjEgMjAwIE9LXHJcbicKKyAgICAgICAgICAgICdDb250ZW50LUxlbmd0aDogMTQ0MzJcclxuJworICAgICAgICAgICAgJ1xyXG4nLAorICAgICAgICAgICAgTm9FT0ZTdHJpbmdJTykKKyAgICAgICAgcmVzcCA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHNvY2ssIG1ldGhvZD0iSEVBRCIpCisgICAgICAgIHJlc3AuYmVnaW4oKQorICAgICAgICBpZiByZXNwLnJlYWQoKSAhPSAiIjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkIG5vdCBleHBlY3QgcmVzcG9uc2UgZnJvbSBIRUFEIHJlcXVlc3QiKQorICAgICAgICByZXNwLmNsb3NlKCkKIAorICAgIGRlZiB0ZXN0X3NlbmRfZmlsZShzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSAnR0VUIC9mb28gSFRUUC8xLjFcclxuSG9zdDogZXhhbXBsZS5jb21cclxuJyBcCisgICAgICAgICAgICAgICAgICAgJ0FjY2VwdC1FbmNvZGluZzogaWRlbnRpdHlcclxuQ29udGVudC1MZW5ndGg6JworCisgICAgICAgIGJvZHkgPSBvcGVuKF9fZmlsZV9fLCAncmInKQorICAgICAgICBjb25uID0gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbignZXhhbXBsZS5jb20nKQorICAgICAgICBzb2NrID0gRmFrZVNvY2tldChib2R5KQorICAgICAgICBjb25uLnNvY2sgPSBzb2NrCisgICAgICAgIGNvbm4ucmVxdWVzdCgnR0VUJywgJy9mb28nLCBib2R5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29jay5kYXRhLnN0YXJ0c3dpdGgoZXhwZWN0ZWQpKQogCiBjbGFzcyBPZmZsaW5lVGVzdChUZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfcmVzcG9uc2VzKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhodHRwbGliLnJlc3BvbnNlc1todHRwbGliLk5PVF9GT1VORF0sICJOb3QgRm91bmQiKQogCiBkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6Ci0gICAgdGVzdHMgPSBbSGVhZGVyVGVzdHMsT2ZmbGluZVRlc3RdCi0gICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChIZWFkZXJUZXN0cywgT2ZmbGluZVRlc3QsIEJhc2ljVGVzdCkKIAotdGVzdCgpCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcC5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wLnB5CmluZGV4IDg5M2JhMjQuLjYyYjE0ZTAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wLnB5CkBAIC0xLDQzICsxLDQ3IEBACiBpbXBvcnQgaW1wCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0RmFpbGVkLCBUZXN0U2tpcHBlZAotdHJ5OgotICAgIGltcG9ydCB0aHJlYWQKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICByYWlzZSBUZXN0U2tpcHBlZCgidGVzdCBvbmx5IHZhbGlkIHdoZW4gdGhyZWFkIHN1cHBvcnQgaXMgYXZhaWxhYmxlIikKK2ltcG9ydCB0aHJlYWQKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIAotZGVmIHZlcmlmeV9sb2NrX3N0YXRlKGV4cGVjdGVkKToKLSAgICBpZiBpbXAubG9ja19oZWxkKCkgIT0gZXhwZWN0ZWQ6Ci0gICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoImV4cGVjdGVkIGltcC5sb2NrX2hlbGQoKSB0byBiZSAlciIgJSBleHBlY3RlZCkKIAotZGVmIHRlc3RMb2NrKCk6Ci0gICAgTE9PUFMgPSA1MAorY2xhc3MgTG9ja1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotICAgICMgVGhlIGltcG9ydCBsb2NrIG1heSBhbHJlYWR5IGJlIGhlbGQsIGUuZy4gaWYgdGhlIHRlc3Qgc3VpdGUgaXMgcnVuCi0gICAgIyB2aWEgImltcG9ydCB0ZXN0LmF1dG90ZXN0Ii4KLSAgICBsb2NrX2hlbGRfYXRfc3RhcnQgPSBpbXAubG9ja19oZWxkKCkKLSAgICB2ZXJpZnlfbG9ja19zdGF0ZShsb2NrX2hlbGRfYXRfc3RhcnQpCisgICAgIiIiVmVyeSBiYXNpYyB0ZXN0IG9mIGltcG9ydCBsb2NrIGZ1bmN0aW9ucy4iIiIKIAotICAgIGZvciBpIGluIHJhbmdlKExPT1BTKToKLSAgICAgICAgaW1wLmFjcXVpcmVfbG9jaygpCi0gICAgICAgIHZlcmlmeV9sb2NrX3N0YXRlKFRydWUpCisgICAgZGVmIHZlcmlmeV9sb2NrX3N0YXRlKHNlbGYsIGV4cGVjdGVkKToKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoaW1wLmxvY2tfaGVsZCgpLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGltcC5sb2NrX2hlbGQoKSB0byBiZSAlciIgJSBleHBlY3RlZCkKKyAgICBkZWYgdGVzdExvY2soc2VsZik6CisgICAgICAgIExPT1BTID0gNTAKIAotICAgIGZvciBpIGluIHJhbmdlKExPT1BTKToKLSAgICAgICAgaW1wLnJlbGVhc2VfbG9jaygpCisgICAgICAgICMgVGhlIGltcG9ydCBsb2NrIG1heSBhbHJlYWR5IGJlIGhlbGQsIGUuZy4gaWYgdGhlIHRlc3Qgc3VpdGUgaXMgcnVuCisgICAgICAgICMgdmlhICJpbXBvcnQgdGVzdC5hdXRvdGVzdCIuCisgICAgICAgIGxvY2tfaGVsZF9hdF9zdGFydCA9IGltcC5sb2NrX2hlbGQoKQorICAgICAgICBzZWxmLnZlcmlmeV9sb2NrX3N0YXRlKGxvY2tfaGVsZF9hdF9zdGFydCkKIAotICAgICMgVGhlIG9yaWdpbmFsIHN0YXRlIHNob3VsZCBiZSByZXN0b3JlZCBub3cuCi0gICAgdmVyaWZ5X2xvY2tfc3RhdGUobG9ja19oZWxkX2F0X3N0YXJ0KQorICAgICAgICBmb3IgaSBpbiByYW5nZShMT09QUyk6CisgICAgICAgICAgICBpbXAuYWNxdWlyZV9sb2NrKCkKKyAgICAgICAgICAgIHNlbGYudmVyaWZ5X2xvY2tfc3RhdGUoVHJ1ZSkKIAotICAgIGlmIG5vdCBsb2NrX2hlbGRfYXRfc3RhcnQ6Ci0gICAgICAgIHRyeToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTE9PUFMpOgogICAgICAgICAgICAgaW1wLnJlbGVhc2VfbG9jaygpCi0gICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJyZWxlYXNlX2xvY2soKSB3aXRob3V0IGxvY2sgc2hvdWxkIHJhaXNlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJ1bnRpbWVFcnJvciIpCisKKyAgICAgICAgIyBUaGUgb3JpZ2luYWwgc3RhdGUgc2hvdWxkIGJlIHJlc3RvcmVkIG5vdy4KKyAgICAgICAgc2VsZi52ZXJpZnlfbG9ja19zdGF0ZShsb2NrX2hlbGRfYXRfc3RhcnQpCisKKyAgICAgICAgaWYgbm90IGxvY2tfaGVsZF9hdF9zdGFydDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXAucmVsZWFzZV9sb2NrKCkKKyAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInJlbGVhc2VfbG9jaygpIHdpdGhvdXQgbG9jayBzaG91bGQgcmFpc2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSdW50aW1lRXJyb3IiKQogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgdGVzdExvY2soKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgICAgICAgICAgTG9ja1Rlc3RzLAorICAgICAgICAgICAgKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydC5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0LnB5CmluZGV4IGI2NGMyM2IuLmUzNzM3OGYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0LnB5CkBAIC0xLDIxICsxLDExIEBACi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIFRlc3RGYWlsZWQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0CiAKK2ltcG9ydCB1bml0dGVzdAogaW1wb3J0IG9zCiBpbXBvcnQgcmFuZG9tCiBpbXBvcnQgc3lzCiBpbXBvcnQgcHlfY29tcGlsZQogCi0jIEJyaWVmIGRpZ3Jlc3Npb24gdG8gdGVzdCB0aGF0IGltcG9ydCBpcyBjYXNlLXNlbnNpdGl2ZTogIGlmIHdlIGdvdCB0aGlzCi0jIGZhciwgd2Uga25vdyBmb3Igc3VyZSB0aGF0ICJyYW5kb20iIGV4aXN0cy4KLXRyeToKLSAgICBpbXBvcnQgUkFuRG9NCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgcGFzcwotZWxzZToKLSAgICByYWlzZSBUZXN0RmFpbGVkKCJpbXBvcnQgb2YgUkFuRG9NIHNob3VsZCBoYXZlIGZhaWxlZCAoY2FzZSBtaXNtYXRjaCkiKQotCi0jIEFub3RoZXIgYnJpZWYgZGlncmVzc2lvbiB0byB0ZXN0IHRoZSBhY2N1cmFjeSBvZiBtYW5pZmVzdCBmbG9hdCBjb25zdGFudHMuCi1mcm9tIHRlc3QgaW1wb3J0IGRvdWJsZV9jb25zdCAgIyBkb24ndCBibGluayAtLSB0aGF0ICp3YXMqIHRoZSB0ZXN0CiAKIGRlZiByZW1vdmVfZmlsZXMobmFtZSk6CiAgICAgZm9yIGYgaW4gKG5hbWUgKyBvcy5leHRzZXAgKyAicHkiLApAQCAtMjYsMTk5ICsxNiwyMDYgQEAKICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZik6CiAgICAgICAgICAgICBvcy5yZW1vdmUoZikKIAotZGVmIHRlc3Rfd2l0aF9leHRlbnNpb24oZXh0KTogIyBleHQgbm9ybWFsbHkgIi5weSI7IHBlcmhhcHMgIi5weXciCi0gICAgc291cmNlID0gVEVTVEZOICsgZXh0Ci0gICAgcHlvID0gVEVTVEZOICsgb3MuZXh0c2VwICsgInB5byIKLSAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgotICAgICAgICBweWMgPSBURVNURk4gKyAiJHB5LmNsYXNzIgotICAgIGVsc2U6Ci0gICAgICAgIHB5YyA9IFRFU1RGTiArIG9zLmV4dHNlcCArICJweWMiCiAKLSAgICBmID0gb3Blbihzb3VyY2UsICJ3IikKLSAgICBwcmludCA+PiBmLCAiIyBUaGlzIHRlc3RzIFB5dGhvbidzIGFiaWxpdHkgdG8gaW1wb3J0IGEiLCBleHQsICJmaWxlLiIKLSAgICBhID0gcmFuZG9tLnJhbmRyYW5nZSgxMDAwKQotICAgIGIgPSByYW5kb20ucmFuZHJhbmdlKDEwMDApCi0gICAgcHJpbnQgPj4gZiwgImEgPSIsIGEKLSAgICBwcmludCA+PiBmLCAiYiA9IiwgYgotICAgIGYuY2xvc2UoKQorY2xhc3MgSW1wb3J0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgICB0cnk6CisgICAgZGVmIHRlc3RDYXNlU2Vuc2l0aXZpdHkoc2VsZik6CisgICAgICAgICMgQnJpZWYgZGlncmVzc2lvbiB0byB0ZXN0IHRoYXQgaW1wb3J0IGlzIGNhc2Utc2Vuc2l0aXZlOiAgaWYgd2UgZ290IHRoaXMKKyAgICAgICAgIyBmYXIsIHdlIGtub3cgZm9yIHN1cmUgdGhhdCAicmFuZG9tIiBleGlzdHMuCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIG1vZCA9IF9faW1wb3J0X18oVEVTVEZOKQotICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsIGVycjoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImltcG9ydCBmcm9tICVzIGZhaWxlZDogJXMiICUgKGV4dCwgZXJyKSkKLQotICAgICAgICBpZiBtb2QuYSAhPSBhIG9yIG1vZC5iICE9IGI6Ci0gICAgICAgICAgICBwcmludCBhLCAiIT0iLCBtb2QuYQotICAgICAgICAgICAgcHJpbnQgYiwgIiE9IiwgbW9kLmIKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZHVsZSBsb2FkZWQgKCVzKSBidXQgY29udGVudHMgaW52YWxpZCIgJSBtb2QpCi0gICAgZmluYWxseToKLSAgICAgICAgb3MudW5saW5rKHNvdXJjZSkKLQotICAgIHRyeToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmVsb2FkKG1vZCkKLSAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCBlcnI6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbXBvcnQgZnJvbSAucHljLy5weW8gZmFpbGVkOiAlcyIgJSBlcnIpCi0gICAgZmluYWxseToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgb3MudW5saW5rKHB5YykKLSAgICAgICAgZXhjZXB0IG9zLmVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBvcy51bmxpbmsocHlvKQotICAgICAgICBleGNlcHQgb3MuZXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGRlbCBzeXMubW9kdWxlc1tURVNURk5dCi0KLXN5cy5wYXRoLmluc2VydCgwLCBvcy5jdXJkaXIpCi10cnk6Ci0gICAgdGVzdF93aXRoX2V4dGVuc2lvbihvcy5leHRzZXAgKyAicHkiKQotICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJ3aW4iKToKLSAgICAgICAgZm9yIGV4dCBpbiAiLlBZIiwgIi5QeSIsICIucFkiLCAiLnB5dyIsICIuUFlXIiwgIi5wWXciOgotICAgICAgICAgICAgdGVzdF93aXRoX2V4dGVuc2lvbihleHQpCi1maW5hbGx5OgotICAgIGRlbCBzeXMucGF0aFswXQotCi0jIFZlcmlmeSB0aGF0IHRoZSBpbXAgbW9kdWxlIGNhbiBjb3JyZWN0bHkgbG9hZCBhbmQgZmluZCAucHkgZmlsZXMKLWltcG9ydCBpbXAKLXggPSBpbXAuZmluZF9tb2R1bGUoIm9zIikKLW9zID0gaW1wLmxvYWRfbW9kdWxlKCJvcyIsICp4KQotCi1kZWYgdGVzdF9tb2R1bGVfd2l0aF9sYXJnZV9zdGFjayhtb2R1bGUpOgotICAgICMgY3JlYXRlIG1vZHVsZSB3L2xpc3Qgb2YgNjUwMDAgZWxlbWVudHMgdG8gdGVzdCBidWcgIzU2MTg1OAotICAgIGZpbGVuYW1lID0gbW9kdWxlICsgb3MuZXh0c2VwICsgJ3B5JwotCi0gICAgIyBjcmVhdGUgYSBmaWxlIHdpdGggYSBsaXN0IG9mIDY1MDAwIGVsZW1lbnRzCi0gICAgZiA9IG9wZW4oZmlsZW5hbWUsICd3KycpCi0gICAgZi53cml0ZSgnZCA9IFtcbicpCi0gICAgZm9yIGkgaW4gcmFuZ2UoNjUwMDApOgotICAgICAgICBmLndyaXRlKCciIixcbicpCi0gICAgZi53cml0ZSgnXScpCi0gICAgZi5jbG9zZSgpCi0KLSAgICAjIGNvbXBpbGUgJiByZW1vdmUgLnB5IGZpbGUsIHdlIG9ubHkgbmVlZCAucHljIChvciAucHlvKQotICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAncicpCi0gICAgcHlfY29tcGlsZS5jb21waWxlKGZpbGVuYW1lKQotICAgIGYuY2xvc2UoKQotICAgIG9zLnVubGluayhmaWxlbmFtZSkKLQotICAgICMgbmVlZCB0byBiZSBhYmxlIHRvIGxvYWQgZnJvbSBjdXJyZW50IGRpcgotICAgIHN5cy5wYXRoLmFwcGVuZCgnJykKLQotICAgICMgdGhpcyB1c2VkIHRvIGNyYXNoCi0gICAgZXhlYygnaW1wb3J0ICcgKyBtb2R1bGUpCi0KLSAgICAjIGNsZWFudXAKLSAgICBkZWwgc3lzLnBhdGhbLTFdCi0gICAgZm9yIGV4dCBpbiAncHljJywgJ3B5byc6Ci0gICAgICAgIGZuYW1lID0gbW9kdWxlICsgb3MuZXh0c2VwICsgZXh0Ci0gICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZuYW1lKToKLSAgICAgICAgICAgIG9zLnVubGluayhmbmFtZSkKLQotdGVzdF9tb2R1bGVfd2l0aF9sYXJnZV9zdGFjaygnbG9uZ2xpc3QnKQotCi1kZWYgdGVzdF9mYWlsaW5nX2ltcG9ydF9zdGlja3MoKToKLSAgICBzb3VyY2UgPSBURVNURk4gKyBvcy5leHRzZXAgKyAicHkiCi0gICAgZiA9IG9wZW4oc291cmNlLCAidyIpCi0gICAgcHJpbnQgPj4gZiwgImEgPSAxLzAiCi0gICAgZi5jbG9zZSgpCi0KLSAgICAjIE5ldyBpbiAyLjQsIHdlIHNob3VsZG4ndCBiZSBhYmxlIHRvIGltcG9ydCB0aGF0IG5vIG1hdHRlciBob3cgb2Z0ZW4KLSAgICAjIHdlIHRyeS4KLSAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MuY3VyZGlyKQotICAgIHRyeToKLSAgICAgICAgZm9yIGkgaW4gMSwgMiwgMzoKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKFRFU1RGTikKLSAgICAgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKLSAgICAgICAgICAgICAgICBpZiBURVNURk4gaW4gc3lzLm1vZHVsZXM6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoImRhbWFnZWQgbW9kdWxlIGluIHN5cy5tb2R1bGVzIiwgaSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgid2FzIGFibGUgdG8gaW1wb3J0IGEgZGFtYWdlZCBtb2R1bGUiLCBpKQotICAgIGZpbmFsbHk6Ci0gICAgICAgIHN5cy5wYXRoLnBvcCgwKQotICAgICAgICByZW1vdmVfZmlsZXMoVEVTVEZOKQotCi10ZXN0X2ZhaWxpbmdfaW1wb3J0X3N0aWNrcygpCi0KLWRlZiB0ZXN0X2ZhaWxpbmdfcmVsb2FkKCk6Ci0gICAgIyBBIGZhaWxpbmcgcmVsb2FkIHNob3VsZCBsZWF2ZSB0aGUgbW9kdWxlIG9iamVjdCBpbiBzeXMubW9kdWxlcy4KLSAgICBzb3VyY2UgPSBURVNURk4gKyBvcy5leHRzZXAgKyAicHkiCi0gICAgZiA9IG9wZW4oc291cmNlLCAidyIpCi0gICAgcHJpbnQgPj4gZiwgImEgPSAxIgotICAgIHByaW50ID4+IGYsICJiID0gMiIKLSAgICBmLmNsb3NlKCkKLQotICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5jdXJkaXIpCi0gICAgdHJ5OgotICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKFRFU1RGTikKLSAgICAgICAgaWYgVEVTVEZOIG5vdCBpbiBzeXMubW9kdWxlczoKLSAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoImV4cGVjdGVkIG1vZHVsZSBpbiBzeXMubW9kdWxlcyIpCi0gICAgICAgIGlmIG1vZC5hICE9IDEgb3IgbW9kLmIgIT0gMjoKLSAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoIm1vZHVsZSBoYXMgd3JvbmcgYXR0cmlidXRlIHZhbHVlcyIpCi0KLSAgICAgICAgIyBPbiBXaW5YUCwganVzdCByZXBsYWNpbmcgdGhlIC5weSBmaWxlIHdhc24ndCBlbm91Z2ggdG8KLSAgICAgICAgIyBjb252aW5jZSByZWxvYWQoKSB0byByZXBhcnNlIGl0LiAgTWF5YmUgdGhlIHRpbWVzdGFtcCBkaWRuJ3QKLSAgICAgICAgIyBtb3ZlIGVub3VnaC4gIFdlIGZvcmNlIGl0IHRvIGdldCByZXBhcnNlZCBieSByZW1vdmluZyB0aGUKLSAgICAgICAgIyBjb21waWxlZCBmaWxlIHRvby4KLSAgICAgICAgcmVtb3ZlX2ZpbGVzKFRFU1RGTikKLQotICAgICAgICAjIE5vdyBkYW1hZ2UgdGhlIG1vZHVsZS4KLSAgICAgICAgZiA9IG9wZW4oc291cmNlLCAidyIpCi0gICAgICAgIHByaW50ID4+IGYsICJhID0gMTAiCi0gICAgICAgIHByaW50ID4+IGYsICJiID0gMjAvLzAiCi0gICAgICAgIGYuY2xvc2UoKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZWxvYWQobW9kKQotICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICBpbXBvcnQgUkFuRG9NCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoIndhcyBhYmxlIHRvIHJlbG9hZCBhIGRhbWFnZWQgbW9kdWxlIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiaW1wb3J0IG9mIFJBbkRvTSBzaG91bGQgaGF2ZSBmYWlsZWQgKGNhc2UgbWlzbWF0Y2gpIikKIAotICAgICAgICAjIEJ1dCB3ZSBzdGlsbCBleHBlY3QgdGhlIG1vZHVsZSB0byBiZSBpbiBzeXMubW9kdWxlcy4KLSAgICAgICAgbW9kID0gc3lzLm1vZHVsZXMuZ2V0KFRFU1RGTikKLSAgICAgICAgaWYgbW9kIGlzIE5vbmU6Ci0gICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJleHBlY3RlZCBtb2R1bGUgdG8gc3RpbGwgYmUgaW4gc3lzLm1vZHVsZXMiKQotICAgICAgICAjIFdlIHNob3VsZCBoYXZlIHJlcGxhY2VkIGEgdy8gMTAsIGJ1dCB0aGUgb2xkIGIgdmFsdWUgc2hvdWxkCi0gICAgICAgICMgc3RpY2suCi0gICAgICAgIGlmIG1vZC5hICE9IDEwIG9yIG1vZC5iICE9IDI6Ci0gICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJtb2R1bGUgaGFzIHdyb25nIGF0dHJpYnV0ZSB2YWx1ZXMiKQorICAgIGRlZiB0ZXN0RG91YmxlQ29uc3Qoc2VsZik6CisgICAgICAgICMgQW5vdGhlciBicmllZiBkaWdyZXNzaW9uIHRvIHRlc3QgdGhlIGFjY3VyYWN5IG9mIG1hbmlmZXN0IGZsb2F0IGNvbnN0YW50cy4KKyAgICAgICAgZnJvbSB0ZXN0IGltcG9ydCBkb3VibGVfY29uc3QgICMgZG9uJ3QgYmxpbmsgLS0gdGhhdCAqd2FzKiB0aGUgdGVzdAogCi0gICAgZmluYWxseToKLSAgICAgICAgc3lzLnBhdGgucG9wKDApCi0gICAgICAgIHJlbW92ZV9maWxlcyhURVNURk4pCi0gICAgICAgIGlmIFRFU1RGTiBpbiBzeXMubW9kdWxlczoKLSAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1tURVNURk5dCisgICAgZGVmIHRlc3RJbXBvcnQoc2VsZik6CisgICAgICAgIGRlZiB0ZXN0X3dpdGhfZXh0ZW5zaW9uKGV4dCk6CisgICAgICAgICAgICAjIGV4dCBub3JtYWxseSAiLnB5IjsgcGVyaGFwcyAiLnB5dyIKKyAgICAgICAgICAgIHNvdXJjZSA9IFRFU1RGTiArIGV4dAorICAgICAgICAgICAgcHlvID0gVEVTVEZOICsgb3MuZXh0c2VwICsgInB5byIKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CisgICAgICAgICAgICAgICAgcHljID0gVEVTVEZOICsgIiRweS5jbGFzcyIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHljID0gVEVTVEZOICsgb3MuZXh0c2VwICsgInB5YyIKIAotdGVzdF9mYWlsaW5nX3JlbG9hZCgpCisgICAgICAgICAgICBmID0gb3Blbihzb3VyY2UsICJ3IikKKyAgICAgICAgICAgIHByaW50ID4+IGYsICIjIFRoaXMgdGVzdHMgUHl0aG9uJ3MgYWJpbGl0eSB0byBpbXBvcnQgYSIsIGV4dCwgImZpbGUuIgorICAgICAgICAgICAgYSA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMCkKKyAgICAgICAgICAgIGIgPSByYW5kb20ucmFuZHJhbmdlKDEwMDApCisgICAgICAgICAgICBwcmludCA+PiBmLCAiYSA9IiwgYQorICAgICAgICAgICAgcHJpbnQgPj4gZiwgImIgPSIsIGIKKyAgICAgICAgICAgIGYuY2xvc2UoKQogCi1kZWYgdGVzdF9pbXBvcnRfbmFtZV9iaW5kaW5nKCk6Ci0gICAgIyBpbXBvcnQgeC55LnogYmluZHMgeCBpbiB0aGUgY3VycmVudCBuYW1lc3BhY2UKLSAgICBpbXBvcnQgdGVzdCBhcyB4Ci0gICAgaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0Ci0gICAgYXNzZXJ0IHggaXMgdGVzdCwgeC5fX25hbWVfXwotICAgIGFzc2VydCBoYXNhdHRyKHRlc3QudGVzdF9zdXBwb3J0LCAiX19maWxlX18iKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbW9kID0gX19pbXBvcnRfXyhURVNURk4pCisgICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCBlcnI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiaW1wb3J0IGZyb20gJXMgZmFpbGVkOiAlcyIgJSAoZXh0LCBlcnIpKQogCi0gICAgIyBpbXBvcnQgeC55LnogYXMgdyBiaW5kcyB6IGFzIHcKLSAgICBpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQgYXMgeQotICAgIGFzc2VydCB5IGlzIHRlc3QudGVzdF9zdXBwb3J0LCB5Ll9fbmFtZV9fCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobW9kLmEsIGEsCisgICAgICAgICAgICAgICAgICAgICJtb2R1bGUgbG9hZGVkICglcykgYnV0IGNvbnRlbnRzIGludmFsaWQiICUgbW9kKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1vZC5iLCBiLAorICAgICAgICAgICAgICAgICAgICAibW9kdWxlIGxvYWRlZCAoJXMpIGJ1dCBjb250ZW50cyBpbnZhbGlkIiAlIG1vZCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKHNvdXJjZSkKIAotdGVzdF9pbXBvcnRfbmFtZV9iaW5kaW5nKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJlbG9hZChtb2QpCisgICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCBlcnI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiaW1wb3J0IGZyb20gLnB5Yy8ucHlvIGZhaWxlZDogJXMiICUgZXJyKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhweWMpCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhweW8pCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbVEVTVEZOXQogCi1kZWYgdGVzdF9pbXBvcnRfaW5pdGxlc3NfZGlyZWN0b3J5X3dhcm5pbmcoKToKLSAgICBpbXBvcnQgd2FybmluZ3MKLSAgICBvbGRmaWx0ZXJzID0gd2FybmluZ3MuZmlsdGVyc1s6XQotICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignZXJyb3InLCBJbXBvcnRXYXJuaW5nKTsKLSAgICB0cnk6Ci0gICAgICAgICMgSnVzdCBhIHJhbmRvbSBub24tcGFja2FnZSBkaXJlY3Rvcnkgd2UgYWx3YXlzIGV4cGVjdCB0byBiZQotICAgICAgICAjIHNvbWV3aGVyZSBpbiBzeXMucGF0aC4uLgotICAgICAgICBfX2ltcG9ydF9fKCJzaXRlLXBhY2thZ2VzIikKLSAgICBleGNlcHQgSW1wb3J0V2FybmluZzoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yCi0gICAgZmluYWxseToKLSAgICAgICAgd2FybmluZ3MuZmlsdGVycyA9IG9sZGZpbHRlcnMKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLmN1cmRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGVzdF93aXRoX2V4dGVuc2lvbihvcy5leHRzZXAgKyAicHkiKQorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoIndpbiIpOgorICAgICAgICAgICAgICAgIGZvciBleHQgaW4gIi5QWSIsICIuUHkiLCAiLnBZIiwgIi5weXciLCAiLlBZVyIsICIucFl3IjoKKyAgICAgICAgICAgICAgICAgICAgdGVzdF93aXRoX2V4dGVuc2lvbihleHQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkZWwgc3lzLnBhdGhbMF0KIAotdGVzdF9pbXBvcnRfaW5pdGxlc3NfZGlyZWN0b3J5X3dhcm5pbmcoKQorICAgIGRlZiB0ZXN0SW1wTW9kdWxlKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IHRoZSBpbXAgbW9kdWxlIGNhbiBjb3JyZWN0bHkgbG9hZCBhbmQgZmluZCAucHkgZmlsZXMKKyAgICAgICAgaW1wb3J0IGltcAorICAgICAgICB4ID0gaW1wLmZpbmRfbW9kdWxlKCJvcyIpCisgICAgICAgIG9zID0gaW1wLmxvYWRfbW9kdWxlKCJvcyIsICp4KQorCisgICAgZGVmIHRlc3RfbW9kdWxlX3dpdGhfbGFyZ2Vfc3RhY2soc2VsZiwgbW9kdWxlPSdsb25nbGlzdCcpOgorICAgICAgICAjIGNyZWF0ZSBtb2R1bGUgdy9saXN0IG9mIDY1MDAwIGVsZW1lbnRzIHRvIHRlc3QgYnVnICM1NjE4NTgKKyAgICAgICAgZmlsZW5hbWUgPSBtb2R1bGUgKyBvcy5leHRzZXAgKyAncHknCisKKyAgICAgICAgIyBjcmVhdGUgYSBmaWxlIHdpdGggYSBsaXN0IG9mIDY1MDAwIGVsZW1lbnRzCisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAndysnKQorICAgICAgICBmLndyaXRlKCdkID0gW1xuJykKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNjUwMDApOgorICAgICAgICAgICAgZi53cml0ZSgnIiIsXG4nKQorICAgICAgICBmLndyaXRlKCddJykKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgIyBjb21waWxlICYgcmVtb3ZlIC5weSBmaWxlLCB3ZSBvbmx5IG5lZWQgLnB5YyAob3IgLnB5bykKKyAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICdyJykKKyAgICAgICAgcHlfY29tcGlsZS5jb21waWxlKGZpbGVuYW1lKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQorCisgICAgICAgICMgbmVlZCB0byBiZSBhYmxlIHRvIGxvYWQgZnJvbSBjdXJyZW50IGRpcgorICAgICAgICBzeXMucGF0aC5hcHBlbmQoJycpCisKKyAgICAgICAgIyB0aGlzIHVzZWQgdG8gY3Jhc2gKKyAgICAgICAgZXhlYygnaW1wb3J0ICcgKyBtb2R1bGUpCisKKyAgICAgICAgIyBjbGVhbnVwCisgICAgICAgIGRlbCBzeXMucGF0aFstMV0KKyAgICAgICAgZm9yIGV4dCBpbiAncHljJywgJ3B5byc6CisgICAgICAgICAgICBmbmFtZSA9IG1vZHVsZSArIG9zLmV4dHNlcCArIGV4dAorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZm5hbWUpOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhmbmFtZSkKKworICAgIGRlZiB0ZXN0X2ZhaWxpbmdfaW1wb3J0X3N0aWNrcyhzZWxmKToKKyAgICAgICAgc291cmNlID0gVEVTVEZOICsgb3MuZXh0c2VwICsgInB5IgorICAgICAgICBmID0gb3Blbihzb3VyY2UsICJ3IikKKyAgICAgICAgcHJpbnQgPj4gZiwgImEgPSAxLzAiCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICMgTmV3IGluIDIuNCwgd2Ugc2hvdWxkbid0IGJlIGFibGUgdG8gaW1wb3J0IHRoYXQgbm8gbWF0dGVyIGhvdyBvZnRlbgorICAgICAgICAjIHdlIHRyeS4KKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLmN1cmRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGkgaW4gMSwgMiwgMzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG1vZCA9IF9faW1wb3J0X18oVEVTVEZOKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgVEVTVEZOIGluIHN5cy5tb2R1bGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJkYW1hZ2VkIG1vZHVsZSBpbiBzeXMubW9kdWxlcyBvbiAlaS4gdHJ5IiAlIGkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ3YXMgYWJsZSB0byBpbXBvcnQgYSBkYW1hZ2VkIG1vZHVsZSBvbiAlaS4gdHJ5IiAlIGkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMucGF0aC5wb3AoMCkKKyAgICAgICAgICAgIHJlbW92ZV9maWxlcyhURVNURk4pCisKKyAgICBkZWYgdGVzdF9mYWlsaW5nX3JlbG9hZChzZWxmKToKKyAgICAgICAgIyBBIGZhaWxpbmcgcmVsb2FkIHNob3VsZCBsZWF2ZSB0aGUgbW9kdWxlIG9iamVjdCBpbiBzeXMubW9kdWxlcy4KKyAgICAgICAgc291cmNlID0gVEVTVEZOICsgb3MuZXh0c2VwICsgInB5IgorICAgICAgICBmID0gb3Blbihzb3VyY2UsICJ3IikKKyAgICAgICAgcHJpbnQgPj4gZiwgImEgPSAxIgorICAgICAgICBwcmludCA+PiBmLCAiYiA9IDIiCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5jdXJkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1vZCA9IF9faW1wb3J0X18oVEVTVEZOKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKFRFU1RGTiBpbiBzeXMubW9kdWxlcywgImV4cGVjdGVkIG1vZHVsZSBpbiBzeXMubW9kdWxlcyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtb2QuYSwgMSwgIm1vZHVsZSBoYXMgd3JvbmcgYXR0cmlidXRlIHZhbHVlcyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtb2QuYiwgMiwgIm1vZHVsZSBoYXMgd3JvbmcgYXR0cmlidXRlIHZhbHVlcyIpCisKKyAgICAgICAgICAgICMgT24gV2luWFAsIGp1c3QgcmVwbGFjaW5nIHRoZSAucHkgZmlsZSB3YXNuJ3QgZW5vdWdoIHRvCisgICAgICAgICAgICAjIGNvbnZpbmNlIHJlbG9hZCgpIHRvIHJlcGFyc2UgaXQuICBNYXliZSB0aGUgdGltZXN0YW1wIGRpZG4ndAorICAgICAgICAgICAgIyBtb3ZlIGVub3VnaC4gIFdlIGZvcmNlIGl0IHRvIGdldCByZXBhcnNlZCBieSByZW1vdmluZyB0aGUKKyAgICAgICAgICAgICMgY29tcGlsZWQgZmlsZSB0b28uCisgICAgICAgICAgICByZW1vdmVfZmlsZXMoVEVTVEZOKQorCisgICAgICAgICAgICAjIE5vdyBkYW1hZ2UgdGhlIG1vZHVsZS4KKyAgICAgICAgICAgIGYgPSBvcGVuKHNvdXJjZSwgInciKQorICAgICAgICAgICAgcHJpbnQgPj4gZiwgImEgPSAxMCIKKyAgICAgICAgICAgIHByaW50ID4+IGYsICJiID0gMjAvLzAiCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIHJlbG9hZCwgbW9kKQorCisgICAgICAgICAgICAjIEJ1dCB3ZSBzdGlsbCBleHBlY3QgdGhlIG1vZHVsZSB0byBiZSBpbiBzeXMubW9kdWxlcy4KKyAgICAgICAgICAgIG1vZCA9IHN5cy5tb2R1bGVzLmdldChURVNURk4pCisgICAgICAgICAgICBzZWxmLmZhaWxJZihtb2QgaXMgTm9uZSwgImV4cGVjdGVkIG1vZHVsZSB0byBzdGlsbCBiZSBpbiBzeXMubW9kdWxlcyIpCisKKyAgICAgICAgICAgICMgV2Ugc2hvdWxkIGhhdmUgcmVwbGFjZWQgYSB3LyAxMCwgYnV0IHRoZSBvbGQgYiB2YWx1ZSBzaG91bGQKKyAgICAgICAgICAgICMgc3RpY2suCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtb2QuYSwgMTAsICJtb2R1bGUgaGFzIHdyb25nIGF0dHJpYnV0ZSB2YWx1ZXMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobW9kLmIsIDIsICJtb2R1bGUgaGFzIHdyb25nIGF0dHJpYnV0ZSB2YWx1ZXMiKQorCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMucGF0aC5wb3AoMCkKKyAgICAgICAgICAgIHJlbW92ZV9maWxlcyhURVNURk4pCisgICAgICAgICAgICBpZiBURVNURk4gaW4gc3lzLm1vZHVsZXM6CisgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW1RFU1RGTl0KKworICAgIGRlZiB0ZXN0X2ltcG9ydF9uYW1lX2JpbmRpbmcoc2VsZik6CisgICAgICAgICMgaW1wb3J0IHgueS56IGJpbmRzIHggaW4gdGhlIGN1cnJlbnQgbmFtZXNwYWNlCisgICAgICAgIGltcG9ydCB0ZXN0IGFzIHgKKyAgICAgICAgaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0CisgICAgICAgIHNlbGYuYXNzZXJ0Xyh4IGlzIHRlc3QsIHguX19uYW1lX18pCisgICAgICAgIHNlbGYuYXNzZXJ0XyhoYXNhdHRyKHRlc3QudGVzdF9zdXBwb3J0LCAiX19maWxlX18iKSkKKworICAgICAgICAjIGltcG9ydCB4LnkueiBhcyB3IGJpbmRzIHogYXMgdworICAgICAgICBpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQgYXMgeQorICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyB0ZXN0LnRlc3Rfc3VwcG9ydCwgeS5fX25hbWVfXykKKworICAgIGRlZiB0ZXN0X2ltcG9ydF9pbml0bGVzc19kaXJlY3Rvcnlfd2FybmluZyhzZWxmKToKKyAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgIG9sZGZpbHRlcnMgPSB3YXJuaW5ncy5maWx0ZXJzWzpdCisgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignZXJyb3InLCBJbXBvcnRXYXJuaW5nKTsKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBKdXN0IGEgcmFuZG9tIG5vbi1wYWNrYWdlIGRpcmVjdG9yeSB3ZSBhbHdheXMgZXhwZWN0IHRvIGJlCisgICAgICAgICAgICAjIHNvbWV3aGVyZSBpbiBzeXMucGF0aC4uLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0V2FybmluZywgX19pbXBvcnRfXywgInNpdGUtcGFja2FnZXMiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVycyA9IG9sZGZpbHRlcnMKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHJ1bl91bml0dGVzdChJbXBvcnRUZXN0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkgYi9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKaW5kZXggZTU5NDZlOS4uMDcxZTUyMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQpAQCAtMTgwLDcgKzE4MCwxOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0Y29tbWVudHMobW9kLlN0dXBpZEdpdCksICcjIGxpbmUgMjBcbicpCiAKICAgICBkZWYgdGVzdF9nZXRtb2R1bGUoc2VsZik6CisgICAgICAgICMgQ2hlY2sgYWN0dWFsIG1vZHVsZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0bW9kdWxlKG1vZCksIG1vZCkKKyAgICAgICAgIyBDaGVjayBjbGFzcyAodXNlcyBfX21vZHVsZV9fIGF0dHJpYnV0ZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldG1vZHVsZShtb2QuU3R1cGlkR2l0KSwgbW9kKQorICAgICAgICAjIENoZWNrIGEgbWV0aG9kIChubyBfX21vZHVsZV9fIGF0dHJpYnV0ZSwgZmFsbHMgYmFjayB0byBmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldG1vZHVsZShtb2QuU3R1cGlkR2l0LmFidXNlKSwgbW9kKQorICAgICAgICAjIERvIGl0IGFnYWluIChjaGVjayB0aGUgY2FjaGluZyBpc24ndCBicm9rZW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRtb2R1bGUobW9kLlN0dXBpZEdpdC5hYnVzZSksIG1vZCkKKyAgICAgICAgIyBDaGVjayBhIGJ1aWx0aW4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldG1vZHVsZShzdHIpLCBzeXMubW9kdWxlc1siX19idWlsdGluX18iXSkKKyAgICAgICAgIyBDaGVjayBmaWxlbmFtZSBvdmVycmlkZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0bW9kdWxlKE5vbmUsIG1vZGZpbGUpLCBtb2QpCiAKICAgICBkZWYgdGVzdF9nZXRzb3VyY2Uoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0U291cmNlRXF1YWwoZ2l0LmFidXNlLCAyOSwgMzkpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2l0ZXJ0b29scy5weSBiL0xpYi90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5CmluZGV4IDhmOGZjNzMuLjhlMTExOGEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5CkBAIC02MSw2ICs2MSwxMCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoYyksICdjb3VudCgzKScpCiAgICAgICAgIGMubmV4dCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjKSwgJ2NvdW50KDQpJykKKyAgICAgICAgYyA9IGNvdW50KC05KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoYyksICdjb3VudCgtOSknKQorICAgICAgICBjLm5leHQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubmV4dCgpLCAtOCkKIAogICAgIGRlZiB0ZXN0X2N5Y2xlKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoMTAsIGN5Y2xlKCdhYmMnKSksIGxpc3QoJ2FiY2FiY2FiY2EnKSkKQEAgLTM3NSw2ICszNzksNyBAQAogCiAgICAgICAgICMgdGVzdCB2YWx1ZXMgb2YgbgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRlZSwgJ2FiYycsICdpbnZhbGlkJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGVlLCBbXSwgLTEpCiAgICAgICAgIGZvciBuIGluIHhyYW5nZSg1KToKICAgICAgICAgICAgIHJlc3VsdCA9IHRlZSgnYWJjJywgbikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCB0dXBsZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbG9uZy5weSBiL0xpYi90ZXN0L3Rlc3RfbG9uZy5weQppbmRleCA5MmZlN2ExLi5lMGM3ODFmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xvbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9sb25nLnB5CkBAIC0yNDcsMTcgKzI0NywyMyBAQAogICAgICAgICAgICAgImxvbmcoLXN5cy5tYXhpbnQtMSkgIT0gLXN5cy5tYXhpbnQtMSIpCiAKICAgICAgICAgIyBsb25nIC0+IGludCBzaG91bGQgbm90IGZhaWwgZm9yIGh1Z2Vwb3NfYXNsb25nIG9yIGh1Z2VuZWdfYXNsb25nCisgICAgICAgIHggPSBpbnQoaHVnZXBvc19hc2xvbmcpCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGh1Z2Vwb3NfYXNsb25nKSwgaHVnZXBvcywKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgaHVnZXBvcywKICAgICAgICAgICAgICAgICAgICJjb252ZXJ0aW5nIHN5cy5tYXhpbnQgdG8gbG9uZyBhbmQgYmFjayB0byBpbnQgZmFpbHMiKQogICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKICAgICAgICAgICAgIHNlbGYuZmFpbCgiaW50KGxvbmcoc3lzLm1heGludCkpIG92ZXJmbG93ZWQhIikKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoeCwgaW50KToKKyAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoImludChsb25nKHN5cy5tYXhpbnQpKSBzaG91bGQgaGF2ZSByZXR1cm5lZCBpbnQiKQorICAgICAgICB4ID0gaW50KGh1Z2VuZWdfYXNsb25nKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChodWdlbmVnX2FzbG9uZyksIGh1Z2VuZWcsCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIGh1Z2VuZWcsCiAgICAgICAgICAgICAgICAgICAiY29udmVydGluZyAtc3lzLm1heGludC0xIHRvIGxvbmcgYW5kIGJhY2sgdG8gaW50IGZhaWxzIikKICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CiAgICAgICAgICAgICBzZWxmLmZhaWwoImludChsb25nKC1zeXMubWF4aW50LTEpKSBvdmVyZmxvd2VkISIpCi0KKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoeCwgaW50KToKKyAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoImludChsb25nKC1zeXMubWF4aW50LTEpKSBzaG91bGQgaGF2ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm5lZCBpbnQiKQogICAgICAgICAjIGJ1dCBsb25nIC0+IGludCBzaG91bGQgb3ZlcmZsb3cgZm9yIGh1Z2Vwb3MrMSBhbmQgaHVnZW5lZy0xCiAgICAgICAgIHggPSBodWdlcG9zX2FzbG9uZyArIDEKICAgICAgICAgdHJ5OgpAQCAtMjgyLDYgKzI4OCwxNyBAQAogICAgICAgICBzZWxmLmFzc2VydF8odHlwZSh5KSBpcyBsb25nLAogICAgICAgICAgICAgIm92ZXJmbG93aW5nIGludCBjb252ZXJzaW9uIG11c3QgcmV0dXJuIGxvbmcgbm90IGxvbmcgc3VidHlwZSIpCiAKKyAgICAgICAgIyBsb25nIC0+IFB5X3NzaXplX3QgY29udmVyc2lvbgorICAgICAgICBjbGFzcyBYKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19nZXRzbGljZV9fKHNlbGYsIGksIGopOgorICAgICAgICAgICAgICAgIHJldHVybiBpLCBqCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYKClbLTVMOjdMXSwgKC01LCA3KSkKKyAgICAgICAgIyB1c2UgdGhlIGNsYW1waW5nIGVmZmVjdCB0byB0ZXN0IHRoZSBzbWFsbGVzdCBhbmQgbGFyZ2VzdCBsb25ncworICAgICAgICAjIHRoYXQgZml0IGEgUHlfc3NpemVfdAorICAgICAgICBzbGljZW1pbiwgc2xpY2VtYXggPSBYKClbLTJMKioxMDA6MkwqKjEwMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYKClbc2xpY2VtaW46c2xpY2VtYXhdLCAoc2xpY2VtaW4sIHNsaWNlbWF4KSkKKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0ZXN0cyBvZiBhdXRvIGludC0+bG9uZyBjb252ZXJzaW9uCiAKICAgICBkZWYgdGVzdF9hdXRvX292ZXJmbG93KHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tYWlsYm94LnB5IGIvTGliL3Rlc3QvdGVzdF9tYWlsYm94LnB5CmluZGV4IDE4MzczMDYuLmRlZjU4Y2MgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weQorKysgYi9MaWIvdGVzdC90ZXN0X21haWxib3gucHkKQEAgLTY2Niw2ICs2NjYsMTkgQEAKICAgICAgICAgc2VsZi5fYm94LmxvY2soKQogICAgICAgICBzZWxmLl9ib3gudW5sb2NrKCkKIAorICAgIGRlZiB0ZXN0X2ZvbGRlciAoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3IgYnVnICMxNTY5NzkwOiB2ZXJpZnkgdGhhdCBmb2xkZXJzIHJldHVybmVkIGJ5IC5nZXRfZm9sZGVyKCkKKyAgICAgICAgIyB1c2UgdGhlIHNhbWUgZmFjdG9yeSBmdW5jdGlvbi4KKyAgICAgICAgZGVmIGR1bW15X2ZhY3RvcnkgKHMpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoLCBmYWN0b3J5PWR1bW15X2ZhY3RvcnkpCisgICAgICAgIGZvbGRlciA9IGJveC5hZGRfZm9sZGVyKCdmb2xkZXIxJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKGZvbGRlci5fZmFjdG9yeSBpcyBkdW1teV9mYWN0b3J5KQorICAgICAgICAKKyAgICAgICAgZm9sZGVyMV9hbGlhcyA9IGJveC5nZXRfZm9sZGVyKCdmb2xkZXIxJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKGZvbGRlcjFfYWxpYXMuX2ZhY3RvcnkgaXMgZHVtbXlfZmFjdG9yeSkKKworICAgICAgICAKIAogY2xhc3MgX1Rlc3RNYm94TU1ERihUZXN0TWFpbGJveCk6CiAKQEAgLTc0MCw2ICs3NTMsMjIgQEAKICAgICAgICAgc2VsZi5fYm94LmxvY2soKQogICAgICAgICBzZWxmLl9ib3gudW5sb2NrKCkKIAorICAgIGRlZiB0ZXN0X3JlbG9jayhzZWxmKToKKyAgICAgICAgIyBUZXN0IGNhc2UgZm9yIGJ1ZyAjMTU3NTUwNjogdGhlIG1haWxib3ggY2xhc3Mgd2FzIGxvY2tpbmcgdGhlCisgICAgICAgICMgd3JvbmcgZmlsZSBvYmplY3QgaW4gaXRzIGZsdXNoKCkgbWV0aG9kLgorICAgICAgICBtc2cgPSAiU3ViamVjdDogc3ViXG5cbmJvZHlcbiIKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQobXNnKQorICAgICAgICBzZWxmLl9ib3guZmx1c2goKQorICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQorCisgICAgICAgIHNlbGYuX2JveCA9IHNlbGYuX2ZhY3Rvcnkoc2VsZi5fcGF0aCkKKyAgICAgICAgc2VsZi5fYm94LmxvY2soKQorICAgICAgICBrZXkyID0gc2VsZi5fYm94LmFkZChtc2cpCisgICAgICAgIHNlbGYuX2JveC5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guX2xvY2tlZCkKKyAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKKworCiAKIGNsYXNzIFRlc3RNYm94KF9UZXN0TWJveE1NREYpOgogCkBAIC03NjYsNyArNzk1LDExIEBACiAKICAgICBkZWYgdGVzdF9nZXRfZm9sZGVyKHNlbGYpOgogICAgICAgICAjIE9wZW4gZm9sZGVycwotICAgICAgICBzZWxmLl9ib3guYWRkX2ZvbGRlcignZm9vLmJhcicpCisgICAgICAgIGRlZiBkdW1teV9mYWN0b3J5IChzKToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHNlbGYuX2JveCA9IHNlbGYuX2ZhY3Rvcnkoc2VsZi5fcGF0aCwgZHVtbXlfZmFjdG9yeSkKKyAgICAgICAgCisgICAgICAgIG5ld19mb2xkZXIgPSBzZWxmLl9ib3guYWRkX2ZvbGRlcignZm9vLmJhcicpCiAgICAgICAgIGZvbGRlcjAgPSBzZWxmLl9ib3guZ2V0X2ZvbGRlcignZm9vLmJhcicpCiAgICAgICAgIGZvbGRlcjAuYWRkKHNlbGYuX3RlbXBsYXRlICUgJ2JhcicpCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnZm9vLmJhcicpKSkKQEAgLTc3NCw2ICs4MDcsMTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRfKGZvbGRlcjEuZ2V0X3N0cmluZyhmb2xkZXIxLmtleXMoKVswXSkgPT0gXAogICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnYmFyJykKIAorICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAjMTU2OTc5MDogdmVyaWZ5IHRoYXQgZm9sZGVycyByZXR1cm5lZCBieSAuZ2V0X2ZvbGRlcigpCisgICAgICAgICMgdXNlIHRoZSBzYW1lIGZhY3RvcnkgZnVuY3Rpb24uCisgICAgICAgIHNlbGYuYXNzZXJ0XyhuZXdfZm9sZGVyLl9mYWN0b3J5IGlzIHNlbGYuX2JveC5fZmFjdG9yeSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGZvbGRlcjAuX2ZhY3RvcnkgaXMgc2VsZi5fYm94Ll9mYWN0b3J5KQorCiAgICAgZGVmIHRlc3RfYWRkX2FuZF9yZW1vdmVfZm9sZGVycyhzZWxmKToKICAgICAgICAgIyBEZWxldGUgZm9sZGVycwogICAgICAgICBzZWxmLl9ib3guYWRkX2ZvbGRlcignb25lJykKQEAgLTg0Miw2ICs4ODAsMjEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCkgPT0KICAgICAgICAgICAgICAgICAgICAgIHsnZm9vJzpbMSwgMiwgM10sICd1bnNlZW4nOlsxXSwgJ2Jhcic6WzNdLCAncmVwbGllZCc6WzNdfSkKIAorICAgICAgICAjIFRlc3QgY2FzZSBmb3IgcGFja2luZyB3aGlsZSBob2xkaW5nIHRoZSBtYWlsYm94IGxvY2tlZC4KKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQobXNnMSkKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQobXNnMSkKKyAgICAgICAga2V5MiA9IHNlbGYuX2JveC5hZGQobXNnMSkKKyAgICAgICAga2V5MyA9IHNlbGYuX2JveC5hZGQobXNnMSkKKworICAgICAgICBzZWxmLl9ib3gucmVtb3ZlKGtleTApCisgICAgICAgIHNlbGYuX2JveC5yZW1vdmUoa2V5MikKKyAgICAgICAgc2VsZi5fYm94LmxvY2soKQorICAgICAgICBzZWxmLl9ib3gucGFjaygpCisgICAgICAgIHNlbGYuX2JveC51bmxvY2soKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PQorICAgICAgICAgICAgICAgICAgICAgeydmb28nOlsxLCAyLCAzLCA0LCA1XSwKKyAgICAgICAgICAgICAgICAgICAgICAndW5zZWVuJzpbMV0sICdiYXInOlszXSwgJ3JlcGxpZWQnOlszXX0pCisgICAgICAgIAogICAgIGRlZiBfZ2V0X2xvY2tfcGF0aChzZWxmKToKICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnLm1oX3NlcXVlbmNlcy5sb2NrJykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tYXRoLnB5IGIvTGliL3Rlc3QvdGVzdF9tYXRoLnB5CmluZGV4IGEwOTIyNjUuLmE0NWZjMzQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWF0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X21hdGgucHkKQEAgLTEsMjA4ICsxLDI0MSBAQAogIyBQeXRob24gdGVzdCBzZXQgLS0gbWF0aCBtb2R1bGUKICMgWFhYWCBTaG91bGQgbm90IGRvIHRlc3RzIGFyb3VuZCB6ZXJvIG9ubHkKIAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdEZhaWxlZCwgdmVyYm9zZQorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCB2ZXJib3NlCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBtYXRoCiAKIHNlcHM9JzFlLTA1JwogZXBzID0gZXZhbChzZXBzKQotcHJpbnQgJ21hdGggbW9kdWxlLCB0ZXN0aW5nIHdpdGggZXBzJywgc2VwcwotaW1wb3J0IG1hdGgKIAotZGVmIHRlc3RpdChuYW1lLCB2YWx1ZSwgZXhwZWN0ZWQpOgotICAgIGlmIGFicyh2YWx1ZS1leHBlY3RlZCkgPiBlcHM6Ci0gICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsICclcyByZXR1cm5lZCAlZiwgZXhwZWN0ZWQgJWYnJVwKLSAgICAgICAgICAgICAgKG5hbWUsIHZhbHVlLCBleHBlY3RlZCkKK2NsYXNzIE1hdGhUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLXByaW50ICdjb25zdGFudHMnCi10ZXN0aXQoJ3BpJywgbWF0aC5waSwgMy4xNDE1OTI2KQotdGVzdGl0KCdlJywgbWF0aC5lLCAyLjcxODI4MTgpCisgICAgZGVmIGZ0ZXN0KHNlbGYsIG5hbWUsIHZhbHVlLCBleHBlY3RlZCk6CisgICAgICAgIGlmIGFicyh2YWx1ZS1leHBlY3RlZCkgPiBlcHM6CisgICAgICAgICAgICBzZWxmLmZhaWwoJyVzIHJldHVybmVkICVmLCBleHBlY3RlZCAlZiclXAorICAgICAgICAgICAgICAgICAgICAgIChuYW1lLCB2YWx1ZSwgZXhwZWN0ZWQpKQogCi1wcmludCAnYWNvcycKLXRlc3RpdCgnYWNvcygtMSknLCBtYXRoLmFjb3MoLTEpLCBtYXRoLnBpKQotdGVzdGl0KCdhY29zKDApJywgbWF0aC5hY29zKDApLCBtYXRoLnBpLzIpCi10ZXN0aXQoJ2Fjb3MoMSknLCBtYXRoLmFjb3MoMSksIDApCisgICAgZGVmIHRlc3RDb25zdGFudHMoc2VsZik6CisgICAgICAgIHNlbGYuZnRlc3QoJ3BpJywgbWF0aC5waSwgMy4xNDE1OTI2KQorICAgICAgICBzZWxmLmZ0ZXN0KCdlJywgbWF0aC5lLCAyLjcxODI4MTgpCiAKLXByaW50ICdhc2luJwotdGVzdGl0KCdhc2luKC0xKScsIG1hdGguYXNpbigtMSksIC1tYXRoLnBpLzIpCi10ZXN0aXQoJ2FzaW4oMCknLCBtYXRoLmFzaW4oMCksIDApCi10ZXN0aXQoJ2FzaW4oMSknLCBtYXRoLmFzaW4oMSksIG1hdGgucGkvMikKKyAgICBkZWYgdGVzdEFjb3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5hY29zKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhY29zKC0xKScsIG1hdGguYWNvcygtMSksIG1hdGgucGkpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Fjb3MoMCknLCBtYXRoLmFjb3MoMCksIG1hdGgucGkvMikKKyAgICAgICAgc2VsZi5mdGVzdCgnYWNvcygxKScsIG1hdGguYWNvcygxKSwgMCkKIAotcHJpbnQgJ2F0YW4nCi10ZXN0aXQoJ2F0YW4oLTEpJywgbWF0aC5hdGFuKC0xKSwgLW1hdGgucGkvNCkKLXRlc3RpdCgnYXRhbigwKScsIG1hdGguYXRhbigwKSwgMCkKLXRlc3RpdCgnYXRhbigxKScsIG1hdGguYXRhbigxKSwgbWF0aC5waS80KQorICAgIGRlZiB0ZXN0QXNpbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmFzaW4pCisgICAgICAgIHNlbGYuZnRlc3QoJ2FzaW4oLTEpJywgbWF0aC5hc2luKC0xKSwgLW1hdGgucGkvMikKKyAgICAgICAgc2VsZi5mdGVzdCgnYXNpbigwKScsIG1hdGguYXNpbigwKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXNpbigxKScsIG1hdGguYXNpbigxKSwgbWF0aC5waS8yKQogCi1wcmludCAnYXRhbjInCi10ZXN0aXQoJ2F0YW4yKC0xLCAwKScsIG1hdGguYXRhbjIoLTEsIDApLCAtbWF0aC5waS8yKQotdGVzdGl0KCdhdGFuMigtMSwgMSknLCBtYXRoLmF0YW4yKC0xLCAxKSwgLW1hdGgucGkvNCkKLXRlc3RpdCgnYXRhbjIoMCwgMSknLCBtYXRoLmF0YW4yKDAsIDEpLCAwKQotdGVzdGl0KCdhdGFuMigxLCAxKScsIG1hdGguYXRhbjIoMSwgMSksIG1hdGgucGkvNCkKLXRlc3RpdCgnYXRhbjIoMSwgMCknLCBtYXRoLmF0YW4yKDEsIDApLCBtYXRoLnBpLzIpCisgICAgZGVmIHRlc3RBdGFuKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguYXRhbikKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbigtMSknLCBtYXRoLmF0YW4oLTEpLCAtbWF0aC5waS80KQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuKDApJywgbWF0aC5hdGFuKDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuKDEpJywgbWF0aC5hdGFuKDEpLCBtYXRoLnBpLzQpCiAKLXByaW50ICdjZWlsJwotdGVzdGl0KCdjZWlsKDAuNSknLCBtYXRoLmNlaWwoMC41KSwgMSkKLXRlc3RpdCgnY2VpbCgxLjApJywgbWF0aC5jZWlsKDEuMCksIDEpCi10ZXN0aXQoJ2NlaWwoMS41KScsIG1hdGguY2VpbCgxLjUpLCAyKQotdGVzdGl0KCdjZWlsKC0wLjUpJywgbWF0aC5jZWlsKC0wLjUpLCAwKQotdGVzdGl0KCdjZWlsKC0xLjApJywgbWF0aC5jZWlsKC0xLjApLCAtMSkKLXRlc3RpdCgnY2VpbCgtMS41KScsIG1hdGguY2VpbCgtMS41KSwgLTEpCisgICAgZGVmIHRlc3RBdGFuMihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmF0YW4yKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigtMSwgMCknLCBtYXRoLmF0YW4yKC0xLCAwKSwgLW1hdGgucGkvMikKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLTEsIDEpJywgbWF0aC5hdGFuMigtMSwgMSksIC1tYXRoLnBpLzQpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKDAsIDEpJywgbWF0aC5hdGFuMigwLCAxKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoMSwgMSknLCBtYXRoLmF0YW4yKDEsIDEpLCBtYXRoLnBpLzQpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKDEsIDApJywgbWF0aC5hdGFuMigxLCAwKSwgbWF0aC5waS8yKQogCi1wcmludCAnY29zJwotdGVzdGl0KCdjb3MoLXBpLzIpJywgbWF0aC5jb3MoLW1hdGgucGkvMiksIDApCi10ZXN0aXQoJ2NvcygwKScsIG1hdGguY29zKDApLCAxKQotdGVzdGl0KCdjb3MocGkvMiknLCBtYXRoLmNvcyhtYXRoLnBpLzIpLCAwKQotdGVzdGl0KCdjb3MocGkpJywgbWF0aC5jb3MobWF0aC5waSksIC0xKQorICAgIGRlZiB0ZXN0Q2VpbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmNlaWwpCisgICAgICAgIHNlbGYuZnRlc3QoJ2NlaWwoMC41KScsIG1hdGguY2VpbCgwLjUpLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjZWlsKDEuMCknLCBtYXRoLmNlaWwoMS4wKSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnY2VpbCgxLjUpJywgbWF0aC5jZWlsKDEuNSksIDIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2NlaWwoLTAuNSknLCBtYXRoLmNlaWwoLTAuNSksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2NlaWwoLTEuMCknLCBtYXRoLmNlaWwoLTEuMCksIC0xKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjZWlsKC0xLjUpJywgbWF0aC5jZWlsKC0xLjUpLCAtMSkKIAotcHJpbnQgJ2Nvc2gnCi10ZXN0aXQoJ2Nvc2goMCknLCBtYXRoLmNvc2goMCksIDEpCi10ZXN0aXQoJ2Nvc2goMiktMipjb3NoKDEpKioyJywgbWF0aC5jb3NoKDIpLTIqbWF0aC5jb3NoKDEpKioyLCAtMSkgIyBUaGFua3MgdG8gTGFtYmVydAorICAgIGRlZiB0ZXN0Q29zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguY29zKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjb3MoLXBpLzIpJywgbWF0aC5jb3MoLW1hdGgucGkvMiksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2NvcygwKScsIG1hdGguY29zKDApLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjb3MocGkvMiknLCBtYXRoLmNvcyhtYXRoLnBpLzIpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjb3MocGkpJywgbWF0aC5jb3MobWF0aC5waSksIC0xKQogCi1wcmludCAnZGVncmVlcycKLXRlc3RpdCgnZGVncmVlcyhwaSknLCBtYXRoLmRlZ3JlZXMobWF0aC5waSksIDE4MC4wKQotdGVzdGl0KCdkZWdyZWVzKHBpLzIpJywgbWF0aC5kZWdyZWVzKG1hdGgucGkvMiksIDkwLjApCi10ZXN0aXQoJ2RlZ3JlZXMoLXBpLzQpJywgbWF0aC5kZWdyZWVzKC1tYXRoLnBpLzQpLCAtNDUuMCkKKyAgICBkZWYgdGVzdENvc2goc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5jb3NoKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjb3NoKDApJywgbWF0aC5jb3NoKDApLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjb3NoKDIpLTIqY29zaCgxKSoqMicsIG1hdGguY29zaCgyKS0yKm1hdGguY29zaCgxKSoqMiwgLTEpICMgVGhhbmtzIHRvIExhbWJlcnQKIAotcHJpbnQgJ2V4cCcKLXRlc3RpdCgnZXhwKC0xKScsIG1hdGguZXhwKC0xKSwgMS9tYXRoLmUpCi10ZXN0aXQoJ2V4cCgwKScsIG1hdGguZXhwKDApLCAxKQotdGVzdGl0KCdleHAoMSknLCBtYXRoLmV4cCgxKSwgbWF0aC5lKQorICAgIGRlZiB0ZXN0RGVncmVlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmRlZ3JlZXMpCisgICAgICAgIHNlbGYuZnRlc3QoJ2RlZ3JlZXMocGkpJywgbWF0aC5kZWdyZWVzKG1hdGgucGkpLCAxODAuMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnZGVncmVlcyhwaS8yKScsIG1hdGguZGVncmVlcyhtYXRoLnBpLzIpLCA5MC4wKQorICAgICAgICBzZWxmLmZ0ZXN0KCdkZWdyZWVzKC1waS80KScsIG1hdGguZGVncmVlcygtbWF0aC5waS80KSwgLTQ1LjApCiAKLXByaW50ICdmYWJzJwotdGVzdGl0KCdmYWJzKC0xKScsIG1hdGguZmFicygtMSksIDEpCi10ZXN0aXQoJ2ZhYnMoMCknLCBtYXRoLmZhYnMoMCksIDApCi10ZXN0aXQoJ2ZhYnMoMSknLCBtYXRoLmZhYnMoMSksIDEpCisgICAgZGVmIHRlc3RFeHAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5leHApCisgICAgICAgIHNlbGYuZnRlc3QoJ2V4cCgtMSknLCBtYXRoLmV4cCgtMSksIDEvbWF0aC5lKQorICAgICAgICBzZWxmLmZ0ZXN0KCdleHAoMCknLCBtYXRoLmV4cCgwKSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnZXhwKDEpJywgbWF0aC5leHAoMSksIG1hdGguZSkKIAotcHJpbnQgJ2Zsb29yJwotdGVzdGl0KCdmbG9vcigwLjUpJywgbWF0aC5mbG9vcigwLjUpLCAwKQotdGVzdGl0KCdmbG9vcigxLjApJywgbWF0aC5mbG9vcigxLjApLCAxKQotdGVzdGl0KCdmbG9vcigxLjUpJywgbWF0aC5mbG9vcigxLjUpLCAxKQotdGVzdGl0KCdmbG9vcigtMC41KScsIG1hdGguZmxvb3IoLTAuNSksIC0xKQotdGVzdGl0KCdmbG9vcigtMS4wKScsIG1hdGguZmxvb3IoLTEuMCksIC0xKQotdGVzdGl0KCdmbG9vcigtMS41KScsIG1hdGguZmxvb3IoLTEuNSksIC0yKQorICAgIGRlZiB0ZXN0RmFicyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmZhYnMpCisgICAgICAgIHNlbGYuZnRlc3QoJ2ZhYnMoLTEpJywgbWF0aC5mYWJzKC0xKSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnZmFicygwKScsIG1hdGguZmFicygwKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnZmFicygxKScsIG1hdGguZmFicygxKSwgMSkKIAotcHJpbnQgJ2Ztb2QnCi10ZXN0aXQoJ2Ztb2QoMTAsMSknLCBtYXRoLmZtb2QoMTAsMSksIDApCi10ZXN0aXQoJ2Ztb2QoMTAsMC41KScsIG1hdGguZm1vZCgxMCwwLjUpLCAwKQotdGVzdGl0KCdmbW9kKDEwLDEuNSknLCBtYXRoLmZtb2QoMTAsMS41KSwgMSkKLXRlc3RpdCgnZm1vZCgtMTAsMSknLCBtYXRoLmZtb2QoLTEwLDEpLCAwKQotdGVzdGl0KCdmbW9kKC0xMCwwLjUpJywgbWF0aC5mbW9kKC0xMCwwLjUpLCAwKQotdGVzdGl0KCdmbW9kKC0xMCwxLjUpJywgbWF0aC5mbW9kKC0xMCwxLjUpLCAtMSkKKyAgICBkZWYgdGVzdEZsb29yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguZmxvb3IpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Zsb29yKDAuNSknLCBtYXRoLmZsb29yKDAuNSksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2Zsb29yKDEuMCknLCBtYXRoLmZsb29yKDEuMCksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Zsb29yKDEuNSknLCBtYXRoLmZsb29yKDEuNSksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Zsb29yKC0wLjUpJywgbWF0aC5mbG9vcigtMC41KSwgLTEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Zsb29yKC0xLjApJywgbWF0aC5mbG9vcigtMS4wKSwgLTEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Zsb29yKC0xLjUpJywgbWF0aC5mbG9vcigtMS41KSwgLTIpCiAKLXByaW50ICdmcmV4cCcKLWRlZiB0ZXN0ZnJleHAobmFtZSwgKG1hbnQsIGV4cCksIChlbWFudCwgZWV4cCkpOgotICAgIGlmIGFicyhtYW50LWVtYW50KSA+IGVwcyBvciBleHAgIT0gZWV4cDoKLSAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgJyVzIHJldHVybmVkICVyLCBleHBlY3RlZCAlciclXAotICAgICAgICAgICAgICAobmFtZSwgKG1hbnQsIGV4cCksIChlbWFudCxlZXhwKSkKKyAgICBkZWYgdGVzdEZtb2Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5mbW9kKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbW9kKDEwLDEpJywgbWF0aC5mbW9kKDEwLDEpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbW9kKDEwLDAuNSknLCBtYXRoLmZtb2QoMTAsMC41KSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnZm1vZCgxMCwxLjUpJywgbWF0aC5mbW9kKDEwLDEuNSksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Ztb2QoLTEwLDEpJywgbWF0aC5mbW9kKC0xMCwxKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnZm1vZCgtMTAsMC41KScsIG1hdGguZm1vZCgtMTAsMC41KSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnZm1vZCgtMTAsMS41KScsIG1hdGguZm1vZCgtMTAsMS41KSwgLTEpCiAKLXRlc3RmcmV4cCgnZnJleHAoLTEpJywgbWF0aC5mcmV4cCgtMSksICgtMC41LCAxKSkKLXRlc3RmcmV4cCgnZnJleHAoMCknLCBtYXRoLmZyZXhwKDApLCAoMCwgMCkpCi10ZXN0ZnJleHAoJ2ZyZXhwKDEpJywgbWF0aC5mcmV4cCgxKSwgKDAuNSwgMSkpCi10ZXN0ZnJleHAoJ2ZyZXhwKDIpJywgbWF0aC5mcmV4cCgyKSwgKDAuNSwgMikpCisgICAgZGVmIHRlc3RGcmV4cChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmZyZXhwKQogCi1wcmludCAnaHlwb3QnCi10ZXN0aXQoJ2h5cG90KDAsMCknLCBtYXRoLmh5cG90KDAsMCksIDApCi10ZXN0aXQoJ2h5cG90KDMsNCknLCBtYXRoLmh5cG90KDMsNCksIDUpCisgICAgICAgIGRlZiB0ZXN0ZnJleHAobmFtZSwgKG1hbnQsIGV4cCksIChlbWFudCwgZWV4cCkpOgorICAgICAgICAgICAgaWYgYWJzKG1hbnQtZW1hbnQpID4gZXBzIG9yIGV4cCAhPSBlZXhwOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnJXMgcmV0dXJuZWQgJXIsIGV4cGVjdGVkICVyJyVcCisgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lLCAobWFudCwgZXhwKSwgKGVtYW50LGVleHApKSkKIAotcHJpbnQgJ2xkZXhwJwotdGVzdGl0KCdsZGV4cCgwLDEpJywgbWF0aC5sZGV4cCgwLDEpLCAwKQotdGVzdGl0KCdsZGV4cCgxLDEpJywgbWF0aC5sZGV4cCgxLDEpLCAyKQotdGVzdGl0KCdsZGV4cCgxLC0xKScsIG1hdGgubGRleHAoMSwtMSksIDAuNSkKLXRlc3RpdCgnbGRleHAoLTEsMSknLCBtYXRoLmxkZXhwKC0xLDEpLCAtMikKKyAgICAgICAgdGVzdGZyZXhwKCdmcmV4cCgtMSknLCBtYXRoLmZyZXhwKC0xKSwgKC0wLjUsIDEpKQorICAgICAgICB0ZXN0ZnJleHAoJ2ZyZXhwKDApJywgbWF0aC5mcmV4cCgwKSwgKDAsIDApKQorICAgICAgICB0ZXN0ZnJleHAoJ2ZyZXhwKDEpJywgbWF0aC5mcmV4cCgxKSwgKDAuNSwgMSkpCisgICAgICAgIHRlc3RmcmV4cCgnZnJleHAoMiknLCBtYXRoLmZyZXhwKDIpLCAoMC41LCAyKSkKIAotcHJpbnQgJ2xvZycKLXRlc3RpdCgnbG9nKDEvZSknLCBtYXRoLmxvZygxL21hdGguZSksIC0xKQotdGVzdGl0KCdsb2coMSknLCBtYXRoLmxvZygxKSwgMCkKLXRlc3RpdCgnbG9nKGUpJywgbWF0aC5sb2cobWF0aC5lKSwgMSkKLXRlc3RpdCgnbG9nKDMyLDIpJywgbWF0aC5sb2coMzIsMiksIDUpCi10ZXN0aXQoJ2xvZygxMCoqNDAsIDEwKScsIG1hdGgubG9nKDEwKio0MCwgMTApLCA0MCkKLXRlc3RpdCgnbG9nKDEwKio0MCwgMTAqKjIwKScsIG1hdGgubG9nKDEwKio0MCwgMTAqKjIwKSwgMikKKyAgICBkZWYgdGVzdEh5cG90KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguaHlwb3QpCisgICAgICAgIHNlbGYuZnRlc3QoJ2h5cG90KDAsMCknLCBtYXRoLmh5cG90KDAsMCksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2h5cG90KDMsNCknLCBtYXRoLmh5cG90KDMsNCksIDUpCiAKLXByaW50ICdsb2cxMCcKLXRlc3RpdCgnbG9nMTAoMC4xKScsIG1hdGgubG9nMTAoMC4xKSwgLTEpCi10ZXN0aXQoJ2xvZzEwKDEpJywgbWF0aC5sb2cxMCgxKSwgMCkKLXRlc3RpdCgnbG9nMTAoMTApJywgbWF0aC5sb2cxMCgxMCksIDEpCisgICAgZGVmIHRlc3RMZGV4cChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmxkZXhwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsZGV4cCgwLDEpJywgbWF0aC5sZGV4cCgwLDEpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsZGV4cCgxLDEpJywgbWF0aC5sZGV4cCgxLDEpLCAyKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsZGV4cCgxLC0xKScsIG1hdGgubGRleHAoMSwtMSksIDAuNSkKKyAgICAgICAgc2VsZi5mdGVzdCgnbGRleHAoLTEsMSknLCBtYXRoLmxkZXhwKC0xLDEpLCAtMikKIAotcHJpbnQgJ21vZGYnCi1kZWYgdGVzdG1vZGYobmFtZSwgKHYxLCB2MiksIChlMSwgZTIpKToKLSAgICBpZiBhYnModjEtZTEpID4gZXBzIG9yIGFicyh2Mi1lMik6Ci0gICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsICclcyByZXR1cm5lZCAlciwgZXhwZWN0ZWQgJXInJVwKLSAgICAgICAgICAgICAgKG5hbWUsICh2MSx2MiksIChlMSxlMikpCisgICAgZGVmIHRlc3RMb2coc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5sb2cpCisgICAgICAgIHNlbGYuZnRlc3QoJ2xvZygxL2UpJywgbWF0aC5sb2coMS9tYXRoLmUpLCAtMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnbG9nKDEpJywgbWF0aC5sb2coMSksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2xvZyhlKScsIG1hdGgubG9nKG1hdGguZSksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2xvZygzMiwyKScsIG1hdGgubG9nKDMyLDIpLCA1KQorICAgICAgICBzZWxmLmZ0ZXN0KCdsb2coMTAqKjQwLCAxMCknLCBtYXRoLmxvZygxMCoqNDAsIDEwKSwgNDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2xvZygxMCoqNDAsIDEwKioyMCknLCBtYXRoLmxvZygxMCoqNDAsIDEwKioyMCksIDIpCiAKLXRlc3Rtb2RmKCdtb2RmKDEuNSknLCBtYXRoLm1vZGYoMS41KSwgKDAuNSwgMS4wKSkKLXRlc3Rtb2RmKCdtb2RmKC0xLjUpJywgbWF0aC5tb2RmKC0xLjUpLCAoLTAuNSwgLTEuMCkpCisgICAgZGVmIHRlc3RMb2cxMChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmxvZzEwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsb2cxMCgwLjEpJywgbWF0aC5sb2cxMCgwLjEpLCAtMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnbG9nMTAoMSknLCBtYXRoLmxvZzEwKDEpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsb2cxMCgxMCknLCBtYXRoLmxvZzEwKDEwKSwgMSkKIAotcHJpbnQgJ3BvdycKLXRlc3RpdCgncG93KDAsMSknLCBtYXRoLnBvdygwLDEpLCAwKQotdGVzdGl0KCdwb3coMSwwKScsIG1hdGgucG93KDEsMCksIDEpCi10ZXN0aXQoJ3BvdygyLDEpJywgbWF0aC5wb3coMiwxKSwgMikKLXRlc3RpdCgncG93KDIsLTEpJywgbWF0aC5wb3coMiwtMSksIDAuNSkKKyAgICBkZWYgdGVzdE1vZGYoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5tb2RmKQogCi1wcmludCAncmFkaWFucycKLXRlc3RpdCgncmFkaWFucygxODApJywgbWF0aC5yYWRpYW5zKDE4MCksIG1hdGgucGkpCi10ZXN0aXQoJ3JhZGlhbnMoOTApJywgbWF0aC5yYWRpYW5zKDkwKSwgbWF0aC5waS8yKQotdGVzdGl0KCdyYWRpYW5zKC00NSknLCBtYXRoLnJhZGlhbnMoLTQ1KSwgLW1hdGgucGkvNCkKKyAgICAgICAgZGVmIHRlc3Rtb2RmKG5hbWUsICh2MSwgdjIpLCAoZTEsIGUyKSk6CisgICAgICAgICAgICBpZiBhYnModjEtZTEpID4gZXBzIG9yIGFicyh2Mi1lMik6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCclcyByZXR1cm5lZCAlciwgZXhwZWN0ZWQgJXInJVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWUsICh2MSx2MiksIChlMSxlMikpKQogCi1wcmludCAnc2luJwotdGVzdGl0KCdzaW4oMCknLCBtYXRoLnNpbigwKSwgMCkKLXRlc3RpdCgnc2luKHBpLzIpJywgbWF0aC5zaW4obWF0aC5waS8yKSwgMSkKLXRlc3RpdCgnc2luKC1waS8yKScsIG1hdGguc2luKC1tYXRoLnBpLzIpLCAtMSkKKyAgICAgICAgdGVzdG1vZGYoJ21vZGYoMS41KScsIG1hdGgubW9kZigxLjUpLCAoMC41LCAxLjApKQorICAgICAgICB0ZXN0bW9kZignbW9kZigtMS41KScsIG1hdGgubW9kZigtMS41KSwgKC0wLjUsIC0xLjApKQogCi1wcmludCAnc2luaCcKLXRlc3RpdCgnc2luaCgwKScsIG1hdGguc2luaCgwKSwgMCkKLXRlc3RpdCgnc2luaCgxKSoqMi1jb3NoKDEpKioyJywgbWF0aC5zaW5oKDEpKioyLW1hdGguY29zaCgxKSoqMiwgLTEpCi10ZXN0aXQoJ3NpbmgoMSkrc2luaCgtMSknLCBtYXRoLnNpbmgoMSkrbWF0aC5zaW5oKC0xKSwgMCkKKyAgICBkZWYgdGVzdFBvdyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLnBvdykKKyAgICAgICAgc2VsZi5mdGVzdCgncG93KDAsMSknLCBtYXRoLnBvdygwLDEpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdwb3coMSwwKScsIG1hdGgucG93KDEsMCksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ3BvdygyLDEpJywgbWF0aC5wb3coMiwxKSwgMikKKyAgICAgICAgc2VsZi5mdGVzdCgncG93KDIsLTEpJywgbWF0aC5wb3coMiwtMSksIDAuNSkKIAotcHJpbnQgJ3NxcnQnCi10ZXN0aXQoJ3NxcnQoMCknLCBtYXRoLnNxcnQoMCksIDApCi10ZXN0aXQoJ3NxcnQoMSknLCBtYXRoLnNxcnQoMSksIDEpCi10ZXN0aXQoJ3NxcnQoNCknLCBtYXRoLnNxcnQoNCksIDIpCisgICAgZGVmIHRlc3RSYWRpYW5zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgucmFkaWFucykKKyAgICAgICAgc2VsZi5mdGVzdCgncmFkaWFucygxODApJywgbWF0aC5yYWRpYW5zKDE4MCksIG1hdGgucGkpCisgICAgICAgIHNlbGYuZnRlc3QoJ3JhZGlhbnMoOTApJywgbWF0aC5yYWRpYW5zKDkwKSwgbWF0aC5waS8yKQorICAgICAgICBzZWxmLmZ0ZXN0KCdyYWRpYW5zKC00NSknLCBtYXRoLnJhZGlhbnMoLTQ1KSwgLW1hdGgucGkvNCkKIAotcHJpbnQgJ3RhbicKLXRlc3RpdCgndGFuKDApJywgbWF0aC50YW4oMCksIDApCi10ZXN0aXQoJ3RhbihwaS80KScsIG1hdGgudGFuKG1hdGgucGkvNCksIDEpCi10ZXN0aXQoJ3RhbigtcGkvNCknLCBtYXRoLnRhbigtbWF0aC5waS80KSwgLTEpCisgICAgZGVmIHRlc3RTaW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5zaW4pCisgICAgICAgIHNlbGYuZnRlc3QoJ3NpbigwKScsIG1hdGguc2luKDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdzaW4ocGkvMiknLCBtYXRoLnNpbihtYXRoLnBpLzIpLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdzaW4oLXBpLzIpJywgbWF0aC5zaW4oLW1hdGgucGkvMiksIC0xKQogCi1wcmludCAndGFuaCcKLXRlc3RpdCgndGFuaCgwKScsIG1hdGgudGFuaCgwKSwgMCkKLXRlc3RpdCgndGFuaCgxKSt0YW5oKC0xKScsIG1hdGgudGFuaCgxKSttYXRoLnRhbmgoLTEpLCAwKQorICAgIGRlZiB0ZXN0U2luaChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLnNpbmgpCisgICAgICAgIHNlbGYuZnRlc3QoJ3NpbmgoMCknLCBtYXRoLnNpbmgoMCksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ3NpbmgoMSkqKjItY29zaCgxKSoqMicsIG1hdGguc2luaCgxKSoqMi1tYXRoLmNvc2goMSkqKjIsIC0xKQorICAgICAgICBzZWxmLmZ0ZXN0KCdzaW5oKDEpK3NpbmgoLTEpJywgbWF0aC5zaW5oKDEpK21hdGguc2luaCgtMSksIDApCiAKLSMgUkVEX0ZMQUcgMTYtT2N0LTIwMDAgVGltCi0jIFdoaWxlIDIuMCBpcyBtb3JlIGNvbnNpc3RlbnQgYWJvdXQgZXhjZXB0aW9ucyB0aGFuIHByZXZpb3VzIHJlbGVhc2VzLCBpdAotIyBzdGlsbCBmYWlscyB0aGlzIHBhcnQgb2YgdGhlIHRlc3Qgb24gc29tZSBwbGF0Zm9ybXMuICBGb3Igbm93LCB3ZSBvbmx5Ci0jICpydW4qIHRlc3RfZXhjZXB0aW9ucygpIGluIHZlcmJvc2UgbW9kZSwgc28gdGhhdCB0aGlzIGlzbid0IG5vcm1hbGx5Ci0jIHRlc3RlZC4KKyAgICBkZWYgdGVzdFNxcnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5zcXJ0KQorICAgICAgICBzZWxmLmZ0ZXN0KCdzcXJ0KDApJywgbWF0aC5zcXJ0KDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdzcXJ0KDEpJywgbWF0aC5zcXJ0KDEpLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdzcXJ0KDQpJywgbWF0aC5zcXJ0KDQpLCAyKQogCi1kZWYgdGVzdF9leGNlcHRpb25zKCk6Ci0gICAgcHJpbnQgJ2V4Y2VwdGlvbnMnCi0gICAgdHJ5OgotICAgICAgICB4ID0gbWF0aC5leHAoLTEwMDAwMDAwMDApCi0gICAgZXhjZXB0OgotICAgICAgICAjIG1hdGhtb2R1bGUuYyBpcyBmYWlsaW5nIHRvIHdlZWQgb3V0IHVuZGVyZmxvd3MgZnJvbSBsaWJtLCBvcgotICAgICAgICAjIHdlJ3ZlIGdvdCBhbiBmcCBmb3JtYXQgd2l0aCBodWdlIGR5bmFtaWMgcmFuZ2UKLSAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgidW5kZXJmbG93aW5nIGV4cCgpIHNob3VsZCBub3QgaGF2ZSByYWlzZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJhbiBleGNlcHRpb24iKQotICAgIGlmIHggIT0gMDoKLSAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgidW5kZXJmbG93aW5nIGV4cCgpIHNob3VsZCBoYXZlIHJldHVybmVkIDAiKQorICAgIGRlZiB0ZXN0VGFuKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgudGFuKQorICAgICAgICBzZWxmLmZ0ZXN0KCd0YW4oMCknLCBtYXRoLnRhbigwKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgndGFuKHBpLzQpJywgbWF0aC50YW4obWF0aC5waS80KSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgndGFuKC1waS80KScsIG1hdGgudGFuKC1tYXRoLnBpLzQpLCAtMSkKIAotICAgICMgSWYgdGhpcyBmYWlscywgcHJvYmFibHkgdXNpbmcgYSBzdHJpY3QgSUVFRS03NTQgY29uZm9ybWluZyBsaWJtLCBhbmQgeAotICAgICMgaXMgK0luZiBhZnRlcndhcmRzLiAgQnV0IFB5dGhvbiB3YW50cyBvdmVyZmxvd3MgZGV0ZWN0ZWQgYnkgZGVmYXVsdC4KLSAgICB0cnk6Ci0gICAgICAgIHggPSBtYXRoLmV4cCgxMDAwMDAwMDAwKQotICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgotICAgICAgICBwYXNzCi0gICAgZWxzZToKLSAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgib3ZlcmZsb3dpbmcgZXhwKCkgZGlkbid0IHRyaWdnZXIgT3ZlcmZsb3dFcnJvciIpCisgICAgZGVmIHRlc3RUYW5oKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgudGFuaCkKKyAgICAgICAgc2VsZi5mdGVzdCgndGFuaCgwKScsIG1hdGgudGFuaCgwKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgndGFuaCgxKSt0YW5oKC0xKScsIG1hdGgudGFuaCgxKSttYXRoLnRhbmgoLTEpLCAwKQogCi0gICAgIyBJZiB0aGlzIGZhaWxzLCBpdCBjb3VsZCBiZSBhIHB1enpsZS4gIE9uZSBvZGQgcG9zc2liaWxpdHkgaXMgdGhhdAotICAgICMgbWF0aG1vZHVsZS5jJ3MgbWFjcm9zIGFyZSBnZXR0aW5nIGNvbmZ1c2VkIHdoaWxlIGNvbXBhcmluZwotICAgICMgSW5mIChIVUdFX1ZBTCkgdG8gYSBOYU4sIGFuZCBhcnRpZmljaWFsbHkgc2V0dGluZyBlcnJubyB0byBFUkFOR0UKLSAgICAjIGFzIGEgcmVzdWx0IChhbmQgc28gcmFpc2luZyBPdmVyZmxvd0Vycm9yIGluc3RlYWQpLgotICAgIHRyeToKLSAgICAgICAgeCA9IG1hdGguc3FydCgtMS4wKQotICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICBwYXNzCi0gICAgZWxzZToKLSAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgic3FydCgtMSkgZGlkbid0IHJhaXNlIFZhbHVlRXJyb3IiKQorICAgICMgUkVEX0ZMQUcgMTYtT2N0LTIwMDAgVGltCisgICAgIyBXaGlsZSAyLjAgaXMgbW9yZSBjb25zaXN0ZW50IGFib3V0IGV4Y2VwdGlvbnMgdGhhbiBwcmV2aW91cyByZWxlYXNlcywgaXQKKyAgICAjIHN0aWxsIGZhaWxzIHRoaXMgcGFydCBvZiB0aGUgdGVzdCBvbiBzb21lIHBsYXRmb3Jtcy4gIEZvciBub3csIHdlIG9ubHkKKyAgICAjICpydW4qIHRlc3RfZXhjZXB0aW9ucygpIGluIHZlcmJvc2UgbW9kZSwgc28gdGhhdCB0aGlzIGlzbid0IG5vcm1hbGx5CisgICAgIyB0ZXN0ZWQuCiAKLWlmIHZlcmJvc2U6Ci0gICAgdGVzdF9leGNlcHRpb25zKCkKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBkZWYgdGVzdF9leGNlcHRpb25zKHNlbGYpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHggPSBtYXRoLmV4cCgtMTAwMDAwMDAwMCkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAjIG1hdGhtb2R1bGUuYyBpcyBmYWlsaW5nIHRvIHdlZWQgb3V0IHVuZGVyZmxvd3MgZnJvbSBsaWJtLCBvcgorICAgICAgICAgICAgICAgICMgd2UndmUgZ290IGFuIGZwIGZvcm1hdCB3aXRoIGh1Z2UgZHluYW1pYyByYW5nZQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgidW5kZXJmbG93aW5nIGV4cCgpIHNob3VsZCBub3QgaGF2ZSByYWlzZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYW4gZXhjZXB0aW9uIikKKyAgICAgICAgICAgIGlmIHggIT0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInVuZGVyZmxvd2luZyBleHAoKSBzaG91bGQgaGF2ZSByZXR1cm5lZCAwIikKKworICAgICAgICAgICAgIyBJZiB0aGlzIGZhaWxzLCBwcm9iYWJseSB1c2luZyBhIHN0cmljdCBJRUVFLTc1NCBjb25mb3JtaW5nIGxpYm0sIGFuZCB4CisgICAgICAgICAgICAjIGlzICtJbmYgYWZ0ZXJ3YXJkcy4gIEJ1dCBQeXRob24gd2FudHMgb3ZlcmZsb3dzIGRldGVjdGVkIGJ5IGRlZmF1bHQuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeCA9IG1hdGguZXhwKDEwMDAwMDAwMDApCisgICAgICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgib3ZlcmZsb3dpbmcgZXhwKCkgZGlkbid0IHRyaWdnZXIgT3ZlcmZsb3dFcnJvciIpCisKKyAgICAgICAgICAgICMgSWYgdGhpcyBmYWlscywgaXQgY291bGQgYmUgYSBwdXp6bGUuICBPbmUgb2RkIHBvc3NpYmlsaXR5IGlzIHRoYXQKKyAgICAgICAgICAgICMgbWF0aG1vZHVsZS5jJ3MgbWFjcm9zIGFyZSBnZXR0aW5nIGNvbmZ1c2VkIHdoaWxlIGNvbXBhcmluZworICAgICAgICAgICAgIyBJbmYgKEhVR0VfVkFMKSB0byBhIE5hTiwgYW5kIGFydGlmaWNpYWxseSBzZXR0aW5nIGVycm5vIHRvIEVSQU5HRQorICAgICAgICAgICAgIyBhcyBhIHJlc3VsdCAoYW5kIHNvIHJhaXNpbmcgT3ZlcmZsb3dFcnJvciBpbnN0ZWFkKS4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB4ID0gbWF0aC5zcXJ0KC0xLjApCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgic3FydCgtMSkgZGlkbid0IHJhaXNlIFZhbHVlRXJyb3IiKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoTWF0aFRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21tYXAucHkgYi9MaWIvdGVzdC90ZXN0X21tYXAucHkKaW5kZXggZDJhMjQ3Ny4uMGI1MzgyMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tbWFwLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbW1hcC5weQpAQCAtMSwxOTAgKzEsMTU4IEBACi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJpZnksIHZlcmVxLCBURVNURk4KK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0CiBpbXBvcnQgbW1hcAoraW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgb3MsIHJlCiAKIFBBR0VTSVpFID0gbW1hcC5QQUdFU0laRQogCi1kZWYgdGVzdF9ib3RoKCk6Ci0gICAgIlRlc3QgbW1hcCBtb2R1bGUgb24gVW5peCBzeXN0ZW1zIGFuZCBXaW5kb3dzIgorY2xhc3MgTW1hcFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotICAgICMgQ3JlYXRlIGEgZmlsZSB0byBiZSBtbWFwJ2VkLgotICAgIGlmIG9zLnBhdGguZXhpc3RzKFRFU1RGTik6Ci0gICAgICAgIG9zLnVubGluayhURVNURk4pCi0gICAgZiA9IG9wZW4oVEVTVEZOLCAndysnKQorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoVEVTVEZOKToKKyAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCiAKLSAgICB0cnk6ICAgICMgdW5saW5rIFRFU1RGTiBubyBtYXR0ZXIgd2hhdAotICAgICAgICAjIFdyaXRlIDIgcGFnZXMgd29ydGggb2YgZGF0YSB0byB0aGUgZmlsZQotICAgICAgICBmLndyaXRlKCdcMCcqIFBBR0VTSVpFKQotICAgICAgICBmLndyaXRlKCdmb28nKQotICAgICAgICBmLndyaXRlKCdcMCcqIChQQUdFU0laRS0zKSApCi0gICAgICAgIGYuZmx1c2goKQotICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIDIgKiBQQUdFU0laRSkKLSAgICAgICAgZi5jbG9zZSgpCi0KLSAgICAgICAgIyBTaW1wbGUgc2FuaXR5IGNoZWNrcwotCi0gICAgICAgIHByaW50IHR5cGUobSkgICMgU0YgYnVnIDEyODcxMzogIHNlZ2ZhdWx0ZWQgb24gTGludXgKLSAgICAgICAgcHJpbnQgJyAgUG9zaXRpb24gb2YgZm9vOicsIG0uZmluZCgnZm9vJykgLyBmbG9hdChQQUdFU0laRSksICdwYWdlcycKLSAgICAgICAgdmVyZXEobS5maW5kKCdmb28nKSwgUEFHRVNJWkUpCi0KLSAgICAgICAgcHJpbnQgJyAgTGVuZ3RoIG9mIGZpbGU6JywgbGVuKG0pIC8gZmxvYXQoUEFHRVNJWkUpLCAncGFnZXMnCi0gICAgICAgIHZlcmVxKGxlbihtKSwgMipQQUdFU0laRSkKLQotICAgICAgICBwcmludCAnICBDb250ZW50cyBvZiBieXRlIDA6JywgcmVwcihtWzBdKQotICAgICAgICB2ZXJlcShtWzBdLCAnXDAnKQotICAgICAgICBwcmludCAnICBDb250ZW50cyBvZiBmaXJzdCAzIGJ5dGVzOicsIHJlcHIobVswOjNdKQotICAgICAgICB2ZXJlcShtWzA6M10sICdcMFwwXDAnKQotCi0gICAgICAgICMgTW9kaWZ5IHRoZSBmaWxlJ3MgY29udGVudAotICAgICAgICBwcmludCAiXG4gIE1vZGlmeWluZyBmaWxlJ3MgY29udGVudC4uLiIKLSAgICAgICAgbVswXSA9ICczJwotICAgICAgICBtW1BBR0VTSVpFICszOiBQQUdFU0laRSArMyszXSA9ICdiYXInCi0KLSAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBtb2RpZmljYXRpb24gd29ya2VkCi0gICAgICAgIHByaW50ICcgIENvbnRlbnRzIG9mIGJ5dGUgMDonLCByZXByKG1bMF0pCi0gICAgICAgIHZlcmVxKG1bMF0sICczJykKLSAgICAgICAgcHJpbnQgJyAgQ29udGVudHMgb2YgZmlyc3QgMyBieXRlczonLCByZXByKG1bMDozXSkKLSAgICAgICAgdmVyZXEobVswOjNdLCAnM1wwXDAnKQotICAgICAgICBwcmludCAnICBDb250ZW50cyBvZiBzZWNvbmQgcGFnZTonLCAgcmVwcihtW1BBR0VTSVpFLTEgOiBQQUdFU0laRSArIDddKQotICAgICAgICB2ZXJlcShtW1BBR0VTSVpFLTEgOiBQQUdFU0laRSArIDddLCAnXDBmb29iYXJcMCcpCi0KLSAgICAgICAgbS5mbHVzaCgpCi0KLSAgICAgICAgIyBUZXN0IGRvaW5nIGEgcmVndWxhciBleHByZXNzaW9uIG1hdGNoIGluIGFuIG1tYXAnZWQgZmlsZQotICAgICAgICBtYXRjaCA9IHJlLnNlYXJjaCgnW0EtWmEtel0rJywgbSkKLSAgICAgICAgaWYgbWF0Y2ggaXMgTm9uZToKLSAgICAgICAgICAgIHByaW50ICcgIEVSUk9SOiByZWdleCBtYXRjaCBvbiBtbWFwIGZhaWxlZCEnCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzdGFydCwgZW5kID0gbWF0Y2guc3BhbigwKQotICAgICAgICAgICAgbGVuZ3RoID0gZW5kIC0gc3RhcnQKLQotICAgICAgICAgICAgcHJpbnQgJyAgUmVnZXggbWF0Y2ggb24gbW1hcCAocGFnZSBzdGFydCwgbGVuZ3RoIG9mIG1hdGNoKTonLAotICAgICAgICAgICAgcHJpbnQgc3RhcnQgLyBmbG9hdChQQUdFU0laRSksIGxlbmd0aAotCi0gICAgICAgICAgICB2ZXJlcShzdGFydCwgUEFHRVNJWkUpCi0gICAgICAgICAgICB2ZXJlcShlbmQsIFBBR0VTSVpFICsgNikKLQotICAgICAgICAjIHRlc3Qgc2Vla2luZyBhcm91bmQgKHRyeSB0byBvdmVyZmxvdyB0aGUgc2VlayBpbXBsZW1lbnRhdGlvbikKLSAgICAgICAgbS5zZWVrKDAsMCkKLSAgICAgICAgcHJpbnQgJyAgU2VlayB0byB6ZXJvdGggYnl0ZScKLSAgICAgICAgdmVyZXEobS50ZWxsKCksIDApCi0gICAgICAgIG0uc2Vlayg0MiwxKQotICAgICAgICBwcmludCAnICBTZWVrIHRvIDQybmQgYnl0ZScKLSAgICAgICAgdmVyZXEobS50ZWxsKCksIDQyKQotICAgICAgICBtLnNlZWsoMCwyKQotICAgICAgICBwcmludCAnICBTZWVrIHRvIGxhc3QgYnl0ZScKLSAgICAgICAgdmVyZXEobS50ZWxsKCksIGxlbihtKSkKLQotICAgICAgICBwcmludCAnICBUcnkgdG8gc2VlayB0byBuZWdhdGl2ZSBwb3NpdGlvbi4uLicKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgbS5zZWVrKC0xKQotICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHZlcmlmeSgwLCAnZXhwZWN0ZWQgYSBWYWx1ZUVycm9yIGJ1dCBkaWQgbm90IGdldCBpdCcpCi0KLSAgICAgICAgcHJpbnQgJyAgVHJ5IHRvIHNlZWsgYmV5b25kIGVuZCBvZiBtbWFwLi4uJwotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBtLnNlZWsoMSwyKQotICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHZlcmlmeSgwLCAnZXhwZWN0ZWQgYSBWYWx1ZUVycm9yIGJ1dCBkaWQgbm90IGdldCBpdCcpCi0KLSAgICAgICAgcHJpbnQgJyAgVHJ5IHRvIHNlZWsgdG8gbmVnYXRpdmUgcG9zaXRpb24uLi4nCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG0uc2VlaygtbGVuKG0pLTEsMikKLSAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB2ZXJpZnkoMCwgJ2V4cGVjdGVkIGEgVmFsdWVFcnJvciBidXQgZGlkIG5vdCBnZXQgaXQnKQotCi0gICAgICAgICMgVHJ5IHJlc2l6aW5nIG1hcAotICAgICAgICBwcmludCAnICBBdHRlbXB0aW5nIHJlc2l6ZSgpJwotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBtLnJlc2l6ZSg1MTIpCi0gICAgICAgIGV4Y2VwdCBTeXN0ZW1FcnJvcjoKLSAgICAgICAgICAgICMgcmVzaXplKCkgbm90IHN1cHBvcnRlZAotICAgICAgICAgICAgIyBObyBtZXNzYWdlcyBhcmUgcHJpbnRlZCwgc2luY2UgdGhlIG91dHB1dCBvZiB0aGlzIHRlc3Qgc3VpdGUKLSAgICAgICAgICAgICMgd291bGQgdGhlbiBiZSBkaWZmZXJlbnQgYWNyb3NzIHBsYXRmb3Jtcy4KLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgcmVzaXplKCkgaXMgc3VwcG9ydGVkCi0gICAgICAgICAgICB2ZXJpZnkobGVuKG0pID09IDUxMiwKLSAgICAgICAgICAgICAgICAgICAgImxlbihtKSBpcyAlZCwgYnV0IGV4cGVjdGluZyA1MTIiICUgKGxlbihtKSwpICkKLSAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB3ZSBjYW4gbm8gbG9uZ2VyIHNlZWsgYmV5b25kIHRoZSBuZXcgc2l6ZS4KLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBtLnNlZWsoNTEzLDApCi0gICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHZlcmlmeSgwLCAnQ291bGQgc2VlayBiZXlvbmQgdGhlIG5ldyBzaXplJykKLQotICAgICAgICAgICAgIyBDaGVjayB0aGF0IHRoZSB1bmRlcmx5aW5nIGZpbGUgaXMgdHJ1bmNhdGVkIHRvbwotICAgICAgICAgICAgIyAoYnVnICM3Mjg1MTUpCi0gICAgICAgICAgICBmID0gb3BlbihURVNURk4pCi0gICAgICAgICAgICBmLnNlZWsoMCwgMikKLSAgICAgICAgICAgIHZlcmlmeShmLnRlbGwoKSA9PSA1MTIsICdVbmRlcmx5aW5nIGZpbGUgbm90IHRydW5jYXRlZCcpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHZlcmlmeShtLnNpemUoKSA9PSA1MTIsICdOZXcgc2l6ZSBub3QgcmVmbGVjdGVkIGluIGZpbGUnKQotCi0gICAgICAgIG0uY2xvc2UoKQotCi0gICAgZmluYWxseToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICAgICAgcGFzcworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAKLSAgICAjIFRlc3QgZm9yICJhY2Nlc3MiIGtleXdvcmQgcGFyYW1ldGVyCi0gICAgdHJ5OgorICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICAjIFRlc3QgbW1hcCBtb2R1bGUgb24gVW5peCBzeXN0ZW1zIGFuZCBXaW5kb3dzCisKKyAgICAgICAgIyBDcmVhdGUgYSBmaWxlIHRvIGJlIG1tYXAnZWQuCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3crJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBXcml0ZSAyIHBhZ2VzIHdvcnRoIG9mIGRhdGEgdG8gdGhlIGZpbGUKKyAgICAgICAgICAgIGYud3JpdGUoJ1wwJyogUEFHRVNJWkUpCisgICAgICAgICAgICBmLndyaXRlKCdmb28nKQorICAgICAgICAgICAgZi53cml0ZSgnXDAnKiAoUEFHRVNJWkUtMykgKQorICAgICAgICAgICAgZi5mbHVzaCgpCisgICAgICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIDIgKiBQQUdFU0laRSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICAjIFNpbXBsZSBzYW5pdHkgY2hlY2tzCisKKyAgICAgICAgICAgIHRwID0gc3RyKHR5cGUobSkpICAjIFNGIGJ1ZyAxMjg3MTM6ICBzZWdmYXVsdGVkIG9uIExpbnV4CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZmluZCgnZm9vJyksIFBBR0VTSVpFKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtKSwgMipQQUdFU0laRSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtWzBdLCAnXDAnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtWzA6M10sICdcMFwwXDAnKQorCisgICAgICAgICAgICAjIE1vZGlmeSB0aGUgZmlsZSdzIGNvbnRlbnQKKyAgICAgICAgICAgIG1bMF0gPSAnMycKKyAgICAgICAgICAgIG1bUEFHRVNJWkUgKzM6IFBBR0VTSVpFICszKzNdID0gJ2JhcicKKworICAgICAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBtb2RpZmljYXRpb24gd29ya2VkCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bMF0sICczJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVswOjNdLCAnM1wwXDAnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtW1BBR0VTSVpFLTEgOiBQQUdFU0laRSArIDddLCAnXDBmb29iYXJcMCcpCisKKyAgICAgICAgICAgIG0uZmx1c2goKQorCisgICAgICAgICAgICAjIFRlc3QgZG9pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2ggaW4gYW4gbW1hcCdlZCBmaWxlCisgICAgICAgICAgICBtYXRjaCA9IHJlLnNlYXJjaCgnW0EtWmEtel0rJywgbSkKKyAgICAgICAgICAgIGlmIG1hdGNoIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdyZWdleCBtYXRjaCBvbiBtbWFwIGZhaWxlZCEnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGFydCwgZW5kID0gbWF0Y2guc3BhbigwKQorICAgICAgICAgICAgICAgIGxlbmd0aCA9IGVuZCAtIHN0YXJ0CisKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXJ0LCBQQUdFU0laRSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuZCwgUEFHRVNJWkUgKyA2KQorCisgICAgICAgICAgICAjIHRlc3Qgc2Vla2luZyBhcm91bmQgKHRyeSB0byBvdmVyZmxvdyB0aGUgc2VlayBpbXBsZW1lbnRhdGlvbikKKyAgICAgICAgICAgIG0uc2VlaygwLDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0udGVsbCgpLCAwKQorICAgICAgICAgICAgbS5zZWVrKDQyLDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0udGVsbCgpLCA0MikKKyAgICAgICAgICAgIG0uc2VlaygwLDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0udGVsbCgpLCBsZW4obSkpCisKKyAgICAgICAgICAgICMgVHJ5IHRvIHNlZWsgdG8gbmVnYXRpdmUgcG9zaXRpb24uLi4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG0uc2VlaywgLTEpCisKKyAgICAgICAgICAgICMgVHJ5IHRvIHNlZWsgYmV5b25kIGVuZCBvZiBtbWFwLi4uCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtLnNlZWssIDEsIDIpCisKKyAgICAgICAgICAgICMgVHJ5IHRvIHNlZWsgdG8gbmVnYXRpdmUgcG9zaXRpb24uLi4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG0uc2VlaywgLWxlbihtKS0xLCAyKQorCisgICAgICAgICAgICAjIFRyeSByZXNpemluZyBtYXAKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtLnJlc2l6ZSg1MTIpCisgICAgICAgICAgICBleGNlcHQgU3lzdGVtRXJyb3I6CisgICAgICAgICAgICAgICAgIyByZXNpemUoKSBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgIyBObyBtZXNzYWdlcyBhcmUgcHJpbnRlZCwgc2luY2UgdGhlIG91dHB1dCBvZiB0aGlzIHRlc3Qgc3VpdGUKKyAgICAgICAgICAgICAgICAjIHdvdWxkIHRoZW4gYmUgZGlmZmVyZW50IGFjcm9zcyBwbGF0Zm9ybXMuCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIHJlc2l6ZSgpIGlzIHN1cHBvcnRlZAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG0pLCA1MTIpCisgICAgICAgICAgICAgICAgIyBDaGVjayB0aGF0IHdlIGNhbiBubyBsb25nZXIgc2VlayBiZXlvbmQgdGhlIG5ldyBzaXplLgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG0uc2VlaywgNTEzLCAwKQorCisgICAgICAgICAgICAgICAgIyBDaGVjayB0aGF0IHRoZSB1bmRlcmx5aW5nIGZpbGUgaXMgdHJ1bmNhdGVkIHRvbworICAgICAgICAgICAgICAgICMgKGJ1ZyAjNzI4NTE1KQorICAgICAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTikKKyAgICAgICAgICAgICAgICBmLnNlZWsoMCwgMikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCA1MTIpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnNpemUoKSwgNTEyKQorCisgICAgICAgICAgICBtLmNsb3NlKCkKKworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfYWNjZXNzX3BhcmFtZXRlcihzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciAiYWNjZXNzIiBrZXl3b3JkIHBhcmFtZXRlcgogICAgICAgICBtYXBzaXplID0gMTAKLSAgICAgICAgcHJpbnQgIiAgQ3JlYXRpbmciLCBtYXBzaXplLCAiYnl0ZSB0ZXN0IGRhdGEgZmlsZS4iCiAgICAgICAgIG9wZW4oVEVTVEZOLCAid2IiKS53cml0ZSgiYSIqbWFwc2l6ZSkKLSAgICAgICAgcHJpbnQgIiAgT3BlbmluZyBtbWFwIHdpdGggYWNjZXNzPUFDQ0VTU19SRUFEIgogICAgICAgICBmID0gb3BlbihURVNURk4sICJyYiIpCiAgICAgICAgIG0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgbWFwc2l6ZSwgYWNjZXNzPW1tYXAuQUNDRVNTX1JFQUQpCi0gICAgICAgIHZlcmlmeShtWzpdID09ICdhJyptYXBzaXplLCAiUmVhZG9ubHkgbWVtb3J5IG1hcCBkYXRhIGluY29ycmVjdC4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bOl0sICdhJyptYXBzaXplLCAiUmVhZG9ubHkgbWVtb3J5IG1hcCBkYXRhIGluY29ycmVjdC4iKQogCi0gICAgICAgIHByaW50ICIgIEVuc3VyaW5nIHRoYXQgcmVhZG9ubHkgbW1hcCBjYW4ndCBiZSBzbGljZSBhc3NpZ25lZC4iCisgICAgICAgICMgRW5zdXJpbmcgdGhhdCByZWFkb25seSBtbWFwIGNhbid0IGJlIHNsaWNlIGFzc2lnbmVkCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG1bOl0gPSAnYicqbWFwc2l6ZQogICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBlbHNlOgotICAgICAgICAgICAgdmVyaWZ5KDAsICJBYmxlIHRvIHdyaXRlIHRvIHJlYWRvbmx5IG1lbW9yeSBtYXAiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJBYmxlIHRvIHdyaXRlIHRvIHJlYWRvbmx5IG1lbW9yeSBtYXAiKQogCi0gICAgICAgIHByaW50ICIgIEVuc3VyaW5nIHRoYXQgcmVhZG9ubHkgbW1hcCBjYW4ndCBiZSBpdGVtIGFzc2lnbmVkLiIKKyAgICAgICAgIyBFbnN1cmluZyB0aGF0IHJlYWRvbmx5IG1tYXAgY2FuJ3QgYmUgaXRlbSBhc3NpZ25lZAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBtWzBdID0gJ2InCiAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB2ZXJpZnkoMCwgIkFibGUgdG8gd3JpdGUgdG8gcmVhZG9ubHkgbWVtb3J5IG1hcCIpCisgICAgICAgICAgICBzZWxmLmZhaWwoIkFibGUgdG8gd3JpdGUgdG8gcmVhZG9ubHkgbWVtb3J5IG1hcCIpCiAKLSAgICAgICAgcHJpbnQgIiAgRW5zdXJpbmcgdGhhdCByZWFkb25seSBtbWFwIGNhbid0IGJlIHdyaXRlKCkgdG8uIgorICAgICAgICAjIEVuc3VyaW5nIHRoYXQgcmVhZG9ubHkgbW1hcCBjYW4ndCBiZSB3cml0ZSgpIHRvCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG0uc2VlaygwLDApCiAgICAgICAgICAgICBtLndyaXRlKCdhYmMnKQogICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBlbHNlOgotICAgICAgICAgICAgdmVyaWZ5KDAsICJBYmxlIHRvIHdyaXRlIHRvIHJlYWRvbmx5IG1lbW9yeSBtYXAiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJBYmxlIHRvIHdyaXRlIHRvIHJlYWRvbmx5IG1lbW9yeSBtYXAiKQogCi0gICAgICAgIHByaW50ICIgIEVuc3VyaW5nIHRoYXQgcmVhZG9ubHkgbW1hcCBjYW4ndCBiZSB3cml0ZV9ieXRlKCkgdG8uIgorICAgICAgICAjIEVuc3VyaW5nIHRoYXQgcmVhZG9ubHkgbW1hcCBjYW4ndCBiZSB3cml0ZV9ieXRlKCkgdG8KICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbS5zZWVrKDAsMCkKICAgICAgICAgICAgIG0ud3JpdGVfYnl0ZSgnZCcpCiAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB2ZXJpZnkoMCwgIkFibGUgdG8gd3JpdGUgdG8gcmVhZG9ubHkgbWVtb3J5IG1hcCIpCisgICAgICAgICAgICBzZWxmLmZhaWwoIkFibGUgdG8gd3JpdGUgdG8gcmVhZG9ubHkgbWVtb3J5IG1hcCIpCiAKLSAgICAgICAgcHJpbnQgIiAgRW5zdXJpbmcgdGhhdCByZWFkb25seSBtbWFwIGNhbid0IGJlIHJlc2l6ZWQuIgorICAgICAgICAjIEVuc3VyaW5nIHRoYXQgcmVhZG9ubHkgbW1hcCBjYW4ndCBiZSByZXNpemVkCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG0ucmVzaXplKDIqbWFwc2l6ZSkKICAgICAgICAgZXhjZXB0IFN5c3RlbUVycm9yOiAgICMgcmVzaXplIGlzIG5vdCB1bml2ZXJzYWxseSBzdXBwb3J0ZWQKQEAgLTE5MiwxMiArMTYwLDEyIEBACiAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB2ZXJpZnkoMCwgIkFibGUgdG8gcmVzaXplIHJlYWRvbmx5IG1lbW9yeSBtYXAiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJBYmxlIHRvIHJlc2l6ZSByZWFkb25seSBtZW1vcnkgbWFwIikKICAgICAgICAgZGVsIG0sIGYKLSAgICAgICAgdmVyaWZ5KG9wZW4oVEVTVEZOLCAicmIiKS5yZWFkKCkgPT0gJ2EnKm1hcHNpemUsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlbihURVNURk4sICJyYiIpLnJlYWQoKSwgJ2EnKm1hcHNpemUsCiAgICAgICAgICAgICAgICAiUmVhZG9ubHkgbWVtb3J5IG1hcCBkYXRhIGZpbGUgd2FzIG1vZGlmaWVkIikKIAotICAgICAgICBwcmludCAiICBPcGVuaW5nIG1tYXAgd2l0aCBzaXplIHRvbyBiaWciCisgICAgICAgICMgT3BlbmluZyBtbWFwIHdpdGggc2l6ZSB0b28gYmlnCiAgICAgICAgIGltcG9ydCBzeXMKICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAicitiIikKICAgICAgICAgdHJ5OgpAQCAtMjA4LDExICsxNzYsMTEgQEAKICAgICAgICAgICAgICMgbGF0ZXIgdGVzdHMgYXNzdW1lIHRoYXQgdGhlIGxlbmd0aCBoYXNuJ3QgY2hhbmdlZC4gIFdlIG5lZWQgdG8KICAgICAgICAgICAgICMgcmVwYWlyIHRoYXQuCiAgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnd2luJyk6Ci0gICAgICAgICAgICAgICAgdmVyaWZ5KDAsICJPcGVuaW5nIG1tYXAgd2l0aCBzaXplKzEgc2hvdWxkIHdvcmsgb24gV2luZG93cy4iKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiT3BlbmluZyBtbWFwIHdpdGggc2l6ZSsxIHNob3VsZCB3b3JrIG9uIFdpbmRvd3MuIikKICAgICAgICAgZWxzZToKICAgICAgICAgICAgICMgd2UgZXhwZWN0IGEgVmFsdWVFcnJvciBvbiBVbml4LCBidXQgbm90IG9uIFdpbmRvd3MKICAgICAgICAgICAgIGlmIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnd2luJyk6Ci0gICAgICAgICAgICAgICAgdmVyaWZ5KDAsICJPcGVuaW5nIG1tYXAgd2l0aCBzaXplKzEgc2hvdWxkIHJhaXNlIFZhbHVlRXJyb3IuIikKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk9wZW5pbmcgbW1hcCB3aXRoIHNpemUrMSBzaG91bGQgcmFpc2UgVmFsdWVFcnJvci4iKQogICAgICAgICAgICAgbS5jbG9zZSgpCiAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnd2luJyk6CkBAIC0yMjEsMTIgKzE4OSwxMiBAQAogICAgICAgICAgICAgZi50cnVuY2F0ZShtYXBzaXplKQogICAgICAgICAgICAgZi5jbG9zZSgpCiAKLSAgICAgICAgcHJpbnQgIiAgT3BlbmluZyBtbWFwIHdpdGggYWNjZXNzPUFDQ0VTU19XUklURSIKKyAgICAgICAgIyBPcGVuaW5nIG1tYXAgd2l0aCBhY2Nlc3M9QUNDRVNTX1dSSVRFCiAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInIrYiIpCiAgICAgICAgIG0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgbWFwc2l6ZSwgYWNjZXNzPW1tYXAuQUNDRVNTX1dSSVRFKQotICAgICAgICBwcmludCAiICBNb2RpZnlpbmcgd3JpdGUtdGhyb3VnaCBtZW1vcnkgbWFwLiIKKyAgICAgICAgIyBNb2RpZnlpbmcgd3JpdGUtdGhyb3VnaCBtZW1vcnkgbWFwCiAgICAgICAgIG1bOl0gPSAnYycqbWFwc2l6ZQotICAgICAgICB2ZXJpZnkobVs6XSA9PSAnYycqbWFwc2l6ZSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtWzpdLCAnYycqbWFwc2l6ZSwKICAgICAgICAgICAgICAgICJXcml0ZS10aHJvdWdoIG1lbW9yeSBtYXAgbWVtb3J5IG5vdCB1cGRhdGVkIHByb3Blcmx5LiIpCiAgICAgICAgIG0uZmx1c2goKQogICAgICAgICBtLmNsb3NlKCkKQEAgLTIzNCw2NiArMjAyLDQ1IEBACiAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3JiJykKICAgICAgICAgc3R1ZmYgPSBmLnJlYWQoKQogICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgdmVyaWZ5KHN0dWZmID09ICdjJyptYXBzaXplLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0dWZmLCAnYycqbWFwc2l6ZSwKICAgICAgICAgICAgICAgICJXcml0ZS10aHJvdWdoIG1lbW9yeSBtYXAgZGF0YSBmaWxlIG5vdCB1cGRhdGVkIHByb3Blcmx5LiIpCiAKLSAgICAgICAgcHJpbnQgIiAgT3BlbmluZyBtbWFwIHdpdGggYWNjZXNzPUFDQ0VTU19DT1BZIgorICAgICAgICAjIE9wZW5pbmcgbW1hcCB3aXRoIGFjY2Vzcz1BQ0NFU1NfQ09QWQogICAgICAgICBmID0gb3BlbihURVNURk4sICJyK2IiKQogICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIG1hcHNpemUsIGFjY2Vzcz1tbWFwLkFDQ0VTU19DT1BZKQotICAgICAgICBwcmludCAiICBNb2RpZnlpbmcgY29weS1vbi13cml0ZSBtZW1vcnkgbWFwLiIKKyAgICAgICAgIyBNb2RpZnlpbmcgY29weS1vbi13cml0ZSBtZW1vcnkgbWFwCiAgICAgICAgIG1bOl0gPSAnZCcqbWFwc2l6ZQotICAgICAgICB2ZXJpZnkobVs6XSA9PSAnZCcgKiBtYXBzaXplLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bOl0sICdkJyAqIG1hcHNpemUsCiAgICAgICAgICAgICAgICAiQ29weS1vbi13cml0ZSBtZW1vcnkgbWFwIGRhdGEgbm90IHdyaXR0ZW4gY29ycmVjdGx5LiIpCiAgICAgICAgIG0uZmx1c2goKQotICAgICAgICB2ZXJpZnkob3BlbihURVNURk4sICJyYiIpLnJlYWQoKSA9PSAnYycqbWFwc2l6ZSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVuKFRFU1RGTiwgInJiIikucmVhZCgpLCAnYycqbWFwc2l6ZSwKICAgICAgICAgICAgICAgICJDb3B5LW9uLXdyaXRlIHRlc3QgZGF0YSBmaWxlIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIikKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcHJpbnQgIiAgRW5zdXJpbmcgY29weS1vbi13cml0ZSBtYXBzIGNhbm5vdCBiZSByZXNpemVkLiIKLSAgICAgICAgICAgIG0ucmVzaXplKDIqbWFwc2l6ZSkKLSAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHZlcmlmeSgwLCAiQ29weS1vbi13cml0ZSBtbWFwIHJlc2l6ZSBkaWQgbm90IHJhaXNlIGV4Y2VwdGlvbi4iKQorICAgICAgICAjIEVuc3VyaW5nIGNvcHktb24td3JpdGUgbWFwcyBjYW5ub3QgYmUgcmVzaXplZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG0ucmVzaXplLCAyKm1hcHNpemUpCiAgICAgICAgIGRlbCBtLCBmCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHByaW50ICIgIEVuc3VyaW5nIGludmFsaWQgYWNjZXNzIHBhcmFtZXRlciByYWlzZXMgZXhjZXB0aW9uLiIKLSAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInIrYiIpCi0gICAgICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIG1hcHNpemUsIGFjY2Vzcz00KQotICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHZlcmlmeSgwLCAiSW52YWxpZCBhY2Nlc3MgY29kZSBzaG91bGQgaGF2ZSByYWlzZWQgZXhjZXB0aW9uLiIpCisKKyAgICAgICAgIyBFbnN1cmluZyBpbnZhbGlkIGFjY2VzcyBwYXJhbWV0ZXIgcmFpc2VzIGV4Y2VwdGlvbgorICAgICAgICBmID0gb3BlbihURVNURk4sICJyK2IiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtbWFwLm1tYXAsIGYuZmlsZW5vKCksIG1hcHNpemUsIGFjY2Vzcz00KQorICAgICAgICBmLmNsb3NlKCkKIAogICAgICAgICBpZiBvcy5uYW1lID09ICJwb3NpeCI6CiAgICAgICAgICAgICAjIFRyeSBpbmNvbXBhdGlibGUgZmxhZ3MsIHByb3QgYW5kIGFjY2VzcyBwYXJhbWV0ZXJzLgogICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAicitiIikKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIG1hcHNpemUsIGZsYWdzPW1tYXAuTUFQX1BSSVZBVEUsCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtbWFwLm1tYXAsIGYuZmlsZW5vKCksIG1hcHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncz1tbWFwLk1BUF9QUklWQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdD1tbWFwLlBST1RfUkVBRCwgYWNjZXNzPW1tYXAuQUNDRVNTX1dSSVRFKQotICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICB2ZXJpZnkoMCwgIkluY29tcGF0aWJsZSBwYXJhbWV0ZXJzIHNob3VsZCByYWlzZSBWYWx1ZUVycm9yLiIpCiAgICAgICAgICAgICBmLmNsb3NlKCkKLSAgICBmaW5hbGx5OgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQotICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKIAotICAgIHByaW50ICcgIFRyeSBvcGVuaW5nIGEgYmFkIGZpbGUgZGVzY3JpcHRvci4uLicKLSAgICB0cnk6Ci0gICAgICAgIG1tYXAubW1hcCgtMiwgNDA5NikKLSAgICBleGNlcHQgbW1hcC5lcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIHZlcmlmeSgwLCAnZXhwZWN0ZWQgYSBtbWFwLmVycm9yIGJ1dCBkaWQgbm90IGdldCBpdCcpCisgICAgZGVmIHRlc3RfYmFkX2ZpbGVfZGVzYyhzZWxmKToKKyAgICAgICAgIyBUcnkgb3BlbmluZyBhIGJhZCBmaWxlIGRlc2NyaXB0b3IuLi4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMobW1hcC5lcnJvciwgbW1hcC5tbWFwLCAtMiwgNDA5NikKIAotICAgICMgRG8gYSB0b3VnaGVyIC5maW5kKCkgdGVzdC4gIFNGIGJ1ZyA1MTU5NDMgcG9pbnRlZCBvdXQgdGhhdCwgaW4gMi4yLAotICAgICMgc2VhcmNoaW5nIGZvciBkYXRhIHdpdGggZW1iZWRkZWQgXDAgYnl0ZXMgZGlkbid0IHdvcmsuCi0gICAgZiA9IG9wZW4oVEVTVEZOLCAndysnKQorICAgIGRlZiB0ZXN0X3RvdWdoZXJfZmluZChzZWxmKToKKyAgICAgICAgIyBEbyBhIHRvdWdoZXIgLmZpbmQoKSB0ZXN0LiAgU0YgYnVnIDUxNTk0MyBwb2ludGVkIG91dCB0aGF0LCBpbiAyLjIsCisgICAgICAgICMgc2VhcmNoaW5nIGZvciBkYXRhIHdpdGggZW1iZWRkZWQgXDAgYnl0ZXMgZGlkbid0IHdvcmsuCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3crJykKIAotICAgIHRyeTogICAgIyB1bmxpbmsgVEVTVEZOIG5vIG1hdHRlciB3aGF0CiAgICAgICAgIGRhdGEgPSAnYWFiYWFjXHgwMGRlZWZceDAwXHgwMGFhXHgwMCcKICAgICAgICAgbiA9IGxlbihkYXRhKQogICAgICAgICBmLndyaXRlKGRhdGEpCkBAIC0zMDQsMTcgKzI1MSwxNCBAQAogICAgICAgICBmb3Igc3RhcnQgaW4gcmFuZ2UobisxKToKICAgICAgICAgICAgIGZvciBmaW5pc2ggaW4gcmFuZ2Uoc3RhcnQsIG4rMSk6CiAgICAgICAgICAgICAgICAgc2xpY2UgPSBkYXRhW3N0YXJ0IDogZmluaXNoXQotICAgICAgICAgICAgICAgIHZlcmVxKG0uZmluZChzbGljZSksIGRhdGEuZmluZChzbGljZSkpCi0gICAgICAgICAgICAgICAgdmVyZXEobS5maW5kKHNsaWNlICsgJ3gnKSwgLTEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmZpbmQoc2xpY2UpLCBkYXRhLmZpbmQoc2xpY2UpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5maW5kKHNsaWNlICsgJ3gnKSwgLTEpCiAgICAgICAgIG0uY2xvc2UoKQogCi0gICAgZmluYWxseToKLSAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKyAgICBkZWYgdGVzdF9kb3VibGVfY2xvc2Uoc2VsZik6CisgICAgICAgICMgbWFrZSBzdXJlIGEgZG91YmxlIGNsb3NlIGRvZXNuJ3QgY3Jhc2ggb24gU29sYXJpcyAoQnVnIyA2NjU5MTMpCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3crJykKIAotICAgICMgbWFrZSBzdXJlIGEgZG91YmxlIGNsb3NlIGRvZXNuJ3QgY3Jhc2ggb24gU29sYXJpcyAoQnVnIyA2NjU5MTMpCi0gICAgZiA9IG9wZW4oVEVTVEZOLCAndysnKQotCi0gICAgdHJ5OiAgICAjIHVubGluayBURVNURk4gbm8gbWF0dGVyIHdoYXQKICAgICAgICAgZi53cml0ZSgyKioxNiAqICdhJykgIyBBcmJpdHJhcnkgY2hhcmFjdGVyCiAgICAgICAgIGYuY2xvc2UoKQogCkBAIC0zMjQsNzIgKzI2OCw0NiBAQAogICAgICAgICBtZi5jbG9zZSgpCiAgICAgICAgIGYuY2xvc2UoKQogCi0gICAgZmluYWxseToKLSAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKyAgICBkZWYgdGVzdF9lbnRpcmVfZmlsZShzZWxmKToKKyAgICAgICAgIyB0ZXN0IG1hcHBpbmcgb2YgZW50aXJlIGZpbGUgYnkgcGFzc2luZyAwIGZvciBtYXAgbGVuZ3RoCisgICAgICAgIGlmIGhhc2F0dHIob3MsICJzdGF0Iik6CisgICAgICAgICAgICBmID0gb3BlbihURVNURk4sICJ3KyIpCiAKLSAgICAjIHRlc3QgbWFwcGluZyBvZiBlbnRpcmUgZmlsZSBieSBwYXNzaW5nIDAgZm9yIG1hcCBsZW5ndGgKLSAgICBpZiBoYXNhdHRyKG9zLCAic3RhdCIpOgotICAgICAgICBwcmludCAiICBFbnN1cmluZyB0aGF0IHBhc3NpbmcgMCBhcyBtYXAgbGVuZ3RoIHNldHMgbWFwIHNpemUgdG8gY3VycmVudCBmaWxlIHNpemUuIgotICAgICAgICBmID0gb3BlbihURVNURk4sICJ3KyIpCi0KLSAgICAgICAgdHJ5OgogICAgICAgICAgICAgZi53cml0ZSgyKioxNiAqICdtJykgIyBBcmJpdHJhcnkgY2hhcmFjdGVyCiAgICAgICAgICAgICBmLmNsb3NlKCkKIAogICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAicmIrIikKICAgICAgICAgICAgIG1mID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIDApCi0gICAgICAgICAgICB2ZXJpZnkobGVuKG1mKSA9PSAyKioxNiwgIk1hcCBzaXplIHNob3VsZCBlcXVhbCBmaWxlIHNpemUuIikKLSAgICAgICAgICAgIHZlcmVxKG1mLnJlYWQoMioqMTYpLCAyKioxNiAqICJtIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1mKSwgMioqMTYsICJNYXAgc2l6ZSBzaG91bGQgZXF1YWwgZmlsZSBzaXplLiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1mLnJlYWQoMioqMTYpLCAyKioxNiAqICJtIikKICAgICAgICAgICAgIG1mLmNsb3NlKCkKICAgICAgICAgICAgIGYuY2xvc2UoKQogCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQorICAgIGRlZiB0ZXN0X21vdmUoc2VsZik6CisgICAgICAgICMgbWFrZSBtb3ZlIHdvcmtzIGV2ZXJ5d2hlcmUgKDY0LWJpdCBmb3JtYXQgcHJvYmxlbSBlYXJsaWVyKQorICAgICAgICBmID0gb3BlbihURVNURk4sICd3KycpCiAKLSAgICAjIHRlc3QgbWFwcGluZyBvZiBlbnRpcmUgZmlsZSBieSBwYXNzaW5nIDAgZm9yIG1hcCBsZW5ndGgKLSAgICBpZiBoYXNhdHRyKG9zLCAic3RhdCIpOgotICAgICAgICBwcmludCAiICBFbnN1cmluZyB0aGF0IHBhc3NpbmcgMCBhcyBtYXAgbGVuZ3RoIHNldHMgbWFwIHNpemUgdG8gY3VycmVudCBmaWxlIHNpemUuIgotICAgICAgICBmID0gb3BlbihURVNURk4sICJ3KyIpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGYud3JpdGUoMioqMTYgKiAnbScpICMgQXJiaXRyYXJ5IGNoYXJhY3RlcgotICAgICAgICAgICAgZi5jbG9zZSgpCi0KLSAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInJiKyIpCi0gICAgICAgICAgICBtZiA9IG1tYXAubW1hcChmLmZpbGVubygpLCAwKQotICAgICAgICAgICAgdmVyaWZ5KGxlbihtZikgPT0gMioqMTYsICJNYXAgc2l6ZSBzaG91bGQgZXF1YWwgZmlsZSBzaXplLiIpCi0gICAgICAgICAgICB2ZXJlcShtZi5yZWFkKDIqKjE2KSwgMioqMTYgKiAibSIpCi0gICAgICAgICAgICBtZi5jbG9zZSgpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKLQotICAgICMgbWFrZSBtb3ZlIHdvcmtzIGV2ZXJ5d2hlcmUgKDY0LWJpdCBmb3JtYXQgcHJvYmxlbSBlYXJsaWVyKQotICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3crJykKLQotICAgIHRyeTogICAgIyB1bmxpbmsgVEVTVEZOIG5vIG1hdHRlciB3aGF0CiAgICAgICAgIGYud3JpdGUoIkFCQ0RFYWJjZGUiKSAjIEFyYml0cmFyeSBjaGFyYWN0ZXIKICAgICAgICAgZi5mbHVzaCgpCiAKICAgICAgICAgbWYgPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgMTApCiAgICAgICAgIG1mLm1vdmUoNSwgMCwgNSkKLSAgICAgICAgdmVyaWZ5KG1mWzpdID09ICJBQkNERUFCQ0RFIiwgIk1hcCBtb3ZlIHNob3VsZCBoYXZlIGR1cGxpY2F0ZWQgZnJvbnQgNSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWZbOl0sICJBQkNERUFCQ0RFIiwgIk1hcCBtb3ZlIHNob3VsZCBoYXZlIGR1cGxpY2F0ZWQgZnJvbnQgNSIpCiAgICAgICAgIG1mLmNsb3NlKCkKICAgICAgICAgZi5jbG9zZSgpCiAKLSAgICBmaW5hbGx5OgotICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQorICAgIGRlZiB0ZXN0X2Fub255bW91cyhzZWxmKToKKyAgICAgICAgIyBhbm9ueW1vdXMgbW1hcC5tbWFwKC0xLCBQQUdFKQorICAgICAgICBtID0gbW1hcC5tbWFwKC0xLCBQQUdFU0laRSkKKyAgICAgICAgZm9yIHggaW4geHJhbmdlKFBBR0VTSVpFKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVt4XSwgJ1wwJywgImFub255bW91c2x5IG1tYXAnZWQgY29udGVudHMgc2hvdWxkIGJlIHplcm8iKQogCi1kZWYgdGVzdF9hbm9uKCk6Ci0gICAgcHJpbnQgIiAgYW5vbnltb3VzIG1tYXAubW1hcCgtMSwgUEFHRVNJWkUpLi4uIgotICAgIG0gPSBtbWFwLm1tYXAoLTEsIFBBR0VTSVpFKQotICAgIGZvciB4IGluIHhyYW5nZShQQUdFU0laRSk6Ci0gICAgICAgIHZlcmlmeShtW3hdID09ICdcMCcsICJhbm9ueW1vdXNseSBtbWFwJ2VkIGNvbnRlbnRzIHNob3VsZCBiZSB6ZXJvIikKKyAgICAgICAgZm9yIHggaW4geHJhbmdlKFBBR0VTSVpFKToKKyAgICAgICAgICAgIG1beF0gPSBjaCA9IGNocih4ICYgMjU1KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtW3hdLCBjaCkKIAotICAgIGZvciB4IGluIHhyYW5nZShQQUdFU0laRSk6Ci0gICAgICAgIG1beF0gPSBjaCA9IGNocih4ICYgMjU1KQotICAgICAgICB2ZXJlcShtW3hdLCBjaCkKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoTW1hcFRlc3RzKQogCi10ZXN0X2JvdGgoKQotdGVzdF9hbm9uKCkKLXByaW50ICcgVGVzdCBwYXNzZWQnCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21vZHVsZWZpbmRlci5weSBiL0xpYi90ZXN0L3Rlc3RfbW9kdWxlZmluZGVyLnB5CmluZGV4IDBiOGU0NTEuLjdkYTI0MWIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbW9kdWxlZmluZGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbW9kdWxlZmluZGVyLnB5CkBAIC01MCw3ICs1MCw3IEBACiBtYXliZV90ZXN0X25ldyA9IFsKICAgICAiYS5tb2R1bGUiLAogICAgIFsiYSIsICJhLm1vZHVsZSIsICJzeXMiLAotICAgICAiYiJdLAorICAgICAiYiIsICJfX2Z1dHVyZV9fIl0sCiAgICAgWyJjIl0sIFsiYi5zb21ldGhpbmciXSwKICAgICAiIiJcCiBhL19faW5pdF9fLnB5CkBAIC01OCw2ICs1OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gYiBpbXBvcnQgc29tZXRoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gYyBpbXBvcnQgc29tZXRoaW5nCiBiL19faW5pdF9fLnB5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gc3lzIGltcG9ydCAqCiAiIiJdCiAKQEAgLTg2LDEyICs4NywxMyBAQAogICAgICJhLm1vZHVsZSIsCiAgICAgWyJhIiwgImEubW9kdWxlIiwKICAgICAgImIiLCAiYi54IiwgImIueSIsICJiLnoiLAotICAgICAic3lzIiwgImV4Y2VwdGlvbnMiXSwKKyAgICAgIl9fZnV0dXJlX18iLCAic3lzIiwgImV4Y2VwdGlvbnMiXSwKICAgICBbImJsYWhibGFoIiwgInoiXSwgW10sCiAgICAgIiIiXAogbXltb2R1bGUucHkKIGEvX19pbml0X18ucHkKIGEvbW9kdWxlLnB5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBzeXMgIyBzeXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGJsYWhibGFoICMgZmFpbHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGV4Y2VwdGlvbnMgIyBleGNlcHRpb25zCkBAIC0xMTUsNyArMTE3LDggQEAKIAogcmVsYXRpdmVfaW1wb3J0X3Rlc3QgPSBbCiAgICAgImEubW9kdWxlIiwKLSAgICBbImEiLCAiYS5tb2R1bGUiLAorICAgIFsiX19mdXR1cmVfXyIsCisgICAgICJhIiwgImEubW9kdWxlIiwKICAgICAgImEuYiIsICJhLmIueSIsICJhLmIueiIsCiAgICAgICJhLmIuYyIsICJhLmIuYy5tb2R1bGVDIiwKICAgICAgImEuYi5jLmQiLCAiYS5iLmMuZSIsCkBAIC0xMjcsNiArMTMwLDcgQEAKIGEvX19pbml0X18ucHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAuYiBpbXBvcnQgeSwgeiAjIGEuYi55LCBhLmIuegogYS9tb2R1bGUucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQgIyBfX2Z1dHVyZV9fCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBleGNlcHRpb25zICMgZXhjZXB0aW9ucwogYS9leGNlcHRpb25zLnB5CiBhL3N5cy5weQpAQCAtMjUzLDYgKzI1Nyw3IEBACiAgICAgICAgICAgICBzZWxmLl9kb190ZXN0KHJlbGF0aXZlX2ltcG9ydF90ZXN0XzIpCiAKIGRlZiB0ZXN0X21haW4oKToKKyAgICBkaXN0dXRpbHMubG9nLnNldF90aHJlc2hvbGQoZGlzdHV0aWxzLmxvZy5XQVJOKQogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoTW9kdWxlRmluZGVyVGVzdCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkgYi9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5CmluZGV4IDk1ZjRiMzguLmZiN2Y4MmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQpAQCAtMjAyLDYgKzIwMiwyMiBAQAogICAgICAgICB1bmkgPSB1JzpodTQ6dW5pdFx4ZTkgZGUgZmFtaWxsZScKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc28yMDIyanAyLmRlY29kZSgnaXNvMjAyMi1qcC0yJyksIHVuaSkKIAorICAgIGRlZiB0ZXN0X2lzbzIwMjJfanBfZzAoc2VsZik6CisgICAgICAgIHNlbGYuZmFpbElmKCdceDBlJyBpbiB1J1xOe1NPRlQgSFlQSEVOfScuZW5jb2RlKCdpc28tMjAyMi1qcC0yJykpCisgICAgICAgIGZvciBlbmNvZGluZyBpbiAoJ2lzby0yMDIyLWpwLTIwMDQnLCAnaXNvLTIwMjItanAtMycpOgorICAgICAgICAgICAgZSA9IHUnXHUzNDA2Jy5lbmNvZGUoZW5jb2RpbmcpCisgICAgICAgICAgICBzZWxmLmZhaWxJZihmaWx0ZXIobGFtYmRhIHg6IHggPj0gJ1x4ODAnLCBlKSkKKworICAgIGRlZiB0ZXN0X2J1ZzE1NzI4MzIoc2VsZik6CisgICAgICAgIGlmIHN5cy5tYXh1bmljb2RlID49IDB4MTAwMDA6CisgICAgICAgICAgICBteXVuaWNociA9IHVuaWNocgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbXl1bmljaHIgPSBsYW1iZGEgeDogdW5pY2hyKDB4RDdDMCsoeD4+MTApKSArIHVuaWNocigweERDMDArKHgmMHgzRkYpKQorCisgICAgICAgIGZvciB4IGluIHhyYW5nZSgweDEwMDAwLCAweDExMDAwMCk6CisgICAgICAgICAgICAjIEFueSBJU08gMjAyMiBjb2RlYyB3aWxsIGNhdXNlIHRoZSBzZWdmYXVsdAorICAgICAgICAgICAgbXl1bmljaHIoeCkuZW5jb2RlKCdpc29fMjAyMl9qcCcsICdpZ25vcmUnKQorCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQogICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKFRlc3RfTXVsdGlieXRlQ29kZWMpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tdXRhbnRzLnB5IGIvTGliL3Rlc3QvdGVzdF9tdXRhbnRzLnB5CmluZGV4IDhhZmRhNzUuLjYyMTUyMjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbXV0YW50cy5weQorKysgYi9MaWIvdGVzdC90ZXN0X211dGFudHMucHkKQEAgLTkyLDggKzkyLDggQEAKICAgICAgICAgIyNzZWxmLmhhc2hjb2RlID0gcmFuZG9tLnJhbmRyYW5nZSgxMDAwMDAwMDAwKQogCiAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgotICAgICAgICAjI3JldHVybiBzZWxmLmhhc2hjb2RlCiAgICAgICAgIHJldHVybiA0MgorICAgICAgICByZXR1cm4gc2VsZi5oYXNoY29kZQogCiAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIG1heWJlX211dGF0ZSgpICAgIyBUaGUgcG9pbnQgb2YgdGhlIHRlc3QuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X25ldy5weSBiL0xpYi90ZXN0L3Rlc3RfbmV3LnB5CmluZGV4IDNjMTZiZjUuLmU5MGZkNjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbmV3LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbmV3LnB5CkBAIC00Nyw2ICs0NywxNCBAQAogZWxzZToKICAgICByYWlzZSBUZXN0RmFpbGVkLCAiZGFuZ2Vyb3VzIGluc3RhbmNlIG1ldGhvZCBjcmVhdGlvbiBhbGxvd2VkIgogCisjIFZlcmlmeSB0aGF0IGluc3RhbmNlbWV0aG9kKCkgZG9lc24ndCBhbGxvdyBrZXl3b3JkIGFyZ3MKK3RyeToKKyAgICBuZXcuaW5zdGFuY2VtZXRob2QoYnJlYWtfeW9sa3MsIGMsIGt3PTEpCitleGNlcHQgVHlwZUVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgcmFpc2UgVGVzdEZhaWxlZCwgImluc3RhbmNlbWV0aG9kIHNob3VsZG4ndCBhY2NlcHQga2V5d29yZCBhcmdzIgorCiAjIEl0J3MgdW5jbGVhciB3aGF0IHRoZSBzZW1hbnRpY3Mgc2hvdWxkIGJlIGZvciBhIGNvZGUgb2JqZWN0IGNvbXBpbGVkIGF0CiAjIG1vZHVsZSBzY29wZSwgYnV0IGJvdW5kIGFuZCBydW4gaW4gYSBmdW5jdGlvbi4gIEluIENQeXRob24sIGBjJyBpcyBnbG9iYWwKICMgKGJ5IGFjY2lkZW50Pykgd2hpbGUgaW4gSnl0aG9uLCBgYycgaXMgbG9jYWwuICBUaGUgaW50ZW50IG9mIHRoZSB0ZXN0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X25pcy5weSBiL0xpYi90ZXN0L3Rlc3RfbmlzLnB5CmluZGV4IGY1MjI0ZmUuLjU5MDg2OGYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbmlzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbmlzLnB5CkBAIC0xLDMyICsxLDQxIEBACi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBUZXN0RmFpbGVkLCBUZXN0U2tpcHBlZAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgcnVuX3VuaXR0ZXN0CitpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBuaXMKIAotcHJpbnQgJ25pcy5tYXBzKCknCi10cnk6Ci0gICAgbWFwcyA9IG5pcy5tYXBzKCkKLWV4Y2VwdCBuaXMuZXJyb3IsIG1zZzoKLSAgICAjIE5JUyBpcyBwcm9iYWJseSBub3QgYWN0aXZlLCBzbyB0aGlzIHRlc3QgaXNuJ3QgdXNlZnVsCi0gICAgaWYgdmVyYm9zZToKLSAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgbXNnCi0gICAgIyBvbmx5IGRvIHRoaXMgaWYgcnVubmluZyB1bmRlciB0aGUgcmVncmVzc2lvbiBzdWl0ZQotICAgIHJhaXNlIFRlc3RTa2lwcGVkLCBtc2cKK2NsYXNzIE5pc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9tYXBzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBtYXBzID0gbmlzLm1hcHMoKQorICAgICAgICBleGNlcHQgbmlzLmVycm9yLCBtc2c6CisgICAgICAgICAgICAjIE5JUyBpcyBwcm9iYWJseSBub3QgYWN0aXZlLCBzbyB0aGlzIHRlc3QgaXNuJ3QgdXNlZnVsCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiKGZhaWxpbmcgYmVjYXVzZSBvZiB2ZXJib3NlIG1vZGUpICVzIiAlIG1zZykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIE9uIHNvbWUgc3lzdGVtcywgdGhpcyBtYXAgaXMgb25seSBhY2Nlc3NpYmxlIHRvIHRoZQorICAgICAgICAgICAgIyBzdXBlciB1c2VyCisgICAgICAgICAgICBtYXBzLnJlbW92ZSgicGFzc3dkLmFkanVuY3QuYnluYW1lIikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCiAKLWRvbmUgPSAwCi1mb3IgbmlzbWFwIGluIG1hcHM6Ci0gICAgaWYgdmVyYm9zZToKLSAgICAgICAgcHJpbnQgbmlzbWFwCi0gICAgbWFwcGluZyA9IG5pcy5jYXQobmlzbWFwKQotICAgIGZvciBrLCB2IGluIG1hcHBpbmcuaXRlbXMoKToKLSAgICAgICAgaWYgdmVyYm9zZToKLSAgICAgICAgICAgIHByaW50ICcgICAgJywgaywgdgotICAgICAgICBpZiBub3QgazoKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGlmIG5pcy5tYXRjaChrLCBuaXNtYXApICE9IHY6Ci0gICAgICAgICAgICBwcmludCAiTklTIG1hdGNoIGZhaWxlZCBmb3Iga2V5IGAlcycgaW4gbWFwIGAlcyciICUgKGssIG5pc21hcCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMganVzdCB0ZXN0IHRoZSBvbmUga2V5LCBvdGhlcndpc2UgdGhpcyB0ZXN0IGNvdWxkIHRha2UgYQotICAgICAgICAgICAgIyB2ZXJ5IGxvbmcgdGltZQotICAgICAgICAgICAgZG9uZSA9IDEKLSAgICAgICAgICAgIGJyZWFrCi0gICAgaWYgZG9uZToKLSAgICAgICAgYnJlYWsKKyAgICAgICAgZG9uZSA9IDAKKyAgICAgICAgZm9yIG5pc21hcCBpbiBtYXBzOgorICAgICAgICAgICAgbWFwcGluZyA9IG5pcy5jYXQobmlzbWFwKQorICAgICAgICAgICAgZm9yIGssIHYgaW4gbWFwcGluZy5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBrOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIG5pcy5tYXRjaChrLCBuaXNtYXApICE9IHY6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiTklTIG1hdGNoIGZhaWxlZCBmb3Iga2V5IGAlcycgaW4gbWFwIGAlcyciICUgKGssIG5pc21hcCkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBqdXN0IHRlc3QgdGhlIG9uZSBrZXksIG90aGVyd2lzZSB0aGlzIHRlc3QgY291bGQgdGFrZSBhCisgICAgICAgICAgICAgICAgICAgICMgdmVyeSBsb25nIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgZG9uZSA9IDEKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGRvbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChOaXNUZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcGNvZGVzLnB5IGIvTGliL3Rlc3QvdGVzdF9vcGNvZGVzLnB5CmluZGV4IDc0MjI2N2YuLjFhMmY1ZDYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3Bjb2Rlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X29wY29kZXMucHkKQEAgLTEsMTAxICsxLDExMCBAQAogIyBQeXRob24gdGVzdCBzZXQgLS0gcGFydCAyLCBvcGNvZGVzCiAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RGYWlsZWQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIE9wY29kZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfdHJ5X2luc2lkZV9mb3JfbG9vcChzZWxmKToKKyAgICAgICAgbiA9IDAKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgbiA9IG4raQorICAgICAgICAgICAgdHJ5OiAxLzAKKyAgICAgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6IHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcworICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogcGFzcworICAgICAgICAgICAgdHJ5OiBwYXNzCisgICAgICAgICAgICBleGNlcHQ6IHBhc3MKKyAgICAgICAgICAgIHRyeTogcGFzcworICAgICAgICAgICAgZmluYWxseTogcGFzcworICAgICAgICAgICAgbiA9IG4raQorICAgICAgICBpZiBuICE9IDkwOgorICAgICAgICAgICAgc2VsZi5mYWlsKCd0cnkgaW5zaWRlIGZvcicpCisKKyAgICBkZWYgdGVzdF9yYWlzZV9jbGFzc19leGNlcHRpb25zKHNlbGYpOgorCisgICAgICAgIGNsYXNzIEFDbGFzcyhFeGNlcHRpb24pOiBwYXNzCisgICAgICAgIGNsYXNzIEJDbGFzcyhBQ2xhc3MpOiBwYXNzCisgICAgICAgIGNsYXNzIENDbGFzcyhFeGNlcHRpb24pOiBwYXNzCisgICAgICAgIGNsYXNzIERDbGFzcyhBQ2xhc3MpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGlnbm9yZSk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRyeTogcmFpc2UgQUNsYXNzKCkKKyAgICAgICAgZXhjZXB0OiBwYXNzCisKKyAgICAgICAgdHJ5OiByYWlzZSBBQ2xhc3MoKQorICAgICAgICBleGNlcHQgQUNsYXNzOiBwYXNzCisKKyAgICAgICAgdHJ5OiByYWlzZSBCQ2xhc3MoKQorICAgICAgICBleGNlcHQgQUNsYXNzOiBwYXNzCisKKyAgICAgICAgdHJ5OiByYWlzZSBCQ2xhc3MoKQorICAgICAgICBleGNlcHQgQ0NsYXNzOiBzZWxmLmZhaWwoKQorICAgICAgICBleGNlcHQ6IHBhc3MKKworICAgICAgICBhID0gQUNsYXNzKCkKKyAgICAgICAgYiA9IEJDbGFzcygpCisKKyAgICAgICAgdHJ5OiByYWlzZSBBQ2xhc3MsIGIKKyAgICAgICAgZXhjZXB0IEJDbGFzcywgdjoKKyAgICAgICAgICAgIGlmIHYgIT0gYjogc2VsZi5mYWlsKCJ2IT1iIikKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCJubyBleGNlcHRpb24iKQorCisgICAgICAgIHRyeTogcmFpc2UgYgorICAgICAgICBleGNlcHQgQUNsYXNzLCB2OgorICAgICAgICAgICAgaWYgdiAhPSBiOiBzZWxmLmZhaWwoInYhPWIgQUNsYXNzIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gZXhjZXB0aW9uIikKKworICAgICAgICAjIG5vdCBlbm91Z2ggYXJndW1lbnRzCisgICAgICAgICMjdHJ5OiAgcmFpc2UgQkNsYXNzLCBhCisgICAgICAgICMjZXhjZXB0IFR5cGVFcnJvcjogcGFzcworICAgICAgICAjI2Vsc2U6IHNlbGYuZmFpbCgibm8gZXhjZXB0aW9uIikKKworICAgICAgICB0cnk6ICByYWlzZSBEQ2xhc3MsIGEKKyAgICAgICAgZXhjZXB0IERDbGFzcywgdjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHYsIERDbGFzcykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIm5vIGV4Y2VwdGlvbiIpCisKKyAgICBkZWYgdGVzdF9jb21wYXJlX2Z1bmN0aW9uX29iamVjdHMoc2VsZik6CisKKyAgICAgICAgZiA9IGV2YWwoJ2xhbWJkYTogTm9uZScpCisgICAgICAgIGcgPSBldmFsKCdsYW1iZGE6IE5vbmUnKQorICAgICAgICBzZWxmLmZhaWxJZihmID09IGcpCisKKyAgICAgICAgZiA9IGV2YWwoJ2xhbWJkYSBhOiBhJykKKyAgICAgICAgZyA9IGV2YWwoJ2xhbWJkYSBhOiBhJykKKyAgICAgICAgc2VsZi5mYWlsSWYoZiA9PSBnKQorCisgICAgICAgIGYgPSBldmFsKCdsYW1iZGEgYT0xOiBhJykKKyAgICAgICAgZyA9IGV2YWwoJ2xhbWJkYSBhPTE6IGEnKQorICAgICAgICBzZWxmLmZhaWxJZihmID09IGcpCisKKyAgICAgICAgZiA9IGV2YWwoJ2xhbWJkYTogMCcpCisgICAgICAgIGcgPSBldmFsKCdsYW1iZGE6IDEnKQorICAgICAgICBzZWxmLmZhaWxJZihmID09IGcpCisKKyAgICAgICAgZiA9IGV2YWwoJ2xhbWJkYTogTm9uZScpCisgICAgICAgIGcgPSBldmFsKCdsYW1iZGEgYTogTm9uZScpCisgICAgICAgIHNlbGYuZmFpbElmKGYgPT0gZykKKworICAgICAgICBmID0gZXZhbCgnbGFtYmRhIGE6IE5vbmUnKQorICAgICAgICBnID0gZXZhbCgnbGFtYmRhIGI6IE5vbmUnKQorICAgICAgICBzZWxmLmZhaWxJZihmID09IGcpCisKKyAgICAgICAgZiA9IGV2YWwoJ2xhbWJkYSBhOiBOb25lJykKKyAgICAgICAgZyA9IGV2YWwoJ2xhbWJkYSBhPU5vbmU6IE5vbmUnKQorICAgICAgICBzZWxmLmZhaWxJZihmID09IGcpCisKKyAgICAgICAgZiA9IGV2YWwoJ2xhbWJkYSBhPTA6IE5vbmUnKQorICAgICAgICBnID0gZXZhbCgnbGFtYmRhIGE9MTogTm9uZScpCisgICAgICAgIHNlbGYuZmFpbElmKGYgPT0gZykKIAogCi1wcmludCAnMi4gT3Bjb2RlcycKLXByaW50ICdYWFggTm90IHlldCBmdWxseSBpbXBsZW1lbnRlZCcKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoT3Bjb2RlVGVzdCkKIAotcHJpbnQgJzIuMSB0cnkgaW5zaWRlIGZvciBsb29wJwotbiA9IDAKLWZvciBpIGluIHJhbmdlKDEwKToKLSAgICBuID0gbitpCi0gICAgdHJ5OiAxLzAKLSAgICBleGNlcHQgTmFtZUVycm9yOiBwYXNzCi0gICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCi0gICAgZXhjZXB0IFR5cGVFcnJvcjogcGFzcwotICAgIHRyeTogcGFzcwotICAgIGV4Y2VwdDogcGFzcwotICAgIHRyeTogcGFzcwotICAgIGZpbmFsbHk6IHBhc3MKLSAgICBuID0gbitpCi1pZiBuICE9IDkwOgotICAgIHJhaXNlIFRlc3RGYWlsZWQsICd0cnkgaW5zaWRlIGZvcicKLQotCi1wcmludCAnMi4yIHJhaXNlIGNsYXNzIGV4Y2VwdGlvbnMnCi0KLWNsYXNzIEFDbGFzcyhFeGNlcHRpb24pOiBwYXNzCi1jbGFzcyBCQ2xhc3MoQUNsYXNzKTogcGFzcwotY2xhc3MgQ0NsYXNzKEV4Y2VwdGlvbik6IHBhc3MKLWNsYXNzIERDbGFzcyhBQ2xhc3MpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpZ25vcmUpOgotICAgICAgICBwYXNzCi0KLXRyeTogcmFpc2UgQUNsYXNzKCkKLWV4Y2VwdDogcGFzcwotCi10cnk6IHJhaXNlIEFDbGFzcygpCi1leGNlcHQgQUNsYXNzOiBwYXNzCi0KLXRyeTogcmFpc2UgQkNsYXNzKCkKLWV4Y2VwdCBBQ2xhc3M6IHBhc3MKLQotdHJ5OiByYWlzZSBCQ2xhc3MoKQotZXhjZXB0IENDbGFzczogcmFpc2UgVGVzdEZhaWxlZAotZXhjZXB0OiBwYXNzCi0KLWEgPSBBQ2xhc3MoKQotYiA9IEJDbGFzcygpCi0KLXRyeTogcmFpc2UgQUNsYXNzLCBiCi1leGNlcHQgQkNsYXNzLCB2OgotICAgIGlmIHYgIT0gYjogcmFpc2UgVGVzdEZhaWxlZCwgInYhPWIiCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAibm8gZXhjZXB0aW9uIgotCi10cnk6IHJhaXNlIGIKLWV4Y2VwdCBBQ2xhc3MsIHY6Ci0gICAgaWYgdiAhPSBiOiByYWlzZSBUZXN0RmFpbGVkLCAidiE9YiBBQ2xhc3MiCi0KLSMgbm90IGVub3VnaCBhcmd1bWVudHMKLSMjdHJ5OiAgcmFpc2UgQkNsYXNzLCBhCi0jI2V4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKLQotdHJ5OiAgcmFpc2UgRENsYXNzLCBhCi1leGNlcHQgRENsYXNzLCB2OgotICAgIGlmIG5vdCBpc2luc3RhbmNlKHYsIERDbGFzcyk6Ci0gICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsICJ2IG5vdCBEQ2xhc3MiCi0KLXByaW50ICcyLjMgY29tcGFyaW5nIGZ1bmN0aW9uIG9iamVjdHMnCi0KLWYgPSBldmFsKCdsYW1iZGE6IE5vbmUnKQotZyA9IGV2YWwoJ2xhbWJkYTogTm9uZScpCi1pZiBmID09IGc6IHJhaXNlIFRlc3RGYWlsZWQsICJmdW5jdGlvbnMgc2hvdWxkIG5vdCBiZSBzYW1lIgotCi1mID0gZXZhbCgnbGFtYmRhIGE6IGEnKQotZyA9IGV2YWwoJ2xhbWJkYSBhOiBhJykKLWlmIGYgPT0gZzogcmFpc2UgVGVzdEZhaWxlZCwgImZ1bmN0aW9ucyBzaG91bGQgbm90IGJlIHNhbWUiCi0KLWYgPSBldmFsKCdsYW1iZGEgYT0xOiBhJykKLWcgPSBldmFsKCdsYW1iZGEgYT0xOiBhJykKLWlmIGYgPT0gZzogcmFpc2UgVGVzdEZhaWxlZCwgImZ1bmN0aW9ucyBzaG91bGQgbm90IGJlIHNhbWUiCi0KLWYgPSBldmFsKCdsYW1iZGE6IDAnKQotZyA9IGV2YWwoJ2xhbWJkYTogMScpCi1pZiBmID09IGc6IHJhaXNlIFRlc3RGYWlsZWQKLQotZiA9IGV2YWwoJ2xhbWJkYTogTm9uZScpCi1nID0gZXZhbCgnbGFtYmRhIGE6IE5vbmUnKQotaWYgZiA9PSBnOiByYWlzZSBUZXN0RmFpbGVkCi0KLWYgPSBldmFsKCdsYW1iZGEgYTogTm9uZScpCi1nID0gZXZhbCgnbGFtYmRhIGI6IE5vbmUnKQotaWYgZiA9PSBnOiByYWlzZSBUZXN0RmFpbGVkCi0KLWYgPSBldmFsKCdsYW1iZGEgYTogTm9uZScpCi1nID0gZXZhbCgnbGFtYmRhIGE9Tm9uZTogTm9uZScpCi1pZiBmID09IGc6IHJhaXNlIFRlc3RGYWlsZWQKLQotZiA9IGV2YWwoJ2xhbWJkYSBhPTA6IE5vbmUnKQotZyA9IGV2YWwoJ2xhbWJkYSBhPTE6IE5vbmUnKQotaWYgZiA9PSBnOiByYWlzZSBUZXN0RmFpbGVkCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X29wZW5wdHkucHkgYi9MaWIvdGVzdC90ZXN0X29wZW5wdHkucHkKaW5kZXggYThiODU1MC4uNjQ3MWY1OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcGVucHR5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfb3BlbnB0eS5weQpAQCAtMSwxOSArMSwyMyBAQAogIyBUZXN0IHRvIHNlZSBpZiBvcGVucHR5IHdvcmtzLiAoQnV0IGRvbid0IHdvcnJ5IGlmIGl0IGlzbid0IGF2YWlsYWJsZS4pCiAKLWltcG9ydCBvcwotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgVGVzdEZhaWxlZCwgVGVzdFNraXBwZWQKK2ltcG9ydCBvcywgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgVGVzdFNraXBwZWQKIAotdHJ5OgotICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgIHByaW50ICJDYWxsaW5nIG9zLm9wZW5wdHkoKSIKLSAgICBtYXN0ZXIsIHNsYXZlID0gb3Mub3BlbnB0eSgpCi0gICAgaWYgdmVyYm9zZToKLSAgICAgICAgcHJpbnQgIihtYXN0ZXIsIHNsYXZlKSA9ICglZCwgJWQpIiUobWFzdGVyLCBzbGF2ZSkKLWV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKK2lmIG5vdCBoYXNhdHRyKG9zLCAib3BlbnB0eSIpOgogICAgIHJhaXNlIFRlc3RTa2lwcGVkLCAiTm8gb3BlbnB0eSgpIGF2YWlsYWJsZS4iCiAKLWlmIG5vdCBvcy5pc2F0dHkoc2xhdmUpOgotICAgIHJhaXNlIFRlc3RGYWlsZWQsICJTbGF2ZS1lbmQgb2YgcHR5IGlzIG5vdCBhIHRlcm1pbmFsLiIKIAotb3Mud3JpdGUoc2xhdmUsICdQaW5nIScpCi1wcmludCBvcy5yZWFkKG1hc3RlciwgMTAyNCkKK2NsYXNzIE9wZW5wdHlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgbWFzdGVyLCBzbGF2ZSA9IG9zLm9wZW5wdHkoKQorICAgICAgICBpZiBub3Qgb3MuaXNhdHR5KHNsYXZlKToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2xhdmUtZW5kIG9mIHB0eSBpcyBub3QgYSB0ZXJtaW5hbC4iKQorCisgICAgICAgIG9zLndyaXRlKHNsYXZlLCAnUGluZyEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnJlYWQobWFzdGVyLCAxMDI0KSwgJ1BpbmchJykKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChPcGVucHR5VGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcy5weSBiL0xpYi90ZXN0L3Rlc3Rfb3MucHkKaW5kZXggYmYwZTE5Ni4uMWM4N2QwNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X29zLnB5CkBAIC0yMjMsNiArMjIzLDIzIEBACiAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAKKyAgICBkZWYgdGVzdF91dGltZV9kaXIoc2VsZik6CisgICAgICAgIGRlbHRhID0gMTAwMDAwMAorICAgICAgICBzdCA9IG9zLnN0YXQodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgIyByb3VuZCB0byBpbnQsIGJlY2F1c2Ugc29tZSBzeXN0ZW1zIG1heSBzdXBwb3J0IHN1Yi1zZWNvbmQKKyAgICAgICAgIyB0aW1lIHN0YW1wcyBpbiBzdGF0LCBidXQgbm90IGluIHV0aW1lLgorICAgICAgICBvcy51dGltZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAoc3Quc3RfYXRpbWUsIGludChzdC5zdF9tdGltZS1kZWx0YSkpKQorICAgICAgICBzdDIgPSBvcy5zdGF0KHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHN0Mi5zdF9tdGltZSwgaW50KHN0LnN0X210aW1lLWRlbHRhKSkKKworICAgICMgUmVzdHJpY3QgdGVzdCB0byBXaW4zMiwgc2luY2UgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIG90aGVyCisgICAgIyBzeXN0ZW1zIHN1cHBvcnQgY2VudGlzZWNvbmRzCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgIGRlZiB0ZXN0XzE1NjUxNTAoc2VsZik6CisgICAgICAgICAgICB0MSA9IDExNTkxOTUwMzkuMjUKKyAgICAgICAgICAgIG9zLnV0aW1lKHNlbGYuZm5hbWUsICh0MSwgdDEpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob3Muc3RhdChzZWxmLmZuYW1lKS5zdF9tdGltZSwgdDEpCisKIGZyb20gdGVzdCBpbXBvcnQgbWFwcGluZ190ZXN0cwogCiBjbGFzcyBFbnZpcm9uVGVzdHMobWFwcGluZ190ZXN0cy5CYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wYXJzZXIucHkgYi9MaWIvdGVzdC90ZXN0X3BhcnNlci5weQppbmRleCA5NjM4NGNkLi4wYmYxMjE4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BhcnNlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BhcnNlci5weQpAQCAtMTgzLDYgKzE4Myw0NCBAQAogICAgIGRlZiB0ZXN0X2Fzc2VydChzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiYXNzZXJ0IGFsbyA8IGFoaSBhbmQgYmxvIDwgYmhpXG4iKQogCisgICAgZGVmIHRlc3RfcG9zaXRpb24oc2VsZik6CisgICAgICAgICMgQW4gYWJzb2x1dGVseSBtaW5pbWFsIHRlc3Qgb2YgcG9zaXRpb24gaW5mb3JtYXRpb24uICBCZXR0ZXIKKyAgICAgICAgIyB0ZXN0cyB3b3VsZCBiZSBhIGJpZyBwcm9qZWN0LgorICAgICAgICBjb2RlID0gImRlZiBmKHgpOlxuICAgIHJldHVybiB4ICsgMVxuIgorICAgICAgICBzdDEgPSBwYXJzZXIuc3VpdGUoY29kZSkKKyAgICAgICAgc3QyID0gc3QxLnRvdHVwbGUobGluZV9pbmZvPTEsIGNvbF9pbmZvPTEpCisKKyAgICAgICAgZGVmIHdhbGsodHJlZSk6CisgICAgICAgICAgICBub2RlX3R5cGUgPSB0cmVlWzBdCisgICAgICAgICAgICBuZXh0ID0gdHJlZVsxXQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuZXh0LCB0dXBsZSk6CisgICAgICAgICAgICAgICAgZm9yIGVsdCBpbiB0cmVlWzE6XToKKyAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gd2FsayhlbHQpOgorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgeAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB5aWVsZCB0cmVlCisKKyAgICAgICAgdGVybWluYWxzID0gbGlzdCh3YWxrKHN0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWworICAgICAgICAgICAgKDEsICdkZWYnLCAxLCAwKSwKKyAgICAgICAgICAgICgxLCAnZicsIDEsIDQpLAorICAgICAgICAgICAgKDcsICcoJywgMSwgNSksCisgICAgICAgICAgICAoMSwgJ3gnLCAxLCA2KSwKKyAgICAgICAgICAgICg4LCAnKScsIDEsIDcpLAorICAgICAgICAgICAgKDExLCAnOicsIDEsIDgpLAorICAgICAgICAgICAgKDQsICcnLCAxLCA5KSwKKyAgICAgICAgICAgICg1LCAnJywgMiwgLTEpLAorICAgICAgICAgICAgKDEsICdyZXR1cm4nLCAyLCA0KSwKKyAgICAgICAgICAgICgxLCAneCcsIDIsIDExKSwKKyAgICAgICAgICAgICgxNCwgJysnLCAyLCAxMyksCisgICAgICAgICAgICAoMiwgJzEnLCAyLCAxNSksCisgICAgICAgICAgICAoNCwgJycsIDIsIDE2KSwKKyAgICAgICAgICAgICg2LCAnJywgMiwgLTEpLAorICAgICAgICAgICAgKDQsICcnLCAyLCAtMSksCisgICAgICAgICAgICAoMCwgJycsIDIsIC0xKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxzKQorCisKICMKICMgIFNlY29uZCwgd2UgdGFrZSAqaW52YWxpZCogdHJlZXMgYW5kIG1ha2Ugc3VyZSB3ZSBnZXQgUGFyc2VyRXJyb3IKICMgIHJlamVjdGlvbnMgZm9yIHRoZW0uCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BlZXBob2xlci5weSBiL0xpYi90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5CmluZGV4IGJlN2Q0ZTguLjc3OWEyMGEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5CkBAIC0xNjAsNiArMTYwLDQxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0XygnKE5vbmUpJyBub3QgaW4gYXNtKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzbS5zcGxpdCgpLmNvdW50KCdSRVRVUk5fVkFMVUUnKSwgMSkKIAorICAgIGRlZiB0ZXN0X2VsaW1fanVtcF90b19yZXR1cm4oc2VsZik6CisgICAgICAgICMgSlVNUF9GT1JXQVJEIHRvIFJFVFVSTiAtLT4gIFJFVFVSTgorICAgICAgICBkZWYgZihjb25kLCB0cnVlX3ZhbHVlLCBmYWxzZV92YWx1ZSk6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZV92YWx1ZSBpZiBjb25kIGVsc2UgZmFsc2VfdmFsdWUKKyAgICAgICAgYXNtID0gZGlzYXNzZW1ibGUoZikKKyAgICAgICAgc2VsZi5hc3NlcnRfKCdKVU1QX0ZPUldBUkQnIG5vdCBpbiBhc20pCisgICAgICAgIHNlbGYuYXNzZXJ0XygnSlVNUF9BQlNPTFVURScgbm90IGluIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc20uc3BsaXQoKS5jb3VudCgnUkVUVVJOX1ZBTFVFJyksIDIpCisKKyAgICBkZWYgdGVzdF9lbGltX2p1bXBfYWZ0ZXJfcmV0dXJuMShzZWxmKToKKyAgICAgICAgIyBFbGltaW5hdGUgZGVhZCBjb2RlOiBqdW1wcyBpbW1lZGlhdGVseSBhZnRlciByZXR1cm5zIGNhbid0IGJlIHJlYWNoZWQKKyAgICAgICAgZGVmIGYoY29uZDEsIGNvbmQyKToKKyAgICAgICAgICAgIGlmIGNvbmQxOiByZXR1cm4gMQorICAgICAgICAgICAgaWYgY29uZDI6IHJldHVybiAyCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIHJldHVybiAzCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGlmIGNvbmQxOiByZXR1cm4gNAorICAgICAgICAgICAgICAgIHJldHVybiA1CisgICAgICAgICAgICByZXR1cm4gNgorICAgICAgICBhc20gPSBkaXNhc3NlbWJsZShmKQorICAgICAgICBzZWxmLmFzc2VydF8oJ0pVTVBfRk9SV0FSRCcgbm90IGluIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCdKVU1QX0FCU09MVVRFJyBub3QgaW4gYXNtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzbS5zcGxpdCgpLmNvdW50KCdSRVRVUk5fVkFMVUUnKSwgNikKKworICAgIGRlZiB0ZXN0X2VsaW1fanVtcF9hZnRlcl9yZXR1cm4yKHNlbGYpOgorICAgICAgICAjIEVsaW1pbmF0ZSBkZWFkIGNvZGU6IGp1bXBzIGltbWVkaWF0ZWx5IGFmdGVyIHJldHVybnMgY2FuJ3QgYmUgcmVhY2hlZAorICAgICAgICBkZWYgZihjb25kMSwgY29uZDIpOgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBpZiBjb25kMTogcmV0dXJuIDQKKyAgICAgICAgYXNtID0gZGlzYXNzZW1ibGUoZikKKyAgICAgICAgc2VsZi5hc3NlcnRfKCdKVU1QX0ZPUldBUkQnIG5vdCBpbiBhc20pCisgICAgICAgICMgVGhlcmUgc2hvdWxkIGJlIG9uZSBqdW1wIGZvciB0aGUgd2hpbGUgbG9vcC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc20uc3BsaXQoKS5jb3VudCgnSlVNUF9BQlNPTFVURScpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzbS5zcGxpdCgpLmNvdW50KCdSRVRVUk5fVkFMVUUnKSwgMikKIAogCiBkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weSBiL0xpYi90ZXN0L3Rlc3RfcGVwMzUyLnB5CmluZGV4IDczY2ZmZDIuLjc1NjEwYjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGVwMzUyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGVwMzUyLnB5CkBAIC0xNSw4ICsxNSw3IEBACiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKEV4Y2VwdGlvbiwgb2JqZWN0KSkKIAogICAgIGRlZiB2ZXJpZnlfaW5zdGFuY2VfaW50ZXJmYWNlKHNlbGYsIGlucyk6Ci0gICAgICAgIGZvciBhdHRyIGluICgiYXJncyIsICJtZXNzYWdlIiwgIl9fc3RyX18iLCAiX191bmljb2RlX18iLCAiX19yZXByX18iLAotICAgICAgICAgICAgICAgICJfX2dldGl0ZW1fXyIpOgorICAgICAgICBmb3IgYXR0ciBpbiAoImFyZ3MiLCAibWVzc2FnZSIsICJfX3N0cl9fIiwgIl9fcmVwcl9fIiwgIl9fZ2V0aXRlbV9fIik6CiAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaGFzYXR0cihpbnMsIGF0dHIpLCAiJXMgbWlzc2luZyAlcyBhdHRyaWJ1dGUiICUKICAgICAgICAgICAgICAgICAgICAgKGlucy5fX2NsYXNzX18uX19uYW1lX18sIGF0dHIpKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BvbGwucHkgYi9MaWIvdGVzdC90ZXN0X3BvbGwucHkKaW5kZXggM2E0OGJjZS4uNjBjZDNmNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wb2xsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcG9sbC5weQpAQCAtMSw3ICsxLDcgQEAKICMgVGVzdCBjYXNlIGZvciB0aGUgb3MucG9sbCgpIGZ1bmN0aW9uCiAKLWltcG9ydCBzeXMsIG9zLCBzZWxlY3QsIHJhbmRvbQotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyaWZ5LCB2ZXJib3NlLCBUZXN0U2tpcHBlZCwgVEVTVEZOCitpbXBvcnQgc3lzLCBvcywgc2VsZWN0LCByYW5kb20sIHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0U2tpcHBlZCwgVEVTVEZOLCBydW5fdW5pdHRlc3QKIAogdHJ5OgogICAgIHNlbGVjdC5wb2xsCkBAIC0xNiwxNzcgKzE2LDE0MSBAQAogICAgICAgICAgICAgbWF0Y2guYXBwZW5kKGZkKQogICAgIHJldHVybiBtYXRjaAogCi1kZWYgdGVzdF9wb2xsMSgpOgotICAgICIiIkJhc2ljIGZ1bmN0aW9uYWwgdGVzdCBvZiBwb2xsIG9iamVjdAorY2xhc3MgUG9sbFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotICAgIENyZWF0ZSBhIGJ1bmNoIG9mIHBpcGUgYW5kIHRlc3QgdGhhdCBwb2xsIHdvcmtzIHdpdGggdGhlbS4KLSAgICAiIiIKLSAgICBwcmludCAnUnVubmluZyBwb2xsIHRlc3QgMScKLSAgICBwID0gc2VsZWN0LnBvbGwoKQorICAgIGRlZiB0ZXN0X3BvbGwxKHNlbGYpOgorICAgICAgICAjIEJhc2ljIGZ1bmN0aW9uYWwgdGVzdCBvZiBwb2xsIG9iamVjdAorICAgICAgICAjIENyZWF0ZSBhIGJ1bmNoIG9mIHBpcGUgYW5kIHRlc3QgdGhhdCBwb2xsIHdvcmtzIHdpdGggdGhlbS4KIAotICAgIE5VTV9QSVBFUyA9IDEyCi0gICAgTVNHID0gIiBUaGlzIGlzIGEgdGVzdC4iCi0gICAgTVNHX0xFTiA9IGxlbihNU0cpCi0gICAgcmVhZGVycyA9IFtdCi0gICAgd3JpdGVycyA9IFtdCi0gICAgcjJ3ID0ge30KLSAgICB3MnIgPSB7fQorICAgICAgICBwID0gc2VsZWN0LnBvbGwoKQogCi0gICAgZm9yIGkgaW4gcmFuZ2UoTlVNX1BJUEVTKToKLSAgICAgICAgcmQsIHdyID0gb3MucGlwZSgpCi0gICAgICAgIHAucmVnaXN0ZXIocmQsIHNlbGVjdC5QT0xMSU4pCi0gICAgICAgIHAucmVnaXN0ZXIod3IsIHNlbGVjdC5QT0xMT1VUKQotICAgICAgICByZWFkZXJzLmFwcGVuZChyZCkKLSAgICAgICAgd3JpdGVycy5hcHBlbmQod3IpCi0gICAgICAgIHIyd1tyZF0gPSB3cgotICAgICAgICB3MnJbd3JdID0gcmQKKyAgICAgICAgTlVNX1BJUEVTID0gMTIKKyAgICAgICAgTVNHID0gIiBUaGlzIGlzIGEgdGVzdC4iCisgICAgICAgIE1TR19MRU4gPSBsZW4oTVNHKQorICAgICAgICByZWFkZXJzID0gW10KKyAgICAgICAgd3JpdGVycyA9IFtdCisgICAgICAgIHIydyA9IHt9CisgICAgICAgIHcyciA9IHt9CiAKLSAgICB3aGlsZSB3cml0ZXJzOgotICAgICAgICByZWFkeSA9IHAucG9sbCgpCi0gICAgICAgIHJlYWR5X3dyaXRlcnMgPSBmaW5kX3JlYWR5X21hdGNoaW5nKHJlYWR5LCBzZWxlY3QuUE9MTE9VVCkKLSAgICAgICAgaWYgbm90IHJlYWR5X3dyaXRlcnM6Ci0gICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJubyBwaXBlcyByZWFkeSBmb3Igd3JpdGluZyIKLSAgICAgICAgd3IgPSByYW5kb20uY2hvaWNlKHJlYWR5X3dyaXRlcnMpCi0gICAgICAgIG9zLndyaXRlKHdyLCBNU0cpCisgICAgICAgIGZvciBpIGluIHJhbmdlKE5VTV9QSVBFUyk6CisgICAgICAgICAgICByZCwgd3IgPSBvcy5waXBlKCkKKyAgICAgICAgICAgIHAucmVnaXN0ZXIocmQsIHNlbGVjdC5QT0xMSU4pCisgICAgICAgICAgICBwLnJlZ2lzdGVyKHdyLCBzZWxlY3QuUE9MTE9VVCkKKyAgICAgICAgICAgIHJlYWRlcnMuYXBwZW5kKHJkKQorICAgICAgICAgICAgd3JpdGVycy5hcHBlbmQod3IpCisgICAgICAgICAgICByMndbcmRdID0gd3IKKyAgICAgICAgICAgIHcyclt3cl0gPSByZAogCi0gICAgICAgIHJlYWR5ID0gcC5wb2xsKCkKLSAgICAgICAgcmVhZHlfcmVhZGVycyA9IGZpbmRfcmVhZHlfbWF0Y2hpbmcocmVhZHksIHNlbGVjdC5QT0xMSU4pCi0gICAgICAgIGlmIG5vdCByZWFkeV9yZWFkZXJzOgotICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAibm8gcGlwZXMgcmVhZHkgZm9yIHJlYWRpbmciCi0gICAgICAgIHJkID0gcmFuZG9tLmNob2ljZShyZWFkeV9yZWFkZXJzKQotICAgICAgICBidWYgPSBvcy5yZWFkKHJkLCBNU0dfTEVOKQotICAgICAgICB2ZXJpZnkobGVuKGJ1ZikgPT0gTVNHX0xFTikKLSAgICAgICAgcHJpbnQgYnVmCi0gICAgICAgIG9zLmNsb3NlKHIyd1tyZF0pIDsgb3MuY2xvc2UoIHJkICkKLSAgICAgICAgcC51bnJlZ2lzdGVyKCByMndbcmRdICkKLSAgICAgICAgcC51bnJlZ2lzdGVyKCByZCApCi0gICAgICAgIHdyaXRlcnMucmVtb3ZlKHIyd1tyZF0pCisgICAgICAgIGJ1ZnMgPSBbXQogCi0gICAgcG9sbF91bml0X3Rlc3RzKCkKLSAgICBwcmludCAnUG9sbCB0ZXN0IDEgY29tcGxldGUnCisgICAgICAgIHdoaWxlIHdyaXRlcnM6CisgICAgICAgICAgICByZWFkeSA9IHAucG9sbCgpCisgICAgICAgICAgICByZWFkeV93cml0ZXJzID0gZmluZF9yZWFkeV9tYXRjaGluZyhyZWFkeSwgc2VsZWN0LlBPTExPVVQpCisgICAgICAgICAgICBpZiBub3QgcmVhZHlfd3JpdGVyczoKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJubyBwaXBlcyByZWFkeSBmb3Igd3JpdGluZyIKKyAgICAgICAgICAgIHdyID0gcmFuZG9tLmNob2ljZShyZWFkeV93cml0ZXJzKQorICAgICAgICAgICAgb3Mud3JpdGUod3IsIE1TRykKIAotZGVmIHBvbGxfdW5pdF90ZXN0cygpOgotICAgICMgcmV0dXJucyBOVkFMIGZvciBpbnZhbGlkIGZpbGUgZGVzY3JpcHRvcgotICAgIEZEID0gNDIKLSAgICB0cnk6Ci0gICAgICAgIG9zLmNsb3NlKEZEKQotICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICBwYXNzCi0gICAgcCA9IHNlbGVjdC5wb2xsKCkKLSAgICBwLnJlZ2lzdGVyKEZEKQotICAgIHIgPSBwLnBvbGwoKQotICAgIHZlcmlmeShyWzBdID09IChGRCwgc2VsZWN0LlBPTExOVkFMKSkKKyAgICAgICAgICAgIHJlYWR5ID0gcC5wb2xsKCkKKyAgICAgICAgICAgIHJlYWR5X3JlYWRlcnMgPSBmaW5kX3JlYWR5X21hdGNoaW5nKHJlYWR5LCBzZWxlY3QuUE9MTElOKQorICAgICAgICAgICAgaWYgbm90IHJlYWR5X3JlYWRlcnM6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAibm8gcGlwZXMgcmVhZHkgZm9yIHJlYWRpbmciCisgICAgICAgICAgICByZCA9IHJhbmRvbS5jaG9pY2UocmVhZHlfcmVhZGVycykKKyAgICAgICAgICAgIGJ1ZiA9IG9zLnJlYWQocmQsIE1TR19MRU4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihidWYpLCBNU0dfTEVOKQorICAgICAgICAgICAgYnVmcy5hcHBlbmQoYnVmKQorICAgICAgICAgICAgb3MuY2xvc2UocjJ3W3JkXSkgOyBvcy5jbG9zZSggcmQgKQorICAgICAgICAgICAgcC51bnJlZ2lzdGVyKCByMndbcmRdICkKKyAgICAgICAgICAgIHAudW5yZWdpc3RlciggcmQgKQorICAgICAgICAgICAgd3JpdGVycy5yZW1vdmUocjJ3W3JkXSkKIAotICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3cnKQotICAgIGZkID0gZi5maWxlbm8oKQotICAgIHAgPSBzZWxlY3QucG9sbCgpCi0gICAgcC5yZWdpc3RlcihmKQotICAgIHIgPSBwLnBvbGwoKQotICAgIHZlcmlmeShyWzBdWzBdID09IGZkKQotICAgIGYuY2xvc2UoKQotICAgIHIgPSBwLnBvbGwoKQotICAgIHZlcmlmeShyWzBdID09IChmZCwgc2VsZWN0LlBPTExOVkFMKSkKLSAgICBvcy51bmxpbmsoVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZnMsIFtNU0ddICogTlVNX1BJUEVTKQogCi0gICAgIyB0eXBlIGVycm9yIGZvciBpbnZhbGlkIGFyZ3VtZW50cwotICAgIHAgPSBzZWxlY3QucG9sbCgpCi0gICAgdHJ5OgotICAgICAgICBwLnJlZ2lzdGVyKHApCi0gICAgZXhjZXB0IFR5cGVFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIHByaW50ICJCb2d1cyByZWdpc3RlciBjYWxsIGRpZCBub3QgcmFpc2UgVHlwZUVycm9yIgotICAgIHRyeToKLSAgICAgICAgcC51bnJlZ2lzdGVyKHApCi0gICAgZXhjZXB0IFR5cGVFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIHByaW50ICJCb2d1cyB1bnJlZ2lzdGVyIGNhbGwgZGlkIG5vdCByYWlzZSBUeXBlRXJyb3IiCisgICAgZGVmIHBvbGxfdW5pdF90ZXN0cyhzZWxmKToKKyAgICAgICAgIyByZXR1cm5zIE5WQUwgZm9yIGludmFsaWQgZmlsZSBkZXNjcmlwdG9yCisgICAgICAgIEZEID0gNDIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MuY2xvc2UoRkQpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBwID0gc2VsZWN0LnBvbGwoKQorICAgICAgICBwLnJlZ2lzdGVyKEZEKQorICAgICAgICByID0gcC5wb2xsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyWzBdLCAoRkQsIHNlbGVjdC5QT0xMTlZBTCkpCiAKLSAgICAjIGNhbid0IHVucmVnaXN0ZXIgbm9uLWV4aXN0ZW50IG9iamVjdAotICAgIHAgPSBzZWxlY3QucG9sbCgpCi0gICAgdHJ5OgotICAgICAgICBwLnVucmVnaXN0ZXIoMykKLSAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICBwcmludCAiQm9ndXMgdW5yZWdpc3RlciBjYWxsIGRpZCBub3QgcmFpc2UgS2V5RXJyb3IiCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3cnKQorICAgICAgICBmZCA9IGYuZmlsZW5vKCkKKyAgICAgICAgcCA9IHNlbGVjdC5wb2xsKCkKKyAgICAgICAgcC5yZWdpc3RlcihmKQorICAgICAgICByID0gcC5wb2xsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyWzBdWzBdLCBmZCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHIgPSBwLnBvbGwoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJbMF0sIChmZCwgc2VsZWN0LlBPTExOVkFMKSkKKyAgICAgICAgb3MudW5saW5rKFRFU1RGTikKIAotICAgICMgVGVzdCBlcnJvciBjYXNlcwotICAgIHBvbGxzdGVyID0gc2VsZWN0LnBvbGwoKQotICAgIGNsYXNzIE5vcGU6Ci0gICAgICAgIHBhc3MKKyAgICAgICAgIyB0eXBlIGVycm9yIGZvciBpbnZhbGlkIGFyZ3VtZW50cworICAgICAgICBwID0gc2VsZWN0LnBvbGwoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHAucmVnaXN0ZXIsIHApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcC51bnJlZ2lzdGVyLCBwKQogCi0gICAgY2xhc3MgQWxtb3N0OgotICAgICAgICBkZWYgZmlsZW5vKHNlbGYpOgotICAgICAgICAgICAgcmV0dXJuICdmaWxlbm8nCisgICAgICAgICMgY2FuJ3QgdW5yZWdpc3RlciBub24tZXhpc3RlbnQgb2JqZWN0CisgICAgICAgIHAgPSBzZWxlY3QucG9sbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBwLnVucmVnaXN0ZXIsIDMpCiAKLSAgICB0cnk6Ci0gICAgICAgIHBvbGxzdGVyLnJlZ2lzdGVyKCBOb3BlKCksIDAgKQotICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKLSAgICBlbHNlOiBwcmludCAnZXhwZWN0ZWQgVHlwZUVycm9yIGV4Y2VwdGlvbiwgbm90IHJhaXNlZCcKKyAgICAgICAgIyBUZXN0IGVycm9yIGNhc2VzCisgICAgICAgIHBvbGxzdGVyID0gc2VsZWN0LnBvbGwoKQorICAgICAgICBjbGFzcyBOb3BlOgorICAgICAgICAgICAgcGFzcwogCi0gICAgdHJ5OgotICAgICAgICBwb2xsc3Rlci5yZWdpc3RlciggQWxtb3N0KCksIDAgKQotICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKLSAgICBlbHNlOiBwcmludCAnZXhwZWN0ZWQgVHlwZUVycm9yIGV4Y2VwdGlvbiwgbm90IHJhaXNlZCcKKyAgICAgICAgY2xhc3MgQWxtb3N0OgorICAgICAgICAgICAgZGVmIGZpbGVubyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2ZpbGVubycKIAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvbGxzdGVyLnJlZ2lzdGVyLCBOb3BlKCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcG9sbHN0ZXIucmVnaXN0ZXIsIEFsbW9zdCgpLCAwKQogCi0jIEFub3RoZXIgdGVzdCBjYXNlIGZvciBwb2xsKCkuICBUaGlzIGlzIGNvcGllZCBmcm9tIHRoZSB0ZXN0IGNhc2UgZm9yCi0jIHNlbGVjdCgpLCBtb2RpZmllZCB0byB1c2UgcG9sbCgpIGluc3RlYWQuCisgICAgIyBBbm90aGVyIHRlc3QgY2FzZSBmb3IgcG9sbCgpLiAgVGhpcyBpcyBjb3BpZWQgZnJvbSB0aGUgdGVzdCBjYXNlIGZvcgorICAgICMgc2VsZWN0KCksIG1vZGlmaWVkIHRvIHVzZSBwb2xsKCkgaW5zdGVhZC4KIAotZGVmIHRlc3RfcG9sbDIoKToKLSAgICBwcmludCAnUnVubmluZyBwb2xsIHRlc3QgMicKLSAgICBjbWQgPSAnZm9yIGkgaW4gMCAxIDIgMyA0IDUgNiA3IDggOTsgZG8gZWNobyB0ZXN0aW5nLi4uOyBzbGVlcCAxOyBkb25lJwotICAgIHAgPSBvcy5wb3BlbihjbWQsICdyJykKLSAgICBwb2xsc3RlciA9IHNlbGVjdC5wb2xsKCkKLSAgICBwb2xsc3Rlci5yZWdpc3RlciggcCwgc2VsZWN0LlBPTExJTiApCi0gICAgZm9yIHRvdXQgaW4gKDAsIDEwMDAsIDIwMDAsIDQwMDAsIDgwMDAsIDE2MDAwKSArICgtMSwpKjEwOgotICAgICAgICBpZiB2ZXJib3NlOgotICAgICAgICAgICAgcHJpbnQgJ3RpbWVvdXQgPScsIHRvdXQKLSAgICAgICAgZmRsaXN0ID0gcG9sbHN0ZXIucG9sbCh0b3V0KQotICAgICAgICBpZiAoZmRsaXN0ID09IFtdKToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGZkLCBmbGFncyA9IGZkbGlzdFswXQotICAgICAgICBpZiBmbGFncyAmIHNlbGVjdC5QT0xMSFVQOgotICAgICAgICAgICAgbGluZSA9IHAucmVhZGxpbmUoKQotICAgICAgICAgICAgaWYgbGluZSAhPSAiIjoKLSAgICAgICAgICAgICAgICBwcmludCAnZXJyb3I6IHBpcGUgc2VlbXMgdG8gYmUgY2xvc2VkLCBidXQgc3RpbGwgcmV0dXJucyBkYXRhJwotICAgICAgICAgICAgY29udGludWUKKyAgICBkZWYgdGVzdF9wb2xsMihzZWxmKToKKyAgICAgICAgY21kID0gJ2ZvciBpIGluIDAgMSAyIDMgNCA1IDYgNyA4IDk7IGRvIGVjaG8gdGVzdGluZy4uLjsgc2xlZXAgMTsgZG9uZScKKyAgICAgICAgcCA9IG9zLnBvcGVuKGNtZCwgJ3InKQorICAgICAgICBwb2xsc3RlciA9IHNlbGVjdC5wb2xsKCkKKyAgICAgICAgcG9sbHN0ZXIucmVnaXN0ZXIoIHAsIHNlbGVjdC5QT0xMSU4gKQorICAgICAgICBmb3IgdG91dCBpbiAoMCwgMTAwMCwgMjAwMCwgNDAwMCwgODAwMCwgMTYwMDApICsgKC0xLCkqMTA6CisgICAgICAgICAgICBmZGxpc3QgPSBwb2xsc3Rlci5wb2xsKHRvdXQpCisgICAgICAgICAgICBpZiAoZmRsaXN0ID09IFtdKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZmQsIGZsYWdzID0gZmRsaXN0WzBdCisgICAgICAgICAgICBpZiBmbGFncyAmIHNlbGVjdC5QT0xMSFVQOgorICAgICAgICAgICAgICAgIGxpbmUgPSBwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBsaW5lICE9ICIiOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ2Vycm9yOiBwaXBlIHNlZW1zIHRvIGJlIGNsb3NlZCwgYnV0IHN0aWxsIHJldHVybnMgZGF0YScpCisgICAgICAgICAgICAgICAgY29udGludWUKIAotICAgICAgICBlbGlmIGZsYWdzICYgc2VsZWN0LlBPTExJTjoKLSAgICAgICAgICAgIGxpbmUgPSBwLnJlYWRsaW5lKCkKLSAgICAgICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQgcmVwcihsaW5lKQotICAgICAgICAgICAgaWYgbm90IGxpbmU6Ci0gICAgICAgICAgICAgICAgaWYgdmVyYm9zZToKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ0VPRicKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50ICdVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBmcm9tIHNlbGVjdC5wb2xsOicsIGZkbGlzdAotICAgIHAuY2xvc2UoKQotICAgIHByaW50ICdQb2xsIHRlc3QgMiBjb21wbGV0ZScKKyAgICAgICAgICAgIGVsaWYgZmxhZ3MgJiBzZWxlY3QuUE9MTElOOgorICAgICAgICAgICAgICAgIGxpbmUgPSBwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ1VuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIGZyb20gc2VsZWN0LnBvbGw6ICVzJyAlIGZkbGlzdCkKKyAgICAgICAgcC5jbG9zZSgpCiAKLWRlZiB0ZXN0X3BvbGwzKCk6Ci0gICAgIyB0ZXN0IGludCBvdmVyZmxvdwotICAgIHByaW50ICdSdW5uaW5nIHBvbGwgdGVzdCAzJwotICAgIHBvbGxzdGVyID0gc2VsZWN0LnBvbGwoKQotICAgIHBvbGxzdGVyLnJlZ2lzdGVyKDEpCisgICAgZGVmIHRlc3RfcG9sbDMoc2VsZik6CisgICAgICAgICMgdGVzdCBpbnQgb3ZlcmZsb3cKKyAgICAgICAgcG9sbHN0ZXIgPSBzZWxlY3QucG9sbCgpCisgICAgICAgIHBvbGxzdGVyLnJlZ2lzdGVyKDEpCiAKLSAgICB0cnk6Ci0gICAgICAgIHBvbGxzdGVyLnBvbGwoMUwgPDwgNjQpCi0gICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICBwcmludCAnRXhwZWN0ZWQgT3ZlcmZsb3dFcnJvciB3aXRoIGV4Y2Vzc2l2ZSB0aW1lb3V0JworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBwb2xsc3Rlci5wb2xsLCAxTCA8PCA2NCkKIAotICAgIHggPSAyICsgMwotICAgIGlmIHggIT0gNToKLSAgICAgICAgcHJpbnQgJ092ZXJmbG93IG11c3QgaGF2ZSBvY2N1cnJlZCcKLSAgICBwcmludCAnUG9sbCB0ZXN0IDMgY29tcGxldGUnCisgICAgICAgIHggPSAyICsgMworICAgICAgICBpZiB4ICE9IDU6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ092ZXJmbG93IG11c3QgaGF2ZSBvY2N1cnJlZCcpCiAKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoUG9sbFRlc3RzKQogCi10ZXN0X3BvbGwxKCkKLXRlc3RfcG9sbDIoKQotdGVzdF9wb2xsMygpCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3B5Y2xici5weSBiL0xpYi90ZXN0L3Rlc3RfcHljbGJyLnB5CmluZGV4IDAxNzAzYjUuLjdjOWQ0YWEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcHljbGJyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcHljbGJyLnB5CkBAIC05NSw2ICs5NSw5IEBACiAgICAgICAgICAgICBweV9pdGVtID0gZ2V0YXR0cihtb2R1bGUsIG5hbWUpCiAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBweWNsYnIuRnVuY3Rpb24pOgogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHB5X2l0ZW0sIChGdW5jdGlvblR5cGUsIEJ1aWx0aW5GdW5jdGlvblR5cGUpKSkKKyAgICAgICAgICAgICAgICBpZiBweV9pdGVtLl9fbW9kdWxlX18gIT0gbW9kdWxlTmFtZToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgICAjIHNraXAgZnVuY3Rpb25zIHRoYXQgY2FtZSBmcm9tIHNvbWV3aGVyZSBlbHNlCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocHlfaXRlbS5fX21vZHVsZV9fLCB2YWx1ZS5tb2R1bGUpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHB5X2l0ZW0sIChDbGFzc1R5cGUsIHR5cGUpKSkKICAgICAgICAgICAgICAgICBpZiBweV9pdGVtLl9fbW9kdWxlX18gIT0gbW9kdWxlTmFtZToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2NvcGUucHkgYi9MaWIvdGVzdC90ZXN0X3Njb3BlLnB5CmluZGV4IGU0ZTU5MmEuLjc3N2U4NWEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2NvcGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zY29wZS5weQpAQCAtMSwxODYgKzEsMTkwIEBACi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJpZnksIFRlc3RGYWlsZWQsIGNoZWNrX3N5bnRheCwgdmVyZXEKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgY2hlY2tfc3ludGF4X2Vycm9yLCBydW5fdW5pdHRlc3QKIAogaW1wb3J0IHdhcm5pbmdzCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgciJpbXBvcnQgXCoiLCBTeW50YXhXYXJuaW5nLCAiPHRlc3Qgc3RyaW5nPiIpCiB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgciJpbXBvcnQgXCoiLCBTeW50YXhXYXJuaW5nLCAiPHN0cmluZz4iKQogCi1wcmludCAiMS4gc2ltcGxlIG5lc3RpbmciCitjbGFzcyBTY29wZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotZGVmIG1ha2VfYWRkZXIoeCk6Ci0gICAgZGVmIGFkZGVyKHkpOgotICAgICAgICByZXR1cm4geCArIHkKLSAgICByZXR1cm4gYWRkZXIKKyAgICBkZWYgdGVzdFNpbXBsZU5lc3Rpbmcoc2VsZik6CiAKLWluYyA9IG1ha2VfYWRkZXIoMSkKLXBsdXMxMCA9IG1ha2VfYWRkZXIoMTApCi0KLXZlcmVxKGluYygxKSwgMikKLXZlcmVxKHBsdXMxMCgtMiksIDgpCi0KLXByaW50ICIyLiBleHRyYSBuZXN0aW5nIgotCi1kZWYgbWFrZV9hZGRlcjIoeCk6Ci0gICAgZGVmIGV4dHJhKCk6ICMgY2hlY2sgZnJlZXZhcnMgcGFzc2luZyB0aHJvdWdoIG5vbi11c2Ugc2NvcGVzCi0gICAgICAgIGRlZiBhZGRlcih5KToKLSAgICAgICAgICAgIHJldHVybiB4ICsgeQotICAgICAgICByZXR1cm4gYWRkZXIKLSAgICByZXR1cm4gZXh0cmEoKQotCi1pbmMgPSBtYWtlX2FkZGVyMigxKQotcGx1czEwID0gbWFrZV9hZGRlcjIoMTApCi0KLXZlcmVxKGluYygxKSwgMikKLXZlcmVxKHBsdXMxMCgtMiksIDgpCi0KLXByaW50ICIzLiBzaW1wbGUgbmVzdGluZyArIHJlYmluZGluZyIKLQotZGVmIG1ha2VfYWRkZXIzKHgpOgotICAgIGRlZiBhZGRlcih5KToKLSAgICAgICAgcmV0dXJuIHggKyB5Ci0gICAgeCA9IHggKyAxICMgY2hlY2sgdHJhY2tpbmcgb2YgYXNzaWdubWVudCB0byB4IGluIGRlZmluaW5nIHNjb3BlCi0gICAgcmV0dXJuIGFkZGVyCi0KLWluYyA9IG1ha2VfYWRkZXIzKDApCi1wbHVzMTAgPSBtYWtlX2FkZGVyMyg5KQotCi12ZXJlcShpbmMoMSksIDIpCi12ZXJlcShwbHVzMTAoLTIpLCA4KQotCi1wcmludCAiNC4gbmVzdGluZyB3aXRoIGdsb2JhbCBidXQgbm8gZnJlZSIKLQotZGVmIG1ha2VfYWRkZXI0KCk6ICMgWFhYIGFkZCBleHRhIGxldmVsIG9mIGluZGlyZWN0aW9uCi0gICAgZGVmIG5lc3QoKToKLSAgICAgICAgZGVmIG5lc3QoKToKKyAgICAgICAgZGVmIG1ha2VfYWRkZXIoeCk6CiAgICAgICAgICAgICBkZWYgYWRkZXIoeSk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdsb2JhbF94ICsgeSAjIGNoZWNrIHRoYXQgcGxhaW4gb2xkIGdsb2JhbHMgd29yaworICAgICAgICAgICAgICAgIHJldHVybiB4ICsgeQogICAgICAgICAgICAgcmV0dXJuIGFkZGVyCi0gICAgICAgIHJldHVybiBuZXN0KCkKLSAgICByZXR1cm4gbmVzdCgpCiAKLWdsb2JhbF94ID0gMQotYWRkZXIgPSBtYWtlX2FkZGVyNCgpCi12ZXJlcShhZGRlcigxKSwgMikKKyAgICAgICAgaW5jID0gbWFrZV9hZGRlcigxKQorICAgICAgICBwbHVzMTAgPSBtYWtlX2FkZGVyKDEwKQogCi1nbG9iYWxfeCA9IDEwCi12ZXJlcShhZGRlcigtMiksIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5jKDEpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsdXMxMCgtMiksIDgpCiAKLXByaW50ICI1LiBuZXN0aW5nIHRocm91Z2ggY2xhc3MiCisgICAgZGVmIHRlc3RFeHRyYU5lc3Rpbmcoc2VsZik6CiAKLWRlZiBtYWtlX2FkZGVyNSh4KToKLSAgICBjbGFzcyBBZGRlcjoKLSAgICAgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHkpOgotICAgICAgICAgICAgcmV0dXJuIHggKyB5Ci0gICAgcmV0dXJuIEFkZGVyKCkKKyAgICAgICAgZGVmIG1ha2VfYWRkZXIyKHgpOgorICAgICAgICAgICAgZGVmIGV4dHJhKCk6ICMgY2hlY2sgZnJlZXZhcnMgcGFzc2luZyB0aHJvdWdoIG5vbi11c2Ugc2NvcGVzCisgICAgICAgICAgICAgICAgZGVmIGFkZGVyKHkpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4geCArIHkKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRkZXIKKyAgICAgICAgICAgIHJldHVybiBleHRyYSgpCiAKLWluYyA9IG1ha2VfYWRkZXI1KDEpCi1wbHVzMTAgPSBtYWtlX2FkZGVyNSgxMCkKKyAgICAgICAgaW5jID0gbWFrZV9hZGRlcjIoMSkKKyAgICAgICAgcGx1czEwID0gbWFrZV9hZGRlcjIoMTApCiAKLXZlcmVxKGluYygxKSwgMikKLXZlcmVxKHBsdXMxMCgtMiksIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5jKDEpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsdXMxMCgtMiksIDgpCiAKLXByaW50ICI2LiBuZXN0aW5nIHBsdXMgZnJlZSByZWYgdG8gZ2xvYmFsIgorICAgIGRlZiB0ZXN0U2ltcGxlQW5kUmViaW5kaW5nKHNlbGYpOgogCi1kZWYgbWFrZV9hZGRlcjYoeCk6Ci0gICAgZ2xvYmFsIGdsb2JhbF9uZXN0X3gKLSAgICBkZWYgYWRkZXIoeSk6Ci0gICAgICAgIHJldHVybiBnbG9iYWxfbmVzdF94ICsgeQotICAgIGdsb2JhbF9uZXN0X3ggPSB4Ci0gICAgcmV0dXJuIGFkZGVyCisgICAgICAgIGRlZiBtYWtlX2FkZGVyMyh4KToKKyAgICAgICAgICAgIGRlZiBhZGRlcih5KToKKyAgICAgICAgICAgICAgICByZXR1cm4geCArIHkKKyAgICAgICAgICAgIHggPSB4ICsgMSAjIGNoZWNrIHRyYWNraW5nIG9mIGFzc2lnbm1lbnQgdG8geCBpbiBkZWZpbmluZyBzY29wZQorICAgICAgICAgICAgcmV0dXJuIGFkZGVyCiAKLWluYyA9IG1ha2VfYWRkZXI2KDEpCi1wbHVzMTAgPSBtYWtlX2FkZGVyNigxMCkKKyAgICAgICAgaW5jID0gbWFrZV9hZGRlcjMoMCkKKyAgICAgICAgcGx1czEwID0gbWFrZV9hZGRlcjMoOSkKIAotdmVyZXEoaW5jKDEpLCAxMSkgIyB0aGVyZSdzIG9ubHkgb25lIGdsb2JhbAotdmVyZXEocGx1czEwKC0yKSwgOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmMoMSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGx1czEwKC0yKSwgOCkKIAotcHJpbnQgIjcuIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlIgorICAgIGRlZiB0ZXN0TmVzdGluZ0dsb2JhbE5vRnJlZShzZWxmKToKIAotZGVmIGYoeCk6Ci0gICAgZGVmIGcoeSk6Ci0gICAgICAgIHggPSA0MiAjIGNoZWNrIHRoYXQgdGhpcyBtYXNrcyBiaW5kaW5nIGluIGYoKQotICAgICAgICBkZWYgaCh6KToKLSAgICAgICAgICAgIHJldHVybiB4ICsgegotICAgICAgICByZXR1cm4gaAotICAgIHJldHVybiBnKDIpCisgICAgICAgIGRlZiBtYWtlX2FkZGVyNCgpOiAjIFhYWCBhZGQgZXh0YSBsZXZlbCBvZiBpbmRpcmVjdGlvbgorICAgICAgICAgICAgZGVmIG5lc3QoKToKKyAgICAgICAgICAgICAgICBkZWYgbmVzdCgpOgorICAgICAgICAgICAgICAgICAgICBkZWYgYWRkZXIoeSk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2xvYmFsX3ggKyB5ICMgY2hlY2sgdGhhdCBwbGFpbiBvbGQgZ2xvYmFscyB3b3JrCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGRlcgorICAgICAgICAgICAgICAgIHJldHVybiBuZXN0KCkKKyAgICAgICAgICAgIHJldHVybiBuZXN0KCkKIAotdGVzdF9mdW5jID0gZigxMCkKLXZlcmVxKHRlc3RfZnVuYyg1KSwgNDcpCisgICAgICAgIGdsb2JhbF94ID0gMQorICAgICAgICBhZGRlciA9IG1ha2VfYWRkZXI0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhZGRlcigxKSwgMikKIAotcHJpbnQgIjguIG1peGVkIGZyZWV2YXJzIGFuZCBjZWxsdmFycyIKKyAgICAgICAgZ2xvYmFsX3ggPSAxMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFkZGVyKC0yKSwgOCkKIAotZGVmIGlkZW50aXR5KHgpOgotICAgIHJldHVybiB4CisgICAgZGVmIHRlc3ROZXN0aW5nVGhyb3VnaENsYXNzKHNlbGYpOgogCi1kZWYgZih4LCB5LCB6KToKLSAgICBkZWYgZyhhLCBiLCBjKToKLSAgICAgICAgYSA9IGEgKyB4ICMgMwotICAgICAgICBkZWYgaCgpOgotICAgICAgICAgICAgIyB6ICogKDQgKyA5KQotICAgICAgICAgICAgIyAzICogMTMKLSAgICAgICAgICAgIHJldHVybiBpZGVudGl0eSh6ICogKGIgKyB5KSkKLSAgICAgICAgeSA9IGMgKyB6ICMgOQotICAgICAgICByZXR1cm4gaAotICAgIHJldHVybiBnCisgICAgICAgIGRlZiBtYWtlX2FkZGVyNSh4KToKKyAgICAgICAgICAgIGNsYXNzIEFkZGVyOgorICAgICAgICAgICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmLCB5KToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHggKyB5CisgICAgICAgICAgICByZXR1cm4gQWRkZXIoKQogCi1nID0gZigxLCAyLCAzKQotaCA9IGcoMiwgNCwgNikKLXZlcmVxKGgoKSwgMzkpCisgICAgICAgIGluYyA9IG1ha2VfYWRkZXI1KDEpCisgICAgICAgIHBsdXMxMCA9IG1ha2VfYWRkZXI1KDEwKQogCi1wcmludCAiOS4gZnJlZSB2YXJpYWJsZSBpbiBtZXRob2QiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5jKDEpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsdXMxMCgtMiksIDgpCiAKLWRlZiB0ZXN0KCk6Ci0gICAgbWV0aG9kX2FuZF92YXIgPSAidmFyIgotICAgIGNsYXNzIFRlc3Q6Ci0gICAgICAgIGRlZiBtZXRob2RfYW5kX3ZhcihzZWxmKToKLSAgICAgICAgICAgIHJldHVybiAibWV0aG9kIgotICAgICAgICBkZWYgdGVzdChzZWxmKToKLSAgICAgICAgICAgIHJldHVybiBtZXRob2RfYW5kX3ZhcgotICAgICAgICBkZWYgYWN0dWFsX2dsb2JhbChzZWxmKToKLSAgICAgICAgICAgIHJldHVybiBzdHIoImdsb2JhbCIpCi0gICAgICAgIGRlZiBzdHIoc2VsZik6Ci0gICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYpCi0gICAgcmV0dXJuIFRlc3QoKQorICAgIGRlZiB0ZXN0TmVzdGluZ1BsdXNGcmVlUmVmVG9HbG9iYWwoc2VsZik6CiAKLXQgPSB0ZXN0KCkKLXZlcmVxKHQudGVzdCgpLCAidmFyIikKLXZlcmVxKHQubWV0aG9kX2FuZF92YXIoKSwgIm1ldGhvZCIpCi12ZXJlcSh0LmFjdHVhbF9nbG9iYWwoKSwgImdsb2JhbCIpCisgICAgICAgIGRlZiBtYWtlX2FkZGVyNih4KToKKyAgICAgICAgICAgIGdsb2JhbCBnbG9iYWxfbmVzdF94CisgICAgICAgICAgICBkZWYgYWRkZXIoeSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdsb2JhbF9uZXN0X3ggKyB5CisgICAgICAgICAgICBnbG9iYWxfbmVzdF94ID0geAorICAgICAgICAgICAgcmV0dXJuIGFkZGVyCiAKLW1ldGhvZF9hbmRfdmFyID0gInZhciIKLWNsYXNzIFRlc3Q6Ci0gICAgIyB0aGlzIGNsYXNzIGlzIG5vdCBuZXN0ZWQsIHNvIHRoZSBydWxlcyBhcmUgZGlmZmVyZW50Ci0gICAgZGVmIG1ldGhvZF9hbmRfdmFyKHNlbGYpOgotICAgICAgICByZXR1cm4gIm1ldGhvZCIKLSAgICBkZWYgdGVzdChzZWxmKToKLSAgICAgICAgcmV0dXJuIG1ldGhvZF9hbmRfdmFyCi0gICAgZGVmIGFjdHVhbF9nbG9iYWwoc2VsZik6Ci0gICAgICAgIHJldHVybiBzdHIoImdsb2JhbCIpCi0gICAgZGVmIHN0cihzZWxmKToKLSAgICAgICAgcmV0dXJuIHN0cihzZWxmKQorICAgICAgICBpbmMgPSBtYWtlX2FkZGVyNigxKQorICAgICAgICBwbHVzMTAgPSBtYWtlX2FkZGVyNigxMCkKIAotdCA9IFRlc3QoKQotdmVyZXEodC50ZXN0KCksICJ2YXIiKQotdmVyZXEodC5tZXRob2RfYW5kX3ZhcigpLCAibWV0aG9kIikKLXZlcmVxKHQuYWN0dWFsX2dsb2JhbCgpLCAiZ2xvYmFsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmMoMSksIDExKSAjIHRoZXJlJ3Mgb25seSBvbmUgZ2xvYmFsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGx1czEwKC0yKSwgOCkKIAotcHJpbnQgIjEwLiByZWN1cnNpb24iCisgICAgZGVmIHRlc3ROZWFyZXN0RW5jbG9zaW5nU2NvcGUoc2VsZik6CiAKLWRlZiBmKHgpOgotICAgIGRlZiBmYWN0KG4pOgotICAgICAgICBpZiBuID09IDA6Ci0gICAgICAgICAgICByZXR1cm4gMQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIG4gKiBmYWN0KG4gLSAxKQotICAgIGlmIHggPj0gMDoKLSAgICAgICAgcmV0dXJuIGZhY3QoeCkKLSAgICBlbHNlOgotICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAieCBtdXN0IGJlID49IDAiCisgICAgICAgIGRlZiBmKHgpOgorICAgICAgICAgICAgZGVmIGcoeSk6CisgICAgICAgICAgICAgICAgeCA9IDQyICMgY2hlY2sgdGhhdCB0aGlzIG1hc2tzIGJpbmRpbmcgaW4gZigpCisgICAgICAgICAgICAgICAgZGVmIGgoeik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB4ICsgegorICAgICAgICAgICAgICAgIHJldHVybiBoCisgICAgICAgICAgICByZXR1cm4gZygyKQogCi12ZXJlcShmKDYpLCA3MjApCisgICAgICAgIHRlc3RfZnVuYyA9IGYoMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF9mdW5jKDUpLCA0NykKKworICAgIGRlZiB0ZXN0TWl4ZWRGcmVldmFyc0FuZENlbGx2YXJzKHNlbGYpOgorCisgICAgICAgIGRlZiBpZGVudGl0eSh4KToKKyAgICAgICAgICAgIHJldHVybiB4CisKKyAgICAgICAgZGVmIGYoeCwgeSwgeik6CisgICAgICAgICAgICBkZWYgZyhhLCBiLCBjKToKKyAgICAgICAgICAgICAgICBhID0gYSArIHggIyAzCisgICAgICAgICAgICAgICAgZGVmIGgoKToKKyAgICAgICAgICAgICAgICAgICAgIyB6ICogKDQgKyA5KQorICAgICAgICAgICAgICAgICAgICAjIDMgKiAxMworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWRlbnRpdHkoeiAqIChiICsgeSkpCisgICAgICAgICAgICAgICAgeSA9IGMgKyB6ICMgOQorICAgICAgICAgICAgICAgIHJldHVybiBoCisgICAgICAgICAgICByZXR1cm4gZworCisgICAgICAgIGcgPSBmKDEsIDIsIDMpCisgICAgICAgIGggPSBnKDIsIDQsIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaCgpLCAzOSkKKworICAgIGRlZiB0ZXN0RnJlZVZhckluTWV0aG9kKHNlbGYpOgorCisgICAgICAgIGRlZiB0ZXN0KCk6CisgICAgICAgICAgICBtZXRob2RfYW5kX3ZhciA9ICJ2YXIiCisgICAgICAgICAgICBjbGFzcyBUZXN0OgorICAgICAgICAgICAgICAgIGRlZiBtZXRob2RfYW5kX3ZhcihzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJtZXRob2QiCisgICAgICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2RfYW5kX3ZhcgorICAgICAgICAgICAgICAgIGRlZiBhY3R1YWxfZ2xvYmFsKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyKCJnbG9iYWwiKQorICAgICAgICAgICAgICAgIGRlZiBzdHIoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIoc2VsZikKKyAgICAgICAgICAgIHJldHVybiBUZXN0KCkKKworICAgICAgICB0ID0gdGVzdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC50ZXN0KCksICJ2YXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubWV0aG9kX2FuZF92YXIoKSwgIm1ldGhvZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5hY3R1YWxfZ2xvYmFsKCksICJnbG9iYWwiKQorCisgICAgICAgIG1ldGhvZF9hbmRfdmFyID0gInZhciIKKyAgICAgICAgY2xhc3MgVGVzdDoKKyAgICAgICAgICAgICMgdGhpcyBjbGFzcyBpcyBub3QgbmVzdGVkLCBzbyB0aGUgcnVsZXMgYXJlIGRpZmZlcmVudAorICAgICAgICAgICAgZGVmIG1ldGhvZF9hbmRfdmFyKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAibWV0aG9kIgorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZF9hbmRfdmFyCisgICAgICAgICAgICBkZWYgYWN0dWFsX2dsb2JhbChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyKCJnbG9iYWwiKQorICAgICAgICAgICAgZGVmIHN0cihzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYpCisKKyAgICAgICAgdCA9IFRlc3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudGVzdCgpLCAidmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lm1ldGhvZF9hbmRfdmFyKCksICJtZXRob2QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuYWN0dWFsX2dsb2JhbCgpLCAiZ2xvYmFsIikKKworICAgIGRlZiB0ZXN0UmVjdXJzaW9uKHNlbGYpOgorCisgICAgICAgIGRlZiBmKHgpOgorICAgICAgICAgICAgZGVmIGZhY3Qobik6CisgICAgICAgICAgICAgICAgaWYgbiA9PSAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuICogZmFjdChuIC0gMSkKKyAgICAgICAgICAgIGlmIHggPj0gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFjdCh4KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAieCBtdXN0IGJlID49IDAiCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKDYpLCA3MjApCiAKIAotcHJpbnQgIjExLiB1bm9wdGltaXplZCBuYW1lc3BhY2VzIgorICAgIGRlZiB0ZXN0VW5vcHRpbWl6ZWROYW1lc3BhY2VzKHNlbGYpOgogCi1jaGVja19zeW50YXgoIiIiXAorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgIiIiXAogZGVmIHVub3B0aW1pemVkX2NsYXNoMShzdHJpcCk6CiAgICAgZGVmIGYocyk6CiAgICAgICAgIGZyb20gc3RyaW5nIGltcG9ydCAqCkBAIC0xODgsNyArMTkyLDcgQEAKICAgICByZXR1cm4gZgogIiIiKQogCi1jaGVja19zeW50YXgoIiIiXAorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgIiIiXAogZGVmIHVub3B0aW1pemVkX2NsYXNoMigpOgogICAgIGZyb20gc3RyaW5nIGltcG9ydCAqCiAgICAgZGVmIGYocyk6CkBAIC0xOTYsNyArMjAwLDcgQEAKICAgICByZXR1cm4gZgogIiIiKQogCi1jaGVja19zeW50YXgoIiIiXAorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgIiIiXAogZGVmIHVub3B0aW1pemVkX2NsYXNoMigpOgogICAgIGZyb20gc3RyaW5nIGltcG9ydCAqCiAgICAgZGVmIGcoKToKQEAgLTIwNSwyMyArMjA5LDIzIEBACiAgICAgICAgIHJldHVybiBmCiAiIiIpCiAKLWNoZWNrX3N5bnRheCgiIiJcCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiIiJcCiBkZWYgZih4KToKICAgICBkZWYgZygpOgogICAgICAgICByZXR1cm4geAogICAgIGRlbCB4ICMgY2FuJ3QgZGVsIG5hbWUKICIiIikKIAotY2hlY2tfc3ludGF4KCIiIlwKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICIiIlwKIGRlZiBmKCk6CiAgICAgZGVmIGcoKToKLSAgICAgICAgIGZyb20gc3RyaW5nIGltcG9ydCAqCi0gICAgICAgICByZXR1cm4gc3RyaXAgIyBnbG9iYWwgb3IgbG9jYWw/CisgICAgICAgIGZyb20gc3RyaW5nIGltcG9ydCAqCisgICAgICAgIHJldHVybiBzdHJpcCAjIGdsb2JhbCBvciBsb2NhbD8KICIiIikKIAotIyBhbmQgdmVyaWZ5IGEgZmV3IGNhc2VzIHRoYXQgc2hvdWxkIHdvcmsKKyAgICAgICAgIyBhbmQgdmVyaWZ5IGEgZmV3IGNhc2VzIHRoYXQgc2hvdWxkIHdvcmsKIAotZXhlYygiIiIKKyAgICAgICAgZXhlYygiIiIKIGRlZiBub3Byb2JsZW0xKCk6CiAgICAgZnJvbSBzdHJpbmcgaW1wb3J0ICoKICAgICBmID0gbGFtYmRhIHg6eApAQCAtMjM4LDU5ICsyNDIsNjAgQEAKICAgICAgICAgeSA9IHgKICIiIikKIAotcHJpbnQgIjEyLiBsYW1iZGFzIgorICAgIGRlZiB0ZXN0TGFtYmRhcyhzZWxmKToKIAotZjEgPSBsYW1iZGEgeDogbGFtYmRhIHk6IHggKyB5Ci1pbmMgPSBmMSgxKQotcGx1czEwID0gZjEoMTApCi12ZXJlcShpbmMoMSksIDIpCi12ZXJlcShwbHVzMTAoNSksIDE1KQorICAgICAgICBmMSA9IGxhbWJkYSB4OiBsYW1iZGEgeTogeCArIHkKKyAgICAgICAgaW5jID0gZjEoMSkKKyAgICAgICAgcGx1czEwID0gZjEoMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5jKDEpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsdXMxMCg1KSwgMTUpCiAKLWYyID0gbGFtYmRhIHg6IChsYW1iZGEgOiBsYW1iZGEgeTogeCArIHkpKCkKLWluYyA9IGYyKDEpCi1wbHVzMTAgPSBmMigxMCkKLXZlcmVxKGluYygxKSwgMikKLXZlcmVxKHBsdXMxMCg1KSwgMTUpCisgICAgICAgIGYyID0gbGFtYmRhIHg6IChsYW1iZGEgOiBsYW1iZGEgeTogeCArIHkpKCkKKyAgICAgICAgaW5jID0gZjIoMSkKKyAgICAgICAgcGx1czEwID0gZjIoMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5jKDEpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsdXMxMCg1KSwgMTUpCiAKLWYzID0gbGFtYmRhIHg6IGxhbWJkYSB5OiBnbG9iYWxfeCArIHkKLWdsb2JhbF94ID0gMQotaW5jID0gZjMoTm9uZSkKLXZlcmVxKGluYygyKSwgMykKKyAgICAgICAgZjMgPSBsYW1iZGEgeDogbGFtYmRhIHk6IGdsb2JhbF94ICsgeQorICAgICAgICBnbG9iYWxfeCA9IDEKKyAgICAgICAgaW5jID0gZjMoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmMoMiksIDMpCiAKLWY4ID0gbGFtYmRhIHgsIHksIHo6IGxhbWJkYSBhLCBiLCBjOiBsYW1iZGEgOiB6ICogKGIgKyB5KQotZyA9IGY4KDEsIDIsIDMpCi1oID0gZygyLCA0LCA2KQotdmVyZXEoaCgpLCAxOCkKKyAgICAgICAgZjggPSBsYW1iZGEgeCwgeSwgejogbGFtYmRhIGEsIGIsIGM6IGxhbWJkYSA6IHogKiAoYiArIHkpCisgICAgICAgIGcgPSBmOCgxLCAyLCAzKQorICAgICAgICBoID0gZygyLCA0LCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGgoKSwgMTgpCiAKLXByaW50ICIxMy4gVW5ib3VuZExvY2FsIgorICAgIGRlZiB0ZXN0VW5ib3VuZExvY2FsKHNlbGYpOgogCi1kZWYgZXJyb3JJbk91dGVyKCk6Ci0gICAgcHJpbnQgeQotICAgIGRlZiBpbm5lcigpOgotICAgICAgICByZXR1cm4geQotICAgIHkgPSAxCisgICAgICAgIGRlZiBlcnJvckluT3V0ZXIoKToKKyAgICAgICAgICAgIHByaW50IHkKKyAgICAgICAgICAgIGRlZiBpbm5lcigpOgorICAgICAgICAgICAgICAgIHJldHVybiB5CisgICAgICAgICAgICB5ID0gMQogCi1kZWYgZXJyb3JJbklubmVyKCk6Ci0gICAgZGVmIGlubmVyKCk6Ci0gICAgICAgIHJldHVybiB5Ci0gICAgaW5uZXIoKQotICAgIHkgPSAxCisgICAgICAgIGRlZiBlcnJvckluSW5uZXIoKToKKyAgICAgICAgICAgIGRlZiBpbm5lcigpOgorICAgICAgICAgICAgICAgIHJldHVybiB5CisgICAgICAgICAgICBpbm5lcigpCisgICAgICAgICAgICB5ID0gMQogCi10cnk6Ci0gICAgZXJyb3JJbk91dGVyKCkKLWV4Y2VwdCBVbmJvdW5kTG9jYWxFcnJvcjoKLSAgICBwYXNzCi1lbHNlOgotICAgIHJhaXNlIFRlc3RGYWlsZWQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXJyb3JJbk91dGVyKCkKKyAgICAgICAgZXhjZXB0IFVuYm91bmRMb2NhbEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCkKIAotdHJ5OgotICAgIGVycm9ySW5Jbm5lcigpCi1leGNlcHQgTmFtZUVycm9yOgotICAgIHBhc3MKLWVsc2U6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZAorICAgICAgICB0cnk6CisgICAgICAgICAgICBlcnJvckluSW5uZXIoKQorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCkKIAotIyB0ZXN0IGZvciBidWcgIzE1MDE5MzQ6IGluY29ycmVjdCBMT0FEL1NUT1JFX0dMT0JBTCBnZW5lcmF0aW9uCisgICAgICAgICMgdGVzdCBmb3IgYnVnICMxNTAxOTM0OiBpbmNvcnJlY3QgTE9BRC9TVE9SRV9HTE9CQUwgZ2VuZXJhdGlvbgorICAgICAgICBleGVjKCIiIgogZ2xvYmFsX3ggPSAxCiBkZWYgZigpOgogICAgIGdsb2JhbF94ICs9IDEKQEAgLTI5OSwzNCArMzA0LDM2IEBACiBleGNlcHQgVW5ib3VuZExvY2FsRXJyb3I6CiAgICAgcGFzcwogZWxzZToKLSAgICByYWlzZSBUZXN0RmFpbGVkLCAnc2NvcGUgb2YgZ2xvYmFsX3ggbm90IGNvcnJlY3RseSBkZXRlcm1pbmVkJworICAgIGZhaWwoJ3Njb3BlIG9mIGdsb2JhbF94IG5vdCBjb3JyZWN0bHkgZGV0ZXJtaW5lZCcpCisiIiIsIHsnZmFpbCc6IHNlbGYuZmFpbH0pCiAKLXByaW50ICIxNC4gY29tcGxleCBkZWZpbml0aW9ucyIKKyAgICBkZWYgdGVzdENvbXBsZXhEZWZpbml0aW9ucyhzZWxmKToKIAotZGVmIG1ha2VSZXR1cm5lcigqbHN0KToKLSAgICBkZWYgcmV0dXJuZXIoKToKLSAgICAgICAgcmV0dXJuIGxzdAotICAgIHJldHVybiByZXR1cm5lcgorICAgICAgICBkZWYgbWFrZVJldHVybmVyKCpsc3QpOgorICAgICAgICAgICAgZGVmIHJldHVybmVyKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxzdAorICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyCiAKLXZlcmVxKG1ha2VSZXR1cm5lcigxLDIsMykoKSwgKDEsMiwzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWtlUmV0dXJuZXIoMSwyLDMpKCksICgxLDIsMykpCiAKLWRlZiBtYWtlUmV0dXJuZXIyKCoqa3dhcmdzKToKLSAgICBkZWYgcmV0dXJuZXIoKToKLSAgICAgICAgcmV0dXJuIGt3YXJncwotICAgIHJldHVybiByZXR1cm5lcgorICAgICAgICBkZWYgbWFrZVJldHVybmVyMigqKmt3YXJncyk6CisgICAgICAgICAgICBkZWYgcmV0dXJuZXIoKToKKyAgICAgICAgICAgICAgICByZXR1cm4ga3dhcmdzCisgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXIKIAotdmVyZXEobWFrZVJldHVybmVyMihhPTExKSgpWydhJ10sIDExKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1ha2VSZXR1cm5lcjIoYT0xMSkoKVsnYSddLCAxMSkKIAotZGVmIG1ha2VBZGRQYWlyKChhLCBiKSk6Ci0gICAgZGVmIGFkZFBhaXIoKGMsIGQpKToKLSAgICAgICAgcmV0dXJuIChhICsgYywgYiArIGQpCi0gICAgcmV0dXJuIGFkZFBhaXIKKyAgICAgICAgZGVmIG1ha2VBZGRQYWlyKChhLCBiKSk6CisgICAgICAgICAgICBkZWYgYWRkUGFpcigoYywgZCkpOgorICAgICAgICAgICAgICAgIHJldHVybiAoYSArIGMsIGIgKyBkKQorICAgICAgICAgICAgcmV0dXJuIGFkZFBhaXIKIAotdmVyZXEobWFrZUFkZFBhaXIoKDEsIDIpKSgoMTAwLCAyMDApKSwgKDEwMSwyMDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1ha2VBZGRQYWlyKCgxLCAyKSkoKDEwMCwgMjAwKSksICgxMDEsMjAyKSkKIAotcHJpbnQgIjE1LiBzY29wZSBvZiBnbG9iYWwgc3RhdGVtZW50cyIKKyAgICBkZWYgdGVzdFNjb3BlT2ZHbG9iYWxTdG10KHNlbGYpOgogIyBFeGFtcGxlcyBwb3N0ZWQgYnkgU2FtdWVsZSBQZWRyb25pIHRvIHB5dGhvbi1kZXYgb24gMy8xLzIwMDEKIAorICAgICAgICBleGVjKCIiIlwKICMgSQogeCA9IDcKIGRlZiBmKCk6CkBAIC0zMzksOCArMzQ2LDggQEAKICAgICAgICAgICAgIHJldHVybiBoKCkKICAgICAgICAgcmV0dXJuIGkoKQogICAgIHJldHVybiBnKCkKLXZlcmVxKGYoKSwgNykKLXZlcmVxKHgsIDcpCitzZWxmLmFzc2VydEVxdWFsKGYoKSwgNykKK3NlbGYuYXNzZXJ0RXF1YWwoeCwgNykKIAogIyBJSQogeCA9IDcKQEAgLTM1NCw4ICszNjEsOCBAQAogICAgICAgICAgICAgcmV0dXJuIGgoKQogICAgICAgICByZXR1cm4gaSgpCiAgICAgcmV0dXJuIGcoKQotdmVyZXEoZigpLCAyKQotdmVyZXEoeCwgNykKK3NlbGYuYXNzZXJ0RXF1YWwoZigpLCAyKQorc2VsZi5hc3NlcnRFcXVhbCh4LCA3KQogCiAjIElJSQogeCA9IDcKQEAgLTM3MCw4ICszNzcsOCBAQAogICAgICAgICAgICAgcmV0dXJuIGgoKQogICAgICAgICByZXR1cm4gaSgpCiAgICAgcmV0dXJuIGcoKQotdmVyZXEoZigpLCAyKQotdmVyZXEoeCwgMikKK3NlbGYuYXNzZXJ0RXF1YWwoZigpLCAyKQorc2VsZi5hc3NlcnRFcXVhbCh4LCAyKQogCiAjIElWCiB4ID0gNwpAQCAtMzg2LDggKzM5Myw4IEBACiAgICAgICAgICAgICByZXR1cm4gaCgpCiAgICAgICAgIHJldHVybiBpKCkKICAgICByZXR1cm4gZygpCi12ZXJlcShmKCksIDIpCi12ZXJlcSh4LCAyKQorc2VsZi5hc3NlcnRFcXVhbChmKCksIDIpCitzZWxmLmFzc2VydEVxdWFsKHgsIDIpCiAKICMgWFhYIHdoYXQgYWJvdXQgZ2xvYmFsIHN0YXRlbWVudHMgaW4gY2xhc3MgYmxvY2tzPwogIyBkbyB0aGV5IGFmZmVjdCBtZXRob2RzPwpAQCAtNDAyLDM0ICs0MDksMzYgQEAKICAgICAgICAgcmV0dXJuIHgKIAogZyA9IEdsb2JhbCgpCi12ZXJlcShnLmdldCgpLCAxMykKK3NlbGYuYXNzZXJ0RXF1YWwoZy5nZXQoKSwgMTMpCiBnLnNldCgxNSkKLXZlcmVxKGcuZ2V0KCksIDEzKQorc2VsZi5hc3NlcnRFcXVhbChnLmdldCgpLCAxMykKKyIiIikKIAotcHJpbnQgIjE2LiBjaGVjayBsZWFrcyIKKyAgICBkZWYgdGVzdExlYWtzKHNlbGYpOgogCi1jbGFzcyBGb286Ci0gICAgY291bnQgPSAwCisgICAgICAgIGNsYXNzIEZvbzoKKyAgICAgICAgICAgIGNvdW50ID0gMAogCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBGb28uY291bnQgKz0gMQorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIEZvby5jb3VudCArPSAxCiAKLSAgICBkZWYgX19kZWxfXyhzZWxmKToKLSAgICAgICAgRm9vLmNvdW50IC09IDEKKyAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIEZvby5jb3VudCAtPSAxCiAKLWRlZiBmMSgpOgotICAgIHggPSBGb28oKQotICAgIGRlZiBmMigpOgotICAgICAgICByZXR1cm4geAotICAgIGYyKCkKKyAgICAgICAgZGVmIGYxKCk6CisgICAgICAgICAgICB4ID0gRm9vKCkKKyAgICAgICAgICAgIGRlZiBmMigpOgorICAgICAgICAgICAgICAgIHJldHVybiB4CisgICAgICAgICAgICBmMigpCiAKLWZvciBpIGluIHJhbmdlKDEwMCk6Ci0gICAgZjEoKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDApOgorICAgICAgICAgICAgZjEoKQogCi12ZXJlcShGb28uY291bnQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRm9vLmNvdW50LCAwKQogCi1wcmludCAiMTcuIGNsYXNzIGFuZCBnbG9iYWwiCisgICAgZGVmIHRlc3RDbGFzc0FuZEdsb2JhbChzZWxmKToKIAorICAgICAgICBleGVjKCIiIlwKIGRlZiB0ZXN0KHgpOgogICAgIGNsYXNzIEZvbzoKICAgICAgICAgZ2xvYmFsIHgKQEAgLTQzOCw5ICs0NDcsOSBAQAogICAgIHJldHVybiBGb28oKQogCiB4ID0gMAotdmVyZXEodGVzdCg2KSgyKSwgOCkKK3NlbGYuYXNzZXJ0RXF1YWwodGVzdCg2KSgyKSwgOCkKIHggPSAtMQotdmVyZXEodGVzdCgzKSgyKSwgNSkKK3NlbGYuYXNzZXJ0RXF1YWwodGVzdCgzKSgyKSwgNSkKIAogbG9va2VkX3VwX2J5X2xvYWRfbmFtZSA9IEZhbHNlCiBjbGFzcyBYOgpAQCAtNDQ5LDEwNCArNDU4LDEwNiBAQAogICAgIGxvY2FscygpWydsb29rZWRfdXBfYnlfbG9hZF9uYW1lJ10gPSBUcnVlCiAgICAgcGFzc2VkID0gbG9va2VkX3VwX2J5X2xvYWRfbmFtZQogCi12ZXJpZnkoWC5wYXNzZWQpCitzZWxmLmFzc2VydF8oWC5wYXNzZWQpCisiIiIpCiAKLXByaW50ICIxOC4gdmVyaWZ5IHRoYXQgbG9jYWxzKCkgd29ya3MiCisgICAgZGVmIHRlc3RMb2NhbHNGdW5jdGlvbihzZWxmKToKIAotZGVmIGYoeCk6Ci0gICAgZGVmIGcoeSk6Ci0gICAgICAgIGRlZiBoKHopOgotICAgICAgICAgICAgcmV0dXJuIHkgKyB6Ci0gICAgICAgIHcgPSB4ICsgeQotICAgICAgICB5ICs9IDMKLSAgICAgICAgcmV0dXJuIGxvY2FscygpCi0gICAgcmV0dXJuIGcKKyAgICAgICAgZGVmIGYoeCk6CisgICAgICAgICAgICBkZWYgZyh5KToKKyAgICAgICAgICAgICAgICBkZWYgaCh6KToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHkgKyB6CisgICAgICAgICAgICAgICAgdyA9IHggKyB5CisgICAgICAgICAgICAgICAgeSArPSAzCisgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FscygpCisgICAgICAgICAgICByZXR1cm4gZwogCi1kID0gZigyKSg0KQotdmVyaWZ5KCdoJyBpbiBkKQotZGVsIGRbJ2gnXQotdmVyZXEoZCwgeyd4JzogMiwgJ3knOiA3LCAndyc6IDZ9KQorICAgICAgICBkID0gZigyKSg0KQorICAgICAgICBzZWxmLmFzc2VydF8oJ2gnIGluIGQpCisgICAgICAgIGRlbCBkWydoJ10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7J3gnOiAyLCAneSc6IDcsICd3JzogNn0pCiAKLXByaW50ICIxOS4gdmFyIGlzIGJvdW5kIGFuZCBmcmVlIGluIGNsYXNzIgorICAgIGRlZiB0ZXN0Qm91bmRBbmRGcmVlKHNlbGYpOgorICAgICAgICAjIHZhciBpcyBib3VuZCBhbmQgZnJlZSBpbiBjbGFzcwogCi1kZWYgZih4KToKLSAgICBjbGFzcyBDOgotICAgICAgICBkZWYgbShzZWxmKToKLSAgICAgICAgICAgIHJldHVybiB4Ci0gICAgICAgIGEgPSB4Ci0gICAgcmV0dXJuIEMKKyAgICAgICAgZGVmIGYoeCk6CisgICAgICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgICAgIGRlZiBtKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4geAorICAgICAgICAgICAgICAgIGEgPSB4CisgICAgICAgICAgICByZXR1cm4gQwogCi1pbnN0ID0gZigzKSgpCi12ZXJlcShpbnN0LmEsIGluc3QubSgpKQorICAgICAgICBpbnN0ID0gZigzKSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zdC5hLCBpbnN0Lm0oKSkKIAotcHJpbnQgIjIwLiBpbnRlcmFjdGlvbiB3aXRoIHRyYWNlIGZ1bmN0aW9uIgorICAgIGRlZiB0ZXN0SW50ZXJhY3Rpb25XaXRoVHJhY2VGdW5jKHNlbGYpOgogCi1pbXBvcnQgc3lzCi1kZWYgdHJhY2VyKGEsYixjKToKLSAgICByZXR1cm4gdHJhY2VyCisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgZGVmIHRyYWNlcihhLGIsYyk6CisgICAgICAgICAgICByZXR1cm4gdHJhY2VyCiAKLWRlZiBhZGFwdGdldHRlcihuYW1lLCBrbGFzcywgZ2V0dGVyKToKLSAgICBraW5kLCBkZXMgPSBnZXR0ZXIKLSAgICBpZiBraW5kID09IDE6ICAgICAgICMgQVYgaGFwcGVucyB3aGVuIHN0ZXBwaW5nIGZyb20gdGhpcyBsaW5lIHRvIG5leHQKLSAgICAgICAgaWYgZGVzID09ICIiOgotICAgICAgICAgICAgZGVzID0gIl8lc19fJXMiICUgKGtsYXNzLl9fbmFtZV9fLCBuYW1lKQotICAgICAgICByZXR1cm4gbGFtYmRhIG9iajogZ2V0YXR0cihvYmosIGRlcykKKyAgICAgICAgZGVmIGFkYXB0Z2V0dGVyKG5hbWUsIGtsYXNzLCBnZXR0ZXIpOgorICAgICAgICAgICAga2luZCwgZGVzID0gZ2V0dGVyCisgICAgICAgICAgICBpZiBraW5kID09IDE6ICAgICAgICMgQVYgaGFwcGVucyB3aGVuIHN0ZXBwaW5nIGZyb20gdGhpcyBsaW5lIHRvIG5leHQKKyAgICAgICAgICAgICAgICBpZiBkZXMgPT0gIiI6CisgICAgICAgICAgICAgICAgICAgIGRlcyA9ICJfJXNfXyVzIiAlIChrbGFzcy5fX25hbWVfXywgbmFtZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbGFtYmRhIG9iajogZ2V0YXR0cihvYmosIGRlcykKIAotY2xhc3MgVGVzdENsYXNzOgotICAgIHBhc3MKKyAgICAgICAgY2xhc3MgVGVzdENsYXNzOgorICAgICAgICAgICAgcGFzcwogCi1zeXMuc2V0dHJhY2UodHJhY2VyKQotYWRhcHRnZXR0ZXIoImZvbyIsIFRlc3RDbGFzcywgKDEsICIiKSkKLXN5cy5zZXR0cmFjZShOb25lKQorICAgICAgICBzeXMuc2V0dHJhY2UodHJhY2VyKQorICAgICAgICBhZGFwdGdldHRlcigiZm9vIiwgVGVzdENsYXNzLCAoMSwgIiIpKQorICAgICAgICBzeXMuc2V0dHJhY2UoTm9uZSkKIAotdHJ5OiBzeXMuc2V0dHJhY2UoKQotZXhjZXB0IFR5cGVFcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgJ3N5cy5zZXR0cmFjZSgpIGRpZCBub3QgcmFpc2UgVHlwZUVycm9yJworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN5cy5zZXR0cmFjZSkKIAotcHJpbnQgIjIwLiBldmFsIGFuZCBleGVjIHdpdGggZnJlZSB2YXJpYWJsZXMiCisgICAgZGVmIHRlc3RFdmFsRXhlY0ZyZWVWYXJzKHNlbGYpOgogCi1kZWYgZih4KToKLSAgICByZXR1cm4gbGFtYmRhOiB4ICsgMQorICAgICAgICBkZWYgZih4KToKKyAgICAgICAgICAgIHJldHVybiBsYW1iZGE6IHggKyAxCiAKLWcgPSBmKDMpCi10cnk6Ci0gICAgZXZhbChnLmZ1bmNfY29kZSkKLWV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgcGFzcwotZWxzZToKLSAgICBwcmludCAiZXZhbCgpIHNob3VsZCBoYXZlIGZhaWxlZCwgYmVjYXVzZSBjb2RlIGNvbnRhaW5lZCBmcmVlIHZhcnMiCisgICAgICAgIGcgPSBmKDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXZhbCwgZy5mdW5jX2NvZGUpCiAKLXRyeToKLSAgICBleGVjKGcuZnVuY19jb2RlKQotZXhjZXB0IFR5cGVFcnJvcjoKLSAgICBwYXNzCi1lbHNlOgotICAgIHByaW50ICJleGVjIHNob3VsZCBoYXZlIGZhaWxlZCwgYmVjYXVzZSBjb2RlIGNvbnRhaW5lZCBmcmVlIHZhcnMiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMoZy5mdW5jX2NvZGUsIHt9KQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleGVjIHNob3VsZCBoYXZlIGZhaWxlZCwgYmVjYXVzZSBjb2RlIGNvbnRhaW5lZCBmcmVlIHZhcnMiKQogCi1wcmludCAiMjEuIGxpc3QgY29tcHJlaGVuc2lvbiB3aXRoIGxvY2FsIHZhcmlhYmxlcyIKKyAgICBkZWYgdGVzdExpc3RDb21wTG9jYWxWYXJzKHNlbGYpOgogCi10cnk6Ci0gICAgcHJpbnQgYmFkCi1leGNlcHQgTmFtZUVycm9yOgotICAgIHBhc3MKLWVsc2U6Ci0gICAgcHJpbnQgImJhZCBzaG91bGQgbm90IGJlIGRlZmluZWQiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByaW50IGJhZAorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgImJhZCBzaG91bGQgbm90IGJlIGRlZmluZWQiCiAKLWRlZiB4KCk6Ci0gICAgW2JhZCBmb3IgcyBpbiAnYSBiJyBmb3IgYmFkIGluIHMuc3BsaXQoKV0KKyAgICAgICAgZGVmIHgoKToKKyAgICAgICAgICAgIFtiYWQgZm9yIHMgaW4gJ2EgYicgZm9yIGJhZCBpbiBzLnNwbGl0KCldCiAKLXgoKQotdHJ5OgotICAgIHByaW50IGJhZAotZXhjZXB0IE5hbWVFcnJvcjoKLSAgICBwYXNzCisgICAgICAgIHgoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcmludCBiYWQKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKIAotcHJpbnQgIjIyLiBldmFsIHdpdGggZnJlZSB2YXJpYWJsZXMiCisgICAgZGVmIHRlc3RFdmFsRnJlZVZhcnMoc2VsZik6CiAKLWRlZiBmKHgpOgotICAgIGRlZiBnKCk6Ci0gICAgICAgIHgKLSAgICAgICAgZXZhbCgieCArIDEiKQotICAgIHJldHVybiBnCisgICAgICAgIGRlZiBmKHgpOgorICAgICAgICAgICAgZGVmIGcoKToKKyAgICAgICAgICAgICAgICB4CisgICAgICAgICAgICAgICAgZXZhbCgieCArIDEiKQorICAgICAgICAgICAgcmV0dXJuIGcKIAotZig0KSgpCisgICAgICAgIGYoNCkoKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoU2NvcGVUZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zZXQucHkgYi9MaWIvdGVzdC90ZXN0X3NldC5weQppbmRleCAwMzYyMWE2Li5hNDgzMGQ0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NldC5weQpAQCAtMjk4LDYgKzI5OCwxNyBAQAogICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi50aGV0eXBlKHNlbGYud29yZCkgbm90IGluIHMpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBzZWxmLnMucmVtb3ZlLCBzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSkKIAorICAgIGRlZiB0ZXN0X3JlbW92ZV9rZXllcnJvcl91bnBhY2tpbmcoc2VsZik6CisgICAgICAgICMgYnVnOiAgd3d3LnB5dGhvbi5vcmcvc2YvMTU3NjY1NworICAgICAgICBmb3IgdjEgaW4gWydRJywgKDEsKV06CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zLnJlbW92ZSh2MSkKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvciwgZToKKyAgICAgICAgICAgICAgICB2MiA9IGUuYXJnc1swXQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodjEsIHYyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoKQorCiAgICAgZGVmIHRlc3RfZGlzY2FyZChzZWxmKToKICAgICAgICAgc2VsZi5zLmRpc2NhcmQoJ2EnKQogICAgICAgICBzZWxmLmFzc2VydF8oJ2EnIG5vdCBpbiBzZWxmLnMpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NnbWxsaWIucHkgYi9MaWIvdGVzdC90ZXN0X3NnbWxsaWIucHkKaW5kZXggMjhhMjFhNC4uYjY5ODYzNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zZ21sbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2dtbGxpYi5weQpAQCAtMjg2LDIxICsyODYsNiBAQAogICAgICAgICAgICAgKCdjb2RlcG9pbnQnLCAnY29udmVydCcsIDQyKSwKICAgICAgICAgICAgIF0pCiAKLSAgICBkZWYgdGVzdF9hdHRyX3ZhbHVlc19xdW90ZWRfbWFya3VwKHNlbGYpOgotICAgICAgICAiIiJNdWx0aS1saW5lIGFuZCBtYXJrdXAgaW4gYXR0cmlidXRlIHZhbHVlcyIiIgotICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiIiI8YSB0aXRsZT0nZm9vXG48YnI+YmFyJz50ZXh0PC9hPiIiIiwKLSAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJ0aXRsZSIsICJmb29cbjxicj5iYXIiKV0pLAotICAgICAgICAgICAgICgiZGF0YSIsICJ0ZXh0IiksCi0gICAgICAgICAgICAgKCJlbmR0YWciLCAiYSIpXSkKLSAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIiIiPGEgdGl0bGU9J2xlc3MgPCB0aGFuJz50ZXh0PC9hPiIiIiwKLSAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJ0aXRsZSIsICJsZXNzIDwgdGhhbiIpXSksCi0gICAgICAgICAgICAgKCJkYXRhIiwgInRleHQiKSwKLSAgICAgICAgICAgICAoImVuZHRhZyIsICJhIildKQotICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiIiI8YSB0aXRsZT0nZ3JlYXRlciA+IHRoYW4nPnRleHQ8L2E+IiIiLAotICAgICAgICAgICAgWygic3RhcnR0YWciLCAiYSIsIFsoInRpdGxlIiwgImdyZWF0ZXIgPiB0aGFuIildKSwKLSAgICAgICAgICAgICAoImRhdGEiLCAidGV4dCIpLAotICAgICAgICAgICAgICgiZW5kdGFnIiwgImEiKV0pCi0KICAgICBkZWYgdGVzdF9hdHRyX2Z1bmt5X25hbWVzKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiIiI8YSBhLmI9J3YnIGM6ZD12IGUtZj12PiIiIiwgWwogICAgICAgICAgICAgKCJzdGFydHRhZyIsICJhIiwgWygiYS5iIiwgInYiKSwgKCJjOmQiLCAidiIpLCAoImUtZiIsICJ2IildKSwKQEAgLTM3Niw2ICszNjEsMTkgQEAKICAgICAgICAgICAgICgnZGVjbCcsICdET0NUWVBFIGRvYyBbPCFBVFRMSVNUIGRvYyBhdHRyIChhIHwgYikgPl0nKSwKICAgICAgICAgICAgIF0pCiAKKyAgICBkZWYgdGVzdF9yZWFkX2NodW5rcyhzZWxmKToKKyAgICAgICAgIyBTRiBidWcgIzE1NDE2OTcsIHRoaXMgY2F1c2VkIHNnbWwgcGFyc2VyIHRvIGhhbmcKKyAgICAgICAgIyBKdXN0IHZlcmlmeSB0aGlzIGNvZGUgZG9lc24ndCBjYXVzZSBhIGhhbmcuCisgICAgICAgIENIVU5LID0gMTAyNCAgIyBpbmNyZWFzaW5nIHRoaXMgdG8gODIxMiBtYWtlcyB0aGUgcHJvYmxlbSBnbyBhd2F5CisKKyAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LmZpbmRmaWxlKCdzZ21sX2lucHV0Lmh0bWwnKSkKKyAgICAgICAgZnAgPSBzZ21sbGliLlNHTUxQYXJzZXIoKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgZGF0YSA9IGYucmVhZChDSFVOSykKKyAgICAgICAgICAgIGZwLmZlZWQoZGF0YSkKKyAgICAgICAgICAgIGlmIGxlbihkYXRhKSAhPSBDSFVOSzoKKyAgICAgICAgICAgICAgICBicmVhaworCiAgICAgIyBYWFggVGhlc2UgdGVzdHMgaGF2ZSBiZWVuIGRpc2FibGVkIGJ5IHByZWZpeGluZyB0aGVpciBuYW1lcyB3aXRoCiAgICAgIyBhbiB1bmRlcnNjb3JlLiAgVGhlIGZpcnN0IHR3byBleGVyY2lzZSBvdXRzdGFuZGluZyBidWdzIGluIHRoZQogICAgICMgc2dtbGxpYiBtb2R1bGUsIGFuZCB0aGUgdGhpcmQgZXhoaWJpdHMgcXVlc3Rpb25hYmxlIGJlaGF2aW9yCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NoYS5weSBiL0xpYi90ZXN0L3Rlc3Rfc2hhLnB5CmluZGV4IGM0MzhjYzYuLmVhMjI0ZTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2hhLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2hhLnB5CkBAIC0xMSw5ICsxMSwyMyBAQAogCiBjbGFzcyBTSEFUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIGNoZWNrKHNlbGYsIGRhdGEsIGRpZ2VzdCk6Ci0gICAgICAgIGNvbXB1dGVkID0gc2hhLm5ldyhkYXRhKS5oZXhkaWdlc3QoKQorICAgICAgICAjIENoZWNrIGRpZ2VzdCBtYXRjaGVzIHRoZSBleHBlY3RlZCB2YWx1ZQorICAgICAgICBvYmogPSBzaGEubmV3KGRhdGEpCisgICAgICAgIGNvbXB1dGVkID0gb2JqLmhleGRpZ2VzdCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhjb21wdXRlZCA9PSBkaWdlc3QpCiAKKyAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgdmFsdWUgZG9lc24ndCBjaGFuZ2UgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUKKyAgICAgICAgIyBkaWdlc3Qgb3BlcmF0aW9ucy4KKyAgICAgICAgY29tcHV0ZWRfYWdhaW4gPSBvYmouaGV4ZGlnZXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNvbXB1dGVkID09IGNvbXB1dGVkX2FnYWluKQorCisgICAgICAgICMgQ2hlY2sgaGV4ZGlnZXN0KCkgb3V0cHV0IG1hdGNoZXMgZGlnZXN0KCkncyBvdXRwdXQKKyAgICAgICAgZGlnZXN0ID0gb2JqLmRpZ2VzdCgpCisgICAgICAgIGhleGQgPSAiIgorICAgICAgICBmb3IgYyBpbiBkaWdlc3Q6CisgICAgICAgICAgICBoZXhkICs9ICclMDJ4JyAlIG9yZChjKQorICAgICAgICBzZWxmLmFzc2VydF8oY29tcHV0ZWQgPT0gaGV4ZCkKKwogICAgIGRlZiB0ZXN0X2Nhc2VfMShzZWxmKToKICAgICAgICAgc2VsZi5jaGVjaygiYWJjIiwKICAgICAgICAgICAgICAgICAgICAiYTk5OTNlMzY0NzA2ODE2YWJhM2UyNTcxNzg1MGMyNmM5Y2QwZDg5ZCIpCkBAIC0yNiw2ICs0MCw5IEBACiAgICAgICAgIHNlbGYuY2hlY2soImEiICogMTAwMDAwMCwKICAgICAgICAgICAgICAgICAgICAiMzRhYTk3M2NkNGM0ZGFhNGY2MWVlYjJiZGJhZDI3MzE2NTM0MDE2ZiIpCiAKKyAgICBkZWYgdGVzdF9jYXNlXzQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soY2hyKDB4QUEpICogODAsCisgICAgICAgICAgICAgICAgICAgJzRjYTBlZjM4ZjE3OTRiMjhhOGY4ZWUxMTBlZTc5ZDQ4Y2UxM2JlMjUnKQogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTSEFUZXN0Q2FzZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3RydWN0bWVtYmVycy5weSBiL0xpYi90ZXN0L3Rlc3Rfc3RydWN0bWVtYmVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2RkMmFjCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9zdHJ1Y3RtZW1iZXJzLnB5CkBAIC0wLDAgKzEsODAgQEAKK2Zyb20gX3Rlc3RjYXBpIGltcG9ydCB0ZXN0X3N0cnVjdG1lbWJlcnNUeXBlLCBcCisgICAgQ0hBUl9NQVgsIENIQVJfTUlOLCBVQ0hBUl9NQVgsIFwKKyAgICBTSFJUX01BWCwgU0hSVF9NSU4sIFVTSFJUX01BWCwgXAorICAgIElOVF9NQVgsIElOVF9NSU4sIFVJTlRfTUFYLCBcCisgICAgTE9OR19NQVgsIExPTkdfTUlOLCBVTE9OR19NQVgKKworaW1wb3J0IHdhcm5pbmdzLCBleGNlcHRpb25zLCB1bml0dGVzdCwgdGVzdC50ZXN0X3dhcm5pbmdzCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCit0cz10ZXN0X3N0cnVjdG1lbWJlcnNUeXBlKDEsMiwzLDQsNSw2LDcsOCw5Ljk5OTk5LDEwLjEwMTAxMDEwMTApCisKK2NsYXNzIFJlYWRXcml0ZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF90eXBlcyhzZWxmKToKKyAgICAgICAgdHMuVF9CWVRFPUNIQVJfTUFYCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRzLlRfQllURSwgQ0hBUl9NQVgpCisgICAgICAgIHRzLlRfQllURT1DSEFSX01JTgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0cy5UX0JZVEUsIENIQVJfTUlOKQorICAgICAgICB0cy5UX1VCWVRFPVVDSEFSX01BWAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0cy5UX1VCWVRFLCBVQ0hBUl9NQVgpCisKKyAgICAgICAgdHMuVF9TSE9SVD1TSFJUX01BWAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0cy5UX1NIT1JULCBTSFJUX01BWCkKKyAgICAgICAgdHMuVF9TSE9SVD1TSFJUX01JTgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0cy5UX1NIT1JULCBTSFJUX01JTikKKyAgICAgICAgdHMuVF9VU0hPUlQ9VVNIUlRfTUFYCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRzLlRfVVNIT1JULCBVU0hSVF9NQVgpCisKKyAgICAgICAgdHMuVF9JTlQ9SU5UX01BWAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0cy5UX0lOVCwgSU5UX01BWCkKKyAgICAgICAgdHMuVF9JTlQ9SU5UX01JTgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0cy5UX0lOVCwgSU5UX01JTikKKyAgICAgICAgdHMuVF9VSU5UPVVJTlRfTUFYCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRzLlRfVUlOVCwgVUlOVF9NQVgpCisKKyAgICAgICAgdHMuVF9MT05HPUxPTkdfTUFYCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRzLlRfTE9ORywgTE9OR19NQVgpCisgICAgICAgIHRzLlRfTE9ORz1MT05HX01JTgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0cy5UX0xPTkcsIExPTkdfTUlOKQorICAgICAgICB0cy5UX1VMT05HPVVMT05HX01BWAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0cy5UX1VMT05HLCBVTE9OR19NQVgpCisKK2NsYXNzIFRlc3RXYXJuaW5ncyh0ZXN0LnRlc3Rfd2FybmluZ3MuVGVzdE1vZHVsZSk6CisgICAgZGVmIGhhc193YXJuZWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdC50ZXN0X3dhcm5pbmdzLm1zZy5jYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25zLlJ1bnRpbWVXYXJuaW5nLl9fbmFtZV9fKQorCisgICAgZGVmIHRlc3RfYnl0ZV9tYXgoc2VsZik6CisgICAgICAgIHRzLlRfQllURT1DSEFSX01BWCsxCisgICAgICAgIHNlbGYuaGFzX3dhcm5lZCgpCisKKyAgICBkZWYgdGVzdF9ieXRlX21pbihzZWxmKToKKyAgICAgICAgdHMuVF9CWVRFPUNIQVJfTUlOLTEKKyAgICAgICAgc2VsZi5oYXNfd2FybmVkKCkKKworICAgIGRlZiB0ZXN0X3VieXRlX21heChzZWxmKToKKyAgICAgICAgdHMuVF9VQllURT1VQ0hBUl9NQVgrMQorICAgICAgICBzZWxmLmhhc193YXJuZWQoKQorCisgICAgZGVmIHRlc3Rfc2hvcnRfbWF4KHNlbGYpOgorICAgICAgICB0cy5UX1NIT1JUPVNIUlRfTUFYKzEKKyAgICAgICAgc2VsZi5oYXNfd2FybmVkKCkKKworICAgIGRlZiB0ZXN0X3Nob3J0X21pbihzZWxmKToKKyAgICAgICAgdHMuVF9TSE9SVD1TSFJUX01JTi0xCisgICAgICAgIHNlbGYuaGFzX3dhcm5lZCgpCisKKyAgICBkZWYgdGVzdF91c2hvcnRfbWF4KHNlbGYpOgorICAgICAgICB0cy5UX1VTSE9SVD1VU0hSVF9NQVgrMQorICAgICAgICBzZWxmLmhhc193YXJuZWQoKQorCisKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIFJlYWRXcml0ZVRlc3RzLAorICAgICAgICBUZXN0V2FybmluZ3MKKyAgICAgICAgKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkgYi9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkKaW5kZXggOGM4YWM0MC4uNjRmOGQ0MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weQpAQCAtMjM0LDYgKzIzNCwxMiBAQAogICAgICAgICBzdHJpcHBlZCA9IHJlbW92ZV9zdGRlcnJfZGVidWdfZGVjb3JhdGlvbnMob3V0cHV0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmlwcGVkLCAiYXBwbGVvcmFuZ2UiKQogCisgICAgZGVmIHRlc3Rfc3Rkb3V0X2ZpbGVkZXNfb2Zfc3Rkb3V0KHNlbGYpOgorICAgICAgICAjIHN0ZG91dCBpcyBzZXQgdG8gMSAoIzE1MzE4NjIpLgorICAgICAgICBjbWQgPSByImltcG9ydCBzeXMsIG9zOyBzeXMuZXhpdChvcy53cml0ZShzeXMuc3Rkb3V0LmZpbGVubygpLCAnLlxuJykpIgorICAgICAgICByYyA9IHN1YnByb2Nlc3MuY2FsbChbc3lzLmV4ZWN1dGFibGUsICItYyIsIGNtZF0sIHN0ZG91dD0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyYywgMikKKwogICAgIGRlZiB0ZXN0X2N3ZChzZWxmKToKICAgICAgICAgdG1wZGlyID0gb3MuZ2V0ZW52KCJURU1QIiwgIi90bXAiKQogICAgICAgICAjIFdlIGNhbm5vdCB1c2Ugb3MucGF0aC5yZWFscGF0aCB0byBjYW5vbmljYWxpemUgdGhlIHBhdGgsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkKaW5kZXggZDI2MGZjNS4uMjgyOWM1NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weQpAQCAtMjQ0LDEzICsyNDQsMTMgQEAKICAgICB3aXRoY29tbWFzID0gIiwgIi5qb2luKHJlcHJwYWlycykKICAgICByZXR1cm4gInslc30iICUgd2l0aGNvbW1hcwogCi1kZWYgY2hlY2tfc3ludGF4KHN0YXRlbWVudCk6CitkZWYgY2hlY2tfc3ludGF4X2Vycm9yKHRlc3RjYXNlLCBzdGF0ZW1lbnQpOgogICAgIHRyeToKLSAgICAgICAgY29tcGlsZShzdGF0ZW1lbnQsICc8c3RyaW5nPicsICdleGVjJykKKyAgICAgICAgY29tcGlsZShzdGF0ZW1lbnQsICc8dGVzdCBzdHJpbmc+JywgJ2V4ZWMnKQogICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKICAgICAgICAgcGFzcwogICAgIGVsc2U6Ci0gICAgICAgIHByaW50ICdNaXNzaW5nIFN5bnRheEVycm9yOiAiJXMiJyAlIHN0YXRlbWVudAorICAgICAgICB0ZXN0Y2FzZS5mYWlsKCdNaXNzaW5nIFN5bnRheEVycm9yOiAiJXMiJyAlIHN0YXRlbWVudCkKIAogZGVmIG9wZW5fdXJscmVzb3VyY2UodXJsKToKICAgICBpbXBvcnQgdXJsbGliLCB1cmxwYXJzZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkgYi9MaWIvdGVzdC90ZXN0X3N5bnRheC5weQppbmRleCBhY2IzZjEwLi5hMGVhYWM2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N5bnRheC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N5bnRheC5weQpAQCAtMjM1LDYgKzIzNSwxMzggQEAKID4+PiBmKCkgKz0gMQogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogU3ludGF4RXJyb3I6IGlsbGVnYWwgZXhwcmVzc2lvbiBmb3IgYXVnbWVudGVkIGFzc2lnbm1lbnQgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMzNdPiwgbGluZSAxKQorCisKK1Rlc3QgY29udGludWUgaW4gZmluYWxseSBpbiB3ZWlyZCBjb21iaW5hdGlvbnMuCisKK2NvbnRpbnVlIGluIGZvciBsb29wIHVuZGVyIGZpbmFsbHkgc2hvdXVsZCBiZSBvay4KKworICAgID4+PiBkZWYgdGVzdCgpOgorICAgIC4uLiAgICAgdHJ5OgorICAgIC4uLiAgICAgICAgIHBhc3MKKyAgICAuLi4gICAgIGZpbmFsbHk6CisgICAgLi4uICAgICAgICAgZm9yIGFiYyBpbiByYW5nZSgxMCk6CisgICAgLi4uICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgLi4uICAgICBwcmludCBhYmMKKyAgICA+Pj4gdGVzdCgpCisgICAgOQorCitTdGFydCBzaW1wbGUsIGEgY29udGludWUgaW4gYSBmaW5hbGx5IHNob3VsZCBub3QgYmUgYWxsb3dlZC4KKworICAgID4+PiBkZWYgdGVzdCgpOgorICAgIC4uLiAgICBmb3IgYWJjIGluIHJhbmdlKDEwKToKKyAgICAuLi4gICAgICAgIHRyeToKKyAgICAuLi4gICAgICAgICAgICBwYXNzCisgICAgLi4uICAgICAgICBmaW5hbGx5OgorICAgIC4uLiAgICAgICAgICAgIGNvbnRpbnVlCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgU3ludGF4RXJyb3I6ICdjb250aW51ZScgbm90IHN1cHBvcnRlZCBpbnNpZGUgJ2ZpbmFsbHknIGNsYXVzZSAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFszNl0+LCBsaW5lIDYpCisKK1RoaXMgaXMgZXNzZW50aWFsbHkgYSBjb250aW51ZSBpbiBhIGZpbmFsbHkgd2hpY2ggc2hvdWxkIG5vdCBiZSBhbGxvd2VkLgorCisgICAgPj4+IGRlZiB0ZXN0KCk6CisgICAgLi4uICAgIGZvciBhYmMgaW4gcmFuZ2UoMTApOgorICAgIC4uLiAgICAgICAgdHJ5OgorICAgIC4uLiAgICAgICAgICAgIHBhc3MKKyAgICAuLi4gICAgICAgIGZpbmFsbHk6CisgICAgLi4uICAgICAgICAgICAgdHJ5OgorICAgIC4uLiAgICAgICAgICAgICAgICBjb250aW51ZQorICAgIC4uLiAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAuLi4gICAgICAgICAgICAgICAgcGFzcworICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFN5bnRheEVycm9yOiAnY29udGludWUnIG5vdCBzdXBwb3J0ZWQgaW5zaWRlICdmaW5hbGx5JyBjbGF1c2UgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMzddPiwgbGluZSA3KQorCisgICAgPj4+IGRlZiBmb28oKToKKyAgICAuLi4gICAgIHRyeToKKyAgICAuLi4gICAgICAgICBwYXNzCisgICAgLi4uICAgICBmaW5hbGx5OgorICAgIC4uLiAgICAgICAgIGNvbnRpbnVlCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgU3ludGF4RXJyb3I6ICdjb250aW51ZScgbm90IHN1cHBvcnRlZCBpbnNpZGUgJ2ZpbmFsbHknIGNsYXVzZSAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFszOF0+LCBsaW5lIDUpCisKKyAgICA+Pj4gZGVmIGZvbygpOgorICAgIC4uLiAgICAgZm9yIGEgaW4gKCk6CisgICAgLi4uICAgICAgIHRyeToKKyAgICAuLi4gICAgICAgICAgIHBhc3MKKyAgICAuLi4gICAgICAgZmluYWxseToKKyAgICAuLi4gICAgICAgICAgIGNvbnRpbnVlCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgU3ludGF4RXJyb3I6ICdjb250aW51ZScgbm90IHN1cHBvcnRlZCBpbnNpZGUgJ2ZpbmFsbHknIGNsYXVzZSAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFszOV0+LCBsaW5lIDYpCisKKyAgICA+Pj4gZGVmIGZvbygpOgorICAgIC4uLiAgICAgZm9yIGEgaW4gKCk6CisgICAgLi4uICAgICAgICAgdHJ5OgorICAgIC4uLiAgICAgICAgICAgICBwYXNzCisgICAgLi4uICAgICAgICAgZmluYWxseToKKyAgICAuLi4gICAgICAgICAgICAgdHJ5OgorICAgIC4uLiAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAuLi4gICAgICAgICAgICAgZmluYWxseToKKyAgICAuLi4gICAgICAgICAgICAgICAgIHBhc3MKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBTeW50YXhFcnJvcjogJ2NvbnRpbnVlJyBub3Qgc3VwcG9ydGVkIGluc2lkZSAnZmluYWxseScgY2xhdXNlICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzQwXT4sIGxpbmUgNykKKworICAgID4+PiBkZWYgZm9vKCk6CisgICAgLi4uICBmb3IgYSBpbiAoKToKKyAgICAuLi4gICB0cnk6IHBhc3MKKyAgICAuLi4gICBmaW5hbGx5OgorICAgIC4uLiAgICB0cnk6CisgICAgLi4uICAgICBwYXNzCisgICAgLi4uICAgIGV4Y2VwdDoKKyAgICAuLi4gICAgIGNvbnRpbnVlCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgU3ludGF4RXJyb3I6ICdjb250aW51ZScgbm90IHN1cHBvcnRlZCBpbnNpZGUgJ2ZpbmFsbHknIGNsYXVzZSAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFs0MV0+LCBsaW5lIDgpCisKK1RoZXJlIGlzIG9uZSB0ZXN0IGZvciBhIGJyZWFrIHRoYXQgaXMgbm90IGluIGEgbG9vcC4gIFRoZSBjb21waWxlcgordXNlcyBhIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mIHRyeS1maW5hbGx5IGFuZCBsb29wcywKK3NvIHdlIG5lZWQgdG8gYmUgc3VyZSB0aGF0IGEgYnJlYWsgaXMgYWN0dWFsbHkgaW5zaWRlIGEgbG9vcC4gIElmIGl0Citpc24ndCwgdGhlcmUgc2hvdWxkIGJlIGEgc3ludGF4IGVycm9yLgorCisgICA+Pj4gdHJ5OgorICAgLi4uICAgICBwcmludCAxCisgICAuLi4gICAgIGJyZWFrCisgICAuLi4gICAgIHByaW50IDIKKyAgIC4uLiBmaW5hbGx5OgorICAgLi4uICAgICBwcmludCAzCisgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgIC4uLgorICAgU3ludGF4RXJyb3I6ICdicmVhaycgb3V0c2lkZSBsb29wICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzQyXT4sIGxpbmUgMykKKworVGhpcyBzaG91bGQgcHJvYmFibHkgcmFpc2UgYSBiZXR0ZXIgZXJyb3IgdGhhbiBhIFN5c3RlbUVycm9yIChvciBub25lIGF0IGFsbCkuCitJbiAyLjUgdGhlcmUgd2FzIGEgbWlzc2luZyBleGNlcHRpb24gYW5kIGFuIGFzc2VydCB3YXMgdHJpZ2dlcmVkIGluIGEgZGVidWcKK2J1aWxkLiAgVGhlIG51bWJlciBvZiBibG9ja3MgbXVzdCBiZSBncmVhdGVyIHRoYW4gQ09fTUFYQkxPQ0tTLiAgU0YgIzE1NjU1MTQKKworICAgPj4+IHdoaWxlIDE6CisgICAuLi4gIHdoaWxlIDI6CisgICAuLi4gICB3aGlsZSAzOgorICAgLi4uICAgIHdoaWxlIDQ6CisgICAuLi4gICAgIHdoaWxlIDU6CisgICAuLi4gICAgICB3aGlsZSA2OgorICAgLi4uICAgICAgIHdoaWxlIDg6CisgICAuLi4gICAgICAgIHdoaWxlIDk6CisgICAuLi4gICAgICAgICB3aGlsZSAxMDoKKyAgIC4uLiAgICAgICAgICB3aGlsZSAxMToKKyAgIC4uLiAgICAgICAgICAgd2hpbGUgMTI6CisgICAuLi4gICAgICAgICAgICB3aGlsZSAxMzoKKyAgIC4uLiAgICAgICAgICAgICB3aGlsZSAxNDoKKyAgIC4uLiAgICAgICAgICAgICAgd2hpbGUgMTU6CisgICAuLi4gICAgICAgICAgICAgICB3aGlsZSAxNjoKKyAgIC4uLiAgICAgICAgICAgICAgICB3aGlsZSAxNzoKKyAgIC4uLiAgICAgICAgICAgICAgICAgd2hpbGUgMTg6CisgICAuLi4gICAgICAgICAgICAgICAgICB3aGlsZSAxOToKKyAgIC4uLiAgICAgICAgICAgICAgICAgICB3aGlsZSAyMDoKKyAgIC4uLiAgICAgICAgICAgICAgICAgICAgd2hpbGUgMjE6CisgICAuLi4gICAgICAgICAgICAgICAgICAgICB3aGlsZSAyMjoKKyAgIC4uLiAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAuLi4KKyAgIFN5c3RlbUVycm9yOiB0b28gbWFueSBzdGF0aWNhbGx5IG5lc3RlZCBibG9ja3MKKwogIiIiCiAKIGltcG9ydCByZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5IGIvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CmluZGV4IGE0N2FmYTQuLjBjZWJiMjkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKQEAgLTI4MCw2ICsyODAsMzIgQEAKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc2VsZi5kc3QuYWRkZmlsZSh0YXJpbmZvLCBmKQogCisKK2NsYXNzIFdyaXRlMTAwVGVzdChCYXNlVGVzdCk6CisgICAgIyBUaGUgbmFtZSBmaWVsZCBpbiBhIHRhciBoZWFkZXIgc3RvcmVzIHN0cmluZ3Mgb2YgYXQgbW9zdCAxMDAgY2hhcnMuCisgICAgIyBJZiBhIHN0cmluZyBpcyBzaG9ydGVyIHRoYW4gMTAwIGNoYXJzIGl0IGhhcyB0byBiZSBwYWRkZWQgd2l0aCAnXDAnLAorICAgICMgd2hpY2ggaW1wbGllcyB0aGF0IGEgc3RyaW5nIG9mIGV4YWN0bHkgMTAwIGNoYXJzIGlzIHN0b3JlZCB3aXRob3V0CisgICAgIyBhIHRyYWlsaW5nICdcMCcuCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYubmFtZSA9ICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIKKyAgICAgICAgc2VsZi5uYW1lICs9ICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIKKworICAgICAgICBzZWxmLnRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lKCksICJ3IikKKyAgICAgICAgdCA9IHRhcmZpbGUuVGFySW5mbyhzZWxmLm5hbWUpCisgICAgICAgIHNlbGYudGFyLmFkZGZpbGUodCkKKyAgICAgICAgc2VsZi50YXIuY2xvc2UoKQorCisgICAgICAgIHNlbGYudGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUoKSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi50YXIuY2xvc2UoKQorCisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50YXIuZ2V0bmFtZXMoKVswXSwgc2VsZi5uYW1lLAorICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc3RvcmUgMTAwIGNoYXIgZmlsZW5hbWUiKQorCisKIGNsYXNzIFdyaXRlU2l6ZTBUZXN0KEJhc2VUZXN0KToKICAgICBtb2RlID0gJ3cnCiAKQEAgLTM2MiwxMyArMzg4LDYgQEAKICAgICAgICBpcyB0ZXN0ZWQgYXMgd2VsbC4KICAgICAiIiIKIAotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi50YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSgpLCAidyIpCi0gICAgICAgIHNlbGYudGFyLnBvc2l4ID0gRmFsc2UKLQotICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgc2VsZi50YXIuY2xvc2UoKQotCiAgICAgZGVmIF9sZW5ndGgoc2VsZiwgcyk6CiAgICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKGxlbihzKSArIDEsIDUxMikKICAgICAgICAgaWYgcmVtYWluZGVyOgpAQCAtMzk3LDEyICs0MTYsMjMgQEAKICAgICAgICAgICAgIHRhcmluZm8ubGlua25hbWUgPSBsaW5rCiAgICAgICAgICAgICB0YXJpbmZvLnR5cGUgPSB0YXJmaWxlLkxOS1RZUEUKIAotICAgICAgICBzZWxmLnRhci5hZGRmaWxlKHRhcmluZm8pCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lKCksICJ3IikKKyAgICAgICAgdGFyLnBvc2l4ID0gRmFsc2UKKyAgICAgICAgdGFyLmFkZGZpbGUodGFyaW5mbykKIAogICAgICAgICB2MSA9IHNlbGYuX2NhbGNfc2l6ZShuYW1lLCBsaW5rKQotICAgICAgICB2MiA9IHNlbGYudGFyLm9mZnNldAorICAgICAgICB2MiA9IHRhci5vZmZzZXQKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2MSwgdjIsICJHTlUgbG9uZ25hbWUvbG9uZ2xpbmsgY3JlYXRpb24gZmFpbGVkIikKIAorICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lKCkpCisgICAgICAgIG1lbWJlciA9IHRhci5uZXh0KCkKKyAgICAgICAgc2VsZi5mYWlsSWYobWVtYmVyIGlzIE5vbmUsICJ1bmFibGUgdG8gcmVhZCBsb25nbmFtZSBtZW1iZXIiKQorICAgICAgICBzZWxmLmFzc2VydF8odGFyaW5mby5uYW1lID09IG1lbWJlci5uYW1lIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID09IG1lbWJlci5saW5rbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgInVuYWJsZSB0byByZWFkIGxvbmduYW1lIG1lbWJlciIpCisKICAgICBkZWYgdGVzdF9sb25nbmFtZV8xMDIzKHNlbGYpOgogICAgICAgICBzZWxmLl90ZXN0KCgibG9uZ25hbS8iICogMTI3KSArICJsb25nbmFtIikKIApAQCAtNjIzLDYgKzY1Myw3IEBACiAgICAgICAgIFJlYWRBc3Rlcmlza1Rlc3QsCiAgICAgICAgIFJlYWRTdHJlYW1Bc3Rlcmlza1Rlc3QsCiAgICAgICAgIFdyaXRlVGVzdCwKKyAgICAgICAgV3JpdGUxMDBUZXN0LAogICAgICAgICBXcml0ZVNpemUwVGVzdCwKICAgICAgICAgV3JpdGVTdHJlYW1UZXN0LAogICAgICAgICBXcml0ZUdOVUxvbmdUZXN0LApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90ZW1wZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfdGVtcGZpbGUucHkKaW5kZXggYWVhYTc3ZS4uMjA0N2E2MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90ZW1wZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RlbXBmaWxlLnB5CkBAIC0yNyw3ICsyNyw3IEBACiAjIG51bWJlciBvZiBmaWxlcyB0aGF0IGNhbiBiZSBvcGVuZWQgYXQgb25lIHRpbWUgKHNlZSB1bGltaXQgLW4pCiBpZiBzeXMucGxhdGZvcm0gPT0gJ21hYyc6CiAgICAgVEVTVF9GSUxFUyA9IDMyCi1lbGlmIHN5cy5wbGF0Zm9ybSA9PSAnb3BlbmJzZDMnOgorZWxpZiBzeXMucGxhdGZvcm0gaW4gKCdvcGVuYnNkMycsICdvcGVuYnNkNCcpOgogICAgIFRFU1RfRklMRVMgPSA0OAogZWxzZToKICAgICBURVNUX0ZJTEVTID0gMTAwCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RpbWUucHkgYi9MaWIvdGVzdC90ZXN0X3RpbWUucHkKaW5kZXggNGZkNzgzNC4uMTgxMjlkYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aW1lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGltZS5weQpAQCAtMTAyLDE1ICsxMDIsMTkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3VsdCkKIAogICAgIGRlZiB0ZXN0X3N0cnB0aW1lKHNlbGYpOgorICAgICAgICAjIFNob3VsZCBiZSBhYmxlIHRvIGdvIHJvdW5kLXRyaXAgZnJvbSBzdHJmdGltZSB0byBzdHJwdGltZSB3aXRob3V0CisgICAgICAgICMgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgogICAgICAgICB0dCA9IHRpbWUuZ210aW1lKHNlbGYudCkKICAgICAgICAgZm9yIGRpcmVjdGl2ZSBpbiAoJ2EnLCAnQScsICdiJywgJ0InLCAnYycsICdkJywgJ0gnLCAnSScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJywgJ20nLCAnTScsICdwJywgJ1MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnVScsICd3JywgJ1cnLCAneCcsICdYJywgJ3knLCAnWScsICdaJywgJyUnKToKLSAgICAgICAgICAgIGZvcm1hdCA9ICcgJScgKyBkaXJlY3RpdmUKKyAgICAgICAgICAgIGZvcm1hdCA9ICclJyArIGRpcmVjdGl2ZQorICAgICAgICAgICAgc3RyZl9vdXRwdXQgPSB0aW1lLnN0cmZ0aW1lKGZvcm1hdCwgdHQpCiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgdGltZS5zdHJwdGltZSh0aW1lLnN0cmZ0aW1lKGZvcm1hdCwgdHQpLCBmb3JtYXQpCisgICAgICAgICAgICAgICAgdGltZS5zdHJwdGltZShzdHJmX291dHB1dCwgZm9ybWF0KQogICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdjb252ZXJzaW9uIHNwZWNpZmllcjogJXIgZmFpbGVkLicgJSBmb3JtYXQpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJjb252ZXJzaW9uIHNwZWNpZmllciAlciBmYWlsZWQgd2l0aCAnJXMnIGlucHV0LiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybWF0LCBzdHJmX291dHB1dCkpCiAKICAgICBkZWYgdGVzdF9hc2N0aW1lKHNlbGYpOgogICAgICAgICB0aW1lLmFzY3RpbWUodGltZS5nbXRpbWUoc2VsZi50KSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdG9rZW5pemUucHkgYi9MaWIvdGVzdC90ZXN0X3Rva2VuaXplLnB5CmluZGV4IGIwNjQ5NjcuLmJlNmMxOGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdG9rZW5pemUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90b2tlbml6ZS5weQpAQCAtMSw5ICsxLDkzIEBACi1pbXBvcnQgb3MsIGdsb2IsIHJhbmRvbQorIiIiVGVzdHMgZm9yIHRoZSB0b2tlbml6ZSBtb2R1bGUuCisKK1RoZSB0ZXN0cyB3ZXJlIG9yaWdpbmFsbHkgd3JpdHRlbiBpbiB0aGUgb2xkIFB5dGhvbiBzdHlsZSwgd2hlcmUgdGhlCit0ZXN0IG91dHB1dCB3YXMgY29tcGFyZWQgdG8gYSBnb2xkZW4gZmlsZS4gIFRoaXMgZG9jc3RyaW5nIHJlcHJlc2VudHMKK3RoZSBmaXJzdCBzdGVwcyB0b3dhcmRzIHJld3JpdGluZyB0aGUgZW50aXJlIHRlc3QgYXMgYSBkb2N0ZXN0LgorCitUaGUgdGVzdHMgY2FuIGJlIHJlYWxseSBzaW1wbGUuICBHaXZlbiBhIHNtYWxsIGZyYWdtZW50IG9mIHNvdXJjZQorY29kZSwgcHJpbnQgb3V0IGEgdGFibGUgd2l0aCB0aGUgdG9rZW5zLiAgVGhlIEVORE1BUksgaXMgb21pdHRlZCBmb3IKK2JyZXZpdHkuCisKKz4+PiBkdW1wX3Rva2VucygiMSArIDEiKQorTlVNQkVSICAgICAgJzEnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCitPUCAgICAgICAgICAnKycgICAgICAgICAgICgxLCAyKSAoMSwgMykKK05VTUJFUiAgICAgICcxJyAgICAgICAgICAgKDEsIDQpICgxLCA1KQorCitBIGNvbW1lbnQgZ2VuZXJhdGVzIGEgdG9rZW4gaGVyZSwgdW5saWtlIGluIHRoZSBwYXJzZXIgbW9kdWxlLiAgVGhlCitjb21tZW50IHRva2VuIGlzIGZvbGxvd2VkIGJ5IGFuIE5MIG9yIGEgTkVXTElORSB0b2tlbiwgZGVwZW5kaW5nIG9uCit3aGV0aGVyIHRoZSBsaW5lIGNvbnRhaW5zIHRoZSBjb21wbGV0aW9uIG9mIGEgc3RhdGVtZW50LgorCis+Pj4gZHVtcF90b2tlbnMoImlmIEZhbHNlOlxcbiIKKy4uLiAgICAgICAgICAgICAiICAgICMgTkxcXG4iCisuLi4gICAgICAgICAgICAgIiAgICBUcnVlID0gRmFsc2UgIyBORVdMSU5FXFxuIikKK05BTUUgICAgICAgICdpZicgICAgICAgICAgKDEsIDApICgxLCAyKQorTkFNRSAgICAgICAgJ0ZhbHNlJyAgICAgICAoMSwgMykgKDEsIDgpCitPUCAgICAgICAgICAnOicgICAgICAgICAgICgxLCA4KSAoMSwgOSkKK05FV0xJTkUgICAgICdcXG4nICAgICAgICAgICgxLCA5KSAoMSwgMTApCitDT01NRU5UICAgICAnIyBOTCcgICAgICAgICgyLCA0KSAoMiwgOCkKK05MICAgICAgICAgICdcXG4nICAgICAgICAgICgyLCA4KSAoMiwgOSkKK0lOREVOVCAgICAgICcgICAgJyAgICAgICAgKDMsIDApICgzLCA0KQorTkFNRSAgICAgICAgJ1RydWUnICAgICAgICAoMywgNCkgKDMsIDgpCitPUCAgICAgICAgICAnPScgICAgICAgICAgICgzLCA5KSAoMywgMTApCitOQU1FICAgICAgICAnRmFsc2UnICAgICAgICgzLCAxMSkgKDMsIDE2KQorQ09NTUVOVCAgICAgJyMgTkVXTElORScgICAoMywgMTcpICgzLCAyNikKK05FV0xJTkUgICAgICdcXG4nICAgICAgICAgICgzLCAyNikgKDMsIDI3KQorREVERU5UICAgICAgJycgICAgICAgICAgICAoNCwgMCkgKDQsIDApCisKKworVGhlcmUgd2lsbCBiZSBhIGJ1bmNoIG1vcmUgdGVzdHMgb2Ygc3BlY2lmaWMgc291cmNlIHBhdHRlcm5zLgorCitUaGUgdG9rZW5pemUgbW9kdWxlIGFsc28gZGVmaW5lcyBhbiB1bnRva2VuaXplIGZ1bmN0aW9uIHRoYXQgc2hvdWxkCityZWdlbmVyYXRlIHRoZSBvcmlnaW5hbCBwcm9ncmFtIHRleHQgZnJvbSB0aGUgdG9rZW5zLgorCitUaGVyZSBhcmUgc29tZSBzdGFuZGFyZCBmb3JtYXR0aW5nIHByYWN0aWNlcyB0aGF0IGFyZSBlYXN5IHRvIGdldCByaWdodC4KKworPj4+IHJvdW5kdHJpcCgiaWYgeCA9PSAxOlxcbiIKKy4uLiAgICAgICAgICAgIiAgICBwcmludCB4XFxuIikKK2lmIHggPT0gMToKKyAgICBwcmludCB4CisKK1NvbWUgcGVvcGxlIHVzZSBkaWZmZXJlbnQgZm9ybWF0dGluZyBjb252ZW50aW9ucywgd2hpY2ggbWFrZXMKK3VudG9rZW5pemUgYSBsaXR0bGUgdHJpY2tpZXIuICBOb3RlIHRoYXQgdGhpcyB0ZXN0IGludm9sdmVzIHRyYWlsaW5nCit3aGl0ZXNwYWNlIGFmdGVyIHRoZSBjb2xvbi4gIE5vdGUgdGhhdCB3ZSB1c2UgaGV4IGVzY2FwZXMgdG8gbWFrZSB0aGUKK3R3byB0cmFpbGluZyBibGFua3MgYXBwYXJlbnQgaW4gdGhlIGV4cGVjdGVkIG91dHB1dC4KKworPj4+IHJvdW5kdHJpcCgiaWYgICB4ICA9PSAgMSAgOiAgXFxuIgorLi4uICAgICAgICAgICAiICBwcmludCB4XFxuIikKK2lmICAgeCAgPT0gIDEgIDpceDIwXHgyMAorICBwcmludCB4CisKK0NvbW1lbnRzIG5lZWQgdG8gZ28gaW4gdGhlIHJpZ2h0IHBsYWNlLgorCis+Pj4gcm91bmR0cmlwKCJpZiB4ID09IDE6XFxuIgorLi4uICAgICAgICAgICAiICAgICMgQSBjb21tZW50IGJ5IGl0c2VsZi5cXG4iCisuLi4gICAgICAgICAgICIgICAgcHJpbnQgeCAgIyBDb21tZW50IGhlcmUsIHRvby5cXG4iCisuLi4gICAgICAgICAgICIgICAgIyBBbm90aGVyIGNvbW1lbnQuXFxuIgorLi4uICAgICAgICAgICAiYWZ0ZXJfaWYgPSBUcnVlXFxuIikKK2lmIHggPT0gMToKKyAgICAjIEEgY29tbWVudCBieSBpdHNlbGYuCisgICAgcHJpbnQgeCAgIyBDb21tZW50IGhlcmUsIHRvby4KKyAgICAjIEFub3RoZXIgY29tbWVudC4KK2FmdGVyX2lmID0gVHJ1ZQorCis+Pj4gcm91bmR0cmlwKCJpZiAoeCAgIyBUaGUgY29tbWVudHMgbmVlZCB0byBnbyBpbiB0aGUgcmlnaHQgcGxhY2VcXG4iCisuLi4gICAgICAgICAgICIgICAgPT0gMSk6XFxuIgorLi4uICAgICAgICAgICAiICAgIHByaW50ICd4ID09IDEnXFxuIikKK2lmICh4ICAjIFRoZSBjb21tZW50cyBuZWVkIHRvIGdvIGluIHRoZSByaWdodCBwbGFjZQorICAgID09IDEpOgorICAgIHByaW50ICd4ID09IDEnCisKKyIiIgorCitpbXBvcnQgb3MsIGdsb2IsIHJhbmRvbSwgdGltZSwgc3lzCiBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0ICh2ZXJib3NlLCBmaW5kZmlsZSwgaXNfcmVzb3VyY2VfZW5hYmxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0RmFpbGVkKQotZnJvbSB0b2tlbml6ZSBpbXBvcnQgKHRva2VuaXplLCBnZW5lcmF0ZV90b2tlbnMsIHVudG9rZW5pemUsCi0gICAgICAgICAgICAgICAgICAgICAgTlVNQkVSLCBOQU1FLCBPUCwgU1RSSU5HKQorZnJvbSB0b2tlbml6ZSBpbXBvcnQgKHRva2VuaXplLCBnZW5lcmF0ZV90b2tlbnMsIHVudG9rZW5pemUsIHRva19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIEVORE1BUktFUiwgTlVNQkVSLCBOQU1FLCBPUCwgU1RSSU5HLCBDT01NRU5UKQorCisjIEhvdyBtdWNoIHRpbWUgaW4gc2Vjb25kcyBjYW4gcGFzcyBiZWZvcmUgd2UgcHJpbnQgYSAnU3RpbGwgd29ya2luZycgbWVzc2FnZS4KK19QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTCA9IDUgKiA2MAogCiAjIFRlc3Qgcm91bmR0cmlwIGZvciBgdW50b2tlbml6ZWAuICBgZmAgaXMgYSBmaWxlIHBhdGguICBUaGUgc291cmNlIGNvZGUgaW4gZgogIyBpcyB0b2tlbml6ZWQsIGNvbnZlcnRlZCBiYWNrIHRvIHNvdXJjZSBjb2RlIHZpYSB0b2tlbml6ZS51bnRva2VuaXplKCksCkBAIC0yNCw2ICsxMDgsMjMgQEAKICAgICBpZiB0MSAhPSB0MjoKICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgidW50b2tlbml6ZSgpIHJvdW5kdHJpcCBmYWlsZWQgZm9yICVyIiAlIGYpCiAKK2RlZiBkdW1wX3Rva2VucyhzKToKKyAgICAiIiJQcmludCBvdXQgdGhlIHRva2VucyBpbiBzIGluIGEgdGFibGUgZm9ybWF0LgorCisgICAgVGhlIEVORE1BUktFUiBpcyBvbWl0dGVkLgorICAgICIiIgorICAgIGYgPSBTdHJpbmdJTyhzKQorICAgIGZvciB0eXBlLCB0b2tlbiwgc3RhcnQsIGVuZCwgbGluZSBpbiBnZW5lcmF0ZV90b2tlbnMoZi5yZWFkbGluZSk6CisgICAgICAgIGlmIHR5cGUgPT0gRU5ETUFSS0VSOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgdHlwZSA9IHRva19uYW1lW3R5cGVdCisgICAgICAgIHByaW50ICIlKHR5cGUpLTEwLjEwcyAgJSh0b2tlbiktMTMuMTNyICUoc3RhcnQpcyAlKGVuZClzIiAlIGxvY2FscygpCisKK2RlZiByb3VuZHRyaXAocyk6CisgICAgZiA9IFN0cmluZ0lPKHMpCisgICAgc291cmNlID0gdW50b2tlbml6ZShnZW5lcmF0ZV90b2tlbnMoZi5yZWFkbGluZSkpCisgICAgcHJpbnQgc291cmNlLAorCiAjIFRoaXMgaXMgYW4gZXhhbXBsZSBmcm9tIHRoZSBkb2NzLCBzZXQgdXAgYXMgYSBkb2N0ZXN0LgogZGVmIGRlY2lzdG10KHMpOgogICAgICIiIlN1YnN0aXR1dGUgRGVjaW1hbHMgZm9yIGZsb2F0cyBpbiBhIHN0cmluZyBvZiBzdGF0ZW1lbnRzLgpAQCAtNjYsNiArMTY3LDggQEAKICAgICBpZiB2ZXJib3NlOgogICAgICAgICBwcmludCAnc3RhcnRpbmcuLi4nCiAKKyAgICBuZXh0X3RpbWUgPSB0aW1lLnRpbWUoKSArIF9QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTAorCiAgICAgIyBUaGlzIGRpc3BsYXlzIHRoZSB0b2tlbml6YXRpb24gb2YgdG9rZW5pemVfdGVzdHMucHkgdG8gc3Rkb3V0LCBhbmQKICAgICAjIHJlZ3J0ZXN0LnB5IGNoZWNrcyB0aGF0IHRoaXMgZXF1YWxzIHRoZSBleHBlY3RlZCBvdXRwdXQgKGluIHRoZQogICAgICMgdGVzdC9vdXRwdXQvIGRpcmVjdG9yeSkuCkBAIC04NSw2ICsxODgsMTIgQEAKICAgICAgICAgdGVzdGZpbGVzID0gcmFuZG9tLnNhbXBsZSh0ZXN0ZmlsZXMsIDEwKQogCiAgICAgZm9yIGYgaW4gdGVzdGZpbGVzOgorICAgICAgICAjIFByaW50IHN0aWxsIHdvcmtpbmcgbWVzc2FnZSBzaW5jZSB0aGlzIHRlc3QgY2FuIGJlIHJlYWxseSBzbG93CisgICAgICAgIGlmIG5leHRfdGltZSA8PSB0aW1lLnRpbWUoKToKKyAgICAgICAgICAgIG5leHRfdGltZSA9IHRpbWUudGltZSgpICsgX1BSSU5UX1dPUktJTkdfTVNHX0lOVEVSVkFMCisgICAgICAgICAgICBwcmludCA+PnN5cy5fX3N0ZG91dF9fLCAnICB0ZXN0X21haW4gc3RpbGwgd29ya2luZywgYmUgcGF0aWVudC4uLicKKyAgICAgICAgICAgIHN5cy5fX3N0ZG91dF9fLmZsdXNoKCkKKwogICAgICAgICB0ZXN0X3JvdW5kdHJpcChmKQogCiAgICAgIyBUZXN0IGRldGVjdG9uIG9mIEluZGVudGF0aW9uRXJyb3IuCkBAIC0xMDUsNyArMjE0LDcgQEAKICAgICAjIFJ1biB0aGUgZG9jdGVzdHMgaW4gdGhpcyBtb2R1bGUuCiAgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3Rva2VuaXplICAjIGkuZS4sIHRoaXMgbW9kdWxlCiAgICAgZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX2RvY3Rlc3QKLSAgICBydW5fZG9jdGVzdCh0ZXN0X3Rva2VuaXplKQorICAgIHJ1bl9kb2N0ZXN0KHRlc3RfdG9rZW5pemUsIHZlcmJvc2UpCiAKICAgICBpZiB2ZXJib3NlOgogICAgICAgICBwcmludCAnZmluaXNoZWQnCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weSBiL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5CmluZGV4IDliYTFkY2EuLjQ4YzVkMTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5CkBAIC0xMjIsNiArMTIyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFguX19uYW1lX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl92YWx1ZSkpCiAKKyAgICBkZWYgdGVzdF93aXRob3V0X2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgZXJyID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seShOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyciwgWydOb25lXG4nXSkKKwogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KFRyYWNlYmFja0Nhc2VzKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90eXBlcy5weSBiL0xpYi90ZXN0L3Rlc3RfdHlwZXMucHkKaW5kZXggZjBiZGZkZS4uOGQyNjkxNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90eXBlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3R5cGVzLnB5CkBAIC0xLDI4NSArMSwyNzEgQEAKICMgUHl0aG9uIHRlc3Qgc2V0IC0tIHBhcnQgNiwgYnVpbHQtaW4gdHlwZXMKIAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgKgotCi1wcmludCAnNi4gQnVpbHQtaW4gdHlwZXMnCi0KLXByaW50ICc2LjEgVHJ1dGggdmFsdWUgdGVzdGluZycKLWlmIE5vbmU6IHJhaXNlIFRlc3RGYWlsZWQsICdOb25lIGlzIHRydWUgaW5zdGVhZCBvZiBmYWxzZScKLWlmIDA6IHJhaXNlIFRlc3RGYWlsZWQsICcwIGlzIHRydWUgaW5zdGVhZCBvZiBmYWxzZScKLWlmIDBMOiByYWlzZSBUZXN0RmFpbGVkLCAnMEwgaXMgdHJ1ZSBpbnN0ZWFkIG9mIGZhbHNlJwotaWYgMC4wOiByYWlzZSBUZXN0RmFpbGVkLCAnMC4wIGlzIHRydWUgaW5zdGVhZCBvZiBmYWxzZScKLWlmICcnOiByYWlzZSBUZXN0RmFpbGVkLCAnXCdcJyBpcyB0cnVlIGluc3RlYWQgb2YgZmFsc2UnCi1pZiBub3QgMTogcmFpc2UgVGVzdEZhaWxlZCwgJzEgaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJwotaWYgbm90IDFMOiByYWlzZSBUZXN0RmFpbGVkLCAnMUwgaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJwotaWYgbm90IDEuMDogcmFpc2UgVGVzdEZhaWxlZCwgJzEuMCBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnCi1pZiBub3QgJ3gnOiByYWlzZSBUZXN0RmFpbGVkLCAnXCd4XCcgaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJwotaWYgbm90IHsneCc6IDF9OiByYWlzZSBUZXN0RmFpbGVkLCAne1wneFwnOiAxfSBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnCi1kZWYgZigpOiBwYXNzCi1jbGFzcyBDOiBwYXNzCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGhhdmVfdW5pY29kZQoraW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgc3lzCi14ID0gQygpCi1pZiBub3QgZjogcmFpc2UgVGVzdEZhaWxlZCwgJ2YgaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJwotaWYgbm90IEM6IHJhaXNlIFRlc3RGYWlsZWQsICdDIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScKLWlmIG5vdCBzeXM6IHJhaXNlIFRlc3RGYWlsZWQsICdzeXMgaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJwotaWYgbm90IHg6IHJhaXNlIFRlc3RGYWlsZWQsICd4IGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScKIAotcHJpbnQgJzYuMiBCb29sZWFuIG9wZXJhdGlvbnMnCi1pZiAwIG9yIDA6IHJhaXNlIFRlc3RGYWlsZWQsICcwIG9yIDAgaXMgdHJ1ZSBpbnN0ZWFkIG9mIGZhbHNlJwotaWYgMSBhbmQgMTogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgJzEgYW5kIDEgaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJwotaWYgbm90IDE6IHJhaXNlIFRlc3RGYWlsZWQsICdub3QgMSBpcyB0cnVlIGluc3RlYWQgb2YgZmFsc2UnCitjbGFzcyBUeXBlc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotcHJpbnQgJzYuMyBDb21wYXJpc29ucycKLWlmIDAgPCAxIDw9IDEgPT0gMSA+PSAxID4gMCAhPSAxOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAnaW50IGNvbXBhcmlzb25zIGZhaWxlZCcKLWlmIDBMIDwgMUwgPD0gMUwgPT0gMUwgPj0gMUwgPiAwTCAhPSAxTDogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgJ2xvbmcgaW50IGNvbXBhcmlzb25zIGZhaWxlZCcKLWlmIDAuMCA8IDEuMCA8PSAxLjAgPT0gMS4wID49IDEuMCA+IDAuMCAhPSAxLjA6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICdmbG9hdCBjb21wYXJpc29ucyBmYWlsZWQnCi1pZiAnJyA8ICdhJyA8PSAnYScgPT0gJ2EnIDwgJ2FiYycgPCAnYWJkJyA8ICdiJzogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgJ3N0cmluZyBjb21wYXJpc29ucyBmYWlsZWQnCi1pZiBOb25lIGlzIE5vbmU6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICdpZGVudGl0eSB0ZXN0IGZhaWxlZCcKKyAgICBkZWYgdGVzdF90cnV0aF92YWx1ZXMoc2VsZik6CisgICAgICAgIGlmIE5vbmU6IHNlbGYuZmFpbCgnTm9uZSBpcyB0cnVlIGluc3RlYWQgb2YgZmFsc2UnKQorICAgICAgICBpZiAwOiBzZWxmLmZhaWwoJzAgaXMgdHJ1ZSBpbnN0ZWFkIG9mIGZhbHNlJykKKyAgICAgICAgaWYgMEw6IHNlbGYuZmFpbCgnMEwgaXMgdHJ1ZSBpbnN0ZWFkIG9mIGZhbHNlJykKKyAgICAgICAgaWYgMC4wOiBzZWxmLmZhaWwoJzAuMCBpcyB0cnVlIGluc3RlYWQgb2YgZmFsc2UnKQorICAgICAgICBpZiAnJzogc2VsZi5mYWlsKCdcJ1wnIGlzIHRydWUgaW5zdGVhZCBvZiBmYWxzZScpCisgICAgICAgIGlmIG5vdCAxOiBzZWxmLmZhaWwoJzEgaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJykKKyAgICAgICAgaWYgbm90IDFMOiBzZWxmLmZhaWwoJzFMIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScpCisgICAgICAgIGlmIG5vdCAxLjA6IHNlbGYuZmFpbCgnMS4wIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScpCisgICAgICAgIGlmIG5vdCAneCc6IHNlbGYuZmFpbCgnXCd4XCcgaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJykKKyAgICAgICAgaWYgbm90IHsneCc6IDF9OiBzZWxmLmZhaWwoJ3tcJ3hcJzogMX0gaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJykKKyAgICAgICAgZGVmIGYoKTogcGFzcworICAgICAgICBjbGFzcyBDOiBwYXNzCisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgeCA9IEMoKQorICAgICAgICBpZiBub3QgZjogc2VsZi5mYWlsKCdmIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScpCisgICAgICAgIGlmIG5vdCBDOiBzZWxmLmZhaWwoJ0MgaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJykKKyAgICAgICAgaWYgbm90IHN5czogc2VsZi5mYWlsKCdzeXMgaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJykKKyAgICAgICAgaWYgbm90IHg6IHNlbGYuZmFpbCgneCBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnKQogCi10cnk6IGZsb2F0KCcnKQotZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICJmbG9hdCgnJykgZGlkbid0IHJhaXNlIFZhbHVlRXJyb3IiCisgICAgZGVmIHRlc3RfYm9vbGVhbl9vcHMoc2VsZik6CisgICAgICAgIGlmIDAgb3IgMDogc2VsZi5mYWlsKCcwIG9yIDAgaXMgdHJ1ZSBpbnN0ZWFkIG9mIGZhbHNlJykKKyAgICAgICAgaWYgMSBhbmQgMTogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJzEgYW5kIDEgaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJykKKyAgICAgICAgaWYgbm90IDE6IHNlbGYuZmFpbCgnbm90IDEgaXMgdHJ1ZSBpbnN0ZWFkIG9mIGZhbHNlJykKIAotdHJ5OiBmbG9hdCgnNVwwJykKLWV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAiZmxvYXQoJzVcMCcpIGRpZG4ndCByYWlzZSBWYWx1ZUVycm9yIgorICAgIGRlZiB0ZXN0X2NvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICBpZiAwIDwgMSA8PSAxID09IDEgPj0gMSA+IDAgIT0gMTogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2ludCBjb21wYXJpc29ucyBmYWlsZWQnKQorICAgICAgICBpZiAwTCA8IDFMIDw9IDFMID09IDFMID49IDFMID4gMEwgIT0gMUw6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCdsb25nIGludCBjb21wYXJpc29ucyBmYWlsZWQnKQorICAgICAgICBpZiAwLjAgPCAxLjAgPD0gMS4wID09IDEuMCA+PSAxLjAgPiAwLjAgIT0gMS4wOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnZmxvYXQgY29tcGFyaXNvbnMgZmFpbGVkJykKKyAgICAgICAgaWYgJycgPCAnYScgPD0gJ2EnID09ICdhJyA8ICdhYmMnIDwgJ2FiZCcgPCAnYic6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCdzdHJpbmcgY29tcGFyaXNvbnMgZmFpbGVkJykKKyAgICAgICAgaWYgTm9uZSBpcyBOb25lOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnaWRlbnRpdHkgdGVzdCBmYWlsZWQnKQogCi10cnk6IDUuMCAvIDAuMAotZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAiNS4wIC8gMC4wIGRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIKKyAgICBkZWYgdGVzdF9mbG9hdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgJzVcMCcpCiAKLXRyeTogNS4wIC8vIDAuMAotZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAiNS4wIC8vIDAuMCBkaWRuJ3QgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IiCisgICAgZGVmIHRlc3RfemVyb19kaXZpc2lvbihzZWxmKToKKyAgICAgICAgdHJ5OiA1LjAgLyAwLjAKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiNS4wIC8gMC4wIGRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIpCiAKLXRyeTogNS4wICUgMC4wCi1leGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICI1LjAgJSAwLjAgZGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIgorICAgICAgICB0cnk6IDUuMCAvLyAwLjAKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiNS4wIC8vIDAuMCBkaWRuJ3QgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IiKQogCi10cnk6IDUgLyAwTAotZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAiNSAvIDBMIGRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIKKyAgICAgICAgdHJ5OiA1LjAgJSAwLjAKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiNS4wICUgMC4wIGRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIpCiAKLXRyeTogNSAvLyAwTAotZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAiNSAvLyAwTCBkaWRuJ3QgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IiCisgICAgICAgIHRyeTogNSAvIDBMCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoIjUgLyAwTCBkaWRuJ3QgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IiKQogCi10cnk6IDUgJSAwTAotZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAiNSAlIDBMIGRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIKKyAgICAgICAgdHJ5OiA1IC8vIDBMCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoIjUgLy8gMEwgZGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIikKIAotcHJpbnQgJzYuNCBOdW1lcmljIHR5cGVzIChtb3N0bHkgY29udmVyc2lvbnMpJwotaWYgMCAhPSAwTCBvciAwICE9IDAuMCBvciAwTCAhPSAwLjA6IHJhaXNlIFRlc3RGYWlsZWQsICdtaXhlZCBjb21wYXJpc29ucycKLWlmIDEgIT0gMUwgb3IgMSAhPSAxLjAgb3IgMUwgIT0gMS4wOiByYWlzZSBUZXN0RmFpbGVkLCAnbWl4ZWQgY29tcGFyaXNvbnMnCi1pZiAtMSAhPSAtMUwgb3IgLTEgIT0gLTEuMCBvciAtMUwgIT0gLTEuMDoKLSAgICByYWlzZSBUZXN0RmFpbGVkLCAnaW50L2xvbmcvZmxvYXQgdmFsdWUgbm90IGVxdWFsJwotIyBjYWxsaW5nIGJ1aWx0LWluIHR5cGVzIHdpdGhvdXQgYXJndW1lbnQgbXVzdCByZXR1cm4gMAotaWYgaW50KCkgIT0gMDogcmFpc2UgVGVzdEZhaWxlZCwgJ2ludCgpIGRvZXMgbm90IHJldHVybiAwJwotaWYgbG9uZygpICE9IDBMOiByYWlzZSBUZXN0RmFpbGVkLCAnbG9uZygpIGRvZXMgbm90IHJldHVybiAwTCcKLWlmIGZsb2F0KCkgIT0gMC4wOiByYWlzZSBUZXN0RmFpbGVkLCAnZmxvYXQoKSBkb2VzIG5vdCByZXR1cm4gMC4wJwotaWYgaW50KDEuOSkgPT0gMSA9PSBpbnQoMS4xKSBhbmQgaW50KC0xLjEpID09IC0xID09IGludCgtMS45KTogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgJ2ludCgpIGRvZXMgbm90IHJvdW5kIHByb3Blcmx5JwotaWYgbG9uZygxLjkpID09IDFMID09IGxvbmcoMS4xKSBhbmQgbG9uZygtMS4xKSA9PSAtMUwgPT0gbG9uZygtMS45KTogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgJ2xvbmcoKSBkb2VzIG5vdCByb3VuZCBwcm9wZXJseScKLWlmIGZsb2F0KDEpID09IDEuMCBhbmQgZmxvYXQoLTEpID09IC0xLjAgYW5kIGZsb2F0KDApID09IDAuMDogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgJ2Zsb2F0KCkgZG9lcyBub3Qgd29yayBwcm9wZXJseScKLXByaW50ICc2LjQuMSAzMi1iaXQgaW50ZWdlcnMnCi0jIEVuc3VyZSB0aGUgZmlyc3QgMjU2IGludGVnZXJzIGFyZSBzaGFyZWQKLWEgPSAyNTYKLWIgPSAxMjgqMgotaWYgYSBpcyBub3QgYjogcmFpc2UgVGVzdEZhaWxlZCwgJzI1NiBpcyBub3Qgc2hhcmVkJwotaWYgMTIgKyAyNCAhPSAzNjogcmFpc2UgVGVzdEZhaWxlZCwgJ2ludCBvcCcKLWlmIDEyICsgKC0yNCkgIT0gLTEyOiByYWlzZSBUZXN0RmFpbGVkLCAnaW50IG9wJwotaWYgKC0xMikgKyAyNCAhPSAxMjogcmFpc2UgVGVzdEZhaWxlZCwgJ2ludCBvcCcKLWlmICgtMTIpICsgKC0yNCkgIT0gLTM2OiByYWlzZSBUZXN0RmFpbGVkLCAnaW50IG9wJwotaWYgbm90IDEyIDwgMjQ6IHJhaXNlIFRlc3RGYWlsZWQsICdpbnQgb3AnCi1pZiBub3QgLTI0IDwgLTEyOiByYWlzZSBUZXN0RmFpbGVkLCAnaW50IG9wJwotIyBUZXN0IGZvciBhIHBhcnRpY3VsYXIgYnVnIGluIGludGVnZXIgbXVsdGlwbHkKLXhzaXplLCB5c2l6ZSwgenNpemUgPSAyMzgsIDM1NiwgNAotaWYgbm90ICh4c2l6ZSp5c2l6ZSp6c2l6ZSA9PSB6c2l6ZSp4c2l6ZSp5c2l6ZSA9PSAzMzg5MTIpOgotICAgIHJhaXNlIFRlc3RGYWlsZWQsICdpbnQgbXVsIGNvbW11dGF0aXZpdHknCi0jIEFuZCBhbm90aGVyLgotbSA9IC1zeXMubWF4aW50IC0gMQotZm9yIGRpdmlzb3IgaW4gMSwgMiwgNCwgOCwgMTYsIDMyOgotICAgIGogPSBtIC8vIGRpdmlzb3IKLSAgICBwcm9kID0gZGl2aXNvciAqIGoKLSAgICBpZiBwcm9kICE9IG06Ci0gICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsICIlciAqICVyID09ICVyICE9ICVyIiAlIChkaXZpc29yLCBqLCBwcm9kLCBtKQotICAgIGlmIHR5cGUocHJvZCkgaXMgbm90IGludDoKLSAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgKCJleHBlY3RlZCB0eXBlKHByb2QpIHRvIGJlIGludCwgbm90ICVyIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKHByb2QpKQotIyBDaGVjayBmb3IgZXhwZWN0ZWQgKiBvdmVyZmxvdyB0byBsb25nLgotZm9yIGRpdmlzb3IgaW4gMSwgMiwgNCwgOCwgMTYsIDMyOgotICAgIGogPSBtIC8vIGRpdmlzb3IgLSAxCi0gICAgcHJvZCA9IGRpdmlzb3IgKiBqCi0gICAgaWYgdHlwZShwcm9kKSBpcyBub3QgbG9uZzoKLSAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgKCJleHBlY3RlZCB0eXBlKCVyKSB0byBiZSBsb25nLCBub3QgJXIiICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9kLCB0eXBlKHByb2QpKSkKLSMgQ2hlY2sgZm9yIGV4cGVjdGVkICogb3ZlcmZsb3cgdG8gbG9uZy4KLW0gPSBzeXMubWF4aW50Ci1mb3IgZGl2aXNvciBpbiAxLCAyLCA0LCA4LCAxNiwgMzI6Ci0gICAgaiA9IG0gLy8gZGl2aXNvciArIDEKLSAgICBwcm9kID0gZGl2aXNvciAqIGoKLSAgICBpZiB0eXBlKHByb2QpIGlzIG5vdCBsb25nOgotICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAoImV4cGVjdGVkIHR5cGUoJXIpIHRvIGJlIGxvbmcsIG5vdCAlciIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2QsIHR5cGUocHJvZCkpKQorICAgICAgICB0cnk6IDUgJSAwTAorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCI1ICUgMEwgZGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIikKIAotcHJpbnQgJzYuNC4yIExvbmcgaW50ZWdlcnMnCi1pZiAxMkwgKyAyNEwgIT0gMzZMOiByYWlzZSBUZXN0RmFpbGVkLCAnbG9uZyBvcCcKLWlmIDEyTCArICgtMjRMKSAhPSAtMTJMOiByYWlzZSBUZXN0RmFpbGVkLCAnbG9uZyBvcCcKLWlmICgtMTJMKSArIDI0TCAhPSAxMkw6IHJhaXNlIFRlc3RGYWlsZWQsICdsb25nIG9wJwotaWYgKC0xMkwpICsgKC0yNEwpICE9IC0zNkw6IHJhaXNlIFRlc3RGYWlsZWQsICdsb25nIG9wJwotaWYgbm90IDEyTCA8IDI0TDogcmFpc2UgVGVzdEZhaWxlZCwgJ2xvbmcgb3AnCi1pZiBub3QgLTI0TCA8IC0xMkw6IHJhaXNlIFRlc3RGYWlsZWQsICdsb25nIG9wJwoteCA9IHN5cy5tYXhpbnQKLWlmIGludChsb25nKHgpKSAhPSB4OiByYWlzZSBUZXN0RmFpbGVkLCAnbG9uZyBvcCcKLXRyeTogeSA9IGludChsb25nKHgpKzFMKQotZXhjZXB0IE92ZXJmbG93RXJyb3I6IHJhaXNlIFRlc3RGYWlsZWQsICdsb25nIG9wJwotaWYgbm90IGlzaW5zdGFuY2UoeSwgbG9uZyk6IHJhaXNlIFRlc3RGYWlsZWQsICdsb25nIG9wJwoteCA9IC14Ci1pZiBpbnQobG9uZyh4KSkgIT0geDogcmFpc2UgVGVzdEZhaWxlZCwgJ2xvbmcgb3AnCi14ID0geC0xCi1pZiBpbnQobG9uZyh4KSkgIT0geDogcmFpc2UgVGVzdEZhaWxlZCwgJ2xvbmcgb3AnCi10cnk6IHkgPSBpbnQobG9uZyh4KS0xTCkKLWV4Y2VwdCBPdmVyZmxvd0Vycm9yOiByYWlzZSBUZXN0RmFpbGVkLCAnbG9uZyBvcCcKLWlmIG5vdCBpc2luc3RhbmNlKHksIGxvbmcpOiByYWlzZSBUZXN0RmFpbGVkLCAnbG9uZyBvcCcKKyAgICBkZWYgdGVzdF9udW1lcmljX3R5cGVzKHNlbGYpOgorICAgICAgICBpZiAwICE9IDBMIG9yIDAgIT0gMC4wIG9yIDBMICE9IDAuMDogc2VsZi5mYWlsKCdtaXhlZCBjb21wYXJpc29ucycpCisgICAgICAgIGlmIDEgIT0gMUwgb3IgMSAhPSAxLjAgb3IgMUwgIT0gMS4wOiBzZWxmLmZhaWwoJ21peGVkIGNvbXBhcmlzb25zJykKKyAgICAgICAgaWYgLTEgIT0gLTFMIG9yIC0xICE9IC0xLjAgb3IgLTFMICE9IC0xLjA6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2ludC9sb25nL2Zsb2F0IHZhbHVlIG5vdCBlcXVhbCcpCisgICAgICAgICMgY2FsbGluZyBidWlsdC1pbiB0eXBlcyB3aXRob3V0IGFyZ3VtZW50IG11c3QgcmV0dXJuIDAKKyAgICAgICAgaWYgaW50KCkgIT0gMDogc2VsZi5mYWlsKCdpbnQoKSBkb2VzIG5vdCByZXR1cm4gMCcpCisgICAgICAgIGlmIGxvbmcoKSAhPSAwTDogc2VsZi5mYWlsKCdsb25nKCkgZG9lcyBub3QgcmV0dXJuIDBMJykKKyAgICAgICAgaWYgZmxvYXQoKSAhPSAwLjA6IHNlbGYuZmFpbCgnZmxvYXQoKSBkb2VzIG5vdCByZXR1cm4gMC4wJykKKyAgICAgICAgaWYgaW50KDEuOSkgPT0gMSA9PSBpbnQoMS4xKSBhbmQgaW50KC0xLjEpID09IC0xID09IGludCgtMS45KTogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2ludCgpIGRvZXMgbm90IHJvdW5kIHByb3Blcmx5JykKKyAgICAgICAgaWYgbG9uZygxLjkpID09IDFMID09IGxvbmcoMS4xKSBhbmQgbG9uZygtMS4xKSA9PSAtMUwgPT0gbG9uZygtMS45KTogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2xvbmcoKSBkb2VzIG5vdCByb3VuZCBwcm9wZXJseScpCisgICAgICAgIGlmIGZsb2F0KDEpID09IDEuMCBhbmQgZmxvYXQoLTEpID09IC0xLjAgYW5kIGZsb2F0KDApID09IDAuMDogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2Zsb2F0KCkgZG9lcyBub3Qgd29yayBwcm9wZXJseScpCiAKLXRyeTogNSA8PCAtNQotZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICdpbnQgbmVnYXRpdmUgc2hpZnQgPDwnCisgICAgZGVmIHRlc3Rfbm9ybWFsX2ludGVnZXJzKHNlbGYpOgorICAgICAgICAjIEVuc3VyZSB0aGUgZmlyc3QgMjU2IGludGVnZXJzIGFyZSBzaGFyZWQKKyAgICAgICAgYSA9IDI1NgorICAgICAgICBiID0gMTI4KjIKKyAgICAgICAgaWYgYSBpcyBub3QgYjogc2VsZi5mYWlsKCcyNTYgaXMgbm90IHNoYXJlZCcpCisgICAgICAgIGlmIDEyICsgMjQgIT0gMzY6IHNlbGYuZmFpbCgnaW50IG9wJykKKyAgICAgICAgaWYgMTIgKyAoLTI0KSAhPSAtMTI6IHNlbGYuZmFpbCgnaW50IG9wJykKKyAgICAgICAgaWYgKC0xMikgKyAyNCAhPSAxMjogc2VsZi5mYWlsKCdpbnQgb3AnKQorICAgICAgICBpZiAoLTEyKSArICgtMjQpICE9IC0zNjogc2VsZi5mYWlsKCdpbnQgb3AnKQorICAgICAgICBpZiBub3QgMTIgPCAyNDogc2VsZi5mYWlsKCdpbnQgb3AnKQorICAgICAgICBpZiBub3QgLTI0IDwgLTEyOiBzZWxmLmZhaWwoJ2ludCBvcCcpCisgICAgICAgICMgVGVzdCBmb3IgYSBwYXJ0aWN1bGFyIGJ1ZyBpbiBpbnRlZ2VyIG11bHRpcGx5CisgICAgICAgIHhzaXplLCB5c2l6ZSwgenNpemUgPSAyMzgsIDM1NiwgNAorICAgICAgICBpZiBub3QgKHhzaXplKnlzaXplKnpzaXplID09IHpzaXplKnhzaXplKnlzaXplID09IDMzODkxMik6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2ludCBtdWwgY29tbXV0YXRpdml0eScpCisgICAgICAgICMgQW5kIGFub3RoZXIuCisgICAgICAgIG0gPSAtc3lzLm1heGludCAtIDEKKyAgICAgICAgZm9yIGRpdmlzb3IgaW4gMSwgMiwgNCwgOCwgMTYsIDMyOgorICAgICAgICAgICAgaiA9IG0gLy8gZGl2aXNvcgorICAgICAgICAgICAgcHJvZCA9IGRpdmlzb3IgKiBqCisgICAgICAgICAgICBpZiBwcm9kICE9IG06CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCIlciAqICVyID09ICVyICE9ICVyIiAlIChkaXZpc29yLCBqLCBwcm9kLCBtKSkKKyAgICAgICAgICAgIGlmIHR5cGUocHJvZCkgaXMgbm90IGludDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIHR5cGUocHJvZCkgdG8gYmUgaW50LCBub3QgJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShwcm9kKSkKKyAgICAgICAgIyBDaGVjayBmb3IgZXhwZWN0ZWQgKiBvdmVyZmxvdyB0byBsb25nLgorICAgICAgICBmb3IgZGl2aXNvciBpbiAxLCAyLCA0LCA4LCAxNiwgMzI6CisgICAgICAgICAgICBqID0gbSAvLyBkaXZpc29yIC0gMQorICAgICAgICAgICAgcHJvZCA9IGRpdmlzb3IgKiBqCisgICAgICAgICAgICBpZiB0eXBlKHByb2QpIGlzIG5vdCBsb25nOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgdHlwZSglcikgdG8gYmUgbG9uZywgbm90ICVyIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9kLCB0eXBlKHByb2QpKSkKKyAgICAgICAgIyBDaGVjayBmb3IgZXhwZWN0ZWQgKiBvdmVyZmxvdyB0byBsb25nLgorICAgICAgICBtID0gc3lzLm1heGludAorICAgICAgICBmb3IgZGl2aXNvciBpbiAxLCAyLCA0LCA4LCAxNiwgMzI6CisgICAgICAgICAgICBqID0gbSAvLyBkaXZpc29yICsgMQorICAgICAgICAgICAgcHJvZCA9IGRpdmlzb3IgKiBqCisgICAgICAgICAgICBpZiB0eXBlKHByb2QpIGlzIG5vdCBsb25nOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgdHlwZSglcikgdG8gYmUgbG9uZywgbm90ICVyIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9kLCB0eXBlKHByb2QpKSkKIAotdHJ5OiA1TCA8PCAtNUwKLWV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAnbG9uZyBuZWdhdGl2ZSBzaGlmdCA8PCcKKyAgICBkZWYgdGVzdF9sb25nX2ludGVnZXJzKHNlbGYpOgorICAgICAgICBpZiAxMkwgKyAyNEwgIT0gMzZMOiBzZWxmLmZhaWwoJ2xvbmcgb3AnKQorICAgICAgICBpZiAxMkwgKyAoLTI0TCkgIT0gLTEyTDogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgaWYgKC0xMkwpICsgMjRMICE9IDEyTDogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgaWYgKC0xMkwpICsgKC0yNEwpICE9IC0zNkw6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIGlmIG5vdCAxMkwgPCAyNEw6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIGlmIG5vdCAtMjRMIDwgLTEyTDogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgeCA9IHN5cy5tYXhpbnQKKyAgICAgICAgaWYgaW50KGxvbmcoeCkpICE9IHg6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIHRyeTogeSA9IGludChsb25nKHgpKzFMKQorICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoeSwgbG9uZyk6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIHggPSAteAorICAgICAgICBpZiBpbnQobG9uZyh4KSkgIT0geDogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgeCA9IHgtMQorICAgICAgICBpZiBpbnQobG9uZyh4KSkgIT0geDogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgdHJ5OiB5ID0gaW50KGxvbmcoeCktMUwpCisgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOiBzZWxmLmZhaWwoJ2xvbmcgb3AnKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh5LCBsb25nKTogc2VsZi5mYWlsKCdsb25nIG9wJykKIAotdHJ5OiA1ID4+IC01Ci1leGNlcHQgVmFsdWVFcnJvcjogcGFzcwotZWxzZTogcmFpc2UgVGVzdEZhaWxlZCwgJ2ludCBuZWdhdGl2ZSBzaGlmdCA+PicKKyAgICAgICAgdHJ5OiA1IDw8IC01CisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnaW50IG5lZ2F0aXZlIHNoaWZ0IDw8JykKIAotdHJ5OiA1TCA+PiAtNUwKLWV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAnbG9uZyBuZWdhdGl2ZSBzaGlmdCA+PicKKyAgICAgICAgdHJ5OiA1TCA8PCAtNUwKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCdsb25nIG5lZ2F0aXZlIHNoaWZ0IDw8JykKIAotcHJpbnQgJzYuNC4zIEZsb2F0aW5nIHBvaW50IG51bWJlcnMnCi1pZiAxMi4wICsgMjQuMCAhPSAzNi4wOiByYWlzZSBUZXN0RmFpbGVkLCAnZmxvYXQgb3AnCi1pZiAxMi4wICsgKC0yNC4wKSAhPSAtMTIuMDogcmFpc2UgVGVzdEZhaWxlZCwgJ2Zsb2F0IG9wJwotaWYgKC0xMi4wKSArIDI0LjAgIT0gMTIuMDogcmFpc2UgVGVzdEZhaWxlZCwgJ2Zsb2F0IG9wJwotaWYgKC0xMi4wKSArICgtMjQuMCkgIT0gLTM2LjA6IHJhaXNlIFRlc3RGYWlsZWQsICdmbG9hdCBvcCcKLWlmIG5vdCAxMi4wIDwgMjQuMDogcmFpc2UgVGVzdEZhaWxlZCwgJ2Zsb2F0IG9wJwotaWYgbm90IC0yNC4wIDwgLTEyLjA6IHJhaXNlIFRlc3RGYWlsZWQsICdmbG9hdCBvcCcKKyAgICAgICAgdHJ5OiA1ID4+IC01CisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnaW50IG5lZ2F0aXZlIHNoaWZ0ID4+JykKIAotcHJpbnQgJzYuNSBTZXF1ZW5jZSB0eXBlcycKKyAgICAgICAgdHJ5OiA1TCA+PiAtNUwKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCdsb25nIG5lZ2F0aXZlIHNoaWZ0ID4+JykKIAotcHJpbnQgJzYuNS4xIFN0cmluZ3MnCi1pZiBsZW4oJycpICE9IDA6IHJhaXNlIFRlc3RGYWlsZWQsICdsZW4oXCdcJyknCi1pZiBsZW4oJ2EnKSAhPSAxOiByYWlzZSBUZXN0RmFpbGVkLCAnbGVuKFwnYVwnKScKLWlmIGxlbignYWJjZGVmJykgIT0gNjogcmFpc2UgVGVzdEZhaWxlZCwgJ2xlbihcJ2FiY2RlZlwnKScKLWlmICd4eXonICsgJ2FiY2RlJyAhPSAneHl6YWJjZGUnOiByYWlzZSBUZXN0RmFpbGVkLCAnc3RyaW5nIGNvbmNhdGVuYXRpb24nCi1pZiAneHl6JyozICE9ICd4eXp4eXp4eXonOiByYWlzZSBUZXN0RmFpbGVkLCAnc3RyaW5nIHJlcGV0aXRpb24gKjMnCi1pZiAwKidhYmNkZScgIT0gJyc6IHJhaXNlIFRlc3RGYWlsZWQsICdzdHJpbmcgcmVwZXRpdGlvbiAwKicKLWlmIG1pbignYWJjJykgIT0gJ2EnIG9yIG1heCgnYWJjJykgIT0gJ2MnOiByYWlzZSBUZXN0RmFpbGVkLCAnbWluL21heCBzdHJpbmcnCi1pZiAnYScgaW4gJ2FiYycgYW5kICdiJyBpbiAnYWJjJyBhbmQgJ2MnIGluICdhYmMnIGFuZCAnZCcgbm90IGluICdhYmMnOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAnaW4vbm90IGluIHN0cmluZycKLXggPSAneCcqMTAzCi1pZiAnJXMhJyV4ICE9IHgrJyEnOiByYWlzZSBUZXN0RmFpbGVkLCAnbmFzdHkgc3RyaW5nIGZvcm1hdHRpbmcgYnVnJworICAgIGRlZiB0ZXN0X2Zsb2F0cyhzZWxmKToKKyAgICAgICAgaWYgMTIuMCArIDI0LjAgIT0gMzYuMDogc2VsZi5mYWlsKCdmbG9hdCBvcCcpCisgICAgICAgIGlmIDEyLjAgKyAoLTI0LjApICE9IC0xMi4wOiBzZWxmLmZhaWwoJ2Zsb2F0IG9wJykKKyAgICAgICAgaWYgKC0xMi4wKSArIDI0LjAgIT0gMTIuMDogc2VsZi5mYWlsKCdmbG9hdCBvcCcpCisgICAgICAgIGlmICgtMTIuMCkgKyAoLTI0LjApICE9IC0zNi4wOiBzZWxmLmZhaWwoJ2Zsb2F0IG9wJykKKyAgICAgICAgaWYgbm90IDEyLjAgPCAyNC4wOiBzZWxmLmZhaWwoJ2Zsb2F0IG9wJykKKyAgICAgICAgaWYgbm90IC0yNC4wIDwgLTEyLjA6IHNlbGYuZmFpbCgnZmxvYXQgb3AnKQogCi0jZXh0ZW5kZWQgc2xpY2VzIGZvciBzdHJpbmdzCi1hID0gJzAxMjM0NTY3ODknCi12ZXJlcShhWzo6XSwgYSkKLXZlcmVxKGFbOjoyXSwgJzAyNDY4JykKLXZlcmVxKGFbMTo6Ml0sICcxMzU3OScpCi12ZXJlcShhWzo6LTFdLCc5ODc2NTQzMjEwJykKLXZlcmVxKGFbOjotMl0sICc5NzUzMScpCi12ZXJlcShhWzM6Oi0yXSwgJzMxJykKLXZlcmVxKGFbLTEwMDoxMDA6XSwgYSkKLXZlcmVxKGFbMTAwOi0xMDA6LTFdLCBhWzo6LTFdKQotdmVyZXEoYVstMTAwTDoxMDBMOjJMXSwgJzAyNDY4JykKKyAgICBkZWYgdGVzdF9zdHJpbmdzKHNlbGYpOgorICAgICAgICBpZiBsZW4oJycpICE9IDA6IHNlbGYuZmFpbCgnbGVuKFwnXCcpJykKKyAgICAgICAgaWYgbGVuKCdhJykgIT0gMTogc2VsZi5mYWlsKCdsZW4oXCdhXCcpJykKKyAgICAgICAgaWYgbGVuKCdhYmNkZWYnKSAhPSA2OiBzZWxmLmZhaWwoJ2xlbihcJ2FiY2RlZlwnKScpCisgICAgICAgIGlmICd4eXonICsgJ2FiY2RlJyAhPSAneHl6YWJjZGUnOiBzZWxmLmZhaWwoJ3N0cmluZyBjb25jYXRlbmF0aW9uJykKKyAgICAgICAgaWYgJ3h5eicqMyAhPSAneHl6eHl6eHl6Jzogc2VsZi5mYWlsKCdzdHJpbmcgcmVwZXRpdGlvbiAqMycpCisgICAgICAgIGlmIDAqJ2FiY2RlJyAhPSAnJzogc2VsZi5mYWlsKCdzdHJpbmcgcmVwZXRpdGlvbiAwKicpCisgICAgICAgIGlmIG1pbignYWJjJykgIT0gJ2EnIG9yIG1heCgnYWJjJykgIT0gJ2MnOiBzZWxmLmZhaWwoJ21pbi9tYXggc3RyaW5nJykKKyAgICAgICAgaWYgJ2EnIGluICdhYmMnIGFuZCAnYicgaW4gJ2FiYycgYW5kICdjJyBpbiAnYWJjJyBhbmQgJ2QnIG5vdCBpbiAnYWJjJzogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2luL25vdCBpbiBzdHJpbmcnKQorICAgICAgICB4ID0gJ3gnKjEwMworICAgICAgICBpZiAnJXMhJyV4ICE9IHgrJyEnOiBzZWxmLmZhaWwoJ25hc3R5IHN0cmluZyBmb3JtYXR0aW5nIGJ1ZycpCiAKLWlmIGhhdmVfdW5pY29kZToKLSAgICBhID0gdW5pY29kZSgnMDEyMzQ1Njc4OScsICdhc2NpaScpCi0gICAgdmVyZXEoYVs6Ol0sIGEpCi0gICAgdmVyZXEoYVs6OjJdLCB1bmljb2RlKCcwMjQ2OCcsICdhc2NpaScpKQotICAgIHZlcmVxKGFbMTo6Ml0sIHVuaWNvZGUoJzEzNTc5JywgJ2FzY2lpJykpCi0gICAgdmVyZXEoYVs6Oi0xXSwgdW5pY29kZSgnOTg3NjU0MzIxMCcsICdhc2NpaScpKQotICAgIHZlcmVxKGFbOjotMl0sIHVuaWNvZGUoJzk3NTMxJywgJ2FzY2lpJykpCi0gICAgdmVyZXEoYVszOjotMl0sIHVuaWNvZGUoJzMxJywgJ2FzY2lpJykpCi0gICAgdmVyZXEoYVstMTAwOjEwMDpdLCBhKQotICAgIHZlcmVxKGFbMTAwOi0xMDA6LTFdLCBhWzo6LTFdKQotICAgIHZlcmVxKGFbLTEwMEw6MTAwTDoyTF0sIHVuaWNvZGUoJzAyNDY4JywgJ2FzY2lpJykpCisgICAgICAgICNleHRlbmRlZCBzbGljZXMgZm9yIHN0cmluZ3MKKyAgICAgICAgYSA9ICcwMTIzNDU2Nzg5JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjpdLCBhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjoyXSwgJzAyNDY4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzE6OjJdLCAnMTM1NzknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjotMV0sJzk4NzY1NDMyMTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjotMl0sICc5NzUzMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVszOjotMl0sICczMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVstMTAwOjEwMDpdLCBhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMTAwOi0xMDA6LTFdLCBhWzo6LTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTEwMEw6MTAwTDoyTF0sICcwMjQ2OCcpCisKKyAgICAgICAgaWYgaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgYSA9IHVuaWNvZGUoJzAxMjM0NTY3ODknLCAnYXNjaWknKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzo6XSwgYSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6OjJdLCB1bmljb2RlKCcwMjQ2OCcsICdhc2NpaScpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzE6OjJdLCB1bmljb2RlKCcxMzU3OScsICdhc2NpaScpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzo6LTFdLCB1bmljb2RlKCc5ODc2NTQzMjEwJywgJ2FzY2lpJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjotMl0sIHVuaWNvZGUoJzk3NTMxJywgJ2FzY2lpJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMzo6LTJdLCB1bmljb2RlKCczMScsICdhc2NpaScpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWy0xMDA6MTAwOl0sIGEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMTAwOi0xMDA6LTFdLCBhWzo6LTFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWy0xMDBMOjEwMEw6MkxdLCB1bmljb2RlKCcwMjQ2OCcsICdhc2NpaScpKQogCiAKLXByaW50ICc2LjUuMiBUdXBsZXMgW3NlZSB0ZXN0X3R1cGxlLnB5XScKKyAgICBkZWYgdGVzdF90eXBlX2Z1bmN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHR5cGUsIDEsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHlwZSwgMSwgMiwgMywgNCkKIAotcHJpbnQgJzYuNS4zIExpc3RzIFtzZWUgdGVzdF9saXN0LnB5XScKKyAgICBkZWYgdGVzdF9idWZmZXJzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBidWZmZXIsICdhc2RmJywgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYnVmZmVyLCBOb25lKQogCi1wcmludCAnNi42IE1hcHBpbmdzID09IERpY3Rpb25hcmllcyBbc2VlIHRlc3RfZGljdC5weV0nCisgICAgICAgIGEgPSBidWZmZXIoJ2FzZGYnKQorICAgICAgICBoYXNoKGEpCisgICAgICAgIGIgPSBhICogNQorICAgICAgICBpZiBhID09IGI6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2J1ZmZlcnMgc2hvdWxkIG5vdCBiZSBlcXVhbCcpCisgICAgICAgIGlmIHN0cihiKSAhPSAoJ2FzZGYnICogNSk6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ3JlcGVhdGVkIGJ1ZmZlciBoYXMgd3JvbmcgY29udGVudCcpCisgICAgICAgIGlmIHN0cihhICogMCkgIT0gJyc6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ3JlcGVhdGVkIGJ1ZmZlciB6ZXJvIHRpbWVzIGhhcyB3cm9uZyBjb250ZW50JykKKyAgICAgICAgaWYgc3RyKGEgKyBidWZmZXIoJ2RlZicpKSAhPSAnYXNkZmRlZic6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2NvbmNhdGVuYXRpb24gb2YgYnVmZmVycyB5aWVsZHMgd3JvbmcgY29udGVudCcpCisgICAgICAgIGlmIHN0cihidWZmZXIoYSkpICE9ICdhc2RmJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnY29tcG9zaW5nIGJ1ZmZlcnMgZmFpbGVkJykKKyAgICAgICAgaWYgc3RyKGJ1ZmZlcihhLCAyKSkgIT0gJ2RmJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnc3BlY2lmeWluZyBidWZmZXIgb2Zmc2V0IGZhaWxlZCcpCisgICAgICAgIGlmIHN0cihidWZmZXIoYSwgMCwgMikpICE9ICdhcyc6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ3NwZWNpZnlpbmcgYnVmZmVyIHNpemUgZmFpbGVkJykKKyAgICAgICAgaWYgc3RyKGJ1ZmZlcihhLCAxLCAyKSkgIT0gJ3NkJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnc3BlY2lmeWluZyBidWZmZXIgb2Zmc2V0IGFuZCBzaXplIGZhaWxlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmZlciwgYnVmZmVyKCdhc2RmJywgMSksIC0xKQorICAgICAgICBpZiBzdHIoYnVmZmVyKGJ1ZmZlcignYXNkZicsIDAsIDIpLCAwKSkgIT0gJ2FzJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnY29tcG9zaW5nIGxlbmd0aC1zcGVjaWZpZWQgYnVmZmVyIGZhaWxlZCcpCisgICAgICAgIGlmIHN0cihidWZmZXIoYnVmZmVyKCdhc2RmJywgMCwgMiksIDAsIDUwMDApKSAhPSAnYXMnOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdjb21wb3NpbmcgbGVuZ3RoLXNwZWNpZmllZCBidWZmZXIgZmFpbGVkJykKKyAgICAgICAgaWYgc3RyKGJ1ZmZlcihidWZmZXIoJ2FzZGYnLCAwLCAyKSwgMCwgLTEpKSAhPSAnYXMnOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdjb21wb3NpbmcgbGVuZ3RoLXNwZWNpZmllZCBidWZmZXIgZmFpbGVkJykKKyAgICAgICAgaWYgc3RyKGJ1ZmZlcihidWZmZXIoJ2FzZGYnLCAwLCAyKSwgMSwgMikpICE9ICdzJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnY29tcG9zaW5nIGxlbmd0aC1zcGVjaWZpZWQgYnVmZmVyIGZhaWxlZCcpCiAKKyAgICAgICAgdHJ5OiBhWzFdID0gJ2cnCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCJidWZmZXIgYXNzaWdubWVudCBzaG91bGQgcmFpc2UgVHlwZUVycm9yIikKIAotdHJ5OiB0eXBlKDEsIDIpCi1leGNlcHQgVHlwZUVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAndHlwZSgpLCB3LzIgYXJncyBleHBlY3RlZCBUeXBlRXJyb3InCisgICAgICAgIHRyeTogYVswOjFdID0gJ2cnCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCJidWZmZXIgc2xpY2UgYXNzaWdubWVudCBzaG91bGQgcmFpc2UgVHlwZUVycm9yIikKIAotdHJ5OiB0eXBlKDEsIDIsIDMsIDQpCi1leGNlcHQgVHlwZUVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAndHlwZSgpLCB3LzQgYXJncyBleHBlY3RlZCBUeXBlRXJyb3InCisgICAgICAgICMgYXJyYXkuYXJyYXkoKSByZXR1cm5zIGFuIG9iamVjdCB0aGF0IGRvZXMgbm90IGltcGxlbWVudCBhIGNoYXIgYnVmZmVyLAorICAgICAgICAjIHNvbWV0aGluZyB3aGljaCBpbnQoKSB1c2VzIGZvciBjb252ZXJzaW9uLgorICAgICAgICBpbXBvcnQgYXJyYXkKKyAgICAgICAgdHJ5OiBpbnQoYnVmZmVyKGFycmF5LmFycmF5KCdjJykpKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiY2hhciBidWZmZXIgKGF0IEMgbGV2ZWwpIG5vdCB3b3JraW5nIikKIAotcHJpbnQgJ0J1ZmZlcnMnCi10cnk6IGJ1ZmZlcignYXNkZicsIC0xKQotZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICJidWZmZXIoJ2FzZGYnLCAtMSkgc2hvdWxkIHJhaXNlIFZhbHVlRXJyb3IiCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFR5cGVzVGVzdHMpCiAKLXRyeTogYnVmZmVyKE5vbmUpCi1leGNlcHQgVHlwZUVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAiYnVmZmVyKE5vbmUpIHNob3VsZCByYWlzZSBUeXBlRXJyb3IiCi0KLWEgPSBidWZmZXIoJ2FzZGYnKQotaGFzaChhKQotYiA9IGEgKiA1Ci1pZiBhID09IGI6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZCwgJ2J1ZmZlcnMgc2hvdWxkIG5vdCBiZSBlcXVhbCcKLWlmIHN0cihiKSAhPSAoJ2FzZGYnICogNSk6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZCwgJ3JlcGVhdGVkIGJ1ZmZlciBoYXMgd3JvbmcgY29udGVudCcKLWlmIHN0cihhICogMCkgIT0gJyc6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZCwgJ3JlcGVhdGVkIGJ1ZmZlciB6ZXJvIHRpbWVzIGhhcyB3cm9uZyBjb250ZW50JwotaWYgc3RyKGEgKyBidWZmZXIoJ2RlZicpKSAhPSAnYXNkZmRlZic6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZCwgJ2NvbmNhdGVuYXRpb24gb2YgYnVmZmVycyB5aWVsZHMgd3JvbmcgY29udGVudCcKLWlmIHN0cihidWZmZXIoYSkpICE9ICdhc2RmJzoKLSAgICByYWlzZSBUZXN0RmFpbGVkLCAnY29tcG9zaW5nIGJ1ZmZlcnMgZmFpbGVkJwotaWYgc3RyKGJ1ZmZlcihhLCAyKSkgIT0gJ2RmJzoKLSAgICByYWlzZSBUZXN0RmFpbGVkLCAnc3BlY2lmeWluZyBidWZmZXIgb2Zmc2V0IGZhaWxlZCcKLWlmIHN0cihidWZmZXIoYSwgMCwgMikpICE9ICdhcyc6Ci0gICAgcmFpc2UgVGVzdEZhaWxlZCwgJ3NwZWNpZnlpbmcgYnVmZmVyIHNpemUgZmFpbGVkJwotaWYgc3RyKGJ1ZmZlcihhLCAxLCAyKSkgIT0gJ3NkJzoKLSAgICByYWlzZSBUZXN0RmFpbGVkLCAnc3BlY2lmeWluZyBidWZmZXIgb2Zmc2V0IGFuZCBzaXplIGZhaWxlZCcKLXRyeTogYnVmZmVyKGJ1ZmZlcignYXNkZicsIDEpLCAtMSkKLWV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAiYnVmZmVyKGJ1ZmZlcignYXNkZicsIDEpLCAtMSkgc2hvdWxkIHJhaXNlIFZhbHVlRXJyb3IiCi1pZiBzdHIoYnVmZmVyKGJ1ZmZlcignYXNkZicsIDAsIDIpLCAwKSkgIT0gJ2FzJzoKLSAgICByYWlzZSBUZXN0RmFpbGVkLCAnY29tcG9zaW5nIGxlbmd0aC1zcGVjaWZpZWQgYnVmZmVyIGZhaWxlZCcKLWlmIHN0cihidWZmZXIoYnVmZmVyKCdhc2RmJywgMCwgMiksIDAsIDUwMDApKSAhPSAnYXMnOgotICAgIHJhaXNlIFRlc3RGYWlsZWQsICdjb21wb3NpbmcgbGVuZ3RoLXNwZWNpZmllZCBidWZmZXIgZmFpbGVkJwotaWYgc3RyKGJ1ZmZlcihidWZmZXIoJ2FzZGYnLCAwLCAyKSwgMCwgLTEpKSAhPSAnYXMnOgotICAgIHJhaXNlIFRlc3RGYWlsZWQsICdjb21wb3NpbmcgbGVuZ3RoLXNwZWNpZmllZCBidWZmZXIgZmFpbGVkJwotaWYgc3RyKGJ1ZmZlcihidWZmZXIoJ2FzZGYnLCAwLCAyKSwgMSwgMikpICE9ICdzJzoKLSAgICByYWlzZSBUZXN0RmFpbGVkLCAnY29tcG9zaW5nIGxlbmd0aC1zcGVjaWZpZWQgYnVmZmVyIGZhaWxlZCcKLQotdHJ5OiBhWzFdID0gJ2cnCi1leGNlcHQgVHlwZUVycm9yOiBwYXNzCi1lbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAiYnVmZmVyIGFzc2lnbm1lbnQgc2hvdWxkIHJhaXNlIFR5cGVFcnJvciIKLQotdHJ5OiBhWzA6MV0gPSAnZycKLWV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICJidWZmZXIgc2xpY2UgYXNzaWdubWVudCBzaG91bGQgcmFpc2UgVHlwZUVycm9yIgotCi0jIGFycmF5LmFycmF5KCkgcmV0dXJucyBhbiBvYmplY3QgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgYSBjaGFyIGJ1ZmZlciwKLSMgc29tZXRoaW5nIHdoaWNoIGludCgpIHVzZXMgZm9yIGNvbnZlcnNpb24uCi1pbXBvcnQgYXJyYXkKLXRyeTogaW50KGJ1ZmZlcihhcnJheS5hcnJheSgnYycpKSkKLWV4Y2VwdCBUeXBlRXJyb3IgOnBhc3MKLWVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICJjaGFyIGJ1ZmZlciAoYXQgQyBsZXZlbCkgbm90IHdvcmtpbmciCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VuaWNvZGUucHkgYi9MaWIvdGVzdC90ZXN0X3VuaWNvZGUucHkKaW5kZXggNTE3ZWNmZC4uMzhmZjlhYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91bmljb2RlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdW5pY29kZS5weQpAQCAtOTIsNiArOTIsOSBAQAogICAgICAgICAgICAgICAgICJcXHhmZVxceGZmJyIpCiAgICAgICAgICAgICB0ZXN0cmVwciA9IHJlcHIodScnLmpvaW4obWFwKHVuaWNociwgeHJhbmdlKDI1NikpKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdHJlcHIsIGxhdGluMXJlcHIpCisgICAgICAgICAgICAjIFRlc3QgcmVwciB3b3JrcyBvbiB3aWRlIHVuaWNvZGUgZXNjYXBlcyB3aXRob3V0IG92ZXJmbG93LgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHUiXFUwMDAxMDAwMCIgKiAzOSArIHUiXHVmZmZmIiAqIDQwOTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByKHUiXFUwMDAxMDAwMCIgKiAzOSArIHUiXHVmZmZmIiAqIDQwOTYpKQogCiAgICAgZGVmIHRlc3RfaXRlcmF0b3JzKHNlbGYpOgogICAgICAgICAjIE1ha2Ugc3VyZSB1bmljb2RlIG9iamVjdHMgaGF2ZSBhbiBfX2l0ZXJfXyBtZXRob2QKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfeGRybGliLnB5IGIvTGliL3Rlc3QvdGVzdF94ZHJsaWIucHkKaW5kZXggZTk1MTdjNS4uOGZjODhhNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF94ZHJsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF94ZHJsaWIucHkKQEAgLTEsMyArMSw1NiBAQAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAorCiBpbXBvcnQgeGRybGliCiAKLXhkcmxpYi5fdGVzdCgpCitjbGFzcyBYRFJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3hkcihzZWxmKToKKyAgICAgICAgcCA9IHhkcmxpYi5QYWNrZXIoKQorCisgICAgICAgIHMgPSAnaGVsbG8gd29ybGQnCisgICAgICAgIGEgPSBbJ3doYXQnLCAnaXMnLCAnaGFwbmluJywgJ2RvY3RvciddCisKKyAgICAgICAgcC5wYWNrX2ludCg0MikKKyAgICAgICAgcC5wYWNrX3VpbnQoOSkKKyAgICAgICAgcC5wYWNrX2Jvb2woVHJ1ZSkKKyAgICAgICAgcC5wYWNrX2Jvb2woRmFsc2UpCisgICAgICAgIHAucGFja191aHlwZXIoNDVMKQorICAgICAgICBwLnBhY2tfZmxvYXQoMS45KQorICAgICAgICBwLnBhY2tfZG91YmxlKDEuOSkKKyAgICAgICAgcC5wYWNrX3N0cmluZyhzKQorICAgICAgICBwLnBhY2tfbGlzdChyYW5nZSg1KSwgcC5wYWNrX3VpbnQpCisgICAgICAgIHAucGFja19hcnJheShhLCBwLnBhY2tfc3RyaW5nKQorCisgICAgICAgICMgbm93IHZlcmlmeQorICAgICAgICBkYXRhID0gcC5nZXRfYnVmZmVyKCkKKyAgICAgICAgdXAgPSB4ZHJsaWIuVW5wYWNrZXIoZGF0YSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVwLmdldF9wb3NpdGlvbigpLCAwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXAudW5wYWNrX2ludCgpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cC51bnBhY2tfdWludCgpLCA5KQorICAgICAgICBzZWxmLmFzc2VydF8odXAudW5wYWNrX2Jvb2woKSBpcyBUcnVlKQorCisgICAgICAgICMgcmVtZW1iZXIgcG9zaXRpb24KKyAgICAgICAgcG9zID0gdXAuZ2V0X3Bvc2l0aW9uKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHVwLnVucGFja19ib29sKCkgaXMgRmFsc2UpCisKKyAgICAgICAgIyByZXdpbmQgYW5kIHVucGFjayBhZ2FpbgorICAgICAgICB1cC5zZXRfcG9zaXRpb24ocG9zKQorICAgICAgICBzZWxmLmFzc2VydF8odXAudW5wYWNrX2Jvb2woKSBpcyBGYWxzZSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVwLnVucGFja191aHlwZXIoKSwgNDVMKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHVwLnVucGFja19mbG9hdCgpLCAxLjkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwodXAudW5wYWNrX2RvdWJsZSgpLCAxLjkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXAudW5wYWNrX3N0cmluZygpLCBzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVwLnVucGFja19saXN0KHVwLnVucGFja191aW50KSwgcmFuZ2UoNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXAudW5wYWNrX2FycmF5KHVwLnVucGFja19zdHJpbmcpLCBhKQorICAgICAgICB1cC5kb25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRU9GRXJyb3IsIHVwLnVucGFja191aW50KQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChYRFJUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3htbHJwYy5weSBiL0xpYi90ZXN0L3Rlc3RfeG1scnBjLnB5CmluZGV4IDY0ZDhmZTguLmNjYzFiNjAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfeG1scnBjLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfeG1scnBjLnB5CkBAIC04Niw2ICs4NiwxNSBAQAogICAgICAgICBzID0geG1scnBjbGliLmR1bXBzKChuZXdfZCwpLCBtZXRob2RyZXNwb25zZT1UcnVlKQogICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShzLCBzdHIpKQogCisgICAgZGVmIHRlc3RfbmV3c3R5bGVfY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIFQob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdCA9IFQoKQorICAgICAgICB0LnggPSAxMDAKKyAgICAgICAgdC55ID0gIkhlbGxvIgorICAgICAgICAoKHQyLCksIGR1bW15KSA9IHhtbHJwY2xpYi5sb2Fkcyh4bWxycGNsaWIuZHVtcHMoKHQsKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHQyLCB0Ll9fZGljdF9fKQorCiAgICAgZGVmIHRlc3RfZHVtcF9iaWdfbG9uZyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgeG1scnBjbGliLmR1bXBzLCAoMkwqKjk5LCkpCiAKZGlmZiAtLWdpdCBhL0xpYi90b2tlbml6ZS5weSBiL0xpYi90b2tlbml6ZS5weQppbmRleCA1ZDY1MjY3Li4xMjUzODIyIDEwMDY0NAotLS0gYS9MaWIvdG9rZW5pemUucHkKKysrIGIvTGliL3Rva2VuaXplLnB5CkBAIC0yNCw3ICsyNCw3IEBACiAKIF9fYXV0aG9yX18gPSAnS2EtUGluZyBZZWUgPHBpbmdAbGZ3Lm9yZz4nCiBfX2NyZWRpdHNfXyA9IFwKLSAgICAnR3ZSLCBFU1IsIFRpbSBQZXRlcnMsIFRob21hcyBXb3V0ZXJzLCBGcmVkIERyYWtlLCBTa2lwIE1vbnRhbmFybycKKyAgICAnR3ZSLCBFU1IsIFRpbSBQZXRlcnMsIFRob21hcyBXb3V0ZXJzLCBGcmVkIERyYWtlLCBTa2lwIE1vbnRhbmFybywgUmF5bW9uZCBIZXR0aW5nZXInCiAKIGltcG9ydCBzdHJpbmcsIHJlCiBmcm9tIHRva2VuIGltcG9ydCAqCkBAIC0xNTksMTQgKzE1OSw3MyBAQAogICAgIGZvciB0b2tlbl9pbmZvIGluIGdlbmVyYXRlX3Rva2VucyhyZWFkbGluZSk6CiAgICAgICAgIHRva2VuZWF0ZXIoKnRva2VuX2luZm8pCiAKK2NsYXNzIFVudG9rZW5pemVyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnRva2VucyA9IFtdCisgICAgICAgIHNlbGYucHJldl9yb3cgPSAxCisgICAgICAgIHNlbGYucHJldl9jb2wgPSAwCisKKyAgICBkZWYgYWRkX3doaXRlc3BhY2Uoc2VsZiwgc3RhcnQpOgorICAgICAgICByb3csIGNvbCA9IHN0YXJ0CisgICAgICAgIGFzc2VydCByb3cgPD0gc2VsZi5wcmV2X3JvdworICAgICAgICBjb2xfb2Zmc2V0ID0gY29sIC0gc2VsZi5wcmV2X2NvbAorICAgICAgICBpZiBjb2xfb2Zmc2V0OgorICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKCIgIiAqIGNvbF9vZmZzZXQpCisKKyAgICBkZWYgdW50b2tlbml6ZShzZWxmLCBpdGVyYWJsZSk6CisgICAgICAgIGZvciB0IGluIGl0ZXJhYmxlOgorICAgICAgICAgICAgaWYgbGVuKHQpID09IDI6CisgICAgICAgICAgICAgICAgc2VsZi5jb21wYXQodCwgaXRlcmFibGUpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRva190eXBlLCB0b2tlbiwgc3RhcnQsIGVuZCwgbGluZSA9IHQKKyAgICAgICAgICAgIHNlbGYuYWRkX3doaXRlc3BhY2Uoc3RhcnQpCisgICAgICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQodG9rZW4pCisgICAgICAgICAgICBzZWxmLnByZXZfcm93LCBzZWxmLnByZXZfY29sID0gZW5kCisgICAgICAgICAgICBpZiB0b2tfdHlwZSBpbiAoTkVXTElORSwgTkwpOgorICAgICAgICAgICAgICAgIHNlbGYucHJldl9yb3cgKz0gMQorICAgICAgICAgICAgICAgIHNlbGYucHJldl9jb2wgPSAwCisgICAgICAgIHJldHVybiAiIi5qb2luKHNlbGYudG9rZW5zKQorCisgICAgZGVmIGNvbXBhdChzZWxmLCB0b2tlbiwgaXRlcmFibGUpOgorICAgICAgICBzdGFydGxpbmUgPSBGYWxzZQorICAgICAgICBpbmRlbnRzID0gW10KKyAgICAgICAgdG9rc19hcHBlbmQgPSBzZWxmLnRva2Vucy5hcHBlbmQKKyAgICAgICAgdG9rbnVtLCB0b2t2YWwgPSB0b2tlbgorICAgICAgICBpZiB0b2tudW0gaW4gKE5BTUUsIE5VTUJFUik6CisgICAgICAgICAgICB0b2t2YWwgKz0gJyAnCisgICAgICAgIGlmIHRva251bSBpbiAoTkVXTElORSwgTkwpOgorICAgICAgICAgICAgc3RhcnRsaW5lID0gVHJ1ZQorICAgICAgICBmb3IgdG9rIGluIGl0ZXJhYmxlOgorICAgICAgICAgICAgdG9rbnVtLCB0b2t2YWwgPSB0b2tbOjJdCisKKyAgICAgICAgICAgIGlmIHRva251bSBpbiAoTkFNRSwgTlVNQkVSKToKKyAgICAgICAgICAgICAgICB0b2t2YWwgKz0gJyAnCisKKyAgICAgICAgICAgIGlmIHRva251bSA9PSBJTkRFTlQ6CisgICAgICAgICAgICAgICAgaW5kZW50cy5hcHBlbmQodG9rdmFsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHRva251bSA9PSBERURFTlQ6CisgICAgICAgICAgICAgICAgaW5kZW50cy5wb3AoKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHRva251bSBpbiAoTkVXTElORSwgTkwpOgorICAgICAgICAgICAgICAgIHN0YXJ0bGluZSA9IFRydWUKKyAgICAgICAgICAgIGVsaWYgc3RhcnRsaW5lIGFuZCBpbmRlbnRzOgorICAgICAgICAgICAgICAgIHRva3NfYXBwZW5kKGluZGVudHNbLTFdKQorICAgICAgICAgICAgICAgIHN0YXJ0bGluZSA9IEZhbHNlCisgICAgICAgICAgICB0b2tzX2FwcGVuZCh0b2t2YWwpCiAKIGRlZiB1bnRva2VuaXplKGl0ZXJhYmxlKToKICAgICAiIiJUcmFuc2Zvcm0gdG9rZW5zIGJhY2sgaW50byBQeXRob24gc291cmNlIGNvZGUuCiAKICAgICBFYWNoIGVsZW1lbnQgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlIG11c3QgYmUgYSB0b2tlbiBzZXF1ZW5jZQotICAgIHdpdGggYXQgbGVhc3QgdHdvIGVsZW1lbnRzLCBhIHRva2VuIG51bWJlciBhbmQgdG9rZW4gdmFsdWUuCisgICAgd2l0aCBhdCBsZWFzdCB0d28gZWxlbWVudHMsIGEgdG9rZW4gbnVtYmVyIGFuZCB0b2tlbiB2YWx1ZS4gIElmCisgICAgb25seSB0d28gdG9rZW5zIGFyZSBwYXNzZWQsIHRoZSByZXN1bHRpbmcgb3V0cHV0IGlzIHBvb3IuCiAKLSAgICBSb3VuZC10cmlwIGludmFyaWFudDoKKyAgICBSb3VuZC10cmlwIGludmFyaWFudCBmb3IgZnVsbCBpbnB1dDoKKyAgICAgICAgVW50b2tlbml6ZWQgc291cmNlIHdpbGwgbWF0Y2ggaW5wdXQgc291cmNlIGV4YWN0bHkKKworICAgIFJvdW5kLXRyaXAgaW52YXJpYW50IGZvciBsaW1pdGVkIGludHB1dDoKICAgICAgICAgIyBPdXRwdXQgdGV4dCB3aWxsIHRva2VuaXplIHRoZSBiYWNrIHRvIHRoZSBpbnB1dAogICAgICAgICB0MSA9IFt0b2tbOjJdIGZvciB0b2sgaW4gZ2VuZXJhdGVfdG9rZW5zKGYucmVhZGxpbmUpXQogICAgICAgICBuZXdjb2RlID0gdW50b2tlbml6ZSh0MSkKQEAgLTE3NCwzMSArMjMzLDggQEAKICAgICAgICAgdDIgPSBbdG9rWzoyXSBmb3IgdG9raW4gZ2VuZXJhdGVfdG9rZW5zKHJlYWRsaW5lKV0KICAgICAgICAgYXNzZXJ0IHQxID09IHQyCiAgICAgIiIiCi0KLSAgICBzdGFydGxpbmUgPSBGYWxzZQotICAgIGluZGVudHMgPSBbXQotICAgIHRva3MgPSBbXQotICAgIHRva3NfYXBwZW5kID0gdG9rcy5hcHBlbmQKLSAgICBmb3IgdG9rIGluIGl0ZXJhYmxlOgotICAgICAgICB0b2tudW0sIHRva3ZhbCA9IHRva1s6Ml0KLQotICAgICAgICBpZiB0b2tudW0gaW4gKE5BTUUsIE5VTUJFUik6Ci0gICAgICAgICAgICB0b2t2YWwgKz0gJyAnCi0KLSAgICAgICAgaWYgdG9rbnVtID09IElOREVOVDoKLSAgICAgICAgICAgIGluZGVudHMuYXBwZW5kKHRva3ZhbCkKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGVsaWYgdG9rbnVtID09IERFREVOVDoKLSAgICAgICAgICAgIGluZGVudHMucG9wKCkKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGVsaWYgdG9rbnVtIGluIChORVdMSU5FLCBDT01NRU5ULCBOTCk6Ci0gICAgICAgICAgICBzdGFydGxpbmUgPSBUcnVlCi0gICAgICAgIGVsaWYgc3RhcnRsaW5lIGFuZCBpbmRlbnRzOgotICAgICAgICAgICAgdG9rc19hcHBlbmQoaW5kZW50c1stMV0pCi0gICAgICAgICAgICBzdGFydGxpbmUgPSBGYWxzZQotICAgICAgICB0b2tzX2FwcGVuZCh0b2t2YWwpCi0gICAgcmV0dXJuICcnLmpvaW4odG9rcykKLQorICAgIHV0ID0gVW50b2tlbml6ZXIoKQorICAgIHJldHVybiB1dC51bnRva2VuaXplKGl0ZXJhYmxlKQogCiBkZWYgZ2VuZXJhdGVfdG9rZW5zKHJlYWRsaW5lKToKICAgICAiIiIKQEAgLTIzNyw3ICsyNzMsNyBAQAogICAgICAgICAgICAgaWYgZW5kbWF0Y2g6CiAgICAgICAgICAgICAgICAgcG9zID0gZW5kID0gZW5kbWF0Y2guZW5kKDApCiAgICAgICAgICAgICAgICAgeWllbGQgKFNUUklORywgY29udHN0ciArIGxpbmVbOmVuZF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdGFydCwgKGxudW0sIGVuZCksIGNvbnRsaW5lICsgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RhcnQsIChsbnVtLCBlbmQpLCBjb250bGluZSArIGxpbmUpCiAgICAgICAgICAgICAgICAgY29udHN0ciwgbmVlZGNvbnQgPSAnJywgMAogICAgICAgICAgICAgICAgIGNvbnRsaW5lID0gTm9uZQogICAgICAgICAgICAgZWxpZiBuZWVkY29udCBhbmQgbGluZVstMjpdICE9ICdcXFxuJyBhbmQgbGluZVstMzpdICE9ICdcXFxyXG4nOgpAQCAtMjYzLDcgKzI5OSwxNSBAQAogICAgICAgICAgICAgaWYgcG9zID09IG1heDogYnJlYWsKIAogICAgICAgICAgICAgaWYgbGluZVtwb3NdIGluICcjXHJcbic6ICAgICAgICAgICAjIHNraXAgY29tbWVudHMgb3IgYmxhbmsgbGluZXMKLSAgICAgICAgICAgICAgICB5aWVsZCAoKE5MLCBDT01NRU5UKVtsaW5lW3Bvc10gPT0gJyMnXSwgbGluZVtwb3M6XSwKKyAgICAgICAgICAgICAgICBpZiBsaW5lW3Bvc10gPT0gJyMnOgorICAgICAgICAgICAgICAgICAgICBjb21tZW50X3Rva2VuID0gbGluZVtwb3M6XS5yc3RyaXAoJ1xyXG4nKQorICAgICAgICAgICAgICAgICAgICBubF9wb3MgPSBwb3MgKyBsZW4oY29tbWVudF90b2tlbikKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgKENPTU1FTlQsIGNvbW1lbnRfdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG51bSwgcG9zKSwgKGxudW0sIHBvcyArIGxlbihjb21tZW50X3Rva2VuKSksIGxpbmUpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIChOTCwgbGluZVtubF9wb3M6XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsbnVtLCBubF9wb3MpLCAobG51bSwgbGVuKGxpbmUpKSwgbGluZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCAoKE5MLCBDT01NRU5UKVtsaW5lW3Bvc10gPT0gJyMnXSwgbGluZVtwb3M6XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsbnVtLCBwb3MpLCAobG51bSwgbGVuKGxpbmUpKSwgbGluZSkKICAgICAgICAgICAgICAgICBjb250aW51ZQogCkBAIC0yOTQsOSArMzM4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgKGluaXRpYWwgPT0gJy4nIGFuZCB0b2tlbiAhPSAnLicpOiAgICAgICMgb3JkaW5hcnkgbnVtYmVyCiAgICAgICAgICAgICAgICAgICAgIHlpZWxkIChOVU1CRVIsIHRva2VuLCBzcG9zLCBlcG9zLCBsaW5lKQogICAgICAgICAgICAgICAgIGVsaWYgaW5pdGlhbCBpbiAnXHJcbic6Ci0gICAgICAgICAgICAgICAgICAgIHlpZWxkIChwYXJlbmxldiA+IDAgYW5kIE5MIG9yIE5FV0xJTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4sIHNwb3MsIGVwb3MsIGxpbmUpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIChOTCBpZiBwYXJlbmxldiA+IDAgZWxzZSBORVdMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4sIHNwb3MsIGVwb3MsIGxpbmUpCiAgICAgICAgICAgICAgICAgZWxpZiBpbml0aWFsID09ICcjJzoKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG5vdCB0b2tlbi5lbmRzd2l0aCgiXG4iKQogICAgICAgICAgICAgICAgICAgICB5aWVsZCAoQ09NTUVOVCwgdG9rZW4sIHNwb3MsIGVwb3MsIGxpbmUpCiAgICAgICAgICAgICAgICAgZWxpZiB0b2tlbiBpbiB0cmlwbGVfcXVvdGVkOgogICAgICAgICAgICAgICAgICAgICBlbmRwcm9nID0gZW5kcHJvZ3NbdG9rZW5dCmRpZmYgLS1naXQgYS9MaWIvdHJhY2ViYWNrLnB5IGIvTGliL3RyYWNlYmFjay5weQppbmRleCBlYjJmZGY2Li5lMzk1YWQ3IDEwMDY0NAotLS0gYS9MaWIvdHJhY2ViYWNrLnB5CisrKyBiL0xpYi90cmFjZWJhY2sucHkKQEAgLTE2Miw2ICsxNjIsMTEgQEAKIAogICAgICIiIgogCisgICAgIyBHcmFjZWZ1bGx5IGhhbmRsZSAodGhlIHdheSBQeXRob24gMi40IGFuZCBlYXJsaWVyIGRpZCkgdGhlIGNhc2Ugb2YKKyAgICAjIGJlaW5nIGNhbGxlZCB3aXRoIChOb25lLCBOb25lKS4KKyAgICBpZiBldHlwZSBpcyBOb25lOgorICAgICAgICByZXR1cm4gW19mb3JtYXRfZmluYWxfZXhjX2xpbmUoZXR5cGUsIHZhbHVlKV0KKwogICAgIHN0eXBlID0gZXR5cGUuX19uYW1lX18KICAgICBzbW9kID0gZXR5cGUuX19tb2R1bGVfXwogICAgIGlmIHNtb2Qgbm90IGluICgiZXhjZXB0aW9ucyIsICJfX21haW5fXyIsICJfX2J1aWx0aW5fXyIpOgpkaWZmIC0tZ2l0IGEvTGliL3VybGxpYi5weSBiL0xpYi91cmxsaWIucHkKaW5kZXggZTAxZjQyMS4uOTBmN2FhMCAxMDA2NDQKLS0tIGEvTGliL3VybGxpYi5weQorKysgYi9MaWIvdXJsbGliLnB5CkBAIC0zMDIsMTMgKzMwMiwxMyBAQAogCiAgICAgICAgIGlmIHByb3h5X3Bhc3N3ZDoKICAgICAgICAgICAgIGltcG9ydCBiYXNlNjQKLSAgICAgICAgICAgIHByb3h5X2F1dGggPSBiYXNlNjQuZW5jb2Rlc3RyaW5nKHByb3h5X3Bhc3N3ZCkuc3RyaXAoKQorICAgICAgICAgICAgcHJveHlfYXV0aCA9IGJhc2U2NC5iNjRlbmNvZGUocHJveHlfcGFzc3dkKS5zdHJpcCgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBwcm94eV9hdXRoID0gTm9uZQogCiAgICAgICAgIGlmIHVzZXJfcGFzc3dkOgogICAgICAgICAgICAgaW1wb3J0IGJhc2U2NAotICAgICAgICAgICAgYXV0aCA9IGJhc2U2NC5lbmNvZGVzdHJpbmcodXNlcl9wYXNzd2QpLnN0cmlwKCkKKyAgICAgICAgICAgIGF1dGggPSBiYXNlNjQuYjY0ZW5jb2RlKHVzZXJfcGFzc3dkKS5zdHJpcCgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBhdXRoID0gTm9uZQogICAgICAgICBoID0gaHR0cGxpYi5IVFRQKGhvc3QpCkBAIC0zODcsMTIgKzM4NywxMiBAQAogICAgICAgICAgICAgaWYgbm90IGhvc3Q6IHJhaXNlIElPRXJyb3IsICgnaHR0cHMgZXJyb3InLCAnbm8gaG9zdCBnaXZlbicpCiAgICAgICAgICAgICBpZiBwcm94eV9wYXNzd2Q6CiAgICAgICAgICAgICAgICAgaW1wb3J0IGJhc2U2NAotICAgICAgICAgICAgICAgIHByb3h5X2F1dGggPSBiYXNlNjQuZW5jb2Rlc3RyaW5nKHByb3h5X3Bhc3N3ZCkuc3RyaXAoKQorICAgICAgICAgICAgICAgIHByb3h5X2F1dGggPSBiYXNlNjQuYjY0ZW5jb2RlKHByb3h5X3Bhc3N3ZCkuc3RyaXAoKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBwcm94eV9hdXRoID0gTm9uZQogICAgICAgICAgICAgaWYgdXNlcl9wYXNzd2Q6CiAgICAgICAgICAgICAgICAgaW1wb3J0IGJhc2U2NAotICAgICAgICAgICAgICAgIGF1dGggPSBiYXNlNjQuZW5jb2Rlc3RyaW5nKHVzZXJfcGFzc3dkKS5zdHJpcCgpCisgICAgICAgICAgICAgICAgYXV0aCA9IGJhc2U2NC5iNjRlbmNvZGUodXNlcl9wYXNzd2QpLnN0cmlwKCkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgYXV0aCA9IE5vbmUKICAgICAgICAgICAgIGggPSBodHRwbGliLkhUVFBTKGhvc3QsIDAsCmRpZmYgLS1naXQgYS9MaWIvdXJsbGliMi5weSBiL0xpYi91cmxsaWIyLnB5CmluZGV4IDFlMTlmMzMuLmE4ODBlNjQgMTAwNjQ0Ci0tLSBhL0xpYi91cmxsaWIyLnB5CisrKyBiL0xpYi91cmxsaWIyLnB5CkBAIC02NzQsNyArNjc0LDcgQEAKICAgICAgICAgICAgIHByb3h5X3R5cGUgPSBvcmlnX3R5cGUKICAgICAgICAgaWYgdXNlciBhbmQgcGFzc3dvcmQ6CiAgICAgICAgICAgICB1c2VyX3Bhc3MgPSAnJXM6JXMnICUgKHVucXVvdGUodXNlciksIHVucXVvdGUocGFzc3dvcmQpKQotICAgICAgICAgICAgY3JlZHMgPSBiYXNlNjQuZW5jb2Rlc3RyaW5nKHVzZXJfcGFzcykuc3RyaXAoKQorICAgICAgICAgICAgY3JlZHMgPSBiYXNlNjQuYjY0ZW5jb2RlKHVzZXJfcGFzcykuc3RyaXAoKQogICAgICAgICAgICAgcmVxLmFkZF9oZWFkZXIoJ1Byb3h5LWF1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArIGNyZWRzKQogICAgICAgICBob3N0cG9ydCA9IHVucXVvdGUoaG9zdHBvcnQpCiAgICAgICAgIHJlcS5zZXRfcHJveHkoaG9zdHBvcnQsIHByb3h5X3R5cGUpCkBAIC03OTgsNyArNzk4LDcgQEAKICAgICAgICAgdXNlciwgcHcgPSBzZWxmLnBhc3N3ZC5maW5kX3VzZXJfcGFzc3dvcmQocmVhbG0sIGhvc3QpCiAgICAgICAgIGlmIHB3IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgcmF3ID0gIiVzOiVzIiAlICh1c2VyLCBwdykKLSAgICAgICAgICAgIGF1dGggPSAnQmFzaWMgJXMnICUgYmFzZTY0LmVuY29kZXN0cmluZyhyYXcpLnN0cmlwKCkKKyAgICAgICAgICAgIGF1dGggPSAnQmFzaWMgJXMnICUgYmFzZTY0LmI2NGVuY29kZShyYXcpLnN0cmlwKCkKICAgICAgICAgICAgIGlmIHJlcS5oZWFkZXJzLmdldChzZWxmLmF1dGhfaGVhZGVyLCBOb25lKSA9PSBhdXRoOgogICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgICByZXEuYWRkX2hlYWRlcihzZWxmLmF1dGhfaGVhZGVyLCBhdXRoKQpkaWZmIC0tZ2l0IGEvTGliL3V1LnB5IGIvTGliL3V1LnB5CmluZGV4IDNjY2VkYjAuLmRhODlmNzIgMTAwNzU1Ci0tLSBhL0xpYi91dS5weQorKysgYi9MaWIvdXUucHkKQEAgLTExNCw2ICsxMTQsNyBAQAogICAgICMKICAgICAjIE9wZW4gdGhlIG91dHB1dCBmaWxlCiAgICAgIworICAgIG9wZW5lZCA9IEZhbHNlCiAgICAgaWYgb3V0X2ZpbGUgPT0gJy0nOgogICAgICAgICBvdXRfZmlsZSA9IHN5cy5zdGRvdXQKICAgICBlbGlmIGlzaW5zdGFuY2Uob3V0X2ZpbGUsIGJhc2VzdHJpbmcpOgpAQCAtMTIzLDYgKzEyNCw3IEBACiAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgb3V0X2ZpbGUgPSBmcAorICAgICAgICBvcGVuZWQgPSBUcnVlCiAgICAgIwogICAgICMgTWFpbiBkZWNvZGluZyBsb29wCiAgICAgIwpAQCAtMTQwLDYgKzE0Miw4IEBACiAgICAgICAgIHMgPSBpbl9maWxlLnJlYWRsaW5lKCkKICAgICBpZiBub3QgczoKICAgICAgICAgcmFpc2UgRXJyb3IoJ1RydW5jYXRlZCBpbnB1dCBmaWxlJykKKyAgICBpZiBvcGVuZWQ6CisgICAgICAgIG91dF9maWxlLmNsb3NlKCkKIAogZGVmIHRlc3QoKToKICAgICAiIiJ1dWVuY29kZS91dWRlY29kZSBtYWluIHByb2dyYW0iIiIKZGlmZiAtLWdpdCBhL0xpYi93ZWJicm93c2VyLnB5IGIvTGliL3dlYmJyb3dzZXIucHkKaW5kZXggOWZkMTYxNS4uMGQ1ZjQ0ZiAxMDA2NDQKLS0tIGEvTGliL3dlYmJyb3dzZXIucHkKKysrIGIvTGliL3dlYmJyb3dzZXIucHkKQEAgLTE2NSw3ICsxNjUsMTAgQEAKICAgICAgICAgY21kbGluZSA9IFtzZWxmLm5hbWVdICsgW2FyZy5yZXBsYWNlKCIlcyIsIHVybCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhcmcgaW4gc2VsZi5hcmdzXQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWRsaW5lLCBjbG9zZV9mZHM9VHJ1ZSkKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbic6CisgICAgICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kbGluZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kbGluZSwgY2xvc2VfZmRzPVRydWUpCiAgICAgICAgICAgICByZXR1cm4gbm90IHAud2FpdCgpCiAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCkBAIC0xNzgsMTEgKzE4MSwxNCBAQAogICAgIGRlZiBvcGVuKHNlbGYsIHVybCwgbmV3PTAsIGF1dG9yYWlzZT0xKToKICAgICAgICAgY21kbGluZSA9IFtzZWxmLm5hbWVdICsgW2FyZy5yZXBsYWNlKCIlcyIsIHVybCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhcmcgaW4gc2VsZi5hcmdzXQotICAgICAgICBzZXRzaWQgPSBnZXRhdHRyKG9zLCAnc2V0c2lkJywgTm9uZSkKLSAgICAgICAgaWYgbm90IHNldHNpZDoKLSAgICAgICAgICAgIHNldHNpZCA9IGdldGF0dHIob3MsICdzZXRwZ3JwJywgTm9uZSkKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kbGluZSwgY2xvc2VfZmRzPVRydWUsIHByZWV4ZWNfZm49c2V0c2lkKQorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAnd2luJzoKKyAgICAgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWRsaW5lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZXRzaWQgPSBnZXRhdHRyKG9zLCAnc2V0c2lkJywgTm9uZSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2V0c2lkOgorICAgICAgICAgICAgICAgICAgICBzZXRzaWQgPSBnZXRhdHRyKG9zLCAnc2V0cGdycCcsIE5vbmUpCisgICAgICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kbGluZSwgY2xvc2VfZmRzPVRydWUsIHByZWV4ZWNfZm49c2V0c2lkKQogICAgICAgICAgICAgcmV0dXJuIChwLnBvbGwoKSBpcyBOb25lKQogICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgIHJldHVybiBGYWxzZQpAQCAtNDQxLDcgKzQ0Nyw3IEBACiAKICAgICAgICAgIyBpZiBzdWNjZXNzZnVsLCByZWdpc3RlciBpdAogICAgICAgICBpZiByZXRuY29kZSBpcyBOb25lIGFuZCBjb21tZDoKLSAgICAgICAgICAgIHJlZ2lzdGVyKCJnbm9tZSIsIE5vbmUsIEJhY2tncm91bmRCcm93c2VyKGNvbW1kKSkKKyAgICAgICAgICAgIHJlZ2lzdGVyKCJnbm9tZSIsIE5vbmUsIEJhY2tncm91bmRCcm93c2VyKGNvbW1kLnNwbGl0KCkpKQogCiAgICAgIyBGaXJzdCwgdGhlIE1vemlsbGEvTmV0c2NhcGUgYnJvd3NlcnMKICAgICBmb3IgYnJvd3NlciBpbiAoIm1vemlsbGEtZmlyZWZveCIsICJmaXJlZm94IiwKZGlmZiAtLWdpdCBhL0xpYi94ZHJsaWIucHkgYi9MaWIveGRybGliLnB5CmluZGV4IGIzNDllYjkuLjc5NmRmYWYgMTAwNjQ0Ci0tLSBhL0xpYi94ZHJsaWIucHkKKysrIGIvTGliL3hkcmxpYi5weQpAQCAtMjI3LDYxICsyMjcsMyBAQAogICAgIGRlZiB1bnBhY2tfYXJyYXkoc2VsZiwgdW5wYWNrX2l0ZW0pOgogICAgICAgICBuID0gc2VsZi51bnBhY2tfdWludCgpCiAgICAgICAgIHJldHVybiBzZWxmLnVucGFja19mYXJyYXkobiwgdW5wYWNrX2l0ZW0pCi0KLQotIyB0ZXN0IHN1aXRlCi1kZWYgX3Rlc3QoKToKLSAgICBwID0gUGFja2VyKCkKLSAgICBwYWNrdGVzdCA9IFsKLSAgICAgICAgKHAucGFja191aW50LCAgICAoOSwpKSwKLSAgICAgICAgKHAucGFja19ib29sLCAgICAoVHJ1ZSwpKSwKLSAgICAgICAgKHAucGFja19ib29sLCAgICAoRmFsc2UsKSksCi0gICAgICAgIChwLnBhY2tfdWh5cGVyLCAgKDQ1TCwpKSwKLSAgICAgICAgKHAucGFja19mbG9hdCwgICAoMS45LCkpLAotICAgICAgICAocC5wYWNrX2RvdWJsZSwgICgxLjksKSksCi0gICAgICAgIChwLnBhY2tfc3RyaW5nLCAgKCdoZWxsbyB3b3JsZCcsKSksCi0gICAgICAgIChwLnBhY2tfbGlzdCwgICAgKHJhbmdlKDUpLCBwLnBhY2tfdWludCkpLAotICAgICAgICAocC5wYWNrX2FycmF5LCAgIChbJ3doYXQnLCAnaXMnLCAnaGFwbmluJywgJ2RvY3RvciddLCBwLnBhY2tfc3RyaW5nKSksCi0gICAgICAgIF0KLSAgICBzdWNjZWVkbGlzdCA9IFsxXSAqIGxlbihwYWNrdGVzdCkKLSAgICBjb3VudCA9IDAKLSAgICBmb3IgbWV0aG9kLCBhcmdzIGluIHBhY2t0ZXN0OgotICAgICAgICBwcmludCAncGFjayB0ZXN0JywgY291bnQsCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG1ldGhvZCgqYXJncykKLSAgICAgICAgICAgIHByaW50ICdzdWNjZWVkZWQnCi0gICAgICAgIGV4Y2VwdCBDb252ZXJzaW9uRXJyb3IsIHZhcjoKLSAgICAgICAgICAgIHByaW50ICdDb252ZXJzaW9uRXJyb3I6JywgdmFyLm1zZwotICAgICAgICAgICAgc3VjY2VlZGxpc3RbY291bnRdID0gMAotICAgICAgICBjb3VudCA9IGNvdW50ICsgMQotICAgIGRhdGEgPSBwLmdldF9idWZmZXIoKQotICAgICMgbm93IHZlcmlmeQotICAgIHVwID0gVW5wYWNrZXIoZGF0YSkKLSAgICB1bnBhY2t0ZXN0ID0gWwotICAgICAgICAodXAudW5wYWNrX3VpbnQsICAgKCksIGxhbWJkYSB4OiB4ID09IDkpLAotICAgICAgICAodXAudW5wYWNrX2Jvb2wsICAgKCksIGxhbWJkYSB4OiB4IGlzIFRydWUpLAotICAgICAgICAodXAudW5wYWNrX2Jvb2wsICAgKCksIGxhbWJkYSB4OiB4IGlzIEZhbHNlKSwKLSAgICAgICAgKHVwLnVucGFja191aHlwZXIsICgpLCBsYW1iZGEgeDogeCA9PSA0NUwpLAotICAgICAgICAodXAudW5wYWNrX2Zsb2F0LCAgKCksIGxhbWJkYSB4OiAxLjg5IDwgeCA8IDEuOTEpLAotICAgICAgICAodXAudW5wYWNrX2RvdWJsZSwgKCksIGxhbWJkYSB4OiAxLjg5IDwgeCA8IDEuOTEpLAotICAgICAgICAodXAudW5wYWNrX3N0cmluZywgKCksIGxhbWJkYSB4OiB4ID09ICdoZWxsbyB3b3JsZCcpLAotICAgICAgICAodXAudW5wYWNrX2xpc3QsICAgKHVwLnVucGFja191aW50LCksIGxhbWJkYSB4OiB4ID09IHJhbmdlKDUpKSwKLSAgICAgICAgKHVwLnVucGFja19hcnJheSwgICh1cC51bnBhY2tfc3RyaW5nLCksCi0gICAgICAgICBsYW1iZGEgeDogeCA9PSBbJ3doYXQnLCAnaXMnLCAnaGFwbmluJywgJ2RvY3RvciddKSwKLSAgICAgICAgXQotICAgIGNvdW50ID0gMAotICAgIGZvciBtZXRob2QsIGFyZ3MsIHByZWQgaW4gdW5wYWNrdGVzdDoKLSAgICAgICAgcHJpbnQgJ3VucGFjayB0ZXN0JywgY291bnQsCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGlmIHN1Y2NlZWRsaXN0W2NvdW50XToKLSAgICAgICAgICAgICAgICB4ID0gbWV0aG9kKCphcmdzKQotICAgICAgICAgICAgICAgIHByaW50IHByZWQoeCkgYW5kICdzdWNjZWVkZWQnIG9yICdmYWlsZWQnLCAnOicsIHgKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJ3NraXBwaW5nJwotICAgICAgICBleGNlcHQgQ29udmVyc2lvbkVycm9yLCB2YXI6Ci0gICAgICAgICAgICBwcmludCAnQ29udmVyc2lvbkVycm9yOicsIHZhci5tc2cKLSAgICAgICAgY291bnQgPSBjb3VudCArIDEKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIF90ZXN0KCkKZGlmZiAtLWdpdCBhL0xpYi94bWxycGNsaWIucHkgYi9MaWIveG1scnBjbGliLnB5CmluZGV4IDcyODY2ZjEuLmRhM2QzOTYgMTAwNjQ0Ci0tLSBhL0xpYi94bWxycGNsaWIucHkKKysrIGIvTGliL3htbHJwY2xpYi5weQpAQCAtNTkzLDkgKzU5MywyMSBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBmID0gc2VsZi5kaXNwYXRjaFt0eXBlKHZhbHVlKV0KICAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiY2Fubm90IG1hcnNoYWwgJXMgb2JqZWN0cyIgJSB0eXBlKHZhbHVlKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgZihzZWxmLCB2YWx1ZSwgd3JpdGUpCisgICAgICAgICAgICAjIGNoZWNrIGlmIHRoaXMgb2JqZWN0IGNhbiBiZSBtYXJzaGFsbGVkIGFzIGEgc3RydWN0dXJlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmFsdWUuX19kaWN0X18KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJjYW5ub3QgbWFyc2hhbCAlcyBvYmplY3RzIiAlIHR5cGUodmFsdWUpCisgICAgICAgICAgICAjIGNoZWNrIGlmIHRoaXMgY2xhc3MgaXMgYSBzdWItY2xhc3Mgb2YgYSBiYXNpYyB0eXBlLAorICAgICAgICAgICAgIyBiZWNhdXNlIHdlIGRvbid0IGtub3cgaG93IHRvIG1hcnNoYWwgdGhlc2UgdHlwZXMKKyAgICAgICAgICAgICMgKGUuZy4gYSBzdHJpbmcgc3ViLWNsYXNzKQorICAgICAgICAgICAgZm9yIHR5cGVfIGluIHR5cGUodmFsdWUpLl9fbXJvX186CisgICAgICAgICAgICAgICAgaWYgdHlwZV8gaW4gc2VsZi5kaXNwYXRjaC5rZXlzKCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgImNhbm5vdCBtYXJzaGFsICVzIG9iamVjdHMiICUgdHlwZSh2YWx1ZSkKKyAgICAgICAgICAgICMgWFhYKHR3b3V0ZXJzKTogdXNpbmcgIl9hcmJpdHJhcnlfaW5zdGFuY2UiIGFzIGtleSBhcyBhIHF1aWNrLWZpeAorICAgICAgICAgICAgIyBmb3IgdGhlIHAzeWsgbWVyZ2UsIHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGZpeGVkIG1vcmUgbmVhdGx5LgorICAgICAgICAgICAgZiA9IHNlbGYuZGlzcGF0Y2hbIl9hcmJpdHJhcnlfaW5zdGFuY2UiXQorICAgICAgICBmKHNlbGYsIHZhbHVlLCB3cml0ZSkKIAogICAgIGRlZiBkdW1wX25pbCAoc2VsZiwgdmFsdWUsIHdyaXRlKToKICAgICAgICAgaWYgbm90IHNlbGYuYWxsb3dfbm9uZToKQEAgLTcxMyw2ICs3MjUsOSBAQAogICAgICAgICAgICAgc2VsZi5kdW1wX3N0cnVjdCh2YWx1ZS5fX2RpY3RfXywgd3JpdGUpCiAgICAgZGlzcGF0Y2hbRGF0ZVRpbWVdID0gZHVtcF9pbnN0YW5jZQogICAgIGRpc3BhdGNoW0JpbmFyeV0gPSBkdW1wX2luc3RhbmNlCisgICAgIyBYWFgodHdvdXRlcnMpOiB1c2luZyAiX2FyYml0cmFyeV9pbnN0YW5jZSIgYXMga2V5IGFzIGEgcXVpY2stZml4CisgICAgIyBmb3IgdGhlIHAzeWsgbWVyZ2UsIHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGZpeGVkIG1vcmUgbmVhdGx5LgorICAgIGRpc3BhdGNoWyJfYXJiaXRyYXJ5X2luc3RhbmNlIl0gPSBkdW1wX2luc3RhbmNlCiAKICMjCiAjIFhNTC1SUEMgdW5tYXJzaGFsbGVyLgo=