LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCA8ZGFuaWVsQG9taWNyb24uc2U+CiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKLyoKICogUGFydGx5IGJhc2VkIG9uIG1zYmlvcy5jIGZyb20gcm9sbyAxLjY6CiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAoQykgQ29weXJpZ2h0IDIwMDAKICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucyBHbWJICiAqIEtsZWluLVdpbnRlcm5oZWltLCBHZXJtYW55CiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPHBjaS5oPgojaW5jbHVkZSA8YXNtL3JlYWxtb2RlLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KCkRFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwoKI2RlZmluZSBOVU1WRUNUUwkyNTYKCiNkZWZpbmUgQklPU19EQVRBICAgICAgICAoKGNoYXIqKTB4NDAwKQojZGVmaW5lIEJJT1NfREFUQV9TSVpFICAgMjU2CiNkZWZpbmUgQklPU19CQVNFICAgICAgICAoKGNoYXIqKTB4ZjAwMDApCiNkZWZpbmUgQklPU19DUyAgICAgICAgICAweGYwMDAKCmV4dGVybiB1bG9uZyBfX2Jpb3Nfc3RhcnQ7CmV4dGVybiB1bG9uZyBfX2Jpb3Nfc2l6ZTsKCi8qIHRoZXNlIGFyZSBkZWZpbmVkIGluIGEgMTZiaXQgc2VnbWVudCBhbmQgbmVlZHMKICogdG8gYmUgYWNjZXNzZWQgd2l0aCB0aGUgUkVMT0NfMTZfeHh4eCgpIG1hY3JvcyBiZWxvdwogKi8KZXh0ZXJuIHUxNiByYW1faW5fNjRrYl9jaHVua3M7CmV4dGVybiB1MTYgYmlvc19lcXVpcG1lbnQ7CmV4dGVybiB1OCAgcGNpX2xhc3RfYnVzOwoKZXh0ZXJuIHZvaWQgKnJtX2ludDAwOwpleHRlcm4gdm9pZCAqcm1faW50MDE7CmV4dGVybiB2b2lkICpybV9pbnQwMjsKZXh0ZXJuIHZvaWQgKnJtX2ludDAzOwpleHRlcm4gdm9pZCAqcm1faW50MDQ7CmV4dGVybiB2b2lkICpybV9pbnQwNTsKZXh0ZXJuIHZvaWQgKnJtX2ludDA2OwpleHRlcm4gdm9pZCAqcm1faW50MDc7CmV4dGVybiB2b2lkICpybV9pbnQwODsKZXh0ZXJuIHZvaWQgKnJtX2ludDA5OwpleHRlcm4gdm9pZCAqcm1faW50MGE7CmV4dGVybiB2b2lkICpybV9pbnQwYjsKZXh0ZXJuIHZvaWQgKnJtX2ludDBjOwpleHRlcm4gdm9pZCAqcm1faW50MGQ7CmV4dGVybiB2b2lkICpybV9pbnQwZTsKZXh0ZXJuIHZvaWQgKnJtX2ludDBmOwpleHRlcm4gdm9pZCAqcm1faW50MTA7CmV4dGVybiB2b2lkICpybV9pbnQxMTsKZXh0ZXJuIHZvaWQgKnJtX2ludDEyOwpleHRlcm4gdm9pZCAqcm1faW50MTM7CmV4dGVybiB2b2lkICpybV9pbnQxNDsKZXh0ZXJuIHZvaWQgKnJtX2ludDE1OwpleHRlcm4gdm9pZCAqcm1faW50MTY7CmV4dGVybiB2b2lkICpybV9pbnQxNzsKZXh0ZXJuIHZvaWQgKnJtX2ludDE4OwpleHRlcm4gdm9pZCAqcm1faW50MTk7CmV4dGVybiB2b2lkICpybV9pbnQxYTsKZXh0ZXJuIHZvaWQgKnJtX2ludDFiOwpleHRlcm4gdm9pZCAqcm1faW50MWM7CmV4dGVybiB2b2lkICpybV9pbnQxZDsKZXh0ZXJuIHZvaWQgKnJtX2ludDFlOwpleHRlcm4gdm9pZCAqcm1faW50MWY7CmV4dGVybiB2b2lkICpybV9kZWZfaW50OwoKZXh0ZXJuIHZvaWQgKnJlYWxtb2RlX3Jlc2V0OwpleHRlcm4gdm9pZCAqcmVhbG1vZGVfcGNpX2Jpb3NfY2FsbF9lbnRyeTsKCnN0YXRpYyBpbnQgc2V0X2ptcF92ZWN0b3IoaW50IGVudHJ5X3BvaW50LCB2b2lkICp0YXJnZXQpCnsKCWlmIChlbnRyeV9wb2ludCAmIH4weGZmZmYpIHsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKCgodTMyKXRhcmdldC0weGYwMDAwKSAmIH4weGZmZmYpIHsKCQlyZXR1cm4gLTE7Cgl9CglwcmludGYoInNldF9qbXBfdmVjdG9yOiAweGYwMDA6JTA0eCAtPiAlcFxuIiwKCSAgICAgICBlbnRyeV9wb2ludCwgdGFyZ2V0KTsKCgkvKiBqbXAgb3Bjb2RlICovCgl3cml0ZWIoMHhlYSwgMHhmMDAwMCArIGVudHJ5X3BvaW50KTsKCgkvKiBvZmZzZXQgKi8KCXdyaXRldygoKHUzMil0YXJnZXQtMHhmMDAwMCksIDB4ZjAwMDAgKyBlbnRyeV9wb2ludCArIDEpOwoKCS8qIHNlZ21lbnQgKi8KCXdyaXRldygweGYwMDAsIDB4ZjAwMDAgKyBlbnRyeV9wb2ludCArIDMpOwoKCXJldHVybiAwOwp9CgoKLyoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJbnN0YWxsIGFuIGludGVycnVwdCB2ZWN0b3IKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KCnN0YXRpYyB2b2lkIHNldHZlY3RvcihpbnQgdmVjdG9yLCB1MTYgc2VnbWVudCwgdm9pZCAqaGFuZGxlcikKewoJdTE2ICpwdHIgPSAodTE2KikodmVjdG9yKjQpOwoJcHRyWzBdID0gKCh1MzIpaGFuZGxlciAtIChzZWdtZW50IDw8IDQpKSYweGZmZmY7CglwdHJbMV0gPSBzZWdtZW50OwoKI2lmIDAKCXByaW50Zigic2V0dmVjdG9yOiBpbnQlMDJ4IC0+ICUwNHg6JTA0eFxuIiwKCSAgICAgICB2ZWN0b3IsIHB0clsxXSwgcHRyWzBdKTsKI2VuZGlmCn0KCiNkZWZpbmUgUkVMT0NfMTZfTE9ORyhzZWcsIG9mZikgKih1MzIqKShzZWcgPDwgNCB8ICh1MzIpJm9mZikKI2RlZmluZSBSRUxPQ18xNl9XT1JEKHNlZywgb2ZmKSAqKHUxNiopKHNlZyA8PCA0IHwgKHUzMikmb2ZmKQojZGVmaW5lIFJFTE9DXzE2X0JZVEUoc2VnLCBvZmYpICoodTgqKShzZWcgPDwgNCB8ICh1MzIpJm9mZikKCmludCBiaW9zX3NldHVwKHZvaWQpCnsKCXVsb25nIGJpb3Nfc3RhcnQgPSAodWxvbmcpJl9fYmlvc19zdGFydCArIGdkLT5yZWxvY19vZmY7Cgl1bG9uZyBiaW9zX3NpemUgPSAodWxvbmcpJl9fYmlvc19zaXplOwoKCXN0YXRpYyBpbnQgZG9uZT0wOwoJaW50IHZlY3RvcjsKI2lmZGVmIENPTkZJR19QQ0kKCXN0cnVjdCBwY2lfY29udHJvbGxlciAqcHJpX2hvc2U7CiNlbmRpZgoJaWYgKGRvbmUpIHsKCQlyZXR1cm4gMDsKCX0KCWRvbmUgPSAxOwoKCWlmIChiaW9zX3NpemUgPiA2NTUzNikgewoJCXByaW50ZigiQklPUyB0b28gbGFyZ2UgKCVsZCBieXRlcywgbWF4IGlzIDY1NTM2KVxuIiwKCQkgICAgICAgYmlvc19zaXplKTsKCQlyZXR1cm4gLTE7Cgl9CgoJbWVtY3B5KEJJT1NfQkFTRSwgKHZvaWQqKWJpb3Nfc3RhcnQsIGJpb3Nfc2l6ZSk7CgoJLyogY2xlYXIgYmRhICovCgltZW1zZXQoQklPU19EQVRBLCAwLCBCSU9TX0RBVEFfU0laRSk7CgoJLyogZW50ZXIgc29tZSB2YWx1ZXMgdG8gdGhlIGJkYSAqLwoJd3JpdGV3KDB4M2Y4LCBCSU9TX0RBVEEpOyAgIC8qIGNvbTEgYWRkciAqLwoJd3JpdGV3KDB4MmY4LCBCSU9TX0RBVEErMik7IC8qIGNvbTIgYWRkciAqLwoJd3JpdGV3KDB4M2U4LCBCSU9TX0RBVEErNCk7IC8qIGNvbTMgYWRkciAqLwoJd3JpdGV3KDB4MmU4LCBCSU9TX0RBVEErNik7IC8qIGNvbTQgYWRkciAqLwoJd3JpdGV3KDB4Mjc4LCBCSU9TX0RBVEErOCk7IC8qIGxwdDEgYWRkciAqLwoJLyoKCSAqIFRoZSBrZXJuZWwgd2FudHMgdG8gcmVhZCB0aGUgYmFzZSBtZW1vcnkgc2l6ZQoJICogZnJvbSA0MDoxMy4gUHV0IGEgemVybyB0aGVyZSB0byBhdm9pZCBhbiBlcnJvciBtZXNzYWdlCgkgKi8KCXdyaXRldygwLCBCSU9TX0RBVEErMHgxMyk7ICAvKiBiYXNlIG1lbW9yeSBzaXplICovCgoKCS8qIHNldHVwIHJlYWxtb2RlIGludGVycnVwdCB2ZWN0b3JzICovCglmb3IgKHZlY3RvciA9IDA7IHZlY3RvciA8IE5VTVZFQ1RTOyB2ZWN0b3IrKykgewoJCXNldHZlY3Rvcih2ZWN0b3IsIEJJT1NfQ1MsICZybV9kZWZfaW50KTsKCX0KCglzZXR2ZWN0b3IoMHgwMCwgQklPU19DUywgJnJtX2ludDAwKTsKCXNldHZlY3RvcigweDAxLCBCSU9TX0NTLCAmcm1faW50MDEpOwoJc2V0dmVjdG9yKDB4MDIsIEJJT1NfQ1MsICZybV9pbnQwMik7CglzZXR2ZWN0b3IoMHgwMywgQklPU19DUywgJnJtX2ludDAzKTsKCXNldHZlY3RvcigweDA0LCBCSU9TX0NTLCAmcm1faW50MDQpOwoJc2V0dmVjdG9yKDB4MDUsIEJJT1NfQ1MsICZybV9pbnQwNSk7CglzZXR2ZWN0b3IoMHgwNiwgQklPU19DUywgJnJtX2ludDA2KTsKCXNldHZlY3RvcigweDA3LCBCSU9TX0NTLCAmcm1faW50MDcpOwoJc2V0dmVjdG9yKDB4MDgsIEJJT1NfQ1MsICZybV9pbnQwOCk7CglzZXR2ZWN0b3IoMHgwOSwgQklPU19DUywgJnJtX2ludDA5KTsKCXNldHZlY3RvcigweDBhLCBCSU9TX0NTLCAmcm1faW50MGEpOwoJc2V0dmVjdG9yKDB4MGIsIEJJT1NfQ1MsICZybV9pbnQwYik7CglzZXR2ZWN0b3IoMHgwYywgQklPU19DUywgJnJtX2ludDBjKTsKCXNldHZlY3RvcigweDBkLCBCSU9TX0NTLCAmcm1faW50MGQpOwoJc2V0dmVjdG9yKDB4MGUsIEJJT1NfQ1MsICZybV9pbnQwZSk7CglzZXR2ZWN0b3IoMHgwZiwgQklPU19DUywgJnJtX2ludDBmKTsKCXNldHZlY3RvcigweDEwLCBCSU9TX0NTLCAmcm1faW50MTApOwoJc2V0dmVjdG9yKDB4MTEsIEJJT1NfQ1MsICZybV9pbnQxMSk7CglzZXR2ZWN0b3IoMHgxMiwgQklPU19DUywgJnJtX2ludDEyKTsKCXNldHZlY3RvcigweDEzLCBCSU9TX0NTLCAmcm1faW50MTMpOwoJc2V0dmVjdG9yKDB4MTQsIEJJT1NfQ1MsICZybV9pbnQxNCk7CglzZXR2ZWN0b3IoMHgxNSwgQklPU19DUywgJnJtX2ludDE1KTsKCXNldHZlY3RvcigweDE2LCBCSU9TX0NTLCAmcm1faW50MTYpOwoJc2V0dmVjdG9yKDB4MTcsIEJJT1NfQ1MsICZybV9pbnQxNyk7CglzZXR2ZWN0b3IoMHgxOCwgQklPU19DUywgJnJtX2ludDE4KTsKCXNldHZlY3RvcigweDE5LCBCSU9TX0NTLCAmcm1faW50MTkpOwoJc2V0dmVjdG9yKDB4MWEsIEJJT1NfQ1MsICZybV9pbnQxYSk7CglzZXR2ZWN0b3IoMHgxYiwgQklPU19DUywgJnJtX2ludDFiKTsKCXNldHZlY3RvcigweDFjLCBCSU9TX0NTLCAmcm1faW50MWMpOwoJc2V0dmVjdG9yKDB4MWQsIEJJT1NfQ1MsICZybV9pbnQxZCk7CglzZXR2ZWN0b3IoMHgxZSwgQklPU19DUywgJnJtX2ludDFlKTsKCXNldHZlY3RvcigweDFmLCBCSU9TX0NTLCAmcm1faW50MWYpOwoKCXNldF9qbXBfdmVjdG9yKDB4ZmZmMCwgJnJlYWxtb2RlX3Jlc2V0KTsKCXNldF9qbXBfdmVjdG9yKDB4ZmU2ZSwgJnJlYWxtb2RlX3BjaV9iaW9zX2NhbGxfZW50cnkpOwoKCS8qIGZpbGwgaW4gZGF0YSBhcmVhICovCglSRUxPQ18xNl9XT1JEKDB4ZjAwMCwgcmFtX2luXzY0a2JfY2h1bmtzKSA9IGdkLT5yYW1fc2l6ZSA+PiAxNjsKCVJFTE9DXzE2X1dPUkQoMHhmMDAwLCBiaW9zX2VxdWlwbWVudCkgPSAwOyAvKiBGaXhNZSAqLwoKCS8qIElmIHdlIGFzc3VtZSBvbmx5IG9uZSBQQ0kgaG9zZSwgdGhpcyBQQ0kgaG9zZQoJICogd2lsbCBvd24gUENJIGJ1cyAjMCwgYW5kIHRoZSBsYXN0IFBDSSBidXMgb2YKCSAqIHRoYXQgUENJIGhvc2Ugd2lsbCBiZSB0aGUgbGFzdCBQQ0kgYnVzIGluIHRoZQoJICogc3lzdGVtLgoJICogKFRoaXMsIG9mY2F1c2UgYnJlYWsgb24gbXVsdGkgaG9zZSBzeXN0ZW1zLAoJICogIGJ1dCBvdXIgUENJIEJJT1Mgb25seSBzdXBwb3J0IG9uZSBob3NlIGFueXdheSkKCSAqLwojaWZkZWYgQ09ORklHX1BDSQoJcHJpX2hvc2UgPSBwY2lfYnVzX3RvX2hvc2UoMCk7CglpZiAoTlVMTCAhPSBwcmlfaG9zZSkgewoJCS8qIGZpbGwgaW4gbGFzdCBwY2kgYnVzIG51bWJlciBmb3IgdXNlIGJ5IHRoZSByZWFsbW9kZQoJCSAqIFBDSSBCSU9TICovCgkJUkVMT0NfMTZfQllURSgweGYwMDAsIHBjaV9sYXN0X2J1cykgPSBwcmlfaG9zZS0+bGFzdF9idXNubzsKCX0KI2VuZGlmCglyZXR1cm4gMDsKfQo=