LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKLyoKICogQmFzZWQgb24gc2M1MjBjZHAuYyBmcm9tIHJvbG8gMS42OgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogKEMpIENvcHlyaWdodCAyMDAwCiAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMgR21iSAogKiBLbGVpbi1XaW50ZXJuaGVpbSwgR2VybWFueQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgojaW5jbHVkZSA8Y29uZmlnLmg+CgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFsaTUxMnguaD4KCgovKiBBTEkgTTUxMjMgTG9naWNhbCBkZXZpY2UgbnVtYmVyczoKICogMCBGREMKICogMSB1bnVzZWQ/CiAqIDIgdW51c2VkPwogKiAzIGxwdAogKiA0IFVBUlQxCiAqIDUgVUFSVDIKICogNiBSVEMKICogNyBtb3VzZS9rYmQKICogOCBDSU8KICovCgovKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBTb21lIGFjY2VzcyBwcmltaXRpdmVzIGZvciB0aGUgQUxpIGNoaXA6ICAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KCnN0YXRpYyB2b2lkIGFsaV93cml0ZSh1OCBpbmRleCwgdTggdmFsdWUpCnsKCS8qIHdyaXRlIGFuIGFyYmlyYXJ5IHJlZ2lzdGVyICovCglvdXRiKGluZGV4LCBBTElfSU5ERVgpOwoJb3V0Yih2YWx1ZSwgQUxJX0RBVEEpOwp9CgojaWYgMApzdGF0aWMgaW50IGFsaV9yZWFkKHU4IGluZGV4KQp7CglvdXRiKGluZGV4LCBBTElfSU5ERVgpOwoJcmV0dXJuIGluYihBTElfREFUQSk7Cn0KI2VuZGlmCgojZGVmaW5lIEFMSV9PUEVOKCkgXAoJb3V0YigweDUxLCBBTElfSU5ERVgpOyBcCglvdXRiKDB4MjMsIEFMSV9JTkRFWCkKCgojZGVmaW5lIEFMSV9DTE9TRSgpIFwKCW91dGIoMHhiYiwgQUxJX0lOREVYKQoKLyogU2VsZWN0IGEgbG9naWNhbCBkZXZpY2UgKi8KI2RlZmluZSBBTElfU0VMREVWKGRldikJXAoJYWxpX3dyaXRlKDB4MDcsIGRldikKCgp2b2lkIGFsaTUxMnhfaW5pdCh2b2lkKQp7CglBTElfT1BFTigpOwoKCWFsaV93cml0ZSgweDAyLCAweDAxKTsJLyogc29mdCByZXNldCAqLwoJYWxpX3dyaXRlKDB4MDMsIDB4MDMpOwkvKiBkaXNhYmxlIGFjY2VzcyB0byBDSU9zICovCglhbGlfd3JpdGUoMHgyMiwgMHgwMCk7CS8qIGRpc2FibGUgZGlyZWN0IHBvd2VyZG93biAqLwoJYWxpX3dyaXRlKDB4MjMsIDB4MDApOwkvKiBkaXNhYmxlIGF1dG8gcG93ZXJkb3duICovCglhbGlfd3JpdGUoMHgyNCwgMHgwMCk7CS8qIElSIDggaXMgYWN0aXZlIGhpLCBwaW4yNiBpcyBQRElSICovCgoJQUxJX0NMT1NFKCk7Cn0KCnZvaWQgYWxpNTEyeF9zZXRfZmRjKGludCBlbmFibGVkLCB1MTYgaW8sIHU4IGlycSwgdTggZG1hX2NoYW5uZWwpCnsKCUFMSV9PUEVOKCk7CglBTElfU0VMREVWKDApOwoKCWFsaV93cml0ZSgweDMwLCBlbmFibGVkPzE6MCk7CglpZiAoZW5hYmxlZCkgewoJCWFsaV93cml0ZSgweDYwLCBpbyA+PiA4KTsKCQlhbGlfd3JpdGUoMHg2MSwgaW8gJiAweGZmKTsKCQlhbGlfd3JpdGUoMHg3MCwgaXJxKTsKCQlhbGlfd3JpdGUoMHg3NCwgZG1hX2NoYW5uZWwpOwoKCQkvKiBBVCBtb2RlLCBubyBkcml2ZSBzd2FwICovCgkJYWxpX3dyaXRlKDB4ZjAsIDB4MDgpOwoJCWFsaV93cml0ZSgweGYxLCAweDAwKTsKCQlhbGlfd3JpdGUoMHhmMiwgMHhmZik7CgkJYWxpX3dyaXRlKDB4ZjQsIDB4MDApOwoJfQoJQUxJX0NMT1NFKCk7Cn0KCgp2b2lkIGFsaTUxMnhfc2V0X3BwKGludCBlbmFibGVkLCB1MTYgaW8sIHU4IGlycSwgdTggZG1hX2NoYW5uZWwpCnsKCUFMSV9PUEVOKCk7CglBTElfU0VMREVWKDMpOwoKCWFsaV93cml0ZSgweDMwLCBlbmFibGVkPzE6MCk7CglpZiAoZW5hYmxlZCkgewoJCWFsaV93cml0ZSgweDYwLCBpbyA+PiA4KTsKCQlhbGlfd3JpdGUoMHg2MSwgaW8gJiAweGZmKTsKCQlhbGlfd3JpdGUoMHg3MCwgaXJxKTsKCQlhbGlfd3JpdGUoMHg3NCwgZG1hX2NoYW5uZWwpOwoKCQkvKiBtb2RlOiBFUFAgMS45LCBFQ1AgRklGTyB0aHJlc2hvbGQgPSA3LCBJUlEgYWN0aXZlIGxvdyAqLwoJCWFsaV93cml0ZSgweGYwLCAweGJjKTsKCQkvKiAxMiBNSHosIEJ1cnN0IERNQSBpbiBFQ1AgKi8KCQlhbGlfd3JpdGUoMHhmMSwgMHgwNSk7Cgl9CglBTElfQ0xPU0UoKTsKCn0KCnZvaWQgYWxpNTEyeF9zZXRfdWFydChpbnQgZW5hYmxlZCwgaW50IGluZGV4LCB1MTYgaW8sIHU4IGlycSkKewoJQUxJX09QRU4oKTsKCUFMSV9TRUxERVYoaW5kZXg/NTo0KTsKCglhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOwoJaWYgKGVuYWJsZWQpIHsKCQlhbGlfd3JpdGUoMHg2MCwgaW8gPj4gOCk7CgkJYWxpX3dyaXRlKDB4NjEsIGlvICYgMHhmZik7CgkJYWxpX3dyaXRlKDB4NzAsIGlycSk7CgoJCWFsaV93cml0ZSgweGYwLCAweDAwKTsKCQlhbGlfd3JpdGUoMHhmMSwgMHgwMCk7CgoJCS8qIGh1aD8gd3JpdGUgMHhmMiB0d2ljZSAtIGEgdHlwbyBpbiByb2xvCgkJICogb3Igc29tZSBzZWNyZXQgYWxpIGVycmF0YT8gV2hvIGtub3dzPwoJCSAqLwoJCWlmIChpbmRleCkgewoJCQlhbGlfd3JpdGUoMHhmMiwgMHgwMCk7CgkJfQoJCWFsaV93cml0ZSgweGYyLCAweDBjKTsKCX0KCUFMSV9DTE9TRSgpOwoKfQoKdm9pZCBhbGk1MTJ4X3NldF91YXJ0Ml9pcmRhKGludCBlbmFibGVkKQp7CglBTElfT1BFTigpOwoJQUxJX1NFTERFVig1KTsKCglhbGlfd3JpdGUoMHhmMSwgZW5hYmxlZD8weDQ4OjB4MDApOyAvKiBmdWxsZHVwbGV4IElyRGEgKi8KCUFMSV9DTE9TRSgpOwoKfQoKdm9pZCBhbGk1MTJ4X3NldF9ydGMoaW50IGVuYWJsZWQsIHUxNiBpbywgdTggaXJxKQp7CglBTElfT1BFTigpOwoJQUxJX1NFTERFVig2KTsKCglhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOwoJaWYgKGVuYWJsZWQpIHsKCQlhbGlfd3JpdGUoMHg2MCwgaW8gPj4gOCk7CgkJYWxpX3dyaXRlKDB4NjEsIGlvICYgMHhmZik7CgkJYWxpX3dyaXRlKDB4NzAsIGlycSk7CgoJCWFsaV93cml0ZSgweGYwLCAweDAwKTsKCX0KCUFMSV9DTE9TRSgpOwp9Cgp2b2lkIGFsaTUxMnhfc2V0X2tiYyhpbnQgZW5hYmxlZCwgdTgga2JjX2lycSwgdTggbW91c2VfaXJxKQp7CglBTElfT1BFTigpOwoJQUxJX1NFTERFVig3KTsKCglhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOwoJaWYgKGVuYWJsZWQpIHsKCQlhbGlfd3JpdGUoMHg3MCwga2JjX2lycSk7CgkJYWxpX3dyaXRlKDB4NzIsIG1vdXNlX2lycSk7CgoJCWFsaV93cml0ZSgweGYwLCAweDAwKTsKCX0KCUFMSV9DTE9TRSgpOwp9CgoKLyogQ29tbW9uIEkvTwogKgogKiAoVGhpcyBkZXNjcmlwb3RzaW9uIGlzIGJhc2Ugb24gc2V2ZXJhbCBpbmNvbXBldGUgc291cmNlcwogKiAgc2luY2UgSSBoYXZlIG5vdCBiZWVuIGFibGUgdG8gb2J0YWluIGFueSBkYXRhc2hlZXQgZm9yIHRoZSBkZXZpY2UKICogIHRoZXJlIG1heSBiZSBzb21lIG1pcy11bmRlcnN0YW5kaW5ncyBidXJyaWVkIGluIGhlcmUuCiAqICAtLSBEYW5pZWwgZGFuaWVsQG9taWNyb24uc2UpCiAqCiAqIFRoZXJlIGFyZSAyMiBDSU8gcGlucyBudW1iZXJlZAogKiAxMC0xNwogKiAyMC0yNQogKiAzMC0zNwogKgogKiAyMC0yNCBhcmUgZGVkaWNhdGVkIENJTyBwaW5zLCB0aGUgb3RoZXIgMTcgYXJlIG11bGlwbGV4ZWQgd2l0aAogKiBvdGhlciBmdW5jdGlvbnMuCiAqCiAqICAgICAgICAgICBTZWNvbmRhcnkKICogQ0lPIFBpbiAgIEZ1bmN0aW9uICAgIERlY3JpcHRpb24KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBDSU8xMCAgICAgSVJRSU4xICAgICAgSW50ZXJydXB0IGlucHV0IDE/CiAqIENJTzExICAgICBJUlFJTjIgICAgICBJbnRlcnJ1cHQgaW5wdXQgMj8KICogQ0lPMTIgICAgIElSUlggICAgICAgIElyRGEgUmVjZWl2ZQogKiBDSU8xMyAgICAgSVJUWCAgICAgICAgSXJEYSBUcmFuc21pdAogKiBDSU8xNCAgICAgUDIxICAgICAgICAgS0JDIFAyMSBmdWNudGlvbgogKiBDSU8xNSAgICAgUDIwICAgICAgICAgS0JDIFAyMSBmdWNudGlvbgogKiBDSU8xNiAgICAgSTJDX0NMSyAgICAgSTJDIENsb2NrCiAqIENJTzE3ICAgICBJMkNfREFUICAgICBJMkMgRGF0YQogKgogKiBDSU8yMCAgICAgLQogKiBDSU8yMSAgICAgLQogKiBDSU8yMiAgICAgLQogKiBDSU8yMyAgICAgLQogKiBDSU8yNCAgICAgLQogKiBDSU8yNSAgICAgTE9DSyAgICAgICAgS2V5bG9jawogKgogKiBDSU8zMCAgICAgS0JDX0NMSyAgICAgS2V5YmFvcmQgQ2xvY2sKICogQ0lPMzEgICAgIENTMEogICAgICAgIEdlbmVyYWwgQ2hpcCBTZWxlY3QgZGVjb2RlciBDUzBKCiAqIENJTzMyICAgICBDUzFKICAgICAgICBHZW5lcmFsIENoaXAgU2VsZWN0IGRlY29kZXIgQ1MxSgogKiBDSU8zMyAgICAgQUxUX0tDTEsgICAgQWx0ZXJuYXRpdmUgS2V5Ym9hcmQgQ2xvY2sKICogQ0lPMzQgICAgIEFMVF9LREFUICAgIEFsdGVybmF0aXZlIEtleWJvYXJkIERhdGEKICogQ0lPMzUgICAgIEFMVF9NQ0xLICAgIEFsdGVybmF0aXZlIE1vdXNlIENsb2NrCiAqIENJTzM2ICAgICBBTFRfTURBVCAgICBBbHRlcm5hdGl2ZSBNb3VzZSBEYXRhCiAqIENJTzM3ICAgICBBTFRfS0JDICAgICBBbHRlcm5hdGl2ZSBLQkMgc2VsZWN0CiAqCiAqIFRoZSBDSU8gdXNlIGFuIGluZGlyZWN0IGFkZHJlc3Mgc2NoZW1lLgogKgogKiBSZWlnc3RlciAzIGluIHRoZSBTSU8gaXMgdXNlZCB0byBzZWxlY3QgdGhlIGluZGV4IGFuZCBkYXRhCiAqIHBvcnQgYWRkcmVzc2VzIHdoZXJlIHRoZSBDSU8gSS9PIHJlZ2lzdGVycyBzaG93IHVwLgogKiBUaGUgZnVuY3Rpb24gc2VsZWN0aW9uIHJlZ2lzdGVycyBhcmUgYWNjZXNzaWJsZSB1bmRlcgogKiBmdW5jdGlvbiBTSU8gOC4KICoKICogU0lPIHJlaWdzdGVyIDMgKENJTyBBZGRyZXNzIFNlbGVjdGlvbikgYml0IGRlZmluaXRpb25zOgogKiBiaXQgNyAgIENJTyBpbmRleCBhbmQgZGF0YSByZWdpc3RlcnMgZW5hYmxlZAogKiBiaXQgMS0wIENJTyBpbmRpcmVjdCByZWdpc3RlcnMgcG9ydCBhZGRyZXNzIHNlbGVjdAogKgkgMCAgaW5kZXggPSAweEUwIGRhdGEgPSAweEUxCiAqICAgICAgIDEgIGluZGV4ID0gMHhFMiBkYXRhID0gMHhFMwogKiAgICAgICAyICBpbmRleCA9IDB4RTQgZGF0YSA9IDB4RTUKICogICAgICAgMyAgaW5kZXggPSAweEVBIGRhdGEgPSAweEVCCiAqCiAqIFRoZXJlIGFyZSB0aHJlZSBDSU8gSS9PIHJlZ2lzdGVyIGFjY2Vzc2VkIHZpYSBDSU8gaW5kZXggcG9ydCBhbmQgQ0lPIGRhdGEgcG9ydAogKiAweDAxICAgICBDSU8gMTAtMTcgZGF0YQogKiAweDAyICAgICBDSU8gMjAtMjUgZGF0YSAoYml0cyA3LTYgdW51c2VkKQogKiAweDAzICAgICBDSU8gMzAtMzcgZGF0YQogKgogKgogKiBUaGUgcGluIGZ1bmN0aW9uIGlzIGFjY2Vzc2VkIHRocm91Z2ggbm9ybWFsCiAqIFNJTyByZWdpc3RlcnMsIGVhY2ggcmVnaXN0ZXIgaGF2ZSB0aGUgc2FtZSBmb3JtYXQ6CiAqCiAqIEJpdCAgIEZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgVmFsdWUKICogMCAgICAgSW5wdXQvb3V0cHV0ICAgICAgICAgICAgICAgICAxPWlucHV0CiAqIDEgICAgIFBvbGFyaXR5IG9mIHNpZ25hbCAgICAgICAgICAgMT1pbnZlcnRlZAogKiAyICAgICBVbnVzZWQgICAgICAgICAgICAgICAgICAgICAgID8/CiAqIDMgICAgIEZ1bmN0aW9uIChub3JtYWwgb3Igc3BlY2lhbCkgMT1zcGVjaWFsCiAqIDctNCAgIFVudXNlZAogKgogKiBTSU8gUkVHCiAqIDB4ZTAgICAgIENJTyAxMCBDb25maWcKICogMHhlMSAgICAgQ0lPIDExIENvbmZpZwogKiAweGUyICAgICBDSU8gMTIgQ29uZmlnCiAqIDB4ZTMgICAgIENJTyAxMyBDb25maWcKICogMHhlNCAgICAgQ0lPIDE0IENvbmZpZwogKiAweGU1ICAgICBDSU8gMTUgQ29uZmlnCiAqIDB4ZTYgICAgIENJTyAxNiBDb25maWcKICogMHhlNyAgICAgQ0lPIDE2IENvbmZpZwogKgogKiAweGU4ICAgICBDSU8gMjAgQ29uZmlnCiAqIDB4ZTkgICAgIENJTyAyMSBDb25maWcKICogMHhlYSAgICAgQ0lPIDIyIENvbmZpZwogKiAweGViICAgICBDSU8gMjMgQ29uZmlnCiAqIDB4ZWMgICAgIENJTyAyNCBDb25maWcKICogMHhlZCAgICAgQ0lPIDI1IENvbmZpZwogKgogKiAweGY1ICAgICBDSU8gMzAgQ29uZmlnCiAqIDB4ZjYgICAgIENJTyAzMSBDb25maWcKICogMHhmNyAgICAgQ0lPIDMyIENvbmZpZwogKiAweGY4ICAgICBDSU8gMzMgQ29uZmlnCiAqIDB4ZjkgICAgIENJTyAzNCBDb25maWcKICogMHhmYSAgICAgQ0lPIDM1IENvbmZpZwogKiAweGZiICAgICBDSU8gMzYgQ29uZmlnCiAqIDB4ZmMgICAgIENJTyAzNyBDb25maWcKICoKICovCgojZGVmaW5lIEFMSV9DSU9fUE9SVF9TRUwgMHg4MwojZGVmaW5lIEFMSV9DSU9fSU5ERVggICAgMHhlYQojZGVmaW5lIEFMSV9DSU9fREFUQSAgICAgMHhlYgoKdm9pZCBhbGk1MTJ4X3NldF9jaW8oaW50IGVuYWJsZWQpCnsKCWludCBpOwoKCUFMSV9PUEVOKCk7CgoJaWYgKGVuYWJsZWQpIHsKCQlhbGlfd3JpdGUoMHgzLCBBTElfQ0lPX1BPUlRfU0VMKTsgICAgLyogRW5hYmxlIENJTyBkYXRhIHJlZ2lzdGVyICovCgl9IGVsc2UgewoJCWFsaV93cml0ZSgweDMsIEFMSV9DSU9fUE9SVF9TRUwgJiB+MHg4MCk7Cgl9CgoJQUxJX1NFTERFVig4KTsKCglhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOwoKCS8qIHNldCBhbGwgcGlucyB0byBpbnB1dCB0byBzdGFydCB3aXRoICovCglmb3IgKGk9MHhlMDtpPDB4ZWU7aSsrKSB7CgkJYWxpX3dyaXRlKGksIDEpOwoJfQoKCWZvciAoaT0weGY1O2k8MHhmZTtpKyspIHsKCQlhbGlfd3JpdGUoaSwgMSk7Cgl9CgoJQUxJX0NMT1NFKCk7Cn0KCgp2b2lkIGFsaTUxMnhfY2lvX2Z1bmN0aW9uKGludCBwaW4sIGludCBzcGVjaWFsLCBpbnQgaW52LCBpbnQgaW5wdXQpCnsKCXU4IGRhdGE7Cgl1OCBhZGRyOwoKCS8qIHZhbGlkIHBpbnMgYXJlIDEwLTE3LCAyMC0yNSBhbmQgMzAtMzcgKi8KCWlmIChwaW4gPj0gMTAgJiYgcGluIDw9IDE3KSB7CgkJYWRkciA9IDB4ZTArKHBpbiY3KTsKCX0gZWxzZSBpZiAocGluID49IDIwICYmIHBpbiA8PSAyNSkgewoJCWFkZHIgPSAweGU4KyhwaW4mNyk7Cgl9IGVsc2UgaWYgKHBpbiA+PSAzMCAmJiBwaW4gPD0gMzcpIHsKCQlhZGRyID0gMHhmNSsocGluJjcpOwoJfSBlbHNlIHsKCQlyZXR1cm47Cgl9CgoJQUxJX09QRU4oKTsKCglBTElfU0VMREVWKDgpOwoKCglkYXRhPTB4ZjQ7CglpZiAoc3BlY2lhbCkgewoJCWRhdGEgfD0gMHgwODsKCX0gZWxzZSB7CgkJaWYgKGludikgewoJCQlkYXRhIHw9IDB4MDI7CgkJfQoJCWlmIChpbnB1dCkgewoJCQlkYXRhIHw9IDB4MDE7CgkJfQoJfQoKCWFsaV93cml0ZShhZGRyLCBkYXRhKTsKCglBTElfQ0xPU0UoKTsKfQoKdm9pZCBhbGk1MTJ4X2Npb19vdXQoaW50IHBpbiwgaW50IHZhbHVlKQp7Cgl1OCByZWc7Cgl1OCBkYXRhOwoJdTggYml0OwoKCXJlZyA9IHBpbi8xMDsKCWJpdCA9IDEgPDwgKHBpbiUxMCk7CgoKCW91dGIocmVnLCBBTElfQ0lPX0lOREVYKTsgICAgIC8qIHNlbGVjdCBJL08gcmVnaXN0ZXIgKi8KCWRhdGEgPSBpbmIoQUxJX0NJT19EQVRBKTsKCWlmICh2YWx1ZSkgewoJCWRhdGEgfD0gYml0OwoJfSBlbHNlIHsKCQlkYXRhICY9IH5iaXQ7Cgl9CglvdXRiKGRhdGEsIEFMSV9DSU9fREFUQSk7Cn0KCmludCBhbGk1MTJ4X2Npb19pbihpbnQgcGluKQp7Cgl1OCByZWc7Cgl1OCBkYXRhOwoJdTggYml0OwoKCS8qIHZhbGlkIHBpbnMgYXJlIDEwLTE3LCAyMC0yNSBhbmQgMzAtMzcgKi8KCXJlZyA9IHBpbi8xMDsKCWJpdCA9IDEgPDwgKHBpbiUxMCk7CgoKCW91dGIocmVnLCBBTElfQ0lPX0lOREVYKTsgICAgIC8qIHNlbGVjdCBJL08gcmVnaXN0ZXIgKi8KCWRhdGEgPSBpbmIoQUxJX0NJT19EQVRBKTsKCglyZXR1cm4gZGF0YSAmIGJpdDsKfQo=