LyoKICAgIHZpYTY4NmEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMKCQlmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwoKICAgIENvcHlyaWdodCAoYykgMTk5OCAtIDIwMDIgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sCgkJCUt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwKCQkJTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiwKCQkJYW5kIEJvYiBEb3VnaGVydHkgPGJvYmRAc3RhbmZvcmQuZWR1PgogICAgKFNvbWUgY29udmVyc2lvbi1mYWN0b3IgZGF0YSB3ZXJlIGNvbnRyaWJ1dGVkIGJ5IEpvbmF0aGFuIFRlaCBTb29uIFlldwogICAgPGoudGVoQGluYW1lLmNvbT4gYW5kIEFsZXggdmFuIEthYW0gPGRhcmtzaWRlQGNoZWxsby5ubD4uKQoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgoqLwoKLyoKICAgIFN1cHBvcnRzIHRoZSBWaWEgVlQ4MkM2ODZBLCBWVDgyQzY4NkIgc291dGggYnJpZGdlcy4KICAgIFJlcG9ydHMgYWxsIGFzIGEgNjg2QS4KICAgIFdhcm5pbmcgLSBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGRldmljZS4KKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgojaW5jbHVkZSA8bGludXgvaTJjLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMtaXNhLmg+CiNpbmNsdWRlIDxsaW51eC9od21vbi5oPgojaW5jbHVkZSA8bGludXgvZXJyLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgojaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgoKCi8qIElmIGZvcmNlX2FkZHIgaXMgc2V0IHRvIGFueXRoaW5nIGRpZmZlcmVudCBmcm9tIDAsIHdlIGZvcmNpYmx5IGVuYWJsZQogICB0aGUgZGV2aWNlIGF0IHRoZSBnaXZlbiBhZGRyZXNzLiAqLwpzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2VfYWRkcjsKbW9kdWxlX3BhcmFtKGZvcmNlX2FkZHIsIHVzaG9ydCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoZm9yY2VfYWRkciwKCQkgIkluaXRpYWxpemUgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgc2Vuc29ycyIpOwoKLyogRGV2aWNlIGFkZHJlc3MKICAgTm90ZSB0aGF0IHdlIGNhbid0IGRldGVybWluZSB0aGUgSVNBIGFkZHJlc3MgdW50aWwgd2UgaGF2ZSBpbml0aWFsaXplZAogICBvdXIgbW9kdWxlICovCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCBhZGRyZXNzOwoKLyoKICAgVGhlIFZpYSA2ODZhIHNvdXRoYnJpZGdlIGhhcyBhIExNNzgtbGlrZSBjaGlwIGludGVncmF0ZWQgb24gdGhlIHNhbWUgSUMuCiAgIFRoaXMgZHJpdmVyIGlzIGEgY3VzdG9taXplZCBjb3B5IG9mIGxtNzguYwoqLwoKLyogTWFueSBWSUE2ODZBIGNvbnN0YW50cyBzcGVjaWZpZWQgYmVsb3cgKi8KCi8qIExlbmd0aCBvZiBJU0EgYWRkcmVzcyBzZWdtZW50ICovCiNkZWZpbmUgVklBNjg2QV9FWFRFTlQJCTB4ODAKI2RlZmluZSBWSUE2ODZBX0JBU0VfUkVHCTB4NzAKI2RlZmluZSBWSUE2ODZBX0VOQUJMRV9SRUcJMHg3NAoKLyogVGhlIFZJQTY4NkEgcmVnaXN0ZXJzICovCi8qIGlucyBudW1iZXJlZCAwLTQgKi8KI2RlZmluZSBWSUE2ODZBX1JFR19JTl9NQVgobnIpCSgweDJiICsgKChucikgKiAyKSkKI2RlZmluZSBWSUE2ODZBX1JFR19JTl9NSU4obnIpCSgweDJjICsgKChucikgKiAyKSkKI2RlZmluZSBWSUE2ODZBX1JFR19JTihucikJKDB4MjIgKyAobnIpKQoKLyogZmFucyBudW1iZXJlZCAxLTIgKi8KI2RlZmluZSBWSUE2ODZBX1JFR19GQU5fTUlOKG5yKQkoMHgzYSArIChucikpCiNkZWZpbmUgVklBNjg2QV9SRUdfRkFOKG5yKQkoMHgyOCArIChucikpCgovKiB0ZW1wcyBudW1iZXJlZCAxLTMgKi8Kc3RhdGljIGNvbnN0IHU4IFZJQTY4NkFfUkVHX1RFTVBbXQk9IHsgMHgyMCwgMHgyMSwgMHgxZiB9OwpzdGF0aWMgY29uc3QgdTggVklBNjg2QV9SRUdfVEVNUF9PVkVSW10JPSB7IDB4MzksIDB4M2QsIDB4MWQgfTsKc3RhdGljIGNvbnN0IHU4IFZJQTY4NkFfUkVHX1RFTVBfSFlTVFtdCT0geyAweDNhLCAweDNlLCAweDFlIH07Ci8qIGJpdHMgNy02ICovCiNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9MT1cxCTB4NGIKLyogMiA9IGJpdHMgNS00LCAzID0gYml0cyA3LTYgKi8KI2RlZmluZSBWSUE2ODZBX1JFR19URU1QX0xPVzIzCTB4NDkKCiNkZWZpbmUgVklBNjg2QV9SRUdfQUxBUk0xCTB4NDEKI2RlZmluZSBWSUE2ODZBX1JFR19BTEFSTTIJMHg0MgojZGVmaW5lIFZJQTY4NkFfUkVHX0ZBTkRJVgkweDQ3CiNkZWZpbmUgVklBNjg2QV9SRUdfQ09ORklHCTB4NDAKLyogVGhlIGZvbGxvd2luZyByZWdpc3RlciBzZXRzIHRlbXAgaW50ZXJydXB0IG1vZGUgKGJpdHMgMS0wIGZvciB0ZW1wMSwKIDMtMiBmb3IgdGVtcDIsIDUtNCBmb3IgdGVtcDMpLiAgTW9kZXMgYXJlOgogICAgMDAgaW50ZXJydXB0IHN0YXlzIGFzIGxvbmcgYXMgdmFsdWUgaXMgb3V0LW9mLXJhbmdlCiAgICAwMSBpbnRlcnJ1cHQgaXMgY2xlYXJlZCBvbmNlIHJlZ2lzdGVyIGlzIHJlYWQgKGRlZmF1bHQpCiAgICAxMCBjb21wYXJhdG9yIG1vZGUtIGxpa2UgMDAsIGJ1dCBpZ25vcmVzIGh5c3RlcmVzaXMKICAgIDExIHNhbWUgYXMgMDAgKi8KI2RlZmluZSBWSUE2ODZBX1JFR19URU1QX01PREUJCTB4NGIKLyogV2UnbGwganVzdCBhc3N1bWUgdGhhdCB5b3Ugd2FudCB0byBzZXQgYWxsIDMgc2ltdWx0YW5lb3VzbHk6ICovCiNkZWZpbmUgVklBNjg2QV9URU1QX01PREVfTUFTSwkJMHgzRgojZGVmaW5lIFZJQTY4NkFfVEVNUF9NT0RFX0NPTlRJTlVPVVMJMHgwMAoKLyogQ29udmVyc2lvbnMuIExpbWl0IGNoZWNraW5nIGlzIG9ubHkgZG9uZSBvbiB0aGUgVE9fUkVHCiAgIHZhcmlhbnRzLgoKKioqKioqKioqIFZPTFRBR0UgQ09OVkVSU0lPTlMgKEJvYiBEb3VnaGVydHkpICoqKioqKioqCiBGcm9tIEhXTW9uLmNwcCAoQ29weXJpZ2h0IDE5OTgtMjAwMCBKb25hdGhhbiBUZWggU29vbiBZZXcpOgogdm9sdGFnZWZhY3RvclswXT0xLjI1LzI2Mjg7ICgyNjI4LzEuMjU9MjEwMi40KSAgIC8vIFZjY3AKIHZvbHRhZ2VmYWN0b3JbMV09MS4yNS8yNjI4OyAoMjYyOC8xLjI1PTIxMDIuNCkgICAvLyArMi41Vgogdm9sdGFnZWZhY3RvclsyXT0xLjY3LzI2Mjg7ICgyNjI4LzEuNjc9MTU3My43KSAgIC8vICszLjNWCiB2b2x0YWdlZmFjdG9yWzNdPTIuNi8yNjI4OyAgKDI2MjgvMi42MD0xMDEwLjgpICAgLy8gKzVWCiB2b2x0YWdlZmFjdG9yWzRdPTYuMy8yNjI4OyAgKDI2MjgvNi4zMD00MTcuMTQpICAgLy8gKzEyVgogaW5baV09KGRhdGFbaSsyXSoyNS4wKzEzMykqdm9sdGFnZWZhY3RvcltpXTsKIFRoYXQgaXM6CiB2b2x0cyA9ICgyNSpyZWdWYWwrMTMzKSpmYWN0b3IKIHJlZ1ZhbCA9ICh2b2x0cy9mYWN0b3ItMTMzKS8yNQogKFRoZXNlIGNvbnZlcnNpb25zIHdlcmUgY29udHJpYnV0ZWQgYnkgSm9uYXRoYW4gVGVoIFNvb24gWWV3CiA8ai50ZWhAaW5hbWUuY29tPikgKi8Kc3RhdGljIGlubGluZSB1OCBJTl9UT19SRUcobG9uZyB2YWwsIGludCBpbk51bSkKewoJLyogVG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQsIHdlIG11bHRpcGx5IGNvbnN0YW50cyBieSAxMCAoMTAwIGZvciArMTJWKS4KCSAgIFJvdW5kaW5nIGlzIGRvbmUgKDEyMDUwMCBpcyBhY3R1YWxseSAxMzMwMDAgLSAxMjUwMCkuCgkgICBSZW1lbWJlciB0aGF0IHZhbCBpcyBleHByZXNzZWQgaW4gMC4wMDFWL2JpdCwgd2hpY2ggaXMgd2h5IHdlIGRpdmlkZQoJICAgYnkgYW4gYWRkaXRpb25hbCAxMDAwMCAoMTAwMDAwIGZvciArMTJWKTogMTAwMCBmb3IgdmFsIGFuZCAxMCAoMTAwKQoJICAgZm9yIHRoZSBjb25zdGFudHMuICovCglpZiAoaW5OdW0gPD0gMSkKCQlyZXR1cm4gKHU4KQoJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiAyMTAyNCAtIDEyMDUwMDApIC8gMjUwMDAwLCAwLCAyNTUpOwoJZWxzZSBpZiAoaW5OdW0gPT0gMikKCQlyZXR1cm4gKHU4KQoJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiAxNTczNyAtIDEyMDUwMDApIC8gMjUwMDAwLCAwLCAyNTUpOwoJZWxzZSBpZiAoaW5OdW0gPT0gMykKCQlyZXR1cm4gKHU4KQoJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiAxMDEwOCAtIDEyMDUwMDApIC8gMjUwMDAwLCAwLCAyNTUpOwoJZWxzZQoJCXJldHVybiAodTgpCgkJICAgIFNFTlNPUlNfTElNSVQoKHZhbCAqIDQxNzE0IC0gMTIwNTAwMDApIC8gMjUwMDAwMCwgMCwgMjU1KTsKfQoKc3RhdGljIGlubGluZSBsb25nIElOX0ZST01fUkVHKHU4IHZhbCwgaW50IGluTnVtKQp7CgkvKiBUbyBhdm9pZCBmbG9hdGluZyBwb2ludCwgd2UgbXVsdGlwbHkgY29uc3RhbnRzIGJ5IDEwICgxMDAgZm9yICsxMlYpLgoJICAgV2UgYWxzbyBtdWx0aXBseSB0aGVtIGJ5IDEwMDAgYmVjYXVzZSB3ZSB3YW50IDAuMDAxVi9iaXQgZm9yIHRoZQoJICAgb3V0cHV0IHZhbHVlLiBSb3VuZGluZyBpcyBkb25lLiAqLwoJaWYgKGluTnVtIDw9IDEpCgkJcmV0dXJuIChsb25nKSAoKDI1MDAwMCAqIHZhbCArIDEzMzAwMDAgKyAyMTAyNCAvIDIpIC8gMjEwMjQpOwoJZWxzZSBpZiAoaW5OdW0gPT0gMikKCQlyZXR1cm4gKGxvbmcpICgoMjUwMDAwICogdmFsICsgMTMzMDAwMCArIDE1NzM3IC8gMikgLyAxNTczNyk7CgllbHNlIGlmIChpbk51bSA9PSAzKQoJCXJldHVybiAobG9uZykgKCgyNTAwMDAgKiB2YWwgKyAxMzMwMDAwICsgMTAxMDggLyAyKSAvIDEwMTA4KTsKCWVsc2UKCQlyZXR1cm4gKGxvbmcpICgoMjUwMDAwMCAqIHZhbCArIDEzMzAwMDAwICsgNDE3MTQgLyAyKSAvIDQxNzE0KTsKfQoKLyoqKioqKioqKiBGQU4gUlBNIENPTlZFUlNJT05TICoqKioqKioqLwovKiBIaWdoZXIgcmVnaXN0ZXIgdmFsdWVzID0gc2xvd2VyIGZhbnMgKHRoZSBmYW4ncyBzdHJvYmUgZ2F0ZXMgYSBjb3VudGVyKS4KIEJ1dCB0aGlzIGNoaXAgc2F0dXJhdGVzIGJhY2sgYXQgMCwgbm90IGF0IDI1NSBsaWtlIGFsbCB0aGUgb3RoZXIgY2hpcHMuCiBTbywgMCBtZWFucyAwIFJQTSAqLwpzdGF0aWMgaW5saW5lIHU4IEZBTl9UT19SRUcobG9uZyBycG0sIGludCBkaXYpCnsKCWlmIChycG0gPT0gMCkKCQlyZXR1cm4gMDsKCXJwbSA9IFNFTlNPUlNfTElNSVQocnBtLCAxLCAxMDAwMDAwKTsKCXJldHVybiBTRU5TT1JTX0xJTUlUKCgxMzUwMDAwICsgcnBtICogZGl2IC8gMikgLyAocnBtICogZGl2KSwgMSwgMjU1KTsKfQoKI2RlZmluZSBGQU5fRlJPTV9SRUcodmFsLGRpdikgKCh2YWwpPT0wPzA6KHZhbCk9PTI1NT8wOjEzNTAwMDAvKCh2YWwpKihkaXYpKSkKCi8qKioqKioqKiBURU1QIENPTlZFUlNJT05TIChCb2IgRG91Z2hlcnR5KSAqKioqKioqKiovCi8qIGxpbmVhciBmaXRzIGZyb20gSFdNb24uY3BwIChDb3B5cmlnaHQgMTk5OC0yMDAwIEpvbmF0aGFuIFRlaCBTb29uIFlldykKICAgICAgaWYodGVtcDwxNjkpCgkgICAgICByZXR1cm4gZG91YmxlKHRlbXApKjAuNDI3LTMyLjA4OwogICAgICBlbHNlIGlmKHRlbXA+PTE2OSAmJiB0ZW1wPD0yMDIpCgkgICAgICByZXR1cm4gZG91YmxlKHRlbXApKjAuNTgyLTU4LjE2OwogICAgICBlbHNlCgkgICAgICByZXR1cm4gZG91YmxlKHRlbXApKjAuOTI0LTEyNy4zMzsKCiBBIGZpZnRoLW9yZGVyIHBvbHlub21pYWwgZml0cyB0aGUgdW5vZmZpY2lhbCBkYXRhIChwcm92aWRlZCBieSBBbGV4IHZhbgogS2FhbSA8ZGFya3NpZGVAY2hlbGxvLm5sPikgYSBiaXQgYmV0dGVyLiAgSXQgYWxzbyBnaXZlIG1vcmUgcmVhc29uYWJsZQogbnVtYmVycyBvbiBteSBtYWNoaW5lIChpZS4gdGhleSBhZ3JlZSB3aXRoIHdoYXQgbXkgQklPUyB0ZWxscyBtZSkuCiBIZXJlJ3MgdGhlIGZpZnRoLW9yZGVyIGZpdCB0byB0aGUgOC1iaXQgZGF0YToKIHRlbXAgPSAxLjYyNTA5M2UtMTAqdmFsXjUgLSAxLjAwMTYzMmUtMDcqdmFsXjQgKyAyLjQ1NzY1M2UtMDUqdmFsXjMgLQoJMi45Njc2MTllLTAzKnZhbF4yICsgMi4xNzUxNDRlLTAxKnZhbCAtIDcuMDkwMDY3ZSswLgoKICgyMDAwLTEwLTI1LSBSRkQ6IHRoYW5rcyB0byBVd2UgQW5kZXJzZW4gPHVhbmRlcnNlbkBtYXlhaC5jb20+IGZvcgogZmluZGluZyBteSB0eXBvcyBpbiB0aGlzIGZvcm11bGEhKQoKIEFsYXMsIG5vbmUgb2YgdGhlIGVsZWdhbnQgZnVuY3Rpb24tZml0IHNvbHV0aW9ucyB3aWxsIHdvcmsgYmVjYXVzZSB3ZQogYXJlbid0IGFsbG93ZWQgdG8gdXNlIGZsb2F0aW5nIHBvaW50IGluIHRoZSBrZXJuZWwgYW5kIGRvaW5nIGl0IHdpdGgKIGludGVnZXJzIGRvZXNuJ3QgcHJvdmlkZSBlbm91Z2ggcHJlY2lzaW9uLiAgU28gd2UnbGwgZG8gYm9yaW5nIG9sZAogbG9vay11cCB0YWJsZSBzdHVmZi4gIFRoZSB1bm9mZmljaWFsIGRhdGEgKHNlZSBiZWxvdykgaGF2ZSBlZmZlY3RpdmVseQogNy1iaXQgcmVzb2x1dGlvbiAodGhleSBhcmUgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBkZWdyZWUpLiAgSSdtIGFzc3VtaW5nCiB0aGF0IHRoZSB0cmFuc2ZlciBmdW5jdGlvbiBvZiB0aGUgZGV2aWNlIGlzIG1vbm90b25pYyBhbmQgc21vb3RoLCBzbyBhCiBzbW9vdGggZnVuY3Rpb24gZml0IHRvIHRoZSBkYXRhIHdpbGwgYWxsb3cgdXMgdG8gZ2V0IGJldHRlciBwcmVjaXNpb24uCiBJIHVzZWQgdGhlIDV0aC1vcmRlciBwb2x5IGZpdCBkZXNjcmliZWQgYWJvdmUgYW5kIHNvbHZlZCBmb3IKIFZJQSByZWdpc3RlciB2YWx1ZXMgMC0yNTUuICBJICoxMCBiZWZvcmUgcm91bmRpbmcsIHNvIHdlIGdldCB0ZW50aC1kZWdyZWUKIHByZWNpc2lvbi4gIChJIGNvdWxkIGhhdmUgZG9uZSBhbGwgMTAyNCB2YWx1ZXMgZm9yIG91ciAxMC1iaXQgcmVhZGluZ3MsCiBidXQgdGhlIGZ1bmN0aW9uIGlzIHZlcnkgbGluZWFyIGluIHRoZSB1c2VmdWwgcmFuZ2UgKDAtODAgZGVnIEMpLCBzbwogd2UnbGwganVzdCB1c2UgbGluZWFyIGludGVycG9sYXRpb24gZm9yIDEwLWJpdCByZWFkaW5ncy4pICBTbywgdGVtcExVVAogaXMgdGhlIHRlbXAgYXQgdmlhIHJlZ2lzdGVyIHZhbHVlcyAwLTI1NTogKi8Kc3RhdGljIGNvbnN0IHMxNiB0ZW1wTFVUW10gPQp7IC03MDksIC02ODgsIC02NjcsIC02NDYsIC02MjcsIC02MDcsIC01ODksIC01NzAsIC01NTMsIC01MzYsIC01MTksCgktNTAzLCAtNDg3LCAtNDcxLCAtNDU2LCAtNDQyLCAtNDI4LCAtNDE0LCAtNDAwLCAtMzg3LCAtMzc1LAoJLTM2MiwgLTM1MCwgLTMzOSwgLTMyNywgLTMxNiwgLTMwNSwgLTI5NSwgLTI4NSwgLTI3NSwgLTI2NSwKCS0yNTUsIC0yNDYsIC0yMzcsIC0yMjksIC0yMjAsIC0yMTIsIC0yMDQsIC0xOTYsIC0xODgsIC0xODAsCgktMTczLCAtMTY2LCAtMTU5LCAtMTUyLCAtMTQ1LCAtMTM5LCAtMTMyLCAtMTI2LCAtMTIwLCAtMTE0LAoJLTEwOCwgLTEwMiwgLTk2LCAtOTEsIC04NSwgLTgwLCAtNzQsIC02OSwgLTY0LCAtNTksIC01NCwgLTQ5LAoJLTQ0LCAtMzksIC0zNCwgLTI5LCAtMjUsIC0yMCwgLTE1LCAtMTEsIC02LCAtMiwgMywgNywgMTIsIDE2LAoJMjAsIDI1LCAyOSwgMzMsIDM3LCA0MiwgNDYsIDUwLCA1NCwgNTksIDYzLCA2NywgNzEsIDc1LCA3OSwgODQsCgk4OCwgOTIsIDk2LCAxMDAsIDEwNCwgMTA5LCAxMTMsIDExNywgMTIxLCAxMjUsIDEzMCwgMTM0LCAxMzgsCgkxNDIsIDE0NiwgMTUxLCAxNTUsIDE1OSwgMTYzLCAxNjgsIDE3MiwgMTc2LCAxODEsIDE4NSwgMTg5LAoJMTkzLCAxOTgsIDIwMiwgMjA2LCAyMTEsIDIxNSwgMjE5LCAyMjQsIDIyOCwgMjMyLCAyMzcsIDI0MSwKCTI0NSwgMjUwLCAyNTQsIDI1OSwgMjYzLCAyNjcsIDI3MiwgMjc2LCAyODEsIDI4NSwgMjkwLCAyOTQsCgkyOTksIDMwMywgMzA3LCAzMTIsIDMxNiwgMzIxLCAzMjUsIDMzMCwgMzM0LCAzMzksIDM0NCwgMzQ4LAoJMzUzLCAzNTcsIDM2MiwgMzY2LCAzNzEsIDM3NiwgMzgwLCAzODUsIDM5MCwgMzk1LCAzOTksIDQwNCwKCTQwOSwgNDE0LCA0MTksIDQyMywgNDI4LCA0MzMsIDQzOCwgNDQzLCA0NDksIDQ1NCwgNDU5LCA0NjQsCgk0NjksIDQ3NSwgNDgwLCA0ODYsIDQ5MSwgNDk3LCA1MDIsIDUwOCwgNTE0LCA1MjAsIDUyNiwgNTMyLAoJNTM4LCA1NDQsIDU1MSwgNTU3LCA1NjQsIDU3MSwgNTc4LCA1ODQsIDU5MiwgNTk5LCA2MDYsIDYxNCwKCTYyMSwgNjI5LCA2MzcsIDY0NSwgNjU0LCA2NjIsIDY3MSwgNjgwLCA2ODksIDY5OCwgNzA4LCA3MTgsCgk3MjgsIDczOCwgNzQ5LCA3NTksIDc3MCwgNzgyLCA3OTMsIDgwNSwgODE4LCA4MzAsIDg0MywgODU2LAoJODcwLCA4ODMsIDg5OCwgOTEyLCA5MjcsIDk0MywgOTU4LCA5NzUsIDk5MSwgMTAwOCwgMTAyNiwgMTA0NCwKCTEwNjIsIDEwODEsIDExMDEsIDExMjEsIDExNDEsIDExNjIsIDExODQsIDEyMDYsIDEyMjksIDEyNTIsCgkxMjc2LCAxMzAxLCAxMzI2LCAxMzUyLCAxMzc4LCAxNDA2LCAxNDM0LCAxNDYyCn07CgovKiB0aGUgb3JpZ2luYWwgTFVUIHZhbHVlcyBmcm9tIEFsZXggdmFuIEthYW0gPGRhcmtzaWRlQGNoZWxsby5ubD4KICAgKGZvciB2aWEgcmVnaXN0ZXIgdmFsdWVzIDEyLTI0MCk6CnstNTAsLTQ5LC00NywtNDUsLTQzLC00MSwtMzksLTM4LC0zNywtMzUsLTM0LC0zMywtMzIsLTMxLAotMzAsLTI5LC0yOCwtMjcsLTI2LC0yNSwtMjQsLTI0LC0yMywtMjIsLTIxLC0yMCwtMjAsLTE5LC0xOCwtMTcsLTE3LC0xNiwtMTUsCi0xNSwtMTQsLTE0LC0xMywtMTIsLTEyLC0xMSwtMTEsLTEwLC05LC05LC04LC04LC03LC03LC02LC02LC01LC01LC00LC00LC0zLAotMywtMiwtMiwtMSwtMSwwLDAsMSwxLDEsMywzLDMsNCw0LDQsNSw1LDUsNiw2LDcsNyw4LDgsOSw5LDksMTAsMTAsMTEsMTEsMTIsCjEyLDEyLDEzLDEzLDEzLDE0LDE0LDE1LDE1LDE2LDE2LDE2LDE3LDE3LDE4LDE4LDE5LDE5LDIwLDIwLDIxLDIxLDIxLDIyLDIyLAoyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNiwyNywyNywyNywyOCwyOCwyOSwyOSwzMCwzMCwzMCwzMSwzMSwzMiwzMiwzMywKMzMsMzQsMzQsMzUsMzUsMzUsMzYsMzYsMzcsMzcsMzgsMzgsMzksMzksNDAsNDAsNDEsNDEsNDIsNDIsNDMsNDMsNDQsNDQsNDUsCjQ1LDQ2LDQ2LDQ3LDQ4LDQ4LDQ5LDQ5LDUwLDUxLDUxLDUyLDUyLDUzLDUzLDU0LDU1LDU1LDU2LDU3LDU3LDU4LDU5LDU5LDYwLAo2MSw2Miw2Miw2Myw2NCw2NSw2Niw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Myw4NCwKODUsODYsODgsODksOTEsOTIsOTQsOTYsOTcsOTksMTAxLDEwMywxMDUsMTA3LDEwOSwxMTB9OwoKCiBIZXJlJ3MgdGhlIHJldmVyc2UgTFVULiAgSSBnb3QgaXQgYnkgZG9pbmcgYSA2LXRoIG9yZGVyIHBvbHkgZml0IChuZWVkZWQKIGFuIGV4dHJhIHRlcm0gZm9yIGEgZ29vZCBmaXQgdG8gdGhlc2UgaW52ZXJzZSBkYXRhISkgYW5kIHRoZW4KIHNvbHZpbmcgZm9yIGVhY2ggdGVtcCB2YWx1ZSBmcm9tIC01MCB0byAxMTAgKHRoZSB1c2VhYmxlIHJhbmdlIGZvcgogdGhpcyBjaGlwKS4gIEhlcmUncyB0aGUgZml0OgogdmlhUmVnVmFsID0gLTEuMTYwMzcwZS0xMCp2YWxeNiArMy4xOTM2OTNlLTA4KnZhbF41IC0gMS40NjQ0NDdlLTA2KnZhbF40CiAtIDIuNTI1NDUzZS0wNCp2YWxeMyArIDEuNDI0NTkzZS0wMip2YWxeMiArIDIuMTQ4OTQxZSswMCp2YWwgKzcuMjc1ODA4ZSswMSkKIE5vdGUgdGhhdCBuPTE2MTogKi8Kc3RhdGljIGNvbnN0IHU4IHZpYUxVVFtdID0KeyAxMiwgMTIsIDEzLCAxNCwgMTQsIDE1LCAxNiwgMTYsIDE3LCAxOCwgMTgsIDE5LCAyMCwgMjAsIDIxLCAyMiwgMjMsCgkyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM1LCAzNiwgMzcsIDM5LCA0MCwKCTQxLCA0MywgNDUsIDQ2LCA0OCwgNDksIDUxLCA1MywgNTUsIDU3LCA1OSwgNjAsIDYyLCA2NCwgNjYsCgk2OSwgNzEsIDczLCA3NSwgNzcsIDc5LCA4MiwgODQsIDg2LCA4OCwgOTEsIDkzLCA5NSwgOTgsIDEwMCwKCTEwMywgMTA1LCAxMDcsIDExMCwgMTEyLCAxMTUsIDExNywgMTE5LCAxMjIsIDEyNCwgMTI2LCAxMjksCgkxMzEsIDEzNCwgMTM2LCAxMzgsIDE0MCwgMTQzLCAxNDUsIDE0NywgMTUwLCAxNTIsIDE1NCwgMTU2LAoJMTU4LCAxNjAsIDE2MiwgMTY0LCAxNjYsIDE2OCwgMTcwLCAxNzIsIDE3NCwgMTc2LCAxNzgsIDE4MCwKCTE4MiwgMTgzLCAxODUsIDE4NywgMTg4LCAxOTAsIDE5MiwgMTkzLCAxOTUsIDE5NiwgMTk4LCAxOTksCgkyMDAsIDIwMiwgMjAzLCAyMDUsIDIwNiwgMjA3LCAyMDgsIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLAoJMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIyLCAyMjMsIDIyNCwKCTIyNSwgMjI2LCAyMjYsIDIyNywgMjI4LCAyMjgsIDIyOSwgMjMwLCAyMzAsIDIzMSwgMjMyLCAyMzIsCgkyMzMsIDIzMywgMjM0LCAyMzUsIDIzNSwgMjM2LCAyMzYsIDIzNywgMjM3LCAyMzgsIDIzOCwgMjM5LAoJMjM5LCAyNDAKfTsKCi8qIENvbnZlcnRpbmcgdGVtcHMgdG8gKDgtYml0KSBoeXN0IGFuZCBvdmVyIHJlZ2lzdGVycwogICBObyBpbnRlcnBvbGF0aW9uIGhlcmUuCiAgIFRoZSArNTAgaXMgYmVjYXVzZSB0aGUgdGVtcHMgc3RhcnQgYXQgLTUwICovCnN0YXRpYyBpbmxpbmUgdTggVEVNUF9UT19SRUcobG9uZyB2YWwpCnsKCXJldHVybiB2aWFMVVRbdmFsIDw9IC01MDAwMCA/IDAgOiB2YWwgPj0gMTEwMDAwID8gMTYwIDoKCQkgICAgICAodmFsIDwgMCA/IHZhbCAtIDUwMCA6IHZhbCArIDUwMCkgLyAxMDAwICsgNTBdOwp9CgovKiBmb3IgOC1iaXQgdGVtcGVyYXR1cmUgaHlzdCBhbmQgb3ZlciByZWdpc3RlcnMgKi8KI2RlZmluZSBURU1QX0ZST01fUkVHKHZhbCkJKChsb25nKXRlbXBMVVRbdmFsXSAqIDEwMCkKCi8qIGZvciAxMC1iaXQgdGVtcGVyYXR1cmUgcmVhZGluZ3MgKi8Kc3RhdGljIGlubGluZSBsb25nIFRFTVBfRlJPTV9SRUcxMCh1MTYgdmFsKQp7Cgl1MTYgZWlnaHRCaXRzID0gdmFsID4+IDI7Cgl1MTYgdHdvQml0cyA9IHZhbCAmIDM7CgoJLyogbm8gaW50ZXJwb2xhdGlvbiBmb3IgdGhlc2UgKi8KCWlmICh0d29CaXRzID09IDAgfHwgZWlnaHRCaXRzID09IDI1NSkKCQlyZXR1cm4gVEVNUF9GUk9NX1JFRyhlaWdodEJpdHMpOwoKCS8qIGRvIHNvbWUgbGluZWFyIGludGVycG9sYXRpb24gKi8KCXJldHVybiAodGVtcExVVFtlaWdodEJpdHNdICogKDQgLSB0d29CaXRzKSArCgkJdGVtcExVVFtlaWdodEJpdHMgKyAxXSAqIHR3b0JpdHMpICogMjU7Cn0KCiNkZWZpbmUgRElWX0ZST01fUkVHKHZhbCkgKDEgPDwgKHZhbCkpCiNkZWZpbmUgRElWX1RPX1JFRyh2YWwpICgodmFsKT09OD8zOih2YWwpPT00PzI6KHZhbCk9PTE/MDoxKQoKLyogRm9yIGVhY2ggcmVnaXN0ZXJlZCBjaGlwLCB3ZSBuZWVkIHRvIGtlZXAgc29tZSBkYXRhIGluIG1lbW9yeS4KICAgVGhlIHN0cnVjdHVyZSBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQuICovCnN0cnVjdCB2aWE2ODZhX2RhdGEgewoJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OwoJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwoJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOwoJY2hhciB2YWxpZDsJCS8qICE9MCBpZiBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLwoJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KCgl1OCBpbls1XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCgl1OCBpbl9tYXhbNV07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwoJdTggaW5fbWluWzVdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGZhblsyXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCgl1OCBmYW5fbWluWzJdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXUxNiB0ZW1wWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgMTAgYml0ICovCgl1OCB0ZW1wX292ZXJbM107CS8qIFJlZ2lzdGVyIHZhbHVlICovCgl1OCB0ZW1wX2h5c3RbM107CS8qIFJlZ2lzdGVyIHZhbHVlICovCgl1OCBmYW5fZGl2WzJdOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIHNoaWZ0ZWQgcmlnaHQgKi8KCXUxNiBhbGFybXM7CQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KfTsKCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqc19icmlkZ2U7CS8qIHBvaW50ZXIgdG8gdGhlIChvbmx5KSB2aWE2ODZhICovCgpzdGF0aWMgaW50IHZpYTY4NmFfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CnN0YXRpYyBpbnQgdmlhNjg2YV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwoKc3RhdGljIGlubGluZSBpbnQgdmlhNjg2YV9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKewoJcmV0dXJuIChpbmJfcChjbGllbnQtPmFkZHIgKyByZWcpKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIHZpYTY4NmFfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLAoJCQkJICAgICAgIHU4IHZhbHVlKQp7CglvdXRiX3AodmFsdWUsIGNsaWVudC0+YWRkciArIHJlZyk7Cn0KCnN0YXRpYyBzdHJ1Y3QgdmlhNjg2YV9kYXRhICp2aWE2ODZhX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKc3RhdGljIHZvaWQgdmlhNjg2YV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKCi8qIGZvbGxvd2luZyBhcmUgdGhlIHN5c2ZzIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLwoKLyogNyB2b2x0YWdlIHNlbnNvcnMgKi8Kc3RhdGljIHNzaXplX3Qgc2hvd19pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluW25yXSwgbnIpKTsKfQoKc3RhdGljIHNzaXplX3Qgc2hvd19pbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbl9taW5bbnJdLCBucikpOwp9CgpzdGF0aWMgc3NpemVfdCBzaG93X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21heFtucl0sIG5yKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNldF9pbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCgkJc2l6ZV90IGNvdW50LCBpbnQgbnIpIHsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Cgl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwoKCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPmluX21pbltucl0gPSBJTl9UT19SRUcodmFsLCBucik7Cgl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfSU5fTUlOKG5yKSwKCQkJZGF0YS0+aW5fbWluW25yXSk7CgltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQpzdGF0aWMgc3NpemVfdCBzZXRfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAoJCXNpemVfdCBjb3VudCwgaW50IG5yKSB7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKCgltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CglkYXRhLT5pbl9tYXhbbnJdID0gSU5fVE9fUkVHKHZhbCwgbnIpOwoJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0lOX01BWChuciksCgkJCWRhdGEtPmluX21heFtucl0pOwoJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0KI2RlZmluZSBzaG93X2luX29mZnNldChvZmZzZXQpCQkJCQlcCnN0YXRpYyBzc2l6ZV90IAkJCQkJCQlcCglzaG93X2luIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKewkJCQkJCQkJXAoJcmV0dXJuIHNob3dfaW4oZGV2LCBidWYsIG9mZnNldCk7CQkJXAp9CQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90IAkJCQkJCQlcCglzaG93X2luIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAp7CQkJCQkJCQlcCglyZXR1cm4gc2hvd19pbl9taW4oZGV2LCBidWYsIG9mZnNldCk7CQlcCn0JCQkJCQkJCVwKc3RhdGljIHNzaXplX3QgCQkJCQkJCVwKCXNob3dfaW4jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCnsJCQkJCQkJCVwKCXJldHVybiBzaG93X2luX21heChkZXYsIGJ1Ziwgb2Zmc2V0KTsJCVwKfQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgCVwKCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJXAp7CQkJCQkJCQlcCglyZXR1cm4gc2V0X2luX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7CQlcCn0JCQkJCQkJCVwKc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQlcCnsJCQkJCQkJCVwKCXJldHVybiBzZXRfaW5fbWF4KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsJCVwKfQkJCQkJCQkJXApzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X2luIyNvZmZzZXQsIE5VTEwpO1wKc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCAJXAoJCXNob3dfaW4jI29mZnNldCMjX21pbiwgc2V0X2luIyNvZmZzZXQjI19taW4pOwlcCnN0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgCVwKCQlzaG93X2luIyNvZmZzZXQjI19tYXgsIHNldF9pbiMjb2Zmc2V0IyNfbWF4KTsKCnNob3dfaW5fb2Zmc2V0KDApOwpzaG93X2luX29mZnNldCgxKTsKc2hvd19pbl9vZmZzZXQoMik7CnNob3dfaW5fb2Zmc2V0KDMpOwpzaG93X2luX29mZnNldCg0KTsKCi8qIDMgdGVtcGVyYXR1cmVzICovCnN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIFRFTVBfRlJPTV9SRUcxMChkYXRhLT50ZW1wW25yXSkpOwp9CnN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX292ZXJbbnJdKSk7Cn0Kc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfaHlzdFtucl0pKTsKfQpzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAoJCXNpemVfdCBjb3VudCwgaW50IG5yKSB7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CgoJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+dGVtcF9vdmVyW25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7Cgl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9PVkVSW25yXSwKCQkJICAgIGRhdGEtPnRlbXBfb3Zlcltucl0pOwoJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0Kc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKCQlzaXplX3QgY291bnQsIGludCBucikgewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwoKCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPnRlbXBfaHlzdFtucl0gPSBURU1QX1RPX1JFRyh2YWwpOwoJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfSFlTVFtucl0sCgkJCSAgICBkYXRhLT50ZW1wX2h5c3RbbnJdKTsKCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CiNkZWZpbmUgc2hvd190ZW1wX29mZnNldChvZmZzZXQpCQkJCQlcCnN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2hvd190ZW1wKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdAkJCQkJCQkJXApzaG93X3RlbXBfIyNvZmZzZXQjI19vdmVyIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2hvd190ZW1wX292ZXIoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKfQkJCQkJCQkJCVwKc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKc2hvd190ZW1wXyMjb2Zmc2V0IyNfaHlzdCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAp7CQkJCQkJCQkJXAoJcmV0dXJuIHNob3dfdGVtcF9oeXN0KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCn0JCQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90IHNldF90ZW1wXyMjb2Zmc2V0IyNfb3ZlciAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgCQlcCgkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2V0X3RlbXBfb3ZlcihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI29mZnNldCMjX2h5c3QgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIAkJXAoJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJXAp7CQkJCQkJCQkJXAoJcmV0dXJuIHNldF90ZW1wX2h5c3QoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKfQkJCQkJCQkJCVwKc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXBfIyNvZmZzZXQsIE5VTEwpO1wKc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIAkJXAoJCXNob3dfdGVtcF8jI29mZnNldCMjX292ZXIsIHNldF90ZW1wXyMjb2Zmc2V0IyNfb3Zlcik7CVwKc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21heF9oeXN0LCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCgkJc2hvd190ZW1wXyMjb2Zmc2V0IyNfaHlzdCwgc2V0X3RlbXBfIyNvZmZzZXQjI19oeXN0KTsKCnNob3dfdGVtcF9vZmZzZXQoMSk7CnNob3dfdGVtcF9vZmZzZXQoMik7CnNob3dfdGVtcF9vZmZzZXQoMyk7CgovKiAyIEZhbnMgKi8Kc3RhdGljIHNzaXplX3Qgc2hvd19mYW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5bbnJdLAoJCQkJRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkgKTsKfQpzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCgkJRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bbnJdLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKSApOwp9CnN0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSApOwp9CnN0YXRpYyBzc2l6ZV90IHNldF9mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAoJCXNpemVfdCBjb3VudCwgaW50IG5yKSB7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CgoJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+ZmFuX21pbltucl0gPSBGQU5fVE9fUkVHKHZhbCwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7Cgl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfRkFOX01JTihucisxKSwgZGF0YS0+ZmFuX21pbltucl0pOwoJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0Kc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCgkJc2l6ZV90IGNvdW50LCBpbnQgbnIpIHsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CglpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKCWludCBvbGQ7CgoJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoJb2xkID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfRkFORElWKTsKCWRhdGEtPmZhbl9kaXZbbnJdID0gRElWX1RPX1JFRyh2YWwpOwoJb2xkID0gKG9sZCAmIDB4MGYpIHwgKGRhdGEtPmZhbl9kaXZbMV0gPDwgNikgfCAoZGF0YS0+ZmFuX2RpdlswXSA8PCA0KTsKCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19GQU5ESVYsIG9sZCk7CgltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQoKI2RlZmluZSBzaG93X2Zhbl9vZmZzZXQob2Zmc2V0KQkJCQkJCVwKc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAp7CQkJCQkJCQkJXAoJcmV0dXJuIHNob3dfZmFuKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2hvd19mYW5fbWluKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCn0JCQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IyNfZGl2IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKewkJCQkJCQkJCVwKCXJldHVybiBzaG93X2Zhbl9kaXYoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKfQkJCQkJCQkJCVwKc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgCQlcCgljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2V0X2Zhbl9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKfQkJCQkJCQkJCVwKc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8jI29mZnNldCMjX2RpdiAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgCQlcCgkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2V0X2Zhbl9kaXYoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKfQkJCQkJCQkJCVwKc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuXyMjb2Zmc2V0LCBOVUxMKTtcCnN0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIAkJXAoJCXNob3dfZmFuXyMjb2Zmc2V0IyNfbWluLCBzZXRfZmFuXyMjb2Zmc2V0IyNfbWluKTsJXApzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19kaXYsIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKCQlzaG93X2Zhbl8jI29mZnNldCMjX2Rpdiwgc2V0X2Zhbl8jI29mZnNldCMjX2Rpdik7CgpzaG93X2Zhbl9vZmZzZXQoMSk7CnNob3dfZmFuX29mZnNldCgyKTsKCi8qIEFsYXJtcyAqLwpzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT5hbGFybXMpOwp9CnN0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zLCBOVUxMKTsKCnN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp2aWE2ODZhX2F0dHJpYnV0ZXNbXSA9IHsKCSZkZXZfYXR0cl9pbjBfaW5wdXQuYXR0ciwKCSZkZXZfYXR0cl9pbjFfaW5wdXQuYXR0ciwKCSZkZXZfYXR0cl9pbjJfaW5wdXQuYXR0ciwKCSZkZXZfYXR0cl9pbjNfaW5wdXQuYXR0ciwKCSZkZXZfYXR0cl9pbjRfaW5wdXQuYXR0ciwKCSZkZXZfYXR0cl9pbjBfbWluLmF0dHIsCgkmZGV2X2F0dHJfaW4xX21pbi5hdHRyLAoJJmRldl9hdHRyX2luMl9taW4uYXR0ciwKCSZkZXZfYXR0cl9pbjNfbWluLmF0dHIsCgkmZGV2X2F0dHJfaW40X21pbi5hdHRyLAoJJmRldl9hdHRyX2luMF9tYXguYXR0ciwKCSZkZXZfYXR0cl9pbjFfbWF4LmF0dHIsCgkmZGV2X2F0dHJfaW4yX21heC5hdHRyLAoJJmRldl9hdHRyX2luM19tYXguYXR0ciwKCSZkZXZfYXR0cl9pbjRfbWF4LmF0dHIsCgoJJmRldl9hdHRyX3RlbXAxX2lucHV0LmF0dHIsCgkmZGV2X2F0dHJfdGVtcDJfaW5wdXQuYXR0ciwKCSZkZXZfYXR0cl90ZW1wM19pbnB1dC5hdHRyLAoJJmRldl9hdHRyX3RlbXAxX21heC5hdHRyLAoJJmRldl9hdHRyX3RlbXAyX21heC5hdHRyLAoJJmRldl9hdHRyX3RlbXAzX21heC5hdHRyLAoJJmRldl9hdHRyX3RlbXAxX21heF9oeXN0LmF0dHIsCgkmZGV2X2F0dHJfdGVtcDJfbWF4X2h5c3QuYXR0ciwKCSZkZXZfYXR0cl90ZW1wM19tYXhfaHlzdC5hdHRyLAoKCSZkZXZfYXR0cl9mYW4xX2lucHV0LmF0dHIsCgkmZGV2X2F0dHJfZmFuMl9pbnB1dC5hdHRyLAoJJmRldl9hdHRyX2ZhbjFfbWluLmF0dHIsCgkmZGV2X2F0dHJfZmFuMl9taW4uYXR0ciwKCSZkZXZfYXR0cl9mYW4xX2Rpdi5hdHRyLAoJJmRldl9hdHRyX2ZhbjJfZGl2LmF0dHIsCgoJJmRldl9hdHRyX2FsYXJtcy5hdHRyLAoJTlVMTAp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdmlhNjg2YV9ncm91cCA9IHsKCS5hdHRycyA9IHZpYTY4NmFfYXR0cmlidXRlcywKfTsKCi8qIFRoZSBkcml2ZXIuIEkgY2hvb3NlIHRvIHVzZSB0eXBlIGkyY19kcml2ZXIsIGFzIGF0IGlzIGlkZW50aWNhbCB0byBib3RoCiAgIHNtYnVzX2RyaXZlciBhbmQgaXNhX2RyaXZlciwgYW5kIGNsaWVudHMgY291bGQgYmUgb2YgZWl0aGVyIGtpbmQgKi8Kc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHZpYTY4NmFfZHJpdmVyID0gewoJLmRyaXZlciA9IHsKCQkub3duZXIJPSBUSElTX01PRFVMRSwKCQkubmFtZQk9ICJ2aWE2ODZhIiwKCX0sCgkuYXR0YWNoX2FkYXB0ZXIJPSB2aWE2ODZhX2RldGVjdCwKCS5kZXRhY2hfY2xpZW50CT0gdmlhNjg2YV9kZXRhY2hfY2xpZW50LAp9OwoKCi8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQgKi8Kc3RhdGljIGludCB2aWE2ODZhX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCnsKCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OwoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YTsKCWludCBlcnIgPSAwOwoJY29uc3QgY2hhciBjbGllbnRfbmFtZVtdID0gInZpYTY4NmEiOwoJdTE2IHZhbDsKCgkvKiA4MjMxIHJlcXVpcmVzIG11bHRpcGxlIG9mIDI1Niwgd2UgZW5mb3JjZSB0aGF0IG9uIDY4NiBhcyB3ZWxsICovCglpZiAoZm9yY2VfYWRkcikgewoJCWFkZHJlc3MgPSBmb3JjZV9hZGRyICYgMHhGRjAwOwoJCWRldl93YXJuKCZhZGFwdGVyLT5kZXYsICJmb3JjaW5nIElTQSBhZGRyZXNzIDB4JTA0WFxuIiwKCQkJIGFkZHJlc3MpOwoJCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KCQkgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNfYnJpZGdlLCBWSUE2ODZBX0JBU0VfUkVHLCBhZGRyZXNzKSkKCQkJcmV0dXJuIC1FTk9ERVY7Cgl9CglpZiAoUENJQklPU19TVUNDRVNTRlVMICE9CgkgICAgcGNpX3JlYWRfY29uZmlnX3dvcmQoc19icmlkZ2UsIFZJQTY4NkFfRU5BQkxFX1JFRywgJnZhbCkpCgkJcmV0dXJuIC1FTk9ERVY7CglpZiAoISh2YWwgJiAweDAwMDEpKSB7CgkJaWYgKGZvcmNlX2FkZHIpIHsKCQkJZGV2X2luZm8oJmFkYXB0ZXItPmRldiwgImVuYWJsaW5nIHNlbnNvcnNcbiIpOwoJCQlpZiAoUENJQklPU19TVUNDRVNTRlVMICE9CgkJCSAgICBwY2lfd3JpdGVfY29uZmlnX3dvcmQoc19icmlkZ2UsIFZJQTY4NkFfRU5BQkxFX1JFRywKCQkJCQkJICB2YWwgfCAweDAwMDEpKQoJCQkJcmV0dXJuIC1FTk9ERVY7CgkJfSBlbHNlIHsKCQkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwgInNlbnNvcnMgZGlzYWJsZWQgLSBlbmFibGUgIgoJCQkJICJ3aXRoIGZvcmNlX2FkZHI9MHgleFxuIiwgYWRkcmVzcyk7CgkJCXJldHVybiAtRU5PREVWOwoJCX0KCX0KCgkvKiBSZXNlcnZlIHRoZSBJU0EgcmVnaW9uICovCglpZiAoIXJlcXVlc3RfcmVnaW9uKGFkZHJlc3MsIFZJQTY4NkFfRVhURU5ULAoJCQkgICAgdmlhNjg2YV9kcml2ZXIuZHJpdmVyLm5hbWUpKSB7CgkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAicmVnaW9uIDB4JXggYWxyZWFkeSBpbiB1c2UhXG4iLAoJCQlhZGRyZXNzKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglpZiAoIShkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZpYTY4NmFfZGF0YSksIEdGUF9LRVJORUwpKSkgewoJCWVyciA9IC1FTk9NRU07CgkJZ290byBleGl0X3JlbGVhc2U7Cgl9CgoJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CglpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CgluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOwoJbmV3X2NsaWVudC0+ZHJpdmVyID0gJnZpYTY4NmFfZHJpdmVyOwoJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOwoKCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzIGFuZCBwdXQgaW50byB0aGUgZ2xvYmFsIGxpc3QgKi8KCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgY2xpZW50X25hbWUsIEkyQ19OQU1FX1NJWkUpOwoKCWRhdGEtPnZhbGlkID0gMDsKCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQoJCWdvdG8gZXhpdF9mcmVlOwoKCS8qIEluaXRpYWxpemUgdGhlIFZJQTY4NkEgY2hpcCAqLwoJdmlhNjg2YV9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKCgkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwoJaWYgKChlcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmdmlhNjg2YV9ncm91cCkpKQoJCWdvdG8gZXhpdF9kZXRhY2g7CgoJZGF0YS0+Y2xhc3NfZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZuZXdfY2xpZW50LT5kZXYpOwoJaWYgKElTX0VSUihkYXRhLT5jbGFzc19kZXYpKSB7CgkJZXJyID0gUFRSX0VSUihkYXRhLT5jbGFzc19kZXYpOwoJCWdvdG8gZXhpdF9yZW1vdmVfZmlsZXM7Cgl9CgoJcmV0dXJuIDA7CgpleGl0X3JlbW92ZV9maWxlczoKCXN5c2ZzX3JlbW92ZV9ncm91cCgmbmV3X2NsaWVudC0+ZGV2LmtvYmosICZ2aWE2ODZhX2dyb3VwKTsKZXhpdF9kZXRhY2g6CglpMmNfZGV0YWNoX2NsaWVudChuZXdfY2xpZW50KTsKZXhpdF9mcmVlOgoJa2ZyZWUoZGF0YSk7CmV4aXRfcmVsZWFzZToKCXJlbGVhc2VfcmVnaW9uKGFkZHJlc3MsIFZJQTY4NkFfRVhURU5UKTsKCXJldHVybiBlcnI7Cn0KCnN0YXRpYyBpbnQgdmlhNjg2YV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCnsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCWludCBlcnI7CgoJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+Y2xhc3NfZGV2KTsKCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJnZpYTY4NmFfZ3JvdXApOwoKCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCgkJcmV0dXJuIGVycjsKCglyZWxlYXNlX3JlZ2lvbihjbGllbnQtPmFkZHIsIFZJQTY4NkFfRVhURU5UKTsKCWtmcmVlKGRhdGEpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCB2aWE2ODZhX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCnsKCXU4IHJlZzsKCgkvKiBTdGFydCBtb25pdG9yaW5nICovCglyZWcgPSB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19DT05GSUcpOwoJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0NPTkZJRywgKHJlZ3wweDAxKSYweDdGKTsKCgkvKiBDb25maWd1cmUgdGVtcCBpbnRlcnJ1cHQgbW9kZSBmb3IgY29udGludW91cy1pbnRlcnJ1cHQgb3BlcmF0aW9uICovCgl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9NT0RFLAoJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9NT0RFKSAmCgkJCSAgICAhKFZJQTY4NkFfVEVNUF9NT0RFX01BU0sgfCBWSUE2ODZBX1RFTVBfTU9ERV9DT05USU5VT1VTKSk7Cn0KCnN0YXRpYyBzdHJ1Y3QgdmlhNjg2YV9kYXRhICp2aWE2ODZhX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQp7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJaW50IGk7CgoJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoKCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaICsgSFogLyAyKQoJICAgIHx8ICFkYXRhLT52YWxpZCkgewoJCWZvciAoaSA9IDA7IGkgPD0gNDsgaSsrKSB7CgkJCWRhdGEtPmluW2ldID0KCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0lOKGkpKTsKCQkJZGF0YS0+aW5fbWluW2ldID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKCQkJCQkJCSAgICAgVklBNjg2QV9SRUdfSU5fTUlOCgkJCQkJCQkgICAgIChpKSk7CgkJCWRhdGEtPmluX21heFtpXSA9CgkJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19JTl9NQVgoaSkpOwoJCX0KCQlmb3IgKGkgPSAxOyBpIDw9IDI7IGkrKykgewoJCQlkYXRhLT5mYW5baSAtIDFdID0KCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0ZBTihpKSk7CgkJCWRhdGEtPmZhbl9taW5baSAtIDFdID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKCQkJCQkJICAgICBWSUE2ODZBX1JFR19GQU5fTUlOKGkpKTsKCQl9CgkJZm9yIChpID0gMDsgaSA8PSAyOyBpKyspIHsKCQkJZGF0YS0+dGVtcFtpXSA9IHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCgkJCQkJCSBWSUE2ODZBX1JFR19URU1QW2ldKSA8PCAyOwoJCQlkYXRhLT50ZW1wX292ZXJbaV0gPQoJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKCQkJCQkgICAgICAgVklBNjg2QV9SRUdfVEVNUF9PVkVSW2ldKTsKCQkJZGF0YS0+dGVtcF9oeXN0W2ldID0KCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCgkJCQkJICAgICAgIFZJQTY4NkFfUkVHX1RFTVBfSFlTVFtpXSk7CgkJfQoJCS8qIGFkZCBpbiBsb3dlciAyIGJpdHMKCQkgICB0ZW1wMSB1c2VzIGJpdHMgNy02IG9mIFZJQTY4NkFfUkVHX1RFTVBfTE9XMQoJCSAgIHRlbXAyIHVzZXMgYml0cyA1LTQgb2YgVklBNjg2QV9SRUdfVEVNUF9MT1cyMwoJCSAgIHRlbXAzIHVzZXMgYml0cyA3LTYgb2YgVklBNjg2QV9SRUdfVEVNUF9MT1cyMwoJCSAqLwoJCWRhdGEtPnRlbXBbMF0gfD0gKHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCgkJCQkJCSAgICAgVklBNjg2QV9SRUdfVEVNUF9MT1cxKQoJCQkJICAmIDB4YzApID4+IDY7CgkJZGF0YS0+dGVtcFsxXSB8PQoJCSAgICAodmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9MT1cyMykgJgoJCSAgICAgMHgzMCkgPj4gNDsKCQlkYXRhLT50ZW1wWzJdIHw9CgkJICAgICh2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19URU1QX0xPVzIzKSAmCgkJICAgICAweGMwKSA+PiA2OwoKCQlpID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfRkFORElWKTsKCQlkYXRhLT5mYW5fZGl2WzBdID0gKGkgPj4gNCkgJiAweDAzOwoJCWRhdGEtPmZhbl9kaXZbMV0gPSBpID4+IDY7CgkJZGF0YS0+YWxhcm1zID0KCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKCQkJCSAgICAgICBWSUE2ODZBX1JFR19BTEFSTTEpIHwKCQkgICAgKHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0FMQVJNMikgPDwgOCk7CgkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKCQlkYXRhLT52YWxpZCA9IDE7Cgl9CgoJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CgoJcmV0dXJuIGRhdGE7Cn0KCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB2aWE2ODZhX3BjaV9pZHNbXSA9IHsKCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNjg2XzQpIH0sCgl7IDAsIH0KfTsKCk1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB2aWE2ODZhX3BjaV9pZHMpOwoKc3RhdGljIGludCBfX2RldmluaXQgdmlhNjg2YV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCnsKCXUxNiB2YWw7CgoJaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQoJICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgVklBNjg2QV9CQVNFX1JFRywgJnZhbCkpCgkJcmV0dXJuIC1FTk9ERVY7CgoJYWRkcmVzcyA9IHZhbCAmIH4oVklBNjg2QV9FWFRFTlQgLSAxKTsKCWlmIChhZGRyZXNzID09IDAgJiYgZm9yY2VfYWRkciA9PSAwKSB7CgkJZGV2X2VycigmZGV2LT5kZXYsICJiYXNlIGFkZHJlc3Mgbm90IHNldCAtIHVwZ3JhZGUgQklPUyAiCgkJCSJvciB1c2UgZm9yY2VfYWRkcj0weGFkZHJcbiIpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCXNfYnJpZGdlID0gcGNpX2Rldl9nZXQoZGV2KTsKCWlmIChpMmNfaXNhX2FkZF9kcml2ZXIoJnZpYTY4NmFfZHJpdmVyKSkgewoJCXBjaV9kZXZfcHV0KHNfYnJpZGdlKTsKCQlzX2JyaWRnZSA9IE5VTEw7Cgl9CgoJLyogQWx3YXlzIHJldHVybiBmYWlsdXJlIGhlcmUuICBUaGlzIGlzIHRvIGFsbG93IG90aGVyIGRyaXZlcnMgdG8gYmluZAoJICogdG8gdGhpcyBwY2kgZGV2aWNlLiAgV2UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gaGF2ZSBjb250cm9sIG92ZXIgdGhlCgkgKiBwY2kgZGV2aWNlLCB3ZSBvbmx5IHdhbnRlZCB0byByZWFkIGFzIGZldyByZWdpc3RlciB2YWx1ZXMgZnJvbSBpdC4KCSAqLwoJcmV0dXJuIC1FTk9ERVY7Cn0KCnN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2aWE2ODZhX3BjaV9kcml2ZXIgPSB7CgkubmFtZQkJPSAidmlhNjg2YSIsCgkuaWRfdGFibGUJPSB2aWE2ODZhX3BjaV9pZHMsCgkucHJvYmUJCT0gdmlhNjg2YV9wY2lfcHJvYmUsCn07CgpzdGF0aWMgaW50IF9faW5pdCBzbV92aWE2ODZhX2luaXQodm9pZCkKewoJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnZpYTY4NmFfcGNpX2RyaXZlcik7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBzbV92aWE2ODZhX2V4aXQodm9pZCkKewoJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ2aWE2ODZhX3BjaV9kcml2ZXIpOwoJaWYgKHNfYnJpZGdlICE9IE5VTEwpIHsKCQlpMmNfaXNhX2RlbF9kcml2ZXIoJnZpYTY4NmFfZHJpdmVyKTsKCQlwY2lfZGV2X3B1dChzX2JyaWRnZSk7CgkJc19icmlkZ2UgPSBOVUxMOwoJfQp9CgpNT0RVTEVfQVVUSE9SKCJLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4sICIKCSAgICAgICJNYXJrIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+ICIKCSAgICAgICJhbmQgQm9iIERvdWdoZXJ0eSA8Ym9iZEBzdGFuZm9yZC5lZHU+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiVklBIDY4NkEgU2Vuc29yIGRldmljZSIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cgptb2R1bGVfaW5pdChzbV92aWE2ODZhX2luaXQpOwptb2R1bGVfZXhpdChzbV92aWE2ODZhX2V4aXQpOwo=