LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9pODI1NC5oPgojaW5jbHVkZSA8YXNtL2libXBjLmg+CgoKc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgc3lzdGVtX3RpY2tzOwpzdGF0aWMgaW50IHRpbWVyX2luaXRfZG9uZSA9MDsKCnN0YXRpYyB2b2lkIHRpbWVyX2lzcih2b2lkICp1bnVzZWQpCnsKCXN5c3RlbV90aWNrcysrOwp9Cgp1bnNpZ25lZCBsb25nIGdldF9zeXN0ZW1fdGlja3Modm9pZCkKewoJcmV0dXJuIHN5c3RlbV90aWNrczsKfQoKI2RlZmluZSBUSU1FUjBfVkFMVUUgMHgwNGFhIC8qIDFrSHogMS45MzE4TUh6IC8gMTAwMCAqLwojZGVmaW5lIFRJTUVSMl9WQUxVRSAweDBhOGUgLyogNDQwSHogKi8KCmludCB0aW1lcl9pbml0KHZvaWQpCnsKCXN5c3RlbV90aWNrcyA9IDA7CgoJaXJxX2luc3RhbGxfaGFuZGxlcigwLCB0aW1lcl9pc3IsIE5VTEwpOwoKCS8qIGluaXRpYWxpemUgdGltZXIgMCBhbmQgMgoJICoKCSAqIFRpbWVyIDAgaXMgdXNlZCB0byBpbmNyZW1lbnQgc3lzdGVtX3RpY2sgMTAwMCB0aW1lcy9zZWMKCSAqIFRpbWVyIDEgd2FzIHVzZWQgZm9yIERSQU0gcmVmcmVzaCBpbiBlYXJseSBQQydzCgkgKiBUaW1lciAyIGlzIHVzZWQgdG8gZHJpdmUgdGhlIHNwZWFrZXIKCSAqICh0byBzdGFzcnQgYSBiZWVwOiB3cml0ZSAzIHRvIHBvcnQgMHg2MSwKCSAqIHRvIHN0b3AgaXQgYWdhaW46IHdyaXRlIDApCgkgKi8KCglvdXRiKFBJVF9DTURfQ1RSMHxQSVRfQ01EX0JPVEh8UElUX0NNRF9NT0RFMiwgUElUX0JBU0UgKyBQSVRfQ09NTUFORCk7CglvdXRiKFRJTUVSMF9WQUxVRSYweGZmLCBQSVRfQkFTRSArIFBJVF9UMCk7CglvdXRiKFRJTUVSMF9WQUxVRT4+OCwgUElUX0JBU0UgKyBQSVRfVDApOwoKCW91dGIoUElUX0NNRF9DVFIyfFBJVF9DTURfQk9USHxQSVRfQ01EX01PREUzLCBQSVRfQkFTRSArIFBJVF9DT01NQU5EKTsKCW91dGIoVElNRVIyX1ZBTFVFJjB4ZmYsIFBJVF9CQVNFICsgUElUX1QyKTsKCW91dGIoVElNRVIyX1ZBTFVFPj44LCBQSVRfQkFTRSArIFBJVF9UMik7CgoJdGltZXJfaW5pdF9kb25lID0gMTsKCglyZXR1cm4gMDsKfQoKCiNpZmRlZiBDT05GSUdfU1lTX1RJTUVSX0dFTkVSSUMKCi8qIHRoZSB1bml0IGZvciB0aGVzZSBpcyBDT05GSUdfU1lTX0haICovCgovKiBGaXhNZTogaW1wbGVtZW50IHRoZXNlICovCnZvaWQgcmVzZXRfdGltZXIgKHZvaWQpCnsKCXN5c3RlbV90aWNrcyA9IDA7Cn0KCnVsb25nIGdldF90aW1lciAodWxvbmcgYmFzZSkKewoJcmV0dXJuIChzeXN0ZW1fdGlja3MgLSBiYXNlKTsKfQoKdm9pZCBzZXRfdGltZXIgKHVsb25nIHQpCnsKCXN5c3RlbV90aWNrcyA9IHQ7Cn0KCnN0YXRpYyB1MTYgcmVhZF9waXQodm9pZCkKewoJdTggbG93OwoJb3V0YihQSVRfQ01EX0xBVENILCBQSVRfQkFTRSArIFBJVF9DT01NQU5EKTsKCWxvdyA9IGluYihQSVRfQkFTRSArIFBJVF9UMCk7CglyZXR1cm4gKChpbmIoUElUX0JBU0UgKyBQSVRfVDApIDw8IDgpIHwgbG93KTsKfQoKLyogdGhpcyBpcyBub3QgdmVyeSBleGFjdCAqLwp2b2lkIHVkZWxheSAodW5zaWduZWQgbG9uZyB1c2VjKQp7CglpbnQgY291bnRlcjsKCWludCB3cmFwczsKCglpZiAoIXRpbWVyX2luaXRfZG9uZSkgewoJCXJldHVybjsKCX0KCWNvdW50ZXIgPSByZWFkX3BpdCgpOwoJd3JhcHMgPSB1c2VjLzEwMDA7Cgl1c2VjID0gdXNlYyUxMDAwOwoKCXVzZWMqPTExOTQ7Cgl1c2VjLz0xMDAwOwoJdXNlYys9Y291bnRlcjsKCWlmICh1c2VjID4gMTE5NCkgewoJCXVzZWMtPTExOTQ7CgkJd3JhcHMrKzsKCX0KCgl3aGlsZSAoMSkgewoJCWludCBuZXdfY291bnQgPSByZWFkX3BpdCgpOwoKCQlpZiAoKChuZXdfY291bnQgPCB1c2VjKSAmJiAhd3JhcHMpIHx8IHdyYXBzIDwgMCkgewoJCQlicmVhazsKCQl9CgoJCWlmIChuZXdfY291bnQgPiBjb3VudGVyKSB7CgkJCXdyYXBzLS07CgkJfQoJCWNvdW50ZXIgPSBuZXdfY291bnQ7Cgl9Cgp9CgojaWYgMAovKiB0aGlzIGlzIGEgdmVyc2lvbiB3aXRoIGRlYnVnIG91dHB1dCAqLwp2b2lkIF91ZGVsYXkgKHVuc2lnbmVkIGxvbmcgdXNlYykKewoJaW50IGNvdW50ZXI7CglpbnQgd3JhcHM7CgoJaW50IHVzZWMxLCB1c2VjMiwgdXNlYzM7CglpbnQgd3JhcHMxLCB3cmFwczIsIHdyYXBzMywgd3JhcHM0OwoJaW50IGN0cjEsIGN0cjIsIGN0cjMsIG5jdDEsIG5jdDI7CglpbnQgaTsKCXVzZWMxPXVzZWM7CglpZiAoIXRpbWVyX2luaXRfZG9uZSkgewoJCXJldHVybjsKCX0KCWNvdW50ZXIgPSByZWFkX3BpdCgpOwoJY3RyMSA9IGNvdW50ZXI7Cgl3cmFwcyA9IHVzZWMvMTAwMDsKCXVzZWMgPSB1c2VjJTEwMDA7CgoJdXNlYzIgPSB1c2VjOwoJd3JhcHMxID0gd3JhcHM7CgoJdXNlYyo9MTE5NDsKCXVzZWMvPTEwMDA7Cgl1c2VjKz1jb3VudGVyOwoJaWYgKHVzZWMgPiAxMTk0KSB7CgkJdXNlYy09MTE5NDsKCQl3cmFwcysrOwoJfQoKCXVzZWMzID0gdXNlYzsKCXdyYXBzMiA9IHdyYXBzOwoKCWN0cjIgPSB3cmFwczMgPSBuY3QxID0gNDcxMTsKCWN0cjMgPSB3cmFwczQgPSBuY3QyID0gNDcxMTsKCWk9MDsKCXdoaWxlICgxKSB7CgkJaW50IG5ld19jb3VudCA9IHJlYWRfcGl0KCk7CgkJaSsrOwoJCWlmICgobmV3X2NvdW50IDwgdXNlYyAmJiAhd3JhcHMpIHx8IHdyYXBzIDwgMCkgewoJCQlicmVhazsKCQl9CgoJCWlmIChuZXdfY291bnQgPiBjb3VudGVyKSB7CgkJCXdyYXBzLS07CgkJfQoJCWlmIChjdHIyPT00NzExKSB7CgkJCWN0cjIgPSBjb3VudGVyOwoJCQl3cmFwczMgPSB3cmFwczsKCQkJbmN0MSA9IG5ld19jb3VudDsKCQl9IGVsc2UgewoJCQljdHIzID0gY291bnRlcjsKCQkJd3JhcHM0ID0gd3JhcHM7CgkJCW5jdDIgPSBuZXdfY291bnQ7CgkJfQoKCQljb3VudGVyID0gbmV3X2NvdW50OwoJfQoKCXByaW50ZigidWRlbGF5KCVkKVxuIiwgdXNlYzEpOwoJcHJpbnRmKCJjb3VudGVyICVkXG4iLCBjdHIxKTsKCXByaW50ZigiMTogd3JhcHMgJWQsIHVzZWMgJWRcbiIsIHdyYXBzMSwgdXNlYzIpOwoJcHJpbnRmKCIyOiB3cmFwcyAlZCwgdXNlYyAlZFxuIiwgd3JhcHMyLCB1c2VjMyk7CglwcmludGYoIm5ld19jb3VudFswXSAlZCBjb3VudGVyICVkIHdyYXBzICVkXG4iLCBuY3QxLCBjdHIyLCB3cmFwczMpOwoJcHJpbnRmKCJuZXdfY291bnRbJWRdICVkIGNvdW50ZXIgJWQgd3JhcHMgJWRcbiIsIGksIG5jdDIsIGN0cjMsIHdyYXBzNCk7CgoJcHJpbnRmKCIlZCAlZCAlZCAlZCAlZFxuIiwKCSAgICAgICByZWFkX3BpdCgpLCByZWFkX3BpdCgpLCByZWFkX3BpdCgpLAoJICAgICAgIHJlYWRfcGl0KCksIHJlYWRfcGl0KCkpOwp9CiNlbmRpZgojZW5kaWYK