LyoKICogSUJNIEFTTSBTZXJ2aWNlIFByb2Nlc3NvciBEZXZpY2UgRHJpdmVyCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAqCiAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAqCiAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogKgogKi8KCiNpZm5kZWYgX19ET1RfQ09NTUFORF9IX18KI2RlZmluZSBfX0RPVF9DT01NQU5EX0hfXwoKLyoKICogZG90IGNvbW1hbmRzIGFyZSB0aGUgcHJvdG9jb2wgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzZXJ2aWNlCiAqIHByb2Nlc3Nvci4KICogVGhleSBjb25zaXN0IG9mIGhlYWRlciwgYSBjb21tYW5kIG9mIHZhcmlhYmxlIGxlbmd0aCBhbmQgZGF0YSBvZgogKiB2YXJpYWJsZSBsZW5ndGguCiAqLwoKLyogZG90IGNvbW1hbmQgdHlwZXMgKi8KI2RlZmluZSBzcF93cml0ZQkJMAojZGVmaW5lIHNwX3dyaXRlX25leHQJCTEKI2RlZmluZSBzcF9yZWFkCQkJMgojZGVmaW5lIHNwX3JlYWRfbmV4dAkJMwojZGVmaW5lIHNwX2NvbW1hbmRfcmVzcG9uc2UJNAojZGVmaW5lIHNwX2V2ZW50CQk1CiNkZWZpbmUgc3BfaGVhcnRiZWF0CQk2CgojcHJhZ21hIHBhY2soMSkKc3RydWN0IGRvdF9jb21tYW5kX2hlYWRlciB7Cgl1OAl0eXBlOwoJdTgJY29tbWFuZF9zaXplOwoJdTE2CWRhdGFfc2l6ZTsKCXU4CXN0YXR1czsKCXU4CXJlc2VydmVkOwp9OwojcHJhZ21hIHBhY2soKQoKc3RhdGljIGlubGluZSBzaXplX3QgZ2V0X2RvdF9jb21tYW5kX3NpemUodm9pZCAqYnVmZmVyKQp7CglzdHJ1Y3QgZG90X2NvbW1hbmRfaGVhZGVyICpjbWQgPSAoc3RydWN0IGRvdF9jb21tYW5kX2hlYWRlciAqKWJ1ZmZlcjsKCXJldHVybiBzaXplb2Yoc3RydWN0IGRvdF9jb21tYW5kX2hlYWRlcikgKyBjbWQtPmNvbW1hbmRfc2l6ZSArIGNtZC0+ZGF0YV9zaXplOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfZG90X2NvbW1hbmRfdGltZW91dCh2b2lkICpidWZmZXIpCnsKCXN0cnVjdCBkb3RfY29tbWFuZF9oZWFkZXIgKmhlYWRlciA9IChzdHJ1Y3QgZG90X2NvbW1hbmRfaGVhZGVyICopYnVmZmVyOwoJdW5zaWduZWQgY2hhciAqY21kID0gYnVmZmVyICsgc2l6ZW9mKHN0cnVjdCBkb3RfY29tbWFuZF9oZWFkZXIpOwoKCS8qIGRvdCBjb21tYW5kcyA2LjMuMSwgNy4xIGFuZCA4LnggbmVlZCBhIGxvbmdlciB0aW1lb3V0ICovCgoJaWYgKGhlYWRlci0+Y29tbWFuZF9zaXplID09IDMpIHsKCQlpZiAoKGNtZFswXSA9PSA2KSAmJiAoY21kWzFdID09IDMpICYmIChjbWRbMl0gPT0gMSkpCgkJCXJldHVybiBJQk1BU01fQ01EX1RJTUVPVVRfRVhUUkE7Cgl9IGVsc2UgaWYgKGhlYWRlci0+Y29tbWFuZF9zaXplID09IDIpIHsKCQlpZiAoKGNtZFswXSA9PSA3KSAmJiAoY21kWzFdID09IDEpKQoJCQlyZXR1cm4gSUJNQVNNX0NNRF9USU1FT1VUX0VYVFJBOwoJCWlmIChjbWRbMF0gPT0gOCkKCQkJcmV0dXJuIElCTUFTTV9DTURfVElNRU9VVF9FWFRSQTsKCX0KCXJldHVybiBJQk1BU01fQ01EX1RJTUVPVVRfTk9STUFMOwp9CgojZW5kaWYgLyogX19ET1RfQ09NTUFORF9IX18gKi8K