LyoKICogKEMpIENvcHlyaWdodCAyMDAzCiAqIERhdmlkIE38bGxlciBFTFNPRlQgQUcgU3dpdHplcmxhbmQuIGQubXVlbGxlckBlbHNvZnQuY2gKICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgovKgogKiBEYXRlICYgVGltZSBzdXBwb3J0IGZvciB0aGUgYnVpbHQtaW4gU2Ftc3VuZyBTM0MyNFgwIFJUQwogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbW1hbmQuaD4KCiNpZiAoZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpKQoKI2lmIGRlZmluZWQoQ09ORklHX1MzQzI0MDApCiNpbmNsdWRlIDxzM2MyNDAwLmg+CiNlbGlmIGRlZmluZWQoQ09ORklHX1MzQzI0MTApCiNpbmNsdWRlIDxzM2MyNDEwLmg+CiNlbmRpZgoKI2luY2x1ZGUgPHJ0Yy5oPgoKLyojZGVmaW5lCURFQlVHKi8KCnR5cGVkZWYgZW51bSB7CglSVENfRU5BQkxFLAoJUlRDX0RJU0FCTEUKfSBSVENfQUNDRVNTOwoKCnN0YXRpYyBpbmxpbmUgdm9pZCBTZXRSVENfQWNjZXNzKFJUQ19BQ0NFU1MgYSkKewoJUzNDMjRYMF9SVEMgKiBjb25zdCBydGMgPSBTM0MyNFgwX0dldEJhc2VfUlRDKCk7Cglzd2l0Y2ggKGEpIHsKCQljYXNlIFJUQ19FTkFCTEU6CgkJCXJ0Yy0+UlRDQ09OIHw9IDB4MDE7IGJyZWFrOwoKCQljYXNlIFJUQ19ESVNBQkxFOgoJCQlydGMtPlJUQ0NPTiAmPSB+MHgwMTsgYnJlYWs7Cgl9Cn0KCnN0YXRpYyB1bnNpZ25lZCBiY2QyYmluICh1Y2hhciBuKQp7CglyZXR1cm4gKCgoKG4gPj4gNCkgJiAweDBGKSAqIDEwKSArIChuICYgMHgwRikpOwp9CgpzdGF0aWMgdW5zaWduZWQgY2hhciBiaW4yYmNkICh1bnNpZ25lZCBpbnQgbikKewoJcmV0dXJuICgoKG4gLyAxMCkgPDwgNCkgfCAobiAlIDEwKSk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmludCBydGNfZ2V0IChzdHJ1Y3QgcnRjX3RpbWUgKnRtcCkKewoJUzNDMjRYMF9SVEMgKiBjb25zdCBydGMgPSBTM0MyNFgwX0dldEJhc2VfUlRDKCk7Cgl1Y2hhciBzZWMsIG1pbiwgaG91ciwgbWRheSwgd2RheSwgbW9uLCB5ZWFyOwoJdWNoYXIgYV9zZWMsYV9taW4sIGFfaG91ciwgYV9kYXRlLCBhX21vbiwgYV95ZWFyLCBhX2FybWVkOwoKCS8qIGVuYWJsZSBhY2Nlc3MgdG8gUlRDIHJlZ2lzdGVycyAqLwoJU2V0UlRDX0FjY2VzcyhSVENfRU5BQkxFKTsKCgkvKiByZWFkIFJUQyByZWdpc3RlcnMgKi8KCWRvIHsKCQlzZWMJPSBydGMtPkJDRFNFQzsKCQltaW4JPSBydGMtPkJDRE1JTjsKCQlob3VyCT0gcnRjLT5CQ0RIT1VSOwoJCW1kYXkJPSBydGMtPkJDRERBVEU7CgkJd2RheQk9IHJ0Yy0+QkNEREFZOwoJCW1vbgk9IHJ0Yy0+QkNETU9OOwoJCXllYXIJPSBydGMtPkJDRFlFQVI7Cgl9IHdoaWxlIChzZWMgIT0gcnRjLT5CQ0RTRUMpOwoKCS8qIHJlYWQgQUxBUk0gcmVnaXN0ZXJzICovCglhX3NlYwk9IHJ0Yy0+QUxNU0VDOwoJYV9taW4JPSBydGMtPkFMTU1JTjsKCWFfaG91cgk9IHJ0Yy0+QUxNSE9VUjsKCWFfZGF0ZQk9IHJ0Yy0+QUxNREFURTsKCWFfbW9uCT0gcnRjLT5BTE1NT047CglhX3llYXIJPSBydGMtPkFMTVlFQVI7CglhX2FybWVkCT0gcnRjLT5SVENBTE07CgoJLyogZGlzYWJsZSBhY2Nlc3MgdG8gUlRDIHJlZ2lzdGVycyAqLwoJU2V0UlRDX0FjY2VzcyhSVENfRElTQUJMRSk7CgojaWZkZWYgUlRDX0RFQlVHCglwcmludGYgKCAiR2V0IFJUQyB5ZWFyOiAlMDJ4IG1vbi9jZW50OiAlMDJ4IG1kYXk6ICUwMnggd2RheTogJTAyeCAiCgkJImhyOiAlMDJ4IG1pbjogJTAyeCBzZWM6ICUwMnhcbiIsCgkJeWVhciwgbW9uLCBtZGF5LCB3ZGF5LAoJCWhvdXIsIG1pbiwgc2VjKTsKCXByaW50ZiAoICJBbGFybXM6ICUwMng6IHllYXI6ICUwMnggbW9udGg6ICUwMnggZGF0ZTogJTAyeCBob3VyOiAlMDJ4IG1pbjogJTAyeCBzZWM6ICUwMnhcbiIsCgkJYV9hcm1lZCwKCQlhX3llYXIsIGFfbW9uLCBhX2RhdGUsCgkJYV9ob3VyLCBhX21pbiwgYV9zZWMpOwojZW5kaWYKCgl0bXAtPnRtX3NlYyAgPSBiY2QyYmluKHNlYyAgJiAweDdGKTsKCXRtcC0+dG1fbWluICA9IGJjZDJiaW4obWluICAmIDB4N0YpOwoJdG1wLT50bV9ob3VyID0gYmNkMmJpbihob3VyICYgMHgzRik7Cgl0bXAtPnRtX21kYXkgPSBiY2QyYmluKG1kYXkgJiAweDNGKTsKCXRtcC0+dG1fbW9uICA9IGJjZDJiaW4obW9uICYgMHgxRik7Cgl0bXAtPnRtX3llYXIgPSBiY2QyYmluKHllYXIpOwoJdG1wLT50bV93ZGF5ID0gYmNkMmJpbih3ZGF5ICYgMHgwNyk7CglpZih0bXAtPnRtX3llYXI8NzApCgkJdG1wLT50bV95ZWFyKz0yMDAwOwoJZWxzZQoJCXRtcC0+dG1feWVhcis9MTkwMDsKCXRtcC0+dG1feWRheSA9IDA7Cgl0bXAtPnRtX2lzZHN0PSAwOwojaWZkZWYgUlRDX0RFQlVHCglwcmludGYgKCAiR2V0IERBVEU6ICU0ZC0lMDJkLSUwMmQgKHdkYXk9JWQpICBUSU1FOiAlMmQ6JTAyZDolMDJkXG4iLAoJCXRtcC0+dG1feWVhciwgdG1wLT50bV9tb24sIHRtcC0+dG1fbWRheSwgdG1wLT50bV93ZGF5LAoJCXRtcC0+dG1faG91ciwgdG1wLT50bV9taW4sIHRtcC0+dG1fc2VjKTsKI2VuZGlmCgoJcmV0dXJuIDA7Cn0KCnZvaWQgcnRjX3NldCAoc3RydWN0IHJ0Y190aW1lICp0bXApCnsKCVMzQzI0WDBfUlRDICogY29uc3QgcnRjID0gUzNDMjRYMF9HZXRCYXNlX1JUQygpOwoJdWNoYXIgc2VjLCBtaW4sIGhvdXIsIG1kYXksIHdkYXksIG1vbiwgeWVhcjsKCiNpZmRlZiBSVENfREVCVUcKCXByaW50ZiAoICJTZXQgREFURTogJTRkLSUwMmQtJTAyZCAod2RheT0lZCkgIFRJTUU6ICUyZDolMDJkOiUwMmRcbiIsCgkJdG1wLT50bV95ZWFyLCB0bXAtPnRtX21vbiwgdG1wLT50bV9tZGF5LCB0bXAtPnRtX3dkYXksCgkJdG1wLT50bV9ob3VyLCB0bXAtPnRtX21pbiwgdG1wLT50bV9zZWMpOwojZW5kaWYKCXllYXIJPSBiaW4yYmNkKHRtcC0+dG1feWVhciAlIDEwMCk7Cgltb24JPSBiaW4yYmNkKHRtcC0+dG1fbW9uKTsKCXdkYXkJPSBiaW4yYmNkKHRtcC0+dG1fd2RheSk7CgltZGF5CT0gYmluMmJjZCh0bXAtPnRtX21kYXkpOwoJaG91cgk9IGJpbjJiY2QodG1wLT50bV9ob3VyKTsKCW1pbgk9IGJpbjJiY2QodG1wLT50bV9taW4pOwoJc2VjCT0gYmluMmJjZCh0bXAtPnRtX3NlYyk7CgoJLyogZW5hYmxlIGFjY2VzcyB0byBSVEMgcmVnaXN0ZXJzICovCglTZXRSVENfQWNjZXNzKFJUQ19FTkFCTEUpOwoKCS8qIHdyaXRlIFJUQyByZWdpc3RlcnMgKi8KCXJ0Yy0+QkNEU0VDCT0gc2VjOwoJcnRjLT5CQ0RNSU4JPSBtaW47CglydGMtPkJDREhPVVIJPSBob3VyOwoJcnRjLT5CQ0REQVRFCT0gbWRheTsKCXJ0Yy0+QkNEREFZCT0gd2RheTsKCXJ0Yy0+QkNETU9OCT0gbW9uOwoJcnRjLT5CQ0RZRUFSCT0geWVhcjsKCgkvKiBkaXNhYmxlIGFjY2VzcyB0byBSVEMgcmVnaXN0ZXJzICovCglTZXRSVENfQWNjZXNzKFJUQ19ESVNBQkxFKTsKfQoKdm9pZCBydGNfcmVzZXQgKHZvaWQpCnsKCVMzQzI0WDBfUlRDICogY29uc3QgcnRjID0gUzNDMjRYMF9HZXRCYXNlX1JUQygpOwoKCXJ0Yy0+UlRDQ09OID0gKHJ0Yy0+UlRDQ09OICYgfjB4MDYpIHwgMHgwODsKCXJ0Yy0+UlRDQ09OICY9IH4oMHgwOHwweDAxKTsKfQoKI2VuZGlmCg==