ZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2luZmluaXRlX3JlbG9hZC5weSBiL0xpYi90ZXN0L2luZmluaXRlX3JlbG9hZC5weQppbmRleCA4NDFjY2FkLi5iZmJlYzkxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9pbmZpbml0ZV9yZWxvYWQucHkKKysrIGIvTGliL3Rlc3QvaW5maW5pdGVfcmVsb2FkLnB5CkBAIC0zLDYgKzMsNSBAQAogIyAgcmVsb2FkKClpbmcuIFRoaXMgbW9kdWxlIGlzIGltcG9ydGVkIGJ5IHRlc3RfaW1wb3J0LnB5OnRlc3RfaW5maW5pdGVfcmVsb2FkCiAjICB0byBtYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGhhcHBlbiBhbnkgbW9yZS4KIAotaW1wb3J0IGltcAogaW1wb3J0IGluZmluaXRlX3JlbG9hZAotaW1wLnJlbG9hZChpbmZpbml0ZV9yZWxvYWQpCityZWxvYWQoaW5maW5pdGVfcmVsb2FkKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvaW5zcGVjdF9mb2RkZXIucHkgYi9MaWIvdGVzdC9pbnNwZWN0X2ZvZGRlci5weQppbmRleCBhZmRlMmUyLi44MjM1NTliIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9pbnNwZWN0X2ZvZGRlci5weQorKysgYi9MaWIvdGVzdC9pbnNwZWN0X2ZvZGRlci5weQpAQCAtMTUsNyArMTUsNyBAQAogICAgIGZyID0gaW5zcGVjdC5jdXJyZW50ZnJhbWUoKQogICAgIHN0ID0gaW5zcGVjdC5zdGFjaygpCiAgICAgcCA9IHgKLSAgICBxID0geSAvLyAwCisgICAgcSA9IHkgLyAwCiAKICMgbGluZSAyMAogY2xhc3MgU3R1cGlkR2l0OgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlzdF90ZXN0cy5weSBiL0xpYi90ZXN0L2xpc3RfdGVzdHMucHkKaW5kZXggNGZjOTllMC4uYzlhYTMxNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvbGlzdF90ZXN0cy5weQorKysgYi9MaWIvdGVzdC9saXN0X3Rlc3RzLnB5CkBAIC00LDcgKzQsNyBAQAogCiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKLWltcG9ydCB3YXJuaW5ncworCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCwgc2VxX3Rlc3RzCiAKIGNsYXNzIENvbW1vblRlc3Qoc2VxX3Rlc3RzLkNvbW1vblRlc3QpOgpAQCAtMzYsOSArMzYsNyBAQAogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGEwKSwgc3RyKGwwKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGEwKSwgcmVwcihsMCkpCi0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnYGEyYCcpLCBldmFsKCdgbDJgJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYGEyYCwgYGwyYCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoYTIpLCAiWzAsIDEsIDJdIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGEyKSwgIlswLCAxLCAyXSIpCiAKQEAgLTQyMywxMyArNDIxLDYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1LnJldmVyc2UsIDQyKQogCiAgICAgZGVmIHRlc3Rfc29ydChzZWxmKToKLSAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZwotICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0aGUgY21wIGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICAgICAgc2VsZi5fdGVzdF9zb3J0KCkKLQotICAgIGRlZiBfdGVzdF9zb3J0KHNlbGYpOgogICAgICAgICB1ID0gc2VsZi50eXBlMnRlc3QoWzEsIDBdKQogICAgICAgICB1LnNvcnQoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUsIFswLCAxXSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L21hcHBpbmdfdGVzdHMucHkgYi9MaWIvdGVzdC9tYXBwaW5nX3Rlc3RzLnB5CmluZGV4IGQxN2M5NDguLjdlYzRiYjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L21hcHBpbmdfdGVzdHMucHkKKysrIGIvTGliL3Rlc3QvbWFwcGluZ190ZXN0cy5weQpAQCAtMSw3ICsxLDYgQEAKICMgdGVzdHMgY29tbW9uIHRvIGRpY3QgYW5kIFVzZXJEaWN0CiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBVc2VyRGljdAotaW1wb3J0IHRlc3Rfc3VwcG9ydAogCiAKIGNsYXNzIEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbCh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC01NSwxOCArNTQsMTMgQEAKICAgICAgICAgI2xlbgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwKSwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIGxlbihzZWxmLnJlZmVyZW5jZSkpCi0gICAgICAgICNpbgorICAgICAgICAjaGFzX2tleQogICAgICAgICBmb3IgayBpbiBzZWxmLnJlZmVyZW5jZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmhhc19rZXkoaykpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoayBpbiBkKQogICAgICAgICBmb3IgayBpbiBzZWxmLm90aGVyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkLmhhc19rZXkoaykpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGsgaW4gZCkKLSAgICAgICAgI2hhc19rZXkKLSAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZwotICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygpOgotICAgICAgICAgICAgZm9yIGsgaW4gc2VsZi5yZWZlcmVuY2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuaGFzX2tleShrKSkKLSAgICAgICAgICAgIGZvciBrIGluIHNlbGYub3RoZXI6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkLmhhc19rZXkoaykpCiAgICAgICAgICNjbXAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAocCxwKSwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoZCxkKSwgMCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5IGIvTGliL3Rlc3QvcmVncnRlc3QucHkKaW5kZXggNTZjNTNkYS4uZmQ2Y2FmYyAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvcmVncnRlc3QucHkKKysrIGIvTGliL3Rlc3QvcmVncnRlc3QucHkKQEAgLTE1MCw2ICsxNTAsNyBAQAogaW1wb3J0IGNTdHJpbmdJTwogaW1wb3J0IGdldG9wdAogaW1wb3J0IGl0ZXJ0b29scworaW1wb3J0IGpzb24KIGltcG9ydCBvcwogaW1wb3J0IHJhbmRvbQogaW1wb3J0IHJlCkBAIC0xNTksMTMgKzE2MCwxNSBAQAogaW1wb3J0IHdhcm5pbmdzCiBpbXBvcnQgdW5pdHRlc3QKIAotd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmdzCi0gICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0dXBsZSBwYXJhbWV0ZXIgdW5wYWNraW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFzIGJlZW4gcmVtb3ZlZCIsIFN5bnRheFdhcm5pbmcpCi0gICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJhc3NpZ25tZW50IHRvIFRydWUgb3IgRmFsc2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyBmb3JiaWRkZW4iLCBTeW50YXhXYXJuaW5nKQotICAgIGltcG9ydCBqc29uCisjIEkgc2VlIG5vIG90aGVyIHdheSB0byBzdXBwcmVzcyB0aGVzZSB3YXJuaW5nczsKKyMgcHV0dGluZyB0aGVtIGluIHRlc3RfZ3JhbW1hci5weSBoYXMgbm8gZWZmZWN0Ogord2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJoZXgvb2N0IGNvbnN0YW50cyIsIEZ1dHVyZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAiLip0ZXN0LnRlc3RfZ3JhbW1hciQiKQoraWYgc3lzLm1heGludCA+IDB4N2ZmZmZmZmY6CisgICAgIyBBbHNvIHN1cHByZXNzIHRoZW0gaW4gPHN0cmluZz4sIGJlY2F1c2UgZm9yIDY0LWJpdCBwbGF0Zm9ybXMsCisgICAgIyB0aGF0J3Mgd2hlcmUgdGVzdF9ncmFtbWFyLnB5IGhpZGVzIHRoZW0uCisgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJoZXgvb2N0IGNvbnN0YW50cyIsIEZ1dHVyZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdHJpbmc+IikKIAogIyBJZ25vcmUgSW1wb3J0V2FybmluZ3MgdGhhdCBvbmx5IG9jY3VyIGluIHRoZSBzb3VyY2UgdHJlZSwKICMgKGJlY2F1c2Ugb2YgbW9kdWxlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgc291cmNlLWRpcmVjdG9yaWVzIGluIE1vZHVsZXMvKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvc2VxX3Rlc3RzLnB5IGIvTGliL3Rlc3Qvc2VxX3Rlc3RzLnB5CmluZGV4IGY2YjE1YmYuLjE0MzAzYWEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3NlcV90ZXN0cy5weQorKysgYi9MaWIvdGVzdC9zZXFfdGVzdHMucHkKQEAgLTQsNyArNCw2IEBACiAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHN5cwotaW1wb3J0IHRlc3Rfc3VwcG9ydAogCiAjIFZhcmlvdXMgaXRlcmFibGVzCiAjIFRoaXMgaXMgdXNlZCBmb3IgY2hlY2tpbmcgdGhlIGNvbnN0cnVjdG9yIChoZXJlIGFuZCBpbiB0ZXN0X2RlcXVlLnB5KQpAQCAtMTk3LDkgKzE5Niw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVsgLXBvdygyLDEyOEwpOiAzIF0sIHNlbGYudHlwZTJ0ZXN0KFswLDEsMl0pKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbIDM6IHBvdygyLDE0NUwpIF0sIHNlbGYudHlwZTJ0ZXN0KFszLDRdKSkKIAotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUuX19nZXRzbGljZV9fKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUuX19nZXRzbGljZV9fKQogCiAgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZik6CiAgICAgICAgIHUgPSBzZWxmLnR5cGUydGVzdChbMCwgMSwgMl0pCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X1N0cmluZ0lPLnB5IGIvTGliL3Rlc3QvdGVzdF9TdHJpbmdJTy5weQppbmRleCBlNDg0Zjc5Li5kMTAyNTVkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X1N0cmluZ0lPLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfU3RyaW5nSU8ucHkKQEAgLTEzNywxMCArMTM3LDEyIEBACiAKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdFN0cmluZ0lPLCBUZXN0Y1N0cmluZ0lPKQotICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygpOgotICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RCdWZmZXJTdHJpbmdJTywgVGVzdEJ1ZmZlcmNTdHJpbmdJTykKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBUZXN0U3RyaW5nSU8sCisgICAgICAgIFRlc3RjU3RyaW5nSU8sCisgICAgICAgIFRlc3RCdWZmZXJTdHJpbmdJTywKKyAgICAgICAgVGVzdEJ1ZmZlcmNTdHJpbmdJTworICAgICkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hbnlkYm0ucHkgYi9MaWIvdGVzdC90ZXN0X2FueWRibS5weQppbmRleCBhMDFkZDBiLi4wY2RjMmMzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2FueWRibS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FueWRibS5weQpAQCAtNSwxNCArNSwxMiBAQAogCiBpbXBvcnQgb3MKIGltcG9ydCB1bml0dGVzdAoraW1wb3J0IGFueWRibQogaW1wb3J0IGdsb2IKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKIF9mbmFtZSA9IHRlc3Rfc3VwcG9ydC5URVNURk4KIAotIyBTaWxlbmNlIFB5M2sgd2FybmluZwotYW55ZGJtID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2FueWRibScsIGRlcHJlY2F0ZWQ9VHJ1ZSkKLQogZGVmIF9kZWxldGVfZmlsZXMoKToKICAgICAjIHdlIGRvbid0IGtub3cgdGhlIHByZWNpc2UgbmFtZSB0aGUgdW5kZXJseWluZyBkYXRhYmFzZSB1c2VzCiAgICAgIyBzbyB3ZSB1c2UgZ2xvYiB0byBsb2NhdGUgYWxsIG5hbWVzCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2FycmF5LnB5IGIvTGliL3Rlc3QvdGVzdF9hcnJheS5weQppbmRleCAwMDQ1MDFhLi42M2Y3MDgzIDEwMDc1NQotLS0gYS9MaWIvdGVzdC90ZXN0X2FycmF5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkKQEAgLTc0OSw5ICs3NDksNyBAQAogCiAgICAgZGVmIHRlc3RfYnVmZmVyKHNlbGYpOgogICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICBiID0gYnVmZmVyKGEpCisgICAgICAgIGIgPSBidWZmZXIoYSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzBdLCBhLnRvc3RyaW5nKClbMF0pCiAKICAgICBkZWYgdGVzdF93ZWFrcmVmKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hc3QucHkgYi9MaWIvdGVzdC90ZXN0X2FzdC5weQppbmRleCBmMTZkYTE1Li5lNTkyMDMyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2FzdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FzdC5weQpAQCAtMSw3ICsxLDYgQEAKIGltcG9ydCBzeXMsIGl0ZXJ0b29scywgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBpbXBvcnQgYXN0Ci1pbXBvcnQgd2FybmluZ3MKIAogZGVmIHRvX3R1cGxlKHQpOgogICAgIGlmIHQgaXMgTm9uZSBvciBpc2luc3RhbmNlKHQsIChiYXNlc3RyaW5nLCBpbnQsIGxvbmcsIGNvbXBsZXgpKToKQEAgLTMwMywxMSArMzAyLDcgQEAKIAogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiYmFja3F1b3RlIG5vdCBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nKQotICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEFTVF9UZXN0cywgQVNUSGVscGVyc19UZXN0KQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQVNUX1Rlc3RzLCBBU1RIZWxwZXJzX1Rlc3QpCiAKIGRlZiBtYWluKCk6CiAgICAgaWYgX19uYW1lX18gIT0gJ19fbWFpbl9fJzoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5IGIvTGliL3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHkKaW5kZXggNTFkYjI4Yi4uYTViN2NjNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHkKQEAgLTIsNyArMiw2IEBACiAKIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgd2FybmluZ3MKIAogCiBjbGFzcyBBdWdBc3NpZ25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTMyNSwxMSArMzI0LDcgQEAKICcnJy5zcGxpdGxpbmVzKCkpCiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJjbGFzc2ljIGludCBkaXZpc2lvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgcnVuX3VuaXR0ZXN0KEF1Z0Fzc2lnblRlc3QpCisgICAgcnVuX3VuaXR0ZXN0KEF1Z0Fzc2lnblRlc3QpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5IGIvTGliL3Rlc3QvdGVzdF9iaWdtZW0ucHkKaW5kZXggYTNhZGFmMy4uY2IxYjJmNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9iaWdtZW0ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9iaWdtZW0ucHkKQEAgLTk3LDIxICs5NywyMSBAQAogICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmLCBzaXplKToKICAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfZW5jb2RlX3Rlc3Qoc2l6ZSwgJ3V0Zi04JykKIAotICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHIC8vIDYgKyAyLCBtZW11c2U9MikKKyAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV80RyAvIDYgKyAyLCBtZW11c2U9MikKICAgICBkZWYgdGVzdF9lbmNvZGVfcmF3X3VuaWNvZGVfZXNjYXBlKHNlbGYsIHNpemUpOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5iYXNpY19lbmNvZGVfdGVzdChzaXplLCAncmF3X3VuaWNvZGVfZXNjYXBlJykKICAgICAgICAgZXhjZXB0IE1lbW9yeUVycm9yOgogICAgICAgICAgICAgcGFzcyAjIGFjY2VwdGFibGUgb24gMzItYml0CiAKLSAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV80RyAvLyA1ICsgNzAsIG1lbXVzZT0zKQorICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHIC8gNSArIDcwLCBtZW11c2U9MykKICAgICBkZWYgdGVzdF9lbmNvZGVfdXRmNyhzZWxmLCBzaXplKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfZW5jb2RlX3Rlc3Qoc2l6ZSwgJ3V0ZjcnKQogICAgICAgICBleGNlcHQgTWVtb3J5RXJyb3I6CiAgICAgICAgICAgICBwYXNzICMgYWNjZXB0YWJsZSBvbiAzMi1iaXQKIAotICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHIC8vIDQgKyA1LCBtZW11c2U9NikKKyAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV80RyAvIDQgKyA1LCBtZW11c2U9NikKICAgICBkZWYgdGVzdF9lbmNvZGVfdXRmMzIoc2VsZiwgc2l6ZSk6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX2VuY29kZV90ZXN0KHNpemUsICd1dGYzMicsIGV4cGVjdGVkc2l6ZT00KnNpemUrNCkKQEAgLTEyMiw3ICsxMjIsNyBAQAogICAgIGRlZiB0ZXN0X2RlY29kZWFzY2lpKHNlbGYsIHNpemUpOgogICAgICAgICByZXR1cm4gc2VsZi5iYXNpY19lbmNvZGVfdGVzdChzaXplLCAnYXNjaWknLCBjPSdBJykKIAotICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHIC8vIDUsIG1lbXVzZT02KzIpCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fNEcgLyA1LCBtZW11c2U9NisyKQogICAgIGRlZiB0ZXN0X3VuaWNvZGVfcmVwcl9vZmx3KHNlbGYsIHNpemUpOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzID0gdSJcdUFBQUEiKnNpemUKQEAgLTUxNiw3ICs1MTYsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLmNvdW50KCdcXCcpLCBzaXplKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLmNvdW50KCcwJyksIHNpemUgKiAyKQogCi0gICAgQGJpZ21lbXRlc3QobWluc2l6ZT0yKiozMiAvLyA1LCBtZW11c2U9NisyKQorICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9MioqMzIgLyA1LCBtZW11c2U9NisyKQogICAgIGRlZiB0ZXN0X3VuaWNvZGVfcmVwcihzZWxmLCBzaXplKToKICAgICAgICAgcyA9IHUiXHVBQUFBIiAqIHNpemUKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXByKHMpKSA+IHNpemUpCkBAIC0xMDUzLDkgKzEwNTMsNyBAQAogICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzFHLCBtZW11c2U9NCkKICAgICBkZWYgdGVzdF9yZXBlYXQoc2VsZiwgc2l6ZSk6CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICAgICAgYiA9IGJ1ZmZlcigiQUFBQSIpKnNpemUKKyAgICAgICAgICAgIGIgPSBidWZmZXIoIkFBQUEiKSpzaXplCiAgICAgICAgIGV4Y2VwdCBNZW1vcnlFcnJvcjoKICAgICAgICAgICAgIHBhc3MgIyBhY2NlcHRhYmxlIG9uIDMyLWJpdAogICAgICAgICBlbHNlOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9iaW5hc2NpaS5weSBiL0xpYi90ZXN0L3Rlc3RfYmluYXNjaWkucHkKaW5kZXggNmExZjk3Mi4uYzUzMWM2NSAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvdGVzdF9iaW5hc2NpaS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2JpbmFzY2lpLnB5CkBAIC0yNiwxMCArMjYsMTAgQEAKICAgICAgICAgICAgICAgICBwcmVmaXhlcy5leHRlbmQoWyJjcmNfIiwgInJsZWNvZGVfIiwgInJsZWRlY29kZV8iXSkKICAgICAgICAgICAgIGZvciBwcmVmaXggaW4gcHJlZml4ZXM6CiAgICAgICAgICAgICAgICAgbmFtZSA9IHByZWZpeCArIHN1ZmZpeAotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGdldGF0dHIoYmluYXNjaWksIG5hbWUpLCAnX19jYWxsX18nKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2FsbGFibGUoZ2V0YXR0cihiaW5hc2NpaSwgbmFtZSkpKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXR0cihiaW5hc2NpaSwgbmFtZSkpCiAgICAgICAgIGZvciBuYW1lIGluICgiaGV4bGlmeSIsICJ1bmhleGxpZnkiKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGdldGF0dHIoYmluYXNjaWksIG5hbWUpLCAnX19jYWxsX18nKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjYWxsYWJsZShnZXRhdHRyKGJpbmFzY2lpLCBuYW1lKSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGF0dHIoYmluYXNjaWksIG5hbWUpKQogCiAgICAgZGVmIHRlc3RfYmFzZTY0dmFsaWQoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Jpbm9wLnB5IGIvTGliL3Rlc3QvdGVzdF9iaW5vcC5weQppbmRleCBiMWVmNjI2Li44YWU4ZjQyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Jpbm9wLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYmlub3AucHkKQEAgLTIwNyw5ICsyMDcsNiBAQAogICAgICAgICAiIiJDb21wYXJlIHR3byBSYXRzIGZvciBpbmVxdWFsaXR5LiIiIgogICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKIAotICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICBfX2hhc2hfXyA9IE5vbmUKLQogY2xhc3MgUmF0VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICIiIlVuaXQgdGVzdHMgZm9yIFJhdCBjbGFzcyBhbmQgaXRzIHN1cHBvcnQgdXRpbGl0aWVzLiIiIgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Jvb2wucHkgYi9MaWIvdGVzdC90ZXN0X2Jvb2wucHkKaW5kZXggODA1ZDc1OC4uMmE5ZWY1ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ib29sLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYm9vbC5weQpAQCAtOTEsMTAgKzkxLDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UqMSwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRJc05vdChGYWxzZSoxLCBGYWxzZSkKIAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUvLzEsIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoVHJ1ZS8vMSwgVHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZS8vMSwgMCkKLSAgICAgICAgc2VsZi5hc3NlcnRJc05vdChGYWxzZS8vMSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZS8xLCAxKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KFRydWUvMSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZS8xLCAwKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KEZhbHNlLzEsIEZhbHNlKQogCiAgICAgICAgIGZvciBiIGluIEZhbHNlLCBUcnVlOgogICAgICAgICAgICAgZm9yIGkgaW4gMCwgMSwgMjoKQEAgLTE2OCw4ICsxNjgsOCBAQAogICAgICAgICBzZWxmLmFzc2VydElzKGhhc2F0dHIoW10sICJ3b2JibGUiKSwgRmFsc2UpCiAKICAgICBkZWYgdGVzdF9jYWxsYWJsZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIobGVuLCAnX19jYWxsX18nKSwgVHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKDEsICdfX2NhbGxfXycpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhjYWxsYWJsZShsZW4pLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKGNhbGxhYmxlKDEpLCBGYWxzZSkKIAogICAgIGRlZiB0ZXN0X2lzaW5zdGFuY2Uoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0SXMoaXNpbnN0YW5jZShUcnVlLCBib29sKSwgVHJ1ZSkKQEAgLTE4NCwxMiArMTg0LDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRJcyhpc3N1YmNsYXNzKGludCwgYm9vbCksIEZhbHNlKQogCiAgICAgZGVmIHRlc3RfaGFza2V5KHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydElzKDEgaW4ge30sIEZhbHNlKQotICAgICAgICBzZWxmLmFzc2VydElzKDEgaW4gezE6MX0sIFRydWUpCi0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoe30uaGFzX2tleSgxKSwgRmFsc2UpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKHsxOjF9Lmhhc19rZXkoMSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoe30uaGFzX2tleSgxKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoezE6MX0uaGFzX2tleSgxKSwgVHJ1ZSkKIAogICAgIGRlZiB0ZXN0X3N0cmluZyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRJcygieHl6Ii5lbmRzd2l0aCgieiIpLCBUcnVlKQpAQCAtMjYxLDEwICsyNTcsOCBAQAogICAgICAgICBpbXBvcnQgb3BlcmF0b3IKICAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci50cnV0aCgwKSwgRmFsc2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IudHJ1dGgoMSksIFRydWUpCi0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IuaXNDYWxsYWJsZSgwKSwgRmFsc2UpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLmlzQ2FsbGFibGUobGVuKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci5pc0NhbGxhYmxlKDApLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci5pc0NhbGxhYmxlKGxlbiksIFRydWUpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IuaXNOdW1iZXJUeXBlKE5vbmUpLCBGYWxzZSkKICAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci5pc051bWJlclR5cGUoMCksIFRydWUpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3Iubm90XygxKSwgRmFsc2UpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2J1ZmZlci5weSBiL0xpYi90ZXN0L3Rlc3RfYnVmZmVyLnB5CmluZGV4IGFjODllMDUuLjNiZWRlODggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnVmZmVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYnVmZmVyLnB5CkBAIC02LDcgKzYsNiBAQAogCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Ci1pbXBvcnQgd2FybmluZ3MKIAogY2xhc3MgQnVmZmVyVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC0yNCwxMSArMjMsNyBAQAogCiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJidWZmZXIuLiBub3Qgc3VwcG9ydGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEJ1ZmZlclRlc3RzKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQnVmZmVyVGVzdHMpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weSBiL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weQppbmRleCBhYzViNzU0Li5mMjBkNTQzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5CkBAIC03LDYgKzcsMTAgQEAKIGZyb20gb3BlcmF0b3IgaW1wb3J0IG5lZwogCiBpbXBvcnQgc3lzLCB3YXJuaW5ncywgY1N0cmluZ0lPLCByYW5kb20sIGZyYWN0aW9ucywgVXNlckRpY3QKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiaGV4Li4vb2N0Li4gb2YgbmVnYXRpdmUgaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZ1dHVyZVdhcm5pbmcsIF9fbmFtZV9fKQord2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgInVuaXR0ZXN0IikKIAogIyBjb3VudCB0aGUgbnVtYmVyIG9mIHRlc3QgcnVucy4KICMgdXNlZCB0byBza2lwIHJ1bm5pbmcgdGVzdF9leGVjZmlsZSgpIG11bHRpcGxlIHRpbWVzCkBAIC00MTUsMTEgKzQxOSw3IEBACiAgICAgZi53cml0ZSgneiA9IHorMVxuJykKICAgICBmLndyaXRlKCd6ID0geioyXG4nKQogICAgIGYuY2xvc2UoKQotICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZwotICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgIi4rIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICBleGVjZmlsZShURVNURk4pCisgICAgZXhlY2ZpbGUoVEVTVEZOKQogCiAgICAgZGVmIHRlc3RfZXhlY2ZpbGUoc2VsZik6CiAgICAgICAgIGdsb2JhbCBudW1ydW5zCkBAIC0xNTQyLDMwICsxNTQyLDE3IEBACiAgICAgICAgIGRhdGEgPSAnVGhlIHF1aWNrIEJyb3duIGZveCBKdW1wZWQgb3ZlciBUaGUgbGF6eSBEb2cnLnNwbGl0KCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzb3J0ZWQsIGRhdGEsIE5vbmUsIGxhbWJkYSB4LHk6IDApCiAKLWRlZiBfcnVuX3VuaXR0ZXN0KCphcmdzKToKLSAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmdzCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiLisgbm90IHN1cHBvcnRlZCBpbiAzLngiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiLisgaXMgcmVuYW1lZCB0byBpbXAucmVsb2FkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgImludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCBmbG9hdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJjbGFzc2ljIGludCBkaXZpc2lvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgcnVuX3VuaXR0ZXN0KCphcmdzKQotCiBkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CiAgICAgdGVzdF9jbGFzc2VzID0gKEJ1aWx0aW5UZXN0LCBUZXN0U29ydGVkKQogCi0gICAgX3J1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorICAgIHJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQogCiAgICAgIyB2ZXJpZnkgcmVmZXJlbmNlIGNvdW50aW5nCiAgICAgaWYgdmVyYm9zZSBhbmQgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CiAgICAgICAgIGltcG9ydCBnYwogICAgICAgICBjb3VudHMgPSBbTm9uZV0gKiA1CiAgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oY291bnRzKSk6Ci0gICAgICAgICAgICBfcnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisgICAgICAgICAgICBydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQogICAgICAgICAgICAgY291bnRzW2ldID0gc3lzLmdldHRvdGFscmVmY291bnQoKQogICAgICAgICBwcmludCBjb3VudHMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY2FsbC5weSBiL0xpYi90ZXN0L3Rlc3RfY2FsbC5weQppbmRleCAzYmJjMDgxLi5mM2M3YzhjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NhbGwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jYWxsLnB5CkBAIC0xMiw5ICsxMiw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwge30uaGFzX2tleSkKIAogICAgIGRlZiB0ZXN0X3ZhcmFyZ3MxKHNlbGYpOgotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICB7fS5oYXNfa2V5KDApCisgICAgICAgIHt9Lmhhc19rZXkoMCkKIAogICAgIGRlZiB0ZXN0X3ZhcmFyZ3MyKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHt9Lmhhc19rZXksIDAsIDEpCkBAIC0yNiwxNSArMjQsMTEgQEAKICAgICAgICAgICAgIHBhc3MKIAogICAgIGRlZiB0ZXN0X3ZhcmFyZ3MxX2V4dChzZWxmKToKLSAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZwotICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygpOgotICAgICAgICAgICAge30uaGFzX2tleSgqKDAsKSkKKyAgICAgICAge30uaGFzX2tleSgqKDAsKSkKIAogICAgIGRlZiB0ZXN0X3ZhcmFyZ3MyX2V4dChzZWxmKToKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZwotICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgICAgICB7fS5oYXNfa2V5KCooMSwgMikpCisgICAgICAgICAgICB7fS5oYXNfa2V5KCooMSwgMikpCiAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsc2U6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NhcGkucHkgYi9MaWIvdGVzdC90ZXN0X2NhcGkucHkKaW5kZXggYzMxM2RjZi4uNGRjMzEwNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jYXBpLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2FwaS5weQpAQCAtNTUsNyArNTUsNyBAQAogICAgICAgICBjb250ZXh0ID0gZm9vKCkKICAgICAgICAgY29udGV4dC5sID0gW10KICAgICAgICAgY29udGV4dC5uID0gMiAjc3VibWl0cyBwZXIgdGhyZWFkCi0gICAgICAgIGNvbnRleHQublRocmVhZHMgPSBuIC8vIGNvbnRleHQubgorICAgICAgICBjb250ZXh0Lm5UaHJlYWRzID0gbiAvIGNvbnRleHQubgogICAgICAgICBjb250ZXh0Lm5GaW5pc2hlZCA9IDAKICAgICAgICAgY29udGV4dC5sb2NrID0gdGhyZWFkaW5nLkxvY2soKQogICAgICAgICBjb250ZXh0LmV2ZW50ID0gdGhyZWFkaW5nLkV2ZW50KCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY2dpLnB5IGIvTGliL3Rlc3QvdGVzdF9jZ2kucHkKaW5kZXggNDRlYmUxMC4uYWEyNmJiNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jZ2kucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jZ2kucHkKQEAgLTEwNCw3ICsxMDQsNyBAQAogCiBkZWYgbm9ybShsaXN0KToKICAgICBpZiB0eXBlKGxpc3QpID09IHR5cGUoW10pOgotICAgICAgICBsaXN0LnNvcnQoa2V5PXN0cikKKyAgICAgICAgbGlzdC5zb3J0KCkKICAgICByZXR1cm4gbGlzdAogCiBkZWYgZmlyc3RfZWx0cyhsaXN0KToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY2xhc3MucHkgYi9MaWIvdGVzdC90ZXN0X2NsYXNzLnB5CmluZGV4IDE5NGI0NzMuLmZjNjFkMjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2xhc3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jbGFzcy5weQpAQCAtMSw3ICsxLDcgQEAKICJUZXN0IHRoZSBmdW5jdGlvbmFsaXR5IG9mIFB5dGhvbiBjbGFzc2VzIGltcGxlbWVudGluZyBvcGVyYXRvcnMuIgogCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB3YXJuaW5ncworCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogCiB0ZXN0bWV0aHMgPSBbCkBAIC00MDcsNyArNDA3LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCdfX2NtcF9fJywgKHRlc3RtZSwgMSkpXSkKIAogICAgICAgICBjYWxsTHN0WzpdID0gW10KLSAgICAgICAgZXZhbCgndGVzdG1lIDw+IDEnKSAgIyBYWFgga2lsbCB0aGlzIGluIHB5M2sKKyAgICAgICAgdGVzdG1lIDw+IDEgICMgWFhYIGtpbGwgdGhpcyBpbiBweTNrCiAgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgnX19jbXBfXycsICh0ZXN0bWUsIDEpKV0pCiAKICAgICAgICAgY2FsbExzdFs6XSA9IFtdCkBAIC00MjcsNyArNDI3LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCdfX2NtcF9fJywgKDEsIHRlc3RtZSkpXSkKIAogICAgICAgICBjYWxsTHN0WzpdID0gW10KLSAgICAgICAgZXZhbCgnMSA8PiB0ZXN0bWUnKQorICAgICAgICAxIDw+IHRlc3RtZQogICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoJ19fY21wX18nLCAoMSwgdGVzdG1lKSldKQogCiAgICAgICAgIGNhbGxMc3RbOl0gPSBbXQpAQCAtNjE2LDE1ICs2MTYsNyBAQAogICAgICAgICBoYXNoKGEuZikKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZ3MKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIuK3NsaWNlX18gaGFzIGJlZW4gcmVtb3ZlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJjbGFzc2ljIGludCBkaXZpc2lvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICI8PiBub3Qgc3VwcG9ydGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENsYXNzVGVzdHMpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChDbGFzc1Rlc3RzKQogCiBpZiBfX25hbWVfXz09J19fbWFpbl9fJzoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2VyY2lvbi5weSBiL0xpYi90ZXN0L3Rlc3RfY29lcmNpb24ucHkKaW5kZXggYzZhMWMxNy4uNjdkMTlhNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2VyY2lvbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZXJjaW9uLnB5CkBAIC0yMjMsMTEgKzIyMyw4IEBACiAgICAgICAgICAgICBpbmZpeF9yZXN1bHRzW2tleV0gPSByZXMKIAogCi13aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZwotICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiY2xhc3NpYyBpbnQgZGl2aXNpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLSAgICBwcm9jZXNzX2luZml4X3Jlc3VsdHMoKQorCitwcm9jZXNzX2luZml4X3Jlc3VsdHMoKQogIyBub3cgaW5maXhfcmVzdWx0cyBoYXMgdHdvIGxpc3RzIG9mIHJlc3VsdHMgZm9yIGV2ZXJ5IHBhaXJpbmcuCiAKIHByZWZpeF9iaW5vcHMgPSBbICdkaXZtb2QnIF0KQEAgLTM0MCwxNCArMzM3LDExIEBACiAgICAgICAgICAgICByYWlzZSBleGMKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZ3MKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wbGV4IGRpdm1vZC4uLCAvLyBhbmQgJSBhcmUgZGVwcmVjYXRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJjbGFzc2ljIC4rIGRpdmlzaW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICBydW5fdW5pdHRlc3QoQ29lcmNpb25UZXN0KQorICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInY29tcGxleCBkaXZtb2RcKFwpLCAvLyBhbmQgJSBhcmUgZGVwcmVjYXRlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIndGVzdC50ZXN0X2NvZXJjaW9uJCcpCisgICAgcnVuX3VuaXR0ZXN0KENvZXJjaW9uVGVzdCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2xsZWN0aW9ucy5weSBiL0xpYi90ZXN0L3Rlc3RfY29sbGVjdGlvbnMucHkKaW5kZXggYjQ0YmVhYi4uZmIyNGQ0MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2xsZWN0aW9ucy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5CkBAIC01MTAsMTAgKzUxMCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgWygnYScsIDMpLCAoJ2InLCAyKSwgKCdjJywgMSldKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNbJ2InXSwgMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjWyd6J10sIDApCi0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5oYXNfa2V5KCdjJyksIFRydWUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuaGFzX2tleSgneicpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmhhc19rZXkoJ2MnKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmhhc19rZXkoJ3onKSwgRmFsc2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5fX2NvbnRhaW5zX18oJ2MnKSwgVHJ1ZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLl9fY29udGFpbnNfXygneicpLCBGYWxzZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmdldCgnYicsIDEwKSwgMikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29tbWFuZHMucHkgYi9MaWIvdGVzdC90ZXN0X2NvbW1hbmRzLnB5CmluZGV4IDI3YjZjM2QuLmZjZmE2MTYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29tbWFuZHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb21tYW5kcy5weQpAQCAtOSwxMCArOSw3IEBACiB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnaWdub3JlJywgciIuKmNvbW1hbmRzLmdldHN0YXR1cy4uIGlzIGRlcHJlY2F0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQogCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIHJlYXBfY2hpbGRyZW4sIGltcG9ydF9tb2R1bGUKLQotIyBTaWxlbmNlIFB5M2sgd2FybmluZwotaW1wb3J0X21vZHVsZSgnY29tbWFuZHMnLCBkZXByZWNhdGVkPVRydWUpCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIHJlYXBfY2hpbGRyZW4KIGZyb20gY29tbWFuZHMgaW1wb3J0ICoKIAogIyBUaGUgbW9kdWxlIHNheXM6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGUucHkgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGUucHkKaW5kZXggZWZjNTRlNS4uMjhiNzMzMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tcGlsZS5weQpAQCAtMiw3ICsyLDYgQEAKIGltcG9ydCBzeXMKIGltcG9ydCBfYXN0CiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAotaW1wb3J0IHRleHR3cmFwCiAKIGNsYXNzIFRlc3RTcGVjaWZpY3ModW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC0xNDIsOSArMTQxLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKDUpLCAwKQogCiAgICAgZGVmIHRlc3RfY29tcGxleF9hcmdzKHNlbGYpOgotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICBleGVjIHRleHR3cmFwLmRlZGVudCgnJycKKwogICAgICAgICBkZWYgY29tcF9hcmdzKChhLCBiKSk6CiAgICAgICAgICAgICByZXR1cm4gYSxiCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcF9hcmdzKCgxLCAyKSksICgxLCAyKSkKQEAgLTE2Miw3ICsxNTksNiBAQAogICAgICAgICAgICAgcmV0dXJuIGEsIGIsIGMKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wX2FyZ3MoMSwgKDIsIDMpKSwgKDEsIDIsIDMpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBfYXJncygpLCAoMiwgMywgNCkpCi0gICAgICAgICcnJykKIAogICAgIGRlZiB0ZXN0X2FyZ3VtZW50X29yZGVyKHNlbGYpOgogICAgICAgICB0cnk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGVyLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21waWxlci5weQppbmRleCBhMzQ1Y2U2Li4yNDkzMGY4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tcGlsZXIucHkKQEAgLTc1LDcgKzc1LDcgQEAKIAogICAgIGRlZiB0ZXN0VHJ5RXhjZXB0RmluYWxseShzZWxmKToKICAgICAgICAgIyBUZXN0IHRoYXQgZXhjZXB0IGFuZCBmaW5hbGx5IGNsYXVzZXMgaW4gb25lIHRyeSBzdG10IGFyZSByZWNvZ25pemVkCi0gICAgICAgIGMgPSBjb21waWxlci5jb21waWxlKCJ0cnk6XG4gMS8vMFxuZXhjZXB0OlxuIGUgPSAxXG5maW5hbGx5OlxuIGYgPSAxIiwKKyAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoInRyeTpcbiAxLzBcbmV4Y2VwdDpcbiBlID0gMVxuZmluYWxseTpcbiBmID0gMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3RyaW5nPiIsICJleGVjIikKICAgICAgICAgZGN0ID0ge30KICAgICAgICAgZXhlYyBjIGluIGRjdApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb21wbGV4X2FyZ3MucHkgYi9MaWIvdGVzdC90ZXN0X2NvbXBsZXhfYXJncy5weQppbmRleCBmNjk1MGE3Li5jNmQ1MGE5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbXBsZXhfYXJncy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbXBsZXhfYXJncy5weQpAQCAtMSwzMSArMSwyMyBAQAogCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Ci1pbXBvcnQgdGV4dHdyYXAKLWltcG9ydCB3YXJuaW5ncwogCiBjbGFzcyBDb21wbGV4QXJnc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiBjaGVjayhzZWxmLCBmdW5jLCBleHBlY3RlZCwgKmFyZ3MpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoKmFyZ3MpLCBleHBlY3RlZCkKIAotICAgICMgVGhlc2UgZnVuY3Rpb25zIGFyZSB0ZXN0ZWQgYmVsb3cgYXMgbGFtYmRhcyB0b28uICBJZiB5b3UgYWRkIGEKLSAgICAjIGZ1bmN0aW9uIHRlc3QsIGFsc28gYWRkIGEgc2ltaWxhciBsYW1iZGEgdGVzdC4KLQotICAgICMgRnVuY3Rpb25zIGFyZSB3cmFwcGVkIGluICJleGVjIiBzdGF0ZW1lbnRzIGluIG9yZGVyIHRvCi0gICAgIyBzaWxlbmNlIFB5M2sgd2FybmluZ3MKKyAgICAjIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdGVzdGVkIGJlbG93IGFzIGxhbWJkYXMgdG9vLiAgSWYgeW91IGFkZCBhIGZ1bmN0aW9uIHRlc3QsCisgICAgIyBhbHNvIGFkZCBhIHNpbWlsYXIgbGFtYmRhIHRlc3QuCiAKICAgICBkZWYgdGVzdF9mdW5jX3BhcmVuc19ub191bnBhY2tpbmcoc2VsZik6Ci0gICAgICAgIGV4ZWMgdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgICBkZWYgZigoKCgoeCkpKSkpOiByZXR1cm4geAogICAgICAgICBzZWxmLmNoZWNrKGYsIDEsIDEpCiAgICAgICAgICMgSW5uZXIgcGFyZW5zIGFyZSBlbGlkZWQsIHNhbWUgYXM6IGYoeCwpCiAgICAgICAgIGRlZiBmKCgoeCkpLCk6IHJldHVybiB4CiAgICAgICAgIHNlbGYuY2hlY2soZiwgMiwgMikKLSAgICAgICAgIiIiKQogCiAgICAgZGVmIHRlc3RfZnVuY18xKHNlbGYpOgotICAgICAgICBleGVjIHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICAgZGVmIGYoKCgoKHgpLCkpKSk6IHJldHVybiB4CiAgICAgICAgIHNlbGYuY2hlY2soZiwgMywgKDMsKSkKICAgICAgICAgZGVmIGYoKCgoKHgpKSwpKSk6IHJldHVybiB4CkBAIC0zNCwyMiArMjYsMTYgQEAKICAgICAgICAgc2VsZi5jaGVjayhmLCA1LCAoNSwpKQogICAgICAgICBkZWYgZigoKHgpLCkpOiByZXR1cm4geAogICAgICAgICBzZWxmLmNoZWNrKGYsIDYsICg2LCkpCi0gICAgICAgICIiIikKIAogICAgIGRlZiB0ZXN0X2Z1bmNfMihzZWxmKToKLSAgICAgICAgZXhlYyB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgIGRlZiBmKCgoKCh4KSksKSwpKTogcmV0dXJuIHgKICAgICAgICAgc2VsZi5jaGVjayhmLCAyLCAoKDIsKSwpKQotICAgICAgICAiIiIpCiAKICAgICBkZWYgdGVzdF9mdW5jXzMoc2VsZik6Ci0gICAgICAgIGV4ZWMgdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgICBkZWYgZigoKCgoKHgpKSwpLCksKSk6IHJldHVybiB4CiAgICAgICAgIHNlbGYuY2hlY2soZiwgMywgKCgoMywpLCksKSkKLSAgICAgICAgIiIiKQogCiAgICAgZGVmIHRlc3RfZnVuY19jb21wbGV4KHNlbGYpOgotICAgICAgICBleGVjIHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICAgZGVmIGYoKCgoKCh4KSksKSwpLCksIGEsIGIsIGMpOiByZXR1cm4geCwgYSwgYiwgYwogICAgICAgICBzZWxmLmNoZWNrKGYsICgzLCA5LCA4LCA3KSwgKCgoMywpLCksKSwgOSwgOCwgNykKIApAQCAtNTgsMjIgKzQ0LDE4IEBACiAKICAgICAgICAgZGVmIGYoYSwgYiwgYywgKCgoKCgoeCkpLCkpLCksKSk6IHJldHVybiBhLCBiLCBjLCB4CiAgICAgICAgIHNlbGYuY2hlY2soZiwgKDksIDgsIDcsIDMpLCA5LCA4LCA3LCAoKCgzLCksKSwpKQotICAgICAgICAiIiIpCiAKICAgICAjIER1cGxpY2F0ZSB0aGUgdGVzdHMgYWJvdmUsIGJ1dCBmb3IgbGFtYmRhLiAgSWYgeW91IGFkZCBhIGxhbWJkYSB0ZXN0LAogICAgICMgYWxzbyBhZGQgYSBzaW1pbGFyIGZ1bmN0aW9uIHRlc3QgYWJvdmUuCiAKICAgICBkZWYgdGVzdF9sYW1iZGFfcGFyZW5zX25vX3VucGFja2luZyhzZWxmKToKLSAgICAgICAgZXhlYyB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgIGYgPSBsYW1iZGEgKCgoKCh4KSkpKSk6IHgKICAgICAgICAgc2VsZi5jaGVjayhmLCAxLCAxKQogICAgICAgICAjIElubmVyIHBhcmVucyBhcmUgZWxpZGVkLCBzYW1lIGFzOiBmKHgsKQogICAgICAgICBmID0gbGFtYmRhICgoeCkpLDogeAogICAgICAgICBzZWxmLmNoZWNrKGYsIDIsIDIpCi0gICAgICAgICIiIikKIAogICAgIGRlZiB0ZXN0X2xhbWJkYV8xKHNlbGYpOgotICAgICAgICBleGVjIHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICAgZiA9IGxhbWJkYSAoKCgoKHgpLCkpKSk6IHgKICAgICAgICAgc2VsZi5jaGVjayhmLCAzLCAoMywpKQogICAgICAgICBmID0gbGFtYmRhICgoKCgoeCkpLCkpKTogeApAQCAtODIsMjIgKzY0LDE2IEBACiAgICAgICAgIHNlbGYuY2hlY2soZiwgNSwgKDUsKSkKICAgICAgICAgZiA9IGxhbWJkYSAoKCh4KSwpKTogeAogICAgICAgICBzZWxmLmNoZWNrKGYsIDYsICg2LCkpCi0gICAgICAgICIiIikKIAogICAgIGRlZiB0ZXN0X2xhbWJkYV8yKHNlbGYpOgotICAgICAgICBleGVjIHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICAgZiA9IGxhbWJkYSAoKCgoKHgpKSwpLCkpOiB4CiAgICAgICAgIHNlbGYuY2hlY2soZiwgMiwgKCgyLCksKSkKLSAgICAgICAgIiIiKQogCiAgICAgZGVmIHRlc3RfbGFtYmRhXzMoc2VsZik6Ci0gICAgICAgIGV4ZWMgdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgICBmID0gbGFtYmRhICgoKCgoKHgpKSwpLCksKSk6IHgKICAgICAgICAgc2VsZi5jaGVjayhmLCAzLCAoKCgzLCksKSwpKQotICAgICAgICAiIiIpCiAKICAgICBkZWYgdGVzdF9sYW1iZGFfY29tcGxleChzZWxmKToKLSAgICAgICAgZXhlYyB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgIGYgPSBsYW1iZGEgKCgoKCh4KSksKSwpLCksIGEsIGIsIGM6ICh4LCBhLCBiLCBjKQogICAgICAgICBzZWxmLmNoZWNrKGYsICgzLCA5LCA4LCA3KSwgKCgoMywpLCksKSwgOSwgOCwgNykKIApAQCAtMTA2LDE3ICs4MiwxMCBAQAogCiAgICAgICAgIGYgPSBsYW1iZGEgYSwgYiwgYywgKCgoKCgoeCkpLCkpLCksKTogKGEsIGIsIGMsIHgpCiAgICAgICAgIHNlbGYuY2hlY2soZiwgKDksIDgsIDcsIDMpLCA5LCA4LCA3LCAoKCgzLCksKSwpKQotICAgICAgICAiIiIpCiAKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZ3MKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0dXBsZSBwYXJhbWV0ZXIgdW5wYWNraW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhcyBiZWVuIHJlbW92ZWQiLCBTeW50YXhXYXJuaW5nKQotICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgInBhcmVudGhlc2l6ZWQgYXJndW1lbnQgbmFtZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJlIGludmFsaWQiLCBTeW50YXhXYXJuaW5nKQotICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENvbXBsZXhBcmdzVGVzdENhc2UpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChDb21wbGV4QXJnc1Rlc3RDYXNlKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvcHkucHkgYi9MaWIvdGVzdC90ZXN0X2NvcHkucHkKaW5kZXggYmJlMzFkOC4uODIzZTliMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb3B5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29weS5weQpAQCAtNjYxLDcgKzY2MSw3IEBACiAgICAgICAgIHYgPSBjb3B5LmRlZXBjb3B5KHUpCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwodiwgdSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odiksIDIpCi0gICAgICAgICh4LCB5KSwgKHosIHQpID0gc29ydGVkKHYuaXRlbXMoKSwga2V5PWxhbWJkYSBrOiBrWzBdLmkpCisgICAgICAgICh4LCB5KSwgKHosIHQpID0gc29ydGVkKHYuaXRlbXMoKSwga2V5PWxhbWJkYSAoaywgdik6IGsuaSkKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh4IGlzIGEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5pLCBhLmkpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIGIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2N0eXBlcy5weSBiL0xpYi90ZXN0L3Rlc3RfY3R5cGVzLnB5CmluZGV4IDRlOTNjODcuLjg1ZjEzN2UgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY3R5cGVzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY3R5cGVzLnB5CkBAIC00LDE5ICs0LDEyIEBACiAjU2tpcCB0ZXN0cyBpZiBfY3R5cGVzIG1vZHVsZSBkb2VzIG5vdCBleGlzdAogaW1wb3J0X21vZHVsZSgnX2N0eXBlcycpCiAKLWltcG9ydCB3YXJuaW5ncwogaW1wb3J0IGN0eXBlcy50ZXN0CiAKIGRlZiB0ZXN0X21haW4oKToKICAgICBza2lwcGVkLCB0ZXN0Y2FzZXMgPSBjdHlwZXMudGVzdC5nZXRfdGVzdHMoY3R5cGVzLnRlc3QsICJ0ZXN0XyoucHkiLCB2ZXJib3NpdHk9MCkKICAgICBzdWl0ZXMgPSBbdW5pdHRlc3QubWFrZVN1aXRlKHQpIGZvciB0IGluIHRlc3RjYXNlc10KLSAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmdzCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiYnVmZmVyLi4gbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJjbGFzc2ljIGxvbmcgZGl2aXNpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgIHJ1bl91bml0dGVzdCh1bml0dGVzdC5UZXN0U3VpdGUoc3VpdGVzKSkKKyAgICBydW5fdW5pdHRlc3QodW5pdHRlc3QuVGVzdFN1aXRlKHN1aXRlcykpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weSBiL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weQppbmRleCA5ZmVmMGQyLi42OWYzMWEwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5CkBAIC0zMSw4ICszMSw3IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gZGVjaW1hbCBpbXBvcnQgKgogaW1wb3J0IG51bWJlcnMKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IChydW5fdW5pdHRlc3QsIHJ1bl9kb2N0ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3Jlc291cmNlX2VuYWJsZWQsIGNoZWNrX3dhcm5pbmdzKQorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgKHJ1bl91bml0dGVzdCwgcnVuX2RvY3Rlc3QsIGlzX3Jlc291cmNlX2VuYWJsZWQpCiBpbXBvcnQgcmFuZG9tCiB0cnk6CiAgICAgaW1wb3J0IHRocmVhZGluZwpAQCAtMjAzLDcgKzIwMiw3IEBACiAgICAgICAgIGlmIHNraXBfZXhwZWN0ZWQ6CiAgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdAogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGZvciBsaW5lIGluIG9wZW4oZmlsZSk6CisgICAgICAgIGZvciBsaW5lIGluIG9wZW4oZmlsZSkueHJlYWRsaW5lcygpOgogICAgICAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZSgnXHJcbicsICcnKS5yZXBsYWNlKCdcbicsICcnKQogICAgICAgICAgICAgI3ByaW50IGxpbmUKICAgICAgICAgICAgIHRyeToKQEAgLTM2MiwxMCArMzYxLDggQEAKICAgICAgICAgbXlleGNlcHRpb25zID0gc2VsZi5nZXRleGNlcHRpb25zKCkKICAgICAgICAgc2VsZi5jb250ZXh0LmNsZWFyX2ZsYWdzKCkKIAotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgIG15ZXhjZXB0aW9ucy5zb3J0KCkKLSAgICAgICAgICAgIHRoZWlyZXhjZXB0aW9ucy5zb3J0KCkKKyAgICAgICAgbXlleGNlcHRpb25zLnNvcnQoKQorICAgICAgICB0aGVpcmV4Y2VwdGlvbnMuc29ydCgpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGFucywKICAgICAgICAgICAgICAgICAgICAgICAgICAnSW5jb3JyZWN0IGFuc3dlciBmb3IgJyArIHMgKyAnIC0tIGdvdCAnICsgcmVzdWx0KQpAQCAtNjIwLDE0ICs2MTcsMTIgQEAKICAgICAgICAgICAgICgnLy8nLCAnX19mbG9vcmRpdl9fJywgJ19fcmZsb29yZGl2X18nKSwKICAgICAgICAgICAgICgnKionLCAnX19wb3dfXycsICdfX3Jwb3dfXycpCiAgICAgICAgIF0KLSAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZwotICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICBpZiAxLzIgPT0gMDoKLSAgICAgICAgICAgICAgICAjIHRlc3Rpbmcgd2l0aCBjbGFzc2ljIGRpdmlzaW9uLCBzbyBhZGQgX19kaXZfXwotICAgICAgICAgICAgICAgIG9wbGlzdC5hcHBlbmQoKCcvJywgJ19fZGl2X18nLCAnX19yZGl2X18nKSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgIyB0ZXN0aW5nIHdpdGggLVFuZXcsIHNvIGFkZCBfX3RydWVkaXZfXwotICAgICAgICAgICAgICAgIG9wbGlzdC5hcHBlbmQoKCcvJywgJ19fdHJ1ZWRpdl9fJywgJ19fcnRydWVkaXZfXycpKQorICAgICAgICBpZiAxLzIgPT0gMDoKKyAgICAgICAgICAgICMgdGVzdGluZyB3aXRoIGNsYXNzaWMgZGl2aXNpb24sIHNvIGFkZCBfX2Rpdl9fCisgICAgICAgICAgICBvcGxpc3QuYXBwZW5kKCgnLycsICdfX2Rpdl9fJywgJ19fcmRpdl9fJykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHRlc3Rpbmcgd2l0aCAtUW5ldywgc28gYWRkIF9fdHJ1ZWRpdl9fCisgICAgICAgICAgICBvcGxpc3QuYXBwZW5kKCgnLycsICdfX3RydWVkaXZfXycsICdfX3J0cnVlZGl2X18nKSkKIAogICAgICAgICBmb3Igc3ltLCBsb3AsIHJvcCBpbiBvcGxpc3Q6CiAgICAgICAgICAgICBzZXRhdHRyKEUsIGxvcCwgbGFtYmRhIHNlbGYsIG90aGVyOiAnc3RyJyArIGxvcCArIHN0cihvdGhlcikpCkBAIC0xMTk5LDEwICsxMTk0LDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQogCiAgICAgICAgICMgd2l0aCBOb25lCi0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2l0aCBjaGVja193YXJuaW5ncygpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShEZWNpbWFsKDEpIDwgTm9uZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShEZWNpbWFsKDEpID4gTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShEZWNpbWFsKDEpIDwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKERlY2ltYWwoMSkgPiBOb25lKQogCiAgICAgZGVmIHRlc3RfY29weV9hbmRfZGVlcGNvcHlfbWV0aG9kcyhzZWxmKToKICAgICAgICAgZCA9IERlY2ltYWwoJzQzLjI0JykKQEAgLTE3MTEsMTQgKzE3MDQsMTEgQEAKICAgICAgICAgICAgICAgICBmb3IgZmxhZyBpbiBleHRyYV9mbGFnczoKICAgICAgICAgICAgICAgICAgICAgaWYgZmxhZyBub3QgaW4gZXhwZWN0ZWRfZmxhZ3M6CiAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9mbGFncy5hcHBlbmQoZmxhZykKKyAgICAgICAgICAgICAgICBleHBlY3RlZF9mbGFncy5zb3J0KCkKIAogICAgICAgICAgICAgICAgICMgZmxhZ3Mgd2UgYWN0dWFsbHkgZ290CiAgICAgICAgICAgICAgICAgbmV3X2ZsYWdzID0gW2sgZm9yIGssdiBpbiBjb250ZXh0LmZsYWdzLml0ZW1zKCkgaWYgdl0KLQotICAgICAgICAgICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2ZsYWdzLnNvcnQoKQotICAgICAgICAgICAgICAgICAgICBuZXdfZmxhZ3Muc29ydCgpCisgICAgICAgICAgICAgICAgbmV3X2ZsYWdzLnNvcnQoKQogCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbnMsIG5ld19hbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3BlcmF0aW9uIHByb2R1Y2VzIGRpZmZlcmVudCBhbnN3ZXJzIGRlcGVuZGluZyBvbiBmbGFncyBzZXQ6ICIgKwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZXNjci5weSBiL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKaW5kZXggYTA0NGZhZi4uNDE4MzM3YiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZXNjci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CkBAIC00NTk4LDE5ICs0NTk4LDkgQEAKIAogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5ncwotICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgImNsYXNzaWMgLisgZGl2aXNpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiY29lcmNlLi4gbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJPdmVycmlkaW5nIF9fY21wX18gIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgIi4rc2xpY2VfXyBoYXMgYmVlbiByZW1vdmVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICAjIFJ1biBhbGwgbG9jYWwgdGVzdCBjYXNlcywgd2l0aCBQVHlwZXNMb25nSW5pdFRlc3QgZmlyc3QuCi0gICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoUFR5cGVzTG9uZ0luaXRUZXN0LCBPcGVyYXRvcnNUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzUHJvcGVydGllc0FuZE1ldGhvZHMsIERpY3RQcm94eVRlc3RzKQorICAgICMgUnVuIGFsbCBsb2NhbCB0ZXN0IGNhc2VzLCB3aXRoIFBUeXBlc0xvbmdJbml0VGVzdCBmaXJzdC4KKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFBUeXBlc0xvbmdJbml0VGVzdCwgT3BlcmF0b3JzVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzUHJvcGVydGllc0FuZE1ldGhvZHMsIERpY3RQcm94eVRlc3RzKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Rlc2NydHV0LnB5IGIvTGliL3Rlc3QvdGVzdF9kZXNjcnR1dC5weQppbmRleCAxNTdiOWY0Li5jNDU1ZTZiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Rlc2NydHV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVzY3J0dXQucHkKQEAgLTY2LDcgKzY2LDcgQEAKIHN0YXRlbWVudCBvciB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gZXZhbCgpOgogCiAgICAgPj4+IGRlZiBzb3J0ZWQoc2VxKToKLSAgICAuLi4gICAgIHNlcS5zb3J0KGtleT1zdHIpCisgICAgLi4uICAgICBzZXEuc29ydCgpCiAgICAgLi4uICAgICByZXR1cm4gc2VxCiAgICAgPj4+IHByaW50IHNvcnRlZChhLmtleXMoKSkKICAgICBbMSwgMl0KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGljdC5weSBiL0xpYi90ZXN0L3Rlc3RfZGljdC5weQppbmRleCBkZTQwMGFhLi4wNzVmOWRjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RpY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kaWN0LnB5CkBAIC0zMywxMiArMzMsOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQua2V5cygpLCBbXSkKICAgICAgICAgZCA9IHsnYSc6IDEsICdiJzogMn0KICAgICAgICAgayA9IGQua2V5cygpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYScgaW4gZCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdiJyBpbiBkKQotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5oYXNfa2V5KCdhJykpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5oYXNfa2V5KCdiJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmhhc19rZXkoJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuaGFzX2tleSgnYicpKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5rZXlzLCBOb25lKQogCkBAIC02MSwxNiArNTcsMTQgQEAKIAogICAgIGRlZiB0ZXN0X2hhc19rZXkoc2VsZik6CiAgICAgICAgIGQgPSB7fQotICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2EnIG5vdCBpbiBkKQotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGQuaGFzX2tleSgnYScpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLmhhc19rZXkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZC5oYXNfa2V5KCdhJykpCiAgICAgICAgIGQgPSB7J2EnOiAxLCAnYic6IDJ9CiAgICAgICAgIGsgPSBkLmtleXMoKQogICAgICAgICBrLnNvcnQoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGssIFsnYScsICdiJ10pCiAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLmhhc19rZXkpCisKICAgICBkZWYgdGVzdF9jb250YWlucyhzZWxmKToKICAgICAgICAgZCA9IHt9CiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKCdhJyBpbiBkKSkKQEAgLTQwMSw2ICszOTUsOCBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIHJlcHIsIGQpCiAKICAgICBkZWYgdGVzdF9sZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCAoe30gPCB7fSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHsxOiAyfSA8IHsxTDogMkx9KSkKIAogICAgICAgICBjbGFzcyBFeGMoRXhjZXB0aW9uKTogcGFzcwogCkBAIC00MTIsMTggKzQwOCwxMiBAQAogCiAgICAgICAgIGQxID0ge0JhZENtcCgpOiAxfQogICAgICAgICBkMiA9IHsxOiAxfQotCi0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHt9IDwge30pKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCAoezE6IDJ9IDwgezFMOiAyTH0pKQotCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgZDEgPCBkMgotICAgICAgICAgICAgZXhjZXB0IEV4YzoKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiPCBkaWRuJ3QgcmFpc2UgRXhjIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZDEgPCBkMgorICAgICAgICBleGNlcHQgRXhjOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCI8IGRpZG4ndCByYWlzZSBFeGMiKQogCiAgICAgZGVmIHRlc3RfbWlzc2luZyhzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgZGljdCBkb2Vzbid0IGhhdmUgYSBfX21pc3NpbmdfXyBtZXRob2QKQEAgLTUxMSw5ICs1MDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgJ2QucG9wKHgyKScsCiAgICAgICAgICAgICAgICAgICAgICAnZC51cGRhdGUoe3gyOiAyfSknXToKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgICAgICAgICAgZXhlYyBzdG10IGluIGxvY2FscygpCisgICAgICAgICAgICAgICAgZXhlYyBzdG10IGluIGxvY2FscygpCiAgICAgICAgICAgICBleGNlcHQgQ3VzdG9tRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgIGVsc2U6CkBAIC01NjEsNyArNTQ5LDcgQEAKICAgICAgICAgIyBCdWcgIzM1Mzc6IGlmIGFuIGVtcHR5IGJ1dCBwcmVzaXplZCBkaWN0IHdpdGggYSBzaXplIGxhcmdlcgogICAgICAgICAjIHRoYW4gNyB3YXMgaW4gdGhlIGZyZWVsaXN0LCBpdCB0cmlnZ2VyZWQgYW4gYXNzZXJ0aW9uIGZhaWx1cmUKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgZCA9IHsnYSc6IDEgLy8gMCwgJ2InOiBOb25lLCAnYyc6IE5vbmUsICdkJzogTm9uZSwgJ2UnOiBOb25lLAorICAgICAgICAgICAgZCA9IHsnYSc6IDEvMCwgICdiJzogTm9uZSwgJ2MnOiBOb25lLCAnZCc6IE5vbmUsICdlJzogTm9uZSwKICAgICAgICAgICAgICAgICAgJ2YnOiBOb25lLCAnZyc6IE5vbmUsICdoJzogTm9uZX0KICAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgogICAgICAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5IGIvTGliL3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5CmluZGV4IDdiNjM3MTguLmEzMGY0MmIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHkKQEAgLTcsNyArNyw3IEBACiBpbXBvcnQgd2FybmluZ3MKIAogZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCB1bmxpbmssIHJ1bl91bml0dGVzdCwgY2FwdHVyZWRfb3V0cHV0Ci1mcm9tIHRlc3QudGVzdF9wZXAzNTIgaW1wb3J0IGlnbm9yZV9kZXByZWNhdGlvbl93YXJuaW5ncworZnJvbSB0ZXN0LnRlc3RfcGVwMzUyIGltcG9ydCBpZ25vcmVfbWVzc2FnZV93YXJuaW5nCiAKICMgWFhYIFRoaXMgaXMgbm90IHJlYWxseSBlbm91Z2gsIGVhY2ggKm9wZXJhdGlvbiogc2hvdWxkIGJlIHRlc3RlZCEKIApAQCAtMTcsNyArMTcsNiBAQAogICAgICAgICAjIFJlbG9hZGluZyB0aGUgYnVpbHQtaW4gZXhjZXB0aW9ucyBtb2R1bGUgZmFpbGVkIHByaW9yIHRvIFB5Mi4yLCB3aGlsZSBpdAogICAgICAgICAjIHNob3VsZCBhY3QgdGhlIHNhbWUgYXMgcmVsb2FkaW5nIGJ1aWx0LWluIHN5cy4KICAgICAgICAgdHJ5OgotICAgICAgICAgICAgZnJvbSBpbXAgaW1wb3J0IHJlbG9hZAogICAgICAgICAgICAgaW1wb3J0IGV4Y2VwdGlvbnMKICAgICAgICAgICAgIHJlbG9hZChleGNlcHRpb25zKQogICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsIGU6CkBAIC0xMDksMTEgKzEwOCwxMSBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjaHIsIDEwMDAwKQogCiAgICAgICAgIHNlbGYucmFpc2VfY2F0Y2goWmVyb0RpdmlzaW9uRXJyb3IsICJaZXJvRGl2aXNpb25FcnJvciIpCi0gICAgICAgIHRyeTogeCA9IDEgLy8gMAorICAgICAgICB0cnk6IHggPSAxLzAKICAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCiAKICAgICAgICAgc2VsZi5yYWlzZV9jYXRjaChFeGNlcHRpb24sICJFeGNlcHRpb24iKQotICAgICAgICB0cnk6IHggPSAxIC8vIDAKKyAgICAgICAgdHJ5OiB4ID0gMS8wCiAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6IHBhc3MKIAogICAgIGRlZiB0ZXN0U3ludGF4RXJyb3JNZXNzYWdlKHNlbGYpOgpAQCAtMTk4LDcgKzE5Nyw2IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFdpbmRvd3NFcnJvcigxMDAxLCAibWVzc2FnZSIpLmVycm5vLCAyMikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoV2luZG93c0Vycm9yKDEwMDEsICJtZXNzYWdlIikud2luZXJyb3IsIDEwMDEpCiAKLSAgICBAaWdub3JlX2RlcHJlY2F0aW9uX3dhcm5pbmdzCiAgICAgZGVmIHRlc3RBdHRyaWJ1dGVzKHNlbGYpOgogICAgICAgICAjIHRlc3QgdGhhdCBleGNlcHRpb24gYXR0cmlidXRlcyBhcmUgaGFwcHkKIApAQCAtMjc2LDMyICsyNzQsMzQgQEAKICAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKICAgICAgICAgICAgIHBhc3MKIAotICAgICAgICBmb3IgZXhjLCBhcmdzLCBleHBlY3RlZCBpbiBleGNlcHRpb25MaXN0OgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHJhaXNlIGV4YygqYXJncykKLSAgICAgICAgICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uLCBlOgotICAgICAgICAgICAgICAgIGlmIHR5cGUoZSkgaXMgbm90IGV4YzoKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgICAgICAgICAjIFZlcmlmeSBtb2R1bGUgbmFtZQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHR5cGUoZSkuX19tb2R1bGVfXywgJ2V4Y2VwdGlvbnMnKQotICAgICAgICAgICAgICAgICMgVmVyaWZ5IG5vIHJlZiBsZWFrcyBpbiBFeGNfc3RyKCkKLSAgICAgICAgICAgICAgICBzID0gc3RyKGUpCi0gICAgICAgICAgICAgICAgZm9yIGNoZWNrQXJnTmFtZSBpbiBleHBlY3RlZDoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVwcihnZXRhdHRyKGUsIGNoZWNrQXJnTmFtZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByKGV4cGVjdGVkW2NoZWNrQXJnTmFtZV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhjZXB0aW9uICIlcyIsIGF0dHJpYnV0ZSAiJXMiJyAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVwcihlKSwgY2hlY2tBcmdOYW1lKSkKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgaWdub3JlX21lc3NhZ2Vfd2FybmluZygpCisgICAgICAgICAgICBmb3IgZXhjLCBhcmdzLCBleHBlY3RlZCBpbiBleGNlcHRpb25MaXN0OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXhjKCphcmdzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgICAgICAgICBpZiB0eXBlKGUpIGlzIG5vdCBleGM6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgICAgICAjIFZlcmlmeSBtb2R1bGUgbmFtZQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0eXBlKGUpLl9fbW9kdWxlX18sICdleGNlcHRpb25zJykKKyAgICAgICAgICAgICAgICAgICAgIyBWZXJpZnkgbm8gcmVmIGxlYWtzIGluIEV4Y19zdHIoKQorICAgICAgICAgICAgICAgICAgICBzID0gc3RyKGUpCisgICAgICAgICAgICAgICAgICAgIGZvciBjaGVja0FyZ05hbWUgaW4gZXhwZWN0ZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXByKGdldGF0dHIoZSwgY2hlY2tBcmdOYW1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByKGV4cGVjdGVkW2NoZWNrQXJnTmFtZV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4Y2VwdGlvbiAiJXMiLCBhdHRyaWJ1dGUgIiVzIicgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXByKGUpLCBjaGVja0FyZ05hbWUpKQogCi0gICAgICAgICAgICAgICAgIyB0ZXN0IGZvciBwaWNrbGluZyBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgZm9yIHAgaW4gcGlja2xlLCBjUGlja2xlOgotICAgICAgICAgICAgICAgICAgICBmb3IgcHJvdG9jb2wgaW4gcmFuZ2UocC5ISUdIRVNUX1BST1RPQ09MICsgMSk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgPSBwLmxvYWRzKHAuZHVtcHMoZSwgcHJvdG9jb2wpKQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGNoZWNrQXJnTmFtZSBpbiBleHBlY3RlZDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3QgPSByZXByKGdldGF0dHIobmV3LCBjaGVja0FyZ05hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnQgPSByZXByKGV4cGVjdGVkW2NoZWNrQXJnTmFtZV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZ290LCB3YW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwaWNrbGVkICIlciIsIGF0dHJpYnV0ZSAiJXMiJyAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUsIGNoZWNrQXJnTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICMgdGVzdCBmb3IgcGlja2xpbmcgc3VwcG9ydAorICAgICAgICAgICAgICAgICAgICBmb3IgcCBpbiBwaWNrbGUsIGNQaWNrbGU6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcHJvdG9jb2wgaW4gcmFuZ2UocC5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3ID0gcC5sb2FkcyhwLmR1bXBzKGUsIHByb3RvY29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgY2hlY2tBcmdOYW1lIGluIGV4cGVjdGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3QgPSByZXByKGdldGF0dHIobmV3LCBjaGVja0FyZ05hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50ID0gcmVwcihleHBlY3RlZFtjaGVja0FyZ05hbWVdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhnb3QsIHdhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwaWNrbGVkICIlciIsIGF0dHJpYnV0ZSAiJXMiJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLCBjaGVja0FyZ05hbWUpKQogCiAKICAgICBkZWYgdGVzdERlcHJlY2F0ZWRNZXNzYWdlQXR0cmlidXRlKHNlbGYpOgpAQCAtMzMwLDcgKzMzMCw2IEBACiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpOgogICAgICAgICAgICAgZXhjLm1lc3NhZ2UKIAotICAgIEBpZ25vcmVfZGVwcmVjYXRpb25fd2FybmluZ3MKICAgICBkZWYgdGVzdFBpY2tsZU1lc3NhZ2VBdHRyaWJ1dGUoc2VsZik6CiAgICAgICAgICMgUGlja2xpbmcgd2l0aCBtZXNzYWdlIGF0dHJpYnV0ZSBtdXN0IHdvcmssIGFzIHdlbGwuCiAgICAgICAgIGUgPSBFeGNlcHRpb24oImZvbyIpCkBAIC0zMzgsNyArMzM3LDkgQEAKICAgICAgICAgZi5tZXNzYWdlID0gImJhciIKICAgICAgICAgZm9yIHAgaW4gcGlja2xlLCBjUGlja2xlOgogICAgICAgICAgICAgZXAgPSBwLmxvYWRzKHAuZHVtcHMoZSkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLm1lc3NhZ2UsICJmb28iKQorICAgICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgICAgIGlnbm9yZV9tZXNzYWdlX3dhcm5pbmcoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAubWVzc2FnZSwgImZvbyIpCiAgICAgICAgICAgICBmcCA9IHAubG9hZHMocC5kdW1wcyhmKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAubWVzc2FnZSwgImJhciIpCiAKQEAgLTM0NywxMiArMzQ4LDcgQEAKICAgICAgICAgIyBnb2luZyB0aHJvdWdoIHRoZSAnYXJncycgYXR0cmlidXRlLgogICAgICAgICBhcmdzID0gKDEsIDIsIDMpCiAgICAgICAgIGV4YyA9IEJhc2VFeGNlcHRpb24oKmFyZ3MpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhjLmFyZ3NbOl0sIGFyZ3MpCi0gICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiX19nZXRzbGljZV9fIG5vdCBzdXBwb3J0ZWQgZm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb24gY2xhc3NlcyIsIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhjWzpdLCBhcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Y1s6XSwgYXJncykKIAogICAgIGRlZiB0ZXN0S2V5d29yZEFyZ3Moc2VsZik6CiAgICAgICAgICMgdGVzdCB0aGF0IGJ1aWx0aW4gZXhjZXB0aW9uIGRvbid0IHRha2Uga2V5d29yZCBhcmdzLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9maWxlLnB5IGIvTGliL3Rlc3QvdGVzdF9maWxlLnB5CmluZGV4IGE5MTg5N2UuLjdkM2U3MmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZpbGUucHkKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLmYuX19leGl0X18oTm9uZSwgTm9uZSwgTm9uZSksIE5vbmUpCiAgICAgICAgICMgaXQgbXVzdCBhbHNvIHJldHVybiBOb25lIGlmIGFuIGV4Y2VwdGlvbiB3YXMgZ2l2ZW4KICAgICAgICAgdHJ5OgotICAgICAgICAgICAgMSAvLyAwCisgICAgICAgICAgICAxLzAKICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5mLl9fZXhpdF9fKCpzeXMuZXhjX2luZm8oKSksIE5vbmUpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmlsZTJrLnB5IGIvTGliL3Rlc3QvdGVzdF9maWxlMmsucHkKaW5kZXggYmViYzQzZC4uYmY0N2M2ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9maWxlMmsucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9maWxlMmsucHkKQEAgLTM0LDE3ICszNCwxMyBAQAogICAgIGRlZiB0ZXN0QXR0cmlidXRlcyhzZWxmKToKICAgICAgICAgIyB2ZXJpZnkgZXhwZWN0ZWQgYXR0cmlidXRlcyBleGlzdAogICAgICAgICBmID0gc2VsZi5mCi0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHNvZnRzcGFjZSA9IGYuc29mdHNwYWNlCisgICAgICAgIHNvZnRzcGFjZSA9IGYuc29mdHNwYWNlCiAgICAgICAgIGYubmFtZSAgICAgIyBtZXJlbHkgc2hvdWxkbid0IGJsb3cgdXAKICAgICAgICAgZi5tb2RlICAgICAjIGRpdHRvCiAgICAgICAgIGYuY2xvc2VkICAgIyBkaXR0bwogCi0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgICMgdmVyaWZ5IHNvZnRzcGFjZSBpcyB3cml0YWJsZQotICAgICAgICAgICAgZi5zb2Z0c3BhY2UgPSBzb2Z0c3BhY2UgICAgIyBtZXJlbHkgc2hvdWxkbid0IGJsb3cgdXAKKyAgICAgICAgIyB2ZXJpZnkgc29mdHNwYWNlIGlzIHdyaXRhYmxlCisgICAgICAgIGYuc29mdHNwYWNlID0gc29mdHNwYWNlICAgICMgbWVyZWx5IHNob3VsZG4ndCBibG93IHVwCiAKICAgICAgICAgIyB2ZXJpZnkgdGhlIG90aGVycyBhcmVuJ3QKICAgICAgICAgZm9yIGF0dHIgaW4gJ25hbWUnLCAnbW9kZScsICdjbG9zZWQnOgpAQCAtMTAyLDggKzk4LDcgQEAKICAgICBkZWYgdGVzdE1ldGhvZHMoc2VsZik6CiAgICAgICAgIG1ldGhvZHMgPSBbJ2ZpbGVubycsICdmbHVzaCcsICdpc2F0dHknLCAnbmV4dCcsICdyZWFkJywgJ3JlYWRpbnRvJywKICAgICAgICAgICAgICAgICAgICAncmVhZGxpbmUnLCAncmVhZGxpbmVzJywgJ3NlZWsnLCAndGVsbCcsICd0cnVuY2F0ZScsCi0gICAgICAgICAgICAgICAgICAgJ3dyaXRlJywgJ19faXRlcl9fJ10KLSAgICAgICAgZGVwcmVjYXRlZF9tZXRob2RzID0gWyd4cmVhZGxpbmVzJ10KKyAgICAgICAgICAgICAgICAgICAnd3JpdGUnLCAneHJlYWRsaW5lcycsICdfX2l0ZXJfXyddCiAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdhdGhlb3MnKToKICAgICAgICAgICAgIG1ldGhvZHMucmVtb3ZlKCd0cnVuY2F0ZScpCiAKQEAgLTExNSwxOCArMTEwLDEzIEBACiAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYuZiwgbWV0aG9kbmFtZSkKICAgICAgICAgICAgICMgc2hvdWxkIHJhaXNlIG9uIGNsb3NlZCBmaWxlCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZXRob2QpCi0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgIGZvciBtZXRob2RuYW1lIGluIGRlcHJlY2F0ZWRfbWV0aG9kczoKLSAgICAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYuZiwgbWV0aG9kbmFtZSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZXRob2QpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuZi53cml0ZWxpbmVzLCBbXSkKIAogICAgICAgICAjIGZpbGUgaXMgY2xvc2VkLCBfX2V4aXRfXyBzaG91bGRuJ3QgZG8gYW55dGhpbmcKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5mLl9fZXhpdF9fKE5vbmUsIE5vbmUsIE5vbmUpLCBOb25lKQogICAgICAgICAjIGl0IG11c3QgYWxzbyByZXR1cm4gTm9uZSBpZiBhbiBleGNlcHRpb24gd2FzIGdpdmVuCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIDEgLy8gMAorICAgICAgICAgICAgMS8wCiAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuZi5fX2V4aXRfXygqc3lzLmV4Y19pbmZvKCkpLCBOb25lKQogCkBAIC0xOTIsMTIgKzE4MiwxMiBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBmID0gb3BlbihURVNURk4sIGJhZF9tb2RlKQogICAgICAgICBleGNlcHQgVmFsdWVFcnJvciwgbXNnOgotICAgICAgICAgICAgaWYgbXNnLmFyZ3NbMF0gIT0gMDoKKyAgICAgICAgICAgIGlmIG1zZ1swXSAhPSAwOgogICAgICAgICAgICAgICAgIHMgPSBzdHIobXNnKQogICAgICAgICAgICAgICAgIGlmIHMuZmluZChURVNURk4pICE9IC0xIG9yIHMuZmluZChiYWRfbW9kZSkgPT0gLTE6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiYmFkIGVycm9yIG1lc3NhZ2UgZm9yIGludmFsaWQgbW9kZTogJXMiICUgcykKLSAgICAgICAgICAgICMgaWYgbXNnLmFyZ3NbMF0gPT0gMCwgd2UncmUgcHJvYmFibHkgb24gV2luZG93cyB3aGVyZSB0aGVyZSBtYXkKLSAgICAgICAgICAgICMgYmUgbm8gb2J2aW91cyB3YXkgdG8gZGlzY292ZXIgd2h5IG9wZW4oKSBmYWlsZWQuCisgICAgICAgICAgICAjIGlmIG1zZ1swXSA9PSAwLCB3ZSdyZSBwcm9iYWJseSBvbiBXaW5kb3dzIHdoZXJlIHRoZXJlIG1heSBiZQorICAgICAgICAgICAgIyBubyBvYnZpb3VzIHdheSB0byBkaXNjb3ZlciB3aHkgb3BlbigpIGZhaWxlZC4KICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBlcnJvciBmb3IgaW52YWxpZCBtb2RlOiAlcyIgJSBiYWRfbW9kZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZnJhY3Rpb25zLnB5IGIvTGliL3Rlc3QvdGVzdF9mcmFjdGlvbnMucHkKaW5kZXggOWUzZmM1ZS4uZGU4ZTUzOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mcmFjdGlvbnMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mcmFjdGlvbnMucHkKQEAgLTQzLDEwICs0Myw2IEBACiAgICAgICAgIGFzc2VydCBGYWxzZSwgIl9fc3ViX18gc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wYXJpc29ucyIKICAgICBfX3JzdWJfXyA9IF9fc3ViX18KIAotICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICBkZWYgX19oYXNoX18oc2VsZik6Ci0gICAgICAgIGFzc2VydCBGYWxzZSwgIl9faGFzaF9fIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcGFyaXNvbnMiCi0KIAogY2xhc3MgRHVtbXlSYXRpb25hbChvYmplY3QpOgogICAgICIiIlRlc3QgY29tcGFyaXNvbiBvZiBGcmFjdGlvbiB3aXRoIGEgbmFpdmUgcmF0aW9uYWwgaW1wbGVtZW50YXRpb24uIiIiCkBAIC04MCwxMSArNzYsNiBAQAogICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CiAgICAgICAgIGFzc2VydCBGYWxzZSwgIl9fZmxvYXRfXyBzaG91bGQgbm90IGJlIGludm9rZWQiCiAKLSAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgZGVmIF9faGFzaF9fKHNlbGYpOgotICAgICAgICBhc3NlcnQgRmFsc2UsICJfX2hhc2hfXyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBhcmlzb25zIgotCi0KIGNsYXNzIEdjZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RNaXNjKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mdHBsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2Z0cGxpYi5weQppbmRleCBiMzkxNTYxLi5mYjlkNTViIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Z0cGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Z0cGxpYi5weQpAQCAtMTAwLDcgKzEwMCw3IEBACiAgICAgICAgIHNvY2subGlzdGVuKDUpCiAgICAgICAgIHNvY2suc2V0dGltZW91dCgyKQogICAgICAgICBpcCwgcG9ydCA9IHNvY2suZ2V0c29ja25hbWUoKVs6Ml0KLSAgICAgICAgaXAgPSBpcC5yZXBsYWNlKCcuJywgJywnKTsgcDEsIHAyID0gZGl2bW9kKHBvcnQsIDI1NikKKyAgICAgICAgaXAgPSBpcC5yZXBsYWNlKCcuJywgJywnKTsgcDEgPSBwb3J0IC8gMjU2OyBwMiA9IHBvcnQgJSAyNTYKICAgICAgICAgc2VsZi5wdXNoKCcyMjcgZW50ZXJpbmcgcGFzc2l2ZSBtb2RlICglcywlZCwlZCknICUoaXAsIHAxLCBwMikpCiAgICAgICAgIGNvbm4sIGFkZHIgPSBzb2NrLmFjY2VwdCgpCiAgICAgICAgIHNlbGYuZHRwID0gc2VsZi5kdHBfaGFuZGxlcihjb25uLCBiYXNlY2xhc3M9c2VsZikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZnVuY3Rvb2xzLnB5IGIvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKaW5kZXggYWE2NzJhYi4uYWI1YmFjMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKQEAgLTExNiw3ICsxMTYsNyBAQAogCiAgICAgZGVmIHRlc3RfZXJyb3JfcHJvcGFnYXRpb24oc2VsZik6CiAgICAgICAgIGRlZiBmKHgsIHkpOgotICAgICAgICAgICAgeCAvLyB5CisgICAgICAgICAgICB4IC8geQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgc2VsZi50aGV0eXBlKGYsIDEsIDApKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgc2VsZi50aGV0eXBlKGYsIDEpLCAwKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgc2VsZi50aGV0eXBlKGYpLCAxLCAwKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5IGIvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5CmluZGV4IDU3M2E1MTIuLmYxNDRhZTcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkKQEAgLTExLDcgKzExLDYgQEAKIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgY2hlY2tfc3ludGF4X2Vycm9yCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBzeXMKLWltcG9ydCB3YXJuaW5ncwogIyB0ZXN0aW5nIGltcG9ydCAqCiBmcm9tIHN5cyBpbXBvcnQgKgogCkBAIC0xNTMsOSArMTUyLDggQEAKICAgICAgICAgZjEoKigpLCAqKnt9KQogICAgICAgICBkZWYgZjIob25lX2FyZ3VtZW50KTogcGFzcwogICAgICAgICBkZWYgZjModHdvLCBhcmd1bWVudHMpOiBwYXNzCi0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgZXhlYygnZGVmIGY0KHR3bywgKGNvbXBvdW5kLCAoYXJndW1lbnQsIGxpc3QpKSk6IHBhc3MnKQotICAgICAgICBleGVjKCdkZWYgZjUoKGNvbXBvdW5kLCBmaXJzdCksIHR3byk6IHBhc3MnKQorICAgICAgICBkZWYgZjQodHdvLCAoY29tcG91bmQsIChhcmd1bWVudCwgbGlzdCkpKTogcGFzcworICAgICAgICBkZWYgZjUoKGNvbXBvdW5kLCBmaXJzdCksIHR3byk6IHBhc3MKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZjIuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLCAoJ29uZV9hcmd1bWVudCcsKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZjMuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLCAoJ3R3bycsICdhcmd1bWVudHMnKSkKICAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKQEAgLTE3NCw4ICsxNzIsNyBAQAogICAgICAgICBkZWYgdjAoKnJlc3QpOiBwYXNzCiAgICAgICAgIGRlZiB2MShhLCAqcmVzdCk6IHBhc3MKICAgICAgICAgZGVmIHYyKGEsIGIsICpyZXN0KTogcGFzcwotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIGV4ZWMoJ2RlZiB2MyhhLCAoYiwgYyksICpyZXN0KTogcmV0dXJuIGEsIGIsIGMsIHJlc3QnKQorICAgICAgICBkZWYgdjMoYSwgKGIsIGMpLCAqcmVzdCk6IHJldHVybiBhLCBiLCBjLCByZXN0CiAKICAgICAgICAgZjEoKQogICAgICAgICBmMigxKQpAQCAtMjgwLDEwICsyNzcsOSBAQAogICAgICAgICBkMjJ2KCooMSwgMiwgMywgNCkpCiAgICAgICAgIGQyMnYoMSwgMiwgKigzLCA0LCA1KSkKICAgICAgICAgZDIydigxLCAqKDIsIDMpLCAqKnsnZCc6IDR9KQotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIGV4ZWMoJ2RlZiBkMzF2KCh4KSk6IHBhc3MnKQotICAgICAgICBleGVjKCdkZWYgZDMydigoeCwpKTogcGFzcycpCisgICAgICAgIGRlZiBkMzF2KCh4KSk6IHBhc3MKICAgICAgICAgZDMxdigxKQorICAgICAgICBkZWYgZDMydigoeCwpKTogcGFzcwogICAgICAgICBkMzJ2KCgxLCkpCiAKICAgICAgICAgIyBrZXl3b3JkIGFyZ3VtZW50cyBhZnRlciAqYXJnbGlzdApAQCAtNDc4LDcgKzQ3NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgICAgICByYWlzZQotICAgICAgICAgICAgaWYgY291bnQgPiAyIG9yIGJpZ19oaXBwbyAhPSAxOgorICAgICAgICAgICAgaWYgY291bnQgPiAyIG9yIGJpZ19oaXBwbyA8PiAxOgogICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiY29udGludWUgdGhlbiBicmVhayBpbiB0cnkvZXhjZXB0IGluIGxvb3AgYnJva2VuISIpCiAgICAgICAgIHRlc3RfaW5uZXIoKQogCkBAIC02ODEsNiArNjc3LDcgQEAKICAgICAgICAgeCA9ICgxID09IDEpCiAgICAgICAgIGlmIDEgPT0gMTogcGFzcwogICAgICAgICBpZiAxICE9IDE6IHBhc3MKKyAgICAgICAgaWYgMSA8PiAxOiBwYXNzCiAgICAgICAgIGlmIDEgPCAxOiBwYXNzCiAgICAgICAgIGlmIDEgPiAxOiBwYXNzCiAgICAgICAgIGlmIDEgPD0gMTogcGFzcwpAQCAtNjg5LDEwICs2ODYsNyBAQAogICAgICAgICBpZiAxIGlzIG5vdCAxOiBwYXNzCiAgICAgICAgIGlmIDEgaW4gKCk6IHBhc3MKICAgICAgICAgaWYgMSBub3QgaW4gKCk6IHBhc3MKLSAgICAgICAgaWYgMSA8IDEgPiAxID09IDEgPj0gMSA8PSAxICE9IDEgaW4gMSBub3QgaW4gMSBpcyAxIGlzIG5vdCAxOiBwYXNzCi0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgaWYgZXZhbCgnMSA8PiAxJyk6IHBhc3MKLSAgICAgICAgaWYgZXZhbCgnMSA8IDEgPiAxID09IDEgPj0gMSA8PSAxIDw+IDEgIT0gMSBpbiAxIG5vdCBpbiAxIGlzIDEgaXMgbm90IDEnKTogcGFzcworICAgICAgICBpZiAxIDwgMSA+IDEgPT0gMSA+PSAxIDw9IDEgPD4gMSAhPSAxIGluIDEgbm90IGluIDEgaXMgMSBpcyBub3QgMTogcGFzcwogCiAgICAgZGVmIHRlc3RCaW5hcnlNYXNrT3BzKHNlbGYpOgogICAgICAgICB4ID0gMSAmIDEKQEAgLTc3NSwxMCArNzY5LDkgQEAKICAgICAgICAgeCA9IHsnb25lJzogMSwgJ3R3byc6IDIsfQogICAgICAgICB4ID0geydvbmUnOiAxLCAndHdvJzogMiwgJ3RocmVlJzogMywgJ2ZvdXInOiA0LCAnZml2ZSc6IDUsICdzaXgnOiA2fQogCi0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgeCA9IGV2YWwoJ2B4YCcpCi0gICAgICAgIHggPSBldmFsKCdgMSBvciAyIG9yIDNgJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCdgMSwyYCcpLCAnKDEsIDIpJykKKyAgICAgICAgeCA9IGB4YAorICAgICAgICB4ID0gYDEgb3IgMiBvciAzYAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGAxLDJgLCAnKDEsIDIpJykKIAogICAgICAgICB4ID0geAogICAgICAgICB4ID0gJ3gnCkBAIC05ODMsMTkgKzk3Niw3IEBACiAKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZ3MKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJiYWNrcXVvdGUgbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcpCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAidHVwbGUgcGFyYW1ldGVyIHVucGFja2luZyBoYXMgYmVlbiByZW1vdmVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZykKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJwYXJlbnRoZXNpemVkIGFyZ3VtZW50IG5hbWVzIGFyZSBpbnZhbGlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZykKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJjbGFzc2ljIGludCBkaXZpc2lvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIuKyBub3Qgc3VwcG9ydGVkIGluIDMueCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgcnVuX3VuaXR0ZXN0KFRva2VuVGVzdHMsIEdyYW1tYXJUZXN0cykKKyAgICBydW5fdW5pdHRlc3QoVG9rZW5UZXN0cywgR3JhbW1hclRlc3RzKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2d6aXAucHkgYi9MaWIvdGVzdC90ZXN0X2d6aXAucHkKaW5kZXggZWQ1YWE5Ni4uNjAwOTRkYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nemlwLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ3ppcC5weQpAQCAtMjQ2LDExICsyNDYsMTEgQEAKICAgICAgICAgICAgIHNlbGYuZmFpbCgiX19lbnRlcl9fIG9uIGEgY2xvc2VkIGZpbGUgZGlkbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiIpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHdpdGggZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lLCAid2IiKSBhcyBmOgotICAgICAgICAgICAgICAgIDEgLy8gMAorICAgICAgICAgICAgICAgIDEvMAogICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmZhaWwoIjEgLy8gMCBkaWRuJ3QgcmFpc2UgYW4gZXhjZXB0aW9uIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiMS8wIGRpZG4ndCByYWlzZSBhbiBleGNlcHRpb24iKQogCiBkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0R3ppcCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaGVhcHEucHkgYi9MaWIvdGVzdC90ZXN0X2hlYXBxLnB5CmluZGV4IDIwZWNlZWQuLmUzNzczODQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaGVhcHEucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9oZWFwcS5weQpAQCAtMzU2LDggKzM1Niw3IEBACiAgICAgICAgIGZvciBmIGluIChzZWxmLm1vZHVsZS5ubGFyZ2VzdCwgc2VsZi5tb2R1bGUubnNtYWxsZXN0KToKICAgICAgICAgICAgIGZvciBzIGluICgiMTIzIiwgIiIsIHJhbmdlKDEwMDApLCAoJ2RvJywgMS4yKSwgeHJhbmdlKDIwMDAsMjIwMCw1KSk6CiAgICAgICAgICAgICAgICAgZm9yIGcgaW4gKEcsIEksIElnLCBMLCBSKToKLSAgICAgICAgICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZigyLCBnKHMpKSwgZigyLHMpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoMiwgZyhzKSksIGYoMixzKSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoMiwgUyhzKSksIFtdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZiwgMiwgWChzKSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYsIDIsIE4ocykpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2hvdHNob3QucHkgYi9MaWIvdGVzdC90ZXN0X2hvdHNob3QucHkKaW5kZXggYzZkYWUzNi4uMzhhOGRkZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ob3RzaG90LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaG90c2hvdC5weQpAQCAtMSwzICsxLDUgQEAKK2ltcG9ydCBob3RzaG90CitpbXBvcnQgaG90c2hvdC5sb2cKIGltcG9ydCBvcwogaW1wb3J0IHBwcmludAogaW1wb3J0IHVuaXR0ZXN0CkBAIC03LDggKzksNiBAQAogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogCi0jIFNpbGVuY2UgUHkzayB3YXJuaW5nCi1ob3RzaG90ID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2hvdHNob3QnLCBkZXByZWNhdGVkPVRydWUpCiBmcm9tIGhvdHNob3QubG9nIGltcG9ydCBFTlRFUiwgRVhJVCwgTElORQogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnQucHkKaW5kZXggNWY1NGI1Ny4uMzEzNzVkYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnQucHkKQEAgLTcsNyArNyw2IEBACiBpbXBvcnQgcHlfY29tcGlsZQogaW1wb3J0IHdhcm5pbmdzCiBpbXBvcnQgbWFyc2hhbAotZnJvbSBpbXAgaW1wb3J0IHJlbG9hZAogZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgKHVubGluaywgVEVTVEZOLCB1bmxvYWQsIHJ1bl91bml0dGVzdCwKICAgICBjaGVja193YXJuaW5ncywgVGVzdEZhaWxlZCwgRW52aXJvbm1lbnRWYXJHdWFyZCkKIApAQCAtNTcsMTAgKzU2LDExIEBACiAgICAgICAgICAgICBmLmNsb3NlKCkKIAogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG1vZCA9IF9faW1wb3J0X18oVEVTVEZOKQotICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCBlcnI6Ci0gICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJpbXBvcnQgZnJvbSAlcyBmYWlsZWQ6ICVzIiAlIChleHQsIGVycikpCi0gICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbW9kID0gX19pbXBvcnRfXyhURVNURk4pCisgICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCBlcnI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiaW1wb3J0IGZyb20gJXMgZmFpbGVkOiAlcyIgJSAoZXh0LCBlcnIpKQorCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobW9kLmEsIGEsCiAgICAgICAgICAgICAgICAgICAgICJtb2R1bGUgbG9hZGVkICglcykgYnV0IGNvbnRlbnRzIGludmFsaWQiICUgbW9kKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1vZC5iLCBiLApAQCAtNjksOSArNjksMTAgQEAKICAgICAgICAgICAgICAgICBvcy51bmxpbmsoc291cmNlKQogCiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcmVsb2FkKG1vZCkKLSAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciwgZXJyOgotICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiaW1wb3J0IGZyb20gLnB5Yy8ucHlvIGZhaWxlZDogJXMiICUgZXJyKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmVsb2FkKG1vZCkKKyAgICAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJpbXBvcnQgZnJvbSAucHljLy5weW8gZmFpbGVkOiAlcyIgJSBlcnIpCiAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHB5YykKQEAgLTE3MSw3ICsxNzIsNyBAQAogICAgIGRlZiB0ZXN0X2ZhaWxpbmdfaW1wb3J0X3N0aWNrcyhzZWxmKToKICAgICAgICAgc291cmNlID0gVEVTVEZOICsgb3MuZXh0c2VwICsgInB5IgogICAgICAgICBmID0gb3Blbihzb3VyY2UsICJ3IikKLSAgICAgICAgcHJpbnQgPj4gZiwgImEgPSAxIC8vIDAiCisgICAgICAgIHByaW50ID4+IGYsICJhID0gMS8wIgogICAgICAgICBmLmNsb3NlKCkKIAogICAgICAgICAjIE5ldyBpbiAyLjQsIHdlIHNob3VsZG4ndCBiZSBhYmxlIHRvIGltcG9ydCB0aGF0IG5vIG1hdHRlciBob3cgb2Z0ZW4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0aG9va3MucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGhvb2tzLnB5CmluZGV4IGYzNDUyZmEuLjdmZDhjNjIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0aG9va3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRob29rcy5weQpAQCAtMTgwLDcgKzE4MCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihyZWxvYWRtb2R1bGUsJ3JlbG9hZGVkJykpCiAKICAgICAgICAgVGVzdEltcG9ydGVyLm1vZHVsZXNbJ3JlbG9hZG1vZHVsZSddID0gKEZhbHNlLCByZWxvYWRfY28pCi0gICAgICAgIGltcC5yZWxvYWQocmVsb2FkbW9kdWxlKQorICAgICAgICByZWxvYWQocmVsb2FkbW9kdWxlKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihyZWxvYWRtb2R1bGUsJ3JlbG9hZGVkJykpCiAKICAgICAgICAgaW1wb3J0IGhvb2t0ZXN0cGFja2FnZS5vbGRhYnMKQEAgLTI0NywxMSArMjQ3LDkgQEAKICAgICAgICAgICAgIGZvciBuIGluIHN5cy5tb2R1bGVzLmtleXMoKToKICAgICAgICAgICAgICAgICBpZiBuLnN0YXJ0c3dpdGgocGFyZW50KToKICAgICAgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW25dCi0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgIGZvciBtbmFtZSBpbiBtbmFtZXM6Ci0gICAgICAgICAgICAgICAgbSA9IF9faW1wb3J0X18obW5hbWUsIGdsb2JhbHMoKSwgbG9jYWxzKCksIFsiX19kdW1teV9fIl0pCi0gICAgICAgICAgICAgICAgbS5fX2xvYWRlcl9fICAjIHRvIG1ha2Ugc3VyZSB3ZSBhY3R1YWxseSBoYW5kbGVkIHRoZSBpbXBvcnQKKyAgICAgICAgZm9yIG1uYW1lIGluIG1uYW1lczoKKyAgICAgICAgICAgIG0gPSBfX2ltcG9ydF9fKG1uYW1lLCBnbG9iYWxzKCksIGxvY2FscygpLCBbIl9fZHVtbXlfXyJdKQorICAgICAgICAgICAgbS5fX2xvYWRlcl9fICAjIHRvIG1ha2Ugc3VyZSB3ZSBhY3R1YWxseSBoYW5kbGVkIHRoZSBpbXBvcnQKIAogCiBkZWYgdGVzdF9tYWluKCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkgYi9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKaW5kZXggMTQ0ZmNmMy4uZjIwYjI2YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQpAQCAtNCwxMSArNCwxMCBAQAogaW1wb3J0IGluc3BlY3QKIGltcG9ydCBkYXRldGltZQogCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIHJ1bl91bml0dGVzdCwgY2hlY2tfd2FybmluZ3MKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0CiAKLXdpdGggY2hlY2tfd2FybmluZ3MoKToKLSAgICBmcm9tIHRlc3QgaW1wb3J0IGluc3BlY3RfZm9kZGVyIGFzIG1vZAotICAgIGZyb20gdGVzdCBpbXBvcnQgaW5zcGVjdF9mb2RkZXIyIGFzIG1vZDIKK2Zyb20gdGVzdCBpbXBvcnQgaW5zcGVjdF9mb2RkZXIgYXMgbW9kCitmcm9tIHRlc3QgaW1wb3J0IGluc3BlY3RfZm9kZGVyMiBhcyBtb2QyCiAKICMgQyBtb2R1bGUgZm9yIHRlc3RfZmluZHNvdXJjZV9iaW5hcnkKIGltcG9ydCB1bmljb2RlZGF0YQpAQCAtMzAsNyArMjksNyBAQAogaW1wb3J0IF9fYnVpbHRpbl9fCiAKIHRyeToKLSAgICAxIC8vIDAKKyAgICAxLzAKIGV4Y2VwdDoKICAgICB0YiA9IHN5cy5leGNfdHJhY2ViYWNrCiAKQEAgLTE2OCw3ICsxNjcsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdpdC50clsxXVsxOl0sIChtb2RmaWxlLCA5LCAnc3BhbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnICAgIGVnZ3MoYiArIGQsIGMgKyBmKVxuJ10sIDApKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdpdC50clsyXVsxOl0sIChtb2RmaWxlLCAxOCwgJ2VnZ3MnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJyAgICBxID0geSAvLyAwXG4nXSwgMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnICAgIHEgPSB5IC8gMFxuJ10sIDApKQogCiAgICAgZGVmIHRlc3RfZnJhbWUoc2VsZik6CiAgICAgICAgIGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBsb2NhbHMgPSBpbnNwZWN0LmdldGFyZ3ZhbHVlcyhtb2QuZnIpCkBAIC00MTksMTMgKzQxOCwxMSBAQAogICAgICAgICBzZWxmLmFzc2VydEFyZ1NwZWNFcXVhbHMoQS5tLCBbJ3NlbGYnXSkKIAogICAgIGRlZiB0ZXN0X2dldGFyZ3NwZWNfc3VibGlzdG9mb25lKHNlbGYpOgotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgIGV4ZWMgJ2RlZiBzdWJsaXN0T2ZPbmUoKGZvbywpKTogcmV0dXJuIDEnCi0gICAgICAgICAgICBzZWxmLmFzc2VydEFyZ1NwZWNFcXVhbHMoc3VibGlzdE9mT25lLCBbWydmb28nXV0pCisgICAgICAgIGRlZiBzdWJsaXN0T2ZPbmUoKGZvbywpKTogcmV0dXJuIDEKKyAgICAgICAgc2VsZi5hc3NlcnRBcmdTcGVjRXF1YWxzKHN1Ymxpc3RPZk9uZSwgW1snZm9vJ11dKQogCi0gICAgICAgICAgICBleGVjICdkZWYgZmFrZVN1Ymxpc3RPZk9uZSgoZm9vKSk6IHJldHVybiAxJwotICAgICAgICAgICAgc2VsZi5hc3NlcnRBcmdTcGVjRXF1YWxzKGZha2VTdWJsaXN0T2ZPbmUsIFsnZm9vJ10pCisgICAgICAgIGRlZiBmYWtlU3VibGlzdE9mT25lKChmb28pKTogcmV0dXJuIDEKKyAgICAgICAgc2VsZi5hc3NlcnRBcmdTcGVjRXF1YWxzKGZha2VTdWJsaXN0T2ZPbmUsIFsnZm9vJ10pCiAKICAgICBkZWYgdGVzdF9jbGFzc2lmeV9vbGRzdHlsZShzZWxmKToKICAgICAgICAgY2xhc3MgQToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW8ucHkgYi9MaWIvdGVzdC90ZXN0X2lvLnB5CmluZGV4IDQ4ZmZkNDUuLmE5MGRkNTAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW8ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pby5weQpAQCAtMzgxLDExICszODEsMTEgQEAKICAgICAgICAgICAgIGYgPSBOb25lCiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIsIGJ1ZnNpemUpIGFzIGY6Ci0gICAgICAgICAgICAgICAgICAgIDEgLy8gMAorICAgICAgICAgICAgICAgICAgICAxLzAKICAgICAgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuY2xvc2VkLCBUcnVlKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIjEgLy8gMCBkaWRuJ3QgcmFpc2UgYW4gZXhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIjEvMCBkaWRuJ3QgcmFpc2UgYW4gZXhjZXB0aW9uIikKIAogICAgICMgaXNzdWUgNTAwOAogICAgIGRlZiB0ZXN0X2FwcGVuZF9tb2RlX3RlbGwoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2l0ZXIucHkgYi9MaWIvdGVzdC90ZXN0X2l0ZXIucHkKaW5kZXggNWU5NmM2ZC4uZjVkNmU2OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pdGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaXRlci5weQpAQCAtMSw4ICsxLDcgQEAKICMgVGVzdCBpdGVyYXRvcnMuCiAKIGltcG9ydCB1bml0dGVzdAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBURVNURk4sIHVubGluaywgaGF2ZV91bmljb2RlLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja193YXJuaW5ncworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBURVNURk4sIHVubGluaywgaGF2ZV91bmljb2RlCiAKICMgVGVzdCByZXN1bHQgb2YgdHJpcGxlIGxvb3AgKHRvbyBiaWcgdG8gaW5saW5lKQogVFJJUExFVFMgPSBbKDAsIDAsIDApLCAoMCwgMCwgMSksICgwLCAwLCAyKSwKQEAgLTM5NiwxMiArMzk1LDcgQEAKICAgICAgICAgICAgICAgICBwYXNzCiAKICAgICAjIFRlc3QgbWFwKCkncyB1c2Ugb2YgaXRlcmF0b3JzLgotICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfYnVpbHRpbl9tYXAoc2VsZik6Ci0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2l0aCBjaGVja193YXJuaW5ncygpOgotICAgICAgICAgICAgc2VsZi5fdGVzdF9idWlsdGluX21hcCgpCi0KLSAgICBkZWYgX3Rlc3RfYnVpbHRpbl9tYXAoc2VsZik6CisgICAgZGVmIHRlc3RfYnVpbHRpbl9tYXAoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFwKE5vbmUsIFNlcXVlbmNlQ2xhc3MoNSkpLCByYW5nZSg1KSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXAobGFtYmRhIHg6IHgrMSwgU2VxdWVuY2VDbGFzcyg1KSksIHJhbmdlKDEsIDYpKQogCkBAIC01MTIsMTIgKzUwNiw3IEBACiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoeCwgeSksIGV4cGVjdGVkKQogCiAgICAgIyBUZXN0IHJlZHVjZXMoKSdzIHVzZSBvZiBpdGVyYXRvcnMuCi0gICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9idWlsdGluX3JlZHVjZShzZWxmKToKLSAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZwotICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICBzZWxmLl90ZXN0X2J1aWx0aW5fcmVkdWNlKCkKLQotICAgIGRlZiBfdGVzdF9idWlsdGluX3JlZHVjZShzZWxmKToKKyAgICBkZWYgdGVzdF9idWlsdGluX3JlZHVjZShzZWxmKToKICAgICAgICAgZnJvbSBvcGVyYXRvciBpbXBvcnQgYWRkCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVkdWNlKGFkZCwgU2VxdWVuY2VDbGFzcyg1KSksIDEwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZShhZGQsIFNlcXVlbmNlQ2xhc3MoNSksIDQyKSwgNTIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2l0ZXJ0b29scy5weSBiL0xpYi90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5CmluZGV4IGQ2OWFlY2YuLjAzZjFkODUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5CkBAIC05LDcgKzksNiBAQAogaW1wb3J0IHJhbmRvbQogaW1wb3J0IGNvcHkKIGltcG9ydCBwaWNrbGUKLWZyb20gZnVuY3Rvb2xzIGltcG9ydCByZWR1Y2UKIG1heHNpemUgPSB0ZXN0X3N1cHBvcnQuTUFYX1B5X3NzaXplX3QKIG1pbnNpemUgPSAtbWF4c2l6ZS0xCiAKQEAgLTEyMyw3ICsxMjIsNyBAQAogICAgICAgICAgICAgdmFsdWVzID0gWzUqeC0xMiBmb3IgeCBpbiByYW5nZShuKV0KICAgICAgICAgICAgIGZvciByIGluIHJhbmdlKG4rMik6CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGlzdChjb21iaW5hdGlvbnModmFsdWVzLCByKSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQpLCAwIGlmIHI+biBlbHNlIGZhY3QobikgLy8gZmFjdChyKSAvLyBmYWN0KG4tcikpICMgcmlnaHQgbnVtYmVyIG9mIGNvbWJzCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0KSwgMCBpZiByPm4gZWxzZSBmYWN0KG4pIC8gZmFjdChyKSAvIGZhY3Qobi1yKSkgIyByaWdodCBudW1iZXIgb2YgY29tYnMKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQpLCBsZW4oc2V0KHJlc3VsdCkpKSAgICAgICAgICMgbm8gcmVwZWF0cwogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzb3J0ZWQocmVzdWx0KSkgICAgICAgICAgICAgICAgIyBsZXhpY29ncmFwaGljIG9yZGVyCiAgICAgICAgICAgICAgICAgZm9yIGMgaW4gcmVzdWx0OgpAQCAtMTc5LDcgKzE3OCw3IEBACiAgICAgICAgIGRlZiBudW1jb21icyhuLCByKToKICAgICAgICAgICAgIGlmIG5vdCBuOgogICAgICAgICAgICAgICAgIHJldHVybiAwIGlmIHIgZWxzZSAxCi0gICAgICAgICAgICByZXR1cm4gZmFjdChuK3ItMSkgLy8gZmFjdChyKSAvLyBmYWN0KG4tMSkKKyAgICAgICAgICAgIHJldHVybiBmYWN0KG4rci0xKSAvIGZhY3QocikvIGZhY3Qobi0xKQogCiAgICAgICAgIGZvciBuIGluIHJhbmdlKDcpOgogICAgICAgICAgICAgdmFsdWVzID0gWzUqeC0xMiBmb3IgeCBpbiByYW5nZShuKV0KQEAgLTI1OCw3ICsyNTcsNyBAQAogICAgICAgICAgICAgdmFsdWVzID0gWzUqeC0xMiBmb3IgeCBpbiByYW5nZShuKV0KICAgICAgICAgICAgIGZvciByIGluIHJhbmdlKG4rMik6CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGlzdChwZXJtdXRhdGlvbnModmFsdWVzLCByKSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQpLCAwIGlmIHI+biBlbHNlIGZhY3QobikgLy8gZmFjdChuLXIpKSAgICAgICMgcmlnaHQgbnVtYmVyIG9mIHBlcm1zCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0KSwgMCBpZiByPm4gZWxzZSBmYWN0KG4pIC8gZmFjdChuLXIpKSAgICAgICMgcmlnaHQgbnVtYmVyIG9mIHBlcm1zCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0KSwgbGVuKHNldChyZXN1bHQpKSkgICAgICAgICAjIG5vIHJlcGVhdHMKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc29ydGVkKHJlc3VsdCkpICAgICAgICAgICAgICAgICMgbGV4aWNvZ3JhcGhpYyBvcmRlcgogICAgICAgICAgICAgICAgIGZvciBwIGluIHJlc3VsdDoKQEAgLTI4OSw5ICsyODgsOSBAQAogCiAgICAgICAgICAgICAgICAgIyBDaGVjayBzaXplCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHByb2QpLCBuKipyKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjd3IpLCAoZmFjdChuK3ItMSkgLy8gZmFjdChyKSAvLyBmYWN0KG4tMSkpIGlmIG4gZWxzZSAobm90IHIpKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihwZXJtKSwgMCBpZiByPm4gZWxzZSBmYWN0KG4pIC8vIGZhY3Qobi1yKSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oY29tYiksIDAgaWYgcj5uIGVsc2UgZmFjdChuKSAvLyBmYWN0KHIpIC8vIGZhY3Qobi1yKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oY3dyKSwgKGZhY3QobityLTEpIC8gZmFjdChyKS8gZmFjdChuLTEpKSBpZiBuIGVsc2UgKG5vdCByKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocGVybSksIDAgaWYgcj5uIGVsc2UgZmFjdChuKSAvIGZhY3Qobi1yKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oY29tYiksIDAgaWYgcj5uIGVsc2UgZmFjdChuKSAvIGZhY3QocikgLyBmYWN0KG4tcikpCiAKICAgICAgICAgICAgICAgICAjIENoZWNrIGxleGljb2dyYXBoaWMgb3JkZXIgd2l0aG91dCByZXBlYXRlZCB0dXBsZXMKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhwcm9kLCBzb3J0ZWQoc2V0KHByb2QpKSkKQEAgLTU0NCw4ICs1NDMsNyBAQAogICAgICAgICAgICAgICAgIFtyYW5nZSgxMDAwKSwgcmFuZ2UoMCksIHJhbmdlKDMwMDAsMzA1MCksIHJhbmdlKDEyMDApLCByYW5nZSgxNTAwKV0sCiAgICAgICAgICAgICAgICAgW3JhbmdlKDEwMDApLCByYW5nZSgwKSwgcmFuZ2UoMzAwMCwzMDUwKSwgcmFuZ2UoMTIwMCksIHJhbmdlKDE1MDApLCByYW5nZSgwKV0sCiAgICAgICAgICAgICBdOgotICAgICAgICAgICAgdGFyZ2V0ID0gW3R1cGxlKFthcmdbaV0gaWYgaSA8IGxlbihhcmcpIGVsc2UgTm9uZSBmb3IgYXJnIGluIGFyZ3NdKQotICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG1heChtYXAobGVuLCBhcmdzKSkpXQorICAgICAgICAgICAgdGFyZ2V0ID0gbWFwKE5vbmUsICphcmdzKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl6aXBfbG9uZ2VzdCgqYXJncykpLCB0YXJnZXQpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXppcF9sb25nZXN0KCphcmdzLCAqKnt9KSksIHRhcmdldCkKICAgICAgICAgICAgIHRhcmdldCA9IFt0dXBsZSgoZSBpcyBOb25lIGFuZCAnWCcgb3IgZSkgZm9yIGUgaW4gdCkgZm9yIHQgaW4gdGFyZ2V0XSAgICMgUmVwbGFjZSBOb25lIGZpbGxzIHdpdGggJ1gnCkBAIC01NTcsOCArNTU1LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl6aXBfbG9uZ2VzdChbXSkpLCB6aXAoW10pKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXppcF9sb25nZXN0KCdhYmNkZWYnKSksIHppcCgnYWJjZGVmJykpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl6aXBfbG9uZ2VzdCgnYWJjJywgJ2RlZmcnLCAqKnt9KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgemlwKGxpc3QoJ2FiYycpICsgW05vbmVdLCAnZGVmZycpKSAgIyBlbXB0eSBrZXl3b3JkIGRpY3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl6aXBfbG9uZ2VzdCgnYWJjJywgJ2RlZmcnLCAqKnt9KSksIG1hcChOb25lLCAnYWJjJywgJ2RlZmcnKSkgIyBlbXB0eSBrZXl3b3JkIGRpY3QKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpemlwX2xvbmdlc3QsIDMpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaXppcF9sb25nZXN0LCByYW5nZSgzKSwgMykKIApAQCAtMTQzNCw3ICsxNDMxLDcgQEAKICMgaXMgZGlmZmVyZW5jaW5nIHdpdGggYSByYW5nZSBzbyB0aGF0IGNvbnNlY3V0aXZlIG51bWJlcnMgYWxsIGFwcGVhciBpbgogIyBzYW1lIGdyb3VwLgogPj4+IGRhdGEgPSBbIDEsICA0LDUsNiwgMTAsIDE1LDE2LDE3LDE4LCAyMiwgMjUsMjYsMjcsMjhdCi0+Pj4gZm9yIGssIGcgaW4gZ3JvdXBieShlbnVtZXJhdGUoZGF0YSksIGxhbWJkYSB0OnRbMF0tdFsxXSk6Cis+Pj4gZm9yIGssIGcgaW4gZ3JvdXBieShlbnVtZXJhdGUoZGF0YSksIGxhbWJkYSAoaSx4KTppLXgpOgogLi4uICAgICBwcmludCBtYXAob3BlcmF0b3IuaXRlbWdldHRlcigxKSwgZykKIC4uLgogWzFdCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2pzb24ucHkgYi9MaWIvdGVzdC90ZXN0X2pzb24ucHkKaW5kZXggYmI5OWRhYi4uN2I4ZjNkZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9qc29uLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfanNvbi5weQpAQCAtNywxNSArNywxMCBAQAogCiBpbXBvcnQganNvbi50ZXN0cwogaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0Ci1pbXBvcnQgd2FybmluZ3MKIAogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiY29tcGFyaW5nIHVuZXF1YWwgdHlwZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IHN1cHBvcnRlZCIsIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KGpzb24udGVzdHMudGVzdF9zdWl0ZSgpKQorICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChqc29uLnRlc3RzLnRlc3Rfc3VpdGUoKSkKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9saW51eGF1ZGlvZGV2LnB5IGIvTGliL3Rlc3QvdGVzdF9saW51eGF1ZGlvZGV2LnB5CmluZGV4IDM3NzJhNTguLjcxZDA2MzMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbGludXhhdWRpb2Rldi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2xpbnV4YXVkaW9kZXYucHkKQEAgLTQsMTMgKzQsMTIgQEAKIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGZpbmRmaWxlLCBydW5fdW5pdHRlc3QKIAogaW1wb3J0IGVycm5vCitsaW51eGF1ZGlvZGV2ID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2xpbnV4YXVkaW9kZXYnLCBkZXByZWNhdGVkPVRydWUpCiBpbXBvcnQgc3lzCitpbXBvcnQgc3VuYXVkaW8KIGltcG9ydCBhdWRpb29wCiBpbXBvcnQgdW5pdHRlc3QKIAotbGludXhhdWRpb2RldiA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdsaW51eGF1ZGlvZGV2JywgZGVwcmVjYXRlZD1UcnVlKQotc3VuYXVkaW8gPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnc3VuYXVkaW8nLCBkZXByZWNhdGVkPVRydWUpCi0KIFNORF9GT1JNQVRfTVVMQVdfOCA9IDEKIAogY2xhc3MgTGludXhBdWRpb0RldlRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbG9uZy5weSBiL0xpYi90ZXN0L3Rlc3RfbG9uZy5weQppbmRleCBhZDg0NTg5Li4xOTQzNTE4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xvbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9sb25nLnB5CkBAIC01NzUsMTMgKzU3NSwxMSBAQAogICAgICAgICAgICAgZGVmIF9fZ2V0c2xpY2VfXyhzZWxmLCBpLCBqKToKICAgICAgICAgICAgICAgICByZXR1cm4gaSwgagogCi0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWCgpWy01TDo3TF0sICgtNSwgNykpCi0gICAgICAgICAgICAjIHVzZSB0aGUgY2xhbXBpbmcgZWZmZWN0IHRvIHRlc3QgdGhlIHNtYWxsZXN0IGFuZCBsYXJnZXN0IGxvbmdzCi0gICAgICAgICAgICAjIHRoYXQgZml0IGEgUHlfc3NpemVfdAotICAgICAgICAgICAgc2xpY2VtaW4sIHNsaWNlbWF4ID0gWCgpWy0yTCoqMTAwOjJMKioxMDBdCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgoKVtzbGljZW1pbjpzbGljZW1heF0sIChzbGljZW1pbiwgc2xpY2VtYXgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgoKVstNUw6N0xdLCAoLTUsIDcpKQorICAgICAgICAjIHVzZSB0aGUgY2xhbXBpbmcgZWZmZWN0IHRvIHRlc3QgdGhlIHNtYWxsZXN0IGFuZCBsYXJnZXN0IGxvbmdzCisgICAgICAgICMgdGhhdCBmaXQgYSBQeV9zc2l6ZV90CisgICAgICAgIHNsaWNlbWluLCBzbGljZW1heCA9IFgoKVstMkwqKjEwMDoyTCoqMTAwXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgoKVtzbGljZW1pbjpzbGljZW1heF0sIChzbGljZW1pbiwgc2xpY2VtYXgpKQogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRlc3RzIG9mIGF1dG8gaW50LT5sb25nIGNvbnZlcnNpb24KIApAQCAtNjIxLDEwICs2MTksOCBAQAogICAgICAgICAgICAgICAgIGNoZWNraXQoeCwgJyonLCB5KQogCiAgICAgICAgICAgICAgICAgaWYgeToKLSAgICAgICAgICAgICAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZwotICAgICAgICAgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygpOgotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsb25neCAvIGxvbmd5Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3QgPSB4IC8geQorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGxvbmd4IC8gbG9uZ3kKKyAgICAgICAgICAgICAgICAgICAgZ290ID0geCAvIHkKICAgICAgICAgICAgICAgICAgICAgY2hlY2tpdCh4LCAnLycsIHkpCiAKICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsb25neCAvLyBsb25neQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tYWlsYm94LnB5IGIvTGliL3Rlc3QvdGVzdF9tYWlsYm94LnB5CmluZGV4IDAxYjFjMzYuLjU0ODg1MGEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weQorKysgYi9MaWIvdGVzdC90ZXN0X21haWxib3gucHkKQEAgLTUsNiArNSw3IEBACiBpbXBvcnQgc29ja2V0CiBpbXBvcnQgZW1haWwKIGltcG9ydCBlbWFpbC5tZXNzYWdlCitpbXBvcnQgcmZjODIyCiBpbXBvcnQgcmUKIGltcG9ydCBTdHJpbmdJTwogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKQEAgLTE2LDggKzE3LDYgQEAKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBwYXNzCiAKLSMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLXJmYzgyMiA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdyZmM4MjInKQogCiBjbGFzcyBUZXN0QmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWFyc2hhbC5weSBiL0xpYi90ZXN0L3Rlc3RfbWFyc2hhbC5weQppbmRleCBhZjg5ZDE4Li43NjY5MTgyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21hcnNoYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tYXJzaGFsLnB5CkBAIC0xMjksOSArMTI5LDcgQEAKIAogICAgIGRlZiB0ZXN0X2J1ZmZlcihzZWxmKToKICAgICAgICAgZm9yIHMgaW4gWyIiLCAiQW5kcuggUHJldmluIiwgImFiYyIsICIgIioxMDAwMF06Ci0gICAgICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygpOgotICAgICAgICAgICAgICAgIGIgPSBidWZmZXIocykKKyAgICAgICAgICAgIGIgPSBidWZmZXIocykKICAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhiKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgbmV3KQogICAgICAgICAgICAgbWFyc2hhbC5kdW1wKGIsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQucHkKaW5kZXggMzYyNDViNy4uM2FmZTNhOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5weQpAQCAtMzA3LDcgKzMwNyw3IEBACiAgICAgICAgICAgICAgICAgY29udGludWUKIAogICAgICAgICAgICAgdW5pY2ggPSB1bmljaHJzKGRhdGFbMV0pCi0gICAgICAgICAgICBpZiBvcmQodW5pY2gpID09IDB4ZmZmZCBvciB1bmljaCBpbiB1cnRfd2E6CisgICAgICAgICAgICBpZiBvcmQodW5pY2gpID09IDB4ZmZmZCBvciB1cnRfd2EuaGFzX2tleSh1bmljaCk6CiAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIHVydF93YVt1bmljaF0gPSBjc2V0Y2gKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tdWx0aWZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X211bHRpZmlsZS5weQppbmRleCBmZDA5NjAyLi5kYWY3ZGRlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X211bHRpZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X211bHRpZmlsZS5weQpAQCAtMSw1ICsxLDUgQEAKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Ci1taW1ldG9vbHMgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgibWltZXRvb2xzIiwgZGVwcmVjYXRlZD1UcnVlKQoraW1wb3J0IG1pbWV0b29scwogbXVsdGlmaWxlID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ211bHRpZmlsZScsIGRlcHJlY2F0ZWQ9VHJ1ZSkKIGltcG9ydCBjU3RyaW5nSU8KIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmcucHkgYi9MaWIvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZy5weQppbmRleCA5NGQ0ZGQwLi5iNmM2YTg0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZy5weQpAQCAtMTksNyArMTksNiBAQAogaW1wb3J0IGxvZ2dpbmcKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotaW1wb3J0IHdhcm5pbmdzCiAKIAogX211bHRpcHJvY2Vzc2luZyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdfbXVsdGlwcm9jZXNzaW5nJykKQEAgLTE5OTIsMTEgKzE5OTEsNyBAQAogCiAgICAgbG9hZFRlc3RzRnJvbVRlc3RDYXNlID0gdW5pdHRlc3QuZGVmYXVsdFRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlCiAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUobG9hZFRlc3RzRnJvbVRlc3RDYXNlKHRjKSBmb3IgdGMgaW4gdGVzdGNhc2VzKQotICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZ3MKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIuK3NsaWNlX18gaGFzIGJlZW4gcmVtb3ZlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgcnVuKHN1aXRlKQorICAgIHJ1bihzdWl0ZSkKIAogICAgIFRocmVhZHNNaXhpbi5wb29sLnRlcm1pbmF0ZSgpCiAgICAgUHJvY2Vzc2VzTWl4aW4ucG9vbC50ZXJtaW5hdGUoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tdXRhbnRzLnB5IGIvTGliL3Rlc3QvdGVzdF9tdXRhbnRzLnB5CmluZGV4IDY5YzM4MWUuLmEyMTk0NTAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbXV0YW50cy5weQorKysgYi9MaWIvdGVzdC90ZXN0X211dGFudHMucHkKQEAgLTIxMCw3ICsyMTAsNyBAQAogICAgICAgICAjIFRpbSBzZXo6ICAibHVjayBvZiB0aGUgZHJhdzsgY3Jhc2hlcyB3aXRoIG9yIHdpdGhvdXQgZm9yIG1lLiIKICAgICAgICAgcHJpbnQgPj4gZgogCi0gICAgICAgIHJldHVybiByZXByKCJtYWNoaWF2ZWxsaSIpCisgICAgICAgIHJldHVybiBgIm1hY2hpYXZlbGxpImAKIAogICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICAgcmV0dXJuIDAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3Bjb2Rlcy5weSBiL0xpYi90ZXN0L3Rlc3Rfb3Bjb2Rlcy5weQppbmRleCA2YzlmZDU4Li5jMDNjYTFkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X29wY29kZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcGNvZGVzLnB5CkBAIC0yLDcgKzIsNiBAQAogCiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IHdhcm5pbmdzCiAKIGNsYXNzIE9wY29kZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC0xMCw3ICs5LDcgQEAKICAgICAgICAgbiA9IDAKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgogICAgICAgICAgICAgbiA9IG4raQotICAgICAgICAgICAgdHJ5OiAxIC8vIDAKKyAgICAgICAgICAgIHRyeTogMS8wCiAgICAgICAgICAgICBleGNlcHQgTmFtZUVycm9yOiBwYXNzCiAgICAgICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKQEAgLTExMSwxNCArMTEwLDcgQEAKIAogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiZXhjZXB0aW9ucyBtdXN0IGRlcml2ZSBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhc2VFeGNlcHRpb24iLCBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiY2F0Y2hpbmcgY2xhc3NlcyB0aGF0IGRvbid0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluaGVyaXQgZnJvbSBCYXNlRXhjZXB0aW9uIGlzIG5vdCBhbGxvd2VkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICBydW5fdW5pdHRlc3QoT3Bjb2RlVGVzdCkKKyAgICBydW5fdW5pdHRlc3QoT3Bjb2RlVGVzdCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcGVyYXRvci5weSBiL0xpYi90ZXN0L3Rlc3Rfb3BlcmF0b3IucHkKaW5kZXggNzBiOWZkOS4uMjc1ODg1NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcGVyYXRvci5weQorKysgYi9MaWIvdGVzdC90ZXN0X29wZXJhdG9yLnB5CkBAIC0xOTIsMTIgKzE5MiwxMSBAQAogICAgICAgICBjbGFzcyBDOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBkZWYgY2hlY2soc2VsZiwgbywgdik6Ci0gICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc0NhbGxhYmxlKG8pID09IGNhbGxhYmxlKG8pID09IHYpCi0gICAgICAgIGNoZWNrKHNlbGYsIDQsIEZhbHNlKQotICAgICAgICBjaGVjayhzZWxmLCBvcGVyYXRvci5pc0NhbGxhYmxlLCBUcnVlKQotICAgICAgICBjaGVjayhzZWxmLCBDLCBUcnVlKQotICAgICAgICBjaGVjayhzZWxmLCBDKCksIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmlzQ2FsbGFibGUobykgPT0gY2FsbGFibGUobykgPT0gdikKKyAgICAgICAgY2hlY2soc2VsZiwgNCwgMCkKKyAgICAgICAgY2hlY2soc2VsZiwgb3BlcmF0b3IuaXNDYWxsYWJsZSwgMSkKKyAgICAgICAgY2hlY2soc2VsZiwgQywgMSkKKyAgICAgICAgY2hlY2soc2VsZiwgQygpLCAwKQogCiAgICAgZGVmIHRlc3RfaXNNYXBwaW5nVHlwZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pc01hcHBpbmdUeXBlKQpAQCAtMzA3LDEwICszMDYsOCBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvbnRhaW5zLCBOb25lLCBOb25lKQogICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY29udGFpbnMocmFuZ2UoNCksIDIpKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmNvbnRhaW5zKHJhbmdlKDQpLCA1KSkKLSAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZwotICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnNlcXVlbmNlSW5jbHVkZXMocmFuZ2UoNCksIDIpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5zZXF1ZW5jZUluY2x1ZGVzKHJhbmdlKDQpLCA1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnNlcXVlbmNlSW5jbHVkZXMocmFuZ2UoNCksIDIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLnNlcXVlbmNlSW5jbHVkZXMocmFuZ2UoNCksIDUpKQogCiAgICAgZGVmIHRlc3Rfc2V0aXRlbShzZWxmKToKICAgICAgICAgYSA9IHJhbmdlKDMpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5IGIvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weQppbmRleCBmN2ViNDdiLi5iMTFiOGM5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkKQEAgLTI2LDYgKzI2LDEyIEBACiBmcm9tIG9wdHBhcnNlIGltcG9ydCBfbWF0Y2hfYWJicmV2CiBmcm9tIG9wdHBhcnNlIGltcG9ydCBfcGFyc2VfbnVtCiAKKyMgRG8gdGhlIHJpZ2h0IHRoaW5nIHdpdGggYm9vbGVhbiB2YWx1ZXMgZm9yIGFsbCBrbm93biBQeXRob24gdmVyc2lvbnMuCit0cnk6CisgICAgVHJ1ZSwgRmFsc2UKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgKFRydWUsIEZhbHNlKSA9ICgxLCAwKQorCiByZXR5cGUgPSB0eXBlKHJlLmNvbXBpbGUoJycpKQogCiBjbGFzcyBJbnRlcmNlcHRlZEVycm9yKEV4Y2VwdGlvbik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X29zc2F1ZGlvZGV2LnB5IGIvTGliL3Rlc3QvdGVzdF9vc3NhdWRpb2Rldi5weQppbmRleCA0MDkwM2RjLi5kZjA0NzA1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X29zc2F1ZGlvZGV2LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfb3NzYXVkaW9kZXYucHkKQEAgLTcxLDcgKzcxLDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImRzcC4lcyBub3QgcmVhZC1vbmx5IiAlIGF0dHIpCiAKICAgICAgICAgIyBDb21wdXRlIGV4cGVjdGVkIHJ1bm5pbmcgdGltZSBvZiBzb3VuZCBzYW1wbGUgKGluIHNlY29uZHMpLgotICAgICAgICBleHBlY3RlZF90aW1lID0gZmxvYXQobGVuKGRhdGEpKSAvIChzc2l6ZS8vOCkgLyBuY2hhbm5lbHMgLyByYXRlCisgICAgICAgIGV4cGVjdGVkX3RpbWUgPSBmbG9hdChsZW4oZGF0YSkpIC8gKHNzaXplLzgpIC8gbmNoYW5uZWxzIC8gcmF0ZQogCiAgICAgICAgICMgc2V0IHBhcmFtZXRlcnMgYmFzZWQgb24gLmF1IGZpbGUgaGVhZGVycwogICAgICAgICBkc3Auc2V0cGFyYW1ldGVycyhBRk1UX1MxNl9ORSwgbmNoYW5uZWxzLCByYXRlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkgYi9MaWIvdGVzdC90ZXN0X3BlZXBob2xlci5weQppbmRleCBkZThkMWVhLi4xZjZlZmI1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BlZXBob2xlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BlZXBob2xlci5weQpAQCAtMjA1LDI0ICsyMDUsMTggQEAKIGRlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKICAgICBpbXBvcnQgc3lzCiAgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKLSAgICBpbXBvcnQgd2FybmluZ3MKICAgICB0ZXN0X2NsYXNzZXMgPSAoVGVzdFRyYW5mb3JtcywpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQogCi0gICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiYmFja3F1b3RlIG5vdCBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nKQotICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCi0KLSAgICAgICAgIyB2ZXJpZnkgcmVmZXJlbmNlIGNvdW50aW5nCi0gICAgICAgIGlmIHZlcmJvc2UgYW5kIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgotICAgICAgICAgICAgaW1wb3J0IGdjCi0gICAgICAgICAgICBjb3VudHMgPSBbTm9uZV0gKiA1Ci0gICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGNvdW50cykpOgotICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKLSAgICAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKLSAgICAgICAgICAgICAgICBjb3VudHNbaV0gPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCi0gICAgICAgICAgICBwcmludCBjb3VudHMKKyAgICAjIHZlcmlmeSByZWZlcmVuY2UgY291bnRpbmcKKyAgICBpZiB2ZXJib3NlIGFuZCBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKKyAgICAgICAgaW1wb3J0IGdjCisgICAgICAgIGNvdW50cyA9IFtOb25lXSAqIDUKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihjb3VudHMpKToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKyAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgY291bnRzW2ldID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICBwcmludCBjb3VudHMKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wZXAzNTIucHkgYi9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weQppbmRleCAxMDNkODM1Li5jNmQzYThkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weQpAQCAtNiwyMyArNiwxMiBAQAogaW1wb3J0IG9zCiBmcm9tIHBsYXRmb3JtIGltcG9ydCBzeXN0ZW0gYXMgcGxhdGZvcm1fc3lzdGVtCiAKLURFUFJFQ0FUSU9OX1dBUk5JTkdTID0gKAotICAgICJCYXNlRXhjZXB0aW9uLm1lc3NhZ2UgaGFzIGJlZW4gZGVwcmVjYXRlZCIsCi0gICAgImV4Y2VwdGlvbnMgbXVzdCBkZXJpdmUgZnJvbSBCYXNlRXhjZXB0aW9uIiwKLSAgICAiY2F0Y2hpbmcgY2xhc3NlcyB0aGF0IGRvbid0IGluaGVyaXQgZnJvbSBCYXNlRXhjZXB0aW9uIGlzIG5vdCBhbGxvd2VkIiwKLSAgICAiX19nZXRpdGVtX18gbm90IHN1cHBvcnRlZCBmb3IgZXhjZXB0aW9uIGNsYXNzZXMiLAotKQorZGVmIGlnbm9yZV9tZXNzYWdlX3dhcm5pbmcoKToKKyAgICAiIiJJZ25vcmUgdGhlIERlcHJlY2F0aW9uV2FybmluZyBmb3IgQmFzZUV4Y2VwdGlvbi5tZXNzYWdlLiIiIgorICAgIHdhcm5pbmdzLnJlc2V0d2FybmluZ3MoKQorICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiQmFzZUV4Y2VwdGlvbi5tZXNzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCiAKLSMgU2lsZW5jZSBQeTNrIGFuZCBvdGhlciBkZXByZWNhdGlvbiB3YXJuaW5ncwotZGVmIGlnbm9yZV9kZXByZWNhdGlvbl93YXJuaW5ncyhmdW5jKToKLSAgICAiIiJJZ25vcmUgdGhlIGtub3duIERlcHJlY2F0aW9uV2FybmluZ3MuIiIiCi0gICAgZGVmIHdyYXBwZXIoKmFyZ3MsICoqa3cpOgotICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICB3YXJuaW5ncy5yZXNldHdhcm5pbmdzKCkKLSAgICAgICAgICAgIGZvciB0ZXh0IGluIERFUFJFQ0FUSU9OX1dBUk5JTkdTOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCB0ZXh0LCBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprdykKLSAgICByZXR1cm4gd3JhcHBlcgogCiBjbGFzcyBFeGNlcHRpb25DbGFzc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtMzIsMTIgKzIxLDE0IEBACiAgICAgZGVmIHRlc3RfYnVpbHRpbnNfbmV3X3N0eWxlKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhFeGNlcHRpb24sIG9iamVjdCkpCiAKLSAgICBAaWdub3JlX2RlcHJlY2F0aW9uX3dhcm5pbmdzCiAgICAgZGVmIHZlcmlmeV9pbnN0YW5jZV9pbnRlcmZhY2Uoc2VsZiwgaW5zKToKLSAgICAgICAgZm9yIGF0dHIgaW4gKCJhcmdzIiwgIm1lc3NhZ2UiLCAiX19zdHJfXyIsICJfX3JlcHJfXyIsICJfX2dldGl0ZW1fXyIpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoaW5zLCBhdHRyKSwKLSAgICAgICAgICAgICAgICAgICAgIiVzIG1pc3NpbmcgJXMgYXR0cmlidXRlIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW5zLl9fY2xhc3NfXy5fX25hbWVfXywgYXR0cikpCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIGlnbm9yZV9tZXNzYWdlX3dhcm5pbmcoKQorICAgICAgICAgICAgZm9yIGF0dHIgaW4gKCJhcmdzIiwgIm1lc3NhZ2UiLCAiX19zdHJfXyIsICJfX3JlcHJfXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fZ2V0aXRlbV9fIik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoaW5zLCBhdHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyBtaXNzaW5nICVzIGF0dHJpYnV0ZSIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMuX19jbGFzc19fLl9fbmFtZV9fLCBhdHRyKSkKIAogICAgIGRlZiB0ZXN0X2luaGVyaXRhbmNlKHNlbGYpOgogICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IG1hdGNoZXMgdGhlIGRvY3VtZW50YXRpb24KQEAgLTEwMCwzOSArOTEsNDMgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2l2ZW4sIGV4cGVjdGVkLCAiJXM6ICVzICE9ICVzIiAlICh0ZXN0X25hbWUsCiAgICAgICAgICAgICAgICAgZ2l2ZW4sIGV4cGVjdGVkKSkKIAotICAgIEBpZ25vcmVfZGVwcmVjYXRpb25fd2FybmluZ3MKICAgICBkZWYgdGVzdF9pbnRlcmZhY2Vfc2luZ2xlX2FyZyhzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgaW50ZXJmYWNlIHdvcmtzIHByb3Blcmx5IHdoZW4gZ2l2ZW4gYSBzaW5nbGUgYXJndW1lbnQKICAgICAgICAgYXJnID0gInNwYW0iCiAgICAgICAgIGV4YyA9IEV4Y2VwdGlvbihhcmcpCi0gICAgICAgIHJlc3VsdHMgPSAoW2xlbihleGMuYXJncyksIDFdLCBbZXhjLmFyZ3NbMF0sIGFyZ10sIFtleGMubWVzc2FnZSwgYXJnXSwKLSAgICAgICAgICAgICAgICAgICBbc3RyKGV4YyksIHN0cihhcmcpXSwgW3VuaWNvZGUoZXhjKSwgdW5pY29kZShhcmcpXSwKLSAgICAgICAgICAgICAgICAgICBbcmVwcihleGMpLCBleGMuX19jbGFzc19fLl9fbmFtZV9fICsgcmVwcihleGMuYXJncyldLAotICAgICAgICAgICAgICAgICAgIFtleGNbMF0sIGFyZ10pCi0gICAgICAgIHNlbGYuaW50ZXJmYWNlX3Rlc3RfZHJpdmVyKHJlc3VsdHMpCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIGlnbm9yZV9tZXNzYWdlX3dhcm5pbmcoKQorICAgICAgICAgICAgcmVzdWx0cyA9IChbbGVuKGV4Yy5hcmdzKSwgMV0sIFtleGMuYXJnc1swXSwgYXJnXSwKKyAgICAgICAgICAgICAgICAgICAgW2V4Yy5tZXNzYWdlLCBhcmddLAorICAgICAgICAgICAgICAgICAgICBbc3RyKGV4YyksIHN0cihhcmcpXSwgW3VuaWNvZGUoZXhjKSwgdW5pY29kZShhcmcpXSwKKyAgICAgICAgICAgICAgICBbcmVwcihleGMpLCBleGMuX19jbGFzc19fLl9fbmFtZV9fICsgcmVwcihleGMuYXJncyldLCBbZXhjWzBdLAorICAgICAgICAgICAgICAgIGFyZ10pCisgICAgICAgICAgICBzZWxmLmludGVyZmFjZV90ZXN0X2RyaXZlcihyZXN1bHRzKQogCi0gICAgQGlnbm9yZV9kZXByZWNhdGlvbl93YXJuaW5ncwogICAgIGRlZiB0ZXN0X2ludGVyZmFjZV9tdWx0aV9hcmcoc2VsZik6CiAgICAgICAgICMgTWFrZSBzdXJlIGludGVyZmFjZSBjb3JyZWN0IHdoZW4gbXVsdGlwbGUgYXJndW1lbnRzIGdpdmVuCiAgICAgICAgIGFyZ19jb3VudCA9IDMKICAgICAgICAgYXJncyA9IHR1cGxlKHJhbmdlKGFyZ19jb3VudCkpCiAgICAgICAgIGV4YyA9IEV4Y2VwdGlvbigqYXJncykKLSAgICAgICAgcmVzdWx0cyA9IChbbGVuKGV4Yy5hcmdzKSwgYXJnX2NvdW50XSwgW2V4Yy5hcmdzLCBhcmdzXSwKLSAgICAgICAgICAgICAgICAgICBbZXhjLm1lc3NhZ2UsICcnXSwgW3N0cihleGMpLCBzdHIoYXJncyldLAotICAgICAgICAgICAgICAgICAgIFt1bmljb2RlKGV4YyksIHVuaWNvZGUoYXJncyldLAotICAgICAgICAgICAgICAgICAgIFtyZXByKGV4YyksIGV4Yy5fX2NsYXNzX18uX19uYW1lX18gKyByZXByKGV4Yy5hcmdzKV0sCi0gICAgICAgICAgICAgICAgICAgW2V4Y1stMV0sIGFyZ3NbLTFdXSkKLSAgICAgICAgc2VsZi5pbnRlcmZhY2VfdGVzdF9kcml2ZXIocmVzdWx0cykKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgaWdub3JlX21lc3NhZ2Vfd2FybmluZygpCisgICAgICAgICAgICByZXN1bHRzID0gKFtsZW4oZXhjLmFyZ3MpLCBhcmdfY291bnRdLCBbZXhjLmFyZ3MsIGFyZ3NdLAorICAgICAgICAgICAgICAgICAgICBbZXhjLm1lc3NhZ2UsICcnXSwgW3N0cihleGMpLCBzdHIoYXJncyldLAorICAgICAgICAgICAgICAgICAgICBbdW5pY29kZShleGMpLCB1bmljb2RlKGFyZ3MpXSwKKyAgICAgICAgICAgICAgICAgICAgW3JlcHIoZXhjKSwgZXhjLl9fY2xhc3NfXy5fX25hbWVfXyArIHJlcHIoZXhjLmFyZ3MpXSwKKyAgICAgICAgICAgICAgICAgICAgW2V4Y1stMV0sIGFyZ3NbLTFdXSkKKyAgICAgICAgICAgIHNlbGYuaW50ZXJmYWNlX3Rlc3RfZHJpdmVyKHJlc3VsdHMpCiAKLSAgICBAaWdub3JlX2RlcHJlY2F0aW9uX3dhcm5pbmdzCiAgICAgZGVmIHRlc3RfaW50ZXJmYWNlX25vX2FyZyhzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3aXRoIG5vIGFyZ3MgdGhhdCBpbnRlcmZhY2UgaXMgY29ycmVjdAogICAgICAgICBleGMgPSBFeGNlcHRpb24oKQotICAgICAgICByZXN1bHRzID0gKFtsZW4oZXhjLmFyZ3MpLCAwXSwgW2V4Yy5hcmdzLCB0dXBsZSgpXSwKLSAgICAgICAgICAgICAgICAgICBbZXhjLm1lc3NhZ2UsICcnXSwKLSAgICAgICAgICAgICAgICAgICBbc3RyKGV4YyksICcnXSwgW3VuaWNvZGUoZXhjKSwgdScnXSwKLSAgICAgICAgICAgICAgICAgICBbcmVwcihleGMpLCBleGMuX19jbGFzc19fLl9fbmFtZV9fICsgJygpJ10sIFtUcnVlLCBUcnVlXSkKLSAgICAgICAgc2VsZi5pbnRlcmZhY2VfdGVzdF9kcml2ZXIocmVzdWx0cykKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgaWdub3JlX21lc3NhZ2Vfd2FybmluZygpCisgICAgICAgICAgICByZXN1bHRzID0gKFtsZW4oZXhjLmFyZ3MpLCAwXSwgW2V4Yy5hcmdzLCB0dXBsZSgpXSwKKyAgICAgICAgICAgICAgICAgICAgW2V4Yy5tZXNzYWdlLCAnJ10sCisgICAgICAgICAgICAgICAgICAgIFtzdHIoZXhjKSwgJyddLCBbdW5pY29kZShleGMpLCB1JyddLAorICAgICAgICAgICAgICAgICAgICBbcmVwcihleGMpLCBleGMuX19jbGFzc19fLl9fbmFtZV9fICsgJygpJ10sIFtUcnVlLCBUcnVlXSkKKyAgICAgICAgICAgIHNlbGYuaW50ZXJmYWNlX3Rlc3RfZHJpdmVyKHJlc3VsdHMpCiAKIAogICAgIGRlZiB0ZXN0X21lc3NhZ2VfZGVwcmVjYXRpb24oc2VsZik6CkBAIC0xODQsNyArMTc5LDYgQEAKICAgICAgICAgICAgIHNlbGYuZmFpbCgiVHlwZUVycm9yIGV4cGVjdGVkIHdoZW4gY2F0Y2hpbmcgJXMgYXMgc3BlY2lmaWVkIGluIGEgIgogICAgICAgICAgICAgICAgICAgICAgICAgInR1cGxlIiAlIHR5cGUob2JqZWN0XykpCiAKLSAgICBAaWdub3JlX2RlcHJlY2F0aW9uX3dhcm5pbmdzCiAgICAgZGVmIHRlc3RfcmFpc2VfY2xhc3NpYyhzZWxmKToKICAgICAgICAgIyBSYWlzaW5nIGEgY2xhc3NpYyBjbGFzcyBpcyBva2F5IChmb3Igbm93KS4KICAgICAgICAgY2xhc3MgQ2xhc3NpY0NsYXNzOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wa2dpbXBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X3BrZ2ltcG9ydC5weQppbmRleCAyMGIxM2MxLi44YWEyMjRhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BrZ2ltcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BrZ2ltcG9ydC5weQpAQCAtNiwxNCArNiwxNCBAQAogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICAgc2VsZi5wYWNrYWdlX25hbWUgPSAnUEFDS0FHRV8nCi0gICAgICAgIHdoaWxlIHNlbGYucGFja2FnZV9uYW1lIGluIHN5cy5tb2R1bGVzOgorICAgICAgICB3aGlsZSBzeXMubW9kdWxlcy5oYXNfa2V5KHNlbGYucGFja2FnZV9uYW1lKToKICAgICAgICAgICAgIHNlbGYucGFja2FnZV9uYW1lICs9IHJhbmRvbS5jaG9vc2Uoc3RyaW5nLmxldHRlcnMpCiAgICAgICAgIHNlbGYubW9kdWxlX25hbWUgPSBzZWxmLnBhY2thZ2VfbmFtZSArICcuZm9vJwogICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprdykKIAogICAgIGRlZiByZW1vdmVfbW9kdWxlcyhzZWxmKToKICAgICAgICAgZm9yIG1vZHVsZV9uYW1lIGluIChzZWxmLnBhY2thZ2VfbmFtZSwgc2VsZi5tb2R1bGVfbmFtZSk6Ci0gICAgICAgICAgICBpZiBtb2R1bGVfbmFtZSBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgICAgIGlmIHN5cy5tb2R1bGVzLmhhc19rZXkobW9kdWxlX25hbWUpOgogICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0KIAogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTUyLDcgKzUyLDcgQEAKICAgICAgICAgdHJ5OiBfX2ltcG9ydF9fKHNlbGYubW9kdWxlX25hbWUpCiAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjogcGFzcwogICAgICAgICBlbHNlOiByYWlzZSBSdW50aW1lRXJyb3IsICdGYWlsZWQgdG8gaW5kdWNlIFN5bnRheEVycm9yJwotICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tb2R1bGVfbmFtZSBub3QgaW4gc3lzLm1vZHVsZXMgYW5kCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgc3lzLm1vZHVsZXMuaGFzX2tleShzZWxmLm1vZHVsZV9uYW1lKSBhbmQKICAgICAgICAgICAgICAgICAgICAgIG5vdCBoYXNhdHRyKHN5cy5tb2R1bGVzW3NlbGYucGFja2FnZV9uYW1lXSwgJ2ZvbycpKQogCiAgICAgICAgICMgLi4ubWFrZSB1cCBhIHZhcmlhYmxlIG5hbWUgdGhhdCBpc24ndCBib3VuZCBpbiBfX2J1aWx0aW5zX18KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHljbGJyLnB5IGIvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKaW5kZXggNWJhYzYyYS4uZWM4MThkMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKQEAgLTIsNyArMiw3IEBACiAgICBUZXN0IGNhc2VzIGZvciBweWNsYnIucHkKICAgIE5pY2sgTWF0aGV3c29uCiAnJycKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgaW1wb3J0X21vZHVsZQorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CiBpbXBvcnQgc3lzCiBmcm9tIHR5cGVzIGltcG9ydCBDbGFzc1R5cGUsIEZ1bmN0aW9uVHlwZSwgTWV0aG9kVHlwZSwgQnVpbHRpbkZ1bmN0aW9uVHlwZQogaW1wb3J0IHB5Y2xicgpAQCAtMTMsOCArMTMsNiBAQAogCiAjIFRoaXMgbmV4dCBsaW5lIHRyaWdnZXJzIGFuIGVycm9yIG9uIG9sZCB2ZXJzaW9ucyBvZiBweWNsYnIuCiAKLSMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLWltcG9ydF9tb2R1bGUoJ2NvbW1hbmRzJywgZGVwcmVjYXRlZD1UcnVlKQogZnJvbSBjb21tYW5kcyBpbXBvcnQgZ2V0c3RhdHVzCiAKICMgSGVyZSB3ZSB0ZXN0IHRoZSBweXRob24gY2xhc3MgYnJvd3NlciBjb2RlLgpAQCAtNDIsMTEgKzQwLDExIEBACiAKIAogICAgIGRlZiBhc3NlcnRIYXNrZXkoc2VsZiwgb2JqLCBrZXksIGlnbm9yZSk6Ci0gICAgICAgICcnJyBzdWNjZWVkIGlmZiBrZXkgaW4gb2JqIG9yIGtleSBpbiBpZ25vcmUuICcnJworICAgICAgICAnJycgc3VjY2VlZCBpZmYgb2JqLmhhc19rZXkoa2V5KSBvciBrZXkgaW4gaWdub3JlLiAnJycKICAgICAgICAgaWYga2V5IGluIGlnbm9yZTogcmV0dXJuCi0gICAgICAgIGlmIGtleSBub3QgaW4gb2JqOgotICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiKioqIiwga2V5Ci0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrZXkgaW4gb2JqKQorICAgICAgICBpZiBub3Qgb2JqLmhhc19rZXkoa2V5KToKKyAgICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIioqKiIsa2V5CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvYmouaGFzX2tleShrZXkpKQogCiAgICAgZGVmIGFzc2VydEVxdWFsc09ySWdub3JlZChzZWxmLCBhLCBiLCBpZ25vcmUpOgogICAgICAgICAnJycgc3VjY2VlZCBpZmYgYSA9PSBiIG9yIGEgaW4gaWdub3JlIG9yIGIgaW4gaWdub3JlICcnJwpAQCAtMTUxLDkgKzE0OSw3IEBACiAgICAgZGVmIHRlc3RfZWFzeShzZWxmKToKICAgICAgICAgc2VsZi5jaGVja01vZHVsZSgncHljbGJyJykKICAgICAgICAgc2VsZi5jaGVja01vZHVsZSgnZG9jdGVzdCcsIGlnbm9yZT0oIkRvY1Rlc3RDYXNlIiwpKQotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIHJmYzgyMiA9IGltcG9ydF9tb2R1bGUoJ3JmYzgyMicsIGRlcHJlY2F0ZWQ9VHJ1ZSkKLSAgICAgICAgc2VsZi5jaGVja01vZHVsZSgncmZjODIyJywgcmZjODIyKQorICAgICAgICBzZWxmLmNoZWNrTW9kdWxlKCdyZmM4MjInKQogICAgICAgICBzZWxmLmNoZWNrTW9kdWxlKCdkaWZmbGliJykKIAogICAgIGRlZiB0ZXN0X2RlY29yYXRvcnMoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3B5ZXhwYXQucHkgYi9MaWIvdGVzdC90ZXN0X3B5ZXhwYXQucHkKaW5kZXggZmZkNjg3NS4uNjQ5ZDVkMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9weWV4cGF0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcHlleHBhdC5weQpAQCAtNTU0LDcgKzU1NCw3IEBACiAKICAgICAgICAgc2VsZi5uPTAKICAgICAgICAgcGFyc2VyLlBhcnNlKHhtbDEsIDApCi0gICAgICAgIHBhcnNlci5idWZmZXJfc2l6ZSAvLz0gMgorICAgICAgICBwYXJzZXIuYnVmZmVyX3NpemUgLz0gMgogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhwYXJzZXIuYnVmZmVyX3NpemUsIDEwMjQpCiAgICAgICAgIHBhcnNlci5QYXJzZSh4bWwyLCAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLm4sIDQpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3F1ZXVlLnB5IGIvTGliL3Rlc3QvdGVzdF9xdWV1ZS5weQppbmRleCBlNmQyZTY5Li4yZmEzNmI3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3F1ZXVlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcXVldWUucHkKQEAgLTcsOCArNyw3IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKLVFVRVVFX1NJWkUgPSBMQVNUID0gNQotRlVMTCA9IExBU1QrMQorUVVFVUVfU0laRSA9IDUKIAogIyBBIHRocmVhZCB0byBydW4gYSBmdW5jdGlvbiB0aGF0IHVuY2xvZ3MgYSBibG9ja2VkIFF1ZXVlLgogY2xhc3MgX1RyaWdnZXJUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CkBAIC0xMDMsMjEgKzEwMiwyMSBAQAogICAgICAgICAgICAgcS5wdXQoaSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcS5lbXB0eSgpLCAiUXVldWUgc2hvdWxkIG5vdCBiZSBlbXB0eSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcS5mdWxsKCksICJRdWV1ZSBzaG91bGQgbm90IGJlIGZ1bGwiKQotICAgICAgICBxLnB1dChMQVNUKQorICAgICAgICBxLnB1dCgibGFzdCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxLmZ1bGwoKSwgIlF1ZXVlIHNob3VsZCBiZSBmdWxsIikKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgcS5wdXQoRlVMTCwgYmxvY2s9MCkKKyAgICAgICAgICAgIHEucHV0KCJmdWxsIiwgYmxvY2s9MCkKICAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkbid0IGFwcGVhciB0byBibG9jayB3aXRoIGEgZnVsbCBxdWV1ZSIpCiAgICAgICAgIGV4Y2VwdCBRdWV1ZS5GdWxsOgogICAgICAgICAgICAgcGFzcwogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBxLnB1dChGVUxMLCB0aW1lb3V0PTAuMDEpCisgICAgICAgICAgICBxLnB1dCgiZnVsbCIsIHRpbWVvdXQ9MC4wMSkKICAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkbid0IGFwcGVhciB0byB0aW1lLW91dCB3aXRoIGEgZnVsbCBxdWV1ZSIpCiAgICAgICAgIGV4Y2VwdCBRdWV1ZS5GdWxsOgogICAgICAgICAgICAgcGFzcwogICAgICAgICAjIFRlc3QgYSBibG9ja2luZyBwdXQKLSAgICAgICAgc2VsZi5kb19ibG9ja2luZ190ZXN0KHEucHV0LCAoRlVMTCwpLCBxLmdldCwgKCkpCi0gICAgICAgIHNlbGYuZG9fYmxvY2tpbmdfdGVzdChxLnB1dCwgKEZVTEwsIFRydWUsIDEwKSwgcS5nZXQsICgpKQorICAgICAgICBzZWxmLmRvX2Jsb2NraW5nX3Rlc3QocS5wdXQsICgiZnVsbCIsKSwgcS5nZXQsICgpKQorICAgICAgICBzZWxmLmRvX2Jsb2NraW5nX3Rlc3QocS5wdXQsICgiZnVsbCIsIFRydWUsIDEwKSwgcS5nZXQsICgpKQogICAgICAgICAjIEVtcHR5IGl0CiAgICAgICAgIGZvciBpIGluIHJhbmdlKFFVRVVFX1NJWkUpOgogICAgICAgICAgICAgcS5nZXQoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yYW5kb20ucHkgYi9MaWIvdGVzdC90ZXN0X3JhbmRvbS5weQppbmRleCA4ZDhjM2MzLi4xNGQwMzgzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JhbmRvbS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JhbmRvbS5weQpAQCAtNiw3ICs2LDYgQEAKIGltcG9ydCBwaWNrbGUKIGltcG9ydCB3YXJuaW5ncwogZnJvbSBtYXRoIGltcG9ydCBsb2csIGV4cCwgc3FydCwgcGksIGZzdW0sIHNpbgotZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHJlZHVjZQogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIAogY2xhc3MgVGVzdEJhc2ljT3BzKHVuaXR0ZXN0LlRlc3RDYXNlKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmVwci5weSBiL0xpYi90ZXN0L3Rlc3RfcmVwci5weQppbmRleCBlZjA3MDc1Li40OTRhN2MzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JlcHIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yZXByLnB5CkBAIC04LDcgKzgsNyBAQAogaW1wb3J0IHNodXRpbAogaW1wb3J0IHVuaXR0ZXN0CiAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgY2hlY2tfd2FybmluZ3MKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAogZnJvbSByZXByIGltcG9ydCByZXByIGFzIHIgIyBEb24ndCBzaGFkb3cgYnVpbHRpbiByZXByCiBmcm9tIHJlcHIgaW1wb3J0IFJlcHIKIApAQCAtMTc0LDkgKzE3NCw3IEBACiAgICAgZGVmIHRlc3RfYnVmZmVyKHNlbGYpOgogICAgICAgICAjIFhYWCBkb2Vzbid0IHRlc3QgYnVmZmVycyB3aXRoIG5vIGJfYmFzZSBvciByZWFkLXdyaXRlIGJ1ZmZlcnMgKHNlZQogICAgICAgICAjIGJ1ZmZlcm9iamVjdC5jKS4gIFRoZSB0ZXN0IGlzIGZhaXJseSBpbmNvbXBsZXRlIHRvby4gIFNpZ2guCi0gICAgICAgICMgU2lsZW5jZSB0aGUgUHkzayB3YXJuaW5nCi0gICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHggPSBidWZmZXIoJ2ZvbycpCisgICAgICAgIHggPSBidWZmZXIoJ2ZvbycpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKHgpLnN0YXJ0c3dpdGgoJzxyZWFkLW9ubHkgYnVmZmVyIGZvciAweCcpKQogCiAgICAgZGVmIHRlc3RfY2VsbChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmZjODIyLnB5IGIvTGliL3Rlc3QvdGVzdF9yZmM4MjIucHkKaW5kZXggZDhhMDI4MC4uOGMyYjJjNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9yZmM4MjIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yZmM4MjIucHkKQEAgLTQ2LDkgKzQ2LDkgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgaSA9IGkgKyAxCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1uLCBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW4tZXhwZWN0ZWQgbmFtZTogJXIgIT0gJXIiICUgKG1uLCBuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuLWV4cGVjdGVkIG5hbWU6ICVzICE9ICVzIiAlIChgbW5gLCBgbmApKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYSwgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuLWV4cGVjdGVkIGFkZHJlc3M6ICVyICE9ICVyIiAlIChtYSwgYSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbi1leHBlY3RlZCBhZGRyZXNzOiAlcyAhPSAlcyIgJSAoYG1hYCwgYGFgKSkKICAgICAgICAgICAgIGlmIG1uID09IG4gYW5kIG1hID09IGE6CiAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgZWxzZToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmljaGNtcC5weSBiL0xpYi90ZXN0L3Rlc3RfcmljaGNtcC5weQppbmRleCA0N2RjYzcwLi5lZDBiNDk3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JpY2hjbXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yaWNoY21wLnB5CkBAIC0yLDcgKzIsNiBAQAogCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Ci1pbXBvcnQgd2FybmluZ3MKIAogaW1wb3J0IG9wZXJhdG9yCiAKQEAgLTMzMSwxMyArMzMwLDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMob3AoeCwgeSksIFRydWUpCiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFZlY3RvclRlc3QsIE51bWJlclRlc3QsIE1pc2NUZXN0LCBMaXN0VGVzdCkKLSAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJkaWN0IGluZXF1YWxpdHkgY29tcGFyaXNvbnMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IHN1cHBvcnRlZCBpbiAzLngiLCBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoRGljdFRlc3QpCi0KKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFZlY3RvclRlc3QsIE51bWJlclRlc3QsIE1pc2NUZXN0LCBEaWN0VGVzdCwgTGlzdFRlc3QpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2NvcGUucHkgYi9MaWIvdGVzdC90ZXN0X3Njb3BlLnB5CmluZGV4IDZmZjUzYjMuLmNmMzBmZjkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2NvcGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zY29wZS5weQpAQCAtMzIxLDE2ICszMjEsMTAgQEAKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1ha2VSZXR1cm5lcjIoYT0xMSkoKVsnYSddLCAxMSkKIAotICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgInR1cGxlIHBhcmFtZXRlciB1bnBhY2tpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhcyBiZWVuIHJlbW92ZWQiLCBTeW50YXhXYXJuaW5nKQotICAgICAgICAgICAgZXhlYyAiIiJcCi1kZWYgbWFrZUFkZFBhaXIoKGEsIGIpKToKLSAgICBkZWYgYWRkUGFpcigoYywgZCkpOgotICAgICAgICByZXR1cm4gKGEgKyBjLCBiICsgZCkKLSAgICByZXR1cm4gYWRkUGFpcgotIiIiIGluIGxvY2FscygpCisgICAgICAgIGRlZiBtYWtlQWRkUGFpcigoYSwgYikpOgorICAgICAgICAgICAgZGVmIGFkZFBhaXIoKGMsIGQpKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKGEgKyBjLCBiICsgZCkKKyAgICAgICAgICAgIHJldHVybiBhZGRQYWlyCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWtlQWRkUGFpcigoMSwgMikpKCgxMDAsIDIwMCkpLCAoMTAxLDIwMikpCiAKQEAgLTQ3Nyw3ICs0NzEsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGcKIAogICAgICAgICBkID0gZigyKSg0KQotICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2gnIGluIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmhhc19rZXkoJ2gnKSkKICAgICAgICAgZGVsIGRbJ2gnXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHsneCc6IDIsICd5JzogNywgJ3cnOiA2fSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zZXQucHkgYi9MaWIvdGVzdC90ZXN0X3NldC5weQppbmRleCA4NTk1MzY4Li5iYzc0NjVhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NldC5weQpAQCAtMTIxOCwxNiArMTIxOCwxNSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0ICE9IHNlbGYub3RoZXIsIFRydWUpCiAKICAgICBkZWYgdGVzdF9nZV9ndF9sZV9sdChzZWxmKToKLSAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCA8IHNlbGYub3RoZXIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5zZXQgPD0gc2VsZi5vdGhlcikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCA+IHNlbGYub3RoZXIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5zZXQgPj0gc2VsZi5vdGhlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuc2V0IDwgc2VsZi5vdGhlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuc2V0IDw9IHNlbGYub3RoZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCA+IHNlbGYub3RoZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCA+PSBzZWxmLm90aGVyKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciA8IHNlbGYuc2V0KQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYub3RoZXIgPD0gc2VsZi5zZXQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciA+IHNlbGYuc2V0KQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYub3RoZXIgPj0gc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLm90aGVyIDwgc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLm90aGVyIDw9IHNlbGYuc2V0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciA+IHNlbGYuc2V0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciA+PSBzZWxmLnNldCkKIAogICAgIGRlZiB0ZXN0X3VwZGF0ZV9vcGVyYXRvcihzZWxmKToKICAgICAgICAgdHJ5OgpAQCAtMTM4MCwyMCArMTM3OSwyMCBAQAogCiAgICAgZGVmIHRlc3RfY29weShzZWxmKToKICAgICAgICAgZHVwID0gc2VsZi5zZXQuY29weSgpCi0gICAgICAgIGR1cF9saXN0ID0gbGlzdChkdXApCi0gICAgICAgIHNldF9saXN0ID0gbGlzdChzZWxmLnNldCkKKyAgICAgICAgZHVwX2xpc3QgPSBsaXN0KGR1cCk7IGR1cF9saXN0LnNvcnQoKQorICAgICAgICBzZXRfbGlzdCA9IGxpc3Qoc2VsZi5zZXQpOyBzZXRfbGlzdC5zb3J0KCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZHVwX2xpc3QpLCBsZW4oc2V0X2xpc3QpKQotICAgICAgICBmb3IgZWx0IGluIGR1cF9saXN0OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVsdCBpbiBzZXRfbGlzdCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGR1cF9saXN0KSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZHVwX2xpc3RbaV0gaXMgc2V0X2xpc3RbaV0pCiAKICAgICBkZWYgdGVzdF9kZWVwX2NvcHkoc2VsZik6CiAgICAgICAgIGR1cCA9IGNvcHkuZGVlcGNvcHkoc2VsZi5zZXQpCiAgICAgICAgICMjcHJpbnQgdHlwZShkdXApLCByZXByKGR1cCkKLSAgICAgICAgZHVwX2xpc3QgPSBsaXN0KGR1cCkKLSAgICAgICAgc2V0X2xpc3QgPSBsaXN0KHNlbGYuc2V0KQorICAgICAgICBkdXBfbGlzdCA9IGxpc3QoZHVwKTsgZHVwX2xpc3Quc29ydCgpCisgICAgICAgIHNldF9saXN0ID0gbGlzdChzZWxmLnNldCk7IHNldF9saXN0LnNvcnQoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkdXBfbGlzdCksIGxlbihzZXRfbGlzdCkpCi0gICAgICAgIGZvciBlbHQgaW4gZHVwX2xpc3Q6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZWx0IGluIHNldF9saXN0KQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oZHVwX2xpc3QpKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHVwX2xpc3RbaV0sIHNldF9saXN0W2ldKQogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTE1NTMsNyArMTU1Miw3IEBACiAgICAgICAgIGZvciBjb25zIGluIChzZXQsIGZyb3plbnNldCk6CiAgICAgICAgICAgICBmb3IgcyBpbiAoIjEyMyIsICIiLCByYW5nZSgxMDAwKSwgKCdkbycsIDEuMiksIHhyYW5nZSgyMDAwLDIyMDAsNSkpOgogICAgICAgICAgICAgICAgIGZvciBnIGluIChHLCBJLCBJZywgUywgTCwgUik6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0U2FtZUVsZW1lbnRzKGNvbnMoZyhzKSksIGcocykpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGNvbnMoZyhzKSkpLCBzb3J0ZWQoZyhzKSkpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb25zICwgWChzKSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbnMgLCBOKHMpKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBjb25zICwgRShzKSkKQEAgLTE1NjgsNyArMTU2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWQsIGJvb2wpOgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQogICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRTYW1lRWxlbWVudHMoYWN0dWFsLCBleHBlY3RlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGFjdHVhbCksIHNvcnRlZChleHBlY3RlZCkpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZXRoLCBYKHMpKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWV0aCwgTihzKSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgbWV0aCwgRShzKSkKQEAgLTE1ODIsNyArMTU4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHQgPSBzLmNvcHkoKQogICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKHMsIG1ldGhuYW1lKShsaXN0KGcoZGF0YSkpKQogICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKHQsIG1ldGhuYW1lKShnKGRhdGEpKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFNhbWVFbGVtZW50cyhzLCB0KQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChzKSwgc29ydGVkKHQpKQogCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhdHRyKHNldCgnamFudWFyeScpLCBtZXRobmFtZSksIFgoZGF0YSkpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhdHRyKHNldCgnamFudWFyeScpLCBtZXRobmFtZSksIE4oZGF0YSkpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NldHMucHkgYi9MaWIvdGVzdC90ZXN0X3NldHMucHkKaW5kZXggNzU0Y2ViMS4uOWM1OTgzNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zZXRzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2V0cy5weQpAQCAtNTEwLDE3ICs1MTAsMTUgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCAhPSBzZWxmLm90aGVyLCBUcnVlKQogCiAgICAgZGVmIHRlc3RfZ2VfZ3RfbGVfbHQoc2VsZik6Ci0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCA8IHNlbGYub3RoZXIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5zZXQgPD0gc2VsZi5vdGhlcikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCA+IHNlbGYub3RoZXIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5zZXQgPj0gc2VsZi5vdGhlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuc2V0IDwgc2VsZi5vdGhlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuc2V0IDw9IHNlbGYub3RoZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCA+IHNlbGYub3RoZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCA+PSBzZWxmLm90aGVyKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciA8IHNlbGYuc2V0KQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYub3RoZXIgPD0gc2VsZi5zZXQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciA+IHNlbGYuc2V0KQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYub3RoZXIgPj0gc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLm90aGVyIDwgc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLm90aGVyIDw9IHNlbGYuc2V0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciA+IHNlbGYuc2V0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciA+PSBzZWxmLnNldCkKIAogICAgIGRlZiB0ZXN0X3VuaW9uX3VwZGF0ZV9vcGVyYXRvcihzZWxmKToKICAgICAgICAgdHJ5OgpAQCAtNjgxLDIwICs2NzksMjAgQEAKIAogICAgIGRlZiB0ZXN0X2NvcHkoc2VsZik6CiAgICAgICAgIGR1cCA9IHNlbGYuc2V0LmNvcHkoKQotICAgICAgICBkdXBfbGlzdCA9IGxpc3QoZHVwKQotICAgICAgICBzZXRfbGlzdCA9IGxpc3Qoc2VsZi5zZXQpCisgICAgICAgIGR1cF9saXN0ID0gbGlzdChkdXApOyBkdXBfbGlzdC5zb3J0KCkKKyAgICAgICAgc2V0X2xpc3QgPSBsaXN0KHNlbGYuc2V0KTsgc2V0X2xpc3Quc29ydCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGR1cF9saXN0KSwgbGVuKHNldF9saXN0KSkKLSAgICAgICAgZm9yIGVsdCBpbiBkdXBfbGlzdDoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbHQgaW4gc2V0X2xpc3QpCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihkdXBfbGlzdCkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGR1cF9saXN0W2ldIGlzIHNldF9saXN0W2ldKQogCiAgICAgZGVmIHRlc3RfZGVlcF9jb3B5KHNlbGYpOgogICAgICAgICBkdXAgPSBjb3B5LmRlZXBjb3B5KHNlbGYuc2V0KQogICAgICAgICAjI3ByaW50IHR5cGUoZHVwKSwgcmVwcihkdXApCi0gICAgICAgIGR1cF9saXN0ID0gbGlzdChkdXApCi0gICAgICAgIHNldF9saXN0ID0gbGlzdChzZWxmLnNldCkKKyAgICAgICAgZHVwX2xpc3QgPSBsaXN0KGR1cCk7IGR1cF9saXN0LnNvcnQoKQorICAgICAgICBzZXRfbGlzdCA9IGxpc3Qoc2VsZi5zZXQpOyBzZXRfbGlzdC5zb3J0KCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZHVwX2xpc3QpLCBsZW4oc2V0X2xpc3QpKQotICAgICAgICBmb3IgZWx0IGluIGR1cF9saXN0OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVsdCBpbiBzZXRfbGlzdCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGR1cF9saXN0KSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR1cF9saXN0W2ldLCBzZXRfbGlzdFtpXSkKIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NoZWx2ZS5weSBiL0xpYi90ZXN0L3Rlc3Rfc2hlbHZlLnB5CmluZGV4IDNiMjAyODEuLmZmY2M5OGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2hlbHZlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2hlbHZlLnB5CkBAIC00LDggKzQsNiBAQAogaW1wb3J0IGdsb2IKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKLXRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdhbnlkYm0nLCBkZXByZWNhdGVkPVRydWUpCi0KIGNsYXNzIFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGZuID0gInNoZWxmdGVtcCIgKyBvcy5leHRzZXAgKyAiZGIiCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NpdGUucHkgYi9MaWIvdGVzdC90ZXN0X3NpdGUucHkKaW5kZXggODVkODk4YS4uNTY1OTZjOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zaXRlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2l0ZS5weQpAQCAtMjU4LDcgKzI1OCw3IEBACiAgICAgICAgIHNpdGUuYWJzX19maWxlX18oKQogICAgICAgICBmb3IgbW9kdWxlIGluIChzeXMsIG9zLCBfX2J1aWx0aW5fXyk6CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNhYnMobW9kdWxlLl9fZmlsZV9fKSwgcmVwcihtb2R1bGUpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzYWJzKG1vZHVsZS5fX2ZpbGVfXyksIGBtb2R1bGVgKQogICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICMgV2UgY291bGQgdHJ5IGV2ZXJ5dGhpbmcgaW4gc3lzLm1vZHVsZXM7IGhvd2V2ZXIsIHdoZW4gcmVncnRlc3QucHkKQEAgLTMxMCw3ICszMTAsNyBAQAogCiAgICAgZGVmIHRlc3Rfc2l0ZWN1c3RvbWl6ZV9leGVjdXRlZChzZWxmKToKICAgICAgICAgIyBJZiBzaXRlY3VzdG9taXplIGlzIGF2YWlsYWJsZSwgaXQgc2hvdWxkIGhhdmUgYmVlbiBpbXBvcnRlZC4KLSAgICAgICAgaWYgInNpdGVjdXN0b21pemUiIG5vdCBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgaWYgbm90IHN5cy5tb2R1bGVzLmhhc19rZXkoInNpdGVjdXN0b21pemUiKToKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBpbXBvcnQgc2l0ZWN1c3RvbWl6ZQogICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zbGljZS5weSBiL0xpYi90ZXN0L3Rlc3Rfc2xpY2UucHkKaW5kZXggNmFhM2Q0YS4uMDhkZThlMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zbGljZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NsaWNlLnB5CkBAIC0xMTUsOSArMTE1LDcgQEAKICAgICAgICAgICAgICAgICB0bXAuYXBwZW5kKChpLCBqLCBrKSkKIAogICAgICAgICB4ID0gWCgpCi0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHhbMToyXSA9IDQyCisgICAgICAgIHhbMToyXSA9IDQyCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRtcCwgWygxLCAyLCA0MildKQogCiAgICAgZGVmIHRlc3RfcGlja2xlKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkgYi9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQppbmRleCBiNGYzN2ViLi5mYWEwNmM1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQpAQCAtMTIzLDcgKzEyMyw3IEBACiAgICAgICAgIHNlbGYuc2VydmVyX3JlYWR5LndhaXQoKQogICAgICAgICBzZWxmLmNsaWVudF9yZWFkeS5zZXQoKQogICAgICAgICBzZWxmLmNsaWVudFNldFVwKCkKLSAgICAgICAgaWYgbm90IGhhc2F0dHIodGVzdF9mdW5jLCAnX19jYWxsX18nKToKKyAgICAgICAgaWYgbm90IGNhbGxhYmxlKHRlc3RfZnVuYyk6CiAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJ0ZXN0X2Z1bmMgbXVzdCBiZSBhIGNhbGxhYmxlIGZ1bmN0aW9uIgogICAgICAgICB0cnk6CiAgICAgICAgICAgICB0ZXN0X2Z1bmMoKQpAQCAtMjgyLDcgKzI4Miw3IEBACiAgICAgICAgICAgICAgICAgb3JpZyA9IHN5cy5nZXRyZWZjb3VudChfX25hbWVfXykKICAgICAgICAgICAgICAgICBzb2NrZXQuZ2V0bmFtZWluZm8oX19uYW1lX18sMCkKICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgICAgICAgICAgICAgaWYgc3lzLmdldHJlZmNvdW50KF9fbmFtZV9fKSAhPSBvcmlnOgorICAgICAgICAgICAgICAgIGlmIHN5cy5nZXRyZWZjb3VudChfX25hbWVfXykgPD4gb3JpZzoKICAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzb2NrZXQuZ2V0bmFtZWluZm8gbG9zZXMgYSByZWZlcmVuY2UiKQogCiAgICAgZGVmIHRlc3RJbnRlcnByZXRlckNyYXNoKHNlbGYpOgpAQCAtMTIzNCw5ICsxMjM0LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKIAogICAgIGRlZiBfdGVzdFJlY3ZJbnRvKHNlbGYpOgotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICBidWYgPSBidWZmZXIoTVNHKQorICAgICAgICBidWYgPSBidWZmZXIoTVNHKQogICAgICAgICBzZWxmLnNlcnZfY29ubi5zZW5kKGJ1ZikKIAogICAgIGRlZiB0ZXN0UmVjdkZyb21JbnRvKHNlbGYpOgpAQCAtMTI0Nyw5ICsxMjQ1LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKIAogICAgIGRlZiBfdGVzdFJlY3ZGcm9tSW50byhzZWxmKToKLSAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZwotICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygpOgotICAgICAgICAgICAgYnVmID0gYnVmZmVyKE1TRykKKyAgICAgICAgYnVmID0gYnVmZmVyKE1TRykKICAgICAgICAgc2VsZi5zZXJ2X2Nvbm4uc2VuZChidWYpCiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF9zb3J0LnB5CmluZGV4IGE4ZTIzOWEuLmE2MWZiOTYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc29ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NvcnQucHkKQEAgLTIsNyArMiw2IEBACiBpbXBvcnQgcmFuZG9tCiBpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB3YXJuaW5ncwogCiB2ZXJib3NlID0gdGVzdF9zdXBwb3J0LnZlcmJvc2UKIG5lcnJvcnMgPSAwCkBAIC0xODYsNyArMTg1LDcgQEAKICAgICBkZWYgdGVzdF9zdGFiaWxpdHkoc2VsZik6CiAgICAgICAgIGRhdGEgPSBbKHJhbmRvbS5yYW5kcmFuZ2UoMTAwKSwgaSkgZm9yIGkgaW4geHJhbmdlKDIwMCldCiAgICAgICAgIGNvcHkgPSBkYXRhWzpdCi0gICAgICAgIGRhdGEuc29ydChrZXk9bGFtYmRhIHg6IHhbMF0pICAgIyBzb3J0IG9uIHRoZSByYW5kb20gZmlyc3QgZmllbGQKKyAgICAgICAgZGF0YS5zb3J0KGtleT1sYW1iZGEgKHgseSk6IHgpICAjIHNvcnQgb24gdGhlIHJhbmRvbSBmaXJzdCBmaWVsZAogICAgICAgICBjb3B5LnNvcnQoKSAgICAgICAgICAgICAgICAgICAgICMgc29ydCB1c2luZyBib3RoIGZpZWxkcwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGNvcHkpICAgICMgc2hvdWxkIGdldCB0aGUgc2FtZSByZXN1bHQKIApAQCAtMjA4LDcgKzIwNyw3IEBACiAgICAgICAgICMgVmVyaWZ5IHRoYXQgdGhlIHdyYXBwZXIgaGFzIGJlZW4gcmVtb3ZlZAogICAgICAgICBkYXRhID0gcmFuZ2UoLTIsMikKICAgICAgICAgZHVwID0gZGF0YVs6XQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgZGF0YS5zb3J0LCBOb25lLCBsYW1iZGEgeDogMSAvLyB4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgZGF0YS5zb3J0LCBOb25lLCBsYW1iZGEgeDogMS94KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGR1cCkKIAogICAgIGRlZiB0ZXN0X2tleV93aXRoX211dGF0aW9uKHNlbGYpOgpAQCAtMjc1LDIxICsyNzQsMTcgQEAKICAgICAgICAgVGVzdEJ1Z3MsCiAgICAgKQogCi0gICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAidGhlIGNtcCBhcmd1bWVudCBpcyBub3Qgc3VwcG9ydGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQogCi0gICAgICAgICMgdmVyaWZ5IHJlZmVyZW5jZSBjb3VudGluZwotICAgICAgICBpZiB2ZXJib3NlIGFuZCBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKLSAgICAgICAgICAgIGltcG9ydCBnYwotICAgICAgICAgICAgY291bnRzID0gW05vbmVdICogNQotICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihjb3VudHMpKToKLSAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCi0gICAgICAgICAgICAgICAgZ2MuY29sbGVjdCgpCi0gICAgICAgICAgICAgICAgY291bnRzW2ldID0gc3lzLmdldHRvdGFscmVmY291bnQoKQotICAgICAgICAgICAgcHJpbnQgY291bnRzCisgICAgIyB2ZXJpZnkgcmVmZXJlbmNlIGNvdW50aW5nCisgICAgaWYgdmVyYm9zZSBhbmQgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisgICAgICAgIGltcG9ydCBnYworICAgICAgICBjb3VudHMgPSBbTm9uZV0gKiA1CisgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oY291bnRzKSk6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgIGNvdW50c1tpXSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgcHJpbnQgY291bnRzCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3FsaXRlLnB5IGIvTGliL3Rlc3QvdGVzdF9zcWxpdGUucHkKaW5kZXggZjNiZmQzZS4uMTY3NDA4YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zcWxpdGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zcWxpdGUucHkKQEAgLTQsMjEgKzQsMTQgQEAKICMgU2tpcCB0ZXN0IGlmIF9zcWxpdGUzIG1vZHVsZSB3YXMgbm90IGJ1aWx0LgogaW1wb3J0X21vZHVsZSgnX3NxbGl0ZTMnKQogCi1pbXBvcnQgd2FybmluZ3MKIGZyb20gc3FsaXRlMy50ZXN0IGltcG9ydCAoZGJhcGksIHR5cGVzLCB1c2VyZnVuY3Rpb25zLCBweTI1dGVzdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnksIHRyYW5zYWN0aW9ucywgaG9va3MsIHJlZ3Jlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXApCiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmdzCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiYnVmZmVyLi4gbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJjbGFzc2ljIGludCBkaXZpc2lvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgcnVuX3VuaXR0ZXN0KGRiYXBpLnN1aXRlKCksIHR5cGVzLnN1aXRlKCksIHVzZXJmdW5jdGlvbnMuc3VpdGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIHB5MjV0ZXN0cy5zdWl0ZSgpLCBmYWN0b3J5LnN1aXRlKCksIHRyYW5zYWN0aW9ucy5zdWl0ZSgpLAotICAgICAgICAgICAgICAgICAgICAgaG9va3Muc3VpdGUoKSwgcmVncmVzc2lvbi5zdWl0ZSgpLCBkdW1wLnN1aXRlKCkpCisgICAgcnVuX3VuaXR0ZXN0KGRiYXBpLnN1aXRlKCksIHR5cGVzLnN1aXRlKCksIHVzZXJmdW5jdGlvbnMuc3VpdGUoKSwKKyAgICAgICAgICAgICAgICAgcHkyNXRlc3RzLnN1aXRlKCksIGZhY3Rvcnkuc3VpdGUoKSwgdHJhbnNhY3Rpb25zLnN1aXRlKCksCisgICAgICAgICAgICAgICAgIGhvb2tzLnN1aXRlKCksIHJlZ3Jlc3Npb24uc3VpdGUoKSwgZHVtcC5zdWl0ZSgpKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NzbC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3NsLnB5CmluZGV4IDRiYTJlMmEuLjVhY2ExMzUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3NsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3NsLnB5CkBAIC04MDgsNyArODA4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHBwcmludC5wZm9ybWF0KGNlcnQpICsgJ1xuJykKICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIkNvbm5lY3Rpb24gY2lwaGVyIGlzICIgKyBzdHIoY2lwaGVyKSArICcuXG4nKQotICAgICAgICAgICAgICAgICAgICBpZiAnc3ViamVjdCcgbm90IGluIGNlcnQ6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjZXJ0Lmhhc19rZXkoJ3N1YmplY3QnKToKICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIHRlc3Rfc3VwcG9ydC5UZXN0RmFpbGVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBzdWJqZWN0IGZpZWxkIGluIGNlcnRpZmljYXRlOiAlcy4iICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcHJpbnQucGZvcm1hdChjZXJ0KSkKQEAgLTk3MCw5ICs5NzAsNyBAQAogICAgICAgICAgICAgICAgICMgbm93IGZldGNoIHRoZSBzYW1lIGRhdGEgZnJvbSB0aGUgSFRUUFMgc2VydmVyCiAgICAgICAgICAgICAgICAgdXJsID0gJ2h0dHBzOi8vMTI3LjAuMC4xOiVkLyVzJyAlICgKICAgICAgICAgICAgICAgICAgICAgc2VydmVyLnBvcnQsIG9zLnBhdGguc3BsaXQoQ0VSVEZJTEUpWzFdKQotICAgICAgICAgICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygpOgotICAgICAgICAgICAgICAgICAgICBmID0gdXJsbGliLnVybG9wZW4odXJsKQorICAgICAgICAgICAgICAgIGYgPSB1cmxsaWIudXJsb3Blbih1cmwpCiAgICAgICAgICAgICAgICAgZGxlbiA9IGYuaW5mbygpLmdldGhlYWRlcigiY29udGVudC1sZW5ndGgiKQogICAgICAgICAgICAgICAgIGlmIGRsZW4gYW5kIChpbnQoZGxlbikgPiAwKToKICAgICAgICAgICAgICAgICAgICAgZDIgPSBmLnJlYWQoaW50KGRsZW4pKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdHJ1Y3QucHkgYi9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQppbmRleCA3NmEyOWNkLi41NTZhNTc2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQpAQCAtNDcxLDcgKzQ3MSw3IEBACiAgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKICAgICAgICAgZm9yIHByZWZpeCBpbiB0dXBsZSgiPD4hPSIpKygnJywpOgogICAgICAgICAgICAgZmFsc2UgPSAoKSwgW10sIFtdLCAnJywgMAotICAgICAgICAgICAgdHJ1ZSA9IFsxXSwgJ3Rlc3QnLCA1LCAtMSwgMHhmZmZmZmZmZkwrMSwgMHhmZmZmZmZmZi8vMgorICAgICAgICAgICAgdHJ1ZSA9IFsxXSwgJ3Rlc3QnLCA1LCAtMSwgMHhmZmZmZmZmZkwrMSwgMHhmZmZmZmZmZi8yCiAKICAgICAgICAgICAgIGZhbHNlRm9ybWF0ID0gcHJlZml4ICsgJz8nICogbGVuKGZhbHNlKQogICAgICAgICAgICAgcGFja2VkRmFsc2UgPSBzdHJ1Y3QucGFjayhmYWxzZUZvcm1hdCwgKmZhbHNlKQpAQCAtNTA3LDExICs1MDcsNyBAQAogCiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmdzCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiYnVmZmVyLi4gbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgcnVuX3VuaXR0ZXN0KFN0cnVjdFRlc3QpCisgICAgcnVuX3VuaXR0ZXN0KFN0cnVjdFRlc3QpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3ludGF4LnB5IGIvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKaW5kZXggYzY3MzBjZC4uMjExOGM2MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKQEAgLTU1MiwxMSArNTUyLDcgQEAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFN5bnRheFRlc3RDYXNlKQogICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zeW50YXgKLSAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJiYWNrcXVvdGUgbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcpCi0gICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fZG9jdGVzdCh0ZXN0X3N5bnRheCwgdmVyYm9zaXR5PVRydWUpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3Rfc3ludGF4LCB2ZXJib3NpdHk9VHJ1ZSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zeXMucHkgYi9MaWIvdGVzdC90ZXN0X3N5cy5weQppbmRleCAwNGU2NjA3Li42NzY4Nzc1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N5cy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N5cy5weQpAQCAtNjgsOSArNjgsNyBAQAogICAgICMgUHl0aG9uL3B5dGhvbnJ1bi5jOjpQeUVycl9QcmludEV4KCkgaXMgdHJpY2t5LgogCiAgICAgZGVmIHRlc3RfZXhjX2NsZWFyKHNlbGYpOgotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIHdpdGggdGVzdC50ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3lzLmV4Y19jbGVhciwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3lzLmV4Y19jbGVhciwgNDIpCiAKICAgICAgICAgIyBWZXJpZnkgdGhhdCBleGNfaW5mbyBpcyBwcmVzZW50IGFuZCBtYXRjaGVzIGV4YywgdGhlbiBjbGVhciBpdCwgYW5kCiAgICAgICAgICMgY2hlY2sgdGhhdCBpdCB3b3JrZWQuCkBAIC04MCw5ICs3OCw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsdWUgaXMgZXhjKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRyYWNlYmFjayBpcyBub3QgTm9uZSkKIAotICAgICAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZwotICAgICAgICAgICAgd2l0aCB0ZXN0LnRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygpOgotICAgICAgICAgICAgICAgIHN5cy5leGNfY2xlYXIoKQorICAgICAgICAgICAgc3lzLmV4Y19jbGVhcigpCiAKICAgICAgICAgICAgIHR5cCwgdmFsdWUsIHRyYWNlYmFjayA9IHN5cy5leGNfaW5mbygpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwIGlzIE5vbmUpCkBAIC00ODgsOSArNDg0LDcgQEAKICAgICAgICAgIyBib29sCiAgICAgICAgIGNoZWNrKFRydWUsIHNpemUoaCArICdsJykpCiAgICAgICAgICMgYnVmZmVyCi0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2l0aCB0ZXN0LnRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygpOgotICAgICAgICAgICAgY2hlY2soYnVmZmVyKCcnKSwgc2l6ZShoICsgJzJQMlBpbCcpKQorICAgICAgICBjaGVjayhidWZmZXIoJycpLCBzaXplKGggKyAnMlAyUGlsJykpCiAgICAgICAgICMgYnVpbHRpbl9mdW5jdGlvbl9vcl9tZXRob2QKICAgICAgICAgY2hlY2sobGVuLCBzaXplKGggKyAnM1AnKSkKICAgICAgICAgIyBieXRlYXJyYXkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQppbmRleCA4ZTQ4YTUzLi5iYzBhZTU4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CkBAIC03MTIsOSArNzEyLDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5pc2ZpbGUobmFtZSkKIAogICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCi0gICAgICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygpOgotICAgICAgICAgICAgICAgIHRhci5hZGQodGVtcGRpciwgYXJjbmFtZT0iZW1wdHlfZGlyIiwgZXhjbHVkZT1leGNsdWRlKQorICAgICAgICAgICAgdGFyLmFkZCh0ZW1wZGlyLCBhcmNuYW1lPSJlbXB0eV9kaXIiLCBleGNsdWRlPWV4Y2x1ZGUpCiAgICAgICAgICAgICB0YXIuY2xvc2UoKQogCiAgICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInIiKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90aHJlYWRzaWduYWxzLnB5IGIvTGliL3Rlc3QvdGVzdF90aHJlYWRzaWduYWxzLnB5CmluZGV4IGIyODcwNWYuLmUxMDk2YmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGhyZWFkc2lnbmFscy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RocmVhZHNpZ25hbHMucHkKQEAgLTE0LDcgKzE0LDcgQEAKIHNpZ25hbGxlZF9hbGw9dGhyZWFkLmFsbG9jYXRlX2xvY2soKQogCiAKLWRlZiByZWdpc3RlclNpZ25hbHMoZm9yX3VzcjEsIGZvcl91c3IyLCBmb3JfYWxybSk6CitkZWYgcmVnaXN0ZXJTaWduYWxzKChmb3JfdXNyMSwgZm9yX3VzcjIsIGZvcl9hbHJtKSk6CiAgICAgdXNyMSA9IHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1VTUjEsIGZvcl91c3IxKQogICAgIHVzcjIgPSBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IyLCBmb3JfdXNyMikKICAgICBhbHJtID0gc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgZm9yX2Fscm0pCkBAIC03NCwxMSArNzQsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsLlNJR1VTUjIgOiB7J3RyaXBwZWQnOiAwLCAndHJpcHBlZF9ieSc6IDAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsLlNJR0FMUk0gOiB7J3RyaXBwZWQnOiAwLCAndHJpcHBlZF9ieSc6IDAgfSB9CiAKLSAgICBvbGRzaWdzID0gcmVnaXN0ZXJTaWduYWxzKGhhbmRsZV9zaWduYWxzLCBoYW5kbGVfc2lnbmFscywgaGFuZGxlX3NpZ25hbHMpCisgICAgb2xkc2lncyA9IHJlZ2lzdGVyU2lnbmFscygoaGFuZGxlX3NpZ25hbHMsIGhhbmRsZV9zaWduYWxzLCBoYW5kbGVfc2lnbmFscykpCiAgICAgdHJ5OgogICAgICAgICBydW5fdW5pdHRlc3QoVGhyZWFkU2lnbmFscykKICAgICBmaW5hbGx5OgotICAgICAgICByZWdpc3RlclNpZ25hbHMoKm9sZHNpZ3MpCisgICAgICAgIHJlZ2lzdGVyU2lnbmFscyhvbGRzaWdzKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RyYWNlLnB5IGIvTGliL3Rlc3QvdGVzdF90cmFjZS5weQppbmRleCBkZjhjNTZmLi5mNjlhZjhkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RyYWNlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdHJhY2UucHkKQEAgLTQwMSw3ICs0MDEsNyBAQAogICAgICAgICB3ZSdyZSB0ZXN0aW5nLCBzbyB0aGF0IHRoZSAnZXhjZXB0aW9uJyB0cmFjZSBldmVudCBmaXJlcy4iIiIKICAgICAgICAgaWYgc2VsZi5yYWlzZU9uRXZlbnQgPT0gJ2V4Y2VwdGlvbic6CiAgICAgICAgICAgICB4ID0gMAotICAgICAgICAgICAgeSA9IDEgLy8geAorICAgICAgICAgICAgeSA9IDEveAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIDEKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkgYi9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQppbmRleCA2MTE5NWE1Li5iMjk4NjlhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQpAQCAtNCw3ICs0LDYgQEAKIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiBpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gaW1wIGltcG9ydCByZWxvYWQKIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgaXNfanl0aG9uLCBFcnJvcgogCiBpbXBvcnQgdHJhY2ViYWNrCkBAIC0xNDksNyArMTQ4LDcgQEAKICAgICBkZWYgdGVzdF9mb3JtYXRfZXhjZXB0aW9uX29ubHlfYmFkX19zdHJfXyhzZWxmKToKICAgICAgICAgY2xhc3MgWChFeGNlcHRpb24pOgogICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgICAgICAgICAgICAgMSAvLyAwCisgICAgICAgICAgICAgICAgMS8wCiAgICAgICAgIGVyciA9IHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uX29ubHkoWCwgWCgpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihlcnIpLCAxKQogICAgICAgICBzdHJfdmFsdWUgPSAnPHVucHJpbnRhYmxlICVzIG9iamVjdD4nICUgWC5fX25hbWVfXwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90cmFuc2Zvcm1lci5weSBiL0xpYi90ZXN0L3Rlc3RfdHJhbnNmb3JtZXIucHkKaW5kZXggNjU5MDkzNy4uOTA5Y2RhNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90cmFuc2Zvcm1lci5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RyYW5zZm9ybWVyLnB5CkBAIC0xLDggKzEsNSBAQAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAotCi0jIFNpbGVuY2UgUHkzayB3YXJuaW5nCi10ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnY29tcGlsZXInLCBkZXByZWNhdGVkPVRydWUpCiBmcm9tIGNvbXBpbGVyIGltcG9ydCB0cmFuc2Zvcm1lciwgYXN0CiBmcm9tIGNvbXBpbGVyIGltcG9ydCBjb21waWxlCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHlwZXMucHkgYi9MaWIvdGVzdC90ZXN0X3R5cGVzLnB5CmluZGV4IGQ1ZDI1YjAuLjE4YWI5Y2MgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdHlwZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90eXBlcy5weQpAQCAtNCw3ICs0LDYgQEAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHN5cwogaW1wb3J0IGxvY2FsZQotaW1wb3J0IHdhcm5pbmdzCiAKIGNsYXNzIFR5cGVzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC03MTEsMTMgKzcxMCw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmb3JtYXQsIDAsICcsJyArIGNvZGUpCiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmdzCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiYnVmZmVyLi4gbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJjbGFzc2ljIGxvbmcgZGl2aXNpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgIHJ1bl91bml0dGVzdChUeXBlc1Rlc3RzKQorICAgIHJ1bl91bml0dGVzdChUeXBlc1Rlc3RzKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VuZG9jdW1lbnRlZF9kZXRhaWxzLnB5IGIvTGliL3Rlc3QvdGVzdF91bmRvY3VtZW50ZWRfZGV0YWlscy5weQppbmRleCBmMzUwOGZjLi5jYTY2YzE5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VuZG9jdW1lbnRlZF9kZXRhaWxzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdW5kb2N1bWVudGVkX2RldGFpbHMucHkKQEAgLTEsNCArMSw0IEBACi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGNoZWNrX3dhcm5pbmdzCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGhhdmVfdW5pY29kZQogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgc3lzCiAKQEAgLTMzLDkgKzMzLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdfY2VsbCAhPSBoX2NlbGwpCiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5ncwotICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgcnVuX3VuaXR0ZXN0KFRlc3RJbXBsZW1lbnRhdGlvbkNvbXBhcmlzb25zKQorICAgIHJ1bl91bml0dGVzdChUZXN0SW1wbGVtZW50YXRpb25Db21wYXJpc29ucykKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91bml0dGVzdC5weSBiL0xpYi90ZXN0L3Rlc3RfdW5pdHRlc3QucHkKaW5kZXggOWIyNGM4Yy4uZGI1MWY3NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91bml0dGVzdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VuaXR0ZXN0LnB5CkBAIC0zMDU2LDcgKzMwNTYsNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBOb25lKQogICAgICAgICBleGNlcHQgc2VsZi5mYWlsdXJlRXhjZXB0aW9uIGFzIGU6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oIktleUVycm9yIG5vdCByYWlzZWQiIGluIGUuYXJncywgc3RyKGUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCJLZXlFcnJvciBub3QgcmFpc2VkIiBpbiBlLCBzdHIoZSkpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoImFzc2VydFJhaXNlcygpIGRpZG4ndCBmYWlsIikKICAgICAgICAgdHJ5OgpAQCAtMzA3Myw3ICszMDczLDcgQEAKICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgogICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZXhjZXB0IHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiBhcyBlOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCJLZXlFcnJvciBub3QgcmFpc2VkIiBpbiBlLmFyZ3MsIHN0cihlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygiS2V5RXJyb3Igbm90IHJhaXNlZCIgaW4gZSwgc3RyKGUpKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJhc3NlcnRSYWlzZXMoKSBkaWRuJ3QgZmFpbCIpCiAgICAgICAgIHRyeToKQEAgLTM1OTEsOSArMzU5MSw2IEBACiAgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXRoID09IG90aGVyLnBhdGgKIAotICAgICAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZwotICAgICAgICAgICAgX19oYXNoX18gPSBOb25lCi0KICAgICAgICAgbG9hZGVyLl9nZXRfbW9kdWxlX2Zyb21fbmFtZSA9IGxhbWJkYSBuYW1lOiBNb2R1bGUobmFtZSkKICAgICAgICAgZGVmIGxvYWRUZXN0c0Zyb21Nb2R1bGUobW9kdWxlLCB1c2VfbG9hZF90ZXN0cyk6CiAgICAgICAgICAgICBpZiB1c2VfbG9hZF90ZXN0czoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdW5pdm5ld2xpbmVzMmsucHkgYi9MaWIvdGVzdC90ZXN0X3VuaXZuZXdsaW5lczJrLnB5CmluZGV4IGM2ZDZlOGIuLjYzYzZmZTggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdW5pdm5ld2xpbmVzMmsucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91bml2bmV3bGluZXMyay5weQpAQCAtODAsOSArODAsNyBAQAogCiAgICAgZGVmIHRlc3RfZXhlY2ZpbGUoc2VsZik6CiAgICAgICAgIG5hbWVzcGFjZSA9IHt9Ci0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgIGV4ZWNmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sIG5hbWVzcGFjZSkKKyAgICAgICAgZXhlY2ZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgbmFtZXNwYWNlKQogICAgICAgICBmdW5jID0gbmFtZXNwYWNlWydsaW5lMyddCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYy5mdW5jX2NvZGUuY29fZmlyc3RsaW5lbm8sIDMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZXNwYWNlWydsaW5lNCddLCBGQVRYKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxsaWIucHkgYi9MaWIvdGVzdC90ZXN0X3VybGxpYi5weQppbmRleCAxMGM4ZDkwLi5jNzRiMTAxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VybGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybGxpYi5weQpAQCAtNiw3ICs2LDYgQEAKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBpbXBvcnQgb3MKIGltcG9ydCBtaW1ldG9vbHMKLWltcG9ydCByYW5kb20KIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IFN0cmluZ0lPCiAKQEAgLTEwMiw3ICsxMDEsNyBAQAogICAgICAgICAjIFJlY29yZHMgY2hhbmdlcyB0byBlbnYgdmFycwogICAgICAgICBzZWxmLmVudiA9IHRlc3Rfc3VwcG9ydC5FbnZpcm9ubWVudFZhckd1YXJkKCkKICAgICAgICAgIyBEZWxldGUgYWxsIHByb3h5IHJlbGF0ZWQgZW52IHZhcnMKLSAgICAgICAgZm9yIGsgaW4gb3MuZW52aXJvbi5rZXlzKCk6CisgICAgICAgIGZvciBrLCB2IGluIG9zLmVudmlyb24uaXRlcml0ZW1zKCk6CiAgICAgICAgICAgICBpZiAncHJveHknIGluIGsubG93ZXIoKToKICAgICAgICAgICAgICAgICBzZWxmLmVudi51bnNldChrKQogCkBAIC00MTAsMTMgKzQwOSw2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJsbGliLnF1b3RlX3BsdXMoJ2FscGhhK2JldGEgZ2FtbWEnLCAnKycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICdhbHBoYStiZXRhK2dhbW1hJykKIAotICAgIGRlZiB0ZXN0X3F1b3RlX2xlYWsoc2VsZik6Ci0gICAgICAgICMgYnVnIDU1OTYgLSBoaWdobGlnaHQgdGhlIHJlZmxlYWsgaW4gdGhlIGludGVybmFsIF9zYWZlbWFwcyBjYWNoZQotICAgICAgICBzYWZlID0gJycuam9pbihjaHIocmFuZG9tLnJhbmRyYW5nZSgxMjgpKSBmb3IgaSBpbiAnMTIzNDU2JykKLSAgICAgICAgdGV4dCA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKLSAgICAgICAgcmVzdWx0ID0gdXJsbGliLnF1b3RlKHRleHQsIHNhZmU9c2FmZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHRleHQpCi0KIGNsYXNzIFVucXVvdGluZ1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAiIiJUZXN0cyBmb3IgdW5xdW90ZSgpIGFuZCB1bnF1b3RlX3BsdXMoKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYjJfbG9jYWxuZXQucHkgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjJfbG9jYWxuZXQucHkKaW5kZXggODFmNTRhZS4uMTM3NWUxMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxsaWIyX2xvY2FsbmV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weQpAQCAtMSw1ICsxLDYgQEAKICMhL3Vzci9iaW4vZW52IHB5dGhvbgogCitpbXBvcnQgbWltZXRvb2xzCiBpbXBvcnQgdGhyZWFkaW5nCiBpbXBvcnQgdXJscGFyc2UKIGltcG9ydCB1cmxsaWIyCkBAIC03LDcgKzgsNiBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgaGFzaGxpYgogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKLW1pbWV0b29scyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdtaW1ldG9vbHMnLCBkZXByZWNhdGVkPVRydWUpCiAKICMgTG9vcGJhY2sgaHR0cCBzZXJ2ZXIgaW5mcmFzdHJ1Y3R1cmUKIApAQCAtMTU0LDEzICsxNTQsMTMgQEAKICAgICAgICAgaWYgbGVuKHNlbGYuX3VzZXJzKSA9PSAwOgogICAgICAgICAgICAgcmV0dXJuIFRydWUKIAotICAgICAgICBpZiAnUHJveHktQXV0aG9yaXphdGlvbicgbm90IGluIHJlcXVlc3RfaGFuZGxlci5oZWFkZXJzOgorICAgICAgICBpZiBub3QgcmVxdWVzdF9oYW5kbGVyLmhlYWRlcnMuaGFzX2tleSgnUHJveHktQXV0aG9yaXphdGlvbicpOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JldHVybl9hdXRoX2NoYWxsZW5nZShyZXF1ZXN0X2hhbmRsZXIpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBhdXRoX2RpY3QgPSBzZWxmLl9jcmVhdGVfYXV0aF9kaWN0KAogICAgICAgICAgICAgICAgIHJlcXVlc3RfaGFuZGxlci5oZWFkZXJzWydQcm94eS1BdXRob3JpemF0aW9uJ10KICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICBpZiBhdXRoX2RpY3RbInVzZXJuYW1lIl0gaW4gc2VsZi5fdXNlcnM6CisgICAgICAgICAgICBpZiBzZWxmLl91c2Vycy5oYXNfa2V5KGF1dGhfZGljdFsidXNlcm5hbWUiXSk6CiAgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBzZWxmLl91c2Vyc1sgYXV0aF9kaWN0WyJ1c2VybmFtZSJdIF0KICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JldHVybl9hdXRoX2NoYWxsZW5nZShyZXF1ZXN0X2hhbmRsZXIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYm5ldC5weSBiL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5CmluZGV4IDlkMzEyMjguLjdhYjJhYTIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5CkBAIC03LDcgKzcsNyBAQAogaW1wb3J0IHVybGxpYgogaW1wb3J0IHN5cwogaW1wb3J0IG9zCi1taW1ldG9vbHMgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgibWltZXRvb2xzIiwgZGVwcmVjYXRlZD1UcnVlKQoraW1wb3J0IG1pbWV0b29scwogCiAKIGRlZiBfb3Blbl93aXRoX3JldHJ5KGZ1bmMsIGhvc3QsICphcmdzLCAqKmt3YXJncyk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VzZXJkaWN0LnB5IGIvTGliL3Rlc3QvdGVzdF91c2VyZGljdC5weQppbmRleCBjZjYzMWZmLi5jODZhNzczIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VzZXJkaWN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXNlcmRpY3QucHkKQEAgLTQ1LDkgKzQ1LDcgQEAKICAgICAgICAgIyBUZXN0IF9fcmVwcl9fCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHUwKSwgc3RyKGQwKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHUxKSwgcmVwcihkMSkpCi0gICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnYHUyYCcpLCBldmFsKCdgZDJgJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYHUyYCwgYGQyYCkKIAogICAgICAgICAjIFRlc3QgX19jbXBfXyBhbmQgX19sZW5fXwogICAgICAgICBhbGwgPSBbZDAsIGQxLCBkMiwgdSwgdTAsIHUxLCB1MiwgdXUsIHV1MCwgdXUxLCB1dTJdCkBAIC05NywxNCArOTUsMTIgQEAKIAogICAgICAgICAjIFRlc3QgaGFzX2tleSBhbmQgImluIi4KICAgICAgICAgZm9yIGkgaW4gdTIua2V5cygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUyLmhhc19rZXkoaSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaSBpbiB1MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTEuaGFzX2tleShpKSwgZDEuaGFzX2tleShpKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSBpbiB1MSwgaSBpbiBkMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTAuaGFzX2tleShpKSwgZDAuaGFzX2tleShpKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSBpbiB1MCwgaSBpbiBkMCkKLSAgICAgICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLSAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUyLmhhc19rZXkoaSkpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1MS5oYXNfa2V5KGkpLCBkMS5oYXNfa2V5KGkpKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTAuaGFzX2tleShpKSwgZDAuaGFzX2tleShpKSkKIAogICAgICAgICAjIFRlc3QgdXBkYXRlCiAgICAgICAgIHQgPSBVc2VyRGljdC5Vc2VyRGljdCgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VzZXJsaXN0LnB5IGIvTGliL3Rlc3QvdGVzdF91c2VybGlzdC5weQppbmRleCAwOWZhMTg4Li5lZDNlNTU5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VzZXJsaXN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXNlcmxpc3QucHkKQEAgLTIsNyArMiw2IEBACiAKIGZyb20gVXNlckxpc3QgaW1wb3J0IFVzZXJMaXN0CiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCwgbGlzdF90ZXN0cwotaW1wb3J0IHdhcm5pbmdzCiAKIGNsYXNzIFVzZXJMaXN0VGVzdChsaXN0X3Rlc3RzLkNvbW1vblRlc3QpOgogICAgIHR5cGUydGVzdCA9IFVzZXJMaXN0CkBAIC01NCwxMSArNTMsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZXIoVCgoMSwyKSkpLm5leHQoKSwgIjAhISEiKQogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5ncwotICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgIi4rc2xpY2VfXyBoYXMgYmVlbiByZW1vdmVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFVzZXJMaXN0VGVzdCkKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFVzZXJMaXN0VGVzdCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91c2Vyc3RyaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF91c2Vyc3RyaW5nLnB5CmluZGV4IDhlYzljYTMuLmI5OTU4MWQgMTAwNzU1Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXNlcnN0cmluZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VzZXJzdHJpbmcucHkKQEAgLTEzNiwxMSArMTM2LDggQEAKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZ3MKICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIuKk11dGFibGVTdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiLitzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCiAgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVXNlclN0cmluZ1Rlc3QsIE11dGFibGVTdHJpbmdUZXN0KQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93ZWFrcmVmLnB5IGIvTGliL3Rlc3QvdGVzdF93ZWFrcmVmLnB5CmluZGV4IGYzZWI0M2IuLjIxMDZkOGMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2Vha3JlZi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dlYWtyZWYucHkKQEAgLTU0LDEwICs1NCwxMCBAQAogICAgICAgICAjIExpdmUgcmVmZXJlbmNlOgogICAgICAgICBvID0gQygpCiAgICAgICAgIHdyID0gd2Vha3JlZi5yZWYobykKLSAgICAgICAgcmVwcih3cikKKyAgICAgICAgYHdyYAogICAgICAgICAjIERlYWQgcmVmZXJlbmNlOgogICAgICAgICBkZWwgbwotICAgICAgICByZXByKHdyKQorICAgICAgICBgd3JgCiAKICAgICBkZWYgdGVzdF9iYXNpY19jYWxsYmFjayhzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19iYXNpY19jYWxsYmFjayhDKQpAQCAtMTY5LDkgKzE2OSw3IEBACiAgICAgICAgIHAuYXBwZW5kKDEyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihMKSwgMSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAsICJwcm94eSBmb3Igbm9uLWVtcHR5IFVzZXJMaXN0IHNob3VsZCBiZSB0cnVlIikKLSAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZwotICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygpOgotICAgICAgICAgICAgcFs6XSA9IFsyLCAzXQorICAgICAgICBwWzpdID0gWzIsIDNdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEwpLCAyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwKSwgMikKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDMgaW4gcCwKQEAgLTE4NSwxMiArMTgzLDEwIEBACiAgICAgICAgICMjIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihMMiksIHJlcHIocDIpKQogICAgICAgICBMMyA9IFVzZXJMaXN0LlVzZXJMaXN0KHJhbmdlKDEwKSkKICAgICAgICAgcDMgPSB3ZWFrcmVmLnByb3h5KEwzKQotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEwzWzpdLCBwM1s6XSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTDNbNTpdLCBwM1s1Ol0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEwzWzo1XSwgcDNbOjVdKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMM1syOjVdLCBwM1syOjVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEwzWzpdLCBwM1s6XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMM1s1Ol0sIHAzWzU6XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMM1s6NV0sIHAzWzo1XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMM1syOjVdLCBwM1syOjVdKQogCiAgICAgZGVmIHRlc3RfcHJveHlfdW5pY29kZShzZWxmKToKICAgICAgICAgIyBTZWUgYnVnIDUwMzcKQEAgLTgzNiw3ICs4MzIsNyBAQAogICAgIGRlZiB0ZXN0X3dlYWtfa2V5cyhzZWxmKToKICAgICAgICAgIwogICAgICAgICAjICBUaGlzIGV4ZXJjaXNlcyBkLmNvcHkoKSwgZC5pdGVtcygpLCBkW10gPSB2LCBkW10sIGRlbCBkW10sCi0gICAgICAgICMgIGxlbihkKSwgaW4gZC4KKyAgICAgICAgIyAgbGVuKGQpLCBkLmhhc19rZXkoKS4KICAgICAgICAgIwogICAgICAgICBkaWN0LCBvYmplY3RzID0gc2VsZi5tYWtlX3dlYWtfa2V5ZWRfZGljdCgpCiAgICAgICAgIGZvciBvIGluIG9iamVjdHM6CkBAIC04NTgsOCArODU0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICJkZWxldGluZyB0aGUga2V5cyBkaWQgbm90IGNsZWFyIHRoZSBkaWN0aW9uYXJ5IikKICAgICAgICAgbyA9IE9iamVjdCg0MikKICAgICAgICAgZGljdFtvXSA9ICJXaGF0IGlzIHRoZSBtZWFuaW5nIG9mIHRoZSB1bml2ZXJzZT8iCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvIGluIGRpY3QpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgzNCBub3QgaW4gZGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpY3QuaGFzX2tleShvKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBkaWN0Lmhhc19rZXkoMzQpKQogCiAgICAgZGVmIHRlc3Rfd2Vha19rZXllZF9pdGVycyhzZWxmKToKICAgICAgICAgZGljdCwgb2JqZWN0cyA9IHNlbGYubWFrZV93ZWFrX2tleWVkX2RpY3QoKQpAQCAtODcxLDcgKzg2Nyw3IEBACiAgICAgICAgIG9iamVjdHMyID0gbGlzdChvYmplY3RzKQogICAgICAgICBmb3Igd3IgaW4gcmVmczoKICAgICAgICAgICAgIG9iID0gd3IoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9iIGluIGRpY3QpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZGljdC5oYXNfa2V5KG9iKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvYiBpbiBkaWN0KQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYi5hcmcsIGRpY3Rbb2JdKQogICAgICAgICAgICAgb2JqZWN0czIucmVtb3ZlKG9iKQpAQCAtODgyLDYgKzg3OCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpc3QoZGljdC5pdGVya2V5cmVmcygpKSksIGxlbihvYmplY3RzKSkKICAgICAgICAgZm9yIHdyIGluIGRpY3QuaXRlcmtleXJlZnMoKToKICAgICAgICAgICAgIG9iID0gd3IoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpY3QuaGFzX2tleShvYikpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob2IgaW4gZGljdCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2IuYXJnLCBkaWN0W29iXSkKICAgICAgICAgICAgIG9iamVjdHMyLnJlbW92ZShvYikKQEAgLTk5NiwxMyArOTkzLDEzIEBACiAgICAgICAgIHdlYWtkaWN0ID0ga2xhc3MoKQogICAgICAgICBvID0gd2Vha2RpY3Quc2V0ZGVmYXVsdChrZXksIHZhbHVlMSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG8gaXMgdmFsdWUxKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoa2V5IGluIHdlYWtkaWN0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha2RpY3QuaGFzX2tleShrZXkpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha2RpY3QuZ2V0KGtleSkgaXMgdmFsdWUxKQogICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha2RpY3Rba2V5XSBpcyB2YWx1ZTEpCiAKICAgICAgICAgbyA9IHdlYWtkaWN0LnNldGRlZmF1bHQoa2V5LCB2YWx1ZTIpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvIGlzIHZhbHVlMSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGtleSBpbiB3ZWFrZGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtkaWN0Lmhhc19rZXkoa2V5KSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtkaWN0LmdldChrZXkpIGlzIHZhbHVlMSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtkaWN0W2tleV0gaXMgdmFsdWUxKQogCkBAIC0xMDE2LDIwICsxMDEzLDIwIEBACiAKICAgICBkZWYgY2hlY2tfdXBkYXRlKHNlbGYsIGtsYXNzLCBkaWN0KToKICAgICAgICAgIwotICAgICAgICAjICBUaGlzIGV4ZXJjaXNlcyBkLnVwZGF0ZSgpLCBsZW4oZCksIGQua2V5cygpLCBpbiBkLAorICAgICAgICAjICBUaGlzIGV4ZXJjaXNlcyBkLnVwZGF0ZSgpLCBsZW4oZCksIGQua2V5cygpLCBkLmhhc19rZXkoKSwKICAgICAgICAgIyAgZC5nZXQoKSwgZFtdLgogICAgICAgICAjCiAgICAgICAgIHdlYWtkaWN0ID0ga2xhc3MoKQogICAgICAgICB3ZWFrZGljdC51cGRhdGUoZGljdCkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih3ZWFrZGljdCkgPT0gbGVuKGRpY3QpKQogICAgICAgICBmb3IgayBpbiB3ZWFrZGljdC5rZXlzKCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoayBpbiBkaWN0LAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpY3QuaGFzX2tleShrKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAibXlzdGVyaW91cyBuZXcga2V5IGFwcGVhcmVkIGluIHdlYWsgZGljdCIpCiAgICAgICAgICAgICB2ID0gZGljdC5nZXQoaykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGlzIHdlYWtkaWN0W2tdKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYgaXMgd2Vha2RpY3QuZ2V0KGspKQogICAgICAgICBmb3IgayBpbiBkaWN0LmtleXMoKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrIGluIHdlYWtkaWN0LAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtkaWN0Lmhhc19rZXkoayksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yaWdpbmFsIGtleSBkaXNhcHBlYXJlZCBpbiB3ZWFrIGRpY3QiKQogICAgICAgICAgICAgdiA9IGRpY3Rba10KICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGlzIHdlYWtkaWN0W2tdKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93aGljaGRiLnB5IGIvTGliL3Rlc3QvdGVzdF93aGljaGRiLnB5CmluZGV4IDQyN2UzMjMuLjFjZTgxNmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2hpY2hkYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3doaWNoZGIucHkKQEAgLTcsMTMgKzcsMTEgQEAKIGltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgd2hpY2hkYgoraW1wb3J0IGFueWRibQogaW1wb3J0IGdsb2IKIAogX2ZuYW1lID0gdGVzdC50ZXN0X3N1cHBvcnQuVEVTVEZOCiAKLSMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLWFueWRibSA9IHRlc3QudGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2FueWRibScsIGRlcHJlY2F0ZWQ9VHJ1ZSkKLQogZGVmIF9kZWxldGVfZmlsZXMoKToKICAgICAjIHdlIGRvbid0IGtub3cgdGhlIHByZWNpc2UgbmFtZSB0aGUgdW5kZXJseWluZyBkYXRhYmFzZSB1c2VzCiAgICAgIyBzbyB3ZSB1c2UgZ2xvYiB0byBsb2NhdGUgYWxsIG5hbWVzCkBAIC0zOSw5ICszNyw4IEBACiAgICAgIyB3ZSBkZWZpbmUgYSBuZXcgdGVzdCBtZXRob2QgZm9yIGVhY2gKICAgICAjIGNhbmRpZGF0ZSBkYXRhYmFzZSBtb2R1bGUuCiAgICAgdHJ5OgotICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIG1vZCA9IHRlc3QudGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUobmFtZSwgZGVwcmVjYXRlZD1UcnVlKQotICAgIGV4Y2VwdCB1bml0dGVzdC5Ta2lwVGVzdDoKKyAgICAgICAgbW9kID0gX19pbXBvcnRfXyhuYW1lKQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgY29udGludWUKIAogICAgIGRlZiB0ZXN0X3doaWNoZGJfbmFtZShzZWxmLCBuYW1lPW5hbWUsIG1vZD1tb2QpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93aXRoLnB5IGIvTGliL3Rlc3QvdGVzdF93aXRoLnB5CmluZGV4IDNlMzNlMzEuLmI1NzJiOTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2l0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dpdGgucHkKQEAgLTUyMCw3ICs1MjAsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgZmFsc2VBc0Jvb2wpCiAKICAgICAgICAgZGVmIGZhaWxBc0Jvb2woKToKLSAgICAgICAgICAgIHdpdGggY20obGFtYmRhOiAxIC8vIDApOgorICAgICAgICAgICAgd2l0aCBjbShsYW1iZGE6IDEvLzApOgogICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIE5PVCBzZWUgdGhpcyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBmYWlsQXNCb29sKQogCkBAIC02MjgsNyArNjI4LDcgQEAKICAgICAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0LCB2LCB0Yik6IHJldHVybiBUcnVlCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHdpdGggQWZyaWNhblN3YWxsb3coKToKLSAgICAgICAgICAgICAgICAxIC8vIDAKKyAgICAgICAgICAgICAgICAxLzAKICAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJaZXJvRGl2aXNpb25FcnJvciBzaG91bGQgaGF2ZSBiZWVuIHN3YWxsb3dlZCIpCiAKQEAgLTYzOCw3ICs2MzgsNyBAQAogICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsIHQsIHYsIHRiKTogcmV0dXJuIEZhbHNlCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHdpdGggRXVyb3BlYW5Td2FsbG93KCk6Ci0gICAgICAgICAgICAgICAgMSAvLyAwCisgICAgICAgICAgICAgICAgMS8wCiAgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxzZToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd3NnaXJlZi5weSBiL0xpYi90ZXN0L3Rlc3Rfd3NnaXJlZi5weQppbmRleCBjMzFlZjE4Li5hM2JjOTlmIDEwMDc1NQotLS0gYS9MaWIvdGVzdC90ZXN0X3dzZ2lyZWYucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93c2dpcmVmLnB5CkBAIC00MzIsMTAgKzQzMiwxMCBAQAogICAgICAgICBlbnYgPSBoYW5kbGVyLmVudmlyb24KICAgICAgICAgZnJvbSBvcyBpbXBvcnQgZW52aXJvbgogICAgICAgICBmb3Igayx2IGluIGVudmlyb24uaXRlbXMoKToKLSAgICAgICAgICAgIGlmIGsgbm90IGluIGVtcHR5OgorICAgICAgICAgICAgaWYgbm90IGVtcHR5Lmhhc19rZXkoayk6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnZba10sdikKICAgICAgICAgZm9yIGssdiBpbiBlbXB0eS5pdGVtcygpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGsgaW4gZW52KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVudi5oYXNfa2V5KGspKQogCiAgICAgZGVmIHRlc3RFbnZpcm9uKHNlbGYpOgogICAgICAgICBoID0gVGVzdEhhbmRsZXIoWD0iWSIpCkBAIC00NDgsNyArNDQ4LDcgQEAKICAgICAgICAgaCA9IEJhc2VDR0lIYW5kbGVyKE5vbmUsTm9uZSxOb25lLHt9KQogICAgICAgICBoLnNldHVwX2Vudmlyb24oKQogICAgICAgICBmb3Iga2V5IGluICd3c2dpLnVybF9zY2hlbWUnLCAnd3NnaS5pbnB1dCcsICd3c2dpLmVycm9ycyc6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoa2V5IGluIGguZW52aXJvbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoLmVudmlyb24uaGFzX2tleShrZXkpKQogCiAgICAgZGVmIHRlc3RTY2hlbWUoc2VsZik6CiAgICAgICAgIGg9VGVzdEhhbmRsZXIoSFRUUFM9Im9uIik7IGguc2V0dXBfZW52aXJvbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3htbGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfeG1sbGliLnB5CmluZGV4IDY4Yjg4M2EuLjA3ODBiYzkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfeG1sbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfeG1sbGliLnB5CkBAIC0xNSwxMCArMTUsMTMgQEAKIAogbnNkb2MgPSAiPGZvbyB4bWxucz0nVVJJJyBhdHRyPSd2YWwnLz4iCiAKK2ltcG9ydCB3YXJuaW5ncword2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIuKiB4bWxsaWIgLiogb2Jzb2xldGUuKiIsCisgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHIneG1sbGliJCcpCisKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBpbXBvcnQgdW5pdHRlc3QKLSMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKLXhtbGxpYiA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd4bWxsaWInLCBkZXByZWNhdGVkPVRydWUpCitpbXBvcnQgeG1sbGliCiAKIGNsYXNzIFhNTFBhcnNlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF94cGlja2xlLnB5IGIvTGliL3Rlc3QvdGVzdF94cGlja2xlLnB5CmluZGV4IGY0MWM5N2EuLjNlZDdlZjcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfeHBpY2tsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3hwaWNrbGUucHkKQEAgLTI1LDcgKzI1LDcgQEAKIG1vZF9wYXRoID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwaWNrbGV0ZXN0ZXIucHkiKSkKIHBpY2tsZXRlc3RlciA9IHR5cGVzLk1vZHVsZVR5cGUoInRlc3QucGlja2xldGVzdGVyIikKLWV4ZWMgY29tcGlsZShvcGVuKG1vZF9wYXRoKS5yZWFkKCksIG1vZF9wYXRoLCAnZXhlYycpIGluIHBpY2tsZXRlc3Rlci5fX2RpY3RfXworZXhlY2ZpbGUobW9kX3BhdGgsIHBpY2tsZXRlc3Rlci5fX2RpY3RfXywgcGlja2xldGVzdGVyLl9fZGljdF9fKQogQWJzdHJhY3RQaWNrbGVUZXN0cyA9IHBpY2tsZXRlc3Rlci5BYnN0cmFjdFBpY2tsZVRlc3RzCiBpZiBwaWNrbGV0ZXN0ZXIuX19uYW1lX18gaW4gc3lzLm1vZHVsZXM6CiAgICAgcmFpc2UgUnVudGltZUVycm9yKCJEaWQgbm90IGV4cGVjdCB0byBmaW5kIHRlc3QucGlja2xldGVzdGVyIGxvYWRlZCIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weQppbmRleCA1YmI2NmNiLi4xYjY0MTM4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0X3N1cHBvcnQucHkKQEAgLTE2OCwxMSArMTY4LDggQEAKICAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LnRlc3RfdGVzdGZpbGUsCiAgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC50ZXN0X3VuaXR0ZXN0X3JlcG9ydGZsYWdzLAogICAgICAgICAgICAgXQotICAgICAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZwotICAgICAgICAgICAgIyBOZWVkZWQgZm9yIHRlc3RfRG9jVGVzdFBhcnNlciBhbmQgdGVzdF9kZWJ1ZwotICAgICAgICAgICAgd2l0aCB0ZXN0LnRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygpOgotICAgICAgICAgICAgICAgIGZvciBvYmogaW4ga25vd25fZ29vZF90ZXN0czoKLSAgICAgICAgICAgICAgICAgICAgX3J1bl9vYmplY3RfZG9jdGVzdChvYmosIHRlc3RfemlwcGVkX2RvY3Rlc3QpCisgICAgICAgICAgICBmb3Igb2JqIGluIGtub3duX2dvb2RfdGVzdHM6CisgICAgICAgICAgICAgICAgX3J1bl9vYmplY3RfZG9jdGVzdChvYmosIHRlc3RfemlwcGVkX2RvY3Rlc3QpCiAKICAgICBkZWYgdGVzdF9kb2N0ZXN0X21haW5faXNzdWU0MTk3KHNlbGYpOgogICAgICAgICB0ZXN0X3NyYyA9IHRleHR3cmFwLmRlZGVudCgiIiJcCg==