ZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnRzLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMucHkKaW5kZXggNDZiYTRhMi4uZjc5YWQ2MyAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMucHkKQEAgLTEyMyw3ICsxMjMsNyBAQAogICAgICAgICBpbXBvcnRfbW9kID0gcmVzdWx0cy5nZXQoIm1vZHVsZV9uYW1lIikKICAgICAgICAgaWYgaW1wb3J0X21vZDoKICAgICAgICAgICAgIG1vZF9uYW1lID0gaW1wb3J0X21vZC52YWx1ZQotICAgICAgICAgICAgbmV3X25hbWUgPSBzZWxmLm1hcHBpbmdbbW9kX25hbWVdCisgICAgICAgICAgICBuZXdfbmFtZSA9IHN0cihzZWxmLm1hcHBpbmdbbW9kX25hbWVdKQogICAgICAgICAgICAgaW1wb3J0X21vZC5yZXBsYWNlKE5hbWUobmV3X25hbWUsIHByZWZpeD1pbXBvcnRfbW9kLmdldF9wcmVmaXgoKSkpCiAgICAgICAgICAgICBpZiAibmFtZV9pbXBvcnQiIGluIHJlc3VsdHM6CiAgICAgICAgICAgICAgICAgIyBJZiBpdCdzIG5vdCBhICJmcm9tIHggaW1wb3J0IHgsIHkiIG9yICJpbXBvcnQgeCBhcyB5IiBpbXBvcnQsCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfbWV0aG9kYXR0cnMucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfbWV0aG9kYXR0cnMucHkKaW5kZXggYWU0MDk2Yy4uODE0NDU1ZSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X21ldGhvZGF0dHJzLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9tZXRob2RhdHRycy5weQpAQCAtMTksNSArMTksNSBAQAogCiAgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKICAgICAgICAgYXR0ciA9IHJlc3VsdHNbImF0dHIiXVswXQotICAgICAgICBuZXcgPSBNQVBbYXR0ci52YWx1ZV0KKyAgICAgICAgbmV3ID0gc3RyKE1BUFthdHRyLnZhbHVlXSkKICAgICAgICAgYXR0ci5yZXBsYWNlKE5hbWUobmV3LCBwcmVmaXg9YXR0ci5nZXRfcHJlZml4KCkpKQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3JlbmFtZXMucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfcmVuYW1lcy5weQppbmRleCAzMDQ5NjEwLi5hODU4MTNmIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfcmVuYW1lcy5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfcmVuYW1lcy5weQpAQCAtNjUsNSArNjUsNSBAQAogICAgICAgICAjaW1wb3J0X21vZCA9IHJlc3VsdHMuZ2V0KCJtb2R1bGUiKQogCiAgICAgICAgIGlmIG1vZF9uYW1lIGFuZCBhdHRyX25hbWU6Ci0gICAgICAgICAgICBuZXdfYXR0ciA9IExPT0tVUFsobW9kX25hbWUudmFsdWUsIGF0dHJfbmFtZS52YWx1ZSldCisgICAgICAgICAgICBuZXdfYXR0ciA9IHN0cihMT09LVVBbKG1vZF9uYW1lLnZhbHVlLCBhdHRyX25hbWUudmFsdWUpXSkKICAgICAgICAgICAgIGF0dHJfbmFtZS5yZXBsYWNlKE5hbWUobmV3X2F0dHIsIHByZWZpeD1hdHRyX25hbWUuZ2V0X3ByZWZpeCgpKSkKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF90eXBlcy5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF90eXBlcy5weQppbmRleCA0NDVmMWIyLi41OWZkMDExIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfdHlwZXMucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3R5cGVzLnB5CkBAIC01Niw3ICs1Niw3IEBACiAgICAgUEFUVEVSTiA9ICd8Jy5qb2luKF9wYXRzKQogCiAgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKLSAgICAgICAgbmV3X3ZhbHVlID0gX1RZUEVfTUFQUElORy5nZXQocmVzdWx0c1sibmFtZSJdLnZhbHVlKQorICAgICAgICBuZXdfdmFsdWUgPSBzdHIoX1RZUEVfTUFQUElORy5nZXQocmVzdWx0c1sibmFtZSJdLnZhbHVlKSkKICAgICAgICAgaWYgbmV3X3ZhbHVlOgogICAgICAgICAgICAgcmV0dXJuIE5hbWUobmV3X3ZhbHVlLCBwcmVmaXg9bm9kZS5nZXRfcHJlZml4KCkpCiAgICAgICAgIHJldHVybiBOb25lCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9tYWluLnB5IGIvTGliL2xpYjJ0bzMvbWFpbi5weQppbmRleCAwODRmYzBjLi5lMWFkYzg4IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9tYWluLnB5CisrKyBiL0xpYi9saWIydG8zL21haW4ucHkKQEAgLTIzLDcgKzIzLDcgQEAKICAgICAgICAgc2VsZi5lcnJvcnMuYXBwZW5kKChtc2csIGFyZ3MsIGt3YXJncykpCiAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKG1zZywgKmFyZ3MsICoqa3dhcmdzKQogCi0gICAgZGVmIHdyaXRlX2ZpbGUoc2VsZiwgbmV3X3RleHQsIGZpbGVuYW1lLCBvbGRfdGV4dCk6CisgICAgZGVmIHdyaXRlX2ZpbGUoc2VsZiwgbmV3X3RleHQsIGZpbGVuYW1lLCBvbGRfdGV4dCwgZW5jb2RpbmcpOgogICAgICAgICBpZiBub3Qgc2VsZi5ub2JhY2t1cHM6CiAgICAgICAgICAgICAjIE1ha2UgYmFja3VwCiAgICAgICAgICAgICBiYWNrdXAgPSBmaWxlbmFtZSArICIuYmFrIgpAQCAtMzcsOCArMzcsOCBAQAogICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yIGFzIGVycjoKICAgICAgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJDYW4ndCByZW5hbWUgJXMgdG8gJXMiLCBmaWxlbmFtZSwgYmFja3VwKQogICAgICAgICAjIEFjdHVhbGx5IHdyaXRlIHRoZSBuZXcgZmlsZQotICAgICAgICBzdXBlcihTdGRvdXRSZWZhY3RvcmluZ1Rvb2wsIHNlbGYpLndyaXRlX2ZpbGUobmV3X3RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgb2xkX3RleHQpCisgICAgICAgIHdyaXRlID0gc3VwZXIoU3Rkb3V0UmVmYWN0b3JpbmdUb29sLCBzZWxmKS53cml0ZV9maWxlCisgICAgICAgIHdyaXRlKG5ld190ZXh0LCBmaWxlbmFtZSwgb2xkX3RleHQsIGVuY29kaW5nKQogICAgICAgICBpZiBub3Qgc2VsZi5ub2JhY2t1cHM6CiAgICAgICAgICAgICBzaHV0aWwuY29weW1vZGUoYmFja3VwLCBmaWxlbmFtZSkKIApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvcGF0Y29tcC5weSBiL0xpYi9saWIydG8zL3BhdGNvbXAucHkKaW5kZXggNzgyNmY5MC4uMDc2ZmRjMSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvcGF0Y29tcC5weQorKysgYi9MaWIvbGliMnRvMy9wYXRjb21wLnB5CkBAIC0xMzMsNyArMTMzLDcgQEAKICAgICAgICAgYXNzZXJ0IGxlbihub2RlcykgPj0gMQogICAgICAgICBub2RlID0gbm9kZXNbMF0KICAgICAgICAgaWYgbm9kZS50eXBlID09IHRva2VuLlNUUklORzoKLSAgICAgICAgICAgIHZhbHVlID0gbGl0ZXJhbHMuZXZhbFN0cmluZyhub2RlLnZhbHVlKQorICAgICAgICAgICAgdmFsdWUgPSBzdHIobGl0ZXJhbHMuZXZhbFN0cmluZyhub2RlLnZhbHVlKSkKICAgICAgICAgICAgIHJldHVybiBweXRyZWUuTGVhZlBhdHRlcm4oY29udGVudD12YWx1ZSkKICAgICAgICAgZWxpZiBub2RlLnR5cGUgPT0gdG9rZW4uTkFNRToKICAgICAgICAgICAgIHZhbHVlID0gbm9kZS52YWx1ZQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvcGdlbjIvZHJpdmVyLnB5IGIvTGliL2xpYjJ0bzMvcGdlbjIvZHJpdmVyLnB5CmluZGV4IGEwMjViMzcuLmVlNzdhMTMgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL3BnZW4yL2RyaXZlci5weQorKysgYi9MaWIvbGliMnRvMy9wZ2VuMi9kcml2ZXIucHkKQEAgLTE2LDYgKzE2LDcgQEAKIF9fYWxsX18gPSBbIkRyaXZlciIsICJsb2FkX2dyYW1tYXIiXQogCiAjIFB5dGhvbiBpbXBvcnRzCitpbXBvcnQgY29kZWNzCiBpbXBvcnQgb3MKIGltcG9ydCBsb2dnaW5nCiBpbXBvcnQgc3lzCkBAIC05MCw5ICs5MSw5IEBACiAgICAgICAgICIiIlBhcnNlIGEgc3RyZWFtIGFuZCByZXR1cm4gdGhlIHN5bnRheCB0cmVlLiIiIgogICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9zdHJlYW1fcmF3KHN0cmVhbSwgZGVidWcpCiAKLSAgICBkZWYgcGFyc2VfZmlsZShzZWxmLCBmaWxlbmFtZSwgZGVidWc9RmFsc2UpOgorICAgIGRlZiBwYXJzZV9maWxlKHNlbGYsIGZpbGVuYW1lLCBlbmNvZGluZz1Ob25lLCBkZWJ1Zz1GYWxzZSk6CiAgICAgICAgICIiIlBhcnNlIGEgZmlsZSBhbmQgcmV0dXJuIHRoZSBzeW50YXggdHJlZS4iIiIKLSAgICAgICAgc3RyZWFtID0gb3BlbihmaWxlbmFtZSkKKyAgICAgICAgc3RyZWFtID0gY29kZWNzLm9wZW4oZmlsZW5hbWUsICJyIiwgZW5jb2RpbmcpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX3N0cmVhbShzdHJlYW0sIGRlYnVnKQogICAgICAgICBmaW5hbGx5OgpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvcGdlbjIvdG9rZW5pemUucHkgYi9MaWIvbGliMnRvMy9wZ2VuMi90b2tlbml6ZS5weQppbmRleCAzM2NmYzMzLi43OTk1NjZiIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9wZ2VuMi90b2tlbml6ZS5weQorKysgYi9MaWIvbGliMnRvMy9wZ2VuMi90b2tlbml6ZS5weQpAQCAtMzAsNiArMzAsNyBAQAogICAgICdHdlIsIEVTUiwgVGltIFBldGVycywgVGhvbWFzIFdvdXRlcnMsIEZyZWQgRHJha2UsIFNraXAgTW9udGFuYXJvJwogCiBpbXBvcnQgc3RyaW5nLCByZQorZnJvbSBjb2RlY3MgaW1wb3J0IEJPTV9VVEY4LCBsb29rdXAKIGZyb20gbGliMnRvMy5wZ2VuMi50b2tlbiBpbXBvcnQgKgogCiBmcm9tIC4gaW1wb3J0IHRva2VuCkBAIC0yMjgsNiArMjI5LDc1IEBACiAgICAgICAgICAgICAgICAgc3RhcnRsaW5lID0gRmFsc2UKICAgICAgICAgICAgIHRva3NfYXBwZW5kKHRva3ZhbCkKIAorY29va2llX3JlID0gcmUuY29tcGlsZSgiY29kaW5nWzo9XVxzKihbLVx3Ll0rKSIpCisKK2RlZiBkZXRlY3RfZW5jb2RpbmcocmVhZGxpbmUpOgorICAgICIiIgorICAgIFRoZSBkZXRlY3RfZW5jb2RpbmcoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGRldGVjdCB0aGUgZW5jb2RpbmcgdGhhdCBzaG91bGQKKyAgICBiZSB1c2VkIHRvIGRlY29kZSBhIFB5dGhvbiBzb3VyY2UgZmlsZS4gSXQgcmVxdWlyZXMgb25lIGFyZ21lbnQsIHJlYWRsaW5lLAorICAgIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgdG9rZW5pemUoKSBnZW5lcmF0b3IuCisKKyAgICBJdCB3aWxsIGNhbGwgcmVhZGxpbmUgYSBtYXhpbXVtIG9mIHR3aWNlLCBhbmQgcmV0dXJuIHRoZSBlbmNvZGluZyB1c2VkCisgICAgKGFzIGEgc3RyaW5nKSBhbmQgYSBsaXN0IG9mIGFueSBsaW5lcyAobGVmdCBhcyBieXRlcykgaXQgaGFzIHJlYWQKKyAgICBpbi4KKworICAgIEl0IGRldGVjdHMgdGhlIGVuY29kaW5nIGZyb20gdGhlIHByZXNlbmNlIG9mIGEgdXRmLTggYm9tIG9yIGFuIGVuY29kaW5nCisgICAgY29va2llIGFzIHNwZWNpZmllZCBpbiBwZXAtMDI2My4gSWYgYm90aCBhIGJvbSBhbmQgYSBjb29raWUgYXJlIHByZXNlbnQsCisgICAgYnV0IGRpc2FncmVlLCBhIFN5bnRheEVycm9yIHdpbGwgYmUgcmFpc2VkLiBJZiB0aGUgZW5jb2RpbmcgY29va2llIGlzIGFuCisgICAgaW52YWxpZCBjaGFyc2V0LCByYWlzZSBhIFN5bnRheEVycm9yLgorCisgICAgSWYgbm8gZW5jb2RpbmcgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBkZWZhdWx0IG9mICd1dGYtOCcgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAiIiIKKyAgICBib21fZm91bmQgPSBGYWxzZQorICAgIGVuY29kaW5nID0gTm9uZQorICAgIGRlZiByZWFkX29yX3N0b3AoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHJlYWRsaW5lKCkKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICByZXR1cm4gYicnCisKKyAgICBkZWYgZmluZF9jb29raWUobGluZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpbmVfc3RyaW5nID0gbGluZS5kZWNvZGUoJ2FzY2lpJykKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgbWF0Y2hlcyA9IGNvb2tpZV9yZS5maW5kYWxsKGxpbmVfc3RyaW5nKQorICAgICAgICBpZiBub3QgbWF0Y2hlczoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGVuY29kaW5nID0gbWF0Y2hlc1swXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb2RlYyA9IGxvb2t1cChlbmNvZGluZykKKyAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICAgICAgIyBUaGlzIGJlaGF2aW91ciBtaW1pY3MgdGhlIFB5dGhvbiBpbnRlcnByZXRlcgorICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoInVua25vd24gZW5jb2Rpbmc6ICIgKyBlbmNvZGluZykKKworICAgICAgICBpZiBib21fZm91bmQgYW5kIGNvZGVjLm5hbWUgIT0gJ3V0Zi04JzoKKyAgICAgICAgICAgICMgVGhpcyBiZWhhdmlvdXIgbWltaWNzIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIKKyAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCdlbmNvZGluZyBwcm9ibGVtOiB1dGYtOCcpCisgICAgICAgIHJldHVybiBlbmNvZGluZworCisgICAgZmlyc3QgPSByZWFkX29yX3N0b3AoKQorICAgIGlmIGZpcnN0LnN0YXJ0c3dpdGgoQk9NX1VURjgpOgorICAgICAgICBib21fZm91bmQgPSBUcnVlCisgICAgICAgIGZpcnN0ID0gZmlyc3RbMzpdCisgICAgaWYgbm90IGZpcnN0OgorICAgICAgICByZXR1cm4gJ3V0Zi04JywgW10KKworICAgIGVuY29kaW5nID0gZmluZF9jb29raWUoZmlyc3QpCisgICAgaWYgZW5jb2Rpbmc6CisgICAgICAgIHJldHVybiBlbmNvZGluZywgW2ZpcnN0XQorCisgICAgc2Vjb25kID0gcmVhZF9vcl9zdG9wKCkKKyAgICBpZiBub3Qgc2Vjb25kOgorICAgICAgICByZXR1cm4gJ3V0Zi04JywgW2ZpcnN0XQorCisgICAgZW5jb2RpbmcgPSBmaW5kX2Nvb2tpZShzZWNvbmQpCisgICAgaWYgZW5jb2Rpbmc6CisgICAgICAgIHJldHVybiBlbmNvZGluZywgW2ZpcnN0LCBzZWNvbmRdCisKKyAgICByZXR1cm4gJ3V0Zi04JywgW2ZpcnN0LCBzZWNvbmRdCisKIGRlZiB1bnRva2VuaXplKGl0ZXJhYmxlKToKICAgICAiIiJUcmFuc2Zvcm0gdG9rZW5zIGJhY2sgaW50byBQeXRob24gc291cmNlIGNvZGUuCiAKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3B5dHJlZS5weSBiL0xpYi9saWIydG8zL3B5dHJlZS5weQppbmRleCA5ZGU4MTBlLi5jNjBmMTA3IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9weXRyZWUucHkKKysrIGIvTGliL2xpYjJ0bzMvcHl0cmVlLnB5CkBAIC0yMTYsNiArMjE2LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgcmV0dXJuIG5leHRfc2liLmdldF9wcmVmaXgoKQogCisgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAwKToKKyAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYpLmVuY29kZSgiYXNjaWkiKQorCiAKIGNsYXNzIE5vZGUoQmFzZSk6CiAKQEAgLTI0NSw3ICsyNDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfcmVwcihzZWxmLnR5cGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4pCiAKLSAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICBkZWYgX191bmljb2RlX18oc2VsZik6CiAgICAgICAgICIiIgogICAgICAgICBSZXR1cm4gYSBwcmV0dHkgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgogCkBAIC0yNTMsNiArMjU3LDkgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHJldHVybiAiIi5qb2luKG1hcChzdHIsIHNlbGYuY2hpbGRyZW4pKQogCisgICAgaWYgc3lzLnZlcnNpb25faW5mbyA+ICgzLCAwKToKKyAgICAgICAgX19zdHJfXyA9IF9fdW5pY29kZV9fCisKICAgICBkZWYgX2VxKHNlbGYsIG90aGVyKToKICAgICAgICAgIiIiQ29tcGFyZSB0d28gbm9kZXMgZm9yIGVxdWFsaXR5LiIiIgogICAgICAgICByZXR1cm4gKHNlbGYudHlwZSwgc2VsZi5jaGlsZHJlbikgPT0gKG90aGVyLnR5cGUsIG90aGVyLmNoaWxkcmVuKQpAQCAtMzUzLDcgKzM2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmFsdWUpCiAKLSAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICBkZWYgX191bmljb2RlX18oc2VsZik6CiAgICAgICAgICIiIgogICAgICAgICBSZXR1cm4gYSBwcmV0dHkgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgogCkBAIC0zNjEsNiArMzY4LDkgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHJldHVybiBzZWxmLnByZWZpeCArIHN0cihzZWxmLnZhbHVlKQogCisgICAgaWYgc3lzLnZlcnNpb25faW5mbyA+ICgzLCAwKToKKyAgICAgICAgX19zdHJfXyA9IF9fdW5pY29kZV9fCisKICAgICBkZWYgX2VxKHNlbGYsIG90aGVyKToKICAgICAgICAgIiIiQ29tcGFyZSB0d28gbm9kZXMgZm9yIGVxdWFsaXR5LiIiIgogICAgICAgICByZXR1cm4gKHNlbGYudHlwZSwgc2VsZi52YWx1ZSkgPT0gKG90aGVyLnR5cGUsIG90aGVyLnZhbHVlKQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvcmVmYWN0b3IucHkgYi9MaWIvbGliMnRvMy9yZWZhY3Rvci5weQppbmRleCBiNjc5ZGI0Li44MmE5OGQxIDEwMDc1NQotLS0gYS9MaWIvbGliMnRvMy9yZWZhY3Rvci5weQorKysgYi9MaWIvbGliMnRvMy9yZWZhY3Rvci5weQpAQCAtMjIsOCArMjIsNyBAQAogZnJvbSBpdGVydG9vbHMgaW1wb3J0IGNoYWluCiAKICMgTG9jYWwgaW1wb3J0cwotZnJvbSAucGdlbjIgaW1wb3J0IGRyaXZlcgotZnJvbSAucGdlbjIgaW1wb3J0IHRva2VuaXplCitmcm9tIC5wZ2VuMiBpbXBvcnQgZHJpdmVyLCB0b2tlbml6ZQogCiBmcm9tIC4gaW1wb3J0IHB5dHJlZQogZnJvbSAuIGltcG9ydCBwYXRjb21wCkBAIC04Nyw2ICs4NiwyNSBAQAogICAgIHJldHVybiBbcGtnX25hbWUgKyAiLiIgKyBmaXhfbmFtZQogICAgICAgICAgICAgZm9yIGZpeF9uYW1lIGluIGdldF9hbGxfZml4X25hbWVzKHBrZ19uYW1lLCBGYWxzZSldCiAKK2RlZiBfaWRlbnRpdHkob2JqKToKKyAgICByZXR1cm4gb2JqCisKK2lmIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMCk6CisgICAgaW1wb3J0IGNvZGVjcworICAgIF9vcGVuX3dpdGhfZW5jb2RpbmcgPSBjb2RlY3Mub3BlbgorICAgICMgY29kZWNzLm9wZW4gZG9lc24ndCB0cmFuc2xhdGUgbmV3bGluZXMgc2FkbHkuCisgICAgZGVmIF9mcm9tX3N5c3RlbV9uZXdsaW5lcyhpbnB1dCk6CisgICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKCJcclxuIiwgIlxuIikKKyAgICBkZWYgX3RvX3N5c3RlbV9uZXdsaW5lcyhpbnB1dCk6CisgICAgICAgIGlmIG9zLmxpbmVzZXAgIT0gIlxuIjoKKyAgICAgICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKCJcbiIsIG9zLmxpbmVzZXApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gaW5wdXQKK2Vsc2U6CisgICAgX29wZW5fd2l0aF9lbmNvZGluZyA9IG9wZW4KKyAgICBfZnJvbV9zeXN0ZW1fbmV3bGluZXMgPSBfaWRlbnRpdHkKKyAgICBfdG9fc3lzdGVtX25ld2xpbmVzID0gX2lkZW50aXR5CisKIAogY2xhc3MgRml4ZXJFcnJvcihFeGNlcHRpb24pOgogICAgICIiIkEgZml4ZXIgY291bGQgbm90IGJlIGxvYWRlZC4iIiIKQEAgLTIxMywyOSArMjMxLDQyIEBACiAgICAgICAgICAgICAjIE1vZGlmeSBkaXJuYW1lcyBpbi1wbGFjZSB0byByZW1vdmUgc3ViZGlycyB3aXRoIGxlYWRpbmcgZG90cwogICAgICAgICAgICAgZGlybmFtZXNbOl0gPSBbZG4gZm9yIGRuIGluIGRpcm5hbWVzIGlmIG5vdCBkbi5zdGFydHN3aXRoKCIuIildCiAKLSAgICBkZWYgcmVmYWN0b3JfZmlsZShzZWxmLCBmaWxlbmFtZSwgd3JpdGU9RmFsc2UsIGRvY3Rlc3RzX29ubHk9RmFsc2UpOgotICAgICAgICAiIiJSZWZhY3RvcnMgYSBmaWxlLiIiIgorICAgIGRlZiBfcmVhZF9weXRob25fc291cmNlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIERvIG91ciBiZXN0IHRvIGRlY29kZSBhIFB5dGhvbiBzb3VyY2UgZmlsZSBjb3JyZWN0bHkuCisgICAgICAgICIiIgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSkKKyAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAicmIiKQogICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlcnI6CiAgICAgICAgICAgICBzZWxmLmxvZ19lcnJvcigiQ2FuJ3Qgb3BlbiAlczogJXMiLCBmaWxlbmFtZSwgZXJyKQotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpbnB1dCA9IGYucmVhZCgpICsgIlxuIiAjIFNpbGVuY2UgY2VydGFpbiBwYXJzZSBlcnJvcnMKKyAgICAgICAgICAgIGVuY29kaW5nID0gdG9rZW5pemUuZGV0ZWN0X2VuY29kaW5nKGYucmVhZGxpbmUpWzBdCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgd2l0aCBfb3Blbl93aXRoX2VuY29kaW5nKGZpbGVuYW1lLCAiciIsIGVuY29kaW5nPWVuY29kaW5nKSBhcyBmOgorICAgICAgICAgICAgcmV0dXJuIF9mcm9tX3N5c3RlbV9uZXdsaW5lcyhmLnJlYWQoKSksIGVuY29kaW5nCisKKyAgICBkZWYgcmVmYWN0b3JfZmlsZShzZWxmLCBmaWxlbmFtZSwgd3JpdGU9RmFsc2UsIGRvY3Rlc3RzX29ubHk9RmFsc2UpOgorICAgICAgICAiIiJSZWZhY3RvcnMgYSBmaWxlLiIiIgorICAgICAgICBpbnB1dCwgZW5jb2RpbmcgPSBzZWxmLl9yZWFkX3B5dGhvbl9zb3VyY2UoZmlsZW5hbWUpCisgICAgICAgIGlmIGlucHV0IGlzIE5vbmU6CisgICAgICAgICAgICAjIFJlYWRpbmcgdGhlIGZpbGUgZmFpbGVkLgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlucHV0ICs9ICJcbiIgIyBTaWxlbmNlIGNlcnRhaW4gcGFyc2UgZXJyb3JzCiAgICAgICAgIGlmIGRvY3Rlc3RzX29ubHk6CiAgICAgICAgICAgICBzZWxmLmxvZ19kZWJ1ZygiUmVmYWN0b3JpbmcgZG9jdGVzdHMgaW4gJXMiLCBmaWxlbmFtZSkKICAgICAgICAgICAgIG91dHB1dCA9IHNlbGYucmVmYWN0b3JfZG9jc3RyaW5nKGlucHV0LCBmaWxlbmFtZSkKICAgICAgICAgICAgIGlmIG91dHB1dCAhPSBpbnB1dDoKLSAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NlZF9maWxlKG91dHB1dCwgZmlsZW5hbWUsIGlucHV0LCB3cml0ZT13cml0ZSkKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NlZF9maWxlKG91dHB1dCwgZmlsZW5hbWUsIGlucHV0LCB3cml0ZSwgZW5jb2RpbmcpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYubG9nX2RlYnVnKCJObyBkb2N0ZXN0IGNoYW5nZXMgaW4gJXMiLCBmaWxlbmFtZSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHRyZWUgPSBzZWxmLnJlZmFjdG9yX3N0cmluZyhpbnB1dCwgZmlsZW5hbWUpCiAgICAgICAgICAgICBpZiB0cmVlIGFuZCB0cmVlLndhc19jaGFuZ2VkOgogICAgICAgICAgICAgICAgICMgVGhlIFs6LTFdIGlzIHRvIHRha2Ugb2ZmIHRoZSBcbiB3ZSBhZGRlZCBlYXJsaWVyCi0gICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzZWRfZmlsZShzdHIodHJlZSlbOi0xXSwgZmlsZW5hbWUsIHdyaXRlPXdyaXRlKQorICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc2VkX2ZpbGUoc3RyKHRyZWUpWzotMV0sIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGU9d3JpdGUsIGVuY29kaW5nPWVuY29kaW5nKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLmxvZ19kZWJ1ZygiTm8gY2hhbmdlcyBpbiAlcyIsIGZpbGVuYW1lKQogCkBAIC0zMjEsMzEgKzM1MiwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yZXBsYWNlKG5ldykKICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXcKIAotICAgIGRlZiBwcm9jZXNzZWRfZmlsZShzZWxmLCBuZXdfdGV4dCwgZmlsZW5hbWUsIG9sZF90ZXh0PU5vbmUsIHdyaXRlPUZhbHNlKToKKyAgICBkZWYgcHJvY2Vzc2VkX2ZpbGUoc2VsZiwgbmV3X3RleHQsIGZpbGVuYW1lLCBvbGRfdGV4dD1Ob25lLCB3cml0ZT1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc9Tm9uZSk6CiAgICAgICAgICIiIgogICAgICAgICBDYWxsZWQgd2hlbiBhIGZpbGUgaGFzIGJlZW4gcmVmYWN0b3JlZCwgYW5kIHRoZXJlIGFyZSBjaGFuZ2VzLgogICAgICAgICAiIiIKICAgICAgICAgc2VsZi5maWxlcy5hcHBlbmQoZmlsZW5hbWUpCiAgICAgICAgIGlmIG9sZF90ZXh0IGlzIE5vbmU6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICJyIikKLSAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGVycjoKLSAgICAgICAgICAgICAgICBzZWxmLmxvZ19lcnJvcigiQ2FuJ3QgcmVhZCAlczogJXMiLCBmaWxlbmFtZSwgZXJyKQorICAgICAgICAgICAgb2xkX3RleHQgPSBzZWxmLl9yZWFkX3B5dGhvbl9zb3VyY2UoZmlsZW5hbWUpWzBdCisgICAgICAgICAgICBpZiBvbGRfdGV4dCBpcyBOb25lOgogICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG9sZF90ZXh0ID0gZi5yZWFkKCkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgIGlmIG9sZF90ZXh0ID09IG5ld190ZXh0OgogICAgICAgICAgICAgc2VsZi5sb2dfZGVidWcoIk5vIGNoYW5nZXMgdG8gJXMiLCBmaWxlbmFtZSkKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBzZWxmLnByaW50X291dHB1dChkaWZmX3RleHRzKG9sZF90ZXh0LCBuZXdfdGV4dCwgZmlsZW5hbWUpKQogICAgICAgICBpZiB3cml0ZToKLSAgICAgICAgICAgIHNlbGYud3JpdGVfZmlsZShuZXdfdGV4dCwgZmlsZW5hbWUsIG9sZF90ZXh0KQorICAgICAgICAgICAgc2VsZi53cml0ZV9maWxlKG5ld190ZXh0LCBmaWxlbmFtZSwgb2xkX3RleHQsIGVuY29kaW5nKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5sb2dfZGVidWcoIk5vdCB3cml0aW5nIGNoYW5nZXMgdG8gJXMiLCBmaWxlbmFtZSkKIAotICAgIGRlZiB3cml0ZV9maWxlKHNlbGYsIG5ld190ZXh0LCBmaWxlbmFtZSwgb2xkX3RleHQpOgorICAgIGRlZiB3cml0ZV9maWxlKHNlbGYsIG5ld190ZXh0LCBmaWxlbmFtZSwgb2xkX3RleHQsIGVuY29kaW5nPU5vbmUpOgogICAgICAgICAiIiJXcml0ZXMgYSBzdHJpbmcgdG8gYSBmaWxlLgogCiAgICAgICAgIEl0IGZpcnN0IHNob3dzIGEgdW5pZmllZCBkaWZmIGJldHdlZW4gdGhlIG9sZCB0ZXh0IGFuZCB0aGUgbmV3IHRleHQsIGFuZApAQCAtMzUzLDEyICszNzksMTIgQEAKICAgICAgICAgc2V0LgogICAgICAgICAiIiIKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICJ3IikKKyAgICAgICAgICAgIGYgPSBfb3Blbl93aXRoX2VuY29kaW5nKGZpbGVuYW1lLCAidyIsIGVuY29kaW5nPWVuY29kaW5nKQogICAgICAgICBleGNlcHQgb3MuZXJyb3IgYXMgZXJyOgogICAgICAgICAgICAgc2VsZi5sb2dfZXJyb3IoIkNhbid0IGNyZWF0ZSAlczogJXMiLCBmaWxlbmFtZSwgZXJyKQogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGYud3JpdGUobmV3X3RleHQpCisgICAgICAgICAgICBmLndyaXRlKF90b19zeXN0ZW1fbmV3bGluZXMobmV3X3RleHQpKQogICAgICAgICBleGNlcHQgb3MuZXJyb3IgYXMgZXJyOgogICAgICAgICAgICAgc2VsZi5sb2dfZXJyb3IoIkNhbid0IHdyaXRlICVzOiAlcyIsIGZpbGVuYW1lLCBlcnIpCiAgICAgICAgIGZpbmFsbHk6CmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy90ZXN0cy9kYXRhL2NybGYucHkgYi9MaWIvbGliMnRvMy90ZXN0cy9kYXRhL2NybGYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJlMmQ3YgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9saWIydG8zL3Rlc3RzL2RhdGEvY3JsZi5weQpAQCAtMCwwICsxLDMgQEAKK3ByaW50ICJoaSIKKworcHJpbnQgIkxpa2UgYmFkIFdpbmRvd3MgbmV3bGluZXM/IgpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9kaWZmZXJlbnRfZW5jb2RpbmcucHkgYi9MaWIvbGliMnRvMy90ZXN0cy9kYXRhL2RpZmZlcmVudF9lbmNvZGluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmI4MmJkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9kaWZmZXJlbnRfZW5jb2RpbmcucHkKQEAgLTAsMCArMSw0IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KK3ByaW50KHUn3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX2+Pn6+/z9/v/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tjZ2tvc3d4nKQorCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy90ZXN0cy9zdXBwb3J0LnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvc3VwcG9ydC5weQppbmRleCA3YWJmMmVmLi44Yjg0NjhjIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy9zdXBwb3J0LnB5CisrKyBiL0xpYi9saWIydG8zL3Rlc3RzL3N1cHBvcnQucHkKQEAgLTksMTIgKzksOSBAQAogaW1wb3J0IHJlCiBmcm9tIHRleHR3cmFwIGltcG9ydCBkZWRlbnQKIAotI3N5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgIi4uIikpCi0KICMgTG9jYWwgaW1wb3J0cwotZnJvbSAuLiBpbXBvcnQgcHl0cmVlCi1mcm9tIC4uIGltcG9ydCByZWZhY3RvcgotZnJvbSAuLnBnZW4yIGltcG9ydCBkcml2ZXIKK2Zyb20gbGliMnRvMyBpbXBvcnQgcHl0cmVlLCByZWZhY3RvcgorZnJvbSBsaWIydG8zLnBnZW4yIGltcG9ydCBkcml2ZXIKIAogdGVzdF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCiBwcm9qX2RpciA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKHRlc3RfZGlyLCAiLi4iKSkKQEAgLTI1LDEyICsyMiw2IEBACiBkZWYgcGFyc2Vfc3RyaW5nKHN0cmluZyk6CiAgICAgcmV0dXJuIGRyaXZlci5wYXJzZV9zdHJpbmcocmVmb3JtYXQoc3RyaW5nKSwgZGVidWc9VHJ1ZSkKIAotIyBQeXRob24gMi4zJ3MgVGVzdFN1aXRlIGlzIG5vdCBpdGVyKCktYWJsZQotaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA0KToKLSAgICBkZWYgVGVzdFN1aXRlX2l0ZXIoc2VsZik6Ci0gICAgICAgIHJldHVybiBpdGVyKHNlbGYuX3Rlc3RzKQotICAgIHVuaXR0ZXN0LlRlc3RTdWl0ZS5fX2l0ZXJfXyA9IFRlc3RTdWl0ZV9pdGVyCi0KIGRlZiBydW5fYWxsX3Rlc3RzKHRlc3RfbW9kPU5vbmUsIHRlc3RzPU5vbmUpOgogICAgIGlmIHRlc3RzIGlzIE5vbmU6CiAgICAgICAgIHRlc3RzID0gdW5pdHRlc3QuVGVzdExvYWRlcigpLmxvYWRUZXN0c0Zyb21Nb2R1bGUodGVzdF9tb2QpCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2FsbF9maXhlcnMucHkgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2FsbF9maXhlcnMucHkKaW5kZXggNjhkNjMwNi4uMTc5NWFkZSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9hbGxfZml4ZXJzLnB5CisrKyBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfYWxsX2ZpeGVycy5weQpAQCAtMjgsNyArMjgsNyBAQAogICAgIGRlZiB0ZXN0X2FsbF9wcm9qZWN0X2ZpbGVzKHNlbGYpOgogICAgICAgICBmb3IgZmlsZXBhdGggaW4gc3VwcG9ydC5hbGxfcHJvamVjdF9maWxlcygpOgogICAgICAgICAgICAgcHJpbnQoIkZpeGluZyAlcy4uLiIgJSBmaWxlcGF0aCkKLSAgICAgICAgICAgIHNlbGYucmVmYWN0b3IucmVmYWN0b3Jfc3RyaW5nKG9wZW4oZmlsZXBhdGgpLnJlYWQoKSwgZmlsZXBhdGgpCisgICAgICAgICAgICBzZWxmLnJlZmFjdG9yLnJlZmFjdG9yX2ZpbGUoZmlsZXBhdGgpCiAKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcGFyc2VyLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9wYXJzZXIucHkKaW5kZXggODNhYTgxMi4uMmFhNzM3YyAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9wYXJzZXIucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9wYXJzZXIucHkKQEAgLTE0LDkgKzE0LDkgQEAKIAogIyBQeXRob24gaW1wb3J0cwogaW1wb3J0IG9zCi1pbXBvcnQgb3MucGF0aAogCiAjIExvY2FsIGltcG9ydHMKK2Zyb20gbGliMnRvMy5wZ2VuMiBpbXBvcnQgdG9rZW5pemUKIGZyb20gLi5wZ2VuMi5wYXJzZSBpbXBvcnQgUGFyc2VFcnJvcgogCiAKQEAgLTE1MCwxMyArMTUwLDI1IEBACiAgICAgZGVmIHRlc3RfYWxsX3Byb2plY3RfZmlsZXMoc2VsZik6CiAgICAgICAgIGZvciBmaWxlcGF0aCBpbiBzdXBwb3J0LmFsbF9wcm9qZWN0X2ZpbGVzKCk6CiAgICAgICAgICAgICBwcmludCgiUGFyc2luZyAlcy4uLiIgJSBmaWxlcGF0aCkKLSAgICAgICAgICAgIHRyZWUgPSBkcml2ZXIucGFyc2VfZmlsZShmaWxlcGF0aCwgZGVidWc9VHJ1ZSkKLSAgICAgICAgICAgIGlmIGRpZmYoZmlsZXBhdGgsIHRyZWUpOgorICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVwYXRoLCAicmIiKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9IHRva2VuaXplLmRldGVjdF9lbmNvZGluZyhmcC5yZWFkbGluZSlbMF0KKyAgICAgICAgICAgICAgICBmcC5zZWVrKDApCisgICAgICAgICAgICAgICAgc291cmNlID0gZnAucmVhZCgpCisgICAgICAgICAgICAgICAgaWYgZW5jb2Rpbmc6CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IHNvdXJjZS5kZWNvZGUoZW5jb2RpbmcpCisgICAgICAgICAgICB0cmVlID0gZHJpdmVyLnBhcnNlX3N0cmluZyhzb3VyY2UpCisgICAgICAgICAgICBuZXcgPSBzdHIodHJlZSkKKyAgICAgICAgICAgIGlmIGVuY29kaW5nOgorICAgICAgICAgICAgICAgIG5ldyA9IG5ldy5lbmNvZGUoZW5jb2RpbmcpCisgICAgICAgICAgICBpZiBkaWZmKGZpbGVwYXRoLCBuZXcpOgogICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiSWRlbXBvdGVuY3kgZmFpbGVkOiAlcyIgJSBmaWxlcGF0aCkKIAogCiBjbGFzcyBUZXN0TGl0ZXJhbHMoR3JhbW1hclRlc3QpOgogCisgICAgZGVmIHZhbGlkYXRlKHNlbGYsIHMpOgorICAgICAgICBkcml2ZXIucGFyc2Vfc3RyaW5nKHN1cHBvcnQuZGVkZW50KHMpICsgIlxuXG4iKQorCiAgICAgZGVmIHRlc3RfbXVsdGlsaW5lX2J5dGVzX2xpdGVyYWxzKHNlbGYpOgogICAgICAgICBzID0gIiIiCiAgICAgICAgICAgICBtZDV0ZXN0KGIiXHhhYSIgKiA4MCwKQEAgLTE4NSwxMCArMTk3LDEwIEBACiAgICAgICAgIHNlbGYudmFsaWRhdGUocykKIAogCi1kZWYgZGlmZihmbiwgdHJlZSk6CitkZWYgZGlmZihmbiwgcmVzdWx0KToKICAgICBmID0gb3BlbigiQCIsICJ3IikKICAgICB0cnk6Ci0gICAgICAgIGYud3JpdGUoc3RyKHRyZWUpKQorICAgICAgICBmLndyaXRlKHJlc3VsdCkKICAgICBmaW5hbGx5OgogICAgICAgICBmLmNsb3NlKCkKICAgICB0cnk6CmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9yZWZhY3Rvci5weQppbmRleCA1YTQ5ZjAxLi5lNTVmNTU1IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5CisrKyBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcmVmYWN0b3IucHkKQEAgLTE0LDcgKzE0LDggQEAKIGZyb20gLiBpbXBvcnQgc3VwcG9ydAogCiAKLUZJWEVSX0RJUiA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAiZGF0YS9maXhlcnMiKQorVEVTVF9EQVRBX0RJUiA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAiZGF0YSIpCitGSVhFUl9ESVIgPSBvcy5wYXRoLmpvaW4oVEVTVF9EQVRBX0RJUiwgImZpeGVycyIpCiAKIHN5cy5wYXRoLmFwcGVuZChGSVhFUl9ESVIpCiB0cnk6CkBAIC0yMiw2ICsyMyw4IEBACiBmaW5hbGx5OgogICAgIHN5cy5wYXRoLnBvcCgpCiAKK18yVE8zX0ZJWEVSUyA9IHJlZmFjdG9yLmdldF9maXhlcnNfZnJvbV9wYWNrYWdlKCJsaWIydG8zLmZpeGVzIikKKwogY2xhc3MgVGVzdFJlZmFjdG9yaW5nVG9vbCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgc2V0VXAoc2VsZik6CkBAIC0xMjEsMTkgKzEyNCw0MCBAQAogK2RlZiBjaGVlc2UoKTogcGFzcyIiIi5zcGxpdGxpbmVzKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWZmX2xpbmVzWzotMV0sIGV4cGVjdGVkKQogCi0gICAgZGVmIHRlc3RfcmVmYWN0b3JfZmlsZShzZWxmKToKLSAgICAgICAgdGVzdF9maWxlID0gb3MucGF0aC5qb2luKEZJWEVSX0RJUiwgInBhcnJvdF9leGFtcGxlLnB5IikKLSAgICAgICAgb2xkX2NvbnRlbnRzID0gb3Blbih0ZXN0X2ZpbGUsICJyIikucmVhZCgpCi0gICAgICAgIHJ0ID0gc2VsZi5ydCgpCisgICAgZGVmIGNoZWNrX2ZpbGVfcmVmYWN0b3Jpbmcoc2VsZiwgdGVzdF9maWxlLCBmaXhlcnM9XzJUTzNfRklYRVJTKToKKyAgICAgICAgZGVmIHJlYWRfZmlsZSgpOgorICAgICAgICAgICAgd2l0aCBvcGVuKHRlc3RfZmlsZSwgInJiIikgYXMgZnA6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZwLnJlYWQoKQorICAgICAgICBvbGRfY29udGVudHMgPSByZWFkX2ZpbGUoKQorICAgICAgICBydCA9IHNlbGYucnQoZml4ZXJzPWZpeGVycykKIAogICAgICAgICBydC5yZWZhY3Rvcl9maWxlKHRlc3RfZmlsZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvbGRfY29udGVudHMsIG9wZW4odGVzdF9maWxlLCAiciIpLnJlYWQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvbGRfY29udGVudHMsIHJlYWRfZmlsZSgpKQogCi0gICAgICAgIHJ0LnJlZmFjdG9yX2ZpbGUodGVzdF9maWxlLCBUcnVlKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG9sZF9jb250ZW50cywgb3Blbih0ZXN0X2ZpbGUsICJyIikucmVhZCgpKQorICAgICAgICAgICAgcnQucmVmYWN0b3JfZmlsZSh0ZXN0X2ZpbGUsIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG9sZF9jb250ZW50cywgcmVhZF9maWxlKCkpCiAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBvcGVuKHRlc3RfZmlsZSwgInciKS53cml0ZShvbGRfY29udGVudHMpCisgICAgICAgICAgICB3aXRoIG9wZW4odGVzdF9maWxlLCAid2IiKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBmcC53cml0ZShvbGRfY29udGVudHMpCisKKyAgICBkZWYgdGVzdF9yZWZhY3Rvcl9maWxlKHNlbGYpOgorICAgICAgICB0ZXN0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oRklYRVJfRElSLCAicGFycm90X2V4YW1wbGUucHkiKQorICAgICAgICBzZWxmLmNoZWNrX2ZpbGVfcmVmYWN0b3JpbmcodGVzdF9maWxlLCBfREVGQVVMVF9GSVhFUlMpCisKKyAgICBkZWYgdGVzdF9maWxlX2VuY29kaW5nKHNlbGYpOgorICAgICAgICBmbiA9IG9zLnBhdGguam9pbihURVNUX0RBVEFfRElSLCAiZGlmZmVyZW50X2VuY29kaW5nLnB5IikKKyAgICAgICAgc2VsZi5jaGVja19maWxlX3JlZmFjdG9yaW5nKGZuKQorCisgICAgZGVmIHRlc3RfY3JsZl9uZXdsaW5lcyhzZWxmKToKKyAgICAgICAgb2xkX3NlcCA9IG9zLmxpbmVzZXAKKyAgICAgICAgb3MubGluZXNlcCA9ICJcclxuIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmbiA9IG9zLnBhdGguam9pbihURVNUX0RBVEFfRElSLCAiY3JsZi5weSIpCisgICAgICAgICAgICBmaXhlcyA9IHJlZmFjdG9yLmdldF9maXhlcnNfZnJvbV9wYWNrYWdlKCJsaWIydG8zLmZpeGVzIikKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZmlsZV9yZWZhY3RvcmluZyhmbiwgZml4ZXMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5saW5lc2VwID0gb2xkX3NlcAogCiAgICAgZGVmIHRlc3RfcmVmYWN0b3JfZG9jc3RyaW5nKHNlbGYpOgogICAgICAgICBydCA9IHNlbGYucnQoKQo=