LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxtYWxsb2MuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2k4MjU0Lmg+CiNpbmNsdWRlIDxhc20vaWJtcGMuaD4KCnN0cnVjdCB0aW1lcl9pc3JfZnVuY3Rpb24gewoJc3RydWN0IHRpbWVyX2lzcl9mdW5jdGlvbiAqbmV4dDsKCXRpbWVyX2ZuY190ICppc3JfZnVuYzsKfTsKCnN0YXRpYyBzdHJ1Y3QgdGltZXJfaXNyX2Z1bmN0aW9uICpmaXJzdF90aW1lcl9pc3IgPSBOVUxMOwpzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBzeXN0ZW1fdGlja3MgPSAwOwoKLyoKICogcmVnaXN0ZXJfdGltZXJfaXNyKCkgYWxsb3dzIG11bHRpcGxlIGFyY2hpdGVjdHVyZSBhbmQgYm9hcmQgc3BlY2lmaWMKICogZnVuY3Rpb25zIHRvIGJlIGNhbGxlZCBldmVyeSBtaWxsaXNlY29uZC4gS2VlcCB0aGUgZXhlY3V0aW9uIHRpbWUgb2YKICogZWFjaCBmdW5jdGlvbiBhcyBsb3cgYXMgcG9zc2libGUKICovCmludCByZWdpc3Rlcl90aW1lcl9pc3IgKHRpbWVyX2ZuY190ICppc3JfZnVuYykKewoJc3RydWN0IHRpbWVyX2lzcl9mdW5jdGlvbiAqbmV3X2Z1bmM7CglzdHJ1Y3QgdGltZXJfaXNyX2Z1bmN0aW9uICp0ZW1wOwoJaW50IGZsYWc7CgoJbmV3X2Z1bmMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB0aW1lcl9pc3JfZnVuY3Rpb24pKTsKCglpZiAobmV3X2Z1bmMgPT0gTlVMTCkKCQlyZXR1cm4gMTsKCgluZXdfZnVuYy0+aXNyX2Z1bmMgPSBpc3JfZnVuYzsKCW5ld19mdW5jLT5uZXh0ID0gTlVMTDsKCgkvKgoJICogIERvbid0IGFsbG93IHRpbWVyIGludGVycnVwdHMgd2hpbGUgdGhlCgkgKiAgbGlua2VkIGxpc3QgaXMgYmVpbmcgbW9kaWZpZWQKCSAqLwoJZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cyAoKTsKCglpZiAoZmlyc3RfdGltZXJfaXNyID09IE5VTEwpIHsKCQlmaXJzdF90aW1lcl9pc3IgPSBuZXdfZnVuYzsKCX0gZWxzZSB7CgkJdGVtcCA9IGZpcnN0X3RpbWVyX2lzcjsKCQl3aGlsZSAodGVtcC0+bmV4dCAhPSBOVUxMKQoJCQl0ZW1wID0gdGVtcC0+bmV4dDsKCQl0ZW1wLT5uZXh0ID0gbmV3X2Z1bmM7Cgl9CgoJaWYgKGZsYWcpCgkJZW5hYmxlX2ludGVycnVwdHMgKCk7CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIHRpbWVyX2lzcigpIE1VU1QgYmUgdGhlIHJlZ2lzdGVyZWQgaW50ZXJydXB0IGhhbmRsZXIgZm9yCiAqLwp2b2lkIHRpbWVyX2lzcih2b2lkICp1bnVzZWQpCnsKCXN0cnVjdCB0aW1lcl9pc3JfZnVuY3Rpb24gKnRlbXAgPSBmaXJzdF90aW1lcl9pc3I7CgoJc3lzdGVtX3RpY2tzKys7CgoJLyogRXhlY3V0ZSBlYWNoIHJlZ2lzdGVyZWQgZnVuY3Rpb24gKi8KCXdoaWxlICh0ZW1wICE9IE5VTEwpIHsKCQl0ZW1wLT5pc3JfZnVuYyAoKTsKCQl0ZW1wID0gdGVtcC0+bmV4dDsKCX0KfQoKdm9pZCByZXNldF90aW1lciAodm9pZCkKewoJc3lzdGVtX3RpY2tzID0gMDsKfQoKdWxvbmcgZ2V0X3RpbWVyICh1bG9uZyBiYXNlKQp7CglyZXR1cm4gKHN5c3RlbV90aWNrcyAtIGJhc2UpOwp9Cgp2b2lkIHNldF90aW1lciAodWxvbmcgdCkKewoJc3lzdGVtX3RpY2tzID0gdDsKfQo=