ZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL0dyYW1tYXIudHh0IGIvTGliL2xpYjJ0bzMvR3JhbW1hci50eHQKaW5kZXggMWY0YTUwZi4uNGNmNGUzMiAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvR3JhbW1hci50eHQKKysrIGIvTGliL2xpYjJ0bzMvR3JhbW1hci50eHQKQEAgLTkwLDcgKzkwLDggQEAKIAkgICAgWydlbHNlJyAnOicgc3VpdGVdCiAJICAgIFsnZmluYWxseScgJzonIHN1aXRlXSB8CiAJICAgJ2ZpbmFsbHknICc6JyBzdWl0ZSkpCi13aXRoX3N0bXQ6ICd3aXRoJyB0ZXN0IFsgd2l0aF92YXIgXSAnOicgc3VpdGUKK3dpdGhfc3RtdDogJ3dpdGgnIHdpdGhfaXRlbSAoJywnIHdpdGhfaXRlbSkqICAnOicgc3VpdGUKK3dpdGhfaXRlbTogdGVzdCBbJ2FzJyBleHByXQogd2l0aF92YXI6ICdhcycgZXhwcgogIyBOQiBjb21waWxlLmMgbWFrZXMgc3VyZSB0aGF0IHRoZSBkZWZhdWx0IGV4Y2VwdCBjbGF1c2UgaXMgbGFzdAogZXhjZXB0X2NsYXVzZTogJ2V4Y2VwdCcgW3Rlc3QgWygnLCcgfCAnYXMnKSB0ZXN0XV0KZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVyX2Jhc2UucHkgYi9MaWIvbGliMnRvMy9maXhlcl9iYXNlLnB5CmluZGV4IGE4NWU1YzAuLjJiOGEzMWEgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVyX2Jhc2UucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXJfYmFzZS5weQpAQCAtMTIwLDcgKzEyMCw3IEBACiAgICAgICAgICIiIgogICAgICAgICBsaW5lbm8gPSBub2RlLmdldF9saW5lbm8oKQogICAgICAgICBmb3Jfb3V0cHV0ID0gbm9kZS5jbG9uZSgpCi0gICAgICAgIGZvcl9vdXRwdXQuc2V0X3ByZWZpeCh1IiIpCisgICAgICAgIGZvcl9vdXRwdXQucHJlZml4ID0gdSIiCiAgICAgICAgIG1zZyA9ICJMaW5lICVkOiBjb3VsZCBub3QgY29udmVydDogJXMiCiAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UobXNnICUgKGxpbmVubywgZm9yX291dHB1dCkpCiAgICAgICAgIGlmIHJlYXNvbjoKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVyX3V0aWwucHkgYi9MaWIvbGliMnRvMy9maXhlcl91dGlsLnB5CmluZGV4IDY2MmI4MDEuLjBkOTMyNzggMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVyX3V0aWwucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXJfdXRpbC5weQpAQCAtMjcsMTEgKzI3LDExIEBACiAgICAgaWYgbm90IGlzaW5zdGFuY2UodGFyZ2V0LCBsaXN0KToKICAgICAgICAgdGFyZ2V0ID0gW3RhcmdldF0KICAgICBpZiBub3QgaXNpbnN0YW5jZShzb3VyY2UsIGxpc3QpOgotICAgICAgICBzb3VyY2Uuc2V0X3ByZWZpeCgiICIpCisgICAgICAgIHNvdXJjZS5wcmVmaXggPSB1IiAiCiAgICAgICAgIHNvdXJjZSA9IFtzb3VyY2VdCiAKICAgICByZXR1cm4gTm9kZShzeW1zLmF0b20sCi0gICAgICAgICAgICAgICAgdGFyZ2V0ICsgW0xlYWYodG9rZW4uRVFVQUwsICI9IiwgcHJlZml4PSIgIildICsgc291cmNlKQorICAgICAgICAgICAgICAgIHRhcmdldCArIFtMZWFmKHRva2VuLkVRVUFMLCB1Ij0iLCBwcmVmaXg9dSIgIildICsgc291cmNlKQogCiBkZWYgTmFtZShuYW1lLCBwcmVmaXg9Tm9uZSk6CiAgICAgIiIiUmV0dXJuIGEgTkFNRSBsZWFmIiIiCkBAIC02MCw3ICs2MCw3IEBACiAgICAgIiIiQSBmdW5jdGlvbiBjYWxsIiIiCiAgICAgbm9kZSA9IE5vZGUoc3ltcy5wb3dlciwgW2Z1bmNfbmFtZSwgQXJnTGlzdChhcmdzKV0pCiAgICAgaWYgcHJlZml4IGlzIG5vdCBOb25lOgotICAgICAgICBub2RlLnNldF9wcmVmaXgocHJlZml4KQorICAgICAgICBub2RlLnByZWZpeCA9IHByZWZpeAogICAgIHJldHVybiBub2RlCiAKIGRlZiBOZXdsaW5lKCk6CkBAIC04OSwxOCArODksMTggQEAKIAogICAgIElmIHRlc3QgaXMgTm9uZSwgdGhlICJpZiB0ZXN0IiBwYXJ0IGlzIG9taXR0ZWQuCiAgICAgIiIiCi0gICAgeHAuc2V0X3ByZWZpeCh1IiIpCi0gICAgZnAuc2V0X3ByZWZpeCh1IiAiKQotICAgIGl0LnNldF9wcmVmaXgodSIgIikKKyAgICB4cC5wcmVmaXggPSB1IiIKKyAgICBmcC5wcmVmaXggPSB1IiAiCisgICAgaXQucHJlZml4ID0gdSIgIgogICAgIGZvcl9sZWFmID0gTGVhZih0b2tlbi5OQU1FLCB1ImZvciIpCi0gICAgZm9yX2xlYWYuc2V0X3ByZWZpeCh1IiAiKQorICAgIGZvcl9sZWFmLnByZWZpeCA9IHUiICIKICAgICBpbl9sZWFmID0gTGVhZih0b2tlbi5OQU1FLCB1ImluIikKLSAgICBpbl9sZWFmLnNldF9wcmVmaXgodSIgIikKKyAgICBpbl9sZWFmLnByZWZpeCA9IHUiICIKICAgICBpbm5lcl9hcmdzID0gW2Zvcl9sZWFmLCBmcCwgaW5fbGVhZiwgaXRdCiAgICAgaWYgdGVzdDoKLSAgICAgICAgdGVzdC5zZXRfcHJlZml4KHUiICIpCisgICAgICAgIHRlc3QucHJlZml4ID0gdSIgIgogICAgICAgICBpZl9sZWFmID0gTGVhZih0b2tlbi5OQU1FLCB1ImlmIikKLSAgICAgICAgaWZfbGVhZi5zZXRfcHJlZml4KHUiICIpCisgICAgICAgIGlmX2xlYWYucHJlZml4ID0gdSIgIgogICAgICAgICBpbm5lcl9hcmdzLmFwcGVuZChOb2RlKHN5bXMuY29tcF9pZiwgW2lmX2xlYWYsIHRlc3RdKSkKICAgICBpbm5lciA9IE5vZGUoc3ltcy5saXN0bWFrZXIsIFt4cCwgTm9kZShzeW1zLmNvbXBfZm9yLCBpbm5lcl9hcmdzKV0pCiAgICAgcmV0dXJuIE5vZGUoc3ltcy5hdG9tLApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2FwcGx5LnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2FwcGx5LnB5CmluZGV4IDk1M2I5YjEuLjZkMWM1ZDkgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9hcHBseS5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfYXBwbHkucHkKQEAgLTMzLDI1ICszMywyNSBAQAogICAgICAgICBmdW5jID0gcmVzdWx0c1siZnVuYyJdCiAgICAgICAgIGFyZ3MgPSByZXN1bHRzWyJhcmdzIl0KICAgICAgICAga3dkcyA9IHJlc3VsdHMuZ2V0KCJrd2RzIikKLSAgICAgICAgcHJlZml4ID0gbm9kZS5nZXRfcHJlZml4KCkKKyAgICAgICAgcHJlZml4ID0gbm9kZS5wcmVmaXgKICAgICAgICAgZnVuYyA9IGZ1bmMuY2xvbmUoKQogICAgICAgICBpZiAoZnVuYy50eXBlIG5vdCBpbiAodG9rZW4uTkFNRSwgc3ltcy5hdG9tKSBhbmQKICAgICAgICAgICAgIChmdW5jLnR5cGUgIT0gc3ltcy5wb3dlciBvcgogICAgICAgICAgICAgIGZ1bmMuY2hpbGRyZW5bLTJdLnR5cGUgPT0gdG9rZW4uRE9VQkxFU1RBUikpOgogICAgICAgICAgICAgIyBOZWVkIHRvIHBhcmVudGhlc2l6ZQogICAgICAgICAgICAgZnVuYyA9IHBhcmVudGhlc2l6ZShmdW5jKQotICAgICAgICBmdW5jLnNldF9wcmVmaXgoIiIpCisgICAgICAgIGZ1bmMucHJlZml4ID0gIiIKICAgICAgICAgYXJncyA9IGFyZ3MuY2xvbmUoKQotICAgICAgICBhcmdzLnNldF9wcmVmaXgoIiIpCisgICAgICAgIGFyZ3MucHJlZml4ID0gIiIKICAgICAgICAgaWYga3dkcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGt3ZHMgPSBrd2RzLmNsb25lKCkKLSAgICAgICAgICAgIGt3ZHMuc2V0X3ByZWZpeCgiIikKKyAgICAgICAgICAgIGt3ZHMucHJlZml4ID0gIiIKICAgICAgICAgbF9uZXdhcmdzID0gW3B5dHJlZS5MZWFmKHRva2VuLlNUQVIsIHUiKiIpLCBhcmdzXQogICAgICAgICBpZiBrd2RzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgbF9uZXdhcmdzLmV4dGVuZChbQ29tbWEoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5dHJlZS5MZWFmKHRva2VuLkRPVUJMRVNUQVIsIHUiKioiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3ZHNdKQotICAgICAgICAgICAgbF9uZXdhcmdzWy0yXS5zZXRfcHJlZml4KHUiICIpICMgdGhhdCdzIHRoZSAqKiB0b2tlbgorICAgICAgICAgICAgbF9uZXdhcmdzWy0yXS5wcmVmaXggPSB1IiAiICMgdGhhdCdzIHRoZSAqKiB0b2tlbgogICAgICAgICAjIFhYWCBTb21ldGltZXMgd2UgY291bGQgYmUgY2xldmVyZXIsIGUuZy4gYXBwbHkoZiwgKHgsIHkpICsgdCkKICAgICAgICAgIyBjYW4gYmUgdHJhbnNsYXRlZCBpbnRvIGYoeCwgeSwgKnQpIGluc3RlYWQgb2YgZigqKHgsIHkpICsgdCkKICAgICAgICAgI25ldyA9IHB5dHJlZS5Ob2RlKHN5bXMucG93ZXIsIChmdW5jLCBBcmdMaXN0KGxfbmV3YXJncykpKQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2Jhc2VzdHJpbmcucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfYmFzZXN0cmluZy5weQppbmRleCAxMzhlNzMyLi4wZGU2YzI2IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfYmFzZXN0cmluZy5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfYmFzZXN0cmluZy5weQpAQCAtMTAsNCArMTAsNCBAQAogICAgIFBBVFRFUk4gPSAiJ2Jhc2VzdHJpbmcnIgogCiAgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKLSAgICAgICAgcmV0dXJuIE5hbWUodSJzdHIiLCBwcmVmaXg9bm9kZS5nZXRfcHJlZml4KCkpCisgICAgICAgIHJldHVybiBOYW1lKHUic3RyIiwgcHJlZml4PW5vZGUucHJlZml4KQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2J1ZmZlci5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9idWZmZXIucHkKaW5kZXggMzRjYzE2OC4uMWMxYzRhMSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2J1ZmZlci5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfYnVmZmVyLnB5CkBAIC0xMyw5ICsxMyw5IEBACiAgICAgZXhwbGljaXQgPSBUcnVlICMgVGhlIHVzZXIgbXVzdCBhc2sgZm9yIHRoaXMgZml4ZXIKIAogICAgIFBBVFRFUk4gPSAiIiIKLSAgICAgICAgICAgICAgcG93ZXI8IG5hbWU9J2J1ZmZlcicgdHJhaWxlcjwgJygnIFthbnldICcpJyA+ID4KKyAgICAgICAgICAgICAgcG93ZXI8IG5hbWU9J2J1ZmZlcicgdHJhaWxlcjwgJygnIFthbnldICcpJyA+IGFueSogPgogICAgICAgICAgICAgICAiIiIKIAogICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CiAgICAgICAgIG5hbWUgPSByZXN1bHRzWyJuYW1lIl0KLSAgICAgICAgbmFtZS5yZXBsYWNlKE5hbWUodSJtZW1vcnl2aWV3IiwgcHJlZml4PW5hbWUuZ2V0X3ByZWZpeCgpKSkKKyAgICAgICAgbmFtZS5yZXBsYWNlKE5hbWUodSJtZW1vcnl2aWV3IiwgcHJlZml4PW5hbWUucHJlZml4KSkKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9jYWxsYWJsZS5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9jYWxsYWJsZS5weQppbmRleCA0ZGUzZjY2Li4wM2M4OTIzIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfY2FsbGFibGUucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2NhbGxhYmxlLnB5CkBAIC0yOCw0ICsyOCw0IEBACiAgICAgICAgIGZ1bmMgPSByZXN1bHRzWyJmdW5jIl0KIAogICAgICAgICBhcmdzID0gW2Z1bmMuY2xvbmUoKSwgU3RyaW5nKHUnLCAnKSwgU3RyaW5nKHUiJ19fY2FsbF9fJyIpXQotICAgICAgICByZXR1cm4gQ2FsbChOYW1lKHUiaGFzYXR0ciIpLCBhcmdzLCBwcmVmaXg9bm9kZS5nZXRfcHJlZml4KCkpCisgICAgICAgIHJldHVybiBDYWxsKE5hbWUodSJoYXNhdHRyIiksIGFyZ3MsIHByZWZpeD1ub2RlLnByZWZpeCkKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9kaWN0LnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2RpY3QucHkKaW5kZXggYjBiOWRlMC4uMDk4ZGU3YyAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2RpY3QucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2RpY3QucHkKQEAgLTYxLDE1ICs2MSwxNSBAQAogICAgICAgICBhcmdzID0gaGVhZCArIFtweXRyZWUuTm9kZShzeW1zLnRyYWlsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEb3QoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUobWV0aG9kX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1tZXRob2QuZ2V0X3ByZWZpeCgpKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9bWV0aG9kLnByZWZpeCldKSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1sicGFyZW5zIl0uY2xvbmUoKV0KICAgICAgICAgbmV3ID0gcHl0cmVlLk5vZGUoc3ltcy5wb3dlciwgYXJncykKICAgICAgICAgaWYgbm90IHNwZWNpYWw6Ci0gICAgICAgICAgICBuZXcuc2V0X3ByZWZpeCh1IiIpCisgICAgICAgICAgICBuZXcucHJlZml4ID0gdSIiCiAgICAgICAgICAgICBuZXcgPSBDYWxsKE5hbWUoaXNpdGVyIGFuZCB1Iml0ZXIiIG9yIHUibGlzdCIpLCBbbmV3XSkKICAgICAgICAgaWYgdGFpbDoKICAgICAgICAgICAgIG5ldyA9IHB5dHJlZS5Ob2RlKHN5bXMucG93ZXIsIFtuZXddICsgdGFpbCkKLSAgICAgICAgbmV3LnNldF9wcmVmaXgobm9kZS5nZXRfcHJlZml4KCkpCisgICAgICAgIG5ldy5wcmVmaXggPSBub2RlLnByZWZpeAogICAgICAgICByZXR1cm4gbmV3CiAKICAgICBQMSA9ICJwb3dlcjwgZnVuYz1OQU1FIHRyYWlsZXI8ICcoJyBub2RlPWFueSAnKScgPiBhbnkqID4iCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfZXhjZXB0LnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2V4Y2VwdC5weQppbmRleCBlZGFjOTdlLi44MTE4MDU4IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfZXhjZXB0LnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9leGNlcHQucHkKQEAgLTM2LDExICszNiwxMSBAQAogY2xhc3MgRml4RXhjZXB0KGZpeGVyX2Jhc2UuQmFzZUZpeCk6CiAKICAgICBQQVRURVJOID0gIiIiCi0gICAgdHJ5X3N0bXQ8ICd0cnknICc6JyBzdWl0ZQotICAgICAgICAgICAgICAgICAgY2xlYW51cD0oZXhjZXB0X2NsYXVzZSAnOicgc3VpdGUpKwotICAgICAgICAgICAgICAgICAgdGFpbD0oWydleGNlcHQnICc6JyBzdWl0ZV0KLSAgICAgICAgICAgICAgICAgICAgICAgIFsnZWxzZScgJzonIHN1aXRlXQotICAgICAgICAgICAgICAgICAgICAgICAgWydmaW5hbGx5JyAnOicgc3VpdGVdKSA+CisgICAgdHJ5X3N0bXQ8ICd0cnknICc6JyAoc2ltcGxlX3N0bXQgfCBzdWl0ZSkKKyAgICAgICAgICAgICAgICAgIGNsZWFudXA9KGV4Y2VwdF9jbGF1c2UgJzonIChzaW1wbGVfc3RtdCB8IHN1aXRlKSkrCisgICAgICAgICAgICAgICAgICB0YWlsPShbJ2V4Y2VwdCcgJzonIChzaW1wbGVfc3RtdCB8IHN1aXRlKV0KKyAgICAgICAgICAgICAgICAgICAgICAgIFsnZWxzZScgJzonIChzaW1wbGVfc3RtdCB8IHN1aXRlKV0KKyAgICAgICAgICAgICAgICAgICAgICAgIFsnZmluYWxseScgJzonIChzaW1wbGVfc3RtdCB8IHN1aXRlKV0pID4KICAgICAiIiIKIAogICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CkBAIC01OCw3ICs1OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICMgR2VuZXJhdGUgYSBuZXcgTiBmb3IgdGhlIGV4Y2VwdCBjbGF1c2UKICAgICAgICAgICAgICAgICAgICAgbmV3X04gPSBOYW1lKHNlbGYubmV3X25hbWUoKSwgcHJlZml4PXUiICIpCiAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IE4uY2xvbmUoKQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0X3ByZWZpeCh1IiIpCisgICAgICAgICAgICAgICAgICAgIHRhcmdldC5wcmVmaXggPSB1IiIKICAgICAgICAgICAgICAgICAgICAgTi5yZXBsYWNlKG5ld19OKQogICAgICAgICAgICAgICAgICAgICBuZXdfTiA9IG5ld19OLmNsb25lKCkKIApAQCAtODIsMTAgKzgyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGZvciBjaGlsZCBpbiByZXZlcnNlZChzdWl0ZV9zdG10c1s6aV0pOgogICAgICAgICAgICAgICAgICAgICAgICAgZV9zdWl0ZS5pbnNlcnRfY2hpbGQoMCwgY2hpbGQpCiAgICAgICAgICAgICAgICAgICAgIGVfc3VpdGUuaW5zZXJ0X2NoaWxkKGksIGFzc2lnbikKLSAgICAgICAgICAgICAgICBlbGlmIE4uZ2V0X3ByZWZpeCgpID09IHUiIjoKKyAgICAgICAgICAgICAgICBlbGlmIE4ucHJlZml4ID09IHUiIjoKICAgICAgICAgICAgICAgICAgICAgIyBObyBzcGFjZSBhZnRlciBhIGNvbW1hIGlzIGxlZ2FsOyBubyBzcGFjZSBhZnRlciAiYXMiLAogICAgICAgICAgICAgICAgICAgICAjIG5vdCBzbyBtdWNoLgotICAgICAgICAgICAgICAgICAgICBOLnNldF9wcmVmaXgodSIgIikKKyAgICAgICAgICAgICAgICAgICAgTi5wcmVmaXggPSB1IiAiCiAKICAgICAgICAgI1RPRE8oY3dpbnRlcikgZml4IHRoaXMgd2hlbiBjaGlsZHJlbiBiZWNvbWVzIGEgc21hcnQgbGlzdAogICAgICAgICBjaGlsZHJlbiA9IFtjLmNsb25lKCkgZm9yIGMgaW4gbm9kZS5jaGlsZHJlbls6M11dICsgdHJ5X2NsZWFudXAgKyB0YWlsCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfZXhlYy5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9leGVjLnB5CmluZGV4IGFkYzhlYjAuLjEyMTQzMWMgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9leGVjLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9leGVjLnB5CkBAIC0zMCwxMCArMzAsMTAgQEAKICAgICAgICAgYiA9IHJlc3VsdHMuZ2V0KCJiIikKICAgICAgICAgYyA9IHJlc3VsdHMuZ2V0KCJjIikKICAgICAgICAgYXJncyA9IFthLmNsb25lKCldCi0gICAgICAgIGFyZ3NbMF0uc2V0X3ByZWZpeCgiIikKKyAgICAgICAgYXJnc1swXS5wcmVmaXggPSAiIgogICAgICAgICBpZiBiIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgYXJncy5leHRlbmQoW0NvbW1hKCksIGIuY2xvbmUoKV0pCiAgICAgICAgIGlmIGMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBhcmdzLmV4dGVuZChbQ29tbWEoKSwgYy5jbG9uZSgpXSkKIAotICAgICAgICByZXR1cm4gQ2FsbChOYW1lKHUiZXhlYyIpLCBhcmdzLCBwcmVmaXg9bm9kZS5nZXRfcHJlZml4KCkpCisgICAgICAgIHJldHVybiBDYWxsKE5hbWUodSJleGVjIiksIGFyZ3MsIHByZWZpeD1ub2RlLnByZWZpeCkKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9leGVjZmlsZS5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9leGVjZmlsZS5weQppbmRleCBkODk5N2NmLi4zOGQ2YWJjIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfZXhlY2ZpbGUucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWNmaWxlLnB5CkBAIC0zOCw3ICszOCw3IEBACiAgICAgICAgICMgV3JhcCB0aGUgb3BlbiBjYWxsIGluIGEgY29tcGlsZSBjYWxsLiBUaGlzIGlzIHNvIHRoZSBmaWxlbmFtZSB3aWxsIGJlCiAgICAgICAgICMgcHJlc2VydmVkIGluIHRoZSBleGVjZWQgY29kZS4KICAgICAgICAgZmlsZW5hbWVfYXJnID0gZmlsZW5hbWUuY2xvbmUoKQotICAgICAgICBmaWxlbmFtZV9hcmcuc2V0X3ByZWZpeCh1IiAiKQorICAgICAgICBmaWxlbmFtZV9hcmcucHJlZml4ID0gdSIgIgogICAgICAgICBleGVjX3N0ciA9IFN0cmluZyh1IidleGVjJyIsIHUiICIpCiAgICAgICAgIGNvbXBpbGVfYXJncyA9IG9wZW5fZXhwciArIFtDb21tYSgpLCBmaWxlbmFtZV9hcmcsIENvbW1hKCksIGV4ZWNfc3RyXQogICAgICAgICBjb21waWxlX2NhbGwgPSBDYWxsKE5hbWUodSJjb21waWxlIiksIGNvbXBpbGVfYXJncywgdSIiKQpAQCAtNDgsNCArNDgsNCBAQAogICAgICAgICAgICAgYXJncy5leHRlbmQoW0NvbW1hKCksIGdsb2JhbHMuY2xvbmUoKV0pCiAgICAgICAgIGlmIGxvY2FscyBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGFyZ3MuZXh0ZW5kKFtDb21tYSgpLCBsb2NhbHMuY2xvbmUoKV0pCi0gICAgICAgIHJldHVybiBDYWxsKE5hbWUodSJleGVjIiksIGFyZ3MsIHByZWZpeD1ub2RlLmdldF9wcmVmaXgoKSkKKyAgICAgICAgcmV0dXJuIENhbGwoTmFtZSh1ImV4ZWMiKSwgYXJncywgcHJlZml4PW5vZGUucHJlZml4KQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ZpbHRlci5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9maWx0ZXIucHkKaW5kZXggOTQ2YmUzZS4uMGU5MmIxNCAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ZpbHRlci5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfZmlsdGVyLnB5CkBAIC02OSw3ICs2OSw3IEBACiAgICAgICAgICAgICBpZiBpbl9zcGVjaWFsX2NvbnRleHQobm9kZSk6CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgIG5ldyA9IG5vZGUuY2xvbmUoKQotICAgICAgICAgICAgbmV3LnNldF9wcmVmaXgodSIiKQorICAgICAgICAgICAgbmV3LnByZWZpeCA9IHUiIgogICAgICAgICAgICAgbmV3ID0gQ2FsbChOYW1lKHUibGlzdCIpLCBbbmV3XSkKLSAgICAgICAgbmV3LnNldF9wcmVmaXgobm9kZS5nZXRfcHJlZml4KCkpCisgICAgICAgIG5ldy5wcmVmaXggPSBub2RlLnByZWZpeAogICAgICAgICByZXR1cm4gbmV3CmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfZnVuY2F0dHJzLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2Z1bmNhdHRycy5weQppbmRleCA2ODBjYjM1Li41ZDFiYThjIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfZnVuY2F0dHJzLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9mdW5jYXR0cnMucHkKQEAgLTE2LDQgKzE2LDQgQEAKICAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgogICAgICAgICBhdHRyID0gcmVzdWx0c1siYXR0ciJdWzBdCiAgICAgICAgIGF0dHIucmVwbGFjZShOYW1lKCh1Il9fJXNfXyIgJSBhdHRyLnZhbHVlWzU6XSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1hdHRyLmdldF9wcmVmaXgoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1hdHRyLnByZWZpeCkpCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfZnV0dXJlLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2Z1dHVyZS5weQppbmRleCBhMDMyZTg4Li44NjFlMTNjIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfZnV0dXJlLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9mdXR1cmUucHkKQEAgLTE2LDUgKzE2LDUgQEAKIAogICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CiAgICAgICAgIG5ldyA9IEJsYW5rTGluZSgpCi0gICAgICAgIG5ldy5wcmVmaXggPSBub2RlLmdldF9wcmVmaXgoKQorICAgICAgICBuZXcucHJlZml4ID0gbm9kZS5wcmVmaXgKICAgICAgICAgcmV0dXJuIG5ldwpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2dldGN3ZHUucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfZ2V0Y3dkdS5weQppbmRleCAxZTFlMmZlLi5hNWI1YWEzIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfZ2V0Y3dkdS5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfZ2V0Y3dkdS5weQpAQCAtMTUsNCArMTUsNCBAQAogCiAgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKICAgICAgICAgbmFtZSA9IHJlc3VsdHNbIm5hbWUiXQotICAgICAgICBuYW1lLnJlcGxhY2UoTmFtZSh1ImdldGN3ZCIsIHByZWZpeD1uYW1lLmdldF9wcmVmaXgoKSkpCisgICAgICAgIG5hbWUucmVwbGFjZShOYW1lKHUiZ2V0Y3dkIiwgcHJlZml4PW5hbWUucHJlZml4KSkKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9oYXNfa2V5LnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2hhc19rZXkucHkKaW5kZXggZWM3MjEwYS4uMDkxNWEzNiAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2hhc19rZXkucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2hhc19rZXkucHkKQEAgLTc4LDcgKzc4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgIG5lZ2F0aW9uID0gcmVzdWx0cy5nZXQoIm5lZ2F0aW9uIikKICAgICAgICAgYW5jaG9yID0gcmVzdWx0c1siYW5jaG9yIl0KLSAgICAgICAgcHJlZml4ID0gbm9kZS5nZXRfcHJlZml4KCkKKyAgICAgICAgcHJlZml4ID0gbm9kZS5wcmVmaXgKICAgICAgICAgYmVmb3JlID0gW24uY2xvbmUoKSBmb3IgbiBpbiByZXN1bHRzWyJiZWZvcmUiXV0KICAgICAgICAgYXJnID0gcmVzdWx0c1siYXJnIl0uY2xvbmUoKQogICAgICAgICBhZnRlciA9IHJlc3VsdHMuZ2V0KCJhZnRlciIpCkBAIC05MSw3ICs5MSw3IEBACiAgICAgICAgICAgICBiZWZvcmUgPSBiZWZvcmVbMF0KICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGJlZm9yZSA9IHB5dHJlZS5Ob2RlKHN5bXMucG93ZXIsIGJlZm9yZSkKLSAgICAgICAgYmVmb3JlLnNldF9wcmVmaXgodSIgIikKKyAgICAgICAgYmVmb3JlLnByZWZpeCA9IHUiICIKICAgICAgICAgbl9vcCA9IE5hbWUodSJpbiIsIHByZWZpeD11IiAiKQogICAgICAgICBpZiBuZWdhdGlvbjoKICAgICAgICAgICAgIG5fbm90ID0gTmFtZSh1Im5vdCIsIHByZWZpeD11IiAiKQpAQCAtMTA1LDUgKzEwNSw1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXMuYXJpdGhfZXhwciwgc3ltcy50ZXJtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1zLmZhY3Rvciwgc3ltcy5wb3dlcik6CiAgICAgICAgICAgICBuZXcgPSBwYXJlbnRoZXNpemUobmV3KQotICAgICAgICBuZXcuc2V0X3ByZWZpeChwcmVmaXgpCisgICAgICAgIG5ldy5wcmVmaXggPSBwcmVmaXgKICAgICAgICAgcmV0dXJuIG5ldwpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2lkaW9tcy5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9pZGlvbXMucHkKaW5kZXggNjk3N2M3Zi4uNzFkZmY1YiAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2lkaW9tcy5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfaWRpb21zLnB5CkBAIC0xMDEsMTggKzEwMSwxOCBAQAogICAgIGRlZiB0cmFuc2Zvcm1faXNpbnN0YW5jZShzZWxmLCBub2RlLCByZXN1bHRzKToKICAgICAgICAgeCA9IHJlc3VsdHNbIngiXS5jbG9uZSgpICMgVGhlIHRoaW5nIGluc2lkZSBvZiB0eXBlKCkKICAgICAgICAgVCA9IHJlc3VsdHNbIlQiXS5jbG9uZSgpICMgVGhlIHR5cGUgYmVpbmcgY29tcGFyZWQgYWdhaW5zdAotICAgICAgICB4LnNldF9wcmVmaXgoIiIpCi0gICAgICAgIFQuc2V0X3ByZWZpeCgiICIpCi0gICAgICAgIHRlc3QgPSBDYWxsKE5hbWUoImlzaW5zdGFuY2UiKSwgW3gsIENvbW1hKCksIFRdKQorICAgICAgICB4LnByZWZpeCA9IHUiIgorICAgICAgICBULnByZWZpeCA9IHUiICIKKyAgICAgICAgdGVzdCA9IENhbGwoTmFtZSh1ImlzaW5zdGFuY2UiKSwgW3gsIENvbW1hKCksIFRdKQogICAgICAgICBpZiAibiIgaW4gcmVzdWx0czoKLSAgICAgICAgICAgIHRlc3Quc2V0X3ByZWZpeCh1IiAiKQorICAgICAgICAgICAgdGVzdC5wcmVmaXggPSB1IiAiCiAgICAgICAgICAgICB0ZXN0ID0gTm9kZShzeW1zLm5vdF90ZXN0LCBbTmFtZSh1Im5vdCIpLCB0ZXN0XSkKLSAgICAgICAgdGVzdC5zZXRfcHJlZml4KG5vZGUuZ2V0X3ByZWZpeCgpKQorICAgICAgICB0ZXN0LnByZWZpeCA9IG5vZGUucHJlZml4CiAgICAgICAgIHJldHVybiB0ZXN0CiAKICAgICBkZWYgdHJhbnNmb3JtX3doaWxlKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgogICAgICAgICBvbmUgPSByZXN1bHRzWyJ3aGlsZSJdCi0gICAgICAgIG9uZS5yZXBsYWNlKE5hbWUodSJUcnVlIiwgcHJlZml4PW9uZS5nZXRfcHJlZml4KCkpKQorICAgICAgICBvbmUucmVwbGFjZShOYW1lKHUiVHJ1ZSIsIHByZWZpeD1vbmUucHJlZml4KSkKIAogICAgIGRlZiB0cmFuc2Zvcm1fc29ydChzZWxmLCBub2RlLCByZXN1bHRzKToKICAgICAgICAgc29ydF9zdG10ID0gcmVzdWx0c1sic29ydCJdCkBAIC0xMjEsMTQgKzEyMSwxNCBAQAogICAgICAgICBzaW1wbGVfZXhwciA9IHJlc3VsdHMuZ2V0KCJleHByIikKIAogICAgICAgICBpZiBsaXN0X2NhbGw6Ci0gICAgICAgICAgICBsaXN0X2NhbGwucmVwbGFjZShOYW1lKHUic29ydGVkIiwgcHJlZml4PWxpc3RfY2FsbC5nZXRfcHJlZml4KCkpKQorICAgICAgICAgICAgbGlzdF9jYWxsLnJlcGxhY2UoTmFtZSh1InNvcnRlZCIsIHByZWZpeD1saXN0X2NhbGwucHJlZml4KSkKICAgICAgICAgZWxpZiBzaW1wbGVfZXhwcjoKICAgICAgICAgICAgIG5ldyA9IHNpbXBsZV9leHByLmNsb25lKCkKLSAgICAgICAgICAgIG5ldy5zZXRfcHJlZml4KHUiIikKKyAgICAgICAgICAgIG5ldy5wcmVmaXggPSB1IiIKICAgICAgICAgICAgIHNpbXBsZV9leHByLnJlcGxhY2UoQ2FsbChOYW1lKHUic29ydGVkIiksIFtuZXddLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1zaW1wbGVfZXhwci5nZXRfcHJlZml4KCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1zaW1wbGVfZXhwci5wcmVmaXgpKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJzaG91bGQgbm90IGhhdmUgcmVhY2hlZCBoZXJlIikKICAgICAgICAgc29ydF9zdG10LnJlbW92ZSgpCiAgICAgICAgIGlmIG5leHRfc3RtdDoKLSAgICAgICAgICAgIG5leHRfc3RtdFswXS5zZXRfcHJlZml4KHNvcnRfc3RtdC5nZXRfcHJlZml4KCkpCisgICAgICAgICAgICBuZXh0X3N0bXRbMF0ucHJlZml4ID0gc29ydF9zdG10LnByZWZpeApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydC5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnQucHkKaW5kZXggNTBmZmI0MS4uMGE5OGNjMyAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydC5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0LnB5CkBAIC03Myw3ICs3Myw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuCiAKICAgICAgICAgICAgIG5ldyA9IEZyb21JbXBvcnQoJy4nLCBbaW1wXSkKLSAgICAgICAgICAgIG5ldy5zZXRfcHJlZml4KG5vZGUuZ2V0X3ByZWZpeCgpKQorICAgICAgICAgICAgbmV3LnByZWZpeCA9IG5vZGUucHJlZml4CiAgICAgICAgICAgICByZXR1cm4gbmV3CiAKICAgICBkZWYgcHJvYmFibHlfYV9sb2NhbF9pbXBvcnQoc2VsZiwgaW1wX25hbWUpOgpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0cy5weQppbmRleCAzMjM2YTA4Li4wMGYwYTc1IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0cy5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0cy5weQpAQCAtMTI0LDcgKzEyNCw3IEBACiAgICAgICAgIGlmIGltcG9ydF9tb2Q6CiAgICAgICAgICAgICBtb2RfbmFtZSA9IGltcG9ydF9tb2QudmFsdWUKICAgICAgICAgICAgIG5ld19uYW1lID0gdW5pY29kZShzZWxmLm1hcHBpbmdbbW9kX25hbWVdKQotICAgICAgICAgICAgaW1wb3J0X21vZC5yZXBsYWNlKE5hbWUobmV3X25hbWUsIHByZWZpeD1pbXBvcnRfbW9kLmdldF9wcmVmaXgoKSkpCisgICAgICAgICAgICBpbXBvcnRfbW9kLnJlcGxhY2UoTmFtZShuZXdfbmFtZSwgcHJlZml4PWltcG9ydF9tb2QucHJlZml4KSkKICAgICAgICAgICAgIGlmICJuYW1lX2ltcG9ydCIgaW4gcmVzdWx0czoKICAgICAgICAgICAgICAgICAjIElmIGl0J3Mgbm90IGEgImZyb20geCBpbXBvcnQgeCwgeSIgb3IgImltcG9ydCB4IGFzIHkiIGltcG9ydCwKICAgICAgICAgICAgICAgICAjIG1hcmtlZCBpdHMgdXNhZ2UgdG8gYmUgcmVwbGFjZWQuCkBAIC0xNDIsNCArMTQyLDQgQEAKICAgICAgICAgICAgIGJhcmVfbmFtZSA9IHJlc3VsdHNbImJhcmVfd2l0aF9hdHRyIl1bMF0KICAgICAgICAgICAgIG5ld19uYW1lID0gc2VsZi5yZXBsYWNlLmdldChiYXJlX25hbWUudmFsdWUpCiAgICAgICAgICAgICBpZiBuZXdfbmFtZToKLSAgICAgICAgICAgICAgICBiYXJlX25hbWUucmVwbGFjZShOYW1lKG5ld19uYW1lLCBwcmVmaXg9YmFyZV9uYW1lLmdldF9wcmVmaXgoKSkpCisgICAgICAgICAgICAgICAgYmFyZV9uYW1lLnJlcGxhY2UoTmFtZShuZXdfbmFtZSwgcHJlZml4PWJhcmVfbmFtZS5wcmVmaXgpKQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2lucHV0LnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2lucHV0LnB5CmluZGV4IDNlMzMwZjYuLjI5MWNhZGYgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9pbnB1dC5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfaW5wdXQucHkKQEAgLTIyLDUgKzIyLDUgQEAKICAgICAgICAgICAgIHJldHVybgogCiAgICAgICAgIG5ldyA9IG5vZGUuY2xvbmUoKQotICAgICAgICBuZXcuc2V0X3ByZWZpeCh1IiIpCi0gICAgICAgIHJldHVybiBDYWxsKE5hbWUodSJldmFsIiksIFtuZXddLCBwcmVmaXg9bm9kZS5nZXRfcHJlZml4KCkpCisgICAgICAgIG5ldy5wcmVmaXggPSB1IiIKKyAgICAgICAgcmV0dXJuIENhbGwoTmFtZSh1ImV2YWwiKSwgW25ld10sIHByZWZpeD1ub2RlLnByZWZpeCkKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9pbnRlcm4ucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfaW50ZXJuLnB5CmluZGV4IDQ2ZTUyMzkuLjY3Zjk4ZWYgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9pbnRlcm4ucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ludGVybi5weQpAQCAtMzksNiArMzksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdHNbImxwYXIiXS5jbG9uZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2FyZ2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1sicnBhciJdLmNsb25lKCldKV0gKyBhZnRlcikKLSAgICAgICAgbmV3LnNldF9wcmVmaXgobm9kZS5nZXRfcHJlZml4KCkpCisgICAgICAgIG5ldy5wcmVmaXggPSBub2RlLnByZWZpeAogICAgICAgICB0b3VjaF9pbXBvcnQoTm9uZSwgdSdzeXMnLCBub2RlKQogICAgICAgICByZXR1cm4gbmV3CmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfaXNpbnN0YW5jZS5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9pc2luc3RhbmNlLnB5CmluZGV4IDI5NTU3N2EuLmM3MjBhODMgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9pc2luc3RhbmNlLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9pc2luc3RhbmNlLnB5CkBAIC00NSw3ICs0NSw3IEBACiAgICAgICAgICAgICBkZWwgbmV3X2FyZ3NbLTFdCiAgICAgICAgIGlmIGxlbihuZXdfYXJncykgPT0gMToKICAgICAgICAgICAgIGF0b20gPSB0ZXN0bGlzdC5wYXJlbnQKLSAgICAgICAgICAgIG5ld19hcmdzWzBdLnNldF9wcmVmaXgoYXRvbS5nZXRfcHJlZml4KCkpCisgICAgICAgICAgICBuZXdfYXJnc1swXS5wcmVmaXggPSBhdG9tLnByZWZpeAogICAgICAgICAgICAgYXRvbS5yZXBsYWNlKG5ld19hcmdzWzBdKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgYXJnc1s6XSA9IG5ld19hcmdzCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfaXRlcnRvb2xzLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2l0ZXJ0b29scy5weQppbmRleCBkNzgxY2YzLi43N2IzYTAxIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfaXRlcnRvb2xzLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9pdGVydG9vbHMucHkKQEAgLTMwLDEyICszMCwxMiBAQAogICAgICAgICBpZiAnaXQnIGluIHJlc3VsdHMgYW5kIGZ1bmMudmFsdWUgIT0gdSdpZmlsdGVyZmFsc2UnOgogICAgICAgICAgICAgZG90LCBpdCA9IChyZXN1bHRzWydkb3QnXSwgcmVzdWx0c1snaXQnXSkKICAgICAgICAgICAgICMgUmVtb3ZlIHRoZSAnaXRlcnRvb2xzJwotICAgICAgICAgICAgcHJlZml4ID0gaXQuZ2V0X3ByZWZpeCgpCisgICAgICAgICAgICBwcmVmaXggPSBpdC5wcmVmaXgKICAgICAgICAgICAgIGl0LnJlbW92ZSgpCiAgICAgICAgICAgICAjIFJlcGxhY2UgdGhlIG5vZGUgd2ljaCBjb250YWlucyAoJy4nLCAnZnVuY3Rpb24nKSB3aXRoIHRoZQogICAgICAgICAgICAgIyBmdW5jdGlvbiAodG8gYmUgY29uc2lzdGFudCB3aXRoIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgcGF0dGVybikKICAgICAgICAgICAgIGRvdC5yZW1vdmUoKQogICAgICAgICAgICAgZnVuYy5wYXJlbnQucmVwbGFjZShmdW5jKQogCi0gICAgICAgIHByZWZpeCA9IHByZWZpeCBvciBmdW5jLmdldF9wcmVmaXgoKQorICAgICAgICBwcmVmaXggPSBwcmVmaXggb3IgZnVuYy5wcmVmaXgKICAgICAgICAgZnVuYy5yZXBsYWNlKE5hbWUoZnVuYy52YWx1ZVsxOl0sIHByZWZpeD1wcmVmaXgpKQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2l0ZXJ0b29sc19pbXBvcnRzLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2l0ZXJ0b29sc19pbXBvcnRzLnB5CmluZGV4IDRkZjIzMDEuLmFiNDNkY2QgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9pdGVydG9vbHNfaW1wb3J0cy5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfaXRlcnRvb2xzX2ltcG9ydHMucHkKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICAgICAgIyBJZiB0aGVyZSBhcmUgbm8gaW1wb3J0cyBsZWZ0LCBqdXN0IGdldCByaWQgb2YgdGhlIGVudGlyZSBzdGF0ZW1lbnQKICAgICAgICAgaWYgbm90IChpbXBvcnRzLmNoaWxkcmVuIG9yIGdldGF0dHIoaW1wb3J0cywgJ3ZhbHVlJywgTm9uZSkpIG9yIFwKICAgICAgICAgICAgICAgICBpbXBvcnRzLnBhcmVudCBpcyBOb25lOgotICAgICAgICAgICAgcCA9IG5vZGUuZ2V0X3ByZWZpeCgpCisgICAgICAgICAgICBwID0gbm9kZS5wcmVmaXgKICAgICAgICAgICAgIG5vZGUgPSBCbGFua0xpbmUoKQogICAgICAgICAgICAgbm9kZS5wcmVmaXggPSBwCiAgICAgICAgIHJldHVybiBub2RlCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfbG9uZy5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9sb25nLnB5CmluZGV4IDMyMzI5MDIuLjczYWJhNDggMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9sb25nLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9sb25nLnB5CkBAIC0xOCw1ICsxOCw1IEBACiAgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKICAgICAgICAgaWYgaXNfcHJvYmFibHlfYnVpbHRpbihub2RlKToKICAgICAgICAgICAgIG5ldyA9IHNlbGYuc3RhdGljX2ludC5jbG9uZSgpCi0gICAgICAgICAgICBuZXcuc2V0X3ByZWZpeChub2RlLmdldF9wcmVmaXgoKSkKKyAgICAgICAgICAgIG5ldy5wcmVmaXggPSBub2RlLnByZWZpeAogICAgICAgICAgICAgcmV0dXJuIG5ldwpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X21hcC5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9tYXAucHkKaW5kZXggYzU3MTU0ZC4uOGI1NWI1NiAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X21hcC5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfbWFwLnB5CkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgIGlmIG5vZGUucGFyZW50LnR5cGUgPT0gc3ltcy5zaW1wbGVfc3RtdDoKICAgICAgICAgICAgIHNlbGYud2FybmluZyhub2RlLCAiWW91IHNob3VsZCB1c2UgYSBmb3IgbG9vcCBoZXJlIikKICAgICAgICAgICAgIG5ldyA9IG5vZGUuY2xvbmUoKQotICAgICAgICAgICAgbmV3LnNldF9wcmVmaXgodSIiKQorICAgICAgICAgICAgbmV3LnByZWZpeCA9IHUiIgogICAgICAgICAgICAgbmV3ID0gQ2FsbChOYW1lKHUibGlzdCIpLCBbbmV3XSkKICAgICAgICAgZWxpZiAibWFwX2xhbWJkYSIgaW4gcmVzdWx0czoKICAgICAgICAgICAgIG5ldyA9IExpc3RDb21wKHJlc3VsdHMuZ2V0KCJ4cCIpLmNsb25lKCksCkBAIC03Niw3ICs3Niw3IEBACiAgICAgICAgICAgICAgICAgaWYgaW5fc3BlY2lhbF9jb250ZXh0KG5vZGUpOgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICAgICAgIG5ldyA9IG5vZGUuY2xvbmUoKQotICAgICAgICAgICAgbmV3LnNldF9wcmVmaXgodSIiKQorICAgICAgICAgICAgbmV3LnByZWZpeCA9IHUiIgogICAgICAgICAgICAgbmV3ID0gQ2FsbChOYW1lKHUibGlzdCIpLCBbbmV3XSkKLSAgICAgICAgbmV3LnNldF9wcmVmaXgobm9kZS5nZXRfcHJlZml4KCkpCisgICAgICAgIG5ldy5wcmVmaXggPSBub2RlLnByZWZpeAogICAgICAgICByZXR1cm4gbmV3CmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfbWV0YWNsYXNzLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X21ldGFjbGFzcy5weQppbmRleCAzYjFiM2VhLi5lZDhlNWQ1IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfbWV0YWNsYXNzLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9tZXRhY2xhc3MucHkKQEAgLTg5LDcgKzg5LDcgQEAKICAgICBwYXJlbnQuaW5zZXJ0X2NoaWxkKGksIG5ld19zdG10KQogICAgIG5ld19sZWFmMSA9IG5ld19zdG10LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdCiAgICAgb2xkX2xlYWYxID0gc3RtdF9ub2RlLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdCi0gICAgbmV3X2xlYWYxLnNldF9wcmVmaXgob2xkX2xlYWYxLmdldF9wcmVmaXgoKSkKKyAgICBuZXdfbGVhZjEucHJlZml4ID0gb2xkX2xlYWYxLnByZWZpeAogCiAKIGRlZiByZW1vdmVfdHJhaWxpbmdfbmV3bGluZShub2RlKToKQEAgLTEzNiw3ICsxMzYsNyBAQAogICAgICAgICBub2RlID0ga2lkcy5wb3AoKQogICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIExlYWYpIGFuZCBub2RlLnR5cGUgIT0gdG9rZW4uREVERU5UOgogICAgICAgICAgICAgaWYgbm9kZS5wcmVmaXg6Ci0gICAgICAgICAgICAgICAgbm9kZS5zZXRfcHJlZml4KCcnKQorICAgICAgICAgICAgICAgIG5vZGUucHJlZml4ID0gdScnCiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGtpZHMuZXh0ZW5kKG5vZGUuY2hpbGRyZW5bOjotMV0pCkBAIC0xOTEsMTkgKzE5MSwxOSBAQAogICAgICAgICAjIG5vdyBzdGljayB0aGUgbWV0YWNsYXNzIGluIHRoZSBhcmdsaXN0CiAgICAgICAgIG1ldGFfdHh0ID0gbGFzdF9tZXRhY2xhc3MuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0KICAgICAgICAgbWV0YV90eHQudmFsdWUgPSAnbWV0YWNsYXNzJwotICAgICAgICBvcmlnX21ldGFfcHJlZml4ID0gbWV0YV90eHQuZ2V0X3ByZWZpeCgpCisgICAgICAgIG9yaWdfbWV0YV9wcmVmaXggPSBtZXRhX3R4dC5wcmVmaXgKIAogICAgICAgICBpZiBhcmdsaXN0LmNoaWxkcmVuOgogICAgICAgICAgICAgYXJnbGlzdC5hcHBlbmRfY2hpbGQoTGVhZih0b2tlbi5DT01NQSwgdScsJykpCi0gICAgICAgICAgICBtZXRhX3R4dC5zZXRfcHJlZml4KHUnICcpCisgICAgICAgICAgICBtZXRhX3R4dC5wcmVmaXggPSB1JyAnCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBtZXRhX3R4dC5zZXRfcHJlZml4KHUnJykKKyAgICAgICAgICAgIG1ldGFfdHh0LnByZWZpeCA9IHUnJwogCiAgICAgICAgICMgY29tcGFjdCB0aGUgZXhwcmVzc2lvbiAibWV0YWNsYXNzID0gTWV0YSIgLT4gIm1ldGFjbGFzcz1NZXRhIgogICAgICAgICBleHByX3N0bXQgPSBsYXN0X21ldGFjbGFzcy5jaGlsZHJlblswXQogICAgICAgICBhc3NlcnQgZXhwcl9zdG10LnR5cGUgPT0gc3ltcy5leHByX3N0bXQKLSAgICAgICAgZXhwcl9zdG10LmNoaWxkcmVuWzFdLnNldF9wcmVmaXgodScnKQotICAgICAgICBleHByX3N0bXQuY2hpbGRyZW5bMl0uc2V0X3ByZWZpeCh1JycpCisgICAgICAgIGV4cHJfc3RtdC5jaGlsZHJlblsxXS5wcmVmaXggPSB1JycKKyAgICAgICAgZXhwcl9zdG10LmNoaWxkcmVuWzJdLnByZWZpeCA9IHUnJwogCiAgICAgICAgIGFyZ2xpc3QuYXBwZW5kX2NoaWxkKGxhc3RfbWV0YWNsYXNzKQogCkBAIC0yMTQsNyArMjE0LDcgQEAKICAgICAgICAgICAgICMgb25lLWxpbmVyIHRoYXQgd2FzIGp1c3QgX19tZXRhY2xhc3NfCiAgICAgICAgICAgICBzdWl0ZS5yZW1vdmUoKQogICAgICAgICAgICAgcGFzc19sZWFmID0gTGVhZih0ZXh0X3R5cGUsIHUncGFzcycpCi0gICAgICAgICAgICBwYXNzX2xlYWYuc2V0X3ByZWZpeChvcmlnX21ldGFfcHJlZml4KQorICAgICAgICAgICAgcGFzc19sZWFmLnByZWZpeCA9IG9yaWdfbWV0YV9wcmVmaXgKICAgICAgICAgICAgIG5vZGUuYXBwZW5kX2NoaWxkKHBhc3NfbGVhZikKICAgICAgICAgICAgIG5vZGUuYXBwZW5kX2NoaWxkKExlYWYodG9rZW4uTkVXTElORSwgdSdcbicpKQogCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfbWV0aG9kYXR0cnMucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfbWV0aG9kYXR0cnMucHkKaW5kZXggNmNhMjc0MS4uNWU5NGE5YyAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X21ldGhvZGF0dHJzLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9tZXRob2RhdHRycy5weQpAQCAtMjAsNCArMjAsNCBAQAogICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CiAgICAgICAgIGF0dHIgPSByZXN1bHRzWyJhdHRyIl1bMF0KICAgICAgICAgbmV3ID0gdW5pY29kZShNQVBbYXR0ci52YWx1ZV0pCi0gICAgICAgIGF0dHIucmVwbGFjZShOYW1lKG5ldywgcHJlZml4PWF0dHIuZ2V0X3ByZWZpeCgpKSkKKyAgICAgICAgYXR0ci5yZXBsYWNlKE5hbWUobmV3LCBwcmVmaXg9YXR0ci5wcmVmaXgpKQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X25lLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X25lLnB5CmluZGV4IDI1MzVlMzIuLjIzZmU4NjkgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9uZS5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfbmUucHkKQEAgLTE3LDYgKzE3LDUgQEAKICAgICAgICAgcmV0dXJuIG5vZGUudHlwZSA9PSB0b2tlbi5OT1RFUVVBTCBhbmQgbm9kZS52YWx1ZSA9PSB1Ijw+IgogCiAgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKLSAgICAgICAgbmV3ID0gcHl0cmVlLkxlYWYodG9rZW4uTk9URVFVQUwsIHUiIT0iKQotICAgICAgICBuZXcuc2V0X3ByZWZpeChub2RlLmdldF9wcmVmaXgoKSkKKyAgICAgICAgbmV3ID0gcHl0cmVlLkxlYWYodG9rZW4uTk9URVFVQUwsIHUiIT0iLCBwcmVmaXg9bm9kZS5wcmVmaXgpCiAgICAgICAgIHJldHVybiBuZXcKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9uZXh0LnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X25leHQucHkKaW5kZXggODE1NjgxNC4uYzcwZjcyYiAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X25leHQucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X25leHQucHkKQEAgLTQ4LDE3ICs0OCwxNiBAQAogICAgICAgICBiYXNlID0gcmVzdWx0cy5nZXQoImJhc2UiKQogICAgICAgICBhdHRyID0gcmVzdWx0cy5nZXQoImF0dHIiKQogICAgICAgICBuYW1lID0gcmVzdWx0cy5nZXQoIm5hbWUiKQotICAgICAgICBtb2QgPSByZXN1bHRzLmdldCgibW9kIikKIAogICAgICAgICBpZiBiYXNlOgogICAgICAgICAgICAgaWYgc2VsZi5zaGFkb3dlZF9uZXh0OgotICAgICAgICAgICAgICAgIGF0dHIucmVwbGFjZShOYW1lKHUiX19uZXh0X18iLCBwcmVmaXg9YXR0ci5nZXRfcHJlZml4KCkpKQorICAgICAgICAgICAgICAgIGF0dHIucmVwbGFjZShOYW1lKHUiX19uZXh0X18iLCBwcmVmaXg9YXR0ci5wcmVmaXgpKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBiYXNlID0gW24uY2xvbmUoKSBmb3IgbiBpbiBiYXNlXQotICAgICAgICAgICAgICAgIGJhc2VbMF0uc2V0X3ByZWZpeCh1IiIpCi0gICAgICAgICAgICAgICAgbm9kZS5yZXBsYWNlKENhbGwoTmFtZSh1Im5leHQiLCBwcmVmaXg9bm9kZS5nZXRfcHJlZml4KCkpLCBiYXNlKSkKKyAgICAgICAgICAgICAgICBiYXNlWzBdLnByZWZpeCA9IHUiIgorICAgICAgICAgICAgICAgIG5vZGUucmVwbGFjZShDYWxsKE5hbWUodSJuZXh0IiwgcHJlZml4PW5vZGUucHJlZml4KSwgYmFzZSkpCiAgICAgICAgIGVsaWYgbmFtZToKLSAgICAgICAgICAgIG4gPSBOYW1lKHUiX19uZXh0X18iLCBwcmVmaXg9bmFtZS5nZXRfcHJlZml4KCkpCisgICAgICAgICAgICBuID0gTmFtZSh1Il9fbmV4dF9fIiwgcHJlZml4PW5hbWUucHJlZml4KQogICAgICAgICAgICAgbmFtZS5yZXBsYWNlKG4pCiAgICAgICAgIGVsaWYgYXR0cjoKICAgICAgICAgICAgICMgV2UgZG9uJ3QgZG8gdGhpcyB0cmFuc2Zvcm1hdGlvbiBpZiB3ZSdyZSBhc3NpZ25pbmcgdG8gIngubmV4dCIuCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfbm9uemVyby5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9ub256ZXJvLnB5CmluZGV4IDQ4NjMyZDcuLjE3YmUzNzcgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9ub256ZXJvLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9ub256ZXJvLnB5CkBAIC0xNiw1ICsxNiw1IEBACiAKICAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgogICAgICAgICBuYW1lID0gcmVzdWx0c1sibmFtZSJdCi0gICAgICAgIG5ldyA9IE5hbWUodSJfX2Jvb2xfXyIsIHByZWZpeD1uYW1lLmdldF9wcmVmaXgoKSkKKyAgICAgICAgbmV3ID0gTmFtZSh1Il9fYm9vbF9fIiwgcHJlZml4PW5hbWUucHJlZml4KQogICAgICAgICBuYW1lLnJlcGxhY2UobmV3KQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X251bWxpdGVyYWxzLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X251bWxpdGVyYWxzLnB5CmluZGV4IDg3MTYyM2IuLmEwNDlhZWQgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9udW1saXRlcmFscy5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfbnVtbGl0ZXJhbHMucHkKQEAgLTI0LDQgKzI0LDQgQEAKICAgICAgICAgZWxpZiB2YWwuc3RhcnRzd2l0aCh1JzAnKSBhbmQgdmFsLmlzZGlnaXQoKSBhbmQgbGVuKHNldCh2YWwpKSA+IDE6CiAgICAgICAgICAgICB2YWwgPSB1IjBvIiArIHZhbFsxOl0KIAotICAgICAgICByZXR1cm4gTnVtYmVyKHZhbCwgcHJlZml4PW5vZGUuZ2V0X3ByZWZpeCgpKQorICAgICAgICByZXR1cm4gTnVtYmVyKHZhbCwgcHJlZml4PW5vZGUucHJlZml4KQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3BhcmVuLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3BhcmVuLnB5CmluZGV4IDg2MjAyMDYuLmVlYjBkNDAgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9wYXJlbi5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfcGFyZW4ucHkKQEAgLTM2LDcgKzM2LDcgQEAKICAgICAgICAgdGFyZ2V0ID0gcmVzdWx0c1sidGFyZ2V0Il0KIAogICAgICAgICBscGFyZW4gPSBMUGFyZW4oKQotICAgICAgICBscGFyZW4uc2V0X3ByZWZpeCh0YXJnZXQuZ2V0X3ByZWZpeCgpKQotICAgICAgICB0YXJnZXQuc2V0X3ByZWZpeCh1IiIpICMgTWFrZSBpdCBodWcgdGhlIHBhcmVudGhlc2VzCisgICAgICAgIGxwYXJlbi5wcmVmaXggPSB0YXJnZXQucHJlZml4CisgICAgICAgIHRhcmdldC5wcmVmaXggPSB1IiIgIyBNYWtlIGl0IGh1ZyB0aGUgcGFyZW50aGVzZXMKICAgICAgICAgdGFyZ2V0Lmluc2VydF9jaGlsZCgwLCBscGFyZW4pCiAgICAgICAgIHRhcmdldC5hcHBlbmRfY2hpbGQoUlBhcmVuKCkpCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfcHJpbnQucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfcHJpbnQucHkKaW5kZXggZDNhYTk3NC4uYmUyOWRjZSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3ByaW50LnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9wcmludC5weQpAQCAtNDUsNyArNDUsNyBAQAogICAgICAgICBpZiBiYXJlX3ByaW50OgogICAgICAgICAgICAgIyBTcGVjaWFsLWNhc2UgcHJpbnQgYWxsIGJ5IGl0c2VsZgogICAgICAgICAgICAgYmFyZV9wcmludC5yZXBsYWNlKENhbGwoTmFtZSh1InByaW50IiksIFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1iYXJlX3ByaW50LmdldF9wcmVmaXgoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4PWJhcmVfcHJpbnQucHJlZml4KSkKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBhc3NlcnQgbm9kZS5jaGlsZHJlblswXSA9PSBOYW1lKHUicHJpbnQiKQogICAgICAgICBhcmdzID0gbm9kZS5jaGlsZHJlblsxOl0KQEAgLTY1LDcgKzY1LDcgQEAKICAgICAgICAgIyBOb3cgc3ludGhlc2l6ZSBhIHByaW50KGFyZ3MsIHNlcD0uLi4sIGVuZD0uLi4sIGZpbGU9Li4uKSBub2RlLgogICAgICAgICBsX2FyZ3MgPSBbYXJnLmNsb25lKCkgZm9yIGFyZyBpbiBhcmdzXQogICAgICAgICBpZiBsX2FyZ3M6Ci0gICAgICAgICAgICBsX2FyZ3NbMF0uc2V0X3ByZWZpeCh1IiIpCisgICAgICAgICAgICBsX2FyZ3NbMF0ucHJlZml4ID0gdSIiCiAgICAgICAgIGlmIHNlcCBpcyBub3QgTm9uZSBvciBlbmQgaXMgbm90IE5vbmUgb3IgZmlsZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGlmIHNlcCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBzZWxmLmFkZF9rd2FyZyhsX2FyZ3MsIHUic2VwIiwgU3RyaW5nKHJlcHIoc2VwKSkpCkBAIC03NCwxNyArNzQsMTcgQEAKICAgICAgICAgICAgIGlmIGZpbGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgc2VsZi5hZGRfa3dhcmcobF9hcmdzLCB1ImZpbGUiLCBmaWxlKQogICAgICAgICBuX3N0bXQgPSBDYWxsKE5hbWUodSJwcmludCIpLCBsX2FyZ3MpCi0gICAgICAgIG5fc3RtdC5zZXRfcHJlZml4KG5vZGUuZ2V0X3ByZWZpeCgpKQorICAgICAgICBuX3N0bXQucHJlZml4ID0gbm9kZS5wcmVmaXgKICAgICAgICAgcmV0dXJuIG5fc3RtdAogCiAgICAgZGVmIGFkZF9rd2FyZyhzZWxmLCBsX25vZGVzLCBzX2t3ZCwgbl9leHByKToKICAgICAgICAgIyBYWFggQWxsIHRoaXMgcHJlZml4LXNldHRpbmcgbWF5IGxvc2UgY29tbWVudHMgKHRob3VnaCByYXJlbHkpCi0gICAgICAgIG5fZXhwci5zZXRfcHJlZml4KHUiIikKKyAgICAgICAgbl9leHByLnByZWZpeCA9IHUiIgogICAgICAgICBuX2FyZ3VtZW50ID0gcHl0cmVlLk5vZGUoc2VsZi5zeW1zLmFyZ3VtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5hbWUoc19rd2QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5dHJlZS5MZWFmKHRva2VuLkVRVUFMLCB1Ij0iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX2V4cHIpKQogICAgICAgICBpZiBsX25vZGVzOgogICAgICAgICAgICAgbF9ub2Rlcy5hcHBlbmQoQ29tbWEoKSkKLSAgICAgICAgICAgIG5fYXJndW1lbnQuc2V0X3ByZWZpeCh1IiAiKQorICAgICAgICAgICAgbl9hcmd1bWVudC5wcmVmaXggPSB1IiAiCiAgICAgICAgIGxfbm9kZXMuYXBwZW5kKG5fYXJndW1lbnQpCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfcmFpc2UucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfcmFpc2UucHkKaW5kZXggZTY5ODkxMi4uMjRlMTIzYyAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3JhaXNlLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9yYWlzZS5weQpAQCAtNTIsMzEgKzUyLDMxIEBACiAgICAgICAgICAgICAgICAgIyBleGMuY2hpbGRyZW5bMTotMV0gaXMgdGhlIHVucGFyZW50aGVzaXplZCB0dXBsZQogICAgICAgICAgICAgICAgICMgZXhjLmNoaWxkcmVuWzFdLmNoaWxkcmVuWzBdIGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB0dXBsZQogICAgICAgICAgICAgICAgIGV4YyA9IGV4Yy5jaGlsZHJlblsxXS5jaGlsZHJlblswXS5jbG9uZSgpCi0gICAgICAgICAgICBleGMuc2V0X3ByZWZpeCgiICIpCisgICAgICAgICAgICBleGMucHJlZml4ID0gIiAiCiAKICAgICAgICAgaWYgInZhbCIgbm90IGluIHJlc3VsdHM6CiAgICAgICAgICAgICAjIE9uZS1hcmd1bWVudCByYWlzZQogICAgICAgICAgICAgbmV3ID0gcHl0cmVlLk5vZGUoc3ltcy5yYWlzZV9zdG10LCBbTmFtZSh1InJhaXNlIiksIGV4Y10pCi0gICAgICAgICAgICBuZXcuc2V0X3ByZWZpeChub2RlLmdldF9wcmVmaXgoKSkKKyAgICAgICAgICAgIG5ldy5wcmVmaXggPSBub2RlLnByZWZpeAogICAgICAgICAgICAgcmV0dXJuIG5ldwogCiAgICAgICAgIHZhbCA9IHJlc3VsdHNbInZhbCJdLmNsb25lKCkKICAgICAgICAgaWYgaXNfdHVwbGUodmFsKToKICAgICAgICAgICAgIGFyZ3MgPSBbYy5jbG9uZSgpIGZvciBjIGluIHZhbC5jaGlsZHJlblsxOi0xXV0KICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHZhbC5zZXRfcHJlZml4KHUiIikKKyAgICAgICAgICAgIHZhbC5wcmVmaXggPSB1IiIKICAgICAgICAgICAgIGFyZ3MgPSBbdmFsXQogCiAgICAgICAgIGlmICJ0YiIgaW4gcmVzdWx0czoKICAgICAgICAgICAgIHRiID0gcmVzdWx0c1sidGIiXS5jbG9uZSgpCi0gICAgICAgICAgICB0Yi5zZXRfcHJlZml4KHUiIikKKyAgICAgICAgICAgIHRiLnByZWZpeCA9IHUiIgogCiAgICAgICAgICAgICBlID0gQ2FsbChleGMsIGFyZ3MpCiAgICAgICAgICAgICB3aXRoX3RiID0gQXR0cihlLCBOYW1lKHUnd2l0aF90cmFjZWJhY2snKSkgKyBbQXJnTGlzdChbdGJdKV0KICAgICAgICAgICAgIG5ldyA9IHB5dHJlZS5Ob2RlKHN5bXMuc2ltcGxlX3N0bXQsIFtOYW1lKHUicmFpc2UiKV0gKyB3aXRoX3RiKQotICAgICAgICAgICAgbmV3LnNldF9wcmVmaXgobm9kZS5nZXRfcHJlZml4KCkpCisgICAgICAgICAgICBuZXcucHJlZml4ID0gbm9kZS5wcmVmaXgKICAgICAgICAgICAgIHJldHVybiBuZXcKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiBweXRyZWUuTm9kZShzeW1zLnJhaXNlX3N0bXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05hbWUodSJyYWlzZSIpLCBDYWxsKGV4YywgYXJncyldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1ub2RlLmdldF9wcmVmaXgoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9bm9kZS5wcmVmaXgpCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfcmF3X2lucHV0LnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3Jhd19pbnB1dC5weQppbmRleCBiOTVhYzg3Li5iYTA0NWQ2IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfcmF3X2lucHV0LnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9yYXdfaW5wdXQucHkKQEAgLTEzLDQgKzEzLDQgQEAKIAogICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CiAgICAgICAgIG5hbWUgPSByZXN1bHRzWyJuYW1lIl0KLSAgICAgICAgbmFtZS5yZXBsYWNlKE5hbWUodSJpbnB1dCIsIHByZWZpeD1uYW1lLmdldF9wcmVmaXgoKSkpCisgICAgICAgIG5hbWUucmVwbGFjZShOYW1lKHUiaW5wdXQiLCBwcmVmaXg9bmFtZS5wcmVmaXgpKQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3JlbmFtZXMucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfcmVuYW1lcy5weQppbmRleCAwZjRiY2FmLi5hZTM5OGM3IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfcmVuYW1lcy5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfcmVuYW1lcy5weQpAQCAtNjYsNCArNjYsNCBAQAogCiAgICAgICAgIGlmIG1vZF9uYW1lIGFuZCBhdHRyX25hbWU6CiAgICAgICAgICAgICBuZXdfYXR0ciA9IHVuaWNvZGUoTE9PS1VQWyhtb2RfbmFtZS52YWx1ZSwgYXR0cl9uYW1lLnZhbHVlKV0pCi0gICAgICAgICAgICBhdHRyX25hbWUucmVwbGFjZShOYW1lKG5ld19hdHRyLCBwcmVmaXg9YXR0cl9uYW1lLmdldF9wcmVmaXgoKSkpCisgICAgICAgICAgICBhdHRyX25hbWUucmVwbGFjZShOYW1lKG5ld19hdHRyLCBwcmVmaXg9YXR0cl9uYW1lLnByZWZpeCkpCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfcmVwci5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9yZXByLnB5CmluZGV4IDA3OTc0ZmYuLjRiMzdlNzMgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9yZXByLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9yZXByLnB5CkBAIC0xOSw0ICsxOSw0IEBACiAKICAgICAgICAgaWYgZXhwci50eXBlID09IHNlbGYuc3ltcy50ZXN0bGlzdDE6CiAgICAgICAgICAgICBleHByID0gcGFyZW50aGVzaXplKGV4cHIpCi0gICAgICAgIHJldHVybiBDYWxsKE5hbWUodSJyZXByIiksIFtleHByXSwgcHJlZml4PW5vZGUuZ2V0X3ByZWZpeCgpKQorICAgICAgICByZXR1cm4gQ2FsbChOYW1lKHUicmVwciIpLCBbZXhwcl0sIHByZWZpeD1ub2RlLnByZWZpeCkKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9zZXRfbGl0ZXJhbC5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9zZXRfbGl0ZXJhbC5weQppbmRleCA5N2IzMThkLi5jZmM1MjJjIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfc2V0X2xpdGVyYWwucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3NldF9saXRlcmFsLnB5CkBAIC0zOCwxNSArMzgsMTUgQEAKICAgICAgICAgbGl0ZXJhbC5leHRlbmQobi5jbG9uZSgpIGZvciBuIGluIGl0ZW1zLmNoaWxkcmVuKQogICAgICAgICBsaXRlcmFsLmFwcGVuZChweXRyZWUuTGVhZih0b2tlbi5SQlJBQ0UsIHUifSIpKQogICAgICAgICAjIFNldCB0aGUgcHJlZml4IG9mIHRoZSByaWdodCBicmFjZSB0byB0aGF0IG9mIHRoZSAnKScgb3IgJ10nCi0gICAgICAgIGxpdGVyYWxbLTFdLnNldF9wcmVmaXgoaXRlbXMubmV4dF9zaWJsaW5nLmdldF9wcmVmaXgoKSkKKyAgICAgICAgbGl0ZXJhbFstMV0ucHJlZml4ID0gaXRlbXMubmV4dF9zaWJsaW5nLnByZWZpeAogICAgICAgICBtYWtlciA9IHB5dHJlZS5Ob2RlKHN5bXMuZGljdHNldG1ha2VyLCBsaXRlcmFsKQotICAgICAgICBtYWtlci5zZXRfcHJlZml4KG5vZGUuZ2V0X3ByZWZpeCgpKQorICAgICAgICBtYWtlci5wcmVmaXggPSBub2RlLnByZWZpeAogCiAgICAgICAgICMgSWYgdGhlIG9yaWdpbmFsIHdhcyBhIG9uZSB0dXBsZSwgd2UgbmVlZCB0byByZW1vdmUgdGhlIGV4dHJhIGNvbW1hLgogICAgICAgICBpZiBsZW4obWFrZXIuY2hpbGRyZW4pID09IDQ6CiAgICAgICAgICAgICBuID0gbWFrZXIuY2hpbGRyZW5bMl0KICAgICAgICAgICAgIG4ucmVtb3ZlKCkKLSAgICAgICAgICAgIG1ha2VyLmNoaWxkcmVuWy0xXS5zZXRfcHJlZml4KG4uZ2V0X3ByZWZpeCgpKQorICAgICAgICAgICAgbWFrZXIuY2hpbGRyZW5bLTFdLnByZWZpeCA9IG4ucHJlZml4CiAKICAgICAgICAgIyBGaW5hbGx5LCByZXBsYWNlIHRoZSBzZXQgY2FsbCB3aXRoIG91ciBzaGlueSBuZXcgbGl0ZXJhbC4KICAgICAgICAgcmV0dXJuIG1ha2VyCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfc3RhbmRhcmRlcnJvci5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9zdGFuZGFyZGVycm9yLnB5CmluZGV4IDQ0Y2JiNTcuLmE1Nzg5YmEgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9zdGFuZGFyZGVycm9yLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9zdGFuZGFyZGVycm9yLnB5CkBAIC0xNSw0ICsxNSw0IEBACiAgICAgICAgICAgICAgICIiIgogCiAgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKLSAgICAgICAgcmV0dXJuIE5hbWUodSJFeGNlcHRpb24iLCBwcmVmaXg9bm9kZS5nZXRfcHJlZml4KCkpCisgICAgICAgIHJldHVybiBOYW1lKHUiRXhjZXB0aW9uIiwgcHJlZml4PW5vZGUucHJlZml4KQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3N5c19leGMucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfc3lzX2V4Yy5weQppbmRleCA5MzYxODNmLi42MDhkZTE4IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfc3lzX2V4Yy5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfc3lzX2V4Yy5weQpAQCAtMjIsOCArMjIsOCBAQAogICAgICAgICBzeXNfYXR0ciA9IHJlc3VsdHNbImF0dHJpYnV0ZSJdWzBdCiAgICAgICAgIGluZGV4ID0gTnVtYmVyKHNlbGYuZXhjX2luZm8uaW5kZXgoc3lzX2F0dHIudmFsdWUpKQogCi0gICAgICAgIGNhbGwgPSBDYWxsKE5hbWUodSJleGNfaW5mbyIpLCBwcmVmaXg9c3lzX2F0dHIuZ2V0X3ByZWZpeCgpKQorICAgICAgICBjYWxsID0gQ2FsbChOYW1lKHUiZXhjX2luZm8iKSwgcHJlZml4PXN5c19hdHRyLnByZWZpeCkKICAgICAgICAgYXR0ciA9IEF0dHIoTmFtZSh1InN5cyIpLCBjYWxsKQotICAgICAgICBhdHRyWzFdLmNoaWxkcmVuWzBdLnNldF9wcmVmaXgocmVzdWx0c1siZG90Il0uZ2V0X3ByZWZpeCgpKQorICAgICAgICBhdHRyWzFdLmNoaWxkcmVuWzBdLnByZWZpeCA9IHJlc3VsdHNbImRvdCJdLnByZWZpeAogICAgICAgICBhdHRyLmFwcGVuZChTdWJzY3JpcHQoaW5kZXgpKQotICAgICAgICByZXR1cm4gTm9kZShzeW1zLnBvd2VyLCBhdHRyLCBwcmVmaXg9bm9kZS5nZXRfcHJlZml4KCkpCisgICAgICAgIHJldHVybiBOb2RlKHN5bXMucG93ZXIsIGF0dHIsIHByZWZpeD1ub2RlLnByZWZpeCkKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF90aHJvdy5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF90aHJvdy5weQppbmRleCA5MGZmYzY0Li42MzI3MWNmIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfdGhyb3cucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3Rocm93LnB5CkBAIC00MCwxNCArNDAsMTQgQEAKICAgICAgICAgaWYgaXNfdHVwbGUodmFsKToKICAgICAgICAgICAgIGFyZ3MgPSBbYy5jbG9uZSgpIGZvciBjIGluIHZhbC5jaGlsZHJlblsxOi0xXV0KICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHZhbC5zZXRfcHJlZml4KHUiIikKKyAgICAgICAgICAgIHZhbC5wcmVmaXggPSB1IiIKICAgICAgICAgICAgIGFyZ3MgPSBbdmFsXQogCiAgICAgICAgIHRocm93X2FyZ3MgPSByZXN1bHRzWyJhcmdzIl0KIAogICAgICAgICBpZiAidGIiIGluIHJlc3VsdHM6CiAgICAgICAgICAgICB0YiA9IHJlc3VsdHNbInRiIl0uY2xvbmUoKQotICAgICAgICAgICAgdGIuc2V0X3ByZWZpeCh1IiIpCisgICAgICAgICAgICB0Yi5wcmVmaXggPSB1IiIKIAogICAgICAgICAgICAgZSA9IENhbGwoZXhjLCBhcmdzKQogICAgICAgICAgICAgd2l0aF90YiA9IEF0dHIoZSwgTmFtZSh1J3dpdGhfdHJhY2ViYWNrJykpICsgW0FyZ0xpc3QoW3RiXSldCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfdHVwbGVfcGFyYW1zLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3R1cGxlX3BhcmFtcy5weQppbmRleCA2NjI4NTE4Li5iODg3NDAzIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfdHVwbGVfcGFyYW1zLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF90dXBsZV9wYXJhbXMucHkKQEAgLTYzLDEwICs2MywxMCBAQAogICAgICAgICBkZWYgaGFuZGxlX3R1cGxlKHR1cGxlX2FyZywgYWRkX3ByZWZpeD1GYWxzZSk6CiAgICAgICAgICAgICBuID0gTmFtZShzZWxmLm5ld19uYW1lKCkpCiAgICAgICAgICAgICBhcmcgPSB0dXBsZV9hcmcuY2xvbmUoKQotICAgICAgICAgICAgYXJnLnNldF9wcmVmaXgodSIiKQorICAgICAgICAgICAgYXJnLnByZWZpeCA9IHUiIgogICAgICAgICAgICAgc3RtdCA9IEFzc2lnbihhcmcsIG4uY2xvbmUoKSkKICAgICAgICAgICAgIGlmIGFkZF9wcmVmaXg6Ci0gICAgICAgICAgICAgICAgbi5zZXRfcHJlZml4KHUiICIpCisgICAgICAgICAgICAgICAgbi5wcmVmaXggPSB1IiAiCiAgICAgICAgICAgICB0dXBsZV9hcmcucmVwbGFjZShuKQogICAgICAgICAgICAgbmV3X2xpbmVzLmFwcGVuZChweXRyZWUuTm9kZShzeW1zLnNpbXBsZV9zdG10LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RtdCwgZW5kLmNsb25lKCldKSkKQEAgLTkxLDE0ICs5MSwxNCBAQAogICAgICAgICAjIFRPRE8oY3dpbnRlcikgc3VpdGUtY2xlYW51cAogICAgICAgICBhZnRlciA9IHN0YXJ0CiAgICAgICAgIGlmIHN0YXJ0ID09IDA6Ci0gICAgICAgICAgICBuZXdfbGluZXNbMF0uc2V0X3ByZWZpeCh1IiAiKQorICAgICAgICAgICAgbmV3X2xpbmVzWzBdLnByZWZpeCA9IHUiICIKICAgICAgICAgZWxpZiBpc19kb2NzdHJpbmcoc3VpdGVbMF0uY2hpbGRyZW5bc3RhcnRdKToKLSAgICAgICAgICAgIG5ld19saW5lc1swXS5zZXRfcHJlZml4KGluZGVudCkKKyAgICAgICAgICAgIG5ld19saW5lc1swXS5wcmVmaXggPSBpbmRlbnQKICAgICAgICAgICAgIGFmdGVyID0gc3RhcnQgKyAxCiAKICAgICAgICAgc3VpdGVbMF0uY2hpbGRyZW5bYWZ0ZXI6YWZ0ZXJdID0gbmV3X2xpbmVzCiAgICAgICAgIGZvciBpIGluIHJhbmdlKGFmdGVyKzEsIGFmdGVyK2xlbihuZXdfbGluZXMpKzEpOgotICAgICAgICAgICAgc3VpdGVbMF0uY2hpbGRyZW5baV0uc2V0X3ByZWZpeChpbmRlbnQpCisgICAgICAgICAgICBzdWl0ZVswXS5jaGlsZHJlbltpXS5wcmVmaXggPSBpbmRlbnQKICAgICAgICAgc3VpdGVbMF0uY2hhbmdlZCgpCiAKICAgICBkZWYgdHJhbnNmb3JtX2xhbWJkYShzZWxmLCBub2RlLCByZXN1bHRzKToKQEAgLTEwOSw3ICsxMDksNyBAQAogICAgICAgICAjIFJlcGxhY2UgbGFtYmRhICgoKCh4KSkpKTogeCAgd2l0aCBsYW1iZGEgeDogeAogICAgICAgICBpZiBpbm5lci50eXBlID09IHRva2VuLk5BTUU6CiAgICAgICAgICAgICBpbm5lciA9IGlubmVyLmNsb25lKCkKLSAgICAgICAgICAgIGlubmVyLnNldF9wcmVmaXgodSIgIikKKyAgICAgICAgICAgIGlubmVyLnByZWZpeCA9IHUiICIKICAgICAgICAgICAgIGFyZ3MucmVwbGFjZShpbm5lcikKICAgICAgICAgICAgIHJldHVybgogCkBAIC0xMjQsNyArMTI0LDcgQEAKICAgICAgICAgICAgICAgICBzdWJzY3JpcHRzID0gW2MuY2xvbmUoKSBmb3IgYyBpbiB0b19pbmRleFtuLnZhbHVlXV0KICAgICAgICAgICAgICAgICBuZXcgPSBweXRyZWUuTm9kZShzeW1zLnBvd2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZXdfcGFyYW0uY2xvbmUoKV0gKyBzdWJzY3JpcHRzKQotICAgICAgICAgICAgICAgIG5ldy5zZXRfcHJlZml4KG4uZ2V0X3ByZWZpeCgpKQorICAgICAgICAgICAgICAgIG5ldy5wcmVmaXggPSBuLnByZWZpeAogICAgICAgICAgICAgICAgIG4ucmVwbGFjZShuZXcpCiAKIApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3R5cGVzLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3R5cGVzLnB5CmluZGV4IDkzMjcyNDguLjJmYmJhYjggMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF90eXBlcy5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfdHlwZXMucHkKQEAgLTU4LDUgKzU4LDUgQEAKICAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgogICAgICAgICBuZXdfdmFsdWUgPSB1bmljb2RlKF9UWVBFX01BUFBJTkcuZ2V0KHJlc3VsdHNbIm5hbWUiXS52YWx1ZSkpCiAgICAgICAgIGlmIG5ld192YWx1ZToKLSAgICAgICAgICAgIHJldHVybiBOYW1lKG5ld192YWx1ZSwgcHJlZml4PW5vZGUuZ2V0X3ByZWZpeCgpKQorICAgICAgICAgICAgcmV0dXJuIE5hbWUobmV3X3ZhbHVlLCBwcmVmaXg9bm9kZS5wcmVmaXgpCiAgICAgICAgIHJldHVybiBOb25lCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfdW5pY29kZS5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF91bmljb2RlLnB5CmluZGV4IDU4MGU4MmQuLmNkM2I4OWMgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF91bmljb2RlLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF91bmljb2RlLnB5CkBAIC02LDIzICs2LDIwIEBACiBmcm9tIC4ucGdlbjIgaW1wb3J0IHRva2VuCiBmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCiAKK19tYXBwaW5nID0ge3UidW5pY2hyIiA6IHUiY2hyIiwgdSJ1bmljb2RlIiA6IHUic3RyIn0KK19saXRlcmFsX3JlID0gcmUuY29tcGlsZSh1ciJbdVVdW3JSXT9bXCdcIl0iKQorCiBjbGFzcyBGaXhVbmljb2RlKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CiAKLSAgICBQQVRURVJOID0gIlNUUklORyB8IE5BTUU8J3VuaWNvZGUnIHwgJ3VuaWNocic+IgorICAgIFBBVFRFUk4gPSAiU1RSSU5HIHwgJ3VuaWNvZGUnIHwgJ3VuaWNociciCiAKICAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgogICAgICAgICBpZiBub2RlLnR5cGUgPT0gdG9rZW4uTkFNRToKLSAgICAgICAgICAgIGlmIG5vZGUudmFsdWUgPT0gdSJ1bmljb2RlIjoKLSAgICAgICAgICAgICAgICBuZXcgPSBub2RlLmNsb25lKCkKLSAgICAgICAgICAgICAgICBuZXcudmFsdWUgPSB1InN0ciIKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3Ci0gICAgICAgICAgICBpZiBub2RlLnZhbHVlID09IHUidW5pY2hyIjoKLSAgICAgICAgICAgICAgICBuZXcgPSBub2RlLmNsb25lKCkKLSAgICAgICAgICAgICAgICBuZXcudmFsdWUgPSB1ImNociIKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3Ci0gICAgICAgICAgICAjIFhYWCBXYXJuIHdoZW4gX191bmljb2RlX18gZm91bmQ/CisgICAgICAgICAgICBuZXcgPSBub2RlLmNsb25lKCkKKyAgICAgICAgICAgIG5ldy52YWx1ZSA9IF9tYXBwaW5nW25vZGUudmFsdWVdCisgICAgICAgICAgICByZXR1cm4gbmV3CiAgICAgICAgIGVsaWYgbm9kZS50eXBlID09IHRva2VuLlNUUklORzoKLSAgICAgICAgICAgIGlmIHJlLm1hdGNoKHVyIlt1VV1bclJdP1tcJ1wiXSIsIG5vZGUudmFsdWUpOgorICAgICAgICAgICAgaWYgX2xpdGVyYWxfcmUubWF0Y2gobm9kZS52YWx1ZSk6CiAgICAgICAgICAgICAgICAgbmV3ID0gbm9kZS5jbG9uZSgpCiAgICAgICAgICAgICAgICAgbmV3LnZhbHVlID0gbmV3LnZhbHVlWzE6XQogICAgICAgICAgICAgICAgIHJldHVybiBuZXcKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF91cmxsaWIucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfdXJsbGliLnB5CmluZGV4IGYyNjI1MzcuLmE4OTI2NmUgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF91cmxsaWIucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3VybGxpYi5weQpAQCAtNzgsNyArNzgsNyBAQAogICAgICAgICAgICByZXBsYWNlbWVudHMuCiAgICAgICAgICIiIgogICAgICAgICBpbXBvcnRfbW9kID0gcmVzdWx0cy5nZXQoJ21vZHVsZScpCi0gICAgICAgIHByZWYgPSBpbXBvcnRfbW9kLmdldF9wcmVmaXgoKQorICAgICAgICBwcmVmID0gaW1wb3J0X21vZC5wcmVmaXgKIAogICAgICAgICBuYW1lcyA9IFtdCiAKQEAgLTk0LDcgKzk0LDcgQEAKICAgICAgICAgICAgbW9kdWxlLgogICAgICAgICAiIiIKICAgICAgICAgbW9kX21lbWJlciA9IHJlc3VsdHMuZ2V0KCdtb2RfbWVtYmVyJykKLSAgICAgICAgcHJlZiA9IG1vZF9tZW1iZXIuZ2V0X3ByZWZpeCgpCisgICAgICAgIHByZWYgPSBtb2RfbWVtYmVyLnByZWZpeAogICAgICAgICBtZW1iZXIgPSByZXN1bHRzLmdldCgnbWVtYmVyJykKIAogICAgICAgICAjIFNpbXBsZSBjYXNlIHdpdGggb25seSBhIHNpbmdsZSBtZW1iZXIgYmVpbmcgaW1wb3J0ZWQKQEAgLTE2Miw3ICsxNjIsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgIGlmIG5ld19uYW1lOgogICAgICAgICAgICAgbW9kdWxlX2RvdC5yZXBsYWNlKE5hbWUobmV3X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9bW9kdWxlX2RvdC5nZXRfcHJlZml4KCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4PW1vZHVsZV9kb3QucHJlZml4KSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuY2Fubm90X2NvbnZlcnQobm9kZSwgJ1RoaXMgaXMgYW4gaW52YWxpZCBtb2R1bGUgZWxlbWVudCcpCiAKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF93c19jb21tYS5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF93c19jb21tYS5weQppbmRleCBiNWJmZDhjLi4zN2ZmNjI0IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfd3NfY29tbWEucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3dzX2NvbW1hLnB5CkBAIC0yNiwxNCArMjYsMTQgQEAKICAgICAgICAgY29tbWEgPSBGYWxzZQogICAgICAgICBmb3IgY2hpbGQgaW4gbmV3LmNoaWxkcmVuOgogICAgICAgICAgICAgaWYgY2hpbGQgaW4gc2VsZi5TRVBTOgotICAgICAgICAgICAgICAgIHByZWZpeCA9IGNoaWxkLmdldF9wcmVmaXgoKQorICAgICAgICAgICAgICAgIHByZWZpeCA9IGNoaWxkLnByZWZpeAogICAgICAgICAgICAgICAgIGlmIHByZWZpeC5pc3NwYWNlKCkgYW5kIHUiXG4iIG5vdCBpbiBwcmVmaXg6Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkLnNldF9wcmVmaXgodSIiKQorICAgICAgICAgICAgICAgICAgICBjaGlsZC5wcmVmaXggPSB1IiIKICAgICAgICAgICAgICAgICBjb21tYSA9IFRydWUKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgaWYgY29tbWE6Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGNoaWxkLmdldF9wcmVmaXgoKQorICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBjaGlsZC5wcmVmaXgKICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHByZWZpeDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnNldF9wcmVmaXgodSIgIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnByZWZpeCA9IHUiICIKICAgICAgICAgICAgICAgICBjb21tYSA9IEZhbHNlCiAgICAgICAgIHJldHVybiBuZXcKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF94cmFuZ2UucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfeHJhbmdlLnB5CmluZGV4IGM0NzJhMDMuLmFkOTEwYTcgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF94cmFuZ2UucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3hyYW5nZS5weQpAQCAtMjgsMTQgKzI4LDE0IEBACiAKICAgICBkZWYgdHJhbnNmb3JtX3hyYW5nZShzZWxmLCBub2RlLCByZXN1bHRzKToKICAgICAgICAgbmFtZSA9IHJlc3VsdHNbIm5hbWUiXQotICAgICAgICBuYW1lLnJlcGxhY2UoTmFtZSh1InJhbmdlIiwgcHJlZml4PW5hbWUuZ2V0X3ByZWZpeCgpKSkKKyAgICAgICAgbmFtZS5yZXBsYWNlKE5hbWUodSJyYW5nZSIsIHByZWZpeD1uYW1lLnByZWZpeCkpCiAKICAgICBkZWYgdHJhbnNmb3JtX3JhbmdlKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgogICAgICAgICBpZiBub3Qgc2VsZi5pbl9zcGVjaWFsX2NvbnRleHQobm9kZSk6CiAgICAgICAgICAgICByYW5nZV9jYWxsID0gQ2FsbChOYW1lKHUicmFuZ2UiKSwgW3Jlc3VsdHNbImFyZ3MiXS5jbG9uZSgpXSkKICAgICAgICAgICAgICMgRW5jYXNlIHRoZSByYW5nZSBjYWxsIGluIGxpc3QoKS4KICAgICAgICAgICAgIGxpc3RfY2FsbCA9IENhbGwoTmFtZSh1Imxpc3QiKSwgW3JhbmdlX2NhbGxdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9bm9kZS5nZXRfcHJlZml4KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1ub2RlLnByZWZpeCkKICAgICAgICAgICAgICMgUHV0IHRoaW5ncyB0aGF0IHdlcmUgYWZ0ZXIgdGhlIHJhbmdlKCkgY2FsbCBhZnRlciB0aGUgbGlzdCBjYWxsLgogICAgICAgICAgICAgZm9yIG4gaW4gcmVzdWx0c1sicmVzdCJdOgogICAgICAgICAgICAgICAgIGxpc3RfY2FsbC5hcHBlbmRfY2hpbGQobikKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF94cmVhZGxpbmVzLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3hyZWFkbGluZXMucHkKaW5kZXggNDg4MDc1MS4uZWU0YjM1NiAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3hyZWFkbGluZXMucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3hyZWFkbGluZXMucHkKQEAgLTE5LDYgKzE5LDYgQEAKICAgICAgICAgbm9fY2FsbCA9IHJlc3VsdHMuZ2V0KCJub19jYWxsIikKIAogICAgICAgICBpZiBub19jYWxsOgotICAgICAgICAgICAgbm9fY2FsbC5yZXBsYWNlKE5hbWUodSJfX2l0ZXJfXyIsIHByZWZpeD1ub19jYWxsLmdldF9wcmVmaXgoKSkpCisgICAgICAgICAgICBub19jYWxsLnJlcGxhY2UoTmFtZSh1Il9faXRlcl9fIiwgcHJlZml4PW5vX2NhbGwucHJlZml4KSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIG5vZGUucmVwbGFjZShbeC5jbG9uZSgpIGZvciB4IGluIHJlc3VsdHNbImNhbGwiXV0pCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfemlwLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3ppcC5weQppbmRleCBlOTkwODQyLi42NzM2YTdlIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfemlwLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF96aXAucHkKQEAgLTI4LDcgKzI4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBOb25lCiAKICAgICAgICAgbmV3ID0gbm9kZS5jbG9uZSgpCi0gICAgICAgIG5ldy5zZXRfcHJlZml4KHUiIikKKyAgICAgICAgbmV3LnByZWZpeCA9IHUiIgogICAgICAgICBuZXcgPSBDYWxsKE5hbWUodSJsaXN0IiksIFtuZXddKQotICAgICAgICBuZXcuc2V0X3ByZWZpeChub2RlLmdldF9wcmVmaXgoKSkKKyAgICAgICAgbmV3LnByZWZpeCA9IG5vZGUucHJlZml4CiAgICAgICAgIHJldHVybiBuZXcKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3BhdGNvbXAucHkgYi9MaWIvbGliMnRvMy9wYXRjb21wLnB5CmluZGV4IDUxNzdkMjcuLmU1ZTExNDUgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL3BhdGNvbXAucHkKKysrIGIvTGliL2xpYjJ0bzMvcGF0Y29tcC5weQpAQCAtMTQsMTAgKzE0LDcgQEAKIGltcG9ydCBvcwogCiAjIEZhaXJseSBsb2NhbCBpbXBvcnRzCi1mcm9tIC5wZ2VuMiBpbXBvcnQgZHJpdmVyCi1mcm9tIC5wZ2VuMiBpbXBvcnQgbGl0ZXJhbHMKLWZyb20gLnBnZW4yIGltcG9ydCB0b2tlbgotZnJvbSAucGdlbjIgaW1wb3J0IHRva2VuaXplCitmcm9tIC5wZ2VuMiBpbXBvcnQgZHJpdmVyLCBsaXRlcmFscywgdG9rZW4sIHRva2VuaXplLCBwYXJzZQogCiAjIFJlYWxseSBsb2NhbCBpbXBvcnRzCiBmcm9tIC4gaW1wb3J0IHB5dHJlZQpAQCAtMjgsNiArMjUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGF0dGVybkdyYW1tYXIudHh0IikKIAogCitjbGFzcyBQYXR0ZXJuU3ludGF4RXJyb3IoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKKwogZGVmIHRva2VuaXplX3dyYXBwZXIoaW5wdXQpOgogICAgICIiIlRva2VuaXplcyBhIHN0cmluZyBzdXBwcmVzc2luZyBzaWduaWZpY2FudCB3aGl0ZXNwYWNlLiIiIgogICAgIHNraXAgPSBzZXQoKHRva2VuLk5FV0xJTkUsIHRva2VuLklOREVOVCwgdG9rZW4uREVERU5UKSkKQEAgLTU0LDcgKzU1LDEwIEBACiAgICAgZGVmIGNvbXBpbGVfcGF0dGVybihzZWxmLCBpbnB1dCwgZGVidWc9RmFsc2UpOgogICAgICAgICAiIiJDb21waWxlcyBhIHBhdHRlcm4gc3RyaW5nIHRvIGEgbmVzdGVkIHB5dHJlZS4qUGF0dGVybiBvYmplY3QuIiIiCiAgICAgICAgIHRva2VucyA9IHRva2VuaXplX3dyYXBwZXIoaW5wdXQpCi0gICAgICAgIHJvb3QgPSBzZWxmLmRyaXZlci5wYXJzZV90b2tlbnModG9rZW5zLCBkZWJ1Zz1kZWJ1ZykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcm9vdCA9IHNlbGYuZHJpdmVyLnBhcnNlX3Rva2Vucyh0b2tlbnMsIGRlYnVnPWRlYnVnKQorICAgICAgICBleGNlcHQgcGFyc2UuUGFyc2VFcnJvciBhcyBlOgorICAgICAgICAgICAgcmFpc2UgUGF0dGVyblN5bnRheEVycm9yKHN0cihlKSkKICAgICAgICAgcmV0dXJuIHNlbGYuY29tcGlsZV9ub2RlKHJvb3QpCiAKICAgICBkZWYgY29tcGlsZV9ub2RlKHNlbGYsIG5vZGUpOgpAQCAtMTM5LDcgKzE0Myw5IEBACiAgICAgICAgICAgICB2YWx1ZSA9IG5vZGUudmFsdWUKICAgICAgICAgICAgIGlmIHZhbHVlLmlzdXBwZXIoKToKICAgICAgICAgICAgICAgICBpZiB2YWx1ZSBub3QgaW4gVE9LRU5fTUFQOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigiSW52YWxpZCB0b2tlbjogJXIiICUgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhdHRlcm5TeW50YXhFcnJvcigiSW52YWxpZCB0b2tlbjogJXIiICUgdmFsdWUpCisgICAgICAgICAgICAgICAgaWYgbm9kZXNbMTpdOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXR0ZXJuU3ludGF4RXJyb3IoIkNhbid0IGhhdmUgZGV0YWlscyBmb3IgdG9rZW4iKQogICAgICAgICAgICAgICAgIHJldHVybiBweXRyZWUuTGVhZlBhdHRlcm4oVE9LRU5fTUFQW3ZhbHVlXSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgaWYgdmFsdWUgPT0gImFueSI6CkBAIC0xNDcsNyArMTUzLDcgQEAKICAgICAgICAgICAgICAgICBlbGlmIG5vdCB2YWx1ZS5zdGFydHN3aXRoKCJfIik6CiAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRhdHRyKHNlbGYucHlzeW1zLCB2YWx1ZSwgTm9uZSkKICAgICAgICAgICAgICAgICAgICAgaWYgdHlwZSBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoIkludmFsaWQgc3ltYm9sOiAlciIgJSB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhdHRlcm5TeW50YXhFcnJvcigiSW52YWxpZCBzeW1ib2w6ICVyIiAlIHZhbHVlKQogICAgICAgICAgICAgICAgIGlmIG5vZGVzWzE6XTogIyBEZXRhaWxzIHByZXNlbnQKICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IFtzZWxmLmNvbXBpbGVfbm9kZShub2Rlc1sxXS5jaGlsZHJlblsxXSldCiAgICAgICAgICAgICAgICAgZWxzZToKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3B5dHJlZS5weSBiL0xpYi9saWIydG8zL3B5dHJlZS5weQppbmRleCA2ZjczYWE5Li4zZGFhYjE2IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9weXRyZWUucHkKKysrIGIvTGliL2xpYjJ0bzMvcHl0cmVlLnB5CkBAIC0xMyw2ICsxMyw3IEBACiBfX2F1dGhvcl9fID0gIkd1aWRvIHZhbiBSb3NzdW0gPGd1aWRvQHB5dGhvbi5vcmc+IgogCiBpbXBvcnQgc3lzCitpbXBvcnQgd2FybmluZ3MKIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiAKIApAQCAtMTExLDE3ICsxMTIsMjEgQEAKICAgICAgICAgIiIiCiAgICAgICAgIFNldCB0aGUgcHJlZml4IGZvciB0aGUgbm9kZSAoc2VlIExlYWYgY2xhc3MpLgogCi0gICAgICAgIFRoaXMgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgY29uY3JldGUgc3ViY2xhc3MuCisgICAgICAgIERFUFJFQ0FURUQ7IHVzZSB0aGUgcHJlZml4IHByb3BlcnR5IGRpcmVjdGx5LgogICAgICAgICAiIiIKLSAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgICAgICB3YXJuaW5ncy53YXJuKCJzZXRfcHJlZml4KCkgaXMgZGVwcmVjYXRlZDsgdXNlIHRoZSBwcmVmaXggcHJvcGVydHkiLAorICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICBzZWxmLnByZWZpeCA9IHByZWZpeAogCiAgICAgZGVmIGdldF9wcmVmaXgoc2VsZik6CiAgICAgICAgICIiIgogICAgICAgICBSZXR1cm4gdGhlIHByZWZpeCBmb3IgdGhlIG5vZGUgKHNlZSBMZWFmIGNsYXNzKS4KIAotICAgICAgICBUaGlzIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGNvbmNyZXRlIHN1YmNsYXNzLgorICAgICAgICBERVBSRUNBVEVEOyB1c2UgdGhlIHByZWZpeCBwcm9wZXJ0eSBkaXJlY3RseS4KICAgICAgICAgIiIiCi0gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICAgICAgd2FybmluZ3Mud2FybigiZ2V0X3ByZWZpeCgpIGlzIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgcHJlZml4IHByb3BlcnR5IiwKKyAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgcmV0dXJuIHNlbGYucHJlZml4CiAKICAgICBkZWYgcmVwbGFjZShzZWxmLCBuZXcpOgogICAgICAgICAiIiJSZXBsYWNlIHRoaXMgbm9kZSB3aXRoIGEgbmV3IG9uZSBpbiB0aGUgcGFyZW50LiIiIgpAQCAtMjA5LDEyICsyMTQsMTIgQEAKICAgICBkZWYgZ2V0X3N1ZmZpeChzZWxmKToKICAgICAgICAgIiIiCiAgICAgICAgIFJldHVybiB0aGUgc3RyaW5nIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgaW52b2NhbnQgbm9kZS4gVGhpcyBpcwotICAgICAgICBlZmZlY3RpdmVseSBlcXVpdmFsZW50IHRvIG5vZGUubmV4dF9zaWJsaW5nLmdldF9wcmVmaXgoKQorICAgICAgICBlZmZlY3RpdmVseSBlcXVpdmFsZW50IHRvIG5vZGUubmV4dF9zaWJsaW5nLnByZWZpeAogICAgICAgICAiIiIKICAgICAgICAgbmV4dF9zaWIgPSBzZWxmLm5leHRfc2libGluZwogICAgICAgICBpZiBuZXh0X3NpYiBpcyBOb25lOgogICAgICAgICAgICAgcmV0dXJuIHUiIgotICAgICAgICByZXR1cm4gbmV4dF9zaWIuZ2V0X3ByZWZpeCgpCisgICAgICAgIHJldHVybiBuZXh0X3NpYi5wcmVmaXgKIAogICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMCk6CiAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgpAQCAtMjQxLDcgKzI0Niw3IEBACiAgICAgICAgICAgICBhc3NlcnQgY2gucGFyZW50IGlzIE5vbmUsIHJlcHIoY2gpCiAgICAgICAgICAgICBjaC5wYXJlbnQgPSBzZWxmCiAgICAgICAgIGlmIHByZWZpeCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNlbGYuc2V0X3ByZWZpeChwcmVmaXgpCisgICAgICAgICAgICBzZWxmLnByZWZpeCA9IHByZWZpeAogCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gYSBjYW5vbmljYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiIiIgpAQCAtMjgyLDI0ICsyODcsMTkgQEAKICAgICAgICAgICAgIGZvciBub2RlIGluIGNoaWxkLnBvc3Rfb3JkZXIoKToKICAgICAgICAgICAgICAgICB5aWVsZCBub2RlCiAKLSAgICBkZWYgc2V0X3ByZWZpeChzZWxmLCBwcmVmaXgpOgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBwcmVmaXgoc2VsZik6CiAgICAgICAgICIiIgotICAgICAgICBTZXQgdGhlIHByZWZpeCBmb3IgdGhlIG5vZGUuCi0KLSAgICAgICAgVGhpcyBwYXNzZXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9uIHRvIHRoZSBmaXJzdCBjaGlsZC4KLSAgICAgICAgIiIiCi0gICAgICAgIGlmIHNlbGYuY2hpbGRyZW46Ci0gICAgICAgICAgICBzZWxmLmNoaWxkcmVuWzBdLnNldF9wcmVmaXgocHJlZml4KQotCi0gICAgZGVmIGdldF9wcmVmaXgoc2VsZik6Ci0gICAgICAgICIiIgotICAgICAgICBSZXR1cm4gdGhlIHByZWZpeCBmb3IgdGhlIG5vZGUuCi0KLSAgICAgICAgVGhpcyBwYXNzZXMgdGhlIGNhbGwgb24gdG8gdGhlIGZpcnN0IGNoaWxkLgorICAgICAgICBUaGUgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMgcHJlY2VkaW5nIHRoaXMgbm9kZSBpbiB0aGUgaW5wdXQuCiAgICAgICAgICIiIgogICAgICAgICBpZiBub3Qgc2VsZi5jaGlsZHJlbjoKICAgICAgICAgICAgIHJldHVybiAiIgotICAgICAgICByZXR1cm4gc2VsZi5jaGlsZHJlblswXS5nZXRfcHJlZml4KCkKKyAgICAgICAgcmV0dXJuIHNlbGYuY2hpbGRyZW5bMF0ucHJlZml4CisKKyAgICBAcHJlZml4LnNldHRlcgorICAgIGRlZiBwcmVmaXgoc2VsZiwgcHJlZml4KToKKyAgICAgICAgaWYgc2VsZi5jaGlsZHJlbjoKKyAgICAgICAgICAgIHNlbGYuY2hpbGRyZW5bMF0ucHJlZml4ID0gcHJlZml4CiAKICAgICBkZWYgc2V0X2NoaWxkKHNlbGYsIGksIGNoaWxkKToKICAgICAgICAgIiIiCkBAIC0zMzUsOSArMzM1LDkgQEAKICAgICAiIiJDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBmb3IgbGVhZiBub2Rlcy4iIiIKIAogICAgICMgRGVmYXVsdCB2YWx1ZXMgZm9yIGluc3RhbmNlIHZhcmlhYmxlcwotICAgIHByZWZpeCA9ICIiICAjIFdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzIHByZWNlZGluZyB0aGlzIHRva2VuIGluIHRoZSBpbnB1dAotICAgIGxpbmVubyA9IDAgICAjIExpbmUgd2hlcmUgdGhpcyB0b2tlbiBzdGFydHMgaW4gdGhlIGlucHV0Ci0gICAgY29sdW1uID0gMCAgICMgQ29sdW1uIHdoZXJlIHRoaXMgdG9rZW4gdGFydHMgaW4gdGhlIGlucHV0CisgICAgX3ByZWZpeCA9ICIiICAjIFdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzIHByZWNlZGluZyB0aGlzIHRva2VuIGluIHRoZSBpbnB1dAorICAgIGxpbmVubyA9IDAgICAgIyBMaW5lIHdoZXJlIHRoaXMgdG9rZW4gc3RhcnRzIGluIHRoZSBpbnB1dAorICAgIGNvbHVtbiA9IDAgICAgIyBDb2x1bW4gd2hlcmUgdGhpcyB0b2tlbiB0YXJ0cyBpbiB0aGUgaW5wdXQKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgY29udGV4dD1Ob25lLCBwcmVmaXg9Tm9uZSk6CiAgICAgICAgICIiIgpAQCAtMzQ4LDExICszNDgsMTEgQEAKICAgICAgICAgIiIiCiAgICAgICAgIGFzc2VydCAwIDw9IHR5cGUgPCAyNTYsIHR5cGUKICAgICAgICAgaWYgY29udGV4dCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNlbGYucHJlZml4LCAoc2VsZi5saW5lbm8sIHNlbGYuY29sdW1uKSA9IGNvbnRleHQKKyAgICAgICAgICAgIHNlbGYuX3ByZWZpeCwgKHNlbGYubGluZW5vLCBzZWxmLmNvbHVtbikgPSBjb250ZXh0CiAgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKICAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCiAgICAgICAgIGlmIHByZWZpeCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNlbGYucHJlZml4ID0gcHJlZml4CisgICAgICAgICAgICBzZWxmLl9wcmVmaXggPSBwcmVmaXgKIAogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIGEgY2Fub25pY2FsIHN0cmluZyByZXByZXNlbnRhdGlvbi4iIiIKQEAgLTM4OCwxNCArMzg4LDE3IEBACiAgICAgICAgICIiIlJldHVybiBhIHByZS1vcmRlciBpdGVyYXRvciBmb3IgdGhlIHRyZWUuIiIiCiAgICAgICAgIHlpZWxkIHNlbGYKIAotICAgIGRlZiBzZXRfcHJlZml4KHNlbGYsIHByZWZpeCk6Ci0gICAgICAgICIiIlNldCB0aGUgcHJlZml4IGZvciB0aGUgbm9kZS4iIiIKLSAgICAgICAgc2VsZi5jaGFuZ2VkKCkKLSAgICAgICAgc2VsZi5wcmVmaXggPSBwcmVmaXgKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcHJlZml4KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGhlIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzIHByZWNlZGluZyB0aGlzIHRva2VuIGluIHRoZSBpbnB1dC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9wcmVmaXgKIAotICAgIGRlZiBnZXRfcHJlZml4KHNlbGYpOgotICAgICAgICAiIiJSZXR1cm4gdGhlIHByZWZpeCBmb3IgdGhlIG5vZGUuIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnByZWZpeAorICAgIEBwcmVmaXguc2V0dGVyCisgICAgZGVmIHByZWZpeChzZWxmLCBwcmVmaXgpOgorICAgICAgICBzZWxmLmNoYW5nZWQoKQorICAgICAgICBzZWxmLl9wcmVmaXggPSBwcmVmaXgKIAogCiBkZWYgY29udmVydChnciwgcmF3X25vZGUpOgpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvcmVmYWN0b3IucHkgYi9MaWIvbGliMnRvMy9yZWZhY3Rvci5weQppbmRleCA5YTRlZjZhLi5kMWNkYjVkIDEwMDc1NQotLS0gYS9MaWIvbGliMnRvMy9yZWZhY3Rvci5weQorKysgYi9MaWIvbGliMnRvMy9yZWZhY3Rvci5weQpAQCAtMSw0ICsxLDMgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjIuNQogIyBDb3B5cmlnaHQgMjAwNiBHb29nbGUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgogCkBAIC0yMywxMSArMjIsNyBAQAogCiAjIExvY2FsIGltcG9ydHMKIGZyb20gLnBnZW4yIGltcG9ydCBkcml2ZXIsIHRva2VuaXplCi0KLWZyb20gLiBpbXBvcnQgcHl0cmVlCi1mcm9tIC4gaW1wb3J0IHBhdGNvbXAKLWZyb20gLiBpbXBvcnQgZml4ZXMKLWZyb20gLiBpbXBvcnQgcHlncmFtCitmcm9tIC4gaW1wb3J0IHB5dHJlZSwgcHlncmFtCiAKIAogZGVmIGdldF9hbGxfZml4X25hbWVzKGZpeGVyX3BrZywgcmVtb3ZlX3ByZWZpeD1UcnVlKToKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL2RhdGEvZGlmZmVyZW50X2VuY29kaW5nLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9kaWZmZXJlbnRfZW5jb2RpbmcucHkKaW5kZXggNGJiODJiZC4uODg4ZjUxZiAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9kaWZmZXJlbnRfZW5jb2RpbmcucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9kaWZmZXJlbnRfZW5jb2RpbmcucHkKQEAgLTEsNCArMSwzIEBACiAjIS91c3IvYmluL2VudiBweXRob24KICMgLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KLXByaW50KHUn3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX2+Pn6+/z9/v/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tjZ2tvc3d4nKQotCitwcmludCB1J9/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vj5+vv8/f7/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbY2drb3N3eJwpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvbXlmaXhlcy9maXhfcGFycm90LnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvbXlmaXhlcy9maXhfcGFycm90LnB5CmluZGV4IDZiZDJmNDkuLjZkYjc5YWQgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL3Rlc3RzL2RhdGEvZml4ZXJzL215Zml4ZXMvZml4X3BhcnJvdC5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9teWZpeGVzL2ZpeF9wYXJyb3QucHkKQEAgLTEwLDQgKzEwLDQgQEAKIAogICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CiAgICAgICAgIG5hbWUgPSByZXN1bHRzWyJuYW1lIl0KLSAgICAgICAgbmFtZS5yZXBsYWNlKE5hbWUoImNoZWVzZSIsIG5hbWUuZ2V0X3ByZWZpeCgpKSkKKyAgICAgICAgbmFtZS5yZXBsYWNlKE5hbWUoImNoZWVzZSIsIG5hbWUucHJlZml4KSkKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL2RhdGEvcHkyX3Rlc3RfZ3JhbW1hci5weSBiL0xpYi9saWIydG8zL3Rlc3RzL2RhdGEvcHkyX3Rlc3RfZ3JhbW1hci5weQppbmRleCBkYzc5NGUyLi4xN2Y5ZjRjIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy9kYXRhL3B5Ml90ZXN0X2dyYW1tYXIucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9weTJfdGVzdF9ncmFtbWFyLnB5CkBAIC0xLDUgKzEsMyBAQAotIyBQeXRob24gMidzIExpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weSAocjY2MTg5KQotCiAjIFB5dGhvbiB0ZXN0IHNldCAtLSBwYXJ0IDEsIGdyYW1tYXIuCiAjIFRoaXMganVzdCB0ZXN0cyB3aGV0aGVyIHRoZSBwYXJzZXIgYWNjZXB0cyB0aGVtIGFsbC4KIApAQCAtOTIyLDYgKzkyMCwyNiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFt4IGZvciB4LCBpbiBbKDQsKSwgKDUsKSwgKDYsKV1dLCBbNCwgNSwgNl0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh4IGZvciB4LCBpbiBbKDcsKSwgKDgsKSwgKDksKV0pLCBbNywgOCwgOV0pCiAKKyAgICBkZWYgdGVzdF93aXRoX3N0YXRlbWVudChzZWxmKToKKyAgICAgICAgY2xhc3MgbWFuYWdlcihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKDEsIDIpCisgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICB3aXRoIG1hbmFnZXIoKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgd2l0aCBtYW5hZ2VyKCkgYXMgeDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgd2l0aCBtYW5hZ2VyKCkgYXMgKHgsIHkpOgorICAgICAgICAgICAgcGFzcworICAgICAgICB3aXRoIG1hbmFnZXIoKSwgbWFuYWdlcigpOgorICAgICAgICAgICAgcGFzcworICAgICAgICB3aXRoIG1hbmFnZXIoKSBhcyB4LCBtYW5hZ2VyKCkgYXMgeToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgd2l0aCBtYW5hZ2VyKCkgYXMgeCwgbWFuYWdlcigpOgorICAgICAgICAgICAgcGFzcworCiAgICAgZGVmIHRlc3RJZkVsc2VFeHByKHNlbGYpOgogICAgICAgICAjIFRlc3QgaWZlbHNlIGV4cHJlc3Npb25zIGluIHZhcmlvdXMgY2FzZXMKICAgICAgICAgZGVmIF9jaGVja2V2YWwobXNnLCByZXQpOgpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9weTNfdGVzdF9ncmFtbWFyLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9weTNfdGVzdF9ncmFtbWFyLnB5CmluZGV4IGVhZGYxZGIuLjk3N2YwYjggMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL3Rlc3RzL2RhdGEvcHkzX3Rlc3RfZ3JhbW1hci5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy9kYXRhL3B5M190ZXN0X2dyYW1tYXIucHkKQEAgLTg2OCw2ICs4NjgsMjYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbeCBmb3IgeCwgaW4gWyg0LCksICg1LCksICg2LCldXSwgWzQsIDUsIDZdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoeCBmb3IgeCwgaW4gWyg3LCksICg4LCksICg5LCldKSwgWzcsIDgsIDldKQogCisgICAgZGVmIHRlc3Rfd2l0aF9zdGF0ZW1lbnQoc2VsZik6CisgICAgICAgIGNsYXNzIG1hbmFnZXIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICgxLCAyKQorICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgd2l0aCBtYW5hZ2VyKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggbWFuYWdlcigpIGFzIHg6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggbWFuYWdlcigpIGFzICh4LCB5KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgd2l0aCBtYW5hZ2VyKCksIG1hbmFnZXIoKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgd2l0aCBtYW5hZ2VyKCkgYXMgeCwgbWFuYWdlcigpIGFzIHk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggbWFuYWdlcigpIGFzIHgsIG1hbmFnZXIoKToKKyAgICAgICAgICAgIHBhc3MKKwogICAgIGRlZiB0ZXN0SWZFbHNlRXhwcihzZWxmKToKICAgICAgICAgIyBUZXN0IGlmZWxzZSBleHByZXNzaW9ucyBpbiB2YXJpb3VzIGNhc2VzCiAgICAgICAgIGRlZiBfY2hlY2tldmFsKG1zZywgcmV0KToKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3B5dHJlZV9pZGVtcG90ZW5jeS5weSBiL0xpYi9saWIydG8zL3Rlc3RzL3B5dHJlZV9pZGVtcG90ZW5jeS5weQppbmRleCBlZWZmZTUwLi4yNDNmN2U4IDEwMDc1NQotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy9weXRyZWVfaWRlbXBvdGVuY3kucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvcHl0cmVlX2lkZW1wb3RlbmN5LnB5CkBAIC0xLDQgKzEsNCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMi41CisjIS91c3IvYmluL2VudiBweXRob24KICMgQ29weXJpZ2h0IDIwMDYgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KIApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvc3VwcG9ydC5weSBiL0xpYi9saWIydG8zL3Rlc3RzL3N1cHBvcnQucHkKaW5kZXggYWVmOGNlMi4uMzY0NjkzNSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvc3VwcG9ydC5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy9zdXBwb3J0LnB5CkBAIC0zMCw3ICszMCw3IEBACiBkZWYgcmVmb3JtYXQoc3RyaW5nKToKICAgICByZXR1cm4gZGVkZW50KHN0cmluZykgKyB1IlxuXG4iCiAKLWRlZiBnZXRfcmVmYWN0b3JlcihmaXhlcnM9Tm9uZSwgb3B0aW9ucz1Ob25lKToKK2RlZiBnZXRfcmVmYWN0b3JlcihmaXhlcl9wa2c9ImxpYjJ0bzMiLCBmaXhlcnM9Tm9uZSwgb3B0aW9ucz1Ob25lKToKICAgICAiIiIKICAgICBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIFJlZmFjdG9yaW5nVG9vbCBmb3IgdGVzdHMuCiAKQEAgLTM5LDkgKzM5LDkgQEAKICAgICBiZSBwYXNzZWQgdG8gdGhlIFJlZmFjdG9yaW5nVG9vbC4KICAgICAiIiIKICAgICBpZiBmaXhlcnMgaXMgbm90IE5vbmU6Ci0gICAgICAgIGZpeGVycyA9IFsibGliMnRvMy5maXhlcy5maXhfIiArIGZpeCBmb3IgZml4IGluIGZpeGVyc10KKyAgICAgICAgZml4ZXJzID0gW2ZpeGVyX3BrZyArICIuZml4ZXMuZml4XyIgKyBmaXggZm9yIGZpeCBpbiBmaXhlcnNdCiAgICAgZWxzZToKLSAgICAgICAgZml4ZXJzID0gcmVmYWN0b3IuZ2V0X2ZpeGVyc19mcm9tX3BhY2thZ2UoImxpYjJ0bzMuZml4ZXMiKQorICAgICAgICBmaXhlcnMgPSByZWZhY3Rvci5nZXRfZml4ZXJzX2Zyb21fcGFja2FnZShmaXhlcl9wa2cgKyAiLmZpeGVzIikKICAgICBvcHRpb25zID0gb3B0aW9ucyBvciB7fQogICAgIHJldHVybiByZWZhY3Rvci5SZWZhY3RvcmluZ1Rvb2woZml4ZXJzLCBvcHRpb25zLCBleHBsaWNpdD1UcnVlKQogCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2FsbF9maXhlcnMucHkgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2FsbF9maXhlcnMucHkKaW5kZXggNjdiYzM1NS4uY2M1Y2QyOCAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9hbGxfZml4ZXJzLnB5CisrKyBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfYWxsX2ZpeGVycy5weQpAQCAtMSw0ICsxLDMgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjIuNQogIiIiVGVzdHMgdGhhdCBydW4gYWxsIGZpeGVyIG1vZHVsZXMgb3ZlciBhbiBpbnB1dCBzdHJlYW0uCiAKIFRoaXMgaGFzIGJlZW4gYnJva2VuIG91dCBpbnRvIGl0cyBvd24gdGVzdCBtb2R1bGUgYmVjYXVzZSBvZiBpdHMKQEAgLTYsMTggKzUsMTMgQEAKICIiIgogIyBBdXRob3I6IENvbGxpbiBXaW50ZXIKIAotIyBUZXN0aW5nIGltcG9ydHMKLXRyeToKLSAgICBmcm9tIC4gaW1wb3J0IHN1cHBvcnQKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBpbXBvcnQgc3VwcG9ydAotCiAjIFB5dGhvbiBpbXBvcnRzCiBpbXBvcnQgdW5pdHRlc3QKIAogIyBMb2NhbCBpbXBvcnRzCiBmcm9tIC4uIGltcG9ydCBweXRyZWUKIGZyb20gLi4gaW1wb3J0IHJlZmFjdG9yCitmcm9tIC4gaW1wb3J0IHN1cHBvcnQKIAogY2xhc3MgVGVzdF9hbGwoc3VwcG9ydC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgpAQCAtMjgsOCArMjIsMyBAQAogICAgICAgICBmb3IgZmlsZXBhdGggaW4gc3VwcG9ydC5hbGxfcHJvamVjdF9maWxlcygpOgogICAgICAgICAgICAgcHJpbnQgIkZpeGluZyAlcy4uLiIgJSBmaWxlcGF0aAogICAgICAgICAgICAgc2VsZi5yZWZhY3Rvci5yZWZhY3Rvcl9maWxlKGZpbGVwYXRoKQotCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgaW1wb3J0IF9fbWFpbl9fCi0gICAgc3VwcG9ydC5ydW5fYWxsX3Rlc3RzKF9fbWFpbl9fKQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHkgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weQppbmRleCAyNTU4OTgwLi4wMTZjMjhiIDEwMDc1NQotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weQpAQCAtMSwxMiArMSw0IEBACi0jIS91c3IvYmluL2VudiBweXRob24yLjUKICIiIiBUZXN0IHN1aXRlIGZvciB0aGUgZml4ZXIgbW9kdWxlcyAiIiIKLSMgQXV0aG9yOiBDb2xsaW4gV2ludGVyCi0KLSMgVGVzdGluZyBpbXBvcnRzCi10cnk6Ci0gICAgZnJvbSB0ZXN0cyBpbXBvcnQgc3VwcG9ydAotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIGltcG9ydCBzdXBwb3J0CiAKICMgUHl0aG9uIGltcG9ydHMKIGltcG9ydCBvcwpAQCAtMTYsMTQgKzgsMTkgQEAKIAogIyBMb2NhbCBpbXBvcnRzCiBmcm9tIGxpYjJ0bzMgaW1wb3J0IHB5Z3JhbSwgcHl0cmVlLCByZWZhY3RvciwgZml4ZXJfdXRpbAorZnJvbSBsaWIydG8zLnRlc3RzIGltcG9ydCBzdXBwb3J0CiAKIAogY2xhc3MgRml4ZXJUZXN0Q2FzZShzdXBwb3J0LlRlc3RDYXNlKToKLSAgICBkZWYgc2V0VXAoc2VsZiwgZml4X2xpc3Q9Tm9uZSk6CisKKyAgICAjIE90aGVyIHRlc3QgY2FzZXMgY2FuIHN1YmNsYXNzIHRoaXMgY2xhc3MgYW5kIHJlcGxhY2UgImZpeGVyX3BrZyIgd2l0aAorICAgICMgdGhlaXIgb3duLgorICAgIGRlZiBzZXRVcChzZWxmLCBmaXhfbGlzdD1Ob25lLCBmaXhlcl9wa2c9ImxpYjJ0bzMiLCBvcHRpb25zPU5vbmUpOgogICAgICAgICBpZiBmaXhfbGlzdCBpcyBOb25lOgogICAgICAgICAgICAgZml4X2xpc3QgPSBbc2VsZi5maXhlcl0KLSAgICAgICAgb3B0aW9ucyA9IHsicHJpbnRfZnVuY3Rpb24iIDogRmFsc2V9Ci0gICAgICAgIHNlbGYucmVmYWN0b3IgPSBzdXBwb3J0LmdldF9yZWZhY3RvcmVyKGZpeF9saXN0LCBvcHRpb25zKQorICAgICAgICBpZiBvcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICBvcHRpb25zID0geyJwcmludF9mdW5jdGlvbiIgOiBGYWxzZX0KKyAgICAgICAgc2VsZi5yZWZhY3RvciA9IHN1cHBvcnQuZ2V0X3JlZmFjdG9yZXIoZml4ZXJfcGtnLCBmaXhfbGlzdCwgb3B0aW9ucykKICAgICAgICAgc2VsZi5maXhlcl9sb2cgPSBbXQogICAgICAgICBzZWxmLmZpbGVuYW1lID0gdSI8c3RyaW5nPiIKIApAQCAtNjIsNyArNTksNyBAQAogICAgICAgICBmaXhlcyA9IFtzZWxmLmZpeGVyXQogICAgICAgICBmaXhlcy5leHRlbmQobmFtZXMpCiAgICAgICAgIG9wdGlvbnMgPSB7InByaW50X2Z1bmN0aW9uIiA6IEZhbHNlfQotICAgICAgICByID0gc3VwcG9ydC5nZXRfcmVmYWN0b3JlcihmaXhlcywgb3B0aW9ucykKKyAgICAgICAgciA9IHN1cHBvcnQuZ2V0X3JlZmFjdG9yZXIoImxpYjJ0bzMiLCBmaXhlcywgb3B0aW9ucykKICAgICAgICAgKHByZSwgcG9zdCkgPSByLmdldF9maXhlcnMoKQogICAgICAgICBuID0gImZpeF8iICsgc2VsZi5maXhlcgogICAgICAgICBpZiBwb3N0IGFuZCBwb3N0Wy0xXS5fX2NsYXNzX18uX19tb2R1bGVfXy5lbmRzd2l0aChuKToKQEAgLTQxOSw2ICs0MTYsNyBAQAogICAgIGRlZiB0ZXN0XzUoc2VsZik6CiAgICAgICAgIGIgPSAiIiJwcmludDsgcHJpbnQgd2hhdGV2ZXI7IiIiCiAgICAgICAgIGEgPSAiIiJwcmludCgpOyBwcmludCh3aGF0ZXZlcik7IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKIAogICAgIGRlZiB0ZXN0X3R1cGxlKHNlbGYpOgogICAgICAgICBiID0gIiIicHJpbnQgKGEsIGIsIGMpIiIiCkBAIC03ODIsNiArNzgwLDUyIEBACiAgICAgICAgICAgICAgICAgcGFzcyIiIgogICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCiAKKyAgICBkZWYgdGVzdF9vbmVfbGluZV9zdWl0ZXMoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHRyeTogcmFpc2UgVHlwZUVycm9yCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBlOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB0cnk6IHJhaXNlIFR5cGVFcnJvcgorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIGU6IHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIGU6IHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHRyeTogcmFpc2UgVHlwZUVycm9yCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBlOiBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgdHJ5OiByYWlzZSBUeXBlRXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IgYXMgZTogcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgdHJ5OiByYWlzZSBUeXBlRXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIGU6IHBhc3MKKyAgICAgICAgICAgIGVsc2U6IGZ1bmN0aW9uKCkKKyAgICAgICAgICAgIGZpbmFsbHk6IGRvbmUoKQorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIHRyeTogcmFpc2UgVHlwZUVycm9yCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIGU6IHBhc3MKKyAgICAgICAgICAgIGVsc2U6IGZ1bmN0aW9uKCkKKyAgICAgICAgICAgIGZpbmFsbHk6IGRvbmUoKQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKwogICAgICMgVGhlc2Ugc2hvdWxkIG5vdCBiZSB0b3VjaGVkOgogCiAgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzEoc2VsZik6CkBAIC0yNjQwLDExICsyNjg0LDI5IEBACiBjbGFzcyBUZXN0X3VuaWNvZGUoRml4ZXJUZXN0Q2FzZSk6CiAgICAgZml4ZXIgPSAidW5pY29kZSIKIAorICAgIGRlZiB0ZXN0X3doaXRlc3BhY2Uoc2VsZik6CisgICAgICAgIGIgPSAiIiJ1bmljb2RlKCB4KSIiIgorICAgICAgICBhID0gIiIic3RyKCB4KSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIiB1bmljb2RlKHggKSIiIgorICAgICAgICBhID0gIiIiIHN0cih4ICkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiIgdSdoJyIiIgorICAgICAgICBhID0gIiIiICdoJyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKICAgICBkZWYgdGVzdF91bmljb2RlX2NhbGwoc2VsZik6CiAgICAgICAgIGIgPSAiIiJ1bmljb2RlKHgsIHksIHopIiIiCiAgICAgICAgIGEgPSAiIiJzdHIoeCwgeSwgeikiIiIKICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQogCisgICAgZGVmIHRlc3RfdW5pY2hyKHNlbGYpOgorICAgICAgICBiID0gIiIidW5pY2hyKHUnaCcpIiIiCisgICAgICAgIGEgPSAiIiJjaHIoJ2gnKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKICAgICBkZWYgdGVzdF91bmljb2RlX2xpdGVyYWxfMShzZWxmKToKICAgICAgICAgYiA9ICcnJ3UieCInJycKICAgICAgICAgYSA9ICcnJyJ4IicnJwpAQCAtMjY1Niw4ICsyNzE4LDggQEAKICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQogCiAgICAgZGVmIHRlc3RfdW5pY29kZV9saXRlcmFsXzMoc2VsZik6Ci0gICAgICAgIGIgPSAiIiJVUicnJ3gnJyciIiIKLSAgICAgICAgYSA9ICIiIlInJyd4JycnIiIiCisgICAgICAgIGIgPSAiIiJVUicnJ3gnJycgIiIiCisgICAgICAgIGEgPSAiIiJSJycneCcnJyAiIiIKICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQogCiBjbGFzcyBUZXN0X2NhbGxhYmxlKEZpeGVyVGVzdENhc2UpOgpAQCAtMzMwNiw2ICszMzY4LDExIEBACiAgICAgICAgIGEgPSAiIiJ4ID0gbWVtb3J5dmlldyh5KSIiIgogICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCiAKKyAgICBkZWYgdGVzdF9zbGljaW5nKHNlbGYpOgorICAgICAgICBiID0gIiIiYnVmZmVyKHkpWzQ6NV0iIiIKKyAgICAgICAgYSA9ICIiIm1lbW9yeXZpZXcoeSlbNDo1XSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKIGNsYXNzIFRlc3RfZnV0dXJlKEZpeGVyVGVzdENhc2UpOgogICAgIGZpeGVyID0gImZ1dHVyZSIKIApAQCAtNDAyOCw4ICs0MDk1LDMgQEAKICAgICAgICAgYiA9ICIiIm9zLmdldGN3ZHUgKCAgKSIiIgogICAgICAgICBhID0gIiIib3MuZ2V0Y3dkICggICkiIiIKICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQotCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgaW1wb3J0IF9fbWFpbl9fCi0gICAgc3VwcG9ydC5ydW5fYWxsX3Rlc3RzKF9fbWFpbl9fKQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9wYXJzZXIucHkgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weQppbmRleCAzNDEwNzg3Li43MjVjMjhhIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weQpAQCAtMSw0ICsxLDMgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjIuNQogIiIiVGVzdCBzdWl0ZSBmb3IgMnRvMydzIHBhcnNlciBhbmQgZ3JhbW1hciBmaWxlcy4KIAogVGhpcyBpcyB0aGUgcGxhY2UgdG8gYWRkIHRlc3RzIGZvciBjaGFuZ2VzIHRvIDJ0bzMncyBncmFtbWFyLCBzdWNoIGFzIHRob3NlCkBAIC02LDcgKzUsNiBAQAogcGFydHMgb2YgdGhlIGdyYW1tYXIgd2UndmUgY2hhbmdlZCwgd2UgYWxzbyBtYWtlIHN1cmUgd2UgY2FuIHBhcnNlIHRoZQogdGVzdF9ncmFtbWFyLnB5IGZpbGVzIGZyb20gYm90aCBQeXRob24gMiBhbmQgUHl0aG9uIDMuCiAiIiIKLSMgQXV0aG9yOiBDb2xsaW4gV2ludGVyCiAKICMgVGVzdGluZyBpbXBvcnRzCiBmcm9tIC4gaW1wb3J0IHN1cHBvcnQKQEAgLTE5OCw3ICsxOTYsNyBAQAogCiAKIGRlZiBkaWZmKGZuLCByZXN1bHQpOgotICAgIGYgPSBvcGVuKCJAIiwgInciKQorICAgIGYgPSBvcGVuKCJAIiwgIndiIikKICAgICB0cnk6CiAgICAgICAgIGYud3JpdGUocmVzdWx0KQogICAgIGZpbmFsbHk6CkBAIC0yMDcsOCArMjA1LDMgQEAKICAgICAgICAgcmV0dXJuIG9zLnN5c3RlbSgiZGlmZiAtdSAlcyBAIiAlIGZuKQogICAgIGZpbmFsbHk6CiAgICAgICAgIG9zLnJlbW92ZSgiQCIpCi0KLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBpbXBvcnQgX19tYWluX18KLSAgICBzdXBwb3J0LnJ1bl9hbGxfdGVzdHMoX19tYWluX18pCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3B5dHJlZS5weSBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcHl0cmVlLnB5CmluZGV4IDlkYzZlMDcuLjgzYTliMTggMTAwNzU1Ci0tLSBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcHl0cmVlLnB5CisrKyBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcHl0cmVlLnB5CkBAIC0xLDQgKzEsMyBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMi41CiAjIENvcHlyaWdodCAyMDA2IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCiAKQEAgLTEwLDExICs5LDEyIEBACiBlc3BlY2lhbGx5IHdoZW4gZGVidWdnaW5nIGEgdGVzdC4KICIiIgogCitpbXBvcnQgd2FybmluZ3MKKwogIyBUZXN0aW5nIGltcG9ydHMKIGZyb20gLiBpbXBvcnQgc3VwcG9ydAogCi0jIExvY2FsIGltcG9ydHMgKFhYWCBzaG91bGQgYmVjb21lIGEgcGFja2FnZSkKLWZyb20gLi4gaW1wb3J0IHB5dHJlZQorZnJvbSBsaWIydG8zIGltcG9ydCBweXRyZWUKIAogdHJ5OgogICAgIHNvcnRlZApAQCAtMjgsMzQgKzI4LDQ4IEBACiAKICAgICAiIiJVbml0IHRlc3RzIGZvciBub2RlcyAoQmFzZSwgTGVhZiwgTm9kZSkuIiIiCiAKLSAgICBkZWYgdGVzdEJhc2VDYW50Q29uc3RydWN0KHNlbGYpOgorICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfcHJlZml4X21ldGhvZHMoc2VsZik6CisgICAgICAgIGwgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLmdldF9wcmVmaXgoKSwgIiIpCisgICAgICAgICAgICBsLnNldF9wcmVmaXgoImhpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLnByZWZpeCwgImhpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDIpCisgICAgICAgIGZvciB3YXJuaW5nIGluIHc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod2FybmluZy5jYXRlZ29yeSBpcyBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHdbMF0ubWVzc2FnZSksICJnZXRfcHJlZml4KCkgaXMgZGVwcmVjYXRlZDsgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgdGhlIHByZWZpeCBwcm9wZXJ0eSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHdbMV0ubWVzc2FnZSksICJzZXRfcHJlZml4KCkgaXMgZGVwcmVjYXRlZDsgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgdGhlIHByZWZpeCBwcm9wZXJ0eSIpCisKKyAgICBkZWYgdGVzdF9pbnN0YW50aWF0ZV9iYXNlKHNlbGYpOgogICAgICAgICBpZiBfX2RlYnVnX186CiAgICAgICAgICAgICAjIFRlc3QgdGhhdCBpbnN0YW50aWF0aW5nIEJhc2UoKSByYWlzZXMgYW4gQXNzZXJ0aW9uRXJyb3IKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yLCBweXRyZWUuQmFzZSkKIAotICAgIGRlZiB0ZXN0TGVhZihzZWxmKToKKyAgICBkZWYgdGVzdF9sZWFmKHNlbGYpOgogICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEudHlwZSwgMTAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLnZhbHVlLCAiZm9vIikKIAotICAgIGRlZiB0ZXN0TGVhZlJlcHIoc2VsZik6CisgICAgZGVmIHRlc3RfbGVhZl9yZXByKHNlbGYpOgogICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihsMSksICJMZWFmKDEwMCwgJ2ZvbycpIikKIAotICAgIGRlZiB0ZXN0TGVhZlN0cihzZWxmKToKKyAgICBkZWYgdGVzdF9sZWFmX3N0cihzZWxmKToKICAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihsMSksICJmb28iKQogICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIsIGNvbnRleHQ9KCIgIiwgKDEwLCAxKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGwyKSwgIiBmb28iKQogCi0gICAgZGVmIHRlc3RMZWFmU3RyTnVtZXJpY1ZhbHVlKHNlbGYpOgorICAgIGRlZiB0ZXN0X2xlYWZfc3RyX251bWVyaWNfdmFsdWUoc2VsZik6CiAgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgdGhlIExlYWYncyB2YWx1ZSBpcyBzdHJpbmdpZmllZC4gRmFpbGluZyB0bwogICAgICAgICAjICBkbyB0aGlzIGNhbiBjYXVzZSBhIFR5cGVFcnJvciBpbiBjZXJ0YWluIHNpdHVhdGlvbnMuCiAgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMiwgNSkKLSAgICAgICAgbDEuc2V0X3ByZWZpeCgiZm9vXyIpCisgICAgICAgIGwxLnByZWZpeCA9ICJmb29fIgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihsMSksICJmb29fNSIpCiAKLSAgICBkZWYgdGVzdExlYWZFcShzZWxmKToKKyAgICBkZWYgdGVzdF9sZWFmX2VxdWFsaXR5KHNlbGYpOgogICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCiAgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIiwgY29udGV4dD0oIiAiLCAoMSwgMCkpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLCBsMikKQEAgLTY0LDY3ICs3OCw2NyBAQAogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGwxLCBsMykKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChsMSwgbDQpCiAKLSAgICBkZWYgdGVzdExlYWZQcmVmaXgoc2VsZik6CisgICAgZGVmIHRlc3RfbGVhZl9wcmVmaXgoc2VsZik6CiAgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMS5nZXRfcHJlZml4KCksICIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLnByZWZpeCwgIiIpCiAgICAgICAgIHNlbGYuZmFpbElmKGwxLndhc19jaGFuZ2VkKQotICAgICAgICBsMS5zZXRfcHJlZml4KCIgICMjXG5cbiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEuZ2V0X3ByZWZpeCgpLCAiICAjI1xuXG4iKQorICAgICAgICBsMS5wcmVmaXggPSAiICAjI1xuXG4iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEucHJlZml4LCAiICAjI1xuXG4iKQogICAgICAgICBzZWxmLmZhaWxVbmxlc3MobDEud2FzX2NoYW5nZWQpCiAKLSAgICBkZWYgdGVzdE5vZGUoc2VsZik6CisgICAgZGVmIHRlc3Rfbm9kZShzZWxmKToKICAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQogICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDIwMCwgImJhciIpCiAgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxLCBsMl0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEudHlwZSwgMTAwMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5jaGlsZHJlbiwgW2wxLCBsMl0pCiAKLSAgICBkZWYgdGVzdE5vZGVSZXByKHNlbGYpOgorICAgIGRlZiB0ZXN0X25vZGVfcmVwcihzZWxmKToKICAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQogICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDEwMCwgImJhciIsIGNvbnRleHQ9KCIgIiwgKDEsIDApKSkKICAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKG4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9kZSgxMDAwLCBbJXMsICVzXSkiICUgKHJlcHIobDEpLCByZXByKGwyKSkpCiAKLSAgICBkZWYgdGVzdE5vZGVTdHIoc2VsZik6CisgICAgZGVmIHRlc3Rfbm9kZV9zdHIoc2VsZik6CiAgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKICAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJiYXIiLCBjb250ZXh0PSgiICIsICgxLCAwKSkpCiAgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxLCBsMl0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG4xKSwgImZvbyBiYXIiKQogCi0gICAgZGVmIHRlc3ROb2RlUHJlZml4KHNlbGYpOgorICAgIGRlZiB0ZXN0X25vZGVfcHJlZml4KHNlbGYpOgogICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEuZ2V0X3ByZWZpeCgpLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMS5wcmVmaXgsICIiKQogICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsMV0pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEuZ2V0X3ByZWZpeCgpLCAiIikKLSAgICAgICAgbjEuc2V0X3ByZWZpeCgiICIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEuZ2V0X3ByZWZpeCgpLCAiICIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEuZ2V0X3ByZWZpeCgpLCAiICIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEucHJlZml4LCAiIikKKyAgICAgICAgbjEucHJlZml4ID0gIiAiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEucHJlZml4LCAiICIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEucHJlZml4LCAiICIpCiAKLSAgICBkZWYgdGVzdEdldFN1ZmZpeChzZWxmKToKKyAgICBkZWYgdGVzdF9nZXRfc3VmZml4KHNlbGYpOgogICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIsIHByZWZpeD0iYSIpCiAgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiYmFyIiwgcHJlZml4PSJiIikKICAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyXSkKIAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLmdldF9zdWZmaXgoKSwgbDIuZ2V0X3ByZWZpeCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLmdldF9zdWZmaXgoKSwgbDIucHJlZml4KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwyLmdldF9zdWZmaXgoKSwgIiIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEuZ2V0X3N1ZmZpeCgpLCAiIikKIAogICAgICAgICBsMyA9IHB5dHJlZS5MZWFmKDEwMCwgImJhciIsIHByZWZpeD0iYyIpCiAgICAgICAgIG4yID0gcHl0cmVlLk5vZGUoMTAwMCwgW24xLCBsM10pCiAKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5nZXRfc3VmZml4KCksIGwzLmdldF9wcmVmaXgoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5nZXRfc3VmZml4KCksIGwzLnByZWZpeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMy5nZXRfc3VmZml4KCksICIiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4yLmdldF9zdWZmaXgoKSwgIiIpCiAKLSAgICBkZWYgdGVzdE5vZGVFcShzZWxmKToKKyAgICBkZWYgdGVzdF9ub2RlX2VxdWFsaXR5KHNlbGYpOgogICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsICgpKQogICAgICAgICBuMiA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtdLCBjb250ZXh0PSgiICIsICgxLCAwKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEsIG4yKQogICAgICAgICBuMyA9IHB5dHJlZS5Ob2RlKDEwMDEsICgpKQogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG4xLCBuMykKIAotICAgIGRlZiB0ZXN0Tm9kZUVxUmVjdXJzaXZlKHNlbGYpOgorICAgIGRlZiB0ZXN0X25vZGVfcmVjdXJzaXZlX2VxdWFsaXR5KHNlbGYpOgogICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCiAgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKICAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDFdKQpAQCAtMTM0LDcgKzE0OCw3IEBACiAgICAgICAgIG4zID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wzXSkKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChuMSwgbjMpCiAKLSAgICBkZWYgdGVzdFJlcGxhY2Uoc2VsZik6CisgICAgZGVmIHRlc3RfcmVwbGFjZShzZWxmKToKICAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQogICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDEwMCwgIisiKQogICAgICAgICBsMyA9IHB5dHJlZS5MZWFmKDEwMCwgImJhciIpCkBAIC0xNDgsNyArMTYyLDcgQEAKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UobjEuY2hpbGRyZW4sIGxpc3QpKQogICAgICAgICBzZWxmLmZhaWxVbmxlc3MobjEud2FzX2NoYW5nZWQpCiAKLSAgICBkZWYgdGVzdFJlcGxhY2VXaXRoTGlzdChzZWxmKToKKyAgICBkZWYgdGVzdF9yZXBsYWNlX3dpdGhfbGlzdChzZWxmKToKICAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQogICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDEwMCwgIisiKQogICAgICAgICBsMyA9IHB5dHJlZS5MZWFmKDEwMCwgImJhciIpCkBAIC0xNTgsMzQgKzE3MiwzMCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihuMSksICJmb28qKmJhciIpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG4xLmNoaWxkcmVuLCBsaXN0KSkKIAotICAgIGRlZiB0ZXN0UG9zdE9yZGVyKHNlbGYpOgorICAgIGRlZiB0ZXN0X3Bvc3Rfb3JkZXIoc2VsZik6CiAgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKICAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJiYXIiKQogICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsMSwgbDJdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobjEucG9zdF9vcmRlcigpKSwgW2wxLCBsMiwgbjFdKQogCi0gICAgZGVmIHRlc3RQcmVPcmRlcihzZWxmKToKKyAgICBkZWYgdGVzdF9wcmVfb3JkZXIoc2VsZik6CiAgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKICAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJiYXIiKQogICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsMSwgbDJdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobjEucHJlX29yZGVyKCkpLCBbbjEsIGwxLCBsMl0pCiAKLSAgICBkZWYgdGVzdENoYW5nZWRMZWFmKHNlbGYpOgorICAgIGRlZiB0ZXN0X2NoYW5nZWQoc2VsZik6CiAgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZiIpCiAgICAgICAgIHNlbGYuZmFpbElmKGwxLndhc19jaGFuZ2VkKQotCiAgICAgICAgIGwxLmNoYW5nZWQoKQogICAgICAgICBzZWxmLmZhaWxVbmxlc3MobDEud2FzX2NoYW5nZWQpCiAKLSAgICBkZWYgdGVzdENoYW5nZWROb2RlKHNlbGYpOgogICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImYiKQogICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsMV0pCiAgICAgICAgIHNlbGYuZmFpbElmKG4xLndhc19jaGFuZ2VkKQotCiAgICAgICAgIG4xLmNoYW5nZWQoKQogICAgICAgICBzZWxmLmZhaWxVbmxlc3MobjEud2FzX2NoYW5nZWQpCiAKLSAgICBkZWYgdGVzdENoYW5nZWRSZWN1cnNpdmUoc2VsZik6CiAgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKICAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICIrIikKICAgICAgICAgbDMgPSBweXRyZWUuTGVhZigxMDAsICJiYXIiKQpAQCAtMjAwLDIzICsyMTAsMjMgQEAKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG4yLndhc19jaGFuZ2VkKQogICAgICAgICBzZWxmLmZhaWxJZihsMS53YXNfY2hhbmdlZCkKIAotICAgIGRlZiB0ZXN0TGVhZkNvbnN0cnVjdG9yUHJlZml4KHNlbGYpOgorICAgIGRlZiB0ZXN0X2xlYWZfY29uc3RydWN0b3JfcHJlZml4KHNlbGYpOgogICAgICAgICBmb3IgcHJlZml4IGluICgieHl6XyIsICIiKToKICAgICAgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAic2VsZiIsIHByZWZpeD1wcmVmaXgpCiAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3RyKGwxKSwgcHJlZml4ICsgInNlbGYiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMS5nZXRfcHJlZml4KCksIHByZWZpeCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEucHJlZml4LCBwcmVmaXgpCiAKLSAgICBkZWYgdGVzdE5vZGVDb25zdHJ1Y3RvclByZWZpeChzZWxmKToKKyAgICBkZWYgdGVzdF9ub2RlX2NvbnN0cnVjdG9yX3ByZWZpeChzZWxmKToKICAgICAgICAgZm9yIHByZWZpeCBpbiAoInh5el8iLCAiIik6CiAgICAgICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgInNlbGYiKQogICAgICAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJmb28iLCBwcmVmaXg9Il8iKQogICAgICAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyXSwgcHJlZml4PXByZWZpeCkKICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHIobjEpLCBwcmVmaXggKyAic2VsZl9mb28iKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5nZXRfcHJlZml4KCksIHByZWZpeCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEuZ2V0X3ByZWZpeCgpLCBwcmVmaXgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwyLmdldF9wcmVmaXgoKSwgIl8iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5wcmVmaXgsIHByZWZpeCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEucHJlZml4LCBwcmVmaXgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwyLnByZWZpeCwgIl8iKQogCi0gICAgZGVmIHRlc3RSZW1vdmUoc2VsZik6CisgICAgZGVmIHRlc3RfcmVtb3ZlKHNlbGYpOgogICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCiAgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKICAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyXSkKQEAgLTIzOSw3ICsyNDksNyBAQAogICAgICAgICBzZWxmLmZhaWxVbmxlc3MobjEud2FzX2NoYW5nZWQpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhuMi53YXNfY2hhbmdlZCkKIAotICAgIGRlZiB0ZXN0UmVtb3ZlUGFyZW50bGVzcyhzZWxmKToKKyAgICBkZWYgdGVzdF9yZW1vdmVfcGFyZW50bGVzcyhzZWxmKToKICAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbXSkKICAgICAgICAgbjEucmVtb3ZlKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5wYXJlbnQsIE5vbmUpCkBAIC0yNDgsNyArMjU4LDcgQEAKICAgICAgICAgbDEucmVtb3ZlKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMS5wYXJlbnQsIE5vbmUpCiAKLSAgICBkZWYgdGVzdE5vZGVTZXRDaGlsZChzZWxmKToKKyAgICBkZWYgdGVzdF9ub2RlX3NldF9jaGlsZChzZWxmKToKICAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQogICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsMV0pCiAKQEAgLTI2OSw3ICsyNzksNyBAQAogICAgICAgICAjIEkgZG9uJ3QgY2FyZSB3aGF0IGl0IHJhaXNlcywgc28gbG9uZyBhcyBpdCdzIGFuIGV4Y2VwdGlvbgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24sIG4xLnNldF9jaGlsZCwgMCwgbGlzdCkKIAotICAgIGRlZiB0ZXN0Tm9kZUluc2VydENoaWxkKHNlbGYpOgorICAgIGRlZiB0ZXN0X25vZGVfaW5zZXJ0X2NoaWxkKHNlbGYpOgogICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCiAgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxXSkKIApAQCAtMjg1LDcgKzI5NSw3IEBACiAgICAgICAgICMgSSBkb24ndCBjYXJlIHdoYXQgaXQgcmFpc2VzLCBzbyBsb25nIGFzIGl0J3MgYW4gZXhjZXB0aW9uCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgbjEuaW5zZXJ0X2NoaWxkLCAwLCBsaXN0KQogCi0gICAgZGVmIHRlc3ROb2RlQXBwZW5kQ2hpbGQoc2VsZik6CisgICAgZGVmIHRlc3Rfbm9kZV9hcHBlbmRfY2hpbGQoc2VsZik6CiAgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW10pCiAKICAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQpAQCAtMzAxLDcgKzMxMSw3IEBACiAgICAgICAgICMgSSBkb24ndCBjYXJlIHdoYXQgaXQgcmFpc2VzLCBzbyBsb25nIGFzIGl0J3MgYW4gZXhjZXB0aW9uCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgbjEuYXBwZW5kX2NoaWxkLCBsaXN0KQogCi0gICAgZGVmIHRlc3ROb2RlTmV4dFNpYmxpbmcoc2VsZik6CisgICAgZGVmIHRlc3Rfbm9kZV9uZXh0X3NpYmxpbmcoc2VsZik6CiAgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW10pCiAgICAgICAgIG4yID0gcHl0cmVlLk5vZGUoMTAwMCwgW10pCiAgICAgICAgIHAxID0gcHl0cmVlLk5vZGUoMTAwMCwgW24xLCBuMl0pCkBAIC0zMTAsNyArMzIwLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMi5uZXh0X3NpYmxpbmcsIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEubmV4dF9zaWJsaW5nLCBOb25lKQogCi0gICAgZGVmIHRlc3RMZWFmTmV4dFNpYmxpbmcoc2VsZik6CisgICAgZGVmIHRlc3RfbGVhZl9uZXh0X3NpYmxpbmcoc2VsZik6CiAgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiYSIpCiAgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiYiIpCiAgICAgICAgIHAxID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxLCBsMl0pCkBAIC0zMTksNyArMzI5LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMi5uZXh0X3NpYmxpbmcsIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEubmV4dF9zaWJsaW5nLCBOb25lKQogCi0gICAgZGVmIHRlc3ROb2RlUHJldlNpYmxpbmcoc2VsZik6CisgICAgZGVmIHRlc3Rfbm9kZV9wcmV2X3NpYmxpbmcoc2VsZik6CiAgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW10pCiAgICAgICAgIG4yID0gcHl0cmVlLk5vZGUoMTAwMCwgW10pCiAgICAgICAgIHAxID0gcHl0cmVlLk5vZGUoMTAwMCwgW24xLCBuMl0pCkBAIC0zMjgsNyArMzM4LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5wcmV2X3NpYmxpbmcsIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEucHJldl9zaWJsaW5nLCBOb25lKQogCi0gICAgZGVmIHRlc3RMZWFmUHJldlNpYmxpbmcoc2VsZik6CisgICAgZGVmIHRlc3RfbGVhZl9wcmV2X3NpYmxpbmcoc2VsZik6CiAgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiYSIpCiAgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiYiIpCiAgICAgICAgIHAxID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxLCBsMl0pCkBAIC0zNDIsNyArMzUyLDcgQEAKIAogICAgICIiIlVuaXQgdGVzdHMgZm9yIHRyZWUgbWF0Y2hpbmcgcGF0dGVybnMuIiIiCiAKLSAgICBkZWYgdGVzdEJhc2ljUGF0dGVybnMoc2VsZik6CisgICAgZGVmIHRlc3RfYmFzaWNfcGF0dGVybnMoc2VsZik6CiAgICAgICAgICMgQnVpbGQgYSB0cmVlCiAgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKICAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJiYXIiKQpAQCAtMzc4LDcgKzM4OCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocG4ubWF0Y2gobDIsIHJlc3VsdHM9cikpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwge30pCiAKLSAgICBkZWYgdGVzdFdpbGRjYXJkUGF0dGVybnMoc2VsZik6CisgICAgZGVmIHRlc3Rfd2lsZGNhcmQoc2VsZik6CiAgICAgICAgICMgQnVpbGQgYSB0cmVlIGZvciB0ZXN0aW5nCiAgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKICAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJiYXIiKQpAQCAtNDA5LDcgKzQxOSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0XyhyWyJwbCJdIGlzIGwzKQogICAgICAgICByID0ge30KIAotICAgIGRlZiB0ZXN0R2VuZXJhdGVNYXRjaGVzKHNlbGYpOgorICAgIGRlZiB0ZXN0X2dlbmVyYXRlX21hdGNoZXMoc2VsZik6CiAgICAgICAgIGxhID0gcHl0cmVlLkxlYWYoMSwgImEiKQogICAgICAgICBsYiA9IHB5dHJlZS5MZWFmKDEsICJiIikKICAgICAgICAgbGMgPSBweXRyZWUuTGVhZigxLCAiYyIpCkBAIC00MzksNyArNDQ5LDcgQEAKICAgICAgICAgZm9yIGMgaW4gImFiY2RlZiI6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJbInAiICsgY10sIHB5dHJlZS5MZWFmKDEsIGMpKQogCi0gICAgZGVmIHRlc3RIYXNLZXlFeGFtcGxlKHNlbGYpOgorICAgIGRlZiB0ZXN0X2hhc19rZXlfZXhhbXBsZShzZWxmKToKICAgICAgICAgcGF0dGVybiA9IHB5dHJlZS5Ob2RlUGF0dGVybigzMzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB5dHJlZS5MZWFmUGF0dGVybig3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHl0cmVlLldpbGRjYXJkUGF0dGVybihuYW1lPSJhcmdzIiksCkBAIC00NTEsOCArNDYxLDMgQEAKICAgICAgICAgciA9IHt9CiAgICAgICAgIHNlbGYuYXNzZXJ0XyhwYXR0ZXJuLm1hdGNoKG5vZGUsIHIpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJbImFyZ3MiXSwgW2wyXSkKLQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIGltcG9ydCBfX21haW5fXwotICAgIHN1cHBvcnQucnVuX2FsbF90ZXN0cyhfX21haW5fXykKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfdXRpbC5weSBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfdXRpbC5weQppbmRleCA5NWI1NjZhLi4xZGU3YTgzIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3V0aWwucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF91dGlsLnB5CkBAIC0xLDYgKzEsNCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMi41CiAiIiIgVGVzdCBzdWl0ZSBmb3IgdGhlIGNvZGUgaW4gZml4ZXMudXRpbCAiIiIKLSMgQXV0aG9yOiBDb2xsaW4gV2ludGVyCiAKICMgVGVzdGluZyBpbXBvcnRzCiBmcm9tIC4gaW1wb3J0IHN1cHBvcnQKQEAgLTU1Miw4ICs1NTAsMyBAQAogICAgICAgICBub2RlID0gcGFyc2UoJ2JhcigpJykKICAgICAgICAgZml4ZXJfdXRpbC50b3VjaF9pbXBvcnQoTm9uZSwgImNnaSIsIG5vZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG5vZGUpLCAnaW1wb3J0IGNnaVxuYmFyKClcblxuJykKLQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIGltcG9ydCBfX21haW5fXwotICAgIHN1cHBvcnQucnVuX2FsbF90ZXN0cyhfX21haW5fXykK