LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAJCQkJCQkJCQkgICAgICovCi8qIGkyYy5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBpMmMtYnVzIGludGVyZmFjZQkJCSAgICAgKi8KLyogCQkJCQkJCQkJICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgU2ltb24gRy4gVm9nbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgkJICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBXaXRoIHNvbWUgY2hhbmdlcyBmcm9tIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiBhbmQKICAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiAqLwoKLyogJElkOiBpMmMuaCx2IDEuNjggMjAwMy8wMS8yMSAwODowODoxNiBrbWFsa2tpIEV4cCAkICovCgojaWZuZGVmIF9MSU5VWF9JMkNfSAojZGVmaW5lIF9MSU5VWF9JMkNfSAoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L2kyYy1pZC5oPgojaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CS8qIGZvciBzdHJ1Y3QgZGV2aWNlICovCiNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CgovKiAtLS0gRm9yIGkyYy1pc2EgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKZXh0ZXJuIHZvaWQgaTJjX2FkYXB0ZXJfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KTsKZXh0ZXJuIHN0cnVjdCBkZXZpY2VfZHJpdmVyIGkyY19hZGFwdGVyX2RyaXZlcjsKZXh0ZXJuIHN0cnVjdCBjbGFzcyBpMmNfYWRhcHRlcl9jbGFzczsKZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBpMmNfYnVzX3R5cGU7CgovKiAtLS0gR2VuZXJhbCBvcHRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLwoKc3RydWN0IGkyY19tc2c7CnN0cnVjdCBpMmNfYWxnb3JpdGhtOwpzdHJ1Y3QgaTJjX2FkYXB0ZXI7CnN0cnVjdCBpMmNfY2xpZW50OwpzdHJ1Y3QgaTJjX2RyaXZlcjsKdW5pb24gaTJjX3NtYnVzX2RhdGE7CgovKgogKiBUaGUgbWFzdGVyIHJvdXRpbmVzIGFyZSB0aGUgb25lcyBub3JtYWxseSB1c2VkIHRvIHRyYW5zbWl0IGRhdGEgdG8gZGV2aWNlcwogKiBvbiBhIGJ1cyAob3IgcmVhZCBmcm9tIHRoZW0pLiBBcGFydCBmcm9tIHR3byBiYXNpYyB0cmFuc2ZlciBmdW5jdGlvbnMgdG8gCiAqIHRyYW5zbWl0IG9uZSBtZXNzYWdlIGF0IGEgdGltZSwgYSBtb3JlIGNvbXBsZXggdmVyc2lvbiBjYW4gYmUgdXNlZCB0byAKICogdHJhbnNtaXQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBtZXNzYWdlcyB3aXRob3V0IGludGVycnVwdGlvbi4KICovCmV4dGVybiBpbnQgaTJjX21hc3Rlcl9zZW5kKHN0cnVjdCBpMmNfY2xpZW50ICosY29uc3QgY2hhciogLGludCk7CmV4dGVybiBpbnQgaTJjX21hc3Rlcl9yZWN2KHN0cnVjdCBpMmNfY2xpZW50ICosY2hhciogLGludCk7CgovKiBUcmFuc2ZlciBudW0gbWVzc2FnZXMuCiAqLwpleHRlcm4gaW50IGkyY190cmFuc2ZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnICptc2dzLCBpbnQgbnVtKTsKCi8qCiAqIFNvbWUgYWRhcHRlciB0eXBlcyAoaS5lLiBQQ0YgODU4NCBiYXNlZCBvbmVzKSBtYXkgc3VwcG9ydCBzbGF2ZSBiZWhhdml1b3IuIAogKiBUaGlzIGlzIG5vdCB0ZXN0ZWQvaW1wbGVtZW50ZWQgeWV0IGFuZCB3aWxsIGNoYW5nZSBpbiB0aGUgZnV0dXJlLgogKi8KZXh0ZXJuIGludCBpMmNfc2xhdmVfc2VuZChzdHJ1Y3QgaTJjX2NsaWVudCAqLGNoYXIqLGludCk7CmV4dGVybiBpbnQgaTJjX3NsYXZlX3JlY3Yoc3RydWN0IGkyY19jbGllbnQgKixjaGFyKixpbnQpOwoKCgovKiBUaGlzIGlzIHRoZSB2ZXJ5IGdlbmVyYWxpemVkIFNNQnVzIGFjY2VzcyByb3V0aW5lLiBZb3UgcHJvYmFibHkgZG8gbm90CiAgIHdhbnQgdG8gdXNlIHRoaXMsIHRob3VnaDsgb25lIG9mIHRoZSBmdW5jdGlvbnMgYmVsb3cgbWF5IGJlIG11Y2ggZWFzaWVyLAogICBhbmQgcHJvYmFibHkganVzdCBhcyBmYXN0LiAKICAgTm90ZSB0aGF0IHdlIHVzZSBpMmNfYWRhcHRlciBoZXJlLCBiZWNhdXNlIHlvdSBkbyBub3QgbmVlZCBhIHNwZWNpZmljCiAgIHNtYnVzIGFkYXB0ZXIgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLiAqLwpleHRlcm4gczMyIGkyY19zbWJ1c194ZmVyIChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiBhZGFwdGVyLCB1MTYgYWRkciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHJlYWRfd3JpdGUsIHU4IGNvbW1hbmQsIGludCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNfZGF0YSAqIGRhdGEpOwoKLyogTm93IGZvbGxvdyB0aGUgJ25pY2UnIGFjY2VzcyByb3V0aW5lcy4gVGhlc2UgYWxzbyBkb2N1bWVudCB0aGUgY2FsbGluZwogICBjb252ZW50aW9ucyBvZiBzbWJ1c19hY2Nlc3MuICovCgpleHRlcm4gczMyIGkyY19zbWJ1c193cml0ZV9xdWljayhzdHJ1Y3QgaTJjX2NsaWVudCAqIGNsaWVudCwgdTggdmFsdWUpOwpleHRlcm4gczMyIGkyY19zbWJ1c19yZWFkX2J5dGUoc3RydWN0IGkyY19jbGllbnQgKiBjbGllbnQpOwpleHRlcm4gczMyIGkyY19zbWJ1c193cml0ZV9ieXRlKHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50LCB1OCB2YWx1ZSk7CmV4dGVybiBzMzIgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50LCB1OCBjb21tYW5kKTsKZXh0ZXJuIHMzMiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggY29tbWFuZCwgdTggdmFsdWUpOwpleHRlcm4gczMyIGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqIGNsaWVudCwgdTggY29tbWFuZCk7CmV4dGVybiBzMzIgaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGNvbW1hbmQsIHUxNiB2YWx1ZSk7Ci8qIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCAqLwpleHRlcm4gczMyIGkyY19zbWJ1c193cml0ZV9ibG9ja19kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50LAoJCQkJICAgICAgdTggY29tbWFuZCwgdTggbGVuZ3RoLAoJCQkJICAgICAgdTggKnZhbHVlcyk7CmV4dGVybiBzMzIgaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKiBjbGllbnQsCgkJCQkJIHU4IGNvbW1hbmQsIHU4ICp2YWx1ZXMpOwoKLyoKICogQSBkcml2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyBvbmUgb3IgbW9yZSBwaHlzaWNhbCBkZXZpY2VzIHByZXNlbnQgb24KICogSTJDIGFkYXB0ZXJzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gaW5mb3JtIHRoZSBkcml2ZXIgb2YgYWRhcHRlcgogKiBldmVudHMuCiAqLwoKc3RydWN0IGkyY19kcml2ZXIgewoJc3RydWN0IG1vZHVsZSAqb3duZXI7CgljaGFyIG5hbWVbMzJdOwoJaW50IGlkOwoJdW5zaWduZWQgaW50IGNsYXNzOwoJdW5zaWduZWQgaW50IGZsYWdzOwkJLyogZGl2Liwgc2VlIGJlbG93CQkqLwoKCS8qIE5vdGlmaWVzIHRoZSBkcml2ZXIgdGhhdCBhIG5ldyBidXMgaGFzIGFwcGVhcmVkLiBUaGlzIHJvdXRpbmUKCSAqIGNhbiBiZSB1c2VkIGJ5IHRoZSBkcml2ZXIgdG8gdGVzdCBpZiB0aGUgYnVzIG1lZXRzIGl0cyBjb25kaXRpb25zCgkgKiAmIHNlZWsgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgY2hpcChzKSBpdCBzdXBwb3J0cy4gSWYgZm91bmQsIGl0IAoJICogcmVnaXN0ZXJzIHRoZSBjbGllbnQocykgdGhhdCBhcmUgb24gdGhlIGJ1cyB0byB0aGUgaTJjIGFkbWluLiB2aWEKCSAqIGkyY19hdHRhY2hfY2xpZW50LgoJICovCglpbnQgKCphdHRhY2hfYWRhcHRlcikoc3RydWN0IGkyY19hZGFwdGVyICopOwoJaW50ICgqZGV0YWNoX2FkYXB0ZXIpKHN0cnVjdCBpMmNfYWRhcHRlciAqKTsKCgkvKiB0ZWxscyB0aGUgZHJpdmVyIHRoYXQgYSBjbGllbnQgaXMgYWJvdXQgdG8gYmUgZGVsZXRlZCAmIGdpdmVzIGl0IAoJICogdGhlIGNoYW5jZSB0byByZW1vdmUgaXRzIHByaXZhdGUgZGF0YS4gQWxzbywgaWYgdGhlIGNsaWVudCBzdHJ1Y3QKCSAqIGhhcyBiZWVuIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBieSB0aGUgZHJpdmVyIGluIHRoZSBmdW5jdGlvbiBhYm92ZSwKCSAqIGl0IG11c3QgYmUgZnJlZWQgaGVyZS4KCSAqLwoJaW50ICgqZGV0YWNoX2NsaWVudCkoc3RydWN0IGkyY19jbGllbnQgKik7CgkKCS8qIGEgaW9jdGwgbGlrZSBjb21tYW5kIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBzcGVjaWZpYyBmdW5jdGlvbnMKCSAqIHdpdGggdGhlIGRldmljZS4KCSAqLwoJaW50ICgqY29tbWFuZCkoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCx1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOwoKCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKfTsKI2RlZmluZSB0b19pMmNfZHJpdmVyKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgaTJjX2RyaXZlciwgZHJpdmVyKQoKI2RlZmluZSBJMkNfTkFNRV9TSVpFCTUwCgovKgogKiBpMmNfY2xpZW50IGlkZW50aWZpZXMgYSBzaW5nbGUgZGV2aWNlIChpLmUuIGNoaXApIHRoYXQgaXMgY29ubmVjdGVkIHRvIGFuIAogKiBpMmMgYnVzLiBUaGUgYmVoYXZpb3VyIGlzIGRlZmluZWQgYnkgdGhlIHJvdXRpbmVzIG9mIHRoZSBkcml2ZXIuIFRoaXMKICogZnVuY3Rpb24gaXMgbWFpbmx5IHVzZWQgZm9yIGxvb2t1cCAmIG90aGVyIGFkbWluLiBmdW5jdGlvbnMuCiAqLwpzdHJ1Y3QgaTJjX2NsaWVudCB7Cgl1bnNpZ25lZCBpbnQgZmxhZ3M7CQkvKiBkaXYuLCBzZWUgYmVsb3cJCSovCgl1bnNpZ25lZCBzaG9ydCBhZGRyOwkJLyogY2hpcCBhZGRyZXNzIC0gTk9URTogN2JpdCAJKi8KCQkJCQkvKiBhZGRyZXNzZXMgYXJlIHN0b3JlZCBpbiB0aGUJKi8KCQkJCQkvKiBfTE9XRVJfIDcgYml0cwkJKi8KCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsJLyogdGhlIGFkYXB0ZXIgd2Ugc2l0IG9uCSovCglzdHJ1Y3QgaTJjX2RyaXZlciAqZHJpdmVyOwkvKiBhbmQgb3VyIGFjY2VzcyByb3V0aW5lcwkqLwoJaW50IHVzYWdlX2NvdW50OwkJLyogSG93IG1hbnkgYWNjZXNzZXMgY3VycmVudGx5ICAqLwoJCQkJCS8qIHRvIHRoZSBjbGllbnQJCSovCglzdHJ1Y3QgZGV2aWNlIGRldjsJCS8qIHRoZSBkZXZpY2Ugc3RydWN0dXJlCQkqLwoJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwoJY2hhciBuYW1lW0kyQ19OQU1FX1NJWkVdOwoJc3RydWN0IGNvbXBsZXRpb24gcmVsZWFzZWQ7Cn07CiNkZWZpbmUgdG9faTJjX2NsaWVudChkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGkyY19jbGllbnQsIGRldikKCnN0YXRpYyBpbmxpbmUgc3RydWN0IGkyY19jbGllbnQgKmtvYmpfdG9faTJjX2NsaWVudChzdHJ1Y3Qga29iamVjdCAqa29iaikKewoJcmV0dXJuIHRvX2kyY19jbGllbnQoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKfQoKc3RhdGljIGlubGluZSB2b2lkICppMmNfZ2V0X2NsaWVudGRhdGEgKHN0cnVjdCBpMmNfY2xpZW50ICpkZXYpCnsKCXJldHVybiBkZXZfZ2V0X2RydmRhdGEgKCZkZXYtPmRldik7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBpMmNfc2V0X2NsaWVudGRhdGEgKHN0cnVjdCBpMmNfY2xpZW50ICpkZXYsIHZvaWQgKmRhdGEpCnsKCWRldl9zZXRfZHJ2ZGF0YSAoJmRldi0+ZGV2LCBkYXRhKTsKfQoKLyoKICogVGhlIGZvbGxvd2luZyBzdHJ1Y3RzIGFyZSBmb3IgdGhvc2Ugd2hvIGxpa2UgdG8gaW1wbGVtZW50IG5ldyBidXMgZHJpdmVyczoKICogaTJjX2FsZ29yaXRobSBpcyB0aGUgaW50ZXJmYWNlIHRvIGEgY2xhc3Mgb2YgaGFyZHdhcmUgc29sdXRpb25zIHdoaWNoIGNhbgogKiBiZSBhZGRyZXNzZWQgdXNpbmcgdGhlIHNhbWUgYnVzIGFsZ29yaXRobXMgLSBpLmUuIGJpdC1iYW5naW5nIG9yIHRoZSBQQ0Y4NTg0CiAqIHRvIG5hbWUgdHdvIG9mIHRoZSBtb3N0IGNvbW1vbi4KICovCnN0cnVjdCBpMmNfYWxnb3JpdGhtIHsKCS8qIElmIGFuIGFkYXB0ZXIgYWxnb3JpdGhtIGNhbid0IGRvIEkyQy1sZXZlbCBhY2Nlc3MsIHNldCBtYXN0ZXJfeGZlcgoJICAgdG8gTlVMTC4gSWYgYW4gYWRhcHRlciBhbGdvcml0aG0gY2FuIGRvIFNNQnVzIGFjY2Vzcywgc2V0IAoJICAgc21idXNfeGZlci4gSWYgc2V0IHRvIE5VTEwsIHRoZSBTTUJ1cyBwcm90b2NvbCBpcyBzaW11bGF0ZWQKCSAgIHVzaW5nIGNvbW1vbiBJMkMgbWVzc2FnZXMgKi8KCWludCAoKm1hc3Rlcl94ZmVyKShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsc3RydWN0IGkyY19tc2cgKm1zZ3MsIAoJICAgICAgICAgICAgICAgICAgIGludCBudW0pOwoJaW50ICgqc21idXNfeGZlcikgKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgdTE2IGFkZHIsIAoJICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCgkgICAgICAgICAgICAgICAgICAgdTggY29tbWFuZCwgaW50IHNpemUsIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSk7CgoJLyogLS0tIHRoZXNlIG9wdGlvbmFsL2Z1dHVyZSB1c2UgZm9yIHNvbWUgYWRhcHRlciB0eXBlcy4qLwoJaW50ICgqc2xhdmVfc2VuZCkoc3RydWN0IGkyY19hZGFwdGVyICosY2hhciosaW50KTsKCWludCAoKnNsYXZlX3JlY3YpKHN0cnVjdCBpMmNfYWRhcHRlciAqLGNoYXIqLGludCk7CgoJLyogLS0tIGlvY3RsIGxpa2UgY2FsbCB0byBzZXQgZGl2LiBwYXJhbWV0ZXJzLiAqLwoJaW50ICgqYWxnb19jb250cm9sKShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKCgkvKiBUbyBkZXRlcm1pbmUgd2hhdCB0aGUgYWRhcHRlciBzdXBwb3J0cyAqLwoJdTMyICgqZnVuY3Rpb25hbGl0eSkgKHN0cnVjdCBpMmNfYWRhcHRlciAqKTsKfTsKCi8qCiAqIGkyY19hZGFwdGVyIGlzIHRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBpZGVudGlmeSBhIHBoeXNpY2FsIGkyYyBidXMgYWxvbmcKICogd2l0aCB0aGUgYWNjZXNzIGFsZ29yaXRobXMgbmVjZXNzYXJ5IHRvIGFjY2VzcyBpdC4KICovCnN0cnVjdCBpMmNfYWRhcHRlciB7CglzdHJ1Y3QgbW9kdWxlICpvd25lcjsKCXVuc2lnbmVkIGludCBpZDsKCXVuc2lnbmVkIGludCBjbGFzczsKCXN0cnVjdCBpMmNfYWxnb3JpdGhtICphbGdvOy8qIHRoZSBhbGdvcml0aG0gdG8gYWNjZXNzIHRoZSBidXMJKi8KCXZvaWQgKmFsZ29fZGF0YTsKCgkvKiAtLS0gYWRtaW5pc3RyYXRpb24gc3R1ZmYuICovCglpbnQgKCpjbGllbnRfcmVnaXN0ZXIpKHN0cnVjdCBpMmNfY2xpZW50ICopOwoJaW50ICgqY2xpZW50X3VucmVnaXN0ZXIpKHN0cnVjdCBpMmNfY2xpZW50ICopOwoKCS8qIGRhdGEgZmllbGRzIHRoYXQgYXJlIHZhbGlkIGZvciBhbGwgZGV2aWNlcwkqLwoJc3RydWN0IHNlbWFwaG9yZSBidXNfbG9jazsKCXN0cnVjdCBzZW1hcGhvcmUgY2xpc3RfbG9jazsKCglpbnQgdGltZW91dDsKCWludCByZXRyaWVzOwoJc3RydWN0IGRldmljZSBkZXY7CQkvKiB0aGUgYWRhcHRlciBkZXZpY2UgKi8KCXN0cnVjdCBjbGFzc19kZXZpY2UgY2xhc3NfZGV2OwkvKiB0aGUgY2xhc3MgZGV2aWNlICovCgoJaW50IG5yOwoJc3RydWN0IGxpc3RfaGVhZCBjbGllbnRzOwoJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwoJY2hhciBuYW1lW0kyQ19OQU1FX1NJWkVdOwoJc3RydWN0IGNvbXBsZXRpb24gZGV2X3JlbGVhc2VkOwoJc3RydWN0IGNvbXBsZXRpb24gY2xhc3NfZGV2X3JlbGVhc2VkOwp9OwojZGVmaW5lIGRldl90b19pMmNfYWRhcHRlcihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGkyY19hZGFwdGVyLCBkZXYpCiNkZWZpbmUgY2xhc3NfZGV2X3RvX2kyY19hZGFwdGVyKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIsIGNsYXNzX2RldikKCnN0YXRpYyBpbmxpbmUgdm9pZCAqaTJjX2dldF9hZGFwZGF0YSAoc3RydWN0IGkyY19hZGFwdGVyICpkZXYpCnsKCXJldHVybiBkZXZfZ2V0X2RydmRhdGEgKCZkZXYtPmRldik7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBpMmNfc2V0X2FkYXBkYXRhIChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmRldiwgdm9pZCAqZGF0YSkKewoJZGV2X3NldF9kcnZkYXRhICgmZGV2LT5kZXYsIGRhdGEpOwp9CgovKmZsYWdzIGZvciB0aGUgZHJpdmVyIHN0cnVjdDogKi8KI2RlZmluZSBJMkNfREZfTk9USUZZCTB4MDEJCS8qIG5vdGlmeSBvbiBidXMgKGRlL2EpdHRhY2hlcyAJKi8KI2lmIDAKLyogdGhpcyBmbGFnIGlzIGdvbmUgLS0gdGhlcmUgaXMgYSAob3B0aW9uYWwpIGRyaXZlci0+ZGV0YWNoX2FkYXB0ZXIKICogY2FsbGJhY2sgbm93IHdoaWNoIGNhbiBiZSB1c2VkIGluc3RlYWQgKi8KIyBkZWZpbmUgSTJDX0RGX0RVTU1ZCTB4MDIKI2VuZGlmCgovKmZsYWdzIGZvciB0aGUgY2xpZW50IHN0cnVjdDogKi8KI2RlZmluZSBJMkNfQ0xJRU5UX0FMTE9XX1VTRQkJMHgwMQkvKiBDbGllbnQgYWxsb3dzIGFjY2VzcyAqLwojZGVmaW5lIEkyQ19DTElFTlRfQUxMT1dfTVVMVElQTEVfVVNFIAkweDAyICAJLyogQWxsb3cgbXVsdGlwbGUgYWNjZXNzLWxvY2tzICovCgkJCQkJCS8qIG9uIGFuIGkyY19jbGllbnQgKi8KI2RlZmluZSBJMkNfQ0xJRU5UX1BFQyAgMHgwNAkJCS8qIFVzZSBQYWNrZXQgRXJyb3IgQ2hlY2tpbmcgKi8KI2RlZmluZSBJMkNfQ0xJRU5UX1RFTgkweDEwCQkJLyogd2UgaGF2ZSBhIHRlbiBiaXQgY2hpcCBhZGRyZXNzCSovCgkJCQkJCS8qIE11c3QgZXF1YWwgSTJDX01fVEVOIGJlbG93ICovCgovKiBpMmMgYWRhcHRlciBjbGFzc2VzIChiaXRtYXNrKSAqLwojZGVmaW5lIEkyQ19DTEFTU19IV01PTgkJKDE8PDApCS8qIGxtX3NlbnNvcnMsIC4uLiAqLwojZGVmaW5lIEkyQ19DTEFTU19UVl9BTkFMT0cJKDE8PDEpCS8qIGJ0dHYgKyBmcmllbmRzICovCiNkZWZpbmUgSTJDX0NMQVNTX1RWX0RJR0lUQUwJKDE8PDIpCS8qIGR2YiBjYXJkcyAqLwojZGVmaW5lIEkyQ19DTEFTU19EREMJCSgxPDwzKQkvKiBpMmMtbWF0cm94ZmIgPyAqLwojZGVmaW5lIEkyQ19DTEFTU19DQU1fQU5BTE9HCSgxPDw0KQkvKiBjYW1lcmEgd2l0aCBhbmFsb2cgQ0NEICovCiNkZWZpbmUgSTJDX0NMQVNTX0NBTV9ESUdJVEFMCSgxPDw1KQkvKiBtb3N0IHdlYmNhbXMgKi8KI2RlZmluZSBJMkNfQ0xBU1NfU09VTkQJCSgxPDw2KQkvKiBzb3VuZCBkZXZpY2VzICovCiNkZWZpbmUgSTJDX0NMQVNTX0FMTAkJKFVJTlRfTUFYKSAvKiBhbGwgb2YgdGhlIGFib3ZlICovCgovKiBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSBpcyB0aGUgc3RydWN0IGZvciBob2xkaW5nIGRlZmF1bHQgY2xpZW50CiAqIGFkZHJlc3NlcyBmb3IgYSBkcml2ZXIgYW5kIGZvciB0aGUgcGFyYW1ldGVycyBzdXBwbGllZCBvbiB0aGUKICogY29tbWFuZCBsaW5lCiAqLwpzdHJ1Y3QgaTJjX2NsaWVudF9hZGRyZXNzX2RhdGEgewoJdW5zaWduZWQgc2hvcnQgKm5vcm1hbF9pMmM7Cgl1bnNpZ25lZCBzaG9ydCAqcHJvYmU7Cgl1bnNpZ25lZCBzaG9ydCAqaWdub3JlOwoJdW5zaWduZWQgc2hvcnQgKipmb3JjZXM7Cn07CgovKiBJbnRlcm5hbCBudW1iZXJzIHRvIHRlcm1pbmF0ZSBsaXN0cyAqLwojZGVmaW5lIEkyQ19DTElFTlRfRU5ECQkweGZmZmVVCgovKiBUaGUgbnVtYmVycyB0byB1c2UgdG8gc2V0IEkyQyBidXMgYWRkcmVzcyAqLwojZGVmaW5lIEFOWV9JMkNfQlVTCQkweGZmZmYKI2RlZmluZSBBTllfSTJDX0lTQV9CVVMJCTkxOTEKCgovKiAtLS0tLSBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgaTJjLm8gKi8KCi8qIGFkbWluaXN0cmF0aW9uLi4uCiAqLwpleHRlcm4gaW50IGkyY19hZGRfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKik7CmV4dGVybiBpbnQgaTJjX2RlbF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqKTsKCmV4dGVybiBpbnQgaTJjX2FkZF9kcml2ZXIoc3RydWN0IGkyY19kcml2ZXIgKik7CmV4dGVybiBpbnQgaTJjX2RlbF9kcml2ZXIoc3RydWN0IGkyY19kcml2ZXIgKik7CgpleHRlcm4gaW50IGkyY19hdHRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICopOwpleHRlcm4gaW50IGkyY19kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICopOwoKLyogTmV3IGZ1bmN0aW9uOiBUaGlzIGlzIHRvIGdldCBhbiBpMmNfY2xpZW50LXN0cnVjdCBmb3IgY29udHJvbGxpbmcgdGhlIAogICBjbGllbnQgZWl0aGVyIGJ5IHVzaW5nIGkyY19jb250cm9sLWZ1bmN0aW9uIG9yIGhhdmluZyB0aGUgCiAgIGNsaWVudC1tb2R1bGUgZXhwb3J0IGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdGhlIGkyY19jbGllbnQKICAgLXN0cnVjdC4gKi8KZXh0ZXJuIHN0cnVjdCBpMmNfY2xpZW50ICppMmNfZ2V0X2NsaWVudChpbnQgZHJpdmVyX2lkLCBpbnQgYWRhcHRlcl9pZCwgCgkJCQkJc3RydWN0IGkyY19jbGllbnQgKnByZXYpOwoKLyogU2hvdWxkIGJlIHVzZWQgd2l0aCBuZXcgZnVuY3Rpb24KICAgZXh0ZXJuIHN0cnVjdCBpMmNfY2xpZW50ICppMmNfZ2V0X2NsaWVudChpbnQsaW50LHN0cnVjdCBpMmNfY2xpZW50ICopOwogICB0byBtYWtlIHN1cmUgdGhhdCBjbGllbnQtc3RydWN0IGlzIHZhbGlkIGFuZCB0aGF0IGl0IGlzIG9rYXkgdG8gYWNjZXNzCiAgIHRoZSBpMmMtY2xpZW50LiAKICAgcmV0dXJucyAtRUFDQ0VTIGlmIGNsaWVudCBkb2Vzbid0IGFsbG93IHVzZSAoZGVmYXVsdCkKICAgcmV0dXJucyAtRUJVU1kgaWYgY2xpZW50IGRvZXNuJ3QgYWxsb3cgbXVsdGlwbGUgdXNlIChkZWZhdWx0KSBhbmQgCiAgIHVzYWdlX2NvdW50ID4wICovCmV4dGVybiBpbnQgaTJjX3VzZV9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKik7CmV4dGVybiBpbnQgaTJjX3JlbGVhc2VfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICopOwoKLyogY2FsbCB0aGUgaTJjX2NsaWVudC0+Y29tbWFuZCgpIG9mIGFsbCBhdHRhY2hlZCBjbGllbnRzIHdpdGgKICogdGhlIGdpdmVuIGFyZ3VtZW50cyAqLwpleHRlcm4gdm9pZCBpMmNfY2xpZW50c19jb21tYW5kKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwKCQkJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CgovKiByZXR1cm5zIC1FQlVTWSBpZiBhZGRyZXNzIGhhcyBiZWVuIHRha2VuLCAwIGlmIG5vdC4gTm90ZSB0aGF0IHRoZSBvbmx5CiAgIG90aGVyIHBsYWNlIGF0IHdoaWNoIHRoaXMgaXMgY2FsbGVkIGlzIHdpdGhpbiBpMmNfYXR0YWNoX2NsaWVudDsgc28KICAgeW91IGNhbiBjaGVhdCBieSBzaW1wbHkgbm90IHJlZ2lzdGVyaW5nLiBOb3QgcmVjb21tZW5kZWQsIG9mIGNvdXJzZSEgKi8KZXh0ZXJuIGludCBpMmNfY2hlY2tfYWRkciAoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcik7CgovKiBEZXRlY3QgZnVuY3Rpb24uIEl0IGl0ZXJhdGVzIG92ZXIgYWxsIHBvc3NpYmxlIGFkZHJlc3NlcyBpdHNlbGYuCiAqIEl0IHdpbGwgb25seSBjYWxsIGZvdW5kX3Byb2MgaWYgc29tZSBjbGllbnQgaXMgY29ubmVjdGVkIGF0IHRoZQogKiBzcGVjaWZpYyBhZGRyZXNzICh1bmxlc3MgYSAnZm9yY2UnIG1hdGNoZWQpOwogKi8KZXh0ZXJuIGludCBpMmNfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCAKCQlzdHJ1Y3QgaTJjX2NsaWVudF9hZGRyZXNzX2RhdGEgKmFkZHJlc3NfZGF0YSwKCQlpbnQgKCpmb3VuZF9wcm9jKSAoc3RydWN0IGkyY19hZGFwdGVyICosIGludCwgaW50KSk7CgovKiBBbiBpb2N0bCBsaWtlIGNhbGwgdG8gc2V0IGRpdi4gcGFyYW1ldGVycyBvZiB0aGUgYWRhcHRlci4KICovCmV4dGVybiBpbnQgaTJjX2NvbnRyb2woc3RydWN0IGkyY19jbGllbnQgKix1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwoKZXh0ZXJuIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjX2dldF9hZGFwdGVyKGludCBpZCk7CmV4dGVybiB2b2lkIGkyY19wdXRfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApOwoKCi8qIFJldHVybiB0aGUgZnVuY3Rpb25hbGl0eSBtYXNrICovCnN0YXRpYyBpbmxpbmUgdTMyIGkyY19nZXRfZnVuY3Rpb25hbGl0eShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCnsKCXJldHVybiBhZGFwLT5hbGdvLT5mdW5jdGlvbmFsaXR5KGFkYXApOwp9CgovKiBSZXR1cm4gMSBpZiBhZGFwdGVyIHN1cHBvcnRzIGV2ZXJ5dGhpbmcgd2UgbmVlZCwgMCBpZiBub3QuICovCnN0YXRpYyBpbmxpbmUgaW50IGkyY19jaGVja19mdW5jdGlvbmFsaXR5KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgdTMyIGZ1bmMpCnsKCXJldHVybiAoZnVuYyAmIGkyY19nZXRfZnVuY3Rpb25hbGl0eShhZGFwKSkgPT0gZnVuYzsKfQoKLyogUmV0dXJuIGlkIG51bWJlciBmb3IgYSBzcGVjaWZpYyBhZGFwdGVyICovCnN0YXRpYyBpbmxpbmUgaW50IGkyY19hZGFwdGVyX2lkKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKewoJcmV0dXJuIGFkYXAtPm5yOwp9CgovKgogKiBJMkMgTWVzc2FnZSAtIHVzZWQgZm9yIHB1cmUgaTJjIHRyYW5zYWN0aW9uLCBhbHNvIGZyb20gL2RldiBpbnRlcmZhY2UKICovCnN0cnVjdCBpMmNfbXNnIHsKCV9fdTE2IGFkZHI7CS8qIHNsYXZlIGFkZHJlc3MJCQkqLwogCV9fdTE2IGZsYWdzOwkJCiNkZWZpbmUgSTJDX01fVEVOCTB4MTAJLyogd2UgaGF2ZSBhIHRlbiBiaXQgY2hpcCBhZGRyZXNzCSovCiNkZWZpbmUgSTJDX01fUkQJMHgwMQojZGVmaW5lIEkyQ19NX05PU1RBUlQJMHg0MDAwCiNkZWZpbmUgSTJDX01fUkVWX0RJUl9BRERSCTB4MjAwMAojZGVmaW5lIEkyQ19NX0lHTk9SRV9OQUsJMHgxMDAwCiNkZWZpbmUgSTJDX01fTk9fUkRfQUNLCQkweDA4MDAKIAlfX3UxNiBsZW47CQkvKiBtc2cgbGVuZ3RoCQkJCSovCiAJX191OCAqYnVmOwkJLyogcG9pbnRlciB0byBtc2cgZGF0YQkJCSovCn07CgovKiBUbyBkZXRlcm1pbmUgd2hhdCBmdW5jdGlvbmFsaXR5IGlzIHByZXNlbnQgKi8KCiNkZWZpbmUgSTJDX0ZVTkNfSTJDCQkJMHgwMDAwMDAwMQojZGVmaW5lIEkyQ19GVU5DXzEwQklUX0FERFIJCTB4MDAwMDAwMDIKI2RlZmluZSBJMkNfRlVOQ19QUk9UT0NPTF9NQU5HTElORwkweDAwMDAwMDA0IC8qIEkyQ19NX3tSRVZfRElSX0FERFIsTk9TVEFSVCwuLn0gKi8KI2RlZmluZSBJMkNfRlVOQ19TTUJVU19IV1BFQ19DQUxDCTB4MDAwMDAwMDggLyogU01CdXMgMi4wICovCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9XT1JEX0RBVEFfUEVDICAweDAwMDAwODAwIC8qIFNNQnVzIDIuMCAqLyAKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19XUklURV9XT1JEX0RBVEFfUEVDIDB4MDAwMDEwMDAgLyogU01CdXMgMi4wICovIAojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1BST0NfQ0FMTF9QRUMJMHgwMDAwMjAwMCAvKiBTTUJ1cyAyLjAgKi8KI2RlZmluZSBJMkNfRlVOQ19TTUJVU19CTE9DS19QUk9DX0NBTExfUEVDIDB4MDAwMDQwMDAgLyogU01CdXMgMi4wICovCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMCTB4MDAwMDgwMDAgLyogU01CdXMgMi4wICovCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUVVJQ0sJCTB4MDAwMTAwMDAgCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFCTB4MDAwMjAwMDAgCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURQkweDAwMDQwMDAwIAojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfQllURV9EQVRBCTB4MDAwODAwMDAgCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURV9EQVRBCTB4MDAxMDAwMDAgCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9XT1JEX0RBVEEJMHgwMDIwMDAwMCAKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19XUklURV9XT1JEX0RBVEEJMHgwMDQwMDAwMCAKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19QUk9DX0NBTEwJMHgwMDgwMDAwMCAKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19SRUFEX0JMT0NLX0RBVEEJMHgwMTAwMDAwMCAKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19XUklURV9CTE9DS19EQVRBIDB4MDIwMDAwMDAgCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9JMkNfQkxPQ0sJMHgwNDAwMDAwMCAvKiBJMkMtbGlrZSBibG9jayB4ZmVyICAqLwojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0kyQ19CTE9DSwkweDA4MDAwMDAwIC8qIHcvIDEtYnl0ZSByZWcuIGFkZHIuICovCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9JMkNfQkxPQ0tfMgkgMHgxMDAwMDAwMCAvKiBJMkMtbGlrZSBibG9jayB4ZmVyICAqLwojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0kyQ19CTE9DS18yIDB4MjAwMDAwMDAgLyogdy8gMi1ieXRlIHJlZy4gYWRkci4gKi8KI2RlZmluZSBJMkNfRlVOQ19TTUJVU19SRUFEX0JMT0NLX0RBVEFfUEVDICAweDQwMDAwMDAwIC8qIFNNQnVzIDIuMCAqLwojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JMT0NLX0RBVEFfUEVDIDB4ODAwMDAwMDAgLyogU01CdXMgMi4wICovCgojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX0JZVEUgKEkyQ19GVU5DX1NNQlVTX1JFQURfQllURSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFKQojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSAoSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFX0RBVEEgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEEpCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBIChJMkNfRlVOQ19TTUJVU19SRUFEX1dPUkRfREFUQSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX1dPUkRfREFUQSkKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19CTE9DS19EQVRBIChJMkNfRlVOQ19TTUJVU19SRUFEX0JMT0NLX0RBVEEgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQkxPQ0tfREFUQSkKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19JMkNfQkxPQ0sgKEkyQ19GVU5DX1NNQlVTX1JFQURfSTJDX0JMT0NLIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfSTJDX0JMT0NLKQojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX0kyQ19CTE9DS18yIChJMkNfRlVOQ19TTUJVU19SRUFEX0kyQ19CTE9DS18yIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfRlVOQ19TTUJVU19XUklURV9JMkNfQkxPQ0tfMikKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19CTE9DS19EQVRBX1BFQyAoSTJDX0ZVTkNfU01CVVNfUkVBRF9CTE9DS19EQVRBX1BFQyB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQkxPQ0tfREFUQV9QRUMpCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBX1BFQyAgKEkyQ19GVU5DX1NNQlVTX1JFQURfV09SRF9EQVRBX1BFQyB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfV09SRF9EQVRBX1BFQykKCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFX1BFQwkJSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFX0RBVEEKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX1BFQwkJSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURV9EQVRBCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFX0RBVEFfUEVDCUkyQ19GVU5DX1NNQlVTX1JFQURfV09SRF9EQVRBCiNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURV9EQVRBX1BFQwlJMkNfRlVOQ19TTUJVU19XUklURV9XT1JEX0RBVEEKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19CWVRFX1BFQwkJCUkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQQojZGVmaW5lIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQV9QRUMJCUkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQQoKI2RlZmluZSBJMkNfRlVOQ19TTUJVU19FTVVMIChJMkNfRlVOQ19TTUJVU19RVUlDSyB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfRlVOQ19TTUJVU19CWVRFIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfUFJPQ19DQUxMIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JMT0NLX0RBVEEgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQkxPQ0tfREFUQV9QRUMgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLKQoKLyogCiAqIERhdGEgZm9yIFNNQnVzIE1lc3NhZ2VzIAogKi8KI2RlZmluZSBJMkNfU01CVVNfQkxPQ0tfTUFYCTMyCS8qIEFzIHNwZWNpZmllZCBpbiBTTUJ1cyBzdGFuZGFyZCAqLwkKI2RlZmluZSBJMkNfU01CVVNfSTJDX0JMT0NLX01BWAkzMgkvKiBOb3Qgc3BlY2lmaWVkIGJ1dCB3ZSB1c2Ugc2FtZSBzdHJ1Y3R1cmUgKi8KdW5pb24gaTJjX3NtYnVzX2RhdGEgewoJX191OCBieXRlOwoJX191MTYgd29yZDsKCV9fdTggYmxvY2tbSTJDX1NNQlVTX0JMT0NLX01BWCArIDNdOyAvKiBibG9ja1swXSBpcyB1c2VkIGZvciBsZW5ndGggKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbmUgbW9yZSBmb3IgcmVhZCBsZW5ndGggaW4gYmxvY2sgcHJvY2VzcyBjYWxsICovCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBvbmUgbW9yZSBmb3IgUEVDICovCn07CgovKiBzbWJ1c19hY2Nlc3MgcmVhZCBvciB3cml0ZSBtYXJrZXJzICovCiNkZWZpbmUgSTJDX1NNQlVTX1JFQUQJMQojZGVmaW5lIEkyQ19TTUJVU19XUklURQkwCgovKiBTTUJ1cyB0cmFuc2FjdGlvbiB0eXBlcyAoc2l6ZSBwYXJhbWV0ZXIgaW4gdGhlIGFib3ZlIGZ1bmN0aW9ucykgCiAgIE5vdGU6IHRoZXNlIG5vIGxvbmdlciBjb3JyZXNwb25kIHRvIHRoZSAoYXJiaXRyYXJ5KSBQSUlYNCBpbnRlcm5hbCBjb2RlcyEgKi8KI2RlZmluZSBJMkNfU01CVVNfUVVJQ0sJCSAgICAwCiNkZWZpbmUgSTJDX1NNQlVTX0JZVEUJCSAgICAxCiNkZWZpbmUgSTJDX1NNQlVTX0JZVEVfREFUQQkgICAgMiAKI2RlZmluZSBJMkNfU01CVVNfV09SRF9EQVRBCSAgICAzCiNkZWZpbmUgSTJDX1NNQlVTX1BST0NfQ0FMTAkgICAgNAojZGVmaW5lIEkyQ19TTUJVU19CTE9DS19EQVRBCSAgICA1CiNkZWZpbmUgSTJDX1NNQlVTX0kyQ19CTE9DS19EQVRBICAgIDYKI2RlZmluZSBJMkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMICAgNwkJLyogU01CdXMgMi4wICovCiNkZWZpbmUgSTJDX1NNQlVTX0JMT0NLX0RBVEFfUEVDICAgIDgJCS8qIFNNQnVzIDIuMCAqLwojZGVmaW5lIEkyQ19TTUJVU19QUk9DX0NBTExfUEVDICAgICA5CQkvKiBTTUJ1cyAyLjAgKi8KI2RlZmluZSBJMkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMX1BFQyAgMTAJLyogU01CdXMgMi4wICovCiNkZWZpbmUgSTJDX1NNQlVTX1dPUkRfREFUQV9QRUMJICAgMTEJCS8qIFNNQnVzIDIuMCAqLwoKCi8qIC0tLS0tIGNvbW1hbmRzIGZvciB0aGUgaW9jdGwgbGlrZSBpMmNfY29tbWFuZCBjYWxsOgogKiBub3RlIHRoYXQgYWRkaXRpb25hbCBjYWxscyBhcmUgZGVmaW5lZCBpbiB0aGUgYWxnb3JpdGhtIGFuZCBodyAKICoJZGVwZW5kZW50IGxheWVycyAtIHRoZXNlIGNhbiBiZSBsaXN0ZWQgaGVyZSwgb3Igc2VlIHRoZSAKICoJY29ycmVzcG9uZGluZyBoZWFkZXIgZmlsZXMuCiAqLwoJCQkJLyogLT4gYml0LWFkYXB0ZXIgc3BlY2lmaWMgaW9jdGxzCSovCiNkZWZpbmUgSTJDX1JFVFJJRVMJMHgwNzAxCS8qIG51bWJlciBvZiB0aW1lcyBhIGRldmljZSBhZGRyZXNzICAgICAgKi8KCQkJCS8qIHNob3VsZCBiZSBwb2xsZWQgd2hlbiBub3QgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFja25vd2xlZGdpbmcgCQkJKi8KI2RlZmluZSBJMkNfVElNRU9VVAkweDA3MDIJLyogc2V0IHRpbWVvdXQgLSBjYWxsIHdpdGggaW50IAkJKi8KCgovKiB0aGlzIGlzIGZvciBpMmMtZGV2LmMJKi8KI2RlZmluZSBJMkNfU0xBVkUJMHgwNzAzCS8qIENoYW5nZSBzbGF2ZSBhZGRyZXNzCQkJKi8KCQkJCS8qIEF0dG4uOiBTbGF2ZSBhZGRyZXNzIGlzIDcgb3IgMTAgYml0cyAqLwojZGVmaW5lIEkyQ19TTEFWRV9GT1JDRQkweDA3MDYJLyogQ2hhbmdlIHNsYXZlIGFkZHJlc3MJCQkqLwoJCQkJLyogQXR0bi46IFNsYXZlIGFkZHJlc3MgaXMgNyBvciAxMCBiaXRzICovCgkJCQkvKiBUaGlzIGNoYW5nZXMgdGhlIGFkZHJlc3MsIGV2ZW4gaWYgaXQgKi8KCQkJCS8qIGlzIGFscmVhZHkgdGFrZW4hCQkJKi8KI2RlZmluZSBJMkNfVEVOQklUCTB4MDcwNAkvKiAwIGZvciA3IGJpdCBhZGRycywgIT0gMCBmb3IgMTAgYml0CSovCgojZGVmaW5lIEkyQ19GVU5DUwkweDA3MDUJLyogR2V0IHRoZSBhZGFwdGVyIGZ1bmN0aW9uYWxpdHkgKi8KI2RlZmluZSBJMkNfUkRXUgkweDA3MDcJLyogQ29tYmluZWQgUi9XIHRyYW5zZmVyIChvbmUgc3RvcCBvbmx5KSovCiNkZWZpbmUgSTJDX1BFQwkJMHgwNzA4CS8qICE9IDAgZm9yIFNNQnVzIFBFQyAgICAgICAgICAgICAgICAgICAqLwoKI2RlZmluZSBJMkNfU01CVVMJMHgwNzIwCS8qIFNNQnVzLWxldmVsIGFjY2VzcyAqLwoKLyogLi4uIGFsZ28tYml0LmMgcmVjb2duaXplcyAqLwojZGVmaW5lIEkyQ19VREVMQVkJMHgwNzA1CS8qIHNldCBkZWxheSBpbiBtaWNyb3NlY3MgYmV0d2VlbiBlYWNoCSovCgkJCQkvKiB3cml0dGVuIGJ5dGUgKGV4Y2VwdCBhZGRyZXNzKQkqLwojZGVmaW5lIEkyQ19NREVMQVkJMHgwNzA2CS8qIG1pbGxpc2VjIGRlbGF5IGJldHdlZW4gd3JpdHRlbiBieXRlcyAqLwoKLyogLS0tLS0gSTJDLURFVjogY2hhciBkZXZpY2UgaW50ZXJmYWNlIHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiNkZWZpbmUgSTJDX01BSk9SCTg5CQkvKiBEZXZpY2UgbWFqb3IgbnVtYmVyCQkqLwoKLyogVGhlc2UgZGVmaW5lcyBhcmUgdXNlZCBmb3IgcHJvYmluZyBpMmMgY2xpZW50IGFkZHJlc3NlcyAqLwovKiBUaGUgbGVuZ3RoIG9mIHRoZSBvcHRpb24gbGlzdHMgKi8KI2RlZmluZSBJMkNfQ0xJRU5UX01BWF9PUFRTIDQ4CgovKiBEZWZhdWx0IGZpbGwgb2YgbWFueSB2YXJpYWJsZXMgKi8KI2RlZmluZSBJMkNfQ0xJRU5UX0RFRkFVTFRTIHtJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5EfQoKLyogSTJDX0NMSUVOVF9NT0RVTEVfUEFSTSBjcmVhdGVzIGEgbW9kdWxlIHBhcmFtZXRlciwgYW5kIHB1dHMgaXQgaW4gdGhlCiAgIG1vZHVsZSBoZWFkZXIgKi8KCiNkZWZpbmUgSTJDX0NMSUVOVF9NT0RVTEVfUEFSTSh2YXIsZGVzYykgXAogIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCB2YXJbSTJDX0NMSUVOVF9NQVhfT1BUU10gPSBJMkNfQ0xJRU5UX0RFRkFVTFRTOyBcCiAgc3RhdGljIHVuc2lnbmVkIGludCB2YXIjI19udW07IFwKICBtb2R1bGVfcGFyYW1fYXJyYXkodmFyLCBzaG9ydCwgJnZhciMjX251bSwgMCk7IFwKICBNT0RVTEVfUEFSTV9ERVNDKHZhcixkZXNjKQoKI2RlZmluZSBJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKG5hbWUpCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZV8jI25hbWUsCQkJCQlcCgkJICAgICAgICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB3aGljaCBhcmUgIglcCgkJICAgICAgICJ1bnF1ZXN0aW9uYWJseSBhc3N1bWVkIHRvIGNvbnRhaW4gYSBgIgkJXAoJCSAgICAgICAjIG5hbWUgIicgY2hpcCIpCgoKI2RlZmluZSBJMkNfQ0xJRU5UX0lOU01PRF9DT01NT04JCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShwcm9iZSwgIkxpc3Qgb2YgYWRhcHRlcixhZGRyZXNzIHBhaXJzIHRvIHNjYW4gIglcCgkJICAgICAgICJhZGRpdGlvbmFsbHkiKTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShpZ25vcmUsICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyBub3QgdG8gIglcCgkJICAgICAgICJzY2FuIik7CQkJCQkJXApzdGF0aWMgc3RydWN0IGkyY19jbGllbnRfYWRkcmVzc19kYXRhIGFkZHJfZGF0YSA9IHsJCQlcCgkubm9ybWFsX2kyYwk9IG5vcm1hbF9pMmMsCQkJCQlcCgkucHJvYmUJCT0gcHJvYmUsCQkJCQlcCgkuaWdub3JlCQk9IGlnbm9yZSwJCQkJCVwKCS5mb3JjZXMJCT0gZm9yY2VzLAkJCQkJXAp9CgovKiBUaGVzZSBhcmUgdGhlIG9uZXMgeW91IHdhbnQgdG8gdXNlIGluIHlvdXIgb3duIGRyaXZlcnMuIFBpY2sgdGhlIG9uZQogICB3aGljaCBtYXRjaGVzIHRoZSBudW1iZXIgb2YgZGV2aWNlcyB0aGUgZHJpdmVyIGRpZmZlcmVuY2lhdGVzIGJldHdlZW4uICovCiNkZWZpbmUgSTJDX0NMSUVOVF9JTlNNT0QgXAogIEkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2UsIFwKICAgICAgICAgICAgICAgICAgICAgICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB0byBib2xkbHkgYXNzdW1lICIgXAogICAgICAgICAgICAgICAgICAgICAgInRvIGJlIHByZXNlbnQiKTsgXAoJc3RhdGljIHVuc2lnbmVkIHNob3J0ICpmb3JjZXNbXSA9IHsJCQkJXAoJCQlmb3JjZSwJCQkJCQlcCgkJCU5VTEwJCQkJCQlcCgkJfTsJCQkJCQkJXApJMkNfQ0xJRU5UX0lOU01PRF9DT01NT04KCiNkZWZpbmUgSTJDX0NMSUVOVF9JTlNNT0RfMShjaGlwMSkJCQkJCVwKZW51bSBjaGlwcyB7IGFueV9jaGlwLCBjaGlwMSB9OwkJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZSwgIkxpc3Qgb2YgYWRhcHRlcixhZGRyZXNzIHBhaXJzIHRvICIJXAoJCSAgICAgICAiYm9sZGx5IGFzc3VtZSB0byBiZSBwcmVzZW50Iik7CQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAxKTsJCQkJCVwKc3RhdGljIHVuc2lnbmVkIHNob3J0ICpmb3JjZXNbXSA9IHsgZm9yY2UsIGZvcmNlXyMjY2hpcDEsIE5VTEwgfTsJXApJMkNfQ0xJRU5UX0lOU01PRF9DT01NT04KCiNkZWZpbmUgSTJDX0NMSUVOVF9JTlNNT0RfMihjaGlwMSwgY2hpcDIpCQkJCVwKZW51bSBjaGlwcyB7IGFueV9jaGlwLCBjaGlwMSwgY2hpcDIgfTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZSwgIkxpc3Qgb2YgYWRhcHRlcixhZGRyZXNzIHBhaXJzIHRvICIJXAoJCSAgICAgICAiYm9sZGx5IGFzc3VtZSB0byBiZSBwcmVzZW50Iik7CQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAxKTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMik7CQkJCQlcCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCAqZm9yY2VzW10gPSB7IGZvcmNlLCBmb3JjZV8jI2NoaXAxLAkJXAoJCQkJICAgIGZvcmNlXyMjY2hpcDIsIE5VTEwgfTsJCVwKSTJDX0NMSUVOVF9JTlNNT0RfQ09NTU9OCgojZGVmaW5lIEkyQ19DTElFTlRfSU5TTU9EXzMoY2hpcDEsIGNoaXAyLCBjaGlwMykJCQlcCmVudW0gY2hpcHMgeyBhbnlfY2hpcCwgY2hpcDEsIGNoaXAyLCBjaGlwMyB9OwkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2UsICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB0byAiCVwKCQkgICAgICAgImJvbGRseSBhc3N1bWUgdG8gYmUgcHJlc2VudCIpOwkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMSk7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDIpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAzKTsJCQkJCVwKc3RhdGljIHVuc2lnbmVkIHNob3J0ICpmb3JjZXNbXSA9IHsgZm9yY2UsIGZvcmNlXyMjY2hpcDEsCQlcCgkJCQkgICAgZm9yY2VfIyNjaGlwMiwgZm9yY2VfIyNjaGlwMywJXAoJCQkJICAgIE5VTEwgfTsJCQkJXApJMkNfQ0xJRU5UX0lOU01PRF9DT01NT04KCiNkZWZpbmUgSTJDX0NMSUVOVF9JTlNNT0RfNChjaGlwMSwgY2hpcDIsIGNoaXAzLCBjaGlwNCkJCQlcCmVudW0gY2hpcHMgeyBhbnlfY2hpcCwgY2hpcDEsIGNoaXAyLCBjaGlwMywgY2hpcDQgfTsJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2UsICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB0byAiCVwKCQkgICAgICAgImJvbGRseSBhc3N1bWUgdG8gYmUgcHJlc2VudCIpOwkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMSk7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDIpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAzKTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwNCk7CQkJCQlcCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCAqZm9yY2VzW10gPSB7IGZvcmNlLCBmb3JjZV8jI2NoaXAxLAkJXAoJCQkJICAgIGZvcmNlXyMjY2hpcDIsIGZvcmNlXyMjY2hpcDMsCVwKCQkJCSAgICBmb3JjZV8jI2NoaXA0LCBOVUxMfTsJCVwKSTJDX0NMSUVOVF9JTlNNT0RfQ09NTU9OCgojZGVmaW5lIEkyQ19DTElFTlRfSU5TTU9EXzUoY2hpcDEsIGNoaXAyLCBjaGlwMywgY2hpcDQsIGNoaXA1KQkJXAplbnVtIGNoaXBzIHsgYW55X2NoaXAsIGNoaXAxLCBjaGlwMiwgY2hpcDMsIGNoaXA0LCBjaGlwNSB9OwkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlLCAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgdG8gIglcCgkJICAgICAgICJib2xkbHkgYXNzdW1lIHRvIGJlIHByZXNlbnQiKTsJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDEpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAyKTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMyk7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDQpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA1KTsJCQkJCVwKc3RhdGljIHVuc2lnbmVkIHNob3J0ICpmb3JjZXNbXSA9IHsgZm9yY2UsIGZvcmNlXyMjY2hpcDEsCQlcCgkJCQkgICAgZm9yY2VfIyNjaGlwMiwgZm9yY2VfIyNjaGlwMywJXAoJCQkJICAgIGZvcmNlXyMjY2hpcDQsIGZvcmNlXyMjY2hpcDUsCVwKCQkJCSAgICBOVUxMIH07CQkJCVwKSTJDX0NMSUVOVF9JTlNNT0RfQ09NTU9OCgojZGVmaW5lIEkyQ19DTElFTlRfSU5TTU9EXzYoY2hpcDEsIGNoaXAyLCBjaGlwMywgY2hpcDQsIGNoaXA1LCBjaGlwNikJXAplbnVtIGNoaXBzIHsgYW55X2NoaXAsIGNoaXAxLCBjaGlwMiwgY2hpcDMsIGNoaXA0LCBjaGlwNSwgY2hpcDYgfTsJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlLCAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgdG8gIglcCgkJICAgICAgICJib2xkbHkgYXNzdW1lIHRvIGJlIHByZXNlbnQiKTsJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDEpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAyKTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMyk7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDQpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA1KTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwNik7CQkJCQlcCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCAqZm9yY2VzW10gPSB7IGZvcmNlLCBmb3JjZV8jI2NoaXAxLAkJXAoJCQkJICAgIGZvcmNlXyMjY2hpcDIsIGZvcmNlXyMjY2hpcDMsCVwKCQkJCSAgICBmb3JjZV8jI2NoaXA0LCBmb3JjZV8jI2NoaXA1LAlcCgkJCQkgICAgZm9yY2VfIyNjaGlwNiwgTlVMTCB9OwkJXApJMkNfQ0xJRU5UX0lOU01PRF9DT01NT04KCiNkZWZpbmUgSTJDX0NMSUVOVF9JTlNNT0RfNyhjaGlwMSwgY2hpcDIsIGNoaXAzLCBjaGlwNCwgY2hpcDUsIGNoaXA2LCBjaGlwNykgXAplbnVtIGNoaXBzIHsgYW55X2NoaXAsIGNoaXAxLCBjaGlwMiwgY2hpcDMsIGNoaXA0LCBjaGlwNSwgY2hpcDYsCVwKCSAgICAgY2hpcDcgfTsJCQkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlLCAiTGlzdCBvZiBhZGFwdGVyLGFkZHJlc3MgcGFpcnMgdG8gIglcCgkJICAgICAgICJib2xkbHkgYXNzdW1lIHRvIGJlIHByZXNlbnQiKTsJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDEpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAyKTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMyk7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDQpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA1KTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwNik7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDcpOwkJCQkJXApzdGF0aWMgdW5zaWduZWQgc2hvcnQgKmZvcmNlc1tdID0geyBmb3JjZSwgZm9yY2VfIyNjaGlwMSwJCVwKCQkJCSAgICBmb3JjZV8jI2NoaXAyLCBmb3JjZV8jI2NoaXAzLAlcCgkJCQkgICAgZm9yY2VfIyNjaGlwNCwgZm9yY2VfIyNjaGlwNSwJXAoJCQkJICAgIGZvcmNlXyMjY2hpcDYsIGZvcmNlXyMjY2hpcDcsCVwKCQkJCSAgICBOVUxMIH07CQkJCVwKSTJDX0NMSUVOVF9JTlNNT0RfQ09NTU9OCgojZGVmaW5lIEkyQ19DTElFTlRfSU5TTU9EXzgoY2hpcDEsIGNoaXAyLCBjaGlwMywgY2hpcDQsIGNoaXA1LCBjaGlwNiwgY2hpcDcsIGNoaXA4KSBcCmVudW0gY2hpcHMgeyBhbnlfY2hpcCwgY2hpcDEsIGNoaXAyLCBjaGlwMywgY2hpcDQsIGNoaXA1LCBjaGlwNiwJXAoJICAgICBjaGlwNywgY2hpcDggfTsJCQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2UsICJMaXN0IG9mIGFkYXB0ZXIsYWRkcmVzcyBwYWlycyB0byAiCVwKCQkgICAgICAgImJvbGRseSBhc3N1bWUgdG8gYmUgcHJlc2VudCIpOwkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwMSk7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDIpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXAzKTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwNCk7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDUpOwkJCQkJXApJMkNfQ0xJRU5UX01PRFVMRV9QQVJNX0ZPUkNFKGNoaXA2KTsJCQkJCVwKSTJDX0NMSUVOVF9NT0RVTEVfUEFSTV9GT1JDRShjaGlwNyk7CQkJCQlcCkkyQ19DTElFTlRfTU9EVUxFX1BBUk1fRk9SQ0UoY2hpcDgpOwkJCQkJXApzdGF0aWMgdW5zaWduZWQgc2hvcnQgKmZvcmNlc1tdID0geyBmb3JjZSwgZm9yY2VfIyNjaGlwMSwJCVwKCQkJCSAgICBmb3JjZV8jI2NoaXAyLCBmb3JjZV8jI2NoaXAzLAlcCgkJCQkgICAgZm9yY2VfIyNjaGlwNCwgZm9yY2VfIyNjaGlwNSwJXAoJCQkJICAgIGZvcmNlXyMjY2hpcDYsIGZvcmNlXyMjY2hpcDcsCVwKCQkJCSAgICBmb3JjZV8jI2NoaXA4LCBOVUxMIH07CQlcCkkyQ19DTElFTlRfSU5TTU9EX0NPTU1PTgoKI2VuZGlmIC8qIF9MSU5VWF9JMkNfSCAqLwo=