LyoKICogKEMpIENvcHlyaWdodCAyMDAzCiAqIERhdmlkIE38bGxlciBFTFNPRlQgQUcgU3dpdHplcmxhbmQuIGQubXVlbGxlckBlbHNvZnQuY2gKICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgovKgogKiBEYXRlICYgVGltZSBzdXBwb3J0IGZvciB0aGUgYnVpbHQtaW4gU2Ftc3VuZyBTM0MyNFgwIFJUQwogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbW1hbmQuaD4KCiNpZiBkZWZpbmVkKENPTkZJR19SVENfUzNDMjRYMCkgJiYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKSkKCiNpZiBkZWZpbmVkKENPTkZJR19TM0MyNDAwKQojaW5jbHVkZSA8czNjMjQwMC5oPgojZWxpZiBkZWZpbmVkKENPTkZJR19TM0MyNDEwKQojaW5jbHVkZSA8czNjMjQxMC5oPgojZW5kaWYKCiNpbmNsdWRlIDxydGMuaD4KCi8qI2RlZmluZQlERUJVRyovCgp0eXBlZGVmIGVudW0gewoJUlRDX0VOQUJMRSwKCVJUQ19ESVNBQkxFCn0gUlRDX0FDQ0VTUzsKCgpzdGF0aWMgaW5saW5lIHZvaWQgU2V0UlRDX0FjY2VzcyhSVENfQUNDRVNTIGEpCnsKCVMzQzI0WDBfUlRDICogY29uc3QgcnRjID0gUzNDMjRYMF9HZXRCYXNlX1JUQygpOwoJc3dpdGNoIChhKSB7CgkJY2FzZSBSVENfRU5BQkxFOgoJCQlydGMtPlJUQ0NPTiB8PSAweDAxOyBicmVhazsKCgkJY2FzZSBSVENfRElTQUJMRToKCQkJcnRjLT5SVENDT04gJj0gfjB4MDE7IGJyZWFrOwoJfQp9CgpzdGF0aWMgdW5zaWduZWQgYmNkMmJpbiAodWNoYXIgbikKewoJcmV0dXJuICgoKChuID4+IDQpICYgMHgwRikgKiAxMCkgKyAobiAmIDB4MEYpKTsKfQoKc3RhdGljIHVuc2lnbmVkIGNoYXIgYmluMmJjZCAodW5zaWduZWQgaW50IG4pCnsKCXJldHVybiAoKChuIC8gMTApIDw8IDQpIHwgKG4gJSAxMCkpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgp2b2lkIHJ0Y19nZXQgKHN0cnVjdCBydGNfdGltZSAqdG1wKQp7CglTM0MyNFgwX1JUQyAqIGNvbnN0IHJ0YyA9IFMzQzI0WDBfR2V0QmFzZV9SVEMoKTsKCXVjaGFyIHNlYywgbWluLCBob3VyLCBtZGF5LCB3ZGF5LCBtb24sIHllYXI7Cgl1Y2hhciBhX3NlYyxhX21pbiwgYV9ob3VyLCBhX2RhdGUsIGFfbW9uLCBhX3llYXIsIGFfYXJtZWQ7CgoJLyogZW5hYmxlIGFjY2VzcyB0byBSVEMgcmVnaXN0ZXJzICovCglTZXRSVENfQWNjZXNzKFJUQ19FTkFCTEUpOwoKCS8qIHJlYWQgUlRDIHJlZ2lzdGVycyAqLwoJZG8gewoJCXNlYwk9IHJ0Yy0+QkNEU0VDOwoJCW1pbgk9IHJ0Yy0+QkNETUlOOwoJCWhvdXIJPSBydGMtPkJDREhPVVI7CgkJbWRheQk9IHJ0Yy0+QkNEREFURTsKCQl3ZGF5CT0gcnRjLT5CQ0REQVk7CgkJbW9uCT0gcnRjLT5CQ0RNT047CgkJeWVhcgk9IHJ0Yy0+QkNEWUVBUjsKCX0gd2hpbGUgKHNlYyAhPSBydGMtPkJDRFNFQyk7CgoJLyogcmVhZCBBTEFSTSByZWdpc3RlcnMgKi8KCWFfc2VjCT0gcnRjLT5BTE1TRUM7CglhX21pbgk9IHJ0Yy0+QUxNTUlOOwoJYV9ob3VyCT0gcnRjLT5BTE1IT1VSOwoJYV9kYXRlCT0gcnRjLT5BTE1EQVRFOwoJYV9tb24JPSBydGMtPkFMTU1PTjsKCWFfeWVhcgk9IHJ0Yy0+QUxNWUVBUjsKCWFfYXJtZWQJPSBydGMtPlJUQ0FMTTsKCgkvKiBkaXNhYmxlIGFjY2VzcyB0byBSVEMgcmVnaXN0ZXJzICovCglTZXRSVENfQWNjZXNzKFJUQ19ESVNBQkxFKTsKCiNpZmRlZiBSVENfREVCVUcKCXByaW50ZiAoICJHZXQgUlRDIHllYXI6ICUwMnggbW9uL2NlbnQ6ICUwMnggbWRheTogJTAyeCB3ZGF5OiAlMDJ4ICIKCQkiaHI6ICUwMnggbWluOiAlMDJ4IHNlYzogJTAyeFxuIiwKCQl5ZWFyLCBtb24sIG1kYXksIHdkYXksCgkJaG91ciwgbWluLCBzZWMpOwoJcHJpbnRmICggIkFsYXJtczogJTAyeDogeWVhcjogJTAyeCBtb250aDogJTAyeCBkYXRlOiAlMDJ4IGhvdXI6ICUwMnggbWluOiAlMDJ4IHNlYzogJTAyeFxuIiwKCQlhX2FybWVkLAoJCWFfeWVhciwgYV9tb24sIGFfZGF0ZSwKCQlhX2hvdXIsIGFfbWluLCBhX3NlYyk7CiNlbmRpZgoKCXRtcC0+dG1fc2VjICA9IGJjZDJiaW4oc2VjICAmIDB4N0YpOwoJdG1wLT50bV9taW4gID0gYmNkMmJpbihtaW4gICYgMHg3Rik7Cgl0bXAtPnRtX2hvdXIgPSBiY2QyYmluKGhvdXIgJiAweDNGKTsKCXRtcC0+dG1fbWRheSA9IGJjZDJiaW4obWRheSAmIDB4M0YpOwoJdG1wLT50bV9tb24gID0gYmNkMmJpbihtb24gJiAweDFGKTsKCXRtcC0+dG1feWVhciA9IGJjZDJiaW4oeWVhcik7Cgl0bXAtPnRtX3dkYXkgPSBiY2QyYmluKHdkYXkgJiAweDA3KTsKCWlmKHRtcC0+dG1feWVhcjw3MCkKCQl0bXAtPnRtX3llYXIrPTIwMDA7CgllbHNlCgkJdG1wLT50bV95ZWFyKz0xOTAwOwoJdG1wLT50bV95ZGF5ID0gMDsKCXRtcC0+dG1faXNkc3Q9IDA7CiNpZmRlZiBSVENfREVCVUcKCXByaW50ZiAoICJHZXQgREFURTogJTRkLSUwMmQtJTAyZCAod2RheT0lZCkgIFRJTUU6ICUyZDolMDJkOiUwMmRcbiIsCgkJdG1wLT50bV95ZWFyLCB0bXAtPnRtX21vbiwgdG1wLT50bV9tZGF5LCB0bXAtPnRtX3dkYXksCgkJdG1wLT50bV9ob3VyLCB0bXAtPnRtX21pbiwgdG1wLT50bV9zZWMpOwojZW5kaWYKfQoKdm9pZCBydGNfc2V0IChzdHJ1Y3QgcnRjX3RpbWUgKnRtcCkKewoJUzNDMjRYMF9SVEMgKiBjb25zdCBydGMgPSBTM0MyNFgwX0dldEJhc2VfUlRDKCk7Cgl1Y2hhciBzZWMsIG1pbiwgaG91ciwgbWRheSwgd2RheSwgbW9uLCB5ZWFyOwoKI2lmZGVmIFJUQ19ERUJVRwoJcHJpbnRmICggIlNldCBEQVRFOiAlNGQtJTAyZC0lMDJkICh3ZGF5PSVkKSAgVElNRTogJTJkOiUwMmQ6JTAyZFxuIiwKCQl0bXAtPnRtX3llYXIsIHRtcC0+dG1fbW9uLCB0bXAtPnRtX21kYXksIHRtcC0+dG1fd2RheSwKCQl0bXAtPnRtX2hvdXIsIHRtcC0+dG1fbWluLCB0bXAtPnRtX3NlYyk7CiNlbmRpZgoJeWVhcgk9IGJpbjJiY2QodG1wLT50bV95ZWFyICUgMTAwKTsKCW1vbgk9IGJpbjJiY2QodG1wLT50bV9tb24pOwoJd2RheQk9IGJpbjJiY2QodG1wLT50bV93ZGF5KTsKCW1kYXkJPSBiaW4yYmNkKHRtcC0+dG1fbWRheSk7Cglob3VyCT0gYmluMmJjZCh0bXAtPnRtX2hvdXIpOwoJbWluCT0gYmluMmJjZCh0bXAtPnRtX21pbik7CglzZWMJPSBiaW4yYmNkKHRtcC0+dG1fc2VjKTsKCgkvKiBlbmFibGUgYWNjZXNzIHRvIFJUQyByZWdpc3RlcnMgKi8KCVNldFJUQ19BY2Nlc3MoUlRDX0VOQUJMRSk7CgoJLyogd3JpdGUgUlRDIHJlZ2lzdGVycyAqLwoJcnRjLT5CQ0RTRUMJPSBzZWM7CglydGMtPkJDRE1JTgk9IG1pbjsKCXJ0Yy0+QkNESE9VUgk9IGhvdXI7CglydGMtPkJDRERBVEUJPSBtZGF5OwoJcnRjLT5CQ0REQVkJPSB3ZGF5OwoJcnRjLT5CQ0RNT04JPSBtb247CglydGMtPkJDRFlFQVIJPSB5ZWFyOwoKCS8qIGRpc2FibGUgYWNjZXNzIHRvIFJUQyByZWdpc3RlcnMgKi8KCVNldFJUQ19BY2Nlc3MoUlRDX0RJU0FCTEUpOwp9Cgp2b2lkIHJ0Y19yZXNldCAodm9pZCkKewoJUzNDMjRYMF9SVEMgKiBjb25zdCBydGMgPSBTM0MyNFgwX0dldEJhc2VfUlRDKCk7CgoJcnRjLT5SVENDT04gPSAocnRjLT5SVENDT04gJiB+MHgwNikgfCAweDA4OwoJcnRjLT5SVENDT04gJj0gfigweDA4fDB4MDEpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojZW5kaWYJLyogQ09ORklHX1JUQ19TM0MyNFgwICYmIENGR19DTURfREFURSAqLwo=