LyoKICogSUJNIEFTTSBTZXJ2aWNlIFByb2Nlc3NvciBEZXZpY2UgRHJpdmVyCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAqCiAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAqCiAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKICoKICovCgojcHJhZ21hIHBhY2soMSkKc3RydWN0IGkyb19oZWFkZXIgewoJdTgJdmVyc2lvbjsKCXU4CW1lc3NhZ2VfZmxhZ3M7Cgl1MTYJbWVzc2FnZV9zaXplOwoJdTgJdGFyZ2V0OyAgICAgICAgICAgCgl1OAlpbml0aWF0b3JfYW5kX3RhcmdldDsKCXU4CWluaXRpYXRvcjsgICAgICAgIAoJdTgJZnVuY3Rpb247Cgl1MzIJaW5pdGlhdG9yX2NvbnRleHQ7Cn07CiNwcmFnbWEgcGFjaygpCgojZGVmaW5lIEkyT19IRUFERVJfVEVNUExBVEUgXAogICAgICB7IC52ZXJzaW9uICAgICAgICAgICAgICA9IDB4MDEsIFwKCS5tZXNzYWdlX2ZsYWdzICAgICAgICA9IDB4MDAsIFwKCS5mdW5jdGlvbiAgICAgICAgICAgICA9IDB4RkYsIFwKCS5pbml0aWF0b3IgICAgICAgICAgICA9IDB4MDAsIFwKCS5pbml0aWF0b3JfYW5kX3RhcmdldCA9IDB4NDAsIFwKCS50YXJnZXQgICAgICAgICAgICAgICA9IDB4MDAsIFwKCS5pbml0aWF0b3JfY29udGV4dCAgICA9IDB4MCB9CgojZGVmaW5lIEkyT19NRVNTQUdFX1NJWkUJMHgxMDAwCiNkZWZpbmUgSTJPX0NPTU1BTkRfU0laRQkoSTJPX01FU1NBR0VfU0laRSAtIHNpemVvZihzdHJ1Y3QgaTJvX2hlYWRlcikpCgojcHJhZ21hIHBhY2soMSkKc3RydWN0IGkyb19tZXNzYWdlIHsKCXN0cnVjdCBpMm9faGVhZGVyCWhlYWRlcjsKCXZvaWQJCQkqZGF0YTsKfTsKI3ByYWdtYSBwYWNrKCkKCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgb3V0Z29pbmdfbWVzc2FnZV9zaXplKHVuc2lnbmVkIGludCBkYXRhX3NpemUpCnsKCXVuc2lnbmVkIGludCBzaXplOwoJdW5zaWduZWQgc2hvcnQgaTJvX3NpemU7CgoJaWYgKGRhdGFfc2l6ZSA+IEkyT19DT01NQU5EX1NJWkUpCgkJZGF0YV9zaXplID0gSTJPX0NPTU1BTkRfU0laRTsKCglzaXplID0gc2l6ZW9mKHN0cnVjdCBpMm9faGVhZGVyKSArIGRhdGFfc2l6ZTsKCglpMm9fc2l6ZSA9IHNpemUgLyBzaXplb2YodTMyKTsKCQoJaWYgKHNpemUgJSBzaXplb2YodTMyKSkKCSAgICAgICBpMm9fc2l6ZSsrOwoKCXJldHVybiBpMm9fc2l6ZTsKfQkKCnN0YXRpYyBpbmxpbmUgdTMyIGluY29taW5nX2RhdGFfc2l6ZShzdHJ1Y3QgaTJvX21lc3NhZ2UgKmkyb19tZXNzYWdlKQp7CglyZXR1cm4gKHNpemVvZih1MzIpICogaTJvX21lc3NhZ2UtPmhlYWRlci5tZXNzYWdlX3NpemUpOwp9Cg==