LyoKICAgIHNpczU1OTUuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMKCQlmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwoKICAgIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMDEgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwKCQkJS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+LCBhbmQKCQkJTWFyayBELiBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPgogICAgUG9ydGVkIHRvIExpbnV4IDIuNiBieSBBdXJlbGllbiBKYXJubyA8YXVyZWxpZW5AYXVyZWwzMi5uZXQ+IHdpdGgKICAgIHRoZSBoZWxwIG9mIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgoqLwoKLyoKICAgU2lTIHNvdXRoYnJpZGdlIGhhcyBhIExNNzgtbGlrZSBjaGlwIGludGVncmF0ZWQgb24gdGhlIHNhbWUgSUMuCiAgIFRoaXMgZHJpdmVyIGlzIGEgY3VzdG9taXplZCBjb3B5IG9mIGxtNzguYwogICAKICAgU3VwcG9ydHMgZm9sbG93aW5nIHJldmlzaW9uczoKCVZlcnNpb24JCVBDSSBJRAkJUENJIFJldmlzaW9uCgkxCQkxMDM5LzAwMDgJQUYgb3IgbGVzcwoJMgkJMTAzOS8wMDA4CUIwIG9yIGdyZWF0ZXIKCiAgIE5vdGU6IHRoZXNlIGNoaXBzIGNvbnRhaW4gYSAwMDA4IGRldmljZSB3aGljaCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUKCSA1NTk1LiBXZSByZWNvZ25pemUgdGhlc2UgYnkgdGhlIHByZXNlbmNlIG9mIHRoZSBsaXN0ZWQKCSAiYmxhY2tsaXN0IiBQQ0kgSUQgYW5kIHJlZnVzZSB0byBsb2FkLgoKICAgTk9UIFNVUFBPUlRFRAlQQ0kgSUQJCUJMQUNLTElTVCBQQ0kgSUQJCgkgNTQwCQkwMDA4CQkwNTQwCgkgNTUwCQkwMDA4CQkwNTUwCgk1NTEzCQkwMDA4CQk1NTExCgk1NTgxCQkwMDA4CQk1NTk3Cgk1NTgyCQkwMDA4CQk1NTk3Cgk1NTk3CQkwMDA4CQk1NTk3Cgk1NTk4CQkwMDA4CQk1NTk3LzU1OTgKCSA2MzAJCTAwMDgJCTA2MzAKCSA2NDUJCTAwMDgJCTA2NDUKCSA3MzAJCTAwMDgJCTA3MzAKCSA3MzUJCTAwMDgJCTA3MzUKKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgojaW5jbHVkZSA8bGludXgvcGNpLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGxpbnV4L2kyYy1pc2EuaD4KI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CiNpbmNsdWRlIDxsaW51eC9lcnIuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KCgovKiBJZiBmb3JjZV9hZGRyIGlzIHNldCB0byBhbnl0aGluZyBkaWZmZXJlbnQgZnJvbSAwLCB3ZSBmb3JjaWJseSBlbmFibGUKICAgdGhlIGRldmljZSBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gKi8Kc3RhdGljIHUxNiBmb3JjZV9hZGRyOwptb2R1bGVfcGFyYW0oZm9yY2VfYWRkciwgdXNob3J0LCAwKTsKTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9hZGRyLAoJCSAiSW5pdGlhbGl6ZSB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBzZW5zb3JzIik7CgovKiBEZXZpY2UgYWRkcmVzcwogICBOb3RlIHRoYXQgd2UgY2FuJ3QgZGV0ZXJtaW5lIHRoZSBJU0EgYWRkcmVzcyB1bnRpbCB3ZSBoYXZlIGluaXRpYWxpemVkCiAgIG91ciBtb2R1bGUgKi8Kc3RhdGljIHVuc2lnbmVkIHNob3J0IGFkZHJlc3M7CgovKiBNYW55IFNJUzU1OTUgY29uc3RhbnRzIHNwZWNpZmllZCBiZWxvdyAqLwoKLyogTGVuZ3RoIG9mIElTQSBhZGRyZXNzIHNlZ21lbnQgKi8KI2RlZmluZSBTSVM1NTk1X0VYVEVOVCA4Ci8qIFBDSSBDb25maWcgUmVnaXN0ZXJzICovCiNkZWZpbmUgU0lTNTU5NV9SRVZJU0lPTl9SRUcgMHgwOAojZGVmaW5lIFNJUzU1OTVfQkFTRV9SRUcgMHg2OAojZGVmaW5lIFNJUzU1OTVfUElOX1JFRyAweDdBCiNkZWZpbmUgU0lTNTU5NV9FTkFCTEVfUkVHIDB4N0IKCi8qIFdoZXJlIGFyZSB0aGUgSVNBIGFkZHJlc3MvZGF0YSByZWdpc3RlcnMgcmVsYXRpdmUgdG8gdGhlIGJhc2UgYWRkcmVzcyAqLwojZGVmaW5lIFNJUzU1OTVfQUREUl9SRUdfT0ZGU0VUIDUKI2RlZmluZSBTSVM1NTk1X0RBVEFfUkVHX09GRlNFVCA2CgovKiBUaGUgU0lTNTU5NSByZWdpc3RlcnMgKi8KI2RlZmluZSBTSVM1NTk1X1JFR19JTl9NQVgobnIpICgweDJiICsgKG5yKSAqIDIpCiNkZWZpbmUgU0lTNTU5NV9SRUdfSU5fTUlOKG5yKSAoMHgyYyArIChucikgKiAyKQojZGVmaW5lIFNJUzU1OTVfUkVHX0lOKG5yKSAoMHgyMCArIChucikpCgojZGVmaW5lIFNJUzU1OTVfUkVHX0ZBTl9NSU4obnIpICgweDNiICsgKG5yKSkKI2RlZmluZSBTSVM1NTk1X1JFR19GQU4obnIpICgweDI4ICsgKG5yKSkKCi8qIE9uIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIHRoZSBjaGlwLCB0aGUgdGVtcCByZWdpc3RlcnMgYXJlIHNlcGFyYXRlLgogICBPbiB0aGUgc2Vjb25kIHZlcnNpb24sCiAgIFRFTVAgcGluIGlzIHNoYXJlZCB3aXRoIElONCwgY29uZmlndXJlZCBpbiBQQ0kgcmVnaXN0ZXIgMHg3QS4KICAgVGhlIHJlZ2lzdGVycyBhcmUgdGhlIHNhbWUgYXMgd2VsbC4KICAgT1ZFUiBhbmQgSFlTVCBhcmUgcmVhbGx5IE1BWCBhbmQgTUlOLiAqLwoKI2RlZmluZSBSRVYyTUlOCTB4YjAKI2RlZmluZSBTSVM1NTk1X1JFR19URU1QIAkoKCBkYXRhLT5yZXZpc2lvbikgPj0gUkVWMk1JTikgPyBcCgkJCQkJU0lTNTU5NV9SRUdfSU4oNCkgOiAweDI3CiNkZWZpbmUgU0lTNTU5NV9SRUdfVEVNUF9PVkVSCSgoIGRhdGEtPnJldmlzaW9uKSA+PSBSRVYyTUlOKSA/IFwKCQkJCQlTSVM1NTk1X1JFR19JTl9NQVgoNCkgOiAweDM5CiNkZWZpbmUgU0lTNTU5NV9SRUdfVEVNUF9IWVNUCSgoIGRhdGEtPnJldmlzaW9uKSA+PSBSRVYyTUlOKSA/IFwKCQkJCQlTSVM1NTk1X1JFR19JTl9NSU4oNCkgOiAweDNhCgojZGVmaW5lIFNJUzU1OTVfUkVHX0NPTkZJRyAweDQwCiNkZWZpbmUgU0lTNTU5NV9SRUdfQUxBUk0xIDB4NDEKI2RlZmluZSBTSVM1NTk1X1JFR19BTEFSTTIgMHg0MgojZGVmaW5lIFNJUzU1OTVfUkVHX0ZBTkRJViAweDQ3CgovKiBDb252ZXJzaW9ucy4gTGltaXQgY2hlY2tpbmcgaXMgb25seSBkb25lIG9uIHRoZSBUT19SRUcKICAgdmFyaWFudHMuICovCgovKiBJTjogbVYsICgwViB0byA0LjA4VikKICAgUkVHOiAxNm1WL2JpdCAqLwpzdGF0aWMgaW5saW5lIHU4IElOX1RPX1JFRyh1bnNpZ25lZCBsb25nIHZhbCkKewoJdW5zaWduZWQgbG9uZyBudmFsID0gU0VOU09SU19MSU1JVCh2YWwsIDAsIDQwODApOwoJcmV0dXJuIChudmFsICsgOCkgLyAxNjsKfQojZGVmaW5lIElOX0ZST01fUkVHKHZhbCkgKCh2YWwpICogIDE2KQoKc3RhdGljIGlubGluZSB1OCBGQU5fVE9fUkVHKGxvbmcgcnBtLCBpbnQgZGl2KQp7CglpZiAocnBtIDw9IDApCgkJcmV0dXJuIDI1NTsKCXJldHVybiBTRU5TT1JTX0xJTUlUKCgxMzUwMDAwICsgcnBtICogZGl2IC8gMikgLyAocnBtICogZGl2KSwgMSwgMjU0KTsKfQoKc3RhdGljIGlubGluZSBpbnQgRkFOX0ZST01fUkVHKHU4IHZhbCwgaW50IGRpdikKewoJcmV0dXJuIHZhbD09MCA/IC0xIDogdmFsPT0yNTUgPyAwIDogMTM1MDAwMC8odmFsKmRpdik7Cn0KCi8qIFRFTVA6IG1DICgtNTQuMTJDIHRvICsxNTcuNTNDKQogICBSRUc6IDAuODNDL2JpdCArIDUyLjEyLCB0d28ncyBjb21wbGVtZW50ICAqLwpzdGF0aWMgaW5saW5lIGludCBURU1QX0ZST01fUkVHKHM4IHZhbCkKewoJcmV0dXJuIHZhbCAqIDgzMCArIDUyMTIwOwp9CnN0YXRpYyBpbmxpbmUgczggVEVNUF9UT19SRUcoaW50IHZhbCkKewoJaW50IG52YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgLTU0MTIwLCAxNTc1MzApIDsKCXJldHVybiBudmFsPDAgPyAobnZhbC01MjEyLTQxNSkvODMwIDogKG52YWwtNTIxMis0MTUpLzgzMDsKfQoKLyogRkFOIERJVjogMSwgMiwgNCwgb3IgOCAoZGVmYXVsdHMgdG8gMikKICAgUkVHOiAwLCAxLCAyLCBvciAzIChyZXNwZWN0aXZlbHkpIChkZWZhdWx0cyB0byAxKSAqLwpzdGF0aWMgaW5saW5lIHU4IERJVl9UT19SRUcoaW50IHZhbCkKewoJcmV0dXJuIHZhbD09OCA/IDMgOiB2YWw9PTQgPyAyIDogdmFsPT0xID8gMCA6IDE7Cn0KI2RlZmluZSBESVZfRlJPTV9SRUcodmFsKSAoMSA8PCAodmFsKSkKCi8qIEZvciB0aGUgU0lTNTU5NSwgd2UgbmVlZCB0byBrZWVwIHNvbWUgZGF0YSBpbiBtZW1vcnkuIFRoYXQKICAgZGF0YSBpcyBwb2ludGVkIHRvIGJ5IHNpczU1OTVfbGlzdFtOUl0tPmRhdGEuIFRoZSBzdHJ1Y3R1cmUgaXRzZWxmIGlzCiAgIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCwgYXQgdGhlIHRpbWUgd2hlbiB0aGUgbmV3IHNpczU1OTUgY2xpZW50IGlzCiAgIGFsbG9jYXRlZC4gKi8Kc3RydWN0IHNpczU1OTVfZGF0YSB7CglzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CglzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CglzdHJ1Y3QgbXV0ZXggbG9jazsKCglzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CgljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCgl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLwoJY2hhciBtYXhpbnM7CQkvKiA9PSAzIGlmIHRlbXAgZW5hYmxlZCwgb3RoZXJ3aXNlID09IDQgKi8KCXU4IHJldmlzaW9uOwkJLyogUmVnLiB2YWx1ZSAqLwoKCXU4IGluWzVdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGluX21heFs1XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCgl1OCBpbl9taW5bNV07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwoJdTggZmFuWzJdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGZhbl9taW5bMl07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwoJczggdGVtcDsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCglzOCB0ZW1wX292ZXI7CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwoJczggdGVtcF9oeXN0OwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGZhbl9kaXZbMl07CQkvKiBSZWdpc3RlciBlbmNvZGluZywgc2hpZnRlZCByaWdodCAqLwoJdTE2IGFsYXJtczsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLwp9OwoKc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpzX2JyaWRnZTsJLyogcG9pbnRlciB0byB0aGUgKG9ubHkpIHNpczU1OTUgKi8KCnN0YXRpYyBpbnQgc2lzNTU5NV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKc3RhdGljIGludCBzaXM1NTk1X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CgpzdGF0aWMgaW50IHNpczU1OTVfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpOwpzdGF0aWMgaW50IHNpczU1OTVfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWx1ZSk7CnN0YXRpYyBzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpzaXM1NTk1X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKc3RhdGljIHZvaWQgc2lzNTU5NV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKCnN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzaXM1NTk1X2RyaXZlciA9IHsKCS5kcml2ZXIgPSB7CgkJLm5hbWUJPSAic2lzNTU5NSIsCgl9LAoJLmF0dGFjaF9hZGFwdGVyCT0gc2lzNTU5NV9kZXRlY3QsCgkuZGV0YWNoX2NsaWVudAk9IHNpczU1OTVfZGV0YWNoX2NsaWVudCwKfTsKCi8qIDQgVm9sdGFnZXMgKi8Kc3RhdGljIHNzaXplX3Qgc2hvd19pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQp7CglzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gc2lzNTU5NV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5bbnJdKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNob3dfaW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCnsKCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBzaXM1NTk1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbl9taW5bbnJdKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNob3dfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCnsKCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBzaXM1NTk1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbl9tYXhbbnJdKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNldF9pbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCgkgICAgICAgc2l6ZV90IGNvdW50LCBpbnQgbnIpCnsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CglzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Cgl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwoKCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPmluX21pbltucl0gPSBJTl9UT19SRUcodmFsKTsKCXNpczU1OTVfd3JpdGVfdmFsdWUoY2xpZW50LCBTSVM1NTk1X1JFR19JTl9NSU4obnIpLCBkYXRhLT5pbl9taW5bbnJdKTsKCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgc3NpemVfdCBzZXRfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAoJICAgICAgIHNpemVfdCBjb3VudCwgaW50IG5yKQp7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwoJc3RydWN0IHNpczU1OTVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKCgltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CglkYXRhLT5pbl9tYXhbbnJdID0gSU5fVE9fUkVHKHZhbCk7CglzaXM1NTk1X3dyaXRlX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfSU5fTUFYKG5yKSwgZGF0YS0+aW5fbWF4W25yXSk7CgltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQoKI2RlZmluZSBzaG93X2luX29mZnNldChvZmZzZXQpCQkJCQlcCnN0YXRpYyBzc2l6ZV90CQkJCQkJCVwKCXNob3dfaW4jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAp7CQkJCQkJCQlcCglyZXR1cm4gc2hvd19pbihkZXYsIGJ1Ziwgb2Zmc2V0KTsJCQlcCn0JCQkJCQkJCVwKc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgCQlcCgkJc2hvd19pbiMjb2Zmc2V0LCBOVUxMKTsJCQkJXApzdGF0aWMgc3NpemVfdAkJCQkJCQlcCglzaG93X2luIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAp7CQkJCQkJCQlcCglyZXR1cm4gc2hvd19pbl9taW4oZGV2LCBidWYsIG9mZnNldCk7CQkJXAp9CQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90CQkJCQkJCVwKCXNob3dfaW4jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCnsJCQkJCQkJCVwKCXJldHVybiBzaG93X2luX21heChkZXYsIGJ1Ziwgb2Zmc2V0KTsJCQlcCn0JCQkJCQkJCVwKc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQlcCnsJCQkJCQkJCVwKCXJldHVybiBzZXRfaW5fbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsJCVwKfQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAoJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJCVwKewkJCQkJCQkJXAoJcmV0dXJuIHNldF9pbl9tYXgoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOwkJXAp9CQkJCQkJCQlcCnN0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwJCVwKCQlzaG93X2luIyNvZmZzZXQjI19taW4sIHNldF9pbiMjb2Zmc2V0IyNfbWluKTsJXApzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsCQlcCgkJc2hvd19pbiMjb2Zmc2V0IyNfbWF4LCBzZXRfaW4jI29mZnNldCMjX21heCk7CgpzaG93X2luX29mZnNldCgwKTsKc2hvd19pbl9vZmZzZXQoMSk7CnNob3dfaW5fb2Zmc2V0KDIpOwpzaG93X2luX29mZnNldCgzKTsKc2hvd19pbl9vZmZzZXQoNCk7CgovKiBUZW1wZXJhdHVyZSAqLwpzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQp7CglzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gc2lzNTU5NV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKewoJc3RydWN0IHNpczU1OTVfZGF0YSAqZGF0YSA9IHNpczU1OTVfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9vdmVyKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNldF90ZW1wX292ZXIoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCnsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CglzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Cglsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CgoJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+dGVtcF9vdmVyID0gVEVNUF9UT19SRUcodmFsKTsKCXNpczU1OTVfd3JpdGVfdmFsdWUoY2xpZW50LCBTSVM1NTk1X1JFR19URU1QX09WRVIsIGRhdGEtPnRlbXBfb3Zlcik7CgltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQoKc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQp7CglzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gc2lzNTU5NV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX2h5c3QpKTsKfQoKc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKCgltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CglkYXRhLT50ZW1wX2h5c3QgPSBURU1QX1RPX1JFRyh2YWwpOwoJc2lzNTU5NV93cml0ZV92YWx1ZShjbGllbnQsIFNJUzU1OTVfUkVHX1RFTVBfSFlTVCwgZGF0YS0+dGVtcF9oeXN0KTsKCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCk7CnN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLAoJCXNob3dfdGVtcF9vdmVyLCBzZXRfdGVtcF9vdmVyKTsKc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heF9oeXN0LCBTX0lSVUdPIHwgU19JV1VTUiwKCQlzaG93X3RlbXBfaHlzdCwgc2V0X3RlbXBfaHlzdCk7CgovKiAyIEZhbnMgKi8Kc3RhdGljIHNzaXplX3Qgc2hvd19mYW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKewoJc3RydWN0IHNpczU1OTVfZGF0YSAqZGF0YSA9IHNpczU1OTVfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5bbnJdLAoJCURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpICk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNob3dfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQp7CglzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gc2lzNTU5NV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0sCgkJRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkgKTsKfQoKc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCgkJc2l6ZV90IGNvdW50LCBpbnQgbnIpCnsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CglzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Cgl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwoKCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPmZhbl9taW5bbnJdID0gRkFOX1RPX1JFRyh2YWwsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOwoJc2lzNTU5NV93cml0ZV92YWx1ZShjbGllbnQsIFNJUzU1OTVfUkVHX0ZBTl9NSU4obnIpLCBkYXRhLT5mYW5fbWluW25yXSk7CgltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQoKc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCnsKCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBzaXM1NTk1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pICk7Cn0KCi8qIE5vdGU6IHdlIHNhdmUgYW5kIHJlc3RvcmUgdGhlIGZhbiBtaW5pbXVtIGhlcmUsIGJlY2F1c2UgaXRzIHZhbHVlIGlzCiAgIGRldGVybWluZWQgaW4gcGFydCBieSB0aGUgZmFuIGRpdmlzb3IuICBUaGlzIGZvbGxvd3MgdGhlIHByaW5jaXBsZSBvZgogICBsZWFzdCBzdXByaXNlOyB0aGUgdXNlciBkb2Vzbid0IGV4cGVjdCB0aGUgZmFuIG1pbmltdW0gdG8gY2hhbmdlIGp1c3QKICAgYmVjYXVzZSB0aGUgZGl2aXNvciBjaGFuZ2VkLiAqLwpzdGF0aWMgc3NpemVfdCBzZXRfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKCXNpemVfdCBjb3VudCwgaW50IG5yKQp7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwoJc3RydWN0IHNpczU1OTVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJdW5zaWduZWQgbG9uZyBtaW47Cgl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwoJaW50IHJlZzsKCgltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CgltaW4gPSBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0sCgkJCURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOwoJcmVnID0gc2lzNTU5NV9yZWFkX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfRkFORElWKTsKCglzd2l0Y2ggKHZhbCkgewoJY2FzZSAxOiBkYXRhLT5mYW5fZGl2W25yXSA9IDA7IGJyZWFrOwoJY2FzZSAyOiBkYXRhLT5mYW5fZGl2W25yXSA9IDE7IGJyZWFrOwoJY2FzZSA0OiBkYXRhLT5mYW5fZGl2W25yXSA9IDI7IGJyZWFrOwoJY2FzZSA4OiBkYXRhLT5mYW5fZGl2W25yXSA9IDM7IGJyZWFrOwoJZGVmYXVsdDoKCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhbl9kaXYgdmFsdWUgJWxkIG5vdCAiCgkJCSJzdXBwb3J0ZWQuIENob29zZSBvbmUgb2YgMSwgMiwgNCBvciA4IVxuIiwgdmFsKTsKCQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCQoJc3dpdGNoIChucikgewoJY2FzZSAwOgoJCXJlZyA9IChyZWcgJiAweGNmKSB8IChkYXRhLT5mYW5fZGl2W25yXSA8PCA0KTsKCQlicmVhazsKCWNhc2UgMToKCQlyZWcgPSAocmVnICYgMHgzZikgfCAoZGF0YS0+ZmFuX2Rpdltucl0gPDwgNik7CgkJYnJlYWs7Cgl9CglzaXM1NTk1X3dyaXRlX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfRkFORElWLCByZWcpOwoJZGF0YS0+ZmFuX21pbltucl0gPQoJCUZBTl9UT19SRUcobWluLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKCXNpczU1OTVfd3JpdGVfdmFsdWUoY2xpZW50LCBTSVM1NTk1X1JFR19GQU5fTUlOKG5yKSwgZGF0YS0+ZmFuX21pbltucl0pOwoJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0KCiNkZWZpbmUgc2hvd19mYW5fb2Zmc2V0KG9mZnNldCkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKewkJCQkJCQkJCVwKCXJldHVybiBzaG93X2ZhbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2hvd19mYW5fbWluKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCn0JCQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IyNfZGl2IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKewkJCQkJCQkJCVwKCXJldHVybiBzaG93X2Zhbl9kaXYoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKfQkJCQkJCQkJCVwKc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJCVwKCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQkJXAp7CQkJCQkJCQkJXAoJcmV0dXJuIHNldF9mYW5fbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCn0JCQkJCQkJCQlcCnN0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X2Zhbl8jI29mZnNldCwgTlVMTCk7XApzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLAkJXAoJCXNob3dfZmFuXyMjb2Zmc2V0IyNfbWluLCBzZXRfZmFuXyMjb2Zmc2V0IyNfbWluKTsKCnNob3dfZmFuX29mZnNldCgxKTsKc2hvd19mYW5fb2Zmc2V0KDIpOwoKc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8xX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCgkJc2l6ZV90IGNvdW50KQp7CglyZXR1cm4gc2V0X2Zhbl9kaXYoZGV2LCBidWYsIGNvdW50LCAwKSA7Cn0KCnN0YXRpYyBzc2l6ZV90IHNldF9mYW5fMl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAoJCXNpemVfdCBjb3VudCkKewoJcmV0dXJuIHNldF9mYW5fZGl2KGRldiwgYnVmLCBjb3VudCwgMSkgOwp9CnN0YXRpYyBERVZJQ0VfQVRUUihmYW4xX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsCgkJc2hvd19mYW5fMV9kaXYsIHNldF9mYW5fMV9kaXYpOwpzdGF0aWMgREVWSUNFX0FUVFIoZmFuMl9kaXYsIFNfSVJVR08gfCBTX0lXVVNSLAoJCXNob3dfZmFuXzJfZGl2LCBzZXRfZmFuXzJfZGl2KTsKCi8qIEFsYXJtcyAqLwpzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCnsKCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBzaXM1NTk1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5hbGFybXMpOwp9CnN0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zLCBOVUxMKTsKIAovKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkICovCnN0YXRpYyBpbnQgc2lzNTU5NV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQp7CglpbnQgZXJyID0gMDsKCWludCBpOwoJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CglzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhOwoJY2hhciB2YWw7Cgl1MTYgYTsKCglpZiAoZm9yY2VfYWRkcikKCQlhZGRyZXNzID0gZm9yY2VfYWRkciAmIH4oU0lTNTU5NV9FWFRFTlQgLSAxKTsKCS8qIFJlc2VydmUgdGhlIElTQSByZWdpb24gKi8KCWlmICghcmVxdWVzdF9yZWdpb24oYWRkcmVzcywgU0lTNTU5NV9FWFRFTlQsCgkJCSAgICBzaXM1NTk1X2RyaXZlci5kcml2ZXIubmFtZSkpIHsKCQllcnIgPSAtRUJVU1k7CgkJZ290byBleGl0OwoJfQoJaWYgKGZvcmNlX2FkZHIpIHsKCQlkZXZfd2FybigmYWRhcHRlci0+ZGV2LCAiZm9yY2luZyBJU0EgYWRkcmVzcyAweCUwNFhcbiIsIGFkZHJlc3MpOwoJCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KCQkgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNfYnJpZGdlLCBTSVM1NTk1X0JBU0VfUkVHLCBhZGRyZXNzKSkKCQkJZ290byBleGl0X3JlbGVhc2U7CgkJaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQoJCSAgICBwY2lfcmVhZF9jb25maWdfd29yZChzX2JyaWRnZSwgU0lTNTU5NV9CQVNFX1JFRywgJmEpKQoJCQlnb3RvIGV4aXRfcmVsZWFzZTsKCQlpZiAoKGEgJiB+KFNJUzU1OTVfRVhURU5UIC0gMSkpICE9IGFkZHJlc3MpCgkJCS8qIGRvZXNuJ3Qgd29yayBmb3Igc29tZSBjaGlwcz8gKi8KCQkJZ290byBleGl0X3JlbGVhc2U7Cgl9CgoJaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQoJICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlKHNfYnJpZGdlLCBTSVM1NTk1X0VOQUJMRV9SRUcsICZ2YWwpKSB7CgkJZ290byBleGl0X3JlbGVhc2U7Cgl9CglpZiAoKHZhbCAmIDB4ODApID09IDApIHsKCQlpZiAoUENJQklPU19TVUNDRVNTRlVMICE9CgkJICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShzX2JyaWRnZSwgU0lTNTU5NV9FTkFCTEVfUkVHLAoJCQkJCSAgdmFsIHwgMHg4MCkpCgkJCWdvdG8gZXhpdF9yZWxlYXNlOwoJCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KCQkgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUoc19icmlkZ2UsIFNJUzU1OTVfRU5BQkxFX1JFRywgJnZhbCkpCgkJCWdvdG8gZXhpdF9yZWxlYXNlOwoJCWlmICgodmFsICYgMHg4MCkgPT0gMCkgCgkJCS8qIGRvZXNuJ3Qgd29yayBmb3Igc29tZSBjaGlwcyEgKi8KCQkJZ290byBleGl0X3JlbGVhc2U7Cgl9CgoJaWYgKCEoZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzaXM1NTk1X2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKCQllcnIgPSAtRU5PTUVNOwoJCWdvdG8gZXhpdF9yZWxlYXNlOwoJfQoKCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OwoJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CgltdXRleF9pbml0KCZkYXRhLT5sb2NrKTsKCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOwoJbmV3X2NsaWVudC0+ZHJpdmVyID0gJnNpczU1OTVfZHJpdmVyOwoJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOwoKCS8qIENoZWNrIHJldmlzaW9uIGFuZCBwaW4gcmVnaXN0ZXJzIHRvIGRldGVybWluZSB3aGV0aGVyIDQgb3IgNSB2b2x0YWdlcyAqLwoJcGNpX3JlYWRfY29uZmlnX2J5dGUoc19icmlkZ2UsIFNJUzU1OTVfUkVWSVNJT05fUkVHLCAmKGRhdGEtPnJldmlzaW9uKSk7CgkvKiA0IHZvbHRhZ2VzLCAxIHRlbXAgKi8KCWRhdGEtPm1heGlucyA9IDM7CglpZiAoZGF0YS0+cmV2aXNpb24gPj0gUkVWMk1JTikgewoJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHNfYnJpZGdlLCBTSVM1NTk1X1BJTl9SRUcsICZ2YWwpOwoJCWlmICghKHZhbCAmIDB4ODApKQoJCQkvKiA1IHZvbHRhZ2VzLCBubyB0ZW1wcyAqLwoJCQlkYXRhLT5tYXhpbnMgPSA0OwoJfQoJCgkvKiBGaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyBhbmQgcHV0IGl0IGludG8gdGhlIGdsb2JhbCBsaXN0ICovCglzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsICJzaXM1NTk1IiwgSTJDX05BTUVfU0laRSk7CgoJZGF0YS0+dmFsaWQgPSAwOwoJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwoKCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQoJCWdvdG8gZXhpdF9mcmVlOwoJCgkvKiBJbml0aWFsaXplIHRoZSBTSVM1NTk1IGNoaXAgKi8KCXNpczU1OTVfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CgoJLyogQSBmZXcgdmFycyBuZWVkIHRvIGJlIGZpbGxlZCB1cG9uIHN0YXJ0dXAgKi8KCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKCQlkYXRhLT5mYW5fbWluW2ldID0gc2lzNTU5NV9yZWFkX3ZhbHVlKG5ld19jbGllbnQsCgkJCQkJU0lTNTU5NV9SRUdfRkFOX01JTihpKSk7Cgl9CgoJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KCWRhdGEtPmNsYXNzX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKCWlmIChJU19FUlIoZGF0YS0+Y2xhc3NfZGV2KSkgewoJCWVyciA9IFBUUl9FUlIoZGF0YS0+Y2xhc3NfZGV2KTsKCQlnb3RvIGV4aXRfZGV0YWNoOwoJfQoKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21pbik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9tYXgpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWluKTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21heCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9pbnB1dCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9taW4pOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWF4KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX2lucHV0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX21pbik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19tYXgpOwoJaWYgKGRhdGEtPm1heGlucyA9PSA0KSB7CgkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfaW5wdXQpOwoJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21pbik7CgkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfbWF4KTsKCX0KCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9pbnB1dCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfbWluKTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9kaXYpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2lucHV0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9taW4pOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2Rpdik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CglpZiAoZGF0YS0+bWF4aW5zID09IDMpIHsKCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7CgkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXhfaHlzdCk7Cgl9CglyZXR1cm4gMDsKCmV4aXRfZGV0YWNoOgoJaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CmV4aXRfZnJlZToKCWtmcmVlKGRhdGEpOwpleGl0X3JlbGVhc2U6CglyZWxlYXNlX3JlZ2lvbihhZGRyZXNzLCBTSVM1NTk1X0VYVEVOVCk7CmV4aXQ6CglyZXR1cm4gZXJyOwp9CgpzdGF0aWMgaW50IHNpczU1OTVfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQp7CglzdHJ1Y3Qgc2lzNTU5NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CglpbnQgZXJyOwoKCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmNsYXNzX2Rldik7CgoJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKCQlyZXR1cm4gZXJyOwoKCXJlbGVhc2VfcmVnaW9uKGNsaWVudC0+YWRkciwgU0lTNTU5NV9FWFRFTlQpOwoKCWtmcmVlKGRhdGEpOwoKCXJldHVybiAwOwp9CgoKLyogSVNBIGFjY2VzcyBtdXN0IGJlIGxvY2tlZCBleHBsaWNpdGx5LiAqLwpzdGF0aWMgaW50IHNpczU1OTVfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCnsKCWludCByZXM7CgoJc3RydWN0IHNpczU1OTVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CglvdXRiX3AocmVnLCBjbGllbnQtPmFkZHIgKyBTSVM1NTk1X0FERFJfUkVHX09GRlNFVCk7CglyZXMgPSBpbmJfcChjbGllbnQtPmFkZHIgKyBTSVM1NTk1X0RBVEFfUkVHX09GRlNFVCk7CgltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOwoJcmV0dXJuIHJlczsKfQoKc3RhdGljIGludCBzaXM1NTk1X3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsdWUpCnsKCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwoJb3V0Yl9wKHJlZywgY2xpZW50LT5hZGRyICsgU0lTNTU5NV9BRERSX1JFR19PRkZTRVQpOwoJb3V0Yl9wKHZhbHVlLCBjbGllbnQtPmFkZHIgKyBTSVM1NTk1X0RBVEFfUkVHX09GRlNFVCk7CgltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOwoJcmV0dXJuIDA7Cn0KCi8qIENhbGxlZCB3aGVuIHdlIGhhdmUgZm91bmQgYSBuZXcgU0lTNTU5NS4gKi8Kc3RhdGljIHZvaWQgc2lzNTU5NV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQp7Cgl1OCBjb25maWcgPSBzaXM1NTk1X3JlYWRfdmFsdWUoY2xpZW50LCBTSVM1NTk1X1JFR19DT05GSUcpOwoJaWYgKCEoY29uZmlnICYgMHgwMSkpCgkJc2lzNTU5NV93cml0ZV92YWx1ZShjbGllbnQsIFNJUzU1OTVfUkVHX0NPTkZJRywKCQkJCShjb25maWcgJiAweGY3KSB8IDB4MDEpOwp9CgpzdGF0aWMgc3RydWN0IHNpczU1OTVfZGF0YSAqc2lzNTU5NV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCBzaXM1NTk1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCWludCBpOwoKCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCglpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWiArIEhaIC8gMikKCSAgICB8fCAhZGF0YS0+dmFsaWQpIHsKCgkJZm9yIChpID0gMDsgaSA8PSBkYXRhLT5tYXhpbnM7IGkrKykgewoJCQlkYXRhLT5pbltpXSA9CgkJCSAgICBzaXM1NTk1X3JlYWRfdmFsdWUoY2xpZW50LCBTSVM1NTk1X1JFR19JTihpKSk7CgkJCWRhdGEtPmluX21pbltpXSA9CgkJCSAgICBzaXM1NTk1X3JlYWRfdmFsdWUoY2xpZW50LAoJCQkJCSAgICAgICBTSVM1NTk1X1JFR19JTl9NSU4oaSkpOwoJCQlkYXRhLT5pbl9tYXhbaV0gPQoJCQkgICAgc2lzNTU5NV9yZWFkX3ZhbHVlKGNsaWVudCwKCQkJCQkgICAgICAgU0lTNTU5NV9SRUdfSU5fTUFYKGkpKTsKCQl9CgkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewoJCQlkYXRhLT5mYW5baV0gPQoJCQkgICAgc2lzNTU5NV9yZWFkX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfRkFOKGkpKTsKCQkJZGF0YS0+ZmFuX21pbltpXSA9CgkJCSAgICBzaXM1NTk1X3JlYWRfdmFsdWUoY2xpZW50LAoJCQkJCSAgICAgICBTSVM1NTk1X1JFR19GQU5fTUlOKGkpKTsKCQl9CgkJaWYgKGRhdGEtPm1heGlucyA9PSAzKSB7CgkJCWRhdGEtPnRlbXAgPQoJCQkgICAgc2lzNTU5NV9yZWFkX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfVEVNUCk7CgkJCWRhdGEtPnRlbXBfb3ZlciA9CgkJCSAgICBzaXM1NTk1X3JlYWRfdmFsdWUoY2xpZW50LCBTSVM1NTk1X1JFR19URU1QX09WRVIpOwoJCQlkYXRhLT50ZW1wX2h5c3QgPQoJCQkgICAgc2lzNTU5NV9yZWFkX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfVEVNUF9IWVNUKTsKCQl9CgkJaSA9IHNpczU1OTVfcmVhZF92YWx1ZShjbGllbnQsIFNJUzU1OTVfUkVHX0ZBTkRJVik7CgkJZGF0YS0+ZmFuX2RpdlswXSA9IChpID4+IDQpICYgMHgwMzsKCQlkYXRhLT5mYW5fZGl2WzFdID0gaSA+PiA2OwoJCWRhdGEtPmFsYXJtcyA9CgkJICAgIHNpczU1OTVfcmVhZF92YWx1ZShjbGllbnQsIFNJUzU1OTVfUkVHX0FMQVJNMSkgfAoJCSAgICAoc2lzNTU5NV9yZWFkX3ZhbHVlKGNsaWVudCwgU0lTNTU5NV9SRUdfQUxBUk0yKSA8PCA4KTsKCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOwoJCWRhdGEtPnZhbGlkID0gMTsKCX0KCgltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCglyZXR1cm4gZGF0YTsKfQoKc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNpczU1OTVfcGNpX2lkc1tdID0gewoJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfNTAzKSB9LAoJeyAwLCB9Cn07CgpNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc2lzNTU5NV9wY2lfaWRzKTsKCnN0YXRpYyBpbnQgYmxhY2tsaXN0W10gX19kZXZpbml0ZGF0YSA9IHsKCVBDSV9ERVZJQ0VfSURfU0lfNTQwLAoJUENJX0RFVklDRV9JRF9TSV81NTAsCglQQ0lfREVWSUNFX0lEX1NJXzYzMCwKCVBDSV9ERVZJQ0VfSURfU0lfNjQ1LAoJUENJX0RFVklDRV9JRF9TSV83MzAsCglQQ0lfREVWSUNFX0lEX1NJXzczNSwKCVBDSV9ERVZJQ0VfSURfU0lfNTUxMSwgLyogNTUxMyBjaGlwIGhhcyB0aGUgMDAwOCBkZXZpY2UgYnV0CgkJCQkgIHRoYXQgSUQgc2hvd3MgdXAgaW4gb3RoZXIgY2hpcHMgc28gd2UKCQkJCSAgdXNlIHRoZSA1NTExIElEIGZvciByZWNvZ25pdGlvbiAqLwoJUENJX0RFVklDRV9JRF9TSV81NTk3LAoJUENJX0RFVklDRV9JRF9TSV81NTk4LAoJMCB9OwoKc3RhdGljIGludCBfX2RldmluaXQgc2lzNTU5NV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCnsKCXUxNiB2YWw7CglpbnQgKmk7CgoJZm9yIChpID0gYmxhY2tsaXN0OyAqaSAhPSAwOyBpKyspIHsKCQlzdHJ1Y3QgcGNpX2RldiAqZGV2OwoJCWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfU0ksICppLCBOVUxMKTsKCQlpZiAoZGV2KSB7CgkJCWRldl9lcnIoJmRldi0+ZGV2LCAiTG9va2VkIGZvciBTSVM1NTk1IGJ1dCBmb3VuZCB1bnN1cHBvcnRlZCBkZXZpY2UgJS40eFxuIiwgKmkpOwoJCQlwY2lfZGV2X3B1dChkZXYpOwoJCQlyZXR1cm4gLUVOT0RFVjsKCQl9Cgl9CgkKCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KCSAgICBwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFNJUzU1OTVfQkFTRV9SRUcsICZ2YWwpKQoJCXJldHVybiAtRU5PREVWOwoJCglhZGRyZXNzID0gdmFsICYgfihTSVM1NTk1X0VYVEVOVCAtIDEpOwoJaWYgKGFkZHJlc3MgPT0gMCAmJiBmb3JjZV9hZGRyID09IDApIHsKCQlkZXZfZXJyKCZkZXYtPmRldiwgIkJhc2UgYWRkcmVzcyBub3Qgc2V0IC0gdXBncmFkZSBCSU9TIG9yIHVzZSBmb3JjZV9hZGRyPTB4YWRkclxuIik7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJc19icmlkZ2UgPSBwY2lfZGV2X2dldChkZXYpOwoJaWYgKGkyY19pc2FfYWRkX2RyaXZlcigmc2lzNTU5NV9kcml2ZXIpKSB7CgkJcGNpX2Rldl9wdXQoc19icmlkZ2UpOwoJCXNfYnJpZGdlID0gTlVMTDsKCX0KCgkvKiBBbHdheXMgcmV0dXJuIGZhaWx1cmUgaGVyZS4gIFRoaXMgaXMgdG8gYWxsb3cgb3RoZXIgZHJpdmVycyB0byBiaW5kCgkgKiB0byB0aGlzIHBjaSBkZXZpY2UuICBXZSBkb24ndCByZWFsbHkgd2FudCB0byBoYXZlIGNvbnRyb2wgb3ZlciB0aGUKCSAqIHBjaSBkZXZpY2UsIHdlIG9ubHkgd2FudGVkIHRvIHJlYWQgYXMgZmV3IHJlZ2lzdGVyIHZhbHVlcyBmcm9tIGl0LgoJICovCglyZXR1cm4gLUVOT0RFVjsKfQoKc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNpczU1OTVfcGNpX2RyaXZlciA9IHsKCS5uYW1lICAgICAgICAgICAgPSAic2lzNTU5NSIsCgkuaWRfdGFibGUgICAgICAgID0gc2lzNTU5NV9wY2lfaWRzLAoJLnByb2JlICAgICAgICAgICA9IHNpczU1OTVfcGNpX3Byb2JlLAp9OwoKc3RhdGljIGludCBfX2luaXQgc21fc2lzNTU5NV9pbml0KHZvaWQpCnsKCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzaXM1NTk1X3BjaV9kcml2ZXIpOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgc21fc2lzNTU5NV9leGl0KHZvaWQpCnsKCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc2lzNTU5NV9wY2lfZHJpdmVyKTsKCWlmIChzX2JyaWRnZSAhPSBOVUxMKSB7CgkJaTJjX2lzYV9kZWxfZHJpdmVyKCZzaXM1NTk1X2RyaXZlcik7CgkJcGNpX2Rldl9wdXQoc19icmlkZ2UpOwoJCXNfYnJpZGdlID0gTlVMTDsKCX0KfQoKTU9EVUxFX0FVVEhPUigiQXVyZWxpZW4gSmFybm8gPGF1cmVsaWVuQGF1cmVsMzIubmV0PiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIlNpUyA1NTk1IFNlbnNvciBkZXZpY2UiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKbW9kdWxlX2luaXQoc21fc2lzNTU5NV9pbml0KTsKbW9kdWxlX2V4aXQoc21fc2lzNTU5NV9leGl0KTsK