ZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVyX2Jhc2UucHkgYi9MaWIvbGliMnRvMy9maXhlcl9iYXNlLnB5CmluZGV4IDJiOGEzMWEuLjE2ODg3YWEgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVyX2Jhc2UucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXJfYmFzZS5weQpAQCAtMzMsNiArMzMsOCBAQAogICAgIGV4cGxpY2l0ID0gRmFsc2UgIyBJcyB0aGlzIGlnbm9yZWQgYnkgcmVmYWN0b3IucHkgLWYgYWxsPwogICAgIHJ1bl9vcmRlciA9IDUgICAjIEZpeGVycyB3aWxsIGJlIHNvcnRlZCBieSBydW4gb3JkZXIgYmVmb3JlIGV4ZWN1dGlvbgogICAgICAgICAgICAgICAgICAgICAjIExvd2VyIG51bWJlcnMgd2lsbCBiZSBydW4gZmlyc3QuCisgICAgX2FjY2VwdF90eXBlID0gTm9uZSAjIFtBZHZhbmNlZCBhbmQgbm90IHB1YmxpY10gVGhpcyB0ZWxscyBSZWZhY3RvcmluZ1Rvb2wKKyAgICAgICAgICAgICAgICAgICAgICAgICMgd2hpY2ggbm9kZSB0eXBlIHRvIGFjY2VwdCB3aGVuIHRoZXJlJ3Mgbm90IGEgcGF0dGVybi4KIAogICAgICMgU2hvcnRjdXQgZm9yIGFjY2VzcyB0byBQeXRob24gZ3JhbW1hciBzeW1ib2xzCiAgICAgc3ltcyA9IHB5Z3JhbS5weXRob25fc3ltYm9scwpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydC5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnQucHkKaW5kZXggMGE5OGNjMy4uZTJiZDhlNyAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydC5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0LnB5CkBAIC0xMiw3ICsxMiw3IEBACiAKICMgTG9jYWwgaW1wb3J0cwogZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQotZnJvbSBvcy5wYXRoIGltcG9ydCBkaXJuYW1lLCBqb2luLCBleGlzdHMsIHBhdGhzZXAKK2Zyb20gb3MucGF0aCBpbXBvcnQgZGlybmFtZSwgam9pbiwgZXhpc3RzLCBzZXAKIGZyb20gLi5maXhlcl91dGlsIGltcG9ydCBGcm9tSW1wb3J0LCBzeW1zLCB0b2tlbgogCiAKQEAgLTg0LDcgKzg0LDcgQEAKICAgICAgICAgIyBzbyBjYW4ndCBiZSBhIHJlbGF0aXZlIGltcG9ydC4KICAgICAgICAgaWYgbm90IGV4aXN0cyhqb2luKGRpcm5hbWUoYmFzZV9wYXRoKSwgJ19faW5pdF9fLnB5JykpOgogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgICAgIGZvciBleHQgaW4gWycucHknLCBwYXRoc2VwLCAnLnB5YycsICcuc28nLCAnLnNsJywgJy5weWQnXToKKyAgICAgICAgZm9yIGV4dCBpbiBbJy5weScsIHNlcCwgJy5weWMnLCAnLnNvJywgJy5zbCcsICcucHlkJ106CiAgICAgICAgICAgICBpZiBleGlzdHMoYmFzZV9wYXRoICsgZXh0KToKICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICByZXR1cm4gRmFsc2UKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnRzLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMucHkKaW5kZXggMDBmMGE3NS4uOWM4MTVlMSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMucHkKQEAgLTg0LDggKzg0LDYgQEAKIAogY2xhc3MgRml4SW1wb3J0cyhmaXhlcl9iYXNlLkJhc2VGaXgpOgogCi0gICAgb3JkZXIgPSAicHJlIiAjIFByZS1vcmRlciB0cmVlIHRyYXZlcnNhbAotCiAgICAgIyBUaGlzIGlzIG92ZXJyaWRkZW4gaW4gZml4X2ltcG9ydHMyLgogICAgIG1hcHBpbmcgPSBNQVBQSU5HCiAKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9sb25nLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2xvbmcucHkKaW5kZXggNzNhYmE0OC4uNmYzNjYxYyAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2xvbmcucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2xvbmcucHkKQEAgLTUsMTggKzUsMTUgQEAKICIiIgogCiAjIExvY2FsIGltcG9ydHMKLWZyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKLWZyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBOdW1iZXIsIGlzX3Byb2JhYmx5X2J1aWx0aW4KK2Zyb20gbGliMnRvMyBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSBsaWIydG8zLmZpeGVyX3V0aWwgaW1wb3J0IGlzX3Byb2JhYmx5X2J1aWx0aW4KIAogCiBjbGFzcyBGaXhMb25nKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CiAKICAgICBQQVRURVJOID0gIidsb25nJyIKIAotICAgIHN0YXRpY19pbnQgPSBOYW1lKHUiaW50IikKLQogICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CiAgICAgICAgIGlmIGlzX3Byb2JhYmx5X2J1aWx0aW4obm9kZSk6Ci0gICAgICAgICAgICBuZXcgPSBzZWxmLnN0YXRpY19pbnQuY2xvbmUoKQotICAgICAgICAgICAgbmV3LnByZWZpeCA9IG5vZGUucHJlZml4Ci0gICAgICAgICAgICByZXR1cm4gbmV3CisgICAgICAgICAgICBub2RlLnZhbHVlID0gdSJpbnQiCisgICAgICAgICAgICBub2RlLmNoYW5nZWQoKQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X25lLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X25lLnB5CmluZGV4IDIzZmU4NjkuLjcwMjU5ODAgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9uZS5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfbmUucHkKQEAgLTEyLDkgKzEyLDExIEBACiBjbGFzcyBGaXhOZShmaXhlcl9iYXNlLkJhc2VGaXgpOgogICAgICMgVGhpcyBpcyBzbyBzaW1wbGUgdGhhdCB3ZSBkb24ndCBuZWVkIHRoZSBwYXR0ZXJuIGNvbXBpbGVyLgogCisgICAgX2FjY2VwdF90eXBlID0gdG9rZW4uTk9URVFVQUwKKwogICAgIGRlZiBtYXRjaChzZWxmLCBub2RlKToKICAgICAgICAgIyBPdmVycmlkZQotICAgICAgICByZXR1cm4gbm9kZS50eXBlID09IHRva2VuLk5PVEVRVUFMIGFuZCBub2RlLnZhbHVlID09IHUiPD4iCisgICAgICAgIHJldHVybiBub2RlLnZhbHVlID09IHUiPD4iCiAKICAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgogICAgICAgICBuZXcgPSBweXRyZWUuTGVhZih0b2tlbi5OT1RFUVVBTCwgdSIhPSIsIHByZWZpeD1ub2RlLnByZWZpeCkKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9udW1saXRlcmFscy5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9udW1saXRlcmFscy5weQppbmRleCBhMDQ5YWVkLi5iMGMyM2Y4IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfbnVtbGl0ZXJhbHMucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X251bWxpdGVyYWxzLnB5CkBAIC0xMiwxMCArMTIsMTEgQEAKIGNsYXNzIEZpeE51bWxpdGVyYWxzKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CiAgICAgIyBUaGlzIGlzIHNvIHNpbXBsZSB0aGF0IHdlIGRvbid0IG5lZWQgdGhlIHBhdHRlcm4gY29tcGlsZXIuCiAKKyAgICBfYWNjZXB0X3R5cGUgPSB0b2tlbi5OVU1CRVIKKwogICAgIGRlZiBtYXRjaChzZWxmLCBub2RlKToKICAgICAgICAgIyBPdmVycmlkZQotICAgICAgICByZXR1cm4gKG5vZGUudHlwZSA9PSB0b2tlbi5OVU1CRVIgYW5kCi0gICAgICAgICAgICAgICAgKG5vZGUudmFsdWUuc3RhcnRzd2l0aCh1IjAiKSBvciBub2RlLnZhbHVlWy0xXSBpbiB1IkxsIikpCisgICAgICAgIHJldHVybiAobm9kZS52YWx1ZS5zdGFydHN3aXRoKHUiMCIpIG9yIG5vZGUudmFsdWVbLTFdIGluIHUiTGwiKQogCiAgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKICAgICAgICAgdmFsID0gbm9kZS52YWx1ZQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X29wZXJhdG9yLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X29wZXJhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OTE2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfb3BlcmF0b3IucHkKQEAgLTAsMCArMSw0MCBAQAorIiIiRml4ZXIgZm9yIG9wZXJhdG9yLntpc0NhbGxhYmxlLHNlcXVlbmNlSW5jbHVkZXN9CisKK29wZXJhdG9yLmlzQ2FsbGFibGUob2JqKSAtPiBoYXNhdHRyKG9iaiwgJ19fY2FsbF9fJykKK29wZXJhdG9yLnNlcXVlbmNlSW5jbHVkZXMob2JqKSAtPiBvcGVyYXRvci5jb250YWlucyhvYmopCisiIiIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgQ2FsbCwgTmFtZSwgU3RyaW5nCisKK2NsYXNzIEZpeE9wZXJhdG9yKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisKKyAgICBtZXRob2RzID0gIm1ldGhvZD0oJ2lzQ2FsbGFibGUnfCdzZXF1ZW5jZUluY2x1ZGVzJykiCisgICAgZnVuYyA9ICInKCcgZnVuYz1hbnkgJyknIgorICAgIFBBVFRFUk4gPSAiIiIKKyAgICAgICAgICAgICAgcG93ZXI8IG1vZHVsZT0nb3BlcmF0b3InCisgICAgICAgICAgICAgICAgdHJhaWxlcjwgJy4nIHttZXRob2RzfSA+IHRyYWlsZXI8IHtmdW5jfSA+ID4KKyAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICBwb3dlcjwge21ldGhvZHN9IHRyYWlsZXI8IHtmdW5jfSA+ID4KKyAgICAgICAgICAgICAgIiIiLmZvcm1hdChtZXRob2RzPW1ldGhvZHMsIGZ1bmM9ZnVuYykKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIG1ldGhvZCA9IHJlc3VsdHNbIm1ldGhvZCJdWzBdCisKKyAgICAgICAgaWYgbWV0aG9kLnZhbHVlID09IHUic2VxdWVuY2VJbmNsdWRlcyI6CisgICAgICAgICAgICBpZiAibW9kdWxlIiBub3QgaW4gcmVzdWx0czoKKyAgICAgICAgICAgICAgICAjIG9wZXJhdG9yIG1heSBub3QgYmUgaW4gc2NvcGUsIHNvIHdlIGNhbid0IG1ha2UgYSBjaGFuZ2UuCisgICAgICAgICAgICAgICAgc2VsZi53YXJuaW5nKG5vZGUsICJZb3Ugc2hvdWxkIHVzZSBvcGVyYXRvci5jb250YWlucyBoZXJlLiIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1ldGhvZC52YWx1ZSA9IHUiY29udGFpbnMiCisgICAgICAgICAgICAgICAgbWV0aG9kLmNoYW5nZWQoKQorICAgICAgICBlbGlmIG1ldGhvZC52YWx1ZSA9PSB1ImlzQ2FsbGFibGUiOgorICAgICAgICAgICAgaWYgIm1vZHVsZSIgbm90IGluIHJlc3VsdHM6CisgICAgICAgICAgICAgICAgc2VsZi53YXJuaW5nKG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3Ugc2hvdWxkIHVzZSBoYXNhdHRyKCVzLCAnX19jYWxsX18nKSBoZXJlLiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzWyJmdW5jIl0udmFsdWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZ1bmMgPSByZXN1bHRzWyJmdW5jIl0KKyAgICAgICAgICAgICAgICBhcmdzID0gW2Z1bmMuY2xvbmUoKSwgU3RyaW5nKHUiLCAiKSwgU3RyaW5nKHUiJ19fY2FsbF9fJyIpXQorICAgICAgICAgICAgICAgIHJldHVybiBDYWxsKE5hbWUodSJoYXNhdHRyIiksIGFyZ3MsIHByZWZpeD1ub2RlLnByZWZpeCkKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9wcmludC5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9wcmludC5weQppbmRleCBiZTI5ZGNlLi42Y2FkOGNlIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfcHJpbnQucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3ByaW50LnB5CkBAIC0yNiwyMCArMjYsMTUgQEAKICAgICAgICAgICAgICAgKQogCiAKLWNsYXNzIEZpeFByaW50KGZpeGVyX2Jhc2UuQ29uZGl0aW9uYWxGaXgpOgorY2xhc3MgRml4UHJpbnQoZml4ZXJfYmFzZS5CYXNlRml4KToKIAogICAgIFBBVFRFUk4gPSAiIiIKICAgICAgICAgICAgICAgc2ltcGxlX3N0bXQ8IGFueSogYmFyZT0ncHJpbnQnIGFueSogPiB8IHByaW50X3N0bXQKICAgICAgICAgICAgICAgIiIiCiAKLSAgICBza2lwX29uID0gJ19fZnV0dXJlX18ucHJpbnRfZnVuY3Rpb24nCi0KICAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgogICAgICAgICBhc3NlcnQgcmVzdWx0cwogCi0gICAgICAgIGlmIHNlbGYuc2hvdWxkX3NraXAobm9kZSk6Ci0gICAgICAgICAgICByZXR1cm4KLQogICAgICAgICBiYXJlX3ByaW50ID0gcmVzdWx0cy5nZXQoImJhcmUiKQogCiAgICAgICAgIGlmIGJhcmVfcHJpbnQ6CmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfdXJsbGliLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3VybGxpYi5weQppbmRleCBhODkyNjZlLi5kMTEyMjBjIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfdXJsbGliLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF91cmxsaWIucHkKQEAgLTEyLDEzICsxMiwxMyBAQAogTUFQUElORyA9IHsndXJsbGliJzogIFsKICAgICAgICAgICAgICAgICAoJ3VybGxpYi5yZXF1ZXN0JywKICAgICAgICAgICAgICAgICAgICAgWydVUkxPcGVuZXInLCAnRmFuY3lVUkxPcGVuZXInLCAndXJscmV0cmlldmUnLAotICAgICAgICAgICAgICAgICAgICAgJ191cmxvcGVuZXInLCAndXJsb3BlbicsICd1cmxjbGVhbnVwJ10pLAorICAgICAgICAgICAgICAgICAgICAgJ191cmxvcGVuZXInLCAndXJsb3BlbicsICd1cmxjbGVhbnVwJywKKyAgICAgICAgICAgICAgICAgICAgICdwYXRobmFtZTJ1cmwnLCAndXJsMnBhdGhuYW1lJ10pLAogICAgICAgICAgICAgICAgICgndXJsbGliLnBhcnNlJywKICAgICAgICAgICAgICAgICAgICAgWydxdW90ZScsICdxdW90ZV9wbHVzJywgJ3VucXVvdGUnLCAndW5xdW90ZV9wbHVzJywKLSAgICAgICAgICAgICAgICAgICAgICd1cmxlbmNvZGUnLCAncGF0aG5hbWUydXJsJywgJ3VybDJwYXRobmFtZScsICdzcGxpdGF0dHInLAotICAgICAgICAgICAgICAgICAgICAgJ3NwbGl0aG9zdCcsICdzcGxpdG5wb3J0JywgJ3NwbGl0cGFzc3dkJywgJ3NwbGl0cG9ydCcsCi0gICAgICAgICAgICAgICAgICAgICAnc3BsaXRxdWVyeScsICdzcGxpdHRhZycsICdzcGxpdHR5cGUnLCAnc3BsaXR1c2VyJywKLSAgICAgICAgICAgICAgICAgICAgICdzcGxpdHZhbHVlJywgXSksCisgICAgICAgICAgICAgICAgICAgICAndXJsZW5jb2RlJywgJ3NwbGl0YXR0cicsICdzcGxpdGhvc3QnLCAnc3BsaXRucG9ydCcsCisgICAgICAgICAgICAgICAgICAgICAnc3BsaXRwYXNzd2QnLCAnc3BsaXRwb3J0JywgJ3NwbGl0cXVlcnknLCAnc3BsaXR0YWcnLAorICAgICAgICAgICAgICAgICAgICAgJ3NwbGl0dHlwZScsICdzcGxpdHVzZXInLCAnc3BsaXR2YWx1ZScsIF0pLAogICAgICAgICAgICAgICAgICgndXJsbGliLmVycm9yJywKICAgICAgICAgICAgICAgICAgICAgWydDb250ZW50VG9vU2hvcnRFcnJvciddKV0sCiAgICAgICAgICAgICd1cmxsaWIyJyA6IFsKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL21haW4ucHkgYi9MaWIvbGliMnRvMy9tYWluLnB5CmluZGV4IGNmNGFkZjcuLjkyMzg4MDcgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL21haW4ucHkKKysrIGIvTGliL2xpYjJ0bzMvbWFpbi5weQpAQCAtNCwxOSArNCwzMSBAQAogCiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKK2ltcG9ydCBkaWZmbGliCiBpbXBvcnQgbG9nZ2luZwogaW1wb3J0IHNodXRpbAogaW1wb3J0IG9wdHBhcnNlCiAKIGZyb20gLiBpbXBvcnQgcmVmYWN0b3IKIAorCitkZWYgZGlmZl90ZXh0cyhhLCBiLCBmaWxlbmFtZSk6CisgICAgIiIiUmV0dXJuIGEgdW5pZmllZCBkaWZmIG9mIHR3byBzdHJpbmdzLiIiIgorICAgIGEgPSBhLnNwbGl0bGluZXMoKQorICAgIGIgPSBiLnNwbGl0bGluZXMoKQorICAgIHJldHVybiBkaWZmbGliLnVuaWZpZWRfZGlmZihhLCBiLCBmaWxlbmFtZSwgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIob3JpZ2luYWwpIiwgIihyZWZhY3RvcmVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmV0ZXJtPSIiKQorCisKIGNsYXNzIFN0ZG91dFJlZmFjdG9yaW5nVG9vbChyZWZhY3Rvci5NdWx0aXByb2Nlc3NSZWZhY3RvcmluZ1Rvb2wpOgogICAgICIiIgogICAgIFByaW50cyBvdXRwdXQgdG8gc3Rkb3V0LgogICAgICIiIgogCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpeGVycywgb3B0aW9ucywgZXhwbGljaXQsIG5vYmFja3Vwcyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpeGVycywgb3B0aW9ucywgZXhwbGljaXQsIG5vYmFja3Vwcywgc2hvd19kaWZmcyk6CiAgICAgICAgIHNlbGYubm9iYWNrdXBzID0gbm9iYWNrdXBzCisgICAgICAgIHNlbGYuc2hvd19kaWZmcyA9IHNob3dfZGlmZnMKICAgICAgICAgc3VwZXIoU3Rkb3V0UmVmYWN0b3JpbmdUb29sLCBzZWxmKS5fX2luaXRfXyhmaXhlcnMsIG9wdGlvbnMsIGV4cGxpY2l0KQogCiAgICAgZGVmIGxvZ19lcnJvcihzZWxmLCBtc2csICphcmdzLCAqKmt3YXJncyk6CkBAIC00Miw5ICs1NCwxOCBAQAogICAgICAgICBpZiBub3Qgc2VsZi5ub2JhY2t1cHM6CiAgICAgICAgICAgICBzaHV0aWwuY29weW1vZGUoYmFja3VwLCBmaWxlbmFtZSkKIAotICAgIGRlZiBwcmludF9vdXRwdXQoc2VsZiwgbGluZXMpOgotICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKLSAgICAgICAgICAgIHByaW50IGxpbmUKKyAgICBkZWYgcHJpbnRfb3V0cHV0KHNlbGYsIG9sZCwgbmV3LCBmaWxlbmFtZSwgZXF1YWwpOgorICAgICAgICBpZiBlcXVhbDoKKyAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoIk5vIGNoYW5nZXMgdG8gJXMiLCBmaWxlbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoIlJlZmFjdG9yZWQgJXMiLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIHNlbGYuc2hvd19kaWZmczoKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBkaWZmX3RleHRzKG9sZCwgbmV3LCBmaWxlbmFtZSk6CisgICAgICAgICAgICAgICAgICAgIHByaW50IGxpbmUKKworCitkZWYgd2Fybihtc2cpOgorICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJXQVJOSU5HOiAlcyIgJSAobXNnLCkKIAogCiBkZWYgbWFpbihmaXhlcl9wa2csIGFyZ3M9Tm9uZSk6CkBAIC03MCw5ICs5MSwxMiBAQAogICAgIHBhcnNlci5hZGRfb3B0aW9uKCItbCIsICItLWxpc3QtZml4ZXMiLCBhY3Rpb249InN0b3JlX3RydWUiLAogICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Ikxpc3QgYXZhaWxhYmxlIHRyYW5zZm9ybWF0aW9ucyAoZml4ZXMvZml4XyoucHkpIikKICAgICBwYXJzZXIuYWRkX29wdGlvbigiLXAiLCAiLS1wcmludC1mdW5jdGlvbiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0iTW9kaWZ5IHRoZSBncmFtbWFyIHNvIHRoYXQgcHJpbnQoKSBpcyBhIGZ1bmN0aW9uIikKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJERVBSRUNBVEVEIE1vZGlmeSB0aGUgZ3JhbW1hciBzbyB0aGF0IHByaW50KCkgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBmdW5jdGlvbiIpCiAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi12IiwgIi0tdmVyYm9zZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iTW9yZSB2ZXJib3NlIGxvZ2dpbmciKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLW5vLWRpZmZzIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJEb24ndCBzaG93IGRpZmZzIG9mIHRoZSByZWZhY3RvcmluZyIpCiAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi13IiwgIi0td3JpdGUiLCBhY3Rpb249InN0b3JlX3RydWUiLAogICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IldyaXRlIGJhY2sgbW9kaWZpZWQgZmlsZXMiKQogICAgIHBhcnNlci5hZGRfb3B0aW9uKCItbiIsICItLW5vYmFja3VwcyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlZmF1bHQ9RmFsc2UsCkBAIC04MSw2ICsxMDUsMTEgQEAKICAgICAjIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKICAgICByZWZhY3Rvcl9zdGRpbiA9IEZhbHNlCiAgICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3MpCisgICAgaWYgbm90IG9wdGlvbnMud3JpdGUgYW5kIG9wdGlvbnMubm9fZGlmZnM6CisgICAgICAgIHdhcm4oIm5vdCB3cml0aW5nIGZpbGVzIGFuZCBub3QgcHJpbnRpbmcgZGlmZnM7IHRoYXQncyBub3QgdmVyeSB1c2VmdWwiKQorICAgIGlmIG9wdGlvbnMucHJpbnRfZnVuY3Rpb246CisgICAgICAgIHdhcm4oIi1wIGlzIGRlcHJlY2F0ZWQ7ICIKKyAgICAgICAgICAgICAiZGV0ZWN0aW9uIG9mIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24gaXMgYXV0b21hdGljIikKICAgICBpZiBub3Qgb3B0aW9ucy53cml0ZSBhbmQgb3B0aW9ucy5ub2JhY2t1cHM6CiAgICAgICAgIHBhcnNlci5lcnJvcigiQ2FuJ3QgdXNlIC1uIHdpdGhvdXQgLXciKQogICAgIGlmIG9wdGlvbnMubGlzdF9maXhlczoKQEAgLTkwLDEzICsxMTksMTMgQEAKICAgICAgICAgaWYgbm90IGFyZ3M6CiAgICAgICAgICAgICByZXR1cm4gMAogICAgIGlmIG5vdCBhcmdzOgotICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJBdCBsZWFzdCBvbmUgZmlsZSBvciBkaXJlY3RvcnkgYXJndW1lbnQgcmVxdWlyZWQuIgotICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJVc2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UuIgorICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiQXQgbGVhc3Qgb25lIGZpbGUgb3IgZGlyZWN0b3J5IGFyZ3VtZW50IHJlcXVpcmVkLiIKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIlVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZS4iCiAgICAgICAgIHJldHVybiAyCiAgICAgaWYgIi0iIGluIGFyZ3M6CiAgICAgICAgIHJlZmFjdG9yX3N0ZGluID0gVHJ1ZQogICAgICAgICBpZiBvcHRpb25zLndyaXRlOgotICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiQ2FuJ3Qgd3JpdGUgdG8gc3RkaW4uIgorICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIkNhbid0IHdyaXRlIHRvIHN0ZGluLiIKICAgICAgICAgICAgIHJldHVybiAyCiAKICAgICAjIFNldCB1cCBsb2dnaW5nIGhhbmRsZXIKQEAgLTEwNCw3ICsxMzMsNiBAQAogICAgIGxvZ2dpbmcuYmFzaWNDb25maWcoZm9ybWF0PSclKG5hbWUpczogJShtZXNzYWdlKXMnLCBsZXZlbD1sZXZlbCkKIAogICAgICMgSW5pdGlhbGl6ZSB0aGUgcmVmYWN0b3JpbmcgdG9vbAotICAgIHJ0X29wdHMgPSB7InByaW50X2Z1bmN0aW9uIiA6IG9wdGlvbnMucHJpbnRfZnVuY3Rpb259CiAgICAgYXZhaWxfZml4ZXMgPSBzZXQocmVmYWN0b3IuZ2V0X2ZpeGVyc19mcm9tX3BhY2thZ2UoZml4ZXJfcGtnKSkKICAgICB1bndhbnRlZF9maXhlcyA9IHNldChmaXhlcl9wa2cgKyAiLmZpeF8iICsgZml4IGZvciBmaXggaW4gb3B0aW9ucy5ub2ZpeCkKICAgICBleHBsaWNpdCA9IHNldCgpCkBAIC0xMTksOCArMTQ3LDggQEAKICAgICBlbHNlOgogICAgICAgICByZXF1ZXN0ZWQgPSBhdmFpbF9maXhlcy51bmlvbihleHBsaWNpdCkKICAgICBmaXhlcl9uYW1lcyA9IHJlcXVlc3RlZC5kaWZmZXJlbmNlKHVud2FudGVkX2ZpeGVzKQotICAgIHJ0ID0gU3Rkb3V0UmVmYWN0b3JpbmdUb29sKHNvcnRlZChmaXhlcl9uYW1lcyksIHJ0X29wdHMsIHNvcnRlZChleHBsaWNpdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ub2JhY2t1cHMpCisgICAgcnQgPSBTdGRvdXRSZWZhY3RvcmluZ1Rvb2woc29ydGVkKGZpeGVyX25hbWVzKSwgTm9uZSwgc29ydGVkKGV4cGxpY2l0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm5vYmFja3Vwcywgbm90IG9wdGlvbnMubm9fZGlmZnMpCiAKICAgICAjIFJlZmFjdG9yIGFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgcGFzc2VkIGFzIGFyZ3VtZW50cwogICAgIGlmIG5vdCBydC5lcnJvcnM6CmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9wYXRjb21wLnB5IGIvTGliL2xpYjJ0bzMvcGF0Y29tcC5weQppbmRleCBlNWUxMTQ1Li41YzYyYTE1IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9wYXRjb21wLnB5CisrKyBiL0xpYi9saWIydG8zL3BhdGNvbXAucHkKQEAgLTE0LDcgKzE0LDcgQEAKIGltcG9ydCBvcwogCiAjIEZhaXJseSBsb2NhbCBpbXBvcnRzCi1mcm9tIC5wZ2VuMiBpbXBvcnQgZHJpdmVyLCBsaXRlcmFscywgdG9rZW4sIHRva2VuaXplLCBwYXJzZQorZnJvbSAucGdlbjIgaW1wb3J0IGRyaXZlciwgbGl0ZXJhbHMsIHRva2VuLCB0b2tlbml6ZSwgcGFyc2UsIGdyYW1tYXIKIAogIyBSZWFsbHkgbG9jYWwgaW1wb3J0cwogZnJvbSAuIGltcG9ydCBweXRyZWUKQEAgLTEzOCw3ICsxMzgsNyBAQAogICAgICAgICBub2RlID0gbm9kZXNbMF0KICAgICAgICAgaWYgbm9kZS50eXBlID09IHRva2VuLlNUUklORzoKICAgICAgICAgICAgIHZhbHVlID0gdW5pY29kZShsaXRlcmFscy5ldmFsU3RyaW5nKG5vZGUudmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIHB5dHJlZS5MZWFmUGF0dGVybihjb250ZW50PXZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIHB5dHJlZS5MZWFmUGF0dGVybihfdHlwZV9vZl9saXRlcmFsKHZhbHVlKSwgdmFsdWUpCiAgICAgICAgIGVsaWYgbm9kZS50eXBlID09IHRva2VuLk5BTUU6CiAgICAgICAgICAgICB2YWx1ZSA9IG5vZGUudmFsdWUKICAgICAgICAgICAgIGlmIHZhbHVlLmlzdXBwZXIoKToKQEAgLTE3OSw2ICsxNzksMTUgQEAKICAgICAgICAgICAgICAiVE9LRU4iOiBOb25lfQogCiAKK2RlZiBfdHlwZV9vZl9saXRlcmFsKHZhbHVlKToKKyAgICBpZiB2YWx1ZVswXS5pc2FscGhhKCk6CisgICAgICAgIHJldHVybiB0b2tlbi5OQU1FCisgICAgZWxpZiB2YWx1ZSBpbiBncmFtbWFyLm9wbWFwOgorICAgICAgICByZXR1cm4gZ3JhbW1hci5vcG1hcFt2YWx1ZV0KKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gTm9uZQorCisKIGRlZiBwYXR0ZXJuX2NvbnZlcnQoZ3JhbW1hciwgcmF3X25vZGVfaW5mbyk6CiAgICAgIiIiQ29udmVydHMgcmF3IG5vZGUgaW5mb3JtYXRpb24gdG8gYSBOb2RlIG9yIExlYWYgaW5zdGFuY2UuIiIiCiAgICAgdHlwZSwgdmFsdWUsIGNvbnRleHQsIGNoaWxkcmVuID0gcmF3X25vZGVfaW5mbwpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvcGdlbjIvZ3JhbW1hci5weSBiL0xpYi9saWIydG8zL3BnZW4yL2dyYW1tYXIucHkKaW5kZXggNzgxOGMyNC4uMDQ4MzQyNCAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvcGdlbjIvZ3JhbW1hci5weQorKysgYi9MaWIvbGliMnRvMy9wZ2VuMi9ncmFtbWFyLnB5CkBAIC05Nyw2ICs5NywxOSBAQAogICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUoZCkKIAorICAgIGRlZiBjb3B5KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29weSB0aGUgZ3JhbW1hci4KKyAgICAgICAgIiIiCisgICAgICAgIG5ldyA9IHNlbGYuX19jbGFzc19fKCkKKyAgICAgICAgZm9yIGRpY3RfYXR0ciBpbiAoInN5bWJvbDJudW1iZXIiLCAibnVtYmVyMnN5bWJvbCIsICJkZmFzIiwgImtleXdvcmRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInRva2VucyIsICJzeW1ib2wybGFiZWwiKToKKyAgICAgICAgICAgIHNldGF0dHIobmV3LCBkaWN0X2F0dHIsIGdldGF0dHIoc2VsZiwgZGljdF9hdHRyKS5jb3B5KCkpCisgICAgICAgIG5ldy5sYWJlbHMgPSBzZWxmLmxhYmVsc1s6XQorICAgICAgICBuZXcuc3RhdGVzID0gc2VsZi5zdGF0ZXNbOl0KKyAgICAgICAgbmV3LnN0YXJ0ID0gc2VsZi5zdGFydAorICAgICAgICByZXR1cm4gbmV3CisKICAgICBkZWYgcmVwb3J0KHNlbGYpOgogICAgICAgICAiIiJEdW1wIHRoZSBncmFtbWFyIHRhYmxlcyB0byBzdGFuZGFyZCBvdXRwdXQsIGZvciBkZWJ1Z2dpbmcuIiIiCiAgICAgICAgIGZyb20gcHByaW50IGltcG9ydCBwcHJpbnQKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3B5Z3JhbS5weSBiL0xpYi9saWIydG8zL3B5Z3JhbS5weQppbmRleCBkNjM5NzhkLi42Y2RiM2E0IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9weWdyYW0ucHkKKysrIGIvTGliL2xpYjJ0bzMvcHlncmFtLnB5CkBAIC0yOCw0ICsyOCw4IEBACiAKIAogcHl0aG9uX2dyYW1tYXIgPSBkcml2ZXIubG9hZF9ncmFtbWFyKF9HUkFNTUFSX0ZJTEUpCisKIHB5dGhvbl9zeW1ib2xzID0gU3ltYm9scyhweXRob25fZ3JhbW1hcikKKworcHl0aG9uX2dyYW1tYXJfbm9fcHJpbnRfc3RhdGVtZW50ID0gcHl0aG9uX2dyYW1tYXIuY29weSgpCitkZWwgcHl0aG9uX2dyYW1tYXJfbm9fcHJpbnRfc3RhdGVtZW50LmtleXdvcmRzWyJwcmludCJdCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9yZWZhY3Rvci5weSBiL0xpYi9saWIydG8zL3JlZmFjdG9yLnB5CmluZGV4IGQxY2RiNWQuLjk3YTU0MGQgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL3JlZmFjdG9yLnB5CisrKyBiL0xpYi9saWIydG8zL3JlZmFjdG9yLnB5CkBAIC0xNCwxNCArMTQsMTUgQEAKICMgUHl0aG9uIGltcG9ydHMKIGltcG9ydCBvcwogaW1wb3J0IHN5cwotaW1wb3J0IGRpZmZsaWIKIGltcG9ydCBsb2dnaW5nCiBpbXBvcnQgb3BlcmF0b3IKLWZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CitpbXBvcnQgY29sbGVjdGlvbnMKK2ltcG9ydCBTdHJpbmdJTworaW1wb3J0IHdhcm5pbmdzCiBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4KIAogIyBMb2NhbCBpbXBvcnRzCi1mcm9tIC5wZ2VuMiBpbXBvcnQgZHJpdmVyLCB0b2tlbml6ZQorZnJvbSAucGdlbjIgaW1wb3J0IGRyaXZlciwgdG9rZW5pemUsIHRva2VuCiBmcm9tIC4gaW1wb3J0IHB5dHJlZSwgcHlncmFtCiAKIApAQCAtMzcsNyArMzgsMTIgQEAKICAgICAgICAgICAgIGZpeF9uYW1lcy5hcHBlbmQobmFtZVs6LTNdKQogICAgIHJldHVybiBmaXhfbmFtZXMKIAotZGVmIGdldF9oZWFkX3R5cGVzKHBhdCk6CisKK2NsYXNzIF9FdmVyeU5vZGUoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKKworZGVmIF9nZXRfaGVhZF90eXBlcyhwYXQpOgogICAgICIiIiBBY2NlcHRzIGEgcHl0cmVlIFBhdHRlcm4gTm9kZSBhbmQgcmV0dXJucyBhIHNldAogICAgICAgICBvZiB0aGUgcGF0dGVybiB0eXBlcyB3aGljaCB3aWxsIG1hdGNoIGZpcnN0LiAiIiIKIApAQCAtNDUsMzQgKzUxLDUwIEBACiAgICAgICAgICMgTm9kZVBhdHRlcnMgbXVzdCBlaXRoZXIgaGF2ZSBubyB0eXBlIGFuZCBubyBjb250ZW50CiAgICAgICAgICMgICBvciBhIHR5cGUgYW5kIGNvbnRlbnQgLS0gc28gdGhleSBkb24ndCBnZXQgYW55IGZhcnRoZXIKICAgICAgICAgIyBBbHdheXMgcmV0dXJuIGxlYWZzCisgICAgICAgIGlmIHBhdC50eXBlIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBfRXZlcnlOb2RlCiAgICAgICAgIHJldHVybiBzZXQoW3BhdC50eXBlXSkKIAogICAgIGlmIGlzaW5zdGFuY2UocGF0LCBweXRyZWUuTmVnYXRlZFBhdHRlcm4pOgogICAgICAgICBpZiBwYXQuY29udGVudDoKLSAgICAgICAgICAgIHJldHVybiBnZXRfaGVhZF90eXBlcyhwYXQuY29udGVudCkKLSAgICAgICAgcmV0dXJuIHNldChbTm9uZV0pICMgTmVnYXRlZCBQYXR0ZXJucyBkb24ndCBoYXZlIGEgdHlwZQorICAgICAgICAgICAgcmV0dXJuIF9nZXRfaGVhZF90eXBlcyhwYXQuY29udGVudCkKKyAgICAgICAgcmFpc2UgX0V2ZXJ5Tm9kZSAjIE5lZ2F0ZWQgUGF0dGVybnMgZG9uJ3QgaGF2ZSBhIHR5cGUKIAogICAgIGlmIGlzaW5zdGFuY2UocGF0LCBweXRyZWUuV2lsZGNhcmRQYXR0ZXJuKToKICAgICAgICAgIyBSZWN1cnNlIG9uIGVhY2ggbm9kZSBpbiBjb250ZW50CiAgICAgICAgIHIgPSBzZXQoKQogICAgICAgICBmb3IgcCBpbiBwYXQuY29udGVudDoKICAgICAgICAgICAgIGZvciB4IGluIHA6Ci0gICAgICAgICAgICAgICAgci51cGRhdGUoZ2V0X2hlYWRfdHlwZXMoeCkpCisgICAgICAgICAgICAgICAgci51cGRhdGUoX2dldF9oZWFkX3R5cGVzKHgpKQogICAgICAgICByZXR1cm4gcgogCiAgICAgcmFpc2UgRXhjZXB0aW9uKCJPaCBubyEgSSBkb24ndCB1bmRlcnN0YW5kIHBhdHRlcm4gJXMiICUocGF0KSkKIAotZGVmIGdldF9oZWFkbm9kZV9kaWN0KGZpeGVyX2xpc3QpOgorCitkZWYgX2dldF9oZWFkbm9kZV9kaWN0KGZpeGVyX2xpc3QpOgogICAgICIiIiBBY2NlcHRzIGEgbGlzdCBvZiBmaXhlcnMgYW5kIHJldHVybnMgYSBkaWN0aW9uYXJ5CiAgICAgICAgIG9mIGhlYWQgbm9kZSB0eXBlIC0tPiBmaXhlciBsaXN0LiAgIiIiCi0gICAgaGVhZF9ub2RlcyA9IGRlZmF1bHRkaWN0KGxpc3QpCisgICAgaGVhZF9ub2RlcyA9IGNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0KGxpc3QpCisgICAgZXZlcnkgPSBbXQogICAgIGZvciBmaXhlciBpbiBmaXhlcl9saXN0OgotICAgICAgICBpZiBub3QgZml4ZXIucGF0dGVybjoKLSAgICAgICAgICAgIGhlYWRfbm9kZXNbTm9uZV0uYXBwZW5kKGZpeGVyKQotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgZm9yIHQgaW4gZ2V0X2hlYWRfdHlwZXMoZml4ZXIucGF0dGVybik6Ci0gICAgICAgICAgICBoZWFkX25vZGVzW3RdLmFwcGVuZChmaXhlcikKLSAgICByZXR1cm4gaGVhZF9ub2RlcworICAgICAgICBpZiBmaXhlci5wYXR0ZXJuOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGhlYWRzID0gX2dldF9oZWFkX3R5cGVzKGZpeGVyLnBhdHRlcm4pCisgICAgICAgICAgICBleGNlcHQgX0V2ZXJ5Tm9kZToKKyAgICAgICAgICAgICAgICBldmVyeS5hcHBlbmQoZml4ZXIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZvciBub2RlX3R5cGUgaW4gaGVhZHM6CisgICAgICAgICAgICAgICAgICAgIGhlYWRfbm9kZXNbbm9kZV90eXBlXS5hcHBlbmQoZml4ZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBmaXhlci5fYWNjZXB0X3R5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaGVhZF9ub2Rlc1tmaXhlci5fYWNjZXB0X3R5cGVdLmFwcGVuZChmaXhlcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXZlcnkuYXBwZW5kKGZpeGVyKQorICAgIGZvciBub2RlX3R5cGUgaW4gY2hhaW4ocHlncmFtLnB5dGhvbl9ncmFtbWFyLnN5bWJvbDJudW1iZXIuaXRlcnZhbHVlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHlncmFtLnB5dGhvbl9ncmFtbWFyLnRva2Vucyk6CisgICAgICAgIGhlYWRfbm9kZXNbbm9kZV90eXBlXS5leHRlbmQoZXZlcnkpCisgICAgcmV0dXJuIGRpY3QoaGVhZF9ub2RlcykKKwogCiBkZWYgZ2V0X2ZpeGVyc19mcm9tX3BhY2thZ2UocGtnX25hbWUpOgogICAgICIiIgpAQCAtMTAxLDEzICsxMjMsNTYgQEAKICAgICBfdG9fc3lzdGVtX25ld2xpbmVzID0gX2lkZW50aXR5CiAKIAorZGVmIF9kZXRlY3RfZnV0dXJlX3ByaW50KHNvdXJjZSk6CisgICAgaGF2ZV9kb2NzdHJpbmcgPSBGYWxzZQorICAgIGdlbiA9IHRva2VuaXplLmdlbmVyYXRlX3Rva2VucyhTdHJpbmdJTy5TdHJpbmdJTyhzb3VyY2UpLnJlYWRsaW5lKQorICAgIGRlZiBhZHZhbmNlKCk6CisgICAgICAgIHRvayA9IG5leHQoZ2VuKQorICAgICAgICByZXR1cm4gdG9rWzBdLCB0b2tbMV0KKyAgICBpZ25vcmUgPSBmcm96ZW5zZXQoKHRva2VuLk5FV0xJTkUsIHRva2VuaXplLk5MLCB0b2tlbi5DT01NRU5UKSkKKyAgICB0cnk6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cCwgdmFsdWUgPSBhZHZhbmNlKCkKKyAgICAgICAgICAgIGlmIHRwIGluIGlnbm9yZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiB0cCA9PSB0b2tlbi5TVFJJTkc6CisgICAgICAgICAgICAgICAgaWYgaGF2ZV9kb2NzdHJpbmc6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaGF2ZV9kb2NzdHJpbmcgPSBUcnVlCisgICAgICAgICAgICBlbGlmIHRwID09IHRva2VuLk5BTUU6CisgICAgICAgICAgICAgICAgaWYgdmFsdWUgPT0gdSJmcm9tIjoKKyAgICAgICAgICAgICAgICAgICAgdHAsIHZhbHVlID0gYWR2YW5jZSgpCisgICAgICAgICAgICAgICAgICAgIGlmIHRwICE9IHRva2VuLk5BTUUgYW5kIHZhbHVlICE9IHUiX19mdXR1cmVfXyI6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICB0cCwgdmFsdWUgPSBhZHZhbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgdHAgIT0gdG9rZW4uTkFNRSBhbmQgdmFsdWUgIT0gdSJpbXBvcnQiOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgdHAsIHZhbHVlID0gYWR2YW5jZSgpCisgICAgICAgICAgICAgICAgICAgIGlmIHRwID09IHRva2VuLk9QIGFuZCB2YWx1ZSA9PSB1IigiOgorICAgICAgICAgICAgICAgICAgICAgICAgdHAsIHZhbHVlID0gYWR2YW5jZSgpCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIHRwID09IHRva2VuLk5BTUU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZSA9PSB1InByaW50X2Z1bmN0aW9uIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgdHAsIHZhbHVlID0gYWR2YW5jZSgpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0cCAhPSB0b2tlbi5PUCBhbmQgdmFsdWUgIT0gdSIsIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgdHAsIHZhbHVlID0gYWR2YW5jZSgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgcGFzcworICAgIHJldHVybiBGYWxzZQorCisKIGNsYXNzIEZpeGVyRXJyb3IoRXhjZXB0aW9uKToKICAgICAiIiJBIGZpeGVyIGNvdWxkIG5vdCBiZSBsb2FkZWQuIiIiCiAKIAogY2xhc3MgUmVmYWN0b3JpbmdUb29sKG9iamVjdCk6CiAKLSAgICBfZGVmYXVsdF9vcHRpb25zID0geyJwcmludF9mdW5jdGlvbiI6IEZhbHNlfQorICAgIF9kZWZhdWx0X29wdGlvbnMgPSB7fQogCiAgICAgQ0xBU1NfUFJFRklYID0gIkZpeCIgIyBUaGUgcHJlZml4IGZvciBmaXhlciBjbGFzc2VzCiAgICAgRklMRV9QUkVGSVggPSAiZml4XyIgIyBUaGUgcHJlZml4IGZvciBtb2R1bGVzIHdpdGggYSBmaXhlciB3aXRoaW4KQEAgLTEyNCwyMCArMTg5LDIxIEBACiAgICAgICAgIHNlbGYuZXhwbGljaXQgPSBleHBsaWNpdCBvciBbXQogICAgICAgICBzZWxmLm9wdGlvbnMgPSBzZWxmLl9kZWZhdWx0X29wdGlvbnMuY29weSgpCiAgICAgICAgIGlmIG9wdGlvbnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiAicHJpbnRfZnVuY3Rpb24iIGluIG9wdGlvbnM6CisgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidGhlICdwcmludF9mdW5jdGlvbicgb3B0aW9uIGlzIGRlcHJlY2F0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgICAgICAgICAgc2VsZi5vcHRpb25zLnVwZGF0ZShvcHRpb25zKQogICAgICAgICBzZWxmLmVycm9ycyA9IFtdCiAgICAgICAgIHNlbGYubG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIlJlZmFjdG9yaW5nVG9vbCIpCiAgICAgICAgIHNlbGYuZml4ZXJfbG9nID0gW10KICAgICAgICAgc2VsZi53cm90ZSA9IEZhbHNlCi0gICAgICAgIGlmIHNlbGYub3B0aW9uc1sicHJpbnRfZnVuY3Rpb24iXToKLSAgICAgICAgICAgIGRlbCBweWdyYW0ucHl0aG9uX2dyYW1tYXIua2V5d29yZHNbInByaW50Il0KICAgICAgICAgc2VsZi5kcml2ZXIgPSBkcml2ZXIuRHJpdmVyKHB5Z3JhbS5weXRob25fZ3JhbW1hciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQ9cHl0cmVlLmNvbnZlcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXI9c2VsZi5sb2dnZXIpCiAgICAgICAgIHNlbGYucHJlX29yZGVyLCBzZWxmLnBvc3Rfb3JkZXIgPSBzZWxmLmdldF9maXhlcnMoKQogCi0gICAgICAgIHNlbGYucHJlX29yZGVyX2hlYWRzID0gZ2V0X2hlYWRub2RlX2RpY3Qoc2VsZi5wcmVfb3JkZXIpCi0gICAgICAgIHNlbGYucG9zdF9vcmRlcl9oZWFkcyA9IGdldF9oZWFkbm9kZV9kaWN0KHNlbGYucG9zdF9vcmRlcikKKyAgICAgICAgc2VsZi5wcmVfb3JkZXJfaGVhZHMgPSBfZ2V0X2hlYWRub2RlX2RpY3Qoc2VsZi5wcmVfb3JkZXIpCisgICAgICAgIHNlbGYucG9zdF9vcmRlcl9oZWFkcyA9IF9nZXRfaGVhZG5vZGVfZGljdChzZWxmLnBvc3Rfb3JkZXIpCiAKICAgICAgICAgc2VsZi5maWxlcyA9IFtdICAjIExpc3Qgb2YgZmlsZXMgdGhhdCB3ZXJlIG9yIHNob3VsZCBiZSBtb2RpZmllZAogCkBAIC0xOTYsOCArMjYyLDkgQEAKICAgICAgICAgICAgIG1zZyA9IG1zZyAlIGFyZ3MKICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcobXNnKQogCi0gICAgZGVmIHByaW50X291dHB1dChzZWxmLCBsaW5lcyk6Ci0gICAgICAgICIiIkNhbGxlZCB3aXRoIGxpbmVzIG9mIG91dHB1dCB0byBnaXZlIHRvIHRoZSB1c2VyLiIiIgorICAgIGRlZiBwcmludF9vdXRwdXQoc2VsZiwgb2xkX3RleHQsIG5ld190ZXh0LCBmaWxlbmFtZSwgZXF1YWwpOgorICAgICAgICAiIiJDYWxsZWQgd2l0aCB0aGUgb2xkIHZlcnNpb24sIG5ldyB2ZXJzaW9uLCBhbmQgZmlsZW5hbWUgb2YgYQorICAgICAgICByZWZhY3RvcmVkIGZpbGUuIiIiCiAgICAgICAgIHBhc3MKIAogICAgIGRlZiByZWZhY3RvcihzZWxmLCBpdGVtcywgd3JpdGU9RmFsc2UsIGRvY3Rlc3RzX29ubHk9RmFsc2UpOgpAQCAtMjIwLDcgKzI4Nyw4IEBACiAgICAgICAgICAgICBkaXJuYW1lcy5zb3J0KCkKICAgICAgICAgICAgIGZpbGVuYW1lcy5zb3J0KCkKICAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVuYW1lczoKLSAgICAgICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCIuIikgYW5kIG5hbWUuZW5kc3dpdGgoInB5Iik6CisgICAgICAgICAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgiLiIpIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLnNwbGl0ZXh0KG5hbWUpWzFdLmVuZHN3aXRoKCJweSIpOgogICAgICAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihkaXJwYXRoLCBuYW1lKQogICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZmFjdG9yX2ZpbGUoZnVsbG5hbWUsIHdyaXRlLCBkb2N0ZXN0c19vbmx5KQogICAgICAgICAgICAgIyBNb2RpZnkgZGlybmFtZXMgaW4tcGxhY2UgdG8gcmVtb3ZlIHN1YmRpcnMgd2l0aCBsZWFkaW5nIGRvdHMKQEAgLTI3NiwxMiArMzQ0LDE2IEBACiAgICAgICAgICAgICBBbiBBU1QgY29ycmVzcG9uZGluZyB0byB0aGUgcmVmYWN0b3JlZCBpbnB1dCBzdHJlYW07IE5vbmUgaWYKICAgICAgICAgICAgIHRoZXJlIHdlcmUgZXJyb3JzIGR1cmluZyB0aGUgcGFyc2UuCiAgICAgICAgICIiIgorICAgICAgICBpZiBfZGV0ZWN0X2Z1dHVyZV9wcmludChkYXRhKToKKyAgICAgICAgICAgIHNlbGYuZHJpdmVyLmdyYW1tYXIgPSBweWdyYW0ucHl0aG9uX2dyYW1tYXJfbm9fcHJpbnRfc3RhdGVtZW50CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHRyZWUgPSBzZWxmLmRyaXZlci5wYXJzZV9zdHJpbmcoZGF0YSkKICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZXJyOgogICAgICAgICAgICAgc2VsZi5sb2dfZXJyb3IoIkNhbid0IHBhcnNlICVzOiAlczogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZXJyLl9fY2xhc3NfXy5fX25hbWVfXywgZXJyKQogICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmRyaXZlci5ncmFtbWFyID0gcHlncmFtLnB5dGhvbl9ncmFtbWFyCiAgICAgICAgIHNlbGYubG9nX2RlYnVnKCJSZWZhY3RvcmluZyAlcyIsIG5hbWUpCiAgICAgICAgIHNlbGYucmVmYWN0b3JfdHJlZSh0cmVlLCBuYW1lKQogICAgICAgICByZXR1cm4gdHJlZQpAQCAtMjk4LDcgKzM3MCw3IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICB0cmVlID0gc2VsZi5yZWZhY3Rvcl9zdHJpbmcoaW5wdXQsICI8c3RkaW4+IikKICAgICAgICAgICAgIGlmIHRyZWUgYW5kIHRyZWUud2FzX2NoYW5nZWQ6Ci0gICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzZWRfZmlsZShzdHIodHJlZSksICI8c3RkaW4+IiwgaW5wdXQpCisgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzZWRfZmlsZSh1bmljb2RlKHRyZWUpLCAiPHN0ZGluPiIsIGlucHV0KQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLmxvZ19kZWJ1ZygiTm8gY2hhbmdlcyBpbiBzdGRpbiIpCiAKQEAgLTMzOCwxMiArNDEwLDExIEBACiAgICAgICAgIGlmIG5vdCBmaXhlcnM6CiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgZm9yIG5vZGUgaW4gdHJhdmVyc2FsOgotICAgICAgICAgICAgZm9yIGZpeGVyIGluIGZpeGVyc1tub2RlLnR5cGVdICsgZml4ZXJzW05vbmVdOgorICAgICAgICAgICAgZm9yIGZpeGVyIGluIGZpeGVyc1tub2RlLnR5cGVdOgogICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBmaXhlci5tYXRjaChub2RlKQogICAgICAgICAgICAgICAgIGlmIHJlc3VsdHM6CiAgICAgICAgICAgICAgICAgICAgIG5ldyA9IGZpeGVyLnRyYW5zZm9ybShub2RlLCByZXN1bHRzKQotICAgICAgICAgICAgICAgICAgICBpZiBuZXcgaXMgbm90IE5vbmUgYW5kIChuZXcgIT0gbm9kZSBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIobmV3KSAhPSBzdHIobm9kZSkpOgorICAgICAgICAgICAgICAgICAgICBpZiBuZXcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnJlcGxhY2UobmV3KQogICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ldwogCkBAIC0zNTcsMTAgKzQyOCwxMSBAQAogICAgICAgICAgICAgb2xkX3RleHQgPSBzZWxmLl9yZWFkX3B5dGhvbl9zb3VyY2UoZmlsZW5hbWUpWzBdCiAgICAgICAgICAgICBpZiBvbGRfdGV4dCBpcyBOb25lOgogICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBvbGRfdGV4dCA9PSBuZXdfdGV4dDoKKyAgICAgICAgZXF1YWwgPSBvbGRfdGV4dCA9PSBuZXdfdGV4dAorICAgICAgICBzZWxmLnByaW50X291dHB1dChvbGRfdGV4dCwgbmV3X3RleHQsIGZpbGVuYW1lLCBlcXVhbCkKKyAgICAgICAgaWYgZXF1YWw6CiAgICAgICAgICAgICBzZWxmLmxvZ19kZWJ1ZygiTm8gY2hhbmdlcyB0byAlcyIsIGZpbGVuYW1lKQogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYucHJpbnRfb3V0cHV0KGRpZmZfdGV4dHMob2xkX3RleHQsIG5ld190ZXh0LCBmaWxlbmFtZSkpCiAgICAgICAgIGlmIHdyaXRlOgogICAgICAgICAgICAgc2VsZi53cml0ZV9maWxlKG5ld190ZXh0LCBmaWxlbmFtZSwgb2xkX3RleHQsIGVuY29kaW5nKQogICAgICAgICBlbHNlOgpAQCAtNDUxLDcgKzUyMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbGluZW5vLCBlcnIuX19jbGFzc19fLl9fbmFtZV9fLCBlcnIpCiAgICAgICAgICAgICByZXR1cm4gYmxvY2sKICAgICAgICAgaWYgc2VsZi5yZWZhY3Rvcl90cmVlKHRyZWUsIGZpbGVuYW1lKToKLSAgICAgICAgICAgIG5ldyA9IHN0cih0cmVlKS5zcGxpdGxpbmVzKFRydWUpCisgICAgICAgICAgICBuZXcgPSB1bmljb2RlKHRyZWUpLnNwbGl0bGluZXMoVHJ1ZSkKICAgICAgICAgICAgICMgVW5kbyB0aGUgYWRqdXN0bWVudCBvZiB0aGUgbGluZSBudW1iZXJzIGluIHdyYXBfdG9rcygpIGJlbG93LgogICAgICAgICAgICAgY2xpcHBlZCwgbmV3ID0gbmV3WzpsaW5lbm8tMV0sIG5ld1tsaW5lbm8tMTpdCiAgICAgICAgICAgICBhc3NlcnQgY2xpcHBlZCA9PSBbdSJcbiJdICogKGxpbmVuby0xKSwgY2xpcHBlZApAQCAtNTgyLDEyICs2NTQsMyBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIHN1cGVyKE11bHRpcHJvY2Vzc1JlZmFjdG9yaW5nVG9vbCwgc2VsZikucmVmYWN0b3JfZmlsZSgKICAgICAgICAgICAgICAgICAqYXJncywgKiprd2FyZ3MpCi0KLQotZGVmIGRpZmZfdGV4dHMoYSwgYiwgZmlsZW5hbWUpOgotICAgICIiIlJldHVybiBhIHVuaWZpZWQgZGlmZiBvZiB0d28gc3RyaW5ncy4iIiIKLSAgICBhID0gYS5zcGxpdGxpbmVzKCkKLSAgICBiID0gYi5zcGxpdGxpbmVzKCkKLSAgICByZXR1cm4gZGlmZmxpYi51bmlmaWVkX2RpZmYoYSwgYiwgZmlsZW5hbWUsIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKG9yaWdpbmFsKSIsICIocmVmYWN0b3JlZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5ldGVybT0iIikKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL2RhdGEvZGlmZmVyZW50X2VuY29kaW5nLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9kaWZmZXJlbnRfZW5jb2RpbmcucHkKaW5kZXggODg4ZjUxZi4uOWYzMmJkMCAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9kaWZmZXJlbnRfZW5jb2RpbmcucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9kaWZmZXJlbnRfZW5jb2RpbmcucHkKQEAgLTEsMyArMSw2IEBACiAjIS91c3IvYmluL2VudiBweXRob24KLSMgLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KLXByaW50IHUn3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX2+Pn6+/z9/v/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tjZ2tvc3d4nCisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorcHJpbnQgdSfDn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvw7DDscOyw7PDtMO1w7bDuMO5w7rDu8O8w73DvsO/w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/DkMORw5LDk8OUw5XDlsOYw5nDmsObw5zDncOeJworCitkZWYgZih4KToKKyAgICBwcmludCAnJXNcdC0+ICDOsSglMmkpOiVzICDOsiglcyknCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weSBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfZml4ZXJzLnB5CmluZGV4IDE4OWI0ZDIuLmExOWRlOTUgMTAwNzU1Ci0tLSBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfZml4ZXJzLnB5CisrKyBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfZml4ZXJzLnB5CkBAIC0xOCw4ICsxOCw2IEBACiAgICAgZGVmIHNldFVwKHNlbGYsIGZpeF9saXN0PU5vbmUsIGZpeGVyX3BrZz0ibGliMnRvMyIsIG9wdGlvbnM9Tm9uZSk6CiAgICAgICAgIGlmIGZpeF9saXN0IGlzIE5vbmU6CiAgICAgICAgICAgICBmaXhfbGlzdCA9IFtzZWxmLmZpeGVyXQotICAgICAgICBpZiBvcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICBvcHRpb25zID0geyJwcmludF9mdW5jdGlvbiIgOiBGYWxzZX0KICAgICAgICAgc2VsZi5yZWZhY3RvciA9IHN1cHBvcnQuZ2V0X3JlZmFjdG9yZXIoZml4ZXJfcGtnLCBmaXhfbGlzdCwgb3B0aW9ucykKICAgICAgICAgc2VsZi5maXhlcl9sb2cgPSBbXQogICAgICAgICBzZWxmLmZpbGVuYW1lID0gdSI8c3RyaW5nPiIKQEAgLTU4LDggKzU2LDcgQEAKICAgICBkZWYgYXNzZXJ0X3J1bnNfYWZ0ZXIoc2VsZiwgKm5hbWVzKToKICAgICAgICAgZml4ZXMgPSBbc2VsZi5maXhlcl0KICAgICAgICAgZml4ZXMuZXh0ZW5kKG5hbWVzKQotICAgICAgICBvcHRpb25zID0geyJwcmludF9mdW5jdGlvbiIgOiBGYWxzZX0KLSAgICAgICAgciA9IHN1cHBvcnQuZ2V0X3JlZmFjdG9yZXIoImxpYjJ0bzMiLCBmaXhlcywgb3B0aW9ucykKKyAgICAgICAgciA9IHN1cHBvcnQuZ2V0X3JlZmFjdG9yZXIoImxpYjJ0bzMiLCBmaXhlcykKICAgICAgICAgKHByZSwgcG9zdCkgPSByLmdldF9maXhlcnMoKQogICAgICAgICBuID0gImZpeF8iICsgc2VsZi5maXhlcgogICAgICAgICBpZiBwb3N0IGFuZCBwb3N0Wy0xXS5fX2NsYXNzX18uX19tb2R1bGVfXy5lbmRzd2l0aChuKToKQEAgLTM3OSwxOCArMzc2LDE1IEBACiAgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCiAKICAgICBkZWYgdGVzdF9pZGVtcG90ZW5jeV9wcmludF9hc19mdW5jdGlvbihzZWxmKToKLSAgICAgICAgcHJpbnRfc3RtdCA9IHB5Z3JhbS5weXRob25fZ3JhbW1hci5rZXl3b3Jkcy5wb3AoInByaW50IikKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcyA9ICIiInByaW50KDEsIDErMSwgMSsxKzEpIiIiCi0gICAgICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorICAgICAgICBzZWxmLnJlZmFjdG9yLmRyaXZlci5ncmFtbWFyID0gcHlncmFtLnB5dGhvbl9ncmFtbWFyX25vX3ByaW50X3N0YXRlbWVudAorICAgICAgICBzID0gIiIicHJpbnQoMSwgMSsxLCAxKzErMSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKIAotICAgICAgICAgICAgcyA9ICIiInByaW50KCkiIiIKLSAgICAgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisgICAgICAgIHMgPSAiIiJwcmludCgpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCiAKLSAgICAgICAgICAgIHMgPSAiIiJwcmludCgnJykiIiIKLSAgICAgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBweWdyYW0ucHl0aG9uX2dyYW1tYXIua2V5d29yZHNbInByaW50Il0gPSBwcmludF9zdG10CisgICAgICAgIHMgPSAiIiJwcmludCgnJykiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKIAogICAgIGRlZiB0ZXN0XzEoc2VsZik6CiAgICAgICAgIGIgPSAiIiJwcmludCAxLCAxKzEsIDErMSsxIiIiCkBAIC00NjIsMzEgKzQ1NiwxNSBAQAogICAgICAgICBhID0gIiIicHJpbnQoZmlsZT1zeXMuc3RkZXJyKSIiIgogICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCiAKLSAgICAjIFdpdGggZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgogICAgIGRlZiB0ZXN0X3dpdGhfZnV0dXJlX3ByaW50X2Z1bmN0aW9uKHNlbGYpOgotICAgICAgICAjIFhYWDogVGhlc2UgdGVzdHMgd29uJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgdW50aWwgdGhlIHBhcnNlcgotICAgICAgICAjICAgICAgaXMgZml4ZWQgc28gaXQgd29uJ3QgY3Jhc2ggd2hlbiBpdCBzZWVzIHByaW50KHg9eSkuCi0gICAgICAgICMgICAgICBXaGVuICMyNDEyIGlzIGZpeGVkLCB0aGUgdHJ5L2V4Y2VwdCBibG9jayBjYW4gYmUgdGFrZW4KLSAgICAgICAgIyAgICAgIG91dCBhbmQgdGhlIHRlc3RzIGNhbiBiZSBydW4gbGlrZSBub3JtYWwuCi0gICAgICAgICMgTXZMOiBkaXNhYmxlIGVudGlyZWx5IGZvciBub3csIHNvIHRoYXQgaXQgZG9lc24ndCBwcmludCB0byBzdGRvdXQKLSAgICAgICAgcmV0dXJuCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHMgPSAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvblxuIlwKLSAgICAgICAgICAgICAgICAicHJpbnQoJ0hhaSEnLCBlbmQ9JyAnKSIKLSAgICAgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisgICAgICAgIHMgPSAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvblxuIiBcCisgICAgICAgICAgICAicHJpbnQoJ0hhaSEnLCBlbmQ9JyAnKSIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKIAotICAgICAgICAgICAgYiA9ICJwcmludCAnSGVsbG8sIHdvcmxkISciCi0gICAgICAgICAgICBhID0gInByaW50KCdIZWxsbywgd29ybGQhJykiCi0gICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisgICAgICAgIGIgPSAicHJpbnQgJ0hlbGxvLCB3b3JsZCEnIgorICAgICAgICBhID0gInByaW50KCdIZWxsbywgd29ybGQhJykiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKIAotICAgICAgICAgICAgcyA9ICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0ICpcbiJcCi0gICAgICAgICAgICAgICAgInByaW50KCdIYWkhJywgZW5kPScgJykiCi0gICAgICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoVHJ1ZSwgIiMyNDIxIGhhcyBiZWVuIGZpeGVkIC0tIHByaW50aW5nIHRlc3RzICJcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWVkIHRvIGJlIHVwZGF0ZWQhIikKIAogY2xhc3MgVGVzdF9leGVjKEZpeGVyVGVzdENhc2UpOgogICAgIGZpeGVyID0gImV4ZWMiCkBAIC0xNzA1LDYgKzE2ODMsMTEgQEAKICAgICAgICAgZm9yIGtleSBpbiAoJ2RiaGFzaCcsICdkdW1iZGJtJywgJ2RibScsICdnZGJtJyk6CiAgICAgICAgICAgICBzZWxmLm1vZHVsZXNba2V5XSA9IG1hcHBpbmcxW2tleV0KIAorICAgIGRlZiB0ZXN0X2FmdGVyX2xvY2FsX2ltcG9ydHNfcmVmYWN0b3Jpbmcoc2VsZik6CisgICAgICAgIGZvciBmaXggaW4gKCJpbXBvcnRzIiwgImltcG9ydHMyIik6CisgICAgICAgICAgICBzZWxmLmZpeGVyID0gZml4CisgICAgICAgICAgICBzZWxmLmFzc2VydF9ydW5zX2FmdGVyKCJpbXBvcnQiKQorCiAKIGNsYXNzIFRlc3RfdXJsbGliKEZpeGVyVGVzdENhc2UpOgogICAgIGZpeGVyID0gInVybGxpYiIKQEAgLTM1MDQsNiArMzQ4Nyw3IEBACiAgICAgICAgIHMgPSAiZnJvbSBpdGVydG9vbHMgaW1wb3J0IGZvbyIKICAgICAgICAgc2VsZi51bmNoYW5nZWQocykKIAorCiBjbGFzcyBUZXN0X2ltcG9ydChGaXhlclRlc3RDYXNlKToKICAgICBmaXhlciA9ICJpbXBvcnQiCiAKQEAgLTM1MzgsOCArMzUyMiw3IEBACiAKICAgICAgICAgc2VsZi5hbHdheXNfZXhpc3RzID0gRmFsc2UKICAgICAgICAgc2VsZi5wcmVzZW50X2ZpbGVzID0gc2V0KFsnX19pbml0X18ucHknXSkKLSAgICAgICAgZXhwZWN0ZWRfZXh0ZW5zaW9ucyA9ICgnLnB5Jywgb3MucGF0aC5wYXRoc2VwLCAnLnB5YycsICcuc28nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuc2wnLCAnLnB5ZCcpCisgICAgICAgIGV4cGVjdGVkX2V4dGVuc2lvbnMgPSAoJy5weScsIG9zLnBhdGguc2VwLCAnLnB5YycsICcuc28nLCAnLnNsJywgJy5weWQnKQogICAgICAgICBuYW1lc190b190ZXN0ID0gKHAoIi9zcGFtL2VnZ3MucHkiKSwgIm5pLnB5IiwgcCgiLi4vLi4vc2hydWJiZXJ5LnB5IikpCiAKICAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXNfdG9fdGVzdDoKQEAgLTM1NjksNiArMzU1MiwxMyBAQAogICAgICAgICBzZWxmLnByZXNlbnRfZmlsZXMgPSBzZXQoWyJfX2luaXRfXy5weSIsICJiYXIucHkiXSkKICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQogCisgICAgZGVmIHRlc3RfaW1wb3J0X2Zyb21fcGFja2FnZShzZWxmKToKKyAgICAgICAgYiA9ICJpbXBvcnQgYmFyIgorICAgICAgICBhID0gImZyb20gLiBpbXBvcnQgYmFyIgorICAgICAgICBzZWxmLmFsd2F5c19leGlzdHMgPSBGYWxzZQorICAgICAgICBzZWxmLnByZXNlbnRfZmlsZXMgPSBzZXQoWyJfX2luaXRfXy5weSIsICJiYXIvIl0pCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKwogICAgIGRlZiB0ZXN0X2NvbW1lbnRzX2FuZF9pbmRlbnQoc2VsZik6CiAgICAgICAgIGIgPSAiaW1wb3J0IGJhciAjIEZvbyIKICAgICAgICAgYSA9ICJmcm9tIC4gaW1wb3J0IGJhciAjIEZvbyIKQEAgLTQwOTUsMyArNDA4NSwyNiBAQAogICAgICAgICBiID0gIiIib3MuZ2V0Y3dkdSAoICApIiIiCiAgICAgICAgIGEgPSAiIiJvcy5nZXRjd2QgKCAgKSIiIgogICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKworY2xhc3MgVGVzdF9vcGVyYXRvcihGaXhlclRlc3RDYXNlKToKKworICAgIGZpeGVyID0gIm9wZXJhdG9yIgorCisgICAgZGVmIHRlc3Rfb3BlcmF0b3JfaXNDYWxsYWJsZShzZWxmKToKKyAgICAgICAgYiA9ICJvcGVyYXRvci5pc0NhbGxhYmxlKHgpIgorICAgICAgICBhID0gImhhc2F0dHIoeCwgJ19fY2FsbF9fJykiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X29wZXJhdG9yX3NlcXVlbmNlSW5jbHVkZXMoc2VsZik6CisgICAgICAgIGIgPSAib3BlcmF0b3Iuc2VxdWVuY2VJbmNsdWRlcyh4LCB5KSIKKyAgICAgICAgYSA9ICJvcGVyYXRvci5jb250YWlucyh4LCB5KSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfYmFyZV9pc0NhbGxhYmxlKHNlbGYpOgorICAgICAgICBzID0gImlzQ2FsbGFibGUoeCkiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJZb3Ugc2hvdWxkIHVzZSBoYXNhdHRyKHgsICdfX2NhbGxfXycpIGhlcmUuIikKKworICAgIGRlZiB0ZXN0X2JhcmVfc2VxdWVuY2VJbmNsdWRlcyhzZWxmKToKKyAgICAgICAgcyA9ICJzZXF1ZW5jZUluY2x1ZGVzKHgsIHkpIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiWW91IHNob3VsZCB1c2Ugb3BlcmF0b3IuY29udGFpbnMgaGVyZS4iKQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9yZWZhY3Rvci5weSBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcmVmYWN0b3IucHkKaW5kZXggZjU0NWM3Yy4uYThkMjA5YSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9yZWZhY3Rvci5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5CkBAIC03LDkgKzcsMTIgQEAKIGltcG9ydCBvcGVyYXRvcgogaW1wb3J0IFN0cmluZ0lPCiBpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBzaHV0aWwKIGltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdhcm5pbmdzCiAKIGZyb20gbGliMnRvMyBpbXBvcnQgcmVmYWN0b3IsIHB5Z3JhbSwgZml4ZXJfYmFzZQorZnJvbSBsaWIydG8zLnBnZW4yIGltcG9ydCB0b2tlbgogCiBmcm9tIC4gaW1wb3J0IHN1cHBvcnQKIApAQCAtNDIsMTQgKzQ1LDExIEBACiAgICAgICAgIHJldHVybiByZWZhY3Rvci5SZWZhY3RvcmluZ1Rvb2woZml4ZXJzLCBvcHRpb25zLCBleHBsaWNpdCkKIAogICAgIGRlZiB0ZXN0X3ByaW50X2Z1bmN0aW9uX29wdGlvbihzZWxmKToKLSAgICAgICAgZ3JhbSA9IHB5Z3JhbS5weXRob25fZ3JhbW1hcgotICAgICAgICBzYXZlID0gZ3JhbS5rZXl3b3Jkc1sicHJpbnQiXQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBydCA9IHNlbGYucnQoeyJwcmludF9mdW5jdGlvbiIgOiBUcnVlfSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBvcGVyYXRvci5pdGVtZ2V0dGVyKCJwcmludCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbS5rZXl3b3JkcykKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGdyYW0ua2V5d29yZHNbInByaW50Il0gPSBzYXZlCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAgICAgICByZWZhY3Rvci5SZWZhY3RvcmluZ1Rvb2woX0RFRkFVTFRfRklYRVJTLCB7InByaW50X2Z1bmN0aW9uIiA6IFRydWV9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMSkKKyAgICAgICAgbXNnLCA9IHcKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5jYXRlZ29yeSBpcyBEZXByZWNhdGlvbldhcm5pbmcpCiAKICAgICBkZWYgdGVzdF9maXhlcl9sb2FkaW5nX2hlbHBlcnMoc2VsZik6CiAgICAgICAgIGNvbnRlbnRzID0gWyJleHBsaWNpdCIsICJmaXJzdCIsICJsYXN0IiwgInBhcnJvdCIsICJwcmVvcmRlciJdCkBAIC02MSwxOSArNjEsNjMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdWxsX25hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgIFsibXlmaXhlcy5maXhfIiArIG5hbWUgZm9yIG5hbWUgaW4gY29udGVudHNdKQogCisgICAgZGVmIHRlc3RfZGV0ZWN0X2Z1dHVyZV9wcmludChzZWxmKToKKyAgICAgICAgcnVuID0gcmVmYWN0b3IuX2RldGVjdF9mdXR1cmVfcHJpbnQKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShydW4oIiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocnVuKCJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocnVuKCJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnMiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShydW4oImZyb20gX19mdXR1cmVfXyBpbXBvcnQgZ2VuZXJhdG9ycywgZmVhdHVyZSIpKQorICAgICAgICBpbnB1dCA9ICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnMsIHByaW50X2Z1bmN0aW9uIgorICAgICAgICBzZWxmLmFzc2VydFRydWUocnVuKGlucHV0KSkKKyAgICAgICAgaW5wdXQgPSJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uLCBnZW5lcmF0b3JzIgorICAgICAgICBzZWxmLmFzc2VydFRydWUocnVuKGlucHV0KSkKKyAgICAgICAgaW5wdXQgPSAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCAocHJpbnRfZnVuY3Rpb24sKSIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bihpbnB1dCkpCisgICAgICAgIGlucHV0ID0gImZyb20gX19mdXR1cmVfXyBpbXBvcnQgKGdlbmVyYXRvcnMsIHByaW50X2Z1bmN0aW9uKSIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bihpbnB1dCkpCisgICAgICAgIGlucHV0ID0gImZyb20gX19mdXR1cmVfXyBpbXBvcnQgKGdlbmVyYXRvcnMsIG5lc3RlZF9zY29wZXMpIgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJ1bihpbnB1dCkpCisgICAgICAgIGlucHV0ID0gIiIiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBnZW5lcmF0b3JzCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydW4oaW5wdXQpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJ1bigiZnJvbSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJ1bigiZnJvbSA0IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocnVuKCJmcm9tIHgiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShydW4oImZyb20geCA1IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocnVuKCJmcm9tIHggaW0iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShydW4oImZyb20geCBpbXBvcnQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShydW4oImZyb20geCBpbXBvcnQgNCIpKQorICAgICAgICBpbnB1dCA9ICInZG9jc3RyaW5nJ1xuZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbiIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bihpbnB1dCkpCisgICAgICAgIGlucHV0ID0gIidkb2NzdHJpbmcnXG4nc29tbmcnXG5mcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uIgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJ1bihpbnB1dCkpCisgICAgICAgIGlucHV0ID0gIiMgY29tbWVudFxuZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbiIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bihpbnB1dCkpCisgICAgICAgIGlucHV0ID0gIiMgY29tbWVudFxuJ2RvYydcbmZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24iCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydW4oaW5wdXQpKQorICAgICAgICBpbnB1dCA9ICJjbGFzcyB4OiBwYXNzXG5mcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uIgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJ1bihpbnB1dCkpCisKICAgICBkZWYgdGVzdF9nZXRfaGVhZG5vZGVfZGljdChzZWxmKToKICAgICAgICAgY2xhc3MgTm9uZUZpeChmaXhlcl9iYXNlLkJhc2VGaXgpOgotICAgICAgICAgICAgUEFUVEVSTiA9IE5vbmUKKyAgICAgICAgICAgIHBhc3MKIAogICAgICAgICBjbGFzcyBGaWxlSW5wdXRGaXgoZml4ZXJfYmFzZS5CYXNlRml4KToKICAgICAgICAgICAgIFBBVFRFUk4gPSAiZmlsZV9pbnB1dDwgYW55ICogPiIKIAorICAgICAgICBjbGFzcyBTaW1wbGVGaXgoZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICAgICAgICAgIFBBVFRFUk4gPSAiJ25hbWUnIgorCiAgICAgICAgIG5vX2hlYWQgPSBOb25lRml4KHt9LCBbXSkKICAgICAgICAgd2l0aF9oZWFkID0gRmlsZUlucHV0Rml4KHt9LCBbXSkKLSAgICAgICAgZCA9IHJlZmFjdG9yLmdldF9oZWFkbm9kZV9kaWN0KFtub19oZWFkLCB3aXRoX2hlYWRdKQotICAgICAgICBleHBlY3RlZCA9IHtOb25lOiBbbm9faGVhZF0sCi0gICAgICAgICAgICAgICAgICAgIHB5Z3JhbS5weXRob25fc3ltYm9scy5maWxlX2lucHV0IDogW3dpdGhfaGVhZF19Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZXhwZWN0ZWQpCisgICAgICAgIHNpbXBsZSA9IFNpbXBsZUZpeCh7fSwgW10pCisgICAgICAgIGQgPSByZWZhY3Rvci5fZ2V0X2hlYWRub2RlX2RpY3QoW25vX2hlYWQsIHdpdGhfaGVhZCwgc2ltcGxlXSkKKyAgICAgICAgdG9wX2ZpeGVzID0gZC5wb3AocHlncmFtLnB5dGhvbl9zeW1ib2xzLmZpbGVfaW5wdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodG9wX2ZpeGVzLCBbd2l0aF9oZWFkLCBub19oZWFkXSkKKyAgICAgICAgbmFtZV9maXhlcyA9IGQucG9wKHRva2VuLk5BTUUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZV9maXhlcywgW3NpbXBsZSwgbm9faGVhZF0pCisgICAgICAgIGZvciBmaXhlcyBpbiBkLml0ZXJ2YWx1ZXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZml4ZXMsIFtub19oZWFkXSkKIAogICAgIGRlZiB0ZXN0X2ZpeGVyX2xvYWRpbmcoc2VsZik6CiAgICAgICAgIGZyb20gbXlmaXhlcy5maXhfZmlyc3QgaW1wb3J0IEZpeEZpcnN0CkBAIC0xMDYsMTAgKzE1MCwxMCBAQAogCiAgICAgICAgIGNsYXNzIE15UlQocmVmYWN0b3IuUmVmYWN0b3JpbmdUb29sKToKIAotICAgICAgICAgICAgZGVmIHByaW50X291dHB1dChzZWxmLCBsaW5lcyk6Ci0gICAgICAgICAgICAgICAgZGlmZl9saW5lcy5leHRlbmQobGluZXMpCisgICAgICAgICAgICBkZWYgcHJpbnRfb3V0cHV0KHNlbGYsIG9sZF90ZXh0LCBuZXdfdGV4dCwgZmlsZW5hbWUsIGVxdWFsKToKKyAgICAgICAgICAgICAgICByZXN1bHRzLmV4dGVuZChbb2xkX3RleHQsIG5ld190ZXh0LCBmaWxlbmFtZSwgZXF1YWxdKQogCi0gICAgICAgIGRpZmZfbGluZXMgPSBbXQorICAgICAgICByZXN1bHRzID0gW10KICAgICAgICAgcnQgPSBNeVJUKF9ERUZBVUxUX0ZJWEVSUykKICAgICAgICAgc2F2ZSA9IHN5cy5zdGRpbgogICAgICAgICBzeXMuc3RkaW4gPSBTdHJpbmdJTy5TdHJpbmdJTygiZGVmIHBhcnJvdCgpOiBwYXNzXG5cbiIpCkBAIC0xMTcsMTIgKzE2MSwxMCBAQAogICAgICAgICAgICAgcnQucmVmYWN0b3Jfc3RkaW4oKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc3lzLnN0ZGluID0gc2F2ZQotICAgICAgICBleHBlY3RlZCA9ICIiIi0tLSA8c3RkaW4+IChvcmlnaW5hbCkKLSsrKyA8c3RkaW4+IChyZWZhY3RvcmVkKQotQEAgLTEsMiArMSwyIEBACi0tZGVmIHBhcnJvdCgpOiBwYXNzCi0rZGVmIGNoZWVzZSgpOiBwYXNzIiIiLnNwbGl0bGluZXMoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpZmZfbGluZXNbOi0xXSwgZXhwZWN0ZWQpCisgICAgICAgIGV4cGVjdGVkID0gWyJkZWYgcGFycm90KCk6IHBhc3NcblxuIiwKKyAgICAgICAgICAgICAgICAgICAgImRlZiBjaGVlc2UoKTogcGFzc1xuXG4iLAorICAgICAgICAgICAgICAgICAgICAiPHN0ZGluPiIsIEZhbHNlXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdHMsIGV4cGVjdGVkKQogCiAgICAgZGVmIGNoZWNrX2ZpbGVfcmVmYWN0b3Jpbmcoc2VsZiwgdGVzdF9maWxlLCBmaXhlcnM9XzJUTzNfRklYRVJTKToKICAgICAgICAgZGVmIHJlYWRfZmlsZSgpOgpAQCAtMTQ1LDYgKzE4NywzNyBAQAogICAgICAgICB0ZXN0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oRklYRVJfRElSLCAicGFycm90X2V4YW1wbGUucHkiKQogICAgICAgICBzZWxmLmNoZWNrX2ZpbGVfcmVmYWN0b3JpbmcodGVzdF9maWxlLCBfREVGQVVMVF9GSVhFUlMpCiAKKyAgICBkZWYgdGVzdF9yZWZhY3Rvcl9kaXIoc2VsZik6CisgICAgICAgIGRlZiBjaGVjayhzdHJ1Y3R1cmUsIGV4cGVjdGVkKToKKyAgICAgICAgICAgIGRlZiBtb2NrX3JlZmFjdG9yX2ZpbGUoc2VsZiwgZiwgKmFyZ3MpOgorICAgICAgICAgICAgICAgIGdvdC5hcHBlbmQoZikKKyAgICAgICAgICAgIHNhdmVfZnVuYyA9IHJlZmFjdG9yLlJlZmFjdG9yaW5nVG9vbC5yZWZhY3Rvcl9maWxlCisgICAgICAgICAgICByZWZhY3Rvci5SZWZhY3RvcmluZ1Rvb2wucmVmYWN0b3JfZmlsZSA9IG1vY2tfcmVmYWN0b3JfZmlsZQorICAgICAgICAgICAgcnQgPSBzZWxmLnJ0KCkKKyAgICAgICAgICAgIGdvdCA9IFtdCisgICAgICAgICAgICBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHByZWZpeD0iMnRvMy10ZXN0X3JlZmFjdG9yIikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oZGlyLCAiYV9kaXIiKSkKKyAgICAgICAgICAgICAgICBmb3IgZm4gaW4gc3RydWN0dXJlOgorICAgICAgICAgICAgICAgICAgICBvcGVuKG9zLnBhdGguam9pbihkaXIsIGZuKSwgIndiIikuY2xvc2UoKQorICAgICAgICAgICAgICAgIHJ0LnJlZmFjdG9yX2RpcihkaXIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHJlZmFjdG9yLlJlZmFjdG9yaW5nVG9vbC5yZWZhY3Rvcl9maWxlID0gc2F2ZV9mdW5jCisgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShkaXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29zLnBhdGguam9pbihkaXIsIHBhdGgpIGZvciBwYXRoIGluIGV4cGVjdGVkXSkKKyAgICAgICAgY2hlY2soW10sIFtdKQorICAgICAgICB0cmVlID0gWyJub3RoaW5nIiwKKyAgICAgICAgICAgICAgICAiaGkucHkiLAorICAgICAgICAgICAgICAgICIuZHVtYiIsCisgICAgICAgICAgICAgICAgIi5hZnRlci5weSIsCisgICAgICAgICAgICAgICAgInNhcHB5Il0KKyAgICAgICAgZXhwZWN0ZWQgPSBbImhpLnB5Il0KKyAgICAgICAgY2hlY2sodHJlZSwgZXhwZWN0ZWQpCisgICAgICAgIHRyZWUgPSBbImhpLnB5IiwKKyAgICAgICAgICAgICAgICAiYV9kaXIvc3R1ZmYucHkiXQorICAgICAgICBjaGVjayh0cmVlLCB0cmVlKQorCiAgICAgZGVmIHRlc3RfZmlsZV9lbmNvZGluZyhzZWxmKToKICAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4oVEVTVF9EQVRBX0RJUiwgImRpZmZlcmVudF9lbmNvZGluZy5weSIpCiAgICAgICAgIHNlbGYuY2hlY2tfZmlsZV9yZWZhY3RvcmluZyhmbikKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfdXRpbC5weSBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfdXRpbC5weQppbmRleCBlZjMyNTZkLi42MTg2YjRmIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3V0aWwucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF91dGlsLnB5CkBAIC0xLDQgKzEsNCBAQAotIiIiIFRlc3Qgc3VpdGUgZm9yIHRoZSBjb2RlIGluIGZpeGVzLnV0aWwgIiIiCisiIiIgVGVzdCBzdWl0ZSBmb3IgdGhlIGNvZGUgaW4gZml4ZXJfdXRpbCAiIiIKIAogIyBUZXN0aW5nIGltcG9ydHMKIGZyb20gLiBpbXBvcnQgc3VwcG9ydApAQCAtNywxMCArNywxMCBAQAogaW1wb3J0IG9zLnBhdGgKIAogIyBMb2NhbCBpbXBvcnRzCi1mcm9tIC4uIGltcG9ydCBweXRyZWUKLWZyb20gLi4gaW1wb3J0IGZpeGVyX3V0aWwKLWZyb20gLi5maXhlcl91dGlsIGltcG9ydCBBdHRyLCBOYW1lCi0KK2Zyb20gbGliMnRvMy5weXRyZWUgaW1wb3J0IE5vZGUsIExlYWYKK2Zyb20gbGliMnRvMyBpbXBvcnQgZml4ZXJfdXRpbAorZnJvbSBsaWIydG8zLmZpeGVyX3V0aWwgaW1wb3J0IEF0dHIsIE5hbWUsIENhbGwsIENvbW1hCitmcm9tIGxpYjJ0bzMucGdlbjIgaW1wb3J0IHRva2VuCiAKIGRlZiBwYXJzZShjb2RlLCBzdHJpcF9sZXZlbHM9MCk6CiAgICAgIyBUaGUgdG9wbW9zdCBub2RlIGlzIGZpbGVfaW5wdXQsIHdoaWNoIHdlIGRvbid0IGNhcmUgYWJvdXQuCkBAIC0yNCw3ICsyNCw3IEBACiBjbGFzcyBNYWNyb1Rlc3RDYXNlKHN1cHBvcnQuVGVzdENhc2UpOgogICAgIGRlZiBhc3NlcnRTdHIoc2VsZiwgbm9kZSwgc3RyaW5nKToKICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCAodHVwbGUsIGxpc3QpKToKLSAgICAgICAgICAgIG5vZGUgPSBweXRyZWUuTm9kZShmaXhlcl91dGlsLnN5bXMuc2ltcGxlX3N0bXQsIG5vZGUpCisgICAgICAgICAgICBub2RlID0gTm9kZShmaXhlcl91dGlsLnN5bXMuc2ltcGxlX3N0bXQsIG5vZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG5vZGUpLCBzdHJpbmcpCiAKIApAQCAtNzgsNiArNzgsMzEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRTdHIoTmFtZSgiYSIsIHByZWZpeD0iYiIpLCAiYmEiKQogCiAKK2NsYXNzIFRlc3RfQ2FsbChNYWNyb1Rlc3RDYXNlKToKKyAgICBkZWYgX0NhbGwoc2VsZiwgbmFtZSwgYXJncz1Ob25lLCBwcmVmaXg9Tm9uZSk6CisgICAgICAgICIiIkhlbHAgdGhlIG5leHQgdGVzdCIiIgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJncywgbGlzdCk6CisgICAgICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgICAgICAgICAgY2hpbGRyZW4uYXBwZW5kKGFyZykKKyAgICAgICAgICAgICAgICBjaGlsZHJlbi5hcHBlbmQoQ29tbWEoKSkKKyAgICAgICAgICAgIGNoaWxkcmVuLnBvcCgpCisgICAgICAgIHJldHVybiBDYWxsKE5hbWUobmFtZSksIGNoaWxkcmVuLCBwcmVmaXgpCisKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAga2lkcyA9IFtOb25lLAorICAgICAgICAgICAgICAgIFtMZWFmKHRva2VuLk5VTUJFUiwgMSksIExlYWYodG9rZW4uTlVNQkVSLCAyKSwKKyAgICAgICAgICAgICAgICAgTGVhZih0b2tlbi5OVU1CRVIsIDMpXSwKKyAgICAgICAgICAgICAgICBbTGVhZih0b2tlbi5OVU1CRVIsIDEpLCBMZWFmKHRva2VuLk5VTUJFUiwgMyksCisgICAgICAgICAgICAgICAgIExlYWYodG9rZW4uTlVNQkVSLCAyKSwgTGVhZih0b2tlbi5OVU1CRVIsIDQpXSwKKyAgICAgICAgICAgICAgICBbTGVhZih0b2tlbi5TVFJJTkcsICJiIiksIExlYWYodG9rZW4uU1RSSU5HLCAiaiIsIHByZWZpeD0iICIpXQorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgc2VsZi5hc3NlcnRTdHIoc2VsZi5fQ2FsbCgiQSIpLCAiQSgpIikKKyAgICAgICAgc2VsZi5hc3NlcnRTdHIoc2VsZi5fQ2FsbCgiYiIsIGtpZHNbMV0pLCAiYigxLDIsMykiKQorICAgICAgICBzZWxmLmFzc2VydFN0cihzZWxmLl9DYWxsKCJhLmIoKS5jIiwga2lkc1syXSksICJhLmIoKS5jKDEsMywyLDQpIikKKyAgICAgICAgc2VsZi5hc3NlcnRTdHIoc2VsZi5fQ2FsbCgiZCIsIGtpZHNbM10sIHByZWZpeD0iICIpLCAiIGQoYiwgaikiKQorCisKIGNsYXNzIFRlc3RfZG9lc190cmVlX2ltcG9ydChzdXBwb3J0LlRlc3RDYXNlKToKICAgICBkZWYgX2ZpbmRfYmluZF9yZWMoc2VsZiwgbmFtZSwgbm9kZSk6CiAgICAgICAgICMgU2VhcmNoIGEgdHJlZSBmb3IgYSBiaW5kaW5nIC0tIHVzZWQgdG8gZmluZCB0aGUgc3RhcnRpbmcK