LyoKICAgIHZpYTY4NmEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMKCQlmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwoKICAgIENvcHlyaWdodCAoYykgMTk5OCAtIDIwMDIgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sCgkJCUt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwKCQkJTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiwKCQkJYW5kIEJvYiBEb3VnaGVydHkgPGJvYmRAc3RhbmZvcmQuZWR1PgogICAgKFNvbWUgY29udmVyc2lvbi1mYWN0b3IgZGF0YSB3ZXJlIGNvbnRyaWJ1dGVkIGJ5IEpvbmF0aGFuIFRlaCBTb29uIFlldwogICAgPGoudGVoQGluYW1lLmNvbT4gYW5kIEFsZXggdmFuIEthYW0gPGRhcmtzaWRlQGNoZWxsby5ubD4uKQoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgoqLwoKLyoKICAgIFN1cHBvcnRzIHRoZSBWaWEgVlQ4MkM2ODZBLCBWVDgyQzY4NkIgc291dGggYnJpZGdlcy4KICAgIFJlcG9ydHMgYWxsIGFzIGEgNjg2QS4KICAgIFdhcm5pbmcgLSBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGRldmljZS4KKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgojaW5jbHVkZSA8bGludXgvaTJjLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KCgovKiBJZiBmb3JjZV9hZGRyIGlzIHNldCB0byBhbnl0aGluZyBkaWZmZXJlbnQgZnJvbSAwLCB3ZSBmb3JjaWJseSBlbmFibGUKICAgdGhlIGRldmljZSBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gKi8Kc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlX2FkZHIgPSAwOwptb2R1bGVfcGFyYW0oZm9yY2VfYWRkciwgdXNob3J0LCAwKTsKTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9hZGRyLAoJCSAiSW5pdGlhbGl6ZSB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBzZW5zb3JzIik7CgovKiBBZGRyZXNzZXMgdG8gc2Nhbi4KICAgTm90ZSB0aGF0IHdlIGNhbid0IGRldGVybWluZSB0aGUgSVNBIGFkZHJlc3MgdW50aWwgd2UgaGF2ZSBpbml0aWFsaXplZAogICBvdXIgbW9kdWxlICovCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IEkyQ19DTElFTlRfRU5EIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyAweDAwMDAsIEkyQ19DTElFTlRfSVNBX0VORCB9OwoKLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KU0VOU09SU19JTlNNT0RfMSh2aWE2ODZhKTsKCi8qCiAgIFRoZSBWaWEgNjg2YSBzb3V0aGJyaWRnZSBoYXMgYSBMTTc4LWxpa2UgY2hpcCBpbnRlZ3JhdGVkIG9uIHRoZSBzYW1lIElDLgogICBUaGlzIGRyaXZlciBpcyBhIGN1c3RvbWl6ZWQgY29weSBvZiBsbTc4LmMKKi8KCi8qIE1hbnkgVklBNjg2QSBjb25zdGFudHMgc3BlY2lmaWVkIGJlbG93ICovCgovKiBMZW5ndGggb2YgSVNBIGFkZHJlc3Mgc2VnbWVudCAqLwojZGVmaW5lIFZJQTY4NkFfRVhURU5UCQkweDgwCiNkZWZpbmUgVklBNjg2QV9CQVNFX1JFRwkweDcwCiNkZWZpbmUgVklBNjg2QV9FTkFCTEVfUkVHCTB4NzQKCi8qIFRoZSBWSUE2ODZBIHJlZ2lzdGVycyAqLwovKiBpbnMgbnVtYmVyZWQgMC00ICovCiNkZWZpbmUgVklBNjg2QV9SRUdfSU5fTUFYKG5yKQkoMHgyYiArICgobnIpICogMikpCiNkZWZpbmUgVklBNjg2QV9SRUdfSU5fTUlOKG5yKQkoMHgyYyArICgobnIpICogMikpCiNkZWZpbmUgVklBNjg2QV9SRUdfSU4obnIpCSgweDIyICsgKG5yKSkKCi8qIGZhbnMgbnVtYmVyZWQgMS0yICovCiNkZWZpbmUgVklBNjg2QV9SRUdfRkFOX01JTihucikJKDB4M2EgKyAobnIpKQojZGVmaW5lIFZJQTY4NkFfUkVHX0ZBTihucikJKDB4MjggKyAobnIpKQoKLyogdGVtcHMgbnVtYmVyZWQgMS0zICovCnN0YXRpYyBjb25zdCB1OCBWSUE2ODZBX1JFR19URU1QW10JPSB7IDB4MjAsIDB4MjEsIDB4MWYgfTsKc3RhdGljIGNvbnN0IHU4IFZJQTY4NkFfUkVHX1RFTVBfT1ZFUltdCT0geyAweDM5LCAweDNkLCAweDFkIH07CnN0YXRpYyBjb25zdCB1OCBWSUE2ODZBX1JFR19URU1QX0hZU1RbXQk9IHsgMHgzYSwgMHgzZSwgMHgxZSB9OwovKiBiaXRzIDctNiAqLwojZGVmaW5lIFZJQTY4NkFfUkVHX1RFTVBfTE9XMQkweDRiCi8qIDIgPSBiaXRzIDUtNCwgMyA9IGJpdHMgNy02ICovCiNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9MT1cyMwkweDQ5CgojZGVmaW5lIFZJQTY4NkFfUkVHX0FMQVJNMQkweDQxCiNkZWZpbmUgVklBNjg2QV9SRUdfQUxBUk0yCTB4NDIKI2RlZmluZSBWSUE2ODZBX1JFR19GQU5ESVYJMHg0NwojZGVmaW5lIFZJQTY4NkFfUkVHX0NPTkZJRwkweDQwCi8qIFRoZSBmb2xsb3dpbmcgcmVnaXN0ZXIgc2V0cyB0ZW1wIGludGVycnVwdCBtb2RlIChiaXRzIDEtMCBmb3IgdGVtcDEsCiAzLTIgZm9yIHRlbXAyLCA1LTQgZm9yIHRlbXAzKS4gIE1vZGVzIGFyZToKICAgIDAwIGludGVycnVwdCBzdGF5cyBhcyBsb25nIGFzIHZhbHVlIGlzIG91dC1vZi1yYW5nZQogICAgMDEgaW50ZXJydXB0IGlzIGNsZWFyZWQgb25jZSByZWdpc3RlciBpcyByZWFkIChkZWZhdWx0KQogICAgMTAgY29tcGFyYXRvciBtb2RlLSBsaWtlIDAwLCBidXQgaWdub3JlcyBoeXN0ZXJlc2lzCiAgICAxMSBzYW1lIGFzIDAwICovCiNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9NT0RFCQkweDRiCi8qIFdlJ2xsIGp1c3QgYXNzdW1lIHRoYXQgeW91IHdhbnQgdG8gc2V0IGFsbCAzIHNpbXVsdGFuZW91c2x5OiAqLwojZGVmaW5lIFZJQTY4NkFfVEVNUF9NT0RFX01BU0sJCTB4M0YKI2RlZmluZSBWSUE2ODZBX1RFTVBfTU9ERV9DT05USU5VT1VTCTB4MDAKCi8qIENvbnZlcnNpb25zLiBMaW1pdCBjaGVja2luZyBpcyBvbmx5IGRvbmUgb24gdGhlIFRPX1JFRwogICB2YXJpYW50cy4KCioqKioqKioqKiBWT0xUQUdFIENPTlZFUlNJT05TIChCb2IgRG91Z2hlcnR5KSAqKioqKioqKgogRnJvbSBIV01vbi5jcHAgKENvcHlyaWdodCAxOTk4LTIwMDAgSm9uYXRoYW4gVGVoIFNvb24gWWV3KToKIHZvbHRhZ2VmYWN0b3JbMF09MS4yNS8yNjI4OyAoMjYyOC8xLjI1PTIxMDIuNCkgICAvLyBWY2NwCiB2b2x0YWdlZmFjdG9yWzFdPTEuMjUvMjYyODsgKDI2MjgvMS4yNT0yMTAyLjQpICAgLy8gKzIuNVYKIHZvbHRhZ2VmYWN0b3JbMl09MS42Ny8yNjI4OyAoMjYyOC8xLjY3PTE1NzMuNykgICAvLyArMy4zVgogdm9sdGFnZWZhY3RvclszXT0yLjYvMjYyODsgICgyNjI4LzIuNjA9MTAxMC44KSAgIC8vICs1Vgogdm9sdGFnZWZhY3Rvcls0XT02LjMvMjYyODsgICgyNjI4LzYuMzA9NDE3LjE0KSAgIC8vICsxMlYKIGluW2ldPShkYXRhW2krMl0qMjUuMCsxMzMpKnZvbHRhZ2VmYWN0b3JbaV07CiBUaGF0IGlzOgogdm9sdHMgPSAoMjUqcmVnVmFsKzEzMykqZmFjdG9yCiByZWdWYWwgPSAodm9sdHMvZmFjdG9yLTEzMykvMjUKIChUaGVzZSBjb252ZXJzaW9ucyB3ZXJlIGNvbnRyaWJ1dGVkIGJ5IEpvbmF0aGFuIFRlaCBTb29uIFlldwogPGoudGVoQGluYW1lLmNvbT4pICovCnN0YXRpYyBpbmxpbmUgdTggSU5fVE9fUkVHKGxvbmcgdmFsLCBpbnQgaW5OdW0pCnsKCS8qIFRvIGF2b2lkIGZsb2F0aW5nIHBvaW50LCB3ZSBtdWx0aXBseSBjb25zdGFudHMgYnkgMTAgKDEwMCBmb3IgKzEyVikuCgkgICBSb3VuZGluZyBpcyBkb25lICgxMjA1MDAgaXMgYWN0dWFsbHkgMTMzMDAwIC0gMTI1MDApLgoJICAgUmVtZW1iZXIgdGhhdCB2YWwgaXMgZXhwcmVzc2VkIGluIDAuMDAxVi9iaXQsIHdoaWNoIGlzIHdoeSB3ZSBkaXZpZGUKCSAgIGJ5IGFuIGFkZGl0aW9uYWwgMTAwMDAgKDEwMDAwMCBmb3IgKzEyVik6IDEwMDAgZm9yIHZhbCBhbmQgMTAgKDEwMCkKCSAgIGZvciB0aGUgY29uc3RhbnRzLiAqLwoJaWYgKGluTnVtIDw9IDEpCgkJcmV0dXJuICh1OCkKCQkgICAgU0VOU09SU19MSU1JVCgodmFsICogMjEwMjQgLSAxMjA1MDAwKSAvIDI1MDAwMCwgMCwgMjU1KTsKCWVsc2UgaWYgKGluTnVtID09IDIpCgkJcmV0dXJuICh1OCkKCQkgICAgU0VOU09SU19MSU1JVCgodmFsICogMTU3MzcgLSAxMjA1MDAwKSAvIDI1MDAwMCwgMCwgMjU1KTsKCWVsc2UgaWYgKGluTnVtID09IDMpCgkJcmV0dXJuICh1OCkKCQkgICAgU0VOU09SU19MSU1JVCgodmFsICogMTAxMDggLSAxMjA1MDAwKSAvIDI1MDAwMCwgMCwgMjU1KTsKCWVsc2UKCQlyZXR1cm4gKHU4KQoJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiA0MTcxNCAtIDEyMDUwMDAwKSAvIDI1MDAwMDAsIDAsIDI1NSk7Cn0KCnN0YXRpYyBpbmxpbmUgbG9uZyBJTl9GUk9NX1JFRyh1OCB2YWwsIGludCBpbk51bSkKewoJLyogVG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQsIHdlIG11bHRpcGx5IGNvbnN0YW50cyBieSAxMCAoMTAwIGZvciArMTJWKS4KCSAgIFdlIGFsc28gbXVsdGlwbHkgdGhlbSBieSAxMDAwIGJlY2F1c2Ugd2Ugd2FudCAwLjAwMVYvYml0IGZvciB0aGUKCSAgIG91dHB1dCB2YWx1ZS4gUm91bmRpbmcgaXMgZG9uZS4gKi8KCWlmIChpbk51bSA8PSAxKQoJCXJldHVybiAobG9uZykgKCgyNTAwMDAgKiB2YWwgKyAxMzMwMDAwICsgMjEwMjQgLyAyKSAvIDIxMDI0KTsKCWVsc2UgaWYgKGluTnVtID09IDIpCgkJcmV0dXJuIChsb25nKSAoKDI1MDAwMCAqIHZhbCArIDEzMzAwMDAgKyAxNTczNyAvIDIpIC8gMTU3MzcpOwoJZWxzZSBpZiAoaW5OdW0gPT0gMykKCQlyZXR1cm4gKGxvbmcpICgoMjUwMDAwICogdmFsICsgMTMzMDAwMCArIDEwMTA4IC8gMikgLyAxMDEwOCk7CgllbHNlCgkJcmV0dXJuIChsb25nKSAoKDI1MDAwMDAgKiB2YWwgKyAxMzMwMDAwMCArIDQxNzE0IC8gMikgLyA0MTcxNCk7Cn0KCi8qKioqKioqKiogRkFOIFJQTSBDT05WRVJTSU9OUyAqKioqKioqKi8KLyogSGlnaGVyIHJlZ2lzdGVyIHZhbHVlcyA9IHNsb3dlciBmYW5zICh0aGUgZmFuJ3Mgc3Ryb2JlIGdhdGVzIGEgY291bnRlcikuCiBCdXQgdGhpcyBjaGlwIHNhdHVyYXRlcyBiYWNrIGF0IDAsIG5vdCBhdCAyNTUgbGlrZSBhbGwgdGhlIG90aGVyIGNoaXBzLgogU28sIDAgbWVhbnMgMCBSUE0gKi8Kc3RhdGljIGlubGluZSB1OCBGQU5fVE9fUkVHKGxvbmcgcnBtLCBpbnQgZGl2KQp7CglpZiAocnBtID09IDApCgkJcmV0dXJuIDA7CglycG0gPSBTRU5TT1JTX0xJTUlUKHJwbSwgMSwgMTAwMDAwMCk7CglyZXR1cm4gU0VOU09SU19MSU1JVCgoMTM1MDAwMCArIHJwbSAqIGRpdiAvIDIpIC8gKHJwbSAqIGRpdiksIDEsIDI1NSk7Cn0KCiNkZWZpbmUgRkFOX0ZST01fUkVHKHZhbCxkaXYpICgodmFsKT09MD8wOih2YWwpPT0yNTU/MDoxMzUwMDAwLygodmFsKSooZGl2KSkpCgovKioqKioqKiogVEVNUCBDT05WRVJTSU9OUyAoQm9iIERvdWdoZXJ0eSkgKioqKioqKioqLwovKiBsaW5lYXIgZml0cyBmcm9tIEhXTW9uLmNwcCAoQ29weXJpZ2h0IDE5OTgtMjAwMCBKb25hdGhhbiBUZWggU29vbiBZZXcpCiAgICAgIGlmKHRlbXA8MTY5KQoJICAgICAgcmV0dXJuIGRvdWJsZSh0ZW1wKSowLjQyNy0zMi4wODsKICAgICAgZWxzZSBpZih0ZW1wPj0xNjkgJiYgdGVtcDw9MjAyKQoJICAgICAgcmV0dXJuIGRvdWJsZSh0ZW1wKSowLjU4Mi01OC4xNjsKICAgICAgZWxzZQoJICAgICAgcmV0dXJuIGRvdWJsZSh0ZW1wKSowLjkyNC0xMjcuMzM7CgogQSBmaWZ0aC1vcmRlciBwb2x5bm9taWFsIGZpdHMgdGhlIHVub2ZmaWNpYWwgZGF0YSAocHJvdmlkZWQgYnkgQWxleCB2YW4KIEthYW0gPGRhcmtzaWRlQGNoZWxsby5ubD4pIGEgYml0IGJldHRlci4gIEl0IGFsc28gZ2l2ZSBtb3JlIHJlYXNvbmFibGUKIG51bWJlcnMgb24gbXkgbWFjaGluZSAoaWUuIHRoZXkgYWdyZWUgd2l0aCB3aGF0IG15IEJJT1MgdGVsbHMgbWUpLgogSGVyZSdzIHRoZSBmaWZ0aC1vcmRlciBmaXQgdG8gdGhlIDgtYml0IGRhdGE6CiB0ZW1wID0gMS42MjUwOTNlLTEwKnZhbF41IC0gMS4wMDE2MzJlLTA3KnZhbF40ICsgMi40NTc2NTNlLTA1KnZhbF4zIC0KCTIuOTY3NjE5ZS0wMyp2YWxeMiArIDIuMTc1MTQ0ZS0wMSp2YWwgLSA3LjA5MDA2N2UrMC4KCiAoMjAwMC0xMC0yNS0gUkZEOiB0aGFua3MgdG8gVXdlIEFuZGVyc2VuIDx1YW5kZXJzZW5AbWF5YWguY29tPiBmb3IKIGZpbmRpbmcgbXkgdHlwb3MgaW4gdGhpcyBmb3JtdWxhISkKCiBBbGFzLCBub25lIG9mIHRoZSBlbGVnYW50IGZ1bmN0aW9uLWZpdCBzb2x1dGlvbnMgd2lsbCB3b3JrIGJlY2F1c2Ugd2UKIGFyZW4ndCBhbGxvd2VkIHRvIHVzZSBmbG9hdGluZyBwb2ludCBpbiB0aGUga2VybmVsIGFuZCBkb2luZyBpdCB3aXRoCiBpbnRlZ2VycyBkb2Vzbid0IHByb3ZpZGUgZW5vdWdoIHByZWNpc2lvbi4gIFNvIHdlJ2xsIGRvIGJvcmluZyBvbGQKIGxvb2stdXAgdGFibGUgc3R1ZmYuICBUaGUgdW5vZmZpY2lhbCBkYXRhIChzZWUgYmVsb3cpIGhhdmUgZWZmZWN0aXZlbHkKIDctYml0IHJlc29sdXRpb24gKHRoZXkgYXJlIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgZGVncmVlKS4gIEknbSBhc3N1bWluZwogdGhhdCB0aGUgdHJhbnNmZXIgZnVuY3Rpb24gb2YgdGhlIGRldmljZSBpcyBtb25vdG9uaWMgYW5kIHNtb290aCwgc28gYQogc21vb3RoIGZ1bmN0aW9uIGZpdCB0byB0aGUgZGF0YSB3aWxsIGFsbG93IHVzIHRvIGdldCBiZXR0ZXIgcHJlY2lzaW9uLgogSSB1c2VkIHRoZSA1dGgtb3JkZXIgcG9seSBmaXQgZGVzY3JpYmVkIGFib3ZlIGFuZCBzb2x2ZWQgZm9yCiBWSUEgcmVnaXN0ZXIgdmFsdWVzIDAtMjU1LiAgSSAqMTAgYmVmb3JlIHJvdW5kaW5nLCBzbyB3ZSBnZXQgdGVudGgtZGVncmVlCiBwcmVjaXNpb24uICAoSSBjb3VsZCBoYXZlIGRvbmUgYWxsIDEwMjQgdmFsdWVzIGZvciBvdXIgMTAtYml0IHJlYWRpbmdzLAogYnV0IHRoZSBmdW5jdGlvbiBpcyB2ZXJ5IGxpbmVhciBpbiB0aGUgdXNlZnVsIHJhbmdlICgwLTgwIGRlZyBDKSwgc28KIHdlJ2xsIGp1c3QgdXNlIGxpbmVhciBpbnRlcnBvbGF0aW9uIGZvciAxMC1iaXQgcmVhZGluZ3MuKSAgU28sIHRlbXBMVVQKIGlzIHRoZSB0ZW1wIGF0IHZpYSByZWdpc3RlciB2YWx1ZXMgMC0yNTU6ICovCnN0YXRpYyBjb25zdCBsb25nIHRlbXBMVVRbXSA9CnsgLTcwOSwgLTY4OCwgLTY2NywgLTY0NiwgLTYyNywgLTYwNywgLTU4OSwgLTU3MCwgLTU1MywgLTUzNiwgLTUxOSwKCS01MDMsIC00ODcsIC00NzEsIC00NTYsIC00NDIsIC00MjgsIC00MTQsIC00MDAsIC0zODcsIC0zNzUsCgktMzYyLCAtMzUwLCAtMzM5LCAtMzI3LCAtMzE2LCAtMzA1LCAtMjk1LCAtMjg1LCAtMjc1LCAtMjY1LAoJLTI1NSwgLTI0NiwgLTIzNywgLTIyOSwgLTIyMCwgLTIxMiwgLTIwNCwgLTE5NiwgLTE4OCwgLTE4MCwKCS0xNzMsIC0xNjYsIC0xNTksIC0xNTIsIC0xNDUsIC0xMzksIC0xMzIsIC0xMjYsIC0xMjAsIC0xMTQsCgktMTA4LCAtMTAyLCAtOTYsIC05MSwgLTg1LCAtODAsIC03NCwgLTY5LCAtNjQsIC01OSwgLTU0LCAtNDksCgktNDQsIC0zOSwgLTM0LCAtMjksIC0yNSwgLTIwLCAtMTUsIC0xMSwgLTYsIC0yLCAzLCA3LCAxMiwgMTYsCgkyMCwgMjUsIDI5LCAzMywgMzcsIDQyLCA0NiwgNTAsIDU0LCA1OSwgNjMsIDY3LCA3MSwgNzUsIDc5LCA4NCwKCTg4LCA5MiwgOTYsIDEwMCwgMTA0LCAxMDksIDExMywgMTE3LCAxMjEsIDEyNSwgMTMwLCAxMzQsIDEzOCwKCTE0MiwgMTQ2LCAxNTEsIDE1NSwgMTU5LCAxNjMsIDE2OCwgMTcyLCAxNzYsIDE4MSwgMTg1LCAxODksCgkxOTMsIDE5OCwgMjAyLCAyMDYsIDIxMSwgMjE1LCAyMTksIDIyNCwgMjI4LCAyMzIsIDIzNywgMjQxLAoJMjQ1LCAyNTAsIDI1NCwgMjU5LCAyNjMsIDI2NywgMjcyLCAyNzYsIDI4MSwgMjg1LCAyOTAsIDI5NCwKCTI5OSwgMzAzLCAzMDcsIDMxMiwgMzE2LCAzMjEsIDMyNSwgMzMwLCAzMzQsIDMzOSwgMzQ0LCAzNDgsCgkzNTMsIDM1NywgMzYyLCAzNjYsIDM3MSwgMzc2LCAzODAsIDM4NSwgMzkwLCAzOTUsIDM5OSwgNDA0LAoJNDA5LCA0MTQsIDQxOSwgNDIzLCA0MjgsIDQzMywgNDM4LCA0NDMsIDQ0OSwgNDU0LCA0NTksIDQ2NCwKCTQ2OSwgNDc1LCA0ODAsIDQ4NiwgNDkxLCA0OTcsIDUwMiwgNTA4LCA1MTQsIDUyMCwgNTI2LCA1MzIsCgk1MzgsIDU0NCwgNTUxLCA1NTcsIDU2NCwgNTcxLCA1NzgsIDU4NCwgNTkyLCA1OTksIDYwNiwgNjE0LAoJNjIxLCA2MjksIDYzNywgNjQ1LCA2NTQsIDY2MiwgNjcxLCA2ODAsIDY4OSwgNjk4LCA3MDgsIDcxOCwKCTcyOCwgNzM4LCA3NDksIDc1OSwgNzcwLCA3ODIsIDc5MywgODA1LCA4MTgsIDgzMCwgODQzLCA4NTYsCgk4NzAsIDg4MywgODk4LCA5MTIsIDkyNywgOTQzLCA5NTgsIDk3NSwgOTkxLCAxMDA4LCAxMDI2LCAxMDQ0LAoJMTA2MiwgMTA4MSwgMTEwMSwgMTEyMSwgMTE0MSwgMTE2MiwgMTE4NCwgMTIwNiwgMTIyOSwgMTI1MiwKCTEyNzYsIDEzMDEsIDEzMjYsIDEzNTIsIDEzNzgsIDE0MDYsIDE0MzQsIDE0NjIKfTsKCi8qIHRoZSBvcmlnaW5hbCBMVVQgdmFsdWVzIGZyb20gQWxleCB2YW4gS2FhbSA8ZGFya3NpZGVAY2hlbGxvLm5sPgogICAoZm9yIHZpYSByZWdpc3RlciB2YWx1ZXMgMTItMjQwKToKey01MCwtNDksLTQ3LC00NSwtNDMsLTQxLC0zOSwtMzgsLTM3LC0zNSwtMzQsLTMzLC0zMiwtMzEsCi0zMCwtMjksLTI4LC0yNywtMjYsLTI1LC0yNCwtMjQsLTIzLC0yMiwtMjEsLTIwLC0yMCwtMTksLTE4LC0xNywtMTcsLTE2LC0xNSwKLTE1LC0xNCwtMTQsLTEzLC0xMiwtMTIsLTExLC0xMSwtMTAsLTksLTksLTgsLTgsLTcsLTcsLTYsLTYsLTUsLTUsLTQsLTQsLTMsCi0zLC0yLC0yLC0xLC0xLDAsMCwxLDEsMSwzLDMsMyw0LDQsNCw1LDUsNSw2LDYsNyw3LDgsOCw5LDksOSwxMCwxMCwxMSwxMSwxMiwKMTIsMTIsMTMsMTMsMTMsMTQsMTQsMTUsMTUsMTYsMTYsMTYsMTcsMTcsMTgsMTgsMTksMTksMjAsMjAsMjEsMjEsMjEsMjIsMjIsCjIyLDIzLDIzLDI0LDI0LDI1LDI1LDI2LDI2LDI2LDI3LDI3LDI3LDI4LDI4LDI5LDI5LDMwLDMwLDMwLDMxLDMxLDMyLDMyLDMzLAozMywzNCwzNCwzNSwzNSwzNSwzNiwzNiwzNywzNywzOCwzOCwzOSwzOSw0MCw0MCw0MSw0MSw0Miw0Miw0Myw0Myw0NCw0NCw0NSwKNDUsNDYsNDYsNDcsNDgsNDgsNDksNDksNTAsNTEsNTEsNTIsNTIsNTMsNTMsNTQsNTUsNTUsNTYsNTcsNTcsNTgsNTksNTksNjAsCjYxLDYyLDYyLDYzLDY0LDY1LDY2LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgzLDg0LAo4NSw4Niw4OCw4OSw5MSw5Miw5NCw5Niw5Nyw5OSwxMDEsMTAzLDEwNSwxMDcsMTA5LDExMH07CgoKIEhlcmUncyB0aGUgcmV2ZXJzZSBMVVQuICBJIGdvdCBpdCBieSBkb2luZyBhIDYtdGggb3JkZXIgcG9seSBmaXQgKG5lZWRlZAogYW4gZXh0cmEgdGVybSBmb3IgYSBnb29kIGZpdCB0byB0aGVzZSBpbnZlcnNlIGRhdGEhKSBhbmQgdGhlbgogc29sdmluZyBmb3IgZWFjaCB0ZW1wIHZhbHVlIGZyb20gLTUwIHRvIDExMCAodGhlIHVzZWFibGUgcmFuZ2UgZm9yCiB0aGlzIGNoaXApLiAgSGVyZSdzIHRoZSBmaXQ6CiB2aWFSZWdWYWwgPSAtMS4xNjAzNzBlLTEwKnZhbF42ICszLjE5MzY5M2UtMDgqdmFsXjUgLSAxLjQ2NDQ0N2UtMDYqdmFsXjQKIC0gMi41MjU0NTNlLTA0KnZhbF4zICsgMS40MjQ1OTNlLTAyKnZhbF4yICsgMi4xNDg5NDFlKzAwKnZhbCArNy4yNzU4MDhlKzAxKQogTm90ZSB0aGF0IG49MTYxOiAqLwpzdGF0aWMgY29uc3QgdTggdmlhTFVUW10gPQp7IDEyLCAxMiwgMTMsIDE0LCAxNCwgMTUsIDE2LCAxNiwgMTcsIDE4LCAxOCwgMTksIDIwLCAyMCwgMjEsIDIyLCAyMywKCTIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzUsIDM2LCAzNywgMzksIDQwLAoJNDEsIDQzLCA0NSwgNDYsIDQ4LCA0OSwgNTEsIDUzLCA1NSwgNTcsIDU5LCA2MCwgNjIsIDY0LCA2NiwKCTY5LCA3MSwgNzMsIDc1LCA3NywgNzksIDgyLCA4NCwgODYsIDg4LCA5MSwgOTMsIDk1LCA5OCwgMTAwLAoJMTAzLCAxMDUsIDEwNywgMTEwLCAxMTIsIDExNSwgMTE3LCAxMTksIDEyMiwgMTI0LCAxMjYsIDEyOSwKCTEzMSwgMTM0LCAxMzYsIDEzOCwgMTQwLCAxNDMsIDE0NSwgMTQ3LCAxNTAsIDE1MiwgMTU0LCAxNTYsCgkxNTgsIDE2MCwgMTYyLCAxNjQsIDE2NiwgMTY4LCAxNzAsIDE3MiwgMTc0LCAxNzYsIDE3OCwgMTgwLAoJMTgyLCAxODMsIDE4NSwgMTg3LCAxODgsIDE5MCwgMTkyLCAxOTMsIDE5NSwgMTk2LCAxOTgsIDE5OSwKCTIwMCwgMjAyLCAyMDMsIDIwNSwgMjA2LCAyMDcsIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsCgkyMTQsIDIxNSwgMjE2LCAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMSwgMjIyLCAyMjIsIDIyMywgMjI0LAoJMjI1LCAyMjYsIDIyNiwgMjI3LCAyMjgsIDIyOCwgMjI5LCAyMzAsIDIzMCwgMjMxLCAyMzIsIDIzMiwKCTIzMywgMjMzLCAyMzQsIDIzNSwgMjM1LCAyMzYsIDIzNiwgMjM3LCAyMzcsIDIzOCwgMjM4LCAyMzksCgkyMzksIDI0MAp9OwoKLyogQ29udmVydGluZyB0ZW1wcyB0byAoOC1iaXQpIGh5c3QgYW5kIG92ZXIgcmVnaXN0ZXJzCiAgIE5vIGludGVycG9sYXRpb24gaGVyZS4KICAgVGhlICs1MCBpcyBiZWNhdXNlIHRoZSB0ZW1wcyBzdGFydCBhdCAtNTAgKi8Kc3RhdGljIGlubGluZSB1OCBURU1QX1RPX1JFRyhsb25nIHZhbCkKewoJcmV0dXJuIHZpYUxVVFt2YWwgPD0gLTUwMDAwID8gMCA6IHZhbCA+PSAxMTAwMDAgPyAxNjAgOgoJCSAgICAgICh2YWwgPCAwID8gdmFsIC0gNTAwIDogdmFsICsgNTAwKSAvIDEwMDAgKyA1MF07Cn0KCi8qIGZvciA4LWJpdCB0ZW1wZXJhdHVyZSBoeXN0IGFuZCBvdmVyIHJlZ2lzdGVycyAqLwojZGVmaW5lIFRFTVBfRlJPTV9SRUcodmFsKSAodGVtcExVVFsodmFsKV0gKiAxMDApCgovKiBmb3IgMTAtYml0IHRlbXBlcmF0dXJlIHJlYWRpbmdzICovCnN0YXRpYyBpbmxpbmUgbG9uZyBURU1QX0ZST01fUkVHMTAodTE2IHZhbCkKewoJdTE2IGVpZ2h0Qml0cyA9IHZhbCA+PiAyOwoJdTE2IHR3b0JpdHMgPSB2YWwgJiAzOwoKCS8qIG5vIGludGVycG9sYXRpb24gZm9yIHRoZXNlICovCglpZiAodHdvQml0cyA9PSAwIHx8IGVpZ2h0Qml0cyA9PSAyNTUpCgkJcmV0dXJuIFRFTVBfRlJPTV9SRUcoZWlnaHRCaXRzKTsKCgkvKiBkbyBzb21lIGxpbmVhciBpbnRlcnBvbGF0aW9uICovCglyZXR1cm4gKHRlbXBMVVRbZWlnaHRCaXRzXSAqICg0IC0gdHdvQml0cykgKwoJCXRlbXBMVVRbZWlnaHRCaXRzICsgMV0gKiB0d29CaXRzKSAqIDI1Owp9CgojZGVmaW5lIERJVl9GUk9NX1JFRyh2YWwpICgxIDw8ICh2YWwpKQojZGVmaW5lIERJVl9UT19SRUcodmFsKSAoKHZhbCk9PTg/MzoodmFsKT09ND8yOih2YWwpPT0xPzA6MSkKCi8qIEZvciB0aGUgVklBNjg2QSwgd2UgbmVlZCB0byBrZWVwIHNvbWUgZGF0YSBpbiBtZW1vcnkuCiAgIFRoZSBzdHJ1Y3R1cmUgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLCBhdCB0aGUgc2FtZSB0aW1lIHdoZW4gYSBuZXcKICAgdmlhNjg2YSBjbGllbnQgaXMgYWxsb2NhdGVkLiAqLwpzdHJ1Y3QgdmlhNjg2YV9kYXRhIHsKCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CgljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCgl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLwoKCXU4IGluWzVdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGluX21heFs1XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCgl1OCBpbl9taW5bNV07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwoJdTggZmFuWzJdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGZhbl9taW5bMl07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwoJdTE2IHRlbXBbM107CQkvKiBSZWdpc3RlciB2YWx1ZSAxMCBiaXQgKi8KCXU4IHRlbXBfb3ZlclszXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IHRlbXBfaHlzdFszXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGZhbl9kaXZbMl07CQkvKiBSZWdpc3RlciBlbmNvZGluZywgc2hpZnRlZCByaWdodCAqLwoJdTE2IGFsYXJtczsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLwp9OwoKc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpzX2JyaWRnZTsJLyogcG9pbnRlciB0byB0aGUgKG9ubHkpIHZpYTY4NmEgKi8KCnN0YXRpYyBpbnQgdmlhNjg2YV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOwpzdGF0aWMgaW50IHZpYTY4NmFfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKc3RhdGljIGludCB2aWE2ODZhX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CgpzdGF0aWMgaW5saW5lIGludCB2aWE2ODZhX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQp7CglyZXR1cm4gKGluYl9wKGNsaWVudC0+YWRkciArIHJlZykpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgdmlhNjg2YV93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsCgkJCQkgICAgICAgdTggdmFsdWUpCnsKCW91dGJfcCh2YWx1ZSwgY2xpZW50LT5hZGRyICsgcmVnKTsKfQoKc3RhdGljIHN0cnVjdCB2aWE2ODZhX2RhdGEgKnZpYTY4NmFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwpzdGF0aWMgdm9pZCB2aWE2ODZhX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwoKLyogZm9sbG93aW5nIGFyZSB0aGUgc3lzZnMgY2FsbGJhY2sgZnVuY3Rpb25zICovCgovKiA3IHZvbHRhZ2Ugc2Vuc29ycyAqLwpzdGF0aWMgc3NpemVfdCBzaG93X2luKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5bbnJdLCBucikpOwp9CgpzdGF0aWMgc3NpemVfdCBzaG93X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21pbltucl0sIG5yKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNob3dfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWF4W25yXSwgbnIpKTsKfQoKc3RhdGljIHNzaXplX3Qgc2V0X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKCQlzaXplX3QgY291bnQsIGludCBucikgewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+aW5fbWluW25yXSA9IElOX1RPX1JFRyh2YWwsIG5yKTsKCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19JTl9NSU4obnIpLAoJCQlkYXRhLT5pbl9taW5bbnJdKTsKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0Kc3RhdGljIHNzaXplX3Qgc2V0X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKCQlzaXplX3QgY291bnQsIGludCBucikgewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+aW5fbWF4W25yXSA9IElOX1RPX1JFRyh2YWwsIG5yKTsKCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19JTl9NQVgobnIpLAoJCQlkYXRhLT5pbl9tYXhbbnJdKTsKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0KI2RlZmluZSBzaG93X2luX29mZnNldChvZmZzZXQpCQkJCQlcCnN0YXRpYyBzc2l6ZV90IAkJCQkJCQlcCglzaG93X2luIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKewkJCQkJCQkJXAoJcmV0dXJuIHNob3dfaW4oZGV2LCBidWYsIG9mZnNldCk7CQkJXAp9CQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90IAkJCQkJCQlcCglzaG93X2luIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAp7CQkJCQkJCQlcCglyZXR1cm4gc2hvd19pbl9taW4oZGV2LCBidWYsIG9mZnNldCk7CQlcCn0JCQkJCQkJCVwKc3RhdGljIHNzaXplX3QgCQkJCQkJCVwKCXNob3dfaW4jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCnsJCQkJCQkJCVwKCXJldHVybiBzaG93X2luX21heChkZXYsIGJ1Ziwgb2Zmc2V0KTsJCVwKfQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgCVwKCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJXAp7CQkJCQkJCQlcCglyZXR1cm4gc2V0X2luX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7CQlcCn0JCQkJCQkJCVwKc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQlcCnsJCQkJCQkJCVwKCXJldHVybiBzZXRfaW5fbWF4KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsJCVwKfQkJCQkJCQkJXApzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X2luIyNvZmZzZXQsIE5VTEwpO1wKc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCAJXAoJCXNob3dfaW4jI29mZnNldCMjX21pbiwgc2V0X2luIyNvZmZzZXQjI19taW4pOwlcCnN0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgCVwKCQlzaG93X2luIyNvZmZzZXQjI19tYXgsIHNldF9pbiMjb2Zmc2V0IyNfbWF4KTsKCnNob3dfaW5fb2Zmc2V0KDApOwpzaG93X2luX29mZnNldCgxKTsKc2hvd19pbl9vZmZzZXQoMik7CnNob3dfaW5fb2Zmc2V0KDMpOwpzaG93X2luX29mZnNldCg0KTsKCi8qIDMgdGVtcGVyYXR1cmVzICovCnN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIFRFTVBfRlJPTV9SRUcxMChkYXRhLT50ZW1wW25yXSkpOwp9CnN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX292ZXJbbnJdKSk7Cn0Kc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfaHlzdFtucl0pKTsKfQpzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAoJCXNpemVfdCBjb3VudCwgaW50IG5yKSB7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+dGVtcF9vdmVyW25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7Cgl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9PVkVSW25yXSwKCQkJICAgIGRhdGEtPnRlbXBfb3Zlcltucl0pOwoJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQpzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAoJCXNpemVfdCBjb3VudCwgaW50IG5yKSB7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+dGVtcF9oeXN0W25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7Cgl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9IWVNUW25yXSwKCQkJICAgIGRhdGEtPnRlbXBfaHlzdFtucl0pOwoJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQojZGVmaW5lIHNob3dfdGVtcF9vZmZzZXQob2Zmc2V0KQkJCQkJXApzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAp7CQkJCQkJCQkJXAoJcmV0dXJuIHNob3dfdGVtcChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJCVwKfQkJCQkJCQkJCVwKc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKc2hvd190ZW1wXyMjb2Zmc2V0IyNfb3ZlciAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAp7CQkJCQkJCQkJXAoJcmV0dXJuIHNob3dfdGVtcF9vdmVyKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCn0JCQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCnNob3dfdGVtcF8jI29mZnNldCMjX2h5c3QgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKewkJCQkJCQkJCVwKCXJldHVybiBzaG93X3RlbXBfaHlzdChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI29mZnNldCMjX292ZXIgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIAkJXAoJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJXAp7CQkJCQkJCQkJXAoJcmV0dXJuIHNldF90ZW1wX292ZXIoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKfQkJCQkJCQkJCVwKc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfIyNvZmZzZXQjI19oeXN0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCAJCVwKCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCVwKewkJCQkJCQkJCVwKCXJldHVybiBzZXRfdGVtcF9oeXN0KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCn0JCQkJCQkJCQlcCnN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wXyMjb2Zmc2V0LCBOVUxMKTtcCnN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKCQlzaG93X3RlbXBfIyNvZmZzZXQjI19vdmVyLCBzZXRfdGVtcF8jI29mZnNldCMjX292ZXIpOwlcCnN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19tYXhfaHlzdCwgU19JUlVHTyB8IFNfSVdVU1IsIAkJXAoJCXNob3dfdGVtcF8jI29mZnNldCMjX2h5c3QsIHNldF90ZW1wXyMjb2Zmc2V0IyNfaHlzdCk7CgpzaG93X3RlbXBfb2Zmc2V0KDEpOwpzaG93X3RlbXBfb2Zmc2V0KDIpOwpzaG93X3RlbXBfb2Zmc2V0KDMpOwoKLyogMiBGYW5zICovCnN0YXRpYyBzc2l6ZV90IHNob3dfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuW25yXSwKCQkJCURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpICk7Cn0Kc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAoJCUZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW25yXSwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkgKTsKfQpzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkgKTsKfQpzdGF0aWMgc3NpemVfdCBzZXRfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKCQlzaXplX3QgY291bnQsIGludCBucikgewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwoKCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPmZhbl9taW5bbnJdID0gRkFOX1RPX1JFRyh2YWwsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOwoJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0ZBTl9NSU4obnIrMSksIGRhdGEtPmZhbl9taW5bbnJdKTsKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0Kc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCgkJc2l6ZV90IGNvdW50LCBpbnQgbnIpIHsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CglpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKCWludCBvbGQ7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJb2xkID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfRkFORElWKTsKCWRhdGEtPmZhbl9kaXZbbnJdID0gRElWX1RPX1JFRyh2YWwpOwoJb2xkID0gKG9sZCAmIDB4MGYpIHwgKGRhdGEtPmZhbl9kaXZbMV0gPDwgNikgfCAoZGF0YS0+ZmFuX2RpdlswXSA8PCA0KTsKCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19GQU5ESVYsIG9sZCk7Cgl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CgojZGVmaW5lIHNob3dfZmFuX29mZnNldChvZmZzZXQpCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2hvd19mYW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCQlcCn0JCQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKewkJCQkJCQkJCVwKCXJldHVybiBzaG93X2Zhbl9taW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKfQkJCQkJCQkJCVwKc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNvZmZzZXQjI19kaXYgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAp7CQkJCQkJCQkJXAoJcmV0dXJuIHNob3dfZmFuX2RpdihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzZXRfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCAJCVwKCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJCVwKewkJCQkJCQkJCVwKCXJldHVybiBzZXRfZmFuX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzZXRfZmFuXyMjb2Zmc2V0IyNfZGl2IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCAJCVwKCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCVwKewkJCQkJCQkJCVwKCXJldHVybiBzZXRfZmFuX2RpdihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAp9CQkJCQkJCQkJXApzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19mYW5fIyNvZmZzZXQsIE5VTEwpO1wKc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCgkJc2hvd19mYW5fIyNvZmZzZXQjI19taW4sIHNldF9mYW5fIyNvZmZzZXQjI19taW4pOwlcCnN0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsIAkJXAoJCXNob3dfZmFuXyMjb2Zmc2V0IyNfZGl2LCBzZXRfZmFuXyMjb2Zmc2V0IyNfZGl2KTsKCnNob3dfZmFuX29mZnNldCgxKTsKc2hvd19mYW5fb2Zmc2V0KDIpOwoKLyogQWxhcm1zICovCnN0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmFsYXJtcyk7Cn0Kc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOwoKLyogVGhlIGRyaXZlci4gSSBjaG9vc2UgdG8gdXNlIHR5cGUgaTJjX2RyaXZlciwgYXMgYXQgaXMgaWRlbnRpY2FsIHRvIGJvdGgKICAgc21idXNfZHJpdmVyIGFuZCBpc2FfZHJpdmVyLCBhbmQgY2xpZW50cyBjb3VsZCBiZSBvZiBlaXRoZXIga2luZCAqLwpzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdmlhNjg2YV9kcml2ZXIgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkubmFtZQkJPSAidmlhNjg2YSIsCgkuaWQJCT0gSTJDX0RSSVZFUklEX1ZJQTY4NkEsCgkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKCS5hdHRhY2hfYWRhcHRlcgk9IHZpYTY4NmFfYXR0YWNoX2FkYXB0ZXIsCgkuZGV0YWNoX2NsaWVudAk9IHZpYTY4NmFfZGV0YWNoX2NsaWVudCwKfTsKCgovKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkICovCnN0YXRpYyBpbnQgdmlhNjg2YV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCnsKCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKCQlyZXR1cm4gMDsKCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIHZpYTY4NmFfZGV0ZWN0KTsKfQoKc3RhdGljIGludCB2aWE2ODZhX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKewoJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhOwoJaW50IGVyciA9IDA7Cgljb25zdCBjaGFyIGNsaWVudF9uYW1lW10gPSAidmlhNjg2YSI7Cgl1MTYgdmFsOwoKCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgcHJvYmluZyB0aGUgSVNBIGJ1cyEhICAqLwoJaWYgKCFpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHRlcikpIHsKCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsCgkJInZpYTY4NmFfZGV0ZWN0IGNhbGxlZCBmb3IgYW4gSTJDIGJ1cyBhZGFwdGVyPyE/XG4iKTsKCQlyZXR1cm4gMDsKCX0KCgkvKiA4MjMxIHJlcXVpcmVzIG11bHRpcGxlIG9mIDI1Niwgd2UgZW5mb3JjZSB0aGF0IG9uIDY4NiBhcyB3ZWxsICovCglpZiAoZm9yY2VfYWRkcikKCQlhZGRyZXNzID0gZm9yY2VfYWRkciAmIDB4RkYwMDsKCglpZiAoZm9yY2VfYWRkcikgewoJCWRldl93YXJuKCZhZGFwdGVyLT5kZXYsICJmb3JjaW5nIElTQSBhZGRyZXNzIDB4JTA0WFxuIiwKCQkJIGFkZHJlc3MpOwoJCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KCQkgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNfYnJpZGdlLCBWSUE2ODZBX0JBU0VfUkVHLCBhZGRyZXNzKSkKCQkJcmV0dXJuIC1FTk9ERVY7Cgl9CglpZiAoUENJQklPU19TVUNDRVNTRlVMICE9CgkgICAgcGNpX3JlYWRfY29uZmlnX3dvcmQoc19icmlkZ2UsIFZJQTY4NkFfRU5BQkxFX1JFRywgJnZhbCkpCgkJcmV0dXJuIC1FTk9ERVY7CglpZiAoISh2YWwgJiAweDAwMDEpKSB7CgkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwgImVuYWJsaW5nIHNlbnNvcnNcbiIpOwoJCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KCQkgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNfYnJpZGdlLCBWSUE2ODZBX0VOQUJMRV9SRUcsCgkJCQkJICB2YWwgfCAweDAwMDEpKQoJCQlyZXR1cm4gLUVOT0RFVjsKCX0KCgkvKiBSZXNlcnZlIHRoZSBJU0EgcmVnaW9uICovCglpZiAoIXJlcXVlc3RfcmVnaW9uKGFkZHJlc3MsIFZJQTY4NkFfRVhURU5ULCB2aWE2ODZhX2RyaXZlci5uYW1lKSkgewoJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgInJlZ2lvbiAweCV4IGFscmVhZHkgaW4gdXNlIVxuIiwKCQkJYWRkcmVzcyk7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aWE2ODZhX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKCQllcnIgPSAtRU5PTUVNOwoJCWdvdG8gRVJST1IwOwoJfQoJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgdmlhNjg2YV9kYXRhKSk7CgoJbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CglpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CgluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOwoJbmV3X2NsaWVudC0+ZHJpdmVyID0gJnZpYTY4NmFfZHJpdmVyOwoJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOwoKCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzIGFuZCBwdXQgaW50byB0aGUgZ2xvYmFsIGxpc3QgKi8KCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgY2xpZW50X25hbWUsIEkyQ19OQU1FX1NJWkUpOwoKCWRhdGEtPnZhbGlkID0gMDsKCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQoJCWdvdG8gRVJST1IzOwoKCS8qIEluaXRpYWxpemUgdGhlIFZJQTY4NkEgY2hpcCAqLwoJdmlhNjg2YV9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKCgkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWluKTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21pbik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9taW4pOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWluKTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21pbik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9tYXgpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWF4KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21heCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19tYXgpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfbWF4KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9pbnB1dCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2lucHV0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWF4KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfbWF4KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4X2h5c3QpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9tYXhfaHlzdCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX21heF9oeXN0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9pbnB1dCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX21pbik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfbWluKTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9kaXYpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2Rpdik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CgoJcmV0dXJuIDA7CgpFUlJPUjM6CglrZnJlZShkYXRhKTsKRVJST1IwOgoJcmVsZWFzZV9yZWdpb24oYWRkcmVzcywgVklBNjg2QV9FWFRFTlQpOwoJcmV0dXJuIGVycjsKfQoKc3RhdGljIGludCB2aWE2ODZhX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKewoJaW50IGVycjsKCglpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CgkJZGV2X2VycigmY2xpZW50LT5kZXYsCgkJIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKCQlyZXR1cm4gZXJyOwoJfQoKCXJlbGVhc2VfcmVnaW9uKGNsaWVudC0+YWRkciwgVklBNjg2QV9FWFRFTlQpOwoJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwoKCXJldHVybiAwOwp9CgovKiBDYWxsZWQgd2hlbiB3ZSBoYXZlIGZvdW5kIGEgbmV3IFZJQTY4NkEuIFNldCBsaW1pdHMsIGV0Yy4gKi8Kc3RhdGljIHZvaWQgdmlhNjg2YV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQp7Cgl1OCByZWc7CgoJLyogU3RhcnQgbW9uaXRvcmluZyAqLwoJcmVnID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfQ09ORklHKTsKCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19DT05GSUcsIChyZWd8MHgwMSkmMHg3Rik7CgoJLyogQ29uZmlndXJlIHRlbXAgaW50ZXJydXB0IG1vZGUgZm9yIGNvbnRpbnVvdXMtaW50ZXJydXB0IG9wZXJhdGlvbiAqLwoJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfTU9ERSwKCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfTU9ERSkgJgoJCQkgICAgIShWSUE2ODZBX1RFTVBfTU9ERV9NQVNLIHwgVklBNjg2QV9URU1QX01PREVfQ09OVElOVU9VUykpOwp9CgpzdGF0aWMgc3RydWN0IHZpYTY4NmFfZGF0YSAqdmlhNjg2YV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCWludCBpOwoKCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCglpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWiArIEhaIC8gMikKCSAgICB8fCAhZGF0YS0+dmFsaWQpIHsKCQlmb3IgKGkgPSAwOyBpIDw9IDQ7IGkrKykgewoJCQlkYXRhLT5pbltpXSA9CgkJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19JTihpKSk7CgkJCWRhdGEtPmluX21pbltpXSA9IHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCgkJCQkJCQkgICAgIFZJQTY4NkFfUkVHX0lOX01JTgoJCQkJCQkJICAgICAoaSkpOwoJCQlkYXRhLT5pbl9tYXhbaV0gPQoJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfSU5fTUFYKGkpKTsKCQl9CgkJZm9yIChpID0gMTsgaSA8PSAyOyBpKyspIHsKCQkJZGF0YS0+ZmFuW2kgLSAxXSA9CgkJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19GQU4oaSkpOwoJCQlkYXRhLT5mYW5fbWluW2kgLSAxXSA9IHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCgkJCQkJCSAgICAgVklBNjg2QV9SRUdfRkFOX01JTihpKSk7CgkJfQoJCWZvciAoaSA9IDA7IGkgPD0gMjsgaSsrKSB7CgkJCWRhdGEtPnRlbXBbaV0gPSB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAoJCQkJCQkgVklBNjg2QV9SRUdfVEVNUFtpXSkgPDwgMjsKCQkJZGF0YS0+dGVtcF9vdmVyW2ldID0KCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCgkJCQkJICAgICAgIFZJQTY4NkFfUkVHX1RFTVBfT1ZFUltpXSk7CgkJCWRhdGEtPnRlbXBfaHlzdFtpXSA9CgkJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAoJCQkJCSAgICAgICBWSUE2ODZBX1JFR19URU1QX0hZU1RbaV0pOwoJCX0KCQkvKiBhZGQgaW4gbG93ZXIgMiBiaXRzCgkJICAgdGVtcDEgdXNlcyBiaXRzIDctNiBvZiBWSUE2ODZBX1JFR19URU1QX0xPVzEKCQkgICB0ZW1wMiB1c2VzIGJpdHMgNS00IG9mIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMKCQkgICB0ZW1wMyB1c2VzIGJpdHMgNy02IG9mIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMKCQkgKi8KCQlkYXRhLT50ZW1wWzBdIHw9ICh2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAoJCQkJCQkgICAgIFZJQTY4NkFfUkVHX1RFTVBfTE9XMSkKCQkJCSAgJiAweGMwKSA+PiA2OwoJCWRhdGEtPnRlbXBbMV0gfD0KCQkgICAgKHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMpICYKCQkgICAgIDB4MzApID4+IDQ7CgkJZGF0YS0+dGVtcFsyXSB8PQoJCSAgICAodmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9MT1cyMykgJgoJCSAgICAgMHhjMCkgPj4gNjsKCgkJaSA9IHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0ZBTkRJVik7CgkJZGF0YS0+ZmFuX2RpdlswXSA9IChpID4+IDQpICYgMHgwMzsKCQlkYXRhLT5mYW5fZGl2WzFdID0gaSA+PiA2OwoJCWRhdGEtPmFsYXJtcyA9CgkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCgkJCQkgICAgICAgVklBNjg2QV9SRUdfQUxBUk0xKSB8CgkJICAgICh2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19BTEFSTTIpIDw8IDgpOwoJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CgkJZGF0YS0+dmFsaWQgPSAxOwoJfQoKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CgoJcmV0dXJuIGRhdGE7Cn0KCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB2aWE2ODZhX3BjaV9pZHNbXSA9IHsKCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNjg2XzQpIH0sCgl7IDAsIH0KfTsKCk1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB2aWE2ODZhX3BjaV9pZHMpOwoKc3RhdGljIGludCBfX2RldmluaXQgdmlhNjg2YV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCnsKCXUxNiB2YWw7CglpbnQgYWRkciA9IDA7CgoJaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQoJICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgVklBNjg2QV9CQVNFX1JFRywgJnZhbCkpCgkJcmV0dXJuIC1FTk9ERVY7CgoJYWRkciA9IHZhbCAmIH4oVklBNjg2QV9FWFRFTlQgLSAxKTsKCWlmIChhZGRyID09IDAgJiYgZm9yY2VfYWRkciA9PSAwKSB7CgkJZGV2X2VycigmZGV2LT5kZXYsICJiYXNlIGFkZHJlc3Mgbm90IHNldCAtIHVwZ3JhZGUgQklPUyAiCgkJCSJvciB1c2UgZm9yY2VfYWRkcj0weGFkZHJcbiIpOwoJCXJldHVybiAtRU5PREVWOwoJfQoJaWYgKGZvcmNlX2FkZHIpCgkJYWRkciA9IGZvcmNlX2FkZHI7CS8qIHNvIGRldGVjdCB3aWxsIGdldCBjYWxsZWQgKi8KCglpZiAoIWFkZHIpIHsKCQlkZXZfZXJyKCZkZXYtPmRldiwgIk5vIFZpYSA2ODZBIHNlbnNvcnMgZm91bmQuXG4iKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCW5vcm1hbF9pc2FbMF0gPSBhZGRyOwoKCXNfYnJpZGdlID0gcGNpX2Rldl9nZXQoZGV2KTsKCWlmIChpMmNfYWRkX2RyaXZlcigmdmlhNjg2YV9kcml2ZXIpKSB7CgkJcGNpX2Rldl9wdXQoc19icmlkZ2UpOwoJCXNfYnJpZGdlID0gTlVMTDsKCX0KCgkvKiBBbHdheXMgcmV0dXJuIGZhaWx1cmUgaGVyZS4gIFRoaXMgaXMgdG8gYWxsb3cgb3RoZXIgZHJpdmVycyB0byBiaW5kCgkgKiB0byB0aGlzIHBjaSBkZXZpY2UuICBXZSBkb24ndCByZWFsbHkgd2FudCB0byBoYXZlIGNvbnRyb2wgb3ZlciB0aGUKCSAqIHBjaSBkZXZpY2UsIHdlIG9ubHkgd2FudGVkIHRvIHJlYWQgYXMgZmV3IHJlZ2lzdGVyIHZhbHVlcyBmcm9tIGl0LgoJICovCglyZXR1cm4gLUVOT0RFVjsKfQoKc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHZpYTY4NmFfcGNpX2RyaXZlciA9IHsKCS5uYW1lCQk9ICJ2aWE2ODZhIiwKCS5pZF90YWJsZQk9IHZpYTY4NmFfcGNpX2lkcywKCS5wcm9iZQkJPSB2aWE2ODZhX3BjaV9wcm9iZSwKfTsKCnN0YXRpYyBpbnQgX19pbml0IHNtX3ZpYTY4NmFfaW5pdCh2b2lkKQp7CglyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdmlhNjg2YV9wY2lfZHJpdmVyKTsKfQoKc3RhdGljIHZvaWQgX19leGl0IHNtX3ZpYTY4NmFfZXhpdCh2b2lkKQp7CglwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnZpYTY4NmFfcGNpX2RyaXZlcik7CglpZiAoc19icmlkZ2UgIT0gTlVMTCkgewoJCWkyY19kZWxfZHJpdmVyKCZ2aWE2ODZhX2RyaXZlcik7CgkJcGNpX2Rldl9wdXQoc19icmlkZ2UpOwoJCXNfYnJpZGdlID0gTlVMTDsKCX0KfQoKTU9EVUxFX0FVVEhPUigiS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+LCAiCgkgICAgICAiTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiAiCgkgICAgICAiYW5kIEJvYiBEb3VnaGVydHkgPGJvYmRAc3RhbmZvcmQuZWR1PiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIlZJQSA2ODZBIFNlbnNvciBkZXZpY2UiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKbW9kdWxlX2luaXQoc21fdmlhNjg2YV9pbml0KTsKbW9kdWxlX2V4aXQoc21fdmlhNjg2YV9leGl0KTsK