LyoKICAgIDw6Y29weXJpZ2h0LUJSQ006MjAxMzpEVUFML0dQTDpzdGFuZGFyZAogICAgCiAgICAgICBDb3B5cmlnaHQgKGMpIDIwMTMgQnJvYWRjb20gQ29ycG9yYXRpb24KICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICAgIAogICAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQogICAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAogICAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCiAgICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKICAgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CiAgICAKICAgICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKICAgICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAogICAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgogICAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAogICAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCiAgICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCiAgICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucwogICAgICAgb2YgdGhlIHNvZnR3YXJlLgogICAgCiAgICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKICAgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAogICAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKICAgIHdyaXR0ZW4gY29uc2VudC4KICAgIAogICAgOj4gCgoqLwoKI2luY2x1ZGUgImJic2kuaCIKI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KCiNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMwKQojZWxzZQp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludHB0cl90OwojZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzMCkKCiNkZWZpbmUgTU9DQV9SRCh4KSAgICAoKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+dXNlX3NwaSA9PSAwKSA/IFwKICAgICAgICAgICAgICAgICAgICAgICAoKigodm9sYXRpbGUgdWludDMyX3QgKikoKHVuc2lnbmVkIGxvbmcpKHgpKSkpIDogXAogICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3Qpa2VyU3lzQmNtU3BpU2xhdmVSZWFkUmVnMzIoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT5zcGksICh1aW50MzJfdCkoeCkpKSkKCiNkZWZpbmUgTU9DQV9SRDgoeCwgeSkgKCgoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPnVzZV9zcGkgPT0gMCkgPyBcCiAgICAgICAgICAgICAgICAgICAgICAgICgqKHkpID0gKigodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSgodW5zaWduZWQgbG9uZykoeCkpKSkgOiBcCiAgICAgICAgICAgICAgICAgICAgICAgIChrZXJTeXNCY21TcGlTbGF2ZVJlYWQoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT5zcGksICh1bnNpZ25lZCBsb25nKSh4KSwgeSwgMSkpKQoKI2RlZmluZSBNT0NBX1dSKHgseSkgICBkbyB7ICgoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT51c2Vfc3BpID09IDApID8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCooKHZvbGF0aWxlIHVpbnQzMl90ICopKCh1bnNpZ25lZCBsb25nKSh4KSkpKSA9ICh5KSA6IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlclN5c0JjbVNwaVNsYXZlV3JpdGVSZWczMigoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPnNwaSwgKHVpbnQzMl90KSh4KSwgKHkpKSk7IH0gd2hpbGUoMCkKCiNkZWZpbmUgTU9DQV9XUjgoeCx5KSAgICBkbyB7ICgoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT51c2Vfc3BpID09IDApID8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCooKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpKHgpKSkpID0gKHVuc2lnbmVkIGNoYXIpKHkpIDogXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VyU3lzQmNtU3BpU2xhdmVXcml0ZSgoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPnNwaSwgKHVuc2lnbmVkIGxvbmcpKHgpLCAoeSksIDEpKTsgfSB3aGlsZSgwKQoKI2RlZmluZSBNT0NBX1dSMTYoeCx5KSAgIGRvIHsgKCgoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPnVzZV9zcGkgPT0gMCkgPyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKigodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoKHVuc2lnbmVkIGxvbmcpKHgpKSkpID0gKHVuc2lnbmVkIHNob3J0KSh5KSA6IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlclN5c0JjbVNwaVNsYXZlV3JpdGUoKChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpLT5zcGksICh1bnNpZ25lZCBsb25nKSh4KSwgKHkpLCAyKSk7IH0gd2hpbGUoMCkKCiNkZWZpbmUgTU9DQV9XUl9CTE9DSyhhZGRyLCBzcmMsIGxlbikgZG8geyBrZXJTeXNCY21TcGlTbGF2ZVdyaXRlQnVmKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+c3BpLCBhZGRyLCBzcmMsIGxlbiwgNCk7IH0gd2hpbGUoMCkKI2RlZmluZSBNT0NBX1JEX0JMT0NLKGFkZHIsIGRzdCwgbGVuKSBkbyB7IGtlclN5c0JjbVNwaVNsYXZlUmVhZEJ1ZigoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPnNwaSwgYWRkciwgZHN0LCBsZW4sIDQpOyB9IHdoaWxlKDApCgoKI2RlZmluZSBJMkNfUkQoeCkJCU1PQ0FfUkQoeCkKI2RlZmluZSBJMkNfV1IoeCwgeSkJCU1PQ0FfV1IoeCwgeSkKCiNkZWZpbmUgTU9DQV9CUENNX05VTSAgICAgICAgIDUKI2RlZmluZSBNT0NBX0JQQ01fWk9ORVNfTlVNICAgOAoKI2RlZmluZSBNT0NBX0NQVV9DTE9DS19OVU0gIDEKI2RlZmluZSBNT0NBX1BIWV9DTE9DS19OVU0gIDIKCnR5cGVkZWYgZW51bSBfUE1CX0NPTU1BTkRfRV8KewogICBQTUJfQ09NTUFORF9QSFkxX09OPTAsCiAgIFBNQl9DT01NQU5EX1BBUlRJQUxfT04sCiAgIFBNQl9DT01NQU5EX1BIWTFfT0ZGLAogICBQTUJfQ09NTUFORF9BTExfT0ZGLAoKICAgUE1CX0NPTU1BTkRfTEFTVAp9IFBNQl9DT01NQU5EX0U7Cgp0eXBlZGVmIGVudW0gX1BNQl9HSVZFX09XTkVSU0hJUF9FXwp7CiAgIFBNQl9HSVZFX09XTkVSU0hJUF8yX0hPU1QgPSAwLAogICBQTUJfR0lWRV9PV05FUlNISVBfMl9GVywKCiAgIFBNQl9HRVRfT1dORVJTSElQX0xBU1QKfSBQTUJfR0lWRV9PV05FUlNISVBfRTsKCnN0cnVjdCBtb2NhXzY4MHhfY2xrCnsKCXN0cnVjdCBkZXZpY2UgKmRldjsKCXVpbnQzMl90ICAgICAgIGNsb2NrX251bTsKfTsKCnN0YXRpYyB1aW50MzJfdCB6b25lX2FsbF9vZmZfYml0bWFza1tNT0NBX0JQQ01fTlVNXSA9IHsgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiB9OwpzdGF0aWMgdWludDMyX3Qgem9uZV9wYXJ0aWFsX29uX2JpdG1hc2tbTU9DQV9CUENNX05VTV0gID0geyAweDQxLCAweEZDLCAweEZGLCAweEZGLCAweDAwIH07CnN0YXRpYyB1aW50MzJfdCB6b25lX3BoeTFfYml0bWFza1tNT0NBX0JQQ01fTlVNXSAgPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYgfTsKCgpzdGF0aWMgdm9pZCBib2d1c19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKewp9CgpzdGF0aWMgc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSBtb2NhX2xhbl9kYXRhID0gewoJLm1hY2FkZHJfaGkgPQkJMHgwMDAwMDEwMiwKCS5tYWNhZGRyX2xvID0JCTB4MDMwNDAwMDAsCgoJLmJjbTM0NTBfaTJjX2Jhc2UgPSAgMHgxMDQwNjIwMCwKCS5iY20zNDUwX2kyY19hZGRyID0gIDB4NzAsCgkuaHdfcmV2ICA9ICAgICBIV1JFVl9NT0NBXzIwX0dFTjIyLAoJLnJmX2JhbmQgPSAgICAgTU9DQV9CQU5EX0VYVF9ELAoJLmNoaXBfaWQgPSAgICAgMCwKCS51c2VfZG1hICAgICAgICAgICA9IDAsCgkudXNlX3NwaSAgICAgICAgICAgPSAxLAoJLmRldklkICAgICAgICAgICAgPSBNT0NBX0RFVklDRV9JRF9VTlJFR0lTVEVSRUQsIC8vIEZpbGxlZCBpbiBkeW5hbWljYWxseQojaWZkZWYgQ09ORklHX1NNUAoJLnNtcF9wcm9jZXNzb3JfaWQgPSAxLAojZW5kaWYKfTsKCnN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbW9jYV9sYW5fcmVzb3VyY2VzW10gPSB7CglbMF0gPSB7CgkJLnN0YXJ0ID0gMHgxMDYwMDAwMCwKCQkuZW5kID0gICAweDEwN2ZmZDk3LAoJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAoJfSwKCVsxXSA9IHsgLyogTm90IHVzZWQgZm9yIDY4MDIsIGRlZmluZSBmb3IgYm1vY2EgKi8KCQkuc3RhcnQgPSAwLAoJCS5lbmQgPSAwLAoJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAoJfQp9OwoKc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbW9jYV9sYW5fcGxhdF9kZXYgPSB7CgkubmFtZSA9ICJibW9jYSIsCgkuaWQgPSAwLAoJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG1vY2FfbGFuX3Jlc291cmNlcyksCgkucmVzb3VyY2UgPSBtb2NhX2xhbl9yZXNvdXJjZXMsCgkuZGV2ID0gewoJCS5wbGF0Zm9ybV9kYXRhID0gJm1vY2FfbGFuX2RhdGEsCgkJLnJlbGVhc2UgPSBib2d1c19yZWxlYXNlLAoJfSwKfTsKCnN0YXRpYyBzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhIG1vY2Ffd2FuX2RhdGEgPSB7CgkubWFjYWRkcl9oaSAgICAgICA9IDB4MDAwMDAxMDIsCgkubWFjYWRkcl9sbyAgICAgICA9IDB4MDMwNDAwMDAsCgoJLmJjbTM0NTBfaTJjX2Jhc2UgPSAgMHgxMDQwNjIwMCwKCS5iY20zNDUwX2kyY19hZGRyID0gIDB4NzAsCgkuaHdfcmV2ICA9IEhXUkVWX01PQ0FfMjBfR0VOMjIsCgkuY2hpcF9pZCA9IDAsCgkKCS5yZl9iYW5kID0gTU9DQV9CQU5EX0VYVF9ELAoKCS51c2VfZG1hICAgICAgICAgICA9IDAsCgkudXNlX3NwaSAgICAgICAgICAgPSAxLAoJLmRldklkICAgICAgICAgICAgPSBNT0NBX0RFVklDRV9JRF9VTlJFR0lTVEVSRUQsIC8vIEZpbGxlZCBpbiBkeW5hbWljYWxseQoKI2lmZGVmIENPTkZJR19TTVAKCS5zbXBfcHJvY2Vzc29yX2lkID0gMSwKI2VuZGlmCn07CgpzdGF0aWMgc3RydWN0IHJlc291cmNlIG1vY2Ffd2FuX3Jlc291cmNlc1tdID0gewoJWzBdID0gewoJCS5zdGFydCA9IDB4MTA2MDAwMDAsCgkJLmVuZCA9ICAgMHgxMDdmZmQ5NywKCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKCX0sCglbMV0gPSB7IC8qIE5vdCB1c2VkIGZvciA2ODAyLCBkZWZpbmUgZm9yIGJtb2NhICovCgkJLnN0YXJ0ID0gMCwKCQkuZW5kID0gMCwKCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKCX0KfTsKCnN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1vY2Ffd2FuX3BsYXRfZGV2ID0gewoJLm5hbWUgICAgICAgICAgPSAiYm1vY2EiLAoJLmlkICAgICAgICAgICAgPSAxLAoJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG1vY2Ffd2FuX3Jlc291cmNlcyksCgkucmVzb3VyY2UgICAgICA9IG1vY2Ffd2FuX3Jlc291cmNlcywKCS5kZXYgICAgICAgICAgID0gewoJCS5wbGF0Zm9ybV9kYXRhID0gJm1vY2Ffd2FuX2RhdGEsCgkJLnJlbGVhc2UgICAgICAgPSBib2d1c19yZWxlYXNlLAoJfSwKfTsKCnN0YXRpYyB2b2lkIG1vY2FfZW5hYmxlX2lycShzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYpCnsKCWtlclN5c01vY2FIb3N0SW50ckVuYWJsZSgoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPnNwaSk7Cn0KCnN0YXRpYyB2b2lkIG1vY2FfZGlzYWJsZV9pcnEoc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2KQp7CglrZXJTeXNNb2NhSG9zdEludHJEaXNhYmxlKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+c3BpKTsKfQoKc3RhdGljIHZvaWQgbW9jYV9wbWJfYnVzeV93YWl0KHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdikKewoJI2lmIDAKCXVpbnQzMl90IGRhdGE7CgoJLyogUG9zc2libGUgdGltZSBzYXZlcjogVGhlIHJlZ2lzdGVyIGFjY2VzcyB0aW1lIG92ZXIgU1BJIG1heSAKCSAgIGFsd2F5cyBiZSBlbm91Z2ggdG8gZ3VhcmFudGVlIHRoYXQgdGhlIHdyaXRlIHdpbGwgY29tcGxldGUgCgkgICBpbiB0aW1lIHdpdGhvdXQgaGF2aW5nIHRvIGNoZWNrIHRoZSBzdGF0dXMuICovCglkbwoJewoJCWRhdGEgPSBNT0NBX1JEKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5wbWJfbWFzdGVyX3N0YXR1cyk7Cgl9IHdoaWxlIChkYXRhICYgMHgxKTsKCSNlbmRpZgp9Cgp2b2lkIG1vY2FfcG1iX2RlbGF5KHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdikKewoJdW5zaWduZWQgaW50IGRhdGE7CglpbnQgaSwgajsKCQoJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+cG1iX21hc3Rlcl93ZGF0YV9vZmZzZXQsIDB4RkY0NDQwMDApOwoJCglmb3IgKGkgPSAwOyBpIDwgTU9DQV9CUENNX05VTTsgaSsrKQoJewoJCWZvciAoaiA9IDA7IGogPCBNT0NBX0JQQ01fWk9ORVNfTlVNOyBqKyspCgkJewoJCQlkYXRhID0gMHgxMDAwMTIgKyBqKjQgKyBpKjB4MTAwMDsgOwoJCQlNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5wbWJfbWFzdGVyX2NtZF9vZmZzZXQsIGRhdGEpOwoJCQltb2NhX3BtYl9idXN5X3dhaXQocHJpdik7CgkJfQoJfQp9CgpzdGF0aWMgdm9pZCBtb2NhX3BtYl9jb250cm9sKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdiwgUE1CX0NPTU1BTkRfRSBjbWQpCnsKCWludCBpLCBqOwoJdWludDMyX3QgKiBwX3pvbmVfY29udHJvbDsKCXVpbnQzMl90IGRhdGE7CgoJc3dpdGNoIChjbWQpCgl7CgkJY2FzZSBQTUJfQ09NTUFORF9BTExfT0ZGOgoJCQkvLyBUdXJuIG9mZiB6b25lIGNvbW1hbmQKCQkJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+cG1iX21hc3Rlcl93ZGF0YV9vZmZzZXQsIDB4QTAwKTsKCQkJcF96b25lX2NvbnRyb2wgPSAmem9uZV9hbGxfb2ZmX2JpdG1hc2tbMF07CgkJCWJyZWFrOwoKCQljYXNlIFBNQl9DT01NQU5EX1BIWTFfT0ZGOgoJCQkvLyBUdXJuIG9mZiB6b25lIGNvbW1hbmQKCQkJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+cG1iX21hc3Rlcl93ZGF0YV9vZmZzZXQsIDB4QTAwKTsKCQkJcF96b25lX2NvbnRyb2wgPSAmem9uZV9waHkxX2JpdG1hc2tbMF07CgkJCWJyZWFrOwoJCSAKCSBjYXNlIFBNQl9DT01NQU5EX1BIWTFfT046CgkJCS8vIFR1cm4gb24gem9uZSBjb21tYW5kCgkJCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnBtYl9tYXN0ZXJfd2RhdGFfb2Zmc2V0LCAweEMwMCk7CgkJCXBfem9uZV9jb250cm9sID0gJnpvbmVfcGh5MV9iaXRtYXNrWzBdOwoJCQlicmVhazsKCQkgCgkgY2FzZSBQTUJfQ09NTUFORF9QQVJUSUFMX09OOgoJCQkvLyBUdXJuIG9uIHpvbmUgY29tbWFuZAoJCQlNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5wbWJfbWFzdGVyX3dkYXRhX29mZnNldCwgMHhDMDApOwoJCQlwX3pvbmVfY29udHJvbCA9ICZ6b25lX3BhcnRpYWxfb25fYml0bWFza1swXTsKCQkJYnJlYWs7CgkJIAoJCSAKCQlkZWZhdWx0OgoJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaWxsZWdhbCBjbWQ6ICUwOHhcbiIsCgkJCQlfX0ZVTkNUSU9OX18sIGNtZCk7CgkJCXJldHVybjsKCX0KCglmb3IgKGkgPSAwOyBpIDwgTU9DQV9CUENNX05VTTsgaSsrKQoJewoJCWZvciAoaiA9IDA7IGogPCBNT0NBX0JQQ01fWk9ORVNfTlVNOyBqKyspCgkJewoJCQlpZiAoKnBfem9uZV9jb250cm9sICYgKDEgPDwgaikpCgkJCXsKCQkJCS8vIHpvbmUgYWRkcmVzcyBpbiBicGNtcwoJCQkJZGF0YSA9ICgweDEgPDwgMjApICsgMTYgKyAoaSAqIDQwOTYpICsgKGogKiA0KTsKCQkJCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnBtYl9tYXN0ZXJfY21kX29mZnNldCwgZGF0YSk7CgkJCQltb2NhX3BtYl9idXN5X3dhaXQocHJpdik7CgkJCX0KCQl9CgkJcF96b25lX2NvbnRyb2wrKzsKCX0KCn0KCnN0YXRpYyB2b2lkIG1vY2FfcG1iX2dpdmVfY250cmwoc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2LCBQTUJfR0lWRV9PV05FUlNISVBfRSBjbWQpCnsKCWludCBpOwoJdWludDMyX3QgZGF0YTsKCgkvKiBQYXNzIGNvbnRyb2wgb3ZlciB0aGUgbWVtb3JpZXMgdG8gdGhlIEZXICovCglNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5wbWJfbWFzdGVyX3dkYXRhX29mZnNldCwgY21kKTsKCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCgl7CgkJZGF0YSA9IDB4MTAwMDAyICsgaSoweDEwMDA7CgkJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+cG1iX21hc3Rlcl9jbWRfb2Zmc2V0LCBkYXRhKTsgICAKCQltb2NhX3BtYl9idXN5X3dhaXQocHJpdik7Cgl9Cgltb2NhX3BtYl9idXN5X3dhaXQocHJpdik7Cn0KCnN0YXRpYyB2b2lkIG1vY2FfaHdfcmVzZXQoc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2KQp7Ci8vCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci8vICAgdWludDMyX3QgY2hpcGlkOwogIAoKCS8qIGRpc2FibGUgYW5kIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCglNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5sMl9tYXNrX3NldF9vZmZzZXQsIDB4ZmZmZmZmZmYpOwoJTU9DQV9SRChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+bDJfbWFza19zZXRfb2Zmc2V0KTsKCgkvKiBhc3NlcnQgcmVzZXRzICovCgoJLyogcmVzZXQgQ1BVIGZpcnN0LCBib3RoIENQVXMgZm9yIE1vQ0EgMjAgSFcgKi8KCWlmIChwcml2LT5od19yZXYgPT0gSFdSRVZfTU9DQV8yMF9HRU4yMikKCQlNT0NBX1NFVChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+c3dfcmVzZXRfb2Zmc2V0LCA1KTsKCWVsc2UKCQlNT0NBX1NFVChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+c3dfcmVzZXRfb2Zmc2V0LCAxKTsKCglNT0NBX1JEKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQpOwoKCXVkZWxheSgyMCk7CgoJLyogcmVzZXQgZXZlcnl0aGluZyBlbHNlIGV4Y2VwdCBjbG9ja3MgKi8KCU1PQ0FfU0VUKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQsIAoJCX4oKDEgPDwgMykgfCAoMSA8PCA3KSB8ICgxIDw8IDE1KSB8ICgxIDw8IDE2KSkpOwoJTU9DQV9SRChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+c3dfcmVzZXRfb2Zmc2V0KTsKCgl1ZGVsYXkoMjApOwoKCS8qIGRpc2FibGUgY2xvY2tzICovCglNT0NBX1NFVChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+c3dfcmVzZXRfb2Zmc2V0LCAKCQl+KCgxIDw8IDMpIHwgKDEgPDwgMTUpIHwgKDEgPDwgMTYpKSk7CglNT0NBX1JEKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQpOwoKCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPmwyX2NsZWFyX29mZnNldCwgMHhmZmZmZmZmZik7CglNT0NBX1JEKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5sMl9jbGVhcl9vZmZzZXQpOwoKCS8qIFBvd2VyIGRvd24gYWxsIHpvbmVzICovCgkvLyAgVGhlIGhvc3QgY2FuJ3QgZ2l2ZSB0byBpdHNlbGYgcGVybWlzc2lvbi4KCW1vY2FfcG1iX2NvbnRyb2wocHJpdiwgUE1CX0NPTU1BTkRfQUxMX09GRik7CgoJLyogUG93ZXIgZG93biBhbGwgU1lTX0NUUkwgbWVtb3JpZXMgKi8KCU1PQ0FfV1IoMHgxMDEwMDA2OCwgMSk7ICAgLy8gQ0xLR0VOX1BMTF9TWVMxX1BMTF9QV1JETgoJTU9DQV9TRVQoMHgxMDEwMDAwYywgMSk7ICAvLyBDTEtHRU5fUExMX1NZUzBfUExMX0NIQU5ORUxfQ1RSTF9DSF8zCgp9CgpzdGF0aWMgdW5zaWduZWQgaW50IG1vY2FfZ2V0X3BoeV9mcmVxKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdikKewoJdW5zaWduZWQgaW50IHggPSBNT0NBX1JEKDB4MTAxMDAwNDQpOyAvLyBDTEtHRU5fUExMX1NZUzFfUExMX0NIQU5ORUxfQ1RSTF9DSF8yCgoJeCA9ICh4ID4+IDEpICYgMHhGRjsgLy8gR2V0IHRoZSBNRElWX0NIMiBmaWVsZAoKCXJldHVybiggeCA/IDI0MDAgLyB4IDogMCk7Cn0KCgpzdGF0aWMgdm9pZCBtb2NhX3BzX1Bvd2VyQ3RybFBIWTEoc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2LCAgUE1CX0NPTU1BTkRfRSBjbWQpCnsKCXVpbnQzMl90IHBsbF9jdHJsXzMsIHBsbF9jdHJsXzUsIHN3X3Jlc2V0OyAKCXBsbF9jdHJsXzMgPSBNT0NBX1JEICgweDEwMTAwMDQ4KTsKCXBsbF9jdHJsXzUgPSBNT0NBX1JEICgweDEwMTAwMDUwKTsKCXN3X3Jlc2V0ID0gTU9DQV9SRCAocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnN3X3Jlc2V0X29mZnNldCk7CgoJLy8gZW5hYmxlIFBMTCAKCU1PQ0FfVU5TRVQoMHgxMDEwMDA0OCwgMSk7ICAvLyBDTEtHRU5fUExMX1NZUzFfUExMX0NIQU5ORUxfQ1RSTF9DSF8zIAoJTU9DQV9VTlNFVCgweDEwMTAwMDUwLCAxKTsgIC8vIENMS0dFTl9QTExfU1lTMV9QTExfQ0hBTk5FTF9DVFJMX0NIXzUgCgoJdWRlbGF5KDEpOwoKCS8vIGRlIGFzc2VydCBtb2NhX3BoeTFfZGlzYWJsZV9jbGsKCU1PQ0FfVU5TRVQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnN3X3Jlc2V0X29mZnNldCwgKDEgPDwgOSkpOwoKCW1vY2FfcG1iX2NvbnRyb2wocHJpdiwgY21kKTsKCglNT0NBX1dSICgweDEwMTAwMDQ4LCBwbGxfY3RybF8zKTsKCU1PQ0FfV1IgKDB4MTAxMDAwNTAsIHBsbF9jdHJsXzUpOwoKCXVkZWxheSgxKTsKCQoJTU9DQV9XUiAocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPnN3X3Jlc2V0X29mZnNldCwgc3dfcmVzZXQpOwkKfQoKCnN0YXRpYyB2b2lkIG1vY2FfZ3BoeV9pbml0KHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdikKewoJc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqIHBNb2NhRGF0YSA9IChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Cgl1MzIgcG9ydF9tb2RlOwoJdTMyIHJnbWlpMF9vbjsKCXUzMiByZ21paTFfb247Cgl1MzIgZ3BoeV9lbmFibGVkID0gMDsKCglwb3J0X21vZGUgPSBNT0NBX1JEKDB4MTA4MDAwMDApICYgMHgzOwoJcmdtaWkwX29uID0gTU9DQV9SRCgweDEwODAwMDBjKSAmIDB4MTsKCXJnbWlpMV9vbiA9IE1PQ0FfUkQoMHgxMDgwMDAxOCkgJiAweDE7CgoJaWYgKChwTW9jYURhdGEtPmNoaXBfaWQgJiAweEZGRkVGRkYwKSA9PSAweDY4MDIwMEMwKQoJewoJCWlmICgocG9ydF9tb2RlID09IDApIHx8CgkJICAgICgocG9ydF9tb2RlID09IDEpICYmIHJnbWlpMF9vbikgfHwKCQkgICAgKChwb3J0X21vZGUgPT0gMikgJiYgcmdtaWkxX29uKSkKCQl7CgkJCWdwaHlfZW5hYmxlZCA9IDE7CgkJfQoJfQoJZWxzZQoJewoJCWlmICgocG9ydF9tb2RlID09IDApIHx8CgkJICAgICgocG9ydF9tb2RlICE9IDMpICYmIHJnbWlpMV9vbikpCgkJewoJCQlncGh5X2VuYWJsZWQgPSAxOwoJCX0KCX0KCglpZiAoZ3BoeV9lbmFibGVkKQoJewoJCU1PQ0FfVU5TRVQoMHgxMDgwMDAwNCwgMHhGKTsKCQltc2xlZXAoMTApOwoJCU1PQ0FfV1IoMHgxMDQwNDMxYywgMHhGRkZGRkZGRik7Cgl9Cn0KCi8qIGNhbGxlZCBhbnkgdGltZSB3ZSBzdGFydC9yZXN0YXJ0L3N0b3AgTW9DQSAqLwpzdGF0aWMgdm9pZCBtb2NhX2h3X2luaXQoc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2LCBpbnQgYWN0aW9uKQp7Cgl1MzIgbWFzazsKCXUzMiB0ZW1wOwoJdTMyIGRhdGE7Cgl1MzIgY291bnQgPSAwOwoJc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqIHBNb2NhRGF0YSA9IChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CgoJaWYgKGFjdGlvbiA9PSBNT0NBX0VOQUJMRSAmJiAhcHJpdi0+ZW5hYmxlZCkgewoJCWNsa19lbmFibGUocHJpdi0+Y2xrKTsKCgkJTU9DQV9XUigweDEwNDA0MzE4LCAweGZmZmZmZmZkKTsgLy8gU1VOX1RPUF9DVFJMX1NXX0lOSVRfMF9TRVQKCQl1ZGVsYXkoMjApOwoJCU1PQ0FfV1IoMHgxMDQwNDMxYywgfigxIDw8IDI2KSk7IC8vIFNVTl9UT1BfQ1RSTF9TV19JTklUXzBfQ0xFQVIgLS0+IERvIHRoaXMgYXQgc3RhcnQgb2Ygc2VxdWVuY2UsIGRvbid0IHRvdWNoIGdwaHlfc3dfaW5pdAoJCXVkZWxheSgyMCk7CgkJbW9jYV9ncGh5X2luaXQocHJpdik7CiAgIAoJCXByaXYtPmVuYWJsZWQgPSAxOwoJfQoKCS8qIGNsb2NrIG5vdCBlbmFibGVkLCByZWdpc3RlciBhY2Nlc3NlcyB3aWxsIGZhaWwgd2l0aCBidXMgZXJyb3IgKi8KCWlmICghcHJpdi0+ZW5hYmxlZCkKCQlyZXR1cm47CgoJbW9jYV9od19yZXNldChwcml2KTsKCXVkZWxheSgxKTsKCglNT0NBX1dSKDB4MTA4MDAwMDAsIDB4MDMpOyAgICAgICAvLyBFTVVYX0NOVFJMCglNT0NBX1dSKDB4MTA4MDAwMGMsIDB4MTEpOyAgICAgICAvLyBSR01JSV8wX0NOVFJMCglNT0NBX1dSKDB4MTA4MDAwMTQsIDB4YzApOyAgICAgICAvLyBSR01JSV8wX1JYX0NMS19ERUxBWV9DTlRSTAoKCU1PQ0FfV1IoMHgxMDQwNDBhNCwgMHgwMSk7ICAgICAgIC8vIEdFTkVSQUxfQ1RSTF9OT19TQ0FOXzAKCU1PQ0FfV1IoMHgxMDQwNDEwMCwgMHgxMTExMDAxMSk7IC8vIFBJTl9NVVhfQ1RSTF8wCglNT0NBX1dSKDB4MTA0MDQxMDQsIDB4MTExMTExMTEpOyAvLyBQSU5fTVVYX0NUUkxfMQoKCWlmIChhY3Rpb24gPT0gTU9DQV9FTkFCTEUpIHsKCgkJLyogUG93ZXIgdXAgYWxsIHpvbmVzICovCgkJbW9jYV9wbWJfY29udHJvbChwcml2LCBQTUJfQ09NTUFORF9QQVJUSUFMX09OKTsKCgkJTU9DQV9VTlNFVCgweDEwMTAwMDBjLCAxKTsgIC8vIENMS0dFTl9QTExfU1lTMF9QTExfQ0hBTk5FTF9DVFJMX0NIXzMgCgoJCU1PQ0FfV1IoMHgxMDEwMDA2QywgMSk7ICAvLyBDTEtHRU5fUExMX1NZUzFfUExMX1JFU0VUIAoJCU1PQ0FfV1IoMHgxMDEwMDA2OCwgMCk7ICAvLyBDTEtHRU5fUExMX1NZUzFfUExMX1BXUkROIAoJCWRhdGEgPSAwOwoJCXdoaWxlICgoZGF0YSAmIDB4MSkgPT0gMCkKCQl7CgkJCS8qIFRoaXMgdHlwaWNhbGx5IGlzIG9ubHkgcmVhZCBvbmNlICovCgkJCWRhdGEgPSBNT0NBX1JEKDB4MTAxMDAwNjApOyAvLyBDTEtHRU5fUExMX1NZUzFfUExMX0xPQ0tfU1RBVFVTCgoJCQlpZiAoY291bnQrKyA+IDEwKQoJCQkJYnJlYWs7CgkJfQoJCU1PQ0FfV1IoMHgxMDEwMDA2QywgMCk7ICAvLyBDTEtHRU5fUExMX1NZUzFfUExMX1JFU0VUIAoKCQlpZiAocHJpdi0+Ym9uZGVkX21vZGUpIHsKCQkJTU9DQV9VTlNFVCgweDEwMTAwMDQ4LCAxKTsgIC8vIENMS0dFTl9QTExfU1lTMV9QTExfQ0hBTk5FTF9DVFJMX0NIXzMgCgkJCU1PQ0FfVU5TRVQoMHgxMDEwMDA1MCwgMSk7ICAvLyBDTEtHRU5fUExMX1NZUzFfUExMX0NIQU5ORUxfQ1RSTF9DSF81IAoJCX0gZWxzZSB7CgkJCU1PQ0FfU0VUKDB4MTAxMDAwNDgsIDEpOyAgLy8gQ0xLR0VOX1BMTF9TWVMxX1BMTF9DSEFOTkVMX0NUUkxfQ0hfMyAKCQkJTU9DQV9TRVQoMHgxMDEwMDA1MCwgMSk7ICAvLyBDTEtHRU5fUExMX1NZUzFfUExMX0NIQU5ORUxfQ1RSTF9DSF81IAoJCX0KCQl1ZGVsYXkoMSk7CgoJCS8qIGRlYXNzZXJ0IG1vY2Ffc3lzX3Jlc2V0LCBzeXN0ZW0gY2xvY2ssIHBoeTAsIHBoeTAgY2xvY2sgKi8KCQltYXNrID0gKDEgPDwgMSkgfCAoMSA8PCA3KSB8ICgxIDw8IDQpIHwgKDEgPDwgOCk7CgoJCS8qIGRlYXNzZXJ0IHBoeTEgYW5kIHBoeTEgY2xvY2sgaW4gYm9uZGVkIG1vZGUgKi8KCQlpZiAocHJpdi0+Ym9uZGVkX21vZGUpCgkJCW1hc2sgfD0gKDEgPDwgNSkgfCAoMSA8PCA5KTsKCgkJTU9DQV9VTlNFVChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+c3dfcmVzZXRfb2Zmc2V0LCBtYXNrKTsKCQlNT0NBX1JEKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQpOwoJCQogICAgICAgIC8vIEJlZm9yZSBwb3dlciBvZmYgdGhlIG1lbW9yaWVzLCBtb2NhX3BoeTFfZGlzYWJsZV9jbGsuICAgIAoJCWlmIChwcml2LT5ib25kZWRfbW9kZT09MCkKCQkJbW9jYV9wc19Qb3dlckN0cmxQSFkxKHByaXYsIFBNQl9DT01NQU5EX1BIWTFfT0ZGKTsKCQllbHNlCgkJCW1vY2FfcHNfUG93ZXJDdHJsUEhZMShwcml2LCBQTUJfQ09NTUFORF9QSFkxX09OKTsKCiAgICAgICAgCgkJbW9jYV9wbWJfZ2l2ZV9jbnRybChwcml2LCBQTUJfR0lWRV9PV05FUlNISVBfMl9GVyk7CgkJCQoJCS8qIENoZWNrIGZvciA2ODAyLzY4MDMgQTAgY2hpcCBvbmx5IHdpdGggWHRhbCBtb2QgKi8KCQlpZiAoKHBNb2NhRGF0YS0+Y2hpcF9pZCAmIDB4RkZGRUZGRkYpID09IDB4NjgwMjAwQTApCgkJewoJCQlkYXRhID0gTU9DQV9SRCgweDEwNDA0MDFjKTsKCQkJaWYgKChkYXRhICYgMHg3KSA9PSAweDIpIHsKCQkJCS8qIDI1TUh6ICovCgkJCQlwcmludGsoIk1vQ0EgcnVubmluZyB3aXRoIDI1TUh6IFhUQUxcbiIpOwoJCQkJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+aG9zdDJtb2NhX21tcF9vdXRib3hfMF9vZmZzZXQsIDEpOwoJCQl9IGVsc2UgewoJCQkJcHJpbnRrKCJNb0NBID09IDUwTUh6IFhUQUxcbiIpOwoJCQkJLyogNTBNSHogY2xvY2sgY2hhbmdlIG9ubHkgKi8KCQkJCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPmhvc3QybW9jYV9tbXBfb3V0Ym94XzBfb2Zmc2V0LCAwKTsKCQkJCS8vTm90ZTogVGhlIHJlLWNvbmZpZ3VyYXRpb24gaXMgaW4gTkRJVl9JTlQsIG5vdCBQRElWLgoJCQkJLy9gQ0xLR0VOX1JFR19TVEFSVCArIGBDTEtHRU5fUExMX1NZUzFfUExMX0RJViAoMzInaDEwMTAwMDU4KSBbMDk6MDBdID0gMTCSZDQ4CgkJCQl0ZW1wID0gTU9DQV9SRCgweDEwMTAwMDU4KTsKCQkJCXRlbXAgPSAodGVtcCAmIDB4RkZGRkZDMDApICsgNDg7CgkJCQlNT0NBX1dSKDB4MTAxMDAwNTgsIHRlbXApOwoKCQkJCS8vYENMS0dFTl9SRUdfU1RBUlQgKyBgQ0xLR0VOX1BMTF9TWVMwX1BMTF9ESVYgKDMyJ2gxMDEwMDAxOCkgWzA5OjAwXSA9IDEwkmQ0MAoJCQkJdGVtcCA9IE1PQ0FfUkQoMHgxMDEwMDAxOCk7CgkJCQl0ZW1wID0gKHRlbXAgJiAweEZGRkZGQzAwKSArIDQwOwoJCQkJTU9DQV9XUigweDEwMTAwMDE4LCB0ZW1wKTsKCgkJCQkvL2BDTEtHRU5fUkVHX1NUQVJUICsgYENMS0dFTl9QTExfU1lTMV9QTExfQ0hBTk5FTF9DVFJMX0NIXzQgKDMyJ2gxMDEwMDA0QykgWzA4OjAxXSA9IDiSZDQ4CgkJCQl0ZW1wID0gTU9DQV9SRCgweDEwMTAwMDRjKTsKCQkJCXRlbXAgPSAodGVtcCAmIDB4RkZGRkZFMDEpICsgKDQ4IDw8IDEpOwoJCQkJTU9DQV9XUigweDEwMTAwMDRjLCB0ZW1wKTsKCgkJCQkvL2BDTEtHRU5fUkVHX1NUQVJUICsgYENMS0dFTl9QTExfU1lTMV9QTExfQ0hBTk5FTF9DVFJMX0NIXzUgKDMyJ2gxMDEwMDA1MCkgWzA4OjAxXSA9IDiSZDQ4CgkJCQl0ZW1wID0gTU9DQV9SRCgweDEwMTAwMDUwKTsKCQkJCXRlbXAgPSAodGVtcCAmIDB4RkZGRkZFMDEpICsgKDQ4IDw8IDEpOwoJCQkJTU9DQV9XUigweDEwMTAwMDUwLCB0ZW1wKTsKCgkJCQkvLyBUaGVuIFJlc3RhcnQgdGhlIFBMTC4KCgkJCQkvL2BDTEtHRU5fUkVHX1NUQVJUICsgYENMS0dFTl9QTExfU1lTMF9QTExfUkVTRVQgKDMyJ2gxMDEwMDAyQykgWzBdID0gMZJiMQoJCQkJTU9DQV9TRVQoMHgxMDEwMDAyYywgMSk7CgkJCQkvL2BDTEtHRU5fUkVHX1NUQVJUICsgYENMS0dFTl9QTExfU1lTMV9QTExfUkVTRVQgKDMyJ2gxMDEwMDA2QykgWzBdID0gMZJiMQoJCQkJTU9DQV9TRVQoMHgxMDEwMDA2YywgMSk7CgoJCQkJdWRlbGF5KDEpOwoKCQkJCS8vYENMS0dFTl9SRUdfU1RBUlQgKyBgQ0xLR0VOX1BMTF9TWVMwX1BMTF9SRVNFVCAoMzInaDEwMTAwMDJDKSBbMF0gPSAxkmIwCgkJCQlNT0NBX1VOU0VUKDB4MTAxMDAwMmMsIDEpOwoJCQkJLy9gQ0xLR0VOX1JFR19TVEFSVCArIGBDTEtHRU5fUExMX1NZUzFfUExMX1JFU0VUICgzMidoMTAxMDAwNkMpIFswXSA9IDGSYjAKCQkJCU1PQ0FfVU5TRVQoMHgxMDEwMDA2YywgMSk7CgkJCX0KCQl9CgoJCS8vIENMS0dFTl9QTExfU1lTMV9QTExfU1NDX01PREVfQ09OVFJPTF9ISUdICgkJZGF0YSA9IE1PQ0FfUkQoMHgxMDEwMDA3MCk7CgkJZGF0YSA9IChkYXRhICYgMHhGRkZGMDAwMCkgfCAweDdkZDsKCQlNT0NBX1dSKDB4MTAxMDAwNzAsIGRhdGEpOwoKCQkvLyBDTEtHRU5fUExMX1NZUzFfUExMX1NTQ19NT0RFX0NPTlRST0xfTE9XCgkJZGF0YSA9IE1PQ0FfUkQoMHgxMDEwMDA3NCk7CgkJZGF0YSA9IChkYXRhICYgMHhmZmMwMDAwMCkgfCAweDNkNzE7CgkJTU9DQV9XUigweDEwMTAwMDc0LCBkYXRhKTsKCgkJLy8gQ0xLR0VOX1BMTF9TWVMxX1BMTF9TU0NfTU9ERV9DT05UUk9MX0xPVwoJCU1PQ0FfU0VUKDB4MTAxMDAwNzQsICgxIDw8IDIyKSk7Cgl9CgoKCWlmIChwcml2LT5od19yZXYgPD0gSFdSRVZfTU9DQV8yMF9HRU4yMSkgewoJLyogY2xlYXIganVuayBvdXQgb2YgR1AwL0dQMSAqLwoJCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPmdwMF9vZmZzZXQsIDB4ZmZmZmZmZmYpOwoJCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPmdwMV9vZmZzZXQsIDB4MCk7CgkJLyogc2V0IHVwIGFjdGl2aXR5IExFRCBmb3IgNTAlIGR1dHkgY3ljbGUgKi8KCQlNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5sZWRfY3RybF9vZmZzZXQsCgkJCTB4NDAwMDQwMDApOwoJfQoKCS8qIGVuYWJsZSBETUEgY29tcGxldGlvbiBpbnRlcnJ1cHRzICovCgltYXNrID0gTTJIX1JFUSB8IE0ySF9SRVNQIHwgTTJIX0FTU0VSVCB8IE0ySF9XRFRfQ1BVMSB8CgkJTTJIX05FWFRDSFVOSyB8IE0ySF9ETUE7CgoJaWYgKHByaXYtPmh3X3JldiA+PSBIV1JFVl9NT0NBXzIwX0dFTjIxKQoJCW1hc2sgfD0gTTJIX1dEVF9DUFUwIHwgTTJIX05FWFRDSFVOS19DUFUwIHwKCQkJTTJIX1JFUV9DUFUwIHwgTTJIX1JFU1BfQ1BVMCB8IE0ySF9BU1NFUlRfQ1BVMDsKCglNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5yaW5nYmVsbF9vZmZzZXQsIDApOwoJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+bDJfbWFza19jbGVhcl9vZmZzZXQsIG1hc2spOwoJTU9DQV9SRChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+bDJfbWFza19jbGVhcl9vZmZzZXQpOwoKCgkvKiBTZXQgcGlubXV4aW5nIGZvciBNb0NBIGludGVycnVwdCBhbmQgZmxvdyBjb250cm9sICovCglNT0NBX1VOU0VUKDB4MTA0MDQxMTAsIDB4RjAwMDAwRkYpOwoJTU9DQV9TRVQoMHgxMDQwNDExMCwgMHgxMDAwMDAyMik7CiAKCS8qIFNldCBwaW5tdXhpbmcgZm9yIE1vQ0EgSUlDIGNvbnRyb2wgKi8KCWlmICgoKHBNb2NhRGF0YS0+Y2hpcF9pZCAmIDB4RkZGRkZGRjApID09IDB4NjgwMjAwQzApIHx8IAoJICAgICgocE1vY2FEYXRhLT5jaGlwX2lkICYgMHhGRkZGRkZGMCkgPT0gMHg2ODAzMDBDMCkpCgl7CgkJTU9DQV9VTlNFVCgweDEwNDA0MTAwLCAweEZGKTsgIC8vIHBpbiBtdXhpbmcKCQlNT0NBX1NFVCgweDEwNDA0MTAwLCAweDIyKTsgIC8vIHBpbiBtdXhpbmcKCX0KCglNT0NBX1dSKDB4MTAwYjAzMTgsIDIpOwoKCWlmIChhY3Rpb24gPT0gTU9DQV9ESVNBQkxFICYmIHByaXYtPmVuYWJsZWQpIHsKCQlwcml2LT5lbmFibGVkID0gMDsKCQljbGtfZGlzYWJsZShwcml2LT5jbGspOwoJfQp9CgpzdGF0aWMgdm9pZCBtb2NhX3JpbmdiZWxsKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdiwgdWludDMyX3QgbWFzaykKewoJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+cmluZ2JlbGxfb2Zmc2V0LCBtYXNrKTsKfQoKc3RhdGljIHVpbnQzMl90IG1vY2Ffc3RhcnRfbWlwcyhzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYsIHVuc2lnbmVkIGludCBjcHUpCnsKCWlmIChwcml2LT5od19yZXYgPT0gSFdSRVZfTU9DQV8yMF9HRU4yMikgewoJCWlmIChjcHUgPT0gMSkKCQkJTU9DQV9VTlNFVChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+c3dfcmVzZXRfb2Zmc2V0LAoJCQkJKDEgPDwgMCkpOwoJCWVsc2UgewoJCQltb2NhX21tcF9pbml0KHByaXYsIDEpOwoJCQlNT0NBX1VOU0VUKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQsCgkJCQkoMSA8PCAyKSk7CgkJfQoJfSBlbHNlCgkJTU9DQV9VTlNFVChwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+c3dfcmVzZXRfb2Zmc2V0LCAoMSA8PCAwKSk7CglNT0NBX1JEKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQpOwoKCXJldHVybigwKTsKfQoKc3RhdGljIHZvaWQgbW9jYV9tMm1feGZlcihzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYsCgl1aW50MzJfdCBkc3QsIHVpbnQzMl90IHNyYywgdWludDMyX3QgY3RsKQp7Cgl1aW50MzJfdCBzdGF0dXM7CgoJTU9DQV9XUihwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+bTJtX3NyY19vZmZzZXQsIHNyYyk7CglNT0NBX1dSKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5tMm1fZHN0X29mZnNldCwgZHN0KTsKCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPm0ybV9zdGF0dXNfb2Zmc2V0LCAwKTsKCU1PQ0FfUkQocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPm0ybV9zdGF0dXNfb2Zmc2V0KTsKCU1PQ0FfV1IocHJpdi0+YmFzZSArIHByaXYtPnJlZ3MtPm0ybV9jbWRfb2Zmc2V0LCBjdGwpOwoKCWRvIHsKCQlzdGF0dXMgPSBNT0NBX1JEKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5tMm1fc3RhdHVzX29mZnNldCk7Cgl9IHdoaWxlKHN0YXR1cyA9PSAwKTsKCn0KCnN0YXRpYyB2b2lkIG1vY2Ffd3JpdGVfbWVtKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdiwKCXVpbnQzMl90IGRzdF9vZmZzZXQsIHZvaWQgKnNyYywgdW5zaWduZWQgaW50IGxlbikKewoJc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqcGQgPSBwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKCglpZigoZHN0X29mZnNldCA+PSBwcml2LT5yZWdzLT5jbnRsX21lbV9vZmZzZXQrcHJpdi0+cmVncy0+Y250bF9tZW1fc2l6ZSkgfHwKCQkoKGRzdF9vZmZzZXQgKyBsZW4pID4gcHJpdi0+cmVncy0+Y250bF9tZW1fb2Zmc2V0K3ByaXYtPnJlZ3MtPmNudGxfbWVtX3NpemUpKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvcHkgcGFzdCBlbmQgb2YgY250bCBtZW1vcnk6ICUwOHhcbiIsCgkJCV9fRlVOQ1RJT05fXywgZHN0X29mZnNldCk7CgkJcmV0dXJuOwoJfQoKCWlmICggMSA9PSBwZC0+dXNlX2RtYSApCgl7CgkJZG1hX2FkZHJfdCBwYTsKCgkJcGEgPSBkbWFfbWFwX3NpbmdsZSgmcHJpdi0+cGRldi0+ZGV2LCBzcmMsIGxlbiwgRE1BX1RPX0RFVklDRSk7CgkJbXV0ZXhfbG9jaygmcHJpdi0+Y29weV9tdXRleCk7CgkJbW9jYV9tMm1feGZlcihwcml2LCBkc3Rfb2Zmc2V0ICsgcHJpdi0+cmVncy0+ZGF0YV9tZW1fb2Zmc2V0LCAodWludDMyX3QpcGEsIGxlbiB8IE0yTV9XUklURSk7CgkJbXV0ZXhfdW5sb2NrKCZwcml2LT5jb3B5X211dGV4KTsKCQlkbWFfdW5tYXBfc2luZ2xlKCZwcml2LT5wZGV2LT5kZXYsIHBhLCBsZW4sIERNQV9UT19ERVZJQ0UpOwoJfQoJZWxzZQoJewoJCXVpbnRwdHJfdCBhZGRyID0gKHVpbnRwdHJfdClwcml2LT5iYXNlICsgcHJpdi0+cmVncy0+ZGF0YV9tZW1fb2Zmc2V0ICsgZHN0X29mZnNldDsKCQl1aW50MzJfdCAqZGF0YSA9IHNyYzsKCQlpbnQgaTsKCgkJbXV0ZXhfbG9jaygmcHJpdi0+Y29weV9tdXRleCk7CgkJaWYgKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+dXNlX3NwaSA9PSAxKQoJCXsKCQkJc3JjID0gZGF0YTsKCQkJTU9DQV9XUl9CTE9DSyhhZGRyLCBzcmMsIGxlbik7CgkJfQoJCWVsc2UKCQl7CgkJCWZvcihpID0gMDsgaSA8IGxlbjsgaSArPSA0LCBhZGRyICs9IDQsIGRhdGErKykKCQkJCU1PQ0FfV1IoYWRkciwgKmRhdGEpOwoJCQlNT0NBX1JEKGFkZHIgLSA0KTsJLyogZmx1c2ggd3JpdGUgKi8KCQl9CgoJCW11dGV4X3VubG9jaygmcHJpdi0+Y29weV9tdXRleCk7Cgl9Cn0KCnN0YXRpYyB2b2lkIG1vY2FfcmVhZF9tZW0oc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2LAoJdm9pZCAqZHN0LCB1aW50MzJfdCBzcmNfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuKQp7CglzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICpwZCA9IHByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogICAgCglpZigoc3JjX29mZnNldCA+PSBwcml2LT5yZWdzLT5jbnRsX21lbV9vZmZzZXQrcHJpdi0+cmVncy0+Y250bF9tZW1fc2l6ZSkgfHwKCQkoKHNyY19vZmZzZXQgKyBsZW4pID4gcHJpdi0+cmVncy0+Y250bF9tZW1fb2Zmc2V0K3ByaXYtPnJlZ3MtPmNudGxfbWVtX3NpemUpKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvcHkgcGFzdCBlbmQgb2YgY250bCBtZW1vcnk6ICUwOHhcbiIsCgkJCV9fRlVOQ1RJT05fXywgc3JjX29mZnNldCk7CgkJcmV0dXJuOwoJfQoKCWlmICggMSA9PSBwZC0+dXNlX2RtYSApCgl7CgkJZG1hX2FkZHJfdCBwYTsKCgkJcGEgPSBkbWFfbWFwX3NpbmdsZSgmcHJpdi0+cGRldi0+ZGV2LCBkc3QsIGxlbiwgRE1BX0ZST01fREVWSUNFKTsKCQltdXRleF9sb2NrKCZwcml2LT5jb3B5X211dGV4KTsKCQltb2NhX20ybV94ZmVyKHByaXYsICh1aW50MzJfdClwYSwgc3JjX29mZnNldCArIHByaXYtPnJlZ3MtPmRhdGFfbWVtX29mZnNldCwgbGVuIHwgTTJNX1JFQUQpOwoJCW11dGV4X3VubG9jaygmcHJpdi0+Y29weV9tdXRleCk7CgkJZG1hX3VubWFwX3NpbmdsZSgmcHJpdi0+cGRldi0+ZGV2LCBwYSwgbGVuLCBETUFfRlJPTV9ERVZJQ0UpOwoJfQoJZWxzZQoJewoJCXVpbnRwdHJfdCBhZGRyID0gcHJpdi0+cmVncy0+ZGF0YV9tZW1fb2Zmc2V0ICsgc3JjX29mZnNldDsKCQl1aW50MzJfdCAqZGF0YSA9IGRzdDsKCQlpbnQgaTsKCgkJbXV0ZXhfbG9jaygmcHJpdi0+Y29weV9tdXRleCk7CgkJaWYgKCgoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKS0+dXNlX3NwaSA9PSAxKQoJCXsKCQkJTU9DQV9SRF9CTE9DSygodWludHB0cl90KXByaXYtPmJhc2UgKyBhZGRyLCBkc3QsIGxlbik7CgkJfQoJCWVsc2UKCQl7CgkJCWZvcihpID0gMDsgaSA8IGxlbjsgaSArPSA0LCBhZGRyICs9IDQsIGRhdGErKykKCQkJCSpkYXRhID0gTU9DQV9SRCgodWludHB0cl90KXByaXYtPmJhc2UgKyBhZGRyKTsKCQl9CgkJbXV0ZXhfdW5sb2NrKCZwcml2LT5jb3B5X211dGV4KTsKCX0KfQoKc3RhdGljIHZvaWQgbW9jYV93cml0ZV9zZyhzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYsCgl1aW50MzJfdCBkc3Rfb2Zmc2V0LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMpCnsKCWludCBqOwoJdWludHB0cl90IGFkZHIgPSBwcml2LT5yZWdzLT5kYXRhX21lbV9vZmZzZXQgKyBkc3Rfb2Zmc2V0OwoJc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqcGQgPSBwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKCglkbWFfbWFwX3NnKCZwcml2LT5wZGV2LT5kZXYsIHNnLCBuZW50cywgRE1BX1RPX0RFVklDRSk7CgoJbXV0ZXhfbG9jaygmcHJpdi0+Y29weV9tdXRleCk7Cglmb3IoaiA9IDA7IGogPCBuZW50czsgaisrKQoJewoJCWlmICggMSA9PSBwZC0+dXNlX2RtYSApCgkJewoJCSAgICAvLyBwcmludGsoIlhYWCBjb3B5aW5nIHBhZ2UgJWQsIFBBICUwOHhcbiIsIGosIChpbnQpc2dbal0uZG1hX2FkZHJlc3MpOwoJCQltb2NhX20ybV94ZmVyKHByaXYsIGFkZHIsICh1aW50MzJfdClzZ1tqXS5kbWFfYWRkcmVzcywgCgkJCQlzZ1tqXS5sZW5ndGggfCBNMk1fV1JJVEUpOwoKCQkJYWRkciArPSBzZ1tqXS5sZW5ndGg7CgkJfQoJCWVsc2UKCQl7CgkJCXVuc2lnbmVkIGxvbmcgKmRhdGEgPSAodm9pZCAqKXBoeXNfdG9fdmlydChzZ1tqXS5kbWFfYWRkcmVzcyk7CiAgICAgICAgIC8vcHJpbnRrKCIlczogV3JpdGluZyAweCVseCB0byBhZGRyIDB4JTA4bHggKGxlbiA9ICVkKVxuIiwgX19GVU5DVElPTl9fLCAqZGF0YSwgKCh1bnNpZ25lZCBsb25nKXByaXYtPmJhc2UpICsgYWRkciwgc2dbal0ubGVuZ3RoKTsKCQkJTU9DQV9XUl9CTE9DSygoKHVuc2lnbmVkIGxvbmcpcHJpdi0+YmFzZSkgKyBhZGRyLCBkYXRhLCBzZ1tqXS5sZW5ndGgpOwoJCQlhZGRyICs9IHNnW2pdLmxlbmd0aDsKCQl9Cgl9CgltdXRleF91bmxvY2soJnByaXYtPmNvcHlfbXV0ZXgpOwoKCWRtYV91bm1hcF9zZygmcHJpdi0+cGRldi0+ZGV2LCBzZywgbmVudHMsIERNQV9UT19ERVZJQ0UpOwp9CgovKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCB0ZXN0ZWQgKi8KI2lmIDAKc3RhdGljIHZvaWQgbW9jYV9yZWFkX3NnKHN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdiwKCXVpbnQzMl90IHNyY19vZmZzZXQsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cykKewoJaW50IGo7Cgl1aW50cHRyX3QgYWRkciA9IHByaXYtPmRhdGFfbWVtX29mZnNldCArIHNyY19vZmZzZXQ7CgoJZG1hX21hcF9zZygmcHJpdi0+cGRldi0+ZGV2LCBzZywgbmVudHMsIERNQV9GUk9NX0RFVklDRSk7CgoJbXV0ZXhfbG9jaygmcHJpdi0+Y29weV9tdXRleCk7Cglmb3IoaiA9IDA7IGogPCBuZW50czsgaisrKSB7CiNpZiAwIC8vVVNFX0RNQQoJCSBwcmludGsoIlhYWCBjb3B5aW5nIHBhZ2UgJWQsIFBBICUwOHhcbiIsIGosIChpbnQpc2dbal0uZG1hX2FkZHJlc3MpOwoJCW1vY2FfbTJtX3hmZXIocHJpdiwgYWRkciwgKHVpbnQzMl90KXNnW2pdLmRtYV9hZGRyZXNzLAoJCQlzZ1tqXS5sZW5ndGggfCBNMk1fUkVBRCk7CgoJCWFkZHIgKz0gc2dbal0ubGVuZ3RoOwojZWxzZQoJCXVpbnQzMl90ICpkYXRhID0gKHZvaWQgKilwaHlzX3RvX3ZpcnQoc2dbal0uZG1hX2FkZHJlc3MpOwoJCXVuc2lnbmVkIGludCBsZW4gPSBzZ1tqXS5sZW5ndGg7CgkJaW50IGk7CgoJCWZvcihpID0gMDsgaSA8IGxlbjsgaSArPSA0LCBhZGRyICs9IDQsIGRhdGErKykgewoJCQkqZGF0YSA9IGNwdV90b19iZTMyKAoJCQkJTU9DQV9SRCgodWludHB0cl90KXByaXYtPmJhc2UgKyBhZGRyKSk7CgkJCS8vcHJpbnRrKCJNb0NBIFJFQUQ6IEFEIDB4JXggID0gMHgleCAoMHgleClcbiIsIChwcml2LT5iYXNlICsgYWRkciksIE1PQ0FfUkQoKHVpbnRwdHJfdClwcml2LT5iYXNlICsgYWRkciksICpkYXRhKTsKCQkgfQojZW5kaWYKCX0KCW11dGV4X3VubG9jaygmcHJpdi0+Y29weV9tdXRleCk7CgoJZG1hX3VubWFwX3NnKCZwcml2LT5wZGV2LT5kZXYsIHNnLCBuZW50cywgRE1BX0ZST01fREVWSUNFKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIG1vY2FfcmVhZF9tYWNfYWRkcihzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYsIHVpbnQzMl90ICogaGksIHVpbnQzMl90ICogbG8pCnsKCXN0cnVjdCBuZXRfZGV2aWNlICogcGRldiA7CgljaGFyCQkJCQkgbW9jYU5hbWVbN10gOwoKCWlmIChwcml2ID09IE5VTEwpCgkJc3ByaW50ZiAobW9jYU5hbWUsICJtb2NhJXUiLCAwKSA7CgllbHNlCgkJc3ByaW50ZiAobW9jYU5hbWUsICJtb2NhJXUiLCAoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPmRldklkKSA7CgojaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDI5KQoJcGRldiA9IGRldl9nZXRfYnlfbmFtZSAoICZpbml0X25ldCwgbW9jYU5hbWUgKSA7CiNlbHNlCglwZGV2ID0gZGV2X2dldF9ieV9uYW1lICggbW9jYU5hbWUgKSA7CiNlbmRpZgoKCWlmICgocGRldiAhPSBOVUxMKSAmJiAobG8gIT0gTlVMTCkgJiYgKGhpICE9IE5VTEwpKSB7CgkJbWFjX3RvX3UzMihoaSwgbG8sIHBkZXYtPmRldl9hZGRyKTsKCX0KfQoKCiNpZiBkZWZpbmVkKERTTF9NT0NBKQoKLyoKICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gd2FzIGFkZGVkIHRvIGFsbG93IHRoZSBlbmV0IGRyaXZlciB0byBjb21waWxlIGluCiAqIGNvbnN1bWVyIGVudmlyb25tZW50IGZvciA2OHh4IHByb2ZpbGVzLgogKi8Kdm9pZCBtb2NhX2dldF9mY19iaXRzKHZvaWQgKiBhcmcsIHVuc2lnbmVkIGxvbmcgKm1vY2FfZmNfcmVnKQp7CglzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKiAgICAgcHJpdjsKCXN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKiBwTW9jYURhdGE7Cgl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgZmxhZ3M7CgoJaWYgKGFyZyA9PSBOVUxMKSB7CgkJcmV0dXJuOwoJfQoKCXByaXYgPSAoc3RydWN0IG1vY2FfcHJpdl9kYXRhICopIGFyZzsKCXBNb2NhRGF0YSA9IChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CgoJKm1vY2FfZmNfcmVnID0gMDsKCWlmIChwcml2ICE9IE5VTEwpCgl7CgkJLyogV2UgY2FuJ3QgcmVhZCBtb2NhIGNvcmUgcmVncyB1bmxlc3MgdGhlIGNvcmUncyBjbG9ja3MgYXJlIG9uLiAqLwoJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5jbG9ja19sb2NrLCBmbGFncyk7CgkJaWYgKHByaXYtPnJ1bm5pbmcpIHsKCQkJKm1vY2FfZmNfcmVnID0gTU9DQV9SRChwcml2LT5iYXNlK3ByaXYtPnJlZ3MtPnNpZGViYW5kX2dtaWlfZmNfb2Zmc2V0KTsKCQl9CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+Y2xvY2tfbG9jaywgZmxhZ3MpOwoJfQp9CgojZW5kaWYgLyogRFNMX01PQ0EgKi8KCnN0YXRpYyBpbnQgX19kZXZpbml0IGJtb2NhX3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKSB7CgkvLyBUT0RPKGFwZW53YXJyKTogbWF0Y2ggb25lIHNwaSBkZXZpY2UgdG8gb25lIG1vY2EgZGV2aWNlIHN0cnVjdC4KCS8vIEkgaGFwcGVuIHRvIGtub3cgdGhhdCByaWdodCBub3cgdGhlIHN5c3RlbSBvbmx5IHJlZ2lzdGVycyBvbmUgb2YKCS8vIG1vY2FfbGFuIG9yIG1vY2Ffd2FuLCBuZXZlciBib3RoLCBhbmQgdGhlcmUgaXMgbmV2ZXIgbW9yZSB0aGFuCgkvLyBvbmUgbW9jYSBjaGlwIHByZXNlbnQgb24gb3VyIHN5c3RlbXMsIHNvIHRoaXMgaXMgb2theSBmb3Igbm93LgoJdWludDMyX3QgdmFsID0ga2VyU3lzQmNtU3BpU2xhdmVSZWFkUmVnMzIoc3BpLCAweDEwNDA0MDAwKTsKCXByX2luZm8oImJtb2NhX3NwaV9wcm9iZSBidXM9JWQgY2hpcF9zZWxlY3Q9JWQ6IGlkPSUwOHggJXNcbiIsCgkJc3BpLT5tYXN0ZXItPmJ1c19udW0sIHNwaS0+Y2hpcF9zZWxlY3QsIHZhbCwKCQl2YWwgIT0gMCA/ICJ5ZXMiIDogIm5vIik7CglpZiAodmFsID09IDApIHJldHVybiAtRU5PREVWOwoJbW9jYV9sYW5fZGF0YS5zcGkgPSBzcGk7Cgltb2NhX3dhbl9kYXRhLnNwaSA9IHNwaTsKCXJldHVybiAwOyAvLyBzdWNjZXNzCn0KCnN0YXRpYyBpbnQgX19kZXZleGl0IGJtb2NhX3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkgewoJcHJfaW5mbygiYm1vY2Ffc3BpX3JlbW92ZVxuIik7CglpZiAobW9jYV9sYW5fZGF0YS5zcGkgPT0gc3BpKSBtb2NhX2xhbl9kYXRhLnNwaSA9IE5VTEw7CglpZiAobW9jYV93YW5fZGF0YS5zcGkgPT0gc3BpKSBtb2NhX3dhbl9kYXRhLnNwaSA9IE5VTEw7CglyZXR1cm4gMDsgLy8gc3VjY2Vzcwp9CgpzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYm1vY2Ffc3BpX2RyaXZlciA9IHsKICAuZHJpdmVyID0gewogICAgLm5hbWUgPSAiYm1vY2EiLAogICAgLm93bmVyID0gVEhJU19NT0RVTEUsCiAgfSwKICAucHJvYmUgPSBibW9jYV9zcGlfcHJvYmUsCiAgLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGJtb2NhX3NwaV9yZW1vdmUpLAp9OwoKLy9leHRlcm4gdm9pZCBiY21lbmV0X3JlZ2lzdGVyX21vY2FfZmNfYml0c19jYih2b2lkIGNiKHZvaWQgKiwgdW5zaWduZWQgbG9uZyAqKSwgaW50IGlzV2FuLCB2b2lkICogYXJnKTsKCnN0YXRpYyB2b2lkIG1vY2FfbWVtX2luaXRfNjgweEMwKCBzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYgKQp7CgkvLyBEZS1hc3NlcnQgcmVzZXQgKGFsbCBtZW1vcmllcyBhcmUgT0ZGIGJ5IGRlZmF1bHQgRm9yY2VfU1Bfb2ZmID0xLCBGb3JjZV9SZl9vZmYgPTEpCglNT0NBX1VOU0VUKHByaXYtPmJhc2UgKyBwcml2LT5yZWdzLT5zd19yZXNldF9vZmZzZXQsICgoMSA8PCAxNSkgfCAoMSA8PCAxNikpKTsKCgltb2NhX3BtYl9kZWxheShwcml2KTsKCW1vY2FfcG1iX2NvbnRyb2wocHJpdiwgUE1CX0NPTU1BTkRfQUxMX09GRik7CgoJLy9Xcml0ZSBGb3JjZV9TUF9vbiA9MCwgRm9yY2VfU1Bfb2ZmID0wLCBGb3JjZV9SRl9vbiA9MCwgRm9yY2VfUkZfb2ZmID0wCglNT0NBX1VOU0VUKHByaXYtPmJhc2UgKyAweDAwMWZmZDE0LCAoKDEgPDwgMTApIHwgKDEgPDwgMTEpKSk7Cgltb2NhX3BtYl9jb250cm9sKHByaXYsIFBNQl9DT01NQU5EX1BBUlRJQUxfT04pOwp9CgpzdGF0aWMgaW50ICBod19zcGVjaWZpY19pbml0KCBzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYgKQp7CiNpZmRlZiBEU0xfTU9DQQoJc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqcE1vY2FEYXRhOwoKCXBNb2NhRGF0YSA9IChzdHJ1Y3QgbW9jYV9wbGF0Zm9ybV9kYXRhICopcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CgoJLyogZmlsbCBpbiB0aGUgaHdfcmV2IGZpZWxkICovCglwTW9jYURhdGEtPmNoaXBfaWQgPSBNT0NBX1JEKDB4MTA0MDQwMDQpICsgMHhBMDsKICAgICAgICBwcl9pbmZvKCJyZWFkIG1vY2EgY2hpcCBpZDogJTA4eFxuIiwgcE1vY2FEYXRhLT5jaGlwX2lkKTsKCWlmICgocE1vY2FEYXRhLT5jaGlwX2lkICYgMHhGRkZFMDAwMCkgIT0gMHg2ODAyMDAwMCkgeyAvKiA2ODAyIG9yIDY4MDMgKi8KCQlwcmludGsoS0VSTl9FUlIgImJtb2NhOiBObyBNb0NBIGNoaXAgZm91bmRcbiIpOwoJCXJldHVybiAtRUZBVUxUOwoJfQoKCWlmICgoKHBNb2NhRGF0YS0+Y2hpcF9pZCAmIDB4RkZGRkZGRjApID09IDB4NjgwMjAwQzApIHx8ICgocE1vY2FEYXRhLT5jaGlwX2lkICYgMHhGRkZGRkZGMCkgPT0gMHg2ODAzMDBDMCkpCgl7CgkJcHJpdi0+aTJjX2Jhc2UgPSBOVUxMOyAKCgkJLyogSW5pdGlhbGl6ZSA2ODB4IENPIG1lbW9yeSAqLwoJCW1vY2FfbWVtX2luaXRfNjgweEMwKHByaXYpOwoJfQoKCXBNb2NhRGF0YS0+aHdfcmV2ID0gSFdSRVZfTU9DQV8yMF9HRU4yMjsKCgkvKiBQb3dlciBkb3duIGFsbCBMRUFQIG1lbW9yaWVzICovCglNT0NBX1dSKDB4MTAxMDAwZTQsIDB4Nik7IC8vIENMS0dFTl9MRUFQX1RPUF9JTlNUX0RBVEEgICAKCU1PQ0FfV1IoMHgxMDEwMDBlOCwgMHg2KTsgLy8gQ0xLR0VOX0xFQVBfVE9QX0lOU1RfSEFCIAoJTU9DQV9XUigweDEwMTAwMGVjLCAweDYpOyAvLyBDTEtHRU5fTEVBUF9UT1BfSU5TVF9QUk9HMAoJTU9DQV9XUigweDEwMTAwMGYwLCAweDYpOyAvLyBDTEtHRU5fTEVBUF9UT1BfSU5TVF9QUk9HMSAgIAoJTU9DQV9XUigweDEwMTAwMGY0LCAweDYpOyAvLyBDTEtHRU5fTEVBUF9UT1BfSU5TVF9QUk9HMiAgCglNT0NBX1dSKDB4MTAxMDAwZjgsIDB4Nik7IC8vIENMS0dFTl9MRUFQX1RPUF9JTlNUX1JPTQoJTU9DQV9XUigweDEwMTAwMGZjLCAweDYpOyAvLyBDTEtHRU5fTEVBUF9UT1BfSU5TVF9TSEFSRUQgIAoJTU9DQV9XUigweDEwMTAwMTY0LCAweDMpOyAvLyBDTEtHRU5fU1lTX0NUUkxfSU5TVF9QT1dFUl9TV0lUQ0hfTUVNT1JZIAoKLy8JYmNtZW5ldF9yZWdpc3Rlcl9tb2NhX2ZjX2JpdHNfY2IoCi8vCQltb2NhX2dldF9mY19iaXRzLCBwTW9jYURhdGEtPnVzZV9zcGkgPyAxIDogMCwgKHZvaWQgKilwcml2KTsKI2VuZGlmCgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgbW9jYV9wbGF0Zm9ybV9kZXZfcmVnaXN0ZXIodm9pZCkKewoJc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqcE1vY2FEYXRhOwoJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcFBsYXRmb3JtRGV2OwoJQlBfTU9DQV9JTkZPIG1vY2FJbmZvW0JQX01PQ0FfTUFYX05VTV07CglpbnQgbW9jYUNoaXBOdW0gPSBCUF9NT0NBX01BWF9OVU07CglpbnQgaTsKCWludCByZXQgPSAwOyAgIAoKCUJwR2V0TW9jYUluZm8obW9jYUluZm8sICZtb2NhQ2hpcE51bSk7CgoJcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYm1vY2Ffc3BpX2RyaXZlcik7CglpZiAocmV0IDwgMCkgcmV0dXJuIHJldDsKCglmb3IgKGkgPSAwOyBpIDwgbW9jYUNoaXBOdW07IGkrKykgewoJCXN3aXRjaCAobW9jYUluZm9baV0udHlwZSkgewoJCQljYXNlIEJQX01PQ0FfVFlQRV9XQU46CgkJCQlwTW9jYURhdGEgPSAmbW9jYV93YW5fZGF0YTsKCQkJCXBQbGF0Zm9ybURldiA9ICZtb2NhX3dhbl9wbGF0X2RldjsKCQkJCWJyZWFrOwoKCQkJY2FzZSBCUF9NT0NBX1RZUEVfTEFOOgoJCQkJcE1vY2FEYXRhID0gJm1vY2FfbGFuX2RhdGE7CgkJCQlwUGxhdGZvcm1EZXYgPSAmbW9jYV9sYW5fcGxhdF9kZXY7CgkJCQlicmVhazsKCgkJCWRlZmF1bHQ6CgkJCQlwcmludGsoS0VSTl9FUlIgImJtb2NhOiB1bnJlY29nbml6ZWQgTW9DQSB0eXBlICVkXG4iLAoJCQkJCW1vY2FJbmZvW2ldLnR5cGUpOwoJCQkJcmV0dXJuKC0xKTsKCQkJCWJyZWFrOwoJCX0KCgkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHBQbGF0Zm9ybURldik7CgkJaWYgKHJldCA8IDApIHsKCQkJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZibW9jYV9zcGlfZHJpdmVyKTsKCQkJcmV0dXJuKHJldCk7CgkJfQoJCWVsc2UgewoJCQlwTW9jYURhdGEtPmRldklkID0gaTsKCgkJCS8qIE1hcCB0aGUgYm9hcmQgcGFyYW1zIFJGIEJhbmQgdG8gdGhlIGJtb2NhLmggdmFsdWUgKi8KCQkJc3dpdGNoIChtb2NhSW5mb1tpXS5yZkJhbmQpCgkJCXsKCQkJCWNhc2UgQlBfTU9DQV9SRl9CQU5EX0RfTE9XOgoJCQkJCXBNb2NhRGF0YS0+cmZfYmFuZCA9IE1PQ0FfQkFORF9EX0xPVzsKCQkJCQlicmVhazsKCQkJCWNhc2UgQlBfTU9DQV9SRl9CQU5EX0RfSElHSDoKCQkJCQlwTW9jYURhdGEtPnJmX2JhbmQgPSBNT0NBX0JBTkRfRF9ISUdIOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCUF9NT0NBX1JGX0JBTkRfRVhUX0Q6CgkJCQkJcE1vY2FEYXRhLT5yZl9iYW5kID0gTU9DQV9CQU5EX0VYVF9EOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCUF9NT0NBX1JGX0JBTkRfRToKCQkJCQlwTW9jYURhdGEtPnJmX2JhbmQgPSBNT0NBX0JBTkRfRTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQlBfTU9DQV9SRl9CQU5EX0Y6ICAgIAoJCQkJCXBNb2NhRGF0YS0+cmZfYmFuZCA9IE1PQ0FfQkFORF9GOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQkvKiBEbyBub3RoaW5nICovCgkJCQkJYnJlYWs7CgkJCX0KCQkJcHJpbnRrKEtFUk5fSU5GTyAiYm1vY2E6IEZvdW5kIE1vQ0EgZGV2aWNlICVkLyVkICBSRiBCYW5kICVkXG4iLAoJCQkJaSwgbW9jYUNoaXBOdW0sIG1vY2FJbmZvW2ldLnJmQmFuZCk7CgkJfQoJfQoKCXJldHVybihyZXQpOwp9CgpzdGF0aWMgdm9pZCBtb2NhX3BsYXRmb3JtX2Rldl91bnJlZ2lzdGVyKHZvaWQpCnsKCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYm1vY2Ffc3BpX2RyaXZlcik7CgoJaWYgKG1vY2FfbGFuX2RhdGEuZGV2SWQgIT0gTU9DQV9ERVZJQ0VfSURfVU5SRUdJU1RFUkVEKQoJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZtb2NhX2xhbl9wbGF0X2Rldik7CgoJaWYgKG1vY2Ffd2FuX2RhdGEuZGV2SWQgIT0gTU9DQV9ERVZJQ0VfSURfVU5SRUdJU1RFUkVEKQoJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZtb2NhX3dhbl9wbGF0X2Rldik7Cn0KCnN0YXRpYyB2b2lkIG1vY2FfMzQ1MF93cml0ZShzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgKnByaXYsIHU4IGFkZHIsIHUzMiBkYXRhKQp7CgkvKiBjb21tZW50IG91dCBmb3Igbm93LiBXZSBkb24ndCB1c2UgaTJjIG9uIHRoZSA2MzI2OEJIUiBib2FyZCAqLwojaWZkZWYgTU9DQV8zNDUwX1VTRV9JMkMKCWlmICgoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPnVzZV9zcGkgPT0gMCkKCQliY20zNDUwX3dyaXRlX3JlZyhhZGRyLCBkYXRhKTsKCWVsc2UKI2VuZGlmCgl7CgkJaWYgKHByaXYtPmkyY19iYXNlICE9IE5VTEwpCgkJCW1vY2FfMzQ1MF93cml0ZV9pMmMocHJpdiwgYWRkciwgZGF0YSk7Cgl9Cn0KCnN0YXRpYyB1MzIgbW9jYV8zNDUwX3JlYWQoc3RydWN0IG1vY2FfcHJpdl9kYXRhICpwcml2LCB1OCBhZGRyKQp7CgkvKiBjb21tZW50IG91dCBmb3Igbm93LiBXZSBkb24ndCB1c2UgaTJjIG9uIHRoZSA2MzI2OEJIUiBib2FyZCAqLwojaWZkZWYgTU9DQV8zNDUwX1VTRV9JMkMKCWlmICgoKHN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKilwcml2LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YSktPnVzZV9zcGkgPT0gMCkKCQlyZXR1cm4oYmNtMzQ1MF9yZWFkX3JlZyhhZGRyKSk7CgllbHNlCiNlbmRpZgoJewoJCWlmIChwcml2LT5pMmNfYmFzZSAhPSBOVUxMKQoJCQlyZXR1cm4obW9jYV8zNDUwX3JlYWRfaTJjKHByaXYsIGFkZHIpKTsKCQllbHNlCgkJCXJldHVybigweGZmZmZmZmZmKTsKCX0KfQoKLyoKICogUE0gU1RVQlMKICovCgpzdHJ1Y3QgY2xrICpjbGtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqaWQpCnsKCS8vIFdlJ3JlIG5vdCBhY3R1YWxseSB1c2luZyB0aGUgInN0cnVjdCBjbGsiIGZvciBhbnl0aGluZwoJLy8gV2UnbGwgdXNlIG91ciBvd24gc3RydWN0dXJlCglzdHJ1Y3QgbW9jYV82ODB4X2NsayAqIHBjbGsgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbW9jYV82ODB4X2NsayksIEdGUF9LRVJORUwpOwoKCXBjbGstPmRldiA9IGRldjsKCglpZiAoIXN0cmNtcChpZCwgIm1vY2EtY3B1IikpCgkJcGNsay0+Y2xvY2tfbnVtID0gTU9DQV9DUFVfQ0xPQ0tfTlVNOwoJZWxzZSBpZiAoIXN0cmNtcChpZCwgIm1vY2EtcGh5IikpCgkJcGNsay0+Y2xvY2tfbnVtID0gTU9DQV9QSFlfQ0xPQ0tfTlVNOwoJZWxzZQoJewoJCWtmcmVlKHBjbGspOwoJCXJldHVybihOVUxMKTsKCX0KCglyZXR1cm4oKHN0cnVjdCBjbGsgKilwY2xrKTsKfQoKaW50IGNsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQp7CglyZXR1cm4gMDsKfQoKdm9pZCBjbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCnsKfQoKdm9pZCBjbGtfcHV0KHN0cnVjdCBjbGsgKmNsaykKewoJa2ZyZWUoKHN0cnVjdCBtb2NhXzY4MHhfY2xrICopY2xrKTsKfQoKc3RydWN0IG1vY2FfNjgwMmMwX2Nsb2NrX3BhcmFtcwp7Cgl1aW50MzJfdCAgICAgICAgY3B1X2h6OwoJdWludDMyX3QgICAgICAgIHBkaXY7Cgl1aW50MzJfdCAgICAgICAgbmRpdjsKCXVpbnQzMl90ICAgICAgICBwbGxfbWRpdnNbNl07Cn07CgojZGVmaW5lIE5VTV82ODAyQzBfQ0xPQ0tfT1BUSU9OUyAyCnN0cnVjdCBtb2NhXzY4MDJjMF9jbG9ja19wYXJhbXMgbW9jYV82ODAyYzBfY2xvY2tfcGFyYW1zW05VTV82ODAyQzBfQ0xPQ0tfT1BUSU9OU10gPQp7Cgl7ICAvLyBWQ08gb2YgMjEwMCwgZGVmYXVsdAoJCTQyMDAwMDAwMCwgICAgICAgICAgICAgLy8gY3B1X2h6CgkJMSwgICAgICAgICAgICAgICAgICAgICAvLyBwZGl2CgkJNDIsICAgICAgICAgICAgICAgICAgICAvLyBuZGl2CgkJezUsIDIxLCA3LCA3LCA0MiwgNDJ9ICAvLyBwbGxfbWRpdnNbNl0KCX0sCgl7ICAvLyBWQ08gb2YgMjQwMAoJCTQwMDAwMDAwMCwgICAgICAgICAgICAgLy8gY3B1X2h6CgkJMSwgICAgICAgICAgICAgICAgICAgICAvLyBwZGl2CgkJNDgsICAgICAgICAgICAgICAgICAgICAvLyBuZGl2CgkJezYsIDI0LCA4LCA4LCA0OCwgNDh9ICAvLyBwbGxfbWRpdnNbNl0KCX0sCn07CgppbnQgY2xrX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQp7CgkvLyBUaGUgTU9DQV9SRC9NT0NBX1dSIG1hY3JvcyBuZWVkIGEgdmFsaWQgJ3ByaXYtPnBkZXYtPmRldicKCXN0YXRpYyBzdHJ1Y3QgbW9jYV9wcml2X2RhdGEgZHVtbXlfcHJpdjsgCglzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkdW1teV9wZDsKCXN0cnVjdCBtb2NhX3ByaXZfZGF0YSAqcHJpdiA9ICZkdW1teV9wcml2OwoJc3RydWN0IG1vY2FfNjgweF9jbGsgKiBwY2xrID0gKHN0cnVjdCBtb2NhXzY4MHhfY2xrICopIGNsazsKCXN0cnVjdCBtb2NhX3BsYXRmb3JtX2RhdGEgKiBwTW9jYURhdGEgPSAoc3RydWN0IG1vY2FfcGxhdGZvcm1fZGF0YSAqKXBjbGstPmRldi0+cGxhdGZvcm1fZGF0YTsKCXN0cnVjdCBtb2NhXzY4MDJjMF9jbG9ja19wYXJhbXMgKiBwX2Nsb2NrX2RhdGEgPSAmbW9jYV82ODAyYzBfY2xvY2tfcGFyYW1zWzBdOwoJdWludDMyX3QgaTsKCXVpbnQzMl90IGFkZHI7Cgl1aW50MzJfdCBkYXRhOwoJaW50IHJldCA9IC0xOwoKCXByaXYtPnBkZXYgPSAmZHVtbXlfcGQ7Cglwcml2LT5wZGV2LT5kZXYgPSAqcGNsay0+ZGV2OwoKCWlmIChwY2xrLT5jbG9ja19udW0gPT0gTU9DQV9DUFVfQ0xPQ0tfTlVNKQoJewoJCWlmICgocE1vY2FEYXRhLT5jaGlwX2lkICYgMHhGRkZGRkZGMCkgPT0gMHg2ODAyMDBDMCkKCQl7CgkJCWZvciAoaSA9IDA7IGkgPCBOVU1fNjgwMkMwX0NMT0NLX09QVElPTlM7IGkrKykKCQkJewoJCQkJaWYgKG1vY2FfNjgwMmMwX2Nsb2NrX3BhcmFtc1tpXS5jcHVfaHogPT0gcmF0ZSkKCQkJCXsKCQkJCQlwX2Nsb2NrX2RhdGEgPSAmbW9jYV82ODAyYzBfY2xvY2tfcGFyYW1zW2ldOwoJCQkJCXJldCA9IDA7CgkJCQl9CgkJCX0KCgkJCS8vIDEuIFNldCBQT1NUX0RJVklERVJfSE9MRF9DSHggKGJpdCBbMTJdIGluIGVhY2ggUExMX0NIQU5ORUxfQ1RSTF9DSF94IAoJCQkvLyAgICByZWdpc3RlcikgIC8vIHRoaXMgd2lsbCB6ZXJvIHRoZSBvdXRwdXQgY2hhbm5lbHMKCQkJZm9yIChhZGRyID0gMHgxMDEwMDAzYzsgYWRkciA8PSAweDEwMTAwMDUwOyBhZGRyICs9IDQpCgkJCXsKCQkJCU1PQ0FfU0VUKGFkZHIsICgxIDw8IDEyKSk7CgkJCX0KCgkJCS8vMi4gUHJvZ3JhbSBuZXcgUERJVi9ORElWIHZhbHVlLCB0aGlzIHdpbGwgbG9zZSBsb2NrIGFuZCAKCQkJLy8gICB0cmlnZ2VyIGEgbmV3IFBMTCBsb2NrIHByb2Nlc3MgZm9yIGEgbmV3IFZDTyBmcmVxdWVuY3kKCQkJTU9DQV9XUigweDEwMTAwMDU4LCAoKHBfY2xvY2tfZGF0YS0+cGRpdiA8PCAxMCkgfCBwX2Nsb2NrX2RhdGEtPm5kaXYpKTsKCgkJCS8vMy4gV2FpdCA+MTAgdXNlYyBmb3IgbG9jayB0aW1lIC8vIG1heCBsb2NrIHRpbWUgcGVyIGRhdGEgc2hlZXQgaXMgNDYwL0ZyZWYsIAoJCQkvLyAgIE9yIGFsdGVybmF0aXZlbHkgbW9uaXRvciBDTEtHRU5fUExMX1NZUypfUExMX0xPQ0tfU1RBVFVTIHRvIGNoZWNrIGlmIFBMTCBoYXMgbG9ja2VkCgkJCWRhdGEgPSAwOwoJCQlpID0gMDsKCQkJd2hpbGUgKChkYXRhICYgMHgxKSA9PSAwKQoJCQl7CgkJCQkvKiBUaGlzIHR5cGljYWxseSBpcyBvbmx5IHJlYWQgb25jZSAqLwoJCQkJZGF0YSA9IE1PQ0FfUkQoMHgxMDEwMDA2MCk7IC8vIENMS0dFTl9QTExfU1lTMV9QTExfTE9DS19TVEFUVVMKCgkJCQlpZiAoaSsrID4gMTApCgkJCQl7CgkJCQkJcHJpbnRrKCJNb0NBIFNZUzEgUExMIE5PVCBMT0NLRUQhXG4iKTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoKCQkJLy80LiBDb25maWd1cmUgbmV3IE1ESVYgdmFsdWUgYWxvbmcgd2l0aCBzZXQgUE9TVF9ESVZJREVSX0xPQURfRU5fQ0h4IAoJCQkvLyAgIChiaXQgWzEzXT0xLCB3aGlsZSBrZWVwIGJpdFsxMl09MSkgaW4gZWFjaCBQTExfQ0hBTk5FTF9DVFJMX0NIX3ggcmVnaXN0ZXIKCQkJaSA9IDA7CgkJCWZvciAoYWRkciA9IDB4MTAxMDAwM2M7IGFkZHIgPD0gMHgxMDEwMDA1MDsgYWRkciArPSA0KQoJCQl7CgkJCQlkYXRhID0gTU9DQV9SRChhZGRyKTsKCQkJCWRhdGEgfD0gKDEgPDwgMTMpOwoJCQkJZGF0YSAmPSB+KDB4RkYgPDwgMSk7CgkJCQlkYXRhIHw9IChwX2Nsb2NrX2RhdGEtPnBsbF9tZGl2c1tpXSA8PCAxKTsKCQkJCU1PQ0FfV1IoYWRkciwgZGF0YSk7CgkJCQlpKys7CgkJCX0KCgkJCS8vNS4gQ2xlYXIgYml0cyBbMTJdIGFuZCBiaXQgWzEzXSBpbiBlYWNoIFBMTF9DSEFOTkVMX0NUUkxfQ0hfeAoJCQlmb3IgKGFkZHIgPSAweDEwMTAwMDNjOyBhZGRyIDw9IDB4MTAxMDAwNTA7IGFkZHIgKz0gNCkKCQkJewoJCQkJTU9DQV9VTlNFVChhZGRyLCAoKDEgPDwgMTMpIHwgKDEgPDwgMTIpKSk7CgkJCX0KCgkJfQoJfQoKCXJldHVybihyZXQpOwp9Cgo=