ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCBlODI1ZWM5Li4zZTBiZGY5IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTQgQEAKK0ZyaSBOb3YgIDUgMTg6MTk6MjMgQ0VUIDIwMDQgRGFuaWVsIFZlaWxsYXJkIDxkYW5pZWxAdmVpbGxhcmQuY29tPgorCisJKiBnZW50ZXN0LnB5IHRlc3RhcGkuYzogYXV0b2dlbmVyYXRlIGEgbWluaW1hbCBOVUxMIHZhbHVlIHNlcXVlbmNlCisJICBmb3IgdW5rbm93biBwb2ludGVyIHR5cGVzCisJKiBIVE1McGFyc2VyLmMgU0FYMi5jIGNodmFsaWQuYyBlbmNvZGluZy5jIGVudGl0aWVzLmMgcGFyc2VyLmMKKwkgIHBhcnNlckludGVybmFscy5jIHJlbGF4bmcuYyB2YWxpZC5jIHhtbElPLmMgeG1scmVhZGVyLmMgCisJICB4bWxzYXZlLmMgeG1sc2NoZW1hcy5jIHhtbHNjaGVtYXN0eXBlcy5jIHhtbHN0cmluZy5jIHhwYXRoLmMKKwkgIHhwb2ludGVyLmM6IFRoaXMgdW5jb3ZlcmVkIGFuIGltcHJlc3NpdmUgYW1vdW50IG9mIGVudHJ5IHBvaW50cworCSAgbm90IGNoZWNraW5nIGZvciBOVUxMIHBvaW50ZXJzIHdoZW4gdGhleSBvdWdodCB0bywgY2xvc2luZyBhbGwKKwkgIHRoZSBvcGVuIGdhcHMuCisKIEZyaSBOb3YgIDUgMTY6MjY6MjggVVRDIDIwMDQgV2lsbGlhbSBCcmFjayA8d2JyYWNrQG1tbS5jb20uaGs+CiAKIAkqIGNhdGFsb2cuYzogZml4ZWQgcHJvYmxlbSB3aXRoIE5VTEwgZW50cnkgKGJ1ZyAxNTc0MDcpCmRpZmYgLS1naXQgYS9IVE1McGFyc2VyLmMgYi9IVE1McGFyc2VyLmMKaW5kZXggM2ZlNGI1ZC4uOTE5MzAyZiAxMDA2NDQKLS0tIGEvSFRNTHBhcnNlci5jCisrKyBiL0hUTUxwYXJzZXIuYwpAQCAtMTc5NCw2ICsxNzk0LDcgQEAKICAgICB1bnNpZ25lZCBpbnQgYywgZDsKICAgICBpbnQgdHJhaWxpbmc7CiAKKyAgICBpZiAoKG91dCA9PSBOVUxMKSB8fCAob3V0bGVuID09IE5VTEwpIHx8IChpbmxlbiA9PSBOVUxMKSkgcmV0dXJuKC0xKTsKICAgICBpZiAoaW4gPT0gTlVMTCkgewogICAgICAgICAvKgogCSAqIGluaXRpYWxpemF0aW9uIG5vdGhpbmcgdG8gZG8KQEAgLTE4ODgsMTMgKzE4ODksMTcgQEAKIGh0bWxFbmNvZGVFbnRpdGllcyh1bnNpZ25lZCBjaGFyKiBvdXQsIGludCAqb3V0bGVuLAogCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwgaW50ICppbmxlbiwgaW50IHF1b3RlQ2hhcikgewogICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHByb2Nlc3NlZCA9IGluOwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIG91dGVuZCA9IG91dCArICgqb3V0bGVuKTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBvdXRlbmQ7CiAgICAgY29uc3QgdW5zaWduZWQgY2hhciogb3V0c3RhcnQgPSBvdXQ7CiAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW5zdGFydCA9IGluOwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluZW5kID0gaW4gKyAoKmlubGVuKTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbmVuZDsKICAgICB1bnNpZ25lZCBpbnQgYywgZDsKICAgICBpbnQgdHJhaWxpbmc7CiAKKyAgICBpZiAoKG91dCA9PSBOVUxMKSB8fCAob3V0bGVuID09IE5VTEwpIHx8IChpbmxlbiA9PSBOVUxMKSB8fCAoaW4gPT0gTlVMTCkpCisgICAgICAgIHJldHVybigtMSk7CisgICAgb3V0ZW5kID0gb3V0ICsgKCpvdXRsZW4pOworICAgIGluZW5kID0gaW4gKyAoKmlubGVuKTsKICAgICB3aGlsZSAoaW4gPCBpbmVuZCkgewogCWQgPSAqaW4rKzsKIAlpZiAgICAgIChkIDwgMHg4MCkgIHsgYz0gZDsgdHJhaWxpbmc9IDA7IH0KZGlmZiAtLWdpdCBhL1NBWDIuYyBiL1NBWDIuYwppbmRleCAyODlmMjk2Li42NWU5ZGFhIDEwMDY0NAotLS0gYS9TQVgyLmMKKysrIGIvU0FYMi5jCkBAIC0xNDIzLDcgKzE0MjMsNyBAQAogICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAogCSAgICAiU0FYLnhtbFNBWDJTdGFydEVsZW1lbnQoJXMpXG4iLCBmdWxsbmFtZSk7CiAjZW5kaWYKLSAgICBpZiAoY3R4ID09IE5VTEwpIHJldHVybjsKKyAgICBpZiAoKGN0eCA9PSBOVUxMKSB8fCAoZnVsbG5hbWUgPT0gTlVMTCkpIHJldHVybjsKIAogICAgIC8qCiAgICAgICogRmlyc3QgY2hlY2sgb24gdmFsaWRpdHk6CmRpZmYgLS1naXQgYS9jaHZhbGlkLmMgYi9jaHZhbGlkLmMKaW5kZXggZDQ3YmM2YS4uOWEyYzQwNyAxMDA3NTUKLS0tIGEvY2h2YWxpZC5jCisrKyBiL2NodmFsaWQuYwpAQCAtMTY2LDYgKzE2Niw4IEBACiAgICAgaW50IGxvdywgaGlnaCwgbWlkOwogICAgIHhtbENoU1JhbmdlUHRyIHNwdHI7CiAgICAgeG1sQ2hMUmFuZ2VQdHIgbHB0cjsKKworICAgIGlmIChycHRyID09IE5VTEwpIHJldHVybigwKTsKICAgICBpZiAodmFsIDwgMHgxMDAwMCkgewkvKiBpcyB2YWwgaW4gJ3Nob3J0JyBvciAnbG9uZycgIGFycmF5PyAqLwogCWlmIChycHRyLT5uYlNob3J0UmFuZ2UgPT0gMCkKIAkgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9lbmNvZGluZy5jIGIvZW5jb2RpbmcuYwppbmRleCBjZjQ1Y2JhLi44ZDE5M2E5IDEwMDY0NAotLS0gYS9lbmNvZGluZy5jCisrKyBiL2VuY29kaW5nLmMKQEAgLTE1NSw2ICsxNTUsNyBAQAogICAgIHVuc2lnbmVkIGludCBjLCBkOwogICAgIGludCB0cmFpbGluZzsKIAorICAgIGlmICgob3V0ID09IE5VTEwpIHx8IChvdXRsZW4gPT0gTlVMTCkgfHwgKGlubGVuID09IE5VTEwpKSByZXR1cm4oLTEpOwogICAgIGlmIChpbiA9PSBOVUxMKSB7CiAgICAgICAgIC8qCiAJICogaW5pdGlhbGl6YXRpb24gbm90aGluZyB0byBkbwpAQCAtMjMyLDEwICsyMzMsMTQgQEAKICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW4sIGludCAqaW5sZW4pIHsKICAgICB1bnNpZ25lZCBjaGFyKiBvdXRzdGFydCA9IG91dDsKICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBiYXNlID0gaW47Ci0gICAgdW5zaWduZWQgY2hhciogb3V0ZW5kID0gb3V0ICsgKm91dGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyKiBvdXRlbmQ7CiAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW5lbmQ7CiAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW5zdG9wOwogCisgICAgaWYgKChvdXQgPT0gTlVMTCkgfHwgKGluID09IE5VTEwpIHx8IChvdXRsZW4gPT0gTlVMTCkgfHwgKGlubGVuID09IE5VTEwpKQorCXJldHVybigtMSk7CisKKyAgICBvdXRlbmQgPSBvdXQgKyAqb3V0bGVuOwogICAgIGluZW5kID0gaW4gKyAoKmlubGVuKTsKICAgICBpbnN0b3AgPSBpbmVuZDsKICAgICAKQEAgLTMyMiw2ICszMjcsNyBAQAogICAgIHVuc2lnbmVkIGludCBjLCBkOwogICAgIGludCB0cmFpbGluZzsKIAorICAgIGlmICgob3V0ID09IE5VTEwpIHx8IChvdXRsZW4gPT0gTlVMTCkgfHwgKGlubGVuID09IE5VTEwpKSByZXR1cm4oLTEpOwogICAgIGlmIChpbiA9PSBOVUxMKSB7CiAgICAgICAgIC8qCiAJICogaW5pdGlhbGl6YXRpb24gbm90aGluZyB0byBkbwpAQCAtNTAzLDYgKzUwOSw3IEBACiAgICAgdW5zaWduZWQgc2hvcnQgdG1wMSwgdG1wMjsKIAogICAgIC8qIFVURjE2TEUgZW5jb2RpbmcgaGFzIG5vIEJPTSAqLworICAgIGlmICgob3V0ID09IE5VTEwpIHx8IChvdXRsZW4gPT0gTlVMTCkgfHwgKGlubGVuID09IE5VTEwpKSByZXR1cm4oLTEpOwogICAgIGlmIChpbiA9PSBOVUxMKSB7CiAJKm91dGxlbiA9IDA7CiAJKmlubGVuID0gMDsKQEAgLTc0Myw2ICs3NTAsNyBAQAogICAgIHVuc2lnbmVkIHNob3J0IHRtcDEsIHRtcDI7CiAKICAgICAvKiBVVEYtMTZCRSBoYXMgbm8gQk9NICovCisgICAgaWYgKChvdXRiID09IE5VTEwpIHx8IChvdXRsZW4gPT0gTlVMTCkgfHwgKGlubGVuID09IE5VTEwpKSByZXR1cm4oLTEpOwogICAgIGlmIChpbiA9PSBOVUxMKSB7CiAJKm91dGxlbiA9IDA7CiAJKmlubGVuID0gMDsKQEAgLTgzOSw2ICs4NDcsOCBAQAogeG1sQ2hhckVuY29kaW5nCiB4bWxEZXRlY3RDaGFyRW5jb2RpbmcoY29uc3QgdW5zaWduZWQgY2hhciogaW4sIGludCBsZW4pCiB7CisgICAgaWYgKGluID09IE5VTEwpIAorICAgICAgICByZXR1cm4oWE1MX0NIQVJfRU5DT0RJTkdfTk9ORSk7CiAgICAgaWYgKGxlbiA+PSA0KSB7CiAJaWYgKChpblswXSA9PSAweDAwKSAmJiAoaW5bMV0gPT0gMHgwMCkgJiYKIAkgICAgKGluWzJdID09IDB4MDApICYmIChpblszXSA9PSAweDNDKSkKQEAgLTE2NTMsMTUgKzE2NjMsMTcgQEAKICAqIFRoZSB2YWx1ZSBvZiBAb3V0bGVuIGFmdGVyIHJldHVybiBpcyB0aGUgbnVtYmVyIG9mIG9jZXRlcyBjb25zdW1lZC4KICAqLwogc3RhdGljIGludAoteG1sSWNvbnZXcmFwcGVyKGljb252X3QgY2QsCi0gICAgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgKm91dGxlbiwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgaW50ICppbmxlbikgewotCi0gICAgc2l6ZV90IGljdl9pbmxlbiA9ICppbmxlbiwgaWN2X291dGxlbiA9ICpvdXRsZW47Cit4bWxJY29udldyYXBwZXIoaWNvbnZfdCBjZCwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgKm91dGxlbiwKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgaW50ICppbmxlbikgeworICAgIHNpemVfdCBpY3ZfaW5sZW4sIGljdl9vdXRsZW47CiAgICAgY29uc3QgY2hhciAqaWN2X2luID0gKGNvbnN0IGNoYXIgKikgaW47CiAgICAgY2hhciAqaWN2X291dCA9IChjaGFyICopIG91dDsKICAgICBpbnQgcmV0OwogCisgICAgaWYgKChvdXQgPT0gTlVMTCkgfHwgKG91dGxlbiA9PSBOVUxMKSB8fCAoaW5sZW4gPT0gTlVMTCkgfHwgKGluID09IE5VTEwpKQorICAgICAgICByZXR1cm4oLTEpOworICAgIGljdl9pbmxlbiA9ICppbmxlbjsKKyAgICBpY3Zfb3V0bGVuID0gKm91dGxlbjsKICAgICByZXQgPSBpY29udihjZCwgKGNoYXIgKiopICZpY3ZfaW4sICZpY3ZfaW5sZW4sICZpY3Zfb3V0LCAmaWN2X291dGxlbik7CiAgICAgaWYgKGluICE9IE5VTEwpIHsKICAgICAgICAgKmlubGVuIC09IGljdl9pbmxlbjsKQEAgLTIyMDMsNiArMjIxNSw5IEBACiAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW5lbmQ7CiAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW5zdGFydCA9IGluOwogCisgICAgaWYgKChvdXQgPT0gTlVMTCkgfHwgKG91dGxlbiA9PSBOVUxMKSB8fCAoaW5sZW4gPT0gTlVMTCkgfHwKKyAgICAgICAgKHhsYXR0YWJsZSA9PSBOVUxMKSkKKwlyZXR1cm4oLTEpOwogICAgIGlmIChpbiA9PSBOVUxMKSB7CiAgICAgICAgIC8qCiAgICAgICAgICogaW5pdGlhbGl6YXRpb24gbm90aGluZyB0byBkbwpAQCAtMjMxMSwxMiArMjMyNiwxOCBAQAogICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwgaW50ICppbmxlbiwKICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgY29uc3QgKnVuaWNvZGV0YWJsZSkgewogICAgIHVuc2lnbmVkIGNoYXIqIG91dHN0YXJ0ID0gb3V0OwotICAgIHVuc2lnbmVkIGNoYXIqIG91dGVuZCA9IG91dCArICpvdXRsZW47CisgICAgdW5zaWduZWQgY2hhciogb3V0ZW5kOwogICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluc3RhcnQgPSBpbjsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbmVuZCA9IGluICsgKmlubGVuOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluZW5kOwogICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluc3RvcCA9IGluZW5kOwotICAgIHVuc2lnbmVkIGludCBjID0gKmluOworICAgIHVuc2lnbmVkIGludCBjOwogCisgICAgaWYgKChvdXQgPT0gTlVMTCkgfHwgKG91dGxlbiA9PSBOVUxMKSB8fCAoaW5sZW4gPT0gTlVMTCkgfHwKKyAgICAgICAgKGluID09IE5VTEwpIHx8ICh4bGF0dGFibGUgPT0gTlVMTCkpCisJcmV0dXJuKC0xKTsKKyAgICBvdXRlbmQgPSBvdXQgKyAqb3V0bGVuOworICAgIGluZW5kID0gaW4gKyAqaW5sZW47CisgICAgYyA9ICppbjsKICAgICB3aGlsZSAoaW4gPCBpbmVuZCAmJiBvdXQgPCBvdXRlbmQgLSAxKSB7CiAgICAgICAgIGlmIChjID49IDB4ODApIHsKICAgICAgICAgICAgIGMgPSB1bmljb2RldGFibGUgW2MgLSAweDgwXTsKZGlmZiAtLWdpdCBhL2VudGl0aWVzLmMgYi9lbnRpdGllcy5jCmluZGV4IDY2YTI2NDAuLjkxM2E0ZTYgMTAwNjQ0Ci0tLSBhL2VudGl0aWVzLmMKKysrIGIvZW50aXRpZXMuYwpAQCAtODE1LDYgKzgxNSw3IEBACiAgKi8KIHZvaWQKIHhtbER1bXBFbnRpdHlEZWNsKHhtbEJ1ZmZlclB0ciBidWYsIHhtbEVudGl0eVB0ciBlbnQpIHsKKyAgICBpZiAoKGJ1ZiA9PSBOVUxMKSB8fCAoZW50ID09IE5VTEwpKSByZXR1cm47CiAgICAgc3dpdGNoIChlbnQtPmV0eXBlKSB7CiAJY2FzZSBYTUxfSU5URVJOQUxfR0VORVJBTF9FTlRJVFk6CiAJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI8IUVOVElUWSAiKTsKZGlmZiAtLWdpdCBhL2dlbnRlc3QucHkgYi9nZW50ZXN0LnB5CmluZGV4IGJjOGFhMzAuLmQ0NzkwZjIgMTAwNzU1Ci0tLSBhL2dlbnRlc3QucHkKKysrIGIvZ2VudGVzdC5weQpAQCAtNzIsNiArNzIsMTAgQEAKICAgICAgICAiaWYgKHNheCA9PSAoeG1sU0FYSGFuZGxlclB0cikmeG1sRGVmYXVsdFNBWEhhbmRsZXIpIHVzZXJfZGF0YSA9IE5VTEw7IiwKICAgICJ4bWxTQVhVc2VyUGFyc2VNZW1vcnkiOgogICAgICAgICJpZiAoc2F4ID09ICh4bWxTQVhIYW5kbGVyUHRyKSZ4bWxEZWZhdWx0U0FYSGFuZGxlcikgdXNlcl9kYXRhID0gTlVMTDsiLAorICAgInhtbFBhcnNlQmFsYW5jZWRDaHVua01lbW9yeSI6CisgICAgICAgImlmIChzYXggPT0gKHhtbFNBWEhhbmRsZXJQdHIpJnhtbERlZmF1bHRTQVhIYW5kbGVyKSB1c2VyX2RhdGEgPSBOVUxMOyIsCisgICAieG1sUGFyc2VCYWxhbmNlZENodW5rTWVtb3J5UmVjb3ZlciI6CisgICAgICAgImlmIChzYXggPT0gKHhtbFNBWEhhbmRsZXJQdHIpJnhtbERlZmF1bHRTQVhIYW5kbGVyKSB1c2VyX2RhdGEgPSBOVUxMOyIsCiB9CiBleHRyYV9wb3N0X2NhbGwgPSB7CiAgICAieG1sQWRkQ2hpbGQiOiAKQEAgLTE0NSw2ICsxNDksMTQgQEAKICAgICBleGNlcHQ6CiAgICAgICAgIG1pc3NpbmdfdHlwZXNbbmFtZV0gPSBbZnVuY10KIAorZ2VuZXJhdGVkX3BhcmFtX3R5cGVzID0gW10KK2RlZiBhZGRfZ2VuZXJhdGVkX3BhcmFtX3R5cGUobmFtZSk6CisgICAgZ2VuZXJhdGVkX3BhcmFtX3R5cGVzLmFwcGVuZChuYW1lKQorCitnZW5lcmF0ZWRfcmV0dXJuX3R5cGVzID0gW10KK2RlZiBhZGRfZ2VuZXJhdGVkX3JldHVybl90eXBlKG5hbWUpOgorICAgIGdlbmVyYXRlZF9yZXR1cm5fdHlwZXMuYXBwZW5kKG5hbWUpCisKIG1pc3NpbmdfZnVuY3Rpb25zID0ge30KIG1pc3NpbmdfZnVuY3Rpb25zX25yID0gMAogZGVmIGFkZF9taXNzaW5nX2Z1bmN0aW9ucyhuYW1lLCBtb2R1bGUpOgpAQCAtMjE2LDEwICsyMjgsMzIgQEAKIAoga25vd25fcGFyYW1fdHlwZXMgPSBbXQogCi1kZWYgaXNfa25vd25fcGFyYW1fdHlwZShuYW1lKToKK2RlZiBpc19rbm93bl9wYXJhbV90eXBlKG5hbWUsIHJ0eXBlKToKKyAgICBnbG9iYWwgdGVzdAogICAgIGZvciB0eXBlIGluIGtub3duX3BhcmFtX3R5cGVzOgogICAgICAgICBpZiB0eXBlID09IG5hbWU6CiAJICAgIHJldHVybiAxCisgICAgZm9yIHR5cGUgaW4gZ2VuZXJhdGVkX3BhcmFtX3R5cGVzOgorICAgICAgICBpZiB0eXBlID09IG5hbWU6CisJICAgIHJldHVybiAxCisKKyAgICBpZiBuYW1lWy0zOl0gPT0gJ1B0cicgb3IgbmFtZVstNDpdID09ICdfcHRyJzoKKyAgICAgICAgaWYgcnR5cGVbMDo2XSA9PSAnY29uc3QgJzoKKwkgICAgY3J0eXBlID0gcnR5cGVbNjpdCisJZWxzZToKKwkgICAgY3J0eXBlID0gcnR5cGUKKworICAgICAgICB0ZXN0LndyaXRlKCIiIgorI2RlZmluZSBnZW5fbmJfJXMgMQorc3RhdGljICVzIGdlbl8lcyhpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfJXMoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsICVzIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorIiIiICUgKG5hbWUsIGNydHlwZSwgbmFtZSwgbmFtZSwgcnR5cGUpKQorICAgICAgICBhZGRfZ2VuZXJhdGVkX3BhcmFtX3R5cGUobmFtZSkKKyAgICAgICAgcmV0dXJuIDEKKwogICAgIHJldHVybiAwCiAKICMKQEAgLTM4Myw3ICs0MTcsNyBAQAogCWluZm8gPSBhcmcueHBhdGhFdmFsKCJzdHJpbmcoQGluZm8pIikKIAluYW0gPSBhcmcueHBhdGhFdmFsKCJzdHJpbmcoQG5hbWUpIikKICAgICAgICAgdHlwZSA9IHR5cGVfY29udmVydChydHlwZSwgbmFtLCBpbmZvLCBtb2R1bGUsIG5hbWUsIG4pCi0JaWYgaXNfa25vd25fcGFyYW1fdHlwZSh0eXBlKSA9PSAwOgorCWlmIGlzX2tub3duX3BhcmFtX3R5cGUodHlwZSwgcnR5cGUpID09IDA6CiAJICAgIGFkZF9taXNzaW5nX3R5cGUodHlwZSwgbmFtZSk7CiAJICAgIG5vX2dlbiA9IDEKIAl0X2FyZ3MuYXBwZW5kKChuYW0sIHR5cGUsIHJ0eXBlLCBpbmZvKSkKQEAgLTQ0Miw4ICs0NzYsMTMgQEAKICAgICAjIERlY2xhcmUgdGhlIGFyZ3VtZW50cwogICAgIGZvciBhcmcgaW4gdF9hcmdzOgogICAgICAgICAobmFtLCB0eXBlLCBydHlwZSwgaW5mbykgPSBhcmc7CisgICAgICAgIGlmICh0eXBlWy0zOl0gPT0gJ1B0cicgb3IgdHlwZVstNDpdID09ICdfcHRyJykgYW5kIFwKKwkgICAgcnR5cGVbMDo2XSA9PSAnY29uc3QgJzoKKwkgICAgY3J0eXBlID0gcnR5cGVbNjpdCisJZWxzZToKKwkgICAgY3J0eXBlID0gcnR5cGUKIAkjIGFkZCBkZWNsYXJhdGlvbgotCXRlc3Qud3JpdGUoIiAgICAlcyAlczsgLyogJXMgKi9cbiIgJSAocnR5cGUsIG5hbSwgaW5mbykpCisJdGVzdC53cml0ZSgiICAgICVzICVzOyAvKiAlcyAqL1xuIiAlIChjcnR5cGUsIG5hbSwgaW5mbykpCiAJdGVzdC53cml0ZSgiICAgIGludCBuXyVzO1xuIiAlIChuYW0pKQogICAgIHRlc3Qud3JpdGUoIlxuIikKIApkaWZmIC0tZ2l0IGEvcGFyc2VyLmMgYi9wYXJzZXIuYwppbmRleCBkMzllNzZiLi4xNmI3M2Y5IDEwMDY0NAotLS0gYS9wYXJzZXIuYworKysgYi9wYXJzZXIuYwpAQCAtMTAzODQsNiArMTAzODQsOCBAQAogICAgIHhtbENoYXIgc3RhcnRbNF07CiAgICAgeG1sQ2hhckVuY29kaW5nIGVuYzsKIAorICAgIGlmIChjdHggPT0gTlVMTCkgcmV0dXJuKC0xKTsKKwogICAgIGlmIChjdHgtPmRlcHRoID4gNDApIHsKIAlyZXR1cm4oWE1MX0VSUl9FTlRJVFlfTE9PUCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvcGFyc2VySW50ZXJuYWxzLmMgYi9wYXJzZXJJbnRlcm5hbHMuYwppbmRleCBjMzM4YTUzLi4wOTU3YTZlIDEwMDY0NAotLS0gYS9wYXJzZXJJbnRlcm5hbHMuYworKysgYi9wYXJzZXJJbnRlcm5hbHMuYwpAQCAtMjgxLDYgKzI4MSw3IEBACiAgICAgaW50IHVzZWQ7CiAgICAgaW50IGluZHg7CiAKKyAgICBpZiAoaW4gPT0gTlVMTCkgcmV0dXJuKC0xKTsKICNpZmRlZiBERUJVR19JTlBVVAogICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LCAiUmVhZFxuIik7CiAjZW5kaWYKQEAgLTMzMCw2ICszMzEsNyBAQAogICAgIGludCByZXQ7CiAgICAgaW50IGluZHg7CiAKKyAgICBpZiAoaW4gPT0gTlVMTCkgcmV0dXJuKC0xKTsKICNpZmRlZiBERUJVR19JTlBVVAogICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LCAiR3Jvd1xuIik7CiAjZW5kaWYKQEAgLTE3OTgsNiArMTgwMCw3IEBACiAgIHhtbEN0eHRSZXNldChjdHh0KTsKIH0KIAorCiAvKioKICAqIHhtbFBhcnNlckZpbmROb2RlSW5mbzoKICAqIEBjdHg6ICBhbiBYTUwgcGFyc2VyIGNvbnRleHQKQEAgLTE4MDcsMTcgKzE4MTAsMjAgQEAKICAqIAogICogUmV0dXJucyBhbiB4bWxQYXJzZXJOb2RlSW5mbyBibG9jayBwb2ludGVyIG9yIE5VTEwKICAqLwotY29uc3QgeG1sUGFyc2VyTm9kZUluZm8qIHhtbFBhcnNlckZpbmROb2RlSW5mbyhjb25zdCB4bWxQYXJzZXJDdHh0UHRyIGN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sTm9kZVB0ciBub2RlKQorY29uc3QgeG1sUGFyc2VyTm9kZUluZm8gKgoreG1sUGFyc2VyRmluZE5vZGVJbmZvKGNvbnN0IHhtbFBhcnNlckN0eHRQdHIgY3R4LCBjb25zdCB4bWxOb2RlUHRyIG5vZGUpCiB7Ci0gIHVuc2lnbmVkIGxvbmcgcG9zOworICAgIHVuc2lnbmVkIGxvbmcgcG9zOwogCi0gIC8qIEZpbmQgcG9zaXRpb24gd2hlcmUgbm9kZSBzaG91bGQgYmUgYXQgKi8KLSAgcG9zID0geG1sUGFyc2VyRmluZE5vZGVJbmZvSW5kZXgoJmN0eC0+bm9kZV9zZXEsIG5vZGUpOwotICBpZiAocG9zIDwgY3R4LT5ub2RlX3NlcS5sZW5ndGggJiYgY3R4LT5ub2RlX3NlcS5idWZmZXJbcG9zXS5ub2RlID09IG5vZGUpCi0gICAgcmV0dXJuICZjdHgtPm5vZGVfc2VxLmJ1ZmZlcltwb3NdOwotICBlbHNlCi0gICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChjdHggPT0gTlVMTCkgfHwgKG5vZGUgPT0gTlVMTCkpCisgICAgICAgIHJldHVybiAoTlVMTCk7CisgICAgLyogRmluZCBwb3NpdGlvbiB3aGVyZSBub2RlIHNob3VsZCBiZSBhdCAqLworICAgIHBvcyA9IHhtbFBhcnNlckZpbmROb2RlSW5mb0luZGV4KCZjdHgtPm5vZGVfc2VxLCBub2RlKTsKKyAgICBpZiAocG9zIDwgY3R4LT5ub2RlX3NlcS5sZW5ndGgKKyAgICAgICAgJiYgY3R4LT5ub2RlX3NlcS5idWZmZXJbcG9zXS5ub2RlID09IG5vZGUpCisgICAgICAgIHJldHVybiAmY3R4LT5ub2RlX3NlcS5idWZmZXJbcG9zXTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOwogfQogCiAKQEAgLTE4MzAsOSArMTgzNiwxMSBAQAogdm9pZAogeG1sSW5pdE5vZGVJbmZvU2VxKHhtbFBhcnNlck5vZGVJbmZvU2VxUHRyIHNlcSkKIHsKLSAgc2VxLT5sZW5ndGggPSAwOwotICBzZXEtPm1heGltdW0gPSAwOwotICBzZXEtPmJ1ZmZlciA9IE5VTEw7CisgICAgaWYgKHNlcSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgc2VxLT5sZW5ndGggPSAwOworICAgIHNlcS0+bWF4aW11bSA9IDA7CisgICAgc2VxLT5idWZmZXIgPSBOVUxMOwogfQogCiAvKioKQEAgLTE4NDUsMTIgKzE4NTMsMTMgQEAKIHZvaWQKIHhtbENsZWFyTm9kZUluZm9TZXEoeG1sUGFyc2VyTm9kZUluZm9TZXFQdHIgc2VxKQogewotICBpZiAoIHNlcS0+YnVmZmVyICE9IE5VTEwgKQotICAgIHhtbEZyZWUoc2VxLT5idWZmZXIpOwotICB4bWxJbml0Tm9kZUluZm9TZXEoc2VxKTsKKyAgICBpZiAoc2VxID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoc2VxLT5idWZmZXIgIT0gTlVMTCkKKyAgICAgICAgeG1sRnJlZShzZXEtPmJ1ZmZlcik7CisgICAgeG1sSW5pdE5vZGVJbmZvU2VxKHNlcSk7CiB9CiAKLQogLyoqCiAgKiB4bWxQYXJzZXJGaW5kTm9kZUluZm9JbmRleDoKICAqIEBzZXE6ICBhIG5vZGUgaW5mbyBzZXF1ZW5jZSBwb2ludGVyCkBAIC0xODYyLDMxICsxODcxLDM1IEBACiAgKgogICogUmV0dXJucyBhIGxvbmcgaW5kaWNhdGluZyB0aGUgcG9zaXRpb24gb2YgdGhlIHJlY29yZAogICovCi11bnNpZ25lZCBsb25nIHhtbFBhcnNlckZpbmROb2RlSW5mb0luZGV4KGNvbnN0IHhtbFBhcnNlck5vZGVJbmZvU2VxUHRyIHNlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sTm9kZVB0ciBub2RlKQordW5zaWduZWQgbG9uZworeG1sUGFyc2VyRmluZE5vZGVJbmZvSW5kZXgoY29uc3QgeG1sUGFyc2VyTm9kZUluZm9TZXFQdHIgc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sTm9kZVB0ciBub2RlKQogewotICB1bnNpZ25lZCBsb25nIHVwcGVyLCBsb3dlciwgbWlkZGxlOwotICBpbnQgZm91bmQgPSAwOworICAgIHVuc2lnbmVkIGxvbmcgdXBwZXIsIGxvd2VyLCBtaWRkbGU7CisgICAgaW50IGZvdW5kID0gMDsKIAotICAvKiBEbyBhIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBrZXkgKi8KLSAgbG93ZXIgPSAxOwotICB1cHBlciA9IHNlcS0+bGVuZ3RoOwotICBtaWRkbGUgPSAwOwotICB3aGlsZSAoIGxvd2VyIDw9IHVwcGVyICYmICFmb3VuZCkgewotICAgIG1pZGRsZSA9IGxvd2VyICsgKHVwcGVyIC0gbG93ZXIpIC8gMjsKLSAgICBpZiAoIG5vZGUgPT0gc2VxLT5idWZmZXJbbWlkZGxlIC0gMV0ubm9kZSApCi0gICAgICBmb3VuZCA9IDE7Ci0gICAgZWxzZSBpZiAoIG5vZGUgPCBzZXEtPmJ1ZmZlclttaWRkbGUgLSAxXS5ub2RlICkKLSAgICAgIHVwcGVyID0gbWlkZGxlIC0gMTsKKyAgICBpZiAoKHNlcSA9PSBOVUxMKSB8fCAobm9kZSA9PSBOVUxMKSkKKyAgICAgICAgcmV0dXJuICgtMSk7CisKKyAgICAvKiBEbyBhIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBrZXkgKi8KKyAgICBsb3dlciA9IDE7CisgICAgdXBwZXIgPSBzZXEtPmxlbmd0aDsKKyAgICBtaWRkbGUgPSAwOworICAgIHdoaWxlIChsb3dlciA8PSB1cHBlciAmJiAhZm91bmQpIHsKKyAgICAgICAgbWlkZGxlID0gbG93ZXIgKyAodXBwZXIgLSBsb3dlcikgLyAyOworICAgICAgICBpZiAobm9kZSA9PSBzZXEtPmJ1ZmZlclttaWRkbGUgLSAxXS5ub2RlKQorICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICBlbHNlIGlmIChub2RlIDwgc2VxLT5idWZmZXJbbWlkZGxlIC0gMV0ubm9kZSkKKyAgICAgICAgICAgIHVwcGVyID0gbWlkZGxlIC0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbG93ZXIgPSBtaWRkbGUgKyAxOworICAgIH0KKworICAgIC8qIFJldHVybiBwb3NpdGlvbiAqLworICAgIGlmIChtaWRkbGUgPT0gMCB8fCBzZXEtPmJ1ZmZlclttaWRkbGUgLSAxXS5ub2RlIDwgbm9kZSkKKyAgICAgICAgcmV0dXJuIG1pZGRsZTsKICAgICBlbHNlCi0gICAgICBsb3dlciA9IG1pZGRsZSArIDE7Ci0gIH0KLQotICAvKiBSZXR1cm4gcG9zaXRpb24gKi8KLSAgaWYgKCBtaWRkbGUgPT0gMCB8fCBzZXEtPmJ1ZmZlclttaWRkbGUgLSAxXS5ub2RlIDwgbm9kZSApCi0gICAgcmV0dXJuIG1pZGRsZTsKLSAgZWxzZSAKLSAgICByZXR1cm4gbWlkZGxlIC0gMTsKKyAgICAgICAgcmV0dXJuIG1pZGRsZSAtIDE7CiB9CiAKIApAQCAtMTkwMyw2ICsxOTE2LDggQEAKIHsKICAgICB1bnNpZ25lZCBsb25nIHBvczsKIAorICAgIGlmICgoY3R4dCA9PSBOVUxMKSB8fCAoaW5mbyA9PSBOVUxMKSkgcmV0dXJuOworCiAgICAgLyogRmluZCBwb3MgYW5kIGNoZWNrIHRvIHNlZSBpZiBub2RlIGlzIGFscmVhZHkgaW4gdGhlIHNlcXVlbmNlICovCiAgICAgcG9zID0geG1sUGFyc2VyRmluZE5vZGVJbmZvSW5kZXgoJmN0eHQtPm5vZGVfc2VxLCAoeG1sTm9kZVB0cikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5ub2RlKTsKZGlmZiAtLWdpdCBhL3JlbGF4bmcuYyBiL3JlbGF4bmcuYwppbmRleCAxNDZlOWVhLi44YmQ0ZDIzIDEwMDY0NAotLS0gYS9yZWxheG5nLmMKKysrIGIvcmVsYXhuZy5jCkBAIC03NjcxLDYgKzc2NzEsOCBAQAogdm9pZAogeG1sUmVsYXhOR0R1bXAoRklMRSAqIG91dHB1dCwgeG1sUmVsYXhOR1B0ciBzY2hlbWEpCiB7CisgICAgaWYgKG91dHB1dCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAgICAgaWYgKHNjaGVtYSA9PSBOVUxMKSB7CiAgICAgICAgIGZwcmludGYob3V0cHV0LCAiUmVsYXhORyBlbXB0eSBvciBmYWlsZWQgdG8gY29tcGlsZVxuIik7CiAgICAgICAgIHJldHVybjsKQEAgLTc3MDAsNiArNzcwMiw4IEBACiB2b2lkCiB4bWxSZWxheE5HRHVtcFRyZWUoRklMRSAqIG91dHB1dCwgeG1sUmVsYXhOR1B0ciBzY2hlbWEpCiB7CisgICAgaWYgKG91dHB1dCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAgICAgaWYgKHNjaGVtYSA9PSBOVUxMKSB7CiAgICAgICAgIGZwcmludGYob3V0cHV0LCAiUmVsYXhORyBlbXB0eSBvciBmYWlsZWQgdG8gY29tcGlsZVxuIik7CiAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL3Rlc3RhcGkuYyBiL3Rlc3RhcGkuYwppbmRleCBmNjk4YWE2Li5lYzQzOGY1IDEwMDY0NAotLS0gYS90ZXN0YXBpLmMKKysrIGIvdGVzdGFwaS5jCkBAIC0yMiw5ICsyMiw3IEBACiAKIHN0YXRpYyB4bWxDaGFyIGNoYXJ0YWJbMTAyNF0gPSAiICBjaGFydGFiXG4iOwogc3RhdGljIGludCBpbnR0YWJbMTAyNF07Ci0jaWYgMAogc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZ3RhYlsxMDI0XTsKLSNlbmRpZgogCiBzdGF0aWMgeG1sRG9jUHRyIGFwaV9kb2MgPSBOVUxMOwogc3RhdGljIHhtbER0ZFB0ciBhcGlfZHRkID0gTlVMTDsKQEAgLTIzNyw3ICsyMzUsNiBAQAogc3RhdGljIHZvaWQgZGVzX3Vuc2lnbmVkX2ludChpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgdW5zaWduZWQgaW50IHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogfQogCi0jaWYgMAogI2RlZmluZSBnZW5fbmJfdW5zaWduZWRfbG9uZyAzCiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGdlbl91bnNpZ25lZF9sb25nKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKQEAgLTI1OSw3ICsyNTYsNiBAQAogCiBzdGF0aWMgdm9pZCBkZXNfdW5zaWduZWRfbG9uZ19wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHVuc2lnbmVkIGxvbmcgKnZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewogfQotI2VuZGlmCiAKICNkZWZpbmUgZ2VuX25iX2ludF9wdHIgMgogCkBAIC0yNzMsMTAgKzI2OSwxMCBAQAogCiAjZGVmaW5lIGdlbl9uYl9jb25zdF9jaGFyX3B0ciA0CiAKLXN0YXRpYyBjb25zdCBjaGFyICpnZW5fY29uc3RfY2hhcl9wdHIoaW50IG5vLCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewotICAgIGlmIChubyA9PSAwKSByZXR1cm4oImZvbyIpOwotICAgIGlmIChubyA9PSAxKSByZXR1cm4oIjxmb28vPiIpOwotICAgIGlmIChubyA9PSAyKSByZXR1cm4oInRlc3QvZW50MiIpOworc3RhdGljIGNoYXIgKmdlbl9jb25zdF9jaGFyX3B0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgaWYgKG5vID09IDApIHJldHVybigoY2hhciAqKSAiZm9vIik7CisgICAgaWYgKG5vID09IDEpIHJldHVybigoY2hhciAqKSAiPGZvby8+Iik7CisgICAgaWYgKG5vID09IDIpIHJldHVybigoY2hhciAqKSAidGVzdC9lbnQyIik7CiAgICAgcmV0dXJuKE5VTEwpOwogfQogc3RhdGljIHZvaWQgZGVzX2NvbnN0X2NoYXJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCBjaGFyICp2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKQEAgLTMwMywxMSArMjk5LDExIEBACiAKICNkZWZpbmUgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyIDUKIAotc3RhdGljIGNvbnN0IHhtbENoYXIgKmdlbl9jb25zdF94bWxDaGFyX3B0cihpbnQgbm8sIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Ci0gICAgaWYgKG5vID09IDApIHJldHVybigoY29uc3QgeG1sQ2hhciAqKSAiZm9vIik7Ci0gICAgaWYgKG5vID09IDEpIHJldHVybigoY29uc3QgeG1sQ2hhciAqKSAiPGZvby8+Iik7Ci0gICAgaWYgKG5vID09IDIpIHJldHVybigoY29uc3QgeG1sQ2hhciAqKSAibvhuZSIpOwotICAgIGlmIChubyA9PSAzKSByZXR1cm4oKGNvbnN0IHhtbENoYXIgKikgIiAyYWIgIik7CitzdGF0aWMgeG1sQ2hhciAqZ2VuX2NvbnN0X3htbENoYXJfcHRyKGludCBubywgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICBpZiAobm8gPT0gMCkgcmV0dXJuKCh4bWxDaGFyICopICJmb28iKTsKKyAgICBpZiAobm8gPT0gMSkgcmV0dXJuKCh4bWxDaGFyICopICI8Zm9vLz4iKTsKKyAgICBpZiAobm8gPT0gMikgcmV0dXJuKCh4bWxDaGFyICopICJu+G5lIik7CisgICAgaWYgKG5vID09IDMpIHJldHVybigoeG1sQ2hhciAqKSAiIDJhYiAiKTsKICAgICByZXR1cm4oTlVMTCk7CiB9CiBzdGF0aWMgdm9pZCBkZXNfY29uc3RfeG1sQ2hhcl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbENoYXIgKnZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgewpAQCAtNzQ0LDE2ICs3NDAsODIgQEAKIH0KIAogCisjZGVmaW5lIGdlbl9uYl91bnNpZ25lZF9jaGFyX3B0ciAxCitzdGF0aWMgdW5zaWduZWQgY2hhciAqIGdlbl91bnNpZ25lZF9jaGFyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfdW5zaWduZWRfY2hhcl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHVuc2lnbmVkIGNoYXIgKiB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKK30KKworI2RlZmluZSBnZW5fbmJfY29uc3RfdW5zaWduZWRfY2hhcl9wdHIgMQorc3RhdGljIHVuc2lnbmVkIGNoYXIgKiBnZW5fY29uc3RfdW5zaWduZWRfY2hhcl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB1bnNpZ25lZCBjaGFyICogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cit9CisKIHN0YXRpYyBpbnQKIHRlc3RfVVRGOFRvSHRtbCh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHVuc2lnbmVkIGNoYXIgKiBvdXQ7IC8qIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBieXRlcyB0byBzdG9yZSB0aGUgcmVzdWx0ICovCisgICAgaW50IG5fb3V0OworICAgIGludCAqIG91dGxlbjsgLyogdGhlIGxlbmd0aCBvZiBAb3V0ICovCisgICAgaW50IG5fb3V0bGVuOworICAgIHVuc2lnbmVkIGNoYXIgKiBpbjsgLyogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFVURi04IGNoYXJzICovCisgICAgaW50IG5faW47CisgICAgaW50ICogaW5sZW47IC8qIHRoZSBsZW5ndGggb2YgQGluICovCisgICAgaW50IG5faW5sZW47CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9vdXQgPSAwO25fb3V0IDwgZ2VuX25iX3Vuc2lnbmVkX2NoYXJfcHRyO25fb3V0KyspIHsKKyAgICBmb3IgKG5fb3V0bGVuID0gMDtuX291dGxlbiA8IGdlbl9uYl9pbnRfcHRyO25fb3V0bGVuKyspIHsKKyAgICBmb3IgKG5faW4gPSAwO25faW4gPCBnZW5fbmJfY29uc3RfdW5zaWduZWRfY2hhcl9wdHI7bl9pbisrKSB7CisgICAgZm9yIChuX2lubGVuID0gMDtuX2lubGVuIDwgZ2VuX25iX2ludF9wdHI7bl9pbmxlbisrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIG91dCA9IGdlbl91bnNpZ25lZF9jaGFyX3B0cihuX291dCwgMCk7CisgICAgICAgIG91dGxlbiA9IGdlbl9pbnRfcHRyKG5fb3V0bGVuLCAxKTsKKyAgICAgICAgaW4gPSBnZW5fY29uc3RfdW5zaWduZWRfY2hhcl9wdHIobl9pbiwgMik7CisgICAgICAgIGlubGVuID0gZ2VuX2ludF9wdHIobl9pbmxlbiwgMyk7CisKKyAgICAgICAgcmV0X3ZhbCA9IFVURjhUb0h0bWwob3V0LCBvdXRsZW4sIGluLCBpbmxlbik7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3Vuc2lnbmVkX2NoYXJfcHRyKG5fb3V0LCBvdXQsIDApOworICAgICAgICBkZXNfaW50X3B0cihuX291dGxlbiwgb3V0bGVuLCAxKTsKKyAgICAgICAgZGVzX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyKG5faW4sIGluLCAyKTsKKyAgICAgICAgZGVzX2ludF9wdHIobl9pbmxlbiwgaW5sZW4sIDMpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gVVRGOFRvSHRtbCIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0KTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRsZW4pOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2luKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbmxlbik7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKIAorI2RlZmluZSBnZW5fbmJfY29uc3RfaHRtbEVsZW1EZXNjX3B0ciAxCitzdGF0aWMgaHRtbEVsZW1EZXNjICogZ2VuX2NvbnN0X2h0bWxFbGVtRGVzY19wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX2NvbnN0X2h0bWxFbGVtRGVzY19wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IGh0bWxFbGVtRGVzYyAqIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X2h0bWxBdHRyQWxsb3dlZCh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CkBAIC03NzMsNyArODM1LDcgQEAKICAgICBpbnQgcmV0X3ZhbDsKICAgICBodG1sRG9jUHRyIGRvYzsgLyogdGhlIEhUTUwgZG9jdW1lbnQgKi8KICAgICBpbnQgbl9kb2M7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWU7IC8qIFRoZSB0YWcgbmFtZSAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiBUaGUgdGFnIG5hbWUgKi8KICAgICBpbnQgbl9uYW1lOwogICAgIGh0bWxOb2RlUHRyIGVsZW07IC8qIHRoZSBIVE1MIGVsZW1lbnQgKi8KICAgICBpbnQgbl9lbGVtOwpAQCAtODE5LDcgKzg4MSw3IEBACiAjaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAogICAgIGludCBtZW1fYmFzZTsKICAgICBodG1sUGFyc2VyQ3R4dFB0ciByZXRfdmFsOwotICAgIGNvbnN0IGNoYXIgKiBidWZmZXI7IC8qIGEgcG9pbnRlciB0byBhIGNoYXIgYXJyYXkgKi8KKyAgICBjaGFyICogYnVmZmVyOyAvKiBhIHBvaW50ZXIgdG8gYSBjaGFyIGFycmF5ICovCiAgICAgaW50IG5fYnVmZmVyOwogICAgIGludCBzaXplOyAvKiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgKi8KICAgICBpbnQgbl9zaXplOwpAQCAtODUzLDEyICs5MTUsODAgQEAKIH0KIAogCisjZGVmaW5lIGdlbl9uYl9odG1sU0FYSGFuZGxlclB0ciAxCitzdGF0aWMgaHRtbFNBWEhhbmRsZXJQdHIgZ2VuX2h0bWxTQVhIYW5kbGVyUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworICAgIHJldHVybihOVUxMKTsKK30KK3N0YXRpYyB2b2lkIGRlc19odG1sU0FYSGFuZGxlclB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaHRtbFNBWEhhbmRsZXJQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cit9CisKIHN0YXRpYyBpbnQKIHRlc3RfaHRtbENyZWF0ZVB1c2hQYXJzZXJDdHh0KHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKKyNpZmRlZiBMSUJYTUxfUFVTSF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIGh0bWxQYXJzZXJDdHh0UHRyIHJldF92YWw7CisgICAgaHRtbFNBWEhhbmRsZXJQdHIgc2F4OyAvKiBhIFNBWCBoYW5kbGVyICovCisgICAgaW50IG5fc2F4OworICAgIHZvaWQgKiB1c2VyX2RhdGE7IC8qIFRoZSB1c2VyIGRhdGEgcmV0dXJuZWQgb24gU0FYIGNhbGxiYWNrcyAqLworICAgIGludCBuX3VzZXJfZGF0YTsKKyAgICBjaGFyICogY2h1bms7IC8qIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBjaGFycyAqLworICAgIGludCBuX2NodW5rOworICAgIGludCBzaXplOyAvKiBudW1iZXIgb2YgY2hhcnMgaW4gdGhlIGFycmF5ICovCisgICAgaW50IG5fc2l6ZTsKKyAgICBjb25zdCBjaGFyICogZmlsZW5hbWU7IC8qIGFuIG9wdGlvbmFsIGZpbGUgbmFtZSBvciBVUkkgKi8KKyAgICBpbnQgbl9maWxlbmFtZTsKKyAgICB4bWxDaGFyRW5jb2RpbmcgZW5jOyAvKiBhbiBvcHRpb25hbCBlbmNvZGluZyAqLworICAgIGludCBuX2VuYzsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX3NheCA9IDA7bl9zYXggPCBnZW5fbmJfaHRtbFNBWEhhbmRsZXJQdHI7bl9zYXgrKykgeworICAgIGZvciAobl91c2VyX2RhdGEgPSAwO25fdXNlcl9kYXRhIDwgZ2VuX25iX3VzZXJkYXRhO25fdXNlcl9kYXRhKyspIHsKKyAgICBmb3IgKG5fY2h1bmsgPSAwO25fY2h1bmsgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9jaHVuaysrKSB7CisgICAgZm9yIChuX3NpemUgPSAwO25fc2l6ZSA8IGdlbl9uYl9pbnQ7bl9zaXplKyspIHsKKyAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CisgICAgZm9yIChuX2VuYyA9IDA7bl9lbmMgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nO25fZW5jKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgc2F4ID0gZ2VuX2h0bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCAwKTsKKyAgICAgICAgdXNlcl9kYXRhID0gZ2VuX3VzZXJkYXRhKG5fdXNlcl9kYXRhLCAxKTsKKyAgICAgICAgY2h1bmsgPSBnZW5fY29uc3RfY2hhcl9wdHIobl9jaHVuaywgMik7CisgICAgICAgIHNpemUgPSBnZW5faW50KG5fc2l6ZSwgMyk7CisgICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDQpOworICAgICAgICBlbmMgPSBnZW5feG1sQ2hhckVuY29kaW5nKG5fZW5jLCA1KTsKKworICAgICAgICByZXRfdmFsID0gaHRtbENyZWF0ZVB1c2hQYXJzZXJDdHh0KHNheCwgdXNlcl9kYXRhLCBjaHVuaywgc2l6ZSwgZmlsZW5hbWUsIGVuYyk7CisgICAgICAgIGRlc3JldF94bWxQYXJzZXJDdHh0UHRyKHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc19odG1sU0FYSGFuZGxlclB0cihuX3NheCwgc2F4LCAwKTsKKyAgICAgICAgZGVzX3VzZXJkYXRhKG5fdXNlcl9kYXRhLCB1c2VyX2RhdGEsIDEpOworICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9jaHVuaywgY2h1bmssIDIpOworICAgICAgICBkZXNfaW50KG5fc2l6ZSwgc2l6ZSwgMyk7CisgICAgICAgIGRlc19maWxlcGF0aChuX2ZpbGVuYW1lLCBmaWxlbmFtZSwgNCk7CisgICAgICAgIGRlc194bWxDaGFyRW5jb2Rpbmcobl9lbmMsIGVuYywgNSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sQ3JlYXRlUHVzaFBhcnNlckN0eHQiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NheCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXNlcl9kYXRhKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jaHVuayk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2l6ZSk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmlsZW5hbWUpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuYyk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC04NzIsMTEgKzEwMDIsMTEgQEAKICAgICBodG1sRG9jUHRyIHJldF92YWw7CiAgICAgaHRtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gSFRNTCBwYXJzZXIgY29udGV4dCAqLwogICAgIGludCBuX2N0eHQ7Ci0gICAgY29uc3QgeG1sQ2hhciAqIGN1cjsgLyogYSBwb2ludGVyIHRvIGEgemVybyB0ZXJtaW5hdGVkIHN0cmluZyAqLworICAgIHhtbENoYXIgKiBjdXI7IC8qIGEgcG9pbnRlciB0byBhIHplcm8gdGVybWluYXRlZCBzdHJpbmcgKi8KICAgICBpbnQgbl9jdXI7CiAgICAgY29uc3QgY2hhciAqIFVSTDsgLyogdGhlIGJhc2UgVVJMIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50ICovCiAgICAgaW50IG5fVVJMOwotICAgIGNvbnN0IGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCisgICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgICBpbnQgbl9lbmNvZGluZzsKICAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiBodG1sUGFyc2VyT3B0aW9uKHMpICovCiAgICAgaW50IG5fb3B0aW9uczsKQEAgLTkzNiw3ICsxMDY2LDcgQEAKICAgICBpbnQgbl9jdHh0OwogICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogYSBmaWxlIG9yIFVSTCAqLwogICAgIGludCBuX2ZpbGVuYW1lOwotICAgIGNvbnN0IGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCisgICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgICBpbnQgbl9lbmNvZGluZzsKICAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiBodG1sUGFyc2VyT3B0aW9uKHMpICovCiAgICAgaW50IG5fb3B0aW9uczsKQEAgLTk4OSwxMyArMTExOSwxMyBAQAogICAgIGh0bWxEb2NQdHIgcmV0X3ZhbDsKICAgICBodG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBIVE1MIHBhcnNlciBjb250ZXh0ICovCiAgICAgaW50IG5fY3R4dDsKLSAgICBjb25zdCBjaGFyICogYnVmZmVyOyAvKiBhIHBvaW50ZXIgdG8gYSBjaGFyIGFycmF5ICovCisgICAgY2hhciAqIGJ1ZmZlcjsgLyogYSBwb2ludGVyIHRvIGEgY2hhciBhcnJheSAqLwogICAgIGludCBuX2J1ZmZlcjsKICAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgb2YgdGhlIGFycmF5ICovCiAgICAgaW50IG5fc2l6ZTsKICAgICBjb25zdCBjaGFyICogVVJMOyAvKiB0aGUgYmFzZSBVUkwgdG8gdXNlIGZvciB0aGUgZG9jdW1lbnQgKi8KICAgICBpbnQgbl9VUkw7Ci0gICAgY29uc3QgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KKyAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgIGludCBuX2VuY29kaW5nOwogICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIGh0bWxQYXJzZXJPcHRpb24ocykgKi8KICAgICBpbnQgbl9vcHRpb25zOwpAQCAtMTEyNiw4ICsxMjU2LDM5IEBACiB0ZXN0X2h0bWxFbGVtZW50QWxsb3dlZEhlcmUodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICBodG1sRWxlbURlc2MgKiBwYXJlbnQ7IC8qIEhUTUwgcGFyZW50IGVsZW1lbnQgKi8KKyAgICBpbnQgbl9wYXJlbnQ7CisgICAgeG1sQ2hhciAqIGVsdDsgLyogSFRNTCBlbGVtZW50ICovCisgICAgaW50IG5fZWx0OwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fcGFyZW50ID0gMDtuX3BhcmVudCA8IGdlbl9uYl9jb25zdF9odG1sRWxlbURlc2NfcHRyO25fcGFyZW50KyspIHsKKyAgICBmb3IgKG5fZWx0ID0gMDtuX2VsdCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2VsdCsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIHBhcmVudCA9IGdlbl9jb25zdF9odG1sRWxlbURlc2NfcHRyKG5fcGFyZW50LCAwKTsKKyAgICAgICAgZWx0ID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fZWx0LCAxKTsKKworICAgICAgICByZXRfdmFsID0gaHRtbEVsZW1lbnRBbGxvd2VkSGVyZShwYXJlbnQsIGVsdCk7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX2NvbnN0X2h0bWxFbGVtRGVzY19wdHIobl9wYXJlbnQsIHBhcmVudCwgMCk7CisgICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX2VsdCwgZWx0LCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIGh0bWxFbGVtZW50QWxsb3dlZEhlcmUiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3BhcmVudCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZWx0KTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTExNDYsOCArMTMwNyw2MCBAQAogdGVzdF9odG1sRW5jb2RlRW50aXRpZXModm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB1bnNpZ25lZCBjaGFyICogb3V0OyAvKiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYnl0ZXMgdG8gc3RvcmUgdGhlIHJlc3VsdCAqLworICAgIGludCBuX291dDsKKyAgICBpbnQgKiBvdXRsZW47IC8qIHRoZSBsZW5ndGggb2YgQG91dCAqLworICAgIGludCBuX291dGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICogaW47IC8qIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBVVEYtOCBjaGFycyAqLworICAgIGludCBuX2luOworICAgIGludCAqIGlubGVuOyAvKiB0aGUgbGVuZ3RoIG9mIEBpbiAqLworICAgIGludCBuX2lubGVuOworICAgIGludCBxdW90ZUNoYXI7IC8qIHRoZSBxdW90ZSBjaGFyYWN0ZXIgdG8gZXNjYXBlICgnIG9yICIpIG9yIHplcm8uICovCisgICAgaW50IG5fcXVvdGVDaGFyOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fb3V0ID0gMDtuX291dCA8IGdlbl9uYl91bnNpZ25lZF9jaGFyX3B0cjtuX291dCsrKSB7CisgICAgZm9yIChuX291dGxlbiA9IDA7bl9vdXRsZW4gPCBnZW5fbmJfaW50X3B0cjtuX291dGxlbisrKSB7CisgICAgZm9yIChuX2luID0gMDtuX2luIDwgZ2VuX25iX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyO25faW4rKykgeworICAgIGZvciAobl9pbmxlbiA9IDA7bl9pbmxlbiA8IGdlbl9uYl9pbnRfcHRyO25faW5sZW4rKykgeworICAgIGZvciAobl9xdW90ZUNoYXIgPSAwO25fcXVvdGVDaGFyIDwgZ2VuX25iX2ludDtuX3F1b3RlQ2hhcisrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIG91dCA9IGdlbl91bnNpZ25lZF9jaGFyX3B0cihuX291dCwgMCk7CisgICAgICAgIG91dGxlbiA9IGdlbl9pbnRfcHRyKG5fb3V0bGVuLCAxKTsKKyAgICAgICAgaW4gPSBnZW5fY29uc3RfdW5zaWduZWRfY2hhcl9wdHIobl9pbiwgMik7CisgICAgICAgIGlubGVuID0gZ2VuX2ludF9wdHIobl9pbmxlbiwgMyk7CisgICAgICAgIHF1b3RlQ2hhciA9IGdlbl9pbnQobl9xdW90ZUNoYXIsIDQpOworCisgICAgICAgIHJldF92YWwgPSBodG1sRW5jb2RlRW50aXRpZXMob3V0LCBvdXRsZW4sIGluLCBpbmxlbiwgcXVvdGVDaGFyKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfdW5zaWduZWRfY2hhcl9wdHIobl9vdXQsIG91dCwgMCk7CisgICAgICAgIGRlc19pbnRfcHRyKG5fb3V0bGVuLCBvdXRsZW4sIDEpOworICAgICAgICBkZXNfY29uc3RfdW5zaWduZWRfY2hhcl9wdHIobl9pbiwgaW4sIDIpOworICAgICAgICBkZXNfaW50X3B0cihuX2lubGVuLCBpbmxlbiwgMyk7CisgICAgICAgIGRlc19pbnQobl9xdW90ZUNoYXIsIHF1b3RlQ2hhciwgNCk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sRW5jb2RlRW50aXRpZXMiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0bGVuKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbik7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5sZW4pOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3F1b3RlQ2hhcik7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xMjU0LDcgKzE0NjcsNyBAQAogI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgaW50IHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWU7IC8qIGFuIGF0dHJpYnV0ZSBuYW1lICovCisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIGFuIGF0dHJpYnV0ZSBuYW1lICovCiAgICAgaW50IG5fbmFtZTsKIAogICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKQEAgLTEyODEsNiArMTQ5NCwxMyBAQAogfQogCiAKKyNkZWZpbmUgZ2VuX25iX2NvbnN0X3htbE5vZGVQdHIgMQorc3RhdGljIGh0bWxOb2RlUHRyIGdlbl9jb25zdF94bWxOb2RlUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworICAgIHJldHVybihOVUxMKTsKK30KK3N0YXRpYyB2b2lkIGRlc19jb25zdF94bWxOb2RlUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCBodG1sTm9kZVB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKK30KKwogc3RhdGljIGludAogdGVzdF9odG1sTm9kZVN0YXR1cyh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CkBAIC0xMzM1LDcgKzE1NTUsNyBAQAogICAgIGludCByZXRfdmFsOwogICAgIGh0bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIEhUTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgICBpbnQgbl9jdHh0OwotICAgIGNvbnN0IGNoYXIgKiBjaHVuazsgLyogYW4gY2hhciBhcnJheSAqLworICAgIGNoYXIgKiBjaHVuazsgLyogYW4gY2hhciBhcnJheSAqLwogICAgIGludCBuX2NodW5rOwogICAgIGludCBzaXplOyAvKiB0aGUgc2l6ZSBpbiBieXRlIG9mIHRoZSBjaHVuayAqLwogICAgIGludCBuX3NpemU7CkBAIC0xMzkxLDcgKzE2MTEsNyBAQAogICAgIGh0bWxEb2NQdHIgcmV0X3ZhbDsKICAgICB4bWxDaGFyICogY3VyOyAvKiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgeG1sQ2hhciAqLwogICAgIGludCBuX2N1cjsKLSAgICBjb25zdCBjaGFyICogZW5jb2Rpbmc7IC8qIGEgZnJlZSBmb3JtIEMgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIEhUTUwgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KKyAgICBjaGFyICogZW5jb2Rpbmc7IC8qIGEgZnJlZSBmb3JtIEMgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIEhUTUwgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgICBpbnQgbl9lbmNvZGluZzsKIAogICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbENoYXJfcHRyO25fY3VyKyspIHsKQEAgLTE1MDcsNyArMTcyNyw3IEBACiAgICAgaHRtbERvY1B0ciByZXRfdmFsOwogICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogdGhlIGZpbGVuYW1lICovCiAgICAgaW50IG5fZmlsZW5hbWU7Ci0gICAgY29uc3QgY2hhciAqIGVuY29kaW5nOyAvKiBhIGZyZWUgZm9ybSBDIHN0cmluZyBkZXNjcmliaW5nIHRoZSBIVE1MIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCisgICAgY2hhciAqIGVuY29kaW5nOyAvKiBhIGZyZWUgZm9ybSBDIHN0cmluZyBkZXNjcmliaW5nIHRoZSBIVE1MIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCiAgICAgaW50IG5fZW5jb2Rpbmc7CiAKICAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CkBAIC0xNTM3LDExICsxNzU3LDExIEBACiAjaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAogICAgIGludCBtZW1fYmFzZTsKICAgICBodG1sRG9jUHRyIHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIGN1cjsgLyogYSBwb2ludGVyIHRvIGEgemVybyB0ZXJtaW5hdGVkIHN0cmluZyAqLworICAgIHhtbENoYXIgKiBjdXI7IC8qIGEgcG9pbnRlciB0byBhIHplcm8gdGVybWluYXRlZCBzdHJpbmcgKi8KICAgICBpbnQgbl9jdXI7CiAgICAgY29uc3QgY2hhciAqIFVSTDsgLyogdGhlIGJhc2UgVVJMIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50ICovCiAgICAgaW50IG5fVVJMOwotICAgIGNvbnN0IGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCisgICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgICBpbnQgbl9lbmNvZGluZzsKICAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiBodG1sUGFyc2VyT3B0aW9uKHMpICovCiAgICAgaW50IG5fb3B0aW9uczsKQEAgLTE1OTQsNyArMTgxNCw3IEBACiAgICAgaHRtbERvY1B0ciByZXRfdmFsOwogICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogYSBmaWxlIG9yIFVSTCAqLwogICAgIGludCBuX2ZpbGVuYW1lOwotICAgIGNvbnN0IGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCisgICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgICBpbnQgbl9lbmNvZGluZzsKICAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiBodG1sUGFyc2VyT3B0aW9uKHMpICovCiAgICAgaW50IG5fb3B0aW9uczsKQEAgLTE2NDAsMTMgKzE4NjAsMTMgQEAKICNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECiAgICAgaW50IG1lbV9iYXNlOwogICAgIGh0bWxEb2NQdHIgcmV0X3ZhbDsKLSAgICBjb25zdCBjaGFyICogYnVmZmVyOyAvKiBhIHBvaW50ZXIgdG8gYSBjaGFyIGFycmF5ICovCisgICAgY2hhciAqIGJ1ZmZlcjsgLyogYSBwb2ludGVyIHRvIGEgY2hhciBhcnJheSAqLwogICAgIGludCBuX2J1ZmZlcjsKICAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgb2YgdGhlIGFycmF5ICovCiAgICAgaW50IG5fc2l6ZTsKICAgICBjb25zdCBjaGFyICogVVJMOyAvKiB0aGUgYmFzZSBVUkwgdG8gdXNlIGZvciB0aGUgZG9jdW1lbnQgKi8KICAgICBpbnQgbl9VUkw7Ci0gICAgY29uc3QgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KKyAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgIGludCBuX2VuY29kaW5nOwogICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIGh0bWxQYXJzZXJPcHRpb24ocykgKi8KICAgICBpbnQgbl9vcHRpb25zOwpAQCAtMTY5OSw4ICsxOTE5LDUzIEBACiB0ZXN0X2h0bWxTQVhQYXJzZURvYyh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfSFRNTF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIGh0bWxEb2NQdHIgcmV0X3ZhbDsKKyAgICB4bWxDaGFyICogY3VyOyAvKiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgeG1sQ2hhciAqLworICAgIGludCBuX2N1cjsKKyAgICBjaGFyICogZW5jb2Rpbmc7IC8qIGEgZnJlZSBmb3JtIEMgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIEhUTUwgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KKyAgICBpbnQgbl9lbmNvZGluZzsKKyAgICBodG1sU0FYSGFuZGxlclB0ciBzYXg7IC8qIHRoZSBTQVggaGFuZGxlciBibG9jayAqLworICAgIGludCBuX3NheDsKKyAgICB2b2lkICogdXNlckRhdGE7IC8qIGlmIHVzaW5nIFNBWCwgdGhpcyBwb2ludGVyIHdpbGwgYmUgcHJvdmlkZWQgb24gY2FsbGJhY2tzLiAqLworICAgIGludCBuX3VzZXJEYXRhOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxDaGFyX3B0cjtuX2N1cisrKSB7CisgICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgeworICAgIGZvciAobl9zYXggPSAwO25fc2F4IDwgZ2VuX25iX2h0bWxTQVhIYW5kbGVyUHRyO25fc2F4KyspIHsKKyAgICBmb3IgKG5fdXNlckRhdGEgPSAwO25fdXNlckRhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl91c2VyRGF0YSsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGN1ciA9IGdlbl94bWxDaGFyX3B0cihuX2N1ciwgMCk7CisgICAgICAgIGVuY29kaW5nID0gZ2VuX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIDEpOworICAgICAgICBzYXggPSBnZW5faHRtbFNBWEhhbmRsZXJQdHIobl9zYXgsIDIpOworICAgICAgICB1c2VyRGF0YSA9IGdlbl91c2VyZGF0YShuX3VzZXJEYXRhLCAzKTsKKworICAgICAgICByZXRfdmFsID0gaHRtbFNBWFBhcnNlRG9jKGN1ciwgZW5jb2RpbmcsIHNheCwgdXNlckRhdGEpOworICAgICAgICBkZXNyZXRfeG1sRG9jUHRyKHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxDaGFyX3B0cihuX2N1ciwgY3VyLCAwKTsKKyAgICAgICAgZGVzX2NvbnN0X2NoYXJfcHRyKG5fZW5jb2RpbmcsIGVuY29kaW5nLCAxKTsKKyAgICAgICAgZGVzX2h0bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCBzYXgsIDIpOworICAgICAgICBkZXNfdXNlcmRhdGEobl91c2VyRGF0YSwgdXNlckRhdGEsIDMpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaHRtbFNBWFBhcnNlRG9jIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuY29kaW5nKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zYXgpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3VzZXJEYXRhKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMTcwOSw4ICsxOTc0LDUzIEBACiB0ZXN0X2h0bWxTQVhQYXJzZUZpbGUodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBodG1sRG9jUHRyIHJldF92YWw7CisgICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiB0aGUgZmlsZW5hbWUgKi8KKyAgICBpbnQgbl9maWxlbmFtZTsKKyAgICBjaGFyICogZW5jb2Rpbmc7IC8qIGEgZnJlZSBmb3JtIEMgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIEhUTUwgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KKyAgICBpbnQgbl9lbmNvZGluZzsKKyAgICBodG1sU0FYSGFuZGxlclB0ciBzYXg7IC8qIHRoZSBTQVggaGFuZGxlciBibG9jayAqLworICAgIGludCBuX3NheDsKKyAgICB2b2lkICogdXNlckRhdGE7IC8qIGlmIHVzaW5nIFNBWCwgdGhpcyBwb2ludGVyIHdpbGwgYmUgcHJvdmlkZWQgb24gY2FsbGJhY2tzLiAqLworICAgIGludCBuX3VzZXJEYXRhOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZXBhdGg7bl9maWxlbmFtZSsrKSB7CisgICAgZm9yIChuX2VuY29kaW5nID0gMDtuX2VuY29kaW5nIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fZW5jb2RpbmcrKykgeworICAgIGZvciAobl9zYXggPSAwO25fc2F4IDwgZ2VuX25iX2h0bWxTQVhIYW5kbGVyUHRyO25fc2F4KyspIHsKKyAgICBmb3IgKG5fdXNlckRhdGEgPSAwO25fdXNlckRhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl91c2VyRGF0YSsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGZpbGVuYW1lID0gZ2VuX2ZpbGVwYXRoKG5fZmlsZW5hbWUsIDApOworICAgICAgICBlbmNvZGluZyA9IGdlbl9jb25zdF9jaGFyX3B0cihuX2VuY29kaW5nLCAxKTsKKyAgICAgICAgc2F4ID0gZ2VuX2h0bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCAyKTsKKyAgICAgICAgdXNlckRhdGEgPSBnZW5fdXNlcmRhdGEobl91c2VyRGF0YSwgMyk7CisKKyAgICAgICAgcmV0X3ZhbCA9IGh0bWxTQVhQYXJzZUZpbGUoZmlsZW5hbWUsIGVuY29kaW5nLCBzYXgsIHVzZXJEYXRhKTsKKyAgICAgICAgZGVzcmV0X3htbERvY1B0cihyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfZmlsZXBhdGgobl9maWxlbmFtZSwgZmlsZW5hbWUsIDApOworICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9lbmNvZGluZywgZW5jb2RpbmcsIDEpOworICAgICAgICBkZXNfaHRtbFNBWEhhbmRsZXJQdHIobl9zYXgsIHNheCwgMik7CisgICAgICAgIGRlc191c2VyZGF0YShuX3VzZXJEYXRhLCB1c2VyRGF0YSwgMyk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBodG1sU0FYUGFyc2VGaWxlIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9maWxlbmFtZSk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZW5jb2RpbmcpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NheCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXNlckRhdGEpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xNzI4LDcgKzIwMzgsNyBAQAogdGVzdF9IVE1McGFyc2VyKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAotICAgIHByaW50ZigiVGVzdGluZyBIVE1McGFyc2VyIDogMTkgb2YgMzcgZnVuY3Rpb25zIC4uLlxuIik7CisgICAgcHJpbnRmKCJUZXN0aW5nIEhUTUxwYXJzZXIgOiAyNSBvZiAzNyBmdW5jdGlvbnMgLi4uXG4iKTsKICAgICByZXQgKz0gdGVzdF9VVEY4VG9IdG1sKCk7CiAgICAgcmV0ICs9IHRlc3RfaHRtbEF0dHJBbGxvd2VkKCk7CiAgICAgcmV0ICs9IHRlc3RfaHRtbEF1dG9DbG9zZVRhZygpOwpAQCAtMTc3OCw3ICsyMDg4LDcgQEAKICAgICBpbnQgbl9idWY7CiAgICAgeG1sRG9jUHRyIGN1cjsgLyogdGhlIGRvY3VtZW50ICovCiAgICAgaW50IG5fY3VyOwotICAgIGNvbnN0IGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIHN0cmluZyAqLworICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIHN0cmluZyAqLwogICAgIGludCBuX2VuY29kaW5nOwogICAgIGludCBmb3JtYXQ7IC8qIHNob3VsZCBmb3JtYXR0aW5nIHNwYWNlcyBiZWVuIGFkZGVkICovCiAgICAgaW50IG5fZm9ybWF0OwpAQCAtMTgzMyw3ICsyMTQzLDcgQEAKICAgICBpbnQgbl9idWY7CiAgICAgeG1sRG9jUHRyIGN1cjsgLyogdGhlIGRvY3VtZW50ICovCiAgICAgaW50IG5fY3VyOwotICAgIGNvbnN0IGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIHN0cmluZyAqLworICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIHN0cmluZyAqLwogICAgIGludCBuX2VuY29kaW5nOwogCiAgICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sT3V0cHV0QnVmZmVyUHRyO25fYnVmKyspIHsKQEAgLTE5NjQsNyArMjI3NCw3IEBACiAjaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAogICAgIGludCBtZW1fYmFzZTsKICAgICBpbnQgcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBjaGVjayAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGNoZWNrICovCiAgICAgaW50IG5fbmFtZTsKIAogICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9uYW1lKyspIHsKQEAgLTE5OTgsOSArMjMwOCw5IEBACiAjaWZkZWYgTElCWE1MX0hUTUxfRU5BQkxFRAogICAgIGludCBtZW1fYmFzZTsKICAgICBodG1sRG9jUHRyIHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIFVSSTsgLyogVVJJIGZvciB0aGUgZHRkLCBvciBOVUxMICovCisgICAgeG1sQ2hhciAqIFVSSTsgLyogVVJJIGZvciB0aGUgZHRkLCBvciBOVUxMICovCiAgICAgaW50IG5fVVJJOwotICAgIGNvbnN0IHhtbENoYXIgKiBFeHRlcm5hbElEOyAvKiB0aGUgZXh0ZXJuYWwgSUQgb2YgdGhlIERURCwgb3IgTlVMTCAqLworICAgIHhtbENoYXIgKiBFeHRlcm5hbElEOyAvKiB0aGUgZXh0ZXJuYWwgSUQgb2YgdGhlIERURCwgb3IgTlVMTCAqLwogICAgIGludCBuX0V4dGVybmFsSUQ7CiAKICAgICBmb3IgKG5fVVJJID0gMDtuX1VSSSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX1VSSSsrKSB7CkBAIC0yMDM5LDkgKzIzNDksOSBAQAogI2lmZGVmIExJQlhNTF9IVE1MX0VOQUJMRUQKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgaHRtbERvY1B0ciByZXRfdmFsOwotICAgIGNvbnN0IHhtbENoYXIgKiBVUkk7IC8qIFVSSSBmb3IgdGhlIGR0ZCwgb3IgTlVMTCAqLworICAgIHhtbENoYXIgKiBVUkk7IC8qIFVSSSBmb3IgdGhlIGR0ZCwgb3IgTlVMTCAqLwogICAgIGludCBuX1VSSTsKLSAgICBjb25zdCB4bWxDaGFyICogRXh0ZXJuYWxJRDsgLyogdGhlIGV4dGVybmFsIElEIG9mIHRoZSBEVEQsIG9yIE5VTEwgKi8KKyAgICB4bWxDaGFyICogRXh0ZXJuYWxJRDsgLyogdGhlIGV4dGVybmFsIElEIG9mIHRoZSBEVEQsIG9yIE5VTEwgKi8KICAgICBpbnQgbl9FeHRlcm5hbElEOwogCiAgICAgZm9yIChuX1VSSSA9IDA7bl9VUkkgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9VUkkrKykgewpAQCAtMjE4NSw3ICsyNDk1LDcgQEAKICAgICBpbnQgbl9kb2M7CiAgICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBjdXJyZW50IG5vZGUgKi8KICAgICBpbnQgbl9jdXI7Ci0gICAgY29uc3QgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcgKi8KKyAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZyAqLwogICAgIGludCBuX2VuY29kaW5nOwogICAgIGludCBmb3JtYXQ7IC8qIHNob3VsZCBmb3JtYXR0aW5nIHNwYWNlcyBiZWVuIGFkZGVkICovCiAgICAgaW50IG5fZm9ybWF0OwpAQCAtMjI0OCw3ICsyNTU4LDcgQEAKICAgICBpbnQgbl9kb2M7CiAgICAgeG1sTm9kZVB0ciBjdXI7IC8qIHRoZSBjdXJyZW50IG5vZGUgKi8KICAgICBpbnQgbl9jdXI7Ci0gICAgY29uc3QgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZW5jb2Rpbmcgc3RyaW5nICovCisgICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZW5jb2Rpbmcgc3RyaW5nICovCiAgICAgaW50IG5fZW5jb2Rpbmc7CiAgICAgaW50IGZvcm1hdDsgLyogc2hvdWxkIGZvcm1hdHRpbmcgc3BhY2VzIGJlZW4gYWRkZWQgKi8KICAgICBpbnQgbl9mb3JtYXQ7CkBAIC0yMzEwLDcgKzI2MjAsNyBAQAogICAgIGludCBuX2RvYzsKICAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIGN1cnJlbnQgbm9kZSAqLwogICAgIGludCBuX2N1cjsKLSAgICBjb25zdCBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBlbmNvZGluZyBzdHJpbmcgKi8KKyAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBlbmNvZGluZyBzdHJpbmcgKi8KICAgICBpbnQgbl9lbmNvZGluZzsKIAogICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbE91dHB1dEJ1ZmZlclB0cjtuX2J1ZisrKSB7CkBAIC0yNDA3LDcgKzI3MTcsNyBAQAogICAgIGludCBuX2ZpbGVuYW1lOwogICAgIHhtbERvY1B0ciBjdXI7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgIGludCBuX2N1cjsKLSAgICBjb25zdCBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZyAqLworICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nICovCiAgICAgaW50IG5fZW5jb2Rpbmc7CiAKICAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZW91dHB1dDtuX2ZpbGVuYW1lKyspIHsKQEAgLTI0NTcsNyArMjc2Nyw3IEBACiAgICAgaW50IG5fZmlsZW5hbWU7CiAgICAgeG1sRG9jUHRyIGN1cjsgLyogdGhlIGRvY3VtZW50ICovCiAgICAgaW50IG5fY3VyOwotICAgIGNvbnN0IGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nICovCisgICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcgKi8KICAgICBpbnQgbl9lbmNvZGluZzsKICAgICBpbnQgZm9ybWF0OyAvKiBzaG91bGQgZm9ybWF0dGluZyBzcGFjZXMgYmVlbiBhZGRlZCAqLwogICAgIGludCBuX2Zvcm1hdDsKQEAgLTI1MTEsNyArMjgyMSw3IEBACiAgICAgaW50IHJldF92YWw7CiAgICAgaHRtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgIGludCBuX2RvYzsKLSAgICBjb25zdCB4bWxDaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBlbmNvZGluZyBzdHJpbmcgKi8KKyAgICB4bWxDaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBlbmNvZGluZyBzdHJpbmcgKi8KICAgICBpbnQgbl9lbmNvZGluZzsKIAogICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CkBAIC0yNTcwLDEyICsyODgwLDY0IEBACiAgICAgcmV0dXJuKHJldCk7CiB9CiAKKyNkZWZpbmUgZ2VuX25iX3htbENhdGFsb2dQdHIgMQorc3RhdGljIHhtbENhdGFsb2dQdHIgZ2VuX3htbENhdGFsb2dQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX3htbENhdGFsb2dQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbENhdGFsb2dQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cit9CisKIHN0YXRpYyBpbnQKIHRlc3RfeG1sQUNhdGFsb2dBZGQodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX0NBVEFMT0dfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB4bWxDYXRhbG9nUHRyIGNhdGFsOyAvKiBhIENhdGFsb2cgKi8KKyAgICBpbnQgbl9jYXRhbDsKKyAgICB4bWxDaGFyICogdHlwZTsgLyogdGhlIHR5cGUgb2YgcmVjb3JkIHRvIGFkZCB0byB0aGUgY2F0YWxvZyAqLworICAgIGludCBuX3R5cGU7CisgICAgeG1sQ2hhciAqIG9yaWc7IC8qIHRoZSBzeXN0ZW0sIHB1YmxpYyBvciBwcmVmaXggdG8gbWF0Y2ggKi8KKyAgICBpbnQgbl9vcmlnOworICAgIHhtbENoYXIgKiByZXBsYWNlOyAvKiB0aGUgcmVwbGFjZW1lbnQgdmFsdWUgZm9yIHRoZSBtYXRjaCAqLworICAgIGludCBuX3JlcGxhY2U7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9jYXRhbCA9IDA7bl9jYXRhbCA8IGdlbl9uYl94bWxDYXRhbG9nUHRyO25fY2F0YWwrKykgeworICAgIGZvciAobl90eXBlID0gMDtuX3R5cGUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl90eXBlKyspIHsKKyAgICBmb3IgKG5fb3JpZyA9IDA7bl9vcmlnIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fb3JpZysrKSB7CisgICAgZm9yIChuX3JlcGxhY2UgPSAwO25fcmVwbGFjZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3JlcGxhY2UrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBjYXRhbCA9IGdlbl94bWxDYXRhbG9nUHRyKG5fY2F0YWwsIDApOworICAgICAgICB0eXBlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdHlwZSwgMSk7CisgICAgICAgIG9yaWcgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9vcmlnLCAyKTsKKyAgICAgICAgcmVwbGFjZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3JlcGxhY2UsIDMpOworCisgICAgICAgIHJldF92YWwgPSB4bWxBQ2F0YWxvZ0FkZChjYXRhbCwgdHlwZSwgb3JpZywgcmVwbGFjZSk7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbENhdGFsb2dQdHIobl9jYXRhbCwgY2F0YWwsIDApOworICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl90eXBlLCB0eXBlLCAxKTsKKyAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fb3JpZywgb3JpZywgMik7CisgICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3JlcGxhY2UsIHJlcGxhY2UsIDMpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQUNhdGFsb2dBZGQiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NhdGFsKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90eXBlKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vcmlnKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZXBsYWNlKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMjU4NCw4ICsyOTQ2LDM5IEBACiB0ZXN0X3htbEFDYXRhbG9nRHVtcCh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfQ0FUQUxPR19FTkFCTEVECisjaWZkZWYgTElCWE1MX09VVFBVVF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbENhdGFsb2dQdHIgY2F0YWw7IC8qIGEgQ2F0YWxvZyAqLworICAgIGludCBuX2NhdGFsOworICAgIEZJTEUgKiBvdXQ7IC8qIHRoZSBmaWxlLiAqLworICAgIGludCBuX291dDsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2NhdGFsID0gMDtuX2NhdGFsIDwgZ2VuX25iX3htbENhdGFsb2dQdHI7bl9jYXRhbCsrKSB7CisgICAgZm9yIChuX291dCA9IDA7bl9vdXQgPCBnZW5fbmJfRklMRV9wdHI7bl9vdXQrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBjYXRhbCA9IGdlbl94bWxDYXRhbG9nUHRyKG5fY2F0YWwsIDApOworICAgICAgICBvdXQgPSBnZW5fRklMRV9wdHIobl9vdXQsIDEpOworCisgICAgICAgIHhtbEFDYXRhbG9nRHVtcChjYXRhbCwgb3V0KTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sQ2F0YWxvZ1B0cihuX2NhdGFsLCBjYXRhbCwgMCk7CisgICAgICAgIGRlc19GSUxFX3B0cihuX291dCwgb3V0LCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEFDYXRhbG9nRHVtcCIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY2F0YWwpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dCk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTI1OTQsOCArMjk4NywzOSBAQAogdGVzdF94bWxBQ2F0YWxvZ1JlbW92ZSh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfQ0FUQUxPR19FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbENhdGFsb2dQdHIgY2F0YWw7IC8qIGEgQ2F0YWxvZyAqLworICAgIGludCBuX2NhdGFsOworICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIHZhbHVlIHRvIHJlbW92ZSAqLworICAgIGludCBuX3ZhbHVlOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fY2F0YWwgPSAwO25fY2F0YWwgPCBnZW5fbmJfeG1sQ2F0YWxvZ1B0cjtuX2NhdGFsKyspIHsKKyAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGNhdGFsID0gZ2VuX3htbENhdGFsb2dQdHIobl9jYXRhbCwgMCk7CisgICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxBQ2F0YWxvZ1JlbW92ZShjYXRhbCwgdmFsdWUpOworICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxDYXRhbG9nUHRyKG5fY2F0YWwsIGNhdGFsLCAwKTsKKyAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIHZhbHVlLCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEFDYXRhbG9nUmVtb3ZlIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jYXRhbCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMjYwNCw4ICszMDI4LDQ2IEBACiB0ZXN0X3htbEFDYXRhbG9nUmVzb2x2ZSh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfQ0FUQUxPR19FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbENoYXIgKiByZXRfdmFsOworICAgIHhtbENhdGFsb2dQdHIgY2F0YWw7IC8qIGEgQ2F0YWxvZyAqLworICAgIGludCBuX2NhdGFsOworICAgIHhtbENoYXIgKiBwdWJJRDsgLyogdGhlIHB1YmxpYyBJRCBzdHJpbmcgKi8KKyAgICBpbnQgbl9wdWJJRDsKKyAgICB4bWxDaGFyICogc3lzSUQ7IC8qIHRoZSBzeXN0ZW0gSUQgc3RyaW5nICovCisgICAgaW50IG5fc3lzSUQ7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9jYXRhbCA9IDA7bl9jYXRhbCA8IGdlbl9uYl94bWxDYXRhbG9nUHRyO25fY2F0YWwrKykgeworICAgIGZvciAobl9wdWJJRCA9IDA7bl9wdWJJRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3B1YklEKyspIHsKKyAgICBmb3IgKG5fc3lzSUQgPSAwO25fc3lzSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zeXNJRCsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGNhdGFsID0gZ2VuX3htbENhdGFsb2dQdHIobl9jYXRhbCwgMCk7CisgICAgICAgIHB1YklEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHViSUQsIDEpOworICAgICAgICBzeXNJRCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N5c0lELCAyKTsKKworICAgICAgICByZXRfdmFsID0geG1sQUNhdGFsb2dSZXNvbHZlKGNhdGFsLCBwdWJJRCwgc3lzSUQpOworICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbENhdGFsb2dQdHIobl9jYXRhbCwgY2F0YWwsIDApOworICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9wdWJJRCwgcHViSUQsIDEpOworICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNJRCwgc3lzSUQsIDIpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQUNhdGFsb2dSZXNvbHZlIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jYXRhbCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fcHViSUQpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N5c0lEKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0yNjE0LDggKzMwNzYsMzkgQEAKIHRlc3RfeG1sQUNhdGFsb2dSZXNvbHZlUHVibGljKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9DQVRBTE9HX0VOQUJMRUQKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgeG1sQ2hhciAqIHJldF92YWw7CisgICAgeG1sQ2F0YWxvZ1B0ciBjYXRhbDsgLyogYSBDYXRhbG9nICovCisgICAgaW50IG5fY2F0YWw7CisgICAgeG1sQ2hhciAqIHB1YklEOyAvKiB0aGUgcHVibGljIElEIHN0cmluZyAqLworICAgIGludCBuX3B1YklEOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fY2F0YWwgPSAwO25fY2F0YWwgPCBnZW5fbmJfeG1sQ2F0YWxvZ1B0cjtuX2NhdGFsKyspIHsKKyAgICBmb3IgKG5fcHViSUQgPSAwO25fcHViSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wdWJJRCsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGNhdGFsID0gZ2VuX3htbENhdGFsb2dQdHIobl9jYXRhbCwgMCk7CisgICAgICAgIHB1YklEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fcHViSUQsIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxBQ2F0YWxvZ1Jlc29sdmVQdWJsaWMoY2F0YWwsIHB1YklEKTsKKyAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxDYXRhbG9nUHRyKG5fY2F0YWwsIGNhdGFsLCAwKTsKKyAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fcHViSUQsIHB1YklELCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEFDYXRhbG9nUmVzb2x2ZVB1YmxpYyIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY2F0YWwpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3B1YklEKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTI2MjQsOCArMzExNywzOSBAQAogdGVzdF94bWxBQ2F0YWxvZ1Jlc29sdmVTeXN0ZW0odm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX0NBVEFMT0dfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICB4bWxDaGFyICogcmV0X3ZhbDsKKyAgICB4bWxDYXRhbG9nUHRyIGNhdGFsOyAvKiBhIENhdGFsb2cgKi8KKyAgICBpbnQgbl9jYXRhbDsKKyAgICB4bWxDaGFyICogc3lzSUQ7IC8qIHRoZSBzeXN0ZW0gSUQgc3RyaW5nICovCisgICAgaW50IG5fc3lzSUQ7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9jYXRhbCA9IDA7bl9jYXRhbCA8IGdlbl9uYl94bWxDYXRhbG9nUHRyO25fY2F0YWwrKykgeworICAgIGZvciAobl9zeXNJRCA9IDA7bl9zeXNJRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N5c0lEKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgY2F0YWwgPSBnZW5feG1sQ2F0YWxvZ1B0cihuX2NhdGFsLCAwKTsKKyAgICAgICAgc3lzSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNJRCwgMSk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbEFDYXRhbG9nUmVzb2x2ZVN5c3RlbShjYXRhbCwgc3lzSUQpOworICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbENhdGFsb2dQdHIobl9jYXRhbCwgY2F0YWwsIDApOworICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zeXNJRCwgc3lzSUQsIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQUNhdGFsb2dSZXNvbHZlU3lzdGVtIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jYXRhbCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3lzSUQpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMjYzNCw4ICszMTU4LDM5IEBACiB0ZXN0X3htbEFDYXRhbG9nUmVzb2x2ZVVSSSh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfQ0FUQUxPR19FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbENoYXIgKiByZXRfdmFsOworICAgIHhtbENhdGFsb2dQdHIgY2F0YWw7IC8qIGEgQ2F0YWxvZyAqLworICAgIGludCBuX2NhdGFsOworICAgIHhtbENoYXIgKiBVUkk7IC8qIHRoZSBVUkkgKi8KKyAgICBpbnQgbl9VUkk7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9jYXRhbCA9IDA7bl9jYXRhbCA8IGdlbl9uYl94bWxDYXRhbG9nUHRyO25fY2F0YWwrKykgeworICAgIGZvciAobl9VUkkgPSAwO25fVVJJIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fVVJJKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgY2F0YWwgPSBnZW5feG1sQ2F0YWxvZ1B0cihuX2NhdGFsLCAwKTsKKyAgICAgICAgVVJJID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fVVJJLCAxKTsKKworICAgICAgICByZXRfdmFsID0geG1sQUNhdGFsb2dSZXNvbHZlVVJJKGNhdGFsLCBVUkkpOworICAgICAgICBkZXNyZXRfeG1sQ2hhcl9wdHIocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbENhdGFsb2dQdHIobl9jYXRhbCwgY2F0YWwsIDApOworICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9VUkksIFVSSSwgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxBQ2F0YWxvZ1Jlc29sdmVVUkkiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NhdGFsKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9VUkkpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMjY0NywxMSArMzIwMiwxMSBAQAogI2lmZGVmIExJQlhNTF9DQVRBTE9HX0VOQUJMRUQKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgaW50IHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHR5cGU7IC8qIHRoZSB0eXBlIG9mIHJlY29yZCB0byBhZGQgdG8gdGhlIGNhdGFsb2cgKi8KKyAgICB4bWxDaGFyICogdHlwZTsgLyogdGhlIHR5cGUgb2YgcmVjb3JkIHRvIGFkZCB0byB0aGUgY2F0YWxvZyAqLwogICAgIGludCBuX3R5cGU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG9yaWc7IC8qIHRoZSBzeXN0ZW0sIHB1YmxpYyBvciBwcmVmaXggdG8gbWF0Y2ggKi8KKyAgICB4bWxDaGFyICogb3JpZzsgLyogdGhlIHN5c3RlbSwgcHVibGljIG9yIHByZWZpeCB0byBtYXRjaCAqLwogICAgIGludCBuX29yaWc7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHJlcGxhY2U7IC8qIHRoZSByZXBsYWNlbWVudCB2YWx1ZSBmb3IgdGhlIG1hdGNoICovCisgICAgeG1sQ2hhciAqIHJlcGxhY2U7IC8qIHRoZSByZXBsYWNlbWVudCB2YWx1ZSBmb3IgdGhlIG1hdGNoICovCiAgICAgaW50IG5fcmVwbGFjZTsKIAogICAgIGZvciAobl90eXBlID0gMDtuX3R5cGUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl90eXBlKyspIHsKQEAgLTI3NzIsOCArMzMyNywzMiBAQAogdGVzdF94bWxDYXRhbG9nSXNFbXB0eSh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfQ0FUQUxPR19FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbENhdGFsb2dQdHIgY2F0YWw7IC8qIHNob3VsZCB0aGlzIGNyZWF0ZSBhbiBTR01MIGNhdGFsb2cgKi8KKyAgICBpbnQgbl9jYXRhbDsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2NhdGFsID0gMDtuX2NhdGFsIDwgZ2VuX25iX3htbENhdGFsb2dQdHI7bl9jYXRhbCsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGNhdGFsID0gZ2VuX3htbENhdGFsb2dQdHIobl9jYXRhbCwgMCk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbENhdGFsb2dJc0VtcHR5KGNhdGFsKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sQ2F0YWxvZ1B0cihuX2NhdGFsLCBjYXRhbCwgMCk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDYXRhbG9nSXNFbXB0eSIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY2F0YWwpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0yNzg3LDkgKzMzNjYsOSBAQAogICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgIHZvaWQgKiBjYXRhbG9nczsgLyogYSBkb2N1bWVudCdzIGxpc3Qgb2YgY2F0YWxvZ3MgKi8KICAgICBpbnQgbl9jYXRhbG9nczsKLSAgICBjb25zdCB4bWxDaGFyICogcHViSUQ7IC8qIHRoZSBwdWJsaWMgSUQgc3RyaW5nICovCisgICAgeG1sQ2hhciAqIHB1YklEOyAvKiB0aGUgcHVibGljIElEIHN0cmluZyAqLwogICAgIGludCBuX3B1YklEOwotICAgIGNvbnN0IHhtbENoYXIgKiBzeXNJRDsgLyogdGhlIHN5c3RlbSBJRCBzdHJpbmcgKi8KKyAgICB4bWxDaGFyICogc3lzSUQ7IC8qIHRoZSBzeXN0ZW0gSUQgc3RyaW5nICovCiAgICAgaW50IG5fc3lzSUQ7CiAKICAgICBmb3IgKG5fY2F0YWxvZ3MgPSAwO25fY2F0YWxvZ3MgPCBnZW5fbmJfdm9pZF9wdHI7bl9jYXRhbG9ncysrKSB7CkBAIC0yODM1LDcgKzM0MTQsNyBAQAogICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgIHZvaWQgKiBjYXRhbG9nczsgLyogYSBkb2N1bWVudCdzIGxpc3Qgb2YgY2F0YWxvZ3MgKi8KICAgICBpbnQgbl9jYXRhbG9nczsKLSAgICBjb25zdCB4bWxDaGFyICogVVJJOyAvKiB0aGUgVVJJICovCisgICAgeG1sQ2hhciAqIFVSSTsgLyogdGhlIFVSSSAqLwogICAgIGludCBuX1VSSTsKIAogICAgIGZvciAobl9jYXRhbG9ncyA9IDA7bl9jYXRhbG9ncyA8IGdlbl9uYl92b2lkX3B0cjtuX2NhdGFsb2dzKyspIHsKQEAgLTI4NzMsNyArMzQ1Miw3IEBACiAKICNpZmRlZiBMSUJYTUxfQ0FUQUxPR19FTkFCTEVECiAgICAgaW50IHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgdmFsdWUgdG8gcmVtb3ZlICovCisgICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgdmFsdWUgdG8gcmVtb3ZlICovCiAgICAgaW50IG5fdmFsdWU7CiAKICAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CkBAIC0yODk5LDkgKzM0NzgsOSBAQAogI2lmZGVmIExJQlhNTF9DQVRBTE9HX0VOQUJMRUQKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgeG1sQ2hhciAqIHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHB1YklEOyAvKiB0aGUgcHVibGljIElEIHN0cmluZyAqLworICAgIHhtbENoYXIgKiBwdWJJRDsgLyogdGhlIHB1YmxpYyBJRCBzdHJpbmcgKi8KICAgICBpbnQgbl9wdWJJRDsKLSAgICBjb25zdCB4bWxDaGFyICogc3lzSUQ7IC8qIHRoZSBzeXN0ZW0gSUQgc3RyaW5nICovCisgICAgeG1sQ2hhciAqIHN5c0lEOyAvKiB0aGUgc3lzdGVtIElEIHN0cmluZyAqLwogICAgIGludCBuX3N5c0lEOwogCiAgICAgZm9yIChuX3B1YklEID0gMDtuX3B1YklEIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fcHViSUQrKykgewpAQCAtMjk0MCw3ICszNTE5LDcgQEAKICNpZmRlZiBMSUJYTUxfQ0FUQUxPR19FTkFCTEVECiAgICAgaW50IG1lbV9iYXNlOwogICAgIHhtbENoYXIgKiByZXRfdmFsOwotICAgIGNvbnN0IHhtbENoYXIgKiBwdWJJRDsgLyogdGhlIHB1YmxpYyBJRCBzdHJpbmcgKi8KKyAgICB4bWxDaGFyICogcHViSUQ7IC8qIHRoZSBwdWJsaWMgSUQgc3RyaW5nICovCiAgICAgaW50IG5fcHViSUQ7CiAKICAgICBmb3IgKG5fcHViSUQgPSAwO25fcHViSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wdWJJRCsrKSB7CkBAIC0yOTc0LDcgKzM1NTMsNyBAQAogI2lmZGVmIExJQlhNTF9DQVRBTE9HX0VOQUJMRUQKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgeG1sQ2hhciAqIHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHN5c0lEOyAvKiB0aGUgc3lzdGVtIElEIHN0cmluZyAqLworICAgIHhtbENoYXIgKiBzeXNJRDsgLyogdGhlIHN5c3RlbSBJRCBzdHJpbmcgKi8KICAgICBpbnQgbl9zeXNJRDsKIAogICAgIGZvciAobl9zeXNJRCA9IDA7bl9zeXNJRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N5c0lEKyspIHsKQEAgLTMwMDgsNyArMzU4Nyw3IEBACiAjaWZkZWYgTElCWE1MX0NBVEFMT0dfRU5BQkxFRAogICAgIGludCBtZW1fYmFzZTsKICAgICB4bWxDaGFyICogcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogVVJJOyAvKiB0aGUgVVJJICovCisgICAgeG1sQ2hhciAqIFVSSTsgLyogdGhlIFVSSSAqLwogICAgIGludCBuX1VSSTsKIAogICAgIGZvciAobl9VUkkgPSAwO25fVVJJIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fVVJJKyspIHsKQEAgLTMwOTMsOCArMzY3MiwzMiBAQAogdGVzdF94bWxDb252ZXJ0U0dNTENhdGFsb2codm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX0NBVEFMT0dfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB4bWxDYXRhbG9nUHRyIGNhdGFsOyAvKiB0aGUgY2F0YWxvZyAqLworICAgIGludCBuX2NhdGFsOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fY2F0YWwgPSAwO25fY2F0YWwgPCBnZW5fbmJfeG1sQ2F0YWxvZ1B0cjtuX2NhdGFsKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgY2F0YWwgPSBnZW5feG1sQ2F0YWxvZ1B0cihuX2NhdGFsLCAwKTsKKworICAgICAgICByZXRfdmFsID0geG1sQ29udmVydFNHTUxDYXRhbG9nKGNhdGFsKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sQ2F0YWxvZ1B0cihuX2NhdGFsLCBjYXRhbCwgMCk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDb252ZXJ0U0dNTENhdGFsb2ciLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NhdGFsKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMzE2NCw3ICszNzY3LDcgQEAKICAgICBpbnQgcmV0ID0gMDsKIAogI2lmZGVmIExJQlhNTF9DQVRBTE9HX0VOQUJMRUQKLSAgICBjb25zdCBjaGFyICogcGF0aHNzOyAvKiBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgc2VwYXJhdGVkIGJ5IGEgY29sb24gb3IgYSBzcGFjZS4gKi8KKyAgICBjaGFyICogcGF0aHNzOyAvKiBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgc2VwYXJhdGVkIGJ5IGEgY29sb24gb3IgYSBzcGFjZS4gKi8KICAgICBpbnQgbl9wYXRoc3M7CiAKICAgICBmb3IgKG5fcGF0aHNzID0gMDtuX3BhdGhzcyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX3BhdGhzcysrKSB7CkBAIC0zMjM5LDcgKzM4NDIsNyBAQAogdGVzdF9jYXRhbG9nKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAotICAgIHByaW50ZigiVGVzdGluZyBjYXRhbG9nIDogMTYgb2YgMzYgZnVuY3Rpb25zIC4uLlxuIik7CisgICAgcHJpbnRmKCJUZXN0aW5nIGNhdGFsb2cgOiAyNSBvZiAzNiBmdW5jdGlvbnMgLi4uXG4iKTsKICAgICByZXQgKz0gdGVzdF94bWxBQ2F0YWxvZ0FkZCgpOwogICAgIHJldCArPSB0ZXN0X3htbEFDYXRhbG9nRHVtcCgpOwogICAgIHJldCArPSB0ZXN0X3htbEFDYXRhbG9nUmVtb3ZlKCk7CkBAIC0zMjc3LDEyICszODgwLDQ4IEBACiAgICAgcmV0dXJuKHJldCk7CiB9CiAKKyNkZWZpbmUgZ2VuX25iX2NvbnN0X3htbENoUmFuZ2VHcm91cFB0ciAxCitzdGF0aWMgeG1sQ2hSYW5nZUdyb3VwUHRyIGdlbl9jb25zdF94bWxDaFJhbmdlR3JvdXBQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX2NvbnN0X3htbENoUmFuZ2VHcm91cFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgY29uc3QgeG1sQ2hSYW5nZUdyb3VwUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbENoYXJJblJhbmdlKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB1bnNpZ25lZCBpbnQgdmFsOyAvKiBjaGFyYWN0ZXIgdG8gYmUgdmFsaWRhdGVkICovCisgICAgaW50IG5fdmFsOworICAgIHhtbENoUmFuZ2VHcm91cFB0ciBycHRyOyAvKiBwb2ludGVyIHRvIHJhbmdlIHRvIGJlIHVzZWQgdG8gdmFsaWRhdGUgKi8KKyAgICBpbnQgbl9ycHRyOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl91bnNpZ25lZF9pbnQ7bl92YWwrKykgeworICAgIGZvciAobl9ycHRyID0gMDtuX3JwdHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hSYW5nZUdyb3VwUHRyO25fcnB0cisrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIHZhbCA9IGdlbl91bnNpZ25lZF9pbnQobl92YWwsIDApOworICAgICAgICBycHRyID0gZ2VuX2NvbnN0X3htbENoUmFuZ2VHcm91cFB0cihuX3JwdHIsIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxDaGFySW5SYW5nZSh2YWwsIHJwdHIpOworICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc191bnNpZ25lZF9pbnQobl92YWwsIHZhbCwgMCk7CisgICAgICAgIGRlc19jb25zdF94bWxDaFJhbmdlR3JvdXBQdHIobl9ycHRyLCBycHRyLCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENoYXJJblJhbmdlIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JwdHIpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTM1NDYsNyArNDE4NSw3IEBACiB0ZXN0X2NodmFsaWQodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCi0gICAgcHJpbnRmKCJUZXN0aW5nIGNodmFsaWQgOiA4IG9mIDkgZnVuY3Rpb25zIC4uLlxuIik7CisgICAgcHJpbnRmKCJUZXN0aW5nIGNodmFsaWQgOiA5IG9mIDkgZnVuY3Rpb25zIC4uLlxuIik7CiAgICAgcmV0ICs9IHRlc3RfeG1sQ2hhckluUmFuZ2UoKTsKICAgICByZXQgKz0gdGVzdF94bWxJc0Jhc2VDaGFyKCk7CiAgICAgcmV0ICs9IHRlc3RfeG1sSXNCbGFuaygpOwpAQCAtMzYyNyw3ICs0MjY2LDcgQEAKICAgICBjb25zdCB4bWxDaGFyICogcmV0X3ZhbDsKICAgICB4bWxEaWN0UHRyIGRpY3Q7IC8qIHRoZSBkaWN0aW9ubmFyeSAqLwogICAgIGludCBuX2RpY3Q7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgICBpbnQgbl9uYW1lOwogICAgIGludCBsZW47IC8qIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUsIGlmIC0xIGl0IGlzIHJlY29tcHV0ZWQgKi8KICAgICBpbnQgbl9sZW47CkBAIC0zNjczLDcgKzQzMTIsNyBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbERpY3RQdHIgZGljdDsgLyogdGhlIGRpY3Rpb25uYXJ5ICovCiAgICAgaW50IG5fZGljdDsKLSAgICBjb25zdCB4bWxDaGFyICogc3RyOyAvKiB0aGUgc3RyaW5nICovCisgICAgeG1sQ2hhciAqIHN0cjsgLyogdGhlIHN0cmluZyAqLwogICAgIGludCBuX3N0cjsKIAogICAgIGZvciAobl9kaWN0ID0gMDtuX2RpY3QgPCBnZW5fbmJfeG1sRGljdFB0cjtuX2RpY3QrKykgewpAQCAtMzcxMiw5ICs0MzUxLDkgQEAKICAgICBjb25zdCB4bWxDaGFyICogcmV0X3ZhbDsKICAgICB4bWxEaWN0UHRyIGRpY3Q7IC8qIHRoZSBkaWN0aW9ubmFyeSAqLwogICAgIGludCBuX2RpY3Q7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHByZWZpeDsgLyogdGhlIHByZWZpeCAqLworICAgIHhtbENoYXIgKiBwcmVmaXg7IC8qIHRoZSBwcmVmaXggKi8KICAgICBpbnQgbl9wcmVmaXg7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lICovCisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lICovCiAgICAgaW50IG5fbmFtZTsKIAogICAgIGZvciAobl9kaWN0ID0gMDtuX2RpY3QgPCBnZW5fbmJfeG1sRGljdFB0cjtuX2RpY3QrKykgewpAQCAtMzgzNiw4ICs0NDc1LDUxIEBACiB0ZXN0X1VURjhUb2lzb2xhdDEodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHVuc2lnbmVkIGNoYXIgKiBvdXQ7IC8qIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBieXRlcyB0byBzdG9yZSB0aGUgcmVzdWx0ICovCisgICAgaW50IG5fb3V0OworICAgIGludCAqIG91dGxlbjsgLyogdGhlIGxlbmd0aCBvZiBAb3V0ICovCisgICAgaW50IG5fb3V0bGVuOworICAgIHVuc2lnbmVkIGNoYXIgKiBpbjsgLyogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFVURi04IGNoYXJzICovCisgICAgaW50IG5faW47CisgICAgaW50ICogaW5sZW47IC8qIHRoZSBsZW5ndGggb2YgQGluICovCisgICAgaW50IG5faW5sZW47CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9vdXQgPSAwO25fb3V0IDwgZ2VuX25iX3Vuc2lnbmVkX2NoYXJfcHRyO25fb3V0KyspIHsKKyAgICBmb3IgKG5fb3V0bGVuID0gMDtuX291dGxlbiA8IGdlbl9uYl9pbnRfcHRyO25fb3V0bGVuKyspIHsKKyAgICBmb3IgKG5faW4gPSAwO25faW4gPCBnZW5fbmJfY29uc3RfdW5zaWduZWRfY2hhcl9wdHI7bl9pbisrKSB7CisgICAgZm9yIChuX2lubGVuID0gMDtuX2lubGVuIDwgZ2VuX25iX2ludF9wdHI7bl9pbmxlbisrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIG91dCA9IGdlbl91bnNpZ25lZF9jaGFyX3B0cihuX291dCwgMCk7CisgICAgICAgIG91dGxlbiA9IGdlbl9pbnRfcHRyKG5fb3V0bGVuLCAxKTsKKyAgICAgICAgaW4gPSBnZW5fY29uc3RfdW5zaWduZWRfY2hhcl9wdHIobl9pbiwgMik7CisgICAgICAgIGlubGVuID0gZ2VuX2ludF9wdHIobl9pbmxlbiwgMyk7CisKKyAgICAgICAgcmV0X3ZhbCA9IFVURjhUb2lzb2xhdDEob3V0LCBvdXRsZW4sIGluLCBpbmxlbik7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3Vuc2lnbmVkX2NoYXJfcHRyKG5fb3V0LCBvdXQsIDApOworICAgICAgICBkZXNfaW50X3B0cihuX291dGxlbiwgb3V0bGVuLCAxKTsKKyAgICAgICAgZGVzX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyKG5faW4sIGluLCAyKTsKKyAgICAgICAgZGVzX2ludF9wdHIobl9pbmxlbiwgaW5sZW4sIDMpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gVVRGOFRvaXNvbGF0MSIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0KTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRsZW4pOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2luKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbmxlbik7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0zODQ2LDggKzQ1MjgsNTEgQEAKIHRlc3RfaXNvbGF0MVRvVVRGOCh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgaW50IHJldF92YWw7CisgICAgdW5zaWduZWQgY2hhciAqIG91dDsgLyogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGJ5dGVzIHRvIHN0b3JlIHRoZSByZXN1bHQgKi8KKyAgICBpbnQgbl9vdXQ7CisgICAgaW50ICogb3V0bGVuOyAvKiB0aGUgbGVuZ3RoIG9mIEBvdXQgKi8KKyAgICBpbnQgbl9vdXRsZW47CisgICAgdW5zaWduZWQgY2hhciAqIGluOyAvKiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgSVNPIExhdGluIDEgY2hhcnMgKi8KKyAgICBpbnQgbl9pbjsKKyAgICBpbnQgKiBpbmxlbjsgLyogdGhlIGxlbmd0aCBvZiBAaW4gKi8KKyAgICBpbnQgbl9pbmxlbjsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX291dCA9IDA7bl9vdXQgPCBnZW5fbmJfdW5zaWduZWRfY2hhcl9wdHI7bl9vdXQrKykgeworICAgIGZvciAobl9vdXRsZW4gPSAwO25fb3V0bGVuIDwgZ2VuX25iX2ludF9wdHI7bl9vdXRsZW4rKykgeworICAgIGZvciAobl9pbiA9IDA7bl9pbiA8IGdlbl9uYl9jb25zdF91bnNpZ25lZF9jaGFyX3B0cjtuX2luKyspIHsKKyAgICBmb3IgKG5faW5sZW4gPSAwO25faW5sZW4gPCBnZW5fbmJfaW50X3B0cjtuX2lubGVuKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgb3V0ID0gZ2VuX3Vuc2lnbmVkX2NoYXJfcHRyKG5fb3V0LCAwKTsKKyAgICAgICAgb3V0bGVuID0gZ2VuX2ludF9wdHIobl9vdXRsZW4sIDEpOworICAgICAgICBpbiA9IGdlbl9jb25zdF91bnNpZ25lZF9jaGFyX3B0cihuX2luLCAyKTsKKyAgICAgICAgaW5sZW4gPSBnZW5faW50X3B0cihuX2lubGVuLCAzKTsKKworICAgICAgICByZXRfdmFsID0gaXNvbGF0MVRvVVRGOChvdXQsIG91dGxlbiwgaW4sIGlubGVuKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfdW5zaWduZWRfY2hhcl9wdHIobl9vdXQsIG91dCwgMCk7CisgICAgICAgIGRlc19pbnRfcHRyKG5fb3V0bGVuLCBvdXRsZW4sIDEpOworICAgICAgICBkZXNfY29uc3RfdW5zaWduZWRfY2hhcl9wdHIobl9pbiwgaW4sIDIpOworICAgICAgICBkZXNfaW50X3B0cihuX2lubGVuLCBpbmxlbiwgMyk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiBpc29sYXQxVG9VVEY4IiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXQpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dGxlbik7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW4pOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2lubGVuKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTM4NTcsOSArNDU4Miw5IEBACiAgICAgaW50IHJldCA9IDA7CiAKICAgICBpbnQgcmV0X3ZhbDsKLSAgICBjb25zdCBjaGFyICogbmFtZTsgLyogdGhlIGVuY29kaW5nIG5hbWUgYXMgcGFyc2VkLCBpbiBVVEYtOCBmb3JtYXQgKEFTQ0lJIGFjdHVhbGx5KSAqLworICAgIGNoYXIgKiBuYW1lOyAvKiB0aGUgZW5jb2RpbmcgbmFtZSBhcyBwYXJzZWQsIGluIFVURi04IGZvcm1hdCAoQVNDSUkgYWN0dWFsbHkpICovCiAgICAgaW50IG5fbmFtZTsKLSAgICBjb25zdCBjaGFyICogYWxpYXM7IC8qIHRoZSBhbGlhcyBuYW1lIGFzIHBhcnNlZCwgaW4gVVRGLTggZm9ybWF0IChBU0NJSSBhY3R1YWxseSkgKi8KKyAgICBjaGFyICogYWxpYXM7IC8qIHRoZSBhbGlhcyBuYW1lIGFzIHBhcnNlZCwgaW4gVVRGLTggZm9ybWF0IChBU0NJSSBhY3R1YWxseSkgKi8KICAgICBpbnQgbl9hbGlhczsKIAogICAgIGZvciAobl9uYW1lID0gMDtuX25hbWUgPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9uYW1lKyspIHsKQEAgLTM4ODEsMTIgKzQ2MDYsNDEgQEAKIH0KIAogCisjZGVmaW5lIGdlbl9uYl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyX3B0ciAxCitzdGF0aWMgeG1sQ2hhckVuY29kaW5nSGFuZGxlciAqIGdlbl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfeG1sQ2hhckVuY29kaW5nSGFuZGxlcl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbENoYXJFbmNvZGluZ0hhbmRsZXIgKiB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKK30KKwogc3RhdGljIGludAogdGVzdF94bWxDaGFyRW5jQ2xvc2VGdW5jKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB4bWxDaGFyRW5jb2RpbmdIYW5kbGVyICogaGFuZGxlcjsgLyogY2hhciBlbmNvbmRpbmcgdHJhbnNmb3JtYXRpb24gZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgICBpbnQgbl9oYW5kbGVyOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5faGFuZGxlciA9IDA7bl9oYW5kbGVyIDwgZ2VuX25iX3htbENoYXJFbmNvZGluZ0hhbmRsZXJfcHRyO25faGFuZGxlcisrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGhhbmRsZXIgPSBnZW5feG1sQ2hhckVuY29kaW5nSGFuZGxlcl9wdHIobl9oYW5kbGVyLCAwKTsKKworICAgICAgICByZXRfdmFsID0geG1sQ2hhckVuY0Nsb3NlRnVuYyhoYW5kbGVyKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sQ2hhckVuY29kaW5nSGFuZGxlcl9wdHIobl9oYW5kbGVyLCBoYW5kbGVyLCAwKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENoYXJFbmNDbG9zZUZ1bmMiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2hhbmRsZXIpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMzg5NSw4ICs0NjQ5LDQ0IEBACiB0ZXN0X3htbENoYXJFbmNGaXJzdExpbmUodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbENoYXJFbmNvZGluZ0hhbmRsZXIgKiBoYW5kbGVyOyAvKiBjaGFyIGVuY29uZGluZyB0cmFuc2Zvcm1hdGlvbiBkYXRhIHN0cnVjdHVyZSAqLworICAgIGludCBuX2hhbmRsZXI7CisgICAgeG1sQnVmZmVyUHRyIG91dDsgLyogYW4geG1sQnVmZmVyIGZvciB0aGUgb3V0cHV0LiAqLworICAgIGludCBuX291dDsKKyAgICB4bWxCdWZmZXJQdHIgaW47IC8qIGFuIHhtbEJ1ZmZlciBmb3IgdGhlIGlucHV0ICovCisgICAgaW50IG5faW47CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9oYW5kbGVyID0gMDtuX2hhbmRsZXIgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nSGFuZGxlcl9wdHI7bl9oYW5kbGVyKyspIHsKKyAgICBmb3IgKG5fb3V0ID0gMDtuX291dCA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9vdXQrKykgeworICAgIGZvciAobl9pbiA9IDA7bl9pbiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9pbisrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGhhbmRsZXIgPSBnZW5feG1sQ2hhckVuY29kaW5nSGFuZGxlcl9wdHIobl9oYW5kbGVyLCAwKTsKKyAgICAgICAgb3V0ID0gZ2VuX3htbEJ1ZmZlclB0cihuX291dCwgMSk7CisgICAgICAgIGluID0gZ2VuX3htbEJ1ZmZlclB0cihuX2luLCAyKTsKKworICAgICAgICByZXRfdmFsID0geG1sQ2hhckVuY0ZpcnN0TGluZShoYW5kbGVyLCBvdXQsIGluKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sQ2hhckVuY29kaW5nSGFuZGxlcl9wdHIobl9oYW5kbGVyLCBoYW5kbGVyLCAwKTsKKyAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX291dCwgb3V0LCAxKTsKKyAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2luLCBpbiwgMik7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxDaGFyRW5jRmlyc3RMaW5lIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9oYW5kbGVyKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXQpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2luKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMzkwNSw4ICs0Njk1LDQ0IEBACiB0ZXN0X3htbENoYXJFbmNJbkZ1bmModm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbENoYXJFbmNvZGluZ0hhbmRsZXIgKiBoYW5kbGVyOyAvKiBjaGFyIGVuY29kaW5nIHRyYW5zZm9ybWF0aW9uIGRhdGEgc3RydWN0dXJlICovCisgICAgaW50IG5faGFuZGxlcjsKKyAgICB4bWxCdWZmZXJQdHIgb3V0OyAvKiBhbiB4bWxCdWZmZXIgZm9yIHRoZSBvdXRwdXQuICovCisgICAgaW50IG5fb3V0OworICAgIHhtbEJ1ZmZlclB0ciBpbjsgLyogYW4geG1sQnVmZmVyIGZvciB0aGUgaW5wdXQgKi8KKyAgICBpbnQgbl9pbjsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2hhbmRsZXIgPSAwO25faGFuZGxlciA8IGdlbl9uYl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyX3B0cjtuX2hhbmRsZXIrKykgeworICAgIGZvciAobl9vdXQgPSAwO25fb3V0IDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX291dCsrKSB7CisgICAgZm9yIChuX2luID0gMDtuX2luIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2luKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgaGFuZGxlciA9IGdlbl94bWxDaGFyRW5jb2RpbmdIYW5kbGVyX3B0cihuX2hhbmRsZXIsIDApOworICAgICAgICBvdXQgPSBnZW5feG1sQnVmZmVyUHRyKG5fb3V0LCAxKTsKKyAgICAgICAgaW4gPSBnZW5feG1sQnVmZmVyUHRyKG5faW4sIDIpOworCisgICAgICAgIHJldF92YWwgPSB4bWxDaGFyRW5jSW5GdW5jKGhhbmRsZXIsIG91dCwgaW4pOworICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxDaGFyRW5jb2RpbmdIYW5kbGVyX3B0cihuX2hhbmRsZXIsIGhhbmRsZXIsIDApOworICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5fb3V0LCBvdXQsIDEpOworICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5faW4sIGluLCAyKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENoYXJFbmNJbkZ1bmMiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2hhbmRsZXIpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW4pOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0zOTE1LDggKzQ3NDEsNDQgQEAKIHRlc3RfeG1sQ2hhckVuY091dEZ1bmModm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbENoYXJFbmNvZGluZ0hhbmRsZXIgKiBoYW5kbGVyOyAvKiBjaGFyIGVuY29uZGluZyB0cmFuc2Zvcm1hdGlvbiBkYXRhIHN0cnVjdHVyZSAqLworICAgIGludCBuX2hhbmRsZXI7CisgICAgeG1sQnVmZmVyUHRyIG91dDsgLyogYW4geG1sQnVmZmVyIGZvciB0aGUgb3V0cHV0LiAqLworICAgIGludCBuX291dDsKKyAgICB4bWxCdWZmZXJQdHIgaW47IC8qIGFuIHhtbEJ1ZmZlciBmb3IgdGhlIGlucHV0ICovCisgICAgaW50IG5faW47CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9oYW5kbGVyID0gMDtuX2hhbmRsZXIgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nSGFuZGxlcl9wdHI7bl9oYW5kbGVyKyspIHsKKyAgICBmb3IgKG5fb3V0ID0gMDtuX291dCA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9vdXQrKykgeworICAgIGZvciAobl9pbiA9IDA7bl9pbiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9pbisrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGhhbmRsZXIgPSBnZW5feG1sQ2hhckVuY29kaW5nSGFuZGxlcl9wdHIobl9oYW5kbGVyLCAwKTsKKyAgICAgICAgb3V0ID0gZ2VuX3htbEJ1ZmZlclB0cihuX291dCwgMSk7CisgICAgICAgIGluID0gZ2VuX3htbEJ1ZmZlclB0cihuX2luLCAyKTsKKworICAgICAgICByZXRfdmFsID0geG1sQ2hhckVuY091dEZ1bmMoaGFuZGxlciwgb3V0LCBpbik7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZ0hhbmRsZXJfcHRyKG5faGFuZGxlciwgaGFuZGxlciwgMCk7CisgICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9vdXQsIG91dCwgMSk7CisgICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9pbiwgaW4sIDIpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ2hhckVuY091dEZ1bmMiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2hhbmRsZXIpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW4pOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0zOTY1LDcgKzQ4MjcsNyBAQAogCiAgICAgaW50IG1lbV9iYXNlOwogICAgIGludCByZXRfdmFsOwotICAgIGNvbnN0IGNoYXIgKiBhbGlhczsgLyogdGhlIGFsaWFzIG5hbWUgYXMgcGFyc2VkLCBpbiBVVEYtOCBmb3JtYXQgKEFTQ0lJIGFjdHVhbGx5KSAqLworICAgIGNoYXIgKiBhbGlhczsgLyogdGhlIGFsaWFzIG5hbWUgYXMgcGFyc2VkLCBpbiBVVEYtOCBmb3JtYXQgKEFTQ0lJIGFjdHVhbGx5KSAqLwogICAgIGludCBuX2FsaWFzOwogCiAgICAgZm9yIChuX2FsaWFzID0gMDtuX2FsaWFzIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fYWxpYXMrKykgewpAQCAtMzk5NSw4ICs0ODU3LDM3IEBACiB0ZXN0X3htbERldGVjdENoYXJFbmNvZGluZyh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgeG1sQ2hhckVuY29kaW5nIHJldF92YWw7CisgICAgdW5zaWduZWQgY2hhciAqIGluOyAvKiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ5dGVzIG9mIHRoZSBYTUwgZW50aXR5LCBtdXN0IGJlIGF0IGxlYXN0IDIgYnl0ZXMgbG9uZyAoYXQgbGVhc3QgNCBpZiBlbmNvZGluZyBpcyBVVEY0IHZhcmlhbnQpLiAqLworICAgIGludCBuX2luOworICAgIGludCBsZW47IC8qIHBvaW50ZXIgdG8gdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyICovCisgICAgaW50IG5fbGVuOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5faW4gPSAwO25faW4gPCBnZW5fbmJfY29uc3RfdW5zaWduZWRfY2hhcl9wdHI7bl9pbisrKSB7CisgICAgZm9yIChuX2xlbiA9IDA7bl9sZW4gPCBnZW5fbmJfaW50O25fbGVuKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgaW4gPSBnZW5fY29uc3RfdW5zaWduZWRfY2hhcl9wdHIobl9pbiwgMCk7CisgICAgICAgIGxlbiA9IGdlbl9pbnQobl9sZW4sIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxEZXRlY3RDaGFyRW5jb2RpbmcoaW4sIGxlbik7CisgICAgICAgIGRlc3JldF94bWxDaGFyRW5jb2RpbmcocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyKG5faW4sIGluLCAwKTsKKyAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERldGVjdENoYXJFbmNvZGluZyIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW4pOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtNDA1OSw3ICs0OTUwLDcgQEAKIAogICAgIGludCBtZW1fYmFzZTsKICAgICBjb25zdCBjaGFyICogcmV0X3ZhbDsKLSAgICBjb25zdCBjaGFyICogYWxpYXM7IC8qIHRoZSBhbGlhcyBuYW1lIGFzIHBhcnNlZCwgaW4gVVRGLTggZm9ybWF0IChBU0NJSSBhY3R1YWxseSkgKi8KKyAgICBjaGFyICogYWxpYXM7IC8qIHRoZSBhbGlhcyBuYW1lIGFzIHBhcnNlZCwgaW4gVVRGLTggZm9ybWF0IChBU0NJSSBhY3R1YWxseSkgKi8KICAgICBpbnQgbl9hbGlhczsKIAogICAgIGZvciAobl9hbGlhcyA9IDA7bl9hbGlhcyA8IGdlbl9uYl9jb25zdF9jaGFyX3B0cjtuX2FsaWFzKyspIHsKQEAgLTQxMTYsNyArNTAwNyw3IEBACiAKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgeG1sQ2hhckVuY29kaW5nIHJldF92YWw7Ci0gICAgY29uc3QgY2hhciAqIG5hbWU7IC8qIHRoZSBlbmNvZGluZyBuYW1lIGFzIHBhcnNlZCwgaW4gVVRGLTggZm9ybWF0IChBU0NJSSBhY3R1YWxseSkgKi8KKyAgICBjaGFyICogbmFtZTsgLyogdGhlIGVuY29kaW5nIG5hbWUgYXMgcGFyc2VkLCBpbiBVVEYtOCBmb3JtYXQgKEFTQ0lJIGFjdHVhbGx5KSAqLwogICAgIGludCBuX25hbWU7CiAKICAgICBmb3IgKG5fbmFtZSA9IDA7bl9uYW1lIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fbmFtZSsrKSB7CkBAIC00MTQyLDEyICs1MDMzLDM5IEBACiB9CiAKIAorI2RlZmluZSBnZW5fbmJfeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0ciAxCitzdGF0aWMgeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0ciBnZW5feG1sQ2hhckVuY29kaW5nSGFuZGxlclB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKK30KKwogc3RhdGljIGludAogdGVzdF94bWxSZWdpc3RlckNoYXJFbmNvZGluZ0hhbmRsZXIodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIgaGFuZGxlcjsgLyogdGhlIHhtbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIgaGFuZGxlciBibG9jayAqLworICAgIGludCBuX2hhbmRsZXI7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9oYW5kbGVyID0gMDtuX2hhbmRsZXIgPCBnZW5fbmJfeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0cjtuX2hhbmRsZXIrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBoYW5kbGVyID0gZ2VuX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIobl9oYW5kbGVyLCAwKTsKKworICAgICAgICB4bWxSZWdpc3RlckNoYXJFbmNvZGluZ0hhbmRsZXIoaGFuZGxlcik7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbENoYXJFbmNvZGluZ0hhbmRsZXJQdHIobl9oYW5kbGVyLCBoYW5kbGVyLCAwKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlZ2lzdGVyQ2hhckVuY29kaW5nSGFuZGxlciIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faGFuZGxlcik7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC00MTU1LDcgKzUwNzMsNyBAQAogdGVzdF9lbmNvZGluZyh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKLSAgICBwcmludGYoIlRlc3RpbmcgZW5jb2RpbmcgOiA4IG9mIDE5IGZ1bmN0aW9ucyAuLi5cbiIpOworICAgIHByaW50ZigiVGVzdGluZyBlbmNvZGluZyA6IDE2IG9mIDE5IGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgIHJldCArPSB0ZXN0X1VURjhUb2lzb2xhdDEoKTsKICAgICByZXQgKz0gdGVzdF9pc29sYXQxVG9VVEY4KCk7CiAgICAgcmV0ICs9IHRlc3RfeG1sQWRkRW5jb2RpbmdBbGlhcygpOwpAQCAtNDIyNCw2ICs1MTQyLDEzIEBACiB9CiAKIAorI2RlZmluZSBnZW5fbmJfeG1sRW50aXRpZXNUYWJsZVB0ciAxCitzdGF0aWMgeG1sRW50aXRpZXNUYWJsZVB0ciBnZW5feG1sRW50aXRpZXNUYWJsZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfeG1sRW50aXRpZXNUYWJsZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sRW50aXRpZXNUYWJsZVB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKK30KKwogc3RhdGljIGludAogdGVzdF94bWxDb3B5RW50aXRpZXNUYWJsZSh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CkBAIC00MjQ4LDE4ICs1MTczLDgzIEBACiB0ZXN0X3htbER1bXBFbnRpdGllc1RhYmxlKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9PVVRQVVRfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiBBbiBYTUwgYnVmZmVyLiAqLworICAgIGludCBuX2J1ZjsKKyAgICB4bWxFbnRpdGllc1RhYmxlUHRyIHRhYmxlOyAvKiBBbiBlbnRpdHkgdGFibGUgKi8KKyAgICBpbnQgbl90YWJsZTsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKKyAgICBmb3IgKG5fdGFibGUgPSAwO25fdGFibGUgPCBnZW5fbmJfeG1sRW50aXRpZXNUYWJsZVB0cjtuX3RhYmxlKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CisgICAgICAgIHRhYmxlID0gZ2VuX3htbEVudGl0aWVzVGFibGVQdHIobl90YWJsZSwgMSk7CisKKyAgICAgICAgeG1sRHVtcEVudGl0aWVzVGFibGUoYnVmLCB0YWJsZSk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKKyAgICAgICAgZGVzX3htbEVudGl0aWVzVGFibGVQdHIobl90YWJsZSwgdGFibGUsIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRHVtcEVudGl0aWVzVGFibGUiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdGFibGUpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIAogCisjZGVmaW5lIGdlbl9uYl94bWxFbnRpdHlQdHIgMQorc3RhdGljIHhtbEVudGl0eVB0ciBnZW5feG1sRW50aXR5UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworICAgIHJldHVybihOVUxMKTsKK30KK3N0YXRpYyB2b2lkIGRlc194bWxFbnRpdHlQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbEVudGl0eVB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKK30KKwogc3RhdGljIGludAogdGVzdF94bWxEdW1wRW50aXR5RGVjbCh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfT1VUUFVUX0VOQUJMRUQKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogQW4gWE1MIGJ1ZmZlci4gKi8KKyAgICBpbnQgbl9idWY7CisgICAgeG1sRW50aXR5UHRyIGVudDsgLyogQW4gZW50aXR5IHRhYmxlICovCisgICAgaW50IG5fZW50OwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgeworICAgIGZvciAobl9lbnQgPSAwO25fZW50IDwgZ2VuX25iX3htbEVudGl0eVB0cjtuX2VudCsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOworICAgICAgICBlbnQgPSBnZW5feG1sRW50aXR5UHRyKG5fZW50LCAxKTsKKworICAgICAgICB4bWxEdW1wRW50aXR5RGVjbChidWYsIGVudCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKKyAgICAgICAgZGVzX3htbEVudGl0eVB0cihuX2VudCwgZW50LCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbER1bXBFbnRpdHlEZWNsIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VudCk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC00MjcyLDcgKzUyNjIsNyBAQAogICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoZSBzdHJpbmcgKi8KICAgICBpbnQgbl9kb2M7Ci0gICAgY29uc3QgeG1sQ2hhciAqIGlucHV0OyAvKiBBIHN0cmluZyB0byBjb252ZXJ0IHRvIFhNTC4gKi8KKyAgICB4bWxDaGFyICogaW5wdXQ7IC8qIEEgc3RyaW5nIHRvIGNvbnZlcnQgdG8gWE1MLiAqLwogICAgIGludCBuX2lucHV0OwogCiAgICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKQEAgLTQzMTEsNyArNTMwMSw3IEBACiAgICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhlIHN0cmluZyAqLwogICAgIGludCBuX2RvYzsKLSAgICBjb25zdCB4bWxDaGFyICogaW5wdXQ7IC8qIEEgc3RyaW5nIHRvIGNvbnZlcnQgdG8gWE1MLiAqLworICAgIHhtbENoYXIgKiBpbnB1dDsgLyogQSBzdHJpbmcgdG8gY29udmVydCB0byBYTUwuICovCiAgICAgaW50IG5faW5wdXQ7CiAKICAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewpAQCAtNDQwOCw3ICs1Mzk4LDcgQEAKIHRlc3RfZW50aXRpZXModm9pZCkgewogICAgIGludCByZXQgPSAwOwogCi0gICAgcHJpbnRmKCJUZXN0aW5nIGVudGl0aWVzIDogNCBvZiAxNiBmdW5jdGlvbnMgLi4uXG4iKTsKKyAgICBwcmludGYoIlRlc3RpbmcgZW50aXRpZXMgOiA2IG9mIDE2IGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgIHJldCArPSB0ZXN0X3htbEFkZERvY0VudGl0eSgpOwogICAgIHJldCArPSB0ZXN0X3htbEFkZER0ZEVudGl0eSgpOwogICAgIHJldCArPSB0ZXN0X3htbENsZWFudXBQcmVkZWZpbmVkRW50aXRpZXMoKTsKQEAgLTQ0MzcsNyArNTQyNyw3IEBACiAgICAgaW50IHJldF92YWw7CiAgICAgeG1sSGFzaFRhYmxlUHRyIHRhYmxlOyAvKiB0aGUgaGFzaCB0YWJsZSAqLwogICAgIGludCBuX3RhYmxlOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KKyAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICAgaW50IG5fbmFtZTsKICAgICB2b2lkICogdXNlcmRhdGE7IC8qIGEgcG9pbnRlciB0byB0aGUgdXNlcmRhdGEgKi8KICAgICBpbnQgbl91c2VyZGF0YTsKQEAgLTQ0ODMsOSArNTQ3Myw5IEBACiAgICAgaW50IHJldF92YWw7CiAgICAgeG1sSGFzaFRhYmxlUHRyIHRhYmxlOyAvKiB0aGUgaGFzaCB0YWJsZSAqLwogICAgIGludCBuX3RhYmxlOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KKyAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICAgaW50IG5fbmFtZTsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTI7IC8qIGEgc2Vjb25kIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCisgICAgeG1sQ2hhciAqIG5hbWUyOyAvKiBhIHNlY29uZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgIGludCBuX25hbWUyOwogICAgIHZvaWQgKiB1c2VyZGF0YTsgLyogYSBwb2ludGVyIHRvIHRoZSB1c2VyZGF0YSAqLwogICAgIGludCBuX3VzZXJkYXRhOwpAQCAtNDUzNiwxMSArNTUyNiwxMSBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbEhhc2hUYWJsZVB0ciB0YWJsZTsgLyogdGhlIGhhc2ggdGFibGUgKi8KICAgICBpbnQgbl90YWJsZTsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgIGludCBuX25hbWU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWUyOyAvKiBhIHNlY29uZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLworICAgIHhtbENoYXIgKiBuYW1lMjsgLyogYSBzZWNvbmQgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgICBpbnQgbl9uYW1lMjsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTM7IC8qIGEgdGhpcmQgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KKyAgICB4bWxDaGFyICogbmFtZTM7IC8qIGEgdGhpcmQgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgICBpbnQgbl9uYW1lMzsKICAgICB2b2lkICogdXNlcmRhdGE7IC8qIGEgcG9pbnRlciB0byB0aGUgdXNlcmRhdGEgKi8KICAgICBpbnQgbl91c2VyZGF0YTsKQEAgLTQ2MTYsNyArNTYwNiw3IEBACiAgICAgdm9pZCAqIHJldF92YWw7CiAgICAgeG1sSGFzaFRhYmxlUHRyIHRhYmxlOyAvKiB0aGUgaGFzaCB0YWJsZSAqLwogICAgIGludCBuX3RhYmxlOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KKyAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICAgaW50IG5fbmFtZTsKIAogICAgIGZvciAobl90YWJsZSA9IDA7bl90YWJsZSA8IGdlbl9uYl94bWxIYXNoVGFibGVQdHI7bl90YWJsZSsrKSB7CkBAIC00NjU1LDkgKzU2NDUsOSBAQAogICAgIHZvaWQgKiByZXRfdmFsOwogICAgIHhtbEhhc2hUYWJsZVB0ciB0YWJsZTsgLyogdGhlIGhhc2ggdGFibGUgKi8KICAgICBpbnQgbl90YWJsZTsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgIGludCBuX25hbWU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWUyOyAvKiBhIHNlY29uZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLworICAgIHhtbENoYXIgKiBuYW1lMjsgLyogYSBzZWNvbmQgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgICBpbnQgbl9uYW1lMjsKIAogICAgIGZvciAobl90YWJsZSA9IDA7bl90YWJsZSA8IGdlbl9uYl94bWxIYXNoVGFibGVQdHI7bl90YWJsZSsrKSB7CkBAIC00NzAxLDExICs1NjkxLDExIEBACiAgICAgdm9pZCAqIHJldF92YWw7CiAgICAgeG1sSGFzaFRhYmxlUHRyIHRhYmxlOyAvKiB0aGUgaGFzaCB0YWJsZSAqLwogICAgIGludCBuX3RhYmxlOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KKyAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICAgaW50IG5fbmFtZTsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTI7IC8qIGEgc2Vjb25kIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCisgICAgeG1sQ2hhciAqIG5hbWUyOyAvKiBhIHNlY29uZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgIGludCBuX25hbWUyOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lMzsgLyogYSB0aGlyZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLworICAgIHhtbENoYXIgKiBuYW1lMzsgLyogYSB0aGlyZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgIGludCBuX25hbWUzOwogCiAgICAgZm9yIChuX3RhYmxlID0gMDtuX3RhYmxlIDwgZ2VuX25iX3htbEhhc2hUYWJsZVB0cjtuX3RhYmxlKyspIHsKQEAgLTQ3NTQsOSArNTc0NCw5IEBACiAgICAgdm9pZCAqIHJldF92YWw7CiAgICAgeG1sSGFzaFRhYmxlUHRyIHRhYmxlOyAvKiB0aGUgaGFzaCB0YWJsZSAqLwogICAgIGludCBuX3RhYmxlOwotICAgIGNvbnN0IHhtbENoYXIgKiBwcmVmaXg7IC8qIHRoZSBwcmVmaXggb2YgdGhlIHVzZXJkYXRhICovCisgICAgeG1sQ2hhciAqIHByZWZpeDsgLyogdGhlIHByZWZpeCBvZiB0aGUgdXNlcmRhdGEgKi8KICAgICBpbnQgbl9wcmVmaXg7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgICBpbnQgbl9uYW1lOwogCiAgICAgZm9yIChuX3RhYmxlID0gMDtuX3RhYmxlIDwgZ2VuX25iX3htbEhhc2hUYWJsZVB0cjtuX3RhYmxlKyspIHsKQEAgLTQ4MDAsMTMgKzU3OTAsMTMgQEAKICAgICB2b2lkICogcmV0X3ZhbDsKICAgICB4bWxIYXNoVGFibGVQdHIgdGFibGU7IC8qIHRoZSBoYXNoIHRhYmxlICovCiAgICAgaW50IG5fdGFibGU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHByZWZpeDsgLyogdGhlIHByZWZpeCBvZiB0aGUgdXNlcmRhdGEgKi8KKyAgICB4bWxDaGFyICogcHJlZml4OyAvKiB0aGUgcHJlZml4IG9mIHRoZSB1c2VyZGF0YSAqLwogICAgIGludCBuX3ByZWZpeDsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgIGludCBuX25hbWU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHByZWZpeDI7IC8qIHRoZSBzZWNvbmQgcHJlZml4IG9mIHRoZSB1c2VyZGF0YSAqLworICAgIHhtbENoYXIgKiBwcmVmaXgyOyAvKiB0aGUgc2Vjb25kIHByZWZpeCBvZiB0aGUgdXNlcmRhdGEgKi8KICAgICBpbnQgbl9wcmVmaXgyOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lMjsgLyogYSBzZWNvbmQgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KKyAgICB4bWxDaGFyICogbmFtZTI7IC8qIGEgc2Vjb25kIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICAgaW50IG5fbmFtZTI7CiAKICAgICBmb3IgKG5fdGFibGUgPSAwO25fdGFibGUgPCBnZW5fbmJfeG1sSGFzaFRhYmxlUHRyO25fdGFibGUrKykgewpAQCAtNDg2MCwxNyArNTg1MCwxNyBAQAogICAgIHZvaWQgKiByZXRfdmFsOwogICAgIHhtbEhhc2hUYWJsZVB0ciB0YWJsZTsgLyogdGhlIGhhc2ggdGFibGUgKi8KICAgICBpbnQgbl90YWJsZTsKLSAgICBjb25zdCB4bWxDaGFyICogcHJlZml4OyAvKiB0aGUgcHJlZml4IG9mIHRoZSB1c2VyZGF0YSAqLworICAgIHhtbENoYXIgKiBwcmVmaXg7IC8qIHRoZSBwcmVmaXggb2YgdGhlIHVzZXJkYXRhICovCiAgICAgaW50IG5fcHJlZml4OwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KKyAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIHVzZXJkYXRhICovCiAgICAgaW50IG5fbmFtZTsKLSAgICBjb25zdCB4bWxDaGFyICogcHJlZml4MjsgLyogdGhlIHNlY29uZCBwcmVmaXggb2YgdGhlIHVzZXJkYXRhICovCisgICAgeG1sQ2hhciAqIHByZWZpeDI7IC8qIHRoZSBzZWNvbmQgcHJlZml4IG9mIHRoZSB1c2VyZGF0YSAqLwogICAgIGludCBuX3ByZWZpeDI7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWUyOyAvKiBhIHNlY29uZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLworICAgIHhtbENoYXIgKiBuYW1lMjsgLyogYSBzZWNvbmQgbmFtZSBvZiB0aGUgdXNlcmRhdGEgKi8KICAgICBpbnQgbl9uYW1lMjsKLSAgICBjb25zdCB4bWxDaGFyICogcHJlZml4MzsgLyogdGhlIHRoaXJkIHByZWZpeCBvZiB0aGUgdXNlcmRhdGEgKi8KKyAgICB4bWxDaGFyICogcHJlZml4MzsgLyogdGhlIHRoaXJkIHByZWZpeCBvZiB0aGUgdXNlcmRhdGEgKi8KICAgICBpbnQgbl9wcmVmaXgzOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lMzsgLyogYSB0aGlyZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLworICAgIHhtbENoYXIgKiBuYW1lMzsgLyogYSB0aGlyZCBuYW1lIG9mIHRoZSB1c2VyZGF0YSAqLwogICAgIGludCBuX25hbWUzOwogCiAgICAgZm9yIChuX3RhYmxlID0gMDtuX3RhYmxlIDwgZ2VuX25iX3htbEhhc2hUYWJsZVB0cjtuX3RhYmxlKyspIHsKQEAgLTUwOTAsMTIgKzYwODAsNDEgQEAKICAgICByZXR1cm4ocmV0KTsKIH0KIAorI2RlZmluZSBnZW5fbmJfeG1sTGlua1B0ciAxCitzdGF0aWMgeG1sTGlua1B0ciBnZW5feG1sTGlua1B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfeG1sTGlua1B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sTGlua1B0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKK30KKwogc3RhdGljIGludAogdGVzdF94bWxMaW5rR2V0RGF0YSh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgdm9pZCAqIHJldF92YWw7CisgICAgeG1sTGlua1B0ciBsazsgLyogYSBsaW5rICovCisgICAgaW50IG5fbGs7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9sayA9IDA7bl9sayA8IGdlbl9uYl94bWxMaW5rUHRyO25fbGsrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBsayA9IGdlbl94bWxMaW5rUHRyKG5fbGssIDApOworCisgICAgICAgIHJldF92YWwgPSB4bWxMaW5rR2V0RGF0YShsayk7CisgICAgICAgIGRlc3JldF92b2lkX3B0cihyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sTGlua1B0cihuX2xrLCBsaywgMCk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxMaW5rR2V0RGF0YSIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGspOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtNTE2OSwxMiArNjE4OCw0OCBAQAogfQogCiAKKyNkZWZpbmUgZ2VuX25iX2NvbnN0X3htbExpc3RQdHIgMQorc3RhdGljIHhtbExpc3RQdHIgZ2VuX2NvbnN0X3htbExpc3RQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX2NvbnN0X3htbExpc3RQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbExpc3RQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cit9CisKIHN0YXRpYyBpbnQKIHRlc3RfeG1sTGlzdENvcHkodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbExpc3RQdHIgY3VyOyAvKiB0aGUgbmV3IGxpc3QgKi8KKyAgICBpbnQgbl9jdXI7CisgICAgeG1sTGlzdFB0ciBvbGQ7IC8qIHRoZSBvbGQgbGlzdCAqLworICAgIGludCBuX29sZDsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTGlzdFB0cjtuX2N1cisrKSB7CisgICAgZm9yIChuX29sZCA9IDA7bl9vbGQgPCBnZW5fbmJfY29uc3RfeG1sTGlzdFB0cjtuX29sZCsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGN1ciA9IGdlbl94bWxMaXN0UHRyKG5fY3VyLCAwKTsKKyAgICAgICAgb2xkID0gZ2VuX2NvbnN0X3htbExpc3RQdHIobl9vbGQsIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxMaXN0Q29weShjdXIsIG9sZCk7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbExpc3RQdHIobl9jdXIsIGN1ciwgMCk7CisgICAgICAgIGRlc19jb25zdF94bWxMaXN0UHRyKG5fb2xkLCBvbGQsIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sTGlzdENvcHkiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb2xkKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC01Nzc1LDcgKzY4MzAsNyBAQAogdGVzdF9saXN0KHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAotICAgIHByaW50ZigiVGVzdGluZyBsaXN0IDogMTcgb2YgMjYgZnVuY3Rpb25zIC4uLlxuIik7CisgICAgcHJpbnRmKCJUZXN0aW5nIGxpc3QgOiAxOSBvZiAyNiBmdW5jdGlvbnMgLi4uXG4iKTsKICAgICByZXQgKz0gdGVzdF94bWxMaW5rR2V0RGF0YSgpOwogICAgIHJldCArPSB0ZXN0X3htbExpc3RBcHBlbmQoKTsKICAgICByZXQgKz0gdGVzdF94bWxMaXN0Q2xlYXIoKTsKQEAgLTU5MDksNyArNjk2NCw3IEBACiAgICAgaW50IHJldF92YWw7CiAgICAgdm9pZCAqIGN0eDsgLyogYW4gRlRQIGNvbnRleHQgKi8KICAgICBpbnQgbl9jdHg7Ci0gICAgY29uc3QgY2hhciAqIGRpcmVjdG9yeTsgLyogYSBkaXJlY3Rvcnkgb24gdGhlIHNlcnZlciAqLworICAgIGNoYXIgKiBkaXJlY3Rvcnk7IC8qIGEgZGlyZWN0b3J5IG9uIHRoZSBzZXJ2ZXIgKi8KICAgICBpbnQgbl9kaXJlY3Rvcnk7CiAKICAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl94bWxOYW5vRlRQQ3R4dFB0cjtuX2N0eCsrKSB7CkBAIC02MTg1LDEzICs3MjQwLDEzIEBACiAgICAgaW50IHJldCA9IDA7CiAKICNpZmRlZiBMSUJYTUxfRlRQX0VOQUJMRUQKLSAgICBjb25zdCBjaGFyICogaG9zdDsgLyogdGhlIHByb3h5IGhvc3QgbmFtZSAqLworICAgIGNoYXIgKiBob3N0OyAvKiB0aGUgcHJveHkgaG9zdCBuYW1lICovCiAgICAgaW50IG5faG9zdDsKICAgICBpbnQgcG9ydDsgLyogdGhlIHByb3h5IHBvcnQgKi8KICAgICBpbnQgbl9wb3J0OwotICAgIGNvbnN0IGNoYXIgKiB1c2VyOyAvKiB0aGUgcHJveHkgdXNlciBuYW1lICovCisgICAgY2hhciAqIHVzZXI7IC8qIHRoZSBwcm94eSB1c2VyIG5hbWUgKi8KICAgICBpbnQgbl91c2VyOwotICAgIGNvbnN0IGNoYXIgKiBwYXNzd2Q7IC8qIHRoZSBwcm94eSBwYXNzd29yZCAqLworICAgIGNoYXIgKiBwYXNzd2Q7IC8qIHRoZSBwcm94eSBwYXNzd29yZCAqLwogICAgIGludCBuX3Bhc3N3ZDsKICAgICBpbnQgdHlwZTsgLyogdGhlIHR5cGUgb2YgcHJveHkgMSBmb3IgdXNpbmcgU0lURSwgMiBmb3IgVVNFUiBhQGIgKi8KICAgICBpbnQgbl90eXBlOwpAQCAtNjg4NiwxMiArNzk0MSwzOSBAQAogfQogCiAKKyNkZWZpbmUgZ2VuX25iX3htbFBhcnNlck5vZGVJbmZvU2VxUHRyIDEKK3N0YXRpYyB4bWxQYXJzZXJOb2RlSW5mb1NlcVB0ciBnZW5feG1sUGFyc2VyTm9kZUluZm9TZXFQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX3htbFBhcnNlck5vZGVJbmZvU2VxUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxQYXJzZXJOb2RlSW5mb1NlcVB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKK30KKwogc3RhdGljIGludAogdGVzdF94bWxDbGVhck5vZGVJbmZvU2VxKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorICAgIGludCBtZW1fYmFzZTsKKyAgICB4bWxQYXJzZXJOb2RlSW5mb1NlcVB0ciBzZXE7IC8qIGEgbm9kZSBpbmZvIHNlcXVlbmNlIHBvaW50ZXIgKi8KKyAgICBpbnQgbl9zZXE7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9zZXEgPSAwO25fc2VxIDwgZ2VuX25iX3htbFBhcnNlck5vZGVJbmZvU2VxUHRyO25fc2VxKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgc2VxID0gZ2VuX3htbFBhcnNlck5vZGVJbmZvU2VxUHRyKG5fc2VxLCAwKTsKKworICAgICAgICB4bWxDbGVhck5vZGVJbmZvU2VxKHNlcSk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbFBhcnNlck5vZGVJbmZvU2VxUHRyKG5fc2VxLCBzZXEsIDApOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ2xlYXJOb2RlSW5mb1NlcSIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2VxKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTY5MzIsNyArODAxNCw3IEBACiAKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgeG1sUGFyc2VyQ3R4dFB0ciByZXRfdmFsOwotICAgIGNvbnN0IHhtbENoYXIgKiBjdXI7IC8qIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiB4bWxDaGFyICovCisgICAgeG1sQ2hhciAqIGN1cjsgLyogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHhtbENoYXIgKi8KICAgICBpbnQgbl9jdXI7CiAKICAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2N1cisrKSB7CkBAIC02OTc5LDcgKzgwNjEsNyBAQAogICAgIGludCBuX3NheDsKICAgICB2b2lkICogdXNlcl9kYXRhOyAvKiBUaGUgdXNlciBkYXRhIHJldHVybmVkIG9uIFNBWCBjYWxsYmFja3MgKi8KICAgICBpbnQgbl91c2VyX2RhdGE7Ci0gICAgY29uc3QgY2hhciAqIGNodW5rOyAvKiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY2hhcnMgKi8KKyAgICBjaGFyICogY2h1bms7IC8qIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBjaGFycyAqLwogICAgIGludCBuX2NodW5rOwogICAgIGludCBzaXplOyAvKiBudW1iZXIgb2YgY2hhcnMgaW4gdGhlIGFycmF5ICovCiAgICAgaW50IG5fc2l6ZTsKQEAgLTcwMzgsMTEgKzgxMjAsMTEgQEAKICAgICB4bWxEb2NQdHIgcmV0X3ZhbDsKICAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgIGludCBuX2N0eHQ7Ci0gICAgY29uc3QgeG1sQ2hhciAqIGN1cjsgLyogYSBwb2ludGVyIHRvIGEgemVybyB0ZXJtaW5hdGVkIHN0cmluZyAqLworICAgIHhtbENoYXIgKiBjdXI7IC8qIGEgcG9pbnRlciB0byBhIHplcm8gdGVybWluYXRlZCBzdHJpbmcgKi8KICAgICBpbnQgbl9jdXI7CiAgICAgY29uc3QgY2hhciAqIFVSTDsgLyogdGhlIGJhc2UgVVJMIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50ICovCiAgICAgaW50IG5fVVJMOwotICAgIGNvbnN0IGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCisgICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgICBpbnQgbl9lbmNvZGluZzsKICAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24gKi8KICAgICBpbnQgbl9vcHRpb25zOwpAQCAtNzEwMCw3ICs4MTgyLDcgQEAKICAgICBpbnQgbl9jdHh0OwogICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogYSBmaWxlIG9yIFVSTCAqLwogICAgIGludCBuX2ZpbGVuYW1lOwotICAgIGNvbnN0IGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCisgICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgICBpbnQgbl9lbmNvZGluZzsKICAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24gKi8KICAgICBpbnQgbl9vcHRpb25zOwpAQCAtNzE1MSwxMyArODIzMywxMyBAQAogICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1MIHBhcnNlciBjb250ZXh0ICovCiAgICAgaW50IG5fY3R4dDsKLSAgICBjb25zdCBjaGFyICogYnVmZmVyOyAvKiBhIHBvaW50ZXIgdG8gYSBjaGFyIGFycmF5ICovCisgICAgY2hhciAqIGJ1ZmZlcjsgLyogYSBwb2ludGVyIHRvIGEgY2hhciBhcnJheSAqLwogICAgIGludCBuX2J1ZmZlcjsKICAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgb2YgdGhlIGFycmF5ICovCiAgICAgaW50IG5fc2l6ZTsKICAgICBjb25zdCBjaGFyICogVVJMOyAvKiB0aGUgYmFzZSBVUkwgdG8gdXNlIGZvciB0aGUgZG9jdW1lbnQgKi8KICAgICBpbnQgbl9VUkw7Ci0gICAgY29uc3QgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KKyAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgIGludCBuX2VuY29kaW5nOwogICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIHhtbFBhcnNlck9wdGlvbiAqLwogICAgIGludCBuX29wdGlvbnM7CkBAIC03MjQ4LDEzICs4MzMwLDEzIEBACiAgICAgaW50IHJldF92YWw7CiAgICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OyAvKiBhbiBYTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgICBpbnQgbl9jdHh0OwotICAgIGNvbnN0IGNoYXIgKiBjaHVuazsgLyogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNoYXJzICovCisgICAgY2hhciAqIGNodW5rOyAvKiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY2hhcnMgKi8KICAgICBpbnQgbl9jaHVuazsKICAgICBpbnQgc2l6ZTsgLyogbnVtYmVyIG9mIGNoYXJzIGluIHRoZSBhcnJheSAqLwogICAgIGludCBuX3NpemU7CiAgICAgY29uc3QgY2hhciAqIGZpbGVuYW1lOyAvKiBhbiBvcHRpb25hbCBmaWxlIG5hbWUgb3IgVVJJICovCiAgICAgaW50IG5fZmlsZW5hbWU7Ci0gICAgY29uc3QgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KKyAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgIGludCBuX2VuY29kaW5nOwogCiAgICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CkBAIC03MzU3LDcgKzg0MzksNyBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsgLyogYW4gWE1ML0hUTUwgcGFyc2VyIGNvbnRleHQgKi8KICAgICBpbnQgbl9jdHh0OwotICAgIGNvbnN0IGNoYXIgKiBuYW1lOyAvKiB0aGUgZmVhdHVyZSBuYW1lICovCisgICAgY2hhciAqIG5hbWU7IC8qIHRoZSBmZWF0dXJlIG5hbWUgKi8KICAgICBpbnQgbl9uYW1lOwogICAgIHZvaWQgKiByZXN1bHQ7IC8qIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSByZXN1bHQgKi8KICAgICBpbnQgbl9yZXN1bHQ7CkBAIC03NDU2LDggKzg1MzgsMjggQEAKIHRlc3RfeG1sSW5pdE5vZGVJbmZvU2VxKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorICAgIGludCBtZW1fYmFzZTsKKyAgICB4bWxQYXJzZXJOb2RlSW5mb1NlcVB0ciBzZXE7IC8qIGEgbm9kZSBpbmZvIHNlcXVlbmNlIHBvaW50ZXIgKi8KKyAgICBpbnQgbl9zZXE7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9zZXEgPSAwO25fc2VxIDwgZ2VuX25iX3htbFBhcnNlck5vZGVJbmZvU2VxUHRyO25fc2VxKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgc2VxID0gZ2VuX3htbFBhcnNlck5vZGVJbmZvU2VxUHRyKG5fc2VxLCAwKTsKKworICAgICAgICB4bWxJbml0Tm9kZUluZm9TZXEoc2VxKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sUGFyc2VyTm9kZUluZm9TZXFQdHIobl9zZXEsIHNlcSwgMCk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJbml0Tm9kZUluZm9TZXEiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NlcSk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC03NjI2LDEyICs4NzI4LDc3IEBACiB9CiAKIAorI2RlZmluZSBnZW5fbmJfeG1sTm9kZVB0cl9wdHIgMQorc3RhdGljIHhtbE5vZGVQdHIgKiBnZW5feG1sTm9kZVB0cl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX3htbE5vZGVQdHJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxOb2RlUHRyICogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cit9CisKIHN0YXRpYyBpbnQKIHRlc3RfeG1sUGFyc2VCYWxhbmNlZENodW5rTWVtb3J5KHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgdGhlIGNodW5rIHBlcnRhaW5zIHRvICovCisgICAgaW50IG5fZG9jOworICAgIHhtbFNBWEhhbmRsZXJQdHIgc2F4OyAvKiB0aGUgU0FYIGhhbmRsZXIgYmxvYyAocG9zc2libHkgTlVMTCkgKi8KKyAgICBpbnQgbl9zYXg7CisgICAgdm9pZCAqIHVzZXJfZGF0YTsgLyogVGhlIHVzZXIgZGF0YSByZXR1cm5lZCBvbiBTQVggY2FsbGJhY2tzIChwb3NzaWJseSBOVUxMKSAqLworICAgIGludCBuX3VzZXJfZGF0YTsKKyAgICBpbnQgZGVwdGg7IC8qIFVzZWQgZm9yIGxvb3AgZGV0ZWN0aW9uLCB1c2UgMCAqLworICAgIGludCBuX2RlcHRoOworICAgIHhtbENoYXIgKiBzdHJpbmc7IC8qIHRoZSBpbnB1dCBzdHJpbmcgaW4gVVRGOCBvciBJU08tTGF0aW4gKHplcm8gdGVybWluYXRlZCkgKi8KKyAgICBpbnQgbl9zdHJpbmc7CisgICAgeG1sTm9kZVB0ciAqIGxzdDsgLyogdGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIHNldCBvZiBwYXJzZWQgbm9kZXMgKi8KKyAgICBpbnQgbl9sc3Q7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CisgICAgZm9yIChuX3NheCA9IDA7bl9zYXggPCBnZW5fbmJfeG1sU0FYSGFuZGxlclB0cjtuX3NheCsrKSB7CisgICAgZm9yIChuX3VzZXJfZGF0YSA9IDA7bl91c2VyX2RhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl91c2VyX2RhdGErKykgeworICAgIGZvciAobl9kZXB0aCA9IDA7bl9kZXB0aCA8IGdlbl9uYl9pbnQ7bl9kZXB0aCsrKSB7CisgICAgZm9yIChuX3N0cmluZyA9IDA7bl9zdHJpbmcgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHJpbmcrKykgeworICAgIGZvciAobl9sc3QgPSAwO25fbHN0IDwgZ2VuX25iX3htbE5vZGVQdHJfcHRyO25fbHN0KyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CisgICAgICAgIHNheCA9IGdlbl94bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCAxKTsKKyAgICAgICAgdXNlcl9kYXRhID0gZ2VuX3VzZXJkYXRhKG5fdXNlcl9kYXRhLCAyKTsKKyAgICAgICAgZGVwdGggPSBnZW5faW50KG5fZGVwdGgsIDMpOworICAgICAgICBzdHJpbmcgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHJpbmcsIDQpOworICAgICAgICBsc3QgPSBnZW5feG1sTm9kZVB0cl9wdHIobl9sc3QsIDUpOworICAgICAgICBpZiAoc2F4ID09ICh4bWxTQVhIYW5kbGVyUHRyKSZ4bWxEZWZhdWx0U0FYSGFuZGxlcikgdXNlcl9kYXRhID0gTlVMTDsKKworICAgICAgICByZXRfdmFsID0geG1sUGFyc2VCYWxhbmNlZENodW5rTWVtb3J5KGRvYywgc2F4LCB1c2VyX2RhdGEsIGRlcHRoLCBzdHJpbmcsIGxzdCk7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKKyAgICAgICAgZGVzX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIHNheCwgMSk7CisgICAgICAgIGRlc191c2VyZGF0YShuX3VzZXJfZGF0YSwgdXNlcl9kYXRhLCAyKTsKKyAgICAgICAgZGVzX2ludChuX2RlcHRoLCBkZXB0aCwgMyk7CisgICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0cmluZywgc3RyaW5nLCA0KTsKKyAgICAgICAgZGVzX3htbE5vZGVQdHJfcHRyKG5fbHN0LCBsc3QsIDUpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VCYWxhbmNlZENodW5rTWVtb3J5IiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NheCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXNlcl9kYXRhKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kZXB0aCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyaW5nKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sc3QpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC03NjQwLDggKzg4MDcsNzMgQEAKIHRlc3RfeG1sUGFyc2VCYWxhbmNlZENodW5rTWVtb3J5UmVjb3Zlcih2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgaW50IHJldF92YWw7CisgICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50IHRoZSBjaHVuayBwZXJ0YWlucyB0byAqLworICAgIGludCBuX2RvYzsKKyAgICB4bWxTQVhIYW5kbGVyUHRyIHNheDsgLyogdGhlIFNBWCBoYW5kbGVyIGJsb2MgKHBvc3NpYmx5IE5VTEwpICovCisgICAgaW50IG5fc2F4OworICAgIHZvaWQgKiB1c2VyX2RhdGE7IC8qIFRoZSB1c2VyIGRhdGEgcmV0dXJuZWQgb24gU0FYIGNhbGxiYWNrcyAocG9zc2libHkgTlVMTCkgKi8KKyAgICBpbnQgbl91c2VyX2RhdGE7CisgICAgaW50IGRlcHRoOyAvKiBVc2VkIGZvciBsb29wIGRldGVjdGlvbiwgdXNlIDAgKi8KKyAgICBpbnQgbl9kZXB0aDsKKyAgICB4bWxDaGFyICogc3RyaW5nOyAvKiB0aGUgaW5wdXQgc3RyaW5nIGluIFVURjggb3IgSVNPLUxhdGluICh6ZXJvIHRlcm1pbmF0ZWQpICovCisgICAgaW50IG5fc3RyaW5nOworICAgIHhtbE5vZGVQdHIgKiBsc3Q7IC8qIHRoZSByZXR1cm4gdmFsdWUgZm9yIHRoZSBzZXQgb2YgcGFyc2VkIG5vZGVzICovCisgICAgaW50IG5fbHN0OworICAgIGludCByZWNvdmVyOyAvKiByZXR1cm4gbm9kZXMgZXZlbiBpZiB0aGUgZGF0YSBpcyBicm9rZW4gKHVzZSAwKSAqLworICAgIGludCBuX3JlY292ZXI7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CisgICAgZm9yIChuX3NheCA9IDA7bl9zYXggPCBnZW5fbmJfeG1sU0FYSGFuZGxlclB0cjtuX3NheCsrKSB7CisgICAgZm9yIChuX3VzZXJfZGF0YSA9IDA7bl91c2VyX2RhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl91c2VyX2RhdGErKykgeworICAgIGZvciAobl9kZXB0aCA9IDA7bl9kZXB0aCA8IGdlbl9uYl9pbnQ7bl9kZXB0aCsrKSB7CisgICAgZm9yIChuX3N0cmluZyA9IDA7bl9zdHJpbmcgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHJpbmcrKykgeworICAgIGZvciAobl9sc3QgPSAwO25fbHN0IDwgZ2VuX25iX3htbE5vZGVQdHJfcHRyO25fbHN0KyspIHsKKyAgICBmb3IgKG5fcmVjb3ZlciA9IDA7bl9yZWNvdmVyIDwgZ2VuX25iX2ludDtuX3JlY292ZXIrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAwKTsKKyAgICAgICAgc2F4ID0gZ2VuX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIDEpOworICAgICAgICB1c2VyX2RhdGEgPSBnZW5fdXNlcmRhdGEobl91c2VyX2RhdGEsIDIpOworICAgICAgICBkZXB0aCA9IGdlbl9pbnQobl9kZXB0aCwgMyk7CisgICAgICAgIHN0cmluZyA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0cmluZywgNCk7CisgICAgICAgIGxzdCA9IGdlbl94bWxOb2RlUHRyX3B0cihuX2xzdCwgNSk7CisgICAgICAgIHJlY292ZXIgPSBnZW5faW50KG5fcmVjb3ZlciwgNik7CisgICAgICAgIGlmIChzYXggPT0gKHhtbFNBWEhhbmRsZXJQdHIpJnhtbERlZmF1bHRTQVhIYW5kbGVyKSB1c2VyX2RhdGEgPSBOVUxMOworCisgICAgICAgIHJldF92YWwgPSB4bWxQYXJzZUJhbGFuY2VkQ2h1bmtNZW1vcnlSZWNvdmVyKGRvYywgc2F4LCB1c2VyX2RhdGEsIGRlcHRoLCBzdHJpbmcsIGxzdCwgcmVjb3Zlcik7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKKyAgICAgICAgZGVzX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIHNheCwgMSk7CisgICAgICAgIGRlc191c2VyZGF0YShuX3VzZXJfZGF0YSwgdXNlcl9kYXRhLCAyKTsKKyAgICAgICAgZGVzX2ludChuX2RlcHRoLCBkZXB0aCwgMyk7CisgICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0cmluZywgc3RyaW5nLCA0KTsKKyAgICAgICAgZGVzX3htbE5vZGVQdHJfcHRyKG5fbHN0LCBsc3QsIDUpOworICAgICAgICBkZXNfaW50KG5fcmVjb3ZlciwgcmVjb3ZlciwgNik7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZUJhbGFuY2VkQ2h1bmtNZW1vcnlSZWNvdmVyIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NheCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXNlcl9kYXRhKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kZXB0aCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyaW5nKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sc3QpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlY292ZXIpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtNzY1NSw3ICs4ODg3LDcgQEAKICAgICBpbnQgcmV0X3ZhbDsKICAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgIGludCBuX2N0eHQ7Ci0gICAgY29uc3QgY2hhciAqIGNodW5rOyAvKiBhbiBjaGFyIGFycmF5ICovCisgICAgY2hhciAqIGNodW5rOyAvKiBhbiBjaGFyIGFycmF5ICovCiAgICAgaW50IG5fY2h1bms7CiAgICAgaW50IHNpemU7IC8qIHRoZSBzaXplIGluIGJ5dGUgb2YgdGhlIGNodW5rICovCiAgICAgaW50IG5fc2l6ZTsKQEAgLTc3MDUsOCArODkzNyw1MSBAQAogdGVzdF94bWxQYXJzZUN0eHRFeHRlcm5hbEVudGl0eSh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgaW50IHJldF92YWw7CisgICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHg7IC8qIHRoZSBleGlzdGluZyBwYXJzaW5nIGNvbnRleHQgKi8KKyAgICBpbnQgbl9jdHg7CisgICAgeG1sQ2hhciAqIFVSTDsgLyogdGhlIFVSTCBmb3IgdGhlIGVudGl0eSB0byBsb2FkICovCisgICAgaW50IG5fVVJMOworICAgIHhtbENoYXIgKiBJRDsgLyogdGhlIFN5c3RlbSBJRCBmb3IgdGhlIGVudGl0eSB0byBsb2FkICovCisgICAgaW50IG5fSUQ7CisgICAgeG1sTm9kZVB0ciAqIGxzdDsgLyogdGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIHNldCBvZiBwYXJzZWQgbm9kZXMgKi8KKyAgICBpbnQgbl9sc3Q7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3htbFBhcnNlckN0eHRQdHI7bl9jdHgrKykgeworICAgIGZvciAobl9VUkwgPSAwO25fVVJMIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fVVJMKyspIHsKKyAgICBmb3IgKG5fSUQgPSAwO25fSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9JRCsrKSB7CisgICAgZm9yIChuX2xzdCA9IDA7bl9sc3QgPCBnZW5fbmJfeG1sTm9kZVB0cl9wdHI7bl9sc3QrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBjdHggPSBnZW5feG1sUGFyc2VyQ3R4dFB0cihuX2N0eCwgMCk7CisgICAgICAgIFVSTCA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX1VSTCwgMSk7CisgICAgICAgIElEID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fSUQsIDIpOworICAgICAgICBsc3QgPSBnZW5feG1sTm9kZVB0cl9wdHIobl9sc3QsIDMpOworCisgICAgICAgIHJldF92YWwgPSB4bWxQYXJzZUN0eHRFeHRlcm5hbEVudGl0eShjdHgsIFVSTCwgSUQsIGxzdCk7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbFBhcnNlckN0eHRQdHIobl9jdHgsIGN0eCwgMCk7CisgICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX1VSTCwgVVJMLCAxKTsKKyAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fSUQsIElELCAyKTsKKyAgICAgICAgZGVzX3htbE5vZGVQdHJfcHRyKG5fbHN0LCBsc3QsIDMpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VDdHh0RXh0ZXJuYWxFbnRpdHkiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fVVJMKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9JRCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbHN0KTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTc3MTcsOSArODk5Miw5IEBACiAKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgeG1sRHRkUHRyIHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIEV4dGVybmFsSUQ7IC8qIGEgTkFNRSogY29udGFpbmluZyB0aGUgRXh0ZXJuYWwgSUQgb2YgdGhlIERURCAqLworICAgIHhtbENoYXIgKiBFeHRlcm5hbElEOyAvKiBhIE5BTUUqIGNvbnRhaW5pbmcgdGhlIEV4dGVybmFsIElEIG9mIHRoZSBEVEQgKi8KICAgICBpbnQgbl9FeHRlcm5hbElEOwotICAgIGNvbnN0IHhtbENoYXIgKiBTeXN0ZW1JRDsgLyogYSBOQU1FKiBjb250YWluaW5nIHRoZSBVUkwgdG8gdGhlIERURCAqLworICAgIHhtbENoYXIgKiBTeXN0ZW1JRDsgLyogYSBOQU1FKiBjb250YWluaW5nIHRoZSBVUkwgdG8gdGhlIERURCAqLwogICAgIGludCBuX1N5c3RlbUlEOwogCiAgICAgZm9yIChuX0V4dGVybmFsSUQgPSAwO25fRXh0ZXJuYWxJRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX0V4dGVybmFsSUQrKykgewpAQCAtNzg4Miw4ICs5MTU3LDcyIEBACiB0ZXN0X3htbFBhcnNlRXh0ZXJuYWxFbnRpdHkodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCB0aGUgY2h1bmsgcGVydGFpbnMgdG8gKi8KKyAgICBpbnQgbl9kb2M7CisgICAgeG1sU0FYSGFuZGxlclB0ciBzYXg7IC8qIHRoZSBTQVggaGFuZGxlciBibG9jIChwb3NzaWJseSBOVUxMKSAqLworICAgIGludCBuX3NheDsKKyAgICB2b2lkICogdXNlcl9kYXRhOyAvKiBUaGUgdXNlciBkYXRhIHJldHVybmVkIG9uIFNBWCBjYWxsYmFja3MgKHBvc3NpYmx5IE5VTEwpICovCisgICAgaW50IG5fdXNlcl9kYXRhOworICAgIGludCBkZXB0aDsgLyogVXNlZCBmb3IgbG9vcCBkZXRlY3Rpb24sIHVzZSAwICovCisgICAgaW50IG5fZGVwdGg7CisgICAgeG1sQ2hhciAqIFVSTDsgLyogdGhlIFVSTCBmb3IgdGhlIGVudGl0eSB0byBsb2FkICovCisgICAgaW50IG5fVVJMOworICAgIHhtbENoYXIgKiBJRDsgLyogdGhlIFN5c3RlbSBJRCBmb3IgdGhlIGVudGl0eSB0byBsb2FkICovCisgICAgaW50IG5fSUQ7CisgICAgeG1sTm9kZVB0ciAqIGxzdDsgLyogdGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIHNldCBvZiBwYXJzZWQgbm9kZXMgKi8KKyAgICBpbnQgbl9sc3Q7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CisgICAgZm9yIChuX3NheCA9IDA7bl9zYXggPCBnZW5fbmJfeG1sU0FYSGFuZGxlclB0cjtuX3NheCsrKSB7CisgICAgZm9yIChuX3VzZXJfZGF0YSA9IDA7bl91c2VyX2RhdGEgPCBnZW5fbmJfdXNlcmRhdGE7bl91c2VyX2RhdGErKykgeworICAgIGZvciAobl9kZXB0aCA9IDA7bl9kZXB0aCA8IGdlbl9uYl9pbnQ7bl9kZXB0aCsrKSB7CisgICAgZm9yIChuX1VSTCA9IDA7bl9VUkwgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9VUkwrKykgeworICAgIGZvciAobl9JRCA9IDA7bl9JRCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX0lEKyspIHsKKyAgICBmb3IgKG5fbHN0ID0gMDtuX2xzdCA8IGdlbl9uYl94bWxOb2RlUHRyX3B0cjtuX2xzdCsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDApOworICAgICAgICBzYXggPSBnZW5feG1sU0FYSGFuZGxlclB0cihuX3NheCwgMSk7CisgICAgICAgIHVzZXJfZGF0YSA9IGdlbl91c2VyZGF0YShuX3VzZXJfZGF0YSwgMik7CisgICAgICAgIGRlcHRoID0gZ2VuX2ludChuX2RlcHRoLCAzKTsKKyAgICAgICAgVVJMID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fVVJMLCA0KTsKKyAgICAgICAgSUQgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9JRCwgNSk7CisgICAgICAgIGxzdCA9IGdlbl94bWxOb2RlUHRyX3B0cihuX2xzdCwgNik7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlRXh0ZXJuYWxFbnRpdHkoZG9jLCBzYXgsIHVzZXJfZGF0YSwgZGVwdGgsIFVSTCwgSUQsIGxzdCk7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKKyAgICAgICAgZGVzX3htbFNBWEhhbmRsZXJQdHIobl9zYXgsIHNheCwgMSk7CisgICAgICAgIGRlc191c2VyZGF0YShuX3VzZXJfZGF0YSwgdXNlcl9kYXRhLCAyKTsKKyAgICAgICAgZGVzX2ludChuX2RlcHRoLCBkZXB0aCwgMyk7CisgICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX1VSTCwgVVJMLCA0KTsKKyAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fSUQsIElELCA1KTsKKyAgICAgICAgZGVzX3htbE5vZGVQdHJfcHRyKG5fbHN0LCBsc3QsIDYpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VFeHRlcm5hbEVudGl0eSIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zYXgpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3VzZXJfZGF0YSk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZGVwdGgpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX1VSTCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fSUQpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xzdCk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC03OTM2LDcgKzkyNzUsNyBAQAogCiAgICAgaW50IG1lbV9iYXNlOwogICAgIHhtbERvY1B0ciByZXRfdmFsOwotICAgIGNvbnN0IGNoYXIgKiBidWZmZXI7IC8qIGFuIHBvaW50ZXIgdG8gYSBjaGFyIGFycmF5ICovCisgICAgY2hhciAqIGJ1ZmZlcjsgLyogYW4gcG9pbnRlciB0byBhIGNoYXIgYXJyYXkgKi8KICAgICBpbnQgbl9idWZmZXI7CiAgICAgaW50IHNpemU7IC8qIHRoZSBzaXplIG9mIHRoZSBhcnJheSAqLwogICAgIGludCBuX3NpemU7CkBAIC03OTY5LDE2ICs5MzA4LDU3IEBACiB9CiAKIAorI2RlZmluZSBnZW5fbmJfY29uc3RfeG1sUGFyc2VyTm9kZUluZm9QdHIgMQorc3RhdGljIHhtbFBhcnNlck5vZGVJbmZvUHRyIGdlbl9jb25zdF94bWxQYXJzZXJOb2RlSW5mb1B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfY29uc3RfeG1sUGFyc2VyTm9kZUluZm9QdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbFBhcnNlck5vZGVJbmZvUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbFBhcnNlckFkZE5vZGVJbmZvKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorICAgIGludCBtZW1fYmFzZTsKKyAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLworICAgIGludCBuX2N0eHQ7CisgICAgeG1sUGFyc2VyTm9kZUluZm9QdHIgaW5mbzsgLyogYSBub2RlIGluZm8gc2VxdWVuY2UgcG9pbnRlciAqLworICAgIGludCBuX2luZm87CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgeworICAgIGZvciAobl9pbmZvID0gMDtuX2luZm8gPCBnZW5fbmJfY29uc3RfeG1sUGFyc2VyTm9kZUluZm9QdHI7bl9pbmZvKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgY3R4dCA9IGdlbl94bWxQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMCk7CisgICAgICAgIGluZm8gPSBnZW5fY29uc3RfeG1sUGFyc2VyTm9kZUluZm9QdHIobl9pbmZvLCAxKTsKKworICAgICAgICB4bWxQYXJzZXJBZGROb2RlSW5mbyhjdHh0LCBpbmZvKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOworICAgICAgICBkZXNfY29uc3RfeG1sUGFyc2VyTm9kZUluZm9QdHIobl9pbmZvLCBpbmZvLCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlckFkZE5vZGVJbmZvIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbmZvKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCiAKKyNkZWZpbmUgZ2VuX25iX2NvbnN0X3htbFBhcnNlckN0eHRQdHIgMQorc3RhdGljIHhtbFBhcnNlckN0eHRQdHIgZ2VuX2NvbnN0X3htbFBhcnNlckN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX2NvbnN0X3htbFBhcnNlckN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGNvbnN0IHhtbFBhcnNlckN0eHRQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cit9CisKIHN0YXRpYyBpbnQKIHRlc3RfeG1sUGFyc2VyRmluZE5vZGVJbmZvKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKQEAgLTc5ODksNiArOTM2OSwxMyBAQAogfQogCiAKKyNkZWZpbmUgZ2VuX25iX2NvbnN0X3htbFBhcnNlck5vZGVJbmZvU2VxUHRyIDEKK3N0YXRpYyB4bWxQYXJzZXJOb2RlSW5mb1NlcVB0ciBnZW5fY29uc3RfeG1sUGFyc2VyTm9kZUluZm9TZXFQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX2NvbnN0X3htbFBhcnNlck5vZGVJbmZvU2VxUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxQYXJzZXJOb2RlSW5mb1NlcVB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKK30KKwogc3RhdGljIGludAogdGVzdF94bWxQYXJzZXJGaW5kTm9kZUluZm9JbmRleCh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CkBAIC03OTk5LDEyICs5Mzg2LDQ4IEBACiB9CiAKIAorI2RlZmluZSBnZW5fbmJfeG1sUGFyc2VySW5wdXRQdHIgMQorc3RhdGljIHhtbFBhcnNlcklucHV0UHRyIGdlbl94bWxQYXJzZXJJbnB1dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfeG1sUGFyc2VySW5wdXRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFBhcnNlcklucHV0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbFBhcnNlcklucHV0R3Jvdyh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgaW50IHJldF92YWw7CisgICAgeG1sUGFyc2VySW5wdXRQdHIgaW47IC8qIGFuIFhNTCBwYXJzZXIgaW5wdXQgKi8KKyAgICBpbnQgbl9pbjsKKyAgICBpbnQgbGVuOyAvKiBhbiBpbmRpY2F0aXZlIHNpemUgZm9yIHRoZSBsb29rYWhlYWQgKi8KKyAgICBpbnQgbl9sZW47CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9pbiA9IDA7bl9pbiA8IGdlbl9uYl94bWxQYXJzZXJJbnB1dFB0cjtuX2luKyspIHsKKyAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBpbiA9IGdlbl94bWxQYXJzZXJJbnB1dFB0cihuX2luLCAwKTsKKyAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMSk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlcklucHV0R3JvdyhpbiwgbGVuKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sUGFyc2VySW5wdXRQdHIobl9pbiwgaW4sIDApOworICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUGFyc2VySW5wdXRHcm93IiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbik7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC04MDEzLDggKzk0MzYsMzcgQEAKIHRlc3RfeG1sUGFyc2VySW5wdXRSZWFkKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB4bWxQYXJzZXJJbnB1dFB0ciBpbjsgLyogYW4gWE1MIHBhcnNlciBpbnB1dCAqLworICAgIGludCBuX2luOworICAgIGludCBsZW47IC8qIGFuIGluZGljYXRpdmUgc2l6ZSBmb3IgdGhlIGxvb2thaGVhZCAqLworICAgIGludCBuX2xlbjsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2luID0gMDtuX2luIDwgZ2VuX25iX3htbFBhcnNlcklucHV0UHRyO25faW4rKykgeworICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGluID0gZ2VuX3htbFBhcnNlcklucHV0UHRyKG5faW4sIDApOworICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAxKTsKKworICAgICAgICByZXRfdmFsID0geG1sUGFyc2VySW5wdXRSZWFkKGluLCBsZW4pOworICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxQYXJzZXJJbnB1dFB0cihuX2luLCBpbiwgMCk7CisgICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZXJJbnB1dFJlYWQiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2luKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTgwNTcsMTEgKzk1MDksMTEgQEAKIAogICAgIGludCBtZW1fYmFzZTsKICAgICB4bWxEb2NQdHIgcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogY3VyOyAvKiBhIHBvaW50ZXIgdG8gYSB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nICovCisgICAgeG1sQ2hhciAqIGN1cjsgLyogYSBwb2ludGVyIHRvIGEgemVybyB0ZXJtaW5hdGVkIHN0cmluZyAqLwogICAgIGludCBuX2N1cjsKICAgICBjb25zdCBjaGFyICogVVJMOyAvKiB0aGUgYmFzZSBVUkwgdG8gdXNlIGZvciB0aGUgZG9jdW1lbnQgKi8KICAgICBpbnQgbl9VUkw7Ci0gICAgY29uc3QgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KKyAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgIGludCBuX2VuY29kaW5nOwogICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIHhtbFBhcnNlck9wdGlvbiAqLwogICAgIGludCBuX29wdGlvbnM7CkBAIC04MTEyLDcgKzk1NjQsNyBAQAogICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogYSBmaWxlIG9yIFVSTCAqLwogICAgIGludCBuX2ZpbGVuYW1lOwotICAgIGNvbnN0IGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCisgICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgICBpbnQgbl9lbmNvZGluZzsKICAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24gKi8KICAgICBpbnQgbl9vcHRpb25zOwpAQCAtODE1NiwxMyArOTYwOCwxMyBAQAogCiAgICAgaW50IG1lbV9iYXNlOwogICAgIHhtbERvY1B0ciByZXRfdmFsOwotICAgIGNvbnN0IGNoYXIgKiBidWZmZXI7IC8qIGEgcG9pbnRlciB0byBhIGNoYXIgYXJyYXkgKi8KKyAgICBjaGFyICogYnVmZmVyOyAvKiBhIHBvaW50ZXIgdG8gYSBjaGFyIGFycmF5ICovCiAgICAgaW50IG5fYnVmZmVyOwogICAgIGludCBzaXplOyAvKiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgKi8KICAgICBpbnQgbl9zaXplOwogICAgIGNvbnN0IGNoYXIgKiBVUkw7IC8qIHRoZSBiYXNlIFVSTCB0byB1c2UgZm9yIHRoZSBkb2N1bWVudCAqLwogICAgIGludCBuX1VSTDsKLSAgICBjb25zdCBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLworICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCiAgICAgaW50IG5fZW5jb2Rpbmc7CiAgICAgaW50IG9wdGlvbnM7IC8qIGEgY29tYmluYXRpb24gb2YgeG1sUGFyc2VyT3B0aW9uICovCiAgICAgaW50IG5fb3B0aW9uczsKQEAgLTgyODAsNyArOTczMiw3IEBACiAKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgeG1sRG9jUHRyIHJldF92YWw7Ci0gICAgY29uc3QgY2hhciAqIGJ1ZmZlcjsgLyogYW4gcG9pbnRlciB0byBhIGNoYXIgYXJyYXkgKi8KKyAgICBjaGFyICogYnVmZmVyOyAvKiBhbiBwb2ludGVyIHRvIGEgY2hhciBhcnJheSAqLwogICAgIGludCBuX2J1ZmZlcjsKICAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgb2YgdGhlIGFycmF5ICovCiAgICAgaW50IG5fc2l6ZTsKQEAgLTgzMjEsOSArOTc3Myw5IEBACiAgICAgeG1sRHRkUHRyIHJldF92YWw7CiAgICAgeG1sU0FYSGFuZGxlclB0ciBzYXg7IC8qIHRoZSBTQVggaGFuZGxlciBibG9jayAqLwogICAgIGludCBuX3NheDsKLSAgICBjb25zdCB4bWxDaGFyICogRXh0ZXJuYWxJRDsgLyogYSBOQU1FKiBjb250YWluaW5nIHRoZSBFeHRlcm5hbCBJRCBvZiB0aGUgRFREICovCisgICAgeG1sQ2hhciAqIEV4dGVybmFsSUQ7IC8qIGEgTkFNRSogY29udGFpbmluZyB0aGUgRXh0ZXJuYWwgSUQgb2YgdGhlIERURCAqLwogICAgIGludCBuX0V4dGVybmFsSUQ7Ci0gICAgY29uc3QgeG1sQ2hhciAqIFN5c3RlbUlEOyAvKiBhIE5BTUUqIGNvbnRhaW5pbmcgdGhlIFVSTCB0byB0aGUgRFREICovCisgICAgeG1sQ2hhciAqIFN5c3RlbUlEOyAvKiBhIE5BTUUqIGNvbnRhaW5pbmcgdGhlIFVSTCB0byB0aGUgRFREICovCiAgICAgaW50IG5fU3lzdGVtSUQ7CiAKICAgICBmb3IgKG5fc2F4ID0gMDtuX3NheCA8IGdlbl9uYl94bWxTQVhIYW5kbGVyUHRyO25fc2F4KyspIHsKQEAgLTg1NTEsNyArMTAwMDMsNyBAQAogICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgIHhtbFNBWEhhbmRsZXJQdHIgc2F4OyAvKiB0aGUgU0FYIGhhbmRsZXIgYmxvY2sgKi8KICAgICBpbnQgbl9zYXg7Ci0gICAgY29uc3QgY2hhciAqIGJ1ZmZlcjsgLyogYW4gcG9pbnRlciB0byBhIGNoYXIgYXJyYXkgKi8KKyAgICBjaGFyICogYnVmZmVyOyAvKiBhbiBwb2ludGVyIHRvIGEgY2hhciBhcnJheSAqLwogICAgIGludCBuX2J1ZmZlcjsKICAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgb2YgdGhlIGFycmF5ICovCiAgICAgaW50IG5fc2l6ZTsKQEAgLTg2MDQsNyArMTAwNTYsNyBAQAogICAgIHhtbERvY1B0ciByZXRfdmFsOwogICAgIHhtbFNBWEhhbmRsZXJQdHIgc2F4OyAvKiB0aGUgU0FYIGhhbmRsZXIgYmxvY2sgKi8KICAgICBpbnQgbl9zYXg7Ci0gICAgY29uc3QgY2hhciAqIGJ1ZmZlcjsgLyogYW4gcG9pbnRlciB0byBhIGNoYXIgYXJyYXkgKi8KKyAgICBjaGFyICogYnVmZmVyOyAvKiBhbiBwb2ludGVyIHRvIGEgY2hhciBhcnJheSAqLwogICAgIGludCBuX2J1ZmZlcjsKICAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgb2YgdGhlIGFycmF5ICovCiAgICAgaW50IG5fc2l6ZTsKQEAgLTg3MTMsNyArMTAxNjUsNyBAQAogICAgIGludCBuX3NheDsKICAgICB2b2lkICogdXNlcl9kYXRhOyAvKiBUaGUgdXNlciBkYXRhIHJldHVybmVkIG9uIFNBWCBjYWxsYmFja3MgKi8KICAgICBpbnQgbl91c2VyX2RhdGE7Ci0gICAgY29uc3QgY2hhciAqIGJ1ZmZlcjsgLyogYW4gaW4tbWVtb3J5IFhNTCBkb2N1bWVudCBpbnB1dCAqLworICAgIGNoYXIgKiBidWZmZXI7IC8qIGFuIGluLW1lbW9yeSBYTUwgZG9jdW1lbnQgaW5wdXQgKi8KICAgICBpbnQgbl9idWZmZXI7CiAgICAgaW50IHNpemU7IC8qIHRoZSBsZW5ndGggb2YgdGhlIFhNTCBkb2N1bWVudCBpbiBieXRlcyAqLwogICAgIGludCBuX3NpemU7CkBAIC04Nzc1LDcgKzEwMjI3LDcgQEAKICAgICBpbnQgcmV0X3ZhbDsKICAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTC9IVE1MIHBhcnNlciBjb250ZXh0ICovCiAgICAgaW50IG5fY3R4dDsKLSAgICBjb25zdCBjaGFyICogbmFtZTsgLyogdGhlIGZlYXR1cmUgbmFtZSAqLworICAgIGNoYXIgKiBuYW1lOyAvKiB0aGUgZmVhdHVyZSBuYW1lICovCiAgICAgaW50IG5fbmFtZTsKICAgICB2b2lkICogdmFsdWU7IC8qIHBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBuZXcgdmFsdWUgKi8KICAgICBpbnQgbl92YWx1ZTsKQEAgLTg4MjAsNyArMTAyNzIsNyBAQAogICAgIGludCBtZW1fYmFzZTsKICAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGFuIFhNTCBwYXJzZXIgY29udGV4dCAqLwogICAgIGludCBuX2N0eHQ7Ci0gICAgY29uc3QgeG1sQ2hhciAqIGJ1ZmZlcjsgLyogYSB4bWxDaGFyICogYnVmZmVyICovCisgICAgeG1sQ2hhciAqIGJ1ZmZlcjsgLyogYSB4bWxDaGFyICogYnVmZmVyICovCiAgICAgaW50IG5fYnVmZmVyOwogICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogYSBmaWxlIG5hbWUgKi8KICAgICBpbnQgbl9maWxlbmFtZTsKQEAgLTg5MjIsNyArMTAzNzQsNyBAQAogdGVzdF9wYXJzZXIodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCi0gICAgcHJpbnRmKCJUZXN0aW5nIHBhcnNlciA6IDQ1IG9mIDY5IGZ1bmN0aW9ucyAuLi5cbiIpOworICAgIHByaW50ZigiVGVzdGluZyBwYXJzZXIgOiA1NCBvZiA2OSBmdW5jdGlvbnMgLi4uXG4iKTsKICAgICByZXQgKz0gdGVzdF94bWxCeXRlQ29uc3VtZWQoKTsKICAgICByZXQgKz0gdGVzdF94bWxDbGVhck5vZGVJbmZvU2VxKCk7CiAgICAgcmV0ICs9IHRlc3RfeG1sQ2xlYXJQYXJzZXJDdHh0KCk7CkBAIC04OTkyLDEyICsxMDQ0NCw1MCBAQAogICAgIHJldHVybihyZXQpOwogfQogCisjZGVmaW5lIGdlbl9uYl94bWxQYXR0ZXJuUHRyIDEKK3N0YXRpYyB4bWxQYXR0ZXJuUHRyIGdlbl94bWxQYXR0ZXJuUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworICAgIHJldHVybihOVUxMKTsKK30KK3N0YXRpYyB2b2lkIGRlc194bWxQYXR0ZXJuUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxQYXR0ZXJuUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbFBhdHRlcm5NYXRjaCh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfUEFUVEVSTl9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbFBhdHRlcm5QdHIgY29tcDsgLyogdGhlIHByZWNvbXBpbGVkIHBhdHRlcm4gKi8KKyAgICBpbnQgbl9jb21wOworICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogYSBub2RlICovCisgICAgaW50IG5fbm9kZTsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2NvbXAgPSAwO25fY29tcCA8IGdlbl9uYl94bWxQYXR0ZXJuUHRyO25fY29tcCsrKSB7CisgICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGNvbXAgPSBnZW5feG1sUGF0dGVyblB0cihuX2NvbXAsIDApOworICAgICAgICBub2RlID0gZ2VuX3htbE5vZGVQdHIobl9ub2RlLCAxKTsKKworICAgICAgICByZXRfdmFsID0geG1sUGF0dGVybk1hdGNoKGNvbXAsIG5vZGUpOworICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxQYXR0ZXJuUHRyKG5fY29tcCwgY29tcCwgMCk7CisgICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXR0ZXJuTWF0Y2giLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbXApOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtOTAxNSw3ICsxMDUwNSw3IEBACiB0ZXN0X3BhdHRlcm4odm9pZCkgewogICAgIGludCByZXQgPSAwOwogCi0gICAgcHJpbnRmKCJUZXN0aW5nIHBhdHRlcm4gOiAwIG9mIDQgZnVuY3Rpb25zIC4uLlxuIik7CisgICAgcHJpbnRmKCJUZXN0aW5nIHBhdHRlcm4gOiAxIG9mIDQgZnVuY3Rpb25zIC4uLlxuIik7CiAgICAgcmV0ICs9IHRlc3RfeG1sUGF0dGVybk1hdGNoKCk7CiAgICAgcmV0ICs9IHRlc3RfeG1sUGF0dGVybmNvbXBpbGUoKTsKIApAQCAtOTAyNCwxMiArMTA1MTQsNTAgQEAKICAgICByZXR1cm4ocmV0KTsKIH0KIAorI2RlZmluZSBnZW5fbmJfeG1sUmVsYXhOR1B0ciAxCitzdGF0aWMgeG1sUmVsYXhOR1B0ciBnZW5feG1sUmVsYXhOR1B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfeG1sUmVsYXhOR1B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sUmVsYXhOR1B0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKK30KKwogc3RhdGljIGludAogdGVzdF94bWxSZWxheE5HRHVtcCh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECisjaWZkZWYgTElCWE1MX09VVFBVVF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIEZJTEUgKiBvdXRwdXQ7IC8qIHRoZSBmaWxlIG91dHB1dCAqLworICAgIGludCBuX291dHB1dDsKKyAgICB4bWxSZWxheE5HUHRyIHNjaGVtYTsgLyogYSBzY2hlbWEgc3RydWN0dXJlICovCisgICAgaW50IG5fc2NoZW1hOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fb3V0cHV0ID0gMDtuX291dHB1dCA8IGdlbl9uYl9GSUxFX3B0cjtuX291dHB1dCsrKSB7CisgICAgZm9yIChuX3NjaGVtYSA9IDA7bl9zY2hlbWEgPCBnZW5fbmJfeG1sUmVsYXhOR1B0cjtuX3NjaGVtYSsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIG91dHB1dCA9IGdlbl9GSUxFX3B0cihuX291dHB1dCwgMCk7CisgICAgICAgIHNjaGVtYSA9IGdlbl94bWxSZWxheE5HUHRyKG5fc2NoZW1hLCAxKTsKKworICAgICAgICB4bWxSZWxheE5HRHVtcChvdXRwdXQsIHNjaGVtYSk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX0ZJTEVfcHRyKG5fb3V0cHV0LCBvdXRwdXQsIDApOworICAgICAgICBkZXNfeG1sUmVsYXhOR1B0cihuX3NjaGVtYSwgc2NoZW1hLCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlbGF4TkdEdW1wIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9vdXRwdXQpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3NjaGVtYSk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTkwMzgsMTIgKzEwNTY2LDY0IEBACiB0ZXN0X3htbFJlbGF4TkdEdW1wVHJlZSh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECisjaWZkZWYgTElCWE1MX09VVFBVVF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIEZJTEUgKiBvdXRwdXQ7IC8qIHRoZSBmaWxlIG91dHB1dCAqLworICAgIGludCBuX291dHB1dDsKKyAgICB4bWxSZWxheE5HUHRyIHNjaGVtYTsgLyogYSBzY2hlbWEgc3RydWN0dXJlICovCisgICAgaW50IG5fc2NoZW1hOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fb3V0cHV0ID0gMDtuX291dHB1dCA8IGdlbl9uYl9GSUxFX3B0cjtuX291dHB1dCsrKSB7CisgICAgZm9yIChuX3NjaGVtYSA9IDA7bl9zY2hlbWEgPCBnZW5fbmJfeG1sUmVsYXhOR1B0cjtuX3NjaGVtYSsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIG91dHB1dCA9IGdlbl9GSUxFX3B0cihuX291dHB1dCwgMCk7CisgICAgICAgIHNjaGVtYSA9IGdlbl94bWxSZWxheE5HUHRyKG5fc2NoZW1hLCAxKTsKKworICAgICAgICB4bWxSZWxheE5HRHVtcFRyZWUob3V0cHV0LCBzY2hlbWEpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc19GSUxFX3B0cihuX291dHB1dCwgb3V0cHV0LCAwKTsKKyAgICAgICAgZGVzX3htbFJlbGF4TkdQdHIobl9zY2hlbWEsIHNjaGVtYSwgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWxheE5HRHVtcFRyZWUiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX291dHB1dCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2NoZW1hKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIAogCisjZGVmaW5lIGdlbl9uYl94bWxSZWxheE5HUGFyc2VyQ3R4dFB0ciAxCitzdGF0aWMgeG1sUmVsYXhOR1BhcnNlckN0eHRQdHIgZ2VuX3htbFJlbGF4TkdQYXJzZXJDdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworICAgIHJldHVybihOVUxMKTsKK30KK3N0YXRpYyB2b2lkIGRlc194bWxSZWxheE5HUGFyc2VyQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sUmVsYXhOR1BhcnNlckN0eHRQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cit9CisKKyNkZWZpbmUgZ2VuX25iX3htbFJlbGF4TkdWYWxpZGl0eUVycm9yRnVuY19wdHIgMQorc3RhdGljIHhtbFJlbGF4TkdWYWxpZGl0eUVycm9yRnVuYyAqIGdlbl94bWxSZWxheE5HVmFsaWRpdHlFcnJvckZ1bmNfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworICAgIHJldHVybihOVUxMKTsKK30KK3N0YXRpYyB2b2lkIGRlc194bWxSZWxheE5HVmFsaWRpdHlFcnJvckZ1bmNfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxSZWxheE5HVmFsaWRpdHlFcnJvckZ1bmMgKiB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKK30KKworI2RlZmluZSBnZW5fbmJfeG1sUmVsYXhOR1ZhbGlkaXR5V2FybmluZ0Z1bmNfcHRyIDEKK3N0YXRpYyB4bWxSZWxheE5HVmFsaWRpdHlXYXJuaW5nRnVuYyAqIGdlbl94bWxSZWxheE5HVmFsaWRpdHlXYXJuaW5nRnVuY19wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX3htbFJlbGF4TkdWYWxpZGl0eVdhcm5pbmdGdW5jX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sUmVsYXhOR1ZhbGlkaXR5V2FybmluZ0Z1bmMgKiB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKK30KKwogc3RhdGljIGludAogdGVzdF94bWxSZWxheE5HR2V0UGFyc2VyRXJyb3JzKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKQEAgLTkwNTQsNiArMTA2MzQsMTMgQEAKIH0KIAogCisjZGVmaW5lIGdlbl9uYl94bWxSZWxheE5HVmFsaWRDdHh0UHRyIDEKK3N0YXRpYyB4bWxSZWxheE5HVmFsaWRDdHh0UHRyIGdlbl94bWxSZWxheE5HVmFsaWRDdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworICAgIHJldHVybihOVUxMKTsKK30KK3N0YXRpYyB2b2lkIGRlc194bWxSZWxheE5HVmFsaWRDdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxSZWxheE5HVmFsaWRDdHh0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbFJlbGF4TkdHZXRWYWxpZEVycm9ycyh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CkBAIC05MTY1LDggKzEwNzUyLDM5IEBACiB0ZXN0X3htbFJlbGF4TkdWYWxpZGF0ZURvYyh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbFJlbGF4TkdWYWxpZEN0eHRQdHIgY3R4dDsgLyogYSBSZWxheC1ORyB2YWxpZGF0aW9uIGNvbnRleHQgKi8KKyAgICBpbnQgbl9jdHh0OworICAgIHhtbERvY1B0ciBkb2M7IC8qIGEgcGFyc2VkIGRvY3VtZW50IHRyZWUgKi8KKyAgICBpbnQgbl9kb2M7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgeworICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGN0eHQgPSBnZW5feG1sUmVsYXhOR1ZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOworICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKKworICAgICAgICByZXRfdmFsID0geG1sUmVsYXhOR1ZhbGlkYXRlRG9jKGN0eHQsIGRvYyk7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbFJlbGF4TkdWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKKyAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlbGF4TkdWYWxpZGF0ZURvYyIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTkxNzUsOCArMTA3OTMsNDYgQEAKIHRlc3RfeG1sUmVsYXhOR1ZhbGlkYXRlRnVsbEVsZW1lbnQodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB4bWxSZWxheE5HVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KKyAgICBpbnQgbl9jdHh0OworICAgIHhtbERvY1B0ciBkb2M7IC8qIGEgZG9jdW1lbnQgaW5zdGFuY2UgKi8KKyAgICBpbnQgbl9kb2M7CisgICAgeG1sTm9kZVB0ciBlbGVtOyAvKiBhbiBlbGVtZW50IGluc3RhbmNlICovCisgICAgaW50IG5fZWxlbTsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxSZWxheE5HVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CisgICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKKyAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9lbGVtKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgY3R4dCA9IGdlbl94bWxSZWxheE5HVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CisgICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOworICAgICAgICBlbGVtID0gZ2VuX3htbE5vZGVQdHIobl9lbGVtLCAyKTsKKworICAgICAgICByZXRfdmFsID0geG1sUmVsYXhOR1ZhbGlkYXRlRnVsbEVsZW1lbnQoY3R4dCwgZG9jLCBlbGVtKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOworICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOworICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2VsZW0sIGVsZW0sIDIpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sUmVsYXhOR1ZhbGlkYXRlRnVsbEVsZW1lbnQiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZWxlbSk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtOTE4NSw4ICsxMDg0MSw0NiBAQAogdGVzdF94bWxSZWxheE5HVmFsaWRhdGVQb3BFbGVtZW50KHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgaW50IHJldF92YWw7CisgICAgeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0ciBjdHh0OyAvKiB0aGUgUmVsYXhORyB2YWxpZGF0aW9uIGNvbnRleHQgKi8KKyAgICBpbnQgbl9jdHh0OworICAgIHhtbERvY1B0ciBkb2M7IC8qIGEgZG9jdW1lbnQgaW5zdGFuY2UgKi8KKyAgICBpbnQgbl9kb2M7CisgICAgeG1sTm9kZVB0ciBlbGVtOyAvKiBhbiBlbGVtZW50IGluc3RhbmNlICovCisgICAgaW50IG5fZWxlbTsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxSZWxheE5HVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CisgICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKKyAgICBmb3IgKG5fZWxlbSA9IDA7bl9lbGVtIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9lbGVtKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgY3R4dCA9IGdlbl94bWxSZWxheE5HVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CisgICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOworICAgICAgICBlbGVtID0gZ2VuX3htbE5vZGVQdHIobl9lbGVtLCAyKTsKKworICAgICAgICByZXRfdmFsID0geG1sUmVsYXhOR1ZhbGlkYXRlUG9wRWxlbWVudChjdHh0LCBkb2MsIGVsZW0pOworICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxSZWxheE5HVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CisgICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CisgICAgICAgIGRlc194bWxOb2RlUHRyKG5fZWxlbSwgZWxlbSwgMik7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWxheE5HVmFsaWRhdGVQb3BFbGVtZW50IiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTkxOTUsOCArMTA4ODksNDYgQEAKIHRlc3RfeG1sUmVsYXhOR1ZhbGlkYXRlUHVzaENEYXRhKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgaW50IHJldF92YWw7CisgICAgeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0ciBjdHh0OyAvKiB0aGUgUmVsYXhORyB2YWxpZGF0aW9uIGNvbnRleHQgKi8KKyAgICBpbnQgbl9jdHh0OworICAgIHhtbENoYXIgKiBkYXRhOyAvKiBzb21lIGNoYXJhY3RlciBkYXRhIHJlYWQgKi8KKyAgICBpbnQgbl9kYXRhOworICAgIGludCBsZW47IC8qIHRoZSBsZW5naHQgb2YgdGhlIGRhdGEgKi8KKyAgICBpbnQgbl9sZW47CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sUmVsYXhOR1ZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgeworICAgIGZvciAobl9kYXRhID0gMDtuX2RhdGEgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9kYXRhKyspIHsKKyAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnQ7bl9sZW4rKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBjdHh0ID0gZ2VuX3htbFJlbGF4TkdWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKKyAgICAgICAgZGF0YSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX2RhdGEsIDEpOworICAgICAgICBsZW4gPSBnZW5faW50KG5fbGVuLCAyKTsKKworICAgICAgICByZXRfdmFsID0geG1sUmVsYXhOR1ZhbGlkYXRlUHVzaENEYXRhKGN0eHQsIGRhdGEsIGxlbik7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbFJlbGF4TkdWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKKyAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fZGF0YSwgZGF0YSwgMSk7CisgICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWxheE5HVmFsaWRhdGVQdXNoQ0RhdGEiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RhdGEpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtOTIwNSw4ICsxMDkzNyw0NiBAQAogdGVzdF94bWxSZWxheE5HVmFsaWRhdGVQdXNoRWxlbWVudCh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbFJlbGF4TkdWYWxpZEN0eHRQdHIgY3R4dDsgLyogdGhlIHZhbGlkYXRpb24gY29udGV4dCAqLworICAgIGludCBuX2N0eHQ7CisgICAgeG1sRG9jUHRyIGRvYzsgLyogYSBkb2N1bWVudCBpbnN0YW5jZSAqLworICAgIGludCBuX2RvYzsKKyAgICB4bWxOb2RlUHRyIGVsZW07IC8qIGFuIGVsZW1lbnQgaW5zdGFuY2UgKi8KKyAgICBpbnQgbl9lbGVtOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFJlbGF4TkdWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKKyAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgeworICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2VsZW0rKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBjdHh0ID0gZ2VuX3htbFJlbGF4TkdWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKKyAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CisgICAgICAgIGVsZW0gPSBnZW5feG1sTm9kZVB0cihuX2VsZW0sIDIpOworCisgICAgICAgIHJldF92YWwgPSB4bWxSZWxheE5HVmFsaWRhdGVQdXNoRWxlbWVudChjdHh0LCBkb2MsIGVsZW0pOworICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxSZWxheE5HVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CisgICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CisgICAgICAgIGRlc194bWxOb2RlUHRyKG5fZWxlbSwgZWxlbSwgMik7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZWxheE5HVmFsaWRhdGVQdXNoRWxlbWVudCIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbGVtKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC05MjE1LDggKzEwOTg1LDM5IEBACiB0ZXN0X3htbFJlbGF4UGFyc2VyU2V0RmxhZyh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbFJlbGF4TkdQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIGEgUmVsYXhORyBwYXJzZXIgY29udGV4dCAqLworICAgIGludCBuX2N0eHQ7CisgICAgaW50IGZsYWdzOyAvKiBhIHNldCBvZiBmbGFncyB2YWx1ZXMgKi8KKyAgICBpbnQgbl9mbGFnczsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxSZWxheE5HUGFyc2VyQ3R4dFB0cjtuX2N0eHQrKykgeworICAgIGZvciAobl9mbGFncyA9IDA7bl9mbGFncyA8IGdlbl9uYl9pbnQ7bl9mbGFncysrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGN0eHQgPSBnZW5feG1sUmVsYXhOR1BhcnNlckN0eHRQdHIobl9jdHh0LCAwKTsKKyAgICAgICAgZmxhZ3MgPSBnZW5faW50KG5fZmxhZ3MsIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxSZWxheFBhcnNlclNldEZsYWcoY3R4dCwgZmxhZ3MpOworICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxSZWxheE5HUGFyc2VyQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOworICAgICAgICBkZXNfaW50KG5fZmxhZ3MsIGZsYWdzLCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFJlbGF4UGFyc2VyU2V0RmxhZyIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmxhZ3MpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtOTIyNCw3ICsxMTAyNSw3IEBACiB0ZXN0X3JlbGF4bmcodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCi0gICAgcHJpbnRmKCJUZXN0aW5nIHJlbGF4bmcgOiAxIG9mIDIyIGZ1bmN0aW9ucyAuLi5cbiIpOworICAgIHByaW50ZigiVGVzdGluZyByZWxheG5nIDogOSBvZiAyMiBmdW5jdGlvbnMgLi4uXG4iKTsKICAgICByZXQgKz0gdGVzdF94bWxSZWxheE5HRHVtcCgpOwogICAgIHJldCArPSB0ZXN0X3htbFJlbGF4TkdEdW1wVHJlZSgpOwogICAgIHJldCArPSB0ZXN0X3htbFJlbGF4TkdHZXRQYXJzZXJFcnJvcnMoKTsKQEAgLTk0NzIsNyArMTEyNzMsNyBAQAogICAgIGludCBuX2RvYzsKICAgICB4bWxBdHRyUHRyIGF0dHI7IC8qIHRoZSBhdHRyaWJ1dGUgbm9kZSAqLwogICAgIGludCBuX2F0dHI7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHN0cmluZzsgLyogdGhlIHRleHQgY29udGVudCAqLworICAgIHhtbENoYXIgKiBzdHJpbmc7IC8qIHRoZSB0ZXh0IGNvbnRlbnQgKi8KICAgICBpbnQgbl9zdHJpbmc7CiAKICAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewpAQCAtOTUyMCw3ICsxMTMyMSw3IEBACiAgICAgaW50IHJldF92YWw7CiAgICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIGJ1ZmZlciB0byBkdW1wICovCiAgICAgaW50IG5fYnVmOwotICAgIGNvbnN0IHhtbENoYXIgKiBzdHI7IC8qIHRoZSAjeG1sQ2hhciBzdHJpbmcgKi8KKyAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgI3htbENoYXIgc3RyaW5nICovCiAgICAgaW50IG5fc3RyOwogICAgIGludCBsZW47IC8qIHRoZSBudW1iZXIgb2YgI3htbENoYXIgdG8gYWRkICovCiAgICAgaW50IG5fbGVuOwpAQCAtOTU2Niw3ICsxMTM2Nyw3IEBACiAgICAgaW50IHJldF92YWw7CiAgICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIGJ1ZmZlciAqLwogICAgIGludCBuX2J1ZjsKLSAgICBjb25zdCB4bWxDaGFyICogc3RyOyAvKiB0aGUgI3htbENoYXIgc3RyaW5nICovCisgICAgeG1sQ2hhciAqIHN0cjsgLyogdGhlICN4bWxDaGFyIHN0cmluZyAqLwogICAgIGludCBuX3N0cjsKICAgICBpbnQgbGVuOyAvKiB0aGUgbnVtYmVyIG9mICN4bWxDaGFyIHRvIGFkZCAqLwogICAgIGludCBuX2xlbjsKQEAgLTk2MTIsNyArMTE0MTMsNyBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBidWZmZXIgdG8gZHVtcCAqLwogICAgIGludCBuX2J1ZjsKLSAgICBjb25zdCBjaGFyICogc3RyOyAvKiB0aGUgQyBjaGFyIHN0cmluZyAqLworICAgIGNoYXIgKiBzdHI7IC8qIHRoZSBDIGNoYXIgc3RyaW5nICovCiAgICAgaW50IG5fc3RyOwogCiAgICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKQEAgLTk2NTEsNyArMTE0NTIsNyBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBidWZmZXIgdG8gYWRkIHRvICovCiAgICAgaW50IG5fYnVmOwotICAgIGNvbnN0IHhtbENoYXIgKiBzdHI7IC8qIHRoZSAjeG1sQ2hhciBzdHJpbmcgKi8KKyAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgI3htbENoYXIgc3RyaW5nICovCiAgICAgaW50IG5fc3RyOwogCiAgICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKQEAgLTk2ODIsMTIgKzExNDgzLDQxIEBACiB9CiAKIAorI2RlZmluZSBnZW5fbmJfY29uc3RfeG1sQnVmZmVyUHRyIDEKK3N0YXRpYyB4bWxCdWZmZXJQdHIgZ2VuX2NvbnN0X3htbEJ1ZmZlclB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfY29uc3RfeG1sQnVmZmVyUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjb25zdCB4bWxCdWZmZXJQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cit9CisKIHN0YXRpYyBpbnQKIHRlc3RfeG1sQnVmZmVyQ29udGVudCh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgY29uc3QgeG1sQ2hhciAqIHJldF92YWw7CisgICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIGJ1ZmZlciAqLworICAgIGludCBuX2J1ZjsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfY29uc3RfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgYnVmID0gZ2VuX2NvbnN0X3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbEJ1ZmZlckNvbnRlbnQoYnVmKTsKKyAgICAgICAgZGVzcmV0X2NvbnN0X3htbENoYXJfcHRyKHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc19jb25zdF94bWxCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxCdWZmZXJDb250ZW50IiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtOTc5NSw4ICsxMTYyNSwzMCBAQAogdGVzdF94bWxCdWZmZXJMZW5ndGgodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBidWZmZXIgKi8KKyAgICBpbnQgbl9idWY7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX2NvbnN0X3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGJ1ZiA9IGdlbl9jb25zdF94bWxCdWZmZXJQdHIobl9idWYsIDApOworCisgICAgICAgIHJldF92YWwgPSB4bWxCdWZmZXJMZW5ndGgoYnVmKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfY29uc3RfeG1sQnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQnVmZmVyTGVuZ3RoIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtOTg5Niw3ICsxMTc0OCw3IEBACiAgICAgaW50IG1lbV9iYXNlOwogICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBYTUwgYnVmZmVyICovCiAgICAgaW50IG5fYnVmOwotICAgIGNvbnN0IHhtbENoYXIgKiBzdHJpbmc7IC8qIHRoZSBzdHJpbmcgdG8gYWRkICovCisgICAgeG1sQ2hhciAqIHN0cmluZzsgLyogdGhlIHN0cmluZyB0byBhZGQgKi8KICAgICBpbnQgbl9zdHJpbmc7CiAKICAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgewpAQCAtOTkzMyw3ICsxMTc4NSw3IEBACiAgICAgaW50IG1lbV9iYXNlOwogICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBYTUwgYnVmZmVyIG91dHB1dCAqLwogICAgIGludCBuX2J1ZjsKLSAgICBjb25zdCBjaGFyICogc3RyaW5nOyAvKiB0aGUgc3RyaW5nIHRvIGFkZCAqLworICAgIGNoYXIgKiBzdHJpbmc7IC8qIHRoZSBzdHJpbmcgdG8gYWRkICovCiAgICAgaW50IG5fc3RyaW5nOwogCiAgICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKQEAgLTk5NzAsNyArMTE4MjIsNyBAQAogICAgIGludCBtZW1fYmFzZTsKICAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiB0aGUgWE1MIGJ1ZmZlciBvdXRwdXQgKi8KICAgICBpbnQgbl9idWY7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHN0cmluZzsgLyogdGhlIHN0cmluZyB0byBhZGQgKi8KKyAgICB4bWxDaGFyICogc3RyaW5nOyAvKiB0aGUgc3RyaW5nIHRvIGFkZCAqLwogICAgIGludCBuX3N0cmluZzsKIAogICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CkBAIC0xMDAwNiw5ICsxMTg1OCw5IEBACiAKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgeG1sQ2hhciAqIHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5jbmFtZTsgLyogdGhlIE5hbWUgKi8KKyAgICB4bWxDaGFyICogbmNuYW1lOyAvKiB0aGUgTmFtZSAqLwogICAgIGludCBuX25jbmFtZTsKLSAgICBjb25zdCB4bWxDaGFyICogcHJlZml4OyAvKiB0aGUgcHJlZml4ICovCisgICAgeG1sQ2hhciAqIHByZWZpeDsgLyogdGhlIHByZWZpeCAqLwogICAgIGludCBuX3ByZWZpeDsKICAgICB4bWxDaGFyICogbWVtb3J5OyAvKiBwcmVhbGxvY2F0ZWQgbWVtb3J5ICovCiAgICAgaW50IG5fbWVtb3J5OwpAQCAtMTAxNTYsOCArMTIwMDgsMzcgQEAKIHRlc3RfeG1sQ29weU5vZGUodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKKyAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBub2RlICovCisgICAgaW50IG5fbm9kZTsKKyAgICBpbnQgZXh0ZW5kZWQ7IC8qIGlmIDEgZG8gYSByZWN1cnNpdmUgY29weSAocHJvcGVydGllcywgbmFtZXNwYWNlcyBhbmQgY2hpbGRyZW4gd2hlbiBhcHBsaWNhYmxlKSBpZiAyIGNvcHkgcHJvcGVydGllcyBhbmQgbmFtZXNwYWNlcyAod2hlbiBhcHBsaWNhYmxlKSAqLworICAgIGludCBuX2V4dGVuZGVkOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX2NvbnN0X3htbE5vZGVQdHI7bl9ub2RlKyspIHsKKyAgICBmb3IgKG5fZXh0ZW5kZWQgPSAwO25fZXh0ZW5kZWQgPCBnZW5fbmJfaW50O25fZXh0ZW5kZWQrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBub2RlID0gZ2VuX2NvbnN0X3htbE5vZGVQdHIobl9ub2RlLCAwKTsKKyAgICAgICAgZXh0ZW5kZWQgPSBnZW5faW50KG5fZXh0ZW5kZWQsIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxDb3B5Tm9kZShub2RlLCBleHRlbmRlZCk7CisgICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc19jb25zdF94bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMCk7CisgICAgICAgIGRlc19pbnQobl9leHRlbmRlZCwgZXh0ZW5kZWQsIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ29weU5vZGUiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2V4dGVuZGVkKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xMDE2Niw4ICsxMjA0NywzMCBAQAogdGVzdF94bWxDb3B5Tm9kZUxpc3Qodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKKyAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBmaXJzdCBub2RlIGluIHRoZSBsaXN0LiAqLworICAgIGludCBuX25vZGU7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfY29uc3RfeG1sTm9kZVB0cjtuX25vZGUrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBub2RlID0gZ2VuX2NvbnN0X3htbE5vZGVQdHIobl9ub2RlLCAwKTsKKworICAgICAgICByZXRfdmFsID0geG1sQ29weU5vZGVMaXN0KG5vZGUpOworICAgICAgICBkZXNyZXRfeG1sTm9kZVB0cihyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfY29uc3RfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDApOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ29weU5vZGVMaXN0IiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTEwMjAwLDExICsxMjEwMywxMSBAQAogICAgIHhtbER0ZFB0ciByZXRfdmFsOwogICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCBwb2ludGVyICovCiAgICAgaW50IG5fZG9jOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgRFREIG5hbWUgKi8KKyAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIERURCBuYW1lICovCiAgICAgaW50IG5fbmFtZTsKLSAgICBjb25zdCB4bWxDaGFyICogRXh0ZXJuYWxJRDsgLyogdGhlIGV4dGVybmFsIChQVUJMSUMpIElEICovCisgICAgeG1sQ2hhciAqIEV4dGVybmFsSUQ7IC8qIHRoZSBleHRlcm5hbCAoUFVCTElDKSBJRCAqLwogICAgIGludCBuX0V4dGVybmFsSUQ7Ci0gICAgY29uc3QgeG1sQ2hhciAqIFN5c3RlbUlEOyAvKiB0aGUgc3lzdGVtIElEICovCisgICAgeG1sQ2hhciAqIFN5c3RlbUlEOyAvKiB0aGUgc3lzdGVtIElEICovCiAgICAgaW50IG5fU3lzdGVtSUQ7CiAKICAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewpAQCAtMTAyNDksOCArMTIxNTIsNDQgQEAKIHRlc3RfeG1sRG9jQ29weU5vZGUodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKKyAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBub2RlICovCisgICAgaW50IG5fbm9kZTsKKyAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KKyAgICBpbnQgbl9kb2M7CisgICAgaW50IGV4dGVuZGVkOyAvKiBpZiAxIGRvIGEgcmVjdXJzaXZlIGNvcHkgKHByb3BlcnRpZXMsIG5hbWVzcGFjZXMgYW5kIGNoaWxkcmVuIHdoZW4gYXBwbGljYWJsZSkgaWYgMiBjb3B5IHByb3BlcnRpZXMgYW5kIG5hbWVzcGFjZXMgKHdoZW4gYXBwbGljYWJsZSkgKi8KKyAgICBpbnQgbl9leHRlbmRlZDsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl9jb25zdF94bWxOb2RlUHRyO25fbm9kZSsrKSB7CisgICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKKyAgICBmb3IgKG5fZXh0ZW5kZWQgPSAwO25fZXh0ZW5kZWQgPCBnZW5fbmJfaW50O25fZXh0ZW5kZWQrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBub2RlID0gZ2VuX2NvbnN0X3htbE5vZGVQdHIobl9ub2RlLCAwKTsKKyAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CisgICAgICAgIGV4dGVuZGVkID0gZ2VuX2ludChuX2V4dGVuZGVkLCAyKTsKKworICAgICAgICByZXRfdmFsID0geG1sRG9jQ29weU5vZGUobm9kZSwgZG9jLCBleHRlbmRlZCk7CisgICAgICAgIGRlc3JldF94bWxOb2RlUHRyKHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc19jb25zdF94bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMCk7CisgICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CisgICAgICAgIGRlc19pbnQobl9leHRlbmRlZCwgZXh0ZW5kZWQsIDIpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRG9jQ29weU5vZGUiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZXh0ZW5kZWQpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xMDI1OSw4ICsxMjE5OCwzNyBAQAogdGVzdF94bWxEb2NDb3B5Tm9kZUxpc3Qodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKKyAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgdGFyZ2V0IGRvY3VtZW50ICovCisgICAgaW50IG5fZG9jOworICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIGZpcnN0IG5vZGUgaW4gdGhlIGxpc3QuICovCisgICAgaW50IG5fbm9kZTsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKKyAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX2NvbnN0X3htbE5vZGVQdHI7bl9ub2RlKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMCk7CisgICAgICAgIG5vZGUgPSBnZW5fY29uc3RfeG1sTm9kZVB0cihuX25vZGUsIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxEb2NDb3B5Tm9kZUxpc3QoZG9jLCBub2RlKTsKKyAgICAgICAgZGVzcmV0X3htbE5vZGVQdHIocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAwKTsKKyAgICAgICAgZGVzX2NvbnN0X3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbERvY0NvcHlOb2RlTGlzdCIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xMDY4NSw3ICsxMjY1Myw3IEBACiAgICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSAqLwogICAgIGludCBuX25vZGU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBhdHRyaWJ1dGUgbmFtZSAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgYXR0cmlidXRlIG5hbWUgKi8KICAgICBpbnQgbl9uYW1lOwogCiAgICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CkBAIC0xMDc2OCw5ICsxMjczNiw5IEBACiAgICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSAqLwogICAgIGludCBuX25vZGU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBhdHRyaWJ1dGUgbmFtZSAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgYXR0cmlidXRlIG5hbWUgKi8KICAgICBpbnQgbl9uYW1lOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lU3BhY2U7IC8qIHRoZSBVUkkgb2YgdGhlIG5hbWVzcGFjZSAqLworICAgIHhtbENoYXIgKiBuYW1lU3BhY2U7IC8qIHRoZSBVUkkgb2YgdGhlIG5hbWVzcGFjZSAqLwogICAgIGludCBuX25hbWVTcGFjZTsKIAogICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewpAQCAtMTA4MTQsNyArMTI3ODIsNyBAQAogICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgIHhtbE5vZGVQdHIgbm9kZTsgLyogdGhlIG5vZGUgKi8KICAgICBpbnQgbl9ub2RlOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgYXR0cmlidXRlIG5hbWUgKi8KKyAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGF0dHJpYnV0ZSBuYW1lICovCiAgICAgaW50IG5fbmFtZTsKIAogICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgewpAQCAtMTA5MDMsOSArMTI4NzEsOSBAQAogCiAgICAgaW50IG1lbV9iYXNlOwogICAgIGludCByZXRfdmFsOwotICAgIGNvbnN0IHhtbENoYXIgKiBzeXN0ZW1JRDsgLyogdGhlIHN5c3RlbSBpZGVudGlmaWVyICovCisgICAgeG1sQ2hhciAqIHN5c3RlbUlEOyAvKiB0aGUgc3lzdGVtIGlkZW50aWZpZXIgKi8KICAgICBpbnQgbl9zeXN0ZW1JRDsKLSAgICBjb25zdCB4bWxDaGFyICogcHVibGljSUQ7IC8qIHRoZSBwdWJsaWMgaWRlbnRpZmllciAqLworICAgIHhtbENoYXIgKiBwdWJsaWNJRDsgLyogdGhlIHB1YmxpYyBpZGVudGlmaWVyICovCiAgICAgaW50IG5fcHVibGljSUQ7CiAKICAgICBmb3IgKG5fc3lzdGVtSUQgPSAwO25fc3lzdGVtSUQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zeXN0ZW1JRCsrKSB7CkBAIC0xMDk0NCw3ICsxMjkxMiw3IEBACiAgICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgIGludCBuX2RvYzsKLSAgICBjb25zdCB4bWxDaGFyICogY29udGVudDsgLyogdGhlIENEQVRBIGJsb2NrIGNvbnRlbnQgY29udGVudCAqLworICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgQ0RBVEEgYmxvY2sgY29udGVudCBjb250ZW50ICovCiAgICAgaW50IG5fY29udGVudDsKICAgICBpbnQgbGVuOyAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBibG9jayAqLwogICAgIGludCBuX2xlbjsKQEAgLTEwOTkwLDcgKzEyOTU4LDcgQEAKICAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICAgaW50IG5fZG9jOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgY2hhciByZWYgc3RyaW5nLCBzdGFydGluZyB3aXRoICMgb3IgIiYjIC4uLiA7IiAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgY2hhciByZWYgc3RyaW5nLCBzdGFydGluZyB3aXRoICMgb3IgIiYjIC4uLiA7IiAqLwogICAgIGludCBuX25hbWU7CiAKICAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewpAQCAtMTEwMzEsOSArMTI5OTksOSBAQAogICAgIGludCBuX3BhcmVudDsKICAgICB4bWxOc1B0ciBuczsgLyogYSBuYW1lc3BhY2UgaWYgYW55ICovCiAgICAgaW50IG5fbnM7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBjaGlsZCAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgY2hpbGQgKi8KICAgICBpbnQgbl9uYW1lOwotICAgIGNvbnN0IHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgWE1MIGNvbnRlbnQgb2YgdGhlIGNoaWxkIGlmIGFueS4gKi8KKyAgICB4bWxDaGFyICogY29udGVudDsgLyogdGhlIFhNTCBjb250ZW50IG9mIHRoZSBjaGlsZCBpZiBhbnkuICovCiAgICAgaW50IG5fY29udGVudDsKIAogICAgIGZvciAobl9wYXJlbnQgPSAwO25fcGFyZW50IDwgZ2VuX25iX3htbE5vZGVQdHI7bl9wYXJlbnQrKykgewpAQCAtMTEwODAsNyArMTMwNDgsNyBAQAogCiAgICAgaW50IG1lbV9iYXNlOwogICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogY29udGVudDsgLyogdGhlIGNvbW1lbnQgY29udGVudCAqLworICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgY29tbWVudCBjb250ZW50ICovCiAgICAgaW50IG5fY29udGVudDsKIAogICAgIGZvciAobl9jb250ZW50ID0gMDtuX2NvbnRlbnQgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9jb250ZW50KyspIHsKQEAgLTExMTEyLDcgKzEzMDgwLDcgQEAKIAogICAgIGludCBtZW1fYmFzZTsKICAgICB4bWxEb2NQdHIgcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogdmVyc2lvbjsgLyogeG1sQ2hhciBzdHJpbmcgZ2l2aW5nIHRoZSB2ZXJzaW9uIG9mIFhNTCAiMS4wIiAqLworICAgIHhtbENoYXIgKiB2ZXJzaW9uOyAvKiB4bWxDaGFyIHN0cmluZyBnaXZpbmcgdGhlIHZlcnNpb24gb2YgWE1MICIxLjAiICovCiAgICAgaW50IG5fdmVyc2lvbjsKIAogICAgIGZvciAobl92ZXJzaW9uID0gMDtuX3ZlcnNpb24gPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92ZXJzaW9uKyspIHsKQEAgLTExMTQ2LDcgKzEzMTE0LDcgQEAKICAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICAgaW50IG5fZG9jOwotICAgIGNvbnN0IHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgY29tbWVudCBjb250ZW50ICovCisgICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSBjb21tZW50IGNvbnRlbnQgKi8KICAgICBpbnQgbl9jb250ZW50OwogCiAgICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKQEAgLTExMjIxLDkgKzEzMTg5LDkgQEAKICAgICBpbnQgbl9kb2M7CiAgICAgeG1sTnNQdHIgbnM7IC8qIG5hbWVzcGFjZSBpZiBhbnkgKi8KICAgICBpbnQgbl9uczsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5vZGUgbmFtZSAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbm9kZSBuYW1lICovCiAgICAgaW50IG5fbmFtZTsKLSAgICBjb25zdCB4bWxDaGFyICogY29udGVudDsgLyogdGhlIFhNTCB0ZXh0IGNvbnRlbnQgaWYgYW55ICovCisgICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSBYTUwgdGV4dCBjb250ZW50IGlmIGFueSAqLwogICAgIGludCBuX2NvbnRlbnQ7CiAKICAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewpAQCAtMTEyNzYsNyArMTMyNDQsNyBAQAogICAgIGludCBuX25zOwogICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbm9kZSBuYW1lICovCiAgICAgaW50IG5fbmFtZTsKLSAgICBjb25zdCB4bWxDaGFyICogY29udGVudDsgLyogdGhlIFhNTCB0ZXh0IGNvbnRlbnQgaWYgYW55ICovCisgICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSBYTUwgdGV4dCBjb250ZW50IGlmIGFueSAqLwogICAgIGludCBuX2NvbnRlbnQ7CiAKICAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewpAQCAtMTEzMjUsOSArMTMyOTMsOSBAQAogICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgdGFyZ2V0IGRvY3VtZW50ICovCiAgICAgaW50IG5fZG9jOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBuYW1lICovCisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5hbWUgKi8KICAgICBpbnQgbl9uYW1lOwotICAgIGNvbnN0IHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgUEkgY29udGVudCAqLworICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgUEkgY29udGVudCAqLwogICAgIGludCBuX2NvbnRlbnQ7CiAKICAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewpAQCAtMTEzODMsOSArMTMzNTEsOSBAQAogICAgIGludCBuX2RvYzsKICAgICB4bWxOc1B0ciBuczsgLyogbmFtZXNwYWNlIGlmIGFueSAqLwogICAgIGludCBuX25zOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbm9kZSBuYW1lICovCisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBub2RlIG5hbWUgKi8KICAgICBpbnQgbl9uYW1lOwotICAgIGNvbnN0IHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgdGV4dCBjb250ZW50IGlmIGFueSAqLworICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgdGV4dCBjb250ZW50IGlmIGFueSAqLwogICAgIGludCBuX2NvbnRlbnQ7CiAKICAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewpAQCAtMTE0MzQsNyArMTM0MDIsNyBAQAogICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgICBpbnQgbl9kb2M7Ci0gICAgY29uc3QgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSB0ZXh0IGNvbnRlbnQgKi8KKyAgICB4bWxDaGFyICogY29udGVudDsgLyogdGhlIHRleHQgY29udGVudCAqLwogICAgIGludCBuX2NvbnRlbnQ7CiAKICAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewpAQCAtMTE0NzMsNyArMTM0NDEsNyBAQAogICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgICBpbnQgbl9kb2M7Ci0gICAgY29uc3QgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSB0ZXh0IGNvbnRlbnQgKi8KKyAgICB4bWxDaGFyICogY29udGVudDsgLyogdGhlIHRleHQgY29udGVudCAqLwogICAgIGludCBuX2NvbnRlbnQ7CiAgICAgaW50IGxlbjsgLyogdGhlIHRleHQgbGVuLiAqLwogICAgIGludCBuX2xlbjsKQEAgLTExNTE5LDExICsxMzQ4NywxMSBAQAogICAgIHhtbER0ZFB0ciByZXRfdmFsOwogICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCBwb2ludGVyICovCiAgICAgaW50IG5fZG9jOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgRFREIG5hbWUgKi8KKyAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIERURCBuYW1lICovCiAgICAgaW50IG5fbmFtZTsKLSAgICBjb25zdCB4bWxDaGFyICogRXh0ZXJuYWxJRDsgLyogdGhlIGV4dGVybmFsIElEICovCisgICAgeG1sQ2hhciAqIEV4dGVybmFsSUQ7IC8qIHRoZSBleHRlcm5hbCBJRCAqLwogICAgIGludCBuX0V4dGVybmFsSUQ7Ci0gICAgY29uc3QgeG1sQ2hhciAqIFN5c3RlbUlEOyAvKiB0aGUgc3lzdGVtIElEICovCisgICAgeG1sQ2hhciAqIFN5c3RlbUlEOyAvKiB0aGUgc3lzdGVtIElEICovCiAgICAgaW50IG5fU3lzdGVtSUQ7CiAKICAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgewpAQCAtMTE1ODIsNyArMTM1NTAsNyBAQAogICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgICB4bWxOc1B0ciBuczsgLyogbmFtZXNwYWNlIGlmIGFueSAqLwogICAgIGludCBuX25zOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbm9kZSBuYW1lICovCisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBub2RlIG5hbWUgKi8KICAgICBpbnQgbl9uYW1lOwogCiAgICAgZm9yIChuX25zID0gMDtuX25zIDwgZ2VuX25iX3htbE5zUHRyO25fbnMrKykgewpAQCAtMTE2ODgsOSArMTM2NTYsOSBAQAogCiAgICAgaW50IG1lbV9iYXNlOwogICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTsgLyogdGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbmFtZSAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBuYW1lICovCiAgICAgaW50IG5fbmFtZTsKLSAgICBjb25zdCB4bWxDaGFyICogY29udGVudDsgLyogdGhlIFBJIGNvbnRlbnQgKi8KKyAgICB4bWxDaGFyICogY29udGVudDsgLyogdGhlIFBJIGNvbnRlbnQgKi8KICAgICBpbnQgbl9jb250ZW50OwogCiAgICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgewpAQCAtMTE3MzksNyArMTM3MDcsNyBAQAogICAgIHhtbE5vZGVQdHIgcmV0X3ZhbDsKICAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgICBpbnQgbl9kb2M7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSByZWZlcmVuY2UgbmFtZSwgb3IgdGhlIHJlZmVyZW5jZSBzdHJpbmcgd2l0aCAmIGFuZCA7ICovCisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSByZWZlcmVuY2UgbmFtZSwgb3IgdGhlIHJlZmVyZW5jZSBzdHJpbmcgd2l0aCAmIGFuZCA7ICovCiAgICAgaW50IG5fbmFtZTsKIAogICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CkBAIC0xMTc3Niw3ICsxMzc0NCw3IEBACiAKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgeG1sTm9kZVB0ciByZXRfdmFsOwotICAgIGNvbnN0IHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgdGV4dCBjb250ZW50ICovCisgICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSB0ZXh0IGNvbnRlbnQgKi8KICAgICBpbnQgbl9jb250ZW50OwogCiAgICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX2NvbnRlbnQrKykgewpAQCAtMTE4MTIsOSArMTM3ODAsOSBAQAogICAgIGludCBuX3BhcmVudDsKICAgICB4bWxOc1B0ciBuczsgLyogYSBuYW1lc3BhY2UgaWYgYW55ICovCiAgICAgaW50IG5fbnM7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBjaGlsZCAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgY2hpbGQgKi8KICAgICBpbnQgbl9uYW1lOwotICAgIGNvbnN0IHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBjaGlsZCBpZiBhbnkuICovCisgICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGNoaWxkIGlmIGFueS4gKi8KICAgICBpbnQgbl9jb250ZW50OwogCiAgICAgZm9yIChuX3BhcmVudCA9IDA7bl9wYXJlbnQgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX3BhcmVudCsrKSB7CkBAIC0xMTg2MSw3ICsxMzgyOSw3IEBACiAKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgeG1sTm9kZVB0ciByZXRfdmFsOwotICAgIGNvbnN0IHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgdGV4dCBjb250ZW50ICovCisgICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSB0ZXh0IGNvbnRlbnQgKi8KICAgICBpbnQgbl9jb250ZW50OwogICAgIGludCBsZW47IC8qIHRoZSB0ZXh0IGxlbi4gKi8KICAgICBpbnQgbl9sZW47CkBAIC0xMTkwMSw3ICsxMzg2OSw3IEBACiAgICAgaW50IG1lbV9iYXNlOwogICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgbm9kZSBiZWluZyBtb2RpZmllZCAqLwogICAgIGludCBuX2N1cjsKLSAgICBjb25zdCB4bWxDaGFyICogY29udGVudDsgLyogZXh0cmEgY29udGVudCAqLworICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiBleHRyYSBjb250ZW50ICovCiAgICAgaW50IG5fY29udGVudDsKIAogICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewpAQCAtMTE5MzgsNyArMTM5MDYsNyBAQAogICAgIGludCBtZW1fYmFzZTsKICAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIG5vZGUgYmVpbmcgbW9kaWZpZWQgKi8KICAgICBpbnQgbl9jdXI7Ci0gICAgY29uc3QgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIGV4dHJhIGNvbnRlbnQgKi8KKyAgICB4bWxDaGFyICogY29udGVudDsgLyogZXh0cmEgY29udGVudCAqLwogICAgIGludCBuX2NvbnRlbnQ7CiAgICAgaW50IGxlbjsgLyogdGhlIHNpemUgb2YgQGNvbnRlbnQgKi8KICAgICBpbnQgbl9sZW47CkBAIC0xMjA5Miw3ICsxNDA2MCw3IEBACiAgICAgaW50IG5fbGV2ZWw7CiAgICAgaW50IGZvcm1hdDsgLyogaXMgZm9ybWF0dGluZyBhbGxvd2VkICovCiAgICAgaW50IG5fZm9ybWF0OwotICAgIGNvbnN0IGNoYXIgKiBlbmNvZGluZzsgLyogYW4gb3B0aW9uYWwgZW5jb2Rpbmcgc3RyaW5nICovCisgICAgY2hhciAqIGVuY29kaW5nOyAvKiBhbiBvcHRpb25hbCBlbmNvZGluZyBzdHJpbmcgKi8KICAgICBpbnQgbl9lbmNvZGluZzsKIAogICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbE91dHB1dEJ1ZmZlclB0cjtuX2J1ZisrKSB7CkBAIC0xMjQxMiw3ICsxNDM4MCw3IEBACiAgICAgaW50IG1lbV9iYXNlOwogICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgbm9kZSBiZWluZyBjaGFuZ2VkICovCiAgICAgaW50IG5fY3VyOwotICAgIGNvbnN0IHhtbENoYXIgKiB1cmk7IC8qIHRoZSBuZXcgYmFzZSBVUkkgKi8KKyAgICB4bWxDaGFyICogdXJpOyAvKiB0aGUgbmV3IGJhc2UgVVJJICovCiAgICAgaW50IG5fdXJpOwogCiAgICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX2N1cisrKSB7CkBAIC0xMjQ1MCw3ICsxNDQxOCw3IEBACiAgICAgaW50IG1lbV9iYXNlOwogICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgbm9kZSBiZWluZyBtb2RpZmllZCAqLwogICAgIGludCBuX2N1cjsKLSAgICBjb25zdCB4bWxDaGFyICogY29udGVudDsgLyogdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY29udGVudCAqLworICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0aGUgbmV3IHZhbHVlIG9mIHRoZSBjb250ZW50ICovCiAgICAgaW50IG5fY29udGVudDsKIAogICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewpAQCAtMTI0ODgsNyArMTQ0NTYsNyBAQAogICAgIGludCBtZW1fYmFzZTsKICAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIG5vZGUgYmVpbmcgbW9kaWZpZWQgKi8KICAgICBpbnQgbl9jdXI7Ci0gICAgY29uc3QgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGNvbnRlbnQgKi8KKyAgICB4bWxDaGFyICogY29udGVudDsgLyogdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY29udGVudCAqLwogICAgIGludCBuX2NvbnRlbnQ7CiAgICAgaW50IGxlbjsgLyogdGhlIHNpemUgb2YgQGNvbnRlbnQgKi8KICAgICBpbnQgbl9sZW47CkBAIC0xMjUzNCw3ICsxNDUwMiw3IEBACiAgICAgaW50IG1lbV9iYXNlOwogICAgIHhtbE5vZGVQdHIgY3VyOyAvKiB0aGUgbm9kZSBiZWluZyBjaGFuZ2VkICovCiAgICAgaW50IG5fY3VyOwotICAgIGNvbnN0IHhtbENoYXIgKiBsYW5nOyAvKiB0aGUgbGFuZ3VhZ2UgZGVzY3JpcHRpb24gKi8KKyAgICB4bWxDaGFyICogbGFuZzsgLyogdGhlIGxhbmd1YWdlIGRlc2NyaXB0aW9uICovCiAgICAgaW50IG5fbGFuZzsKIAogICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewpAQCAtMTI1NzMsNyArMTQ1NDEsNyBAQAogICAgIGludCBtZW1fYmFzZTsKICAgICB4bWxOb2RlUHRyIGN1cjsgLyogdGhlIG5vZGUgYmVpbmcgY2hhbmdlZCAqLwogICAgIGludCBuX2N1cjsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5ldyB0YWcgbmFtZSAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmV3IHRhZyBuYW1lICovCiAgICAgaW50IG5fbmFtZTsKIAogICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9jdXIrKykgewpAQCAtMTI4MTcsNyArMTQ3ODUsNyBAQAogICAgIGludCBuX2ZpbGVuYW1lOwogICAgIHhtbERvY1B0ciBjdXI7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgIGludCBuX2N1cjsKLSAgICBjb25zdCBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBuYW1lIG9mIGFuIGVuY29kaW5nIChvciBOVUxMKSAqLworICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIG5hbWUgb2YgYW4gZW5jb2RpbmcgKG9yIE5VTEwpICovCiAgICAgaW50IG5fZW5jb2Rpbmc7CiAKICAgICBmb3IgKG5fZmlsZW5hbWUgPSAwO25fZmlsZW5hbWUgPCBnZW5fbmJfZmlsZW91dHB1dDtuX2ZpbGVuYW1lKyspIHsKQEAgLTEyODY1LDcgKzE0ODMzLDcgQEAKICAgICBpbnQgbl9idWY7CiAgICAgeG1sRG9jUHRyIGN1cjsgLyogdGhlIGRvY3VtZW50ICovCiAgICAgaW50IG5fY3VyOwotICAgIGNvbnN0IGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIGlmIGFueSBhc3N1bWluZyB0aGUgSS9PIGxheWVyIGhhbmRsZXMgdGhlIHRyYW5jb2RpbmcgKi8KKyAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBlbmNvZGluZyBpZiBhbnkgYXNzdW1pbmcgdGhlIEkvTyBsYXllciBoYW5kbGVzIHRoZSB0cmFuY29kaW5nICovCiAgICAgaW50IG5fZW5jb2Rpbmc7CiAKICAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxPdXRwdXRCdWZmZXJQdHI7bl9idWYrKykgewpAQCAtMTI5NjIsNyArMTQ5MzAsNyBAQAogICAgIGludCBuX2ZpbGVuYW1lOwogICAgIHhtbERvY1B0ciBjdXI7IC8qIHRoZSBkb2N1bWVudCBiZWluZyBzYXZlZCAqLwogICAgIGludCBuX2N1cjsKLSAgICBjb25zdCBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBuYW1lIG9mIHRoZSBlbmNvZGluZyB0byB1c2Ugb3IgTlVMTC4gKi8KKyAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBuYW1lIG9mIHRoZSBlbmNvZGluZyB0byB1c2Ugb3IgTlVMTC4gKi8KICAgICBpbnQgbl9lbmNvZGluZzsKICAgICBpbnQgZm9ybWF0OyAvKiBzaG91bGQgZm9ybWF0dGluZyBzcGFjZXMgYmUgYWRkZWQuICovCiAgICAgaW50IG5fZm9ybWF0OwpAQCAtMTMwMTcsNyArMTQ5ODUsNyBAQAogICAgIGludCBuX2J1ZjsKICAgICB4bWxEb2NQdHIgY3VyOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgICBpbnQgbl9jdXI7Ci0gICAgY29uc3QgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZW5jb2RpbmcgaWYgYW55IGFzc3VtaW5nIHRoZSBJL08gbGF5ZXIgaGFuZGxlcyB0aGUgdHJhbmNvZGluZyAqLworICAgIGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIGlmIGFueSBhc3N1bWluZyB0aGUgSS9PIGxheWVyIGhhbmRsZXMgdGhlIHRyYW5jb2RpbmcgKi8KICAgICBpbnQgbl9lbmNvZGluZzsKICAgICBpbnQgZm9ybWF0OyAvKiBzaG91bGQgZm9ybWF0dGluZyBzcGFjZXMgYmVlbiBhZGRlZCAqLwogICAgIGludCBuX2Zvcm1hdDsKQEAgLTEzMjMyLDcgKzE1MjAwLDcgQEAKIAogICAgIGludCBtZW1fYmFzZTsKICAgICBjb25zdCB4bWxDaGFyICogcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTsgLyogdGhlIGZ1bGwgUU5hbWUgKi8KKyAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGZ1bGwgUU5hbWUgKi8KICAgICBpbnQgbl9uYW1lOwogICAgIGludCAqIGxlbjsgLyogYW4gaW50ICogKi8KICAgICBpbnQgbl9sZW47CkBAIC0xMzI3Myw3ICsxNTI0MSw3IEBACiAgICAgeG1sTm9kZVB0ciByZXRfdmFsOwogICAgIHhtbERvY1B0ciBkb2M7IC8qIHRoZSBkb2N1bWVudCAqLwogICAgIGludCBuX2RvYzsKLSAgICBjb25zdCB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlICovCisgICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAqLwogICAgIGludCBuX3ZhbHVlOwogCiAgICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKQEAgLTEzMzEyLDcgKzE1MjgwLDcgQEAKICAgICB4bWxOb2RlUHRyIHJldF92YWw7CiAgICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICAgaW50IG5fZG9jOwotICAgIGNvbnN0IHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIHZhbHVlIG9mIHRoZSB0ZXh0ICovCisgICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgdmFsdWUgb2YgdGhlIHRleHQgKi8KICAgICBpbnQgbl92YWx1ZTsKICAgICBpbnQgbGVuOyAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdmFsdWUgKi8KICAgICBpbnQgbl9sZW47CkBAIC0xMzM1OCw3ICsxNTMyNiw3IEBACiAgICAgaW50IHJldF92YWw7CiAgICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSAqLwogICAgIGludCBuX25vZGU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSBjb250ZW50ICovCisgICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRoZSBjb250ZW50ICovCiAgICAgaW50IG5fY29udGVudDsKICAgICBpbnQgbGVuOyAvKiBAY29udGVudCBsZW5ndGggKi8KICAgICBpbnQgbl9sZW47CkBAIC0xMzQ0OSw3ICsxNTQxNyw3IEBACiAgICAgaW50IG5fbm9kZTsKICAgICB4bWxOc1B0ciBuczsgLyogdGhlIG5hbWVzcGFjZSBkZWZpbml0aW9uICovCiAgICAgaW50IG5fbnM7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBhdHRyaWJ1dGUgbmFtZSAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgYXR0cmlidXRlIG5hbWUgKi8KICAgICBpbnQgbl9uYW1lOwogCiAgICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CkBAIC0xMzQ5NSw3ICsxNTQ2Myw3IEBACiAgICAgaW50IHJldF92YWw7CiAgICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSAqLwogICAgIGludCBuX25vZGU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBhdHRyaWJ1dGUgbmFtZSAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgYXR0cmlidXRlIG5hbWUgKi8KICAgICBpbnQgbl9uYW1lOwogCiAgICAgZm9yIChuX25vZGUgPSAwO25fbm9kZSA8IGdlbl9uYl94bWxOb2RlUHRyO25fbm9kZSsrKSB7CkBAIC0xMzUzMyw3ICsxNTUwMSw3IEBACiAKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgaW50IHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgdmFsdWUgdG8gY2hlY2sgKi8KKyAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSB2YWx1ZSB0byBjaGVjayAqLwogICAgIGludCBuX3ZhbHVlOwogICAgIGludCBzcGFjZTsgLyogYWxsb3cgc3BhY2VzIGluIGZyb250IGFuZCBlbmQgb2YgdGhlIHN0cmluZyAqLwogICAgIGludCBuX3NwYWNlOwpAQCAtMTM1NzIsNyArMTU1NDAsNyBAQAogCiAgICAgaW50IG1lbV9iYXNlOwogICAgIGludCByZXRfdmFsOwotICAgIGNvbnN0IHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIHZhbHVlIHRvIGNoZWNrICovCisgICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgdmFsdWUgdG8gY2hlY2sgKi8KICAgICBpbnQgbl92YWx1ZTsKICAgICBpbnQgc3BhY2U7IC8qIGFsbG93IHNwYWNlcyBpbiBmcm9udCBhbmQgZW5kIG9mIHRoZSBzdHJpbmcgKi8KICAgICBpbnQgbl9zcGFjZTsKQEAgLTEzNjExLDcgKzE1NTc5LDcgQEAKIAogICAgIGludCBtZW1fYmFzZTsKICAgICBpbnQgcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSB2YWx1ZSB0byBjaGVjayAqLworICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIHZhbHVlIHRvIGNoZWNrICovCiAgICAgaW50IG5fdmFsdWU7CiAgICAgaW50IHNwYWNlOyAvKiBhbGxvdyBzcGFjZXMgaW4gZnJvbnQgYW5kIGVuZCBvZiB0aGUgc3RyaW5nICovCiAgICAgaW50IG5fc3BhY2U7CkBAIC0xMzY1MCw3ICsxNTYxOCw3IEBACiAKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgaW50IHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgdmFsdWUgdG8gY2hlY2sgKi8KKyAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSB2YWx1ZSB0byBjaGVjayAqLwogICAgIGludCBuX3ZhbHVlOwogICAgIGludCBzcGFjZTsgLyogYWxsb3cgc3BhY2VzIGluIGZyb250IGFuZCBlbmQgb2YgdGhlIHN0cmluZyAqLwogICAgIGludCBuX3NwYWNlOwpAQCAtMTM2ODYsNyArMTU2NTQsNyBAQAogdGVzdF90cmVlKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAotICAgIHByaW50ZigiVGVzdGluZyB0cmVlIDogOTkgb2YgMTQ2IGZ1bmN0aW9ucyAuLi5cbiIpOworICAgIHByaW50ZigiVGVzdGluZyB0cmVlIDogMTA1IG9mIDE0NiBmdW5jdGlvbnMgLi4uXG4iKTsKICAgICByZXQgKz0gdGVzdF94bWxBZGRDaGlsZCgpOwogICAgIHJldCArPSB0ZXN0X3htbEFkZENoaWxkTGlzdCgpOwogICAgIHJldCArPSB0ZXN0X3htbEFkZE5leHRTaWJsaW5nKCk7CkBAIC0xMzgzMiw5ICsxNTgwMCw5IEBACiAKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgeG1sQ2hhciAqIHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIFVSSTsgLyogdGhlIFVSSSByZWZlcmVuY2UgdW5kZXIgY29uc2lkZXJhdGlvbiAqLworICAgIHhtbENoYXIgKiBVUkk7IC8qIHRoZSBVUkkgcmVmZXJlbmNlIHVuZGVyIGNvbnNpZGVyYXRpb24gKi8KICAgICBpbnQgbl9VUkk7Ci0gICAgY29uc3QgeG1sQ2hhciAqIGJhc2U7IC8qIHRoZSBiYXNlIHZhbHVlICovCisgICAgeG1sQ2hhciAqIGJhc2U7IC8qIHRoZSBiYXNlIHZhbHVlICovCiAgICAgaW50IG5fYmFzZTsKIAogICAgIGZvciAobl9VUkkgPSAwO25fVVJJIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fVVJJKyspIHsKQEAgLTEzODcxLDkgKzE1ODM5LDkgQEAKIAogICAgIGludCBtZW1fYmFzZTsKICAgICB4bWxDaGFyICogcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogVVJJOyAvKiB0aGUgVVJJIGluc3RhbmNlIGZvdW5kIGluIHRoZSBkb2N1bWVudCAqLworICAgIHhtbENoYXIgKiBVUkk7IC8qIHRoZSBVUkkgaW5zdGFuY2UgZm91bmQgaW4gdGhlIGRvY3VtZW50ICovCiAgICAgaW50IG5fVVJJOwotICAgIGNvbnN0IHhtbENoYXIgKiBiYXNlOyAvKiB0aGUgYmFzZSB2YWx1ZSAqLworICAgIHhtbENoYXIgKiBiYXNlOyAvKiB0aGUgYmFzZSB2YWx1ZSAqLwogICAgIGludCBuX2Jhc2U7CiAKICAgICBmb3IgKG5fVVJJID0gMDtuX1VSSSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX1VSSSsrKSB7CkBAIC0xMzkxMCw3ICsxNTg3OCw3IEBACiAKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgeG1sQ2hhciAqIHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHBhdGg7IC8qIHRoZSByZXNvdXJjZSBsb2NhdG9yIGluIGEgZmlsZXN5c3RlbSBub3RhdGlvbiAqLworICAgIHhtbENoYXIgKiBwYXRoOyAvKiB0aGUgcmVzb3VyY2UgbG9jYXRvciBpbiBhIGZpbGVzeXN0ZW0gbm90YXRpb24gKi8KICAgICBpbnQgbl9wYXRoOwogCiAgICAgZm9yIChuX3BhdGggPSAwO25fcGF0aCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3BhdGgrKykgewpAQCAtMTM5NDYsMTIgKzE1OTE0LDQxIEBACiB9CiAKIAorI2RlZmluZSBnZW5fbmJfY2hhcl9wdHIgMQorc3RhdGljIGNoYXIgKiBnZW5fY2hhcl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX2NoYXJfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBjaGFyICogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cit9CisKIHN0YXRpYyBpbnQKIHRlc3RfeG1sTm9ybWFsaXplVVJJUGF0aCh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgaW50IHJldF92YWw7CisgICAgY2hhciAqIHBhdGg7IC8qIHBvaW50ZXIgdG8gdGhlIHBhdGggc3RyaW5nICovCisgICAgaW50IG5fcGF0aDsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX3BhdGggPSAwO25fcGF0aCA8IGdlbl9uYl9jaGFyX3B0cjtuX3BhdGgrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBwYXRoID0gZ2VuX2NoYXJfcHRyKG5fcGF0aCwgMCk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbE5vcm1hbGl6ZVVSSVBhdGgocGF0aCk7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX2NoYXJfcHRyKG5fcGF0aCwgcGF0aCwgMCk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxOb3JtYWxpemVVUklQYXRoIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9wYXRoKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTEzOTY2LDEyICsxNTk2Myw0OCBAQAogfQogCiAKKyNkZWZpbmUgZ2VuX25iX3htbFVSSVB0ciAxCitzdGF0aWMgeG1sVVJJUHRyIGdlbl94bWxVUklQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX3htbFVSSVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sVVJJUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbFBhcnNlVVJJUmVmZXJlbmNlKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB4bWxVUklQdHIgdXJpOyAvKiBwb2ludGVyIHRvIGFuIFVSSSBzdHJ1Y3R1cmUgKi8KKyAgICBpbnQgbl91cmk7CisgICAgY2hhciAqIHN0cjsgLyogdGhlIHN0cmluZyB0byBhbmFseXplICovCisgICAgaW50IG5fc3RyOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fdXJpID0gMDtuX3VyaSA8IGdlbl9uYl94bWxVUklQdHI7bl91cmkrKykgeworICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fc3RyKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgdXJpID0gZ2VuX3htbFVSSVB0cihuX3VyaSwgMCk7CisgICAgICAgIHN0ciA9IGdlbl9jb25zdF9jaGFyX3B0cihuX3N0ciwgMSk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFBhcnNlVVJJUmVmZXJlbmNlKHVyaSwgc3RyKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sVVJJUHRyKG5fdXJpLCB1cmksIDApOworICAgICAgICBkZXNfY29uc3RfY2hhcl9wdHIobl9zdHIsIHN0ciwgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZVVSSVJlZmVyZW5jZSIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXJpKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHIpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTEzOTgwLDggKzE2MDEzLDM1IEBACiB0ZXN0X3htbFByaW50VVJJKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorICAgIGludCBtZW1fYmFzZTsKKyAgICBGSUxFICogc3RyZWFtOyAvKiBhIEZJTEUqIGZvciB0aGUgb3V0cHV0ICovCisgICAgaW50IG5fc3RyZWFtOworICAgIHhtbFVSSVB0ciB1cmk7IC8qIHBvaW50ZXIgdG8gYW4geG1sVVJJICovCisgICAgaW50IG5fdXJpOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fc3RyZWFtID0gMDtuX3N0cmVhbSA8IGdlbl9uYl9GSUxFX3B0cjtuX3N0cmVhbSsrKSB7CisgICAgZm9yIChuX3VyaSA9IDA7bl91cmkgPCBnZW5fbmJfeG1sVVJJUHRyO25fdXJpKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgc3RyZWFtID0gZ2VuX0ZJTEVfcHRyKG5fc3RyZWFtLCAwKTsKKyAgICAgICAgdXJpID0gZ2VuX3htbFVSSVB0cihuX3VyaSwgMSk7CisKKyAgICAgICAgeG1sUHJpbnRVUkkoc3RyZWFtLCB1cmkpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc19GSUxFX3B0cihuX3N0cmVhbSwgc3RyZWFtLCAwKTsKKyAgICAgICAgZGVzX3htbFVSSVB0cihuX3VyaSwgdXJpLCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFByaW50VVJJIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zdHJlYW0pOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3VyaSk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMTM5OTAsOCArMTYwNTAsMzAgQEAKIHRlc3RfeG1sU2F2ZVVyaSh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgeG1sQ2hhciAqIHJldF92YWw7CisgICAgeG1sVVJJUHRyIHVyaTsgLyogcG9pbnRlciB0byBhbiB4bWxVUkkgKi8KKyAgICBpbnQgbl91cmk7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl91cmkgPSAwO25fdXJpIDwgZ2VuX25iX3htbFVSSVB0cjtuX3VyaSsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIHVyaSA9IGdlbl94bWxVUklQdHIobl91cmksIDApOworCisgICAgICAgIHJldF92YWwgPSB4bWxTYXZlVXJpKHVyaSk7CisgICAgICAgIGRlc3JldF94bWxDaGFyX3B0cihyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sVVJJUHRyKG5fdXJpLCB1cmksIDApOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2F2ZVVyaSIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXJpKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTE0MDAyLDcgKzE2MDg0LDcgQEAKIAogICAgIGludCBtZW1fYmFzZTsKICAgICB4bWxDaGFyICogcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogc3RyOyAvKiB0aGUgc3RyaW5nIG9mIHRoZSBVUkkgdG8gZXNjYXBlICovCisgICAgeG1sQ2hhciAqIHN0cjsgLyogdGhlIHN0cmluZyBvZiB0aGUgVVJJIHRvIGVzY2FwZSAqLwogICAgIGludCBuX3N0cjsKIAogICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyKyspIHsKQEAgLTE0MDM0LDkgKzE2MTE2LDkgQEAKIAogICAgIGludCBtZW1fYmFzZTsKICAgICB4bWxDaGFyICogcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogc3RyOyAvKiBzdHJpbmcgdG8gZXNjYXBlICovCisgICAgeG1sQ2hhciAqIHN0cjsgLyogc3RyaW5nIHRvIGVzY2FwZSAqLwogICAgIGludCBuX3N0cjsKLSAgICBjb25zdCB4bWxDaGFyICogbGlzdDsgLyogZXhjZXB0aW9uIGxpc3Qgc3RyaW5nIG9mIGNoYXJzIG5vdCB0byBlc2NhcGUgKi8KKyAgICB4bWxDaGFyICogbGlzdDsgLyogZXhjZXB0aW9uIGxpc3Qgc3RyaW5nIG9mIGNoYXJzIG5vdCB0byBlc2NhcGUgKi8KICAgICBpbnQgbl9saXN0OwogCiAgICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIrKykgewpAQCAtMTQwODAsNyArMTYxNjIsNyBAQAogdGVzdF91cmkodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCi0gICAgcHJpbnRmKCJUZXN0aW5nIHVyaSA6IDUgb2YgMTMgZnVuY3Rpb25zIC4uLlxuIik7CisgICAgcHJpbnRmKCJUZXN0aW5nIHVyaSA6IDkgb2YgMTMgZnVuY3Rpb25zIC4uLlxuIik7CiAgICAgcmV0ICs9IHRlc3RfeG1sQnVpbGRSZWxhdGl2ZVVSSSgpOwogICAgIHJldCArPSB0ZXN0X3htbEJ1aWxkVVJJKCk7CiAgICAgcmV0ICs9IHRlc3RfeG1sQ2Fub25pY1BhdGgoKTsKQEAgLTE0MDk5LDYgKzE2MTgxLDEzIEBACiAgICAgcmV0dXJuKHJldCk7CiB9CiAKKyNkZWZpbmUgZ2VuX25iX3htbEVudW1lcmF0aW9uUHRyIDEKK3N0YXRpYyB4bWxFbnVtZXJhdGlvblB0ciBnZW5feG1sRW51bWVyYXRpb25QdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX3htbEVudW1lcmF0aW9uUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxFbnVtZXJhdGlvblB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKK30KKwogc3RhdGljIGludAogdGVzdF94bWxBZGRBdHRyaWJ1dGVEZWNsKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKQEAgLTE0MTA5LDYgKzE2MTk4LDEzIEBACiB9CiAKIAorI2RlZmluZSBnZW5fbmJfeG1sRWxlbWVudENvbnRlbnRQdHIgMQorc3RhdGljIHhtbEVsZW1lbnRDb250ZW50UHRyIGdlbl94bWxFbGVtZW50Q29udGVudFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfeG1sRWxlbWVudENvbnRlbnRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbEVsZW1lbnRDb250ZW50UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbEFkZEVsZW1lbnREZWNsKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKQEAgLTE0MTQ5LDYgKzE2MjQ1LDEzIEBACiB9CiAKIAorI2RlZmluZSBnZW5fbmJfeG1sQXR0cmlidXRlVGFibGVQdHIgMQorc3RhdGljIHhtbEF0dHJpYnV0ZVRhYmxlUHRyIGdlbl94bWxBdHRyaWJ1dGVUYWJsZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfeG1sQXR0cmlidXRlVGFibGVQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbEF0dHJpYnV0ZVRhYmxlUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbENvcHlBdHRyaWJ1dGVUYWJsZSh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CkBAIC0xNDE2OSw2ICsxNjI3MiwxMyBAQAogfQogCiAKKyNkZWZpbmUgZ2VuX25iX3htbEVsZW1lbnRUYWJsZVB0ciAxCitzdGF0aWMgeG1sRWxlbWVudFRhYmxlUHRyIGdlbl94bWxFbGVtZW50VGFibGVQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX3htbEVsZW1lbnRUYWJsZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sRWxlbWVudFRhYmxlUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbENvcHlFbGVtZW50VGFibGUodm9pZCkgewogICAgIGludCByZXQgPSAwOwpAQCAtMTQxODksNiArMTYyOTksMTMgQEAKIH0KIAogCisjZGVmaW5lIGdlbl9uYl94bWxOb3RhdGlvblRhYmxlUHRyIDEKK3N0YXRpYyB4bWxOb3RhdGlvblRhYmxlUHRyIGdlbl94bWxOb3RhdGlvblRhYmxlUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworICAgIHJldHVybihOVUxMKTsKK30KK3N0YXRpYyB2b2lkIGRlc194bWxOb3RhdGlvblRhYmxlUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxOb3RhdGlvblRhYmxlUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbENvcHlOb3RhdGlvblRhYmxlKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKQEAgLTE0MjA5LDEyICsxNjMyNiw0OCBAQAogfQogCiAKKyNkZWZpbmUgZ2VuX25iX3htbEF0dHJpYnV0ZVB0ciAxCitzdGF0aWMgeG1sQXR0cmlidXRlUHRyIGdlbl94bWxBdHRyaWJ1dGVQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX3htbEF0dHJpYnV0ZVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sQXR0cmlidXRlUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbER1bXBBdHRyaWJ1dGVEZWNsKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9PVVRQVVRfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiB0aGUgWE1MIGJ1ZmZlciBvdXRwdXQgKi8KKyAgICBpbnQgbl9idWY7CisgICAgeG1sQXR0cmlidXRlUHRyIGF0dHI7IC8qIEFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiAqLworICAgIGludCBuX2F0dHI7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CisgICAgZm9yIChuX2F0dHIgPSAwO25fYXR0ciA8IGdlbl9uYl94bWxBdHRyaWJ1dGVQdHI7bl9hdHRyKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgYnVmID0gZ2VuX3htbEJ1ZmZlclB0cihuX2J1ZiwgMCk7CisgICAgICAgIGF0dHIgPSBnZW5feG1sQXR0cmlidXRlUHRyKG5fYXR0ciwgMSk7CisKKyAgICAgICAgeG1sRHVtcEF0dHJpYnV0ZURlY2woYnVmLCBhdHRyKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOworICAgICAgICBkZXNfeG1sQXR0cmlidXRlUHRyKG5fYXR0ciwgYXR0ciwgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEdW1wQXR0cmlidXRlRGVjbCIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9hdHRyKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTE0MjIzLDE4ICsxNjM3Niw4MyBAQAogdGVzdF94bWxEdW1wQXR0cmlidXRlVGFibGUodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX09VVFBVVF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBYTUwgYnVmZmVyIG91dHB1dCAqLworICAgIGludCBuX2J1ZjsKKyAgICB4bWxBdHRyaWJ1dGVUYWJsZVB0ciB0YWJsZTsgLyogQW4gYXR0cmlidXRlIHRhYmxlICovCisgICAgaW50IG5fdGFibGU7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CisgICAgZm9yIChuX3RhYmxlID0gMDtuX3RhYmxlIDwgZ2VuX25iX3htbEF0dHJpYnV0ZVRhYmxlUHRyO25fdGFibGUrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBidWYgPSBnZW5feG1sQnVmZmVyUHRyKG5fYnVmLCAwKTsKKyAgICAgICAgdGFibGUgPSBnZW5feG1sQXR0cmlidXRlVGFibGVQdHIobl90YWJsZSwgMSk7CisKKyAgICAgICAgeG1sRHVtcEF0dHJpYnV0ZVRhYmxlKGJ1ZiwgdGFibGUpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CisgICAgICAgIGRlc194bWxBdHRyaWJ1dGVUYWJsZVB0cihuX3RhYmxlLCB0YWJsZSwgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEdW1wQXR0cmlidXRlVGFibGUiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdGFibGUpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIAogCisjZGVmaW5lIGdlbl9uYl94bWxFbGVtZW50UHRyIDEKK3N0YXRpYyB4bWxFbGVtZW50UHRyIGdlbl94bWxFbGVtZW50UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworICAgIHJldHVybihOVUxMKTsKK30KK3N0YXRpYyB2b2lkIGRlc194bWxFbGVtZW50UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxFbGVtZW50UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbER1bXBFbGVtZW50RGVjbCh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfT1VUUFVUX0VOQUJMRUQKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgeG1sQnVmZmVyUHRyIGJ1ZjsgLyogdGhlIFhNTCBidWZmZXIgb3V0cHV0ICovCisgICAgaW50IG5fYnVmOworICAgIHhtbEVsZW1lbnRQdHIgZWxlbTsgLyogQW4gZWxlbWVudCB0YWJsZSAqLworICAgIGludCBuX2VsZW07CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9idWYgPSAwO25fYnVmIDwgZ2VuX25iX3htbEJ1ZmZlclB0cjtuX2J1ZisrKSB7CisgICAgZm9yIChuX2VsZW0gPSAwO25fZWxlbSA8IGdlbl9uYl94bWxFbGVtZW50UHRyO25fZWxlbSsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOworICAgICAgICBlbGVtID0gZ2VuX3htbEVsZW1lbnRQdHIobl9lbGVtLCAxKTsKKworICAgICAgICB4bWxEdW1wRWxlbWVudERlY2woYnVmLCBlbGVtKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOworICAgICAgICBkZXNfeG1sRWxlbWVudFB0cihuX2VsZW0sIGVsZW0sIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRHVtcEVsZW1lbnREZWNsIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMTQyNDMsMTggKzE2NDYxLDgzIEBACiB0ZXN0X3htbER1bXBFbGVtZW50VGFibGUodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX09VVFBVVF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBYTUwgYnVmZmVyIG91dHB1dCAqLworICAgIGludCBuX2J1ZjsKKyAgICB4bWxFbGVtZW50VGFibGVQdHIgdGFibGU7IC8qIEFuIGVsZW1lbnQgdGFibGUgKi8KKyAgICBpbnQgbl90YWJsZTsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKKyAgICBmb3IgKG5fdGFibGUgPSAwO25fdGFibGUgPCBnZW5fbmJfeG1sRWxlbWVudFRhYmxlUHRyO25fdGFibGUrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBidWYgPSBnZW5feG1sQnVmZmVyUHRyKG5fYnVmLCAwKTsKKyAgICAgICAgdGFibGUgPSBnZW5feG1sRWxlbWVudFRhYmxlUHRyKG5fdGFibGUsIDEpOworCisgICAgICAgIHhtbER1bXBFbGVtZW50VGFibGUoYnVmLCB0YWJsZSk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbEJ1ZmZlclB0cihuX2J1ZiwgYnVmLCAwKTsKKyAgICAgICAgZGVzX3htbEVsZW1lbnRUYWJsZVB0cihuX3RhYmxlLCB0YWJsZSwgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEdW1wRWxlbWVudFRhYmxlIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWYpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3RhYmxlKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKIAorI2RlZmluZSBnZW5fbmJfeG1sTm90YXRpb25QdHIgMQorc3RhdGljIHhtbE5vdGF0aW9uUHRyIGdlbl94bWxOb3RhdGlvblB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfeG1sTm90YXRpb25QdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbE5vdGF0aW9uUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbER1bXBOb3RhdGlvbkRlY2wodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX09VVFBVVF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbEJ1ZmZlclB0ciBidWY7IC8qIHRoZSBYTUwgYnVmZmVyIG91dHB1dCAqLworICAgIGludCBuX2J1ZjsKKyAgICB4bWxOb3RhdGlvblB0ciBub3RhOyAvKiBBIG5vdGF0aW9uIGRlY2xhcmF0aW9uICovCisgICAgaW50IG5fbm90YTsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2J1ZiA9IDA7bl9idWYgPCBnZW5fbmJfeG1sQnVmZmVyUHRyO25fYnVmKyspIHsKKyAgICBmb3IgKG5fbm90YSA9IDA7bl9ub3RhIDwgZ2VuX25iX3htbE5vdGF0aW9uUHRyO25fbm90YSsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGJ1ZiA9IGdlbl94bWxCdWZmZXJQdHIobl9idWYsIDApOworICAgICAgICBub3RhID0gZ2VuX3htbE5vdGF0aW9uUHRyKG5fbm90YSwgMSk7CisKKyAgICAgICAgeG1sRHVtcE5vdGF0aW9uRGVjbChidWYsIG5vdGEpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxCdWZmZXJQdHIobl9idWYsIGJ1ZiwgMCk7CisgICAgICAgIGRlc194bWxOb3RhdGlvblB0cihuX25vdGEsIG5vdGEsIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRHVtcE5vdGF0aW9uRGVjbCIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub3RhKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTE0MjYzLDggKzE2NTQ2LDM3IEBACiB0ZXN0X3htbER1bXBOb3RhdGlvblRhYmxlKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9PVVRQVVRfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICB4bWxCdWZmZXJQdHIgYnVmOyAvKiB0aGUgWE1MIGJ1ZmZlciBvdXRwdXQgKi8KKyAgICBpbnQgbl9idWY7CisgICAgeG1sTm90YXRpb25UYWJsZVB0ciB0YWJsZTsgLyogQSBub3RhdGlvbiB0YWJsZSAqLworICAgIGludCBuX3RhYmxlOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl94bWxCdWZmZXJQdHI7bl9idWYrKykgeworICAgIGZvciAobl90YWJsZSA9IDA7bl90YWJsZSA8IGdlbl9uYl94bWxOb3RhdGlvblRhYmxlUHRyO25fdGFibGUrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBidWYgPSBnZW5feG1sQnVmZmVyUHRyKG5fYnVmLCAwKTsKKyAgICAgICAgdGFibGUgPSBnZW5feG1sTm90YXRpb25UYWJsZVB0cihuX3RhYmxlLCAxKTsKKworICAgICAgICB4bWxEdW1wTm90YXRpb25UYWJsZShidWYsIHRhYmxlKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sQnVmZmVyUHRyKG5fYnVmLCBidWYsIDApOworICAgICAgICBkZXNfeG1sTm90YXRpb25UYWJsZVB0cihuX3RhYmxlLCB0YWJsZSwgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxEdW1wTm90YXRpb25UYWJsZSIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90YWJsZSk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xNDM5Myw3ICsxNjcwNSw3IEBACiAgICAgaW50IHJldF92YWw7CiAgICAgeG1sRG9jUHRyIGRvYzsgLyogdGhlIGRvY3VtZW50ICovCiAgICAgaW50IG5fZG9jOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgZWxlbWVudCBuYW1lICovCisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBlbGVtZW50IG5hbWUgKi8KICAgICBpbnQgbl9uYW1lOwogCiAgICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKQEAgLTE0NTcyLDggKzE2ODg0LDQ5IEBACiB0ZXN0X3htbFNucHJpbnRmRWxlbWVudENvbnRlbnQodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisgICAgaW50IG1lbV9iYXNlOworICAgIGNoYXIgKiBidWY7IC8qIGFuIG91dHB1dCBidWZmZXIgKi8KKyAgICBpbnQgbl9idWY7CisgICAgaW50IHNpemU7IC8qIHRoZSBidWZmZXIgc2l6ZSAqLworICAgIGludCBuX3NpemU7CisgICAgeG1sRWxlbWVudENvbnRlbnRQdHIgY29udGVudDsgLyogQW4gZWxlbWVudCB0YWJsZSAqLworICAgIGludCBuX2NvbnRlbnQ7CisgICAgaW50IGdsb2I7IC8qIDEgaWYgb25lIG11c3QgcHJpbnQgdGhlIGVuZ2xvYmluZyBwYXJlbnRoZXNpcywgMCBvdGhlcndpc2UgKi8KKyAgICBpbnQgbl9nbG9iOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl9jaGFyX3B0cjtuX2J1ZisrKSB7CisgICAgZm9yIChuX3NpemUgPSAwO25fc2l6ZSA8IGdlbl9uYl9pbnQ7bl9zaXplKyspIHsKKyAgICBmb3IgKG5fY29udGVudCA9IDA7bl9jb250ZW50IDwgZ2VuX25iX3htbEVsZW1lbnRDb250ZW50UHRyO25fY29udGVudCsrKSB7CisgICAgZm9yIChuX2dsb2IgPSAwO25fZ2xvYiA8IGdlbl9uYl9pbnQ7bl9nbG9iKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgYnVmID0gZ2VuX2NoYXJfcHRyKG5fYnVmLCAwKTsKKyAgICAgICAgc2l6ZSA9IGdlbl9pbnQobl9zaXplLCAxKTsKKyAgICAgICAgY29udGVudCA9IGdlbl94bWxFbGVtZW50Q29udGVudFB0cihuX2NvbnRlbnQsIDIpOworICAgICAgICBnbG9iID0gZ2VuX2ludChuX2dsb2IsIDMpOworCisgICAgICAgIHhtbFNucHJpbnRmRWxlbWVudENvbnRlbnQoYnVmLCBzaXplLCBjb250ZW50LCBnbG9iKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfY2hhcl9wdHIobl9idWYsIGJ1ZiwgMCk7CisgICAgICAgIGRlc19pbnQobl9zaXplLCBzaXplLCAxKTsKKyAgICAgICAgZGVzX3htbEVsZW1lbnRDb250ZW50UHRyKG5fY29udGVudCwgY29udGVudCwgMik7CisgICAgICAgIGRlc19pbnQobl9nbG9iLCBnbG9iLCAzKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNucHJpbnRmRWxlbWVudENvbnRlbnQiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2l6ZSk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZ2xvYik7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xNDU4Miw4ICsxNjkzNSw0MiBAQAogdGVzdF94bWxTcHJpbnRmRWxlbWVudENvbnRlbnQodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisgICAgaW50IG1lbV9iYXNlOworICAgIGNoYXIgKiBidWY7IC8qIGFuIG91dHB1dCBidWZmZXIgKi8KKyAgICBpbnQgbl9idWY7CisgICAgeG1sRWxlbWVudENvbnRlbnRQdHIgY29udGVudDsgLyogQW4gZWxlbWVudCB0YWJsZSAqLworICAgIGludCBuX2NvbnRlbnQ7CisgICAgaW50IGdsb2I7IC8qIDEgaWYgb25lIG11c3QgcHJpbnQgdGhlIGVuZ2xvYmluZyBwYXJlbnRoZXNpcywgMCBvdGhlcndpc2UgKi8KKyAgICBpbnQgbl9nbG9iOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fYnVmID0gMDtuX2J1ZiA8IGdlbl9uYl9jaGFyX3B0cjtuX2J1ZisrKSB7CisgICAgZm9yIChuX2NvbnRlbnQgPSAwO25fY29udGVudCA8IGdlbl9uYl94bWxFbGVtZW50Q29udGVudFB0cjtuX2NvbnRlbnQrKykgeworICAgIGZvciAobl9nbG9iID0gMDtuX2dsb2IgPCBnZW5fbmJfaW50O25fZ2xvYisrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGJ1ZiA9IGdlbl9jaGFyX3B0cihuX2J1ZiwgMCk7CisgICAgICAgIGNvbnRlbnQgPSBnZW5feG1sRWxlbWVudENvbnRlbnRQdHIobl9jb250ZW50LCAxKTsKKyAgICAgICAgZ2xvYiA9IGdlbl9pbnQobl9nbG9iLCAyKTsKKworICAgICAgICB4bWxTcHJpbnRmRWxlbWVudENvbnRlbnQoYnVmLCBjb250ZW50LCBnbG9iKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfY2hhcl9wdHIobl9idWYsIGJ1ZiwgMCk7CisgICAgICAgIGRlc194bWxFbGVtZW50Q29udGVudFB0cihuX2NvbnRlbnQsIGNvbnRlbnQsIDEpOworICAgICAgICBkZXNfaW50KG5fZ2xvYiwgZ2xvYiwgMik7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTcHJpbnRmRWxlbWVudENvbnRlbnQiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1Zik7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGVudCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZ2xvYik7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTE0NTkyLDggKzE2OTc5LDM5IEBACiB0ZXN0X3htbFZhbGlkQnVpbGRDb250ZW50TW9kZWwodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX1JFR0VYUF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbFZhbGlkQ3R4dFB0ciBjdHh0OyAvKiBhIHZhbGlkYXRpb24gY29udGV4dCAqLworICAgIGludCBuX2N0eHQ7CisgICAgeG1sRWxlbWVudFB0ciBlbGVtOyAvKiBhbiBlbGVtZW50IGRlY2xhcmF0aW9uIG5vZGUgKi8KKyAgICBpbnQgbl9lbGVtOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgeworICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfeG1sRWxlbWVudFB0cjtuX2VsZW0rKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBjdHh0ID0gZ2VuX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOworICAgICAgICBlbGVtID0gZ2VuX3htbEVsZW1lbnRQdHIobl9lbGVtLCAxKTsKKworICAgICAgICByZXRfdmFsID0geG1sVmFsaWRCdWlsZENvbnRlbnRNb2RlbChjdHh0LCBlbGVtKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CisgICAgICAgIGRlc194bWxFbGVtZW50UHRyKG5fZWxlbSwgZWxlbSwgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZEJ1aWxkQ29udGVudE1vZGVsIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbGVtKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTE0NjExLDkgKzE3MDI5LDkgQEAKICAgICBpbnQgbl9kb2M7CiAgICAgeG1sTm9kZVB0ciBlbGVtOyAvKiB0aGUgcGFyZW50ICovCiAgICAgaW50IG5fZWxlbTsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTsgLyogdGhlIGF0dHJpYnV0ZSBuYW1lICovCisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBhdHRyaWJ1dGUgbmFtZSAqLwogICAgIGludCBuX25hbWU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgYXR0cmlidXRlIHZhbHVlICovCisgICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgYXR0cmlidXRlIHZhbHVlICovCiAgICAgaW50IG5fdmFsdWU7CiAKICAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewpAQCAtMTQ2NjAsNiArMTcwNzgsMTMgQEAKIH0KIAogCisjZGVmaW5lIGdlbl9uYl94bWxFbGVtZW50Q29udGVudF9wdHIgMQorc3RhdGljIHhtbEVsZW1lbnRDb250ZW50ICogZ2VuX3htbEVsZW1lbnRDb250ZW50X3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfeG1sRWxlbWVudENvbnRlbnRfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxFbGVtZW50Q29udGVudCAqIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbFZhbGlkR2V0UG90ZW50aWFsQ2hpbGRyZW4odm9pZCkgewogICAgIGludCByZXQgPSAwOwpAQCAtMTQ2OTEsOSArMTcxMTYsOSBAQAogICAgIGludCBuX2RvYzsKICAgICB4bWxOb2RlUHRyIGVsZW07IC8qIHRoZSBwYXJlbnQgKi8KICAgICBpbnQgbl9lbGVtOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgYXR0cmlidXRlIG5hbWUgKi8KKyAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIGF0dHJpYnV0ZSBuYW1lICovCiAgICAgaW50IG5fbmFtZTsKLSAgICBjb25zdCB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSBhdHRyaWJ1dGUgdmFsdWUgKi8KKyAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSBhdHRyaWJ1dGUgdmFsdWUgKi8KICAgICBpbnQgbl92YWx1ZTsKIAogICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CkBAIC0xNDczOSw4ICsxNzE2NCw0NiBAQAogdGVzdF94bWxWYWxpZGF0ZUF0dHJpYnV0ZURlY2wodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX1ZBTElEX0VOQUJMRUQKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgaW50IHJldF92YWw7CisgICAgeG1sVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KKyAgICBpbnQgbl9jdHh0OworICAgIHhtbERvY1B0ciBkb2M7IC8qIGEgZG9jdW1lbnQgaW5zdGFuY2UgKi8KKyAgICBpbnQgbl9kb2M7CisgICAgeG1sQXR0cmlidXRlUHRyIGF0dHI7IC8qIGFuIGF0dHJpYnV0ZSBkZWZpbml0aW9uICovCisgICAgaW50IG5fYXR0cjsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKKyAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgeworICAgIGZvciAobl9hdHRyID0gMDtuX2F0dHIgPCBnZW5fbmJfeG1sQXR0cmlidXRlUHRyO25fYXR0cisrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGN0eHQgPSBnZW5feG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CisgICAgICAgIGRvYyA9IGdlbl94bWxEb2NQdHIobl9kb2MsIDEpOworICAgICAgICBhdHRyID0gZ2VuX3htbEF0dHJpYnV0ZVB0cihuX2F0dHIsIDIpOworCisgICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZUF0dHJpYnV0ZURlY2woY3R4dCwgZG9jLCBhdHRyKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CisgICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CisgICAgICAgIGRlc194bWxBdHRyaWJ1dGVQdHIobl9hdHRyLCBhdHRyLCAyKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFZhbGlkYXRlQXR0cmlidXRlRGVjbCIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9hdHRyKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xNDk3OCw4ICsxNzQ0MSw0NiBAQAogdGVzdF94bWxWYWxpZGF0ZUVsZW1lbnREZWNsKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9WQUxJRF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbFZhbGlkQ3R4dFB0ciBjdHh0OyAvKiB0aGUgdmFsaWRhdGlvbiBjb250ZXh0ICovCisgICAgaW50IG5fY3R4dDsKKyAgICB4bWxEb2NQdHIgZG9jOyAvKiBhIGRvY3VtZW50IGluc3RhbmNlICovCisgICAgaW50IG5fZG9jOworICAgIHhtbEVsZW1lbnRQdHIgZWxlbTsgLyogYW4gZWxlbWVudCBkZWZpbml0aW9uICovCisgICAgaW50IG5fZWxlbTsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKKyAgICBmb3IgKG5fZG9jID0gMDtuX2RvYyA8IGdlbl9uYl94bWxEb2NQdHI7bl9kb2MrKykgeworICAgIGZvciAobl9lbGVtID0gMDtuX2VsZW0gPCBnZW5fbmJfeG1sRWxlbWVudFB0cjtuX2VsZW0rKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBjdHh0ID0gZ2VuX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOworICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKKyAgICAgICAgZWxlbSA9IGdlbl94bWxFbGVtZW50UHRyKG5fZWxlbSwgMik7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFZhbGlkYXRlRWxlbWVudERlY2woY3R4dCwgZG9jLCBlbGVtKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CisgICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CisgICAgICAgIGRlc194bWxFbGVtZW50UHRyKG5fZWxlbSwgZWxlbSwgMik7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZGF0ZUVsZW1lbnREZWNsIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VsZW0pOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTE0OTkxLDcgKzE3NDkyLDcgQEAKICNpZmRlZiBMSUJYTUxfVkFMSURfRU5BQkxFRAogICAgIGludCBtZW1fYmFzZTsKICAgICBpbnQgcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogdmFsdWU7IC8qIGFuIE5hbWUgdmFsdWUgKi8KKyAgICB4bWxDaGFyICogdmFsdWU7IC8qIGFuIE5hbWUgdmFsdWUgKi8KICAgICBpbnQgbl92YWx1ZTsKIAogICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKQEAgLTE1MDI1LDcgKzE3NTI2LDcgQEAKICNpZmRlZiBMSUJYTUxfVkFMSURfRU5BQkxFRAogICAgIGludCBtZW1fYmFzZTsKICAgICBpbnQgcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogdmFsdWU7IC8qIGFuIE5hbWVzIHZhbHVlICovCisgICAgeG1sQ2hhciAqIHZhbHVlOyAvKiBhbiBOYW1lcyB2YWx1ZSAqLwogICAgIGludCBuX3ZhbHVlOwogCiAgICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgewpAQCAtMTUwNTksNyArMTc1NjAsNyBAQAogI2lmZGVmIExJQlhNTF9WQUxJRF9FTkFCTEVECiAgICAgaW50IG1lbV9iYXNlOwogICAgIGludCByZXRfdmFsOwotICAgIGNvbnN0IHhtbENoYXIgKiB2YWx1ZTsgLyogYW4gTm10b2tlbiB2YWx1ZSAqLworICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogYW4gTm10b2tlbiB2YWx1ZSAqLwogICAgIGludCBuX3ZhbHVlOwogCiAgICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgewpAQCAtMTUwOTMsNyArMTc1OTQsNyBAQAogI2lmZGVmIExJQlhNTF9WQUxJRF9FTkFCTEVECiAgICAgaW50IG1lbV9iYXNlOwogICAgIGludCByZXRfdmFsOwotICAgIGNvbnN0IHhtbENoYXIgKiB2YWx1ZTsgLyogYW4gTm10b2tlbnMgdmFsdWUgKi8KKyAgICB4bWxDaGFyICogdmFsdWU7IC8qIGFuIE5tdG9rZW5zIHZhbHVlICovCiAgICAgaW50IG5fdmFsdWU7CiAKICAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CkBAIC0xNTEyNCw4ICsxNzYyNSw0NiBAQAogdGVzdF94bWxWYWxpZGF0ZU5vdGF0aW9uRGVjbCh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfVkFMSURfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB4bWxWYWxpZEN0eHRQdHIgY3R4dDsgLyogdGhlIHZhbGlkYXRpb24gY29udGV4dCAqLworICAgIGludCBuX2N0eHQ7CisgICAgeG1sRG9jUHRyIGRvYzsgLyogYSBkb2N1bWVudCBpbnN0YW5jZSAqLworICAgIGludCBuX2RvYzsKKyAgICB4bWxOb3RhdGlvblB0ciBub3RhOyAvKiBhIG5vdGF0aW9uIGRlZmluaXRpb24gKi8KKyAgICBpbnQgbl9ub3RhOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgeworICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CisgICAgZm9yIChuX25vdGEgPSAwO25fbm90YSA8IGdlbl9uYl94bWxOb3RhdGlvblB0cjtuX25vdGErKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBjdHh0ID0gZ2VuX3htbFZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOworICAgICAgICBkb2MgPSBnZW5feG1sRG9jUHRyKG5fZG9jLCAxKTsKKyAgICAgICAgbm90YSA9IGdlbl94bWxOb3RhdGlvblB0cihuX25vdGEsIDIpOworCisgICAgICAgIHJldF92YWwgPSB4bWxWYWxpZGF0ZU5vdGF0aW9uRGVjbChjdHh0LCBkb2MsIG5vdGEpOworICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKKyAgICAgICAgZGVzX3htbERvY1B0cihuX2RvYywgZG9jLCAxKTsKKyAgICAgICAgZGVzX3htbE5vdGF0aW9uUHRyKG5fbm90YSwgbm90YSwgMik7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxWYWxpZGF0ZU5vdGF0aW9uRGVjbCIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZG9jKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub3RhKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xNTE0MSw3ICsxNzY4MCw3IEBACiAgICAgaW50IG5fY3R4dDsKICAgICB4bWxEb2NQdHIgZG9jOyAvKiB0aGUgZG9jdW1lbnQgKi8KICAgICBpbnQgbl9kb2M7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5vdGF0aW9uTmFtZTsgLyogdGhlIG5vdGF0aW9uIG5hbWUgdG8gY2hlY2sgKi8KKyAgICB4bWxDaGFyICogbm90YXRpb25OYW1lOyAvKiB0aGUgbm90YXRpb24gbmFtZSB0byBjaGVjayAqLwogICAgIGludCBuX25vdGF0aW9uTmFtZTsKIAogICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CkBAIC0xNTE5Myw3ICsxNzczMiw3IEBACiAgICAgaW50IG5fZWxlbTsKICAgICB4bWxBdHRyUHRyIGF0dHI7IC8qIGFuIGF0dHJpYnV0ZSBpbnN0YW5jZSAqLwogICAgIGludCBuX2F0dHI7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgYXR0cmlidXRlIHZhbHVlICh3aXRob3V0IGVudGl0aWVzIHByb2Nlc3NpbmcpICovCisgICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgYXR0cmlidXRlIHZhbHVlICh3aXRob3V0IGVudGl0aWVzIHByb2Nlc3NpbmcpICovCiAgICAgaW50IG5fdmFsdWU7CiAKICAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewpAQCAtMTUzMDEsMTEgKzE3ODQwLDExIEBACiAgICAgaW50IG5fZG9jOwogICAgIHhtbE5vZGVQdHIgZWxlbTsgLyogYW4gZWxlbWVudCBpbnN0YW5jZSAqLwogICAgIGludCBuX2VsZW07Ci0gICAgY29uc3QgeG1sQ2hhciAqIHByZWZpeDsgLyogdGhlIG5hbWVzcGFjZSBwcmVmaXggKi8KKyAgICB4bWxDaGFyICogcHJlZml4OyAvKiB0aGUgbmFtZXNwYWNlIHByZWZpeCAqLwogICAgIGludCBuX3ByZWZpeDsKICAgICB4bWxOc1B0ciBuczsgLyogYW4gbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGluc3RhbmNlICovCiAgICAgaW50IG5fbnM7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgYXR0cmlidXRlIHZhbHVlICh3aXRob3V0IGVudGl0aWVzIHByb2Nlc3NpbmcpICovCisgICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgYXR0cmlidXRlIHZhbHVlICh3aXRob3V0IGVudGl0aWVzIHByb2Nlc3NpbmcpICovCiAgICAgaW50IG5fdmFsdWU7CiAKICAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewpAQCAtMTUzNzAsNyArMTc5MDksNyBAQAogICAgIGludCBuX2RvYzsKICAgICB4bWxOb2RlUHRyIGVsZW07IC8qIGFuIGVsZW1lbnQgaW5zdGFuY2UgKi8KICAgICBpbnQgbl9lbGVtOwotICAgIGNvbnN0IHhtbENoYXIgKiBxbmFtZTsgLyogdGhlIHF1YWxpZmllZCBuYW1lIGFzIGFwcGVhcmluZyBpbiB0aGUgc2VyaWFsaXphdGlvbiAqLworICAgIHhtbENoYXIgKiBxbmFtZTsgLyogdGhlIHF1YWxpZmllZCBuYW1lIGFzIGFwcGVhcmluZyBpbiB0aGUgc2VyaWFsaXphdGlvbiAqLwogICAgIGludCBuX3FuYW1lOwogCiAgICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKQEAgLTE1NDIxLDcgKzE3OTYwLDcgQEAKICAgICBpbnQgcmV0X3ZhbDsKICAgICB4bWxWYWxpZEN0eHRQdHIgY3R4dDsgLyogdGhlIHZhbGlkYXRpb24gY29udGV4dCAqLwogICAgIGludCBuX2N0eHQ7Ci0gICAgY29uc3QgeG1sQ2hhciAqIGRhdGE7IC8qIHNvbWUgY2hhcmFjdGVyIGRhdGEgcmVhZCAqLworICAgIHhtbENoYXIgKiBkYXRhOyAvKiBzb21lIGNoYXJhY3RlciBkYXRhIHJlYWQgKi8KICAgICBpbnQgbl9kYXRhOwogICAgIGludCBsZW47IC8qIHRoZSBsZW5naHQgb2YgdGhlIGRhdGEgKi8KICAgICBpbnQgbl9sZW47CkBAIC0xNTQ3Myw3ICsxODAxMiw3IEBACiAgICAgaW50IG5fZG9jOwogICAgIHhtbE5vZGVQdHIgZWxlbTsgLyogYW4gZWxlbWVudCBpbnN0YW5jZSAqLwogICAgIGludCBuX2VsZW07Ci0gICAgY29uc3QgeG1sQ2hhciAqIHFuYW1lOyAvKiB0aGUgcXVhbGlmaWVkIG5hbWUgYXMgYXBwZWFyaW5nIGluIHRoZSBzZXJpYWxpemF0aW9uICovCisgICAgeG1sQ2hhciAqIHFuYW1lOyAvKiB0aGUgcXVhbGlmaWVkIG5hbWUgYXMgYXBwZWFyaW5nIGluIHRoZSBzZXJpYWxpemF0aW9uICovCiAgICAgaW50IG5fcW5hbWU7CiAKICAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgewpAQCAtMTU1NTksNyArMTgwOTgsNyBAQAogdGVzdF92YWxpZCh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKLSAgICBwcmludGYoIlRlc3RpbmcgdmFsaWQgOiAyNCBvZiA2NyBmdW5jdGlvbnMgLi4uXG4iKTsKKyAgICBwcmludGYoIlRlc3RpbmcgdmFsaWQgOiAzNiBvZiA2NyBmdW5jdGlvbnMgLi4uXG4iKTsKICAgICByZXQgKz0gdGVzdF94bWxBZGRBdHRyaWJ1dGVEZWNsKCk7CiAgICAgcmV0ICs9IHRlc3RfeG1sQWRkRWxlbWVudERlY2woKTsKICAgICByZXQgKz0gdGVzdF94bWxBZGRJRCgpOwpAQCAtMTU3MTAsMTIgKzE4MjQ5LDUwIEBACiB9CiAKIAorI2RlZmluZSBnZW5fbmJfeG1sWEluY2x1ZGVDdHh0UHRyIDEKK3N0YXRpYyB4bWxYSW5jbHVkZUN0eHRQdHIgZ2VuX3htbFhJbmNsdWRlQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfeG1sWEluY2x1ZGVDdHh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxYSW5jbHVkZUN0eHRQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cit9CisKIHN0YXRpYyBpbnQKIHRlc3RfeG1sWEluY2x1ZGVQcm9jZXNzTm9kZSh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfWElOQ0xVREVfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB4bWxYSW5jbHVkZUN0eHRQdHIgY3R4dDsgLyogYW4gZXhpc3RpbmcgWEluY2x1ZGUgY29udGV4dCAqLworICAgIGludCBuX2N0eHQ7CisgICAgeG1sTm9kZVB0ciBub2RlOyAvKiBhIG5vZGUgaW4gYW4gWE1MIGRvY3VtZW50ICovCisgICAgaW50IG5fbm9kZTsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYSW5jbHVkZUN0eHRQdHI7bl9jdHh0KyspIHsKKyAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgY3R4dCA9IGdlbl94bWxYSW5jbHVkZUN0eHRQdHIobl9jdHh0LCAwKTsKKyAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMSk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFhJbmNsdWRlUHJvY2Vzc05vZGUoY3R4dCwgbm9kZSk7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbFhJbmNsdWRlQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOworICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWEluY2x1ZGVQcm9jZXNzTm9kZSIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xNTc5OSw4ICsxODM3NiwzOSBAQAogdGVzdF94bWxYSW5jbHVkZVNldEZsYWdzKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9YSU5DTFVERV9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbFhJbmNsdWRlQ3R4dFB0ciBjdHh0OyAvKiBhbiBYSW5jbHVkZSBwcm9jZXNzaW5nIGNvbnRleHQgKi8KKyAgICBpbnQgbl9jdHh0OworICAgIGludCBmbGFnczsgLyogYSBzZXQgb2YgeG1sUGFyc2VyT3B0aW9uIHVzZWQgZm9yIHBhcnNpbmcgWE1MIGluY2x1ZGVzICovCisgICAgaW50IG5fZmxhZ3M7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWEluY2x1ZGVDdHh0UHRyO25fY3R4dCsrKSB7CisgICAgZm9yIChuX2ZsYWdzID0gMDtuX2ZsYWdzIDwgZ2VuX25iX2ludDtuX2ZsYWdzKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgY3R4dCA9IGdlbl94bWxYSW5jbHVkZUN0eHRQdHIobl9jdHh0LCAwKTsKKyAgICAgICAgZmxhZ3MgPSBnZW5faW50KG5fZmxhZ3MsIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxYSW5jbHVkZVNldEZsYWdzKGN0eHQsIGZsYWdzKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sWEluY2x1ZGVDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CisgICAgICAgIGRlc19pbnQobl9mbGFncywgZmxhZ3MsIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWEluY2x1ZGVTZXRGbGFncyIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmxhZ3MpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMTU4MDgsNyArMTg0MTYsNyBAQAogdGVzdF94aW5jbHVkZSh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKLSAgICBwcmludGYoIlRlc3RpbmcgeGluY2x1ZGUgOiA0IG9mIDggZnVuY3Rpb25zIC4uLlxuIik7CisgICAgcHJpbnRmKCJUZXN0aW5nIHhpbmNsdWRlIDogNiBvZiA4IGZ1bmN0aW9ucyAuLi5cbiIpOwogICAgIHJldCArPSB0ZXN0X3htbFhJbmNsdWRlTmV3Q29udGV4dCgpOwogICAgIHJldCArPSB0ZXN0X3htbFhJbmNsdWRlUHJvY2VzcygpOwogICAgIHJldCArPSB0ZXN0X3htbFhJbmNsdWRlUHJvY2Vzc0ZsYWdzKCk7CkBAIC0xNTg0OCw3ICsxODQ1Niw3IEBACiAKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgaW50IHJldF92YWw7Ci0gICAgY29uc3QgY2hhciAqIHBhdGg7IC8qIHRoZSBwYXRoIHRvIGNoZWNrICovCisgICAgY2hhciAqIHBhdGg7IC8qIHRoZSBwYXRoIHRvIGNoZWNrICovCiAgICAgaW50IG5fcGF0aDsKIAogICAgIGZvciAobl9wYXRoID0gMDtuX3BhdGggPCBnZW5fbmJfY29uc3RfY2hhcl9wdHI7bl9wYXRoKyspIHsKQEAgLTE2MDMyLDggKzE4NjQwLDQ0IEBACiB0ZXN0X3htbEZpbGVSZWFkKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB2b2lkICogY29udGV4dDsgLyogdGhlIEkvTyBjb250ZXh0ICovCisgICAgaW50IG5fY29udGV4dDsKKyAgICBjaGFyICogYnVmZmVyOyAvKiB3aGVyZSB0byBkcm9wIGRhdGEgKi8KKyAgICBpbnQgbl9idWZmZXI7CisgICAgaW50IGxlbjsgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlICovCisgICAgaW50IG5fbGVuOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fY29udGV4dCA9IDA7bl9jb250ZXh0IDwgZ2VuX25iX3ZvaWRfcHRyO25fY29udGV4dCsrKSB7CisgICAgZm9yIChuX2J1ZmZlciA9IDA7bl9idWZmZXIgPCBnZW5fbmJfY2hhcl9wdHI7bl9idWZmZXIrKykgeworICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGNvbnRleHQgPSBnZW5fdm9pZF9wdHIobl9jb250ZXh0LCAwKTsKKyAgICAgICAgYnVmZmVyID0gZ2VuX2NoYXJfcHRyKG5fYnVmZmVyLCAxKTsKKyAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbEZpbGVSZWFkKGNvbnRleHQsIGJ1ZmZlciwgbGVuKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfdm9pZF9wdHIobl9jb250ZXh0LCBjb250ZXh0LCAwKTsKKyAgICAgICAgZGVzX2NoYXJfcHRyKG5fYnVmZmVyLCBidWZmZXIsIDEpOworICAgICAgICBkZXNfaW50KG5fbGVuLCBsZW4sIDIpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sRmlsZVJlYWQiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2NvbnRleHQpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2J1ZmZlcik7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbGVuKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMTYxNDQsOCArMTg3ODgsNDYgQEAKIHRlc3RfeG1sSU9GVFBSZWFkKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9GVFBfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB2b2lkICogY29udGV4dDsgLyogdGhlIEkvTyBjb250ZXh0ICovCisgICAgaW50IG5fY29udGV4dDsKKyAgICBjaGFyICogYnVmZmVyOyAvKiB3aGVyZSB0byBkcm9wIGRhdGEgKi8KKyAgICBpbnQgbl9idWZmZXI7CisgICAgaW50IGxlbjsgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlICovCisgICAgaW50IG5fbGVuOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fY29udGV4dCA9IDA7bl9jb250ZXh0IDwgZ2VuX25iX3ZvaWRfcHRyO25fY29udGV4dCsrKSB7CisgICAgZm9yIChuX2J1ZmZlciA9IDA7bl9idWZmZXIgPCBnZW5fbmJfY2hhcl9wdHI7bl9idWZmZXIrKykgeworICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGNvbnRleHQgPSBnZW5fdm9pZF9wdHIobl9jb250ZXh0LCAwKTsKKyAgICAgICAgYnVmZmVyID0gZ2VuX2NoYXJfcHRyKG5fYnVmZmVyLCAxKTsKKyAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbElPRlRQUmVhZChjb250ZXh0LCBidWZmZXIsIGxlbik7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3ZvaWRfcHRyKG5fY29udGV4dCwgY29udGV4dCwgMCk7CisgICAgICAgIGRlc19jaGFyX3B0cihuX2J1ZmZlciwgYnVmZmVyLCAxKTsKKyAgICAgICAgZGVzX2ludChuX2xlbiwgbGVuLCAyKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbElPRlRQUmVhZCIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY29udGV4dCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fYnVmZmVyKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sZW4pOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTE2MjY2LDggKzE4OTQ4LDQ2IEBACiB0ZXN0X3htbElPSFRUUFJlYWQodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX0hUVFBfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB2b2lkICogY29udGV4dDsgLyogdGhlIEkvTyBjb250ZXh0ICovCisgICAgaW50IG5fY29udGV4dDsKKyAgICBjaGFyICogYnVmZmVyOyAvKiB3aGVyZSB0byBkcm9wIGRhdGEgKi8KKyAgICBpbnQgbl9idWZmZXI7CisgICAgaW50IGxlbjsgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlICovCisgICAgaW50IG5fbGVuOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fY29udGV4dCA9IDA7bl9jb250ZXh0IDwgZ2VuX25iX3ZvaWRfcHRyO25fY29udGV4dCsrKSB7CisgICAgZm9yIChuX2J1ZmZlciA9IDA7bl9idWZmZXIgPCBnZW5fbmJfY2hhcl9wdHI7bl9idWZmZXIrKykgeworICAgIGZvciAobl9sZW4gPSAwO25fbGVuIDwgZ2VuX25iX2ludDtuX2xlbisrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGNvbnRleHQgPSBnZW5fdm9pZF9wdHIobl9jb250ZXh0LCAwKTsKKyAgICAgICAgYnVmZmVyID0gZ2VuX2NoYXJfcHRyKG5fYnVmZmVyLCAxKTsKKyAgICAgICAgbGVuID0gZ2VuX2ludChuX2xlbiwgMik7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbElPSFRUUFJlYWQoY29udGV4dCwgYnVmZmVyLCBsZW4pOworICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc192b2lkX3B0cihuX2NvbnRleHQsIGNvbnRleHQsIDApOworICAgICAgICBkZXNfY2hhcl9wdHIobl9idWZmZXIsIGJ1ZmZlciwgMSk7CisgICAgICAgIGRlc19pbnQobl9sZW4sIGxlbiwgMik7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxJT0hUVFBSZWFkIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb250ZXh0KTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9idWZmZXIpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMTYyODgsNyArMTkwMDgsNyBAQAogCiAgICAgaW50IG1lbV9iYXNlOwogICAgIHhtbENoYXIgKiByZXRfdmFsOwotICAgIGNvbnN0IHhtbENoYXIgKiBwYXRoOyAvKiB0aGUgaW5wdXQgZmlsZSBwYXRoICovCisgICAgeG1sQ2hhciAqIHBhdGg7IC8qIHRoZSBpbnB1dCBmaWxlIHBhdGggKi8KICAgICBpbnQgbl9wYXRoOwogCiAgICAgZm9yIChuX3BhdGggPSAwO25fcGF0aCA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3BhdGgrKykgewpAQCAtMTYzOTksNyArMTkxMTksNyBAQAogICAgIGludCBuX291dDsKICAgICBpbnQgbGVuOyAvKiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYXJyYXkuICovCiAgICAgaW50IG5fbGVuOwotICAgIGNvbnN0IGNoYXIgKiBidWY7IC8qIGFuIGNoYXIgYXJyYXkgKi8KKyAgICBjaGFyICogYnVmOyAvKiBhbiBjaGFyIGFycmF5ICovCiAgICAgaW50IG5fYnVmOwogCiAgICAgZm9yIChuX291dCA9IDA7bl9vdXQgPCBnZW5fbmJfeG1sT3V0cHV0QnVmZmVyUHRyO25fb3V0KyspIHsKQEAgLTE2NDU1LDcgKzE5MTc1LDcgQEAKICAgICBpbnQgcmV0X3ZhbDsKICAgICB4bWxPdXRwdXRCdWZmZXJQdHIgb3V0OyAvKiBhIGJ1ZmZlcmVkIHBhcnNlciBvdXRwdXQgKi8KICAgICBpbnQgbl9vdXQ7Ci0gICAgY29uc3QgY2hhciAqIHN0cjsgLyogYSB6ZXJvIHRlcm1pbmF0ZWQgQyBzdHJpbmcgKi8KKyAgICBjaGFyICogc3RyOyAvKiBhIHplcm8gdGVybWluYXRlZCBDIHN0cmluZyAqLwogICAgIGludCBuX3N0cjsKIAogICAgIGZvciAobl9vdXQgPSAwO25fb3V0IDwgZ2VuX25iX3htbE91dHB1dEJ1ZmZlclB0cjtuX291dCsrKSB7CkBAIC0xNjYwNiw3ICsxOTMyNiw3IEBACiAgICAgaW50IG5faW47CiAgICAgaW50IGxlbjsgLyogdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGFycmF5LiAqLwogICAgIGludCBuX2xlbjsKLSAgICBjb25zdCBjaGFyICogYnVmOyAvKiBhbiBjaGFyIGFycmF5ICovCisgICAgY2hhciAqIGJ1ZjsgLyogYW4gY2hhciBhcnJheSAqLwogICAgIGludCBuX2J1ZjsKIAogICAgIGZvciAobl9pbiA9IDA7bl9pbiA8IGdlbl9uYl94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cjtuX2luKyspIHsKQEAgLTE2ODAyLDcgKzE5NTIyLDcgQEAKIHRlc3RfeG1sSU8odm9pZCkgewogICAgIGludCByZXQgPSAwOwogCi0gICAgcHJpbnRmKCJUZXN0aW5nIHhtbElPIDogMjMgb2YgNDcgZnVuY3Rpb25zIC4uLlxuIik7CisgICAgcHJpbnRmKCJUZXN0aW5nIHhtbElPIDogMjYgb2YgNDcgZnVuY3Rpb25zIC4uLlxuIik7CiAgICAgcmV0ICs9IHRlc3RfeG1sQWxsb2NPdXRwdXRCdWZmZXIoKTsKICAgICByZXQgKz0gdGVzdF94bWxBbGxvY1BhcnNlcklucHV0QnVmZmVyKCk7CiAgICAgcmV0ICs9IHRlc3RfeG1sQ2hlY2tGaWxlbmFtZSgpOwpAQCAtMTY4NTQsMjIgKzE5NTc0LDg1IEBACiAgICAgcmV0dXJuKHJldCk7CiB9CiAKKyNkZWZpbmUgZ2VuX25iX3htbEdlbmVyaWNFcnJvckZ1bmNfcHRyIDEKK3N0YXRpYyB4bWxHZW5lcmljRXJyb3JGdW5jICogZ2VuX3htbEdlbmVyaWNFcnJvckZ1bmNfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworICAgIHJldHVybihOVUxMKTsKK30KK3N0YXRpYyB2b2lkIGRlc194bWxHZW5lcmljRXJyb3JGdW5jX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sR2VuZXJpY0Vycm9yRnVuYyAqIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X2luaXRHZW5lcmljRXJyb3JEZWZhdWx0RnVuYyh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgeG1sR2VuZXJpY0Vycm9yRnVuYyAqIGhhbmRsZXI7IC8qIHRoZSBoYW5kbGVyICovCisgICAgaW50IG5faGFuZGxlcjsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2hhbmRsZXIgPSAwO25faGFuZGxlciA8IGdlbl9uYl94bWxHZW5lcmljRXJyb3JGdW5jX3B0cjtuX2hhbmRsZXIrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBoYW5kbGVyID0gZ2VuX3htbEdlbmVyaWNFcnJvckZ1bmNfcHRyKG5faGFuZGxlciwgMCk7CisKKyAgICAgICAgaW5pdEdlbmVyaWNFcnJvckRlZmF1bHRGdW5jKGhhbmRsZXIpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxHZW5lcmljRXJyb3JGdW5jX3B0cihuX2hhbmRsZXIsIGhhbmRsZXIsIDApOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4gaW5pdEdlbmVyaWNFcnJvckRlZmF1bHRGdW5jIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9oYW5kbGVyKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKIAorI2RlZmluZSBnZW5fbmJfeG1sRXJyb3JQdHIgMQorc3RhdGljIHhtbEVycm9yUHRyIGdlbl94bWxFcnJvclB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfeG1sRXJyb3JQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbEVycm9yUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbENvcHlFcnJvcih2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgaW50IHJldF92YWw7CisgICAgeG1sRXJyb3JQdHIgZnJvbTsgLyogYSBzb3VyY2UgZXJyb3IgKi8KKyAgICBpbnQgbl9mcm9tOworICAgIHhtbEVycm9yUHRyIHRvOyAvKiBhIHRhcmdldCBlcnJvciAqLworICAgIGludCBuX3RvOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fZnJvbSA9IDA7bl9mcm9tIDwgZ2VuX25iX3htbEVycm9yUHRyO25fZnJvbSsrKSB7CisgICAgZm9yIChuX3RvID0gMDtuX3RvIDwgZ2VuX25iX3htbEVycm9yUHRyO25fdG8rKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBmcm9tID0gZ2VuX3htbEVycm9yUHRyKG5fZnJvbSwgMCk7CisgICAgICAgIHRvID0gZ2VuX3htbEVycm9yUHRyKG5fdG8sIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxDb3B5RXJyb3IoZnJvbSwgdG8pOworICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxFcnJvclB0cihuX2Zyb20sIGZyb20sIDApOworICAgICAgICBkZXNfeG1sRXJyb3JQdHIobl90bywgdG8sIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sQ29weUVycm9yIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mcm9tKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90byk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMTY5MzgsOCArMTk3MjEsMjggQEAKIHRlc3RfeG1sUGFyc2VyUHJpbnRGaWxlQ29udGV4dCh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgeG1sUGFyc2VySW5wdXRQdHIgaW5wdXQ7IC8qIGFuIHhtbFBhcnNlcklucHV0UHRyIGlucHV0ICovCisgICAgaW50IG5faW5wdXQ7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9pbnB1dCA9IDA7bl9pbnB1dCA8IGdlbl9uYl94bWxQYXJzZXJJbnB1dFB0cjtuX2lucHV0KyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgaW5wdXQgPSBnZW5feG1sUGFyc2VySW5wdXRQdHIobl9pbnB1dCwgMCk7CisKKyAgICAgICAgeG1sUGFyc2VyUHJpbnRGaWxlQ29udGV4dChpbnB1dCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbFBhcnNlcklucHV0UHRyKG5faW5wdXQsIGlucHV0LCAwKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFBhcnNlclByaW50RmlsZUNvbnRleHQiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2lucHV0KTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTE2OTQ4LDggKzE5NzUxLDI4IEBACiB0ZXN0X3htbFBhcnNlclByaW50RmlsZUluZm8odm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbFBhcnNlcklucHV0UHRyIGlucHV0OyAvKiBhbiB4bWxQYXJzZXJJbnB1dFB0ciBpbnB1dCAqLworICAgIGludCBuX2lucHV0OwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5faW5wdXQgPSAwO25faW5wdXQgPCBnZW5fbmJfeG1sUGFyc2VySW5wdXRQdHI7bl9pbnB1dCsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGlucHV0ID0gZ2VuX3htbFBhcnNlcklucHV0UHRyKG5faW5wdXQsIDApOworCisgICAgICAgIHhtbFBhcnNlclByaW50RmlsZUluZm8oaW5wdXQpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxQYXJzZXJJbnB1dFB0cihuX2lucHV0LCBpbnB1dCwgMCk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxQYXJzZXJQcmludEZpbGVJbmZvIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9pbnB1dCk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xNjk4OCw4ICsxOTgxMSwyOCBAQAogdGVzdF94bWxSZXNldEVycm9yKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorICAgIGludCBtZW1fYmFzZTsKKyAgICB4bWxFcnJvclB0ciBlcnI7IC8qIHBvaW50ZXIgdG8gdGhlIGVycm9yLiAqLworICAgIGludCBuX2VycjsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2VyciA9IDA7bl9lcnIgPCBnZW5fbmJfeG1sRXJyb3JQdHI7bl9lcnIrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBlcnIgPSBnZW5feG1sRXJyb3JQdHIobl9lcnIsIDApOworCisgICAgICAgIHhtbFJlc2V0RXJyb3IoZXJyKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sRXJyb3JQdHIobl9lcnIsIGVyciwgMCk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxSZXNldEVycm9yIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lcnIpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMTcwMzIsNyArMTk4NzUsNyBAQAogdGVzdF94bWxlcnJvcih2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKLSAgICBwcmludGYoIlRlc3RpbmcgeG1sZXJyb3IgOiAyIG9mIDE1IGZ1bmN0aW9ucyAuLi5cbiIpOworICAgIHByaW50ZigiVGVzdGluZyB4bWxlcnJvciA6IDcgb2YgMTUgZnVuY3Rpb25zIC4uLlxuIik7CiAgICAgcmV0ICs9IHRlc3RfaW5pdEdlbmVyaWNFcnJvckRlZmF1bHRGdW5jKCk7CiAgICAgcmV0ICs9IHRlc3RfeG1sQ29weUVycm9yKCk7CiAgICAgcmV0ICs9IHRlc3RfeG1sQ3R4dEdldExhc3RFcnJvcigpOwpAQCAtMTcxMzYsMTEgKzE5OTc5LDExIEBACiAjaWZkZWYgTElCWE1MX1JFQURFUl9FTkFCTEVECiAgICAgaW50IG1lbV9iYXNlOwogICAgIHhtbFRleHRSZWFkZXJQdHIgcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogY3VyOyAvKiBhIHBvaW50ZXIgdG8gYSB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nICovCisgICAgeG1sQ2hhciAqIGN1cjsgLyogYSBwb2ludGVyIHRvIGEgemVybyB0ZXJtaW5hdGVkIHN0cmluZyAqLwogICAgIGludCBuX2N1cjsKICAgICBjb25zdCBjaGFyICogVVJMOyAvKiB0aGUgYmFzZSBVUkwgdG8gdXNlIGZvciB0aGUgZG9jdW1lbnQgKi8KICAgICBpbnQgbl9VUkw7Ci0gICAgY29uc3QgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KKyAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgIGludCBuX2VuY29kaW5nOwogICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIHhtbFBhcnNlck9wdGlvbiAqLwogICAgIGludCBuX29wdGlvbnM7CkBAIC0xNzE5Myw3ICsyMDAzNiw3IEBACiAgICAgeG1sVGV4dFJlYWRlclB0ciByZXRfdmFsOwogICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogYSBmaWxlIG9yIFVSTCAqLwogICAgIGludCBuX2ZpbGVuYW1lOwotICAgIGNvbnN0IGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCisgICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgICBpbnQgbl9lbmNvZGluZzsKICAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24gKi8KICAgICBpbnQgbl9vcHRpb25zOwpAQCAtMTcyNDksMTMgKzIwMDkyLDEzIEBACiAjaWZkZWYgTElCWE1MX1JFQURFUl9FTkFCTEVECiAgICAgaW50IG1lbV9iYXNlOwogICAgIHhtbFRleHRSZWFkZXJQdHIgcmV0X3ZhbDsKLSAgICBjb25zdCBjaGFyICogYnVmZmVyOyAvKiBhIHBvaW50ZXIgdG8gYSBjaGFyIGFycmF5ICovCisgICAgY2hhciAqIGJ1ZmZlcjsgLyogYSBwb2ludGVyIHRvIGEgY2hhciBhcnJheSAqLwogICAgIGludCBuX2J1ZmZlcjsKICAgICBpbnQgc2l6ZTsgLyogdGhlIHNpemUgb2YgdGhlIGFycmF5ICovCiAgICAgaW50IG5fc2l6ZTsKICAgICBjb25zdCBjaGFyICogVVJMOyAvKiB0aGUgYmFzZSBVUkwgdG8gdXNlIGZvciB0aGUgZG9jdW1lbnQgKi8KICAgICBpbnQgbl9VUkw7Ci0gICAgY29uc3QgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KKyAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgIGludCBuX2VuY29kaW5nOwogICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIHhtbFBhcnNlck9wdGlvbiAqLwogICAgIGludCBuX29wdGlvbnM7CkBAIC0xNzMxMywxMSArMjAxNTYsMTEgQEAKICAgICBpbnQgcmV0X3ZhbDsKICAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogYW4gWE1MIHJlYWRlciAqLwogICAgIGludCBuX3JlYWRlcjsKLSAgICBjb25zdCB4bWxDaGFyICogY3VyOyAvKiBhIHBvaW50ZXIgdG8gYSB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nICovCisgICAgeG1sQ2hhciAqIGN1cjsgLyogYSBwb2ludGVyIHRvIGEgemVybyB0ZXJtaW5hdGVkIHN0cmluZyAqLwogICAgIGludCBuX2N1cjsKICAgICBjb25zdCBjaGFyICogVVJMOyAvKiB0aGUgYmFzZSBVUkwgdG8gdXNlIGZvciB0aGUgZG9jdW1lbnQgKi8KICAgICBpbnQgbl9VUkw7Ci0gICAgY29uc3QgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KKyAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBkb2N1bWVudCBlbmNvZGluZywgb3IgTlVMTCAqLwogICAgIGludCBuX2VuY29kaW5nOwogICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIHhtbFBhcnNlck9wdGlvbiAqLwogICAgIGludCBuX29wdGlvbnM7CkBAIC0xNzM3Nyw3ICsyMDIyMCw3IEBACiAgICAgaW50IG5fcmVhZGVyOwogICAgIGNvbnN0IGNoYXIgKiBmaWxlbmFtZTsgLyogYSBmaWxlIG9yIFVSTCAqLwogICAgIGludCBuX2ZpbGVuYW1lOwotICAgIGNvbnN0IGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCisgICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgICBpbnQgbl9lbmNvZGluZzsKICAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24gKi8KICAgICBpbnQgbl9vcHRpb25zOwpAQCAtMTc0MzAsMTMgKzIwMjczLDEzIEBACiAgICAgaW50IHJldF92YWw7CiAgICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIGFuIFhNTCByZWFkZXIgKi8KICAgICBpbnQgbl9yZWFkZXI7Ci0gICAgY29uc3QgY2hhciAqIGJ1ZmZlcjsgLyogYSBwb2ludGVyIHRvIGEgY2hhciBhcnJheSAqLworICAgIGNoYXIgKiBidWZmZXI7IC8qIGEgcG9pbnRlciB0byBhIGNoYXIgYXJyYXkgKi8KICAgICBpbnQgbl9idWZmZXI7CiAgICAgaW50IHNpemU7IC8qIHRoZSBzaXplIG9mIHRoZSBhcnJheSAqLwogICAgIGludCBuX3NpemU7CiAgICAgY29uc3QgY2hhciAqIFVSTDsgLyogdGhlIGJhc2UgVVJMIHRvIHVzZSBmb3IgdGhlIGRvY3VtZW50ICovCiAgICAgaW50IG5fVVJMOwotICAgIGNvbnN0IGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGRvY3VtZW50IGVuY29kaW5nLCBvciBOVUxMICovCisgICAgY2hhciAqIGVuY29kaW5nOyAvKiB0aGUgZG9jdW1lbnQgZW5jb2RpbmcsIG9yIE5VTEwgKi8KICAgICBpbnQgbl9lbmNvZGluZzsKICAgICBpbnQgb3B0aW9uczsgLyogYSBjb21iaW5hdGlvbiBvZiB4bWxQYXJzZXJPcHRpb24gKi8KICAgICBpbnQgbl9vcHRpb25zOwpAQCAtMTc4ODAsNyArMjA3MjMsNyBAQAogICAgIGNvbnN0IHhtbENoYXIgKiByZXRfdmFsOwogICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICAgaW50IG5fcmVhZGVyOwotICAgIGNvbnN0IHhtbENoYXIgKiBzdHI7IC8qIHRoZSBzdHJpbmcgdG8gaW50ZXJuLiAqLworICAgIHhtbENoYXIgKiBzdHI7IC8qIHRoZSBzdHJpbmcgdG8gaW50ZXJuLiAqLwogICAgIGludCBuX3N0cjsKIAogICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewpAQCAtMTgxNTksNyArMjEwMDIsNyBAQAogICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICAgaW50IG5fcmVhZGVyOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gKi8KKyAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICovCiAgICAgaW50IG5fbmFtZTsKIAogICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewpAQCAtMTgyNDEsOSArMjEwODQsOSBAQAogICAgIHhtbENoYXIgKiByZXRfdmFsOwogICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICAgaW50IG5fcmVhZGVyOwotICAgIGNvbnN0IHhtbENoYXIgKiBsb2NhbE5hbWU7IC8qIHRoZSBsb2NhbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICovCisgICAgeG1sQ2hhciAqIGxvY2FsTmFtZTsgLyogdGhlIGxvY2FsIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gKi8KICAgICBpbnQgbl9sb2NhbE5hbWU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWVzcGFjZVVSSTsgLyogdGhlIG5hbWVzcGFjZSBVUkkgb2YgdGhlIGF0dHJpYnV0ZS4gKi8KKyAgICB4bWxDaGFyICogbmFtZXNwYWNlVVJJOyAvKiB0aGUgbmFtZXNwYWNlIFVSSSBvZiB0aGUgYXR0cmlidXRlLiAqLwogICAgIGludCBuX25hbWVzcGFjZVVSSTsKIAogICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewpAQCAtMTgyODAsNiArMjExMjMsMTMgQEAKIH0KIAogCisjZGVmaW5lIGdlbl9uYl94bWxUZXh0UmVhZGVyRXJyb3JGdW5jX3B0ciAxCitzdGF0aWMgeG1sVGV4dFJlYWRlckVycm9yRnVuYyAqIGdlbl94bWxUZXh0UmVhZGVyRXJyb3JGdW5jX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfeG1sVGV4dFJlYWRlckVycm9yRnVuY19wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFRleHRSZWFkZXJFcnJvckZ1bmMgKiB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKK30KKwogc3RhdGljIGludAogdGVzdF94bWxUZXh0UmVhZGVyR2V0RXJyb3JIYW5kbGVyKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKQEAgLTE4NTc5LDEyICsyMTQyOSw0MyBAQAogfQogCiAKKyNkZWZpbmUgZ2VuX25iX3htbFRleHRSZWFkZXJMb2NhdG9yUHRyIDEKK3N0YXRpYyB4bWxUZXh0UmVhZGVyTG9jYXRvclB0ciBnZW5feG1sVGV4dFJlYWRlckxvY2F0b3JQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX3htbFRleHRSZWFkZXJMb2NhdG9yUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxUZXh0UmVhZGVyTG9jYXRvclB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKK30KKwogc3RhdGljIGludAogdGVzdF94bWxUZXh0UmVhZGVyTG9jYXRvckJhc2VVUkkodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX1JFQURFUl9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbENoYXIgKiByZXRfdmFsOworICAgIHhtbFRleHRSZWFkZXJMb2NhdG9yUHRyIGxvY2F0b3I7IC8qIHRoZSB4bWxUZXh0UmVhZGVyTG9jYXRvclB0ciB1c2VkICovCisgICAgaW50IG5fbG9jYXRvcjsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2xvY2F0b3IgPSAwO25fbG9jYXRvciA8IGdlbl9uYl94bWxUZXh0UmVhZGVyTG9jYXRvclB0cjtuX2xvY2F0b3IrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBsb2NhdG9yID0gZ2VuX3htbFRleHRSZWFkZXJMb2NhdG9yUHRyKG5fbG9jYXRvciwgMCk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFRleHRSZWFkZXJMb2NhdG9yQmFzZVVSSShsb2NhdG9yKTsKKyAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxUZXh0UmVhZGVyTG9jYXRvclB0cihuX2xvY2F0b3IsIGxvY2F0b3IsIDApOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlckxvY2F0b3JCYXNlVVJJIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9sb2NhdG9yKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMTg1OTMsOCArMjE0NzQsMzIgQEAKIHRlc3RfeG1sVGV4dFJlYWRlckxvY2F0b3JMaW5lTnVtYmVyKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9SRUFERVJfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB4bWxUZXh0UmVhZGVyTG9jYXRvclB0ciBsb2NhdG9yOyAvKiB0aGUgeG1sVGV4dFJlYWRlckxvY2F0b3JQdHIgdXNlZCAqLworICAgIGludCBuX2xvY2F0b3I7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9sb2NhdG9yID0gMDtuX2xvY2F0b3IgPCBnZW5fbmJfeG1sVGV4dFJlYWRlckxvY2F0b3JQdHI7bl9sb2NhdG9yKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgbG9jYXRvciA9IGdlbl94bWxUZXh0UmVhZGVyTG9jYXRvclB0cihuX2xvY2F0b3IsIDApOworCisgICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyTG9jYXRvckxpbmVOdW1iZXIobG9jYXRvcik7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbFRleHRSZWFkZXJMb2NhdG9yUHRyKG5fbG9jYXRvciwgbG9jYXRvciwgMCk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxUZXh0UmVhZGVyTG9jYXRvckxpbmVOdW1iZXIiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xvY2F0b3IpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xODYwOCw3ICsyMTUxMyw3IEBACiAgICAgeG1sQ2hhciAqIHJldF92YWw7CiAgICAgeG1sVGV4dFJlYWRlclB0ciByZWFkZXI7IC8qIHRoZSB4bWxUZXh0UmVhZGVyUHRyIHVzZWQgKi8KICAgICBpbnQgbl9yZWFkZXI7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHByZWZpeDsgLyogdGhlIHByZWZpeCB3aG9zZSBuYW1lc3BhY2UgVVJJIGlzIHRvIGJlIHJlc29sdmVkLiBUbyByZXR1cm4gdGhlIGRlZmF1bHQgbmFtZXNwYWNlLCBzcGVjaWZ5IE5VTEwgKi8KKyAgICB4bWxDaGFyICogcHJlZml4OyAvKiB0aGUgcHJlZml4IHdob3NlIG5hbWVzcGFjZSBVUkkgaXMgdG8gYmUgcmVzb2x2ZWQuIFRvIHJldHVybiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UsIHNwZWNpZnkgTlVMTCAqLwogICAgIGludCBuX3ByZWZpeDsKIAogICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewpAQCAtMTg2NDksNyArMjE1NTQsNyBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICAgaW50IG5fcmVhZGVyOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gKi8KKyAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICovCiAgICAgaW50IG5fbmFtZTsKIAogICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewpAQCAtMTg3MzEsOSArMjE2MzYsOSBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICAgaW50IG5fcmVhZGVyOwotICAgIGNvbnN0IHhtbENoYXIgKiBsb2NhbE5hbWU7IC8qIHRoZSBsb2NhbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICovCisgICAgeG1sQ2hhciAqIGxvY2FsTmFtZTsgLyogdGhlIGxvY2FsIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gKi8KICAgICBpbnQgbl9sb2NhbE5hbWU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWVzcGFjZVVSSTsgLyogdGhlIG5hbWVzcGFjZSBVUkkgb2YgdGhlIGF0dHJpYnV0ZS4gKi8KKyAgICB4bWxDaGFyICogbmFtZXNwYWNlVVJJOyAvKiB0aGUgbmFtZXNwYWNlIFVSSSBvZiB0aGUgYXR0cmlidXRlLiAqLwogICAgIGludCBuX25hbWVzcGFjZVVSSTsKIAogICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewpAQCAtMTkyOTQsOCArMjIxOTksNDEgQEAKIHRlc3RfeG1sVGV4dFJlYWRlclJlbGF4TkdTZXRTY2hlbWEodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX1JFQURFUl9FTkFCTEVECisjaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcjsgLyogdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZCAqLworICAgIGludCBuX3JlYWRlcjsKKyAgICB4bWxSZWxheE5HUHRyIHNjaGVtYTsgLyogYSBwcmVjb21waWxlZCBSZWxheE5HIHNjaGVtYSAqLworICAgIGludCBuX3NjaGVtYTsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX3JlYWRlciA9IDA7bl9yZWFkZXIgPCBnZW5fbmJfeG1sVGV4dFJlYWRlclB0cjtuX3JlYWRlcisrKSB7CisgICAgZm9yIChuX3NjaGVtYSA9IDA7bl9zY2hlbWEgPCBnZW5fbmJfeG1sUmVsYXhOR1B0cjtuX3NjaGVtYSsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIHJlYWRlciA9IGdlbl94bWxUZXh0UmVhZGVyUHRyKG5fcmVhZGVyLCAwKTsKKyAgICAgICAgc2NoZW1hID0gZ2VuX3htbFJlbGF4TkdQdHIobl9zY2hlbWEsIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxUZXh0UmVhZGVyUmVsYXhOR1NldFNjaGVtYShyZWFkZXIsIHNjaGVtYSk7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbFRleHRSZWFkZXJQdHIobl9yZWFkZXIsIHJlYWRlciwgMCk7CisgICAgICAgIGRlc194bWxSZWxheE5HUHRyKG5fc2NoZW1hLCBzY2hlbWEsIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sVGV4dFJlYWRlclJlbGF4TkdTZXRTY2hlbWEiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3JlYWRlcik7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2NoZW1hKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMTkzMTAsNyArMjIyNDgsNyBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyOyAvKiB0aGUgeG1sVGV4dFJlYWRlclB0ciB1c2VkICovCiAgICAgaW50IG5fcmVhZGVyOwotICAgIGNvbnN0IGNoYXIgKiBybmc7IC8qIHRoZSBwYXRoIHRvIGEgUmVsYXhORyBzY2hlbWEgb3IgTlVMTCAqLworICAgIGNoYXIgKiBybmc7IC8qIHRoZSBwYXRoIHRvIGEgUmVsYXhORyBzY2hlbWEgb3IgTlVMTCAqLwogICAgIGludCBuX3JuZzsKIAogICAgIGZvciAobl9yZWFkZXIgPSAwO25fcmVhZGVyIDwgZ2VuX25iX3htbFRleHRSZWFkZXJQdHI7bl9yZWFkZXIrKykgewpAQCAtMTk1MTYsNyArMjI0NTQsNyBAQAogdGVzdF94bWxyZWFkZXIodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCi0gICAgcHJpbnRmKCJUZXN0aW5nIHhtbHJlYWRlciA6IDYyIG9mIDc4IGZ1bmN0aW9ucyAuLi5cbiIpOworICAgIHByaW50ZigiVGVzdGluZyB4bWxyZWFkZXIgOiA2NSBvZiA3OCBmdW5jdGlvbnMgLi4uXG4iKTsKICAgICByZXQgKz0gdGVzdF94bWxOZXdUZXh0UmVhZGVyKCk7CiAgICAgcmV0ICs9IHRlc3RfeG1sTmV3VGV4dFJlYWRlckZpbGVuYW1lKCk7CiAgICAgcmV0ICs9IHRlc3RfeG1sUmVhZGVyRm9yRG9jKCk7CkBAIC0xOTU5NCwxMiArMjI1MzIsNDMgQEAKICAgICByZXR1cm4ocmV0KTsKIH0KIAorI2RlZmluZSBnZW5fbmJfeG1sU2F2ZUN0eHRQdHIgMQorc3RhdGljIHhtbFNhdmVDdHh0UHRyIGdlbl94bWxTYXZlQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfeG1sU2F2ZUN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFNhdmVDdHh0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbFNhdmVDbG9zZSh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfT1VUUFVUX0VOQUJMRUQKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgaW50IHJldF92YWw7CisgICAgeG1sU2F2ZUN0eHRQdHIgY3R4dDsgLyogYSBkb2N1bWVudCBzYXZpbmcgY29udGV4dCAqLworICAgIGludCBuX2N0eHQ7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sU2F2ZUN0eHRQdHI7bl9jdHh0KyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgY3R4dCA9IGdlbl94bWxTYXZlQ3R4dFB0cihuX2N0eHQsIDApOworCisgICAgICAgIHJldF92YWwgPSB4bWxTYXZlQ2xvc2UoY3R4dCk7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbFNhdmVDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTYXZlQ2xvc2UiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xOTYwOCw4ICsyMjU3NywzOSBAQAogdGVzdF94bWxTYXZlRG9jKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9PVVRQVVRfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBsb25nIHJldF92YWw7CisgICAgeG1sU2F2ZUN0eHRQdHIgY3R4dDsgLyogYSBkb2N1bWVudCBzYXZpbmcgY29udGV4dCAqLworICAgIGludCBuX2N0eHQ7CisgICAgeG1sRG9jUHRyIGRvYzsgLyogYSBkb2N1bWVudCAqLworICAgIGludCBuX2RvYzsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTYXZlQ3R4dFB0cjtuX2N0eHQrKykgeworICAgIGZvciAobl9kb2MgPSAwO25fZG9jIDwgZ2VuX25iX3htbERvY1B0cjtuX2RvYysrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGN0eHQgPSBnZW5feG1sU2F2ZUN0eHRQdHIobl9jdHh0LCAwKTsKKyAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFNhdmVEb2MoY3R4dCwgZG9jKTsKKyAgICAgICAgZGVzcmV0X2xvbmcocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbFNhdmVDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CisgICAgICAgIGRlc194bWxEb2NQdHIobl9kb2MsIGRvYywgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTYXZlRG9jIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9kb2MpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMTk2MTgsOCArMjI2MTgsMzIgQEAKIHRlc3RfeG1sU2F2ZUZsdXNoKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9PVVRQVVRfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB4bWxTYXZlQ3R4dFB0ciBjdHh0OyAvKiBhIGRvY3VtZW50IHNhdmluZyBjb250ZXh0ICovCisgICAgaW50IG5fY3R4dDsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTYXZlQ3R4dFB0cjtuX2N0eHQrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBjdHh0ID0gZ2VuX3htbFNhdmVDdHh0UHRyKG5fY3R4dCwgMCk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFNhdmVGbHVzaChjdHh0KTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sU2F2ZUN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNhdmVGbHVzaCIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTE5Njc4LDggKzIyNzAyLDM5IEBACiB0ZXN0X3htbFNhdmVUcmVlKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9PVVRQVVRfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBsb25nIHJldF92YWw7CisgICAgeG1sU2F2ZUN0eHRQdHIgY3R4dDsgLyogYSBkb2N1bWVudCBzYXZpbmcgY29udGV4dCAqLworICAgIGludCBuX2N0eHQ7CisgICAgeG1sTm9kZVB0ciBub2RlOyAvKiBhIGRvY3VtZW50ICovCisgICAgaW50IG5fbm9kZTsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTYXZlQ3R4dFB0cjtuX2N0eHQrKykgeworICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBjdHh0ID0gZ2VuX3htbFNhdmVDdHh0UHRyKG5fY3R4dCwgMCk7CisgICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxTYXZlVHJlZShjdHh0LCBub2RlKTsKKyAgICAgICAgZGVzcmV0X2xvbmcocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbFNhdmVDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CisgICAgICAgIGRlc194bWxOb2RlUHRyKG5fbm9kZSwgbm9kZSwgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTYXZlVHJlZSIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbm9kZSk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xOTY4Nyw3ICsyMjc0Miw3IEBACiB0ZXN0X3htbHNhdmUodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCi0gICAgcHJpbnRmKCJUZXN0aW5nIHhtbHNhdmUgOiAwIG9mIDkgZnVuY3Rpb25zIC4uLlxuIik7CisgICAgcHJpbnRmKCJUZXN0aW5nIHhtbHNhdmUgOiA0IG9mIDkgZnVuY3Rpb25zIC4uLlxuIik7CiAgICAgcmV0ICs9IHRlc3RfeG1sU2F2ZUNsb3NlKCk7CiAgICAgcmV0ICs9IHRlc3RfeG1sU2F2ZURvYygpOwogICAgIHJldCArPSB0ZXN0X3htbFNhdmVGbHVzaCgpOwpAQCAtMTk3MDMsMTYgKzIyNzU4LDc1IEBACiAgICAgcmV0dXJuKHJldCk7CiB9CiAKKyNkZWZpbmUgZ2VuX25iX3htbFNjaGVtYVB0ciAxCitzdGF0aWMgeG1sU2NoZW1hUHRyIGdlbl94bWxTY2hlbWFQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX3htbFNjaGVtYVB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sU2NoZW1hUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbFNjaGVtYUR1bXAodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAorI2lmZGVmIExJQlhNTF9PVVRQVVRfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBGSUxFICogb3V0cHV0OyAvKiB0aGUgZmlsZSBvdXRwdXQgKi8KKyAgICBpbnQgbl9vdXRwdXQ7CisgICAgeG1sU2NoZW1hUHRyIHNjaGVtYTsgLyogYSBzY2hlbWEgc3RydWN0dXJlICovCisgICAgaW50IG5fc2NoZW1hOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fb3V0cHV0ID0gMDtuX291dHB1dCA8IGdlbl9uYl9GSUxFX3B0cjtuX291dHB1dCsrKSB7CisgICAgZm9yIChuX3NjaGVtYSA9IDA7bl9zY2hlbWEgPCBnZW5fbmJfeG1sU2NoZW1hUHRyO25fc2NoZW1hKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgb3V0cHV0ID0gZ2VuX0ZJTEVfcHRyKG5fb3V0cHV0LCAwKTsKKyAgICAgICAgc2NoZW1hID0gZ2VuX3htbFNjaGVtYVB0cihuX3NjaGVtYSwgMSk7CisKKyAgICAgICAgeG1sU2NoZW1hRHVtcChvdXRwdXQsIHNjaGVtYSk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX0ZJTEVfcHRyKG5fb3V0cHV0LCBvdXRwdXQsIDApOworICAgICAgICBkZXNfeG1sU2NoZW1hUHRyKG5fc2NoZW1hLCBzY2hlbWEsIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hRHVtcCIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fb3V0cHV0KTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9zY2hlbWEpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCiAKKyNkZWZpbmUgZ2VuX25iX3htbFNjaGVtYVBhcnNlckN0eHRQdHIgMQorc3RhdGljIHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgZ2VuX3htbFNjaGVtYVBhcnNlckN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX3htbFNjaGVtYVBhcnNlckN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFNjaGVtYVBhcnNlckN0eHRQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cit9CisKKyNkZWZpbmUgZ2VuX25iX3htbFNjaGVtYVZhbGlkaXR5RXJyb3JGdW5jX3B0ciAxCitzdGF0aWMgeG1sU2NoZW1hVmFsaWRpdHlFcnJvckZ1bmMgKiBnZW5feG1sU2NoZW1hVmFsaWRpdHlFcnJvckZ1bmNfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworICAgIHJldHVybihOVUxMKTsKK30KK3N0YXRpYyB2b2lkIGRlc194bWxTY2hlbWFWYWxpZGl0eUVycm9yRnVuY19wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFNjaGVtYVZhbGlkaXR5RXJyb3JGdW5jICogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cit9CisKKyNkZWZpbmUgZ2VuX25iX3htbFNjaGVtYVZhbGlkaXR5V2FybmluZ0Z1bmNfcHRyIDEKK3N0YXRpYyB4bWxTY2hlbWFWYWxpZGl0eVdhcm5pbmdGdW5jICogZ2VuX3htbFNjaGVtYVZhbGlkaXR5V2FybmluZ0Z1bmNfcHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworICAgIHJldHVybihOVUxMKTsKK30KK3N0YXRpYyB2b2lkIGRlc194bWxTY2hlbWFWYWxpZGl0eVdhcm5pbmdGdW5jX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sU2NoZW1hVmFsaWRpdHlXYXJuaW5nRnVuYyAqIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbFNjaGVtYUdldFBhcnNlckVycm9ycyh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CkBAIC0xOTcyMyw2ICsyMjgzNywxMyBAQAogfQogCiAKKyNkZWZpbmUgZ2VuX25iX3htbFNjaGVtYVZhbGlkQ3R4dFB0ciAxCitzdGF0aWMgeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGdlbl94bWxTY2hlbWFWYWxpZEN0eHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX3htbFNjaGVtYVZhbGlkQ3R4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sU2NoZW1hVmFsaWRDdHh0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbFNjaGVtYUdldFZhbGlkRXJyb3JzKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKQEAgLTE5ODA3LDggKzIyOTI4LDM5IEBACiB0ZXN0X3htbFNjaGVtYVNldFZhbGlkT3B0aW9ucyh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciBjdHh0OyAvKiBhIHNjaGVtYSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KKyAgICBpbnQgbl9jdHh0OworICAgIGludCBvcHRpb25zOyAvKiBhIGNvbWJpbmF0aW9uIG9mIHhtbFNjaGVtYVZhbGlkT3B0aW9uICovCisgICAgaW50IG5fb3B0aW9uczsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTY2hlbWFWYWxpZEN0eHRQdHI7bl9jdHh0KyspIHsKKyAgICBmb3IgKG5fb3B0aW9ucyA9IDA7bl9vcHRpb25zIDwgZ2VuX25iX2ludDtuX29wdGlvbnMrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBjdHh0ID0gZ2VuX3htbFNjaGVtYVZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOworICAgICAgICBvcHRpb25zID0gZ2VuX2ludChuX29wdGlvbnMsIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFTZXRWYWxpZE9wdGlvbnMoY3R4dCwgb3B0aW9ucyk7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbFNjaGVtYVZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOworICAgICAgICBkZXNfaW50KG5fb3B0aW9ucywgb3B0aW9ucywgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFTZXRWYWxpZE9wdGlvbnMiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX29wdGlvbnMpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMTk4MTcsOCArMjI5NjksMzIgQEAKIHRlc3RfeG1sU2NoZW1hVmFsaWRDdHh0R2V0T3B0aW9ucyh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciBjdHh0OyAvKiBhIHNjaGVtYSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KKyAgICBpbnQgbl9jdHh0OwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNjaGVtYVZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBjdHh0ID0gZ2VuX3htbFNjaGVtYVZhbGlkQ3R4dFB0cihuX2N0eHQsIDApOworCisgICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFWYWxpZEN0eHRHZXRPcHRpb25zKGN0eHQpOworICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxTY2hlbWFWYWxpZEN0eHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYVZhbGlkQ3R4dEdldE9wdGlvbnMiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xOTgyNyw4ICsyMzAwMywzOSBAQAogdGVzdF94bWxTY2hlbWFWYWxpZGF0ZURvYyh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbFNjaGVtYVZhbGlkQ3R4dFB0ciBjdHh0OyAvKiBhIHNjaGVtYSB2YWxpZGF0aW9uIGNvbnRleHQgKi8KKyAgICBpbnQgbl9jdHh0OworICAgIHhtbERvY1B0ciBkb2M7IC8qIGEgcGFyc2VkIGRvY3VtZW50IHRyZWUgKi8KKyAgICBpbnQgbl9kb2M7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sU2NoZW1hVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CisgICAgZm9yIChuX2RvYyA9IDA7bl9kb2MgPCBnZW5fbmJfeG1sRG9jUHRyO25fZG9jKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgY3R4dCA9IGdlbl94bWxTY2hlbWFWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKKyAgICAgICAgZG9jID0gZ2VuX3htbERvY1B0cihuX2RvYywgMSk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYVZhbGlkYXRlRG9jKGN0eHQsIGRvYyk7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbFNjaGVtYVZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOworICAgICAgICBkZXNfeG1sRG9jUHRyKG5fZG9jLCBkb2MsIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hVmFsaWRhdGVEb2MiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2RvYyk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xOTgzNyw4ICsyMzA0NCwzOSBAQAogdGVzdF94bWxTY2hlbWFWYWxpZGF0ZU9uZUVsZW1lbnQodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB4bWxTY2hlbWFWYWxpZEN0eHRQdHIgY3R4dDsgLyogYSBzY2hlbWEgdmFsaWRhdGlvbiBjb250ZXh0ICovCisgICAgaW50IG5fY3R4dDsKKyAgICB4bWxOb2RlUHRyIGVsZW07IC8qIGFuIGVsZW1lbnQgbm9kZSAqLworICAgIGludCBuX2VsZW07CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sU2NoZW1hVmFsaWRDdHh0UHRyO25fY3R4dCsrKSB7CisgICAgZm9yIChuX2VsZW0gPSAwO25fZWxlbSA8IGdlbl9uYl94bWxOb2RlUHRyO25fZWxlbSsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGN0eHQgPSBnZW5feG1sU2NoZW1hVmFsaWRDdHh0UHRyKG5fY3R4dCwgMCk7CisgICAgICAgIGVsZW0gPSBnZW5feG1sTm9kZVB0cihuX2VsZW0sIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFWYWxpZGF0ZU9uZUVsZW1lbnQoY3R4dCwgZWxlbSk7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbFNjaGVtYVZhbGlkQ3R4dFB0cihuX2N0eHQsIGN0eHQsIDApOworICAgICAgICBkZXNfeG1sTm9kZVB0cihuX2VsZW0sIGVsZW0sIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hVmFsaWRhdGVPbmVFbGVtZW50IiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9lbGVtKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTE5ODQ3LDggKzIzMDg1LDYwIEBACiB0ZXN0X3htbFNjaGVtYVZhbGlkYXRlU3RyZWFtKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgaW50IHJldF92YWw7CisgICAgeG1sU2NoZW1hVmFsaWRDdHh0UHRyIGN0eHQ7IC8qIGEgc2NoZW1hIHZhbGlkYXRpb24gY29udGV4dCAqLworICAgIGludCBuX2N0eHQ7CisgICAgeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIgaW5wdXQ7IC8qIHRoZSBpbnB1dCB0byB1c2UgZm9yIHJlYWRpbmcgdGhlIGRhdGEgKi8KKyAgICBpbnQgbl9pbnB1dDsKKyAgICB4bWxDaGFyRW5jb2RpbmcgZW5jOyAvKiBhbiBvcHRpb25hbCBlbmNvZGluZyBpbmZvcm1hdGlvbiAqLworICAgIGludCBuX2VuYzsKKyAgICB4bWxTQVhIYW5kbGVyUHRyIHNheDsgLyogYSBTQVggaGFuZGxlciBmb3IgdGhlIHJlc3VsdGluZyBldmVudHMgKi8KKyAgICBpbnQgbl9zYXg7CisgICAgdm9pZCAqIHVzZXJfZGF0YTsgLyogdGhlIGNvbnRleHQgdG8gcHJvdmlkZSB0byB0aGUgU0FYIGhhbmRsZXIuICovCisgICAgaW50IG5fdXNlcl9kYXRhOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFNjaGVtYVZhbGlkQ3R4dFB0cjtuX2N0eHQrKykgeworICAgIGZvciAobl9pbnB1dCA9IDA7bl9pbnB1dCA8IGdlbl9uYl94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cjtuX2lucHV0KyspIHsKKyAgICBmb3IgKG5fZW5jID0gMDtuX2VuYyA8IGdlbl9uYl94bWxDaGFyRW5jb2Rpbmc7bl9lbmMrKykgeworICAgIGZvciAobl9zYXggPSAwO25fc2F4IDwgZ2VuX25iX3htbFNBWEhhbmRsZXJQdHI7bl9zYXgrKykgeworICAgIGZvciAobl91c2VyX2RhdGEgPSAwO25fdXNlcl9kYXRhIDwgZ2VuX25iX3VzZXJkYXRhO25fdXNlcl9kYXRhKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgY3R4dCA9IGdlbl94bWxTY2hlbWFWYWxpZEN0eHRQdHIobl9jdHh0LCAwKTsKKyAgICAgICAgaW5wdXQgPSBnZW5feG1sUGFyc2VySW5wdXRCdWZmZXJQdHIobl9pbnB1dCwgMSk7CisgICAgICAgIGVuYyA9IGdlbl94bWxDaGFyRW5jb2Rpbmcobl9lbmMsIDIpOworICAgICAgICBzYXggPSBnZW5feG1sU0FYSGFuZGxlclB0cihuX3NheCwgMyk7CisgICAgICAgIHVzZXJfZGF0YSA9IGdlbl91c2VyZGF0YShuX3VzZXJfZGF0YSwgNCk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYVZhbGlkYXRlU3RyZWFtKGN0eHQsIGlucHV0LCBlbmMsIHNheCwgdXNlcl9kYXRhKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sU2NoZW1hVmFsaWRDdHh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CisgICAgICAgIGRlc194bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cihuX2lucHV0LCBpbnB1dCwgMSk7CisgICAgICAgIGRlc194bWxDaGFyRW5jb2Rpbmcobl9lbmMsIGVuYywgMik7CisgICAgICAgIGRlc194bWxTQVhIYW5kbGVyUHRyKG5fc2F4LCBzYXgsIDMpOworICAgICAgICBkZXNfdXNlcmRhdGEobl91c2VyX2RhdGEsIHVzZXJfZGF0YSwgNCk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFWYWxpZGF0ZVN0cmVhbSIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5faW5wdXQpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2VuYyk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2F4KTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91c2VyX2RhdGEpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMTk4NTYsNyArMjMxNDYsNyBAQAogdGVzdF94bWxzY2hlbWFzKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAotICAgIHByaW50ZigiVGVzdGluZyB4bWxzY2hlbWFzIDogMCBvZiAxOCBmdW5jdGlvbnMgLi4uXG4iKTsKKyAgICBwcmludGYoIlRlc3RpbmcgeG1sc2NoZW1hcyA6IDYgb2YgMTggZnVuY3Rpb25zIC4uLlxuIik7CiAgICAgcmV0ICs9IHRlc3RfeG1sU2NoZW1hRHVtcCgpOwogICAgIHJldCArPSB0ZXN0X3htbFNjaGVtYUdldFBhcnNlckVycm9ycygpOwogICAgIHJldCArPSB0ZXN0X3htbFNjaGVtYUdldFZhbGlkRXJyb3JzKCk7CkBAIC0xOTg3OCwxMiArMjMxNjgsNzEgQEAKICAgICByZXR1cm4ocmV0KTsKIH0KIAorI2RlZmluZSBnZW5fbmJfeG1sU2NoZW1hRmFjZXRQdHIgMQorc3RhdGljIHhtbFNjaGVtYUZhY2V0UHRyIGdlbl94bWxTY2hlbWFGYWNldFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfeG1sU2NoZW1hRmFjZXRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFNjaGVtYUZhY2V0UHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCisjZGVmaW5lIGdlbl9uYl94bWxTY2hlbWFUeXBlUHRyIDEKK3N0YXRpYyB4bWxTY2hlbWFUeXBlUHRyIGdlbl94bWxTY2hlbWFUeXBlUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworICAgIHJldHVybihOVUxMKTsKK30KK3N0YXRpYyB2b2lkIGRlc194bWxTY2hlbWFUeXBlUHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxTY2hlbWFUeXBlUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbFNjaGVtYUNoZWNrRmFjZXQodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB4bWxTY2hlbWFGYWNldFB0ciBmYWNldDsgLyogdGhlIGZhY2V0ICovCisgICAgaW50IG5fZmFjZXQ7CisgICAgeG1sU2NoZW1hVHlwZVB0ciB0eXBlRGVjbDsgLyogdGhlIHNjaGVtYSB0eXBlIGRlZmluaXRpb24gKi8KKyAgICBpbnQgbl90eXBlRGVjbDsKKyAgICB4bWxTY2hlbWFQYXJzZXJDdHh0UHRyIGN0eHQ7IC8qIHRoZSBzY2hlbWEgcGFyc2VyIGNvbnRleHQgb3IgTlVMTCAqLworICAgIGludCBuX2N0eHQ7CisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIG5hbWUgb2YgdGhlIHR5cGUgKi8KKyAgICBpbnQgbl9uYW1lOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fZmFjZXQgPSAwO25fZmFjZXQgPCBnZW5fbmJfeG1sU2NoZW1hRmFjZXRQdHI7bl9mYWNldCsrKSB7CisgICAgZm9yIChuX3R5cGVEZWNsID0gMDtuX3R5cGVEZWNsIDwgZ2VuX25iX3htbFNjaGVtYVR5cGVQdHI7bl90eXBlRGVjbCsrKSB7CisgICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxTY2hlbWFQYXJzZXJDdHh0UHRyO25fY3R4dCsrKSB7CisgICAgZm9yIChuX25hbWUgPSAwO25fbmFtZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX25hbWUrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBmYWNldCA9IGdlbl94bWxTY2hlbWFGYWNldFB0cihuX2ZhY2V0LCAwKTsKKyAgICAgICAgdHlwZURlY2wgPSBnZW5feG1sU2NoZW1hVHlwZVB0cihuX3R5cGVEZWNsLCAxKTsKKyAgICAgICAgY3R4dCA9IGdlbl94bWxTY2hlbWFQYXJzZXJDdHh0UHRyKG5fY3R4dCwgMik7CisgICAgICAgIG5hbWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9uYW1lLCAzKTsKKworICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hQ2hlY2tGYWNldChmYWNldCwgdHlwZURlY2wsIGN0eHQsIG5hbWUpOworICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxTY2hlbWFGYWNldFB0cihuX2ZhY2V0LCBmYWNldCwgMCk7CisgICAgICAgIGRlc194bWxTY2hlbWFUeXBlUHRyKG5fdHlwZURlY2wsIHR5cGVEZWNsLCAxKTsKKyAgICAgICAgZGVzX3htbFNjaGVtYVBhcnNlckN0eHRQdHIobl9jdHh0LCBjdHh0LCAyKTsKKyAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fbmFtZSwgbmFtZSwgMyk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFDaGVja0ZhY2V0IiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mYWNldCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHlwZURlY2wpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N0eHQpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25hbWUpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0xOTkyMCw3ICsyMzI2OSw3IEBACiAjaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAogICAgIGludCBtZW1fYmFzZTsKICAgICB4bWxDaGFyICogcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogdmFsdWU7IC8qIGEgdmFsdWUgKi8KKyAgICB4bWxDaGFyICogdmFsdWU7IC8qIGEgdmFsdWUgKi8KICAgICBpbnQgbl92YWx1ZTsKIAogICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKQEAgLTE5OTQ3LDEyICsyMzI5Niw1MCBAQAogfQogCiAKKyNkZWZpbmUgZ2VuX25iX3htbFNjaGVtYVZhbFB0ciAxCitzdGF0aWMgeG1sU2NoZW1hVmFsUHRyIGdlbl94bWxTY2hlbWFWYWxQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX3htbFNjaGVtYVZhbFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sU2NoZW1hVmFsUHRyIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbFNjaGVtYUNvbXBhcmVWYWx1ZXModm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB4bWxTY2hlbWFWYWxQdHIgeDsgLyogYSBmaXJzdCB2YWx1ZSAqLworICAgIGludCBuX3g7CisgICAgeG1sU2NoZW1hVmFsUHRyIHk7IC8qIGEgc2Vjb25kIHZhbHVlICovCisgICAgaW50IG5feTsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX3ggPSAwO25feCA8IGdlbl9uYl94bWxTY2hlbWFWYWxQdHI7bl94KyspIHsKKyAgICBmb3IgKG5feSA9IDA7bl95IDwgZ2VuX25iX3htbFNjaGVtYVZhbFB0cjtuX3krKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICB4ID0gZ2VuX3htbFNjaGVtYVZhbFB0cihuX3gsIDApOworICAgICAgICB5ID0gZ2VuX3htbFNjaGVtYVZhbFB0cihuX3ksIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFDb21wYXJlVmFsdWVzKHgsIHkpOworICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxTY2hlbWFWYWxQdHIobl94LCB4LCAwKTsKKyAgICAgICAgZGVzX3htbFNjaGVtYVZhbFB0cihuX3ksIHksIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hQ29tcGFyZVZhbHVlcyIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5feCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5feSk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0yMDAxOCw4ICsyMzQwNSwzOSBAQAogdGVzdF94bWxTY2hlbWFJc0J1aWx0SW5UeXBlRmFjZXQodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGU7IC8qIHRoZSBidWlsdC1pbiB0eXBlICovCisgICAgaW50IG5fdHlwZTsKKyAgICBpbnQgZmFjZXRUeXBlOyAvKiB0aGUgZmFjZXQgdHlwZSAqLworICAgIGludCBuX2ZhY2V0VHlwZTsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl94bWxTY2hlbWFUeXBlUHRyO25fdHlwZSsrKSB7CisgICAgZm9yIChuX2ZhY2V0VHlwZSA9IDA7bl9mYWNldFR5cGUgPCBnZW5fbmJfaW50O25fZmFjZXRUeXBlKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgdHlwZSA9IGdlbl94bWxTY2hlbWFUeXBlUHRyKG5fdHlwZSwgMCk7CisgICAgICAgIGZhY2V0VHlwZSA9IGdlbl9pbnQobl9mYWNldFR5cGUsIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFJc0J1aWx0SW5UeXBlRmFjZXQodHlwZSwgZmFjZXRUeXBlKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sU2NoZW1hVHlwZVB0cihuX3R5cGUsIHR5cGUsIDApOworICAgICAgICBkZXNfaW50KG5fZmFjZXRUeXBlLCBmYWNldFR5cGUsIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hSXNCdWlsdEluVHlwZUZhY2V0IiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90eXBlKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mYWNldFR5cGUpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMjAwMzQsMTIgKzIzNDUyLDY0IEBACiB9CiAKIAorI2RlZmluZSBnZW5fbmJfeG1sU2NoZW1hVmFsUHRyX3B0ciAxCitzdGF0aWMgeG1sU2NoZW1hVmFsUHRyICogZ2VuX3htbFNjaGVtYVZhbFB0cl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX3htbFNjaGVtYVZhbFB0cl9wdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFNjaGVtYVZhbFB0ciAqIHZhbCBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworfQorCiBzdGF0aWMgaW50CiB0ZXN0X3htbFNjaGVtYVZhbFByZWRlZlR5cGVOb2RlKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgaW50IHJldF92YWw7CisgICAgeG1sU2NoZW1hVHlwZVB0ciB0eXBlOyAvKiB0aGUgcHJlZGVmaW5lZCB0eXBlICovCisgICAgaW50IG5fdHlwZTsKKyAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSB2YWx1ZSB0byBjaGVjayAqLworICAgIGludCBuX3ZhbHVlOworICAgIHhtbFNjaGVtYVZhbFB0ciAqIHZhbDsgLyogdGhlIHJldHVybiBjb21wdXRlZCB2YWx1ZSAqLworICAgIGludCBuX3ZhbDsKKyAgICB4bWxOb2RlUHRyIG5vZGU7IC8qIHRoZSBub2RlIGNvbnRhaW5pbmcgdGhlIHZhbHVlICovCisgICAgaW50IG5fbm9kZTsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl94bWxTY2hlbWFUeXBlUHRyO25fdHlwZSsrKSB7CisgICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgeworICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFNjaGVtYVZhbFB0cl9wdHI7bl92YWwrKykgeworICAgIGZvciAobl9ub2RlID0gMDtuX25vZGUgPCBnZW5fbmJfeG1sTm9kZVB0cjtuX25vZGUrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICB0eXBlID0gZ2VuX3htbFNjaGVtYVR5cGVQdHIobl90eXBlLCAwKTsKKyAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMSk7CisgICAgICAgIHZhbCA9IGdlbl94bWxTY2hlbWFWYWxQdHJfcHRyKG5fdmFsLCAyKTsKKyAgICAgICAgbm9kZSA9IGdlbl94bWxOb2RlUHRyKG5fbm9kZSwgMyk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYVZhbFByZWRlZlR5cGVOb2RlKHR5cGUsIHZhbHVlLCB2YWwsIG5vZGUpOworICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxTY2hlbWFUeXBlUHRyKG5fdHlwZSwgdHlwZSwgMCk7CisgICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCB2YWx1ZSwgMSk7CisgICAgICAgIGRlc194bWxTY2hlbWFWYWxQdHJfcHRyKG5fdmFsLCB2YWwsIDIpOworICAgICAgICBkZXNfeG1sTm9kZVB0cihuX25vZGUsIG5vZGUsIDMpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hVmFsUHJlZGVmVHlwZU5vZGUiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3R5cGUpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX25vZGUpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0yMDA0OCw4ICsyMzUxOCw1MyBAQAogdGVzdF94bWxTY2hlbWFWYWxQcmVkZWZUeXBlTm9kZU5vTm9ybSh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbFNjaGVtYVR5cGVQdHIgdHlwZTsgLyogdGhlIHByZWRlZmluZWQgdHlwZSAqLworICAgIGludCBuX3R5cGU7CisgICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgdmFsdWUgdG8gY2hlY2sgKi8KKyAgICBpbnQgbl92YWx1ZTsKKyAgICB4bWxTY2hlbWFWYWxQdHIgKiB2YWw7IC8qIHRoZSByZXR1cm4gY29tcHV0ZWQgdmFsdWUgKi8KKyAgICBpbnQgbl92YWw7CisgICAgeG1sTm9kZVB0ciBub2RlOyAvKiB0aGUgbm9kZSBjb250YWluaW5nIHRoZSB2YWx1ZSAqLworICAgIGludCBuX25vZGU7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl90eXBlID0gMDtuX3R5cGUgPCBnZW5fbmJfeG1sU2NoZW1hVHlwZVB0cjtuX3R5cGUrKykgeworICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKKyAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxTY2hlbWFWYWxQdHJfcHRyO25fdmFsKyspIHsKKyAgICBmb3IgKG5fbm9kZSA9IDA7bl9ub2RlIDwgZ2VuX25iX3htbE5vZGVQdHI7bl9ub2RlKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgdHlwZSA9IGdlbl94bWxTY2hlbWFUeXBlUHRyKG5fdHlwZSwgMCk7CisgICAgICAgIHZhbHVlID0gZ2VuX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIDEpOworICAgICAgICB2YWwgPSBnZW5feG1sU2NoZW1hVmFsUHRyX3B0cihuX3ZhbCwgMik7CisgICAgICAgIG5vZGUgPSBnZW5feG1sTm9kZVB0cihuX25vZGUsIDMpOworCisgICAgICAgIHJldF92YWwgPSB4bWxTY2hlbWFWYWxQcmVkZWZUeXBlTm9kZU5vTm9ybSh0eXBlLCB2YWx1ZSwgdmFsLCBub2RlKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sU2NoZW1hVHlwZVB0cihuX3R5cGUsIHR5cGUsIDApOworICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgdmFsdWUsIDEpOworICAgICAgICBkZXNfeG1sU2NoZW1hVmFsUHRyX3B0cihuX3ZhbCwgdmFsLCAyKTsKKyAgICAgICAgZGVzX3htbE5vZGVQdHIobl9ub2RlLCBub2RlLCAzKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYVZhbFByZWRlZlR5cGVOb2RlTm9Ob3JtIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl90eXBlKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWx1ZSk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ub2RlKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMjAwNTgsOCArMjM1NzMsNTMgQEAKIHRlc3RfeG1sU2NoZW1hVmFsaWRhdGVGYWNldCh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfU0NIRU1BU19FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHhtbFNjaGVtYVR5cGVQdHIgYmFzZTsgLyogdGhlIGJhc2UgdHlwZSAqLworICAgIGludCBuX2Jhc2U7CisgICAgeG1sU2NoZW1hRmFjZXRQdHIgZmFjZXQ7IC8qIHRoZSBmYWNldCB0byBjaGVjayAqLworICAgIGludCBuX2ZhY2V0OworICAgIHhtbENoYXIgKiB2YWx1ZTsgLyogdGhlIGxleGljYWwgcmVwciBvZiB0aGUgdmFsdWUgdG8gdmFsaWRhdGUgKi8KKyAgICBpbnQgbl92YWx1ZTsKKyAgICB4bWxTY2hlbWFWYWxQdHIgdmFsOyAvKiB0aGUgcHJlY29tcHV0ZWQgdmFsdWUgKi8KKyAgICBpbnQgbl92YWw7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9iYXNlID0gMDtuX2Jhc2UgPCBnZW5fbmJfeG1sU2NoZW1hVHlwZVB0cjtuX2Jhc2UrKykgeworICAgIGZvciAobl9mYWNldCA9IDA7bl9mYWNldCA8IGdlbl9uYl94bWxTY2hlbWFGYWNldFB0cjtuX2ZhY2V0KyspIHsKKyAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CisgICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfeG1sU2NoZW1hVmFsUHRyO25fdmFsKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgYmFzZSA9IGdlbl94bWxTY2hlbWFUeXBlUHRyKG5fYmFzZSwgMCk7CisgICAgICAgIGZhY2V0ID0gZ2VuX3htbFNjaGVtYUZhY2V0UHRyKG5fZmFjZXQsIDEpOworICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAyKTsKKyAgICAgICAgdmFsID0gZ2VuX3htbFNjaGVtYVZhbFB0cihuX3ZhbCwgMyk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYVZhbGlkYXRlRmFjZXQoYmFzZSwgZmFjZXQsIHZhbHVlLCB2YWwpOworICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxTY2hlbWFUeXBlUHRyKG5fYmFzZSwgYmFzZSwgMCk7CisgICAgICAgIGRlc194bWxTY2hlbWFGYWNldFB0cihuX2ZhY2V0LCBmYWNldCwgMSk7CisgICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCB2YWx1ZSwgMik7CisgICAgICAgIGRlc194bWxTY2hlbWFWYWxQdHIobl92YWwsIHZhbCwgMyk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxTY2hlbWFWYWxpZGF0ZUZhY2V0IiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9iYXNlKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mYWNldCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTIwMDY4LDggKzIzNjI4LDYwIEBACiB0ZXN0X3htbFNjaGVtYVZhbGlkYXRlTGVuZ3RoRmFjZXQodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB4bWxTY2hlbWFUeXBlUHRyIHR5cGU7IC8qIHRoZSBidWlsdC1pbiB0eXBlICovCisgICAgaW50IG5fdHlwZTsKKyAgICB4bWxTY2hlbWFGYWNldFB0ciBmYWNldDsgLyogdGhlIGZhY2V0IHRvIGNoZWNrICovCisgICAgaW50IG5fZmFjZXQ7CisgICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgbGV4aWNhbCByZXByLiBvZiB0aGUgdmFsdWUgdG8gYmUgdmFsaWRhdGVkICovCisgICAgaW50IG5fdmFsdWU7CisgICAgeG1sU2NoZW1hVmFsUHRyIHZhbDsgLyogdGhlIHByZWNvbXB1dGVkIHZhbHVlICovCisgICAgaW50IG5fdmFsOworICAgIHVuc2lnbmVkIGxvbmcgKiBsZW5ndGg7IC8qIHRoZSBhY3R1YWwgbGVuZ3RoIG9mIHRoZSB2YWx1ZSAqLworICAgIGludCBuX2xlbmd0aDsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl94bWxTY2hlbWFUeXBlUHRyO25fdHlwZSsrKSB7CisgICAgZm9yIChuX2ZhY2V0ID0gMDtuX2ZhY2V0IDwgZ2VuX25iX3htbFNjaGVtYUZhY2V0UHRyO25fZmFjZXQrKykgeworICAgIGZvciAobl92YWx1ZSA9IDA7bl92YWx1ZSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3ZhbHVlKyspIHsKKyAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl94bWxTY2hlbWFWYWxQdHI7bl92YWwrKykgeworICAgIGZvciAobl9sZW5ndGggPSAwO25fbGVuZ3RoIDwgZ2VuX25iX3Vuc2lnbmVkX2xvbmdfcHRyO25fbGVuZ3RoKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgdHlwZSA9IGdlbl94bWxTY2hlbWFUeXBlUHRyKG5fdHlwZSwgMCk7CisgICAgICAgIGZhY2V0ID0gZ2VuX3htbFNjaGVtYUZhY2V0UHRyKG5fZmFjZXQsIDEpOworICAgICAgICB2YWx1ZSA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCAyKTsKKyAgICAgICAgdmFsID0gZ2VuX3htbFNjaGVtYVZhbFB0cihuX3ZhbCwgMyk7CisgICAgICAgIGxlbmd0aCA9IGdlbl91bnNpZ25lZF9sb25nX3B0cihuX2xlbmd0aCwgNCk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYVZhbGlkYXRlTGVuZ3RoRmFjZXQodHlwZSwgZmFjZXQsIHZhbHVlLCB2YWwsIGxlbmd0aCk7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbFNjaGVtYVR5cGVQdHIobl90eXBlLCB0eXBlLCAwKTsKKyAgICAgICAgZGVzX3htbFNjaGVtYUZhY2V0UHRyKG5fZmFjZXQsIGZhY2V0LCAxKTsKKyAgICAgICAgZGVzX2NvbnN0X3htbENoYXJfcHRyKG5fdmFsdWUsIHZhbHVlLCAyKTsKKyAgICAgICAgZGVzX3htbFNjaGVtYVZhbFB0cihuX3ZhbCwgdmFsLCAzKTsKKyAgICAgICAgZGVzX3Vuc2lnbmVkX2xvbmdfcHRyKG5fbGVuZ3RoLCBsZW5ndGgsIDQpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hVmFsaWRhdGVMZW5ndGhGYWNldCIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdHlwZSk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZmFjZXQpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbmd0aCk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0yMDA3OCw4ICsyMzY5MCw1MyBAQAogdGVzdF94bWxTY2hlbWFWYWxpZGF0ZUxpc3RTaW1wbGVUeXBlRmFjZXQodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX1NDSEVNQVNfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB4bWxTY2hlbWFGYWNldFB0ciBmYWNldDsgLyogdGhlIGZhY2V0IHRvIGNoZWNrICovCisgICAgaW50IG5fZmFjZXQ7CisgICAgeG1sQ2hhciAqIHZhbHVlOyAvKiB0aGUgbGV4aWNhbCByZXByIG9mIHRoZSB2YWx1ZSB0byB2YWxpZGF0ZSAqLworICAgIGludCBuX3ZhbHVlOworICAgIHVuc2lnbmVkIGxvbmcgYWN0dWFsTGVuOyAvKiB0aGUgbnVtYmVyIG9mIGxpc3QgaXRlbXMgKi8KKyAgICBpbnQgbl9hY3R1YWxMZW47CisgICAgdW5zaWduZWQgbG9uZyAqIGV4cGVjdGVkTGVuOyAvKiB0aGUgcmVzdWx0aW5nIGV4cGVjdGVkIG51bWJlciBvZiBsaXN0IGl0ZW1zICovCisgICAgaW50IG5fZXhwZWN0ZWRMZW47CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9mYWNldCA9IDA7bl9mYWNldCA8IGdlbl9uYl94bWxTY2hlbWFGYWNldFB0cjtuX2ZhY2V0KyspIHsKKyAgICBmb3IgKG5fdmFsdWUgPSAwO25fdmFsdWUgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWx1ZSsrKSB7CisgICAgZm9yIChuX2FjdHVhbExlbiA9IDA7bl9hY3R1YWxMZW4gPCBnZW5fbmJfdW5zaWduZWRfbG9uZztuX2FjdHVhbExlbisrKSB7CisgICAgZm9yIChuX2V4cGVjdGVkTGVuID0gMDtuX2V4cGVjdGVkTGVuIDwgZ2VuX25iX3Vuc2lnbmVkX2xvbmdfcHRyO25fZXhwZWN0ZWRMZW4rKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBmYWNldCA9IGdlbl94bWxTY2hlbWFGYWNldFB0cihuX2ZhY2V0LCAwKTsKKyAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMSk7CisgICAgICAgIGFjdHVhbExlbiA9IGdlbl91bnNpZ25lZF9sb25nKG5fYWN0dWFsTGVuLCAyKTsKKyAgICAgICAgZXhwZWN0ZWRMZW4gPSBnZW5fdW5zaWduZWRfbG9uZ19wdHIobl9leHBlY3RlZExlbiwgMyk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFNjaGVtYVZhbGlkYXRlTGlzdFNpbXBsZVR5cGVGYWNldChmYWNldCwgdmFsdWUsIGFjdHVhbExlbiwgZXhwZWN0ZWRMZW4pOworICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxTY2hlbWFGYWNldFB0cihuX2ZhY2V0LCBmYWNldCwgMCk7CisgICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3ZhbHVlLCB2YWx1ZSwgMSk7CisgICAgICAgIGRlc191bnNpZ25lZF9sb25nKG5fYWN0dWFsTGVuLCBhY3R1YWxMZW4sIDIpOworICAgICAgICBkZXNfdW5zaWduZWRfbG9uZ19wdHIobl9leHBlY3RlZExlbiwgZXhwZWN0ZWRMZW4sIDMpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sU2NoZW1hVmFsaWRhdGVMaXN0U2ltcGxlVHlwZUZhY2V0IiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9mYWNldCk7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsdWUpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2FjdHVhbExlbik7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fZXhwZWN0ZWRMZW4pOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0yMDA4OCw4ICsyMzc0NSw0NiBAQAogdGVzdF94bWxTY2hlbWFWYWxpZGF0ZVByZWRlZmluZWRUeXBlKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9TQ0hFTUFTX0VOQUJMRUQKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgaW50IHJldF92YWw7CisgICAgeG1sU2NoZW1hVHlwZVB0ciB0eXBlOyAvKiB0aGUgcHJlZGVmaW5lZCB0eXBlICovCisgICAgaW50IG5fdHlwZTsKKyAgICB4bWxDaGFyICogdmFsdWU7IC8qIHRoZSB2YWx1ZSB0byBjaGVjayAqLworICAgIGludCBuX3ZhbHVlOworICAgIHhtbFNjaGVtYVZhbFB0ciAqIHZhbDsgLyogdGhlIHJldHVybiBjb21wdXRlZCB2YWx1ZSAqLworICAgIGludCBuX3ZhbDsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX3R5cGUgPSAwO25fdHlwZSA8IGdlbl9uYl94bWxTY2hlbWFUeXBlUHRyO25fdHlwZSsrKSB7CisgICAgZm9yIChuX3ZhbHVlID0gMDtuX3ZhbHVlIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsdWUrKykgeworICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFNjaGVtYVZhbFB0cl9wdHI7bl92YWwrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICB0eXBlID0gZ2VuX3htbFNjaGVtYVR5cGVQdHIobl90eXBlLCAwKTsKKyAgICAgICAgdmFsdWUgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgMSk7CisgICAgICAgIHZhbCA9IGdlbl94bWxTY2hlbWFWYWxQdHJfcHRyKG5fdmFsLCAyKTsKKworICAgICAgICByZXRfdmFsID0geG1sU2NoZW1hVmFsaWRhdGVQcmVkZWZpbmVkVHlwZSh0eXBlLCB2YWx1ZSwgdmFsKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sU2NoZW1hVHlwZVB0cihuX3R5cGUsIHR5cGUsIDApOworICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl92YWx1ZSwgdmFsdWUsIDEpOworICAgICAgICBkZXNfeG1sU2NoZW1hVmFsUHRyX3B0cihuX3ZhbCwgdmFsLCAyKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFNjaGVtYVZhbGlkYXRlUHJlZGVmaW5lZFR5cGUiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3R5cGUpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbHVlKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTIwMDk3LDcgKzIzNzkyLDcgQEAKIHRlc3RfeG1sc2NoZW1hc3R5cGVzKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAotICAgIHByaW50ZigiVGVzdGluZyB4bWxzY2hlbWFzdHlwZXMgOiAzIG9mIDE5IGZ1bmN0aW9ucyAuLi5cbiIpOworICAgIHByaW50ZigiVGVzdGluZyB4bWxzY2hlbWFzdHlwZXMgOiAxMiBvZiAxOSBmdW5jdGlvbnMgLi4uXG4iKTsKICAgICByZXQgKz0gdGVzdF94bWxTY2hlbWFDaGVja0ZhY2V0KCk7CiAgICAgcmV0ICs9IHRlc3RfeG1sU2NoZW1hQ2xlYW51cFR5cGVzKCk7CiAgICAgcmV0ICs9IHRlc3RfeG1sU2NoZW1hQ29sbGFwc2VTdHJpbmcoKTsKQEAgLTIwMTI3LDcgKzIzODIyLDcgQEAKIAogICAgIGludCBtZW1fYmFzZTsKICAgICB4bWxDaGFyICogcmV0X3ZhbDsKLSAgICBjb25zdCBjaGFyICogY3VyOyAvKiB0aGUgaW5wdXQgY2hhciAqICovCisgICAgY2hhciAqIGN1cjsgLyogdGhlIGlucHV0IGNoYXIgKiAqLwogICAgIGludCBuX2N1cjsKIAogICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX2NvbnN0X2NoYXJfcHRyO25fY3VyKyspIHsKQEAgLTIwMTU5LDcgKzIzODU0LDcgQEAKIAogICAgIGludCBtZW1fYmFzZTsKICAgICB4bWxDaGFyICogcmV0X3ZhbDsKLSAgICBjb25zdCBjaGFyICogY3VyOyAvKiB0aGUgaW5wdXQgY2hhciAqICovCisgICAgY2hhciAqIGN1cjsgLyogdGhlIGlucHV0IGNoYXIgKiAqLwogICAgIGludCBuX2N1cjsKICAgICBpbnQgbGVuOyAvKiB0aGUgbGVuIG9mIEBjdXIgKi8KICAgICBpbnQgbl9sZW47CkBAIC0yMDE5Niw4ICsyMzg5MSwzMCBAQAogdGVzdF94bWxDaGVja1VURjgodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisgICAgaW50IG1lbV9iYXNlOworICAgIGludCByZXRfdmFsOworICAgIHVuc2lnbmVkIGNoYXIgKiB1dGY7IC8qIFBvaW50ZXIgdG8gcHV0YXRpdmUgVVRGLTggZW5jb2RlZCBzdHJpbmcuICovCisgICAgaW50IG5fdXRmOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fdXRmID0gMDtuX3V0ZiA8IGdlbl9uYl9jb25zdF91bnNpZ25lZF9jaGFyX3B0cjtuX3V0ZisrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIHV0ZiA9IGdlbl9jb25zdF91bnNpZ25lZF9jaGFyX3B0cihuX3V0ZiwgMCk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbENoZWNrVVRGOCh1dGYpOworICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc19jb25zdF91bnNpZ25lZF9jaGFyX3B0cihuX3V0ZiwgdXRmLCAwKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbENoZWNrVVRGOCIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdXRmKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTIwMjA2LDggKzIzOTIzLDM3IEBACiB0ZXN0X3htbEdldFVURjhDaGFyKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB1bnNpZ25lZCBjaGFyICogdXRmOyAvKiBhIHNlcXVlbmNlIG9mIFVURi04IGVuY29kZWQgYnl0ZXMgKi8KKyAgICBpbnQgbl91dGY7CisgICAgaW50ICogbGVuOyAvKiBhIHBvaW50ZXIgdG8gdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzIHByZXNlbnQgaW4gdGhlIHNlcXVlbmNlLiAgVGhpcyBpcyB1c2VkIHRvIGFzc3VyZSB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgY29tcGxldGVseSBjb250YWluZWQgd2l0aGluIHRoZSBzZXF1ZW5jZS4gKi8KKyAgICBpbnQgbl9sZW47CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl91dGYgPSAwO25fdXRmIDwgZ2VuX25iX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyO25fdXRmKyspIHsKKyAgICBmb3IgKG5fbGVuID0gMDtuX2xlbiA8IGdlbl9uYl9pbnRfcHRyO25fbGVuKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgdXRmID0gZ2VuX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyKG5fdXRmLCAwKTsKKyAgICAgICAgbGVuID0gZ2VuX2ludF9wdHIobl9sZW4sIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxHZXRVVEY4Q2hhcih1dGYsIGxlbik7CisgICAgICAgIGRlc3JldF9pbnQocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX2NvbnN0X3Vuc2lnbmVkX2NoYXJfcHRyKG5fdXRmLCB1dGYsIDApOworICAgICAgICBkZXNfaW50X3B0cihuX2xlbiwgbGVuLCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbEdldFVURjhDaGFyIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl91dGYpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2xlbik7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMjAyMTgsOSArMjM5NjQsOSBAQAogCiAgICAgaW50IG1lbV9iYXNlOwogICAgIGludCByZXRfdmFsOwotICAgIGNvbnN0IHhtbENoYXIgKiBzdHIxOyAvKiB0aGUgZmlyc3QgeG1sQ2hhciAqICovCisgICAgeG1sQ2hhciAqIHN0cjE7IC8qIHRoZSBmaXJzdCB4bWxDaGFyICogKi8KICAgICBpbnQgbl9zdHIxOwotICAgIGNvbnN0IHhtbENoYXIgKiBzdHIyOyAvKiB0aGUgc2Vjb25kIHhtbENoYXIgKiAqLworICAgIHhtbENoYXIgKiBzdHIyOyAvKiB0aGUgc2Vjb25kIHhtbENoYXIgKiAqLwogICAgIGludCBuX3N0cjI7CiAKICAgICBmb3IgKG5fc3RyMSA9IDA7bl9zdHIxIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyMSsrKSB7CkBAIC0yMDI2NywxMSArMjQwMTMsMTEgQEAKIAogICAgIGludCBtZW1fYmFzZTsKICAgICBpbnQgcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogcHJlZjsgLyogdGhlIHByZWZpeCBvZiB0aGUgUU5hbWUgKi8KKyAgICB4bWxDaGFyICogcHJlZjsgLyogdGhlIHByZWZpeCBvZiB0aGUgUU5hbWUgKi8KICAgICBpbnQgbl9wcmVmOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbG9jYWxuYW1lIG9mIHRoZSBRTmFtZSAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbG9jYWxuYW1lIG9mIHRoZSBRTmFtZSAqLwogICAgIGludCBuX25hbWU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHN0cjsgLyogdGhlIHNlY29uZCB4bWxDaGFyICogKi8KKyAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgc2Vjb25kIHhtbENoYXIgKiAqLwogICAgIGludCBuX3N0cjsKIAogICAgIGZvciAobl9wcmVmID0gMDtuX3ByZWYgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9wcmVmKyspIHsKQEAgLTIwMzIzLDkgKzI0MDY5LDkgQEAKIAogICAgIGludCBtZW1fYmFzZTsKICAgICBpbnQgcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogc3RyMTsgLyogdGhlIGZpcnN0IHhtbENoYXIgKiAqLworICAgIHhtbENoYXIgKiBzdHIxOyAvKiB0aGUgZmlyc3QgeG1sQ2hhciAqICovCiAgICAgaW50IG5fc3RyMTsKLSAgICBjb25zdCB4bWxDaGFyICogc3RyMjsgLyogdGhlIHNlY29uZCB4bWxDaGFyICogKi8KKyAgICB4bWxDaGFyICogc3RyMjsgLyogdGhlIHNlY29uZCB4bWxDaGFyICogKi8KICAgICBpbnQgbl9zdHIyOwogCiAgICAgZm9yIChuX3N0cjEgPSAwO25fc3RyMSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cjErKykgewpAQCAtMjAzNjIsNyArMjQxMDgsNyBAQAogCiAgICAgaW50IG1lbV9iYXNlOwogICAgIGNvbnN0IHhtbENoYXIgKiByZXRfdmFsOwotICAgIGNvbnN0IHhtbENoYXIgKiBzdHI7IC8qIHRoZSB4bWxDaGFyICogYXJyYXkgKGhheXN0YWNrKSAqLworICAgIHhtbENoYXIgKiBzdHI7IC8qIHRoZSB4bWxDaGFyICogYXJyYXkgKGhheXN0YWNrKSAqLwogICAgIGludCBuX3N0cjsKICAgICB4bWxDaGFyICogdmFsOyAvKiB0aGUgeG1sQ2hhciB0byBzZWFyY2ggKG5lZWRsZSkgKi8KICAgICBpbnQgbl92YWw7CkBAIC0yMDQxMSw5ICsyNDE1Nyw5IEBACiAKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgaW50IHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHN0cjE7IC8qIHRoZSBmaXJzdCB4bWxDaGFyICogKi8KKyAgICB4bWxDaGFyICogc3RyMTsgLyogdGhlIGZpcnN0IHhtbENoYXIgKiAqLwogICAgIGludCBuX3N0cjE7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHN0cjI7IC8qIHRoZSBzZWNvbmQgeG1sQ2hhciAqICovCisgICAgeG1sQ2hhciAqIHN0cjI7IC8qIHRoZSBzZWNvbmQgeG1sQ2hhciAqICovCiAgICAgaW50IG5fc3RyMjsKIAogICAgIGZvciAobl9zdHIxID0gMDtuX3N0cjEgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIxKyspIHsKQEAgLTIwNDUwLDcgKzI0MTk2LDcgQEAKIAogICAgIGludCBtZW1fYmFzZTsKICAgICB4bWxDaGFyICogcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogY3VyOyAvKiB0aGUgaW5wdXQgeG1sQ2hhciAqICovCisgICAgeG1sQ2hhciAqIGN1cjsgLyogdGhlIGlucHV0IHhtbENoYXIgKiAqLwogICAgIGludCBuX2N1cjsKIAogICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fY3VyKyspIHsKQEAgLTIwNDgyLDcgKzI0MjI4LDcgQEAKIAogICAgIGludCBtZW1fYmFzZTsKICAgICBpbnQgcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogc3RyOyAvKiB0aGUgeG1sQ2hhciAqIGFycmF5ICovCisgICAgeG1sQ2hhciAqIHN0cjsgLyogdGhlIHhtbENoYXIgKiBhcnJheSAqLwogICAgIGludCBuX3N0cjsKIAogICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyKyspIHsKQEAgLTIwNTE0LDkgKzI0MjYwLDkgQEAKIAogICAgIGludCBtZW1fYmFzZTsKICAgICBpbnQgcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogc3RyMTsgLyogdGhlIGZpcnN0IHhtbENoYXIgKiAqLworICAgIHhtbENoYXIgKiBzdHIxOyAvKiB0aGUgZmlyc3QgeG1sQ2hhciAqICovCiAgICAgaW50IG5fc3RyMTsKLSAgICBjb25zdCB4bWxDaGFyICogc3RyMjsgLyogdGhlIHNlY29uZCB4bWxDaGFyICogKi8KKyAgICB4bWxDaGFyICogc3RyMjsgLyogdGhlIHNlY29uZCB4bWxDaGFyICogKi8KICAgICBpbnQgbl9zdHIyOwogICAgIGludCBsZW47IC8qIHRoZSBtYXggY29tcGFyaXNvbiBsZW5ndGggKi8KICAgICBpbnQgbl9sZW47CkBAIC0yMDU2MCw5ICsyNDMwNiw5IEBACiAKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgeG1sQ2hhciAqIHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHN0cjE7IC8qIGZpcnN0IHhtbENoYXIgc3RyaW5nICovCisgICAgeG1sQ2hhciAqIHN0cjE7IC8qIGZpcnN0IHhtbENoYXIgc3RyaW5nICovCiAgICAgaW50IG5fc3RyMTsKLSAgICBjb25zdCB4bWxDaGFyICogc3RyMjsgLyogc2Vjb25kIHhtbENoYXIgc3RyaW5nICovCisgICAgeG1sQ2hhciAqIHN0cjI7IC8qIHNlY29uZCB4bWxDaGFyIHN0cmluZyAqLwogICAgIGludCBuX3N0cjI7CiAgICAgaW50IGxlbjsgLyogdGhlIGxlbiBvZiBAc3RyMiAqLwogICAgIGludCBuX2xlbjsKQEAgLTIwNjA2LDkgKzI0MzUyLDkgQEAKIAogICAgIGludCBtZW1fYmFzZTsKICAgICBpbnQgcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogc3RyMTsgLyogdGhlIGZpcnN0IHhtbENoYXIgKiAqLworICAgIHhtbENoYXIgKiBzdHIxOyAvKiB0aGUgZmlyc3QgeG1sQ2hhciAqICovCiAgICAgaW50IG5fc3RyMTsKLSAgICBjb25zdCB4bWxDaGFyICogc3RyMjsgLyogdGhlIHNlY29uZCB4bWxDaGFyICogKi8KKyAgICB4bWxDaGFyICogc3RyMjsgLyogdGhlIHNlY29uZCB4bWxDaGFyICogKi8KICAgICBpbnQgbl9zdHIyOwogICAgIGludCBsZW47IC8qIHRoZSBtYXggY29tcGFyaXNvbiBsZW5ndGggKi8KICAgICBpbnQgbl9sZW47CkBAIC0yMDY1Miw3ICsyNDM5OCw3IEBACiAKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgeG1sQ2hhciAqIHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIGN1cjsgLyogdGhlIGlucHV0IHhtbENoYXIgKiAqLworICAgIHhtbENoYXIgKiBjdXI7IC8qIHRoZSBpbnB1dCB4bWxDaGFyICogKi8KICAgICBpbnQgbl9jdXI7CiAgICAgaW50IGxlbjsgLyogdGhlIGxlbiBvZiBAY3VyICovCiAgICAgaW50IG5fbGVuOwpAQCAtMjA2OTEsOSArMjQ0MzcsOSBAQAogCiAgICAgaW50IG1lbV9iYXNlOwogICAgIGNvbnN0IHhtbENoYXIgKiByZXRfdmFsOwotICAgIGNvbnN0IHhtbENoYXIgKiBzdHI7IC8qIHRoZSB4bWxDaGFyICogYXJyYXkgKGhheXN0YWNrKSAqLworICAgIHhtbENoYXIgKiBzdHI7IC8qIHRoZSB4bWxDaGFyICogYXJyYXkgKGhheXN0YWNrKSAqLwogICAgIGludCBuX3N0cjsKLSAgICBjb25zdCB4bWxDaGFyICogdmFsOyAvKiB0aGUgeG1sQ2hhciB0byBzZWFyY2ggKG5lZWRsZSkgKi8KKyAgICB4bWxDaGFyICogdmFsOyAvKiB0aGUgeG1sQ2hhciB0byBzZWFyY2ggKG5lZWRsZSkgKi8KICAgICBpbnQgbl92YWw7CiAKICAgICBmb3IgKG5fc3RyID0gMDtuX3N0ciA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3N0cisrKSB7CkBAIC0yMDczMCw3ICsyNDQ3Niw3IEBACiAKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgeG1sQ2hhciAqIHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHN0cjsgLyogdGhlIHhtbENoYXIgKiBhcnJheSAoaGF5c3RhY2spICovCisgICAgeG1sQ2hhciAqIHN0cjsgLyogdGhlIHhtbENoYXIgKiBhcnJheSAoaGF5c3RhY2spICovCiAgICAgaW50IG5fc3RyOwogICAgIGludCBzdGFydDsgLyogdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyICh6ZXJvIGJhc2VkKSAqLwogICAgIGludCBuX3N0YXJ0OwpAQCAtMjA3NzYsOSArMjQ1MjIsOSBAQAogCiAgICAgaW50IG1lbV9iYXNlOwogICAgIGludCByZXRfdmFsOwotICAgIGNvbnN0IHhtbENoYXIgKiB1dGYxOyAvKiBwb2ludGVyIHRvIGZpcnN0IFVURjggY2hhciAqLworICAgIHhtbENoYXIgKiB1dGYxOyAvKiBwb2ludGVyIHRvIGZpcnN0IFVURjggY2hhciAqLwogICAgIGludCBuX3V0ZjE7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHV0ZjI7IC8qIHBvaW50ZXIgdG8gc2Vjb25kIFVURjggY2hhciAqLworICAgIHhtbENoYXIgKiB1dGYyOyAvKiBwb2ludGVyIHRvIHNlY29uZCBVVEY4IGNoYXIgKi8KICAgICBpbnQgbl91dGYyOwogCiAgICAgZm9yIChuX3V0ZjEgPSAwO25fdXRmMSA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3V0ZjErKykgewpAQCAtMjA4MTUsNyArMjQ1NjEsNyBAQAogCiAgICAgaW50IG1lbV9iYXNlOwogICAgIGludCByZXRfdmFsOwotICAgIGNvbnN0IHhtbENoYXIgKiB1dGY7IC8qIHBvaW50ZXIgdG8gdGhlIFVURjggY2hhcmFjdGVyICovCisgICAgeG1sQ2hhciAqIHV0ZjsgLyogcG9pbnRlciB0byB0aGUgVVRGOCBjaGFyYWN0ZXIgKi8KICAgICBpbnQgbl91dGY7CiAKICAgICBmb3IgKG5fdXRmID0gMDtuX3V0ZiA8IGdlbl9uYl9jb25zdF94bWxDaGFyX3B0cjtuX3V0ZisrKSB7CkBAIC0yMDg0Nyw3ICsyNDU5Myw3IEBACiAKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgaW50IHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHV0ZjsgLyogYSBzZXF1ZW5jZSBvZiBVVEYtOCBlbmNvZGVkIGJ5dGVzICovCisgICAgeG1sQ2hhciAqIHV0ZjsgLyogYSBzZXF1ZW5jZSBvZiBVVEYtOCBlbmNvZGVkIGJ5dGVzICovCiAgICAgaW50IG5fdXRmOwogCiAgICAgZm9yIChuX3V0ZiA9IDA7bl91dGYgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl91dGYrKykgewpAQCAtMjA4NzksOSArMjQ2MjUsOSBAQAogCiAgICAgaW50IG1lbV9iYXNlOwogICAgIGludCByZXRfdmFsOwotICAgIGNvbnN0IHhtbENoYXIgKiB1dGY7IC8qIHRoZSBpbnB1dCBVVEY4ICogKi8KKyAgICB4bWxDaGFyICogdXRmOyAvKiB0aGUgaW5wdXQgVVRGOCAqICovCiAgICAgaW50IG5fdXRmOwotICAgIGNvbnN0IHhtbENoYXIgKiB1dGZjaGFyOyAvKiB0aGUgVVRGOCBjaGFyYWN0ZXIgdG8gYmUgZm91bmQgKi8KKyAgICB4bWxDaGFyICogdXRmY2hhcjsgLyogdGhlIFVURjggY2hhcmFjdGVyIHRvIGJlIGZvdW5kICovCiAgICAgaW50IG5fdXRmY2hhcjsKIAogICAgIGZvciAobl91dGYgPSAwO25fdXRmIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdXRmKyspIHsKQEAgLTIwOTE4LDcgKzI0NjY0LDcgQEAKIAogICAgIGludCBtZW1fYmFzZTsKICAgICB4bWxDaGFyICogcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogdXRmOyAvKiB0aGUgaW5wdXQgVVRGOCAqICovCisgICAgeG1sQ2hhciAqIHV0ZjsgLyogdGhlIGlucHV0IFVURjggKiAqLwogICAgIGludCBuX3V0ZjsKICAgICBpbnQgbGVuOyAvKiB0aGUgbGVuIG9mIEB1dGYgKGluIGNoYXJzKSAqLwogICAgIGludCBuX2xlbjsKQEAgLTIwOTU3LDcgKzI0NzAzLDcgQEAKIAogICAgIGludCBtZW1fYmFzZTsKICAgICBjb25zdCB4bWxDaGFyICogcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogdXRmOyAvKiB0aGUgaW5wdXQgVVRGOCAqICovCisgICAgeG1sQ2hhciAqIHV0ZjsgLyogdGhlIGlucHV0IFVURjggKiAqLwogICAgIGludCBuX3V0ZjsKICAgICBpbnQgcG9zOyAvKiB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgVVRGOCBjaGFyIChpbiBjaGFycykgKi8KICAgICBpbnQgbl9wb3M7CkBAIC0yMDk5Niw3ICsyNDc0Miw3IEBACiAKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgaW50IHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHV0ZjsgLyogYSBzZXF1ZW5jZSBvZiBVVEYtOCBlbmNvZGVkIGJ5dGVzICovCisgICAgeG1sQ2hhciAqIHV0ZjsgLyogYSBzZXF1ZW5jZSBvZiBVVEYtOCBlbmNvZGVkIGJ5dGVzICovCiAgICAgaW50IG5fdXRmOwogICAgIGludCBsZW47IC8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgYXJyYXkgKi8KICAgICBpbnQgbl9sZW47CkBAIC0yMTAzNSw3ICsyNDc4MSw3IEBACiAKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgeG1sQ2hhciAqIHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHV0ZjsgLyogYSBzZXF1ZW5jZSBvZiBVVEYtOCBlbmNvZGVkIGJ5dGVzICovCisgICAgeG1sQ2hhciAqIHV0ZjsgLyogYSBzZXF1ZW5jZSBvZiBVVEYtOCBlbmNvZGVkIGJ5dGVzICovCiAgICAgaW50IG5fdXRmOwogICAgIGludCBzdGFydDsgLyogcmVsYXRpdmUgcG9zIG9mIGZpcnN0IGNoYXIgKi8KICAgICBpbnQgbl9zdGFydDsKQEAgLTIxMDc4LDcgKzI0ODI0LDcgQEAKIHRlc3RfeG1sc3RyaW5nKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAotICAgIHByaW50ZigiVGVzdGluZyB4bWxzdHJpbmcgOiAyMyBvZiAzMCBmdW5jdGlvbnMgLi4uXG4iKTsKKyAgICBwcmludGYoIlRlc3RpbmcgeG1sc3RyaW5nIDogMjUgb2YgMzAgZnVuY3Rpb25zIC4uLlxuIik7CiAgICAgcmV0ICs9IHRlc3RfeG1sQ2hhclN0cmR1cCgpOwogICAgIHJldCArPSB0ZXN0X3htbENoYXJTdHJuZHVwKCk7CiAgICAgcmV0ICs9IHRlc3RfeG1sQ2hlY2tVVEY4KCk7CkBAIC0yMTQyOCw3ICsyNTE3NCw3IEBACiAgICAgaW50IHJldF92YWw7CiAgICAgaW50IGNvZGU7IC8qIFVDUyBjb2RlIHBvaW50ICovCiAgICAgaW50IG5fY29kZTsKLSAgICBjb25zdCBjaGFyICogYmxvY2s7IC8qIFVDUyBibG9jayBuYW1lICovCisgICAgY2hhciAqIGJsb2NrOyAvKiBVQ1MgYmxvY2sgbmFtZSAqLwogICAgIGludCBuX2Jsb2NrOwogCiAgICAgZm9yIChuX2NvZGUgPSAwO25fY29kZSA8IGdlbl9uYl9pbnQ7bl9jb2RlKyspIHsKQEAgLTIyMDEzLDcgKzI1NzU5LDcgQEAKICAgICBpbnQgcmV0X3ZhbDsKICAgICBpbnQgY29kZTsgLyogVUNTIGNvZGUgcG9pbnQgKi8KICAgICBpbnQgbl9jb2RlOwotICAgIGNvbnN0IGNoYXIgKiBjYXQ7IC8qIFVDUyBDYXRlZ29yeSBuYW1lICovCisgICAgY2hhciAqIGNhdDsgLyogVUNTIENhdGVnb3J5IG5hbWUgKi8KICAgICBpbnQgbl9jYXQ7CiAKICAgICBmb3IgKG5fY29kZSA9IDA7bl9jb2RlIDwgZ2VuX25iX2ludDtuX2NvZGUrKykgewpAQCAtMjY5NTcsNiArMzA3MDMsMTMgQEAKIH0KIAogCisjZGVmaW5lIGdlbl9uYl94bWxEb2NQdHJfcHRyIDEKK3N0YXRpYyB4bWxEb2NQdHIgKiBnZW5feG1sRG9jUHRyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfeG1sRG9jUHRyX3B0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sRG9jUHRyICogdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cit9CisKIHN0YXRpYyBpbnQKIHRlc3RfeG1sTmV3VGV4dFdyaXRlckRvYyh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CkBAIC0yNzQ2NSw3ICszMTIxOCw3IEBACiAgICAgaW50IHJldF92YWw7CiAgICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICAgaW50IG5fd3JpdGVyOwotICAgIGNvbnN0IHhtbENoYXIgKiBzdHI7IC8qIHRoZSB4bWxDaGFyIHN0cmluZyAqLworICAgIHhtbENoYXIgKiBzdHI7IC8qIHRoZSB4bWxDaGFyIHN0cmluZyAqLwogICAgIGludCBuX3N0cjsKIAogICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewpAQCAtMjc1MDYsNyArMzEyNTksNyBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgIGludCBuX3dyaXRlcjsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTsgLyogZWxlbWVudCBuYW1lICovCisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIGVsZW1lbnQgbmFtZSAqLwogICAgIGludCBuX25hbWU7CiAKICAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKQEAgLTI3NTQ3LDExICszMTMwMCwxMSBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgIGludCBuX3dyaXRlcjsKLSAgICBjb25zdCB4bWxDaGFyICogcHJlZml4OyAvKiBuYW1lc3BhY2UgcHJlZml4IG9yIE5VTEwgKi8KKyAgICB4bWxDaGFyICogcHJlZml4OyAvKiBuYW1lc3BhY2UgcHJlZml4IG9yIE5VTEwgKi8KICAgICBpbnQgbl9wcmVmaXg7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWU7IC8qIGVsZW1lbnQgbG9jYWwgbmFtZSAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiBlbGVtZW50IGxvY2FsIG5hbWUgKi8KICAgICBpbnQgbl9uYW1lOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lc3BhY2VVUkk7IC8qIG5hbWVzcGFjZSBVUkkgb3IgTlVMTCAqLworICAgIHhtbENoYXIgKiBuYW1lc3BhY2VVUkk7IC8qIG5hbWVzcGFjZSBVUkkgb3IgTlVMTCAqLwogICAgIGludCBuX25hbWVzcGFjZVVSSTsKIAogICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewpAQCAtMjc2NzAsMTEgKzMxNDIzLDExIEBACiAgICAgaW50IHJldF92YWw7CiAgICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICAgaW50IG5fd3JpdGVyOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgRFREICovCisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBEVEQgKi8KICAgICBpbnQgbl9uYW1lOwotICAgIGNvbnN0IHhtbENoYXIgKiBwdWJpZDsgLyogdGhlIHB1YmxpYyBpZGVudGlmaWVyLCB3aGljaCBpcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgc3lzdGVtIGlkZW50aWZpZXIgKi8KKyAgICB4bWxDaGFyICogcHViaWQ7IC8qIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgd2hpY2ggaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIHN5c3RlbSBpZGVudGlmaWVyICovCiAgICAgaW50IG5fcHViaWQ7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHN5c2lkOyAvKiB0aGUgc3lzdGVtIGlkZW50aWZpZXIsIHdoaWNoIGlzIHRoZSBVUkkgb2YgdGhlIERURCAqLworICAgIHhtbENoYXIgKiBzeXNpZDsgLyogdGhlIHN5c3RlbSBpZGVudGlmaWVyLCB3aGljaCBpcyB0aGUgVVJJIG9mIHRoZSBEVEQgKi8KICAgICBpbnQgbl9zeXNpZDsKIAogICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewpAQCAtMjc3MjUsNyArMzE0NzgsNyBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgIGludCBuX3dyaXRlcjsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIERURCBBVFRMSVNUICovCisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBEVEQgQVRUTElTVCAqLwogICAgIGludCBuX25hbWU7CiAKICAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKQEAgLTI3NzY2LDcgKzMxNTE5LDcgQEAKICAgICBpbnQgcmV0X3ZhbDsKICAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgICBpbnQgbl93cml0ZXI7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBEVEQgZWxlbWVudCAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgRFREIGVsZW1lbnQgKi8KICAgICBpbnQgbl9uYW1lOwogCiAgICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CkBAIC0yNzgwOSw3ICszMTU2Miw3IEBACiAgICAgaW50IG5fd3JpdGVyOwogICAgIGludCBwZTsgLyogVFJVRSBpZiB0aGlzIGlzIGEgcGFyYW1ldGVyIGVudGl0eSwgRkFMU0UgaWYgbm90ICovCiAgICAgaW50IG5fcGU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBEVEQgQVRUTElTVCAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgRFREIEFUVExJU1QgKi8KICAgICBpbnQgbl9uYW1lOwogCiAgICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CkBAIC0yNzg1NSwxMSArMzE2MDgsMTEgQEAKICAgICBpbnQgcmV0X3ZhbDsKICAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgICBpbnQgbl93cml0ZXI7Ci0gICAgY29uc3QgY2hhciAqIHZlcnNpb247IC8qIHRoZSB4bWwgdmVyc2lvbiAoIjEuMCIpIG9yIE5VTEwgZm9yIGRlZmF1bHQgKCIxLjAiKSAqLworICAgIGNoYXIgKiB2ZXJzaW9uOyAvKiB0aGUgeG1sIHZlcnNpb24gKCIxLjAiKSBvciBOVUxMIGZvciBkZWZhdWx0ICgiMS4wIikgKi8KICAgICBpbnQgbl92ZXJzaW9uOwotICAgIGNvbnN0IGNoYXIgKiBlbmNvZGluZzsgLyogdGhlIGVuY29kaW5nIG9yIE5VTEwgZm9yIGRlZmF1bHQgKi8KKyAgICBjaGFyICogZW5jb2Rpbmc7IC8qIHRoZSBlbmNvZGluZyBvciBOVUxMIGZvciBkZWZhdWx0ICovCiAgICAgaW50IG5fZW5jb2Rpbmc7Ci0gICAgY29uc3QgY2hhciAqIHN0YW5kYWxvbmU7IC8qICJ5ZXMiIG9yICJubyIgb3IgTlVMTCBmb3IgZGVmYXVsdCAqLworICAgIGNoYXIgKiBzdGFuZGFsb25lOyAvKiAieWVzIiBvciAibm8iIG9yIE5VTEwgZm9yIGRlZmF1bHQgKi8KICAgICBpbnQgbl9zdGFuZGFsb25lOwogCiAgICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CkBAIC0yNzkxMCw3ICszMTY2Myw3IEBACiAgICAgaW50IHJldF92YWw7CiAgICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICAgaW50IG5fd3JpdGVyOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiBlbGVtZW50IG5hbWUgKi8KKyAgICB4bWxDaGFyICogbmFtZTsgLyogZWxlbWVudCBuYW1lICovCiAgICAgaW50IG5fbmFtZTsKIAogICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewpAQCAtMjc5NTEsMTEgKzMxNzA0LDExIEBACiAgICAgaW50IHJldF92YWw7CiAgICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICAgaW50IG5fd3JpdGVyOwotICAgIGNvbnN0IHhtbENoYXIgKiBwcmVmaXg7IC8qIG5hbWVzcGFjZSBwcmVmaXggb3IgTlVMTCAqLworICAgIHhtbENoYXIgKiBwcmVmaXg7IC8qIG5hbWVzcGFjZSBwcmVmaXggb3IgTlVMTCAqLwogICAgIGludCBuX3ByZWZpeDsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTsgLyogZWxlbWVudCBsb2NhbCBuYW1lICovCisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIGVsZW1lbnQgbG9jYWwgbmFtZSAqLwogICAgIGludCBuX25hbWU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWVzcGFjZVVSSTsgLyogbmFtZXNwYWNlIFVSSSBvciBOVUxMICovCisgICAgeG1sQ2hhciAqIG5hbWVzcGFjZVVSSTsgLyogbmFtZXNwYWNlIFVSSSBvciBOVUxMICovCiAgICAgaW50IG5fbmFtZXNwYWNlVVJJOwogCiAgICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CkBAIC0yODAwNiw3ICszMTc1OSw3IEBACiAgICAgaW50IHJldF92YWw7CiAgICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICAgaW50IG5fd3JpdGVyOwotICAgIGNvbnN0IHhtbENoYXIgKiB0YXJnZXQ7IC8qIFBJIHRhcmdldCAqLworICAgIHhtbENoYXIgKiB0YXJnZXQ7IC8qIFBJIHRhcmdldCAqLwogICAgIGludCBuX3RhcmdldDsKIAogICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewpAQCAtMjgwNDcsOSArMzE4MDAsOSBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgIGludCBuX3dyaXRlcjsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTsgLyogYXR0cmlidXRlIG5hbWUgKi8KKyAgICB4bWxDaGFyICogbmFtZTsgLyogYXR0cmlidXRlIG5hbWUgKi8KICAgICBpbnQgbl9uYW1lOwotICAgIGNvbnN0IHhtbENoYXIgKiBjb250ZW50OyAvKiBhdHRyaWJ1dGUgY29udGVudCAqLworICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiBhdHRyaWJ1dGUgY29udGVudCAqLwogICAgIGludCBuX2NvbnRlbnQ7CiAKICAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKQEAgLTI4MDk1LDEzICszMTg0OCwxMyBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgIGludCBuX3dyaXRlcjsKLSAgICBjb25zdCB4bWxDaGFyICogcHJlZml4OyAvKiBuYW1lc3BhY2UgcHJlZml4ICovCisgICAgeG1sQ2hhciAqIHByZWZpeDsgLyogbmFtZXNwYWNlIHByZWZpeCAqLwogICAgIGludCBuX3ByZWZpeDsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTsgLyogYXR0cmlidXRlIGxvY2FsIG5hbWUgKi8KKyAgICB4bWxDaGFyICogbmFtZTsgLyogYXR0cmlidXRlIGxvY2FsIG5hbWUgKi8KICAgICBpbnQgbl9uYW1lOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lc3BhY2VVUkk7IC8qIG5hbWVzcGFjZSBVUkkgKi8KKyAgICB4bWxDaGFyICogbmFtZXNwYWNlVVJJOyAvKiBuYW1lc3BhY2UgVVJJICovCiAgICAgaW50IG5fbmFtZXNwYWNlVVJJOwotICAgIGNvbnN0IHhtbENoYXIgKiBjb250ZW50OyAvKiBhdHRyaWJ1dGUgY29udGVudCAqLworICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiBhdHRyaWJ1dGUgY29udGVudCAqLwogICAgIGludCBuX2NvbnRlbnQ7CiAKICAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKQEAgLTI4MTU3LDcgKzMxOTEwLDcgQEAKICAgICBpbnQgcmV0X3ZhbDsKICAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgICBpbnQgbl93cml0ZXI7Ci0gICAgY29uc3QgY2hhciAqIGRhdGE7IC8qIGJpbmFyeSBkYXRhICovCisgICAgY2hhciAqIGRhdGE7IC8qIGJpbmFyeSBkYXRhICovCiAgICAgaW50IG5fZGF0YTsKICAgICBpbnQgc3RhcnQ7IC8qIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhlIGRhdGEgb2YgdGhlIGZpcnN0IGJ5dGUgdG8gZW5jb2RlICovCiAgICAgaW50IG5fc3RhcnQ7CkBAIC0yODIxMiw3ICszMTk2NSw3IEBACiAgICAgaW50IHJldF92YWw7CiAgICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICAgaW50IG5fd3JpdGVyOwotICAgIGNvbnN0IGNoYXIgKiBkYXRhOyAvKiBiaW5hcnkgZGF0YSAqLworICAgIGNoYXIgKiBkYXRhOyAvKiBiaW5hcnkgZGF0YSAqLwogICAgIGludCBuX2RhdGE7CiAgICAgaW50IHN0YXJ0OyAvKiB0aGUgcG9zaXRpb24gd2l0aGluIHRoZSBkYXRhIG9mIHRoZSBmaXJzdCBieXRlIHRvIGVuY29kZSAqLwogICAgIGludCBuX3N0YXJ0OwpAQCAtMjgyNjcsNyArMzIwMjAsNyBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgIGludCBuX3dyaXRlcjsKLSAgICBjb25zdCB4bWxDaGFyICogY29udGVudDsgLyogQ0RBVEEgY29udGVudCAqLworICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiBDREFUQSBjb250ZW50ICovCiAgICAgaW50IG5fY29udGVudDsKIAogICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewpAQCAtMjgzMDgsNyArMzIwNjEsNyBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgIGludCBuX3dyaXRlcjsKLSAgICBjb25zdCB4bWxDaGFyICogY29udGVudDsgLyogY29tbWVudCBzdHJpbmcgKi8KKyAgICB4bWxDaGFyICogY29udGVudDsgLyogY29tbWVudCBzdHJpbmcgKi8KICAgICBpbnQgbl9jb250ZW50OwogCiAgICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CkBAIC0yODM0OSwxMyArMzIxMDIsMTMgQEAKICAgICBpbnQgcmV0X3ZhbDsKICAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgICBpbnQgbl93cml0ZXI7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBEVEQgKi8KKyAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIERURCAqLwogICAgIGludCBuX25hbWU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHB1YmlkOyAvKiB0aGUgcHVibGljIGlkZW50aWZpZXIsIHdoaWNoIGlzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBzeXN0ZW0gaWRlbnRpZmllciAqLworICAgIHhtbENoYXIgKiBwdWJpZDsgLyogdGhlIHB1YmxpYyBpZGVudGlmaWVyLCB3aGljaCBpcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgc3lzdGVtIGlkZW50aWZpZXIgKi8KICAgICBpbnQgbl9wdWJpZDsKLSAgICBjb25zdCB4bWxDaGFyICogc3lzaWQ7IC8qIHRoZSBzeXN0ZW0gaWRlbnRpZmllciwgd2hpY2ggaXMgdGhlIFVSSSBvZiB0aGUgRFREICovCisgICAgeG1sQ2hhciAqIHN5c2lkOyAvKiB0aGUgc3lzdGVtIGlkZW50aWZpZXIsIHdoaWNoIGlzIHRoZSBVUkkgb2YgdGhlIERURCAqLwogICAgIGludCBuX3N5c2lkOwotICAgIGNvbnN0IHhtbENoYXIgKiBzdWJzZXQ7IC8qIHN0cmluZyBjb250ZW50IG9mIHRoZSBEVEQgKi8KKyAgICB4bWxDaGFyICogc3Vic2V0OyAvKiBzdHJpbmcgY29udGVudCBvZiB0aGUgRFREICovCiAgICAgaW50IG5fc3Vic2V0OwogCiAgICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CkBAIC0yODQxMSw5ICszMjE2NCw5IEBACiAgICAgaW50IHJldF92YWw7CiAgICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICAgaW50IG5fd3JpdGVyOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgRFREIEFUVExJU1QgKi8KKyAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIERURCBBVFRMSVNUICovCiAgICAgaW50IG5fbmFtZTsKLSAgICBjb25zdCB4bWxDaGFyICogY29udGVudDsgLyogY29udGVudCBvZiB0aGUgQVRUTElTVCAqLworICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiBjb250ZW50IG9mIHRoZSBBVFRMSVNUICovCiAgICAgaW50IG5fY29udGVudDsKIAogICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewpAQCAtMjg0NTksOSArMzIyMTIsOSBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgIGludCBuX3dyaXRlcjsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIERURCBlbGVtZW50ICovCisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBEVEQgZWxlbWVudCAqLwogICAgIGludCBuX25hbWU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgKi8KKyAgICB4bWxDaGFyICogY29udGVudDsgLyogY29udGVudCBvZiB0aGUgZWxlbWVudCAqLwogICAgIGludCBuX2NvbnRlbnQ7CiAKICAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKQEAgLTI4NTA5LDE1ICszMjI2MiwxNSBAQAogICAgIGludCBuX3dyaXRlcjsKICAgICBpbnQgcGU7IC8qIFRSVUUgaWYgdGhpcyBpcyBhIHBhcmFtZXRlciBlbnRpdHksIEZBTFNFIGlmIG5vdCAqLwogICAgIGludCBuX3BlOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgRFREIGVudGl0eSAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgRFREIGVudGl0eSAqLwogICAgIGludCBuX25hbWU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHB1YmlkOyAvKiB0aGUgcHVibGljIGlkZW50aWZpZXIsIHdoaWNoIGlzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBzeXN0ZW0gaWRlbnRpZmllciAqLworICAgIHhtbENoYXIgKiBwdWJpZDsgLyogdGhlIHB1YmxpYyBpZGVudGlmaWVyLCB3aGljaCBpcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgc3lzdGVtIGlkZW50aWZpZXIgKi8KICAgICBpbnQgbl9wdWJpZDsKLSAgICBjb25zdCB4bWxDaGFyICogc3lzaWQ7IC8qIHRoZSBzeXN0ZW0gaWRlbnRpZmllciwgd2hpY2ggaXMgdGhlIFVSSSBvZiB0aGUgRFREICovCisgICAgeG1sQ2hhciAqIHN5c2lkOyAvKiB0aGUgc3lzdGVtIGlkZW50aWZpZXIsIHdoaWNoIGlzIHRoZSBVUkkgb2YgdGhlIERURCAqLwogICAgIGludCBuX3N5c2lkOwotICAgIGNvbnN0IHhtbENoYXIgKiBuZGF0YWlkOyAvKiB0aGUgeG1sIG5vdGF0aW9uIG5hbWUuICovCisgICAgeG1sQ2hhciAqIG5kYXRhaWQ7IC8qIHRoZSB4bWwgbm90YXRpb24gbmFtZS4gKi8KICAgICBpbnQgbl9uZGF0YWlkOwotICAgIGNvbnN0IHhtbENoYXIgKiBjb250ZW50OyAvKiBjb250ZW50IG9mIHRoZSBlbnRpdHkgKi8KKyAgICB4bWxDaGFyICogY29udGVudDsgLyogY29udGVudCBvZiB0aGUgZW50aXR5ICovCiAgICAgaW50IG5fY29udGVudDsKIAogICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewpAQCAtMjg1ODUsMTMgKzMyMzM4LDEzIEBACiAgICAgaW50IG5fd3JpdGVyOwogICAgIGludCBwZTsgLyogVFJVRSBpZiB0aGlzIGlzIGEgcGFyYW1ldGVyIGVudGl0eSwgRkFMU0UgaWYgbm90ICovCiAgICAgaW50IG5fcGU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBEVEQgZW50aXR5ICovCisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSBEVEQgZW50aXR5ICovCiAgICAgaW50IG5fbmFtZTsKLSAgICBjb25zdCB4bWxDaGFyICogcHViaWQ7IC8qIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgd2hpY2ggaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIHN5c3RlbSBpZGVudGlmaWVyICovCisgICAgeG1sQ2hhciAqIHB1YmlkOyAvKiB0aGUgcHVibGljIGlkZW50aWZpZXIsIHdoaWNoIGlzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBzeXN0ZW0gaWRlbnRpZmllciAqLwogICAgIGludCBuX3B1YmlkOwotICAgIGNvbnN0IHhtbENoYXIgKiBzeXNpZDsgLyogdGhlIHN5c3RlbSBpZGVudGlmaWVyLCB3aGljaCBpcyB0aGUgVVJJIG9mIHRoZSBEVEQgKi8KKyAgICB4bWxDaGFyICogc3lzaWQ7IC8qIHRoZSBzeXN0ZW0gaWRlbnRpZmllciwgd2hpY2ggaXMgdGhlIFVSSSBvZiB0aGUgRFREICovCiAgICAgaW50IG5fc3lzaWQ7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5kYXRhaWQ7IC8qIHRoZSB4bWwgbm90YXRpb24gbmFtZS4gKi8KKyAgICB4bWxDaGFyICogbmRhdGFpZDsgLyogdGhlIHhtbCBub3RhdGlvbiBuYW1lLiAqLwogICAgIGludCBuX25kYXRhaWQ7CiAKICAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKQEAgLTI4NjUyLDExICszMjQwNSwxMSBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgIGludCBuX3dyaXRlcjsKLSAgICBjb25zdCB4bWxDaGFyICogcHViaWQ7IC8qIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgd2hpY2ggaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIHN5c3RlbSBpZGVudGlmaWVyICovCisgICAgeG1sQ2hhciAqIHB1YmlkOyAvKiB0aGUgcHVibGljIGlkZW50aWZpZXIsIHdoaWNoIGlzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBzeXN0ZW0gaWRlbnRpZmllciAqLwogICAgIGludCBuX3B1YmlkOwotICAgIGNvbnN0IHhtbENoYXIgKiBzeXNpZDsgLyogdGhlIHN5c3RlbSBpZGVudGlmaWVyLCB3aGljaCBpcyB0aGUgVVJJIG9mIHRoZSBEVEQgKi8KKyAgICB4bWxDaGFyICogc3lzaWQ7IC8qIHRoZSBzeXN0ZW0gaWRlbnRpZmllciwgd2hpY2ggaXMgdGhlIFVSSSBvZiB0aGUgRFREICovCiAgICAgaW50IG5fc3lzaWQ7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5kYXRhaWQ7IC8qIHRoZSB4bWwgbm90YXRpb24gbmFtZS4gKi8KKyAgICB4bWxDaGFyICogbmRhdGFpZDsgLyogdGhlIHhtbCBub3RhdGlvbiBuYW1lLiAqLwogICAgIGludCBuX25kYXRhaWQ7CiAKICAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKQEAgLTI4NzA5LDkgKzMyNDYyLDkgQEAKICAgICBpbnQgbl93cml0ZXI7CiAgICAgaW50IHBlOyAvKiBUUlVFIGlmIHRoaXMgaXMgYSBwYXJhbWV0ZXIgZW50aXR5LCBGQUxTRSBpZiBub3QgKi8KICAgICBpbnQgbl9wZTsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIERURCBlbnRpdHkgKi8KKyAgICB4bWxDaGFyICogbmFtZTsgLyogdGhlIG5hbWUgb2YgdGhlIERURCBlbnRpdHkgKi8KICAgICBpbnQgbl9uYW1lOwotICAgIGNvbnN0IHhtbENoYXIgKiBjb250ZW50OyAvKiBjb250ZW50IG9mIHRoZSBlbnRpdHkgKi8KKyAgICB4bWxDaGFyICogY29udGVudDsgLyogY29udGVudCBvZiB0aGUgZW50aXR5ICovCiAgICAgaW50IG5fY29udGVudDsKIAogICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewpAQCAtMjg3NjIsMTEgKzMyNTE1LDExIEBACiAgICAgaW50IHJldF92YWw7CiAgICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICAgaW50IG5fd3JpdGVyOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lOyAvKiB0aGUgbmFtZSBvZiB0aGUgeG1sIG5vdGF0aW9uICovCisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIHRoZSBuYW1lIG9mIHRoZSB4bWwgbm90YXRpb24gKi8KICAgICBpbnQgbl9uYW1lOwotICAgIGNvbnN0IHhtbENoYXIgKiBwdWJpZDsgLyogdGhlIHB1YmxpYyBpZGVudGlmaWVyLCB3aGljaCBpcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgc3lzdGVtIGlkZW50aWZpZXIgKi8KKyAgICB4bWxDaGFyICogcHViaWQ7IC8qIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgd2hpY2ggaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIHN5c3RlbSBpZGVudGlmaWVyICovCiAgICAgaW50IG5fcHViaWQ7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHN5c2lkOyAvKiB0aGUgc3lzdGVtIGlkZW50aWZpZXIsIHdoaWNoIGlzIHRoZSBVUkkgb2YgdGhlIERURCAqLworICAgIHhtbENoYXIgKiBzeXNpZDsgLyogdGhlIHN5c3RlbSBpZGVudGlmaWVyLCB3aGljaCBpcyB0aGUgVVJJIG9mIHRoZSBEVEQgKi8KICAgICBpbnQgbl9zeXNpZDsKIAogICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewpAQCAtMjg4MTcsOSArMzI1NzAsOSBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgIGludCBuX3dyaXRlcjsKLSAgICBjb25zdCB4bWxDaGFyICogbmFtZTsgLyogZWxlbWVudCBuYW1lICovCisgICAgeG1sQ2hhciAqIG5hbWU7IC8qIGVsZW1lbnQgbmFtZSAqLwogICAgIGludCBuX25hbWU7Ci0gICAgY29uc3QgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIGVsZW1lbnQgY29udGVudCAqLworICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiBlbGVtZW50IGNvbnRlbnQgKi8KICAgICBpbnQgbl9jb250ZW50OwogCiAgICAgZm9yIChuX3dyaXRlciA9IDA7bl93cml0ZXIgPCBnZW5fbmJfeG1sVGV4dFdyaXRlclB0cjtuX3dyaXRlcisrKSB7CkBAIC0yODg2NSwxMyArMzI2MTgsMTMgQEAKICAgICBpbnQgcmV0X3ZhbDsKICAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgICBpbnQgbl93cml0ZXI7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHByZWZpeDsgLyogbmFtZXNwYWNlIHByZWZpeCAqLworICAgIHhtbENoYXIgKiBwcmVmaXg7IC8qIG5hbWVzcGFjZSBwcmVmaXggKi8KICAgICBpbnQgbl9wcmVmaXg7Ci0gICAgY29uc3QgeG1sQ2hhciAqIG5hbWU7IC8qIGVsZW1lbnQgbG9jYWwgbmFtZSAqLworICAgIHhtbENoYXIgKiBuYW1lOyAvKiBlbGVtZW50IGxvY2FsIG5hbWUgKi8KICAgICBpbnQgbl9uYW1lOwotICAgIGNvbnN0IHhtbENoYXIgKiBuYW1lc3BhY2VVUkk7IC8qIG5hbWVzcGFjZSBVUkkgKi8KKyAgICB4bWxDaGFyICogbmFtZXNwYWNlVVJJOyAvKiBuYW1lc3BhY2UgVVJJICovCiAgICAgaW50IG5fbmFtZXNwYWNlVVJJOwotICAgIGNvbnN0IHhtbENoYXIgKiBjb250ZW50OyAvKiBlbGVtZW50IGNvbnRlbnQgKi8KKyAgICB4bWxDaGFyICogY29udGVudDsgLyogZWxlbWVudCBjb250ZW50ICovCiAgICAgaW50IG5fY29udGVudDsKIAogICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewpAQCAtMjkwNTcsOSArMzI4MTAsOSBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgIGludCBuX3dyaXRlcjsKLSAgICBjb25zdCB4bWxDaGFyICogdGFyZ2V0OyAvKiBQSSB0YXJnZXQgKi8KKyAgICB4bWxDaGFyICogdGFyZ2V0OyAvKiBQSSB0YXJnZXQgKi8KICAgICBpbnQgbl90YXJnZXQ7Ci0gICAgY29uc3QgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIFBJIGNvbnRlbnQgKi8KKyAgICB4bWxDaGFyICogY29udGVudDsgLyogUEkgY29udGVudCAqLwogICAgIGludCBuX2NvbnRlbnQ7CiAKICAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKQEAgLTI5MTA1LDcgKzMyODU4LDcgQEAKICAgICBpbnQgcmV0X3ZhbDsKICAgICB4bWxUZXh0V3JpdGVyUHRyIHdyaXRlcjsgLyogdGhlIHhtbFRleHRXcml0ZXJQdHIgKi8KICAgICBpbnQgbl93cml0ZXI7Ci0gICAgY29uc3QgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRleHQgc3RyaW5nICovCisgICAgeG1sQ2hhciAqIGNvbnRlbnQ7IC8qIHRleHQgc3RyaW5nICovCiAgICAgaW50IG5fY29udGVudDsKIAogICAgIGZvciAobl93cml0ZXIgPSAwO25fd3JpdGVyIDwgZ2VuX25iX3htbFRleHRXcml0ZXJQdHI7bl93cml0ZXIrKykgewpAQCAtMjkxNDYsNyArMzI4OTksNyBAQAogICAgIGludCByZXRfdmFsOwogICAgIHhtbFRleHRXcml0ZXJQdHIgd3JpdGVyOyAvKiB0aGUgeG1sVGV4dFdyaXRlclB0ciAqLwogICAgIGludCBuX3dyaXRlcjsKLSAgICBjb25zdCB4bWxDaGFyICogY29udGVudDsgLyogdGV4dCBzdHJpbmcgKi8KKyAgICB4bWxDaGFyICogY29udGVudDsgLyogdGV4dCBzdHJpbmcgKi8KICAgICBpbnQgbl9jb250ZW50OwogICAgIGludCBsZW47IC8qIGxlbmd0aCBvZiB0aGUgdGV4dCBzdHJpbmcgKi8KICAgICBpbnQgbl9sZW47CkBAIC0yOTE5NCw3ICszMjk0Nyw3IEBACiAgICAgaW50IHJldF92YWw7CiAgICAgeG1sVGV4dFdyaXRlclB0ciB3cml0ZXI7IC8qIHRoZSB4bWxUZXh0V3JpdGVyUHRyICovCiAgICAgaW50IG5fd3JpdGVyOwotICAgIGNvbnN0IHhtbENoYXIgKiBjb250ZW50OyAvKiB0ZXh0IHN0cmluZyAqLworICAgIHhtbENoYXIgKiBjb250ZW50OyAvKiB0ZXh0IHN0cmluZyAqLwogICAgIGludCBuX2NvbnRlbnQ7CiAKICAgICBmb3IgKG5fd3JpdGVyID0gMDtuX3dyaXRlciA8IGdlbl9uYl94bWxUZXh0V3JpdGVyUHRyO25fd3JpdGVyKyspIHsKQEAgLTI5NTEyLDEyICszMzI2NSw0MyBAQAogfQogCiAKKyNkZWZpbmUgZ2VuX25iX3htbE5vZGVTZXRQdHIgMQorc3RhdGljIHhtbE5vZGVTZXRQdHIgZ2VuX3htbE5vZGVTZXRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7CisgICAgcmV0dXJuKE5VTEwpOworfQorc3RhdGljIHZvaWQgZGVzX3htbE5vZGVTZXRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbE5vZGVTZXRQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cit9CisKIHN0YXRpYyBpbnQKIHRlc3RfeG1sWFBhdGhDYXN0Tm9kZVNldFRvQm9vbGVhbih2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfWFBBVEhfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICB4bWxOb2RlU2V0UHRyIG5zOyAvKiBhIG5vZGUtc2V0ICovCisgICAgaW50IG5fbnM7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9ucyA9IDA7bl9ucyA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbnMrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBucyA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbnMsIDApOworCisgICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENhc3ROb2RlU2V0VG9Cb29sZWFuKG5zKTsKKyAgICAgICAgZGVzcmV0X2ludChyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sTm9kZVNldFB0cihuX25zLCBucywgMCk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUGF0aENhc3ROb2RlU2V0VG9Cb29sZWFuIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9ucyk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTI5NTI2LDggKzMzMzEwLDMyIEBACiB0ZXN0X3htbFhQYXRoQ2FzdE5vZGVTZXRUb051bWJlcih2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfWFBBVEhfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICBkb3VibGUgcmV0X3ZhbDsKKyAgICB4bWxOb2RlU2V0UHRyIG5zOyAvKiBhIG5vZGUtc2V0ICovCisgICAgaW50IG5fbnM7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9ucyA9IDA7bl9ucyA8IGdlbl9uYl94bWxOb2RlU2V0UHRyO25fbnMrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBucyA9IGdlbl94bWxOb2RlU2V0UHRyKG5fbnMsIDApOworCisgICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENhc3ROb2RlU2V0VG9OdW1iZXIobnMpOworICAgICAgICBkZXNyZXRfZG91YmxlKHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbnMsIG5zLCAwKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQ2FzdE5vZGVTZXRUb051bWJlciIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbnMpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0yOTUzNiw4ICszMzM0NCwzMiBAQAogdGVzdF94bWxYUGF0aENhc3ROb2RlU2V0VG9TdHJpbmcodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX1hQQVRIX0VOQUJMRUQKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgeG1sQ2hhciAqIHJldF92YWw7CisgICAgeG1sTm9kZVNldFB0ciBuczsgLyogYSBub2RlLXNldCAqLworICAgIGludCBuX25zOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fbnMgPSAwO25fbnMgPCBnZW5fbmJfeG1sTm9kZVNldFB0cjtuX25zKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgbnMgPSBnZW5feG1sTm9kZVNldFB0cihuX25zLCAwKTsKKworICAgICAgICByZXRfdmFsID0geG1sWFBhdGhDYXN0Tm9kZVNldFRvU3RyaW5nKG5zKTsKKyAgICAgICAgZGVzcmV0X3htbENoYXJfcHRyKHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fbnMsIG5zLCAwKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQ2FzdE5vZGVTZXRUb1N0cmluZyIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fbnMpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0yOTYzNyw3ICszMzQ2OSw3IEBACiAjaWZkZWYgTElCWE1MX1hQQVRIX0VOQUJMRUQKICAgICBpbnQgbWVtX2Jhc2U7CiAgICAgaW50IHJldF92YWw7Ci0gICAgY29uc3QgeG1sQ2hhciAqIHZhbDsgLyogYSBzdHJpbmcgKi8KKyAgICB4bWxDaGFyICogdmFsOyAvKiBhIHN0cmluZyAqLwogICAgIGludCBuX3ZhbDsKIAogICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fdmFsKyspIHsKQEAgLTI5NjcxLDcgKzMzNTAzLDcgQEAKICNpZmRlZiBMSUJYTUxfWFBBVEhfRU5BQkxFRAogICAgIGludCBtZW1fYmFzZTsKICAgICBkb3VibGUgcmV0X3ZhbDsKLSAgICBjb25zdCB4bWxDaGFyICogdmFsOyAvKiBhIHN0cmluZyAqLworICAgIHhtbENoYXIgKiB2YWw7IC8qIGEgc3RyaW5nICovCiAgICAgaW50IG5fdmFsOwogCiAgICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl92YWwrKykgewpAQCAtMjk4NTEsMTIgKzMzNjgzLDU3IEBACiB9CiAKIAorI2RlZmluZSBnZW5fbmJfeG1sWFBhdGhDb21wRXhwclB0ciAxCitzdGF0aWMgeG1sWFBhdGhDb21wRXhwclB0ciBnZW5feG1sWFBhdGhDb21wRXhwclB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfeG1sWFBhdGhDb21wRXhwclB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sWFBhdGhDb21wRXhwclB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKK30KKworI2RlZmluZSBnZW5fbmJfeG1sWFBhdGhDb250ZXh0UHRyIDEKK3N0YXRpYyB4bWxYUGF0aENvbnRleHRQdHIgZ2VuX3htbFhQYXRoQ29udGV4dFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKKyAgICByZXR1cm4oTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBkZXNfeG1sWFBhdGhDb250ZXh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCB4bWxYUGF0aENvbnRleHRQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cit9CisKIHN0YXRpYyBpbnQKIHRlc3RfeG1sWFBhdGhDb21waWxlZEV2YWwodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX1hQQVRIX0VOQUJMRUQKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0X3ZhbDsKKyAgICB4bWxYUGF0aENvbXBFeHByUHRyIGNvbXA7IC8qIHRoZSBjb21waWxlZCBYUGF0aCBleHByZXNzaW9uICovCisgICAgaW50IG5fY29tcDsKKyAgICB4bWxYUGF0aENvbnRleHRQdHIgY3R4OyAvKiB0aGUgWFBhdGggY29udGV4dCAqLworICAgIGludCBuX2N0eDsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2NvbXAgPSAwO25fY29tcCA8IGdlbl9uYl94bWxYUGF0aENvbXBFeHByUHRyO25fY29tcCsrKSB7CisgICAgZm9yIChuX2N0eCA9IDA7bl9jdHggPCBnZW5fbmJfeG1sWFBhdGhDb250ZXh0UHRyO25fY3R4KyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgY29tcCA9IGdlbl94bWxYUGF0aENvbXBFeHByUHRyKG5fY29tcCwgMCk7CisgICAgICAgIGN0eCA9IGdlbl94bWxYUGF0aENvbnRleHRQdHIobl9jdHgsIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxYUGF0aENvbXBpbGVkRXZhbChjb21wLCBjdHgpOworICAgICAgICBkZXNyZXRfeG1sWFBhdGhPYmplY3RQdHIocmV0X3ZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbFhQYXRoQ29tcEV4cHJQdHIobl9jb21wLCBjb21wLCAwKTsKKyAgICAgICAgZGVzX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eCwgY3R4LCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoQ29tcGlsZWRFdmFsIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jb21wKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMjk5ODAsOCArMzM4NTcsMzkgQEAKIHRlc3RfeG1sWFBhdGhFdmFsKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9YUEFUSF9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CisgICAgeG1sQ2hhciAqIHN0cjsgLyogdGhlIFhQYXRoIGV4cHJlc3Npb24gKi8KKyAgICBpbnQgbl9zdHI7CisgICAgeG1sWFBhdGhDb250ZXh0UHRyIGN0eDsgLyogdGhlIFhQYXRoIGNvbnRleHQgKi8KKyAgICBpbnQgbl9jdHg7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyKyspIHsKKyAgICBmb3IgKG5fY3R4ID0gMDtuX2N0eCA8IGdlbl9uYl94bWxYUGF0aENvbnRleHRQdHI7bl9jdHgrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBzdHIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIDApOworICAgICAgICBjdHggPSBnZW5feG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4LCAxKTsKKworICAgICAgICByZXRfdmFsID0geG1sWFBhdGhFdmFsKHN0ciwgY3R4KTsKKyAgICAgICAgZGVzcmV0X3htbFhQYXRoT2JqZWN0UHRyKHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc19jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgc3RyLCAwKTsKKyAgICAgICAgZGVzX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eCwgY3R4LCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoRXZhbCIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMjk5OTAsOCArMzM4OTgsMzkgQEAKIHRlc3RfeG1sWFBhdGhFdmFsRXhwcmVzc2lvbih2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfWFBBVEhfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICB4bWxYUGF0aE9iamVjdFB0ciByZXRfdmFsOworICAgIHhtbENoYXIgKiBzdHI7IC8qIHRoZSBYUGF0aCBleHByZXNzaW9uICovCisgICAgaW50IG5fc3RyOworICAgIHhtbFhQYXRoQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBhdGggY29udGV4dCAqLworICAgIGludCBuX2N0eHQ7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9zdHIgPSAwO25fc3RyIDwgZ2VuX25iX2NvbnN0X3htbENoYXJfcHRyO25fc3RyKyspIHsKKyAgICBmb3IgKG5fY3R4dCA9IDA7bl9jdHh0IDwgZ2VuX25iX3htbFhQYXRoQ29udGV4dFB0cjtuX2N0eHQrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBzdHIgPSBnZW5fY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIDApOworICAgICAgICBjdHh0ID0gZ2VuX3htbFhQYXRoQ29udGV4dFB0cihuX2N0eHQsIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxYUGF0aEV2YWxFeHByZXNzaW9uKHN0ciwgY3R4dCk7CisgICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIHN0ciwgMCk7CisgICAgICAgIGRlc194bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQYXRoRXZhbEV4cHJlc3Npb24iLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3N0cik7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3R4dCk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0zMDAwMCw4ICszMzkzOSwzOSBAQAogdGVzdF94bWxYUGF0aEV2YWxQcmVkaWNhdGUodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX1hQQVRIX0VOQUJMRUQKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgaW50IHJldF92YWw7CisgICAgeG1sWFBhdGhDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUGF0aCBjb250ZXh0ICovCisgICAgaW50IG5fY3R4dDsKKyAgICB4bWxYUGF0aE9iamVjdFB0ciByZXM7IC8qIHRoZSBQcmVkaWNhdGUgRXhwcmVzc2lvbiBldmFsdWF0aW9uIHJlc3VsdCAqLworICAgIGludCBuX3JlczsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2N0eHQgPSAwO25fY3R4dCA8IGdlbl9uYl94bWxYUGF0aENvbnRleHRQdHI7bl9jdHh0KyspIHsKKyAgICBmb3IgKG5fcmVzID0gMDtuX3JlcyA8IGdlbl9uYl94bWxYUGF0aE9iamVjdFB0cjtuX3JlcysrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhDb250ZXh0UHRyKG5fY3R4dCwgMCk7CisgICAgICAgIHJlcyA9IGdlbl94bWxYUGF0aE9iamVjdFB0cihuX3JlcywgMSk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFhQYXRoRXZhbFByZWRpY2F0ZShjdHh0LCByZXMpOworICAgICAgICBkZXNyZXRfaW50KHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxYUGF0aENvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKKyAgICAgICAgZGVzX3htbFhQYXRoT2JqZWN0UHRyKG5fcmVzLCByZXMsIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFBhdGhFdmFsUHJlZGljYXRlIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9yZXMpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMzAxNDIsNyArMzQxMTIsNyBAQAogdGVzdF94cGF0aCh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKLSAgICBwcmludGYoIlRlc3RpbmcgeHBhdGggOiAxNiBvZiAzNiBmdW5jdGlvbnMgLi4uXG4iKTsKKyAgICBwcmludGYoIlRlc3RpbmcgeHBhdGggOiAyMyBvZiAzNiBmdW5jdGlvbnMgLi4uXG4iKTsKICAgICByZXQgKz0gdGVzdF94bWxYUGF0aENhc3RCb29sZWFuVG9OdW1iZXIoKTsKICAgICByZXQgKz0gdGVzdF94bWxYUGF0aENhc3RCb29sZWFuVG9TdHJpbmcoKTsKICAgICByZXQgKz0gdGVzdF94bWxYUGF0aENhc3ROb2RlU2V0VG9Cb29sZWFuKCk7CkBAIC0zMDIxOCwyOCArMzQxODgsMTI0IEBACiB0ZXN0X3htbFhQdHJFdmFsKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9YUFRSX0VOQUJMRUQKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0X3ZhbDsKKyAgICB4bWxDaGFyICogc3RyOyAvKiB0aGUgWFBvaW50ZXIgZXhwcmVzc2lvbiAqLworICAgIGludCBuX3N0cjsKKyAgICB4bWxYUGF0aENvbnRleHRQdHIgY3R4OyAvKiB0aGUgWFBvaW50ZXIgY29udGV4dCAqLworICAgIGludCBuX2N0eDsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX3N0ciA9IDA7bl9zdHIgPCBnZW5fbmJfY29uc3RfeG1sQ2hhcl9wdHI7bl9zdHIrKykgeworICAgIGZvciAobl9jdHggPSAwO25fY3R4IDwgZ2VuX25iX3htbFhQYXRoQ29udGV4dFB0cjtuX2N0eCsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIHN0ciA9IGdlbl9jb25zdF94bWxDaGFyX3B0cihuX3N0ciwgMCk7CisgICAgICAgIGN0eCA9IGdlbl94bWxYUGF0aENvbnRleHRQdHIobl9jdHgsIDEpOworCisgICAgICAgIHJldF92YWwgPSB4bWxYUHRyRXZhbChzdHIsIGN0eCk7CisgICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfY29uc3RfeG1sQ2hhcl9wdHIobl9zdHIsIHN0ciwgMCk7CisgICAgICAgIGRlc194bWxYUGF0aENvbnRleHRQdHIobl9jdHgsIGN0eCwgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUHRyRXZhbCIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc3RyKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHgpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIAogCisjZGVmaW5lIGdlbl9uYl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIgMQorc3RhdGljIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworICAgIHJldHVybihOVUxMKTsKK30KK3N0YXRpYyB2b2lkIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIoaW50IG5vIEFUVFJJQlVURV9VTlVTRUQsIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciB2YWwgQVRUUklCVVRFX1VOVVNFRCwgaW50IG5yIEFUVFJJQlVURV9VTlVTRUQpIHsKK30KKwogc3RhdGljIGludAogdGVzdF94bWxYUHRyRXZhbFJhbmdlUHJlZGljYXRlKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9YUFRSX0VOQUJMRUQKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQ7IC8qIHRoZSBYUG9pbnRlciBQYXJzZXIgY29udGV4dCAqLworICAgIGludCBuX2N0eHQ7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CisgICAgICAgIG1lbV9iYXNlID0geG1sTWVtQmxvY2tzKCk7CisgICAgICAgIGN0eHQgPSBnZW5feG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgMCk7CisKKyAgICAgICAgeG1sWFB0ckV2YWxSYW5nZVByZWRpY2F0ZShjdHh0KTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyKG5fY3R4dCwgY3R4dCwgMCk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUHRyRXZhbFJhbmdlUHJlZGljYXRlIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIAogCisjZGVmaW5lIGdlbl9uYl94bWxMb2NhdGlvblNldFB0ciAxCitzdGF0aWMgeG1sTG9jYXRpb25TZXRQdHIgZ2VuX3htbExvY2F0aW9uU2V0UHRyKGludCBubyBBVFRSSUJVVEVfVU5VU0VELCBpbnQgbnIgQVRUUklCVVRFX1VOVVNFRCkgeworICAgIHJldHVybihOVUxMKTsKK30KK3N0YXRpYyB2b2lkIGRlc194bWxMb2NhdGlvblNldFB0cihpbnQgbm8gQVRUUklCVVRFX1VOVVNFRCwgeG1sTG9jYXRpb25TZXRQdHIgdmFsIEFUVFJJQlVURV9VTlVTRUQsIGludCBuciBBVFRSSUJVVEVfVU5VU0VEKSB7Cit9CisKIHN0YXRpYyBpbnQKIHRlc3RfeG1sWFB0ckxvY2F0aW9uU2V0QWRkKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9YUFRSX0VOQUJMRUQKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgeG1sTG9jYXRpb25TZXRQdHIgY3VyOyAvKiB0aGUgaW5pdGlhbCByYW5nZSBzZXQgKi8KKyAgICBpbnQgbl9jdXI7CisgICAgeG1sWFBhdGhPYmplY3RQdHIgdmFsOyAvKiBhIG5ldyB4bWxYUGF0aE9iamVjdFB0ciAqLworICAgIGludCBuX3ZhbDsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX2N1ciA9IDA7bl9jdXIgPCBnZW5fbmJfeG1sTG9jYXRpb25TZXRQdHI7bl9jdXIrKykgeworICAgIGZvciAobl92YWwgPSAwO25fdmFsIDwgZ2VuX25iX3htbFhQYXRoT2JqZWN0UHRyO25fdmFsKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgY3VyID0gZ2VuX3htbExvY2F0aW9uU2V0UHRyKG5fY3VyLCAwKTsKKyAgICAgICAgdmFsID0gZ2VuX3htbFhQYXRoT2JqZWN0UHRyKG5fdmFsLCAxKTsKKworICAgICAgICB4bWxYUHRyTG9jYXRpb25TZXRBZGQoY3VyLCB2YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxMb2NhdGlvblNldFB0cihuX2N1ciwgY3VyLCAwKTsKKyAgICAgICAgZGVzX3htbFhQYXRoT2JqZWN0UHRyKG5fdmFsLCB2YWwsIDEpOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFB0ckxvY2F0aW9uU2V0QWRkIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdXIpOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX3ZhbCk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0zMDI1OCw4ICszNDMyNCwzNyBAQAogdGVzdF94bWxYUHRyTG9jYXRpb25TZXREZWwodm9pZCkgewogICAgIGludCByZXQgPSAwOwogCisjaWZkZWYgTElCWE1MX1hQVFJfRU5BQkxFRAorICAgIGludCBtZW1fYmFzZTsKKyAgICB4bWxMb2NhdGlvblNldFB0ciBjdXI7IC8qIHRoZSBpbml0aWFsIHJhbmdlIHNldCAqLworICAgIGludCBuX2N1cjsKKyAgICB4bWxYUGF0aE9iamVjdFB0ciB2YWw7IC8qIGFuIHhtbFhQYXRoT2JqZWN0UHRyICovCisgICAgaW50IG5fdmFsOwogCi0gICAgLyogbWlzc2luZyB0eXBlIHN1cHBvcnQgKi8KKyAgICBmb3IgKG5fY3VyID0gMDtuX2N1ciA8IGdlbl9uYl94bWxMb2NhdGlvblNldFB0cjtuX2N1cisrKSB7CisgICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfeG1sWFBhdGhPYmplY3RQdHI7bl92YWwrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBjdXIgPSBnZW5feG1sTG9jYXRpb25TZXRQdHIobl9jdXIsIDApOworICAgICAgICB2YWwgPSBnZW5feG1sWFBhdGhPYmplY3RQdHIobl92YWwsIDEpOworCisgICAgICAgIHhtbFhQdHJMb2NhdGlvblNldERlbChjdXIsIHZhbCk7CisgICAgICAgIGNhbGxfdGVzdHMrKzsKKyAgICAgICAgZGVzX3htbExvY2F0aW9uU2V0UHRyKG5fY3VyLCBjdXIsIDApOworICAgICAgICBkZXNfeG1sWFBhdGhPYmplY3RQdHIobl92YWwsIHZhbCwgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUHRyTG9jYXRpb25TZXREZWwiLAorCSAgICAgICAgICAgeG1sTWVtQmxvY2tzKCkgLSBtZW1fYmFzZSk7CisJICAgIHJldCsrOworICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCBuX2N1cik7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fdmFsKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZ1bmN0aW9uX3Rlc3RzKys7CiAgICAgcmV0dXJuKHJldCk7CiB9CiAKQEAgLTMwMjc4LDggKzM0MzczLDM3IEBACiB0ZXN0X3htbFhQdHJMb2NhdGlvblNldFJlbW92ZSh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfWFBUUl9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbExvY2F0aW9uU2V0UHRyIGN1cjsgLyogdGhlIGluaXRpYWwgcmFuZ2Ugc2V0ICovCisgICAgaW50IG5fY3VyOworICAgIGludCB2YWw7IC8qIHRoZSBpbmRleCB0byByZW1vdmUgKi8KKyAgICBpbnQgbl92YWw7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9jdXIgPSAwO25fY3VyIDwgZ2VuX25iX3htbExvY2F0aW9uU2V0UHRyO25fY3VyKyspIHsKKyAgICBmb3IgKG5fdmFsID0gMDtuX3ZhbCA8IGdlbl9uYl9pbnQ7bl92YWwrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBjdXIgPSBnZW5feG1sTG9jYXRpb25TZXRQdHIobl9jdXIsIDApOworICAgICAgICB2YWwgPSBnZW5faW50KG5fdmFsLCAxKTsKKworICAgICAgICB4bWxYUHRyTG9jYXRpb25TZXRSZW1vdmUoY3VyLCB2YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxMb2NhdGlvblNldFB0cihuX2N1ciwgY3VyLCAwKTsKKyAgICAgICAgZGVzX2ludChuX3ZhbCwgdmFsLCAxKTsKKyAgICAgICAgeG1sUmVzZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKG1lbV9iYXNlICE9IHhtbE1lbUJsb2NrcygpKSB7CisgICAgICAgICAgICBwcmludGYoIkxlYWsgb2YgJWQgYmxvY2tzIGZvdW5kIGluIHhtbFhQdHJMb2NhdGlvblNldFJlbW92ZSIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fY3VyKTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMzAzMzIsOCArMzQ0NTYsMzIgQEAKIHRlc3RfeG1sWFB0ck5ld0xvY2F0aW9uU2V0Tm9kZVNldCh2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfWFBUUl9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbFhQYXRoT2JqZWN0UHRyIHJldF92YWw7CisgICAgeG1sTm9kZVNldFB0ciBzZXQ7IC8qIGEgbm9kZSBzZXQgKi8KKyAgICBpbnQgbl9zZXQ7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9zZXQgPSAwO25fc2V0IDwgZ2VuX25iX3htbE5vZGVTZXRQdHI7bl9zZXQrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICBzZXQgPSBnZW5feG1sTm9kZVNldFB0cihuX3NldCwgMCk7CisKKyAgICAgICAgcmV0X3ZhbCA9IHhtbFhQdHJOZXdMb2NhdGlvblNldE5vZGVTZXQoc2V0KTsKKyAgICAgICAgZGVzcmV0X3htbFhQYXRoT2JqZWN0UHRyKHJldF92YWwpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxOb2RlU2V0UHRyKG5fc2V0LCBzZXQsIDApOworICAgICAgICB4bWxSZXNldExhc3RFcnJvcigpOworICAgICAgICBpZiAobWVtX2Jhc2UgIT0geG1sTWVtQmxvY2tzKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiTGVhayBvZiAlZCBibG9ja3MgZm91bmQgaW4geG1sWFB0ck5ld0xvY2F0aW9uU2V0Tm9kZVNldCIsCisJICAgICAgICAgICB4bWxNZW1CbG9ja3MoKSAtIG1lbV9iYXNlKTsKKwkgICAgcmV0Kys7CisgICAgICAgICAgICBwcmludGYoIiAlZCIsIG5fc2V0KTsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZnVuY3Rpb25fdGVzdHMrKzsKICAgICByZXR1cm4ocmV0KTsKIH0KIApAQCAtMzA2NDMsOCArMzQ3OTEsMzcgQEAKIHRlc3RfeG1sWFB0clJhbmdlVG9GdW5jdGlvbih2b2lkKSB7CiAgICAgaW50IHJldCA9IDA7CiAKKyNpZmRlZiBMSUJYTUxfWFBUUl9FTkFCTEVECisgICAgaW50IG1lbV9iYXNlOworICAgIHhtbFhQYXRoUGFyc2VyQ29udGV4dFB0ciBjdHh0OyAvKiB0aGUgWFBvaW50ZXIgUGFyc2VyIGNvbnRleHQgKi8KKyAgICBpbnQgbl9jdHh0OworICAgIGludCBuYXJnczsgLyogdGhlIG51bWJlciBvZiBhcmdzICovCisgICAgaW50IG5fbmFyZ3M7CiAKLSAgICAvKiBtaXNzaW5nIHR5cGUgc3VwcG9ydCAqLworICAgIGZvciAobl9jdHh0ID0gMDtuX2N0eHQgPCBnZW5fbmJfeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyO25fY3R4dCsrKSB7CisgICAgZm9yIChuX25hcmdzID0gMDtuX25hcmdzIDwgZ2VuX25iX2ludDtuX25hcmdzKyspIHsKKyAgICAgICAgbWVtX2Jhc2UgPSB4bWxNZW1CbG9ja3MoKTsKKyAgICAgICAgY3R4dCA9IGdlbl94bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCAwKTsKKyAgICAgICAgbmFyZ3MgPSBnZW5faW50KG5fbmFyZ3MsIDEpOworCisgICAgICAgIHhtbFhQdHJSYW5nZVRvRnVuY3Rpb24oY3R4dCwgbmFyZ3MpOworICAgICAgICBjYWxsX3Rlc3RzKys7CisgICAgICAgIGRlc194bWxYUGF0aFBhcnNlckNvbnRleHRQdHIobl9jdHh0LCBjdHh0LCAwKTsKKyAgICAgICAgZGVzX2ludChuX25hcmdzLCBuYXJncywgMSk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUHRyUmFuZ2VUb0Z1bmN0aW9uIiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9jdHh0KTsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl9uYXJncyk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0zMDY1Myw4ICszNDgzMCwzMiBAQAogdGVzdF94bWxYUHRyV3JhcExvY2F0aW9uU2V0KHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAorI2lmZGVmIExJQlhNTF9YUFRSX0VOQUJMRUQKKyAgICBpbnQgbWVtX2Jhc2U7CisgICAgeG1sWFBhdGhPYmplY3RQdHIgcmV0X3ZhbDsKKyAgICB4bWxMb2NhdGlvblNldFB0ciB2YWw7IC8qIHRoZSBMb2NhdGlvblNldCB2YWx1ZSAqLworICAgIGludCBuX3ZhbDsKIAotICAgIC8qIG1pc3NpbmcgdHlwZSBzdXBwb3J0ICovCisgICAgZm9yIChuX3ZhbCA9IDA7bl92YWwgPCBnZW5fbmJfeG1sTG9jYXRpb25TZXRQdHI7bl92YWwrKykgeworICAgICAgICBtZW1fYmFzZSA9IHhtbE1lbUJsb2NrcygpOworICAgICAgICB2YWwgPSBnZW5feG1sTG9jYXRpb25TZXRQdHIobl92YWwsIDApOworCisgICAgICAgIHJldF92YWwgPSB4bWxYUHRyV3JhcExvY2F0aW9uU2V0KHZhbCk7CisgICAgICAgIGRlc3JldF94bWxYUGF0aE9iamVjdFB0cihyZXRfdmFsKTsKKyAgICAgICAgY2FsbF90ZXN0cysrOworICAgICAgICBkZXNfeG1sTG9jYXRpb25TZXRQdHIobl92YWwsIHZhbCwgMCk7CisgICAgICAgIHhtbFJlc2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChtZW1fYmFzZSAhPSB4bWxNZW1CbG9ja3MoKSkgeworICAgICAgICAgICAgcHJpbnRmKCJMZWFrIG9mICVkIGJsb2NrcyBmb3VuZCBpbiB4bWxYUHRyV3JhcExvY2F0aW9uU2V0IiwKKwkgICAgICAgICAgIHhtbE1lbUJsb2NrcygpIC0gbWVtX2Jhc2UpOworCSAgICByZXQrKzsKKyAgICAgICAgICAgIHByaW50ZigiICVkIiwgbl92YWwpOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBmdW5jdGlvbl90ZXN0cysrOwogICAgIHJldHVybihyZXQpOwogfQogCkBAIC0zMDY2Miw3ICszNDg2Myw3IEBACiB0ZXN0X3hwb2ludGVyKHZvaWQpIHsKICAgICBpbnQgcmV0ID0gMDsKIAotICAgIHByaW50ZigiVGVzdGluZyB4cG9pbnRlciA6IDkgb2YgMjEgZnVuY3Rpb25zIC4uLlxuIik7CisgICAgcHJpbnRmKCJUZXN0aW5nIHhwb2ludGVyIDogMTcgb2YgMjEgZnVuY3Rpb25zIC4uLlxuIik7CiAgICAgcmV0ICs9IHRlc3RfeG1sWFB0ckJ1aWxkTm9kZUxpc3QoKTsKICAgICByZXQgKz0gdGVzdF94bWxYUHRyRXZhbCgpOwogICAgIHJldCArPSB0ZXN0X3htbFhQdHJFdmFsUmFuZ2VQcmVkaWNhdGUoKTsKZGlmZiAtLWdpdCBhL3ZhbGlkLmMgYi92YWxpZC5jCmluZGV4IDlmYTZjMTQuLjY4NWNlNmYgMTAwNjQ0Ci0tLSBhL3ZhbGlkLmMKKysrIGIvdmFsaWQuYwpAQCAtMTUxNyw2ICsxNTE3LDggQEAKICAqLwogdm9pZAogeG1sRHVtcEVsZW1lbnREZWNsKHhtbEJ1ZmZlclB0ciBidWYsIHhtbEVsZW1lbnRQdHIgZWxlbSkgeworICAgIGlmICgoYnVmID09IE5VTEwpIHx8IChlbGVtID09IE5VTEwpKQorICAgICAgICByZXR1cm47CiAgICAgc3dpdGNoIChlbGVtLT5ldHlwZSkgewogCWNhc2UgWE1MX0VMRU1FTlRfVFlQRV9FTVBUWToKIAkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIjwhRUxFTUVOVCAiKTsKQEAgLTE1ODcsNiArMTU4OSw4IEBACiAgKi8KIHZvaWQKIHhtbER1bXBFbGVtZW50VGFibGUoeG1sQnVmZmVyUHRyIGJ1ZiwgeG1sRWxlbWVudFRhYmxlUHRyIHRhYmxlKSB7CisgICAgaWYgKChidWYgPT0gTlVMTCkgfHwgKHRhYmxlID09IE5VTEwpKQorICAgICAgICByZXR1cm47CiAgICAgeG1sSGFzaFNjYW4odGFibGUsICh4bWxIYXNoU2Nhbm5lcikgeG1sRHVtcEVsZW1lbnREZWNsU2NhbiwgYnVmKTsKIH0KICNlbmRpZiAvKiBMSUJYTUxfT1VUUFVUX0VOQUJMRUQgKi8KQEAgLTE2NjYsNyArMTY3MCw4IEBACiAgKi8KIHN0YXRpYyB2b2lkCiB4bWxEdW1wRW51bWVyYXRpb24oeG1sQnVmZmVyUHRyIGJ1ZiwgeG1sRW51bWVyYXRpb25QdHIgY3VyKSB7Ci0gICAgaWYgKGN1ciA9PSBOVUxMKSAgcmV0dXJuOworICAgIGlmICgoYnVmID09IE5VTEwpIHx8IChjdXIgPT0gTlVMTCkpCisgICAgICAgIHJldHVybjsKICAgICAKICAgICB4bWxCdWZmZXJXcml0ZUNIQVIoYnVmLCBjdXItPm5hbWUpOwogICAgIGlmIChjdXItPm5leHQgPT0gTlVMTCkKQEAgLTIwNzMsNiArMjA3OCw4IEBACiAgKi8KIHZvaWQKIHhtbER1bXBBdHRyaWJ1dGVEZWNsKHhtbEJ1ZmZlclB0ciBidWYsIHhtbEF0dHJpYnV0ZVB0ciBhdHRyKSB7CisgICAgaWYgKChidWYgPT0gTlVMTCkgfHwgKGF0dHIgPT0gTlVMTCkpCisgICAgICAgIHJldHVybjsKICAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiPCFBVFRMSVNUICIpOwogICAgIHhtbEJ1ZmZlcldyaXRlQ0hBUihidWYsIGF0dHItPmVsZW0pOwogICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICIgIik7CkBAIC0yMTY0LDYgKzIxNzEsOCBAQAogICovCiB2b2lkCiB4bWxEdW1wQXR0cmlidXRlVGFibGUoeG1sQnVmZmVyUHRyIGJ1ZiwgeG1sQXR0cmlidXRlVGFibGVQdHIgdGFibGUpIHsKKyAgICBpZiAoKGJ1ZiA9PSBOVUxMKSB8fCAodGFibGUgPT0gTlVMTCkpCisgICAgICAgIHJldHVybjsKICAgICB4bWxIYXNoU2Nhbih0YWJsZSwgKHhtbEhhc2hTY2FubmVyKSB4bWxEdW1wQXR0cmlidXRlRGVjbFNjYW4sIGJ1Zik7CiB9CiAjZW5kaWYgLyogTElCWE1MX09VVFBVVF9FTkFCTEVEICovCkBAIC0yMzQ3LDYgKzIzNTYsOCBAQAogICovCiB2b2lkCiB4bWxEdW1wTm90YXRpb25EZWNsKHhtbEJ1ZmZlclB0ciBidWYsIHhtbE5vdGF0aW9uUHRyIG5vdGEpIHsKKyAgICBpZiAoKGJ1ZiA9PSBOVUxMKSB8fCAobm90YSA9PSBOVUxMKSkKKyAgICAgICAgcmV0dXJuOwogICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI8IU5PVEFUSU9OICIpOwogICAgIHhtbEJ1ZmZlcldyaXRlQ0hBUihidWYsIG5vdGEtPm5hbWUpOwogICAgIGlmIChub3RhLT5QdWJsaWNJRCAhPSBOVUxMKSB7CkBAIC0yMzg0LDYgKzIzOTUsOCBAQAogICovCiB2b2lkCiB4bWxEdW1wTm90YXRpb25UYWJsZSh4bWxCdWZmZXJQdHIgYnVmLCB4bWxOb3RhdGlvblRhYmxlUHRyIHRhYmxlKSB7CisgICAgaWYgKChidWYgPT0gTlVMTCkgfHwgKHRhYmxlID09IE5VTEwpKQorICAgICAgICByZXR1cm47CiAgICAgeG1sSGFzaFNjYW4odGFibGUsICh4bWxIYXNoU2Nhbm5lcikgeG1sRHVtcE5vdGF0aW9uRGVjbFNjYW4sIGJ1Zik7CiB9CiAjZW5kaWYgLyogTElCWE1MX09VVFBVVF9FTkFCTEVEICovCmRpZmYgLS1naXQgYS94bWxJTy5jIGIveG1sSU8uYwppbmRleCAzNGQxMGIzLi4zZTIxMmNhIDEwMDY0NAotLS0gYS94bWxJTy5jCisrKyBiL3htbElPLmMKQEAgLTc3MywxMSArNzczLDEzIEBACiAgKgogICogUmVhZCBAbGVuIGJ5dGVzIHRvIEBidWZmZXIgZnJvbSB0aGUgSS9PIGNoYW5uZWwuCiAgKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4KKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIDwgMCBpbiBjYXNlIG9mIGZhaWx1cmUKICAqLwogaW50CiB4bWxGaWxlUmVhZCAodm9pZCAqIGNvbnRleHQsIGNoYXIgKiBidWZmZXIsIGludCBsZW4pIHsKICAgICBpbnQgcmV0OworICAgIGlmICgoY29udGV4dCA9PSBOVUxMKSB8fCAoYnVmZmVyID09IE5VTEwpKSAKKyAgICAgICAgcmV0dXJuKC0xKTsKICAgICByZXQgPSBmcmVhZCgmYnVmZmVyWzBdLCAxLCAgbGVuLCAoRklMRSAqKSBjb250ZXh0KTsKICAgICBpZiAocmV0IDwgMCkgeG1sSU9FcnIoMCwgImZyZWFkKCkiKTsKICAgICByZXR1cm4ocmV0KTsKQEAgLTc5OCw2ICs4MDAsOCBAQAogeG1sRmlsZVdyaXRlICh2b2lkICogY29udGV4dCwgY29uc3QgY2hhciAqIGJ1ZmZlciwgaW50IGxlbikgewogICAgIGludCBpdGVtczsKIAorICAgIGlmICgoY29udGV4dCA9PSBOVUxMKSB8fCAoYnVmZmVyID09IE5VTEwpKSAKKyAgICAgICAgcmV0dXJuKC0xKTsKICAgICBpdGVtcyA9IGZ3cml0ZSgmYnVmZmVyWzBdLCBsZW4sIDEsIChGSUxFICopIGNvbnRleHQpOwogICAgIGlmICgoaXRlbXMgPT0gMCkgJiYgKGZlcnJvcigoRklMRSAqKSBjb250ZXh0KSkpIHsKICAgICAgICAgeG1sSU9FcnIoMCwgImZ3cml0ZSgpIik7CmRpZmYgLS1naXQgYS94bWxyZWFkZXIuYyBiL3htbHJlYWRlci5jCmluZGV4IGY5OThiYTIuLjhlNzY1YzMgMTAwNjQ0Ci0tLSBhL3htbHJlYWRlci5jCisrKyBiL3htbHJlYWRlci5jCkBAIC0zNzI0LDYgKzM3MjQsOCBAQAogICovCiBpbnQKIHhtbFRleHRSZWFkZXJSZWxheE5HU2V0U2NoZW1hKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyLCB4bWxSZWxheE5HUHRyIHNjaGVtYSkgeworICAgIGlmIChyZWFkZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuKC0xKTsKICAgICBpZiAoc2NoZW1hID09IE5VTEwpIHsKICAgICAgICAgaWYgKHJlYWRlci0+cm5nU2NoZW1hcyAhPSBOVUxMKSB7CiAJICAgIHhtbFJlbGF4TkdGcmVlKHJlYWRlci0+cm5nU2NoZW1hcyk7CkBAIC0zOTYzLDYgKzM5NjUsOCBAQAogICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4ID0gKHhtbFBhcnNlckN0eHRQdHIpbG9jYXRvcjsKICAgICBpbnQgcmV0ID0gLTE7CiAKKyAgICBpZiAobG9jYXRvciA9PSBOVUxMKQorICAgICAgICByZXR1cm4oLTEpOwogICAgIGlmIChjdHgtPm5vZGUgIT0gTlVMTCkgewogCXJldCA9IHhtbEdldExpbmVObyhjdHgtPm5vZGUpOwogICAgIH0KQEAgLTM5OTcsNiArNDAwMSw4IEBACiAgICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHggPSAoeG1sUGFyc2VyQ3R4dFB0cilsb2NhdG9yOwogICAgIHhtbENoYXIgKnJldCA9IE5VTEw7CiAKKyAgICBpZiAobG9jYXRvciA9PSBOVUxMKQorICAgICAgICByZXR1cm4oTlVMTCk7CiAgICAgaWYgKGN0eC0+bm9kZSAhPSBOVUxMKSB7CiAJcmV0ID0geG1sTm9kZUdldEJhc2UoTlVMTCxjdHgtPm5vZGUpOwogICAgIH0KZGlmZiAtLWdpdCBhL3htbHNhdmUuYyBiL3htbHNhdmUuYwppbmRleCBmZDAyNzM1Li43MmFkNjk5IDEwMDY0NAotLS0gYS94bWxzYXZlLmMKKysrIGIveG1sc2F2ZS5jCkBAIC0xNDM2LDYgKzE0MzYsNyBAQAogewogICAgIGxvbmcgcmV0ID0gMDsKIAorICAgIGlmICgoY3R4dCA9PSBOVUxMKSB8fCAoZG9jID09IE5VTEwpKSByZXR1cm4oLTEpOwogICAgIHhtbERvY0NvbnRlbnREdW1wT3V0cHV0KGN0eHQsIGRvYyk7CiAgICAgcmV0dXJuKHJldCk7CiB9CkBAIC0xNDU2LDYgKzE0NTcsNyBAQAogewogICAgIGxvbmcgcmV0ID0gMDsKIAorICAgIGlmICgoY3R4dCA9PSBOVUxMKSB8fCAobm9kZSA9PSBOVUxMKSkgcmV0dXJuKC0xKTsKICAgICB4bWxOb2RlRHVtcE91dHB1dEludGVybmFsKGN0eHQsIG5vZGUpOwogICAgIHJldHVybihyZXQpOwogfQpkaWZmIC0tZ2l0IGEveG1sc2NoZW1hcy5jIGIveG1sc2NoZW1hcy5jCmluZGV4IDg3ZmJjYTMuLmQ3ZmE1MTUgMTAwNjQ0Ci0tLSBhL3htbHNjaGVtYXMuYworKysgYi94bWxzY2hlbWFzLmMKQEAgLTI0MzQsNiArMjQzNCw4IEBACiB2b2lkCiB4bWxTY2hlbWFEdW1wKEZJTEUgKiBvdXRwdXQsIHhtbFNjaGVtYVB0ciBzY2hlbWEpCiB7CisgICAgaWYgKG91dHB1dCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAgICAgaWYgKHNjaGVtYSA9PSBOVUxMKSB7CiAgICAgICAgIGZwcmludGYob3V0cHV0LCAiU2NoZW1hczogTlVMTFxuIik7CiAgICAgICAgIHJldHVybjsKQEAgLTEyNTc0LDYgKzEyNTc2LDggQEAKICAgICB4bWxTY2hlbWFUeXBlUHRyIG5vbk5lZ2F0aXZlSW50ZWdlclR5cGUgPSBOVUxMOwogICAgIGludCByZXQgPSAwLCByZXVzZVZhbEN0eHQgPSAwOwogCisgICAgaWYgKChmYWNldCA9PSBOVUxMKSB8fCAodHlwZURlY2wgPT0gTlVMTCkpCisgICAgICAgIHJldHVybigtMSk7CiAgICAgLyogCiAgICAgKiBUT0RPOiB3aWxsIHRoZSBwYXJzZXIgY29udGV4dCBiZSBnaXZlbiBpZiB1c2VkIGZyb20KICAgICAqIHRoZSByZWxheE5HIG1vZHVsZT8KZGlmZiAtLWdpdCBhL3htbHNjaGVtYXN0eXBlcy5jIGIveG1sc2NoZW1hc3R5cGVzLmMKaW5kZXggOTM0NmFjNi4uNmRkOGNiYiAxMDA2NDQKLS0tIGEveG1sc2NoZW1hc3R5cGVzLmMKKysrIGIveG1sc2NoZW1hc3R5cGVzLmMKQEAgLTQ3MCw2ICs0NzAsOCBAQAogaW50CiB4bWxTY2hlbWFJc0J1aWx0SW5UeXBlRmFjZXQoeG1sU2NoZW1hVHlwZVB0ciB0eXBlLCBpbnQgZmFjZXRUeXBlKQogeworICAgIGlmICh0eXBlID09IE5VTEwpCisJcmV0dXJuICgtMSk7CiAgICAgaWYgKHR5cGUtPnR5cGUgIT0gWE1MX1NDSEVNQV9UWVBFX0JBU0lDKQogCXJldHVybiAoLTEpOwogICAgIHN3aXRjaCAodHlwZS0+YnVpbHRJblR5cGUpIHsKQEAgLTM3ODksNiArMzc5MSw4IEBACiAJCQkJICAgICB1bnNpZ25lZCBsb25nIGFjdHVhbExlbiwKIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKmV4cGVjdGVkTGVuKQogeworICAgIGlmIChmYWNldCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oLTEpOwogICAgIC8qCiAgICAgKiBUT0RPOiBDaGVjayBpZiB0aGlzIHdpbGwgd29yayB3aXRoIGxhcmdlIG51bWJlcnMuCiAgICAgKiAoY29tcGFyZSB2YWx1ZS5kZWNpbWFsLm1pIGFuZCB2YWx1ZS5kZWNpbWFsLmhpIGFzIHdlbGw/KS4KQEAgLTM4NDQsNiArMzg0OCw4IEBACiB7CiAgICAgdW5zaWduZWQgaW50IGxlbiA9IDA7CiAKKyAgICBpZiAoKGxlbmd0aCA9PSBOVUxMKSB8fCAoZmFjZXQgPT0gTlVMTCkgfHwgKHR5cGUgPT0gTlVMTCkpCisgICAgICAgIHJldHVybiAoLTEpOwogICAgICpsZW5ndGggPSAwOwogICAgIGlmICgoZmFjZXQtPnR5cGUgIT0gWE1MX1NDSEVNQV9GQUNFVF9MRU5HVEgpICYmCiAJKGZhY2V0LT50eXBlICE9IFhNTF9TQ0hFTUFfRkFDRVRfTUFYTEVOR1RIKSAmJgpAQCAtMzkxOCw2ICszOTI0LDggQEAKIHsKICAgICBpbnQgcmV0OwogCisgICAgaWYgKChmYWNldCA9PSBOVUxMKSB8fCAodmFsdWUgPT0gTlVMTCkpCisgICAgICAgIHJldHVybigtMSk7CiAgICAgc3dpdGNoIChmYWNldC0+dHlwZSkgewogCWNhc2UgWE1MX1NDSEVNQV9GQUNFVF9QQVRURVJOOgogCSAgICByZXQgPSB4bWxSZWdleHBFeGVjKGZhY2V0LT5yZWdleHAsIHZhbHVlKTsKZGlmZiAtLWdpdCBhL3htbHN0cmluZy5jIGIveG1sc3RyaW5nLmMKaW5kZXggNzhhY2JmZi4uYTRkYzQ0YyAxMDA2NDQKLS0tIGEveG1sc3RyaW5nLmMKKysrIGIveG1sc3RyaW5nLmMKQEAgLTc0NSw3ICs3NDUsOCBAQAogICAgIHJldHVybihjKTsKIAogZXJyb3I6Ci0gICAgKmxlbiA9IDA7CisgICAgaWYgKGxlbiAhPSBOVUxMKQorCSpsZW4gPSAwOwogICAgIHJldHVybigtMSk7CiB9CiAKQEAgLTc2OCw2ICs3NjksOCBAQAogICAgIGludCBpeDsKICAgICB1bnNpZ25lZCBjaGFyIGM7CiAKKyAgICBpZiAodXRmID09IE5VTEwpCisgICAgICAgIHJldHVybigwKTsKICAgICAvKgogICAgICAqIHV0ZiBpcyBhIHN0cmluZyBvZiAxLCAyLCAzIG9yIDQgYnl0ZXMuICBUaGUgdmFsaWQgc3RyaW5ncwogICAgICAqIGFyZSBhcyBmb2xsb3dzIChpbiAiYml0IGZvcm1hdCIpOgpkaWZmIC0tZ2l0IGEveHBhdGguYyBiL3hwYXRoLmMKaW5kZXggMjhkMDc1NS4uMmE3YmIzMiAxMDA2NDQKLS0tIGEveHBhdGguYworKysgYi94cGF0aC5jCkBAIC0zOTMyLDE2ICszOTMyLDE5IEBACiAgICAgICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAkJCQlcCiAJCSIlczolZCBJbnRlcm5hbCBlcnJvcjogbm8gY29udGV4dFxuIiwJCQlcCiAJICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18pOwkJCQkJXAorCXJldHVybihOVUxMKTsJCQkJCQkJXAogICAgIH0JCQkJCQkJCQlcCiAgICAgZWxzZSBpZiAoY3R4dC0+ZG9jID09IE5VTEwpIHsgCQkJCQlcCiAgICAgICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAkJCQlcCiAJCSIlczolZCBJbnRlcm5hbCBlcnJvcjogbm8gZG9jdW1lbnRcbiIsCQkJXAogCSAgICAgICAgX19GSUxFX18sIF9fTElORV9fKTsJCQkJCVwKKwlyZXR1cm4oTlVMTCk7CQkJCQkJCVwKICAgICB9CQkJCQkJCQkJXAogICAgIGVsc2UgaWYgKGN0eHQtPmRvYy0+Y2hpbGRyZW4gPT0gTlVMTCkgeyAJCQkJXAogICAgICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwJCQkJXAogCSAgICAgICAgIiVzOiVkIEludGVybmFsIGVycm9yOiBkb2N1bWVudCB3aXRob3V0IHJvb3RcbiIsCVwKIAkgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXyk7CQkJCQlcCisJcmV0dXJuKE5VTEwpOwkJCQkJCQlcCiAgICAgfQkJCQkJCQkJCVwKIAogCkBAIC0xMDkxNSw3ICsxMDkxOCw3IEBACiAgKi8KIGludAogeG1sWFBhdGhFdmFsUHJlZGljYXRlKHhtbFhQYXRoQ29udGV4dFB0ciBjdHh0LCB4bWxYUGF0aE9iamVjdFB0ciByZXMpIHsKLSAgICBpZiAocmVzID09IE5VTEwpIHJldHVybigwKTsKKyAgICBpZiAoKGN0eHQgPT0gTlVMTCkgfHwgKHJlcyA9PSBOVUxMKSkgcmV0dXJuKDApOwogICAgIHN3aXRjaCAocmVzLT50eXBlKSB7CiAgICAgICAgIGNhc2UgWFBBVEhfQk9PTEVBTjoKIAkgICAgcmV0dXJuKHJlcy0+Ym9vbHZhbCk7CkBAIC0xMDk1NCw3ICsxMDk1Nyw3IEBACiBpbnQKIHhtbFhQYXRoRXZhbHVhdGVQcmVkaWNhdGVSZXN1bHQoeG1sWFBhdGhQYXJzZXJDb250ZXh0UHRyIGN0eHQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxYUGF0aE9iamVjdFB0ciByZXMpIHsKLSAgICBpZiAocmVzID09IE5VTEwpIHJldHVybigwKTsKKyAgICBpZiAoKGN0eHQgPT0gTlVMTCkgfHwgKHJlcyA9PSBOVUxMKSkgcmV0dXJuKDApOwogICAgIHN3aXRjaCAocmVzLT50eXBlKSB7CiAgICAgICAgIGNhc2UgWFBBVEhfQk9PTEVBTjoKIAkgICAgcmV0dXJuKHJlcy0+Ym9vbHZhbCk7CmRpZmYgLS1naXQgYS94cG9pbnRlci5jIGIveHBvaW50ZXIuYwppbmRleCBmYjI3ODVkLi5hZGQ1OTBiIDEwMDY0NAotLS0gYS94cG9pbnRlci5jCisrKyBiL3hwb2ludGVyLmMKQEAgLTY0Miw3ICs2NDIsNyBAQAogeG1sWFB0ckxvY2F0aW9uU2V0QWRkKHhtbExvY2F0aW9uU2V0UHRyIGN1ciwgeG1sWFBhdGhPYmplY3RQdHIgdmFsKSB7CiAgICAgaW50IGk7CiAKLSAgICBpZiAodmFsID09IE5VTEwpIHJldHVybjsKKyAgICBpZiAoKGN1ciA9PSBOVUxMKSB8fCAodmFsID09IE5VTEwpKSByZXR1cm47CiAKICAgICAvKgogICAgICAqIGNoZWNrIGFnYWluc3QgZG91YmxvbnMKQEAgLTIyMjcsNiArMjIyNyw3IEBACiAgICAgeG1sTm9kZVNldFB0ciBvbGRzZXQ7CiAgICAgaW50IGk7CiAKKyAgICBpZiAoY3R4dCA9PSBOVUxMKSByZXR1cm47CiAgICAgQ0hFQ0tfQVJJVFkoMSk7CiAgICAgLyoKICAgICAgKiBTYXZlIHRoZSBleHByZXNzaW9uIHBvaW50ZXIgc2luY2Ugd2Ugd2lsbCBoYXZlIHRvIGV2YWx1YXRlCkBAIC0yOTA0LDYgKzI5MDUsOCBAQAogICAgIHhtbExvY2F0aW9uU2V0UHRyIG9sZHNldDsKICAgICBpbnQgaTsKIAorICAgIGlmIChjdHh0ID09IE5VTEwpIHJldHVybjsKKwogICAgIFNLSVBfQkxBTktTOwogICAgIGlmIChDVVIgIT0gJ1snKSB7CiAJWFBfRVJST1IoWFBBVEhfSU5WQUxJRF9QUkVESUNBVEVfRVJST1IpOwo=