ZGlmZiAtLWdpdCBhL3J1bnRlc3QuYyBiL3J1bnRlc3QuYwppbmRleCBmNmU5ODQwLi4zN2M4MDRkIDEwMDY0NAotLS0gYS9ydW50ZXN0LmMKKysrIGIvcnVudGVzdC5jCkBAIC0yNjkyLDYgKzI2OTIsMTc4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9mb28uY29tL3BhdGgvdG8vaW5kZXguaHRtbD9vcmlnI2hlbHAiKSk7CiB9CiAKK3N0YXRpYyBpbnQgdXJpcF9zdWNjZXNzID0gMTsKK3N0YXRpYyBpbnQgdXJpcF9jdXJyZW50ID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyICp1cmlwX3Rlc3RVUkxzW10gPSB7CisgICAgInVyaXA6Ly9leGFtcGxlLmNvbS9hIGIuaHRtbCIsCisgICAgInVyaXA6Ly9leGFtcGxlLmNvbS9hJTIwYi5odG1sIiwKKyAgICAiZmlsZTovLy9wYXRoL3RvL2EgYi5odG1sIiwKKyAgICAiZmlsZTovLy9wYXRoL3RvL2ElMjBiLmh0bWwiLAorICAgICIvcGF0aC90by9hIGIuaHRtbCIsCisgICAgIi9wYXRoL3RvL2ElMjBiLmh0bWwiLAorICAgICJ1cmlwOi8vZXhhbXBsZS5jb20vculzdW3pLmh0bWwiLAorICAgICJ1cmlwOi8vZXhhbXBsZS5jb20vdGVzdD9hPTEmYj0yJTI2MyZjPTQjZm9vIiwKKyAgICBOVUxMCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKnVyaXBfcmN2c1VSTHNbXSA9IHsKKyAgICAvKiBpdCBpcyBhbiBVUkkgdGhlIHN0cmluZ3MgbXVzdCBiZSBlc2NhcGVkICovCisgICAgInVyaXA6Ly9leGFtcGxlLmNvbS9hJTIwYi5odG1sIiwKKyAgICAvKiBjaGVjayB0aGF0ICUgZXNjYXBpbmcgaXMgbm90IGJyb2tlbiAqLworICAgICJ1cmlwOi8vZXhhbXBsZS5jb20vYSUyMGIuaHRtbCIsCisgICAgLyogaXQncyBhbiBVUkkgcGF0aCB0aGUgc3RyaW5ncyBtdXN0IGJlIGVzY2FwZWQgKi8KKyAgICAiZmlsZTovLy9wYXRoL3RvL2ElMjBiLmh0bWwiLAorICAgIC8qIGNoZWNrIHRoYXQgJSBlc2NhcGluZyBpcyBub3QgYnJva2VuICovCisgICAgImZpbGU6Ly8vcGF0aC90by9hJTIwYi5odG1sIiwKKyAgICAvKiB0aGlzIGlzIG5vdCBhbiBVUkksIHRoaXMgaXMgYSBwYXRoLCBzbyB0aGlzIHNob3VsZCBub3QgYmUgZXNjYXBlZCAqLworICAgICIvcGF0aC90by9hIGIuaHRtbCIsCisgICAgLyogY2hlY2sgdGhhdCBwYXRocyB3aXRoICUgYXJlIG5vdCBicm9rZW4gKi8KKyAgICAiL3BhdGgvdG8vYSUyMGIuaHRtbCIsCisgICAgLyogb3V0IG9mIGNvbnRleHQgdGhlIGVuY29kaW5nIGNhbid0IGJlIGd1ZXNzZWQgYnl0ZSBieSBieXRlIGNvbnZlcnNpb24gKi8KKyAgICAidXJpcDovL2V4YW1wbGUuY29tL3IlRTlzdW0lRTkuaHRtbCIsCisgICAgLyogdmVyaWZ5IHdlIGRvbid0IGRlc3Ryb3kgVVJJcyBlc3BlY2lhbGx5IHRoZSBxdWVyeSBwYXJ0ICovCisgICAgInVyaXA6Ly9leGFtcGxlLmNvbS90ZXN0P2E9MSZiPTIlMjYzJmM9NCNmb28iLAorICAgIE5VTEwKK307CitzdGF0aWMgY29uc3QgY2hhciAqdXJpcF9yZXMgPSAiPGxpc3QvPiI7CitzdGF0aWMgY29uc3QgY2hhciAqdXJpcF9jdXIgPSBOVUxMOworc3RhdGljIGludCB1cmlwX3JsZW47CisKKy8qKgorICogdXJpcE1hdGNoOgorICogQFVSSTogYW4gVVJJIHRvIHRlc3QKKyAqCisgKiBDaGVjayBmb3IgYW4gdXJpcDogcXVlcnkKKyAqCisgKiBSZXR1cm5zIDEgaWYgeWVzIGFuZCAwIGlmIGFub3RoZXIgSW5wdXQgbW9kdWxlIHNob3VsZCBiZSB1c2VkCisgKi8KK3N0YXRpYyBpbnQKK3VyaXBNYXRjaChjb25zdCBjaGFyICogVVJJKSB7CisgICAgaWYgKChVUkkgPT0gTlVMTCkgfHwgKCFzdHJjbXAoVVJJLCAiZmlsZTovLy9ldGMveG1sL2NhdGFsb2ciKSkpCisgICAgICAgIHJldHVybigwKTsKKyAgICAvKiBWZXJpZnkgd2UgcmVjZWl2ZWQgdGhlIGVzY2FwZWQgVVJMICovCisgICAgaWYgKHN0cmNtcCh1cmlwX3JjdnNVUkxzW3VyaXBfY3VycmVudF0sIFVSSSkpCisJdXJpcF9zdWNjZXNzID0gMDsKKyAgICByZXR1cm4oMSk7Cit9CisKKy8qKgorICogdXJpcE9wZW46CisgKiBAVVJJOiBhbiBVUkkgdG8gdGVzdAorICoKKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHVyaXA6IHF1ZXJ5IGhhbmRsZXIsIGluIHRoaXMgZXhhbXBsZSBzaW1wbHkKKyAqIHRoZSB1cmlwX2N1cnJlbnQgcG9pbnRlci4uLgorICoKKyAqIFJldHVybnMgYW4gSW5wdXQgY29udGV4dCBvciBOVUxMIGluIGNhc2Ugb3IgZXJyb3IKKyAqLworc3RhdGljIHZvaWQgKgordXJpcE9wZW4oY29uc3QgY2hhciAqIFVSSSkgeworICAgIGlmICgoVVJJID09IE5VTEwpIHx8ICghc3RyY21wKFVSSSwgImZpbGU6Ly8vZXRjL3htbC9jYXRhbG9nIikpKQorICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgLyogVmVyaWZ5IHdlIHJlY2VpdmVkIHRoZSBlc2NhcGVkIFVSTCAqLworICAgIGlmIChzdHJjbXAodXJpcF9yY3ZzVVJMc1t1cmlwX2N1cnJlbnRdLCBVUkkpKQorCXVyaXBfc3VjY2VzcyA9IDA7CisgICAgdXJpcF9jdXIgPSB1cmlwX3JlczsKKyAgICB1cmlwX3JsZW4gPSBzdHJsZW4odXJpcF9yZXMpOworICAgIHJldHVybigodm9pZCAqKSB1cmlwX2N1cik7Cit9CisKKy8qKgorICogdXJpcENsb3NlOgorICogQGNvbnRleHQ6IHRoZSByZWFkIGNvbnRleHQKKyAqCisgKiBDbG9zZSB0aGUgdXJpcDogcXVlcnkgaGFuZGxlcgorICoKKyAqIFJldHVybnMgMCBvciAtMSBpbiBjYXNlIG9mIGVycm9yCisgKi8KK3N0YXRpYyBpbnQKK3VyaXBDbG9zZSh2b2lkICogY29udGV4dCkgeworICAgIGlmIChjb250ZXh0ID09IE5VTEwpIHJldHVybigtMSk7CisgICAgdXJpcF9jdXIgPSBOVUxMOworICAgIHVyaXBfcmxlbiA9IDA7CisgICAgcmV0dXJuKDApOworfQorCisvKioKKyAqIHVyaXBSZWFkOgorICogQGNvbnRleHQ6IHRoZSByZWFkIGNvbnRleHQKKyAqIEBidWZmZXI6IHdoZXJlIHRvIHN0b3JlIGRhdGEKKyAqIEBsZW46IG51bWJlciBvZiBieXRlcyB0byByZWFkCisgKgorICogSW1wbGVtZW50IGFuIHVyaXA6IHF1ZXJ5IHJlYWQuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgLTEgaW4gY2FzZSBvZiBlcnJvcgorICovCitzdGF0aWMgaW50Cit1cmlwUmVhZCh2b2lkICogY29udGV4dCwgY2hhciAqIGJ1ZmZlciwgaW50IGxlbikgeworICAgY29uc3QgY2hhciAqcHRyID0gKGNvbnN0IGNoYXIgKikgY29udGV4dDsKKworICAgaWYgKChjb250ZXh0ID09IE5VTEwpIHx8IChidWZmZXIgPT0gTlVMTCkgfHwgKGxlbiA8IDApKQorICAgICAgIHJldHVybigtMSk7CisKKyAgIGlmIChsZW4gPiB1cmlwX3JsZW4pIGxlbiA9IHVyaXBfcmxlbjsKKyAgIG1lbWNweShidWZmZXIsIHB0ciwgbGVuKTsKKyAgIHVyaXBfcmxlbiAtPSBsZW47CisgICByZXR1cm4obGVuKTsKK30KKworc3RhdGljIGludAordXJpcF9jaGVja1VSTChjb25zdCBjaGFyICpVUkwpIHsKKyAgICB4bWxEb2NQdHIgZG9jOworCisgICAgZG9jID0geG1sUmVhZEZpbGUoVVJMLCBOVUxMLCAwKTsKKyAgICBpZiAoZG9jID09IE5VTEwpCisgICAgICAgIHJldHVybigtMSk7CisgICAgeG1sRnJlZURvYyhkb2MpOworICAgIHJldHVybigxKTsKK30KKworLyoqCisgKiB1cmlQYXRoVGVzdDoKKyAqIEBmaWxlbmFtZTogaWdub3JlZAorICogQHJlc3VsdDogaWdub3JlZAorICogQGVycjogaWdub3JlZAorICoKKyAqIFJ1biBhIHNldCBvZiB0ZXN0cyB0byBjaGVjayBob3cgUGF0aCBhbmQgVVJJIGFyZSBoYW5kbGVkIGJlZm9yZQorICogYmVpbmcgcGFzc2VkIHRvIHRoZSBJL08gbGF5ZXIKKyAqCisgKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50Cit1cmlQYXRoVGVzdChjb25zdCBjaGFyICpmaWxlbmFtZSBBVFRSSUJVVEVfVU5VU0VELAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlc3VsdCBBVFRSSUJVVEVfVU5VU0VELAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciBBVFRSSUJVVEVfVU5VU0VELAorICAgICAgICAgICAgIGludCBvcHRpb25zIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICBpbnQgcGFyc2VkOworICAgIGludCBmYWlsdXJlcyA9IDA7CisKKyAgICAvKgorICAgICAqIHJlZ2lzdGVyIHRoZSBuZXcgSS9PIGhhbmRsZXJzCisgICAgICovCisgICAgaWYgKHhtbFJlZ2lzdGVySW5wdXRDYWxsYmFja3ModXJpcE1hdGNoLCB1cmlwT3BlbiwgdXJpcFJlYWQsIHVyaXBDbG9zZSkgPCAwKQorICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gcmVnaXN0ZXIgSFRUUCBoYW5kbGVyXG4iKTsKKwlyZXR1cm4oLTEpOworICAgIH0KKworICAgIGZvciAodXJpcF9jdXJyZW50ID0gMDt1cmlwX3Rlc3RVUkxzW3VyaXBfY3VycmVudF0gIT0gTlVMTDt1cmlwX2N1cnJlbnQrKykgeworICAgICAgICB1cmlwX3N1Y2Nlc3MgPSAxOworICAgICAgICBwYXJzZWQgPSB1cmlwX2NoZWNrVVJMKHVyaXBfdGVzdFVSTHNbdXJpcF9jdXJyZW50XSk7CisJaWYgKHVyaXBfc3VjY2VzcyAhPSAxKSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRoZSBVUkwgcGFzc2luZyB0ZXN0IGZvciAlcyIsCisJICAgICAgICAgICAgdXJpcF90ZXN0VVJMc1t1cmlwX2N1cnJlbnRdKTsKKwkgICAgZmFpbHVyZXMrKzsKKwl9IGVsc2UgaWYgKHBhcnNlZCAhPSAxKSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRoZSBwYXJzaW5nIHRlc3QgZm9yICVzIiwKKwkgICAgICAgICAgICB1cmlwX3Rlc3RVUkxzW3VyaXBfY3VycmVudF0pOworCSAgICBmYWlsdXJlcysrOworCX0KKwluYl90ZXN0cysrOworICAgIH0KKworICAgIHhtbFBvcElucHV0Q2FsbGJhY2tzKCk7CisgICAgcmV0dXJuKGZhaWx1cmVzKTsKK30KKwogI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCQkJCQkJKgpAQCAtNDAzOSw2ICs0MjExLDkgQEAKICAgICB7ICJVUkkgYmFzZSBjb21wb3NpdGlvbiB0ZXN0cyIgLAogICAgICAgdXJpQmFzZVRlc3QsICIuL3Rlc3QvVVJJLyouZGF0YSIsICJyZXN1bHQvVVJJLyIsICIiLCBOVUxMLAogICAgICAgMCB9LAorICAgIHsgIlBhdGggVVJJIGNvbnZlcnNpb24gdGVzdHMiICwKKyAgICAgIHVyaVBhdGhUZXN0LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgMCB9LAogI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKICAgICB7ICJTY2hlbWFzIHJlZ3Jlc3Npb24gdGVzdHMiICwKICAgICAgIHNjaGVtYXNUZXN0LCAiLi90ZXN0L3NjaGVtYXMvKl8qLnhzZCIsIE5VTEwsIE5VTEwsIE5VTEwsCkBAIC00MTcwLDYgKzQzNDUsNyBAQAogfQogCiBzdGF0aWMgaW50IHZlcmJvc2UgPSAwOworc3RhdGljIGludCB0ZXN0c19xdWlldCA9IDA7CiAKIHN0YXRpYyBpbnQKIHJ1bnRlc3QoaW50IGkpIHsKQEAgLTQxNzksNyArNDM1NSw3IEBACiAgICAgb2xkX2Vycm9ycyA9IG5iX2Vycm9yczsKICAgICBvbGRfdGVzdHMgPSBuYl90ZXN0czsKICAgICBvbGRfbGVha3MgPSBuYl9sZWFrczsKLSAgICBpZiAodGVzdERlc2NyaXB0aW9uc1tpXS5kZXNjICE9IE5VTEwpCisgICAgaWYgKCh0ZXN0c19xdWlldCA9PSAwKSAmJiAodGVzdERlc2NyaXB0aW9uc1tpXS5kZXNjICE9IE5VTEwpKQogCXByaW50ZigiIyMgJXNcbiIsIHRlc3REZXNjcmlwdGlvbnNbaV0uZGVzYyk7CiAgICAgcmVzID0gbGF1bmNoVGVzdHMoJnRlc3REZXNjcmlwdGlvbnNbaV0pOwogICAgIGlmIChyZXMgIT0gMCkKQEAgLTQyMDcsNiArNDM4Myw4IEBACiAgICAgZm9yIChhID0gMTsgYSA8IGFyZ2M7YSsrKSB7CiAgICAgICAgIGlmICghc3RyY21wKGFyZ3ZbYV0sICItdiIpKQogCSAgICB2ZXJib3NlID0gMTsKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2FdLCAiLXF1aWV0IikpCisJICAgIHRlc3RzX3F1aWV0ID0gMTsKIAllbHNlIHsKIAkgICAgZm9yIChpID0gMDsgdGVzdERlc2NyaXB0aW9uc1tpXS5mdW5jICE9IE5VTEw7IGkrKykgewogCSAgICAgICAgaWYgKHN0cnN0cih0ZXN0RGVzY3JpcHRpb25zW2ldLmRlc2MsIGFyZ3ZbYV0pKSB7Cg==