LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKLyogc3R1ZmYgc3BlY2lmaWMgZm9yIHRoZSBzYzUyMCwgYnV0IGluZGVwZW5kZW50IG9mIGltcGxlbWVudGF0aW9uICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxhc20vaWMvc3NpLmg+CiNpbmNsdWRlIDxhc20vaWMvc2M1MjAuaD4KCmludCBzc2lfc2V0X2ludGVyZmFjZShpbnQgZnJlcSwgaW50IGxzYl9maXJzdCwgaW50IGludl9jbG9jaywgaW50IGludl9waGFzZSkKewoJdTggdGVtcD0wOwoKCWlmIChmcmVxID49IDgxOTIpIHsKCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzQ7Cgl9IGVsc2UgaWYgKGZyZXEgPj0gNDA5NikgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfODsKCX0gZWxzZSBpZiAoZnJlcSA+PSAyMDQ4KSB7CgkJdGVtcCB8PSBDVExfQ0xLX1NFTF8xNjsKCX0gZWxzZSBpZiAoZnJlcSA+PSAxMDI0KSB7CgkJdGVtcCB8PSBDVExfQ0xLX1NFTF8zMjsKCX0gZWxzZSBpZiAoZnJlcSA+PSA1MTIpIHsKCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzY0OwoJfSBlbHNlIGlmIChmcmVxID49IDI1NikgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfMTI4OwoJfSBlbHNlIGlmIChmcmVxID49IDEyOCkgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfMjU2OwoJfSBlbHNlIHsKCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzUxMjsKCX0KCglpZiAoIWxzYl9maXJzdCkgewoJCXRlbXAgfD0gTVNCRl9FTkI7Cgl9CgoJaWYgKGludl9jbG9jaykgewoJCXRlbXAgfD0gQ0xLX0lOVl9FTkI7Cgl9CgoJaWYgKGludl9waGFzZSkgewoJCXRlbXAgfD0gUEhTX0lOVl9FTkI7Cgl9CgoJc2M1MjBfbW1jci0+c3NpY3RsID0gdGVtcDsKCglyZXR1cm4gMDsKfQoKdTggc3NpX3R4cnhfYnl0ZSh1OCBkYXRhKQp7CglzYzUyMF9tbWNyLT5zc2l4bWl0ID0gZGF0YTsKCXdoaWxlIChzYzUyMF9tbWNyLT5zc2lzdGEgJiBTU0lTVEFfQlNZKTsKCXNjNTIwX21tY3ItPnNzaWNtZCA9IFNTSUNNRF9DTURfU0VMX1hNSVRSQ1Y7Cgl3aGlsZSAoc2M1MjBfbW1jci0+c3Npc3RhICYgU1NJU1RBX0JTWSk7CgoJcmV0dXJuIHNjNTIwX21tY3ItPnNzaXJjdjsKfQoKCnZvaWQgc3NpX3R4X2J5dGUodTggZGF0YSkKewoJc2M1MjBfbW1jci0+c3NpeG1pdCA9IGRhdGE7Cgl3aGlsZSAoc2M1MjBfbW1jci0+c3Npc3RhICYgU1NJU1RBX0JTWSk7CglzYzUyMF9tbWNyLT5zc2ljbWQgPSBTU0lDTURfQ01EX1NFTF9YTUlUOwp9Cgp1OCBzc2lfcnhfYnl0ZSh2b2lkKQp7Cgl3aGlsZSAoc2M1MjBfbW1jci0+c3Npc3RhICYgU1NJU1RBX0JTWSk7CglzYzUyMF9tbWNyLT5zc2ljbWQgPSBTU0lDTURfQ01EX1NFTF9SQ1Y7Cgl3aGlsZSAoc2M1MjBfbW1jci0+c3Npc3RhICYgU1NJU1RBX0JTWSk7CgoJcmV0dXJuIHNjNTIwX21tY3ItPnNzaXJjdjsKfQo=