Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICNpbmNsdWRlx/gKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpbmNsdWRlICA8c3RkaW8uaD4KI2luY2x1ZGUgIDxzdGRsaWIuaD4KI2luY2x1ZGUgIDxzaWduYWwuaD4KI2luY2x1ZGUgIDxzeXMvdGltZS5oPgojaW5jbHVkZSAgPHN5c2xvZy5oPgojaW5jbHVkZSAgPGZjbnRsLmg+CiNpbmNsdWRlICA8cHRocmVhZC5oPgojaW5jbHVkZSAgPHN0ZGxpYi5oPgojaW5jbHVkZSAgPHN0cmluZy5oPgojaW5jbHVkZSAgPGVycm5vLmg+CiNpbmNsdWRlICA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlICA8c3lzL3ByY3RsLmg+CiNpbmNsdWRlICA8dW5pc3RkLmg+CiNpbmNsdWRlICA8bGludXgvcnRjLmg+CiNpbmNsdWRlICA8dGltZS5oPgojaW5jbHVkZSAgPHN5cy9pcGMuaD4KI2luY2x1ZGUgIDxzeXMvbXNnLmg+CiNpbmNsdWRlICAic29mdGFwX2FwaS5oIgojaW5jbHVkZSAgIm1lc3NhZ2UuaCIKI2luY2x1ZGUgICJydGNfdGltZXIuaCIKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIMr9vt294bm5tqjS5cf4CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiDN4rK/seTBv8n5w/fH+AoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioguuq2qNLlx/gKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBydGNfdGltZXJfYWRkKFVMT05HIHVsU2VjLCBSVENfSUQgIHJ0Y19pZCwgaW50IHNyY19pZCkvL2FkZF9ydGNfdGltZXIKewoJaW50IHJldCA9IC0xOwoJaW50IGRhdGFfbGVuID0gMDsKCVJUQ19EQVRBX0JVRiAgYnVmID0gezB9OwoJY2hhciBydGNfY3B1WzE2XSA9IHswfTsKCWNoYXIgcnRjX2NwX3JlYWR5WzhdID0gezB9OwoKCS8vvOC/2NPQxMTQqdOm08PJ6NbDwcu2zMqxvOS1xHJ0YwoJaWYgKHVsU2VjIDwgNTkpCgkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwgICAicnRjIHRpbWUgaXMgJWQsIGxlc3MgdGhhbiA2MC4gc3JjOjB4JXgsIGlkOjB4JXggXG4iLCB1bFNlYywgc3JjX2lkLCBydGNfaWQpOwoKCWJ1Zi5zcmNNb2R1bGUgPSBzcmNfaWQ7CglidWYubW9kdWxlID0gcnRjX2lkOwoJYnVmLnVsU2VjID0gdWxTZWM7CglidWYud2FrZXVwID0gMDsKCWJ1Zi5pc191dGMgPSAwOwoJZGF0YV9sZW4gPSBzaXplb2YoUlRDX0RBVEFfQlVGKTsKCWJ1Zi50aW1lX3ZhbCA9IHRpbWUoMCk7CglidWYuY3B1ID0gUlRDX0NQVV9BUDsKCglyZXQgPSBpcGNfc2VuZF9tZXNzYWdlKHNyY19pZCwgTU9EVUxFX0lEX1JUQ19TRVJWSUNFLCBSVENfTVNHX0FERF9BTEFSTSwgZGF0YV9sZW4sICh1bnNpZ25lZCBjaGFyICopJmJ1ZiwgMCk7CglpZiAocmV0ICE9IDApIHsKCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCAgICJydGM6IHNldCBydGMgdGltZXIgc2VuZCBtc2cgZmFpbGVkIFxuIik7CgkJcmV0dXJuIC0xOwoJfQoKCXJldHVybiByZXQ7Cn0KCmludCBydGNfdGltZXJfYWRkX3V0YyhzdHJ1Y3QgdG0gKnNlYywgUlRDX0lEIHJ0Y19pZCwgaW50IHNyY19pZCwgaW50IHdha2V1cCkvL2FkZF9ydGNfdGltZXIKewoJaW50IHJldCA9IC0xOwoJdGltZV90IGN1cl9zZWMgPSB0aW1lKDApOwoJdGltZV90IHNldF9zZWMgPSBta3RpbWUoc2VjKTsKCWNoYXIgc250cF9yZXN1bHRbMjBdID0gezB9OwoJY2hhciBydGNfY3B1WzE2XSA9IHswfTsKCWNoYXIgcnRjX2NwX3JlYWR5WzhdID0gezB9OwoKCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsICAgInJ0Y190aW1lcl9hZGRfdXRjIGVudGVyIFxuIik7CgojaWYgMAoJLy8gyejWw8rAvefKsdbTtqjKscb3o6yx2NDrtchzbnRws8m5prrzCglzY19jZmdfZ2V0KCJzbnRwX3Byb2Nlc3NfcmVzdWx0Iiwgc250cF9yZXN1bHQsIHNpemVvZihzbnRwX3Jlc3VsdCkpOwoJaWYgKHN0cmNtcCgic3VjY2VzcyIsIHNudHBfcmVzdWx0KSAhPSAwKSB7CgkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwgICAicnRjOiBzZXQgdXRjIHRpbWVyIHNob3VsZCBiZSBhZnRlciBzbnRwIHN1Y2Nlc3NcbiIpOwoJCXJldHVybiByZXQ7Cgl9CiNlbmRpZgoJLy8gyejWw7aoyrHG98qxvOSx2NDrze3T2rWxx7DKsbzkCglpZiAoY3VyX3NlYyA+PSBzZXRfc2VjKSB7CgkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwgICAicnRjOiBzZXQgdGltZS0lbGQgc2hvdWxkIGJlIGFmdGVyIHRoZW4gY3Vycm5ldCB0aW1lLSVsZFxuIiwgc2V0X3NlYywgY3VyX3NlYyk7CgkJcmV0dXJuIHJldDsKCX0KCglpbnQgZGF0YV9sZW4gPSAwOwoJUlRDX0RBVEFfQlVGIGJ1ZiA9IHswfTsKCglidWYuc3JjTW9kdWxlID0gc3JjX2lkOwoJYnVmLm1vZHVsZSA9IHJ0Y19pZDsKCWJ1Zi51bFNlYyA9IHNldF9zZWMgLSBjdXJfc2VjOwoJYnVmLnRpbWVfdmFsID0gY3VyX3NlYzsKCWJ1Zi53YWtldXAgPSB3YWtldXA7CglidWYuaXNfdXRjID0gMTsKCWJ1Zi5jcHUgPSBSVENfQ1BVX0FQOwoJZGF0YV9sZW4gPSBzaXplb2YoUlRDX0RBVEFfQlVGKTsKCglzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCAgICJydGMgYWRkIHV0YyB0aW1lciwgY3VyOiVsZCwgc2V0OiVsZCwgdWxTZWM6JWQ7IHllYXI6JWQsIG1vbjolZCwgZGF5OiVkLCBob3VyOiVkLCBtaW46JWQsIHNlYzolZCwgd2RheTolZCwgeWRheTolZCBcbiIsIGJ1Zi50aW1lX3ZhbCwgc2V0X3NlYywgYnVmLnVsU2VjLCBzZWMtPnRtX3llYXIsIHNlYy0+dG1fbW9uLCBzZWMtPnRtX21kYXksIHNlYy0+dG1faG91ciwgc2VjLT50bV9taW4sIHNlYy0+dG1fc2VjLCBzZWMtPnRtX3dkYXksIHNlYy0+dG1feWRheSk7CglyZXQgPSAgaXBjX3NlbmRfbWVzc2FnZShzcmNfaWQsIE1PRFVMRV9JRF9SVENfU0VSVklDRSwgUlRDX01TR19BRERfQUxBUk0sIGRhdGFfbGVuLCAodW5zaWduZWQgY2hhciAqKSZidWYsIDApOwoJaWYgKHJldCAhPSAwKSB7CgkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwgICAicnRjOiBzZXQgcnRjIHV0YyB0aW1lciBzZW5kIG1zZyBmYWlsZWQgXG4iKTsKCQlyZXR1cm4gLTE7Cgl9CgoJcmV0dXJuIHJldDsKfQoKaW50IHJ0Y190aW1lcl9kZWwoUlRDX0lEIHJ0Y19pZCwgaW50IHNyY19pZCkKewoJaW50IHJldCA9IC0xOwoJaW50IGRhdGFfbGVuID0gMDsKCVJUQ19EQVRBX0JVRiAgYnVmID0gezB9OwoKCWJ1Zi5zcmNNb2R1bGUgPSBzcmNfaWQ7CglidWYubW9kdWxlID0gcnRjX2lkOwoJYnVmLmNwdSA9IFJUQ19DUFVfQVA7CglkYXRhX2xlbiA9IHNpemVvZihSVENfREFUQV9CVUYpOwoKCXJldCA9IGlwY19zZW5kX21lc3NhZ2Uoc3JjX2lkLCBNT0RVTEVfSURfUlRDX1NFUlZJQ0UsIFJUQ19NU0dfREVMX0FMQVJNLCBkYXRhX2xlbiwgKHVuc2lnbmVkIGNoYXIgKikgJmJ1ZiwgMCk7CglpZiAocmV0ID09IDApCgkJcmV0dXJuIDA7CgllbHNlCgkJcmV0dXJuIC0xOwp9CgppbnQgcnRjX3RpbWVyX2RlbF9hbGwoaW50IHNyY19pZCwgdW5zaWduZWQgc2hvcnQgcmVxX2NtZCkKewoJaW50IHJldCA9IC0xOwoKCXJldCA9IGlwY19zZW5kX21lc3NhZ2Uoc3JjX2lkLCBNT0RVTEVfSURfUlRDX1NFUlZJQ0UsIFJUQ19NU0dfREVMX0FMTCwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSwgJnJlcV9jbWQsIDApOwoJaWYgKHJldCA9PSAwKQoJCXJldHVybiAwOwoJZWxzZQoJCXJldHVybiAtMTsKfQoKaW50ICBydGNfc2V0X3RpbWUoaW50IHNyY19pZCkKewoJaW50IHJldCA9IC0xOwoJdGltZV90IGN1cl90aW1lID0gdGltZSgwKTsKCglyZXQgPSBpcGNfc2VuZF9tZXNzYWdlKHNyY19pZCwgTU9EVUxFX0lEX1JUQ19TRVJWSUNFLCBSVENfTVNHX1NFVF9USU1FLCBzaXplb2YodGltZV90KSwgJmN1cl90aW1lLCAwKTsKCWlmIChyZXQgPT0gMCkKCQlyZXR1cm4gMDsKCWVsc2UKCQlyZXR1cm4gLTE7Cn0KCgo=