LyoqCiAqIEBmaWxlIHNtc19tc2cuaAogKiBAYnJpZWYgtszP+8+i06bTw7bUzeLM4bmptcTP+8+ivLC94bm5zOWjrNb30qrKudPD1d+w/MCod2Vic2VydmVyvLB0cm82ObvyxuTL+9Om08MKICoKICogQ29weXJpZ2h0IChDKSAyMDE3IFNhbmVjaGlwcyBUZWNobm9sb2d5IENvLiwgTHRkLgogKiBAYXV0aG9yCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKi8KI2lmbmRlZiBfX1NNU19NU0dfSF9fCiNkZWZpbmUgX19TTVNfTVNHX0hfXwoKI2luY2x1ZGUgIm1lc3NhZ2UuaCIKCmVudW0gc21zX21zZ19jbWQgewoJTVNHX0NNRF9DT1BZX1NNUyA9IE1TR19DTURfU01TX0JBU0UsLy8weDQxMDAgICAgIC8q0rPD5reiy824tNbGtszQxcfrx/MqLwoJTVNHX0NNRF9TRU5EX1NNUywvL7bU06a94bm5zOVUX3pHb2FoZWFkTXNnQnVmCglNU0dfQ01EX0RFTF9TTVNfQllfSU5ERVgsLy+21NOmveG5uczlVF96VWZpU21zX0RlbFJlcQoJTVNHX0NNRF9ERUxfU01TX0JZX1RZUEUsCglNU0dfQ01EX1NNU19NT0RJRllfVEFHLC8vttTTpr3hubnM5VRfekdvYWhlYWRNc2dCdWYKCU1TR19DTURfRFJBRlRTX1NBVkUsLy+21NOmveG5uczlVF96R29haGVhZE1zZ0J1ZgoJTVNHX0NNRF9TTVNfTE9DQVRJT05fU0VULC8vttTTpr3hubnM5VRfekdvYWhlYWRNc2dCdWYKCU1TR19DTURfU01TX09VVERBVEVfQ0hFQ0ssLy/O3rLOyv0KCS8qKiotLS0tTVNHX0NNRF9TTVNfRU5EIDB4NDE4MCC6z7zGMTI4uPYtLS0tLS0tKi8KfTsKCi8qKioqKioqKioqKiq2zM/7z6LP4LnYz/vPorbU06a1xL3hubnM5WJlZ2luKioqKioqKioqKiovCiNkZWZpbmUgWlRFX01PREVNX1JFTEFZX01TR0JVRl9NQVhfTEVOIAkJCQk2MDAKI2lmZGVmIENPTkZJR19NSU5fOE1fVkVSU0lPTgojZGVmaW5lIFpURV9XTVNfREVMRVRFX0NPVU5UX01BWCAgICAgICAgIDIwCiNlbHNlCiNkZWZpbmUgWlRFX1dNU19ERUxFVEVfQ09VTlRfTUFYICAgICAgICAgMTAwCiNlbmRpZgoKdHlwZWRlZiBlbnVtIHsKCVpURV9NQ19TVEFURV9UWVBFLAkJCS8vbWFjaGluZSBzdGF0ZSBtYWludGFpbiB0eXBlCglaVEVfTURNX1JFQUxZX1RZUEUsCQkvL21kbSBtb2RlIHJlbGF5IHR5cGUKCVpURV9XQU5fUkVMQVlfVFlQRSwJCS8vd2FuIG1vZGUgIHJlbGF5IHR5cGUKCVpURV9MQU5fUkVMQVlfVFlQRSwJCQkvL2xhbiBtb2RlIHJlbGF5IHR5cGUKCVpURV9TTVNfUkVMQVlfVFlQRSwJCQkvL3Nob3J0bXNnIG1vZGUgIHJlbGF5IHR5cGUKCVpURV9QQk1fUkVMQVlfVFlQRSwJCQkvL3Bob25lYm9vayBtb2RlIHJlbGF5IHR5cGUKCVpURV9BVFNFUlZFUl9SRUxBWV9UWVBFLAkvL2F0IHNlcnZlciBtb2RlIHJlbGF5IHR5cGUKCVpURV9TTEVFUF9XQUtFVVBfUkVMQVlfVFlQRSwJCS8vIHJlbGF5IHNsZWVwIGFuZCB3YWtldXAgIHR5cGUKCVpURV9GT1RBX1JFTEFZX1RZUEUsICAgICAgICAgIC8vZm90YSBtb2RsZSByZWxheSB0eXBlCglaVEVfVVNTRF9SRUxBWV9UWVBFLAkJLy8gcmVsYXkgVVNTRHR5cGUKCVpURV9BUF9TVEFUSU9OX1JFTEFZX1RZUEUsCQkvLyByZWxheSBVU1NEdHlwZQoJWlRFX0JVWlpFUl9SRUxBWV9UWVBFLAkJLy8KCVpURV9NT0RFX1JFTEFZX1RZUEUsCQkvLwoJWlRFX0tFWV9SRUxBWV9UWVBFCQkvLwp9IHp0ZV9tY19tc2dfbW9kZV9lX3R5cGU7Cgp0eXBlZGVmIHN0cnVjdCB7Cgl6dGVfbWNfbXNnX21vZGVfZV90eXBlIHR5cGU7Cgl1bnNpZ25lZCBsb25nIAkJICAgaWQ7CglpbnQJCQkJICAgICAgIHJlc3VsdDsKfSB6dGVfbWNfbXNnX2hkcl9zX3R5cGU7CgovL01TR19DTURfU0VORF9TTVMvTVNHX0NNRF9TTVNfTU9ESUZZX1RBRy9NU0dfQ01EX0RSQUZUU19TQVZFz/vPoreiy83KudPDuMOyzsr9CnR5cGVkZWYgc3RydWN0IHsKCXp0ZV9tY19tc2dfaGRyX3NfdHlwZSAgbXNnX2hkcjsJCQkJLy90aGUgbWVzc2FnZSBoZWFkZXIKCXVuc2lnbmVkIGxvbmcgCQkJbXNnX2xlbjsJCQkJLy90aGUgbWVzc2FnZSBsZW4KCXVuc2lnbmVkIGNoYXIJCQkgICBtc2dfZGF0YVtaVEVfTU9ERU1fUkVMQVlfTVNHQlVGX01BWF9MRU5dOyAgIC8vdGhlIG1lc3NhZ2UgZGF0YQp9IFRfekdvYWhlYWRNc2dCdWY7CgoKLy9NU0dfQ01EX0RFTF9TTVNfQllfSU5ERVjP+8+it6LLzcq508O4w7LOyv0KdHlwZWRlZiBzdHJ1Y3QgewoJdW5zaWduZWQgY2hhciBhbGxfb3JfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyphbGxfb3JfY291bnQ9MC0tLT5kZWxldGUgYWxsLG90aGVycy0tLT5kZWxldGUgcGFydGlhbCBzbXMqLwoJaW50IGlkW1pURV9XTVNfREVMRVRFX0NPVU5UX01BWF07Cgl1bnNpZ25lZCBjaGFyIHNxbFsyXTsKfSBUX3pVZmlTbXNfRGVsUmVxOwoKLyoqKioqKioqKioqKrbMz/vPos/gudjP+8+ittTTprXEveG5uczlZW5kKioqKioqKioqKiovCgoKLy/UtNfUc21zX2NvbS5oo6y5qXdlYnNlcnZlcsq508MKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqILOjwb+2qNLlx/gKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNkZWZpbmUgWlRFX1dNU19NRVNTQUdFX0xJU1RfTUFYICAgICAgICAgMjU1CiNkZWZpbmUgWlRFX1dNU19EQl9FWEVDU1FMX0xFTiAgICAgICAgICAgMTAyNAojZGVmaW5lIFpURV9XTVNfU0VORF9OVU1fTUFYICAgICAgICAgICAgIDUKI2RlZmluZSBaVEVfV01TX0FERFJFU1NfTEVOX01BWCAgICAgICAgICAzMgojZGVmaW5lIFpURV9XTVNfU01TX0NPVU5UX01BWCAgICAgICAgICAgIDEwCiNkZWZpbmUgWlRFX1dNU19EQl9NU0dfQ09VTlRfTUFYICAgICAgICAgKFpURV9XTVNfREVMRVRFX0NPVU5UX01BWCkKI2RlZmluZSBaVEVfV01TX0NPTkNBVF9TTVNfQ09VTlRfTUFYICAgICAxMAojZGVmaW5lIFpURV9XTVNfU01TX01TR19DT05URU5UX0xFTl9NQVggIDE2MAojZGVmaW5lIFpURV9XTVNfQUREUkVTU19ESUdJVF9NQVhfVjAxICAJIDIxCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogyv2+3b3hubm2qNLlx/gKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIHNtc7XEstnX98Dg0M0gKi8KdHlwZWRlZiBlbnVtIHsKCVdNU19TTVNfQ01EX05PTkUgPSAwLAoKCVdNU19TTVNfQ01EX0lOSVQsCglXTVNfU01TX0NNRF9HRVRfTUVNX0NBUEFCSUxJVFksCgoJV01TX1NNU19DTURfQ0ZHX1NFVF9QQVJBTUVURVJTLAoJV01TX1NNU19DTURfTVNHX1NFTkQsCglXTVNfU01TX0NNRF9NU0dfV1JJVEUsCglXTVNfU01TX0NNRF9NU0dfREVMRVRFLAoJV01TX1NNU19DTURfTVNHX01PRElGWV9UQUcsCglXTVNfU01TX0NNRF9NU0dfUkVQTFksCgoJV01TX1NNU19DTURfU01TX0lOSVRfTE9BRCwKCVdNU19TTVNfQ01EX1NNU19MT0FEX0NPTVBMRVRFLAoKCVdNU19TTVNfQ01EX1JFQ0VJVkVfTVNHLAoJV01TX1NNU19DTURfU0xFRVBfV0FLRVVQLAoKCVdNU19TTVNfQ01EX1JFU1RPUkUsCgoJV01TX1NNU19DTURfV01TX01BWAp9IFRfelVmaVNtc19DbWRUeXBlOwoKdHlwZWRlZiBlbnVtIHsKCVdNU19DTURfTk9ORSA9IDB4MDAsCglXTVNfQ01EX1BST0NFU1NJTkcsCglXTVNfQ01EX0ZBSUxFRCwKCVdNU19DTURfU1VDQ0VTUywKCVdNU19DTURfQ09ORkxJQ1QsICAgICAgICAvKldIRU4gZGIgZGF0YSBjb25mbGljdCB3aXRoIHNpbSBjYXJkIG9yIG52ICovCglXTVNfQ01EX1NUQVRVU19NQVggPSAweDEwMDAKfSBUX3pVZmlTbXNfQ21kU3RhdHVzOwoKCnR5cGVkZWYgZW51bSB7CglaVEVfU01TX0NNU19OT05FICAgICAgICAgICAgICAgPSAwLAoJWlRFX1NNU19DTVNfTUVfRkFJTFVSRSAgICAgICAgID0gMzAwLAoJWlRFX1NNU19DTVNfU0VSVklDRV9SRVNFUlZFRCAgID0gMzAxLAoJWlRFX1NNU19DTVNfT1BfTk9UX0FMTE9XRUQgICAgID0gMzAyLAoJWlRFX1NNU19DTVNfT1BfTk9UX1NVUFBPUlRFRCAgID0gMzAzLAoJWlRFX1NNU19DTVNfSU5WQUxJRF9QRFVfUEFSQU0gID0gMzA0LAoJWlRFX1NNU19DTVNfSU5WQUxJRF9UWFRfUEFSQU0gID0gMzA1LAoJWlRFX1NNU19DTVNfU0lNX05PVF9JTlNFUlRFRCAgID0gMzEwLAoJWlRFX1NNU19DTVNfU0lNX1BJTl9SRVEgICAgICAgID0gMzExLAoJWlRFX1NNU19DTVNfUEhTSU1fUElOX1JFUSAgICAgID0gMzEyLAoJWlRFX1NNU19DTVNfU0lNX0ZBSUxVUkUgICAgICAgID0gMzEzLAoJWlRFX1NNU19DTVNfU0lNX0JVU1kgICAgICAgICAgID0gMzE0LAoJWlRFX1NNU19DTVNfU0lNX1dST05HICAgICAgICAgID0gMzE1LAoJWlRFX1NNU19DTVNfU0lNX1BVS19SRVEgICAgICAgID0gMzE2LAoJWlRFX1NNU19DTVNfU0lNX1BJTjJfUkVRICAgICAgID0gMzE3LAoJWlRFX1NNU19DTVNfU0lNX1BVSzJfUkVRICAgICAgID0gMzE4LAoJWlRFX1NNU19DTVNfTUVNX0ZBSUxVUkUgICAgICAgID0gMzIwLAoJWlRFX1NNU19DTVNfSU5WQUxJRF9JTkRFWCAgICAgID0gMzIxLAoJWlRFX1NNU19DTVNfTUVNX0ZVTEwgICAgICAgICAgID0gMzIyLAoJWlRFX1NNU19DTVNfU0NBX0FERFJfVU5LTk9XTiAgID0gMzMwLAoJWlRFX1NNU19DTVNfTk9fU0VSVklDRSAgICAgICAgID0gMzMxLAoJWlRFX1NNU19DTVNfTkVUV09SS19USU1FT1VUICAgID0gMzMyLAoJWlRFX1NNU19DTVNfQ05NQV9OT1RfRVhQICAgICAgID0gMzQwLAoJWlRFX1NNU19DTVNfVU5LTk9XTl9FUlIgICAgICAgID0gNTAwLAoJWlRFX1NNU19DTVNfTUFYICAgICAgICAgICAgICAgID0gNTEyCn0gVF96VWZpU21zX0Vycm9yVHlwZTsKCgovL7Wxx7DB97PMtcTXtMys0MXPogp0eXBlZGVmIHN0cnVjdCB7CglUX3pVZmlTbXNfQ21kVHlwZSBjbWQ7IC8vtbHHsLXE0rXO8cH3s8yx6rzHo6y3oqGiytWhosm+tcgKCVRfelVmaVNtc19DbWRTdGF0dXMgY21kX3N0YXR1czsKCVRfelVmaVNtc19FcnJvclR5cGUgZXJyX2NvZGU7CglpbnQgc2VuZF9mYWlsZWRfY291bnQ7CglpbnQgZGVsZXRlX2ZhaWxlZF9jb3VudDsKfSBUX3pVZmlTbXNfU3RhdHVzSW5mbzsKCi8q0N64xLLOyv0qLwp0eXBlZGVmIHN0cnVjdCB7Cgl1bnNpZ25lZCBjaGFyIHRhZ3M7Cgl1bnNpZ25lZCBpbnQgdG90YWxfaWQ7Cgl1bnNpZ25lZCBpbnQgdHlwZTsKCXVuc2lnbmVkIGludCBpZFtaVEVfV01TX0RCX01TR19DT1VOVF9NQVhdOwp9IFRfelVmaVNtc19Nb2RpZnlGbGFnOwoKdHlwZWRlZiBzdHJ1Y3QgewoJdW5zaWduZWQgY2hhciBzY2FbWlRFX1dNU19BRERSRVNTX0RJR0lUX01BWF9WMDEgKyAxXTsgICAgLypyZWFkIGZyb20gdGhlIHNpbSBjYXJkLG51bGwgdGVybWluYXRlZCAqLwoJdW5zaWduZWQgaW50IG1lbV9zdG9yZTsgICAgICAgICAgICAvKrTmtKLOu9bDo6wgU2ltu/JOdiovCgl1bnNpZ25lZCBpbnQgdHBfdmFsaWRpdHlfcGVyaW9kOyAgICAgICAgICAgICAgICAgICAgLyogWzAsMjU1XSwgaW5pdGlhbCB2YXVsZT0yNTUgKi8KCXVuc2lnbmVkIGludCBzdGF0dXNfcmVwb3J0X29uOyAgICAgICAgICAgICAgICAgICAgICAgIC8qMS0tPm9wZW4sIDAtLT5jbG9zZSwgaW5pdGlhbCB2YXVlPTAgKi8KCXVuc2lnbmVkIGludCBzZW5kZmFpbF9yZXRyeV9vbjsgICAgICAgICAgICAgICAgICAgICAgICAvKjEtLT5vcGVuLCAwLS0+Y2xvc2UsIGluaXRpYWwgdmF1ZT0wICovCgl1bnNpZ25lZCBpbnQgb3V0ZGF0ZV9kZWxldGVfb247ICAgICAgICAgICAgICAgICAgICAgICAgLyoxLS0+b3BlbiwgMC0tPmNsb3NlLCBpbml0aWFsIHZhdWU9MCAqLwoJdW5zaWduZWQgY2hhciBkZWZhdWx0X3N0b3JlWzEwXTsgICAgICAgICAgICAgICAgICAgICAgICAvKm52LCBzaW0sIGluaXRpYWwgdmF1ZT1udiAqLwp9IHp0ZV93bXNfcGFyYW1ldGVyX2luZm9fc190eXBlLCBUX3pVZmlTbXNfUGFyYUluZm87CgoKdHlwZWRlZiBzdHJ1Y3QgewoJdW5zaWduZWQgY2hhciB5ZWFyWzVdOwoJdW5zaWduZWQgY2hhciBtb250aFszXTsKCXVuc2lnbmVkIGNoYXIgZGF5WzNdOwoJdW5zaWduZWQgY2hhciBob3VyWzNdOwoJdW5zaWduZWQgY2hhciBtaW5bM107Cgl1bnNpZ25lZCBjaGFyIHNlY1szXTsKCXVuc2lnbmVkIGNoYXIgdGltZXpvbmVbNF07Ly/Ksbzk0qq4+tfFyrHH+Nf20Km199X7Cn0gVF96VWZpU21zX0RhdGU7CgovKiC3orbM0MUgKi8KdHlwZWRlZiBzdHJ1Y3QgewoJdW5zaWduZWQgY2hhciByZWNlaXZlcl9jb3VudDsKCXVuc2lnbmVkIGNoYXIgbWVtX3N0b3JlOyAvL7bM0MW05rSizrvWw6Osu/K/qKOsu/JOVgoJdW5zaWduZWQgY2hhciBkZXN0X251bVtaVEVfV01TX1NFTkRfTlVNX01BWF1bWlRFX1dNU19BRERSRVNTX0xFTl9NQVggKyAxXTsgLy/K1bz+yMsKCXVuc2lnbmVkIHNob3J0IG1zZ19sZW47CgoJdW5zaWduZWQgY2hhciBkY3M7ICAvKiCx4MLruPHKvSAxLS0+QVNDSUksIDItLT5VTklDT0RFLCAzLS0+R1NNNyBTUEFOSVNILCA0LS0+R1NNNyBERUZBVUxULCA1LS0+R1NNNyBQT1JUVUdVRVNFKi8KCXVuc2lnbmVkIGNoYXIgdGFnczsgLyogtszQxcrVt6LXtMysICovCgl1bnNpZ25lZCBjaGFyIGlzRGVsZXRlOyAgLy/WwzHU8tDoyb6z/bjDtszQxQoKCWxvbmcgaWQ7IC8vILbM0MW1xMv30v0sd2Viyc/Qwr2otszQxczuLTGjrLLduOXP5NbQtcS2zNDFt6LLzcqx0K+0+Mr9vt2/4s6qxuS31sXktcRpZAoJVF96VWZpU21zX0RhdGUgZGF0ZTsKCXVuc2lnbmVkIGNoYXIgZHJhZnRfZ3JvdXBfaWRbMzJdOyAvL7Tmst245cqxyrnTwwp9IFRfelVmaVNtc19TZW5kUmVxLCBUX3pVZmlTbXNfU2F2ZVJlcTsKCgojZW5kaWYK