ZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvZGlzdC5weSBiL0xpYi9kaXN0dXRpbHMvZGlzdC5weQppbmRleCA5MzMyNWI5Li5mNGFlY2I0IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2Rpc3QucHkKKysrIGIvTGliL2Rpc3R1dGlscy9kaXN0LnB5CkBAIC02LDggKzYsNyBAQAogCiBfX3JldmlzaW9uX18gPSAiJElkJCIKIAotaW1wb3J0IHN5cywgb3MsIHN0cmluZywgcmUKLWZyb20gdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCBzeXMsIG9zLCByZQogCiB0cnk6CiAgICAgaW1wb3J0IHdhcm5pbmdzCkBAIC0yNTEsNyArMjUwLDcgQEAKIAogICAgICAgICAgICAgIyBOb3cgd29yayBvbiB0aGUgcmVzdCBvZiB0aGUgYXR0cmlidXRlcy4gIEFueSBhdHRyaWJ1dGUgdGhhdCdzCiAgICAgICAgICAgICAjIG5vdCBhbHJlYWR5IGRlZmluZWQgaXMgaW52YWxpZCEKLSAgICAgICAgICAgIGZvciAoa2V5LHZhbCkgaW4gYXR0cnMuaXRlbXMoKToKKyAgICAgICAgICAgIGZvciAoa2V5LCB2YWwpIGluIGF0dHJzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLm1ldGFkYXRhLCAic2V0XyIgKyBrZXkpOgogICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKHNlbGYubWV0YWRhdGEsICJzZXRfIiArIGtleSkodmFsKQogICAgICAgICAgICAgICAgIGVsaWYgaGFzYXR0cihzZWxmLm1ldGFkYXRhLCBrZXkpOgpAQCAtMjg2LDIyICsyODUsMjQgQEAKICAgICAgICAgICAgIGNvbW1hbmRzLnNvcnQoKQogCiAgICAgICAgIGlmIGhlYWRlciBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHByaW50IGluZGVudCArIGhlYWRlcgorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShpbmRlbnQgKyBoZWFkZXIpCiAgICAgICAgICAgICBpbmRlbnQgPSBpbmRlbnQgKyAiICAiCiAKICAgICAgICAgaWYgbm90IGNvbW1hbmRzOgotICAgICAgICAgICAgcHJpbnQgaW5kZW50ICsgIm5vIGNvbW1hbmRzIGtub3duIHlldCIKKyAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoaW5kZW50ICsgIm5vIGNvbW1hbmRzIGtub3duIHlldCIpCiAgICAgICAgICAgICByZXR1cm4KIAogICAgICAgICBmb3IgY21kX25hbWUgaW4gY29tbWFuZHM6CiAgICAgICAgICAgICBvcHRfZGljdCA9IHNlbGYuY29tbWFuZF9vcHRpb25zLmdldChjbWRfbmFtZSkKICAgICAgICAgICAgIGlmIG9wdF9kaWN0IGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgcHJpbnQgaW5kZW50ICsgIm5vIG9wdGlvbiBkaWN0IGZvciAnJXMnIGNvbW1hbmQiICUgY21kX25hbWUKKyAgICAgICAgICAgICAgICBzZWxmLmFubm91bmNlKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gb3B0aW9uIGRpY3QgZm9yICclcycgY29tbWFuZCIgJSBjbWRfbmFtZSkKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQgaW5kZW50ICsgIm9wdGlvbiBkaWN0IGZvciAnJXMnIGNvbW1hbmQ6IiAlIGNtZF9uYW1lCisgICAgICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbiBkaWN0IGZvciAnJXMnIGNvbW1hbmQ6IiAlIGNtZF9uYW1lKQogICAgICAgICAgICAgICAgIG91dCA9IHBmb3JtYXQob3B0X2RpY3QpCi0gICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gc3RyaW5nLnNwbGl0KG91dCwgIlxuIik6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50IGluZGVudCArICIgICIgKyBsaW5lCisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gb3V0LnNwbGl0KCdcbicpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFubm91bmNlKGluZGVudCArICIgICIgKyBsaW5lKQogCiAgICAgIyAtLSBDb25maWcgZmlsZSBmaW5kaW5nL3BhcnNpbmcgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMzUyLDExICszNTMsMTMgQEAKICAgICAgICAgaWYgZmlsZW5hbWVzIGlzIE5vbmU6CiAgICAgICAgICAgICBmaWxlbmFtZXMgPSBzZWxmLmZpbmRfY29uZmlnX2ZpbGVzKCkKIAotICAgICAgICBpZiBERUJVRzogcHJpbnQgIkRpc3RyaWJ1dGlvbi5wYXJzZV9jb25maWdfZmlsZXMoKToiCisgICAgICAgIGlmIERFQlVHOgorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgiRGlzdHJpYnV0aW9uLnBhcnNlX2NvbmZpZ19maWxlcygpOiIpCiAKICAgICAgICAgcGFyc2VyID0gQ29uZmlnUGFyc2VyKCkKICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKLSAgICAgICAgICAgIGlmIERFQlVHOiBwcmludCAiICByZWFkaW5nIiwgZmlsZW5hbWUKKyAgICAgICAgICAgIGlmIERFQlVHOgorICAgICAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoIiAgcmVhZGluZyIsIGZpbGVuYW1lKQogICAgICAgICAgICAgcGFyc2VyLnJlYWQoZmlsZW5hbWUpCiAgICAgICAgICAgICBmb3Igc2VjdGlvbiBpbiBwYXJzZXIuc2VjdGlvbnMoKToKICAgICAgICAgICAgICAgICBvcHRpb25zID0gcGFyc2VyLm9wdGlvbnMoc2VjdGlvbikKQEAgLTM2NSw3ICszNjgsNyBAQAogICAgICAgICAgICAgICAgIGZvciBvcHQgaW4gb3B0aW9uczoKICAgICAgICAgICAgICAgICAgICAgaWYgb3B0ICE9ICdfX25hbWVfXyc6CiAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBwYXJzZXIuZ2V0KHNlY3Rpb24sb3B0KQotICAgICAgICAgICAgICAgICAgICAgICAgb3B0ID0gc3RyaW5nLnJlcGxhY2Uob3B0LCAnLScsICdfJykKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdCA9IG9wdC5yZXBsYWNlKCctJywgJ18nKQogICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2RpY3Rbb3B0XSA9IChmaWxlbmFtZSwgdmFsKQogCiAgICAgICAgICAgICAjIE1ha2UgdGhlIENvbmZpZ1BhcnNlciBmb3JnZXQgZXZlcnl0aGluZyAoc28gd2UgcmV0YWluCkBAIC01MDMsNyArNTA2LDcgQEAKICAgICAgICAgIyBBbHNvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb21tYW5kIG9iamVjdCBwcm92aWRlcyBhIGxpc3Qgb2YgaXRzCiAgICAgICAgICMga25vd24gb3B0aW9ucy4KICAgICAgICAgaWYgbm90IChoYXNhdHRyKGNtZF9jbGFzcywgJ3VzZXJfb3B0aW9ucycpIGFuZAotICAgICAgICAgICAgICAgIHR5cGUoY21kX2NsYXNzLnVzZXJfb3B0aW9ucykgaXMgTGlzdFR5cGUpOgorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoY21kX2NsYXNzLnVzZXJfb3B0aW9ucywgbGlzdCkpOgogICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQ2xhc3NFcnJvciwgXAogICAgICAgICAgICAgICAgICAgKCJjb21tYW5kIGNsYXNzICVzIG11c3QgcHJvdmlkZSAiICsKICAgICAgICAgICAgICAgICAgICAiJ3VzZXJfb3B0aW9ucycgYXR0cmlidXRlIChhIGxpc3Qgb2YgdHVwbGVzKSIpICUgXApAQCAtNTE5LDcgKzUyMiw3IEBACiAgICAgICAgICMgQ2hlY2sgZm9yIGhlbHBfb3B0aW9ucyBpbiBjb21tYW5kIGNsYXNzLiAgVGhleSBoYXZlIGEgZGlmZmVyZW50CiAgICAgICAgICMgZm9ybWF0ICh0dXBsZSBvZiBmb3VyKSBzbyB3ZSBuZWVkIHRvIHByZXByb2Nlc3MgdGhlbSBoZXJlLgogICAgICAgICBpZiAoaGFzYXR0cihjbWRfY2xhc3MsICdoZWxwX29wdGlvbnMnKSBhbmQKLSAgICAgICAgICAgIHR5cGUoY21kX2NsYXNzLmhlbHBfb3B0aW9ucykgaXMgTGlzdFR5cGUpOgorICAgICAgICAgICAgaXNpbnN0YW5jZShjbWRfY2xhc3MuaGVscF9vcHRpb25zLCBsaXN0KSk6CiAgICAgICAgICAgICBoZWxwX29wdGlvbnMgPSBmaXhfaGVscF9vcHRpb25zKGNtZF9jbGFzcy5oZWxwX29wdGlvbnMpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBoZWxwX29wdGlvbnMgPSBbXQpAQCAtNTM3LDE0ICs1NDAsMTEgQEAKICAgICAgICAgICAgIHJldHVybgogCiAgICAgICAgIGlmIChoYXNhdHRyKGNtZF9jbGFzcywgJ2hlbHBfb3B0aW9ucycpIGFuZAotICAgICAgICAgICAgdHlwZShjbWRfY2xhc3MuaGVscF9vcHRpb25zKSBpcyBMaXN0VHlwZSk6CisgICAgICAgICAgICBpc2luc3RhbmNlKGNtZF9jbGFzcy5oZWxwX29wdGlvbnMsIGxpc3QpKToKICAgICAgICAgICAgIGhlbHBfb3B0aW9uX2ZvdW5kPTAKICAgICAgICAgICAgIGZvciAoaGVscF9vcHRpb24sIHNob3J0LCBkZXNjLCBmdW5jKSBpbiBjbWRfY2xhc3MuaGVscF9vcHRpb25zOgogICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIob3B0cywgcGFyc2VyLmdldF9hdHRyX25hbWUoaGVscF9vcHRpb24pKToKICAgICAgICAgICAgICAgICAgICAgaGVscF9vcHRpb25fZm91bmQ9MQotICAgICAgICAgICAgICAgICAgICAjcHJpbnQgInNob3dpbmcgaGVscCBmb3Igb3B0aW9uICVzIG9mIGNvbW1hbmQgJXMiICUgXAotICAgICAgICAgICAgICAgICAgICAjICAgICAgKGhlbHBfb3B0aW9uWzBdLGNtZF9jbGFzcykKLQogICAgICAgICAgICAgICAgICAgICBpZiBjYWxsYWJsZShmdW5jKToKICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMoKQogICAgICAgICAgICAgICAgICAgICBlbHNlOgpAQCAtNTY5LDE3ICs1NjksMTMgQEAKICAgICAgICAgaW5zdGFuY2UsIGFuYWxvZ291cyB0byB0aGUgLmZpbmFsaXplX29wdGlvbnMoKSBtZXRob2Qgb2YgQ29tbWFuZAogICAgICAgICBvYmplY3RzLgogICAgICAgICAiIiIKLSAgICAgICAga2V5d29yZHMgPSBzZWxmLm1ldGFkYXRhLmtleXdvcmRzCi0gICAgICAgIGlmIGtleXdvcmRzIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgaWYgdHlwZShrZXl3b3JkcykgaXMgU3RyaW5nVHlwZToKLSAgICAgICAgICAgICAgICBrZXl3b3JkbGlzdCA9IHN0cmluZy5zcGxpdChrZXl3b3JkcywgJywnKQotICAgICAgICAgICAgICAgIHNlbGYubWV0YWRhdGEua2V5d29yZHMgPSBtYXAoc3RyaW5nLnN0cmlwLCBrZXl3b3JkbGlzdCkKLQotICAgICAgICBwbGF0Zm9ybXMgPSBzZWxmLm1ldGFkYXRhLnBsYXRmb3JtcwotICAgICAgICBpZiBwbGF0Zm9ybXMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBpZiB0eXBlKHBsYXRmb3JtcykgaXMgU3RyaW5nVHlwZToKLSAgICAgICAgICAgICAgICBwbGF0Zm9ybWxpc3QgPSBzdHJpbmcuc3BsaXQocGxhdGZvcm1zLCAnLCcpCi0gICAgICAgICAgICAgICAgc2VsZi5tZXRhZGF0YS5wbGF0Zm9ybXMgPSBtYXAoc3RyaW5nLnN0cmlwLCBwbGF0Zm9ybWxpc3QpCisgICAgICAgIGZvciBhdHRyIGluICgna2V5d29yZHMnLCAncGxhdGZvcm1zJyk6CisgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoc2VsZi5tZXRhZGF0YSwgYXR0cikKKyAgICAgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cik6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBbZWxtLnN0cmlwKCkgZm9yIGVsbSBpbiB2YWx1ZS5zcGxpdCgnLCcpXQorICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZi5tZXRhZGF0YSwgYXR0ciwgdmFsdWUpCiAKICAgICBkZWYgX3Nob3dfaGVscChzZWxmLCBwYXJzZXIsIGdsb2JhbF9vcHRpb25zPTEsIGRpc3BsYXlfb3B0aW9ucz0xLAogICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzPVtdKToKQEAgLTYwNiwzMSArNjAyLDMwIEBACiAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHNlbGYuZ2xvYmFsX29wdGlvbnMKICAgICAgICAgICAgIHBhcnNlci5zZXRfb3B0aW9uX3RhYmxlKG9wdGlvbnMpCiAgICAgICAgICAgICBwYXJzZXIucHJpbnRfaGVscChzZWxmLmNvbW1vbl91c2FnZSArICJcbkdsb2JhbCBvcHRpb25zOiIpCi0gICAgICAgICAgICBwcmludAorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnJykKIAogICAgICAgICBpZiBkaXNwbGF5X29wdGlvbnM6CiAgICAgICAgICAgICBwYXJzZXIuc2V0X29wdGlvbl90YWJsZShzZWxmLmRpc3BsYXlfb3B0aW9ucykKICAgICAgICAgICAgIHBhcnNlci5wcmludF9oZWxwKAogICAgICAgICAgICAgICAgICJJbmZvcm1hdGlvbiBkaXNwbGF5IG9wdGlvbnMgKGp1c3QgZGlzcGxheSAiICsKICAgICAgICAgICAgICAgICAiaW5mb3JtYXRpb24sIGlnbm9yZSBhbnkgY29tbWFuZHMpIikKLSAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBzZWxmLmFubm91bmNlKCcnKQogCiAgICAgICAgIGZvciBjb21tYW5kIGluIHNlbGYuY29tbWFuZHM6Ci0gICAgICAgICAgICBpZiB0eXBlKGNvbW1hbmQpIGlzIENsYXNzVHlwZSBhbmQgaXNzdWJjbGFzcyhjb21tYW5kLCBDb21tYW5kKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoY29tbWFuZCwgdHlwZSkgYW5kIGlzc3ViY2xhc3MoY29tbWFuZCwgQ29tbWFuZCk6CiAgICAgICAgICAgICAgICAga2xhc3MgPSBjb21tYW5kCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGtsYXNzID0gc2VsZi5nZXRfY29tbWFuZF9jbGFzcyhjb21tYW5kKQogICAgICAgICAgICAgaWYgKGhhc2F0dHIoa2xhc3MsICdoZWxwX29wdGlvbnMnKSBhbmQKLSAgICAgICAgICAgICAgICB0eXBlKGtsYXNzLmhlbHBfb3B0aW9ucykgaXMgTGlzdFR5cGUpOgorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2Uoa2xhc3MuaGVscF9vcHRpb25zLCBsaXN0KSk6CiAgICAgICAgICAgICAgICAgcGFyc2VyLnNldF9vcHRpb25fdGFibGUoa2xhc3MudXNlcl9vcHRpb25zICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhfaGVscF9vcHRpb25zKGtsYXNzLmhlbHBfb3B0aW9ucykpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHBhcnNlci5zZXRfb3B0aW9uX3RhYmxlKGtsYXNzLnVzZXJfb3B0aW9ucykKICAgICAgICAgICAgIHBhcnNlci5wcmludF9oZWxwKCJPcHRpb25zIGZvciAnJXMnIGNvbW1hbmQ6IiAlIGtsYXNzLl9fbmFtZV9fKQotICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoJycpCiAKLSAgICAgICAgcHJpbnQgZ2VuX3VzYWdlKHNlbGYuc2NyaXB0X25hbWUpCi0gICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmFubm91bmNlKGdlbl91c2FnZShzZWxmLnNjcmlwdF9uYW1lKSkKIAogICAgIGRlZiBoYW5kbGVfZGlzcGxheV9vcHRpb25zKHNlbGYsIG9wdGlvbl9vcmRlcik6CiAgICAgICAgICIiIklmIHRoZXJlIHdlcmUgYW55IG5vbi1nbG9iYWwgImRpc3BsYXktb25seSIgb3B0aW9ucwpAQCAtNjQ1LDggKzY0MCw4IEBACiAgICAgICAgICMgd2UgaWdub3JlICJmb28gYmFyIikuCiAgICAgICAgIGlmIHNlbGYuaGVscF9jb21tYW5kczoKICAgICAgICAgICAgIHNlbGYucHJpbnRfY29tbWFuZHMoKQotICAgICAgICAgICAgcHJpbnQKLSAgICAgICAgICAgIHByaW50IGdlbl91c2FnZShzZWxmLnNjcmlwdF9uYW1lKQorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnJykKKyAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoZ2VuX3VzYWdlKHNlbGYuc2NyaXB0X25hbWUpKQogICAgICAgICAgICAgcmV0dXJuIDEKIAogICAgICAgICAjIElmIHVzZXIgc3VwcGxpZWQgYW55IG9mIHRoZSAiZGlzcGxheSBtZXRhZGF0YSIgb3B0aW9ucywgdGhlbgpAQCAtNjYyLDEyICs2NTcsMTIgQEAKICAgICAgICAgICAgICAgICBvcHQgPSB0cmFuc2xhdGVfbG9uZ29wdChvcHQpCiAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKHNlbGYubWV0YWRhdGEsICJnZXRfIitvcHQpKCkKICAgICAgICAgICAgICAgICBpZiBvcHQgaW4gWydrZXl3b3JkcycsICdwbGF0Zm9ybXMnXToKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3RyaW5nLmpvaW4odmFsdWUsICcsJykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnLCcuam9pbih2YWx1ZSkpCiAgICAgICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCdjbGFzc2lmaWVycycsICdwcm92aWRlcycsICdyZXF1aXJlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvYnNvbGV0ZXMnKToKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3RyaW5nLmpvaW4odmFsdWUsICdcbicpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoJ1xuJy5qb2luKHZhbHVlKSkKICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBwcmludCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFubm91bmNlKHZhbHVlKQogICAgICAgICAgICAgICAgIGFueV9kaXNwbGF5X29wdGlvbnMgPSAxCiAKICAgICAgICAgcmV0dXJuIGFueV9kaXNwbGF5X29wdGlvbnMKQEAgLTY3Niw3ICs2NzEsNyBAQAogICAgICAgICAiIiJQcmludCBhIHN1YnNldCBvZiB0aGUgbGlzdCBvZiBhbGwgY29tbWFuZHMgLS0gdXNlZCBieQogICAgICAgICAncHJpbnRfY29tbWFuZHMoKScuCiAgICAgICAgICIiIgotICAgICAgICBwcmludCBoZWFkZXIgKyAiOiIKKyAgICAgICAgc2VsZi5hbm5vdW5jZShoZWFkZXIgKyAiOiIpCiAKICAgICAgICAgZm9yIGNtZCBpbiBjb21tYW5kczoKICAgICAgICAgICAgIGtsYXNzID0gc2VsZi5jbWRjbGFzcy5nZXQoY21kKQpAQCAtNjg3LDcgKzY4Miw3IEBACiAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiKG5vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZSkiCiAKLSAgICAgICAgICAgIHByaW50ICIgICUtKnMgICVzIiAlIChtYXhfbGVuZ3RoLCBjbWQsIGRlc2NyaXB0aW9uKQorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgiICAlLSpzICAlcyIgJSAobWF4X2xlbmd0aCwgY21kLCBkZXNjcmlwdGlvbikpCiAKICAgICBkZWYgcHJpbnRfY29tbWFuZHMoc2VsZik6CiAgICAgICAgICIiIlByaW50IG91dCBhIGhlbHAgbWVzc2FnZSBsaXN0aW5nIGFsbCBhdmFpbGFibGUgY29tbWFuZHMgd2l0aCBhCkBAIC03NjAsMTEgKzc1NSwxMCBAQAogICAgIGRlZiBnZXRfY29tbWFuZF9wYWNrYWdlcyhzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBwYWNrYWdlcyBmcm9tIHdoaWNoIGNvbW1hbmRzIGFyZSBsb2FkZWQuIiIiCiAgICAgICAgIHBrZ3MgPSBzZWxmLmNvbW1hbmRfcGFja2FnZXMKLSAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocGtncywgdHlwZShbXSkpOgotICAgICAgICAgICAgcGtncyA9IHN0cmluZy5zcGxpdChwa2dzIG9yICIiLCAiLCIpCi0gICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4ocGtncykpOgotICAgICAgICAgICAgICAgIHBrZ3NbaV0gPSBzdHJpbmcuc3RyaXAocGtnc1tpXSkKLSAgICAgICAgICAgIHBrZ3MgPSBmaWx0ZXIoTm9uZSwgcGtncykKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocGtncywgbGlzdCk6CisgICAgICAgICAgICBpZiBwa2dzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcGtncyA9ICcnCisgICAgICAgICAgICBwa2dzID0gW3BrZy5zdHJpcCgpIGZvciBwa2cgaW4gcGtncy5zcGxpdCgnLCcpIGlmIHBrZyAhPSAnJ10KICAgICAgICAgICAgIGlmICJkaXN0dXRpbHMuY29tbWFuZCIgbm90IGluIHBrZ3M6CiAgICAgICAgICAgICAgICAgcGtncy5pbnNlcnQoMCwgImRpc3R1dGlscy5jb21tYW5kIikKICAgICAgICAgICAgIHNlbGYuY29tbWFuZF9wYWNrYWdlcyA9IHBrZ3MKQEAgLTgxOCw4ICs4MTIsOCBAQAogICAgICAgICBjbWRfb2JqID0gc2VsZi5jb21tYW5kX29iai5nZXQoY29tbWFuZCkKICAgICAgICAgaWYgbm90IGNtZF9vYmogYW5kIGNyZWF0ZToKICAgICAgICAgICAgIGlmIERFQlVHOgotICAgICAgICAgICAgICAgIHByaW50ICJEaXN0cmlidXRpb24uZ2V0X2NvbW1hbmRfb2JqKCk6ICIgXAotICAgICAgICAgICAgICAgICAgICAgICJjcmVhdGluZyAnJXMnIGNvbW1hbmQgb2JqZWN0IiAlIGNvbW1hbmQKKyAgICAgICAgICAgICAgICBzZWxmLmFubm91bmNlKCJEaXN0cmlidXRpb24uZ2V0X2NvbW1hbmRfb2JqKCk6ICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyZWF0aW5nICclcycgY29tbWFuZCBvYmplY3QiICUgY29tbWFuZCkKIAogICAgICAgICAgICAga2xhc3MgPSBzZWxmLmdldF9jb21tYW5kX2NsYXNzKGNvbW1hbmQpCiAgICAgICAgICAgICBjbWRfb2JqID0gc2VsZi5jb21tYW5kX29ialtjb21tYW5kXSA9IGtsYXNzKHNlbGYpCkBAIC04NDksOSArODQzLDEyIEBACiAgICAgICAgIGlmIG9wdGlvbl9kaWN0IGlzIE5vbmU6CiAgICAgICAgICAgICBvcHRpb25fZGljdCA9IHNlbGYuZ2V0X29wdGlvbl9kaWN0KGNvbW1hbmRfbmFtZSkKIAotICAgICAgICBpZiBERUJVRzogcHJpbnQgIiAgc2V0dGluZyBvcHRpb25zIGZvciAnJXMnIGNvbW1hbmQ6IiAlIGNvbW1hbmRfbmFtZQorICAgICAgICBpZiBERUJVRzoKKyAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoIiAgc2V0dGluZyBvcHRpb25zIGZvciAnJXMnIGNvbW1hbmQ6IiAlIGNvbW1hbmRfbmFtZSkKICAgICAgICAgZm9yIChvcHRpb24sIChzb3VyY2UsIHZhbHVlKSkgaW4gb3B0aW9uX2RpY3QuaXRlbXMoKToKLSAgICAgICAgICAgIGlmIERFQlVHOiBwcmludCAiICAgICVzID0gJXMgKGZyb20gJXMpIiAlIChvcHRpb24sIHZhbHVlLCBzb3VyY2UpCisgICAgICAgICAgICBpZiBERUJVRzoKKyAgICAgICAgICAgICAgICBzZWxmLmFubm91bmNlKCIgICAgJXMgPSAlcyAoZnJvbSAlcykiICUgKG9wdGlvbiwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UpKQogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGJvb2xfb3B0cyA9IG1hcCh0cmFuc2xhdGVfbG9uZ29wdCwgY29tbWFuZF9vYmouYm9vbGVhbl9vcHRpb25zKQogICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgpAQCAtODYyLDcgKzg1OSw3IEBACiAgICAgICAgICAgICAgICAgbmVnX29wdCA9IHt9CiAKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBpc19zdHJpbmcgPSB0eXBlKHZhbHVlKSBpcyBTdHJpbmdUeXBlCisgICAgICAgICAgICAgICAgaXNfc3RyaW5nID0gaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKQogICAgICAgICAgICAgICAgIGlmIG9wdGlvbiBpbiBuZWdfb3B0IGFuZCBpc19zdHJpbmc6CiAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoY29tbWFuZF9vYmosIG5lZ19vcHRbb3B0aW9uXSwgbm90IHN0cnRvYm9vbCh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgZWxpZiBvcHRpb24gaW4gYm9vbF9vcHRzIGFuZCBpc19zdHJpbmc6CkBAIC0xMDQ0LDEwICsxMDQxLDEwIEBACiAgICAgICAgIGlmIHNlbGYuZG93bmxvYWRfdXJsOgogICAgICAgICAgICAgc2VsZi5fd3JpdGVfZmllbGQoZmlsZSwgJ0Rvd25sb2FkLVVSTCcsIHNlbGYuZG93bmxvYWRfdXJsKQogCi0gICAgICAgIGxvbmdfZGVzYyA9IHJmYzgyMl9lc2NhcGUoIHNlbGYuZ2V0X2xvbmdfZGVzY3JpcHRpb24oKSkKKyAgICAgICAgbG9uZ19kZXNjID0gcmZjODIyX2VzY2FwZShzZWxmLmdldF9sb25nX2Rlc2NyaXB0aW9uKCkpCiAgICAgICAgIHNlbGYuX3dyaXRlX2ZpZWxkKGZpbGUsICdEZXNjcmlwdGlvbicsIGxvbmdfZGVzYykKIAotICAgICAgICBrZXl3b3JkcyA9IHN0cmluZy5qb2luKCBzZWxmLmdldF9rZXl3b3JkcygpLCAnLCcpCisgICAgICAgIGtleXdvcmRzID0gJywnLmpvaW4oc2VsZi5nZXRfa2V5d29yZHMoKSkKICAgICAgICAgaWYga2V5d29yZHM6CiAgICAgICAgICAgICBzZWxmLl93cml0ZV9maWVsZChmaWxlLCAnS2V5d29yZHMnLCBrZXl3b3JkcykKIApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2Rpc3QucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlzdC5weQppbmRleCA0OTIzMGM1Li43Y2NkZDUzIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlzdC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlzdC5weQpAQCAtMSw0ICsxLDQgQEAKLSMgLSotIGNvZGluZzogbGF0aW4tMSAtKi0KKyMgLSotIGNvZGluZzogdXRmOCAtKi0KIAogIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5kaXN0LiIiIgogaW1wb3J0IG9zCkBAIC0zNiw3ICszNiw5IEBACiAgICAgICAgIHJldHVybiBzZWxmLl9jb25maWdfZmlsZXMKIAogCi1jbGFzcyBEaXN0cmlidXRpb25UZXN0Q2FzZShzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLCB1bml0dGVzdC5UZXN0Q2FzZSk6CitjbGFzcyBEaXN0cmlidXRpb25UZXN0Q2FzZShzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5Mb2dnaW5nU2lsZW5jZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHN1cGVyKERpc3RyaWJ1dGlvblRlc3RDYXNlLCBzZWxmKS5zZXRVcCgpCkBAIC0xMDYsMTEgKzEwOCwxMSBAQAogICAgICAgICBteV9maWxlID0gb3MucGF0aC5qb2luKHRtcF9kaXIsICdmJykKICAgICAgICAga2xhc3MgPSBEaXN0cmlidXRpb24KIAotICAgICAgICBkaXN0ID0ga2xhc3MoYXR0cnM9eydhdXRob3InOiB1J01pc3RlciBDYWbpJywKKyAgICAgICAgZGlzdCA9IGtsYXNzKGF0dHJzPXsnYXV0aG9yJzogdSdNaXN0ZXIgQ2Fmw6knLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ215LnBhY2thZ2UnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYWludGFpbmVyJzogdSdDYWbpIEp1bmlvcicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogdSdDYWbpIHRvcnLpZmnpJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbG9uZ19kZXNjcmlwdGlvbic6IHUnSOlo6WjpJ30pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21haW50YWluZXInOiB1J0NhZsOpIEp1bmlvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogdSdDYWbDqSB0b3Jyw6lmacOpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbG9uZ19kZXNjcmlwdGlvbic6IHUnSMOpaMOpaMOpJ30pCiAKIAogICAgICAgICAjIGxldCdzIG1ha2Ugc3VyZSB0aGUgZmlsZSBjYW4gYmUgd3JpdHRlbgpAQCAtMTUxLDYgKzE1Myw0OSBAQAogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbih3YXJucyksIDApCiAKKyAgICBkZWYgdGVzdF9maW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorCisgICAgICAgIGF0dHJzID0geydrZXl3b3Jkcyc6ICdvbmUsdHdvJywKKyAgICAgICAgICAgICAgICAgJ3BsYXRmb3Jtcyc6ICdvbmUsdHdvJ30KKworICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKGF0dHJzPWF0dHJzKQorICAgICAgICBkaXN0LmZpbmFsaXplX29wdGlvbnMoKQorCisgICAgICAgICMgZmluYWxpemVfb3B0aW9uIHNwbGl0cyBwbGF0Zm9ybXMgYW5kIGtleXdvcmRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRpc3QubWV0YWRhdGEucGxhdGZvcm1zLCBbJ29uZScsICd0d28nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGlzdC5tZXRhZGF0YS5rZXl3b3JkcywgWydvbmUnLCAndHdvJ10pCisKKyAgICBkZWYgdGVzdF9zaG93X2hlbHAoc2VsZik6CisgICAgICAgIGNsYXNzIEZhbmN5R2V0b3B0KG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKworICAgICAgICAgICAgZGVmIHNldF9vcHRpb25fdGFibGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgZGVmIHByaW50X2hlbHAoc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgICAgIHNlbGYuY291bnQgKz0gMQorCisgICAgICAgIHBhcnNlciA9IEZhbmN5R2V0b3B0KCkKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigpCisgICAgICAgIGRpc3QuY29tbWFuZHMgPSBbJ3NkaXN0J10KKyAgICAgICAgZGlzdC5zY3JpcHRfbmFtZSA9ICdzZXR1cC5weScKKyAgICAgICAgZGlzdC5fc2hvd19oZWxwKHBhcnNlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VyLmNvdW50LCAzKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbW1hbmRfcGFja2FnZXMoc2VsZik6CisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkaXN0LmNvbW1hbmRfcGFja2FnZXMsIE5vbmUpCisgICAgICAgIGNtZHMgPSBkaXN0LmdldF9jb21tYW5kX3BhY2thZ2VzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY21kcywgWydkaXN0dXRpbHMuY29tbWFuZCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkaXN0LmNvbW1hbmRfcGFja2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsnZGlzdHV0aWxzLmNvbW1hbmQnXSkKKworICAgICAgICBkaXN0LmNvbW1hbmRfcGFja2FnZXMgPSAnb25lLHR3bycKKyAgICAgICAgY21kcyA9IGRpc3QuZ2V0X2NvbW1hbmRfcGFja2FnZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjbWRzLCBbJ2Rpc3R1dGlscy5jb21tYW5kJywgJ29uZScsICd0d28nXSkKKworCiBjbGFzcyBNZXRhZGF0YVRlc3RDYXNlKHN1cHBvcnQuVGVtcGRpck1hbmFnZXIsIHN1cHBvcnQuRW52aXJvbkd1YXJkLAogICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CiAK