ZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9tYWluLmMgYi9zdXB3aXNkb20vbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZmRjOTcKLS0tIC9kZXYvbnVsbAorKysgYi9zdXB3aXNkb20vbWFpbi5jCkBAIC0wLDAgKzEsNTMgQEAKKy8v0MK/qsbVy66/2LPM0PIKKyNpbmNsdWRlICJzdGRpby5oIgorI2luY2x1ZGUgInN0ZGxpYi5oIgorI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgInNwX2NvbmZpZy5oIgorI2luY2x1ZGUgInNwX2Rpc3BsYXkuaCIKKyNpbmNsdWRlICJzcF9kYXRhLmgiCisjaW5jbHVkZSAic3BfdXRpbC5oIgorI2luY2x1ZGUgInNwX2NvbnN1bWUuaCIKKyNpbmNsdWRlICJzcF9jb21tdW5pY2F0ZS5oIgorCitzdGF0aWMgc3BfcG9zX3QgUE9TOworCitpbnQgbWFpbih2b2lkKQoreworICB1aW50MzIgdGljayA9IDA7CisgIHVpbnQzMiBsYXN0dGljayA9IDA7CisgIHNwX2NhcmR3b3Jrc3RhdGVfdCBjYXJkV29ya1N0YXRlOworICBNRU1DTEVBUigmUE9TLCBzaXplb2YoUE9TKSk7CisgIE1FTUNMRUFSKCZjYXJkV29ya1N0YXRlLCBzaXplb2YoY2FyZFdvcmtTdGF0ZSkpOworICBzcF9pbml0KCk7CisgIHNwX2tleV9pbml0KCk7CisgIERlbGF5X21zKERFTEFZX1RJTUUxcyk7CisgIHNwX2xvYWRfY29uZmlnKCZQT1MpOworCisgIHNob3dfaG9tZSgmUE9TKTsKKworICB3aGlsZSgxKQorICB7CisgICAgdGljayA9IHNwX2dldF90aWNrZXIoKTsKKyAgICBzcF9mZWVkX2RvZygpOworICAgIHNwX3ZhbHZlX2NvbnRyb2woKTsKKyAgICBzcF9jb25maXJtX3BheW1vZGUoJlBPUywgJmNhcmRXb3JrU3RhdGUpOworICAgIHNwX2NvbW11bmljYXRlKCZQT1MpOworICAgIGlmKFBPUy5wYXltb2RlID09IFBBWU1PREVfUVJDT0RFKQorICAgIHsKKyAgICAgIGlmKHRpY2sgLSBsYXN0dGljayA+PSBERUxBWV9USU1FMTAwbXMpCisgICAgICB7CisgICAgICAgIGxhc3R0aWNrID0gdGljazsKKyAgICAgICAgc3BfcXJjb2RlX2hhbmRsZSgmUE9TLCAmY2FyZFdvcmtTdGF0ZSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZih0aWNrIC0gbGFzdHRpY2sgPj0gREVMQVlfVElNRTEwMG1zKQorICAgICAgeworICAgICAgICBsYXN0dGljayA9IHRpY2s7CisgICAgICAgIHNwX3Rlc3RfY2FyZF9zdGF0ZSgmUE9TLCAmY2FyZFdvcmtTdGF0ZSwgdGljayk7CisgICAgICAgIHNwX2NhcmRfaGFuZGxlKCZQT1MsICZjYXJkV29ya1N0YXRlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9jYXJkLmMgYi9zdXB3aXNkb20vc3BfY2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNjc5NmEKLS0tIC9kZXYvbnVsbAorKysgYi9zdXB3aXNkb20vc3BfY2FyZC5jCkBAIC0wLDAgKzEsOTggQEAKKyNpbmNsdWRlICIuLi9uZWNfYXBkdS5oIgorI2luY2x1ZGUgInNwX2Rlcy5oIgorI2luY2x1ZGUgInNwX2NvbnN0YW50LmgiCisjaW5jbHVkZSAic3BfdXRpbC5oIgorI2luY2x1ZGUgInNwX2NhcmQuaCIKKworc3RhdGljIHVpbnQ4KiBwcmN2X2J1ZmYgPSBOVUxMOworc3RhdGljIHVpbnQ4IHJjdl9sZW4gPSAwOworCit1aW50MTYgc3Bfc2VsZWN0X3NmaSh1aW50OCBzZmlbMl0pCit7CisgIHVpbnQxNiByZXQ7CisgIHVpbnQ4ICBjbWRfYnVmZlsxMF07CisKKyAgY21kX2J1ZmZbMF0gPSAweDAwOyAvL0NMQQorICBjbWRfYnVmZlsxXSA9IDB4QTQ7IC8vSU5TCisgIGNtZF9idWZmWzJdID0gMHgwMDsgLy9QMQorICBjbWRfYnVmZlszXSA9IDB4MDA7IC8vUDIKKyAgY21kX2J1ZmZbNF0gPSAweDAyOyAvL0xjCisgIG1lbWNweShjbWRfYnVmZiArIDUsIHNmaSwgMik7CisKKyAgcmV0ID0gY2FyZF9jcHVfZXhjaGFuZ2UoY21kX2J1ZmYsIDIgKyA1LCAwLCAmcHJjdl9idWZmLCAmcmN2X2xlbik7CisgIGlmKHJldCAhPSBSRVRDT0RFX09LKQorICB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXR1cm4gMDsKK30KKwordWludDE2IHNwX3NlbGVjdF9hZGYodm9pZCkKK3sKKyAgdWludDE2IHJldDsKKyAgdWludDggIGNtZF9idWZmW10gPSB7Ilx4MDBceEE0XHgwNFx4MDBceDBGXHhEMVx4NTZceDAwXHgwMFx4MDFceEJEXHhGMFx4Q0FceENCXHhCNFx4RUZceEQ2XHhBN1x4QjhceEI2In07CisgIHJldCA9IGNhcmRfY3B1X2V4Y2hhbmdlKGNtZF9idWZmLCBzaXplb2YoY21kX2J1ZmYpIC0gMSwgMCwgJnByY3ZfYnVmZiwgJnJjdl9sZW4pOworICBpZihyZXQgIT0gUkVUQ09ERV9PSykKKyAgeworICAgIHJldHVybiByZXQ7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3VpbnQ4IHNwX2NhcmRfcmVxdWVzdChzcF9jYXJkX3QqIGNhcmRwY2QpCit7CisKKyAgdWludDggc2FrOworICB1aW50OCBzbnJbOF07CisKKyAgaWYoIWNhcmRfcmVxdWVzdCgmc2FrLCBzbnIpKQorICB7CisgICAgaWYoKHNhayAmIDB4MjApKQorICAgIHsKKyAgICAgIGlmKCFjYXJkX2NwdV9tb2RlKCkpCisgICAgICB7CisgICAgICAgIERlbGF5X21zKDIwMCk7CisJCWlmKHNwX3NlbGVjdF9zZmkoIlx4M2ZceDAwIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHNwX3NlbGVjdF9hZGYoKTsKKyAgICAgICAgICBjYXJkcGNkLT5jYXJkcGh5aWRbMF0gPSBzbnJbM107CisgICAgICAgICAgY2FyZHBjZC0+Y2FyZHBoeWlkWzFdID0gc25yWzJdOworICAgICAgICAgIGNhcmRwY2QtPmNhcmRwaHlpZFsyXSA9IHNuclsxXTsKKyAgICAgICAgICBjYXJkcGNkLT5jYXJkcGh5aWRbM10gPSBzbnJbMF07CisgICAgICAgICAgY2FyZHBjZC0+Y2FyZHR5cGUgPSBUQUdfVFlQRV9DUFU7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGNhcmRwY2QtPmNhcmR0eXBlID0gVEFHX1RZUEVfVU5LT05XTjsKKwkgIHJldHVybiAxOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworaW50OCBzcF9jaGVja19jcHVfZXhpc3Qodm9pZCkKK3sKKyAgcmV0dXJuIGNhcmRfY3B1X2V4aXN0KCk7Cit9CisKK3N0YXRpYyB1aW50MTYgc3BfY3B1X3JlYWQoc3BfY2FyZF90KiBjYXJkKQoreworICB1aW50MTYgcmV0ID0gMDsKKyAgTUVNQ0xFQVIoY2FyZC0+Y2l0aXplbl9jYXJkbm8sIHNpemVvZihjYXJkLT5jaXRpemVuX2NhcmRubykpOworICBNRU1DUFkoY2FyZC0+ZXhwaXJlZGF0ZSwgIlx4MjBceDIyXHgwOFx4MDIiLCA0KTsKKyAgcmV0dXJuIHJldDsKK30KKwordWludDE2IHNwX2NhcmRfcmVhZChzcF9jYXJkX3QqIGNhcmQpCit7CisgIHN3aXRjaChjYXJkLT5jYXJkdHlwZSkKKyAgeworICBjYXNlIFRBR19UWVBFX0NQVToKKyAgICByZXR1cm4gc3BfY3B1X3JlYWQoY2FyZCk7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIDE7CisgIH0KK30KZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9jYXJkLmggYi9zdXB3aXNkb20vc3BfY2FyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ODFjZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zdXB3aXNkb20vc3BfY2FyZC5oCkBAIC0wLDAgKzEsMjYgQEAKKyNpZm5kZWYgX1NQX0NBUkRfSF8KKyNkZWZpbmUgX1NQX0NBUkRfSF8KKworI2luY2x1ZGUgInNwX2NvbmZpZy5oIgorCisjZGVmaW5lIFNQX0ZJTEUwOSAweDAxCisjZGVmaW5lIFNQX0ZJTEUxMCAweDAyCisjZGVmaW5lIFNQX0ZJTEUxMiAweDA0CisjZGVmaW5lIFNQX0ZJTEUxNSAweDA4CisKKyNkZWZpbmUgV0FURVJfUkVDT1JEX05PIDQKKyNkZWZpbmUgUkVUQ09ERV9PSyAgMHg5MDAwCisjZGVmaW5lIFJFVENPREVfSU5TVUZGSUNJRU5UICAweDk0MDEgICAgLy/T4LbusrvX4worI2RlZmluZSBSQ19DUFVfRklMRU5PVEZPVU5EIDB4NkE4MgorI2RlZmluZSBSQ19DUFVfTk9fRVhUQVVUSCAgIDB4Njk4MgorI2RlZmluZSBSQ19DUFVfRklMRV9OT1RfRVhJU1QgMHg2QTgzCisjZGVmaW5lIFJDX0NQVV9OT01BQyAgICAgICAgMHg5NDA2CisKKyNkZWZpbmUgQ0FSRF9TVEFUVVNfT0sgMAorCit1aW50OCBzcF9jYXJkX3JlcXVlc3Qoc3BfY2FyZF90KiBjYXJkcGNkKTsKK2ludDggc3BfY2hlY2tfY3B1X2V4aXN0KHZvaWQpOworaW50OCBzcF9jYXJkX3JmX3Jlc2V0KHZvaWQpOwordWludDE2IHNwX2NhcmRfcmVhZChzcF9jYXJkX3QqIGNhcmQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9jb21tdW5pY2F0ZS5jIGIvc3Vwd2lzZG9tL3NwX2NvbW11bmljYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzYWM2OQotLS0gL2Rldi9udWxsCisrKyBiL3N1cHdpc2RvbS9zcF9jb21tdW5pY2F0ZS5jCkBAIC0wLDAgKzEsNTkwIEBACisjaW5jbHVkZSAic3BfY29tbXVuaWNhdGUuaCIKKyNpbmNsdWRlICJzcF91dGlsLmgiCisjaW5jbHVkZSAic3BfZmxhc2guaCIKKyNpbmNsdWRlICJzcF9jb25zdGFudC5oIgorI2luY2x1ZGUgInNwX2RhdGEuaCIKKyNpbmNsdWRlICJzcF9tc2dwYWNrLmgiCisjaW5jbHVkZSAic3BfZGlzcGxheS5oIgorI2luY2x1ZGUgIi4uL3N5c19ody9kcnZfdXNhcnQuaCIKKworc3RhdGljIHZvaWQgc3BfdXNhcnRfc2VuZChzcF9wb3NfdCogcG9zLCBzcF9wcm90b2NvbF9yZXF1ZXN0X3QqIHJlcSkKK3sKKyAgdWludDggc2VuZEJ1ZmZbMjY0XTsKKyAgTUVNQ0xFQVIoc2VuZEJ1ZmYsIHNpemVvZihzZW5kQnVmZikpOworCisgIHBvcy0+bGFzdF9jb21tX3N0YXR1cy5jb21tYW5kID0gcmVxLT5leGNtZDsKKyAgcG9zLT5sYXN0X2NvbW1fc3RhdHVzLnNlbmR0aW1lID0gc3BfZ2V0X3RpY2tlcigpOworCisgIHNwX3Byb3RvY29sX2NyYygodWludDgqKXJlcSArMiwgcmVxLT5kYXRhbGVuLCAodWludDgqKXJlcSArMiArcmVxLT5kYXRhbGVuKTsKKyAgcmVxLT5kYXRhbGVuICs9IDI7CisgIE1FTUNQWShzZW5kQnVmZiwgcmVxLCByZXEtPmRhdGFsZW4rMik7CisgIHVzYXJ0X3NlbmQoc2VuZEJ1ZmYsIHJlcS0+ZGF0YWxlbisyKTsKK30KKworc3RhdGljIHVpbnQ4IHNwX3VzYXJ0X3JlY3Yoc3BfcG9zX3QqIHBvcywgc3BfcHJvdG9jb2xfcmVzcG9uc2VfdCogcmVzcCwgaW50MzIgdGltZW91dF9tcykKK3sKKyAgdWludDMyIHRpY2sgPSAwOworICB0aWNrID0gc3BfZ2V0X3RpY2tlcigpOworICB3aGlsZSgxKQorICB7CisgICAgTUVNQ0xFQVIocmVzcCwgc2l6ZW9mKHNwX3Byb3RvY29sX3Jlc3BvbnNlX3QpKTsKKyAgICB1c2FydF9yZWFkKCh1OCopcmVzcCwgc2l6ZW9mKHNwX3Byb3RvY29sX3Jlc3BvbnNlX3QpKTsKKyAgICBpZihwb3MtPmxhc3RfY29tbV9zdGF0dXMuY29tbWFuZCA9PSByZXNwLT5leGNtZCkKKyAgICB7CisgICAgICBNRU1DTEVBUigmKHBvcy0+bGFzdF9jb21tX3N0YXR1cyksIHNpemVvZihzcF9jb21tX3N0YXR1c190KSk7CisgICAgICByZXR1cm4gcmVzcC0+cmV0Y29kZTsKKyAgICB9CisgICAgaWYoKHNwX2dldF90aWNrZXIoKSAtIHRpY2spID49IHRpbWVvdXRfbXMpCisgICAgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9Cit9Cit1aW50OCBzcF9jb21tX2NhbGwoc3BfcG9zX3QqIHBvcywgc3BfcHJvdG9jb2xfcmVxdWVzdF90KiByZXEsCisgICAgICAgICAgICAgICAgICAgc3BfcHJvdG9jb2xfcmVzcG9uc2VfdCogcmVzcCwgaW50MzIgdGltZW91dF9tcykKK3sKKyAgc3BfdXNhcnRfc2VuZChwb3MsIHJlcSk7CisgIHJldHVybiBzcF91c2FydF9yZWN2KHBvcywgcmVzcCwgdGltZW91dF9tcyk7Cit9CisKK3ZvaWQgc3BfcHJvdG9jb2xfcmVxX2luaXQoc3BfcHJvdG9jb2xfcmVxdWVzdF90KiByZXEsIHVpbnQ4IGNvbW1hbmQpCit7CisgIE1FTUNMRUFSKHJlcSxzaXplb2Yoc3BfcHJvdG9jb2xfcmVxdWVzdF90KSk7CisgIHJlcS0+Y29tbWFuZCA9IFBST1RPQ09MX0NPTU1BTkRfVjI7CisgIHJlcS0+ZXhjbWQgPSBjb21tYW5kOworICByZXEtPmZsYWcgPSBQUk9UT0NPTF9GTEFHX1BBQ0socmVxLT5mbGFnKTsKKyAgcmVxLT5mbGFnID0gUFJPVE9DT0xfV0lUSE9VVF9NQUMocmVxLT5mbGFnKTsKKyAgcmVxLT5kYXRhbGVuID0gMzsKK30KKworc3RhdGljIHVpbnQxNiBzcF9jb25maXJtX2NhcmRfYXV0aGVudGljYXRpb24oc3BfcG9zX3QqIHBvcywgc3BfY2FyZF90KiBjYXJkKQoreworICB1aW50OCBzaXplOworICB1aW50MTYgcmV0OworICBpbnQzMiB0aW1lb3V0X21zID0gQ09NTV9XQUlUX1RJTUU7CisgIGN3X3VucGFja19jb250ZXh0IHVucGFjazsKKyAgdW5wYWNrX2ZpZWxkX3QgZmllbGQ7CisgIHNwX3Byb3RvY29sX3Jlc3BvbnNlX3QgcmVzcDsKKworICBkaXNwX2hpbnRfaW5mbyhwb3MsItX91NrJ7bfdyM/WpNbQIixERUxBWV9USU1FMnMpOworICByZXQgPSBzcF91c2FydF9yZWN2KHBvcywgJnJlc3AsIHRpbWVvdXRfbXMpOworICBpZihyZXQpCisgIHsKKyAgICByZXQgPSBSQ19DQVJEX0FVVEhFTlRJQ0FUSU9OOworICAgIHJldHVybiByZXQ7CisgIH0KKworICBzcF91bnBhY2tfaW5pdCgmdW5wYWNrLHJlc3AuZGF0YSxyZXNwLmRhdGFsZW4pOworICBzaXplID0gc3BfdW5wYWNrX21hcF9zaXplKCZ1bnBhY2spOworICB3aGlsZShzaXplLS0gPiAwKQorICB7CisgICAgc3BfdW5wYWNrX3ZhbHVlKCZ1bnBhY2ssJmZpZWxkKTsKKyAgICBpZihJU19LRVkoUEtfSU5UX1dBVEVSTElNSVQsZmllbGQua2V5KSkKKyAgICB7CisgICAgICBjYXJkLT53YXRlcmxpbWl0ID0gZmllbGQudmFsLmludHZhbDsKKyAgICB9CisgICAgZWxzZSBpZihJU19LRVkoUEtfQklOX0JJTExOTyxmaWVsZC5rZXkpKQorICAgIHsKKyAgICAgIE1FTUNQWShjYXJkLT5iaWxsbm8sIGZpZWxkLnZhbC5iaW52YWwsIGZpZWxkLnN0cmxlbik7CisgICAgfQorICAgIGVsc2UgaWYoSVNfS0VZKFBLX0lOVF9GRUVBTU9VTlQsZmllbGQua2V5KSkKKyAgICB7CisgICAgICBjYXJkLT5mZWVwYXJhLmZlZV9hbXQgPSBmaWVsZC52YWwuaW50dmFsOworICAgIH0KKyAgICBlbHNlIGlmKElTX0tFWShQS19JTlRfRkVFVU5JVCwgZmllbGQua2V5KSkKKyAgICB7CisgICAgICBjYXJkLT5mZWVwYXJhLmZlZV91bml0ID0gZmllbGQudmFsLmludHZhbDsKKyAgICB9CisgICAgZWxzZSBpZihJU19LRVkoUEtfSU5UX0ZFRVNUQVJULCBmaWVsZC5rZXkpKQorICAgIHsKKyAgICAgIGNhcmQtPmZlZXBhcmEuZmVlX3N0YXJ0ID0gZmllbGQudmFsLmludHZhbDsKKyAgICB9CisgIH0KKyAgZGlzcF9oaW50X2luZm8ocG9zLCLJ7bfdyM/WpLPJuaYiLERFTEFZX1RJTUUxcyk7CisgIHJldHVybiAwOworfQorCisvL7rzzKi21L+otcTJ7bfdyM/WpAordWludDE2IHNwX2NhcmRfYXV0aGVudGljYXRpb24oc3BfcG9zX3QqIHBvcywgc3BfY2FyZF90KiBjYXJkKQoreworICB1aW50OCBjdGltZVs2XTsKKyAgc3BfcHJvdG9jb2xfcmVxdWVzdF90IHJlcTsKKyAgY3dfcGFja19jb250ZXh0IHBhY2s7CisgIE1FTUNMRUFSKCZyZXEsIHNpemVvZihyZXEpKTsKKyAgTUVNQ0xFQVIoJnBhY2ssIHNpemVvZihyZXEpKTsKKyAgTUVNQ0xFQVIoY3RpbWUsIHNpemVvZiBjdGltZSk7CisKKyAgc3BfZ2V0X2JjZHRpbWUoY3RpbWUpOworICBzcF9wcm90b2NvbF9yZXFfaW5pdCgmcmVxLCBTUF9DTURfQ0FSRF9BVVRIRU5USUNBVElPTik7CisgIHNwX3BhY2tfaW5pdCgmcGFjaywgcmVxLmRhdGEsIHNpemVvZihyZXEuZGF0YSkpOworICBjd19wYWNrX21hcF9zaXplKCZwYWNrLDQpOworCisgIHNwX3BhY2tfcHV0X2JpbigmcGFjaywgUEtfQklOX0NBUkRQSFlJRCwgY2FyZC0+Y2FyZHBoeWlkLCA0KTsKKyAgc3BfcGFja19wdXRfYmluKCZwYWNrLCBQS19CSU5fQ0lUSVpFTl9DQVJETk8sIGNhcmQtPmNpdGl6ZW5fY2FyZG5vLCAxMik7CisgIHNwX3BhY2tfcHV0X2JpbigmcGFjaywgUEtfQklOX0RFVlBIWUlELCBwb3MtPmRldnBoeWlkLCA0KTsKKyAgc3BfcGFja19wdXRfYmluKCZwYWNrLCBQS19CSU5fREVWVElNRSwgY3RpbWUsIDYpOworCisgIHJlcS5kYXRhbGVuICs9IHNwX3BhY2tfbGVuZ3RoKCZwYWNrKTsKKyAgc3BfdXNhcnRfc2VuZChwb3MsICZyZXEpOworICByZXR1cm4gc3BfY29uZmlybV9jYXJkX2F1dGhlbnRpY2F0aW9uKHBvcywgY2FyZCk7Cit9CisKKy8vyeixuMeptb0KK3VpbnQxNiBzcF9hc3luY19lcXVpcG1lbnRfbG9naW4oc3BfcG9zX3QqIHBvcykKK3sKKyAgc3BfcHJvdG9jb2xfcmVxdWVzdF90IHJlcTsKKyAgY3dfcGFja19jb250ZXh0IHBhY2s7CisgIHVpbnQ4IGN0aW1lWzZdOworICBNRU1DTEVBUihjdGltZSwgc2l6ZW9mKGN0aW1lKSk7CisgIHBvcy0+aGVhcnRiZWF0LmhlYXJ0X3N0YXR1cyA9IEhFQVJUX1NFTkQ7CisKKyAgc3BfZ2V0X2JjZHRpbWUoY3RpbWUpOworICBzcF9wcm90b2NvbF9yZXFfaW5pdCgmcmVxLCBTUF9DTURfTE9HSU4pOworICBzcF9wYWNrX2luaXQoJnBhY2ssIHJlcS5kYXRhLCBzaXplb2YocmVxLmRhdGEpKTsKKyAgY3dfcGFja19tYXBfc2l6ZSgmcGFjaywgNSk7CisKKyAgc3BfcGFja19wdXRfYmluKCZwYWNrLCBQS19CSU5fREVWUEhZSUQsIHBvcy0+ZGV2cGh5aWQsIDQpOworICBzcF9wYWNrX3B1dF9iaW4oJnBhY2ssIFBLX0JJTl9ERVZUSU1FLCBjdGltZSwgNik7CisgIHNwX3BhY2tfcHV0X3N0cigmcGFjaywgUEtfU1RSX0RFVlRZUEUsIERFVl9UWVBFKTsKKyAgc3BfcGFja19wdXRfc3RyKCZwYWNrLCBQS19TVFJfVkVSU0lPTiwgUFJPX1ZFUlNJT04pOworICBzcF9wYWNrX3B1dF9iaW4oJnBhY2ssIFBLX0JJTl9ERVZJQ0VLRVksIChwb3MtPnN5c2NvbmYuZGV2aWNlS2V5KSwgOCk7CisKKyAgcmVxLmRhdGFsZW4gKz0gc3BfcGFja19sZW5ndGgoJnBhY2spOworICBzcF91c2FydF9zZW5kKHBvcywgJnJlcSk7CisgIHJldHVybiAwOworfQorCisvL9DEzPjIt8jPo6y87LLizfjC58rHt/HV/bOjCit1aW50MTYgc3BfYXN5bmNfaGVhcnRiZWF0KHNwX3Bvc190KiBwb3MpCit7CisgIHVpbnQ4IGN0aW1lWzZdOworICB1aW50OCB1bmNvbmZpcm1fdHJhbnNudW0gPSAwOworICBzcF9wcm90b2NvbF9yZXF1ZXN0X3QgcmVxOworICBjd19wYWNrX2NvbnRleHQgcGFjazsKKworICBwb3MtPmhlYXJ0YmVhdC5oZWFydF9zdGF0dXMgPSBIRUFSVF9TRU5EOworICBpZihwb3MtPnVuY29uZmlybV90cmFuc2R0bC50cmFuc2FkZHIgPD0gcG9zLT5sYXN0X3RyYW5zZHRsLnRyYW5zYWRkcikKKyAgeworICAgIHVuY29uZmlybV90cmFuc251bSA9ICgocG9zLT5sYXN0X3RyYW5zZHRsLnRyYW5zYWRkciAtIHBvcy0+dW5jb25maXJtX3RyYW5zZHRsLnRyYW5zYWRkcikgLworICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3BfdHJhbnNkdGxfdCkpICsgMTsKKyAgfQorICBlbHNlCisgIHsKKyAgICB1bmNvbmZpcm1fdHJhbnNudW0gPSAwOworICB9CisgIHNwX3Byb3RvY29sX3JlcV9pbml0KCZyZXEsIFNQX0NNRF9IRUFSVEJFQVQpOworICBzcF9wYWNrX2luaXQoJnBhY2ssIHJlcS5kYXRhLCBzaXplb2YocmVxLmRhdGEpKTsKKyAgY3dfcGFja19tYXBfc2l6ZSgmcGFjaywgNik7CisKKyAgc3BfZ2V0X2JjZHRpbWUoY3RpbWUpOworICBzcF9wYWNrX3B1dF9iaW4oJnBhY2ssIFBLX0JJTl9ERVZQSFlJRCwgcG9zLT5kZXZwaHlpZCwgNCk7CisgIHNwX3BhY2tfcHV0X2JpbigmcGFjaywgUEtfQklOX0RFVlRJTUUsIGN0aW1lLCA2KTsKKyAgc3BfcGFja19wdXRfc3RyKCZwYWNrLCBQS19TVFJfREVWVFlQRSwgREVWX1RZUEUpOworICBzcF9wYWNrX3B1dF9zdHIoJnBhY2ssIFBLX1NUUl9WRVJTSU9OLCBQUk9fVkVSU0lPTik7CisgIHNwX3BhY2tfcHV0X2ludCgmcGFjaywgUEtfSU5UX1VOVFJBTlNDT05TVCwgdW5jb25maXJtX3RyYW5zbnVtKTsKKyAgc3BfcGFja19wdXRfaW50KCZwYWNrLCBQS19JTlRfV09SS01PREUsIHBvcy0+c3lzY29uZi53b3JrX21vZGUpOworCisgIHJlcS5kYXRhbGVuICs9IHNwX3BhY2tfbGVuZ3RoKCZwYWNrKTsKKyAgc3BfdXNhcnRfc2VuZChwb3MsICZyZXEpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQxNiBzcF9jb25maXJtX3FyY29kZV9pbml0KHNwX3Bvc190KiBwb3MsIHNwX2NhcmRfdCogY2FyZCkKK3sKKyAgdWludDggc2l6ZTsKKyAgdWludDE2IHJldDsKKyAgaW50MzIgdGltZW91dF9tcyA9IENPTU1fV0FJVF9USU1FOworICBjd191bnBhY2tfY29udGV4dCB1bnBhY2s7CisgIHVucGFja19maWVsZF90IGZpZWxkOworICBzcF9wcm90b2NvbF9yZXNwb25zZV90IHJlc3A7CisKKyAgcmV0ID0gc3BfdXNhcnRfcmVjdihwb3MsICZyZXNwLCB0aW1lb3V0X21zKTsKKyAgaWYocmV0KQorICB7CisgICAgcmV0ID0gUkNfUVJDT0RFX0ZBSUxVUkU7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHNwX3VucGFja19pbml0KCZ1bnBhY2sscmVzcC5kYXRhLHJlc3AuZGF0YWxlbik7CisgIHNpemUgPSBzcF91bnBhY2tfbWFwX3NpemUoJnVucGFjayk7CisgIHdoaWxlKHNpemUtLSA+IDApCisgIHsKKyAgICBzcF91bnBhY2tfdmFsdWUoJnVucGFjaywmZmllbGQpOworICAgIGlmKElTX0tFWShQS19TVFJfU0hPUlRfVVJMLCBmaWVsZC5rZXkpKQorICAgIHsKKyAgICAgIE1FTUNQWShjYXJkLT5xcmNvZGUucXJjb2RlX3VybCwgZmllbGQudmFsLnN0cnZhbCwgZmllbGQuc3RybGVuKTsKKyAgICB9CisgICAgZWxzZSBpZihJU19LRVkoUEtfQklOX0JJTExOTywgZmllbGQua2V5KSkKKyAgICB7CisgICAgICBNRU1DUFkoY2FyZC0+YmlsbG5vLCBmaWVsZC52YWwuYmludmFsLCBmaWVsZC5zdHJsZW4pOworICAgIH0KKyAgICBlbHNlIGlmKElTX0tFWShQS19JTlRfVkFJTERUSU1FLCBmaWVsZC5rZXkpKQorICAgIHsKKyAgICAgIGNhcmQtPnFyY29kZS52YWxpZHRpbWUgPSBmaWVsZC52YWwuaW50dmFsOworICAgIH0KKyAgfQorICBjYXJkLT5xcmNvZGUuc3RhcnR0aW1lID0gc3BfZ2V0X3RpY2tlcigpOworICByZXR1cm4gMDsKK30KKworLy+2/s6swuu78cihCit1aW50MTYgc3BfcXJjb2RlX2luaXQoc3BfcG9zX3QqIHBvcywgc3BfY2FyZF90KiBjYXJkKQoreworICB1aW50OCBjdGltZVs2XTsKKyAgc3BfcHJvdG9jb2xfcmVxdWVzdF90IHJlcTsKKyAgY3dfcGFja19jb250ZXh0IHBhY2s7CisKKyAgc3BfZ2V0X2JjZHRpbWUoY3RpbWUpOworICBzcF9wcm90b2NvbF9yZXFfaW5pdCgmcmVxLCBTUF9DTURfU0hPUlRVUkwpOworICBzcF9wYWNrX2luaXQoJnBhY2ssIHJlcS5kYXRhLCBzaXplb2YocmVxLmRhdGEpKTsKKyAgY3dfcGFja19tYXBfc2l6ZSgmcGFjaywgMik7CisKKyAgc3BfcGFja19wdXRfYmluKCZwYWNrLCBQS19CSU5fREVWUEhZSUQsIHBvcy0+ZGV2cGh5aWQsIDQpOworICBzcF9wYWNrX3B1dF9iaW4oJnBhY2ssIFBLX0JJTl9ERVZUSU1FLCBjdGltZSwgNik7CisKKyAgcmVxLmRhdGFsZW4gKz0gc3BfcGFja19sZW5ndGgoJnBhY2spOworICBzcF91c2FydF9zZW5kKHBvcywgJnJlcSk7CisgIHJldHVybiBzcF9jb25maXJtX3FyY29kZV9pbml0KHBvcywgY2FyZCk7Cit9CisKKy8vtv7OrMLryLfIz6Osu/HIodanuLbXtMysCitzdGF0aWMgdWludDE2IHNwX2NvbmZpcm1fcXJjb2RlX3F1ZXJ5KHNwX3Bvc190KiBwb3MsIHNwX2NhcmRfdCogY2FyZCkKK3sKKyAgdWludDggc2l6ZTsKKyAgdWludDE2IHJldDsKKyAgaW50MzIgdGltZW91dF9tcyA9IENPTU1fV0FJVF9USU1FOworICBjd191bnBhY2tfY29udGV4dCB1bnBhY2s7CisgIHVucGFja19maWVsZF90IGZpZWxkOworICBzcF9wcm90b2NvbF9yZXNwb25zZV90IHJlc3A7CisKKyAgcmV0ID0gc3BfdXNhcnRfcmVjdihwb3MsICZyZXNwLCB0aW1lb3V0X21zKTsKKyAgaWYocmV0KQorICB7CisgICAgcmV0ID0gUkNfUVJDT0RFX1FVRVJZX0ZBSUw7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHNwX3VucGFja19pbml0KCZ1bnBhY2sscmVzcC5kYXRhLHJlc3AuZGF0YWxlbik7CisgIHNpemUgPSBzcF91bnBhY2tfbWFwX3NpemUoJnVucGFjayk7CisgIHdoaWxlKHNpemUtLSA+IDApCisgIHsKKyAgICBzcF91bnBhY2tfdmFsdWUoJnVucGFjaywmZmllbGQpOworICAgIGlmKElTX0tFWShQS19CSU5fQklMTE5PLCBmaWVsZC5rZXkpKQorICAgIHsKKyAgICAgIE1FTUNQWShjYXJkLT5iaWxsbm8sIGZpZWxkLnZhbC5iaW52YWwsIGZpZWxkLnN0cmxlbik7CisgICAgfQorICAgIGVsc2UgaWYoSVNfS0VZKFBLX0lOVF9BVVRIU1RBVFVTLCBmaWVsZC5rZXkpKQorICAgIHsKKyAgICAgIGNhcmQtPnFyY29kZS5hdXRoc3RhdHVzID0gZmllbGQudmFsLmludHZhbDsKKyAgICB9CisgICAgZWxzZSBpZihJU19LRVkoUEtfSU5UX1BBWVNUQVRVUywgZmllbGQua2V5KSkKKyAgICB7CisgICAgICBjYXJkLT5xcmNvZGUucGF5c3RhdHVzID0gZmllbGQudmFsLmludHZhbDsKKyAgICB9CisgICAgZWxzZSBpZihJU19LRVkoUEtfSU5UX1BBWUFNVCwgZmllbGQua2V5KSkKKyAgICB7CisgICAgICBjYXJkLT5xcmNvZGUucGFpZEFtb3VudCA9IGZpZWxkLnZhbC5pbnR2YWw7CisgICAgfQorICAgIGVsc2UgaWYoSVNfS0VZKFBLX0lOVF9GRUVBTU9VTlQsZmllbGQua2V5KSkKKyAgICB7CisgICAgICBjYXJkLT5mZWVwYXJhLmZlZV9hbXQgPSBmaWVsZC52YWwuaW50dmFsOworICAgIH0KKyAgICBlbHNlIGlmKElTX0tFWShQS19JTlRfRkVFVU5JVCwgZmllbGQua2V5KSkKKyAgICB7CisgICAgICBjYXJkLT5mZWVwYXJhLmZlZV91bml0ID0gZmllbGQudmFsLmludHZhbDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3AucmV0Y29kZTsKK30KKwordWludDE2IHNwX3FyY29kZV9xdWVyeShzcF9wb3NfdCogcG9zLCBzcF9jYXJkX3QqIGNhcmQpCit7CisgIHVpbnQ4IGN0aW1lWzZdOworICBzcF9wcm90b2NvbF9yZXF1ZXN0X3QgcmVxOworICBjd19wYWNrX2NvbnRleHQgcGFjazsKKworICBzcF9nZXRfYmNkdGltZShjdGltZSk7CisgIHNwX3Byb3RvY29sX3JlcV9pbml0KCZyZXEsIFNQX0NNRF9RUkNPREVfUEFZX1FVRVJZKTsKKyAgc3BfcGFja19pbml0KCZwYWNrLCByZXEuZGF0YSwgc2l6ZW9mKHJlcS5kYXRhKSk7CisgIGN3X3BhY2tfbWFwX3NpemUoJnBhY2ssIDIpOworCisgIHNwX3BhY2tfcHV0X2JpbigmcGFjaywgUEtfQklOX0RFVlBIWUlELCBwb3MtPmRldnBoeWlkLCA0KTsKKyAgc3BfcGFja19wdXRfYmluKCZwYWNrLCBQS19CSU5fQklMTE5PLCBjYXJkLT5iaWxsbm8sIHNpemVvZihjYXJkLT5iaWxsbm8pKTsKKworICByZXEuZGF0YWxlbiArPSBzcF9wYWNrX2xlbmd0aCgmcGFjayk7CisgIHNwX3VzYXJ0X3NlbmQocG9zLCAmcmVxKTsKKyAgcmV0dXJuIHNwX2NvbmZpcm1fcXJjb2RlX3F1ZXJ5KHBvcywgY2FyZCk7Cit9CisKKy8vwffLrsnPtKsKK3N0YXRpYyB1aW50OCB0cmFuc2R0bF9hY2NvdW50X2JpbExub1sxMF07CitzdGF0aWMgdWludDE2IHNwX2FzeW5jX3VwbG9hZF90cmFuc2R0bChzcF9wb3NfdCogcG9zLCBzcF90cmFuc2R0bF90KiB0cmFuc2R0bCkKK3sKKyAgdWludDggY3JjWzJdOworICBjd19wYWNrX2NvbnRleHQgcGFjazsKKyAgc3BfcHJvdG9jb2xfcmVxdWVzdF90IHJlcTsKKworICBNRU1DUFkodHJhbnNkdGxfYWNjb3VudF9iaWxMbm8sIHRyYW5zZHRsLT5iaWxsbm8sIHNpemVvZih0cmFuc2R0bC0+YmlsbG5vKSk7CisgIHNwX3Byb3RvY29sX3JlcV9pbml0KCZyZXEsIFNQX0NNRF9UUkFOU0RUTF9BQ0NPVU5UKTsKKyAgc3BfcGFja19pbml0KCZwYWNrLHJlcS5kYXRhLHNpemVvZihyZXEuZGF0YSkpOworICBjd19wYWNrX21hcF9zaXplKCZwYWNrLDEwKTsKKworICBzcF9wYWNrX3B1dF9iaW4oJnBhY2ssIFBLX0JJTl9ERVZQSFlJRCwgdHJhbnNkdGwtPmRldnBoeWlkLDQpOworICBzcF9wYWNrX3B1dF9iaW4oJnBhY2ssIFBLX0JJTl9UUkFOU0RBVEUsIHRyYW5zZHRsLT50cmFuc2RhdGUsMyk7CisgIHNwX3BhY2tfcHV0X2JpbigmcGFjaywgUEtfQklOX1RSQU5TVElNRSwgdHJhbnNkdGwtPnRyYW5zdGltZSwzKTsKKyAgc3BfcGFja19wdXRfYmluKCZwYWNrLCBQS19CSU5fQklMTE5PLCB0cmFuc2R0bC0+YmlsbG5vLCBzaXplb2YodHJhbnNkdGwtPmJpbGxubykpOworICBzcF9wYWNrX3B1dF9iaW4oJnBhY2ssIFBLX0JJTl9DQVJEUEhZSUQsIHRyYW5zZHRsLT5jYXJkcGh5aWQsCisgICAgICAgICAgICAgICAgICBzaXplb2YodHJhbnNkdGwtPmNhcmRwaHlpZCkpOworICBzcF9wYWNrX3B1dF9pbnQoJnBhY2ssIFBLX0lOVF9UUkFOU1dBWSwgdHJhbnNkdGwtPnRyYW5zd2F5KTsKKyAgc3BfcGFja19wdXRfaW50KCZwYWNrLCBQS19JTlRfQU1PVU5ULCB0cmFuc2R0bC0+YW1vdW50KTsKKyAgc3BfcGFja19wdXRfaW50KCZwYWNrLCBQS19JTlRfUEFZQU1ULCB0cmFuc2R0bC0+cGFpZEFtb3VudCk7CisgIHNwX3BhY2tfcHV0X2ludCgmcGFjaywgUEtfSU5UX0ZMT1dTRU5TT1JTLCB0cmFuc2R0bC0+Zmxvd3NlbnNvcnMpOworICBzcF9wYWNrX3B1dF9pbnQoJnBhY2ssIFBLX0lOVF9GTEFHLCB0cmFuc2R0bC0+dHJhbnN0YXR1cyk7CisKKyAgc3BfcHJvdG9jb2xfY3JjKCh1aW50OCopdHJhbnNkdGwsIHNpemVvZihzcF90cmFuc2R0bF90KS0yLGNyYyk7CisgIHJlcS5kYXRhbGVuICs9IHNwX3BhY2tfbGVuZ3RoKCZwYWNrKTsKKyAgc3BfdXNhcnRfc2VuZChwb3MsICZyZXEpOworICByZXR1cm4gMDsKK30KKworLy/It8jPwffLrte0zKwKK3N0YXRpYyB1aW50OCBzcF9jb25maXJtX3RyYW5zZHRsX2FjY291bnQoc3BfcHJvdG9jb2xfcmVzcG9uc2VfdCogcmVzcCwgc3BfcG9zX3QqIHBvcykKK3sKKyAgdWludDggc2l6ZTsKKyAgY3dfdW5wYWNrX2NvbnRleHQgdW5wYWNrOworICB1bnBhY2tfZmllbGRfdCBmaWVsZDsKKworICBpZighcmVzcC0+cmV0Y29kZSkKKyAgeworICAgIHNwX3VucGFja19pbml0KCZ1bnBhY2ssIHJlc3AtPmRhdGEsIHJlc3AtPmRhdGFsZW4pOworICAgIHNpemUgPSBzcF91bnBhY2tfbWFwX3NpemUoJnVucGFjayk7CisgICAgd2hpbGUoc2l6ZS0tID4gMCkKKyAgICB7CisgICAgICBzcF91bnBhY2tfdmFsdWUoJnVucGFjaywmZmllbGQpOworICAgICAgaWYoSVNfS0VZKFBLX0JJTl9CSUxMTk8sZmllbGQua2V5KSkKKyAgICAgIHsKKyAgICAgICAgaWYoTUVNQ01QKGZpZWxkLnZhbC5iaW52YWwsIHRyYW5zZHRsX2FjY291bnRfYmlsTG5vLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYW5zZHRsX2FjY291bnRfYmlsTG5vKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHBvcy0+dW5jb25maXJtX3RyYW5zZHRsLnRyYW5zYWRkcis9IHNpemVvZihzcF90cmFuc2R0bF90KTsKKyAgICAgICAgICBpZihBRERSX1RSQU5TRFRMX0VORCA8PSBwb3MtPnVuY29uZmlybV90cmFuc2R0bC50cmFuc2FkZHIpCisgICAgICAgICAgeworICAgICAgICAgICAgcG9zLT51bmNvbmZpcm1fdHJhbnNkdGwudHJhbnNhZGRyPSBBRERSX1RSQU5TRFRMX0JFR0lOOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gc3Bfd3JpdGVfdW5jb25maXJtX3JlY29yZChwb3MpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiByZXNwLT5yZXRjb2RlOworCit9CisKK3N0YXRpYyB1aW50OCBzcF9jb25maXJtX2hlYXJ0YmVhdChzcF9wcm90b2NvbF9yZXNwb25zZV90KiByZXNwLCBzcF9wb3NfdCogcG9zKQoreworICB1aW50OCBzaXplOworICB1aW50OCBjdGltZVs2XTsKKyAgdWludDggc3lzdGltZVs3XTsKKyAgdWludDggbG9naW5fZmxhZyA9IDA7CisgIGN3X3VucGFja19jb250ZXh0IHVucGFjazsKKyAgdW5wYWNrX2ZpZWxkX3QgZmllbGQ7CisKKyAgaWYocmVzcC0+cmV0Y29kZSkKKyAgeworICAgIHJldHVybiByZXNwLT5yZXRjb2RlOworICB9CisgIHBvcy0+aGVhcnRiZWF0LmhlYXJ0X3N0YXR1cyA9IEhFQVJUX1JFQ1Y7CisKKyAgc3BfdW5wYWNrX2luaXQoJnVucGFjayxyZXNwLT5kYXRhLHJlc3AtPmRhdGFsZW4pOworICBzaXplID0gc3BfdW5wYWNrX21hcF9zaXplKCZ1bnBhY2spOworICB3aGlsZShzaXplLS0gPiAwKQorICB7CisgICAgc3BfdW5wYWNrX3ZhbHVlKCZ1bnBhY2ssJmZpZWxkKTsKKyAgICBpZihJU19LRVkoUEtfQklOX1NZU1RJTUUsIGZpZWxkLmtleSkpCisgICAgeworICAgICAgaWYoZmllbGQuc3RybGVuID09IDcpCisgICAgICB7CisgICAgICAgIE1FTUNQWShzeXN0aW1lLGZpZWxkLnZhbC5iaW52YWwsNyk7CisgICAgICAgIHNwX2dldF9iY2R0aW1lKGN0aW1lKTsKKyAgICAgICAgaWYoTUVNQ01QKGN0aW1lLHN5c3RpbWUgKzEsNSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmKCFzcF9jaGVja190aW1lX3ZhbGlkKHN5c3RpbWUgKzEpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHNwX3NldF9iY2R0aW1lKHN5c3RpbWUgKzEpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKElTX0tFWShQS19TVFJfU1RBVFVTLCBmaWVsZC5rZXkpKQorICAgIHsKKyAgICAgIGlmKE1FTUNNUChmaWVsZC52YWwuc3RydmFsLCAibm9ybWFsIiwgZmllbGQuc3RybGVuKSA9PSAwKQorICAgICAgeworICAgICAgICBsb2dpbl9mbGFnID0gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoTUVNQ01QKGZpZWxkLnZhbC5zdHJ2YWwsICJsb2dvdXQiLCBmaWVsZC5zdHJsZW4pID09IDApCisgICAgICB7CisgICAgICAgIGxvZ2luX2ZsYWcgPSAwOworICAgICAgfQorICAgICAgZWxzZSBpZihNRU1DTVAoZmllbGQudmFsLnN0cnZhbCwgImNsb3NlZCIsIGZpZWxkLnN0cmxlbikgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgbG9naW5fZmxhZyA9IDI7CisgICAgICB9CisgICAgfQorICB9CisgIHNwX3NhdmVfaGVhcnRiZWF0X2luZm8ocG9zLCBsb2dpbl9mbGFnKTsKKyAgcmV0dXJuIHJlc3AtPnJldGNvZGU7Cit9CisKK3VpbnQ4IHNwX2NvbmZpcm1fbG9naW4oc3BfcHJvdG9jb2xfcmVzcG9uc2VfdCogcmVzcCwgc3BfcG9zX3QqIHBvcykKK3sKKyAgdWludDggc2l6ZTsKKyAgdWludDggY3RpbWVbNl07CisgIHVpbnQ4IHN5c3RpbWVbN107CisgIHVpbnQ4IGxvZ2luX2ZsYWcgPSAwOworICB1aW50OCB1bml0ID0gMDsKKyAgdWludDggb2ZmbGluZV9tYXhob3VyID0gMDsKKyAgY3dfdW5wYWNrX2NvbnRleHQgdW5wYWNrOworICB1bnBhY2tfZmllbGRfdCBmaWVsZDsKKworICBNRU1DTEVBUihjdGltZSwgc2l6ZW9mKGN0aW1lKSk7CisgIE1FTUNMRUFSKHN5c3RpbWUsIHNpemVvZihzeXN0aW1lKSk7CisgIGlmKHJlc3AtPnJldGNvZGUpCisgIHsKKyAgICByZXR1cm4gcmVzcC0+cmV0Y29kZTsKKyAgfQorICBwb3MtPmhlYXJ0YmVhdC5oZWFydF9zdGF0dXMgPSBIRUFSVF9SRUNWOworCisgIHNwX3VucGFja19pbml0KCZ1bnBhY2sscmVzcC0+ZGF0YSxyZXNwLT5kYXRhbGVuKTsKKyAgc2l6ZSA9IHNwX3VucGFja19tYXBfc2l6ZSgmdW5wYWNrKTsKKyAgd2hpbGUoc2l6ZS0tID4gMCkKKyAgeworICAgIHNwX3VucGFja192YWx1ZSgmdW5wYWNrLCZmaWVsZCk7CisgICAgaWYoSVNfS0VZKFBLX0lOVF9PRkZMSU5FTUFYSE9VUiwgZmllbGQua2V5KSkKKyAgICB7CisgICAgICBvZmZsaW5lX21heGhvdXIgPSBmaWVsZC52YWwuaW50dmFsOworICAgIH0KKyAgICBlbHNlIGlmKElTX0tFWShQS19JTlRfUFVMU0VJTkhNTCwgZmllbGQua2V5KSkKKyAgICB7CisgICAgICB1bml0ID0gZmllbGQudmFsLmludHZhbDsKKyAgICB9CisgICAgZWxzZSBpZihJU19LRVkoUEtfQklOX1NZU1RJTUUsIGZpZWxkLmtleSkpCisgICAgeworICAgICAgaWYoZmllbGQuc3RybGVuID09IDcpCisgICAgICB7CisgICAgICAgIE1FTUNQWShzeXN0aW1lLGZpZWxkLnZhbC5iaW52YWwsNyk7CisgICAgICAgIHNwX2dldF9iY2R0aW1lKGN0aW1lKTsKKyAgICAgICAgaWYoTUVNQ01QKGN0aW1lLHN5c3RpbWUgKzEsNSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmKCFzcF9jaGVja190aW1lX3ZhbGlkKHN5c3RpbWUgKzEpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHNwX3NldF9iY2R0aW1lKHN5c3RpbWUgKzEpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGxvZ2luX2ZsYWcgPSAxOworICBzcF9zYXZlX2xvZ2luX2luZm8ocG9zLCBsb2dpbl9mbGFnLCB1bml0LCBvZmZsaW5lX21heGhvdXIpOworICByZXR1cm4gcmVzcC0+cmV0Y29kZTsKK30KKworc3RhdGljIHByb3RvY29sX2NtZF90IHByb3RvY29sX2NtZHNbXSA9Cit7CisgIHtTUF9DTURfVFJBTlNEVExfQUNDT1VOVCwgc3BfY29uZmlybV90cmFuc2R0bF9hY2NvdW50fSwKKyAge1NQX0NNRF9IRUFSVEJFQVQsIHNwX2NvbmZpcm1faGVhcnRiZWF0fSwKKyAge1NQX0NNRF9MT0dJTiwgc3BfY29uZmlybV9sb2dpbn0sCisgIHswLCBOVUxMfQorfTsKKworc3RhdGljIHVpbnQxNiBzcF9hc3luY19jb25maXJtX3Byb2Nlc3Moc3BfcG9zX3QqIHBvcykKK3sKKyAgdWludDggcmV0ID0gMDsKKyAgdWludDggaSA9IDA7CisgIGludDMyIHRpbWVvdXRfbXMgPSBDT01NX1dBSVRfVElNRTsKKyAgc3BfcHJvdG9jb2xfcmVzcG9uc2VfdCByZXNwOworCisgIHJldCA9IHNwX3VzYXJ0X3JlY3YocG9zLCAmcmVzcCwgdGltZW91dF9tcyk7CisgIGlmKHJldCkKKyAgeworICAgIHJldHVybiByZXQ7CisgIH0KKyAgd2hpbGUocHJvdG9jb2xfY21kc1tpXS5mdW5jICE9IE5VTEwgJiYgcHJvdG9jb2xfY21kc1tpXS5jbWQgIT0gMCkKKyAgeworICAgIGlmKHByb3RvY29sX2NtZHNbaV0uY21kID09IHJlc3AuZXhjbWQpCisgICAgeworICAgICAgcmV0dXJuIHByb3RvY29sX2NtZHNbaV0uZnVuYygmcmVzcCwgcG9zKTsKKyAgICB9CisgICAgKytpOworICB9CisgIHJldHVybiAxOworfQorCisvL7zssuLJ6LG4zajRtte0zKyjrL/Vz9DKsbzkvfjQ0MH3y660psDttci5pNf3CitzdGF0aWMgdm9pZCBzcF9jaGVja19hbmRfc3dpdGNoX2xpbmtzdGF0KHNwX3Bvc190KiBwb3MpCit7CisgIGlmKHBvcy0+aGVhcnRiZWF0LmhlYXJ0X3N0YXR1cyA9PSBIRUFSVF9TRU5EKQorICB7CisgICAgLy/S0beiy83QxMz4o6zOtMrVtb3TprTwCisgICAgcG9zLT5saW5rX3N0YXQgPSAwOworICAgIHBvcy0+aGVhcnRiZWF0LmhlYXJ0X3N0YXR1cyA9IEhFQVJUX0lOSVQ7CisgIH0KKyAgZWxzZSBpZihwb3MtPmhlYXJ0YmVhdC5oZWFydF9zdGF0dXMgPT0gSEVBUlRfUkVDVikKKyAgeworICAgIC8v0tG3osvN0MTM+KOsytW1vdOmtPAKKyAgICBwb3MtPmxpbmtfc3RhdCA9IDE7CisgICAgcG9zLT5oZWFydGJlYXQuaGVhcnRfc3RhdHVzID0gSEVBUlRfSU5JVDsKKyAgfQorfQorCit2b2lkIHNwX2NvbW11bmljYXRlKHNwX3Bvc190KiBwb3MpCit7CisgIHVpbnQxNiByZXQgPSAwOworICB1aW50MzIgdGlja2VyID0gMDsKKyAgc3BfdHJhbnNkdGxfdCB0cmFuc2R0bDsKKworICBpZihwb3MtPmRldmljZW5vID09IDApCisgIHsKKyAgICByZXR1cm47CisgIH0KKyAgdGlja2VyID0gc3BfZ2V0X3RpY2tlcigpOworICBpZih0aWNrZXIgLSBwb3MtPmxhc3RfY29tbV9zdGF0dXMuc2VuZHRpbWUgPiBDT01NX1dBSVRfVElNRSkKKyAgeworICAgIGlmKHBvcy0+ZGV2bG9naW4ubGFzdF9sb2dpbl90aWNrZXIgPT0gMCB8fCBwb3MtPmRldmxvZ2luLmxvZ2luX2ZsYWcgPT0gMAorICAgICAgICB8fCAodGlja2VyIC0gcG9zLT5kZXZsb2dpbi5sYXN0X2xvZ2luX3RpY2tlcikgPiBERUxBWV9USU1FNjBzKjYwKjI0KQorICAgIHsKKyAgICAgIHBvcy0+ZGV2bG9naW4ubGFzdF9sb2dpbl90aWNrZXIgPSB0aWNrZXI7CisgICAgICBzcF9hc3luY19lcXVpcG1lbnRfbG9naW4ocG9zKTsKKyAgICB9CisgICAgZWxzZSBpZih0aWNrZXIgPCBwb3MtPmhlYXJ0YmVhdC5sYXN0X2hlYXJ0YmVhdF90aWNrZXIKKyAgICAgICAgICAgIHx8IHBvcy0+aGVhcnRiZWF0Lmxhc3RfaGVhcnRiZWF0X3RpY2tlciA9PSAwCisgICAgICAgICAgICB8fCAodGlja2VyIC0gcG9zLT5oZWFydGJlYXQubGFzdF9oZWFydGJlYXRfdGlja2VyKSA+IERFTEFZX1RJTUU2MHMqMikKKyAgICB7CisgICAgICBwb3MtPmhlYXJ0YmVhdC5sYXN0X2hlYXJ0YmVhdF90aWNrZXIgPSB0aWNrZXI7CisgICAgICBzcF9hc3luY19oZWFydGJlYXQocG9zKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHNwX2NoZWNrX2FuZF9zd2l0Y2hfbGlua3N0YXQocG9zKTsKKyAgICAgIGlmKHBvcy0+bGlua19zdGF0KQorICAgICAgeworICAgICAgICAvL7zssuK1scewyse38dPQzrTJz7SrtcTB98uuCisgICAgICAgIGlmKHBvcy0+dW5jb25maXJtX3RyYW5zZHRsLnRyYW5zYWRkciA8PSBwb3MtPmxhc3RfdHJhbnNkdGwudHJhbnNhZGRyKQorICAgICAgICB7CisgICAgICAgICAgcmV0ID0gc3BfZmxhc2hfcmVhZCgodWludDMyKXBvcy0+dW5jb25maXJtX3RyYW5zZHRsLnRyYW5zYWRkciwgKHVpbnQ4KikmdHJhbnNkdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodHJhbnNkdGwpKTsKKyAgICAgICAgICBpZighcmV0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCFwb3MtPnN5c2NvbmYud29ya19tb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwb3MtPmhlYXJ0YmVhdC5sYXN0X2hlYXJ0YmVhdF90aWNrZXIgPSB0aWNrZXI7CisgICAgICAgICAgICAgIHNwX2FzeW5jX3VwbG9hZF90cmFuc2R0bChwb3MsICZ0cmFuc2R0bCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3BfYXN5bmNfY29uZmlybV9wcm9jZXNzKHBvcyk7Cit9CmRpZmYgLS1naXQgYS9zdXB3aXNkb20vc3BfY29tbXVuaWNhdGUuaCBiL3N1cHdpc2RvbS9zcF9jb21tdW5pY2F0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZGFmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zdXB3aXNkb20vc3BfY29tbXVuaWNhdGUuaApAQCAtMCwwICsxLDEzOSBAQAorI2lmbmRlZiBfU1BfQ09NTVVOSUNBVEVfSF8KKyNkZWZpbmUgX1NQX0NPTU1VTklDQVRFX0hfCisKKyNpbmNsdWRlICJzcF9jb25maWcuaCIKKworI2RlZmluZSBQUk9UT0NPTF9DT01NQU5EX1YyIAkJMHg4MAorI2RlZmluZSBQUk9UT0NPTF9XSVRIX01BQyh4KSAJCSgoeCkgfCAweDgwKQorI2RlZmluZSBQUk9UT0NPTF9XSVRIT1VUX01BQyh4KSAJKCh4KSAmIDB4N0YpCisjZGVmaW5lIFBST1RPQ09MX0ZMQUdfUEFDSyh4KSAJCSgoeCkgfCAweDAxKQorI2RlZmluZSBQUk9UT0NPTF9GTEFHX0RFU19QQUNLKHgpIAkoKHgpICYgMHhGRSkKKworI2RlZmluZSBQS19CSU5fREVWUEhZSUQgCQkJImEiCisjZGVmaW5lIFBLX0lOVF9DQVJETk8gCQkJCSJiIgorI2RlZmluZSBQS19CSU5fQ0FSRFZFUk5PIAkJCSJjIgorI2RlZmluZSBQS19JTlRfREVWU0VRTk8gCQkJImQiCisjZGVmaW5lIFBLX1NUUl9WRVJTSU9OIAkJCQkiZSIKKyNkZWZpbmUgUEtfSU5UX0JMS0lOREVYIAkJCSJmIgorI2RlZmluZSBQS19CSU5fVFJBTlNEQVRFIAkJCSJnIgorI2RlZmluZSBQS19CSU5fVFJBTlNUSU1FIAkJCSJoIgorI2RlZmluZSBQS19JTlRfUEFZQU1UIAkJCQkiaSIKKyNkZWZpbmUgUEtfSU5UX0FNT1VOVCAJCQkJImoiCisjZGVmaW5lIFBLX0lOVF9GTEFHIAkJCQkiayIKKyNkZWZpbmUgUEtfU1RSX0FWQUlBQkxFIAkJCSJsIgorI2RlZmluZSBQS19CSU5fU1lTVElNRSAJCQkJIm0iCisjZGVmaW5lIFBLX1NUUl9VUEdSQURFIAkJCQkibiIKKyNkZWZpbmUgUEtfQklOX0JMS0JJVE1BUCAJCQkibyIKKyNkZWZpbmUgUEtfQklOX0ZJTEVDUkMgCQkJCSJwIgorI2RlZmluZSBQS19JTlRfRklMRVNJWkUgCQkJInEiCisjZGVmaW5lIFBLX0lOVF9TRVFOTyAJCQkJInIiCisjZGVmaW5lIFBLX0JJTl9GSUxFREFUQSAJCQkicyIKKyNkZWZpbmUgUEtfSU5UX01BWFNFUU5PIAkJCSJ0IgorI2RlZmluZSBQS19JTlRfU0VDT05EUyAJCQkJInUiCisjZGVmaW5lIFBLX0lOVF9DUkVESVRfVE9UQUwgIAkJInYiCisjZGVmaW5lIFBLX0lOVF9DUkVESVRfUEFZQ05UICAJCSJ3IgorI2RlZmluZSBQS19JTlRfQ1JFRElUX0FWQUlMQUJBTCAgCSJ4IgorI2RlZmluZSBQS19JTlRfQ1JFRElUX05PICAJCQkieSIKKyNkZWZpbmUgUEtfQklOX0VYUElSRSAgCQkJCSJ6IgorI2RlZmluZSBQS19JTlRfRkVFVFlQRSAgCQkJIkEiCisjZGVmaW5lIFBLX0JJTl9DQVJEUEhZSUQgIAkJCSJCIgorI2RlZmluZSBQS19TVFJfU1RBVFVTICAJCQkJIkMiCisjZGVmaW5lIFBLX0lOVF9CQUxBTkNFICAJCQkiRCIKKyNkZWZpbmUgUEtfSU5UX09GRkxJTkVfRk9SQklEX0ZMQUcgICJFIgorI2RlZmluZSBQS19JTlRfQ1JFRElUX1BBWUNOVF9MQUNLICAJIkYiCisjZGVmaW5lIFBLX0lOVF9PTkNFVElNRV9MSU1JVCAgCQkiRyIKKyNkZWZpbmUgUEtfSU5UX0RBWVRPVEFMX0xJTUlUICAJCSJIIgorI2RlZmluZSBQS19JTlRfQ09VTlQgCQkJCSJKIgorI2RlZmluZSBQS19CSU5fQkxLTElTVCAJCQkJIksiCisjZGVmaW5lIFBLX0lOVF9DUkVESVRfTkVYVF9OTyAJCSJMIgorI2RlZmluZSBQS19CSU5fUkFORE9NICAJCQkJIk0iCisjZGVmaW5lIFBLX0lOVF9ERVZJQ0VOTyAgCQkJIk4iCisjZGVmaW5lIFBLX0JJTl9ERVZUSU1FICAJCQkiTyIKKyNkZWZpbmUgUEtfU1RSX0RFVlRZUEUgIAkJCSJQIgorI2RlZmluZSBQS19CSU5fU0FNTk8gIAkJCQkiUSIKKyNkZWZpbmUgUEtfSU5UX1BBUkFWRVJOTyAgCQkJIlIiCisjZGVmaW5lIFBLX0lOVF9QQVJBX0dST1VQSUQgIAkJIlMiCisjZGVmaW5lIFBLX0lOVF9GRUVWRVJOTyAgCQkJIlQiCisjZGVmaW5lIFBLX0lOVF9GRUVfQ0ZHSUQgIAkJCSJVIgorI2RlZmluZSBQS19CSU5fV1NDTElFTlRfSUQgIAkJIlYiCisjZGVmaW5lIFBLX0lOVF9XU0NMSUVOVF9TVEFUVVMgIAkiVyIKKyNkZWZpbmUgUEtfSU5UX0ZMT1dTRU5TT1JTCQkJIlgiCisjZGVmaW5lIFBLX0JJTl9TT0ZUX01ENSAgCQkJIlkiCisjZGVmaW5lIFBLX0lOVF9DVVNUSUQJCQkJIloiCisjZGVmaW5lIFBLX1NUUl9TSE9SVF9VUkwJCQkiMCIKKyNkZWZpbmUgUEtfSU5UX1dBVEVSU1RBVFVTICAJCSIxIgorI2RlZmluZSBQS19JTlRfV0FURVJNVUNIICAJCQkiMiIKKworI2RlZmluZSBQS19CSU5fQklMTE5PIAkJCQkiMyIKKyNkZWZpbmUgUEtfSU5UX1RSQU5TV0FZIAkJCSI0IgorI2RlZmluZSBQS19JTlRfVU5UUkFOU0NPTlNUIAkJIjUiCisjZGVmaW5lIFBLX0JJTl9ERVZJQ0VLRVkgCQkJIjYiCisjZGVmaW5lIFBLX0lOVF9XT1JLTU9ERSAJCQkiNyIKKyNkZWZpbmUgUEtfSU5UX09GRkxJTkVNQVhIT1VSIAkJIjgiCisjZGVmaW5lIFBLX0lOVF9QVUxTRUlOSE1MIAkJCSI5IgorI2RlZmluZSBQS19CSU5fQ0lUSVpFTl9DQVJETk8JCSIxMCIKKyNkZWZpbmUgUEtfSU5UX1dBVEVSTElNSVQgCSAJCSIxMSIKKyNkZWZpbmUgUEtfSU5UX0ZFRUFNT1VOVCAJCQkiMTIiCisjZGVmaW5lIFBLX0lOVF9GRUVVTklUIAkJCQkiMTMiCisjZGVmaW5lIFBLX0lOVF9WQUlMRFRJTUUJCQkiMTQiCisjZGVmaW5lIFBLX0lOVF9BVVRIU1RBVFVTCQkJIjE1IgorI2RlZmluZSBQS19JTlRfUEFZU1RBVFVTCQkJIjE2IgorI2RlZmluZSBQS19JTlRfRkVFU1RBUlQJCQkJIjE3IgorCisjZGVmaW5lIFNQX0NNRF9VUEdSQURFIDB4MjAgICAgICAgICAJLy/U2s/fyf28tgorI2RlZmluZSBTUF9DTURfVFJBTlNEVExfQUNDT1VOVCAweDIyICAgIC8vvMfVy8H3y64KKyNkZWZpbmUgU1BfQ01EX0hFQVJUQkVBVCAweDI0IAkJCS8v0MTM+AorI2RlZmluZSBTUF9DTURfQ0FSRF9BVVRIRU5USUNBVElPTiAweDI2CS8vv6jU2s/fyM/WpAorI2RlZmluZSBTUF9DTURfTE9HSU4JMHgyQwkJCS8vtcfCvAorI2RlZmluZSBTUF9DTURfRkFDVE9SWV9MSU5LX1RFU1QgMHgyRQkvL7mks6fBtMK3suLK1AorI2RlZmluZSBTUF9DTURfU0hPUlRVUkwJMHgyOAkJCS8vu/HIobb+zqzC67bMtdjWtworI2RlZmluZSBTUF9DTURfUVJDT0RFX1BBWV9RVUVSWQkweDJBCS8vtv7OrMLrz/u30ci3yM8KKworI2RlZmluZSBJU19QVVNIX0ZMT1coY21kKSAoMHgxJihjbWQpKQorCisjcHJhZ21hIHBhY2socHVzaCkKKyNwcmFnbWEgcGFjaygxKQorCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MTYgZGF0YWxlbjsKKyAgdWludDggY29tbWFuZDsKKyAgdWludDggZXhjbWQ7IC8vIMfrx/PD/MHu0qrH88W8yv0KKyAgdWludDggZmxhZzsKKyAgdWludDggZGF0YVsyNTZdOworfSBzcF9wcm90b2NvbF9yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQxNiBkYXRhbGVuOworICB1aW50OCBjb21tYW5kOworICB1aW50OCBleGNtZDsgLy8gx+vH88P8we7SqsfzxbzK/QorICB1aW50OCBmbGFnOworICB1aW50OCByZXRjb2RlOworICB1aW50OCBkYXRhWzI1Nl07Cit9IHNwX3Byb3RvY29sX3Jlc3BvbnNlX3Q7CisKKyNwcmFnbWEgcGFjayhwb3ApCisKK3R5cGVkZWYgdWludDgoKiBwcm90b2NvbF9jbWRfZnVuY190KShzcF9wcm90b2NvbF9yZXNwb25zZV90KiByZXNwLCBzcF9wb3NfdCogcG9zKTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDggY21kOworICBwcm90b2NvbF9jbWRfZnVuY190IGZ1bmM7Cit9IHByb3RvY29sX2NtZF90OworCit2b2lkIHNwX2NvbW11bmljYXRlKHNwX3Bvc190KiBwb3MpOwordWludDE2IHNwX2NhcmRfYXV0aGVudGljYXRpb24oc3BfcG9zX3QqIHBvcywgc3BfY2FyZF90KiBjYXJkKTsKK3VpbnQxNiBzcF9hc3luY19lcXVpcG1lbnRfbG9naW4oc3BfcG9zX3QqIHBvcyk7Cit1aW50MTYgc3BfYXN5bmNfaGVhcnRiZWF0KHNwX3Bvc190KiBwb3MpOwordWludDE2IHNwX2FzeW5jX3VwbG9hZF90cmFuc2R0bChzcF9wb3NfdCogcG9zLCBzcF90cmFuc2R0bF90KiBkdGwpOwordWludDE2IHNwX3FyY29kZV9pbml0KHNwX3Bvc190KiBwb3MsIHNwX2NhcmRfdCogY2FyZCk7Cit1aW50MTYgc3BfcXJjb2RlX3F1ZXJ5KHNwX3Bvc190KiBwb3MsIHNwX2NhcmRfdCogY2FyZCk7CisKKy8vzajRtgordWludDggc3BfY29tbV9jYWxsKHNwX3Bvc190KiBwb3MsIHNwX3Byb3RvY29sX3JlcXVlc3RfdCogcmVxLAorICAgICAgICAgICAgICAgICAgIHNwX3Byb3RvY29sX3Jlc3BvbnNlX3QqIHJlc3AsIGludDMyIHRpbWVvdXRfbXMpOwordm9pZCBzcF9wcm90b2NvbF9yZXFfaW5pdChzcF9wcm90b2NvbF9yZXF1ZXN0X3QqIHJlcSwgdWludDggY29tbWFuZCk7CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3Vwd2lzZG9tL3NwX2NvbmZpZy5oIGIvc3Vwd2lzZG9tL3NwX2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZjQxNDAKLS0tIC9kZXYvbnVsbAorKysgYi9zdXB3aXNkb20vc3BfY29uZmlnLmgKQEAgLTAsMCArMSwyODAgQEAKKyNpZm5kZWYgX1NQX0NPTkZJR19ICisjZGVmaW5lIF9TUF9DT05GSUdfSAorCisjaW5jbHVkZSAic3BfdmVyc2lvbi5oIgorI2luY2x1ZGUgIi4uL25lY19oYXJkd2FyZS5oIgorCisjaWZuZGVmIGludDgKKyNkZWZpbmUgaW50OCBzaWduZWQgY2hhcgorI2VuZGlmCisKKyNpZm5kZWYgdWludDgKKyNkZWZpbmUgdWludDggdW5zaWduZWQgY2hhcgorI2VuZGlmCisKKyNpZm5kZWYgaW50MTYKKyNkZWZpbmUgaW50MTYgc2lnbmVkIHNob3J0CisjZW5kaWYKKworI2lmbmRlZiB1aW50MTYKKyNkZWZpbmUgdWludDE2IHVuc2lnbmVkIHNob3J0CisjZW5kaWYKKworI2lmbmRlZiBpbnQzMgorI2RlZmluZSBpbnQzMiBzaWduZWQgaW50CisjZW5kaWYKKworI2lmbmRlZiB1aW50MzIKKyNkZWZpbmUgdWludDMyIHVuc2lnbmVkIGludAorI2VuZGlmCisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMICgodm9pZCAqKTApCisjZW5kaWYKKworI2RlZmluZSBERVZfVFlQRSAiRzQwMTMwMiIKKyNkZWZpbmUgREVWX09GRkxJTkVfREVGQVVMVF9IT1VSIDE2OAorI2RlZmluZSBERVZfQkxLQklUTUFQX0RPTkUgMTk4NAorI2RlZmluZSBERVZfTUFYX0RFVklDRU5PIDk5CisKKyNkZWZpbmUgUFJPX1ZFUlNJT04gR0lUX1ZFUlNJT04KKyNkZWZpbmUgQlVJTERfREFURSBfX0RBVEVfXyAJCS8vICIgIiBfX1RJTUVfXworI2lmZGVmIEZMT1dTRU5TT1IKKyNkZWZpbmUgUFVSQ0hBU0VfRkxPV1NFTlNPUiAxCisjZWxzZQorI2RlZmluZSBQVVJDSEFTRV9GTE9XU0VOU09SIDAKKyNlbmRpZgorCitlbnVtCit7CisgIFNQX0tFWV9OT05FID0gMHhGRiwKKyAgU1BfS0VZXzAgPSAwLAorICBTUF9LRVlfMSA9IDEsCisgIFNQX0tFWV8yID0gMiwKKyAgU1BfS0VZXzMgPSAzLAorICBTUF9LRVlfNCA9IDQsCisgIFNQX0tFWV81ID0gNSwKKyAgU1BfS0VZXzYgPSA2LAorICBTUF9LRVlfNyA9IDcsCisgIFNQX0tFWV84ID0gOCwKKyAgU1BfS0VZXzkgPSA5LAorICBTUF9LRVlfRU5URVIgPSAxMiwKKyAgU1BfS0VZX0NMRUFSID0gMTEKK307CisKK3R5cGVkZWYgZW51bQoreworICBQQVlNT0RFX0lOSVQgPSAwLAorICBQQVlNT0RFX0NBUkQgPSAxLAorICBQQVlNT0RFX1FSQ09ERSA9IDIsCit9IHNwX3BheW1vZGVfZTsKKworI3ByYWdtYSBwYWNrKHB1c2gpCisjcHJhZ21hIHBhY2soMSkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDggY29tbWFuZDsKKyAgdWludDMyIHNlbmR0aW1lOworfSBzcF9jb21tX3N0YXR1c190OworCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzIgbGFzdF9oZWFydGJlYXRfdGlja2VyOworICB1aW50OCBod1ZlclsxNl07CQkJCS8vyeixuLDmsb66xQorICB1aW50OCBvZmZsaW5lUmVjb3JkQ291bnQ7CQkvL860yc+0q8H3y67K/cG/CisgIHVpbnQ4IHdvcmtNb2RlOwkJCQkvL7Wxx7DXtMyso6wwLb/Vz9CjrDEt1f3U2sq508OjrDkt0snLxrnK1c8KKyAgdWludDggaGVhcnRfc3RhdHVzOwkvL9DEzPjXtMyso6wwLbP1yry7r6OsMS23osvNo6wyLb3TytUKK30gc3BfaGVhcnRiZWF0X3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMiBsYXN0X2xvZ2luX3RpY2tlcjsKKyAgdWludDggbG9naW5fZmxhZzsJCQkvLzAtzrTHqbW9o6wxLdLRx6m1vaOsMi3Xos/6CisgIHVpbnQ4IGh3VmVyWzE2XTsJCQkvL8nosbiw5rG+usUKKyAgdWludDggZGV2aWNlS2V5OwkJCS8vyeixuLmk1/fD3NS/Cit9IHNwX2xvZ2luX3Q7CisKKy8vz/u30cH3y67Qxc+iveG5uQordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDggZGV2cGh5aWRbNF07CS8vyeixuLHgusUKKyAgdWludDggdHJhbnNkYXRlWzNdOwkvL1lZRERNTbjxyr3I1cbaCisgIHVpbnQ4IHRyYW5zdGltZVszXTsKKyAgdWludDggYmlsbG5vWzEwXTsJCS8vvbvS17aptaWx4LrFCisgIHVpbnQ4IGNhcmRwaHlpZFs0XTsJLy+/qM7vwO1pZAorICB1aW50OCB0cmFuc3dheTsJCS8vvbvS17e9yr2jrDAts/XKvKOsMS3Lor+oo6wyLcmowusKKyAgdWludDggYW1vdW50OwkJCS8vyrW8ytanuLa98LbuCisgIHVpbnQ4IHBhaWRBbW91bnQ7CQkvL9LR1qe4tr3wtu6jrLWxysfPyL/bt9HEo8q9z8KjrLzHwrzS0danuLa1xL3wtu4KKyAgdWludDggZmxvd3NlbnNvcnM7CS8vyrW8ysq508O8xsG/o6i1pc67o7qw2brByf2jqQorICB1aW50OCB0cmFuc3RhdHVzOwkJLy/B98uu17TMrKOsMC2z9cq8o6wxLbPJuaajrDItyqew3AorICB1aW50OCByZXZlcnNlWzFdOwkJLy/VvM67t/sKKyAgdWludDggY3JjWzJdOyAJCS8vbGVuPTMyCit9IHNwX3RyYW5zZHRsX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQ4IG9mZmxpbmVfd29ya19ob3VyOyAgIAkvL9TK0O3N0bv6uaTX99futPPQocqxCSAgMCB+IDE2OCDQocqxo6wwILHtyr6yu8/e1sYKKyAgdWludDggZGV2aWNlbm87IAkJCQkvL7v6usUKKyAgdWludDggZGV2cGh5aWRbNF07CQkJLy/O78DtSUQKKyAgdWludDggZmxvd3NlbnNvcl91bml0OyAJCS8vIDEwMG1sttTTpsL2s+XK/QorICB1aW50OCB1bnVzZWRbNTRdOworICB1aW50OCBsb2dpbl9mbGFnOyAJCQkvLzAtzrTHqbW9o6wxLdLRx6m1vaOsMi3S0deiz/oKKyAgdWludDggY3JjWzJdOworfSBzcF9jb25maWdfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyIHRyYW5zYWRkcjsJCS8vtdjWtworICB1aW50MTYgdGhpc19vZmZzZXQ7CS8v0rPGq9LGzrsKKyAgdWludDggY3JjWzJdOyAJCS8vbGVuPTgKK30gc3BfbGFzdF90cmFuc2R0bF90OworCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzIgdHJhbnNhZGRyOwkJLy+12Na3CisgIHVpbnQxNiB0aGlzX29mZnNldDsJLy/Ss8ar0sbOuworICB1aW50OCBjcmNbMl07IAkJLy9sZW49OAorfSBzcF91bmNvbmZpcm1fdHJhbnNkdGxfdDsKKworLy/P+7fR0MXPogordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyIGZyZWVfdXNlZF9udW07IC8v0tHD4rfRyrnTw7zGwb8otaXOuzoxMDBtbCkKKworICB1aW50OCBzdGFydHRpbWVbNl07ICAJLy/Lor+oyrG85AorICAvKs/Iv9u/7rrzs/bLriovCisgIHVpbnQxNiBwcmVwYWlkX251bTsJLy+1pbTOv8nTw7zGwb8otaXOuzoxMDBtbCkKKyAgdWludDE2IHByZXBhaWRfYW10OwkvL7WltM7UpLi2vfDHrgorCisgIHVpbnQxNiBwYWlkX251bTsgCQkvL8DbvMa/ydPDvMbBvyi1pc67OjEwMG1sKQorICB1aW50MTYgcGFpZF9zdW07ICAJLy/A27zG1qe4tr3wtu4KKyAgdWludDE2IHVzZWRfbnVtOyAJCS8v0tHKudPDvMbBvyi1pc67OjEwMG1sKQorfSBzcF9wdXJjaGFzZV90OworCisvL7b+zqzC69DFz6IKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNoYXIgcXJjb2RlX3VybFszMl07IAkvLy+2/s6swuu2zMLrCisgIHVpbnQzMiBzdGFydHRpbWU7CQkvL7b+zqzC67+qyrzKsbzkCisgIHVpbnQzMiBub3d0aW1lOwkJLy+2/s6swuu1scewyrG85AorICB1aW50MzIgdmFsaWR0aW1lOwkJLy+2/s6swuvT0NCnyrG85AorICB1aW50OCBhdXRoc3RhdHVzOwkJLy/Tw7unyLfIz9e0zKyjqDAtzrTIt8jPo6wxLdLRyLfIz6OpCisgIHVpbnQ4IHBheXN0YXR1czsJCS8v1qe4tte0zKyjqDAttP3Wp7i2o6wgMS3S0danuLajrCAyLbT6v9ujrDMgLSC52LHVo6kKKyAgdWludDggcGFpZEFtb3VudDsJCS8vtbG2qbWlysfS0danuLbXtMyso6y3tbvY1qe4trPJuaa98LbuIKOsILfx1PLKxyAwCit9IHNwX3FyY29kZV90OworCisvL8nosbiyzsr9Cit0eXBlZGVmIHN0cnVjdAoreworICB1aW50OCBkZXZfb2ZmbGluZV9tYXhob3VyOwkvL8nosbjN0bv61+6087mk1/fKsbzkKNChyrEpLDAtsrvP3tbGLDE2OC3ErMjPyrG85AorICB1aW50OCBmbG93c2Vuc29yX3VuaXQ7IAkJLy8xMDBtbLbU06bC9rPlyv0KKyAgdWludDggaHdWZXJbMTZdOwkJCQkvL8nosbiw5rG+usUKKyAgdWludDggZGV2aWNlS2V5WzhdOwkJCQkvL8nosbi5pNf3w9jUvworICB1aW50OCB3b3JrX21vZGU7CQkJCS8vyeixuLmk1/fXtMysCit9IHNwX3N5c2NvbmZfdDsKKworCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50OCB0YWdfdHlwZTsKKyAgdWludDggY3VyX3N0YXRlOworICB1aW50OCBzbnJbOF07CisgIHVpbnQzMiBmaXJzdHRpY2s7CS8vyte0zrbBv6jKsbzkCisgIHVpbnQzMiBsYXN0dGljazsJLy/X7rrztsG/qMqxvOQKK30gc3BfY2FyZHN0YXRlX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQ4IGN1cnJlbnRfc3RhdGU7CS8vtbHHsLmk1/fXtMysCisgIHVpbnQxNiBlcnJjb2RlOworICB1aW50MzIgdGljazsKKyAgdWludDggbGFzdF9zdGF0ZTsJCS8vyc/Su7TO17TMrAorCisgIHVpbnQ4IHBhdXNlX3N0YXR1czsJLy/Tw7unyrnTw9e0zKyjrDAtLcq508PW0KOsITAtLdTdzaMKKyAgdWludDMyIHBhdXNlX3RpY2s7CQkvL9TdzaPKsbXEyrG85AorfSBzcF9jYXJkd29ya3N0YXRlX3Q7CisKKy8vy66/2Mb3yeixuNDFz6IKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQ4IGxpbmtfc3RhdDsJCQkvLzAtLcG0wre5pNf31tCjrDEtLS3BtMK3v8nTwworICB1aW50OCBsb2FkX3BhcmFfc3RhdHVzOwkvLzAtLdX9s6OjrCEwLS207c7zCisgIHVpbnQ4IGRldmljZW5vOworICB1aW50OCBsb2NhbF9kZXZpY2VubzsJCQorICB1aW50OCBkZXZwaHlpZFs0XTsKKworICBzcF9jYXJkc3RhdGVfdCBjYXJkU3RhdGU7CisgIHNwX3N5c2NvbmZfdCBzeXNjb25mOworICBzcF9jb21tX3N0YXR1c190IGxhc3RfY29tbV9zdGF0dXM7CisgIHNwX2hlYXJ0YmVhdF90IGhlYXJ0YmVhdDsKKyAgc3BfbG9naW5fdCBkZXZsb2dpbjsKKyAgc3BfbGFzdF90cmFuc2R0bF90IGxhc3RfdHJhbnNkdGw7CisgIHNwX3VuY29uZmlybV90cmFuc2R0bF90IHVuY29uZmlybV90cmFuc2R0bDsKKworICBzcF9wYXltb2RlX2UgcGF5bW9kZTsKKyAgc3BfcHVyY2hhc2VfdCBwdXJjaGFzZTsKK30gc3BfcG9zX3Q7CisKKy8vt9HCytDFz6IKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQ4IGZlZV9zdGFydDsJLy9UsNm6wcn9v6rKvDsKKyAgdWludDggZmVlX3VuaXQ7CS8vtaW0zr/bt9G/ydPDwffBv6OotaXOuzoxMDBtbKOpCisgIHVpbnQ4IGZlZV9hbXQ7CS8vtaW0zr/bt9G98Lbuo6zS1LfWzqq1pc67Cit9IHNwX2ZlZXBhcmFfdDsKKworLy+/qL3hubnQxc+iCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50OCBjYXJkcGh5aWRbNF07CisgIHVpbnQ4IGNpdGl6ZW5fY2FyZG5vWzEyXTsJLy/K0MPxusUKKyAgdWludDggY2FyZHR5cGU7CisgIHVpbnQ4IGV4cGlyZWRhdGVbNF07CisKKyAgdWludDggd2F0ZXJsaW1pdDsJCS8vtaW0zrP2y67Jz8/eo6gxMDBtbKOpCisgIHVpbnQ4IGJpbGxub1sxMF07CQkvL7270te2qbWlseC6xSxCQ0TC6worICBzcF9xcmNvZGVfdCBxcmNvZGU7CS8vtv7OrMLrCisgIHNwX2ZlZXBhcmFfdCBmZWVwYXJhOworfSBzcF9jYXJkX3Q7CisKKyNwcmFnbWEgcGFjayhwb3ApCisKK3R5cGVkZWYgZW51bQoreworICBIRUFSVF9JTklUID0gMCwKKyAgSEVBUlRfU0VORCA9IDEsCisgIEhFQVJUX1JFQ1YgPSAyCit9IHNwX2hlYXJ0X3N0YXR1c190OworCit0eXBlZGVmIGVudW0KK3sKKyAgVEFHX1RZUEVfVU5LT05XTiA9IDAsICAJLy/OtNaqv6jA4NDNCisgIFRBR19UWVBFX00xLCAgICAgICAgIAkJLy9NMb+oCisgIFRBR19UWVBFX0NQVSAgICAgICAgIAkJLy9DUFW/qAorfSBzcF9jYXJkVGFnX3R5cGU7CisKK3R5cGVkZWYgZW51bQoreworICBTVEFURV9OT05FID0gMCwKKyAgU1RBVEVfRVhJU1QsCisgIFNUQVRFX0VSUk9SPTB4RkYKK30gc3BfY2FyZFN0YXRlX3R5cGU7CisKK3R5cGVkZWYgZW51bQoreworICBDQVJEV09SS1NUQVRVU19OT05FID0gMCwKKyAgQ0FSRFdPUktTVEFUVVNfUkVBRFksCisgIENBUkRXT1JLU1RBVFVTX1dPUktJTkcsCisgIENBUkRXT1JLU1RBVFVTX1dPUktJTkdfV0lUSE9VVENBUkQsCisgIENBUkRXT1JLU1RBVFVTX1BBVVNFLAorICBDQVJEV09SS1NUQVRVU19TVE9QUElORywKKyAgQ0FSRFdPUktTVEFUVVNfU1RPUFBFRCwKKyAgQ0FSRFdPUktTVEFUVVNfVEFLRU9GRiwKKyAgQ0FSRFdPUktTVEFUVVNfV09SS0VSUk9SLAorICBDQVJEV09SS1NUQVRVU19GRUVDQVJEX1dPUktJTkcsCisgIENBUkRXT1JLU1RBVFVTX1NFVF9ERVYsCisgIENBUkRXT1JLU1RBVFVTX0VSUk9SPTB4ZmYKK30gc3BfY2FyZFdvcmtTdGF0ZV90eXBlOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9jb25zdGFudC5oIGIvc3Vwd2lzZG9tL3NwX2NvbnN0YW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4MWZjMAotLS0gL2Rldi9udWxsCisrKyBiL3N1cHdpc2RvbS9zcF9jb25zdGFudC5oCkBAIC0wLDAgKzEsNTggQEAKKyNpZm5kZWYgX1NQX0NPTlNUQU5UX0hfCisjZGVmaW5lIF9TUF9DT05TVEFOVF9IXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIFJDX0NQVV9GSUxFTk9URk9VTkQgMHg2QTgyCisjZGVmaW5lIFJDX0NQVV9SRUNPUkROT1RGT1VORCAweDZBODMKKyNkZWZpbmUgUkNfQ1BVX05PTUFDICAgICAgICAweDk0MDYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgUkNfU1VDQ0VTUyAJCQkJCQkwIAkvLyCzybmmCisjZGVmaW5lIFJDX1BTQU1fRVJSCQkJCQkJMSAgIC8vU0FNuLTOu8qnsNwKKyNkZWZpbmUgUkNfQ0FSRF9MT0dJTgkJCQkJMgkvL9Hp1qTD3NS/yqew3AorI2RlZmluZSBSQ19DQVJEX1JFQUQJCQkJCTMJLy+2wb+oyqew3AorI2RlZmluZSBSQ19DQVJEX1dSSVRFCQkJCQk0CS8v0LS/qMqnsNwKKyNkZWZpbmUgUkNfRkxBU0hfRVJSCQkJCQk1CS8vRkxBU0i07c7zCisjZGVmaW5lIFJDX0hBUkRXQVJFX0VSUgkJCQkJNiAgLy/Tsrz+vNPU2LTtzvMKKyNkZWZpbmUgUkNfRkxBU0hfTk9fUklHSFQJCQkJNyAvL7fHv8nQtGZsYXNoCisKKyNkZWZpbmUgUkNfQ0FSRF9OT1JJR0hUIAkJCQkxMQkvL7+ozt7IqM/eCisjZGVmaW5lIFJDX0NBUkRfRVhQSVJFRAkJCQkJMTIgCS8vuf3G2r+oCisjZGVmaW5lIFJDX0NBUkRfQVVUSEVOVElDQVRJT04JCQkxMwkvL7+oyM/WpMqnsNwKKyNkZWZpbmUgUkNfQ0FSRF9MT1NUCQkJCQkxNAkvL7raw/u1pb+oCisjZGVmaW5lIFJDX0NBUkROT19FWENFUFQJCQkJMTcJLy+/qLrF0uyzoworI2RlZmluZSBSQ19DQVJEX1RJTUVPVVQJCQkJCTE4CS8vyrnTw8qxvOTMq7OkCisjZGVmaW5lIFJDX0NBUkRCQUxfRVhDRVBUCQkJCTE5CS8vv6jT4Lbu0uyzoworI2RlZmluZSBSQ19DQVJEQkFMX0xBQ0sJCQkJCTIwCS8vv6jT4LbusrvX4worCisjZGVmaW5lIFJDX0RFVlBIWUlEX05PVFNFVAkJCQkyMSAJLy/J6LG4tdjWt860yejWwworI2RlZmluZSBSQ19GRUVSQVRFX05PVFNFVAkJCQkyMiAJLy+30cLKzrSz9cq8u68KKyNkZWZpbmUgUkNfREVWX09GRkxJTkVfRVJST1IJCQkyMyAgLy8gyeixuM3Ru/q5pNf3zKuzpAorI2RlZmluZSBSQ19GSUxFMDlfQ1JDX0VSUgkJCQkyNQkvLy8vvMfCvENSQ7TtzvMKKyNkZWZpbmUgUkNfRklMRTEwX0NSQ19FUlIJCQkJMjYgCS8vy66/2MeusPxDUkO07c7zCisjZGVmaW5lIFJDX0NBUkRfSU5WQUxJRAkJCQkJMjcJLy/O3tCnv6gKKyNkZWZpbmUgUkNfRkVFTlVNX0VSUk9SCQkJCQkyOAkvL7fRwsq49sr9tO3O8worI2RlZmluZSBSQ19OT1RTVVBQT1JUCQkJCQkyOQkvL7K71qez1gkJCisjZGVmaW5lIFJDX05PVF9TQU1FX0NBUkQJCQkJMzAJLy+yu82sv6gKKworI2RlZmluZSBSQ19NT0RFX05PVF9TVVBQT1JUCQkJCTQyCS8vz/u30cSjyr2yu9ans9YKKyNkZWZpbmUgUkNfVVBEUFJPR19FUlIJCQkJCTQzCS8vyf28tsqnsNwKKworI2RlZmluZSBSQ19DT05GUEFSQV9DUkNfRVJSICAgCQkJNTUgIC8vxeTWw7LOyv1jcmO07c7zCisjZGVmaW5lIFJDX1RSQU5TRFRMX0ZVTEwJCQkJNTgJLy8JwffLrtLRwvoKKyNkZWZpbmUgUkNfVFJBTlNEVExfTk9fRVJSCQkJCTU5CS8vwffLrrrF0uyzoworI2RlZmluZSBSQ19ERVZJQ0VOT19PVVQJCQkJCTYwCS8vILv6usW5/bTzCisKKyNkZWZpbmUgUkNfUVJDT0RFX0ZBSUxVUkUJCQkJNjEJLy+2/s6swuu78cihyqew3AorI2RlZmluZSBSQ19RUkNPREVfVElNRU9VVAkJCQk2MgkvL7b+zqzC67OsyrEKKyNkZWZpbmUgUkNfUVJDT0RFX1FVRVJZX0ZBSUwJCQk2MwkvL7b+zqzC68jP1qTKp7DcCisKKyNkZWZpbmUgUkNfREVWX0xPR0lOX0ZBSUwJCQkJNjQJLy/J6LG4tcfCvMqnsNwKKyNkZWZpbmUgUkNfREVWX05PVF9MT0dJTgkJCQk2NQkvL8nosbjOtMeptb0KKyNkZWZpbmUgUkNfREVWX0ZBVUxUCQkJCQk2NiAgLy/J6LG40snLxrnK1c8KKyNkZWZpbmUgUkNfREVWX05PU0VUX0ZMT1dTRU5TT1JfVU5JVAk2NyAgLy/J6LG4wffBv7zGy+O1pc67zrTJ6NbDCisjZGVmaW5lIFNUQVRVU19LRUVQT1BFTgkJCQkJMQkvL7Ojv6q/qAorI2RlZmluZSBTVEFUVVNfQ0xPU0VECQkJCQkwCS8vyKHP+7Ojv6q/qAorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3Vwd2lzZG9tL3NwX2NvbnN1bWUuYyBiL3N1cHdpc2RvbS9zcF9jb25zdW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg3ZTJhNAotLS0gL2Rldi9udWxsCisrKyBiL3N1cHdpc2RvbS9zcF9jb25zdW1lLmMKQEAgLTAsMCArMSw3MjkgQEAKKyNpbmNsdWRlICJzcF91dGlsLmgiCisjaW5jbHVkZSAic3BfY29uc3RhbnQuaCIKKyNpbmNsdWRlICJzcF9kaXNwbGF5LmgiCisjaW5jbHVkZSAic3BfZmxhc2guaCIKKyNpbmNsdWRlICJzcF9jYXJkLmgiCisjaW5jbHVkZSAic3BfZGVzLmgiCisjaW5jbHVkZSAic3BfbXNncGFjay5oIgorI2luY2x1ZGUgInNwX21lbnUuaCIKKyNpbmNsdWRlICJzcF9kYXRhLmgiCisjaW5jbHVkZSAic3BfY29uc3VtZS5oIgorI2luY2x1ZGUgInNwX2NvbW11bmljYXRlLmgiCisKK3N0YXRpYyBpbnQgY291bnQgPSAwOworc3RhdGljIHVpbnQxNiBzcF9jYWxjX3BheWFtdF9ieV9mbG93c2Vuc29yKHNwX3Bvc190KiBwb3MsIHNwX2NhcmRfdCogY2FyZCkKK3sKKyAgdWludDMyIHVzZWRjb3VudCA9IDA7CisKKyAgaWYocG9zLT5wdXJjaGFzZS5wYWlkX251bSA8IDEpCisgIHsKKyAgICAvL8rXz8jUpL/b0ruxygorICAgIGlmKGNhcmQtPmZlZXBhcmEuZmVlX3N0YXJ0ID4gMCkKKyAgICB7CisgICAgICAvL8ewbsuuw+K30QorICAgICAgcG9zLT5wdXJjaGFzZS5wcmVwYWlkX251bSA9IGNhcmQtPmZlZXBhcmEuZmVlX3N0YXJ0OworICAgICAgcG9zLT5wdXJjaGFzZS5wcmVwYWlkX2FtdCA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwb3MtPnB1cmNoYXNlLnByZXBhaWRfbnVtID0gY2FyZC0+ZmVlcGFyYS5mZWVfdW5pdDsKKyAgICAgIHBvcy0+cHVyY2hhc2UucHJlcGFpZF9hbXQgPSBjYXJkLT5mZWVwYXJhLmZlZV9hbXQ7CisgICAgfQorICAgIHBvcy0+cHVyY2hhc2UudXNlZF9udW0gPSAwOworICAgIHJldHVybiAwOworICB9CisgIC8vdXNlZGNvdW50ID0gc3BfZmxvd3NlbnNvcl9nZXRfY291bnQoKS9wb3MtPnN5c2NvbmYuZmxvd3NlbnNvcl91aW50OworICB1c2VkY291bnQgPSBjb3VudC9wb3MtPnN5c2NvbmYuZmxvd3NlbnNvcl91bml0OworICBjb3VudCsrOworICBpZih1c2VkY291bnQgPCBwb3MtPnB1cmNoYXNlLnBhaWRfbnVtKQorICB7CisgICAgLy/Du9PQtO+1vb/bt9HB98G/CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcG9zLT5wdXJjaGFzZS51c2VkX251bSA9IHBvcy0+cHVyY2hhc2UucGFpZF9udW07CisgIHBvcy0+cHVyY2hhc2UucHJlcGFpZF9udW0gPSBjYXJkLT5mZWVwYXJhLmZlZV91bml0OworICBwb3MtPnB1cmNoYXNlLnByZXBhaWRfYW10ID0gY2FyZC0+ZmVlcGFyYS5mZWVfYW10OworICByZXR1cm4gMDsKK30KKworLy+8x9XLxKPKvc/7t9EKK3VpbnQxNiBzcF9hY2NvdW50X3B1cmNoYXNlKHVpbnQxNiBhbW91bnQpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdWludDggZ1BJQ0NfU05SWzRdOwkJCSAgIC8qIL+oxqxTTrrFICovCisKK3ZvaWQgc3BfdGVzdF9jYXJkX3N0YXRlKHNwX3Bvc190KiBwb3MsIHNwX2NhcmR3b3Jrc3RhdGVfdCogY2FyZFdvcmtTdGF0ZSwgdWludDMyIHRpY2spCit7CisgIHVpbnQ4IHJldCA9IDA7CisgIHNwX2NhcmRfdCBjYXJkcGNkOworICBzd2l0Y2gocG9zLT5jYXJkU3RhdGUuY3VyX3N0YXRlKQorICB7CisgIGNhc2UgU1RBVEVfTk9ORToKKyAgICBNRU1DTEVBUigmY2FyZHBjZCwgc2l6ZW9mKGNhcmRwY2QpKTsKKyAgICBpZihzcF9jYXJkX3JlcXVlc3QoJmNhcmRwY2QpID09IDApCisgICAgeworICAgICAgTUVNQ1BZKHBvcy0+Y2FyZFN0YXRlLnNuciwgY2FyZHBjZC5jYXJkcGh5aWQsIHNpemVvZihjYXJkcGNkLmNhcmRwaHlpZCkpOworICAgICAgTUVNQ1BZKGdQSUNDX1NOUiwgY2FyZHBjZC5jYXJkcGh5aWQsIHNpemVvZihjYXJkcGNkLmNhcmRwaHlpZCkpOworICAgICAgcG9zLT5jYXJkU3RhdGUudGFnX3R5cGUgPSBjYXJkcGNkLmNhcmR0eXBlOworICAgICAgcG9zLT5jYXJkU3RhdGUuY3VyX3N0YXRlID0gU1RBVEVfRVhJU1Q7CisgICAgICBwb3MtPmNhcmRTdGF0ZS5maXJzdHRpY2sgPSB0aWNrOworICAgICAgcG9zLT5jYXJkU3RhdGUubGFzdHRpY2sgPSB0aWNrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgY2FyZFdvcmtTdGF0ZS0+ZXJyY29kZSA9IFJDX0NBUkRfSU5WQUxJRDsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgU1RBVEVfRVhJU1Q6CisgICAgLy+87LLiv6jKx7fxvMzQ+LTm1NoKKyAgICBpZihwb3MtPmNhcmRTdGF0ZS50YWdfdHlwZSA9PSBUQUdfVFlQRV9DUFUpCisgICAgeworICAgICAgcmV0ID0gc3BfY2hlY2tfY3B1X2V4aXN0KCk7CisgICAgICBpZihyZXQpCisgICAgICB7CisgICAgICAgIHBvcy0+Y2FyZFN0YXRlLmN1cl9zdGF0ZSA9IFNUQVRFX05PTkU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBtZW1jcHkocG9zLT5jYXJkU3RhdGUuc25yLCBnUElDQ19TTlIsIDgpOworICAgICAgICBwb3MtPmNhcmRTdGF0ZS5sYXN0dGljayA9IHRpY2s7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHBvcy0+Y2FyZFN0YXRlLmN1cl9zdGF0ZSA9IFNUQVRFX05PTkU7CisgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHVpbnQxNiBzcF9kZXZfY29uZmlnX2NoZWNrKGNvbnN0IHNwX3Bvc190KiBwb3MpCit7CisgIHVpbnQ4IGRldnBoeWlkWzRdOworICBNRU1DTEVBUihkZXZwaHlpZCwgc2l6ZW9mKGRldnBoeWlkKSk7CisgIGlmKE1FTUNNUChwb3MtPmRldnBoeWlkLCBkZXZwaHlpZCwgc2l6ZW9mKGRldnBoeWlkKSkgPT0gMCkKKyAgeworICAgIHJldHVybiBSQ19ERVZQSFlJRF9OT1RTRVQ7CisgIH0KKyAgaWYocG9zLT5kZXZsb2dpbi5sb2dpbl9mbGFnICE9IDEpCisgIHsKKyAgICByZXR1cm4gUkNfREVWX05PVF9MT0dJTjsKKyAgfQorICBpZihwb3MtPnN5c2NvbmYud29ya19tb2RlID09IDkpCisgIHsKKyAgICByZXR1cm4gUkNfREVWX0ZBVUxUOworICB9CisgIGlmKHBvcy0+c3lzY29uZi5mbG93c2Vuc29yX3VuaXQgPT0gMCkKKyAgeworICAgIHJldHVybiBSQ19ERVZfTk9TRVRfRkxPV1NFTlNPUl9VTklUOworICB9CisgIHJldHVybiAwOworfQorCisvL7bByKG12tK7scrOtMnPtKvB98uuz/u30cjVxtrKsbzkCitzdGF0aWMgdWludDggc3BfcmVhZF91bmNvbmZpcm1fZmlyc3RfcmVjb3JkKHVpbnQ4IHRlcm10aW1lWzZdKQoreworICByZXR1cm4gMTsKK30KKworc3RhdGljIHVpbnQxNiBzcF9kZXZfb2ZmbGluZV9jaGVjayhjb25zdCBzcF9wb3NfdCogcG9zKQoreworICB1aW50OCByZXQ7CisgIHVpbnQ4IHJlY29yZF90ZXJtdGltZVs2XTsKKyAgdWludDggY3RpbWVbNl07CisgIGludDMyIG5vd3RpbWU7CisgIGludDMyIGR0bHRpbWU7CisKKyAgaWYocG9zLT5zeXNjb25mLmRldl9vZmZsaW5lX21heGhvdXIgPT0gMCkKKyAgeworICAgIHJldHVybiAwOworICB9CisgIG1lbXNldChyZWNvcmRfdGVybXRpbWUsMCxzaXplb2YocmVjb3JkX3Rlcm10aW1lKSk7CisgIHJldCA9IHNwX3JlYWRfdW5jb25maXJtX2ZpcnN0X3JlY29yZChyZWNvcmRfdGVybXRpbWUpOworICBpZihyZXQpCisgIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzcF9nZXRfYmNkdGltZShjdGltZSk7CisgIG5vd3RpbWUgPSBmb3JtYXRfdGltZV9jb3ZlcnRfc2VjcyhjdGltZSk7CisgIGR0bHRpbWUgPSBmb3JtYXRfdGltZV9jb3ZlcnRfc2VjcyhyZWNvcmRfdGVybXRpbWUpOworCisgIC8qKgorICAqwffLrsqxvOS089PayeixuMqx1tPH0rOsuf0yNNChyrEKKyAgKiovCisgIGlmKChkdGx0aW1lID4gbm93dGltZSkgJiYKKyAgICAgICgoZHRsdGltZSAtIG5vd3RpbWUpID4gKDI0KjYwKkRFTEFZX1RJTUU2MHMpKSkKKyAgeworICAgIGlmKHNwX3ZhbHZlX3N0YXRlKCkpCisgICAgeworICAgICAgc3BfdmFsdmVfb2ZmKCk7CisgICAgfQorICAgIHJldHVybiBSQ19ERVZfT0ZGTElORV9FUlJPUjsKKyAgfQorICAvKioKKyAgKsH3y67Ksbzk0KHT2snosbjKsdbTx9KzrLn949DWtQorICAqKi8KKyAgaWYoKGR0bHRpbWUgPCBub3d0aW1lKSAmJgorICAgICAgKChub3d0aW1lIC0gZHRsdGltZSkgPiAocG9zLT5zeXNjb25mLmRldl9vZmZsaW5lX21heGhvdXIqMzYwMCkpKQorICB7CisgICAgaWYoc3BfdmFsdmVfc3RhdGUoKSkKKyAgICB7CisgICAgICBzcF92YWx2ZV9vZmYoKTsKKyAgICB9CisgICAgcmV0dXJuIFJDX0RFVl9PRkZMSU5FX0VSUk9SOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdWludDE2IHNwX2NhcmRfdmFsaWRfY2hlY2soY29uc3Qgc3BfY2FyZF90KiBjYXJkKQoreworICB1aW50OCBjdGltZVs2XTsKKyAgLyoKKyAgaWYoY2FyZC0+Y2FyZG5vIDwgMSkKKyAgeworICAgIHJldHVybiBSQ19DQVJETk9fRVhDRVBUOworICB9CisgICovCisgIHNwX2dldF9iY2R0aW1lKGN0aW1lKTsKKyAgaWYobWVtY21wKGNhcmQtPmV4cGlyZWRhdGUgKzEsIGN0aW1lLCAzKSA8IDApCisgIHsKKyAgICByZXR1cm4gUkNfQ0FSRF9FWFBJUkVEOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdWludDE2IHNwX2NoZWNrX2Rldihjb25zdCBzcF9wb3NfdCogcG9zKQoreworICB1aW50MTYgcmV0ID0gMDsKKyAgdWludDggY3RpbWVbNl07CisgIE1FTUNMRUFSKGN0aW1lLCBzaXplb2YoY3RpbWUpKTsKKyAgc3BfZ2V0X2JjZHRpbWUoY3RpbWUpOworICBpZihwb3MtPmxvYWRfcGFyYV9zdGF0dXMpCisgIHsKKyAgICByZXR1cm4gcG9zLT5sb2FkX3BhcmFfc3RhdHVzOworICB9CisgIHJldCA9IHNwX2Rldl9jb25maWdfY2hlY2socG9zKTsKKyAgaWYocmV0KQorICB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXQgPSBzcF9kZXZfb2ZmbGluZV9jaGVjayhwb3MpOworICBpZihyZXQpCisgIHsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50MTYgZG9faWRsZShzcF9wb3NfdCogcG9zKQoreworICB1aW50OCBjdGltZVs2XTsKKyAgTUVNQ0xFQVIoY3RpbWUsIHNpemVvZihjdGltZSkpOworICBzcF9nZXRfYmNkdGltZShjdGltZSk7CisgIHNob3dfaG9tZShwb3MpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQxNiBkb19uZXcoc3BfcG9zX3QqIHBvcywgc3BfY2FyZF90KiBjYXJkKQoreworICB1aW50MTYgcmV0ID0gMDsKKyAgc3BfdHJhbnNkdGxfdCByZWNvcmQ7CisgIE1FTUNMRUFSKCZyZWNvcmQsIHNpemVvZihyZWNvcmQpKTsKKyAgY2FyZC0+Y2FyZHR5cGUgPSBwb3MtPmNhcmRTdGF0ZS50YWdfdHlwZTsKKyAgTUVNQ1BZKGNhcmQtPmNhcmRwaHlpZCwgcG9zLT5jYXJkU3RhdGUuc25yLCA0KTsKKyAgcmV0ID0gc3BfY2FyZF9yZWFkKGNhcmQpOworICBpZihyZXQpCisgIHsKKyAgICByZXQgPSBSQ19DQVJEX0lOVkFMSUQ7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXQgPSBzcF9jYXJkX2F1dGhlbnRpY2F0aW9uKHBvcywgY2FyZCk7CisgIGlmKHJldCkKKyAgeworICAgIHJldCA9IFJDX0NBUkRfQVVUSEVOVElDQVRJT047CisgICAgcmV0dXJuIHJldDsKKyAgfQorICBpZihwb3MtPmxvYWRfcGFyYV9zdGF0dXMpCisgIHsKKyAgICByZXR1cm4gcG9zLT5sb2FkX3BhcmFfc3RhdHVzOworICB9CisgIHJldCA9IHNwX2Rldl9jb25maWdfY2hlY2socG9zKTsKKyAgaWYocmV0KQorICB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXQgPSBzcF9kZXZfb2ZmbGluZV9jaGVjayhwb3MpOworICBpZihyZXQpCisgIHsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgcmV0ID0gc3BfY2FyZF92YWxpZF9jaGVjayhjYXJkKTsKKyAgaWYocmV0KQorICB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXQgPSBzcF9wcmVwYXJlX2JlaGFsZl90cmFuc2R0bChwb3MsIGNhcmQsICZyZWNvcmQpOworICBpZihyZXQpCisgIHsKKyAgICByZXR1cm4gcmV0OworICB9CisgIHBvcy0+c3lzY29uZi53b3JrX21vZGUgPSAxOworICBwb3MtPnBheW1vZGUgPSBQQVlNT0RFX0NBUkQ7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdWludDE2IGRvX3N0YXJ0KHNwX3Bvc190KiBwb3MpCit7CisgIE1FTUNMRUFSKCZwb3MtPnB1cmNoYXNlLHNpemVvZihzcF9wdXJjaGFzZV90KSk7CisgIHNwX2Zsb3dzZW5zb3JfY291bnRfY2xlYXIoKTsKKyAgc3BfZ2V0X2JjZHRpbWUocG9zLT5wdXJjaGFzZS5zdGFydHRpbWUpOworICBzcF92YWx2ZV9vbigpOworICBzaG93X21vbmV5KHBvcywgcG9zLT5wdXJjaGFzZS5wYWlkX3N1bSk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdWludDE2IGRvX3dvcmtfY2hlY2soY29uc3Qgc3BfcG9zX3QqIHBvcykKK3sKKyAgLy/F0LbPz/u30b3wtu7I57n7tPPT2jIwu/LV38Gs0PjP+7fRs6y5/TLQocqxo6zU8s2j1rmz9suuCisgIGlmKHBvcy0+cHVyY2hhc2UudXNlZF9udW0gPj0gMTAwMCB8fCBwb3MtPnB1cmNoYXNlLnBhaWRfc3VtID49IDEwMDApCisgIHsKKyAgICByZXR1cm4gUkNfQ0FSRF9USU1FT1VUOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdWludDE2IGRvX3dvcmsoc3BfcG9zX3QqIHBvcywgc3BfY2FyZF90KiBjYXJkKQoreworICB1aW50MTYgcmV0ID0gMDsKKyAgc3BfdmFsdmVfb24oKTsKKyAgcmV0ID0gZG9fd29ya19jaGVjayhwb3MpOworICBpZihyZXQpCisgIHsKKyAgICByZXR1cm4gcmV0OworICB9CisgIC8vvMbL48/7t9G98LbuCisgIHJldCA9IHNwX2NhbGNfcGF5YW10X2J5X2Zsb3dzZW5zb3IocG9zLCBjYXJkKTsKKyAgaWYocmV0KQorICB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICBpZihwb3MtPnB1cmNoYXNlLnByZXBhaWRfYW10ID4gMCkKKyAgeworICAgIC8vxKzIz7zH1cvEo8q9CisgICAgcmV0ID0gc3BfYWNjb3VudF9wdXJjaGFzZShwb3MtPnB1cmNoYXNlLnByZXBhaWRfYW10KTsKKyAgICBpZihyZXQpCisgICAgeworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgIH0KKworICBpZihwb3MtPnB1cmNoYXNlLnByZXBhaWRfbnVtID4gMCkKKyAgeworICAgIHBvcy0+cHVyY2hhc2UucGFpZF9udW0gKz0gcG9zLT5wdXJjaGFzZS5wcmVwYWlkX251bTsKKyAgICBwb3MtPnB1cmNoYXNlLnBhaWRfc3VtICs9IHBvcy0+cHVyY2hhc2UucHJlcGFpZF9hbXQ7CisgICAgcG9zLT5wdXJjaGFzZS5wcmVwYWlkX251bSA9IDA7CisgICAgcG9zLT5wdXJjaGFzZS5wcmVwYWlkX2FtdCA9IDA7CisgIH0KKyAgc2hvd19tb25leShwb3MsIHBvcy0+cHVyY2hhc2UucGFpZF9zdW0pOworICByZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQxNiBkb19zdG9wKHNwX3Bvc190KiBwb3MsIHNwX2NhcmRfdCogY2FyZCkKK3sKKyAgdWludDE2IHJldDsKKyAgc3BfdHJhbnNkdGxfdCByZWNvcmQ7CisgIHNwX3ZhbHZlX29mZigpOworCisgIGlmKHBvcy0+cHVyY2hhc2UucGFpZF9udW0gPiAwKQorICB7CisgICAgTUVNQ0xFQVIoJnJlY29yZCwgc2l6ZW9mKHJlY29yZCkpOworICAgIHJldCA9IHNwX3ByZXBhcmVfYmVsb3dfdHJhbnNkdGwocG9zLCBjYXJkLCAmcmVjb3JkKTsKKyAgICBpZihyZXQpCisgICAgeworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgIH0KKyAgcG9zLT5wYXltb2RlID0gUEFZTU9ERV9JTklUOworICBwb3MtPnN5c2NvbmYud29ya19tb2RlID0gMDsKKyAgY291bnQgPSAwOworICBNRU1DTEVBUigmcG9zLT5wdXJjaGFzZSwgc2l6ZW9mKHNwX3B1cmNoYXNlX3QpKTsKKyAgTUVNQ0xFQVIoY2FyZCwgc2l6ZW9mKHNwX2NhcmRfdCkpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZG9fcGF1c2Uoc3BfcG9zX3QqIHBvcykKK3sKKyAgY2hhciBtc2dbMTddOworICBNRU1DTEVBUihtc2csIHNpemVvZihtc2cpKTsKKyAgc3BfdmFsdmVfb2ZmKCk7CisgIGlmKHBvcy0+cHVyY2hhc2UucGFpZF9zdW0gPiAwKQorICB7CisgICAgc3ByaW50Zihtc2csIrmyvMYgJTAuMmbUqiIscG9zLT5wdXJjaGFzZS5wYWlkX3N1bS8xMDAuMGYpOworICAgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsIr3hyvi8xrfRIixtc2csREVMQVlfVElNRTJzKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCK94cr4vMa30SIsIsPit9HKudPDIixERUxBWV9USU1FMnMpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGRvX2Vycm9yKHNwX3Bvc190KiBwb3MsIHVpbnQxNiBlcnJjb2RlKQoreworICBpZihlcnJjb2RlKQorICB7CisgICAgc2hvd19lcnJvcihwb3MsIrLZ1/fKp7DcOiIsZXJyY29kZSk7CisgICAgcG9zLT5wYXltb2RlID0gUEFZTU9ERV9JTklUOworICAgIHBvcy0+c3lzY29uZi53b3JrX21vZGUgPSAwOworICAgIGNvdW50ID0gMDsKKyAgICBNRU1DTEVBUigmcG9zLT5wdXJjaGFzZSwgc2l6ZW9mKHNwX3B1cmNoYXNlX3QpKTsKKyAgfQorfQorCitzdGF0aWMgdWludDE2IHNwX2NhcmRfZXhpc3RfaGFuZGxlKHNwX3Bvc190KiBwb3MsIHNwX2NhcmRfdCogY2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BfY2FyZHdvcmtzdGF0ZV90KiBjYXJkV29ya1N0YXRlKQoreworICB1aW50MTYgcmV0ID0gMDsKKyAgdWludDE2IGVyciA9IDA7CisgIHNwX2NhcmRfdCBjYXJkcGNkOworICBzd2l0Y2goY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZSkKKyAgeworICBjYXNlIENBUkRXT1JLU1RBVFVTX05PTkU6CisgICAgaWYodGltZXJfZ2V0X3RpY2tlcigpIC0gcG9zLT5jYXJkU3RhdGUuZmlyc3R0aWNrIDwgMTUwMCkKKyAgICB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0ID0gZG9fbmV3KHBvcywgY2FyZCk7CisgICAgaWYocmV0KQorICAgIHsKKyAgICAgIGlmKDB4MTAxOCA9PSByZXQgfHwgMHgyMDAxID09IHJldHx8CisgICAgICAgICAgMHgxMDE0ID09IHJldCB8fCAweDEwMzAgPT0gcmV0KQorICAgICAgeworICAgICAgICBpZigwID09IHNwX2NhcmRfcmVxdWVzdCgmY2FyZHBjZCkpCisgICAgICAgIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY2FyZFdvcmtTdGF0ZS0+ZXJyY29kZSA9IHJldDsKKyAgICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfUkVBRFk7CisgICAgYnJlYWs7CisgIGNhc2UgQ0FSRFdPUktTVEFUVVNfUkVBRFk6CisgICAgaWYoTUVNQ01QKHBvcy0+Y2FyZFN0YXRlLnNuciwgY2FyZC0+Y2FyZHBoeWlkLCA0KSAhPSAwKQorICAgIHsKKyAgICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19OT05FOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldCA9IGRvX3N0YXJ0KHBvcyk7CisgICAgaWYocmV0KQorICAgIHsKKyAgICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfV09SS0lORzsKKyAgICBicmVhazsKKyAgY2FzZSBDQVJEV09SS1NUQVRVU19QQVVTRToKKyAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfV09SS0lORzsKKyAgICBicmVhazsKKyAgY2FzZSBDQVJEV09SS1NUQVRVU19XT1JLSU5HOgorICAgIGlmKE1FTUNNUChwb3MtPmNhcmRTdGF0ZS5zbnIsIGNhcmQtPmNhcmRwaHlpZCwgNCkgIT0gMCkKKyAgICB7CisgICAgICByZXQgPSBSQ19OT1RfU0FNRV9DQVJEOworICAgICAgY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZSA9IENBUkRXT1JLU1RBVFVTX1NUT1BQSU5HOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhcmRXb3JrU3RhdGUtPnBhdXNlX3N0YXR1cyA9IDA7CisgICAgcmV0ID0gZG9fd29yayhwb3MsIGNhcmQpOworICAgIGlmKHJldCkKKyAgICB7CisgICAgICBzaG93X2Vycm9yKHBvcywiz/u30cqnsNwiLHJldCk7CisgICAgICBlcnIgPSBkb19zdG9wKHBvcywgY2FyZCk7CisgICAgICBpZihlcnIgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgcmV0ID0gZXJyOworICAgICAgfQorICAgICAgY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZSA9IENBUkRXT1JLU1RBVFVTX0VSUk9SOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmKHBvcy0+cHVyY2hhc2UucGFpZF9udW0gPiBjYXJkLT53YXRlcmxpbWl0KQorICAgIHsKKyAgICAgIGRpc3BfaGludF9pbmZvKHBvcywi0tG077WltM6z9suuyc/P3iIsREVMQVlfVElNRTJzKTsKKyAgICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19TVE9QUElORzsKKyAgICB9CisgICAgY2FyZFdvcmtTdGF0ZS0+cGF1c2VfdGljayA9IHRpbWVyX2dldF90aWNrZXIoKTsKKyAgICBicmVhazsKKyAgY2FzZSBDQVJEV09SS1NUQVRVU19TVE9QUElORzoKKyAgICByZXQgPSBkb19zdG9wKHBvcywgY2FyZCk7CisgICAgaWYocmV0KQorICAgIHsKKyAgICAgIGNhcmRXb3JrU3RhdGUtPmVycmNvZGUgPSByZXQ7CisgICAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfRVJST1I7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZSA9IENBUkRXT1JLU1RBVFVTX1NUT1BQRUQ7CisgICAgYnJlYWs7CisgIGNhc2UgQ0FSRFdPUktTVEFUVVNfU1RPUFBFRDoKKyAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfTk9ORTsKKyAgICBicmVhazsKKyAgY2FzZSBDQVJEV09SS1NUQVRVU19GRUVDQVJEX1dPUktJTkc6CisgICAgaWYoTUVNQ01QKHBvcy0+Y2FyZFN0YXRlLnNuciwgY2FyZC0+Y2FyZHBoeWlkLCA0KSAhPSAwKQorICAgIHsKKyAgICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19OT05FOworICAgICAgYnJlYWs7CisgICAgfQorICAgIC8vc2hvd19tZW51X29wdGlvbnMoKTsKKyAgICBicmVhazsKKyAgY2FzZSBDQVJEV09SS1NUQVRVU19FUlJPUjoKKyAgICBkb19lcnJvcihwb3MsIGNhcmRXb3JrU3RhdGUtPmVycmNvZGUpOworICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19OT05FOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIERlbGF5X21zKERFTEFZX1RJTUUyMDBtcyk7CisgICAgY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZSA9IENBUkRXT1JLU1RBVFVTX05PTkU7CisgICAgYnJlYWs7CisgIH0KKyAgY2FyZFdvcmtTdGF0ZS0+ZXJyY29kZSA9IHJldDsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVpbnQxNiBzcF9jYXJkX25vZXhpc3RfaGFuZGxlKHNwX3Bvc190KiBwb3MsIHNwX2NhcmRfdCogY2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcF9jYXJkd29ya3N0YXRlX3QqIGNhcmRXb3JrU3RhdGUpCit7CisgIC8v09C/qLW9zt6/qAorICB1aW50MTYgcmV0ID0gMDsKKyAgc3dpdGNoKGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUpCisgIHsKKyAgY2FzZSBDQVJEV09SS1NUQVRVU19OT05FOgorICAgIGRvX2lkbGUocG9zKTsKKyAgICBicmVhazsKKyAgY2FzZSBDQVJEV09SS1NUQVRVU19SRUFEWToKKyAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfTk9ORTsKKyAgICBicmVhazsKKyAgY2FzZSBDQVJEV09SS1NUQVRVU19XT1JLSU5HOgorICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19QQVVTRTsKKyAgICBicmVhazsKKyAgY2FzZSBDQVJEV09SS1NUQVRVU19QQVVTRToKKyAgICBpZihNRU1DTVAocG9zLT5jYXJkU3RhdGUuc25yLCBjYXJkLT5jYXJkcGh5aWQsIDQpID09IDApCisgICAgeworICAgICAgLy+/qMTD19/Su7fW1tPWrsTaxKzIz9TdzaPKudPDCisgICAgICBpZigodGltZXJfZ2V0X3RpY2tlcigpIC0gY2FyZFdvcmtTdGF0ZS0+cGF1c2VfdGljaykgPD0gREVMQVlfVElNRTYwcykKKyAgICAgIHsKKyAgICAgICAgaWYoIWNhcmRXb3JrU3RhdGUtPnBhdXNlX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgIGRvX3BhdXNlKHBvcyk7CisgICAgICAgICAgc2hvd19ob21lKHBvcyk7CisgICAgICAgIH0KKyAgICAgICAgc2hvd19ob21lKHBvcyk7CisgICAgICAgIGNhcmRXb3JrU3RhdGUtPnBhdXNlX3N0YXR1cyA9IDE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19TVE9QUElORzsKKyAgICAgICAgY2FyZFdvcmtTdGF0ZS0+cGF1c2Vfc3RhdHVzID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19TVE9QUElORzsKKyAgICAgIGNhcmRXb3JrU3RhdGUtPnBhdXNlX3N0YXR1cyA9IDA7CisgICAgfQorICAgIGNhcmRXb3JrU3RhdGUtPmxhc3Rfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19QQVVTRTsKKyAgICBicmVhazsKKyAgY2FzZSBDQVJEV09SS1NUQVRVU19TVE9QUElORzoKKyAgICByZXQgPSBkb19zdG9wKHBvcywgY2FyZCk7CisgICAgaWYocmV0KQorICAgIHsKKyAgICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfU1RPUFBFRDsKKyAgICBjYXJkV29ya1N0YXRlLT50aWNrID0gdGltZXJfZ2V0X3RpY2tlcigpOworICAgIGJyZWFrOworICBjYXNlIENBUkRXT1JLU1RBVFVTX1NUT1BQRUQ6CisgICAgaWYodGltZXJfZ2V0X3RpY2tlcigpIC0gY2FyZFdvcmtTdGF0ZS0+dGljayA+IERFTEFZX1RJTUUzcykKKyAgICB7CisgICAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfTk9ORTsKKyAgICAgIGNhcmRXb3JrU3RhdGUtPmxhc3Rfc3RhdGUgPSBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlOworICAgICAgY2FyZFdvcmtTdGF0ZS0+dGljayA9IDA7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIENBUkRXT1JLU1RBVFVTX1NFVF9ERVY6CisgICAgaWYoc3BfY2hlY2tfcGFzc3dkKHBvcywgIsnosbi53MDtw9zC6yIsICJceDlceDFceDRceDNceDhceDciKSA9PSAwKQorICAgIHsKKyAgICAgIHNwX21lbnVfb3B0aW9ucyhwb3MpOworICAgIH0KKyAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfTk9ORTsKKyAgICBicmVhazsKKyAgY2FzZSBDQVJEV09SS1NUQVRVU19FUlJPUjoKKyAgICBkb19lcnJvcihwb3MsY2FyZFdvcmtTdGF0ZS0+ZXJyY29kZSk7CisgICAgY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZSA9IENBUkRXT1JLU1RBVFVTX05PTkU7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgRGVsYXlfbXMoREVMQVlfVElNRTIwMG1zKTsKKyAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfTk9ORTsKKyAgICBicmVhazsKKyAgfQorICBjYXJkV29ya1N0YXRlLT5lcnJjb2RlID0gcmV0OworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3BfY2FyZF90IENBUkQ7Cit2b2lkIHNwX2NhcmRfaGFuZGxlKHNwX3Bvc190KiBwb3MsIHNwX2NhcmR3b3Jrc3RhdGVfdCogY2FyZFdvcmtTdGF0ZSkKK3sKKyAgaWYocG9zLT5jYXJkU3RhdGUuY3VyX3N0YXRlKQorICB7CisgICAgc3BfY2FyZF9leGlzdF9oYW5kbGUocG9zLCAmQ0FSRCwgY2FyZFdvcmtTdGF0ZSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgc3BfY2FyZF9ub2V4aXN0X2hhbmRsZShwb3MsICZDQVJELCBjYXJkV29ya1N0YXRlKTsKKyAgfQorfQorCit2b2lkIHNwX2NvbmZpcm1fcGF5bW9kZShzcF9wb3NfdCogcG9zLCBzcF9jYXJkd29ya3N0YXRlX3QqIGNhcmRXb3JrU3RhdGUpCit7CisgIHVpbnQ4IGtleWNvZGUgPSBTUF9LRVlfTk9ORTsKKyAga2V5Y29kZSA9IHNwX2dldF9rZXkoKTsKKyAgLy/U2r+oz/u30dTdzaPH6b/2z8KwtMjO0uK8/M6qveHK+LWxx7DP+7fR17TMrAorICBpZihrZXljb2RlID49IFNQX0tFWV8wICYmIGtleWNvZGUgPD0gU1BfS0VZX0VOVEVSICYmIHBvcy0+Y2FyZFN0YXRlLmN1cl9zdGF0ZSA9PSBTVEFURV9OT05FCisgICAgICAmJiBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID09IENBUkRXT1JLU1RBVFVTX1BBVVNFICYmIHBvcy0+cGF5bW9kZSA9PSBQQVlNT0RFX0NBUkQpCisgIHsKKyAgCWNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19TVE9QUElORzsKKwlyZXR1cm47CisgIH0KKyAgLy/P+7fRxKPKvbP1yry7r9e0zKzPwrC0yLfIz7z80aHU8bb+zqzC68/7t9EKKyAgaWYoKGtleWNvZGUgPT0gU1BfS0VZX0VOVEVSKSAmJiAocG9zLT5wYXltb2RlID09IFBBWU1PREVfSU5JVCkpCisgIHsKKyAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfTk9ORTsKKyAgICBwb3MtPnBheW1vZGUgPSBQQVlNT0RFX1FSQ09ERTsKKwlyZXR1cm47CisgIH0KKyAgLy+2/s6swuvEo8q9z8KwtMihz/u8/M6qzaPWubmk1/cKKyAgaWYoKHBvcy0+cGF5bW9kZSA9PSBQQVlNT0RFX1FSQ09ERSkgJiYgKGtleWNvZGUgPT0gU1BfS0VZX0NMRUFSKSkKKyAgeworICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19TVE9QUElORzsKKwlyZXR1cm47CisgIH0KKyAgLy+wtDC8/L34yOvJ6LG4stnX973nw+YKKyAgaWYoa2V5Y29kZSA9PSBTUF9LRVlfMCAmJiAocG9zLT5wYXltb2RlID09IFBBWU1PREVfSU5JVCkpCisgIHsKKyAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfU0VUX0RFVjsKKwlyZXR1cm47CisgIH0KK30KKworLy+2/s6swuvP+7fRtKbA7QordWludDMyIHRpY2sgPSAwOwordm9pZCBzcF9xcmNvZGVfaGFuZGxlKHNwX3Bvc190KiBwb3MsIHNwX2NhcmR3b3Jrc3RhdGVfdCogY2FyZFdvcmtTdGF0ZSkKK3sKKyAgdWludDE2IHJldCA9IDA7CisgIHNwX3RyYW5zZHRsX3QgcmVjb3JkOworICBNRU1DTEVBUigmcmVjb3JkLCBzaXplb2YocmVjb3JkKSk7CisgIHN3aXRjaChjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlKQorICB7CisgIGNhc2UgQ0FSRFdPUktTVEFUVVNfTk9ORToKKyAgICByZXQgPSBzcF9jaGVja19kZXYocG9zKTsKKyAgICBpZihyZXQpCisgICAgeworICAgICAgY2FyZFdvcmtTdGF0ZS0+ZXJyY29kZSA9IHJldDsKKyAgICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXQgPSBzcF9xcmNvZGVfaW5pdChwb3MsICZDQVJEKTsKKyAgICBpZihyZXQpCisgICAgeworICAgICAgY2FyZFdvcmtTdGF0ZS0+ZXJyY29kZSA9IHJldDsKKyAgICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXQgPSBzcF9wcmVwYXJlX2JlaGFsZl90cmFuc2R0bChwb3MsICZDQVJELCAmcmVjb3JkKTsKKyAgICBpZihyZXQpCisgICAgeworICAgICAgY2FyZFdvcmtTdGF0ZS0+ZXJyY29kZSA9IFJDX1FSQ09ERV9USU1FT1VUOworICAgICAgY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZSA9IENBUkRXT1JLU1RBVFVTX0VSUk9SOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHBvcy0+c3lzY29uZi53b3JrX21vZGUgPSAxOworICAgIENBUkQucXJjb2RlLnN0YXJ0dGltZSA9IHNwX2dldF90aWNrZXIoKTsKKyAgICBkaXNwX2hpbnRfaW5mbyhwb3MsICLV/dTayfqzybb+zqzC6yIsIERFTEFZX1RJTUUycyk7CisgICAgY2FyZFdvcmtTdGF0ZS0+bGFzdF9zdGF0ZSA9IGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGU7CisgICAgY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZSA9IENBUkRXT1JLU1RBVFVTX1JFQURZOworICAgIGJyZWFrOworICBjYXNlIENBUkRXT1JLU1RBVFVTX1JFQURZOgorICAgIENBUkQucXJjb2RlLm5vd3RpbWUgPSBzcF9nZXRfdGlja2VyKCk7CisgICAgaWYoKENBUkQucXJjb2RlLm5vd3RpbWUgLSBDQVJELnFyY29kZS5zdGFydHRpbWUpID4gQ0FSRC5xcmNvZGUudmFsaWR0aW1lKQorICAgIHsKKyAgICAgIHNob3dfaG9tZShwb3MpOworICAgICAgc2hvd19ob21lX3FyY29kZShDQVJELnFyY29kZS5xcmNvZGVfdXJsKTsKKyAgICAgIGlmKENBUkQucXJjb2RlLm5vd3RpbWUgLSB0aWNrID4gREVMQVlfVElNRTNzKQorICAgICAgeworICAgICAgICB0aWNrID0gQ0FSRC5xcmNvZGUubm93dGltZTsKKyAgICAgICAgcmV0ID0gc3BfcXJjb2RlX3F1ZXJ5KHBvcywgJkNBUkQpOworICAgICAgICBpZighcmV0ICYmIENBUkQucXJjb2RlLmF1dGhzdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICBkb19zdGFydChwb3MpOworICAgICAgICAgIGNhcmRXb3JrU3RhdGUtPmxhc3Rfc3RhdGUgPSBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlOworICAgICAgICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19XT1JLSU5HOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBjYXJkV29ya1N0YXRlLT5lcnJjb2RlID0gUkNfUVJDT0RFX1RJTUVPVVQ7CisgICAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfRVJST1I7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIENBUkRXT1JLU1RBVFVTX1dPUktJTkc6CisgICAgcmV0ID0gZG9fd29yayhwb3MsICZDQVJEKTsKKyAgICBpZihyZXQpCisgICAgeworICAgICAgc2hvd19lcnJvcihwb3MsIs/7t9HKp7DcIixyZXQpOworICAgICAgcmV0ID0gZG9fc3RvcChwb3MsICZDQVJEKTsKKyAgICAgIGlmKHJldCkKKyAgICAgIHsKKyAgICAgICAgY2FyZFdvcmtTdGF0ZS0+ZXJyY29kZSA9IHJldDsKKyAgICAgIH0KKyAgICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19FUlJPUjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXJkV29ya1N0YXRlLT5sYXN0X3N0YXRlID0gY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZTsKKyAgICBjYXJkV29ya1N0YXRlLT5wYXVzZV90aWNrID0gc3BfZ2V0X3RpY2tlcigpOworICAgIGJyZWFrOworICBjYXNlIENBUkRXT1JLU1RBVFVTX1NUT1BQSU5HOgorICAgIGlmKGNhcmRXb3JrU3RhdGUtPmxhc3Rfc3RhdGUgPT0gQ0FSRFdPUktTVEFUVVNfTk9ORQorICAgICAgICB8fCBjYXJkV29ya1N0YXRlLT5sYXN0X3N0YXRlID09IENBUkRXT1JLU1RBVFVTX1JFQURZKQorICAgIHsKKyAgICAgIGRpc3BfaGludF9pbmZvKHBvcywiyKHP+8uiwushIiwgREVMQVlfVElNRTJzKTsKKyAgICAgIHBvcy0+cGF5bW9kZSA9IFBBWU1PREVfSU5JVDsKKyAgICAgIHBvcy0+c3lzY29uZi53b3JrX21vZGUgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYoY2FyZFdvcmtTdGF0ZS0+bGFzdF9zdGF0ZSAhPSBDQVJEV09SS1NUQVRVU19QQVVTRSkKKyAgICAgICAgZG9fcGF1c2UocG9zKTsKKyAgICAgIHJldCA9IGRvX3N0b3AocG9zLCAmQ0FSRCk7CisgICAgICBpZihyZXQpCisgICAgICB7CisgICAgICAgIGNhcmRXb3JrU3RhdGUtPmVycmNvZGUgPSByZXQ7CisgICAgICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19OT05FOworICAgIGNhcmRXb3JrU3RhdGUtPmxhc3Rfc3RhdGUgPSBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlOworICAgIGJyZWFrOworICBjYXNlIENBUkRXT1JLU1RBVFVTX0VSUk9SOgorICAgIGRvX2Vycm9yKHBvcyxjYXJkV29ya1N0YXRlLT5lcnJjb2RlKTsKKyAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfTk9ORTsKKyAgICBjYXJkV29ya1N0YXRlLT5sYXN0X3N0YXRlID0gY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBEZWxheV9tcyhERUxBWV9USU1FMjAwbXMpOworICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9zdXB3aXNkb20vc3BfY29uc3VtZS5oIGIvc3Vwd2lzZG9tL3NwX2NvbnN1bWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmJhNjJjCi0tLSAvZGV2L251bGwKKysrIGIvc3Vwd2lzZG9tL3NwX2NvbnN1bWUuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIENPTlNVTUVfSF8KKyNkZWZpbmUgQ09OU1VNRV9IXworCisjaW5jbHVkZSAic3BfY29uZmlnLmgiCisKK3ZvaWQgc3BfY2FyZF9oYW5kbGUoc3BfcG9zX3QqIHBvcywgc3BfY2FyZHdvcmtzdGF0ZV90KiBjYXJkV29ya1N0YXRlKTsKK3ZvaWQgc3BfdGVzdF9jYXJkX3N0YXRlKHNwX3Bvc190KiBwb3MsIHNwX2NhcmR3b3Jrc3RhdGVfdCogY2FyZFdvcmtTdGF0ZSwgdWludDMyIHRpY2spOwordm9pZCBzcF9xcmNvZGVfaGFuZGxlKHNwX3Bvc190KiBwb3MsIHNwX2NhcmR3b3Jrc3RhdGVfdCogY2FyZFdvcmtTdGF0ZSk7Cit2b2lkIHNwX2NvbmZpcm1fcGF5bW9kZShzcF9wb3NfdCogcG9zLCBzcF9jYXJkd29ya3N0YXRlX3QqIGNhcmRXb3JrU3RhdGUpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3Vwd2lzZG9tL3NwX2RhdGEuYyBiL3N1cHdpc2RvbS9zcF9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIwYjQ3NgotLS0gL2Rldi9udWxsCisrKyBiL3N1cHdpc2RvbS9zcF9kYXRhLmMKQEAgLTAsMCArMSwzNjYgQEAKKyNpbmNsdWRlICJzcF9kYXRhLmgiCisjaW5jbHVkZSAic3BfdXRpbC5oIgorI2luY2x1ZGUgInNwX2ZsYXNoLmgiCisjaW5jbHVkZSAic3BfY29uc3RhbnQuaCIKKyNpbmNsdWRlICJzcF9kaXNwbGF5LmgiCisKKyNkZWZpbmUgcmVjb3JkX2JlaGFsZl9sZW4gMjUKKyNkZWZpbmUgcmVjb3JkX2JlbG93X2xlbiA3CisKKy8v0a27t7zHwrzDv9K7scrB98uuvMfCvLXEtdjWtworc3RhdGljIHVpbnQxNiBzcF93cml0ZV9sYXN0X3JlY29yZChzcF9wb3NfdCogcG9zKQoreworICB1aW50OCBjcmNbMl07CisgIHVpbnQ4IGJ1ZmZbc2l6ZW9mKHNwX2xhc3RfdHJhbnNkdGxfdCldOworICBNRU1DTEVBUihidWZmLCBzaXplb2YoYnVmZikpOworCisgIHBvcy0+bGFzdF90cmFuc2R0bC50aGlzX29mZnNldCArPSBzaXplb2Yoc3BfbGFzdF90cmFuc2R0bF90KTsKKyAgaWYocG9zLT5sYXN0X3RyYW5zZHRsLnRoaXNfb2Zmc2V0ID49IERFRl9GTEFTSF9QYWdlU2l6ZSkKKyAgeworICAgIHNwX2ZsYXNoX2VyYXNlKEFERFJfTEFTVF9UUkFOU05PKTsKKyAgICBwb3MtPmxhc3RfdHJhbnNkdGwudGhpc19vZmZzZXQgPSAwOworICB9CisgIHNwX3Byb3RvY29sX2NyYygodWludDgqKSZwb3MtPmxhc3RfdHJhbnNkdGwsIHNpemVvZihidWZmKS0yLCBwb3MtPmxhc3RfdHJhbnNkdGwuY3JjKTsKKyAgc3BfZmxhc2hfd3JpdGUocG9zLT5sYXN0X3RyYW5zZHRsLnRoaXNfb2Zmc2V0K0FERFJfTEFTVF9UUkFOU05PLAorICAgICAgICAgICAgICAgICAodWludDgqKSZwb3MtPmxhc3RfdHJhbnNkdGwsIHNpemVvZihidWZmKSk7CisKKyAgc3BfZmxhc2hfcmVhZChwb3MtPmxhc3RfdHJhbnNkdGwudGhpc19vZmZzZXQrQUREUl9MQVNUX1RSQU5TTk8sIGJ1ZmYsIHNpemVvZihidWZmKSk7CisgIHNwX3Byb3RvY29sX2NyYyhidWZmLCBzaXplb2YoYnVmZiktMiwgY3JjKTsKKyAgaWYoTUVNQ01QKHBvcy0+bGFzdF90cmFuc2R0bC5jcmMsY3JjLDIpIT0wKQorICB7CisgICAgcG9zLT5sb2FkX3BhcmFfc3RhdHVzID0gUkNfRkxBU0hfRVJSOworICAgIHJldHVybiBSQ19GTEFTSF9FUlI7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50MTYgc3Bfd3JpdGVfYmVoYWxmX3JlY29yZChzcF9wb3NfdCogcG9zLCBzcF90cmFuc2R0bF90KiByZWNvcmQpCit7CisgIHVpbnQ4IGJ1ZltyZWNvcmRfYmVoYWxmX2xlbl07CisgIE1FTUNMRUFSKGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCisgIHBvcy0+bGFzdF90cmFuc2R0bC50cmFuc2FkZHIgKz0gc2l6ZW9mKHNwX3RyYW5zZHRsX3QpOworICBpZihwb3MtPmxhc3RfdHJhbnNkdGwudHJhbnNhZGRyICUgREVGX0ZMQVNIX1BhZ2VTaXplID09IDApCisgIHsKKyAgICBpZihwb3MtPmxhc3RfdHJhbnNkdGwudHJhbnNhZGRyID49IEFERFJfVFJBTlNEVExfRU5EKQorICAgIHsKKyAgICAgIHBvcy0+bGFzdF90cmFuc2R0bC50cmFuc2FkZHIgPSBBRERSX1RSQU5TRFRMX0JFR0lOOworICAgIH0KKyAgICBzcF9mbGFzaF9lcmFzZShwb3MtPmxhc3RfdHJhbnNkdGwudHJhbnNhZGRyKTsKKyAgfQorICBzcF9mbGFzaF93cml0ZShwb3MtPmxhc3RfdHJhbnNkdGwudHJhbnNhZGRyLCAodWludDgqKXJlY29yZCwgc2l6ZW9mKGJ1ZikpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQxNiBzcF93cml0ZV9iZWxvd19yZWNvcmQoc3BfcG9zX3QqIHBvcywgc3BfdHJhbnNkdGxfdCogcmVjb3JkKQoreworICB1aW50OCBjcmNbMl07CisgIHVpbnQ4IGJ1ZmZbc2l6ZW9mKHNwX3RyYW5zZHRsX3QpXTsKKyAgTUVNQ0xFQVIoY3JjLCBzaXplb2YoY3JjKSk7CisgIE1FTUNMRUFSKGJ1ZmYsIHNpemVvZihidWZmKSk7CisKKyAgc3BfcHJvdG9jb2xfY3JjKCh1aW50OCopcmVjb3JkLCBzaXplb2YoYnVmZiktMiwgcmVjb3JkLT5jcmMpOworICBzcF9mbGFzaF93cml0ZShwb3MtPmxhc3RfdHJhbnNkdGwudHJhbnNhZGRyK3JlY29yZF9iZWhhbGZfbGVuLAorICAgICAgICAgICAgICAgICAodWludDgqKXJlY29yZCtyZWNvcmRfYmVoYWxmX2xlbiwgcmVjb3JkX2JlbG93X2xlbik7CisgIHNwX2ZsYXNoX3JlYWQocG9zLT5sYXN0X3RyYW5zZHRsLnRyYW5zYWRkciwgYnVmZiwgc2l6ZW9mKGJ1ZmYpKTsKKyAgc3BfcHJvdG9jb2xfY3JjKGJ1ZmYsIHNpemVvZihidWZmKS0yLCBjcmMpOworICBpZihNRU1DTVAocmVjb3JkLT5jcmMsIGNyYywgMikgIT0gMCkKKyAgeworICAgIHBvcy0+bG9hZF9wYXJhX3N0YXR1cyA9IFJDX0ZMQVNIX0VSUjsKKyAgICByZXR1cm4gUkNfRkxBU0hfRVJSOworICB9CisgIHJldHVybiAwOworfQorCisvL8/7t9Gz9cq8u6+687TmtKLJz7Drsr+31sH3y66jrLfA1rnP+7fRyqew3M7ewffLrtDFz6IKK3VpbnQxNiBzcF9wcmVwYXJlX2JlaGFsZl90cmFuc2R0bChzcF9wb3NfdCogcG9zLCBzcF9jYXJkX3QqIGNhcmQsIHNwX3RyYW5zZHRsX3QqIHJlY29yZCkKK3sKKyAgdWludDggcmV0ID0gMDsKKyAgdWludDggY3RpbWVbNl07CisgIE1FTUNMRUFSKGN0aW1lLCBzaXplb2YoY3RpbWUpKTsKKworICBzcF9nZXRfYmNkdGltZShjdGltZSk7CisgIG1lbWNweShyZWNvcmQtPmRldnBoeWlkLCBwb3MtPmRldnBoeWlkLCBzaXplb2YocG9zLT5kZXZwaHlpZCkpOworICBtZW1jcHkocmVjb3JkLT50cmFuc2RhdGUsIGN0aW1lLCAzKTsKKyAgbWVtY3B5KHJlY29yZC0+dHJhbnN0aW1lLCBjdGltZSszLCAzKTsKKyAgbWVtY3B5KHJlY29yZC0+YmlsbG5vLCBjYXJkLT5iaWxsbm8sIHNpemVvZihjYXJkLT5iaWxsbm8pKTsKKyAgbWVtY3B5KHJlY29yZC0+Y2FyZHBoeWlkLCBjYXJkLT5jYXJkcGh5aWQsIHNpemVvZihjYXJkLT5jYXJkcGh5aWQpKTsKKyAgaWYocG9zLT5wYXltb2RlID09IFBBWU1PREVfUVJDT0RFKQorICB7CisgICAgcmVjb3JkLT50cmFuc3dheSA9IDI7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmVjb3JkLT50cmFuc3dheSA9IDE7CisgIH0KKyAgcmV0ID0gc3Bfd3JpdGVfYmVoYWxmX3JlY29yZChwb3MsIHJlY29yZCk7CisgIGlmKHJldCkKKyAgICByZXR1cm4gcmV0OworICByZXR1cm4gc3Bfd3JpdGVfbGFzdF9yZWNvcmQocG9zKTsKK30KKworLy/I9M/7t9Gzybmmo6y05rSiz8Kw67K/t9bB98uu0MXPogordWludDE2IHNwX3ByZXBhcmVfYmVsb3dfdHJhbnNkdGwoc3BfcG9zX3QqIHBvcywgc3BfY2FyZF90KiBjYXJkLCBzcF90cmFuc2R0bF90KiByZWNvcmQpCit7CisgIHVpbnQ4IGJ1ZmZbcmVjb3JkX2JlaGFsZl9sZW5dOworICBNRU1DTEVBUihidWZmLCBzaXplb2YoYnVmZikpOworCisgIHJlY29yZC0+YW1vdW50ID0gcG9zLT5wdXJjaGFzZS5wYWlkX3N1bTsKKyAgaWYocG9zLT5wYXltb2RlID09IFBBWU1PREVfUVJDT0RFKQorICB7CisgICAgcmVjb3JkLT5wYWlkQW1vdW50ID0gY2FyZC0+cXJjb2RlLnBhaWRBbW91bnQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmVjb3JkLT5wYWlkQW1vdW50ID0gMDsKKyAgfQorICByZWNvcmQtPmZsb3dzZW5zb3JzID0gcG9zLT5wdXJjaGFzZS5wYWlkX251bTsKKyAgcmVjb3JkLT50cmFuc3RhdHVzID0gMTsKKyAgc3BfZmxhc2hfcmVhZChwb3MtPmxhc3RfdHJhbnNkdGwudHJhbnNhZGRyLCBidWZmLCBzaXplb2YoYnVmZikpOworICBNRU1DUFkocmVjb3JkLCBidWZmLCBzaXplb2YoYnVmZikpOworICByZXR1cm4gc3Bfd3JpdGVfYmVsb3dfcmVjb3JkKHBvcywgcmVjb3JkKTsKK30KKworLy/Rrbu3tOa0osO/0ruxys60yc+0q8H3y668x8K8tcS12Na3Cit1aW50MTYgc3Bfd3JpdGVfdW5jb25maXJtX3JlY29yZChzcF9wb3NfdCogcG9zKQoreworICB1aW50OCBjcmNbMl07CisgIHVpbnQ4IGJ1ZmZbc2l6ZW9mKHNwX3VuY29uZmlybV90cmFuc2R0bF90KV07CisgIE1FTUNMRUFSKGJ1ZmYsIHNpemVvZihidWZmKSk7CisKKyAgcG9zLT51bmNvbmZpcm1fdHJhbnNkdGwudGhpc19vZmZzZXQgKz0gc2l6ZW9mKGJ1ZmYpOworICBpZihwb3MtPnVuY29uZmlybV90cmFuc2R0bC50aGlzX29mZnNldCA+PSBERUZfRkxBU0hfUGFnZVNpemUpCisgIHsKKyAgICBzcF9mbGFzaF9lcmFzZShBRERSX1VOQ09ORklSTV9UUkFOU05PKTsKKyAgICBwb3MtPnVuY29uZmlybV90cmFuc2R0bC50aGlzX29mZnNldCA9IDA7CisgIH0KKyAgc3BfcHJvdG9jb2xfY3JjKCh1aW50OCopJnBvcy0+dW5jb25maXJtX3RyYW5zZHRsLCBzaXplb2YoYnVmZiktMiwKKyAgICAgICAgICAgICAgICAgIHBvcy0+dW5jb25maXJtX3RyYW5zZHRsLmNyYyk7CisgIHNwX2ZsYXNoX3dyaXRlKHBvcy0+dW5jb25maXJtX3RyYW5zZHRsLnRoaXNfb2Zmc2V0K0FERFJfVU5DT05GSVJNX1RSQU5TTk8sCisgICAgICAgICAgICAgICAgICh1aW50OCopJnBvcy0+dW5jb25maXJtX3RyYW5zZHRsLCBzaXplb2YoYnVmZikpOworCisgIHNwX2ZsYXNoX3JlYWQocG9zLT51bmNvbmZpcm1fdHJhbnNkdGwudGhpc19vZmZzZXQrQUREUl9VTkNPTkZJUk1fVFJBTlNOTywgYnVmZiwKKyAgICAgICAgICAgICAgICBzaXplb2YoYnVmZikpOworICBzcF9wcm90b2NvbF9jcmMoYnVmZiwgc2l6ZW9mKGJ1ZmYpLTIsIGNyYyk7CisgIGlmKE1FTUNNUChwb3MtPnVuY29uZmlybV90cmFuc2R0bC5jcmMsIGNyYywgMikgIT0wKQorICB7CisgICAgcG9zLT5sb2FkX3BhcmFfc3RhdHVzID0gUkNfRkxBU0hfRVJSOworICAgIHJldHVybiBSQ19GTEFTSF9FUlI7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50MTYgc3BfaW5pdF9sYXN0X3RyYW5zZHRsX3B0cihzcF9sYXN0X3RyYW5zZHRsX3QqIHJlY29yZCkKK3sKKyAgcmVjb3JkLT50cmFuc2FkZHIgPSBBRERSX1RSQU5TRFRMX0JFR0lOIC1zaXplb2Yoc3BfdHJhbnNkdGxfdCk7CisgIHJlY29yZC0+dGhpc19vZmZzZXQgPSAwOworICBzcF9wcm90b2NvbF9jcmMoKHVpbnQ4KilyZWNvcmQsc2l6ZW9mKHNwX2xhc3RfdHJhbnNkdGxfdCkgLTIscmVjb3JkLT5jcmMpOworICByZXR1cm4gc3BfZmxhc2hfcGFnZV93cml0ZShBRERSX0xBU1RfVFJBTlNOTywodWludDgqKXJlY29yZCxzaXplb2Yoc3BfbGFzdF90cmFuc2R0bF90KSk7Cit9CisKK3N0YXRpYyB1aW50MTYgc3BfaW5pdF91bmNvbmZpcm1fdHJhbnNkdGxfcHRyKHNwX3VuY29uZmlybV90cmFuc2R0bF90KiByZWNvcmQpCit7CisgIHJlY29yZC0+dHJhbnNhZGRyID0gQUREUl9UUkFOU0RUTF9CRUdJTjsKKyAgcmVjb3JkLT50aGlzX29mZnNldCA9IDA7CisgIHNwX3Byb3RvY29sX2NyYygodWludDgqKXJlY29yZCxzaXplb2Yoc3BfdW5jb25maXJtX3RyYW5zZHRsX3QpIC0yLHJlY29yZC0+Y3JjKTsKKyAgcmV0dXJuIHNwX2ZsYXNoX3BhZ2Vfd3JpdGUoQUREUl9VTkNPTkZJUk1fVFJBTlNOTywodWludDgqKXJlY29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNwX3VuY29uZmlybV90cmFuc2R0bF90KSk7Cit9CisKK3N0YXRpYyB1aW50OCBzcF9sb2FkX2xhc3RfdHJhbnNkdGxfcHRyKHNwX3Bvc190KiBwb3MpCit7CisgIHVpbnQ4IGNyY1syXTsKKyAgc3BfZmxhc2hfcGFnZV9yZWFkKEFERFJfTEFTVF9UUkFOU05PLCh1aW50OCopJnBvcy0+bGFzdF90cmFuc2R0bCwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzcF9sYXN0X3RyYW5zZHRsX3QpKTsKKyAgc3BfcHJvdG9jb2xfY3JjKCh1aW50OCopJnBvcy0+bGFzdF90cmFuc2R0bCxzaXplb2Yoc3BfbGFzdF90cmFuc2R0bF90KSAtMixjcmMpOworICBpZihNRU1DTVAocG9zLT5sYXN0X3RyYW5zZHRsLmNyYyxjcmMsMikgIT0gMCkKKyAgeworICAgIHNwX2luaXRfbGFzdF90cmFuc2R0bF9wdHIoJnBvcy0+bGFzdF90cmFuc2R0bCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CitzdGF0aWMgdWludDggc3BfbG9hZF91bmNvbmZpcm1fdHJhbnNkdGxfcHRyKHNwX3Bvc190KiBwb3MpCit7CisgIHVpbnQ4IGNyY1syXTsKKyAgc3BfZmxhc2hfcGFnZV9yZWFkKEFERFJfVU5DT05GSVJNX1RSQU5TTk8sKHVpbnQ4KikmcG9zLT51bmNvbmZpcm1fdHJhbnNkdGwsCisgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3BfdW5jb25maXJtX3RyYW5zZHRsX3QpKTsKKyAgc3BfcHJvdG9jb2xfY3JjKCh1aW50OCopJnBvcy0+dW5jb25maXJtX3RyYW5zZHRsLHNpemVvZihzcF91bmNvbmZpcm1fdHJhbnNkdGxfdCkgLTIsY3JjKTsKKyAgaWYoTUVNQ01QKHBvcy0+dW5jb25maXJtX3RyYW5zZHRsLmNyYyxjcmMsMikgIT0gMCkKKyAgeworICAgIHNwX2luaXRfdW5jb25maXJtX3RyYW5zZHRsX3B0cigmcG9zLT51bmNvbmZpcm1fdHJhbnNkdGwpOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdWludDE2IHNwX3BhcnNlX2NvbmZpZyhzcF9wb3NfdCogcG9zLCBzcF9jb25maWdfdCogY29uZmlnKQoreworICBwb3MtPnN5c2NvbmYuZGV2X29mZmxpbmVfbWF4aG91ciA9IGNvbmZpZy0+b2ZmbGluZV93b3JrX2hvdXI7CisgIGlmKHBvcy0+c3lzY29uZi5kZXZfb2ZmbGluZV9tYXhob3VyID09IDApCisgIHsKKyAgICBwb3MtPnN5c2NvbmYuZGV2X29mZmxpbmVfbWF4aG91ciA9IERFVl9PRkZMSU5FX0RFRkFVTFRfSE9VUjsKKyAgfQorICBwb3MtPnN5c2NvbmYuZmxvd3NlbnNvcl91bml0ID0gY29uZmlnLT5mbG93c2Vuc29yX3VuaXQ7CisgIHBvcy0+ZGV2aWNlbm8gPSBjb25maWctPmRldmljZW5vOworICBwb3MtPmRldmxvZ2luLmxvZ2luX2ZsYWcgPSBjb25maWctPmxvZ2luX2ZsYWc7CisgIE1FTUNQWShwb3MtPmRldnBoeWlkLGNvbmZpZy0+ZGV2cGh5aWQsNCk7CisgIHJldHVybiAwOworfQorc3RhdGljIHVpbnQxNiBzcF9yZWFkX2NvbmZpZyhzcF9wb3NfdCogcG9zLCBzcF9jb25maWdfdCogY29uZmlnKQoreworICB1aW50OCBjcmNbMl07CisgIHNwX2ZsYXNoX3JlYWQoQUREUl9DT05GSUdfUEFSQSwodWludDgqKWNvbmZpZyxzaXplb2Yoc3BfY29uZmlnX3QpKTsKKyAgc3BfcHJvdG9jb2xfY3JjKCh1aW50OCopY29uZmlnLHNpemVvZihzcF9jb25maWdfdCkgLTIsY3JjKTsKKyAgaWYobWVtY21wKGNvbmZpZy0+Y3JjLGNyYywyKSAhPSAwKQorICB7CisgICAgcmV0dXJuIFJDX0NPTkZQQVJBX0NSQ19FUlI7CisgIH0KKyAgc3BfcGFyc2VfY29uZmlnKHBvcywgY29uZmlnKTsKKyAgcmV0dXJuIDA7Cit9CisKK3VpbnQxNiBzcF9jbGVhcl90cmFuc2R0bChzcF9wb3NfdCogcG9zKQoreworICB1aW50MzIgaTsKKyAgdWludDE2IHJldCA9IHNwX2ZsYXNoX2VyYXNlKEFERFJfTEFTVF9UUkFOU05PKTsKKyAgcmV0IHw9IHNwX2ZsYXNoX2VyYXNlKEFERFJfVU5DT05GSVJNX1RSQU5TTk8pOworICBmb3IoaSA9IEFERFJfVFJBTlNEVExfQkVHSU47IGkgPCBBRERSX1RSQU5TRFRMX0VORDsgaSArPSBERUZfRkxBU0hfUGFnZVNpemUpCisgIHsKKyAgICByZXQgfD0gc3BfZmxhc2hfZXJhc2UoaSk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVpbnQxNiBzcF9pbml0X2RldmljZShzcF9wb3NfdCogcG9zKQoreworICB1aW50MTYgcmV0OworICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCLJ6LG4s/XKvLuvIiwix+W/1cH3y64iLDApOworICByZXQgfD0gc3BfY2xlYXJfdHJhbnNkdGwocG9zKTsKKyAgcmV0dXJuICByZXQ7Cit9CisKK3ZvaWQgc3BfcmVzZXRfZmFjdG9yeShzcF9wb3NfdCogcG9zKQoreworICB1aW50MTYgcmV0OworICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCK71ri0s/azp9bQIiwix+vJ1LXILi4uIiwwKTsKKyAgcmV0ID0gc3BfZmxhc2hfZXJhc2UoQUREUl9DT05GSUdfUEFSQSk7CisgIHJldCB8PXNwX2NsZWFyX3RyYW5zZHRsKHBvcyk7CisgIGlmKCFyZXQpCisgIHsKKyAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCKz9cq8u6+zybmmIiwitci0/dbYxvQiLDApOworICB9CisgIGVsc2UKKyAgeworICAgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsIrP1yry7r8qnsNwiLCK1yLT91tjG9CIsMCk7CisgIH0KKyAgc3BfcmVzZXQoKTsKK30KKwordWludDE2IHNwX2xvYWRfY29uZmlnKHNwX3Bvc190KiBwb3MpCit7CisgIHVpbnQxNiByZXQ7CisgIHNwX2NvbmZpZ190IGNvbmZpZzsKKyAgTUVNQ0xFQVIoJmNvbmZpZyxzaXplb2YgY29uZmlnKTsKKyAgcmV0IHw9IHNwX3JlYWRfY29uZmlnKHBvcywgJmNvbmZpZyk7CisgIGlmKHJldCkKKyAgeworICAgIHNwX2NvbmZpZ19pbml0KHBvcyk7CisgICAgc3BfaW5pdF9kZXZpY2UocG9zKTsKKyAgfQorICByZXQgfD0gc3BfbG9hZF9sYXN0X3RyYW5zZHRsX3B0cihwb3MpOworICByZXQgfD0gc3BfbG9hZF91bmNvbmZpcm1fdHJhbnNkdGxfcHRyKHBvcyk7CisgIHJldHVybiByZXQ7Cit9CisKK3VpbnQxNiBzcF9zYXZlX2NvbmZpZyhzcF9wb3NfdCogcG9zLCBzcF9jb25maWdfdCogY29uZmlnKQoreworICB1aW50OCBidWZmZXJbc2l6ZW9mKHNwX2NvbmZpZ190KV07CisgIHVpbnQ4IGNyY1syXTsKKyAgc3BfcHJvdG9jb2xfY3JjKCh1aW50OCopY29uZmlnLHNpemVvZihzcF9jb25maWdfdCktMixjb25maWctPmNyYyk7CisgIHNwX2ZsYXNoX2VyYXNlKEFERFJfQ09ORklHX1BBUkEpOworICBzcF9mbGFzaF93cml0ZShBRERSX0NPTkZJR19QQVJBLCh1aW50OCopY29uZmlnLHNpemVvZihzcF9jb25maWdfdCkpOworICBzcF9mbGFzaF9yZWFkKEFERFJfQ09ORklHX1BBUkEsYnVmZmVyLHNpemVvZiBidWZmZXIpOworICBzcF9wcm90b2NvbF9jcmMoYnVmZmVyLHNpemVvZihidWZmZXIpLTIsY3JjKTsKKyAgaWYobWVtY21wKGNvbmZpZy0+Y3JjLGNyYywyKSAhPSAwKQorICB7CisgICAgcmV0dXJuIFJDX0NPTkZQQVJBX0NSQ19FUlI7CisgIH0KKyAgc3BfcGFyc2VfY29uZmlnKHBvcywgY29uZmlnKTsKKyAgcmV0dXJuIDA7Cit9CisKK3VpbnQxNiBzcF9zYXZlX2RldmljZW5vKHNwX3Bvc190KiBwb3MsIHVpbnQ4IGRldmljZW5vKQoreworICB1aW50MTYgcmV0OworICBzcF9jb25maWdfdCBjb25maWc7CisgIE1FTUNMRUFSKCZjb25maWcsIHNpemVvZiBjb25maWcpOworICByZXQgPSBzcF9yZWFkX2NvbmZpZyhwb3MsICZjb25maWcpOworICBpZihyZXQpCisgIHsKKyAgICByZXR1cm4gcmV0OworICB9CisgIGNvbmZpZy5kZXZpY2VubyA9IGRldmljZW5vOworICByZXR1cm4gc3Bfc2F2ZV9jb25maWcocG9zLCAmY29uZmlnKTsKK30KK3VpbnQxNiBzcF9zYXZlX2RldnBoeWlkKHNwX3Bvc190KiBwb3MsIHVpbnQ4IGRldnBoeWlkWzRdKQoreworICB1aW50MTYgcmV0OworICBzcF9jb25maWdfdCBjb25maWc7CisgIE1FTUNMRUFSKCZjb25maWcsIHNpemVvZiBjb25maWcpOworICByZXQgPSBzcF9yZWFkX2NvbmZpZyhwb3MsICZjb25maWcpOworICBpZihyZXQpCisgIHsKKyAgICByZXR1cm4gcmV0OworICB9CisgIE1FTUNQWShjb25maWcuZGV2cGh5aWQsZGV2cGh5aWQsNCk7CisgIHJldHVybiBzcF9zYXZlX2NvbmZpZyhwb3MsICZjb25maWcpOworfQordWludDE2IHNwX3NhdmVfbG9naW5faW5mbyhzcF9wb3NfdCogcG9zLCB1aW50OCBmbGFnLCB1aW50OCB1bml0LCB1aW50OCBvZmZsaW5lX21heGhvdXIpCit7CisgIHVpbnQxNiByZXQ7CisgIHNwX2NvbmZpZ190IGNvbmZpZzsKKyAgTUVNQ0xFQVIoJmNvbmZpZywgc2l6ZW9mIGNvbmZpZyk7CisgIHJldCA9IHNwX3JlYWRfY29uZmlnKHBvcywgJmNvbmZpZyk7CisgIGlmKHJldCkKKyAgeworICAgIHJldHVybiByZXQ7CisgIH0KKyAgY29uZmlnLmxvZ2luX2ZsYWcgPSBmbGFnOworICBjb25maWcuZmxvd3NlbnNvcl91bml0ID0gdW5pdDsKKyAgY29uZmlnLm9mZmxpbmVfd29ya19ob3VyID0gb2ZmbGluZV9tYXhob3VyOworICByZXR1cm4gc3Bfc2F2ZV9jb25maWcocG9zLCAmY29uZmlnKTsKK30KKwordWludDE2IHNwX3NhdmVfaGVhcnRiZWF0X2luZm8oc3BfcG9zX3QqIHBvcywgdWludDggZmxhZykKK3sKKyAgdWludDE2IHJldDsKKyAgc3BfY29uZmlnX3QgY29uZmlnOworICBNRU1DTEVBUigmY29uZmlnLCBzaXplb2YgY29uZmlnKTsKKyAgcmV0ID0gc3BfcmVhZF9jb25maWcocG9zLCAmY29uZmlnKTsKKyAgaWYocmV0KQorICB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICBjb25maWcubG9naW5fZmxhZyA9IGZsYWc7CisgIHJldHVybiBzcF9zYXZlX2NvbmZpZyhwb3MsICZjb25maWcpOworCit9CisKK3VpbnQxNiBzcF9jb25maWdfaW5pdChzcF9wb3NfdCogcG9zKQoreworICB1aW50MTYgcmV0ID0gMDsKKyAgdWludDggY3JjWzJdOworICBzcF9jb25maWdfdCBjb25maWc7CisgIE1FTUNMRUFSKCZjb25maWcsIHNpemVvZihjb25maWcpKTsKKyAgZGlzcF9oaW50X2luZm8ocG9zLCLJ6LG4ss7K/bP1yry7ryIsIERFTEFZX1RJTUUycyk7CisgIHNwX3Byb3RvY29sX2NyYygodWludDgqKSZjb25maWcsc2l6ZW9mKHNwX2NvbmZpZ190KS0yLGNvbmZpZy5jcmMpOworICBzcF9mbGFzaF9lcmFzZShBRERSX0NPTkZJR19QQVJBKTsKKyAgc3BfZmxhc2hfd3JpdGUoQUREUl9DT05GSUdfUEFSQSwodWludDgqKSZjb25maWcsc2l6ZW9mKHNwX2NvbmZpZ190KSk7CisgIHNwX2ZsYXNoX3JlYWQoQUREUl9DT05GSUdfUEFSQSwodWludDgqKSZjb25maWcsc2l6ZW9mKGNvbmZpZykpOworICBzcF9wcm90b2NvbF9jcmMoKHVpbnQ4KikmY29uZmlnLHNpemVvZihzcF9jb25maWdfdCktMixjcmMpOworICBpZihtZW1jbXAoY29uZmlnLmNyYyxjcmMsMikgIT0gMCkKKyAgeworICAgIHJldHVybiBSQ19DT05GUEFSQV9DUkNfRVJSOworICB9CisgIHJldCA9IHNwX2ZsYXNoX2VyYXNlKEFERFJfQ09ORklHX1BBUkEpOworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvc3Vwd2lzZG9tL3NwX2RhdGEuaCBiL3N1cHdpc2RvbS9zcF9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVkNDk0MgotLS0gL2Rldi9udWxsCisrKyBiL3N1cHdpc2RvbS9zcF9kYXRhLmgKQEAgLTAsMCArMSwzMCBAQAorI2lmbmRlZiBfU1BfREFUQV9IXworI2RlZmluZSBfU1BfREFUQV9IXworCisjaW5jbHVkZSAic3BfY29uZmlnLmgiCisjaW5jbHVkZSAic3BfY29tbXVuaWNhdGUuaCIKKworLy/B98uutKbA7QordWludDE2IHNwX3ByZXBhcmVfYmVoYWxmX3RyYW5zZHRsKHNwX3Bvc190KiBwb3MsIHNwX2NhcmRfdCogY2FyZCwgc3BfdHJhbnNkdGxfdCogcmVjb3JkKTsKK3VpbnQxNiBzcF9wcmVwYXJlX2JlbG93X3RyYW5zZHRsKHNwX3Bvc190KiBwb3MsIHNwX2NhcmRfdCogY2FyZCwgc3BfdHJhbnNkdGxfdCogcmVjb3JkKTsKK3VpbnQxNiBzcF9yZWFkX2xhc3RyZWNvcmQoY29uc3Qgc3BfcG9zX3QqIHBvcywgc3BfdHJhbnNkdGxfdCogZHRsKTsKK3VpbnQxNiBzcF9jb25maXJtX3JlY29yZChjb25zdCBzcF9wb3NfdCogcG9zLCBzcF90cmFuc2R0bF90KiBkdGwpOwordWludDE2IHNwX3F1ZXJ5X3JlY29yZChjb25zdCBzcF9wb3NfdCogcG9zLCB1aW50OCByZWZub1sxNl0sIHNwX3RyYW5zZHRsX3QqIGR0bCk7Cit1aW50MTYgc3BfY2xlYXJfdHJhbnNkdGwoc3BfcG9zX3QqIHBvcyk7Cit1aW50MTYgc3Bfd3JpdGVfdW5jb25maXJtX3JlY29yZChzcF9wb3NfdCogcG9zKTsKKworLy/Ptc2zss7K/cno1sMKK3ZvaWQgc3BfcmVzZXRfZmFjdG9yeShzcF9wb3NfdCogcG9zKTsKK3VpbnQxNiBzcF9sb2FkX2NvbmZpZyhzcF9wb3NfdCogcG9zKTsKK3VpbnQxNiBzcF9zYXZlX2NvbmZpZyhzcF9wb3NfdCogcG9zLCBzcF9jb25maWdfdCogY29uZmlnKTsKK3VpbnQxNiBzcF9zYXZlX2RldmljZW5vKHNwX3Bvc190KiBwb3MsIHVpbnQ4IGRldmljZW5vKTsKK3VpbnQxNiBzcF9zYXZlX2RldnBoeWlkKHNwX3Bvc190KiBwb3MsIHVpbnQ4IGRldnBoeWlkWzRdKTsKK3VpbnQxNiBzcF9jb25maWdfaW5pdChzcF9wb3NfdCogcG9zKTsKK3VpbnQxNiBzcF9zYXZlX2xvZ2luX2luZm8oc3BfcG9zX3QqIHBvcywgdWludDggZmxhZywgdWludDggdW5pdCwgdWludDggb2ZmbGluZV9tYXhob3VyKTsKK3VpbnQxNiBzcF9zYXZlX2hlYXJ0YmVhdF9pbmZvKHNwX3Bvc190KiBwb3MsIHVpbnQ4IGZsYWcpOworCisvL8nosbjK1ravstnX973Tv9oKK3VpbnQ4IHNwX2NvbmZpcm1fbG9naW4oc3BfcHJvdG9jb2xfcmVzcG9uc2VfdCogcmVzcCwgc3BfcG9zX3QqIHBvcyk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zdXB3aXNkb20vc3BfZGVzLmMgYi9zdXB3aXNkb20vc3BfZGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxOTkxNgotLS0gL2Rldi9udWxsCisrKyBiL3N1cHdpc2RvbS9zcF9kZXMuYwpAQCAtMCwwICsxLDM5IEBACisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSAiLi4vaWNjX2FwZHVfbGliL2Rlcy5oIgorCisjaW5jbHVkZSAic3BfZGVzLmgiCisKK3N0YXRpYyBkZXNfY29udGV4dCBkZXNjdHg7CitzdGF0aWMgZGVzM19jb250ZXh0IGRlczNjdHg7CisKK3VpbnQ4IHNpbmdsZV9kZXNfc2V0X2tleXModWludDgga2V5WzhdKQoreworICByZXR1cm4gZGVzX3NldF9rZXkoJmRlc2N0eCwga2V5KTsKK30KKwordm9pZCBzaW5nbGVfZGVzX2VuY3J5cHQodWludDggc3JjWzhdLCB1aW50OCBkZXN0WzhdKQoreworICBkZXNfZW5jcnlwdCgmZGVzY3R4LCBzcmMsIGRlc3QpOworfQorCit2b2lkIHNpbmdsZV9kZXNfZGVjcnlwdCh1aW50OCBzcmNbOF0sIHVpbnQ4IGRlc3RbOF0pCit7CisgIGRlc19kZWNyeXB0KCZkZXNjdHgsIHNyYywgZGVzdCk7Cit9CisKK3VpbnQ4IHRyaXBsZV9kZXNfc2V0X2tleXModWludDgga2V5WzE2XSkKK3sKKyAgcmV0dXJuIGRlczNfc2V0XzJrZXlzKCZkZXMzY3R4LCBrZXksIGtleSs4KTsKK30KKwordm9pZCB0cmlwbGVfZGVzX2VuY3J5cHQodWludDggc3JjWzhdLCB1aW50OCBkZXN0WzhdKQoreworICBkZXMzX2VuY3J5cHQoJmRlczNjdHgsIHNyYywgZGVzdCk7Cit9CisKK3ZvaWQgdHJpcGxlX2Rlc19kZWNyeXB0KHVpbnQ4IHNyY1s4XSwgdWludDggZGVzdFs4XSkKK3sKKyAgZGVzM19kZWNyeXB0KCZkZXMzY3R4LCBzcmMsIGRlc3QpOworfQorCisKZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9kZXMuaCBiL3N1cHdpc2RvbS9zcF9kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzhhN2M3Ci0tLSAvZGV2L251bGwKKysrIGIvc3Vwd2lzZG9tL3NwX2Rlcy5oCkBAIC0wLDAgKzEsMjcgQEAKKyNpZm5kZWYgX1NQX0RFU19IXworI2RlZmluZSBfU1BfREVTX0hfCisKKyNpbmNsdWRlICIuLi9jb25maWcuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAKKwordWludDggc2luZ2xlX2Rlc19zZXRfa2V5cyh1aW50OCBrZXlbOF0pOworCit2b2lkIHNpbmdsZV9kZXNfZW5jcnlwdCh1aW50OCBzcmNbOF0sIHVpbnQ4IGRlc3RbOF0pOworCit2b2lkIHNpbmdsZV9kZXNfZGVjcnlwdCh1aW50OCBzcmNbOF0sIHVpbnQ4IGRlc3RbOF0pOworCit1aW50OCB0cmlwbGVfZGVzX3NldF9rZXlzKHVpbnQ4IGtleVsxNl0pOworCit2b2lkIHRyaXBsZV9kZXNfZW5jcnlwdCh1aW50OCBzcmNbOF0sIHVpbnQ4IGRlc3RbOF0pOworCit2b2lkIHRyaXBsZV9kZXNfZGVjcnlwdCh1aW50OCBzcmNbOF0sIHVpbnQ4IGRlc3RbOF0pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9kaXNwbGF5LmMgYi9zdXB3aXNkb20vc3BfZGlzcGxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMDQxN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zdXB3aXNkb20vc3BfZGlzcGxheS5jCkBAIC0wLDAgKzEsMzU2IEBACisjaW5jbHVkZSAiZ2xjZC5oIgorI2luY2x1ZGUgIi4uL3prL2diMjMxMl8xNi5oIgorI2luY2x1ZGUgIi4uL2xpYnFyL3FyZW5jb2RlLmgiCisjaW5jbHVkZSAic3BfdXRpbC5oIgorI2luY2x1ZGUgInNwX2NvbnN0YW50LmgiCisjaW5jbHVkZSAic3BfZGlzcGxheS5oIgorCisjZGVmaW5lIEdMQ0RfVElUTEVfWCAwCisjZGVmaW5lIEdMQ0RfVElUTEVfWSAwCisjZGVmaW5lIEdMQ0RfVElUTEVfTElORSA4CisjZGVmaW5lIEdMQ0RfQ09OVEVOVF9ZX09ORSAweDEwCisjZGVmaW5lIEdMQ0RfQ09OVEVOVF9ZX1RXTyAweDIwCisjZGVmaW5lIEdMQ0RfQ09OVEVOVF9ZX1RIUkVFIDB4MzAKKyNkZWZpbmUgR0xDRF9CVVRUT01fWSA1NgorI2RlZmluZSBHTENEX0xJTkVfTEVOR1RIIDB4MTAKKworc3RhdGljIGNoYXIgbGluZV9idWZmWzE3XTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILqvyv0oTmFtZSkgICAgICA6IHZvaWQgIFNob3dfTW9uZXkodWludDMyIG1vbmV5KQorKiC5psTcKEZ1bmN0aW9uKSAgOiDP1Mq+vfC27gorKiCyzsr9KFBhcmFtZXRlcikgOiBtb25leS0tv6jT4LbuKLWlzrs61KopCisqILe1u9goUmV0dXJuKSAgICA6IM7eCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzaG93X21vbmV5KHNwX3Bvc190KiBwb3MsIHVpbnQzMiBtb25leSkKK3sKKyAgY2hhciBtc2dbMzJdOworICBzcHJpbnRmKG1zZywiICAgICAlLjAyZiDUqiIsbW9uZXkvMTAwLjBmKTsKKyAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywiwNu8xsuut9E6Iixtc2csMCk7Cit9CisKK3ZvaWQgZ2xjZF90aW55X2luaXQodm9pZCkKK3sKKyAgdWludDggcmV0cnk7CisgIGdsY2RfdGlueV9zZXRfZm9udChGb250NXg3LDUsNywzMiwxMjcpOworICBnbGNkX2NsZWFyX2J1ZmZlcigpOworICBnbGNkX3dyaXRlKCk7CisgIGZvcihyZXRyeT0wOyByZXRyeTwzOyByZXRyeSsrKQorICB7CisgICAgaWYoZ2IyMzEyXzE2X3ZlcmlmeSgpID09IDApCisgICAgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGdsY2Rfd3JpdGUoKTsKK30KK3N0YXRpYyB2b2lkIHNob3dfdGl0bGUodm9pZCkKK3sKKyAgdWludDggY3RpbWVbN107CisgIGdsY2RfdGlueV9zZXRfZm9udChGb250NXg3LDUsNywzMiwxMjcpOworICBnbGNkX2NsZWFyX2J1ZmZlcigpOworICBzcF9nZXRfYmNkdGltZShjdGltZSk7CisgIHNwcmludGYobGluZV9idWZmLCAiJTAyeC0lMDJ4LSUwMnggJTAyeDolMDJ4OiUwMngiLAorICAgICAgICAgIGN0aW1lWzBdLGN0aW1lWzFdLGN0aW1lWzJdLAorICAgICAgICAgIGN0aW1lWzNdLGN0aW1lWzRdLGN0aW1lWzVdKTsKKyAgZ2xjZF9kcmF3X3N0cmluZ194eSgwLCAwLCBsaW5lX2J1ZmYpOworICBnbGNkX2RyYXdfbGluZSgwLCBHTENEX1RJVExFX0xJTkUsIDEyNywgOCwgQkxBQ0spOworfQorCitzdGF0aWMgdm9pZCBzaG93X2JvdHRvbShzcF9wb3NfdCogcG9zKQoreworICBzcHJpbnRmKGxpbmVfYnVmZiwiJTAyZDolMDJ4JTAyeCUwMnglMDJ4Iixwb3MtPmRldmljZW5vLCBwb3MtPmRldnBoeWlkWzBdLAorICAgICAgICAgIHBvcy0+ZGV2cGh5aWRbMV0sIHBvcy0+ZGV2cGh5aWRbMl0sIHBvcy0+ZGV2cGh5aWRbM10pOworICBnbGNkX2RyYXdfc3RyaW5nX3h5KDAsIEdMQ0RfQlVUVE9NX1ksIGxpbmVfYnVmZik7Cit9CisKK3N0YXRpYyBjaGFyIGxhc3RfcXJjb2RlX3VybFszMl09IHswfTsKK3ZvaWQgc2hvd19ob21lX3FyY29kZShjaGFyKiBxcmNvZGVfdXJsKQoreworICB1aW50OCBpLGo7CisgIGlmKE1FTUNNUChxcmNvZGVfdXJsLGxhc3RfcXJjb2RlX3VybCwoaW50KXN0cmxlbihxcmNvZGVfdXJsKSkgIT0gMCkKKyAgeworICAgIHNwcmludGYobGFzdF9xcmNvZGVfdXJsLCIlcyIscXJjb2RlX3VybCk7CisgICAgLy+2/s6swuvJ+rPJtePV8worICAgIFFSZW5jb2RlKGxhc3RfcXJjb2RlX3VybCwgTlVMTCk7CisgIH0KKyAgLy+2/s6swuu149Xzz9TKvgorICBmb3IoaT0wOyBpPE1BWF9NT0RVTEVTSVpFKjI7IGkrKykKKyAgeworICAgIGZvcihqPTA7IGo8TUFYX01PRFVMRVNJWkUqMjsgaisrKQorICAgIHsKKyAgICAgIHVpbnQ4X3QgcGl4ZWwgPSBtX2J5TW9kdWxlRGF0YVtpLzJdW2ovMl07CisKKyAgICAgIGdsY2Rfc2V0X3BpeGVsKGorNzAsIDEyK2ksIHBpeGVsKTsKKyAgICAgIGdsY2Rfc2V0X3BpeGVsKGorNzAsIDEyK2krMSwgcGl4ZWwpOworICAgICAgaiArKzsKKyAgICAgIGdsY2Rfc2V0X3BpeGVsKGorNzAsIDEyK2ksIHBpeGVsKTsKKyAgICAgIGdsY2Rfc2V0X3BpeGVsKGorNzAsIDEyK2krMSwgcGl4ZWwpOworICAgIH0KKyAgICBpICsrOworICB9CisgIGdsY2Rfd3JpdGUoKTsKKworfQorc3RhdGljIHVpbnQ4IGxhc3RfY3RpbWVbNl07Cit2b2lkIHNob3dfaG9tZShzcF9wb3NfdCogcG9zKQoreworICB1aW50OCBjdGltZVs2XTsKKyAgc3BfZ2V0X2JjZHRpbWUoY3RpbWUpOworICBpZihNRU1DTVAoY3RpbWUsbGFzdF9jdGltZSw2KSAhPSAwKQorICB7CisgICAgTUVNQ1BZKGxhc3RfY3RpbWUsY3RpbWUsNik7CisgICAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywiRrDmsb4iLFBST19WRVJTSU9OLDApOworCS8qCisgICAgaWYocG9zLT5zeXNjb25mLnJlZ2lzdGVyX2ZsYWcpCisgICAgeworICAgICAgaWYocG9zLT5keW5hbWljLndzX2NsaWVudF9zdGF0KQorICAgICAgeworICAgICAgICBzaG93X2hvbWVfcXJjb2RlKHBvcy0+ZHluYW1pYy5xcmNvZGVfdXJsKTsKKyAgICAgIH0KKyAgICB9CisJKi8KKyAgfQorfQorCit2b2lkIHNob3dfc2V0X2Rldm5vKHNwX3Bvc190KiBwb3MsIHVpbnQ4IGRldm5vKQoreworICBjaGFyIG1zZ1szMl07CisgIHNwcmludGYobXNnLCK7+rrFPSVkIixkZXZubyk7CisgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsICLJ6NbDu/q6xbPJuaYiLG1zZyxERUxBWV9USU1FMXMpOworfQordm9pZCBzaG93X3NldF9kZXZwaHlpZChzcF9wb3NfdCogcG9zLCB1aW50OCBkZXZwaHlpZFs0XSkKK3sKKyAgY2hhciBtc2dbMzJdOworICBzcHJpbnRmKG1zZywiSUQ9JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgZGV2cGh5aWRbMF0sZGV2cGh5aWRbMV0sZGV2cGh5aWRbMl0sZGV2cGh5aWRbM10pOworICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCLJ6NbDzu/A7UlEs8m5piIsbXNnLERFTEFZX1RJTUUxcyk7Cit9Cit2b2lkIHNob3dfc2V0X2Rldl9vZmZsaW5lX21heGhvdXIoc3BfcG9zX3QqIHBvcywgdWludDE2IG1heGhvdXIpCit7CisgIGNoYXIgbXNnWzMyXTsKKyAgc3ByaW50Zihtc2csIs3Ru/q5pNf3yrG85D0lZCIsbWF4aG91cik7CisgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsICLJ6NbDzdG7+rmk1/fKsbzks8m5piIsbXNnLERFTEFZX1RJTUUxcyk7Cit9CisKK3ZvaWQgc2hvd19tYW5hZ2VfcGFzc3dkKHNwX3Bvc190KiBwb3MsIGNvbnN0IGNoYXIqIGhpbnQsdWludDggcGFzc3dkW10sdWludDggbGVuKQoreworICBjaGFyIG1zZ1szMl07CisgIHN3aXRjaChsZW4pCisgIHsKKyAgY2FzZSAwOgorICAgIHNwcmludGYobXNnLCIiKTsKKyAgICBicmVhazsKKyAgY2FzZSAxOgorICAgIHNwcmludGYobXNnLCIlZCIscGFzc3dkWzBdKTsKKyAgICBicmVhazsKKyAgY2FzZSAyOgorICAgIHNwcmludGYobXNnLCIlZCVkIixwYXNzd2RbMF0scGFzc3dkWzFdKTsKKyAgICBicmVhazsKKyAgY2FzZSAzOgorICAgIHNwcmludGYobXNnLCIlZCVkJWQiLHBhc3N3ZFswXSxwYXNzd2RbMV0scGFzc3dkWzJdKTsKKyAgICBicmVhazsKKyAgY2FzZSA0OgorICAgIHNwcmludGYobXNnLCIlZCVkJWQlZCIscGFzc3dkWzBdLHBhc3N3ZFsxXSxwYXNzd2RbMl0scGFzc3dkWzNdKTsKKyAgICBicmVhazsKKyAgY2FzZSA1OgorICAgIHNwcmludGYobXNnLCIlZCVkJWQlZCVkIixwYXNzd2RbMF0scGFzc3dkWzFdLHBhc3N3ZFsyXSxwYXNzd2RbM10scGFzc3dkWzRdKTsKKyAgICBicmVhazsKKyAgY2FzZSA2OgorICAgIHNwcmludGYobXNnLCIlZCVkJWQlZCVkJWQiLHBhc3N3ZFswXSxwYXNzd2RbMV0scGFzc3dkWzJdLHBhc3N3ZFszXSxwYXNzd2RbNF0scGFzc3dkWzVdKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBzcHJpbnRmKG1zZywiIik7CisgIH0KKyAgZGlzcF9oaW50X2luZm9fdHdvKHBvcyxoaW50LG1zZywwKTsKK30KKwordm9pZCBzaG93X2Vycm9yKHNwX3Bvc190KiBwb3MsIGNvbnN0IGNoYXIqIGhpbnQsIHVpbnQxNiBlcnJjb2RlKQoreworICBjaGFyIG1zZ1szMl07CisgIHN3aXRjaChlcnJjb2RlKQorICB7CisgIGNhc2UgUkNfUFNBTV9FUlI6CisgICAgc3ByaW50Zihtc2csIiVzIiwgIlNBTbi0zrvKp7DcIik7CisgICAgYnJlYWs7CisgIGNhc2UgUkNfQ0FSRF9MT0dJTjoKKyAgICBzcHJpbnRmKG1zZywiJXMiLCAi0enWpMPY1L/Kp7DcIik7CisgICAgYnJlYWs7CisgIGNhc2UgUkNfQ0FSRF9SRUFEOgorICAgIHNwcmludGYobXNnLCIlcyIsICK2wb+oyqew3CIpOworICAgIGJyZWFrOworICBjYXNlIFJDX0NBUkRfV1JJVEU6CisgICAgc3ByaW50Zihtc2csIiVzIiwgItC0v6jKp7DcIik7CisgICAgYnJlYWs7CisgIGNhc2UgUkNfRkxBU0hfRVJSOgorICAgIHNwcmludGYobXNnLCIlcyIsICJGTEFTSNLss6MiKTsKKyAgICBicmVhazsKKyAgY2FzZSBSQ19IQVJEV0FSRV9FUlI6CisgICAgc3ByaW50Zihtc2csIiVzIiwgIrnMvP7S7LOjIik7CisgICAgYnJlYWs7CisgIGNhc2UgUkNfRkxBU0hfTk9fUklHSFQ6CisgICAgc3ByaW50Zihtc2csIiVzIiwgIkZMQVNIz97WxiIpOworICAgIGJyZWFrOworICBjYXNlIFJDX0NBUkRfTk9SSUdIVDoKKyAgICBzcHJpbnRmKG1zZywiJXMiLCAiv6jO3sioz94iKTsKKyAgICBicmVhazsKKyAgY2FzZSBSQ19DQVJEX0VYUElSRUQ6CisgICAgc3ByaW50Zihtc2csIiVzIiwgIr+o0tG5/cbaIik7CisgICAgYnJlYWs7CisgIGNhc2UgUkNfQ0FSRF9MT1NUOgorICAgIHNwcmludGYobXNnLCIlcyIsICK/qNLRy/i2qCIpOworICAgIGJyZWFrOworICBjYXNlIFJDX0NBUkROT19FWENFUFQ6CisgICAgc3ByaW50Zihtc2csIiVzIiwgIr+o0uyzoyIpOworICAgIGJyZWFrOworICBjYXNlIFJDX0NBUkRfVElNRU9VVDoKKyAgICBzcHJpbnRmKG1zZywiJXMiLCAiyrnTw8yrvsMiKTsKKyAgICBicmVhazsKKyAgY2FzZSBSQ19DQVJEQkFMX0VYQ0VQVDoKKyAgICBzcHJpbnRmKG1zZywiJXMiLCAi0+C27tLss6MiKTsKKyAgICBicmVhazsKKyAgY2FzZSBSQ19DQVJEQkFMX0xBQ0s6CisgICAgc3ByaW50Zihtc2csIiVzIiwgIsfrwaq7+s/7t9EiKTsKKyAgICBicmVhazsKKyAgY2FzZSBSQ19ERVZQSFlJRF9OT1RTRVQ6CisgICAgc3ByaW50Zihtc2csIiVzIiwgIs60yejWw7v6usUiKTsKKyAgICBicmVhazsKKyAgY2FzZSBSQ19GRUVSQVRFX05PVFNFVDoKKyAgICBzcHJpbnRmKG1zZywiJXMiLCAizrTJ6NbDt9HCyiIpOworICAgIGJyZWFrOworICBjYXNlIFJDX0RFVl9PRkZMSU5FX0VSUk9SOgorICAgIHNwcmludGYobXNnLCIlcyIsICLJ6LG4zdG7+syrvsMiKTsKKyAgICBicmVhazsKKyAgY2FzZSBSQ19UUkFOU0RUTF9GVUxMOgorICAgIHNwcmludGYobXNnLCIlcyIsICLB98uu0tHC+iIpOworICAgIGJyZWFrOworICBjYXNlIFJDX0ZJTEUwOV9DUkNfRVJSOgorICAgIHNwcmludGYobXNnLCIlcyIsICIwOUNSQ7TtzvMiKTsKKyAgICBicmVhazsKKyAgY2FzZSBSQ19GSUxFMTBfQ1JDX0VSUjoKKyAgICBzcHJpbnRmKG1zZywiJXMiLCAiMTBDUkO07c7zIik7CisgICAgYnJlYWs7CisgIGNhc2UgUkNfQ0FSRF9JTlZBTElEOgorICAgIHNwcmludGYobXNnLCIlcyIsICLO3tCnv6giKTsKKyAgICBicmVhazsKKyAgY2FzZSBSQ19GRUVOVU1fRVJST1I6CisgICAgc3ByaW50Zihtc2csIiVzIiwgIrfRwsq49sr9tO3O8yIpOworICAgIGJyZWFrOworICBjYXNlIFJDX05PVFNVUFBPUlQ6CisgICAgc3ByaW50Zihtc2csIiVzIiwgIrK71qez1iIpOworICAgIGJyZWFrOworICBjYXNlIFJDX05PVF9TQU1FX0NBUkQ6CisgICAgc3ByaW50Zihtc2csIiVzIiwgIrK7zay/qCIpOworICAgIGJyZWFrOworICBjYXNlIFJDX01PREVfTk9UX1NVUFBPUlQ6CisgICAgc3ByaW50Zihtc2csIiVzIiwgIsSjyr2yu9ans9YiKTsKKyAgICBicmVhazsKKyAgY2FzZSBSQ19VUERQUk9HX0VSUjoKKyAgICBzcHJpbnRmKG1zZywiJXMiLCAiyf28tsqnsNwiKTsKKyAgICBicmVhazsKKyAgY2FzZSBSQ19DT05GUEFSQV9DUkNfRVJSOgorICAgIHNwcmludGYobXNnLCIlcyIsICLF5NbDQ1JDtO3O8yIpOworICAgIGJyZWFrOworICBjYXNlIFJDX1RSQU5TRFRMX05PX0VSUjoKKyAgICBzcHJpbnRmKG1zZywiJXMiLCAiwffLrrrF0uyzoyIpOworICAgIGJyZWFrOworICBjYXNlIFJDX0RFVklDRU5PX09VVDoKKyAgICBzcHJpbnRmKG1zZywiJXMiLCAiu/q6xbn9tPMiKTsKKyAgICBicmVhazsKKyAgY2FzZSBSQ19RUkNPREVfRkFJTFVSRToKKyAgCXNwcmludGYobXNnLCIlcyIsICK2/s6swuu78cihyqew3CIpOworCWJyZWFrOworICBjYXNlIFJDX1FSQ09ERV9USU1FT1VUOgorICAJc3ByaW50Zihtc2csIiVzIiwgIrb+zqzC67OsyrEiKTsKKwlicmVhazsKKyAgY2FzZSBSQ19RUkNPREVfUVVFUllfRkFJTDoKKyAgCXNwcmludGYobXNnLCIlcyIsICK2/s6swuvIz9akyqew3CIpOworCWJyZWFrOworICBjYXNlIFJDX0RFVl9OT1RfTE9HSU46CisgIAlzcHJpbnRmKG1zZywiJXMiLCAiyeixuM60x6m1vSIpOworCWJyZWFrOworICBjYXNlIFJDX0RFVl9GQVVMVDoKKyAgCXNwcmludGYobXNnLCIlcyIsICLJ6LG40snLxrnK1c8iKTsKKwlicmVhazsKKyAgY2FzZSBSQ19ERVZfTk9TRVRfRkxPV1NFTlNPUl9VTklUOgorICAJc3ByaW50Zihtc2csIiVzIiwgIsH3wb+8xsvjtaXOu860yejWwyIpOworCWJyZWFrOworICBjYXNlIFJDX0NBUkRfQVVUSEVOVElDQVRJT046CisgIAlzcHJpbnRmKG1zZywiJXMiLCAiv6jIz9akyqew3CIpOworCWJyZWFrOworICBkZWZhdWx0OgorICAgIHNwcmludGYobXNnLCK07c7zwus9MHglMDR4IixlcnJjb2RlKTsKKyAgfQorICBkaXNwX2hpbnRfaW5mb190d28ocG9zLGhpbnQsbXNnLERFTEFZX1RJTUUzcyk7Cit9CisKK3ZvaWQgZGlzcF9oaW50X2luZm9fdGhyZWUoc3BfcG9zX3QqIHBvcyxjb25zdCBjaGFyKiBtc2cxLGNvbnN0IGNoYXIqIG1zZzIsY29uc3QgY2hhciogbXNnMyx1aW50MzIgbXMpCit7CisgIHNob3dfdGl0bGUoKTsKKyAgc2hvd19ib3R0b20ocG9zKTsKKworICBzbnByaW50ZihsaW5lX2J1ZmYsc2l6ZW9mIGxpbmVfYnVmZiwiJXMgICAgICAgICAgICAgICAiLG1zZzEpOworICBnYjIzMTJfMTZfZHJhd19zdHIoMCwgR0xDRF9DT05URU5UX1lfT05FLCBsaW5lX2J1ZmYpOworICBzbnByaW50ZihsaW5lX2J1ZmYsc2l6ZW9mIGxpbmVfYnVmZiwiJXMgICAgICAgICAgICAgICAiLG1zZzIpOworICBnYjIzMTJfMTZfZHJhd19zdHIoMCwgR0xDRF9DT05URU5UX1lfVFdPLCBsaW5lX2J1ZmYpOworICBzbnByaW50ZihsaW5lX2J1ZmYsc2l6ZW9mIGxpbmVfYnVmZiwiJXMgICAgICAgICAgICAgICAiLG1zZzMpOworICBnYjIzMTJfMTZfZHJhd19zdHIoMCwgR0xDRF9DT05URU5UX1lfVEhSRUUsIGxpbmVfYnVmZik7CisKKyAgZ2xjZF93cml0ZSgpOworICBpZihtcyA+IDApCisgIHsKKyAgICBEZWxheV9tcyhtcyk7CisgIH0KK30KKwordm9pZCBkaXNwX2hpbnRfaW5mb190d28oc3BfcG9zX3QqIHBvcyxjb25zdCBjaGFyKiBtc2cxLGNvbnN0IGNoYXIqIG1zZzIsdWludDMyIG1zKQoreworICBzaG93X3RpdGxlKCk7CisgIHNob3dfYm90dG9tKHBvcyk7CisKKyAgc25wcmludGYobGluZV9idWZmLHNpemVvZiBsaW5lX2J1ZmYsIiVzICAgICAgICAgICAgICAgIixtc2cxKTsKKyAgZ2IyMzEyXzE2X2RyYXdfc3RyKDAsIEdMQ0RfQ09OVEVOVF9ZX09ORSwgbGluZV9idWZmKTsKKyAgc25wcmludGYobGluZV9idWZmLHNpemVvZiBsaW5lX2J1ZmYsIiVzICAgICAgICAgICAgICAgIixtc2cyKTsKKyAgZ2IyMzEyXzE2X2RyYXdfc3RyKDAsIEdMQ0RfQ09OVEVOVF9ZX1RXTywgbGluZV9idWZmKTsKKworICBnbGNkX3dyaXRlKCk7CisgIGlmKG1zID4gMCkKKyAgeworICAgIERlbGF5X21zKG1zKTsKKyAgfQorfQordm9pZCBkaXNwX2hpbnRfaW5mbyhzcF9wb3NfdCogcG9zLGNvbnN0IGNoYXIqIG1zZzEsdWludDMyIG1zKQoreworICBzaG93X3RpdGxlKCk7CisgIHNob3dfYm90dG9tKHBvcyk7CisKKyAgc25wcmludGYobGluZV9idWZmLHNpemVvZiBsaW5lX2J1ZmYsIiVzICAgICAgICAgICAgICAgIixtc2cxKTsKKyAgZ2IyMzEyXzE2X2RyYXdfc3RyKDAsIEdMQ0RfQ09OVEVOVF9ZX09ORSwgbGluZV9idWZmKTsKKyAgc25wcmludGYobGluZV9idWZmLHNpemVvZiBsaW5lX2J1ZmYsIiAgICAgICAgICAgICAgICAgICIpOworICBnYjIzMTJfMTZfZHJhd19zdHIoMCwgR0xDRF9DT05URU5UX1lfVFdPLCBsaW5lX2J1ZmYpOworCisgIGdsY2Rfd3JpdGUoKTsKKyAgaWYobXMgPiAwKQorICB7CisgICAgRGVsYXlfbXMobXMpOworICB9Cit9Cit2b2lkIGRpc3Bfc2VydmVyX2Vycm1zZyhzcF9wb3NfdCogcG9zLGNvbnN0IGNoYXIqIGhpbnQsdWludDggZGF0YVtdLHVpbnQxNiBsZW4pCit7CisgIHVpbnQ4IHN0cmxlbjsKKyAgY2hhciBlcnJtc2dbNjRdOworICBzdHJsZW4gPSBkYXRhWzBdOworICAvL2NvbW1hbmQrY2FuaWQrZXhjbWQrZmxhZytyZXRjb2RlK2xlbitjcmMKKyAgaWYoKHN0cmxlbiArOCkgIT0gbGVuKQorICB7CisgICAgZGlzcF9oaW50X2luZm9fdHdvKHBvcyxoaW50LCLH68fzs6zKsSIsREVMQVlfVElNRTNzKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYoc3RybGVuID4gMzIpCisgIHsKKyAgICBzdHJsZW4gPSAzMjsKKyAgfQorICBzbnByaW50ZihlcnJtc2csc3RybGVuKzEsIiVzIixkYXRhICsxKTsKKyAgZGlzcF9oaW50X2luZm9fdHdvKHBvcyxoaW50LGVycm1zZyxERUxBWV9USU1FM3MpOworfQorCmRpZmYgLS1naXQgYS9zdXB3aXNkb20vc3BfZGlzcGxheS5oIGIvc3Vwd2lzZG9tL3NwX2Rpc3BsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTYwMjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3Vwd2lzZG9tL3NwX2Rpc3BsYXkuaApAQCAtMCwwICsxLDM2IEBACisjaWZuZGVmIF9TUF9ESVNQTEFZX0hfCisjZGVmaW5lIF9TUF9ESVNQTEFZX0hfCisKKyNpbmNsdWRlICJzcF9jb25maWcuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoguq/K/ShOYW1lKQkgIDogdm9pZCAgU2hvd19FcnJvcih1aW50MzIgZXJyY29kZSkKKyoguabE3ChGdW5jdGlvbikgIDogz9TKvrTtzvO0+sLrCisqILLOyv0oUGFyYW1ldGVyKSA6IGVycmNvZGUgLS0gtO3O87T6usUKKyogt7W72ChSZXR1cm4pCSAgOiDO3gorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGdsY2RfdGlueV9pbml0KHZvaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC6r8r9KE5hbWUpCSAgOiB2b2lkICBTaG93X1Bhc3Modm9pZCkKKyoguabE3ChGdW5jdGlvbikgIDogz9TKvlBBU1MKKyogss7K/ShQYXJhbWV0ZXIpIDogTlVMTAorKiC3tbvYKFJldHVybikJICA6IM7eCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwl2b2lkIHNob3dfc2V0X2Rldm5vKHNwX3Bvc190KiBwb3MsIHVpbnQ4IGRldm5vKTsKKwl2b2lkIHNob3dfc2V0X2RldnBoeWlkKHNwX3Bvc190KiBwb3MsIHVpbnQ4IGRldnBoeWlkWzRdKTsKKwl2b2lkIHNob3dfc2V0X2Rldl9vZmZsaW5lX21heGhvdXIoc3BfcG9zX3QqIHBvcywgdWludDE2IG1heGhvdXIpOworCXZvaWQgc2hvd19lcnJvcihzcF9wb3NfdCogcG9zLCBjb25zdCBjaGFyKiBoaW50LHVpbnQxNiBjb2RlKTsKKwl2b2lkIHNob3dfaG9tZShzcF9wb3NfdCogcG9zKTsKKwl2b2lkIHNob3dfbW9uZXkoc3BfcG9zX3QqIHBvcywgdWludDMyIG1vbmV5KTsKKwl2b2lkIHNob3dfbWFuYWdlX3Bhc3N3ZChzcF9wb3NfdCogcG9zLCBjb25zdCBjaGFyKiBoaW50LHVpbnQ4IHBhc3N3ZFtdLHVpbnQ4IGxlbik7CisJdm9pZCBzaG93X2hvbWVfcXJjb2RlKGNoYXIqIHFyY29kZV91cmwpOworCQorCXZvaWQgZGlzcF9oaW50X2luZm8oc3BfcG9zX3QqIHBvcywgY29uc3QgY2hhciogbXNnMSx1aW50MzIgbXMpOworCXZvaWQgZGlzcF9oaW50X2luZm9fdHdvKHNwX3Bvc190KiBwb3MsIGNvbnN0IGNoYXIqIG1zZzEsY29uc3QgY2hhciogbXNnMix1aW50MzIgbXMpOworCXZvaWQgZGlzcF9oaW50X2luZm9fdGhyZWUoc3BfcG9zX3QqIHBvcywgY29uc3QgY2hhciogbXNnMSxjb25zdCBjaGFyKiBtc2cyLAorCQkJCQkJCSAgY29uc3QgY2hhciogbXNnMyx1aW50MzIgbXMpOworCXZvaWQgZGlzcF9zZXJ2ZXJfZXJybXNnKHNwX3Bvc190KiBwb3MsIGNvbnN0IGNoYXIqIGhpbnQsdWludDggZGF0YVtdLHVpbnQxNiBsZW4pOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3Vwd2lzZG9tL3NwX2ZsYXNoLmMgYi9zdXB3aXNkb20vc3BfZmxhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzg4YWVkCi0tLSAvZGV2L251bGwKKysrIGIvc3Vwd2lzZG9tL3NwX2ZsYXNoLmMKQEAgLTAsMCArMSwxMjMgQEAKKyNpbmNsdWRlICJzcF9jb25zdGFudC5oIgorI2luY2x1ZGUgInNwX3V0aWwuaCIKKworI2luY2x1ZGUgInNwX2ZsYXNoLmgiCisKK3VpbnQxNiBzcF9mbGFzaF9yZWFkKHVpbnQzMiBhZGRyLHVpbnQ4IGJ1ZltdLHVpbnQzMiBsZW4pCit7CisgIHJldHVybiBIV19GbGFzaF9SZWFkKGFkZHIsbGVuLGJ1Zik7Cit9Cit1aW50MTYgc3BfZmxhc2hfd3JpdGUodWludDMyIGFkZHIsdWludDggYnVmW10sdWludDMyIGxlbikKK3sKKyAgaWYoYWRkciA8IERFRl9JQVBfQkFTRV9BRERSKQorICB7CisgICAgcmV0dXJuIFJDX0ZMQVNIX05PX1JJR0hUOworICB9CisgIHJldHVybiBIV19GbGFzaF9Ob3RFcmFzZVdyaXRlKGFkZHIsbGVuLGJ1Zik7Cit9Cit1aW50MTYgc3BfZmxhc2hfZXJhc2UodWludDMyIGFkZHIpCit7CisgIGlmKGFkZHIgPCBERUZfSUFQX0JBU0VfQUREUikKKyAgeworICAgIHJldHVybiBSQ19GTEFTSF9OT19SSUdIVDsKKyAgfQorICByZXR1cm4gSFdfRmxhc2hfUGFnZUVyYXNlKGFkZHIgLyBGTEFTSF9QQUdFX1NJWkUpOworfQorCisvKioKKyoqtsHIodK70rPK/b7dLMirRkax7cq+zt7K/b7dCisqKkBwYXJhbSBsZW4gPiAxMjggZXJyb3IKKyoqQHJldHVybiC3tbvYMLHtyr6y6dXSyv2+3bPJuaYKKyoqQHJldHVybiC3tbvYt8cwse3Kvs7e09DQp8r9vt0KKyoqLwordWludDE2IHNwX2ZsYXNoX3BhZ2VfcmVhZCh1aW50MzIgYWRkcix1aW50OCBidWZbXSx1aW50MzIgbGVuKQoreworICB1aW50MzIgaTsKKyAgdWludDMyIG9mZnNldCA9IDA7CisgIHVpbnQ4IHRlbXBbMTI4XTsKKworICBpZihsZW4gPiBzaXplb2YodGVtcCkpCisgIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHdoaWxlKDEpCisgIHsKKyAgICBpID0gMDsKKyAgICBzcF9mbGFzaF9yZWFkKGFkZHIgK29mZnNldCx0ZW1wLCBsZW4pOworICAgIHdoaWxlKGkgPCBsZW4pCisgICAgeworICAgICAgaWYoMHhGRiA9PSB0ZW1wW2ldKQorICAgICAgeworICAgICAgICArK2k7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZihsZW4gPT0gaSkKKyAgICB7CisgICAgICBpZigwID09IG9mZnNldCkKKyAgICAgIHsKKyAgICAgICAgLy/O3sr9vt0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHNwX2ZsYXNoX3JlYWQoYWRkciArb2Zmc2V0IC1sZW4sYnVmLCBsZW4pOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgICAgb2Zmc2V0ICs9IGxlbjsKKyAgICBpZihERUZfRkxBU0hfUGFnZVNpemUgPCAob2Zmc2V0ICtsZW4pKSAvLyAgs6y5/bWx0rPOtNXStb23tbvYMQorICAgIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorfQorLyoqCisqKtC00rvSs8r9vt0KKyoqQHBhcmFtIGxlbiA+IDMyIGVycm9yCisqKkByZXR1cm4gt7W72DCx7cq+vMfCvMr9vt2zybmmCisqKkByZXR1cm4gt7W72LfHMLHtyr7QtEZMQVNIyqew3AorKiovCit1aW50MTYgc3BfZmxhc2hfcGFnZV93cml0ZSh1aW50MzIgYWRkcix1aW50OCBidWZbXSx1aW50MzIgbGVuKQoreworICB1aW50MzIgaTsKKyAgdWludDMyIG9mZnNldCA9IDA7CisgIHVpbnQ4IHRlbXBbNjRdOworCisgIGlmKGxlbiA+IDY0KQorICB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgd2hpbGUoMSkKKyAgeworICAgIGkgPSAwOworICAgIHNwX2ZsYXNoX3JlYWQoYWRkciArb2Zmc2V0LHRlbXAsIGxlbik7CisgICAgd2hpbGUoaSA8IGxlbikKKyAgICB7CisgICAgICBpZigweEZGID09IHRlbXBbaV0pCisgICAgICB7CisgICAgICAgICsraTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmKERFRl9GTEFTSF9QYWdlU2l6ZSA8IChvZmZzZXQgK2xlbikpIC8vICCzrLn9tbHSs7Htyr7S0dC0wvosssGz/dbY0LQKKyAgICB7CisgICAgICBzcF9mbGFzaF9lcmFzZShhZGRyKTsKKyAgICAgIHJldHVybiBzcF9mbGFzaF93cml0ZShhZGRyLGJ1ZiwgbGVuKTsKKyAgICB9CisgICAgaWYobGVuID09IGkpCisgICAgeworICAgICAgLy/O3sr9vt0KKyAgICAgIHJldHVybiBzcF9mbGFzaF93cml0ZShhZGRyICtvZmZzZXQsYnVmLCBsZW4pOworICAgIH0KKyAgICBvZmZzZXQgKz0gbGVuOworICB9Cit9CisKZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9mbGFzaC5oIGIvc3Vwd2lzZG9tL3NwX2ZsYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAxNTE3ZAotLS0gL2Rldi9udWxsCisrKyBiL3N1cHdpc2RvbS9zcF9mbGFzaC5oCkBAIC0wLDAgKzEsNjMgQEAKKyNpZm5kZWYgX1NQX0ZMQVNIX0hfCisjZGVmaW5lIF9TUF9GTEFTSF9IXworCisjaW5jbHVkZSAiLi4vc3lzX2h3L1Byal9GbGFzaENmZy5IIgorI2luY2x1ZGUgInNwX2NvbmZpZy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy9FRVBST00gv9W85C8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vRkxBU0ggv9W85C8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2lmIDAKKyNkZWZpbmUgQUREUl9GTEFTSF9CRUdJTiAJCQkweDE3MDAwIAkvLyBiYXNlIGFkZHIgCisjZGVmaW5lIEFERFJfQ09ORklHX1BBUkEJCQkweDE3MDAwCQkvL8Xk1sOyzsr9CisKKyNkZWZpbmUgQUREUl9UUkFOU0RUTF9QVFIgCQkJMHgxODAwMAkJLy/B98uu1rjV6worI2RlZmluZSBBRERSX1RSQU5TRFRMX0JFR0lOIAkJMHgyMDAwMDAJLy/B98uuxvDKvAorI2RlZmluZSBBRERSX1RSQU5TRFRMX0VORCAJCQkweDM1MDAwMAkvL8H3y6694cr4CisjZGVmaW5lIEFERFJfTUFYIAkJCQkJMHg0MDAwMDAKKyNlbmRpZgorLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8qKioqKioqKirUtrPMyf28ts7EvP605rSiMTAw0rMqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioq16LS4sn9vLa12Na30+tCT09Uyf28trXY1rexo7PW0rvWwioqLworI2RlZmluZSBERUZfSUFQX0JBU0VfQUREUiAJCQkoREVGX0ZMQVNIX0lBUF9BcHBDb2RlU3RhcnRBZGQpCisjZGVmaW5lIERFRl9JYXBNYXJrQWRkcgkJCQkoIERFRl9JQVBfQkFTRV9BRERSICsgMSAqIERFRl9GTEFTSF9QYWdlU2l6ZSApCQkJLy9JQVDJ/by2seq8x7XY1rcKKyNkZWZpbmUgREVGX0VyYU1hcmtBZGRyCQkJCSggREVGX0lBUF9CQVNFX0FERFIgKyAyICogREVGX0ZMQVNIX1BhZ2VTaXplICkJCQkvL7LBs/1GTEFTSLHqvMcKKyNkZWZpbmUJREVGX0lhcERhdGFBZGRyCQkJCSggREVGX0lBUF9CQVNFX0FERFIgKyAzICogREVGX0ZMQVNIX1BhZ2VTaXplICkJCQkvL0lBUMr9vt3H+Mbwyry12Na3CisKKyNkZWZpbmUgREVGX0ZMQVNIX2NvZGVTdGFydEFkZAkgCShERUZfSWFwRGF0YUFkZHIpCisKKyNkZWZpbmUgQUREUl9VUEdSQURFX1VQSU5GTyAJCShBRERSX0ZMQVNIX0VORCArIERFRl9GTEFTSF9QYWdlU2l6ZSAqMSkKKyNkZWZpbmUgQUREUl9LRVlfUEFSQQkJCQkoQUREUl9VUEdSQURFX1VQSU5GTyArIERFRl9GTEFTSF9QYWdlU2l6ZSAqMSkKKworI2RlZmluZSBBRERSX1VQR1JBREVfQkVHSU4gCQkJKERFRl9GTEFTSF9jb2RlU3RhcnRBZGQpCisjZGVmaW5lIEFERFJfVVBHUkFERV9FTkQgCQkJKERFRl9GTEFTSF9JQVBfQXBwQ29kZUVuZEFkZCAtREVGX0ZMQVNIX1BhZ2VTaXplKQorCisjZGVmaW5lIEFERFJfQVBQTElDQVRJT05fQkFTRQkJMHgxMzAwMDAgIC8vYmFzZSBhZGRyCisjZGVmaW5lIEFERFJfQVBQX1ZFUlNJT04JCQkoQUREUl9BUFBMSUNBVElPTl9CQVNFKSAgLy+w5rG+serKtgorCisjZGVmaW5lIEFERFJfQ09ORklHX1BBUkEJCQkoQUREUl9BUFBfVkVSU0lPTiArREVGX0ZMQVNIX1BhZ2VTaXplICoxKS8vxeTWw7LOyv0KKworI2RlZmluZSBBRERSX0xBU1RfVFJBTlNOTwkJCShBRERSX0NPTkZJR19QQVJBICtERUZfRkxBU0hfUGFnZVNpemUgKjEwKQorI2RlZmluZSBBRERSX1VOQ09ORklSTV9UUkFOU05PCQkoQUREUl9MQVNUX1RSQU5TTk8gK0RFRl9GTEFTSF9QYWdlU2l6ZSAqMSkKKyNkZWZpbmUgQUREUl9UUkFOU0RUTF9CRUdJTgkJCShBRERSX1VOQ09ORklSTV9UUkFOU05PICtERUZfRkxBU0hfUGFnZVNpemUgKjEpCisjZGVmaW5lIEFERFJfVFJBTlNEVExfRU5EIAkJCShBRERSX1RSQU5TRFRMX0JFR0lOICtERUZfRkxBU0hfUGFnZVNpemUgKjEwMCkKKyNkZWZpbmUgQUREUl9GTEFTSF9FTkQJCQkJKEFERFJfVFJBTlNEVExfRU5EKQorI2RlZmluZSBBRERSX01BWCAJCQkJCTB4NDAwMDAwCisKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwordWludDE2IHNwX2ZsYXNoX3JlYWQodWludDMyIGFkZHIsdWludDggYnVmW10sdWludDMyIGxlbik7Cit1aW50MTYgc3BfZmxhc2hfd3JpdGUodWludDMyIGFkZHIsdWludDggYnVmW10sdWludDMyIGxlbik7Cit1aW50MTYgc3BfZmxhc2hfZXJhc2UodWludDMyIGFkZHIpOwordWludDE2IHNwX2ZsYXNoX3BhZ2VfcmVhZCh1aW50MzIgYWRkcix1aW50OCBidWZbXSx1aW50MzIgbGVuKTsKK3VpbnQxNiBzcF9mbGFzaF9wYWdlX3dyaXRlKHVpbnQzMiBhZGRyLHVpbnQ4IGJ1ZltdLHVpbnQzMiBsZW4pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9tZW51LmMgYi9zdXB3aXNkb20vc3BfbWVudS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NDdkNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zdXB3aXNkb20vc3BfbWVudS5jCkBAIC0wLDAgKzEsNjU1IEBACisjaW5jbHVkZSAic3BfbWVudS5oIgorI2luY2x1ZGUgInNwX3V0aWwuaCIKKyNpbmNsdWRlICJzcF9kYXRhLmgiCisjaW5jbHVkZSAic3RkbGliLmgiCisjaW5jbHVkZSAic3RkaW8uaCIKKyNpbmNsdWRlICJzcF9jb25zdGFudC5oIgorI2luY2x1ZGUgInNwX2NvbW11bmljYXRlLmgiCisjaW5jbHVkZSAic3BfZGlzcGxheS5oIgorI2luY2x1ZGUgInNwX3VwZ3JhZGUuaCIKKyNpbmNsdWRlICIuLi9uZWNfaGFyZHdhcmUuaCIKKwordHlwZWRlZiB2b2lkKCptZW51X2Z1bmNfdCkoc3BfcG9zX3QqIHBvcyk7Cit0eXBlZGVmIHN0cnVjdAoreworICBjaGFyKiBoaXQ7CisgIG1lbnVfZnVuY190IGZ1bmM7Cit9IG1lbnVfdDsKKworc3RhdGljIHZvaWQgc3Bfc2hvd19zeXNwYXJhKHNwX3Bvc190KiBwb3MpCit7CisgIHVpbnQzMiB0aWNrZXI7CisgIHVpbnQ4IGtleWNvZGU7CisgIHVpbnQ4IGtleV9wcmVzcyA9IDE7CisgIHVpbnQ4IG1heF9jbnQgPSAwOworICB1aW50OCBvZmZzZXQgPSAwOworICB1aW50OCB1bmNvbmZpcm1fdHJhbnNudW07CisgIGNoYXIgc3lzcGFyYVs5XVsxN107CisKKyAgTUVNQ0xFQVIoc3lzcGFyYSwgc2l6ZW9mKHN5c3BhcmEpKTsKKyAgc3ByaW50ZihzeXNwYXJhW29mZnNldCsrXSwgIsnosbjXtMysOiIpOworICBpZihwb3MtPmRldmxvZ2luLmxvZ2luX2ZsYWcgPT0gMSkKKyAgeworICAgIHNwcmludGYoc3lzcGFyYVtvZmZzZXQrK10sICLS0ceptb0iKTsKKyAgfQorICBlbHNlIGlmKHBvcy0+ZGV2bG9naW4ubG9naW5fZmxhZyA9PSAwKQorICB7CisgICAgc3ByaW50ZihzeXNwYXJhW29mZnNldCsrXSwgIs60x6m1vSIpOworICB9CisgIGVsc2UgaWYocG9zLT5kZXZsb2dpbi5sb2dpbl9mbGFnID09IDIpCisgIHsKKyAgICBzcHJpbnRmKHN5c3BhcmFbb2Zmc2V0KytdLCAi0tHXos/6Iik7CisgIH0KKyAgc3ByaW50ZihzeXNwYXJhW29mZnNldCsrXSwgIsG0wrfXtMysOiIpOworICBpZihwb3MtPmxpbmtfc3RhdCkKKyAgeworICAgIHNwcmludGYoc3lzcGFyYVtvZmZzZXQrK10sICLBqs34Iik7CisgIH0KKyAgZWxzZQorICB7CisgICAgc3ByaW50ZihzeXNwYXJhW29mZnNldCsrXSwgItbQts8iKTsKKyAgfQorICBzcHJpbnRmKHN5c3BhcmFbb2Zmc2V0KytdLCAizrTJz7SrwffLrjoiKTsKKyAgaWYocG9zLT51bmNvbmZpcm1fdHJhbnNkdGwudHJhbnNhZGRyIDw9IHBvcy0+bGFzdF90cmFuc2R0bC50cmFuc2FkZHIpCisgIHsKKyAgICBpZihwb3MtPnVuY29uZmlybV90cmFuc2R0bC50cmFuc2FkZHIgPT0gcG9zLT5sYXN0X3RyYW5zZHRsLnRyYW5zYWRkcikKKyAgICB7CisgICAgICB1bmNvbmZpcm1fdHJhbnNudW0gPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgdW5jb25maXJtX3RyYW5zbnVtID0gKChwb3MtPmxhc3RfdHJhbnNkdGwudHJhbnNhZGRyIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLT51bmNvbmZpcm1fdHJhbnNkdGwudHJhbnNhZGRyKS9zaXplb2Yoc3BfdHJhbnNkdGxfdCkpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICB1bmNvbmZpcm1fdHJhbnNudW0gPSAwOworICB9CisgIHNwcmludGYoc3lzcGFyYVtvZmZzZXQrK10sICIlZLHKIiwgdW5jb25maXJtX3RyYW5zbnVtKTsKKyAgc3ByaW50ZihzeXNwYXJhW29mZnNldCsrXSwgIs/7t9HA4NDNOiIpOworICBzcHJpbnRmKHN5c3BhcmFbb2Zmc2V0KytdLCAivMfVy8/7t9EiKTsKKworICBtYXhfY250ID0gc2l6ZW9mKHN5c3BhcmEpL3NpemVvZihzeXNwYXJhWzBdKS8yOworICBvZmZzZXQgPSAwOworICB0aWNrZXIgPSBzcF9nZXRfdGlja2VyKCk7CisgIHdoaWxlKHNwX2dldF90aWNrZXIoKS10aWNrZXIgPD0gREVMQVlfVElNRTYwcykKKyAgeworICAgIGtleWNvZGUgPSBzcF9nZXRfa2V5KCk7CisgICAgaWYoa2V5Y29kZSAhPSBTUF9LRVlfTk9ORSkKKyAgICB7CisgICAgICBrZXlfcHJlc3MgPSAxOworICAgICAgc3dpdGNoKGtleWNvZGUpCisgICAgICB7CisgICAgICBjYXNlIFNQX0tFWV8wOgorICAgICAgICBpZihvZmZzZXQgPCBtYXhfY250LTEpCisgICAgICAgIHsKKyAgICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1BfS0VZXzE6CisgICAgICBjYXNlIFNQX0tFWV8yOgorICAgICAgY2FzZSBTUF9LRVlfMzoKKyAgICAgIGNhc2UgU1BfS0VZXzQ6CisgICAgICBjYXNlIFNQX0tFWV81OgorICAgICAgY2FzZSBTUF9LRVlfNjoKKyAgICAgIGNhc2UgU1BfS0VZXzc6CisgICAgICBjYXNlIFNQX0tFWV84OgorICAgICAgY2FzZSBTUF9LRVlfOToKKyAgICAgICAgb2Zmc2V0ID0ga2V5Y29kZSAtU1BfS0VZXzA7CisgICAgICAgIGlmKG9mZnNldCA+PSBtYXhfY250KQorICAgICAgICB7CisgICAgICAgICAgb2Zmc2V0ID0gbWF4X2NudCAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1BfS0VZX0NMRUFSOgorICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIGlmKGtleV9wcmVzcykKKyAgICB7CisgICAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCBzeXNwYXJhWzIqb2Zmc2V0XSxzeXNwYXJhWzIqb2Zmc2V0KzFdLDApOworICAgICAga2V5X3ByZXNzID0gMDsKKyAgICAgIHRpY2tlciA9IHNwX2dldF90aWNrZXIoKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHVpbnQ4IHNwX2xpbmtfdGVzdChzcF9wb3NfdCogcG9zKQoreworICB1aW50OCByZXQ7CisgIHNwX3Byb3RvY29sX3JlcXVlc3RfdCByZXE7CisgIHNwX3Byb3RvY29sX3Jlc3BvbnNlX3QgcmVzcDsKKyAgTUVNQ0xFQVIoJnJlcSwgc2l6ZW9mKHJlcSkpOworICBNRU1DTEVBUigmcmVzcCwgc2l6ZW9mKHJlc3ApKTsKKworICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCAi1f3U2sG0wre87LLiIiwgIsfrydS1yC4uLi4uIiwgMCk7CisgIHNwX3Byb3RvY29sX3JlcV9pbml0KCZyZXEsIFNQX0NNRF9GQUNUT1JZX0xJTktfVEVTVCk7CisgIHJlcS5kYXRhWzBdID0gMDsKKyAgcmVxLmRhdGFbMV0gPSAweDU1OworICByZXEuZGF0YVsyXSA9IDB4QUE7CisgIHJlcS5kYXRhbGVuICs9IDM7CisgIHJldCA9IHNwX2NvbW1fY2FsbChwb3MsICZyZXEsICZyZXNwLCBERUxBWV9USU1FM3MpOworICBpZighcmV0KQorICB7CisgICAgaWYocmVzcC5kYXRhWzBdID09IDB4NTUgJiYgcmVzcC5kYXRhWzFdID09IDB4QUEpCisgICAgeworICAgICAgaWYoc3BfY2hlY2tfdGltZV92YWxpZChyZXNwLmRhdGEgKzIpKQorICAgICAgeworICAgICAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCAiwbTCt7zssuKzybmmIiwiyrHW07K7us+3qCIsIERFTEFZX1RJTUUzcyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgICB9CisgICAgICBzcF9zZXRfYmNkdGltZShyZXNwLmRhdGEgKzIpOworICAgICAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywgIsG0wre87LLis8m5piIsItLRzayyvcqx1tMiLCBERUxBWV9USU1FM3MpOworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywgIsG0wre87LLiyqew3CIsIsrVtb207c7zsPwiLCBERUxBWV9USU1FM3MpOworICAgIHJldHVybiAxOworICB9CisgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsICLBtMK3vOyy4sqnsNwiLCLH67zssuLP38K3IiwgREVMQVlfVElNRTNzKTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc2hvd19rZXlib2FyZF90ZXN0KHNwX3Bvc190KiBwb3MsIHVpbnQ4IG9mZnNldCkKK3sKKyAgY2hhciBtc2dbXT0geyIwMTIzNDU2Nzg5QyJ9OworICBjaGFyIHRlbXBbMTddOworICBzbnByaW50Zih0ZW1wLG9mZnNldCsxLCIlcyIsbXNnKTsKKyAgZGlzcF9oaW50X2luZm9fdGhyZWUocG9zLCAivPzFzNLAtM7K5MjrIiwiMDEyMzQ1Njc4OUMiLHRlbXAsMCk7Cit9CisKK3N0YXRpYyB1aW50OCBzcF9rZXlib2FyZF90ZXN0KHNwX3Bvc190KiBwb3MpCit7CisgIHVpbnQ4IGtjb2RlOworICB1aW50MzIgdGljazsKKyAgdWludDggb2Zmc2V0ID0gMDsKKyAgdWludDgga2V5YnVmWzEyXT0ge1NQX0tFWV8wLFNQX0tFWV8xLFNQX0tFWV8yLFNQX0tFWV8zLAorICAgICAgICAgICAgICAgICAgICAgU1BfS0VZXzQsU1BfS0VZXzUsU1BfS0VZXzYsU1BfS0VZXzcsCisgICAgICAgICAgICAgICAgICAgICBTUF9LRVlfOCxTUF9LRVlfOSxTUF9LRVlfQ0xFQVIsU1BfS0VZX0VOVEVSCisgICAgICAgICAgICAgICAgICAgIH07CisgIHNob3dfa2V5Ym9hcmRfdGVzdChwb3MsIG9mZnNldCk7CisgIHRpY2sgPSBzcF9nZXRfdGlja2VyKCk7CisgIHdoaWxlKChzcF9nZXRfdGlja2VyKCktdGljaykgPCBERUxBWV9USU1FNjBzKQorICB7CisgICAgc3BfZmVlZF9kb2coKTsKKyAgICBrY29kZSA9IHNwX2dldF9rZXkoKTsKKyAgICBpZihrY29kZSAhPSBTUF9LRVlfTk9ORSkKKyAgICB7CisgICAgICB0aWNrID0gc3BfZ2V0X3RpY2tlcigpOworICAgICAgc3dpdGNoKGtjb2RlKQorICAgICAgeworICAgICAgY2FzZSBTUF9LRVlfMDoKKyAgICAgICAgaWYoa2V5YnVmW29mZnNldF0gPT0gU1BfS0VZXzApCisgICAgICAgIHsKKyAgICAgICAgICArK29mZnNldDsKKyAgICAgICAgICBzaG93X2tleWJvYXJkX3Rlc3QocG9zLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTUF9LRVlfMToKKyAgICAgICAgaWYoa2V5YnVmW29mZnNldF0gPT0gU1BfS0VZXzEpCisgICAgICAgIHsKKyAgICAgICAgICArK29mZnNldDsKKyAgICAgICAgICBzaG93X2tleWJvYXJkX3Rlc3QocG9zLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTUF9LRVlfMjoKKyAgICAgICAgaWYoa2V5YnVmW29mZnNldF0gPT0gU1BfS0VZXzIpCisgICAgICAgIHsKKyAgICAgICAgICArK29mZnNldDsKKyAgICAgICAgICBzaG93X2tleWJvYXJkX3Rlc3QocG9zLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTUF9LRVlfMzoKKyAgICAgICAgaWYoa2V5YnVmW29mZnNldF0gPT0gU1BfS0VZXzMpCisgICAgICAgIHsKKyAgICAgICAgICArK29mZnNldDsKKyAgICAgICAgICBzaG93X2tleWJvYXJkX3Rlc3QocG9zLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTUF9LRVlfNDoKKyAgICAgICAgaWYoa2V5YnVmW29mZnNldF0gPT0gU1BfS0VZXzQpCisgICAgICAgIHsKKyAgICAgICAgICArK29mZnNldDsKKyAgICAgICAgICBzaG93X2tleWJvYXJkX3Rlc3QocG9zLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTUF9LRVlfNToKKyAgICAgICAgaWYoa2V5YnVmW29mZnNldF0gPT0gU1BfS0VZXzUpCisgICAgICAgIHsKKyAgICAgICAgICArK29mZnNldDsKKyAgICAgICAgICBzaG93X2tleWJvYXJkX3Rlc3QocG9zLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTUF9LRVlfNjoKKyAgICAgICAgaWYoa2V5YnVmW29mZnNldF0gPT0gU1BfS0VZXzYpCisgICAgICAgIHsKKyAgICAgICAgICArK29mZnNldDsKKyAgICAgICAgICBzaG93X2tleWJvYXJkX3Rlc3QocG9zLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTUF9LRVlfNzoKKyAgICAgICAgaWYoa2V5YnVmW29mZnNldF0gPT0gU1BfS0VZXzcpCisgICAgICAgIHsKKyAgICAgICAgICArK29mZnNldDsKKyAgICAgICAgICBzaG93X2tleWJvYXJkX3Rlc3QocG9zLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTUF9LRVlfODoKKyAgICAgICAgaWYoa2V5YnVmW29mZnNldF0gPT0gU1BfS0VZXzgpCisgICAgICAgIHsKKyAgICAgICAgICArK29mZnNldDsKKyAgICAgICAgICBzaG93X2tleWJvYXJkX3Rlc3QocG9zLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTUF9LRVlfOToKKyAgICAgICAgaWYoa2V5YnVmW29mZnNldF0gPT0gU1BfS0VZXzkpCisgICAgICAgIHsKKyAgICAgICAgICArK29mZnNldDsKKyAgICAgICAgICBzaG93X2tleWJvYXJkX3Rlc3QocG9zLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTUF9LRVlfQ0xFQVI6CisgICAgICAgIGlmKG9mZnNldCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgZGlzcF9oaW50X2luZm8ocG9zLCAiyKHP+7C0vPy87LLiIixERUxBWV9USU1FMnMpOworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmKGtleWJ1ZltvZmZzZXRdID09IFNQX0tFWV9DTEVBUikKKyAgICAgICAgeworICAgICAgICAgICsrb2Zmc2V0OworICAgICAgICAgIHNob3dfa2V5Ym9hcmRfdGVzdChwb3MsIG9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNQX0tFWV9FTlRFUjoKKyAgICAgICAgaWYoa2V5YnVmW29mZnNldF0gPT0gU1BfS0VZX0VOVEVSKQorICAgICAgICB7CisgICAgICAgICAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywgIrz8xcy87LLi1f3ItyIsIrz8xczQo9e81f2zoyIsREVMQVlfVElNRTNzKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMTsKKworfQorCitzdGF0aWMgdm9pZCBzcF9mYWN0b3J5X2NoZWNrKHNwX3Bvc190KiBwb3MpCit7CisgIHNwX2xpbmtfdGVzdChwb3MpOworICBzcF9rZXlib2FyZF90ZXN0KHBvcyk7Cit9CisKK3N0YXRpYyB2b2lkIHNwX3NldF9kZXZ0aW1lKHNwX3Bvc190KiBwb3MpCit7CisgIHVpbnQzMiB0aWNrZXI7CisgIHVpbnQ4IGtjb2RlOworICB1aW50OCBrZXlfcHJlc3MgPSAxOworICB1aW50OCBjdGltZVs2XTsKKyAgdWludDggb2Zmc2V0OworICBjaGFyIHN0clsxM107CisgIGNoYXIgbXNnWzE3XTsKKworICBNRU1DTEVBUihzdHIsc2l6ZW9mIHN0cik7CisgIHNwX2dldF9iY2R0aW1lKGN0aW1lKTsKKyAgb2Zmc2V0ID0gMTA7CisgIHNwX2hleF90b19zdHIoY3RpbWUsNSxzdHIpOworICB0aWNrZXIgPSBzcF9nZXRfdGlja2VyKCk7CisgIHdoaWxlKHNwX2dldF90aWNrZXIoKSAtdGlja2VyIDwgREVMQVlfVElNRTYwcykKKyAgeworICAgIGtjb2RlID0gc3BfZ2V0X2tleSgpOworICAgIGlmKGtjb2RlICE9IFNQX0tFWV9OT05FKQorICAgIHsKKyAgICAgIGtleV9wcmVzcyA9IDE7CisgICAgICBzd2l0Y2goa2NvZGUpCisgICAgICB7CisgICAgICBjYXNlIFNQX0tFWV8wOgorICAgICAgY2FzZSBTUF9LRVlfMToKKyAgICAgIGNhc2UgU1BfS0VZXzI6CisgICAgICBjYXNlIFNQX0tFWV8zOgorICAgICAgY2FzZSBTUF9LRVlfNDoKKyAgICAgIGNhc2UgU1BfS0VZXzU6CisgICAgICBjYXNlIFNQX0tFWV82OgorICAgICAgY2FzZSBTUF9LRVlfNzoKKyAgICAgIGNhc2UgU1BfS0VZXzg6CisgICAgICBjYXNlIFNQX0tFWV85OgorICAgICAgICBpZihvZmZzZXQgPCAxMCkKKyAgICAgICAgeworICAgICAgICAgIHN0cltvZmZzZXQrK10gPSAnMCcgKyAoa2NvZGUtIFNQX0tFWV8wKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1BfS0VZX0VOVEVSOgorICAgICAgICBpZihvZmZzZXQgPj0gMTApCisgICAgICAgIHsKKyAgICAgICAgICBNRU1DTEVBUihjdGltZSxzaXplb2YgY3RpbWUpOworICAgICAgICAgIHNwX3N0cl90b19iY2Qoc3RyLDEwLGN0aW1lKTsKKyAgICAgICAgICBpZihzcF9jaGVja190aW1lX3ZhbGlkKGN0aW1lKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCLJ6NbDyrG85MqnsNwiLCLKsbzksru6z7eoIiwgREVMQVlfVElNRTNzKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHNwX3NldF9iY2R0aW1lKGN0aW1lKTsKKyAgICAgICAgICAgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsIsno1sPKsbzks8m5piIsIiAiLCBERUxBWV9USU1FMnMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1BfS0VZX0NMRUFSOgorICAgICAgICBpZihvZmZzZXQgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQtLTsKKyAgICAgICAgc3RyW29mZnNldF0gPSAwOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoa2V5X3ByZXNzKQorICAgIHsKKyAgICAgIHNwcmludGYobXNnLCIlcyIsc3RyKTsKKyAgICAgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsIsno1sPKsbzkKHltZEhtKSIsbXNnLDApOworICAgICAgdGlja2VyID0gc3BfZ2V0X3RpY2tlcigpOworICAgICAga2V5X3ByZXNzID0gMDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgc3BfbWFudWFsX2xvZ2luKHNwX3Bvc190KiBwb3MpCit7CisgIHVpbnQxNiByZXQ7CisgIHVpbnQzMiB0aWNrOworICBzcF9wcm90b2NvbF9yZXNwb25zZV90IHJlc3A7CisgIE1FTUNMRUFSKCZyZXNwLCBzaXplb2YocmVzcCkpOworICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCLV/dTatcfCvCIsIsfrydS1yC4uLiIsMCk7CisgIHNwX2FzeW5jX2VxdWlwbWVudF9sb2dpbihwb3MpOworICB0aWNrID0gc3BfZ2V0X3RpY2tlcigpOworICB3aGlsZShzcF9nZXRfdGlja2VyKCkgLSB0aWNrIDwgREVMQVlfVElNRTNzKjIpCisgIHsKKyAgICBNRU1DTEVBUigmcmVzcCwgc2l6ZW9mKHJlc3ApKTsKKyAgICB1c2FydF9yZWFkKCh1OCopJnJlc3AsIHNpemVvZihyZXNwKSk7CisgICAgaWYocmVzcC5leGNtZCA9PSBTUF9DTURfTE9HSU4pCisgICAgeworICAgICAgcmV0ID0gc3BfY29uZmlybV9sb2dpbigmcmVzcCwgcG9zKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcmV0ID0gUkNfREVWX0xPR0lOX0ZBSUw7CisgICAgfQorICB9CisgIGlmKHJldCkKKyAgeworICAgIGNoYXIgbXNnWzMyXTsKKyAgICBzcHJpbnRmKG1zZywitO3O88LrPSVkIixyZXQpOworICAgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsIseptb3Kp7DcIixtc2csREVMQVlfVElNRTNzKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBkaXNwX2hpbnRfaW5mbyhwb3MsIseptb2zybmmIixERUxBWV9USU1FM3MpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHNwX3NldF9kZXZwaHlpZChzcF9wb3NfdCogcG9zKQoreworICB1aW50MzIgdGlja2VyOworICB1aW50OCBrY29kZTsKKyAgdWludDE2IHJldCA9IDA7CisgIHVpbnQ4IGtleV9wcmVzcyA9IDE7CisgIGNoYXIgbXNnWzE3XTsKKyAgdWludDggZGV2cGh5aWRbNF07CisgIHVpbnQ4IG9mZnNldDsKKyAgY2hhciBzdHJbOV07CisgIE1FTUNQWShkZXZwaHlpZCxwb3MtPmRldnBoeWlkLHNpemVvZihwb3MtPmRldnBoeWlkKSk7CisgIE1FTUNMRUFSKHN0cixzaXplb2Ygc3RyKTsKKworICB0aWNrZXIgPSBzcF9nZXRfdGlja2VyKCk7CisgIG9mZnNldCA9IDg7CisgIHNwX2hleF90b19zdHIoZGV2cGh5aWQsNCxzdHIpOworICB3aGlsZShzcF9nZXRfdGlja2VyKCkgLXRpY2tlciA8IERFTEFZX1RJTUU2MHMpCisgIHsKKyAgICBrY29kZSA9IHNwX2dldF9rZXkoKTsKKyAgICBpZihrY29kZSAhPSBTUF9LRVlfTk9ORSkKKyAgICB7CisgICAgICBrZXlfcHJlc3MgPSAxOworICAgICAgc3dpdGNoKGtjb2RlKQorICAgICAgeworICAgICAgY2FzZSBTUF9LRVlfMDoKKyAgICAgIGNhc2UgU1BfS0VZXzE6CisgICAgICBjYXNlIFNQX0tFWV8yOgorICAgICAgY2FzZSBTUF9LRVlfMzoKKyAgICAgIGNhc2UgU1BfS0VZXzQ6CisgICAgICBjYXNlIFNQX0tFWV81OgorICAgICAgY2FzZSBTUF9LRVlfNjoKKyAgICAgIGNhc2UgU1BfS0VZXzc6CisgICAgICBjYXNlIFNQX0tFWV84OgorICAgICAgY2FzZSBTUF9LRVlfOToKKyAgICAgICAgaWYob2Zmc2V0IDwgOCkKKyAgICAgICAgeworICAgICAgICAgIHN0cltvZmZzZXQrK10gPSAnMCcgKyhrY29kZSAtU1BfS0VZXzApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTUF9LRVlfRU5URVI6CisgICAgICAgIGlmKG9mZnNldCA+PSA4KQorICAgICAgICB7CisgICAgICAgICAgc3Bfc3RyX3RvX2hleChzdHIsOCxkZXZwaHlpZCk7CisgICAgICAgICAgaWYoMCAhPSBNRU1DTVAocG9zLT5kZXZwaHlpZCxkZXZwaHlpZCw0KSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXQgPSBzcF9zYXZlX2RldnBoeWlkKHBvcywgZGV2cGh5aWQpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZighcmV0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIE1FTUNQWShwb3MtPmRldnBoeWlkLGRldnBoeWlkLDQpOworICAgICAgICAgICAgc3ByaW50Zihtc2csIklEOiAlMDJ4JTAyeCUwMnglMDJ4IixkZXZwaHlpZFswXSxkZXZwaHlpZFsxXSxkZXZwaHlpZFsyXSxkZXZwaHlpZFszXSk7CisgICAgICAgICAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCLJ6NbDzu/A7UlEs8m5piIsbXNnLCBERUxBWV9USU1FMnMpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgc2hvd19lcnJvcihwb3MsIrGjtObO78DtSUTKp7DcIixyZXQpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNQX0tFWV9DTEVBUjoKKyAgICAgICAgaWYob2Zmc2V0ID4gMCkKKyAgICAgICAgeworICAgICAgICAgIG9mZnNldC0tOworICAgICAgICAgIHN0cltvZmZzZXRdID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmKGtleV9wcmVzcykKKyAgICB7CisgICAgICBzcHJpbnRmKG1zZywiJXMiLHN0cik7CisgICAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCLJ6NbDzu/A7UlEOiIsbXNnLDApOworICAgICAgdGlja2VyID0gc3BfZ2V0X3RpY2tlcigpOworICAgICAga2V5X3ByZXNzID0gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuOworfQorc3RhdGljIHZvaWQgc3Bfc2V0X2RldmljZW5vKHNwX3Bvc190KiBwb3MpCit7CisgIHVpbnQzMiB0aWNrZXI7CisgIHVpbnQ4IGtjb2RlOworICB1aW50MTYgcmV0ID0gMDsKKyAgdWludDgga2V5X3ByZXNzID0gMTsKKyAgdWludDE2IHRlbXBubzsKKyAgdWludDggZGV2aWNlbm8gPSBwb3MtPmRldmljZW5vOworICBjaGFyIG1zZ1sxN107CisgIGNoYXIgdGVtcFsxN107CisgIHRpY2tlciA9IHNwX2dldF90aWNrZXIoKTsKKyAgd2hpbGUoc3BfZ2V0X3RpY2tlcigpIC10aWNrZXIgPCBERUxBWV9USU1FNjBzKQorICB7CisgICAga2NvZGUgPSBzcF9nZXRfa2V5KCk7CisgICAgaWYoa2NvZGUgIT0gU1BfS0VZX05PTkUpCisgICAgeworICAgICAga2V5X3ByZXNzID0gMTsKKyAgICAgIHN3aXRjaChrY29kZSkKKyAgICAgIHsKKyAgICAgIGNhc2UgU1BfS0VZXzA6CisgICAgICBjYXNlIFNQX0tFWV8xOgorICAgICAgY2FzZSBTUF9LRVlfMjoKKyAgICAgIGNhc2UgU1BfS0VZXzM6CisgICAgICBjYXNlIFNQX0tFWV80OgorICAgICAgY2FzZSBTUF9LRVlfNToKKyAgICAgIGNhc2UgU1BfS0VZXzY6CisgICAgICBjYXNlIFNQX0tFWV83OgorICAgICAgY2FzZSBTUF9LRVlfODoKKyAgICAgIGNhc2UgU1BfS0VZXzk6CisgICAgICAgIHRlbXBubyA9ICh1aW50MTYpZGV2aWNlbm87CisgICAgICAgIHRlbXBubyAqPTEwOworICAgICAgICB0ZW1wbm8gKz0gKGtjb2RlLVNQX0tFWV8wKTsKKyAgICAgICAgaWYodGVtcG5vID4gMCAmJiB0ZW1wbm8gPCBERVZfTUFYX0RFVklDRU5PKQorICAgICAgICB7CisgICAgICAgICAgZGV2aWNlbm8gPSAodWludDgpdGVtcG5vOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTUF9LRVlfRU5URVI6CisgICAgICAgIGlmKGRldmljZW5vID4gMCAmJiBkZXZpY2VubyA8PSBERVZfTUFYX0RFVklDRU5PKQorICAgICAgICB7CisgICAgICAgICAgaWYocG9zLT5kZXZpY2VubyAhPSBkZXZpY2VubykKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXQgPSBzcF9zYXZlX2RldmljZW5vKHBvcyxkZXZpY2Vubyk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKCFyZXQpCisgICAgICAgICAgeworICAgICAgICAgICAgcG9zLT5kZXZpY2VubyA9IGRldmljZW5vOworICAgICAgICAgICAgc3ByaW50Zihtc2csIrv6usU6ICVkIixkZXZpY2Vubyk7CisgICAgICAgICAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCLJ6NbDu/q6xbPJuaYiLG1zZywgREVMQVlfVElNRTJzKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHNob3dfZXJyb3IocG9zLCKxo7Tmu/q6xcqnsNwiLHJldCk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBzcHJpbnRmKG1zZywit7bOpygxLSVkKSIsREVWX01BWF9ERVZJQ0VOTyk7CisgICAgICAgICAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywiu/q6xbTtzvMiLG1zZywgREVMQVlfVElNRTNzKTsKKyAgICAgICAgfQorICAgICAgY2FzZSBTUF9LRVlfQ0xFQVI6CisgICAgICAgIGlmKGRldmljZW5vID09IDApCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZGV2aWNlbm8gPSAwOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoa2V5X3ByZXNzKQorICAgIHsKKyAgICAgIHNwcmludGYodGVtcCwiyejWw7v6usUoMS0lZCkiLERFVl9NQVhfREVWSUNFTk8pOworICAgICAgc3ByaW50Zihtc2csIiVkIixkZXZpY2Vubyk7CisgICAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLHRlbXAsbXNnLDApOworICAgICAgdGlja2VyID0gc3BfZ2V0X3RpY2tlcigpOworICAgICAga2V5X3ByZXNzID0gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl90cmFuc2R0bChzcF9wb3NfdCogcG9zKQoreworICBpZigwID09IHNwX2NoZWNrX3Bhc3N3ZChwb3MsIsflv9XB98uuw9zC6zoiLCJceDlceDFceDRceDNceDhceDciKSkKKyAgeworICAgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsIsflv9XB98uuIiwix+vJ1LXILi4uIiwwKTsKKyAgICBzcF9jbGVhcl90cmFuc2R0bChwb3MpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIG1hbnVhbF91cGdyYWRlKHNwX3Bvc190KiBwb3MpCit7CisgIGlmKDAgPT0gc3BfY2hlY2tfcGFzc3dkKHBvcywgItTaz9/J/by2w9zC6zoiLCJceDlceDFceDRceDNceDhceDciKSkKKyAgeworICAgIHNwX21hbnVhbF91cGdyYWRlKHBvcyk7CisgIH0KK30KKworc3RhdGljIHZvaWQgcmVzZXRfZmFjdG9yeShzcF9wb3NfdCogcG9zKQoreworICBpZigwID09IHNwX2NoZWNrX3Bhc3N3ZChwb3MsICK71ri0s/azp8Pcwus6IiwiXHg5XHgxXHg0XHgzXHg4XHg3IikpCisgIHsKKyAgICBzcF9yZXNldF9mYWN0b3J5KHBvcyk7CisgIH0KK30KKwordm9pZCBzcF9tZW51X29wdGlvbnMoc3BfcG9zX3QqIHBvcykKK3sKKyAgdWludDMyIHRpY2tlciA9IDA7CisgIHVpbnQ4IGtleWNvZGU7CisgIHVpbnQ4IHBhZ2U7CisgIHVpbnQ4IG1heF9jbnQ7CisgIHVpbnQ4IGtleV9wcmVzcyA9IDE7CisKKyAgbWVudV90IG1lbnVzW10gPQorICB7CisgICAgeyIxLrLpv7Syzsr9Iiwgc3Bfc2hvd19zeXNwYXJhfSwKKyAgICB7IjIuuaSzp7LiytQiLCBzcF9mYWN0b3J5X2NoZWNrfSwKKyAgICB7IjMuyejWw8qxvOQiLCBzcF9zZXRfZGV2dGltZX0sCisgICAgeyI0LsrWtq+1x8K8Iiwgc3BfbWFudWFsX2xvZ2lufSwKKyAgICB7IjUuyejWw87vwO1pZCIsIHNwX3NldF9kZXZwaHlpZH0sCisgICAgeyI2Lsno1sO7+rrFIiwgc3Bfc2V0X2RldmljZW5vfSwKKyAgICB7Ijcux+W/1cH3y64iLCBjbGVhcl90cmFuc2R0bH0sCisgICAgeyI4LtTaz9/J/by2IiwgbWFudWFsX3VwZ3JhZGV9LAorICAgIHsiOS671ri0s/azpyIsIHJlc2V0X2ZhY3Rvcnl9CisgIH07CisgIG1heF9jbnQgPSBzaXplb2YobWVudXMpL3NpemVvZihtZW51X3QpLzM7CisgIHBhZ2UgPSAwOworICB0aWNrZXIgPSBzcF9nZXRfdGlja2VyKCk7CisgIHdoaWxlKHNwX2dldF90aWNrZXIoKS10aWNrZXIgPD0gREVMQVlfVElNRTYwcyo1KQorICB7CisgICAgc3BfZmVlZF9kb2coKTsKKyAgICBrZXljb2RlID0gc3BfZ2V0X2tleSgpOworICAgIGlmKGtleWNvZGUgIT0gU1BfS0VZX05PTkUpCisgICAgeworICAgICAga2V5X3ByZXNzID0gMTsKKyAgICAgIHN3aXRjaChrZXljb2RlKQorICAgICAgeworICAgICAgY2FzZSBTUF9LRVlfMDoKKyAgICAgICAgaWYocGFnZSA8IChtYXhfY250LTEpKQorICAgICAgICB7CisgICAgICAgICAgcGFnZSsrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTUF9LRVlfMToKKyAgICAgIGNhc2UgU1BfS0VZXzI6CisgICAgICBjYXNlIFNQX0tFWV8zOgorICAgICAgY2FzZSBTUF9LRVlfNDoKKyAgICAgIGNhc2UgU1BfS0VZXzU6CisgICAgICBjYXNlIFNQX0tFWV82OgorICAgICAgY2FzZSBTUF9LRVlfNzoKKyAgICAgIGNhc2UgU1BfS0VZXzg6CisgICAgICBjYXNlIFNQX0tFWV85OgorICAgICAgICBpZihtZW51c1trZXljb2RlLVNQX0tFWV8xXS5mdW5jICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBtZW51c1trZXljb2RlLVNQX0tFWV8xXS5mdW5jKHBvcyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNQX0tFWV9DTEVBUjoKKyAgICAgICAgaWYocGFnZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBhZ2UtLTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoa2V5X3ByZXNzKQorICAgIHsKKyAgICAgIGRpc3BfaGludF9pbmZvX3RocmVlKHBvcywgbWVudXNbcGFnZSozXS5oaXQsIG1lbnVzW3BhZ2UqMysxXS5oaXQsIG1lbnVzW3BhZ2UqMysyXS5oaXQsIDApOworICAgICAga2V5X3ByZXNzID0gMDsKKyAgICAgIHRpY2tlciA9IHNwX2dldF90aWNrZXIoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9tZW51LmggYi9zdXB3aXNkb20vc3BfbWVudS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZjhmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zdXB3aXNkb20vc3BfbWVudS5oCkBAIC0wLDAgKzEsOCBAQAorI2lmZGVmIF9TUF9NRU5VX0hfCisjZGVmaW5lIF9TUF9NRU5VX0hfCisKKyNpbmNsdWRlICJzcF9jb25maWcuaCIKKwordm9pZCBzcF9tZW51X29wdGlvbnMoc3BfcG9zX3QqIHBvcyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3Vwd2lzZG9tL3NwX21zZ3BhY2suYyBiL3N1cHdpc2RvbS9zcF9tc2dwYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyNThhOQotLS0gL2Rldi9udWxsCisrKyBiL3N1cHdpc2RvbS9zcF9tc2dwYWNrLmMKQEAgLTAsMCArMSw4NyBAQAorI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgInNwX21zZ3BhY2suaCIKKworaW50MzIgc3BfcGFja19pbml0KGN3X3BhY2tfY29udGV4dCogcGFjayx1aW50OCogYnVmLHVpbnQxNiBsZW4pCit7CisgIG1lbXNldChidWYsMCxsZW4pOworICByZXR1cm4gY3dfcGFja19jb250ZXh0X2luaXQocGFjayxidWYsbGVuLDApOworfQorCit1aW50MTYgc3BfcGFja19sZW5ndGgoY3dfcGFja19jb250ZXh0KiBwYWNrKQoreworICBpZihwYWNrLT5jdXJyZW50ICE9IE5VTEwgJiYgcGFjay0+c3RhcnQgIT0gTlVMTCkKKyAgeworICAgIHJldHVybiAocGFjay0+Y3VycmVudCAtcGFjay0+c3RhcnQpOworICB9CisgIHJldHVybiAyNTY7Cit9Cit2b2lkIHNwX3BhY2tfcHV0X3N0cihjd19wYWNrX2NvbnRleHQqIHBhY2ssY29uc3QgY2hhciogcGFyYWtleSxjb25zdCBjaGFyKiBwYXJhdmFsKQoreworICBjd19wYWNrX3N0cihwYWNrLHBhcmFrZXksc3RybGVuKHBhcmFrZXkpKTsKKyAgY3dfcGFja19zdHIocGFjayxwYXJhdmFsLHN0cmxlbihwYXJhdmFsKSk7Cit9Cit2b2lkIHNwX3BhY2tfcHV0X2ludChjd19wYWNrX2NvbnRleHQqIHBhY2ssY29uc3QgY2hhciogcGFyYWtleSxjb25zdCBpbnQgcGFyYXZhbCkKK3sKKyAgY3dfcGFja19zdHIocGFjayxwYXJha2V5LHN0cmxlbihwYXJha2V5KSk7CisgIGN3X3BhY2tfc2lnbmVkKHBhY2sscGFyYXZhbCk7Cit9Cit2b2lkIHNwX3BhY2tfcHV0X2Jpbihjd19wYWNrX2NvbnRleHQqIHBhY2ssY29uc3QgY2hhciogcGFyYWtleSxjb25zdCB1aW50OCogcGFyYXZhbCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNiBsZW4pCit7CisgIGN3X3BhY2tfc3RyKHBhY2sscGFyYWtleSxzdHJsZW4ocGFyYWtleSkpOworICBjd19wYWNrX2JpbihwYWNrLHBhcmF2YWwsbGVuKTsKK30KK2ludDMyIHNwX3VucGFja19pbml0KGN3X3VucGFja19jb250ZXh0KiB1bnBhY2ssdWludDgqIGJ1Zix1aW50MTYgbGVuKQoreworICBjd191bnBhY2tfY29udGV4dF9pbml0KHVucGFjayxidWYsbGVuLDApOworICByZXR1cm4gdW5wYWNrLT5yZXR1cm5fY29kZTsKK30KKwordWludDggc3BfdW5wYWNrX21hcF9zaXplKGN3X3VucGFja19jb250ZXh0KiB1bnBhY2spCit7CisgIGN3X3VucGFja19uZXh0KHVucGFjayk7CisgIGlmKHVucGFjay0+aXRlbS50eXBlID09IENXUF9JVEVNX01BUCkKKyAgeworICAgIHJldHVybiAodWludDgpdW5wYWNrLT5pdGVtLmFzLm1hcC5zaXplOworICB9CisgIHJldHVybiAwOworfQorCit1aW50OCBzcF91bnBhY2tfdmFsdWUoY3dfdW5wYWNrX2NvbnRleHQqIHVucGFjayx1bnBhY2tfZmllbGRfdCogZmllbGQpCit7CisgIGN3X3VucGFja19uZXh0KHVucGFjayk7CisgIGlmKHVucGFjay0+aXRlbS50eXBlID09IENXUF9JVEVNX1NUUikKKyAgeworICAgIGZpZWxkLT5rZXkgPSB1bnBhY2stPml0ZW0uYXMuc3RyLnN0YXJ0OworICAgIGN3X3VucGFja19uZXh0KHVucGFjayk7CisgICAgaWYodW5wYWNrLT5pdGVtLnR5cGUgPT0gQ1dQX0lURU1fU1RSKQorICAgIHsKKyAgICAgIGZpZWxkLT52YWwuc3RydmFsID0gdW5wYWNrLT5pdGVtLmFzLnN0ci5zdGFydDsKKyAgICAgIGZpZWxkLT5zdHJsZW4gPSB1bnBhY2stPml0ZW0uYXMuc3RyLmxlbmd0aDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIGlmKHVucGFjay0+aXRlbS50eXBlID09IENXUF9JVEVNX1BPU0lUSVZFX0lOVEVHRVIpCisgICAgeworICAgICAgZmllbGQtPnZhbC5pbnR2YWw9IChpbnQzMil1bnBhY2stPml0ZW0uYXMuaTY0OworICAgICAgZmllbGQtPnN0cmxlbiA9IDA7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZih1bnBhY2stPml0ZW0udHlwZSA9PSBDV1BfSVRFTV9CSU4pCisgICAgeworICAgICAgZmllbGQtPnZhbC5iaW52YWwgPSB1bnBhY2stPml0ZW0uYXMuc3RyLnN0YXJ0OworICAgICAgZmllbGQtPnN0cmxlbiA9IHVucGFjay0+aXRlbS5hcy5zdHIubGVuZ3RoOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBmaWVsZC0+c3RybGVuID0gMDsKKyAgICAgIGZpZWxkLT52YWwuaW50dmFsID0gMDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvc3Vwd2lzZG9tL3NwX21zZ3BhY2suaCBiL3N1cHdpc2RvbS9zcF9tc2dwYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3YTAyMQotLS0gL2Rldi9udWxsCisrKyBiL3N1cHdpc2RvbS9zcF9tc2dwYWNrLmgKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBfU1BfTVNHUEFDS19IXworI2RlZmluZSBfU1BfTVNHUEFDS19IXworCisKKyNpbmNsdWRlICIuLi9tc2dwYWNrL2N3cGFjay5oIgorI2luY2x1ZGUgInNwX2NvbmZpZy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGNoYXIqIGtleTsKKyAgdW5pb24KKyAgeworICAgIGludDMyIGludHZhbDsKKyAgICBjb25zdCBjaGFyKiBzdHJ2YWw7CisJY29uc3QgdWludDgqIGJpbnZhbDsKKyAgfSB2YWw7CisgIGludDMyIHN0cmxlbjsKK30gdW5wYWNrX2ZpZWxkX3Q7CisKK2ludDMyIHNwX3BhY2tfaW5pdChjd19wYWNrX2NvbnRleHQqIHBhY2ssdWludDgqIGJ1Zix1aW50MTYgbGVuKTsKK3ZvaWQgc3BfcGFja19wdXRfc3RyKGN3X3BhY2tfY29udGV4dCogcGFjayxjb25zdCBjaGFyKiBwYXJha2V5LGNvbnN0IGNoYXIqIHBhcmF2YWwpOwordm9pZCBzcF9wYWNrX3B1dF9pbnQoY3dfcGFja19jb250ZXh0KiBwYWNrLGNvbnN0IGNoYXIqIHBhcmFrZXksY29uc3QgaW50IHBhcmF2YWwpOwordm9pZCBzcF9wYWNrX3B1dF9iaW4oY3dfcGFja19jb250ZXh0KiBwYWNrLGNvbnN0IGNoYXIqIHBhcmFrZXksY29uc3QgdWludDgqIHBhcmF2YWwsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTYgbGVuKTsKK3VpbnQxNiBzcF9wYWNrX2xlbmd0aChjd19wYWNrX2NvbnRleHQqIHBhY2spOworCitpbnQzMiBzcF91bnBhY2tfaW5pdChjd191bnBhY2tfY29udGV4dCogdW5wYWNrLHVpbnQ4KiBidWYsdWludDE2IGxlbik7Cit1aW50OCBzcF91bnBhY2tfbWFwX3NpemUoY3dfdW5wYWNrX2NvbnRleHQqIHVucGFjayk7Cit1aW50OCBzcF91bnBhY2tfdmFsdWUoY3dfdW5wYWNrX2NvbnRleHQqIHVucGFjayx1bnBhY2tfZmllbGRfdCogZmllbGQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3Vwd2lzZG9tL3NwX3VwZ3JhZGUuYyBiL3N1cHdpc2RvbS9zcF91cGdyYWRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYyZmRiOAotLS0gL2Rldi9udWxsCisrKyBiL3N1cHdpc2RvbS9zcF91cGdyYWRlLmMKQEAgLTAsMCArMSw0MTYgQEAKKyNpbmNsdWRlICJzcF9tc2dwYWNrLmgiCisjaW5jbHVkZSAic3BfZmxhc2guaCIKKyNpbmNsdWRlICJzcF91dGlsLmgiCisjaW5jbHVkZSAic3BfZGlzcGxheS5oIgorI2luY2x1ZGUgInNwX2NvbW11bmljYXRlLmgiCisjaW5jbHVkZSAic3BfdXBncmFkZS5oIgorCitleHRlcm4gdWludDE2IGNyY190YWJsZVtdOworCisjcHJhZ21hIHBhY2socHVzaCkKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyIGZpbGVfc2l6ZTsKKyAgdWludDggZmlsZV9jcmNbMl07CisgIHVpbnQ4IGZpbGVfbWQ1WzE2XTsKK30gc3BfdXBncmFkZV9pbmZvX3Q7CisjcHJhZ21hIHBhY2socG9wKQorCisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoJCQkJCQkJCQkJICAgICAgQ1JDINCjINHpCisqIMPoIMr2OiAg0KPR6dK7tK5jaGFyyv2+3bXEQ1JDCisqCisqIMrkIMjrOiAgQ1BVX0NIQVIgICAqc3RyICAJCS0g0qrQo9Hpyv2+3bXE1rjV6worKiAgICAgICAgIENQVV9JTlQxNlUgc2l6ZQkJLSDSqtCj0enK/b7dtcSzpLbICisqCQkgIENQVV9JTlQwOFUgbW9kZQkJLSDQo9HptcTEo8q9CisqCQkJCQkJICAgICAgICAgMTogIM6quMO0rsr9vt3U9rzTQ1JD0KPR6SAgzazKsbe1u9jQo9HptcRDUkPWtQorKgkJCQkJCQkgICAgIDA6ICC4w7Suyv2+3crHt/HNqLn90KPR6Qm3tbvY0KPR6bXEQ1JD1rUKKyogt7Ugu9g6CisqCisqINeiINLiOgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisvL0NSQ8q508MKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQ4CSBMOworICB1aW50OAkgSDsKK30gSU5UXzA4QklUXzI7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgdWludDE2ICAgSW50MTZCaXQ7CisgIElOVF8wOEJJVF8yICBJbnQwOEJpdDsKK30gSU5UXzE2QklUXzA4QklUOworCit1aW50MTYgQUhfQ1JDX1ZlcmlmeSh1aW50OCBzdHJbXSwgdWludDE2ICBzaXplLCB1aW50OCBtb2RlKQoreworICB1aW50MzIgICAgICAgaTsKKyAgSU5UXzE2QklUXzA4QklUCSBjcmM7CisgIElOVF8xNkJJVF8wOEJJVAkgeTsKKworICBjcmMuSW50MTZCaXQgPSAwOworICBmb3IoaSA9IDAgOyBpIDwgc2l6ZSA7IGkrKykKKyAgeworICAgIHkuSW50MTZCaXQgICAgPSBjcmNfdGFibGVbIHN0clsgaSBdIF4gY3JjLkludDA4Qml0LkggXTsKKyAgICB5LkludDA4Qml0LkggXj0gY3JjLkludDA4Qml0Lkw7CisgICAgY3JjLkludDE2Qml0ICA9IHkuSW50MTZCaXQ7CisgIH0KKyAgaWYobW9kZSA9PSAxKQorICB7CisgICAgc3RyWyBpKysgXSA9IHkuSW50MDhCaXQuSCA7CisgICAgc3RyWyBpIF0gICA9IHkuSW50MDhCaXQuTCA7CisgIH0KKyAgcmV0dXJuKGNyYy5JbnQxNkJpdCk7Cit9CisKK3N0YXRpYyB1aW50MTYgdXBkYXRlX3VwZ3JhZGVfbWFyayh1aW50MzIgQ2hlY2tTdW0sIHVpbnQzMiBzaXplKQoreworICB1aW50MTYgcmV0LGk7CisgIHVpbnQ4IGJ1ZmZbMThdID0geyAweDVhLDB4NGIsMHgzYywweDJkLDB4MWUsMHgwZiB9IDsKKworICAvL9C0yf28tsr9vt2zybmm0LTI60ZMQVNIseq8xywgus3Qo9HpwussINPQ0Ke0+sLrs6S2yNC0yOvK/b7dRkxBU0gKKyAgbWVtY3B5KGJ1ZmYrNiwgKHVuc2lnbmVkIGNoYXIqKSYoQ2hlY2tTdW0pLCA0KSA7CSAgICAvL9Cj0em6zQorICBtZW1jcHkoYnVmZisxMCwodW5zaWduZWQgY2hhciopJihzaXplKSAsNCkgOwkJICAgIC8vyv2+3bOktsgKKyAgQUhfQ1JDX1ZlcmlmeShidWZmLCAxNCwgMSk7CisKKyAgZm9yKGkgPSAwOyBpPDU7IGkrKykKKyAgeworICAgIHJldCA9IHNwX2ZsYXNoX2VyYXNlKERFRl9JYXBNYXJrQWRkcik7CisgICAgaWYocmV0KQorICAgIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICByZXQgPSBzcF9mbGFzaF93cml0ZShERUZfSWFwTWFya0FkZHIsIGJ1ZmYsIDE2KTsKKyAgICBpZighcmV0KQorICAgIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZihpID49IDUpCisgIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiu6r8r9w/uzxjogVTMyIEFQUF9JYXBEYXRhU3VtQ2hlY2soIFUzMiBzdGFhZGRyLCBVMzIgbGVuLCBVMDggbW9kZSApCiu6r8r91/fTwzogtsGz9kZMQVNI1tC1xMr9vt2jrLKi0M6zydCj0ekKK7qvyv3K5MjrOiBzdGFhZGRyIAktIL+qyry12Na3CisJCSAgbGVuCSAgCS0gyv2+3bOktsgKKwkJICBtb2RlCQktINCj0enEo8q9IDAgyKG3tLrN0KPR6SAxIMbVzai6zdCj0ekKK7qvyv3K5LP2OiDO3goruq/K/be1u9jWtTogMCCzybmmIMbky/vKp7DcCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyIGRvX0FQUF9JYXBEYXRhU3VtQ2hlY2sodWludDMyIHN0YWFkZHIsIHVpbnQzMiBsZW4sIHVpbnQ4IG1vZGUpCit7CisgIHVpbnQzMiBTdW07CisgIHVpbnQzMiBhcHBfbGVuLCBjaGVja3NpemUsIHNpemU7CisgIHVpbnQxNiByY29kZSwgaTsKKyAgdWludDggYnVmZmVyWzEwMjRdOy8vSUFQX01BWExFTgorCisgIGFwcF9sZW4gPSBsZW47CisgIGNoZWNrc2l6ZSA9IDA7CisgIFN1bSA9IDA7CisgIHdoaWxlKGNoZWNrc2l6ZSA8IGFwcF9sZW4pCisgIHsKKyAgICBpZihsZW4gPCAxMDI0KQorICAgIHsKKyAgICAgIHNpemUgPSBsZW47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzaXplID0gMTAyNDsKKyAgICB9CisKKyAgICBmb3IoaT0wOyBpPDU7IGkrKykKKyAgICB7CisgICAgICByY29kZSA9IHNwX2ZsYXNoX3JlYWQoKHN0YWFkZHIgKyBjaGVja3NpemUpLCBidWZmZXIsIHNpemUpOworICAgICAgaWYoIXJjb2RlKQorICAgICAgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZihtb2RlID09IDApCisgICAgeworICAgICAgZm9yKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgeworICAgICAgICBTdW0gKz0gKCh+YnVmZmVyW2ldKSAmIDB4RkYpOyAgICAvL9DCtcTKx8iht7S6zQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgZm9yKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgeworICAgICAgICBTdW0gKz0gYnVmZmVyW2ldOyAJCQkJLy/Az7XEysfWsb3Tus0KKyAgICAgIH0KKyAgICB9CisgICAgY2hlY2tzaXplICs9IHNpemU7CisgICAgbGVuIC09IHNpemU7CisgIH0KKworICByZXR1cm4gKFN1bSk7Cit9CitzdGF0aWMgdWludDggZ2V0X2ZpbGVfaW5mbyhzcF9wb3NfdCogcG9zLCBzcF91cGdyYWRlX2luZm9fdCogdXBncmFkZWluZm8pCit7CisgIHVpbnQ4IHJldDsKKyAgdWludDggc2l6ZTsKKyAgY2hhciB0ZW1wWzMyXTsKKyAgc3BfcHJvdG9jb2xfcmVxdWVzdF90IHJlcTsKKyAgc3BfcHJvdG9jb2xfcmVzcG9uc2VfdCByZXNwOworICBjd19wYWNrX2NvbnRleHQgcGFjazsKKyAgY3dfdW5wYWNrX2NvbnRleHQgdW5wYWNrOworICB1bnBhY2tfZmllbGRfdCBmaWVsZDsKKworICBzcF9mbGFzaF9yZWFkKEFERFJfVVBHUkFERV9VUElORk8sKHVpbnQ4Kil1cGdyYWRlaW5mbyxzaXplb2Yoc3BfdXBncmFkZV9pbmZvX3QpKTsKKworICAvKrbByKHOxLz+s6S2yLrNQ1JDKi8KKyAgc3BfcHJvdG9jb2xfcmVxX2luaXQoJnJlcSxTUF9DTURfVVBHUkFERSk7CisgIHNwX3BhY2tfaW5pdCgmcGFjayxyZXEuZGF0YSxzaXplb2YocmVxLmRhdGEpKTsKKyAgY3dfcGFja19tYXBfc2l6ZSgmcGFjayw1KTsKKworICBzcF9wYWNrX3B1dF9iaW4oJnBhY2ssUEtfQklOX0RFVlBIWUlELCBwb3MtPmRldnBoeWlkLCBzaXplb2YocG9zLT5kZXZwaHlpZCkpOworICBzcF9wYWNrX3B1dF9pbnQoJnBhY2ssUEtfSU5UX1NFUU5PICwweEZGRkYpOworICBzcF9wYWNrX3B1dF9zdHIoJnBhY2ssUEtfU1RSX0RFVlRZUEUsIERFVl9UWVBFKTsKKyAgc3BfcGFja19wdXRfc3RyKCZwYWNrLFBLX1NUUl9WRVJTSU9OLCBQUk9fVkVSU0lPTik7CisgIHNwX3BhY2tfcHV0X2JpbigmcGFjayxQS19CSU5fU09GVF9NRDUsdXBncmFkZWluZm8tPmZpbGVfbWQ1LDE2KTsKKworICByZXEuZGF0YWxlbiArPSBzcF9wYWNrX2xlbmd0aCgmcGFjayk7CisgIHJldCA9IHNwX2NvbW1fY2FsbChwb3MsICZyZXEsICZyZXNwLCBDT01NX1dBSVRfVElNRSk7CisgIGlmKCFyZXQpCisgIHsKKyAgICBzcF91bnBhY2tfaW5pdCgmdW5wYWNrLHJlc3AuZGF0YSxyZXNwLmRhdGFsZW4pOworICAgIC8vZXJhc2UKKyAgICBzcF9mbGFzaF9lcmFzZShBRERSX1VQR1JBREVfVVBJTkZPKTsKKyAgICBzaXplCT0gc3BfdW5wYWNrX21hcF9zaXplKCZ1bnBhY2spOworICAgIHdoaWxlKHNpemUtLSA+IDApCisgICAgeworICAgICAgc3BfdW5wYWNrX3ZhbHVlKCZ1bnBhY2ssJmZpZWxkKTsKKyAgICAgIC8vIDQgYnl0ZSBmaWxlX2xlbmd0aCwyIGNyYworICAgICAgaWYoSVNfS0VZKFBLX0lOVF9GSUxFU0laRSxmaWVsZC5rZXkpKQorICAgICAgeworICAgICAgICB1cGdyYWRlaW5mby0+ZmlsZV9zaXplID0gKHVpbnQzMilmaWVsZC52YWwuaW50dmFsOworICAgICAgfQorICAgICAgZWxzZSBpZihJU19LRVkoUEtfQklOX0ZJTEVDUkMsZmllbGQua2V5KSkKKyAgICAgIHsKKyAgICAgICAgaWYoZmllbGQuc3RybGVuICE9IDIpCisgICAgICAgIHsKKyAgICAgICAgICBzcHJpbnRmKHRlbXAsIkNSQ7Oktsg9JWQiLGZpZWxkLnN0cmxlbik7CisgICAgICAgICAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywgIsn9vLbKp7DcIix0ZW1wLERFTEFZX1RJTUUzcyk7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgTUVNQ1BZKHVwZ3JhZGVpbmZvLT5maWxlX2NyYyxmaWVsZC52YWwuYmludmFsLGZpZWxkLnN0cmxlbik7CisgICAgICB9CisgICAgICBlbHNlIGlmKElTX0tFWShQS19CSU5fU09GVF9NRDUsZmllbGQua2V5KSkKKyAgICAgIHsKKyAgICAgICAgTUVNQ1BZKHVwZ3JhZGVpbmZvLT5maWxlX21kNSxmaWVsZC52YWwuYmludmFsLGZpZWxkLnN0cmxlbik7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIGRpc3Bfc2VydmVyX2Vycm1zZyhwb3MsICLJ/by2yqew3CIscmVzcC5kYXRhLHJlc3AuZGF0YWxlbik7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KK3N0YXRpYyB1aW50OCBkb3dubG9hZF9maWxlKHNwX3Bvc190KiBwb3MpCit7CisgIHVpbnQ4IHJldDsKKyAgdWludDggdGltZW91dF90cnljbnQgPSAwOworICB1aW50OCBzYW1lc2VxX3RyeWNudCA9IDA7CisgIHVpbnQ4IGRhdGFfbGVuID0gMDsKKyAgdWludDE2IHNlcW5vID0gMDsKKyAgdWludDE2IHJlc3Bfc2Vxbm8gPSAwOworICB1aW50MzIgb2Zmc2V0ID0gMDsKKyAgdWludDggZW5kZmxhZyA9IDA7CisgIHVpbnQ4IHNpemU7CisgIGNoYXIgdGVtcFszMl07CisgIHVpbnQ4IGJ1ZlsxMjhdOworICBzcF9wcm90b2NvbF9yZXF1ZXN0X3QgcmVxOworICBzcF9wcm90b2NvbF9yZXNwb25zZV90IHJlc3A7CisgIGN3X3BhY2tfY29udGV4dCBwYWNrOworICBjd191bnBhY2tfY29udGV4dCB1bnBhY2s7CisgIHVucGFja19maWVsZF90IGZpZWxkOworCisgIGZvcihvZmZzZXQgPSBBRERSX1VQR1JBREVfQkVHSU47IG9mZnNldCA8IEFERFJfVVBHUkFERV9FTkQ7IG9mZnNldCArPURFRl9GTEFTSF9QYWdlU2l6ZSkKKyAgeworICAgIHNwX2ZsYXNoX2VyYXNlKG9mZnNldCk7CisgIH0KKyAgb2Zmc2V0ID0gMDsKKyAgd2hpbGUoMSkKKyAgeworICAgIHNwX2ZlZWRfZG9nKCk7CisgICAgc3BfcHJvdG9jb2xfcmVxX2luaXQoJnJlcSxTUF9DTURfVVBHUkFERSk7CisgICAgc3BfcGFja19pbml0KCZwYWNrLHJlcS5kYXRhLHNpemVvZihyZXEuZGF0YSkpOworICAgIGN3X3BhY2tfbWFwX3NpemUoJnBhY2ssMik7CisKKyAgICBzcF9wYWNrX3B1dF9iaW4oJnBhY2ssUEtfQklOX0RFVlBIWUlELCBwb3MtPmRldnBoeWlkLCBzaXplb2YocG9zLT5kZXZwaHlpZCkpOworICAgIHNwX3BhY2tfcHV0X2ludCgmcGFjayxQS19JTlRfU0VRTk8sc2Vxbm8pOworCisgICAgcmVxLmRhdGFsZW4gKz0gc3BfcGFja19sZW5ndGgoJnBhY2spOworICAgIHJldCA9IHNwX2NvbW1fY2FsbChwb3MsICZyZXEsJnJlc3AsIENPTU1fV0FJVF9USU1FKTsKKyAgICBpZighcmV0KQorICAgIHsKKyAgICAgIHRpbWVvdXRfdHJ5Y250ID0gMDsvL3N1Y2Nlc3MgcmVzZXQKKyAgICAgIHNwX3VucGFja19pbml0KCZ1bnBhY2sscmVzcC5kYXRhLHJlc3AuZGF0YWxlbik7CisgICAgICBzaXplID0gc3BfdW5wYWNrX21hcF9zaXplKCZ1bnBhY2spOworICAgICAgd2hpbGUoc2l6ZS0tID4gMCkKKyAgICAgIHsKKyAgICAgICAgc3BfdW5wYWNrX3ZhbHVlKCZ1bnBhY2ssJmZpZWxkKTsKKyAgICAgICAgaWYoSVNfS0VZKFBLX0lOVF9TRVFOTyxmaWVsZC5rZXkpKQorICAgICAgICB7CisgICAgICAgICAgcmVzcF9zZXFubyA9ICh1aW50MzIpZmllbGQudmFsLmludHZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKElTX0tFWShQS19JTlRfRkxBRyxmaWVsZC5rZXkpKQorICAgICAgICB7CisgICAgICAgICAgaWYoMCA9PSBNRU1DTVAoImVuZCIsZmllbGQudmFsLnN0cnZhbCxmaWVsZC5zdHJsZW4pKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIM7EvP7PwtTYzeqzyQorICAgICAgICAgICAgZW5kZmxhZyA9IDE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoSVNfS0VZKFBLX0JJTl9GSUxFREFUQSxmaWVsZC5rZXkpKQorICAgICAgICB7CisgICAgICAgICAgZGF0YV9sZW4gPSBmaWVsZC5zdHJsZW47CisgICAgICAgICAgaWYoZGF0YV9sZW4gPiBzaXplb2YoYnVmKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBzcHJpbnRmKHRlbXAsIrTtzvOzpLbIPSVkIixkYXRhX2xlbik7CisgICAgICAgICAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCAiyf28tsqnsNwiLHRlbXAsREVMQVlfVElNRTNzKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgIH0KKyAgICAgICAgICBNRU1DTEVBUihidWYsc2l6ZW9mIGJ1Zik7CisgICAgICAgICAgTUVNQ1BZKGJ1ZixmaWVsZC52YWwuYmludmFsLGRhdGFfbGVuKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZihyZXNwX3NlcW5vICE9IHNlcW5vICsxKQorICAgICAgeworICAgICAgICBpZigxMCA8IHNhbWVzZXFfdHJ5Y250KQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgKytzYW1lc2VxX3RyeWNudDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBzYW1lc2VxX3RyeWNudCA9IDA7CisKKyAgICAgICsrc2Vxbm87CisgICAgICBzbnByaW50Zih0ZW1wLHNpemVvZiB0ZW1wLCJzZXFubyA9ICUwNGQiLHNlcW5vKTsKKyAgICAgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsICLV/dTayf28ti4uLiIsdGVtcCwwKTsKKworICAgICAgc3BfZmxhc2hfd3JpdGUoQUREUl9VUEdSQURFX0JFR0lOK29mZnNldCxidWYsZGF0YV9sZW4pOworICAgICAgaWYoZW5kZmxhZykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIG9mZnNldCArPSAodWludDMyKWRhdGFfbGVuOworICAgICAgaWYoQUREUl9VUEdSQURFX0JFR0lOICsgb2Zmc2V0ID49IEFERFJfVVBHUkFERV9FTkQpCisgICAgICB7CisgICAgICAgIGRpc3BfaGludF9pbmZvKHBvcywgIs/C1NjOxLz+uf208yIsREVMQVlfVElNRTNzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZigzIDwgdGltZW91dF90cnljbnQpCisgICAgICB7CisgICAgICAgIGRpc3BfaGludF9pbmZvKHBvcywgIs/C1NjOxLz+s6zKsSIsREVMQVlfVElNRTNzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBEZWxheV9tcyhERUxBWV9USU1FMXMpOworICAgICAgKyt0aW1lb3V0X3RyeWNudDsKKyAgICB9CisgIH0KK30KK3N0YXRpYyB1aW50OCBjaGVja19maWxlX2FuZF91cGdyYWRlKHNwX3Bvc190KiBwb3MsIHNwX3VwZ3JhZGVfaW5mb190KiB1cGdyYWRlaW5mbykKK3sKKyAgdWludDE2IHJldDsKKyAgdWludDggY3JjWzJdOworICB1aW50OCB0ZW1wX2NyY1syXTsKKyAgdWludDggYnVmWzEyOF07CisgIHVpbnQzMiBzdW1jcmM7CisKKyAgdWludDMyIHBhZ2VfaW5kZXggPSAwOworICB1aW50MzIgcGFnZV9udW0gPSAodXBncmFkZWluZm8tPmZpbGVfc2l6ZS0xKS9zaXplb2YoYnVmKSArIDE7CisgIHdoaWxlKDEpCisgIHsKKyAgICBpZihwYWdlX251bSA9PSBwYWdlX2luZGV4ICsxKQorICAgIHsKKyAgICAgIHNwX2ZsYXNoX3JlYWQoQUREUl9VUEdSQURFX0JFR0lOICtwYWdlX2luZGV4KnNpemVvZihidWYpLGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIGJ1Zik7CisgICAgICBtZW1jcHkodGVtcF9jcmMsY3JjLDIpOworICAgICAgaWYodXBncmFkZWluZm8tPmZpbGVfc2l6ZSVzaXplb2YoYnVmKSA9PSAwKQorICAgICAgeworICAgICAgICBzcF9wcm90b2NvbF9jcmNfaW5pdChidWYsc2l6ZW9mKGJ1ZiksdGVtcF9jcmMsY3JjKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc3BfcHJvdG9jb2xfY3JjX2luaXQoYnVmLHVwZ3JhZGVpbmZvLT5maWxlX3NpemUlc2l6ZW9mKGJ1ZiksdGVtcF9jcmMsY3JjKTsKKyAgICAgIH0KKyAgICAgIGlmKDAgPT0gTUVNQ01QKHVwZ3JhZGVpbmZvLT5maWxlX2NyYyxjcmMsMikpCisgICAgICB7CisgICAgICAgIHNwX2ZsYXNoX3dyaXRlKEFERFJfVVBHUkFERV9VUElORk8sKHVpbnQ4Kil1cGdyYWRlaW5mbyxzaXplb2Yoc3BfdXBncmFkZV9pbmZvX3QpKTsKKworICAgICAgICBzdW1jcmMgPSBkb19BUFBfSWFwRGF0YVN1bUNoZWNrKEFERFJfVVBHUkFERV9CRUdJTix1cGdyYWRlaW5mby0+ZmlsZV9zaXplLDApOworICAgICAgICAvKsn9vLa68yxib290ILvhssGz/bjD0rO8x8K8ICovCisgICAgICAgIC8vuPzQwrHq1r7Ou9bDzrsKKyAgICAgICAgcmV0ID0gdXBkYXRlX3VwZ3JhZGVfbWFyayhzdW1jcmMsdXBncmFkZWluZm8tPmZpbGVfc2l6ZSk7CisgICAgICAgIGlmKHJldCkKKyAgICAgICAgeworICAgICAgICAgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsICLJ/by2yqew3CIsIrj80MKx6ta+yqew3CIsREVMQVlfVElNRTJzKTsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCAi1f3U2sn9vLYiLCLH687wts+15yIsREVMQVlfVElNRTJzKTsKKyAgICAgICAgICBzcF9yZXNldCgpOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGRpc3BfaGludF9pbmZvKHBvcywgIs7EvP7Qo9HptO3O8yIsREVMQVlfVElNRTNzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzcF9mbGFzaF9yZWFkKEFERFJfVVBHUkFERV9CRUdJTitwYWdlX2luZGV4KnNpemVvZihidWYpLGJ1ZixzaXplb2YgYnVmKTsKKyAgICAgIGlmKDAgPT0gcGFnZV9pbmRleCkKKyAgICAgIHsKKyAgICAgICAgc3BfcHJvdG9jb2xfY3JjKGJ1ZixzaXplb2YgYnVmLGNyYyk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIG1lbWNweSh0ZW1wX2NyYyxjcmMsMik7CisgICAgICAgIHNwX3Byb3RvY29sX2NyY19pbml0KGJ1ZixzaXplb2YgYnVmLHRlbXBfY3JjLGNyYyk7CisgICAgICB9CisgICAgICArK3BhZ2VfaW5kZXg7CisgICAgfQorICB9Cit9Cit2b2lkIHNwX21hbnVhbF91cGdyYWRlKHNwX3Bvc190KiBwb3MpCit7CisgIHVpbnQ4IHJldDsKKyAgc3BfdXBncmFkZV9pbmZvX3QgdXBncmFkZWluZm87CisKKyAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywgItX91NrJ/by2Li4iLCLO8LbPtechISIsMCk7CisgIE1FTUNMRUFSKCZ1cGdyYWRlaW5mbyxzaXplb2YgdXBncmFkZWluZm8pOworICByZXQgPSBnZXRfZmlsZV9pbmZvKHBvcywgJnVwZ3JhZGVpbmZvKTsKKyAgaWYocmV0KQorICB7CisgICAgcmV0dXJuOworICB9CisgIHJldCA9IGRvd25sb2FkX2ZpbGUocG9zKTsKKyAgaWYocmV0KQorICB7CisgICAgcmV0dXJuOworICB9CisgIGNoZWNrX2ZpbGVfYW5kX3VwZ3JhZGUocG9zLCAmdXBncmFkZWluZm8pOworfQorCmRpZmYgLS1naXQgYS9zdXB3aXNkb20vc3BfdXBncmFkZS5oIGIvc3Vwd2lzZG9tL3NwX3VwZ3JhZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2Q4MTYwCi0tLSAvZGV2L251bGwKKysrIGIvc3Vwd2lzZG9tL3NwX3VwZ3JhZGUuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9TUF9VUEdSQURFX0hfCisjZGVmaW5lIF9TUF9VUEdSQURFX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordm9pZCBzcF9tYW51YWxfdXBncmFkZShzcF9wb3NfdCogcG9zKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zdXB3aXNkb20vc3BfdXRpbC5jIGIvc3Vwd2lzZG9tL3NwX3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjcwYjEzCi0tLSAvZGV2L251bGwKKysrIGIvc3Vwd2lzZG9tL3NwX3V0aWwuYwpAQCAtMCwwICsxLDUzMCBAQAorI2luY2x1ZGUgIi4uL3N5c19ody9rZXlwYWQuaCIKKyNpbmNsdWRlICIuLi9zeXNfaHcvZHJ2X2FkYy5oIgorI2luY2x1ZGUgInNwX2Rpc3BsYXkuaCIKKworI2luY2x1ZGUgInNwX3V0aWwuaCIKKwordWludDE2IGNyY190YWJsZVtdID0KK3sKKyAgMHgwMDAwLCAweDEwMjEsIDB4MjA0MiwgMHgzMDYzLCAweDQwODQsIDB4NTBBNSwgMHg2MEM2LCAweDcwRTcsCisgIDB4ODEwOCwgMHg5MTI5LCAweEExNEEsIDB4QjE2QiwgMHhDMThDLCAweEQxQUQsIDB4RTFDRSwgMHhGMUVGLAorICAweDEyMzEsIDB4MDIxMCwgMHgzMjczLCAweDIyNTIsIDB4NTJCNSwgMHg0Mjk0LCAweDcyRjcsIDB4NjJENiwKKyAgMHg5MzM5LCAweDgzMTgsIDB4QjM3QiwgMHhBMzVBLCAweEQzQkQsIDB4QzM5QywgMHhGM0ZGLCAweEUzREUsCisgIDB4MjQ2MiwgMHgzNDQzLCAweDA0MjAsIDB4MTQwMSwgMHg2NEU2LCAweDc0QzcsIDB4NDRBNCwgMHg1NDg1LAorICAweEE1NkEsIDB4QjU0QiwgMHg4NTI4LCAweDk1MDksIDB4RTVFRSwgMHhGNUNGLCAweEM1QUMsIDB4RDU4RCwKKyAgMHgzNjUzLCAweDI2NzIsIDB4MTYxMSwgMHgwNjMwLCAweDc2RDcsIDB4NjZGNiwgMHg1Njk1LCAweDQ2QjQsCisgIDB4Qjc1QiwgMHhBNzdBLCAweDk3MTksIDB4ODczOCwgMHhGN0RGLCAweEU3RkUsIDB4RDc5RCwgMHhDN0JDLAorICAweDQ4QzQsIDB4NThFNSwgMHg2ODg2LCAweDc4QTcsIDB4MDg0MCwgMHgxODYxLCAweDI4MDIsIDB4MzgyMywKKyAgMHhDOUNDLCAweEQ5RUQsIDB4RTk4RSwgMHhGOUFGLCAweDg5NDgsIDB4OTk2OSwgMHhBOTBBLCAweEI5MkIsCisgIDB4NUFGNSwgMHg0QUQ0LCAweDdBQjcsIDB4NkE5NiwgMHgxQTcxLCAweDBBNTAsIDB4M0EzMywgMHgyQTEyLAorICAweERCRkQsIDB4Q0JEQywgMHhGQkJGLCAweEVCOUUsIDB4OUI3OSwgMHg4QjU4LCAweEJCM0IsIDB4QUIxQSwKKyAgMHg2Q0E2LCAweDdDODcsIDB4NENFNCwgMHg1Q0M1LCAweDJDMjIsIDB4M0MwMywgMHgwQzYwLCAweDFDNDEsCisgIDB4RURBRSwgMHhGRDhGLCAweENERUMsIDB4RERDRCwgMHhBRDJBLCAweEJEMEIsIDB4OEQ2OCwgMHg5RDQ5LAorICAweDdFOTcsIDB4NkVCNiwgMHg1RUQ1LCAweDRFRjQsIDB4M0UxMywgMHgyRTMyLCAweDFFNTEsIDB4MEU3MCwKKyAgMHhGRjlGLCAweEVGQkUsIDB4REZERCwgMHhDRkZDLCAweEJGMUIsIDB4QUYzQSwgMHg5RjU5LCAweDhGNzgsCisgIDB4OTE4OCwgMHg4MUE5LCAweEIxQ0EsIDB4QTFFQiwgMHhEMTBDLCAweEMxMkQsIDB4RjE0RSwgMHhFMTZGLAorICAweDEwODAsIDB4MDBBMSwgMHgzMEMyLCAweDIwRTMsIDB4NTAwNCwgMHg0MDI1LCAweDcwNDYsIDB4NjA2NywKKyAgMHg4M0I5LCAweDkzOTgsIDB4QTNGQiwgMHhCM0RBLCAweEMzM0QsIDB4RDMxQywgMHhFMzdGLCAweEYzNUUsCisgIDB4MDJCMSwgMHgxMjkwLCAweDIyRjMsIDB4MzJEMiwgMHg0MjM1LCAweDUyMTQsIDB4NjI3NywgMHg3MjU2LAorICAweEI1RUEsIDB4QTVDQiwgMHg5NUE4LCAweDg1ODksIDB4RjU2RSwgMHhFNTRGLCAweEQ1MkMsIDB4QzUwRCwKKyAgMHgzNEUyLCAweDI0QzMsIDB4MTRBMCwgMHgwNDgxLCAweDc0NjYsIDB4NjQ0NywgMHg1NDI0LCAweDQ0MDUsCisgIDB4QTdEQiwgMHhCN0ZBLCAweDg3OTksIDB4OTdCOCwgMHhFNzVGLCAweEY3N0UsIDB4QzcxRCwgMHhENzNDLAorICAweDI2RDMsIDB4MzZGMiwgMHgwNjkxLCAweDE2QjAsIDB4NjY1NywgMHg3Njc2LCAweDQ2MTUsIDB4NTYzNCwKKyAgMHhEOTRDLCAweEM5NkQsIDB4RjkwRSwgMHhFOTJGLCAweDk5QzgsIDB4ODlFOSwgMHhCOThBLCAweEE5QUIsCisgIDB4NTg0NCwgMHg0ODY1LCAweDc4MDYsIDB4NjgyNywgMHgxOEMwLCAweDA4RTEsIDB4Mzg4MiwgMHgyOEEzLAorICAweENCN0QsIDB4REI1QywgMHhFQjNGLCAweEZCMUUsIDB4OEJGOSwgMHg5QkQ4LCAweEFCQkIsIDB4QkI5QSwKKyAgMHg0QTc1LCAweDVBNTQsIDB4NkEzNywgMHg3QTE2LCAweDBBRjEsIDB4MUFEMCwgMHgyQUIzLCAweDNBOTIsCisgIDB4RkQyRSwgMHhFRDBGLCAweERENkMsIDB4Q0Q0RCwgMHhCREFBLCAweEFEOEIsIDB4OURFOCwgMHg4REM5LAorICAweDdDMjYsIDB4NkMwNywgMHg1QzY0LCAweDRDNDUsIDB4M0NBMiwgMHgyQzgzLCAweDFDRTAsIDB4MENDMSwKKyAgMHhFRjFGLCAweEZGM0UsIDB4Q0Y1RCwgMHhERjdDLCAweEFGOUIsIDB4QkZCQSwgMHg4RkQ5LCAweDlGRjgsCisgIDB4NkUxNywgMHg3RTM2LCAweDRFNTUsIDB4NUU3NCwgMHgyRTkzLCAweDNFQjIsIDB4MEVEMSwgMHgxRUYwCit9OworCit2b2lkIHNwX3Byb3RvY29sX2NyYyhjb25zdCB1aW50OCogYnVmLCB1aW50MTYgbGVuLCB1aW50OCBjcmNbMl0pCit7CisgIC8vdWludDE2CWFjY251bSA9IDB4Yzc4YzsKKyAgdWludDggdGVtcF9jcmNbMl07CisgIHRlbXBfY3JjWzBdID0gMHhjNzsKKyAgdGVtcF9jcmNbMV0gPSAweDhjOworICBzcF9wcm90b2NvbF9jcmNfaW5pdChidWYsbGVuLHRlbXBfY3JjLGNyYyk7Cit9CisKK3ZvaWQgc3BfcHJvdG9jb2xfY3JjX2luaXQoY29uc3QgdWludDgqIGJ1ZiwgdWludDE2IGxlbix1aW50OCBpbml0WzJdLCB1aW50OCBjcmNbMl0pCit7CisgIHVpbnQxNiBhY2NudW0gPSAodWludDE2KWluaXRbMF08PDggfCh1aW50MTYpaW5pdFsxXTsKKyAgdWludDE2IGk7CisgIGZvcihpID0gMDsgaSA8IGxlbjsgKytpKQorICB7CisgICAgYWNjbnVtID0gKGFjY251bSA8PCA4KSBeIGNyY190YWJsZVsoKGFjY251bSA+PiA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gYnVmW2ldKSAmIDB4RkZdOworICB9CisgIGNyY1swXSA9ICh1aW50OCkoKGFjY251bSA+PiA4KSAmIDB4RkYpOworICBjcmNbMV0gPSAodWludDgpKGFjY251bSAmIDB4RkYpOworfQorCit2b2lkIHNwX2tleV9jYWxpYnJhdGUodm9pZCkKK3sKKyAgY2FsaWJyYXRlX2tleSgwKTsKK30KKwordWludDggc3Bfa2V5X2luaXQodm9pZCkKK3sKKyAgYWRjX2luaXQoKTsKKyAgcmV0dXJuIGtleXBhZF9pbml0KCk7Cit9Cit1aW50OCBzcF9nZXRfa2V5KHZvaWQpCit7CisgIHVpbnQ4IGtleSA9IGtleXBhZF9nZXRfa2V5KCk7CisgIHN3aXRjaChrZXkpCisgIHsKKyAgY2FzZSBLRVlfTk9ORToKKyAgICByZXR1cm4gU1BfS0VZX05PTkU7CisgIGNhc2UgS0VZX0RJRzA6CisgICAgcmV0dXJuIFNQX0tFWV8wOworICBjYXNlIEtFWV9ESUcxOgorICAgIHJldHVybiBTUF9LRVlfMTsKKyAgY2FzZSBLRVlfRElHMjoKKyAgICByZXR1cm4gU1BfS0VZXzI7CisgIGNhc2UgS0VZX0RJRzM6CisgICAgcmV0dXJuIFNQX0tFWV8zOworICBjYXNlIEtFWV9ESUc0OgorICAgIHJldHVybiBTUF9LRVlfNDsKKyAgY2FzZSBLRVlfRElHNToKKyAgICByZXR1cm4gU1BfS0VZXzU7CisgIGNhc2UgS0VZX0RJRzY6CisgICAgcmV0dXJuIFNQX0tFWV82OworICBjYXNlIEtFWV9ESUc3OgorICAgIHJldHVybiBTUF9LRVlfNzsKKyAgY2FzZSBLRVlfRElHODoKKyAgICByZXR1cm4gU1BfS0VZXzg7CisgIGNhc2UgS0VZX0RJRzk6CisgICAgcmV0dXJuIFNQX0tFWV85OworICBjYXNlIEtFWV9FTlRFUjoKKyAgICByZXR1cm4gU1BfS0VZX0VOVEVSOworICBjYXNlIEtFWV9DQU5DRUw6CisgICAgcmV0dXJuIFNQX0tFWV9DTEVBUjsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gU1BfS0VZX05PTkU7CisgIH0KK30KK3ZvaWQgc3BfcmVzZXQodm9pZCkKK3sKKyAgd2hpbGUoMSk7Cit9Cit2b2lkIHNwX2JjZF90b19zdHIoY29uc3QgdWludDgqIGJjZCwgdWludDggYmNkX2xlbiwgY2hhciogc3RyKQoreworICB1aW50OCBpOworICB1aW50MTYgajsKKyAgZm9yKGkgPSAwOyBpIDwgYmNkX2xlbjsgKytpKQorICB7CisgICAgaiA9IGkgPDwgMTsKKyAgICBzdHJbal0gPSAoKGJjZFtpXSA+PiA0KSAmIDB4MEYpICsgMHgzMDsKKyAgICBzdHJbaiArIDFdID0gKGJjZFtpXSAmIDB4MEYpICsgMHgzMDsKKyAgfQorICBzdHJbaSA8PCAxXSA9IDA7Cit9Cit2b2lkIHNwX3N0cl90b19iY2QoY29uc3QgY2hhciogc3RyLCB1aW50OCBzdHJfbGVuLCB1aW50OCogYmNkKQoreworICB1aW50OCBpLGo7CisgIGZvcihpID0gMDsgaSA8IHN0cl9sZW47IGkgKz0gMikKKyAgeworICAgIGogPSBpLzI7CisgICAgYmNkW2pdID0gKCgoc3RyW2ldLTB4MzApICYgMHgwRikgPDw0KSB8ICgoc3RyW2krMV0tMHgzMCkgJiAweDBGKTsKKyAgfQorfQorc3RhdGljIHVpbnQ4IGNoYXJUb2hleChjaGFyIGNoKQoreworICBpZihjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQorICB7CisgICAgcmV0dXJuIChjaCAtJzAnKTsKKyAgfQorICBpZihjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKQorICB7CisgICAgcmV0dXJuIChjaCAtJ2EnICsxMCk7CisgIH0KKyAgaWYoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykKKyAgeworICAgIHJldHVybiAoY2ggLSdBJyArMTApOworICB9CisgIHJldHVybiAwOworfQordm9pZCBzcF9zdHJfdG9faGV4KGNvbnN0IGNoYXIqIHN0cixjb25zdCB1aW50MTYgbGVuLHVpbnQ4KiBoZXgpCit7CisgIHVpbnQ4IHQsdGVtcDsKKyAgdWludDE2IGk7CisgIGZvcihpID0gMDsgaSA8IGxlbjsgaSArPSAyKQorICB7CisgICAgdGVtcCA9IGNoYXJUb2hleChzdHJbaV0pOworICAgIHQgPSB0ZW1wIDw8IDQ7CisgICAgdGVtcCA9IGNoYXJUb2hleChzdHJbaSsxXSk7CisgICAgdCArPSB0ZW1wOworICAgIGhleFtpLzJdID0gdDsKKyAgfQorfQorCitzdGF0aWMgY2hhciBoZXhUb0NoYXJUYWJsZVtdPSB7IjAxMjM0NTY3ODlBQkNERUYifTsKK3ZvaWQgc3BfaGV4X3RvX3N0cihjb25zdCB1aW50OCogaGV4LGNvbnN0IHVpbnQ4IGxlbixjaGFyKiBzdHIpCit7CisgIHVpbnQ4IGksajsKKyAgZm9yKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgIHsKKyAgICBqID0gaSA8PCAxOworICAgIHN0cltqXSA9IGhleFRvQ2hhclRhYmxlWyhoZXhbaV0gPj4gNCkgJjB4MEZdOworICAgIHN0cltqICsxXSA9IGhleFRvQ2hhclRhYmxlW2hleFtpXSAmMHgwRl07CisgIH0KKyAgc3RyW2kgPDwgMV0gPSAwOworfQorCit2b2lkIHNwX2dldF9iY2R0aW1lKHVpbnQ4IGN0aW1lWzZdKQoreworICBfU3lzdGVtVGltZSB0aW1lOworICBtZW1zZXQoJnRpbWUsMCxzaXplb2YgdGltZSk7CisgIHJ0Y19nZXRfdGltZSgmdGltZSk7IC8vYmNkCisgIGN0aW1lWzBdID0gdGltZS55ZWFyOworICBjdGltZVsxXSA9IHRpbWUubW9udGg7CisgIGN0aW1lWzJdID0gdGltZS5kYXk7CisgIGN0aW1lWzNdID0gdGltZS5ob3VyOworICBjdGltZVs0XSA9IHRpbWUubWludXRlOworICBjdGltZVs1XSA9IHRpbWUuc2Vjb25kOworfQordm9pZCBzcF9zZXRfYmNkdGltZSh1aW50OCBjdGltZVs2XSkKK3sKKyAgX1N5c3RlbVRpbWUgdGltZTsKKyAgbWVtc2V0KCZ0aW1lLDAsc2l6ZW9mIHRpbWUpOworICB0aW1lLnllYXIgPSBjdGltZVswXTsKKyAgdGltZS5tb250aCA9IGN0aW1lWzFdOworICB0aW1lLmRheSA9IGN0aW1lWzJdOworICB0aW1lLmhvdXIgPSBjdGltZVszXTsKKyAgdGltZS5taW51dGUgPSBjdGltZVs0XTsKKyAgdGltZS5zZWNvbmQgPSBjdGltZVs1XTsKKworICBydGNfc2V0X3RpbWUoJnRpbWUpOworfQordWludDggc3BfY2hlY2tfdGltZV92YWxpZCh1aW50OCBjdGltZVs2XSkKK3sKKyAgaWYoQkNEMkRlYyhjdGltZVswXSkgPCAxOCkKKyAgICByZXR1cm4gMTsKKyAgaWYoQkNEMkRlYyhjdGltZVsxXSkgPiAxMikKKyAgICByZXR1cm4gMTsKKyAgaWYoQkNEMkRlYyhjdGltZVsyXSkgPiAzMSkKKyAgICByZXR1cm4gMTsKKyAgaWYoQkNEMkRlYyhjdGltZVszXSkgPiAyMykKKyAgICByZXR1cm4gMTsKKyAgaWYoQkNEMkRlYyhjdGltZVs0XSkgPiA1OSkKKyAgICByZXR1cm4gMTsKKyAgaWYoQkNEMkRlYyhjdGltZVs1XSkgPiA1OSkKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KK3VpbnQ4IHNwX2NyY19zdW0odWludDggYnVmW10sdWludDggbGVuKQoreworICB1aW50OCBpOworICB1aW50OCBzdW0gPSAwOworICAvL7zGy+PQo9Hpus0KKyAgZm9yKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgIHsKKyAgICBzdW0gPSBzdW0gKyBidWZbaV07CisgIH0KKyAgcmV0dXJuIHN1bTsKK30KKworaW50OCBpc0ZGKHVpbnQ4IGJ1ZltdLHVpbnQxNiBsZW4pCit7CisgIHVpbnQxNiBpOworICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgeworICAgIGlmKDB4RkYgIT0gYnVmW2ldKQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vbXMKK3VpbnQzMiBzcF9nZXRfdGlja2VyKHZvaWQpCit7CisgIHJldHVybiB0aW1lcl9nZXRfdGlja2VyKCk7Cit9CisKK3ZvaWQgRGVsYXlfbXModWludDMyIG1zKQoreworICB1aW50MzIgdCA9IHNwX2dldF90aWNrZXIoKTsKKyAgd2hpbGUoc3BfZ2V0X3RpY2tlcigpIC0gdCA8IG1zKTsKK30KK3ZvaWQgc3BfdmFsdmVfb24odm9pZCkKK3sKKyAgdmFsdmVfc3RhX3NldCh2YWx2ZV9zdGF0ZV9vbik7CisgIHZhbHZlX2N0cmwoKTsKK30KK3ZvaWQgc3BfdmFsdmVfb2ZmKHZvaWQpCit7CisgIHZhbHZlX3N0YV9zZXQodmFsdmVfc3RhdGVfb2ZmKTsKKyAgdmFsdmVfY3RybCgpOworfQordWludDggc3BfdmFsdmVfc3RhdGUodm9pZCkKK3sKKyAgcmV0dXJuIHZhbHZlX3N0YV9nZXQoKTsKK30KKworaW50MTYgZ2V0XzJieXRlX2ludCh1aW50OCB2YWx1ZV9zdHJbMl0pCit7CisgIGludDMyIHIgPSAwLCB0ID0gMDsKKyAgdCA9IHZhbHVlX3N0clswXTsKKyAgciA9IHQgPDwgODsKKyAgciB8PSB2YWx1ZV9zdHJbMV07CisgIHJldHVybiAoaW50MTYpcjsKK30KK2ludDMyIGdldF8zYnl0ZV9pbnQodWludDggdmFsdWVfc3RyWzNdKQoreworICBpbnQzMiByID0gMCwgdCA9IDA7CisgIHQgPSB2YWx1ZV9zdHJbMF07CisgIHIgPSB0IDw8IDE2OworICB0ID0gdmFsdWVfc3RyWzFdOworICByIHw9IHQgPDwgODsKKyAgciB8PSB2YWx1ZV9zdHJbMl07CisgIHJldHVybiByOworfQoraW50MzIgZ2V0XzRieXRlX2ludCh1aW50OCB2YWx1ZV9zdHJbNF0pCit7CisgIGludDMyIHIgPSAwLCB0ID0gMDsKKyAgdCA9IHZhbHVlX3N0clswXTsKKyAgciA9IHQgPDwgMjQ7CisgIHQgPSB2YWx1ZV9zdHJbMV07CisgIHIgfD0gdCA8PCAxNjsKKyAgdCA9IHZhbHVlX3N0clsyXTsKKyAgciB8PSB0IDw8IDg7CisgIHIgfD0gdmFsdWVfc3RyWzNdOworICByZXR1cm4gcjsKK30KK3ZvaWQgc2V0XzJieXRlX2ludCh1aW50OCB2YWx1ZV9zdHJbMl0sIGludCBudW0pCit7CisgIHZhbHVlX3N0clswXSA9IChudW0gPj4gOCkgJiAweEZGOworICB2YWx1ZV9zdHJbMV0gPSBudW0gJiAweEZGOworfQordm9pZCBzZXRfM2J5dGVfaW50KHVpbnQ4IHZhbHVlX3N0clszXSwgaW50IG51bSkKK3sKKyAgdmFsdWVfc3RyWzBdID0gKG51bSA+PiAxNikgJiAweEZGOworICB2YWx1ZV9zdHJbMV0gPSAobnVtID4+IDgpICYgMHhGRjsKKyAgdmFsdWVfc3RyWzJdID0gbnVtICYgMHhGRjsKK30KK3ZvaWQgc2V0XzRieXRlX2ludCh1aW50OCB2YWx1ZV9zdHJbNF0sIGludCBudW0pCit7CisgIHZhbHVlX3N0clswXSA9IChudW0gPj4gMjQpICYgMHhGRjsKKyAgdmFsdWVfc3RyWzFdID0gKG51bSA+PiAxNikgJiAweEZGOworICB2YWx1ZV9zdHJbMl0gPSAobnVtID4+IDgpICYgMHhGRjsKKyAgdmFsdWVfc3RyWzNdID0gbnVtICYgMHhGRjsKK30KKworLy+78bXDtaXX1r3a1tDEs9K7zru1xNa1CitpbnQzMiBHZXQxQml0KHVpbnQ4IGJ1ZiwgaW50IG4pCit7CisgIHJldHVybiAoYnVmID4+IG4pICYgMHgwMTsKK30KKworaW50MTYgZ2V0XzJieXRlX2ludF9sZSh1aW50OCB2YWx1ZV9zdHJbMl0pCit7CisgIGludDMyIHIgPSAwLCB0ID0gMDsKKyAgdCA9IHZhbHVlX3N0clsxXTsKKyAgciA9IHQgPDwgODsKKyAgciB8PSB2YWx1ZV9zdHJbMF07CisgIHJldHVybiAoaW50MTYpcjsKK30KKy8v0KHX1r3a0PIKK2ludDMyIGdldF8zYnl0ZV9pbnRfbGUodWludDggdmFsdWVfc3RyWzNdKQoreworICBpbnQzMiByID0gMCwgdCA9IDA7CisgIHQgPSB2YWx1ZV9zdHJbMl07CisgIHIgPSB0IDw8IDE2OworICB0ID0gdmFsdWVfc3RyWzFdOworICByIHw9IHQgPDwgODsKKyAgciB8PSB2YWx1ZV9zdHJbMF07CisgIHJldHVybiByOworfQorLy/QodfWvdrQ8goraW50MzIgZ2V0XzRieXRlX2ludF9sZSh1aW50OCB2YWx1ZV9zdHJbNF0pCit7CisgIGludDMyIHIgPSAwLCB0ID0gMDsKKyAgdCA9IHZhbHVlX3N0clszXTsKKyAgciA9IHQgPDwgMjQ7CisgIHQgPSB2YWx1ZV9zdHJbMl07CisgIHIgfD0gdCA8PCAxNjsKKyAgdCA9IHZhbHVlX3N0clsxXTsKKyAgciB8PSB0IDw8IDg7CisgIHIgfD0gdmFsdWVfc3RyWzBdOworICByZXR1cm4gcjsKK30KKwordm9pZCBzZXRfMmJ5dGVfaW50X2xlKHVpbnQ4IHZhbHVlX3N0clsyXSwgaW50IG51bSkKK3sKKyAgdmFsdWVfc3RyWzFdID0gKG51bSA+PiA4KSAmIDB4RkY7CisgIHZhbHVlX3N0clswXSA9IG51bSAmIDB4RkY7Cit9CisKK3ZvaWQgc2V0XzNieXRlX2ludF9sZSh1aW50OCB2YWx1ZV9zdHJbM10sIGludCBudW0pCit7CisgIHZhbHVlX3N0clsyXSA9IChudW0gPj4gMTYpICYgMHhGRjsKKyAgdmFsdWVfc3RyWzFdID0gKG51bSA+PiA4KSAmIDB4RkY7CisgIHZhbHVlX3N0clswXSA9IG51bSAmIDB4RkY7Cit9CisKKy8qvMbL47TTYmNkIHN0YXJ0dGltZSC1vc/W1Nq1xMPryv0qLwordWludDMyIGRpZmZfdGltZSh1aW50OCBzdGFydHRpbWVbNl0pCit7CisgIHVpbnQ4IGN0aW1lWzZdOworICB1aW50MzIgc3RhcnRfc2Vjb25kOworICB1aW50MzIgZW5kX3NlY29uZDsKKworICBzcF9nZXRfYmNkdGltZShjdGltZSk7CisgIHN0YXJ0X3NlY29uZCA9IGZvcm1hdF90aW1lX2NvdmVydF9zZWNzKHN0YXJ0dGltZSk7CisgIGVuZF9zZWNvbmQgPSBmb3JtYXRfdGltZV9jb3ZlcnRfc2VjcyhjdGltZSk7CisgIGlmKGVuZF9zZWNvbmQgPCBzdGFydF9zZWNvbmQpCisgIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gKGVuZF9zZWNvbmQgLSBzdGFydF9zZWNvbmQpOworfQorCit2b2lkIG15Y3B5KHZvaWQqIGRlc3QsIGNvbnN0IHZvaWQqIHNyYywgdWludDMyIGxlbikKK3sKKyAgY2hhciogdG1wX2Rlc3QgPSAoY2hhciopZGVzdDsKKyAgY2hhciogdG1wX3NyYyA9IChjaGFyKilzcmM7CisgIHdoaWxlKGxlbi0tKQorICB7CisgICAgKnRtcF9kZXN0ID0gKnRtcF9zcmMrKzsKKyAgICB0bXBfZGVzdCsrOworICB9Cit9CisKK3ZvaWQgc3BfYmNkMmFzYyhjb25zdCB1aW50OCBiY2RidWZbXSwgdWludDggYmNkbGVuLCB1aW50OCogYXNjc3RyKQoreworICB1aW50OCBpOworICB1aW50OCBsY2gsIGhjaDsKKyAgZm9yKGkgPSAwOyBpIDwgYmNkbGVuOyBpKyspCisgIHsKKyAgICBoY2ggPSAoYmNkYnVmW2ldICYgMHgwRik7CisgICAgbGNoID0gKGJjZGJ1ZltpXSAmIDB4RjApOworICAgIGxjaCA9IGxjaCA+PiA0OworICAgIGFzY3N0clsyICogaV0gPSBsY2ggKyAnMCc7CisgICAgYXNjc3RyWzIgKiBpICsgMV0gPSBoY2ggKyAnMCc7CisgIH0KKyAgYXNjc3RyWzIqaV0gPSAwOworfQoraW50MzIgc3BfYXRvaShjb25zdCBjaGFyKiBzcmMpCit7CisgIGludCBpID0gMDsKKyAgd2hpbGUoKnNyYyAhPSAwKQorICB7CisgICAgaSA9IGkgKiAxMCArICpzcmMgLSAnMCc7CisgICAgc3JjKys7CisgIH0KKyAgcmV0dXJuIGk7Cit9CisvKioKKyoqMjAwMC4wLjA6MC4wLjDKsbzkzqq7+cr9CisqKi8KK3N0YXRpYyBpbnQgTUlOVVRFX1NFQ1MgPSA2MDsKK3N0YXRpYyBpbnQgSE9VUl9TRUNTID0gMzYwMDsKK3N0YXRpYyBpbnQgREFZX1NFQ1MgPSAyNCozNjAwOworc3RhdGljIGludCBZRUFSX1NFQ1MgPSAzNjUqMjQqMzYwMDsKK3N0YXRpYyBpbnQgRk9VUllFQVJfU0VDUyA9ICgzNjUqMyszNjYpKjI0KjM2MDA7CitzdGF0aWMgaW50IG5vck1vdGhbXSA9IHswLDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzF9Oworc3RhdGljIGludCBsZWFwTW90aFtdID0gezAsMzEsIDI5LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMX07CisvKnRpbWU6IHN0cmluZyh5eXl5TU1kZEhIbW1zcykgdG8gaW50ICovCitpbnQgZm9ybWF0X3RpbWVfY292ZXJ0X3NlY3ModWludDggY3RpbWVbNl0pCit7CisgIGludCBzZWNzOworICBpbnQgaTsKKyAgaW50IHJlbWFpbjsKKyAgaW50IHllYXIgPSBCQ0QyRGVjKGN0aW1lWzBdKTsKKyAgaW50IG1vbnRoID0gQkNEMkRlYyhjdGltZVsxXSk7CisgIGludCBkYXkgPSBCQ0QyRGVjKGN0aW1lWzJdKTsKKyAgaW50IGhvdXIgPSBCQ0QyRGVjKGN0aW1lWzNdKTsKKyAgaW50IG1pbnV0ZSA9IEJDRDJEZWMoY3RpbWVbNF0pOworICBpbnQgc2Vjb25kID0gQkNEMkRlYyhjdGltZVs1XSk7CisKKyAgc2VjcyA9IHllYXIvNCAqRk9VUllFQVJfU0VDUzsKKyAgcmVtYWluID0geWVhciU0OworICBzZWNzICs9IHJlbWFpbipZRUFSX1NFQ1M7CisKKyAgaWYocmVtYWluID09IDApCisgIHsKKyAgICBmb3IoaSA9IDA7IGkgPCBtb250aDsgKytpKQorICAgIHsKKyAgICAgIHNlY3MgKz0gbGVhcE1vdGhbaV0gKkRBWV9TRUNTOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBmb3IoaSA9IDA7IGkgPCBtb250aDsgKytpKQorICAgIHsKKyAgICAgIHNlY3MgKz0gbm9yTW90aFtpXSAqREFZX1NFQ1M7CisgICAgfQorICB9CisgIHNlY3MgKz0gZGF5KkRBWV9TRUNTOworICBzZWNzICs9IGhvdXIgKkhPVVJfU0VDUzsKKyAgc2VjcyArPSBtaW51dGUqTUlOVVRFX1NFQ1M7CisgIHNlY3MgKz0gc2Vjb25kOworICByZXR1cm4gc2VjczsKK30KKwordWludDggc3BfY2hlY2tfcGFzc3dkKHNwX3Bvc190KiBwb3MsY29uc3QgY2hhciogaGludCx1aW50OCBwYXNzd2RbNl0pCit7CisgIHVpbnQ4IHRlbXBbNl07CisgIHVpbnQ4IG9mZnNldCA9IDA7CisgIHVpbnQ4IGtjb2RlOworICB1aW50MzIgdGlja2VyID0gc3BfZ2V0X3RpY2tlcigpOworCisgIHNob3dfbWFuYWdlX3Bhc3N3ZChwb3MsaGludCx0ZW1wLG9mZnNldCk7CisgIHdoaWxlKHNwX2dldF90aWNrZXIoKSAtdGlja2VyIDwgREVMQVlfVElNRTYwcykKKyAgeworICAgIHNwX2ZlZWRfZG9nKCk7CisgICAga2NvZGUgPSBzcF9nZXRfa2V5KCk7CisgICAgaWYoa2NvZGUgIT0gU1BfS0VZX05PTkUpCisgICAgeworICAgICAgc3dpdGNoKGtjb2RlKQorICAgICAgeworICAgICAgY2FzZSBTUF9LRVlfMDoKKyAgICAgIGNhc2UgU1BfS0VZXzE6CisgICAgICBjYXNlIFNQX0tFWV8yOgorICAgICAgY2FzZSBTUF9LRVlfMzoKKyAgICAgIGNhc2UgU1BfS0VZXzQ6CisgICAgICBjYXNlIFNQX0tFWV81OgorICAgICAgY2FzZSBTUF9LRVlfNjoKKyAgICAgIGNhc2UgU1BfS0VZXzc6CisgICAgICBjYXNlIFNQX0tFWV84OgorICAgICAgY2FzZSBTUF9LRVlfOToKKyAgICAgICAgaWYob2Zmc2V0IDwgNikKKyAgICAgICAgeworICAgICAgICAgIHRlbXBbb2Zmc2V0KytdID0gKHVpbnQ4KShrY29kZS1TUF9LRVlfMCk7CisgICAgICAgICAgc2hvd19tYW5hZ2VfcGFzc3dkKHBvcyxoaW50LHRlbXAsb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZihvZmZzZXQgPj0gNikKKyAgICAgICAgeworICAgICAgICAgIGlmKDAgPT0gTUVNQ01QKHRlbXAscGFzc3dkLDYpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgZGlzcF9oaW50X2luZm9fdHdvKHBvcyxoaW50LCLD3MLrtO3O8yIsREVMQVlfVElNRTJzKTsKKyAgICAgICAgICAgIE1FTUNMRUFSKHRlbXAsIHNpemVvZiB0ZW1wKTsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTUF9LRVlfQ0xFQVI6CisgICAgICAgIGlmKG9mZnNldCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgLS1vZmZzZXQ7CisgICAgICAgIHRlbXBbb2Zmc2V0XSA9IDA7CisgICAgICAgIHNob3dfbWFuYWdlX3Bhc3N3ZChwb3MsaGludCx0ZW1wLG9mZnNldCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF91dGlsLmggYi9zdXB3aXNkb20vc3BfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NGI5MjkKLS0tIC9kZXYvbnVsbAorKysgYi9zdXB3aXNkb20vc3BfdXRpbC5oCkBAIC0wLDAgKzEsNzAgQEAKKyNpZm5kZWYgX1NQX1VUSUxfSF8KKyNkZWZpbmUgX1NQX1VUSUxfSF8KKworI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgInN0ZGxpYi5oIgorI2luY2x1ZGUgInN0ZGlvLmgiCisjaW5jbHVkZSAic3BfY29uZmlnLmgiCisKKyNkZWZpbmUgREVMQVlfVElNRTEwMG1zIDEwMAorI2RlZmluZSBERUxBWV9USU1FMjAwbXMgMjAwCisjZGVmaW5lIERFTEFZX1RJTUUxcyAxMDAwCisjZGVmaW5lIERFTEFZX1RJTUUycyAyMDAwCisjZGVmaW5lIERFTEFZX1RJTUUzcyAzMDAwCisjZGVmaW5lIERFTEFZX1RJTUUxNXMgMTUwMDAKKyNkZWZpbmUgREVMQVlfVElNRTYwcyA2MDAwMAorI2RlZmluZSBDT01NX1dBSVRfVElNRSA1MDAwCisKKyNkZWZpbmUgU1RSX0NPUFlfTih4LHkseikgZG97c25wcmludGYoeCx6KzEsIiVzIix5KTt9d2hpbGUoMCk7CisjZGVmaW5lIE1FTUNMRUFSKHgseikgbWVtc2V0KHgsMCx6KQorI2RlZmluZSBNRU1DTVAoeCx5LHopIG1lbWNtcCh4LHkseikKKyNkZWZpbmUgTUVNQ1BZKHgseSx6KSBtZW1jcHkoeCx5LHopCisjZGVmaW5lIElTX0tFWShleHBlY3QsdmFsKSAoc3RybmNtcChleHBlY3QsdmFsLHN0cmxlbihleHBlY3QpKSA9PSAwKQorCisjZGVmaW5lIERlYzJCQ0QoeCkgKCgoeCkgLyAxMCkgKiAxNiArICh4KSAlIDEwKQorI2RlZmluZSBCQ0QyRGVjKHgpICgoKHgpIC8gMTYpICogMTAgKyAoeCkgJSAxNikKKwordm9pZCBzcF9nZXRfYmNkdGltZSh1aW50OCBjdGltZVs2XSk7Cit2b2lkIHNwX3NldF9iY2R0aW1lKHVpbnQ4IGN0aW1lWzZdKTsKK3VpbnQ4IHNwX2NoZWNrX3RpbWVfdmFsaWQodWludDggY3RpbWVbNl0pOwordWludDggc3BfY3JjX3N1bSh1aW50OCBidWZbXSx1aW50OCBsZW4pOwordWludDMyIHNwX2dldF90aWNrZXIodm9pZCk7Cit2b2lkIERlbGF5X21zKHVpbnQzMiBtcyk7Cit2b2lkIHNwX3ZhbHZlX29uKHZvaWQpOwordm9pZCBzcF92YWx2ZV9vZmYodm9pZCk7Cit1aW50OCBzcF92YWx2ZV9zdGF0ZSh2b2lkKTsKK2ludDE2IGdldF8yYnl0ZV9pbnQodWludDggdmFsdWVfc3RyWzJdKTsKK2ludDMyIGdldF8zYnl0ZV9pbnQodWludDggdmFsdWVfc3RyWzNdKTsKK2ludDMyIGdldF80Ynl0ZV9pbnQodWludDggdmFsdWVfc3RyWzRdKTsKK3ZvaWQgc2V0XzJieXRlX2ludCh1aW50OCB2YWx1ZV9zdHJbMl0sIGludCBudW0pOwordm9pZCBzZXRfM2J5dGVfaW50KHVpbnQ4IHZhbHVlX3N0clszXSwgaW50IG51bSk7Cit2b2lkIHNldF80Ynl0ZV9pbnQodWludDggdmFsdWVfc3RyWzRdLCBpbnQgbnVtKTsKKy8vu/G1w7Wl19a92tbQxLPSu867tcTWtQoraW50MzIgR2V0MUJpdCh1aW50OCBidWYsIGludCBuKTsKK2ludDE2IGdldF8yYnl0ZV9pbnRfbGUodWludDggdmFsdWVfc3RyWzJdKTsKKy8v0KHX1r3a0PIKK2ludDMyIGdldF8zYnl0ZV9pbnRfbGUodWludDggdmFsdWVfc3RyWzNdKTsKKy8v0KHX1r3a0PIKK2ludDMyIGdldF80Ynl0ZV9pbnRfbGUodWludDggdmFsdWVfc3RyWzRdKTsKK3ZvaWQgc2V0XzJieXRlX2ludF9sZSh1aW50OCB2YWx1ZV9zdHJbMl0sIGludCBudW0pOwordm9pZCBzZXRfM2J5dGVfaW50X2xlKHVpbnQ4IHZhbHVlX3N0clszXSwgaW50IG51bSk7CisvKrzGy+O003N0YXJ0dGltZSC1vc/W1Nq1xMPryv0qLwordWludDMyIGRpZmZfdGltZSh1aW50OCBzdGFydHRpbWVbNl0pOwordm9pZCBteWNweSh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBzcmMsIHVpbnQzMiBsZW4pOworaW50MzIgc3BfYXRvaShjb25zdCBjaGFyKiBzcmMpOwordm9pZCBzcF9iY2QyYXNjKGNvbnN0IHVpbnQ4IGJjZGJ1ZltdLCB1aW50OCBiY2RsZW4sIHVpbnQ4KiBhc2NzdHIpOworaW50IGZvcm1hdF90aW1lX2NvdmVydF9zZWNzKHVpbnQ4IGN0aW1lWzZdKTsKK3ZvaWQgc3BfcHJvdG9jb2xfY3JjKGNvbnN0IHVpbnQ4KiBidWYsIHVpbnQxNiBsZW4sIHVpbnQ4IGNyY1syXSk7Cit2b2lkIHNwX3Byb3RvY29sX2NyY19pbml0KGNvbnN0IHVpbnQ4KiBidWYsIHVpbnQxNiBsZW4sdWludDggaW5pdFsyXSwgdWludDggY3JjWzJdKTsKK3VpbnQ4IHNwX2dldF9rZXkodm9pZCk7Cit1aW50OCBzcF9rZXlfaW5pdCh2b2lkKTsKK3ZvaWQgc3Bfa2V5X2NhbGlicmF0ZSh2b2lkKTsKK3ZvaWQgc3BfcmVzZXQodm9pZCk7Cit2b2lkIHNwX2JjZF90b19zdHIoY29uc3QgdWludDgqIGJjZCwgdWludDggYmNkX2xlbiwgY2hhciogc3RyKTsKK3ZvaWQgc3Bfc3RyX3RvX2JjZChjb25zdCBjaGFyKiBzdHIsIHVpbnQ4IHN0cl9sZW4sIHVpbnQ4KiBiY2QpOwordm9pZCBzcF9zdHJfdG9faGV4KGNvbnN0IGNoYXIqIHN0cixjb25zdCB1aW50MTYgbGVuLHVpbnQ4KiBoZXgpOwordm9pZCBzcF9oZXhfdG9fc3RyKGNvbnN0IHVpbnQ4KiBoZXgsY29uc3QgdWludDggbGVuLGNoYXIqIHN0cik7Cit1aW50OCBzcF9jaGVja19wYXNzd2Qoc3BfcG9zX3QqIHBvcyxjb25zdCBjaGFyKiBoaW50LHVpbnQ4IHBhc3N3ZFs2XSk7CitpbnQ4IGlzRkYodWludDggYnVmW10sdWludDE2IGxlbik7CisKKyNlbmRpZgo=