LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKLyogc3R1ZmYgc3BlY2lmaWMgZm9yIHRoZSBzYzUyMCwgYnV0IGluZGVwZW5kZW50IG9mIGltcGxlbWVudGF0aW9uICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGFzbS9pYy9zYzUyMC5oPgoKdm9pZCBzYzUyMF90aW1lcl9pc3Iodm9pZCkKewoJLyogQWNrIHRoZSBHUCBUaW1lciBJbnRlcnJ1cHQgKi8KCXdyaXRlYigweDAyLCAmc2M1MjBfbW1jci0+Z3B0bXJzdGEpOwp9CgppbnQgdGltZXJfaW5pdCh2b2lkKQp7CgkvKiBSZWdpc3RlciB0aGUgU0M1MjAgc3BlY2lmaWMgdGltZXIgaW50ZXJydXB0IGhhbmRsZXIgKi8KCXJlZ2lzdGVyX3RpbWVyX2lzciAoc2M1MjBfdGltZXJfaXNyKTsKCgkvKiBJbnN0YWxsIGludGVycnVwdCBoYW5kbGVyIGZvciBHUCBUaW1lciAxICovCglpcnFfaW5zdGFsbF9oYW5kbGVyICgwLCB0aW1lcl9pc3IsIE5VTEwpOwoKCS8qIE1hcCBHUCBUaW1lciAxIHRvIE1hc3RlciBQSUMgSVIwICAqLwoJd3JpdGViKDB4MDEsICZzYzUyMF9tbWNyLT5ncF90bXJfaW50X21hcFsxXSk7CgoJLyogRGlzYWJsZSBHUCBUaW1lcnMgMSAmIDIgLSBBbGxvdyBjb25maWd1cmF0aW9uIHdyaXRlcyAqLwoJd3JpdGV3KDB4NDAwMCwgJnNjNTIwX21tY3ItPmdwdG1yMWN0bCk7Cgl3cml0ZXcoMHg0MDAwLCAmc2M1MjBfbW1jci0+Z3B0bXIyY3RsKTsKCgkvKiBSZXNldCBHUCBUaW1lcnMgMSAmIDIgKi8KCXdyaXRldygweDAwMDAsICZzYzUyMF9tbWNyLT5ncHRtcjFjbnQpOwoJd3JpdGV3KDB4MDAwMCwgJnNjNTIwX21tY3ItPmdwdG1yMmNudCk7CgoJLyogU2V0dXAgR1AgVGltZXIgMiBhcyBhIDEwMGtIeiAoMTB1cykgcHJlc2NhbGVyICovCgl3cml0ZXcoODMsICZzYzUyMF9tbWNyLT5ncHRtcjJtYXhjbXBhKTsKCXdyaXRldygweGMwMDEsICZzYzUyMF9tbWNyLT5ncHRtcjJjdGwpOwoKCS8qIFNldHVwIEdQIFRpbWVyIDEgYXMgYSAxMDAwIEh6ICgxbXMpIGludGVycnVwdCBnZW5lcmF0b3IgKi8KCXdyaXRldygxMDAsICZzYzUyMF9tbWNyLT5ncHRtcjFtYXhjbXBhKTsKCXdyaXRldygweGUwMDksICZzYzUyMF9tbWNyLT5ncHRtcjFjdGwpOwoKCXVubWFza19pcnEgKDApOwoKCS8qIENsZWFyIHRoZSBHUCBUaW1lciAxIHN0YXR1cyByZWdpc3RlciB0byBnZXQgdGhlIHNob3cgcm9sbGluZyovCgl3cml0ZWIoMHgwMiwgJnNjNTIwX21tY3ItPmdwdG1yc3RhKTsKCglyZXR1cm4gMDsKfQoKLyogQWxsb3cgYm9hcmRzIHRvIG92ZXJyaWRlIHVkZWxheSBpbXBsZW1lbnRhdGlvbiAqLwp2b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlYykKCV9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJzYzUyMF91ZGVsYXkiKSkpOwoKdm9pZCBzYzUyMF91ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjKQp7CglpbnQgbSA9IDA7Cglsb25nIHU7Cglsb25nIHRlbXA7CgoJdGVtcCA9IHJlYWR3KCZzYzUyMF9tbWNyLT5zd3Rtcm1pbGxpKTsKCXRlbXAgPSByZWFkdygmc2M1MjBfbW1jci0+c3d0bXJtaWNybyk7CgoJZG8gewoJCW0gKz0gcmVhZHcoJnNjNTIwX21tY3ItPnN3dG1ybWlsbGkpOwoJCXUgPSByZWFkdygmc2M1MjBfbW1jci0+c3d0bXJtaWNybykgKyAobSAqIDEwMDApOwoJfSB3aGlsZSAodSA8IHVzZWMpOwp9Cg==