LyoKICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IFT2cvZrIEVkdmluIDxlZHdpbkBjbGFtYXYubmV0PgogKgogKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIAogKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCiAqICBNQSAwMjExMC0xMzAxLCBVU0EuCiAqLwoKCiNpZm5kZWYgX1BISVNIX0NIRUNLX0gKI2RlZmluZSBfUEhJU0hfQ0hFQ0tfSAoKI2luY2x1ZGUgInJlZ2V4LmgiCgojZGVmaW5lIENMX1BISVNIX0JBU0UgMTAwCmVudW0gcGhpc2hfc3RhdHVzIHtDTF9QSElTSF9OT0RFQ0lTSU9OPTAsQ0xfUEhJU0hfQ0xFQU49Q0xfUEhJU0hfQkFTRSwgQ0xfUEhJU0hfQ0xFQU5VUF9PSyxDTF9QSElTSF9IT1NUX09LLCBDTF9QSElTSF9ET01BSU5fT0ssCglDTF9QSElTSF9IT1NUX05PVF9MSVNURUQsCglDTF9QSElTSF9SRURJUl9PSywgQ0xfUEhJU0hfSE9TVF9SRURJUl9PSywgQ0xfUEhJU0hfRE9NQUlOX1JFRElSX09LLAoJQ0xfUEhJU0hfSE9TVF9SRVZFUlNFX09LLENMX1BISVNIX0RPTUFJTl9SRVZFUlNFX09LLAoJQ0xfUEhJU0hfV0hJVEVMSVNURUQsQ0xfUEhJU0hfSE9TVF9XSElURUxJU1RFRCwKCUNMX1BISVNIX0NMRUFOX0NJRCwKCUNMX1BISVNIX1RFWFRVUkwsIENMX1BISVNIX01BSUxUT19PSywKCUNMX1BISVNIX0NMT0FLRURfVUlVLCBDTF9QSElTSF9OVU1FUklDX0lQLENMX1BISVNIX0hFWF9VUkwsQ0xfUEhJU0hfQ0xPQUtFRF9OVUxMLENMX1BISVNIX1NTTF9TUE9PRiwgQ0xfUEhJU0hfTk9NQVRDSH07CgojZGVmaW5lIEhPU1RfU1VGRklDSUVOVCAgIDEKI2RlZmluZSBET01BSU5fU1VGRklDSUVOVCAoSE9TVF9TVUZGSUNJRU5UIHwgMikKI2RlZmluZSBET19SRVZFUlNFX0xPT0tVUCA0CiNkZWZpbmUgQ0hFQ0tfUkVESVIgICAgICAgOAojZGVmaW5lIENIRUNLX1NTTCAgICAgICAgIDE2CiNkZWZpbmUgQ0hFQ0tfQ0xPQUtJTkcgICAgMzIKI2RlZmluZSBDTEVBTlVQX1VSTCAgICAgICA2NAojZGVmaW5lIENIRUNLX0RPTUFJTl9SRVZFUlNFIDEyOAojZGVmaW5lIENIRUNLX0lNR19VUkwgICAgICAgIDI1NgojZGVmaW5lIERPTUFJTkxJU1RfUkVRVUlSRUQgIDUxMgovKiBpbWcgY2hlY2tpbmcgZGlzYWJsZWQgYnkgZGVmYXVsdCAqLwoKI2RlZmluZSBMSU5LVFlQRV9JTUFHRSAgICAgMQoKI2RlZmluZSBDTF9QSElTSF9BTExfQ0hFQ0tTIChDTEVBTlVQX1VSTHxET01BSU5fU1VGRklDSUVOVHxDSEVDS19TU0x8Q0hFQ0tfQ0xPQUtJTkd8Q0hFQ0tfSU1HX1VSTCkKCnN0cnVjdCBzdHJpbmcgewoJaW50IHJlZmNvdW50OwoJc3RydWN0IHN0cmluZyogcmVmOwoJY2hhciogZGF0YTsKfTsKCnN0cnVjdCBwaGlzaGNoZWNrIHsKCXJlZ2V4X3QgcHJlZzsKCXJlZ2V4X3QgcHJlZ19yZWFsdXJsOwoJcmVnZXhfdCBwcmVnX3RsZDsKCXJlZ2V4X3QgcHJlZ19jY3RsZDsKCXJlZ2V4X3QgcHJlZ19udW1lcmljOwoJcmVnZXhfdCBwcmVnX2hleHVybDsKCWludCAgICAgIGlzX2Rpc2FibGVkOwp9OwoKc3RydWN0IHByZV9maXh1cF9pbmZvIHsKCS8qIHByZV8qIHVybCBiZWZvcmUgZml4dXBfc3BhY2VzICovCglzdHJ1Y3Qgc3RyaW5nIHByZV9kaXNwbGF5TGluazsKCXNpemVfdCBob3N0X3N0YXJ0OwoJc2l6ZV90IGhvc3RfZW5kOwp9OwoKc3RydWN0IHVybF9jaGVjayB7CglzdHJ1Y3Qgc3RyaW5nIHJlYWxMaW5rOwoJc3RydWN0IHN0cmluZyBkaXNwbGF5TGluazsKCXN0cnVjdCBwcmVfZml4dXBfaW5mbyBwcmVfZml4dXA7Cgl1bnNpZ25lZCBzaG9ydCAgICAgICBmbGFnczsKCXVuc2lnbmVkIHNob3J0IGFsd2F5c19jaGVja19mbGFnczsKCXVuc2lnbmVkIHNob3J0ICAgICAgIGxpbmtfdHlwZTsKfTsKCiNpZmRlZiBfTUVTU0FHRV9ICmludCBwaGlzaGluZ1NjYW4obWVzc2FnZSogbSxjb25zdCBjaGFyKiBkaXIsY2xpX2N0eCogY3R4LHRhZ19hcmd1bWVudHNfdCogaHJlZnMpOwojZW5kaWYKCnZvaWQgcGhpc2hfZGlzYWJsZShzdHJ1Y3QgY2xfZW5naW5lKiBlbmdpbmUsY29uc3QgY2hhciogcmVhc29uKTsKLyogR2xvYmFsLCBub24tdGhyZWFkLXNhZmUgZnVuY3Rpb25zLCBjYWxsIG9ubHkgb25jZSEgKi8KaW50IHBoaXNoaW5nX2luaXQoc3RydWN0IGNsX2VuZ2luZSogZW5naW5lKTsKdm9pZCBwaGlzaGluZ19kb25lKHN0cnVjdCBjbF9lbmdpbmUqIGVuZ2luZSk7Ci8qIGVuZCBvZiBub24tdGhyZWFkLXNhZmUgZnVuY3Rpb25zICovCgoKI2VuZGlmCgo=