LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKiAKICogKEMpIENvcHlyaWdodCAyMDAwCiAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgKi8KCi8qCiAqIFRoaXMgc291cmNlIGNvZGUgaGFzIGJlZW4gbWFkZSBhdmFpbGFibGUgdG8geW91IGJ5IElCTSBvbiBhbiBBUy1JUwogKiBiYXNpcy4gIEFueW9uZSByZWNlaXZpbmcgdGhpcyBzb3VyY2UgaXMgbGljZW5zZWQgdW5kZXIgSUJNCiAqIGNvcHlyaWdodHMgdG8gdXNlIGl0IGluIGFueSB3YXkgaGUgb3Igc2hlIGRlZW1zIGZpdCwgaW5jbHVkaW5nCiAqIGNvcHlpbmcgaXQsIG1vZGlmeWluZyBpdCwgY29tcGlsaW5nIGl0LCBhbmQgcmVkaXN0cmlidXRpbmcgaXQgZWl0aGVyCiAqIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLiAgTm8gbGljZW5zZSB1bmRlciBJQk0gcGF0ZW50cyBvcgogKiBwYXRlbnQgYXBwbGljYXRpb25zIGlzIHRvIGJlIGltcGxpZWQgYnkgdGhlIGNvcHlyaWdodCBsaWNlbnNlLgogKgogKiBBbnkgdXNlciBvZiB0aGlzIHNvZnR3YXJlIHNob3VsZCB1bmRlcnN0YW5kIHRoYXQgSUJNIGNhbm5vdCBwcm92aWRlCiAqIHRlY2huaWNhbCBzdXBwb3J0IGZvciB0aGlzIHNvZnR3YXJlIGFuZCB3aWxsIG5vdCBiZSByZXNwb25zaWJsZSBmb3IKICogYW55IGNvbnNlcXVlbmNlcyByZXN1bHRpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiAqCiAqIEFueSBwZXJzb24gd2hvIHRyYW5zZmVycyB0aGlzIHNvdXJjZSBjb2RlIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsKICogbXVzdCBpbmNsdWRlIHRoZSBJQk0gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBwYXJhZ3JhcGgsIGFuZCB0aGUKICogcHJlY2VkaW5nIHR3byBwYXJhZ3JhcGhzIGluIHRoZSB0cmFuc2ZlcnJlZCBzb2Z0d2FyZS4KICoKICogQ09QWVJJR0hUICAgSSBCIE0gICBDT1JQT1JBVElPTiAxOTk1CiAqIExJQ0VOU0VEIE1BVEVSSUFMICAtICBQUk9HUkFNIFBST1BFUlRZIE9GIEkgQiBNCiAqLwovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPHdhdGNoZG9nLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9pYm1wYy5oPgoKI2lmIENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTwojaW5jbHVkZSA8bWFsbG9jLmg+CiNlbmRpZgoKI2RlZmluZSBVQVJUX1JCUiAgICAweDAwCiNkZWZpbmUgVUFSVF9USFIgICAgMHgwMAojZGVmaW5lIFVBUlRfSUVSICAgIDB4MDEKI2RlZmluZSBVQVJUX0lJUiAgICAweDAyCiNkZWZpbmUgVUFSVF9GQ1IgICAgMHgwMgojZGVmaW5lIFVBUlRfTENSICAgIDB4MDMKI2RlZmluZSBVQVJUX01DUiAgICAweDA0CiNkZWZpbmUgVUFSVF9MU1IgICAgMHgwNQojZGVmaW5lIFVBUlRfTVNSICAgIDB4MDYKI2RlZmluZSBVQVJUX1NDUiAgICAweDA3CiNkZWZpbmUgVUFSVF9ETEwgICAgMHgwMAojZGVmaW5lIFVBUlRfRExNICAgIDB4MDEKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgfCBMaW5lIFN0YXR1cyBSZWdpc3Rlci4KICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojZGVmaW5lIGFzeW5jTFNSRGF0YVJlYWR5MSAgICAgICAgICAgIDB4MDEKI2RlZmluZSBhc3luY0xTUk92ZXJydW5FcnJvcjEgICAgICAgICAweDAyCiNkZWZpbmUgYXN5bmNMU1JQYXJpdHlFcnJvcjEgICAgICAgICAgMHgwNAojZGVmaW5lIGFzeW5jTFNSRnJhbWluZ0Vycm9yMSAgICAgICAgIDB4MDgKI2RlZmluZSBhc3luY0xTUkJyZWFrSW50ZXJydXB0MSAgICAgICAweDEwCiNkZWZpbmUgYXN5bmNMU1JUeEhvbGRFbXB0eTEgICAgICAgICAgMHgyMAojZGVmaW5lIGFzeW5jTFNSVHhTaGlmdEVtcHR5MSAgICAgICAgIDB4NDAKI2RlZmluZSBhc3luY0xTUlJ4Rmlmb0Vycm9yMSAgICAgICAgICAweDgwCgoKCiNpZiBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICB8IEZpZm8KICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp0eXBlZGVmIHN0cnVjdCB7CgljaGFyICpyeF9idWZmZXI7Cgl1bG9uZyByeF9wdXQ7Cgl1bG9uZyByeF9nZXQ7CglpbnQgY3RzOwp9IHNlcmlhbF9idWZmZXJfdDsKCnZvbGF0aWxlIHNlcmlhbF9idWZmZXJfdCBidWZfaW5mbzsKc3RhdGljIGludCBzZXJpYWxfYnVmZmVyX2FjdGl2ZT0wOwojZW5kaWYKCgpzdGF0aWMgaW50IHNlcmlhbF9kaXYoaW50IGJhdWRyYXRlKQp7CgkKCXN3aXRjaCAoYmF1ZHJhdGUpIHsKCWNhc2UgMTIwMDoKCQlyZXR1cm4gOTY7CgljYXNlIDk2MDA6CgkJcmV0dXJuIDEyOwoJY2FzZSAxOTIwMDoKCQlyZXR1cm4gNjsKCWNhc2UgMzg0MDA6CgkJcmV0dXJuIDM7CgljYXNlIDU3NjAwOgoJCXJldHVybiAyOwoJY2FzZSAxMTUyMDA6CgkJcmV0dXJuIDE7CQkKCX0KCQoJcmV0dXJuIDEyOwp9CgoKLyoKICogTWluaW1hbCBzZXJpYWwgZnVuY3Rpb25zIG5lZWRlZCB0byB1c2Ugb25lIG9mIHRoZSBTTUMgcG9ydHMKICogYXMgc2VyaWFsIGNvbnNvbGUgaW50ZXJmYWNlLgogKi8KCmludCBzZXJpYWxfaW5pdCh2b2lkKQp7CglERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKCgl2b2xhdGlsZSBjaGFyIHZhbDsKCglpbnQgYmRpdiA9IHNlcmlhbF9kaXYoZ2QtPmJhdWRyYXRlKTsKICAgIAoKCW91dGIoMHg4MCwgVUFSVDBfQkFTRSArIFVBUlRfTENSKTsJLyogc2V0IERMQUIgYml0ICovCglvdXRiKGJkaXYsIFVBUlQwX0JBU0UgKyBVQVJUX0RMTCk7CS8qIHNldCBiYXVkcmF0ZSBkaXZpc29yICovCglvdXRiKGJkaXYgPj4gOCwgVUFSVDBfQkFTRSArIFVBUlRfRExNKTsvKiBzZXQgYmF1ZHJhdGUgZGl2aXNvciAqLwoJb3V0YigweDAzLCBVQVJUMF9CQVNFICsgVUFSVF9MQ1IpOwkvKiBjbGVhciBETEFCOyBzZXQgOCBiaXRzLCBubyBwYXJpdHkgKi8KCW91dGIoMHgwMSwgVUFSVDBfQkFTRSArIFVBUlRfRkNSKTsJLyogZW5hYmxlIEZJRk8gKi8KCW91dGIoMHgwYiwgVUFSVDBfQkFTRSArIFVBUlRfTUNSKTsJLyogU2V0IERUUiBhbmQgUlRTIGFjdGl2ZSAqLwoJdmFsID0gaW5iKFVBUlQwX0JBU0UgKyBVQVJUX0xTUik7CS8qIGNsZWFyIGxpbmUgc3RhdHVzICovCgl2YWwgPSBpbmIoVUFSVDBfQkFTRSArIFVBUlRfUkJSKTsJLyogcmVhZCByZWNlaXZlIGJ1ZmZlciAqLwoJb3V0YigweDAwLCBVQVJUMF9CQVNFICsgVUFSVF9TQ1IpOwkvKiBzZXQgc2NyYXRjaHBhZCAqLwoJb3V0YigweDAwLCBVQVJUMF9CQVNFICsgVUFSVF9JRVIpOwkvKiBzZXQgaW50ZXJydXB0IGVuYWJsZSByZWcgKi8KCglyZXR1cm4gMDsKfQoKCnZvaWQgc2VyaWFsX3NldGJyZyh2b2lkKQp7CglERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKCgl1bnNpZ25lZCBzaG9ydCBiZGl2OwoJCgliZGl2ID0gc2VyaWFsX2RpdihnZC0+YmF1ZHJhdGUpOwoKCW91dGIoMHg4MCwgVUFSVDBfQkFTRSArIFVBUlRfTENSKTsJLyogc2V0IERMQUIgYml0ICovCglvdXRiKGJkaXYmMHhmZiwgVUFSVDBfQkFTRSArIFVBUlRfRExMKTsJLyogc2V0IGJhdWRyYXRlIGRpdmlzb3IgKi8KCW91dGIoYmRpdiA+PiA4LCBVQVJUMF9CQVNFICsgVUFSVF9ETE0pOy8qIHNldCBiYXVkcmF0ZSBkaXZpc29yICovCglvdXRiKDB4MDMsIFVBUlQwX0JBU0UgKyBVQVJUX0xDUik7CS8qIGNsZWFyIERMQUI7IHNldCA4IGJpdHMsIG5vIHBhcml0eSAqLwp9CgoKdm9pZCBzZXJpYWxfcHV0Yyhjb25zdCBjaGFyIGMpCnsKCWludCBpOwoKCWlmIChjID09ICdcbicpCgkJc2VyaWFsX3B1dGMgKCdccicpOwoKCS8qIGNoZWNrIFRIUkUgYml0LCB3YWl0IGZvciB0cmFuc21pdGVyIGF2YWlsYWJsZSAqLwoJZm9yIChpID0gMTsgaSA8IDM1MDA7IGkrKykgewoJCWlmICgoaW5iIChVQVJUMF9CQVNFICsgVUFSVF9MU1IpICYgMHgyMCkgPT0gMHgyMCkgewoJCQlicmVhazsKCQl9CgkJdWRlbGF5KDEwMCk7Cgl9CglvdXRiKGMsIFVBUlQwX0JBU0UgKyBVQVJUX1RIUik7CS8qIHB1dCBjaGFyYWN0ZXIgb3V0ICovCn0KCgp2b2lkIHNlcmlhbF9wdXRzKGNvbnN0IGNoYXIgKnMpCnsKCXdoaWxlICgqcykgewoJCXNlcmlhbF9wdXRjKCpzKyspOwoJfQp9CgoKaW50IHNlcmlhbF9nZXRjKHZvaWQpCnsKCXVuc2lnbmVkIGNoYXIgc3RhdHVzID0gMDsKCiNpZiBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8KCWlmIChzZXJpYWxfYnVmZmVyX2FjdGl2ZSkgewoJCXJldHVybiBzZXJpYWxfYnVmZmVyZWRfZ2V0YygpOwoJfQojZW5kaWYKCQoJd2hpbGUgKDEpIHsKI2lmIGRlZmluZWQoQ09ORklHX0hXX1dBVENIRE9HKQoJCVdBVENIRE9HX1JFU0VUKCk7CS8qIFJlc2V0IEhXIFdhdGNoZG9nLCBpZiBuZWVkZWQgKi8KI2VuZGlmCS8qIENPTkZJR19IV19XQVRDSERPRyAqLwoJCXN0YXR1cyA9IGluYihVQVJUMF9CQVNFICsgVUFSVF9MU1IpOwoJCWlmICgoc3RhdHVzICYgYXN5bmNMU1JEYXRhUmVhZHkxKSAhPSAweDApIHsKCQkJYnJlYWs7CgkJfQoJCWlmICgoc3RhdHVzICYgKCBhc3luY0xTUkZyYW1pbmdFcnJvcjEgfAoJCQkJYXN5bmNMU1JPdmVycnVuRXJyb3IxIHwKCQkJCWFzeW5jTFNSUGFyaXR5RXJyb3IxICB8CgkJCQlhc3luY0xTUkJyZWFrSW50ZXJydXB0MSApKSAhPSAwKSB7CgkJCW91dGIoYXN5bmNMU1JGcmFtaW5nRXJyb3IxIHwKCQkJICAgICAgYXN5bmNMU1JPdmVycnVuRXJyb3IxIHwKCQkJICAgICAgYXN5bmNMU1JQYXJpdHlFcnJvcjEgIHwKCQkJICAgICAgYXN5bmNMU1JCcmVha0ludGVycnVwdDEsIFVBUlQwX0JBU0UgKyBVQVJUX0xTUik7CgkJfQoJfQoJcmV0dXJuICgweDAwMDAwMGZmICYgKGludCkgaW5iIChVQVJUMF9CQVNFKSk7Cn0KCgppbnQgc2VyaWFsX3RzdGModm9pZCkKewoJdW5zaWduZWQgY2hhciBzdGF0dXM7CgojaWYgQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPCglpZiAoc2VyaWFsX2J1ZmZlcl9hY3RpdmUpIHsKCQlyZXR1cm4gc2VyaWFsX2J1ZmZlcmVkX3RzdGMoKTsKCX0KI2VuZGlmCgoJc3RhdHVzID0gaW5iKFVBUlQwX0JBU0UgKyBVQVJUX0xTUik7CglpZiAoKHN0YXR1cyAmIGFzeW5jTFNSRGF0YVJlYWR5MSkgIT0gMHgwKSB7CgkJcmV0dXJuICgxKTsKCX0KCWlmICgoc3RhdHVzICYgKCBhc3luY0xTUkZyYW1pbmdFcnJvcjEgfAoJCQlhc3luY0xTUk92ZXJydW5FcnJvcjEgfAoJCQlhc3luY0xTUlBhcml0eUVycm9yMSAgfAoJCQlhc3luY0xTUkJyZWFrSW50ZXJydXB0MSApKSAhPSAwKSB7CgkJb3V0Yihhc3luY0xTUkZyYW1pbmdFcnJvcjEgfAoJCSAgICAgIGFzeW5jTFNST3ZlcnJ1bkVycm9yMSB8CgkJICAgICAgYXN5bmNMU1JQYXJpdHlFcnJvcjEgIHwKCQkgICAgICBhc3luY0xTUkJyZWFrSW50ZXJydXB0MSwgVUFSVDBfQkFTRSArIFVBUlRfTFNSKTsKCX0KCXJldHVybiAwOwp9CgoKI2lmIENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTwoKdm9pZCBzZXJpYWxfaXNyKHZvaWQgKmFyZykKewoJaW50IHNwYWNlOwoJaW50IGM7CglpbnQgcnhfcHV0ID0gYnVmX2luZm8ucnhfcHV0OwoKCWlmIChidWZfaW5mby5yeF9nZXQgPD0gcnhfcHV0KSB7CgkJc3BhY2UgPSBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8gLSAocnhfcHV0IC0gYnVmX2luZm8ucnhfZ2V0KTsKCX0gZWxzZSB7CgkJc3BhY2UgPSBidWZfaW5mby5yeF9nZXQgLSByeF9wdXQ7Cgl9CgkKCXdoaWxlIChpbmIoVUFSVDBfQkFTRSArIFVBUlRfTFNSKSAmIDEpIHsKCQljID0gaW5iKFVBUlQwX0JBU0UpOwoJCWlmIChzcGFjZSkgewoJCQlidWZfaW5mby5yeF9idWZmZXJbcnhfcHV0KytdID0gYzsKCQkJc3BhY2UtLTsKCQkJCgkJCWlmIChyeF9wdXQgPT0gYnVmX2luZm8ucnhfZ2V0KSB7CgkJCQlidWZfaW5mby5yeF9nZXQrKzsKCQkJCWlmIChyeF9wdXQgPT0gQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPKSB7CgkJCQkJYnVmX2luZm8ucnhfZ2V0ID0gMDsKCQkJCX0KCQkJfQoJCQkKCQkJaWYgKHJ4X3B1dCA9PSBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8pIHsKCQkJCXJ4X3B1dCA9IDA7CgkJCQlpZiAoMCA9PSBidWZfaW5mby5yeF9nZXQpIHsKCQkJCQlidWZfaW5mby5yeF9nZXQgPSAxOwoJCQkJfQoJCQkKCQkJfQoJCQkKCQl9CgkJaWYgKHNwYWNlIDwgQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPIC8gNCkgewoJCQkvKiBTdG9wIGZsb3cgYnkgc2V0dGluZyBSVFMgaW5hY3RpdmUgKi8KCQkJb3V0YihpbmIoVUFSVDBfQkFTRSArIFVBUlRfTUNSKSAmICgweEZGIF4gMHgwMiksCgkJCSAgICAgIFVBUlQwX0JBU0UgKyBVQVJUX01DUik7CgkJfQoJfQoJYnVmX2luZm8ucnhfcHV0ID0gcnhfcHV0Owp9Cgp2b2lkIHNlcmlhbF9idWZmZXJlZF9pbml0KHZvaWQpCnsKCXNlcmlhbF9wdXRzICgiU3dpdGNoaW5nIHRvIGludGVycnVwdCBkcml2ZW4gc2VyaWFsIGlucHV0IG1vZGUuXG4iKTsKCWJ1Zl9pbmZvLnJ4X2J1ZmZlciA9IG1hbGxvYyAoQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPKTsKCWJ1Zl9pbmZvLnJ4X3B1dCA9IDA7CglidWZfaW5mby5yeF9nZXQgPSAwOwoKCWlmIChpbmIgKFVBUlQwX0JBU0UgKyBVQVJUX01TUikgJiAweDEwKSB7CgkJc2VyaWFsX3B1dHMgKCJDaGVjayBDVFMgc2lnbmFsIHByZXNlbnQgb24gc2VyaWFsIHBvcnQ6IE9LLlxuIik7CgkJYnVmX2luZm8uY3RzID0gMTsKCX0gZWxzZSB7CgkJc2VyaWFsX3B1dHMgKCJXQVJOSU5HOiBDVFMgc2lnbmFsIG5vdCBwcmVzZW50IG9uIHNlcmlhbCBwb3J0LlxuIik7CgkJYnVmX2luZm8uY3RzID0gMDsKCX0KCglpcnFfaW5zdGFsbF9oYW5kbGVyICggVkVDTlVNX1UwIC8qVUFSVDAgKi8vKmludCB2ZWMgKi8gLAoJCQkgICAgICBzZXJpYWxfaXNyIC8qaW50ZXJydXB0X2hhbmRsZXJfdCAqaGFuZGxlciAqLyAsCgkJCSAgICAgICh2b2lkICopICZidWZfaW5mbyAvKnZvaWQgKmFyZyAqLyApOwoKCS8qIEVuYWJsZSAiUlggRGF0YSBBdmFpbGFibGUiIEludGVycnVwdCBvbiBVQVJUICovCgkvKiBvdXRiKGluYihVQVJUMF9CQVNFICsgVUFSVF9JRVIpIHwweDAxLCBVQVJUMF9CQVNFICsgVUFSVF9JRVIpOyAqLwoJb3V0YigweDAxLCBVQVJUMF9CQVNFICsgVUFSVF9JRVIpOwoJCgkvKiBTZXQgRFRSIGFuZCBSVFMgYWN0aXZlLCBlbmFibGUgaW50ZXJydXB0cyAgKi8KCW91dGIoaW5iIChVQVJUMF9CQVNFICsgVUFSVF9NQ1IpIHwgMHgwYiwgVUFSVDBfQkFTRSArIFVBUlRfTUNSKTsKCQoJLyogU2V0dXAgVUFSVCBGSUZPOiBSWCB0cmlnZ2VyIGxldmVsOiAxIGJ5dGUsIEVuYWJsZSBGSUZPICovCglvdXRiKCAvKigxIDw8IDYpIHwqLyAgMSwgVUFSVDBfQkFTRSArIFVBUlRfRkNSKTsKCQoJc2VyaWFsX2J1ZmZlcl9hY3RpdmUgPSAxOwp9Cgp2b2lkIHNlcmlhbF9idWZmZXJlZF9wdXRjIChjb25zdCBjaGFyIGMpCnsKCWludCBpOwoJLyogV2FpdCBmb3IgQ1RTICovCiNpZiBkZWZpbmVkKENPTkZJR19IV19XQVRDSERPRykKCXdoaWxlICghKGluYiAoVUFSVDBfQkFTRSArIFVBUlRfTVNSKSAmIDB4MTApKQoJCVdBVENIRE9HX1JFU0VUICgpOwojZWxzZQoJaWYgKGJ1Zl9pbmZvLmN0cykgIHsKCQlmb3IgKGk9MDtpPDEwMDA7aSsrKSB7CgkJCWlmICgoaW5iIChVQVJUMF9CQVNFICsgVUFSVF9NU1IpICYgMHgxMCkpIHsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCWlmIChpIT0xMDAwKSB7CgkJCWJ1Zl9pbmZvLmN0cyA9IDA7CgkJfQoJfSBlbHNlIHsKCQlpZiAoKGluYiAoVUFSVDBfQkFTRSArIFVBUlRfTVNSKSAmIDB4MTApKSB7CgkJCWJ1Zl9pbmZvLmN0cyA9IDE7CgkJfQoJfQoJCQojZW5kaWYKCXNlcmlhbF9wdXRjIChjKTsKfQoKdm9pZCBzZXJpYWxfYnVmZmVyZWRfcHV0cyhjb25zdCBjaGFyICpzKQp7CglzZXJpYWxfcHV0cyAocyk7Cn0KCmludCBzZXJpYWxfYnVmZmVyZWRfZ2V0Yyh2b2lkKQp7CglpbnQgc3BhY2U7CglpbnQgYzsKCWludCByeF9nZXQgPSBidWZfaW5mby5yeF9nZXQ7CglpbnQgcnhfcHV0OwoKI2lmIGRlZmluZWQoQ09ORklHX0hXX1dBVENIRE9HKQoJd2hpbGUgKHJ4X2dldCA9PSBidWZfaW5mby5yeF9wdXQpCgkJV0FUQ0hET0dfUkVTRVQgKCk7CiNlbHNlCgl3aGlsZSAocnhfZ2V0ID09IGJ1Zl9pbmZvLnJ4X3B1dCk7CiNlbmRpZgoJYyA9IGJ1Zl9pbmZvLnJ4X2J1ZmZlcltyeF9nZXQrK107CglpZiAocnhfZ2V0ID09IENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTykgewoJCXJ4X2dldCA9IDA7Cgl9CglidWZfaW5mby5yeF9nZXQgPSByeF9nZXQ7CgoJcnhfcHV0ID0gYnVmX2luZm8ucnhfcHV0OwoJaWYgKHJ4X2dldCA8PSByeF9wdXQpIHsKCQlzcGFjZSA9IENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTyAtIChyeF9wdXQgLSByeF9nZXQpOwoJfSBlbHNlIHsKCQlzcGFjZSA9IHJ4X2dldCAtIHJ4X3B1dDsKCX0KCWlmIChzcGFjZSA+IENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTyAvIDIpIHsKCQkvKiBTdGFydCBmbG93IGJ5IHNldHRpbmcgUlRTIGFjdGl2ZSAqLwoJCW91dGIoaW5iIChVQVJUMF9CQVNFICsgVUFSVF9NQ1IpIHwgMHgwMiwgVUFSVDBfQkFTRSArIFVBUlRfTUNSKTsKCX0KCglyZXR1cm4gYzsKfQoKaW50IHNlcmlhbF9idWZmZXJlZF90c3RjKHZvaWQpCnsKCXJldHVybiAoYnVmX2luZm8ucnhfZ2V0ICE9IGJ1Zl9pbmZvLnJ4X3B1dCkgPyAxIDogMDsKfQoKI2VuZGlmCS8qIENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTyAqLwoKCiNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQovKgogIEFTIEhBUk5PSVMgOiBhY2NvcmRpbmcgdG8gQ09ORklHX0tHREJfU0VSX0lOREVYIGtnZGIgdXNlcyBzZXJpYWwgcG9ydAogIG51bWJlciAwIG9yIG51bWJlciAxCiAgLSBpZiBDT05GSUdfS0dEQl9TRVJfSU5ERVggPSAxID0+IHNlcmlhbCBwb3J0IG51bWJlciAwIDoKICBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGFscmVhZHkgZG9uZQogIC0gaWYgQ09ORklHX0tHREJfU0VSX0lOREVYID0gMiA9PiBzZXJpYWwgcG9ydCBudW1iZXIgMSA6CiAgY29uZmlndXJlIHBvcnQgMSBmb3Igc2VyaWFsIEkvTyB3aXRoIHJhdGUgPSBDT05GSUdfS0dEQl9CQVVEUkFURQoqLwojaWYgKENPTkZJR19LR0RCX1NFUl9JTkRFWCAmIDIpCnZvaWQga2dkYl9zZXJpYWxfaW5pdCh2b2lkKQp7CglERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKCgl2b2xhdGlsZSBjaGFyIHZhbDsKCWJkaXYgPSBzZXJpYWxfZGl2IChDT05GSUdfS0dEQl9CQVVEUkFURSk7CgoJLyoKCSAqIEluaXQgb25ib2FyZCAxNjU1MCBVQVJUCgkgKi8KCW91dGIoMHg4MCwgVUFSVDFfQkFTRSArIFVBUlRfTENSKTsJLyogc2V0IERMQUIgYml0ICovCglvdXRiKGJkaXYgJiAweGZmKSwgVUFSVDFfQkFTRSArIFVBUlRfRExMKTsJLyogc2V0IGRpdmlzb3IgZm9yIDk2MDAgYmF1ZCAqLwoJb3V0YihiZGl2ID4+IDgpLCBVQVJUMV9CQVNFICsgVUFSVF9ETE0pOwkvKiBzZXQgZGl2aXNvciBmb3IgOTYwMCBiYXVkICovCglvdXRiKDB4MDMsIFVBUlQxX0JBU0UgKyBVQVJUX0xDUik7CS8qIGxpbmUgY29udHJvbCA4IGJpdHMgbm8gcGFyaXR5ICovCglvdXRiKDB4MDAsIFVBUlQxX0JBU0UgKyBVQVJUX0ZDUik7CS8qIGRpc2FibGUgRklGTyAqLwoJb3V0YigweDAwLCBVQVJUMV9CQVNFICsgVUFSVF9NQ1IpOwkvKiBubyBtb2RlbSBjb250cm9sIERUUiBSVFMgKi8KCXZhbCA9IGluYihVQVJUMV9CQVNFICsgVUFSVF9MU1IpOwkvKiBjbGVhciBsaW5lIHN0YXR1cyAqLwoJdmFsID0gaW5iKFVBUlQxX0JBU0UgKyBVQVJUX1JCUik7CS8qIHJlYWQgcmVjZWl2ZSBidWZmZXIgKi8KCW91dGIoMHgwMCwgVUFSVDFfQkFTRSArIFVBUlRfU0NSKTsJLyogc2V0IHNjcmF0Y2hwYWQgKi8KCW91dGIoMHgwMCwgVUFSVDFfQkFTRSArIFVBUlRfSUVSKTsJLyogc2V0IGludGVycnVwdCBlbmFibGUgcmVnICovCn0KCgp2b2lkIHB1dERlYnVnQ2hhcihjb25zdCBjaGFyIGMpCnsKCWlmIChjID09ICdcbicpCgkJc2VyaWFsX3B1dGMgKCdccicpOwoKCW91dGIoYywgVUFSVDFfQkFTRSArIFVBUlRfVEhSKTsJLyogcHV0IGNoYXJhY3RlciBvdXQgKi8KCgkvKiBjaGVjayBUSFJFIGJpdCwgd2FpdCBmb3IgdHJhbnNmZXIgZG9uZSAqLwoJd2hpbGUgKChpbmIoVUFSVDFfQkFTRSArIFVBUlRfTFNSKSAmIDB4MjApICE9IDB4MjApOwp9CgoKdm9pZCBwdXREZWJ1Z1N0cihjb25zdCBjaGFyICpzKQp7Cgl3aGlsZSAoKnMpIHsKCQlzZXJpYWxfcHV0YygqcysrKTsKCX0KfQoKCmludCBnZXREZWJ1Z0NoYXIodm9pZCkKewoJdW5zaWduZWQgY2hhciBzdGF0dXMgPSAwOwoKCXdoaWxlICgxKSB7CgkJc3RhdHVzID0gaW5iKFVBUlQxX0JBU0UgKyBVQVJUX0xTUik7CgkJaWYgKChzdGF0dXMgJiBhc3luY0xTUkRhdGFSZWFkeTEpICE9IDB4MCkgewoJCQlicmVhazsKCQl9CgkJaWYgKChzdGF0dXMgJiAoIGFzeW5jTFNSRnJhbWluZ0Vycm9yMSB8CgkJCQlhc3luY0xTUk92ZXJydW5FcnJvcjEgfAoJCQkJYXN5bmNMU1JQYXJpdHlFcnJvcjEgIHwKCQkJCWFzeW5jTFNSQnJlYWtJbnRlcnJ1cHQxICkpICE9IDApIHsKCQkJb3V0Yihhc3luY0xTUkZyYW1pbmdFcnJvcjEgfAoJCQkgICAgIGFzeW5jTFNST3ZlcnJ1bkVycm9yMSB8CgkJCSAgICAgYXN5bmNMU1JQYXJpdHlFcnJvcjEgIHwKCQkJICAgICBhc3luY0xTUkJyZWFrSW50ZXJydXB0MSwgVUFSVDFfQkFTRSArIFVBUlRfTFNSKTsKCQl9Cgl9CglyZXR1cm4gKDB4MDAwMDAwZmYgJiAoaW50KSBpbmIoVUFSVDFfQkFTRSkpOwp9CgoKdm9pZCBrZ2RiX2ludGVycnVwdGlibGUoaW50IHllcykKewoJcmV0dXJuOwp9CgojZWxzZQkvKiAhIChDT05GSUdfS0dEQl9TRVJfSU5ERVggJiAyKSAqLwoKdm9pZCBrZ2RiX3NlcmlhbF9pbml0KHZvaWQpCnsKCXNlcmlhbF9wcmludGYgKCJbb24gc2VyaWFsXSAiKTsKfQoKdm9pZCBwdXREZWJ1Z0NoYXIoaW50IGMpCnsKCXNlcmlhbF9wdXRjIChjKTsKfQoKdm9pZCBwdXREZWJ1Z1N0cihjb25zdCBjaGFyICpzdHIpCnsKCXNlcmlhbF9wdXRzIChzdHIpOwp9CgppbnQgZ2V0RGVidWdDaGFyKHZvaWQpCnsKCXJldHVybiBzZXJpYWxfZ2V0YyAoKTsKfQoKdm9pZCBrZ2RiX2ludGVycnVwdGlibGUoaW50IHllcykKewoJcmV0dXJuOwp9CiNlbmRpZgkvKiAoQ09ORklHX0tHREJfU0VSX0lOREVYICYgMikgKi8KI2VuZGlmCS8qIENGR19DTURfS0dEQiAqLwoK