From mboxrd@z Thu Jan 1 00:00:00 1970 From: Clemens Ladisch Subject: [PATCH] ALSA: add LaCie Firewire Speakers/Griffin FireWave surround driver Date: Thu, 10 Feb 2011 10:46:58 +0100 Message-ID: <4D53B412.9020201@ladisch.de> References: <4D46933D.5050609@ladisch.de> <4D4FB7C8.7090501@ladisch.de> <4D4FB7F6.8000801@ladisch.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <4D4FB7F6.8000801@ladisch.de> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linux1394-devel-bounces@lists.sourceforge.net To: Stefan Richter , Jay Fenlason Cc: alsa-devel@alsa-project.org, linux1394-devel@lists.sourceforge.net List-Id: alsa-devel@alsa-project.org QWRkIGEgZHJpdmVyIGZvciB0d28gcGxheWJhY2stb25seSBGaXJlV2lyZSBkZXZpY2VzIGJhc2Vk IG9uIHRoZSBPWEZXOTcwCmNoaXAuCgp2MjogQmV0dGVyIEFNRFRQIEFQSSBhYnN0cmFjdGlvbjsg Zml4IGZ3X3VuaXQgbGVhazsgc21hbGwgZml4ZXMuCiAgICBUd28tIGFuZCBmb3VyLWNoYW5uZWwg b3V0cHV0IG9uIHRoZSBGaXJlV2F2ZSBpcyBleHBlcmltZW50YWwuCgp2MzogY2FjaGUgdGhlIGlQ Q1IgdmFsdWUgdG8gKGhvcGVmdWxseSkgcHJldmVudCBGaXJlV2F2ZSBoYW5ncwoKU2lnbmVkLW9m Zi1ieTogQ2xlbWVucyBMYWRpc2NoIDxjbGVtZW5zQGxhZGlzY2guZGU+Ci0tLQogZHJpdmVycy9m aXJld2lyZS9jb3JlLWlzby5jICAgICB8ICAgIDEKIGRyaXZlcnMvZmlyZXdpcmUvY29yZS5oICAg ICAgICAgfCAgICAzCiBpbmNsdWRlL2xpbnV4L2ZpcmV3aXJlLmggICAgICAgIHwgICAgNwogc291 bmQvS2NvbmZpZyAgICAgICAgICAgICAgICAgICB8ICAgIDIKIHNvdW5kL01ha2VmaWxlICAgICAg ICAgICAgICAgICAgfCAgICAyCiBzb3VuZC9maXJld2lyZS9LY29uZmlnICAgICAgICAgIHwgICAy NSArCiBzb3VuZC9maXJld2lyZS9NYWtlZmlsZSAgICAgICAgIHwgICAgNgogc291bmQvZmlyZXdp cmUvYW1kdHAuYyAgICAgICAgICB8ICA1MTEgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysKIHNvdW5kL2ZpcmV3aXJlL2FtZHRwLmggICAgICAgICAgfCAgMTUxICsrKysrKysrKwogc291 bmQvZmlyZXdpcmUvY21wLmMgICAgICAgICAgICB8ICAyOTggKysrKysrKysrKysrKysrKysrCiBz b3VuZC9maXJld2lyZS9jbXAuaCAgICAgICAgICAgIHwgICA0MSArKwogc291bmQvZmlyZXdpcmUv ZmNwLmMgICAgICAgICAgICB8ICAyMjMgKysrKysrKysrKysrKwogc291bmQvZmlyZXdpcmUvZmNw LmggICAgICAgICAgICB8ICAgMTIKIHNvdW5kL2ZpcmV3aXJlL2lzby1yZXNvdXJjZXMuYyAgfCAg MjI0ICsrKysrKysrKysrKysrCiBzb3VuZC9maXJld2lyZS9pc28tcmVzb3VyY2VzLmggIHwgICAz OSArKwogc291bmQvZmlyZXdpcmUvbGliLmMgICAgICAgICAgICB8ICAgNjggKysrKwogc291bmQv ZmlyZXdpcmUvbGliLmggICAgICAgICAgICB8ICAgMTkgKwogc291bmQvZmlyZXdpcmUvcGFja2V0 cy1idWZmZXIuYyB8ICAgNzQgKysrKwogc291bmQvZmlyZXdpcmUvcGFja2V0cy1idWZmZXIuaCB8 ICAgMjYgKwogc291bmQvZmlyZXdpcmUvc3BlYWtlcnMuYyAgICAgICB8ICA0ODQgKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrCiAyMCBmaWxlcyBjaGFuZ2VkLCAyMjEyIGluc2VydGlvbnMo KyksIDQgZGVsZXRpb25zKC0pCgotLS0gYS9zb3VuZC9LY29uZmlnCisrKyBiL3NvdW5kL0tjb25m aWcKQEAgLTk3LDYgKzk3LDggQEAgc291cmNlICJzb3VuZC9zaC9LY29uZmlnIgogIyBoZXJlIGFz c3VtaW5nIFVTQiBpcyBkZWZpbmVkIGJlZm9yZSBBTFNBCiBzb3VyY2UgInNvdW5kL3VzYi9LY29u ZmlnIgogCitzb3VyY2UgInNvdW5kL2ZpcmV3aXJlL0tjb25maWciCisKICMgdGhlIGZvbGxvd2lu ZyB3aWxsIGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgY29uZmlnLgogIyBoZXJlIGFzc3VtaW5nIFBD TUNJQSBpcyBkZWZpbmVkIGJlZm9yZSBBTFNBCiBzb3VyY2UgInNvdW5kL3BjbWNpYS9LY29uZmln IgotLS0gYS9zb3VuZC9NYWtlZmlsZQorKysgYi9zb3VuZC9NYWtlZmlsZQpAQCAtNiw3ICs2LDcg QEAgb2JqLSQoQ09ORklHX1NPVU5EX1BSSU1FKSArPSBzb3VuZF9maXJtdwogb2JqLSQoQ09ORklH X1NPVU5EX1BSSU1FKSArPSBvc3MvCiBvYmotJChDT05GSUdfRE1BU09VTkQpICs9IG9zcy8KIG9i ai0kKENPTkZJR19TTkQpICs9IGNvcmUvIGkyYy8gZHJpdmVycy8gaXNhLyBwY2kvIHBwYy8gYXJt LyBzaC8gc3ludGgvIHVzYi8gXAotCXNwYXJjLyBzcGkvIHBhcmlzYy8gcGNtY2lhLyBtaXBzLyBz b2MvIGF0bWVsLworCWZpcmV3aXJlLyBzcGFyYy8gc3BpLyBwYXJpc2MvIHBjbWNpYS8gbWlwcy8g c29jLyBhdG1lbC8KIG9iai0kKENPTkZJR19TTkRfQU9BKSArPSBhb2EvCiAKICMgVGhpcyBvbmUg bXVzdCBiZSBjb21waWxhYmxlIGV2ZW4gaWYgc291bmQgaXMgY29uZmlndXJlZCBvdXQKLS0tIC9k ZXYvbnVsbAorKysgYi9zb3VuZC9maXJld2lyZS9LY29uZmlnCkBAIC0wLDAgKzEsMjUgQEAKK21l bnVjb25maWcgU05EX0ZJUkVXSVJFCisJYm9vbCAiRmlyZVdpcmUgc291bmQgZGV2aWNlcyIKKwlk ZXBlbmRzIG9uIEZJUkVXSVJFCisJZGVmYXVsdCB5CisJaGVscAorCSAgU3VwcG9ydCBmb3IgSUVF RS0xMzk0L0ZpcmVXaXJlL2lMaW5rIHNvdW5kIGRldmljZXMuCisKK2lmIFNORF9GSVJFV0lSRSAm JiBGSVJFV0lSRQorCitjb25maWcgU05EX0ZJUkVXSVJFX0xJQgorCXRyaXN0YXRlCisJZGVwZW5k cyBvbiBTTkRfUENNCisKK2NvbmZpZyBTTkRfRklSRVdJUkVfU1BFQUtFUlMKKwl0cmlzdGF0ZSAi RmlyZVdpcmUgc3BlYWtlcnMiCisJc2VsZWN0IFNORF9QQ00KKwlzZWxlY3QgU05EX0ZJUkVXSVJF X0xJQgorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgTGFD aWUgRmlyZXdpcmUgU3BlYWtlcnMKKwkgIGFuZCB0aGUgR3JpZmZpbiBGaXJlV2F2ZSBTdXJyb3Vu ZC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVy ZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc25kLWZpcmV3aXJlLXNwZWFrZXJzLgor CitlbmRpZiAjIFNORF9GSVJFV0lSRQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2ZpcmV3aXJl L01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorc25kLWZpcmV3aXJlLWxpYi1vYmpzIDo9IGxpYi5v IGlzby1yZXNvdXJjZXMubyBwYWNrZXRzLWJ1ZmZlci5vIFwKKwkJCSBmY3AubyBjbXAubyBhbWR0 cC5vCitzbmQtZmlyZXdpcmUtc3BlYWtlcnMtb2JqcyA6PSBzcGVha2Vycy5vCisKK29iai0kKENP TkZJR19TTkRfRklSRVdJUkVfTElCKSArPSBzbmQtZmlyZXdpcmUtbGliLm8KK29iai0kKENPTkZJ R19TTkRfRklSRVdJUkVfU1BFQUtFUlMpICs9IHNuZC1maXJld2lyZS1zcGVha2Vycy5vCi0tLSBh L2RyaXZlcnMvZmlyZXdpcmUvY29yZS1pc28uYworKysgYi9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUt aXNvLmMKQEAgLTM2OSwzICszNjksNCBAQCB2b2lkIGZ3X2lzb19yZXNvdXJjZV9tYW5hZ2Uoc3Ry dWN0IGZ3X2NhCiAJCSpjaGFubmVsID0gcmV0OwogCX0KIH0KK0VYUE9SVF9TWU1CT0woZndfaXNv X3Jlc291cmNlX21hbmFnZSk7Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvY29yZS5oCisrKyBiL2Ry aXZlcnMvZmlyZXdpcmUvY29yZS5oCkBAIC0xNDcsOSArMTQ3LDYgQEAgdm9pZCBmd19ub2RlX2V2 ZW50KHN0cnVjdCBmd19jYXJkICpjYXJkLAogLyogLWlzbyAqLwogCiBpbnQgZndfaXNvX2J1ZmZl cl9tYXAoc3RydWN0IGZ3X2lzb19idWZmZXIgKmJ1ZmZlciwgc3RydWN0IHZtX2FyZWFfc3RydWN0 ICp2bWEpOwotdm9pZCBmd19pc29fcmVzb3VyY2VfbWFuYWdlKHN0cnVjdCBmd19jYXJkICpjYXJk LCBpbnQgZ2VuZXJhdGlvbiwKLQkJCSAgICB1NjQgY2hhbm5lbHNfbWFzaywgaW50ICpjaGFubmVs LCBpbnQgKmJhbmR3aWR0aCwKLQkJCSAgICBib29sIGFsbG9jYXRlLCBfX2JlMzIgYnVmZmVyWzJd KTsKIAogCiAvKiAtdG9wb2xvZ3kgKi8KLS0tIGEvaW5jbHVkZS9saW51eC9maXJld2lyZS5oCisr KyBiL2luY2x1ZGUvbGludXgvZmlyZXdpcmUuaApAQCAtNDIsNiArNDIsMTAgQEAKICNkZWZpbmUg Q1NSX0JST0FEQ0FTVF9DSEFOTkVMCQkweDIzNAogI2RlZmluZSBDU1JfQ09ORklHX1JPTQkJCTB4 NDAwCiAjZGVmaW5lIENTUl9DT05GSUdfUk9NX0VORAkJMHg4MDAKKyNkZWZpbmUgQ1NSX09NUFIJ CQkweDkwMAorI2RlZmluZSBDU1JfT1BDUihpKQkJCSgweDkwNCArIChpKSAqIDQpCisjZGVmaW5l IENTUl9JTVBSCQkJMHg5ODAKKyNkZWZpbmUgQ1NSX0lQQ1IoaSkJCQkoMHg5ODQgKyAoaSkgKiA0 KQogI2RlZmluZSBDU1JfRkNQX0NPTU1BTkQJCQkweEIwMAogI2RlZmluZSBDU1JfRkNQX1JFU1BP TlNFCQkweEQwMAogI2RlZmluZSBDU1JfRkNQX0VORAkJCTB4RjAwCkBAIC00NDEsNSArNDQ1LDgg QEAgaW50IGZ3X2lzb19jb250ZXh0X3N0YXJ0KHN0cnVjdCBmd19pc29fYwogCQkJIGludCBjeWNs ZSwgaW50IHN5bmMsIGludCB0YWdzKTsKIGludCBmd19pc29fY29udGV4dF9zdG9wKHN0cnVjdCBm d19pc29fY29udGV4dCAqY3R4KTsKIHZvaWQgZndfaXNvX2NvbnRleHRfZGVzdHJveShzdHJ1Y3Qg ZndfaXNvX2NvbnRleHQgKmN0eCk7Cit2b2lkIGZ3X2lzb19yZXNvdXJjZV9tYW5hZ2Uoc3RydWN0 IGZ3X2NhcmQgKmNhcmQsIGludCBnZW5lcmF0aW9uLAorCQkJICAgIHU2NCBjaGFubmVsc19tYXNr LCBpbnQgKmNoYW5uZWwsIGludCAqYmFuZHdpZHRoLAorCQkJICAgIGJvb2wgYWxsb2NhdGUsIF9f YmUzMiBidWZmZXJbMl0pOwogCiAjZW5kaWYgLyogX0xJTlVYX0ZJUkVXSVJFX0ggKi8KLS0tIC9k ZXYvbnVsbAorKysgYi9zb3VuZC9maXJld2lyZS9jbXAuYwpAQCAtMCwwICsxLDI5OCBAQAorLyoK KyAqIENvbm5lY3Rpb24gTWFuYWdlbWVudCBQcm9jZWR1cmVzIChJRUMgNjE4ODMtMSkgaGVscGVy IGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgQ2xlbWVucyBMYWRpc2NoIDxjbGVtZW5z QGxhZGlzY2guZGU+CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Rl dmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpcmV3aXJlLmg+CisjaW5jbHVkZSA8bGludXgvZmly ZXdpcmUtY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8 bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJpc28tcmVzb3VyY2Vz LmgiCisjaW5jbHVkZSAiY21wLmgiCisKKyNkZWZpbmUgSU1QUl9TUEVFRF9NQVNLCQkweGMwMDAw MDAwCisjZGVmaW5lIElNUFJfU1BFRURfU0hJRlQJMzAKKyNkZWZpbmUgSU1QUl9YU1BFRURfTUFT SwkweDAwMDAwMDYwCisjZGVmaW5lIElNUFJfWFNQRUVEX1NISUZUCTUKKyNkZWZpbmUgSU1QUl9Q TFVHU19NQVNLCQkweDAwMDAwMDFmCisKKyNkZWZpbmUgSVBDUl9PTkxJTkUJCTB4ODAwMDAwMDAK KyNkZWZpbmUgSVBDUl9CQ0FTVF9DT05OCQkweDQwMDAwMDAwCisjZGVmaW5lIElQQ1JfUDJQX0NP Tk5fTUFTSwkweDNmMDAwMDAwCisjZGVmaW5lIElQQ1JfUDJQX0NPTk5fU0hJRlQJMjQKKyNkZWZp bmUgSVBDUl9DSEFOTkVMX01BU0sJMHgwMDNmMDAwMAorI2RlZmluZSBJUENSX0NIQU5ORUxfU0hJ RlQJMTYKKworZW51bSBidXNfcmVzZXRfaGFuZGxpbmcgeworCUFCT1JUX09OX0JVU19SRVNFVCwK KwlTVUNDRUVEX09OX0JVU19SRVNFVCwKK307CisKKyNkZWZpbmUgY21wX2VycihjLCBmbXQsIGFy Zy4uLikgXAorCQlkZXZfZXJyKCYoYyktPnJlc291cmNlcy51bml0LT5kZXZpY2UsIGZtdCwgIyNh cmcpCisKK3N0YXRpYyBpbnQgcGNyX21vZGlmeShzdHJ1Y3QgY21wX2Nvbm5lY3Rpb24gKmMsCisJ CSAgICAgIF9fYmUzMiAoKm1vZGlmeSkoc3RydWN0IGNtcF9jb25uZWN0aW9uICpjLCBfX2JlMzIg b2xkKSwKKwkJICAgICAgaW50ICgqY2hlY2spKHN0cnVjdCBjbXBfY29ubmVjdGlvbiAqYywgX19i ZTMyIHBjciksCisJCSAgICAgIGVudW0gYnVzX3Jlc2V0X2hhbmRsaW5nIGJ1c19yZXNldF9oYW5k bGluZykKK3sKKwlzdHJ1Y3QgZndfZGV2aWNlICpkZXZpY2UgPSBmd19wYXJlbnRfZGV2aWNlKGMt PnJlc291cmNlcy51bml0KTsKKwlfX2JlMzIgKmJ1ZmZlciA9IGMtPnJlc291cmNlcy5idWZmZXI7 CisJaW50IGdlbmVyYXRpb24gPSBjLT5yZXNvdXJjZXMuZ2VuZXJhdGlvbjsKKwlpbnQgcmNvZGUs IGVycm9ycyA9IDA7CisJX19iZTMyIG9sZF9hcmc7CisJaW50IGVycjsKKworCWJ1ZmZlclswXSA9 IGMtPmxhc3RfcGNyX3ZhbHVlOworCWZvciAoOzspIHsKKwkJb2xkX2FyZyA9IGJ1ZmZlclswXTsK KwkJYnVmZmVyWzFdID0gbW9kaWZ5KGMsIGJ1ZmZlclswXSk7CisKKwkJcmNvZGUgPSBmd19ydW5f dHJhbnNhY3Rpb24oCisJCQkJZGV2aWNlLT5jYXJkLCBUQ09ERV9MT0NLX0NPTVBBUkVfU1dBUCwK KwkJCQlkZXZpY2UtPm5vZGVfaWQsIGdlbmVyYXRpb24sIGRldmljZS0+bWF4X3NwZWVkLAorCQkJ CUNTUl9SRUdJU1RFUl9CQVNFICsgQ1NSX0lQQ1IoYy0+cGNyX2luZGV4KSwKKwkJCQlidWZmZXIs IDgpOworCisJCWlmIChyY29kZSA9PSBSQ09ERV9DT01QTEVURSkgeworCQkJaWYgKGJ1ZmZlclsw XSA9PSBvbGRfYXJnKSAvKiBzdWNjZXNzPyAqLworCQkJCWJyZWFrOworCisJCQlpZiAoY2hlY2sp IHsKKwkJCQllcnIgPSBjaGVjayhjLCBidWZmZXJbMF0pOworCQkJCWlmIChlcnIgPCAwKQorCQkJ CQlyZXR1cm4gZXJyOworCQkJfQorCQl9IGVsc2UgaWYgKHJjb2RlID09IFJDT0RFX0dFTkVSQVRJ T04pCisJCQlnb3RvIGJ1c19yZXNldDsKKwkJZWxzZSBpZiAocmNvZGVfaXNfcGVybWFuZW50X2Vy cm9yKHJjb2RlKSB8fCArK2Vycm9ycyA+PSAzKQorCQkJZ290byBpb19lcnJvcjsKKwl9CisJYy0+ bGFzdF9wY3JfdmFsdWUgPSBidWZmZXJbMF07CisKKwlyZXR1cm4gMDsKKworaW9fZXJyb3I6CisJ Y21wX2VycihjLCAiaVBDUiV1OiB0cmFuc2FjdGlvbiBmYWlsZWQ6ICVzXG4iLAorCQljLT5wY3Jf aW5kZXgsIHJjb2RlX3N0cmluZyhyY29kZSkpOworCXJldHVybiAtRUlPOworCitidXNfcmVzZXQ6 CisJcmV0dXJuIGJ1c19yZXNldF9oYW5kbGluZyA9PSBBQk9SVF9PTl9CVVNfUkVTRVQgPyAtRUFH QUlOIDogMDsKK30KKworCisvKioKKyAqIGNtcF9jb25uZWN0aW9uX2luaXQgLSBpbml0aWFsaXpl cyBhIGNvbm5lY3Rpb24gbWFuYWdlcgorICogQGM6IHRoZSBjb25uZWN0aW9uIG1hbmFnZXIgdG8g aW5pdGlhbGl6ZQorICogQHVuaXQ6IGEgdW5pdCBvZiB0aGUgdGFyZ2V0IGRldmljZQorICogQGlw Y3JfaW5kZXg6IHRoZSBpbmRleCBvZiB0aGUgaVBDUiBvbiB0aGUgdGFyZ2V0IGRldmljZQorICov CitpbnQgY21wX2Nvbm5lY3Rpb25faW5pdChzdHJ1Y3QgY21wX2Nvbm5lY3Rpb24qIGMsCisJCQlz dHJ1Y3QgZndfdW5pdCAqdW5pdCwKKwkJCXVuc2lnbmVkIGludCBpcGNyX2luZGV4KQoreworCV9f YmUzMiBpbXByX2JlOworCXUzMiBpbXByOworCWludCBlcnI7CisKKwllcnIgPSBzbmRfZndfdHJh bnNhY3Rpb24odW5pdCwgVENPREVfUkVBRF9RVUFETEVUX1JFUVVFU1QsCisJCQkJIENTUl9SRUdJ U1RFUl9CQVNFICsgQ1NSX0lNUFIsCisJCQkJICZpbXByX2JlLCA0KTsKKwlpZiAoZXJyIDwgMCkK KwkJcmV0dXJuIGVycjsKKwlpbXByID0gYmUzMl90b19jcHUoaW1wcl9iZSk7CisKKwlpZiAoaXBj cl9pbmRleCA+PSAoaW1wciAmIElNUFJfUExVR1NfTUFTSykpCisJCXJldHVybiAtRUlOVkFMOwor CisJYy0+Y29ubmVjdGVkID0gZmFsc2U7CisJbXV0ZXhfaW5pdCgmYy0+bXV0ZXgpOworCWZ3X2lz b19yZXNvdXJjZXNfaW5pdCgmYy0+cmVzb3VyY2VzLCB1bml0KTsKKwljLT5sYXN0X3Bjcl92YWx1 ZSA9IGNwdV90b19iZTMyKDB4ODAwMDAwMDApOworCWMtPnBjcl9pbmRleCA9IGlwY3JfaW5kZXg7 CisJYy0+bWF4X3NwZWVkID0gKGltcHIgJiBJTVBSX1NQRUVEX01BU0spID4+IElNUFJfU1BFRURf U0hJRlQ7CisJaWYgKGMtPm1heF9zcGVlZCA9PSBTQ09ERV9CRVRBKQorCQljLT5tYXhfc3BlZWQg Kz0gKGltcHIgJiBJTVBSX1hTUEVFRF9NQVNLKSA+PiBJTVBSX1hTUEVFRF9TSElGVDsKKworCXJl dHVybiAwOworfQorRVhQT1JUX1NZTUJPTChjbXBfY29ubmVjdGlvbl9pbml0KTsKKworLyoqCisg KiBjbXBfY29ubmVjdGlvbl9kZXN0cm95IC0gZnJlZSBjb25uZWN0aW9uIG1hbmFnZXIgcmVzb3Vy Y2VzCisgKiBAYzogdGhlIGNvbm5lY3Rpb24gbWFuYWdlcgorICovCit2b2lkIGNtcF9jb25uZWN0 aW9uX2Rlc3Ryb3koc3RydWN0IGNtcF9jb25uZWN0aW9uICpjKQoreworCVdBUk5fT04oYy0+Y29u bmVjdGVkKTsKKwltdXRleF9kZXN0cm95KCZjLT5tdXRleCk7CisJZndfaXNvX3Jlc291cmNlc19k ZXN0cm95KCZjLT5yZXNvdXJjZXMpOworfQorRVhQT1JUX1NZTUJPTChjbXBfY29ubmVjdGlvbl9k ZXN0cm95KTsKKworCitzdGF0aWMgX19iZTMyIGlwY3Jfc2V0X21vZGlmeShzdHJ1Y3QgY21wX2Nv bm5lY3Rpb24gKmMsIF9fYmUzMiBpcGNyKQoreworCWlwY3IgJj0gfmNwdV90b19iZTMyKElQQ1Jf QkNBU1RfQ09OTiB8CisJCQkgICAgIElQQ1JfUDJQX0NPTk5fTUFTSyB8CisJCQkgICAgIElQQ1Jf Q0hBTk5FTF9NQVNLKTsKKwlpcGNyIHw9IGNwdV90b19iZTMyKDEgPDwgSVBDUl9QMlBfQ09OTl9T SElGVCk7CisJaXBjciB8PSBjcHVfdG9fYmUzMihjLT5yZXNvdXJjZXMuY2hhbm5lbCA8PCBJUENS X0NIQU5ORUxfU0hJRlQpOworCisJcmV0dXJuIGlwY3I7Cit9CisKK3N0YXRpYyBpbnQgaXBjcl9z ZXRfY2hlY2soc3RydWN0IGNtcF9jb25uZWN0aW9uICpjLCBfX2JlMzIgaXBjcikKK3sKKwlpZiAo aXBjciAmIGNwdV90b19iZTMyKElQQ1JfQkNBU1RfQ09OTiB8CisJCQkgICAgICAgSVBDUl9QMlBf Q09OTl9NQVNLKSkgeworCQljbXBfZXJyKGMsICJpUENSJXU6IHBsdWcgaXMgYWxyZWFkeSBpbiB1 c2VcbiIsIGMtPnBjcl9pbmRleCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmICghKGlwY3Ig JiBjcHVfdG9fYmUzMihJUENSX09OTElORSkpKSB7CisJCWNtcF9lcnIoYywgImlQQ1IldTogcGx1 ZyBpcyBub3Qgb24tbGluZVxuIiwgYy0+cGNyX2luZGV4KTsKKwkJcmV0dXJuIC1FQ09OTlJFRlVT RUQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY21wX2Nvbm5lY3Rpb25fZXN0YWJs aXNoIC0gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byB0aGUgdGFyZ2V0CisgKiBAYzogdGhlIGNv bm5lY3Rpb24gbWFuYWdlcgorICogQG1heF9wYXlsb2FkX2J5dGVzOiB0aGUgYW1vdW50IG9mIGRh dGEgKGluY2x1ZGluZyBDSVAgaGVhZGVycykgcGVyIHBhY2tldAorICoKKyAqIFRoaXMgZnVuY3Rp b24gZXN0YWJsaXNoZXMgYSBwb2ludC10by1wb2ludCBjb25uZWN0aW9uIGZyb20gdGhlIGxvY2Fs CisgKiBjb21wdXRlciB0byB0aGUgdGFyZ2V0IGJ5IGFsbG9jYXRpbmcgaXNvY2hyb25vdXMgcmVz b3VyY2VzIChjaGFubmVsIGFuZAorICogYmFuZHdpZHRoKSBhbmQgc2V0dGluZyB0aGUgdGFyZ2V0 J3MgaW5wdXQgcGx1ZyBjb250cm9sIHJlZ2lzdGVyLiAgV2hlbiB0aGlzCisgKiBmdW5jdGlvbiBz dWNjZWVkcywgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3Igc3RhcnRpbmcgdHJhbnNtaXR0 aW5nCisgKiBwYWNrZXRzLgorICovCitpbnQgY21wX2Nvbm5lY3Rpb25fZXN0YWJsaXNoKHN0cnVj dCBjbXBfY29ubmVjdGlvbiAqYywKKwkJCSAgICAgdW5zaWduZWQgaW50IG1heF9wYXlsb2FkX2J5 dGVzKQoreworCWludCBlcnI7CisKKwlpZiAoV0FSTl9PTihjLT5jb25uZWN0ZWQpKQorCQlyZXR1 cm4gLUVJU0NPTk47CisKKwljLT5zcGVlZCA9IG1pbihjLT5tYXhfc3BlZWQsCisJCSAgICAgICBm d19wYXJlbnRfZGV2aWNlKGMtPnJlc291cmNlcy51bml0KS0+bWF4X3NwZWVkKTsKKworCW11dGV4 X2xvY2soJmMtPm11dGV4KTsKKworcmV0cnlfYWZ0ZXJfYnVzX3Jlc2V0OgorCWVyciA9IGZ3X2lz b19yZXNvdXJjZXNfYWxsb2NhdGUoJmMtPnJlc291cmNlcywKKwkJCQkJbWF4X3BheWxvYWRfYnl0 ZXMsIGMtPnNwZWVkKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJfbXV0ZXg7CisKKwllcnIg PSBwY3JfbW9kaWZ5KGMsIGlwY3Jfc2V0X21vZGlmeSwgaXBjcl9zZXRfY2hlY2ssCisJCQkgQUJP UlRfT05fQlVTX1JFU0VUKTsKKwlpZiAoZXJyID09IC1FQUdBSU4pIHsKKwkJZndfaXNvX3Jlc291 cmNlc19mcmVlKCZjLT5yZXNvdXJjZXMpOworCQlnb3RvIHJldHJ5X2FmdGVyX2J1c19yZXNldDsK Kwl9CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyX3Jlc291cmNlczsKKworCWMtPmNvbm5lY3Rl ZCA9IHRydWU7CisKKwltdXRleF91bmxvY2soJmMtPm11dGV4KTsKKworCXJldHVybiAwOworCitl cnJfcmVzb3VyY2VzOgorCWZ3X2lzb19yZXNvdXJjZXNfZnJlZSgmYy0+cmVzb3VyY2VzKTsKK2Vy cl9tdXRleDoKKwltdXRleF91bmxvY2soJmMtPm11dGV4KTsKKworCXJldHVybiBlcnI7Cit9CitF WFBPUlRfU1lNQk9MKGNtcF9jb25uZWN0aW9uX2VzdGFibGlzaCk7CisKKy8qKgorICogY21wX2Nv bm5lY3Rpb25fdXBkYXRlIC0gdXBkYXRlIHRoZSBjb25uZWN0aW9uIGFmdGVyIGEgYnVzIHJlc2V0 CisgKiBAYzogdGhlIGNvbm5lY3Rpb24gbWFuYWdlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVz dCBiZSBjYWxsZWQgZnJvbSB0aGUgZHJpdmVyJ3MgLnVwZGF0ZSBoYW5kbGVyIHRvIHJlZXN0YWJs aXNoCisgKiBhbnkgY29ubmVjdGlvbiB0aGF0IG1pZ2h0IGhhdmUgYmVlbiBhY3RpdmUuCisgKgor ICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4gIE9u IGFuIGVycm9yLCB0aGUKKyAqIGNvbm5lY3Rpb24gaXMgYnJva2VuIGFuZCB0aGUgY2FsbGVyIG11 c3Qgc3RvcCB0cmFuc21pdHRpbmcgaXNvIHBhY2tldHMuCisgKi8KK2ludCBjbXBfY29ubmVjdGlv bl91cGRhdGUoc3RydWN0IGNtcF9jb25uZWN0aW9uICpjKQoreworCWludCBlcnI7CisKKwltdXRl eF9sb2NrKCZjLT5tdXRleCk7CisKKwlpZiAoIWMtPmNvbm5lY3RlZCkgeworCQltdXRleF91bmxv Y2soJmMtPm11dGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJZXJyID0gZndfaXNvX3Jlc291cmNl c191cGRhdGUoJmMtPnJlc291cmNlcyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyX3VuY29u bmVjdDsKKworCWVyciA9IHBjcl9tb2RpZnkoYywgaXBjcl9zZXRfbW9kaWZ5LCBpcGNyX3NldF9j aGVjaywKKwkJCSBTVUNDRUVEX09OX0JVU19SRVNFVCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8g ZXJyX3Jlc291cmNlczsKKworCW11dGV4X3VubG9jaygmYy0+bXV0ZXgpOworCisJcmV0dXJuIDA7 CisKK2Vycl9yZXNvdXJjZXM6CisJZndfaXNvX3Jlc291cmNlc19mcmVlKCZjLT5yZXNvdXJjZXMp OworZXJyX3VuY29ubmVjdDoKKwljLT5jb25uZWN0ZWQgPSBmYWxzZTsKKwltdXRleF91bmxvY2so JmMtPm11dGV4KTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGNtcF9jb25uZWN0 aW9uX3VwZGF0ZSk7CisKKworc3RhdGljIF9fYmUzMiBpcGNyX2JyZWFrX21vZGlmeShzdHJ1Y3Qg Y21wX2Nvbm5lY3Rpb24gKmMsIF9fYmUzMiBpcGNyKQoreworCXJldHVybiBpcGNyICYgfmNwdV90 b19iZTMyKElQQ1JfQkNBU1RfQ09OTiB8IElQQ1JfUDJQX0NPTk5fTUFTSyk7Cit9CisKKy8qKgor ICogY21wX2Nvbm5lY3Rpb25fYnJlYWsgLSBicmVhayB0aGUgY29ubmVjdGlvbiB0byB0aGUgdGFy Z2V0CisgKiBAYzogdGhlIGNvbm5lY3Rpb24gbWFuYWdlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24g ZGVhY3RpdmVzIHRoZSBjb25uZWN0aW9uIGluIHRoZSB0YXJnZXQncyBpbnB1dCBwbHVnIGNvbnRy b2wKKyAqIHJlZ2lzdGVyLCBhbmQgZnJlZXMgdGhlIGlzb2Nocm9ub3VzIHJlc291cmNlcyBvZiB0 aGUgY29ubmVjdGlvbi4gIEJlZm9yZQorICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCB0aGUgY2Fs bGVyIHNob3VsZCBjZWFzZSB0cmFuc21pdHRpbmcgcGFja2V0cy4KKyAqLwordm9pZCBjbXBfY29u bmVjdGlvbl9icmVhayhzdHJ1Y3QgY21wX2Nvbm5lY3Rpb24gKmMpCit7CisJaW50IGVycjsKKwor CW11dGV4X2xvY2soJmMtPm11dGV4KTsKKworCWlmICghYy0+Y29ubmVjdGVkKSB7CisJCW11dGV4 X3VubG9jaygmYy0+bXV0ZXgpOworCQlyZXR1cm47CisJfQorCisJZXJyID0gcGNyX21vZGlmeShj LCBpcGNyX2JyZWFrX21vZGlmeSwgTlVMTCwgU1VDQ0VFRF9PTl9CVVNfUkVTRVQpOworCWlmIChl cnIgPCAwKQorCQljbXBfZXJyKGMsICJwbHVnIGlzIHN0aWxsIGNvbm5lY3RlZFxuIik7CisKKwlm d19pc29fcmVzb3VyY2VzX2ZyZWUoJmMtPnJlc291cmNlcyk7CisKKwljLT5jb25uZWN0ZWQgPSBm YWxzZTsKKworCW11dGV4X3VubG9jaygmYy0+bXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTChjbXBf Y29ubmVjdGlvbl9icmVhayk7Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvZmlyZXdpcmUvY21w LmgKQEAgLTAsMCArMSw0MSBAQAorI2lmbmRlZiBTT1VORF9GSVJFV0lSRV9DTVBfSF9JTkNMVURF RAorI2RlZmluZSBTT1VORF9GSVJFV0lSRV9DTVBfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8bGlu dXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgImlzby1yZXNv dXJjZXMuaCIKKworc3RydWN0IGZ3X3VuaXQ7CisKKy8qKgorICogc3RydWN0IGNtcF9jb25uZWN0 aW9uIC0gbWFuYWdlcyBhbiBpc29jaHJvbm91cyBjb25uZWN0aW9uIHRvIGEgZGV2aWNlCisgKiBA c3BlZWQ6IHRoZSBjb25uZWN0aW9uJ3MgYWN0dWFsIHNwZWVkCisgKgorICogVGhpcyBzdHJ1Y3R1 cmUgbWFuYWdlcyAodXNpbmcgQ01QKSBhbiBpc29jaHJvbm91cyBzdHJlYW0gZnJvbSB0aGUgbG9j YWwKKyAqIGNvbXB1dGVyIHRvIGEgZGV2aWNlJ3MgaW5wdXQgcGx1ZyAoaVBDUikuCisgKgorICog VGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBvUENSIGNyZWF0ZWQgb24gdGhlIGxvY2FsIGNvbXB1 dGVyLCBzbyBpdCBpcyBub3QKKyAqIHBvc3NpYmxlIHRvIG92ZXJsYXkgY29ubmVjdGlvbnMgb24g dG9wIG9mIHRoaXMgb25lLgorICovCitzdHJ1Y3QgY21wX2Nvbm5lY3Rpb24geworCWludCBzcGVl ZDsKKwkvKiBwcml2YXRlOiAqLworCWJvb2wgY29ubmVjdGVkOworCXN0cnVjdCBtdXRleCBtdXRl eDsKKwlzdHJ1Y3QgZndfaXNvX3Jlc291cmNlcyByZXNvdXJjZXM7CisJX19iZTMyIGxhc3RfcGNy X3ZhbHVlOworCXVuc2lnbmVkIGludCBwY3JfaW5kZXg7CisJdW5zaWduZWQgaW50IG1heF9zcGVl ZDsKK307CisKK2ludCBjbXBfY29ubmVjdGlvbl9pbml0KHN0cnVjdCBjbXBfY29ubmVjdGlvbiog Y29ubmVjdGlvbiwKKwkJCXN0cnVjdCBmd191bml0ICp1bml0LAorCQkJdW5zaWduZWQgaW50IGlw Y3JfaW5kZXgpOwordm9pZCBjbXBfY29ubmVjdGlvbl9kZXN0cm95KHN0cnVjdCBjbXBfY29ubmVj dGlvbiAqY29ubmVjdGlvbik7CisKK2ludCBjbXBfY29ubmVjdGlvbl9lc3RhYmxpc2goc3RydWN0 IGNtcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJICAgICB1bnNpZ25lZCBpbnQgbWF4X3Bh eWxvYWQpOworaW50IGNtcF9jb25uZWN0aW9uX3VwZGF0ZShzdHJ1Y3QgY21wX2Nvbm5lY3Rpb24g KmNvbm5lY3Rpb24pOwordm9pZCBjbXBfY29ubmVjdGlvbl9icmVhayhzdHJ1Y3QgY21wX2Nvbm5l Y3Rpb24gKmNvbm5lY3Rpb24pOworCisjZW5kaWYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9m aXJld2lyZS9mY3AuYwpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIEZ1bmN0aW9uIENvbnRyb2wg UHJvdG9jb2wgKElFQyA2MTg4My0xKSBoZWxwZXIgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0 IChjKSBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KKyAqIExpY2Vuc2VkIHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24g Mi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmly ZXdpcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJld2lyZS1jb25zdGFudHMuaD4KKyNpbmNsdWRl IDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGlu dXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4 L3dhaXQuaD4KKyNpbmNsdWRlICJmY3AuaCIKKyNpbmNsdWRlICJsaWIuaCIKKworI2RlZmluZSBD VFNfQVZDIDB4MDAKKworI2RlZmluZSBFUlJPUl9SRVRSSUVTCTMKKyNkZWZpbmUgRVJST1JfREVM QVlfTVMJNQorI2RlZmluZSBGQ1BfVElNRU9VVF9NUwkxMjUKKworc3RhdGljIERFRklORV9TUElO TE9DSyh0cmFuc2FjdGlvbnNfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKHRyYW5zYWN0aW9ucyk7 CisKK2VudW0gZmNwX3N0YXRlIHsKKwlTVEFURV9QRU5ESU5HLAorCVNUQVRFX0JVU19SRVNFVCwK KwlTVEFURV9DT01QTEVURSwKK307CisKK3N0cnVjdCBmY3BfdHJhbnNhY3Rpb24geworCXN0cnVj dCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZndfdW5pdCAqdW5pdDsKKwl2b2lkICpyZXNwb25z ZV9idWZmZXI7CisJdW5zaWduZWQgaW50IHJlc3BvbnNlX3NpemU7CisJdW5zaWduZWQgaW50IHJl c3BvbnNlX21hdGNoX2J5dGVzOworCWVudW0gZmNwX3N0YXRlIHN0YXRlOworCXdhaXRfcXVldWVf aGVhZF90IHdhaXQ7Cit9OworCisvKioKKyAqIGZjcF9hdmNfdHJhbnNhY3Rpb24gLSBzZW5kIGFu IEFWL0MgY29tbWFuZCBhbmQgd2FpdCBmb3IgaXRzIHJlc3BvbnNlCisgKiBAdW5pdDogYSB1bml0 IG9uIHRoZSB0YXJnZXQgZGV2aWNlCisgKiBAY29tbWFuZDogYSBidWZmZXIgY29udGFpbmluZyB0 aGUgY29tbWFuZCBmcmFtZTsgbXVzdCBiZSBETUEtYWJsZQorICogQGNvbW1hbmRfc2l6ZTogdGhl IHNpemUgb2YgQGNvbW1hbmQKKyAqIEByZXNwb25zZTogYSBidWZmZXIgZm9yIHRoZSByZXNwb25z ZSBmcmFtZQorICogQHJlc3BvbnNlX3NpemU6IHRoZSBtYXhpbXVtIHNpemUgb2YgQHJlc3BvbnNl CisgKiBAcmVzcG9uc2VfbWF0Y2hfYnl0ZXM6IGEgYml0bWFwIHNwZWNpZnlpbmcgdGhlIGJ5dGVz IHVzZWQgdG8gZGV0ZWN0IHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0IHJl c3BvbnNlIGZyYW1lCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBhIEZDUCBjb21tYW5kIGZy YW1lIHRvIHRoZSB0YXJnZXQgYW5kIHdhaXRzIGZvciB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgcmVz cG9uc2UgZnJhbWUgdG8gYmUgcmV0dXJuZWQuCisgKgorICogQmVjYXVzZSBpdCBpcyBwb3NzaWJs ZSBmb3IgbXVsdGlwbGUgRkNQIHRyYW5zYWN0aW9ucyB0byBiZSBhY3RpdmUgYXQgdGhlCisgKiBz YW1lIHRpbWUsIHRoZSBjb3JyZWN0IHJlc3BvbnNlIGZyYW1lIGlzIGRldGVjdGVkIGJ5IHRoZSB2 YWx1ZSBvZiBjZXJ0YWluCisgKiBieXRlcy4gIFRoZXNlIGJ5dGVzIG11c3QgYmUgc2V0IGluIEBy ZXNwb25zZSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLAorICogYW5kIHRoZSBjb3JyZXNw b25kaW5nIGJpdHMgbXVzdCBiZSBzZXQgaW4gQHJlc3BvbnNlX21hdGNoX2J5dGVzLgorICoKKyAq IEBjb21tYW5kIGFuZCBAcmVzcG9uc2UgY2FuIHBvaW50IHRvIHRoZSBzYW1lIGJ1ZmZlci4KKyAq CisgKiBBc3luY2hyb25vdXMgb3BlcmF0aW9uIChJTlRFUklNLCBOT1RJRlkpIGlzIG5vdCBzdXBw b3J0ZWQgYXQgdGhlIG1vbWVudC4KKyAqCisgKiBSZXR1cm5zIHRoZSBhY3R1YWwgc2l6ZSBvZiB0 aGUgcmVzcG9uc2UgZnJhbWUsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IGZj cF9hdmNfdHJhbnNhY3Rpb24oc3RydWN0IGZ3X3VuaXQgKnVuaXQsCisJCQljb25zdCB2b2lkICpj b21tYW5kLCB1bnNpZ25lZCBpbnQgY29tbWFuZF9zaXplLAorCQkJdm9pZCAqcmVzcG9uc2UsIHVu c2lnbmVkIGludCByZXNwb25zZV9zaXplLAorCQkJdW5zaWduZWQgaW50IHJlc3BvbnNlX21hdGNo X2J5dGVzKQoreworCXN0cnVjdCBmY3BfdHJhbnNhY3Rpb24gdDsKKwlpbnQgdGNvZGUsIHJldCwg dHJpZXMgPSAwOworCisJdC51bml0ID0gdW5pdDsKKwl0LnJlc3BvbnNlX2J1ZmZlciA9IHJlc3Bv bnNlOworCXQucmVzcG9uc2Vfc2l6ZSA9IHJlc3BvbnNlX3NpemU7CisJdC5yZXNwb25zZV9tYXRj aF9ieXRlcyA9IHJlc3BvbnNlX21hdGNoX2J5dGVzOworCXQuc3RhdGUgPSBTVEFURV9QRU5ESU5H OworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnQud2FpdCk7CisKKwlzcGluX2xvY2tfaXJxKCZ0cmFu c2FjdGlvbnNfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmdC5saXN0LCAmdHJhbnNhY3Rpb25zKTsK KwlzcGluX3VubG9ja19pcnEoJnRyYW5zYWN0aW9uc19sb2NrKTsKKworCWZvciAoOzspIHsKKwkJ dGNvZGUgPSBjb21tYW5kX3NpemUgPT0gNCA/IFRDT0RFX1dSSVRFX1FVQURMRVRfUkVRVUVTVAor CQkJCQkgIDogVENPREVfV1JJVEVfQkxPQ0tfUkVRVUVTVDsKKwkJcmV0ID0gc25kX2Z3X3RyYW5z YWN0aW9uKHQudW5pdCwgdGNvZGUsCisJCQkJCSBDU1JfUkVHSVNURVJfQkFTRSArIENTUl9GQ1Bf Q09NTUFORCwKKwkJCQkJICh2b2lkICopY29tbWFuZCwgY29tbWFuZF9zaXplKTsKKwkJaWYgKHJl dCA8IDApCisJCQlicmVhazsKKworCQl3YWl0X2V2ZW50X3RpbWVvdXQodC53YWl0LCB0LnN0YXRl ICE9IFNUQVRFX1BFTkRJTkcsCisJCQkJICAgbXNlY3NfdG9famlmZmllcyhGQ1BfVElNRU9VVF9N UykpOworCisJCWlmICh0LnN0YXRlID09IFNUQVRFX0NPTVBMRVRFKSB7CisJCQlyZXQgPSB0LnJl c3BvbnNlX3NpemU7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICh0LnN0YXRlID09IFNUQVRFX0JV U19SRVNFVCkgeworCQkJbXNsZWVwKEVSUk9SX0RFTEFZX01TKTsKKwkJfSBlbHNlIGlmICgrK3Ry aWVzID49IEVSUk9SX1JFVFJJRVMpIHsKKwkJCWRldl9lcnIoJnQudW5pdC0+ZGV2aWNlLCAiRkNQ IGNvbW1hbmQgdGltZWQgb3V0XG4iKTsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQor CX0KKworCXNwaW5fbG9ja19pcnEoJnRyYW5zYWN0aW9uc19sb2NrKTsKKwlsaXN0X2RlbCgmdC5s aXN0KTsKKwlzcGluX3VubG9ja19pcnEoJnRyYW5zYWN0aW9uc19sb2NrKTsKKworCXJldHVybiBy ZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGZjcF9hdmNfdHJhbnNhY3Rpb24pOworCisvKioKKyAqIGZj cF9idXNfcmVzZXQgLSBpbmZvcm0gdGhlIHRhcmdldCBoYW5kbGVyIGFib3V0IGEgYnVzIHJlc2V0 CisgKiBAdW5pdDogdGhlIHVuaXQgdGhhdCBtaWdodCBiZSB1c2VkIGJ5IGZjcF9hdmNfdHJhbnNh Y3Rpb24oKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgZHJp dmVyJ3MgLnVwZGF0ZSBoYW5kbGVyIHRvIGluZm9ybQorICogdGhlIEZDUCB0cmFuc2FjdGlvbiBo YW5kbGVyIHRoYXQgYSBidXMgcmVzZXQgaGFzIGhhcHBlbmVkLiAgQW55IHBlbmRpbmcgRkNQCisg KiB0cmFuc2FjdGlvbnMgYXJlIHJldHJpZWQuCisgKi8KK3ZvaWQgZmNwX2J1c19yZXNldChzdHJ1 Y3QgZndfdW5pdCAqdW5pdCkKK3sKKwlzdHJ1Y3QgZmNwX3RyYW5zYWN0aW9uICp0OworCisJc3Bp bl9sb2NrX2lycSgmdHJhbnNhY3Rpb25zX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwg JnRyYW5zYWN0aW9ucywgbGlzdCkgeworCQlpZiAodC0+dW5pdCA9PSB1bml0ICYmCisJCSAgICB0 LT5zdGF0ZSA9PSBTVEFURV9QRU5ESU5HKSB7CisJCQl0LT5zdGF0ZSA9IFNUQVRFX0JVU19SRVNF VDsKKwkJCXdha2VfdXAoJnQtPndhaXQpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycSgmdHJh bnNhY3Rpb25zX2xvY2spOworfQorRVhQT1JUX1NZTUJPTChmY3BfYnVzX3Jlc2V0KTsKKworLyog Y2hlY2tzIHdoZXRoZXIgdGhlIHJlc3BvbnNlIG1hdGNoZXMgdGhlIG1hc2tlZCBieXRlcyBpbiBy ZXNwb25zZV9idWZmZXIgKi8KK3N0YXRpYyBib29sIGlzX21hdGNoaW5nX3Jlc3BvbnNlKHN0cnVj dCBmY3BfdHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorCQkJCSBjb25zdCB2b2lkICpyZXNwb25z ZSwgc2l6ZV90IGxlbmd0aCkKK3sKKwljb25zdCB1OCAqcDEsICpwMjsKKwl1bnNpZ25lZCBpbnQg bWFzaywgaTsKKworCXAxID0gcmVzcG9uc2U7CisJcDIgPSB0cmFuc2FjdGlvbi0+cmVzcG9uc2Vf YnVmZmVyOworCW1hc2sgPSB0cmFuc2FjdGlvbi0+cmVzcG9uc2VfbWF0Y2hfYnl0ZXM7CisKKwlm b3IgKGkgPSAwOyA7ICsraSkgeworCQlpZiAoKG1hc2sgJiAxKSAmJiBwMVtpXSAhPSBwMltpXSkK KwkJCXJldHVybiBmYWxzZTsKKwkJbWFzayA+Pj0gMTsKKwkJaWYgKCFtYXNrKQorCQkJcmV0dXJu IHRydWU7CisJCWlmICgtLWxlbmd0aCA9PSAwKQorCQkJcmV0dXJuIGZhbHNlOworCX0KK30KKwor c3RhdGljIHZvaWQgZmNwX3Jlc3BvbnNlKHN0cnVjdCBmd19jYXJkICpjYXJkLCBzdHJ1Y3QgZndf cmVxdWVzdCAqcmVxdWVzdCwKKwkJCSBpbnQgdGNvZGUsIGludCBkZXN0aW5hdGlvbiwgaW50IHNv dXJjZSwKKwkJCSBpbnQgZ2VuZXJhdGlvbiwgdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldCwKKwkJ CSB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoLCB2b2lkICpjYWxsYmFja19kYXRhKQoreworCXN0 cnVjdCBmY3BfdHJhbnNhY3Rpb24gKnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChs ZW5ndGggPCAxIHx8ICgqKGNvbnN0IHU4ICopZGF0YSAmIDB4ZjApICE9IENUU19BVkMpCisJCXJl dHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cmFuc2FjdGlvbnNfbG9jaywgZmxhZ3MpOwor CWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJnRyYW5zYWN0aW9ucywgbGlzdCkgeworCQlzdHJ1Y3Qg ZndfZGV2aWNlICpkZXZpY2UgPSBmd19wYXJlbnRfZGV2aWNlKHQtPnVuaXQpOworCQlpZiAoZGV2 aWNlLT5jYXJkICE9IGNhcmQgfHwKKwkJICAgIGRldmljZS0+Z2VuZXJhdGlvbiAhPSBnZW5lcmF0 aW9uKQorCQkJY29udGludWU7CisJCXNtcF9ybWIoKTsgLyogbm9kZV9pZCB2cy4gZ2VuZXJhdGlv biAqLworCQlpZiAoZGV2aWNlLT5ub2RlX2lkICE9IHNvdXJjZSkKKwkJCWNvbnRpbnVlOworCisJ CWlmICh0LT5zdGF0ZSA9PSBTVEFURV9QRU5ESU5HICYmCisJCSAgICBpc19tYXRjaGluZ19yZXNw b25zZSh0LCBkYXRhLCBsZW5ndGgpKSB7CisJCQl0LT5zdGF0ZSA9IFNUQVRFX0NPTVBMRVRFOwor CQkJdC0+cmVzcG9uc2Vfc2l6ZSA9IG1pbigodW5zaWduZWQgaW50KWxlbmd0aCwKKwkJCQkJICAg ICAgIHQtPnJlc3BvbnNlX3NpemUpOworCQkJbWVtY3B5KHQtPnJlc3BvbnNlX2J1ZmZlciwgZGF0 YSwgdC0+cmVzcG9uc2Vfc2l6ZSk7CisJCQl3YWtlX3VwKCZ0LT53YWl0KTsKKwkJfQorCX0KKwlz cGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cmFuc2FjdGlvbnNfbG9jaywgZmxhZ3MpOworfQorCitz dGF0aWMgc3RydWN0IGZ3X2FkZHJlc3NfaGFuZGxlciByZXNwb25zZV9yZWdpc3Rlcl9oYW5kbGVy ID0geworCS5sZW5ndGggPSAweDIwMCwKKwkuYWRkcmVzc19jYWxsYmFjayA9IGZjcF9yZXNwb25z ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGZjcF9tb2R1bGVfaW5pdCh2b2lkKQoreworCXN0 YXRpYyBjb25zdCBzdHJ1Y3QgZndfYWRkcmVzc19yZWdpb24gcmVzcG9uc2VfcmVnaXN0ZXJfcmVn aW9uID0geworCQkuc3RhcnQgPSBDU1JfUkVHSVNURVJfQkFTRSArIENTUl9GQ1BfUkVTUE9OU0Us CisJCS5lbmQgPSBDU1JfUkVHSVNURVJfQkFTRSArIENTUl9GQ1BfRU5ELAorCX07CisKKwlmd19j b3JlX2FkZF9hZGRyZXNzX2hhbmRsZXIoJnJlc3BvbnNlX3JlZ2lzdGVyX2hhbmRsZXIsCisJCQkJ ICAgICZyZXNwb25zZV9yZWdpc3Rlcl9yZWdpb24pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyB2b2lkIF9fZXhpdCBmY3BfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlXQVJOX09OKCFsaXN0X2Vt cHR5KCZ0cmFuc2FjdGlvbnMpKTsKKwlmd19jb3JlX3JlbW92ZV9hZGRyZXNzX2hhbmRsZXIoJnJl c3BvbnNlX3JlZ2lzdGVyX2hhbmRsZXIpOworfQorCittb2R1bGVfaW5pdChmY3BfbW9kdWxlX2lu aXQpOworbW9kdWxlX2V4aXQoZmNwX21vZHVsZV9leGl0KTsKLS0tIC9kZXYvbnVsbAorKysgYi9z b3VuZC9maXJld2lyZS9mY3AuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIFNPVU5EX0ZJUkVX SVJFX0ZDUF9IX0lOQ0xVREVECisjZGVmaW5lIFNPVU5EX0ZJUkVXSVJFX0ZDUF9IX0lOQ0xVREVE CisKK3N0cnVjdCBmd191bml0OworCitpbnQgZmNwX2F2Y190cmFuc2FjdGlvbihzdHJ1Y3QgZndf dW5pdCAqdW5pdCwKKwkJCWNvbnN0IHZvaWQgKmNvbW1hbmQsIHVuc2lnbmVkIGludCBjb21tYW5k X3NpemUsCisJCQl2b2lkICpyZXNwb25zZSwgdW5zaWduZWQgaW50IHJlc3BvbnNlX3NpemUsCisJ CQl1bnNpZ25lZCBpbnQgcmVzcG9uc2VfbWF0Y2hfYnl0ZXMpOwordm9pZCBmY3BfYnVzX3Jlc2V0 KHN0cnVjdCBmd191bml0ICp1bml0KTsKKworI2VuZGlmCi0tLSAvZGV2L251bGwKKysrIGIvc291 bmQvZmlyZXdpcmUvc3BlYWtlcnMuYwpAQCAtMCwwICsxLDQ4NCBAQAorLyoKKyAqIE9YRlc5NzAt YmFzZWQgc3BlYWtlcnMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSBDbGVtZW5zIExhZGlz Y2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi4KKyAqLworCisjaW5jbHVk ZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmlyZXdpcmUuaD4KKyNpbmNsdWRl IDxsaW51eC9maXJld2lyZS1jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4K KyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRl eC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Cisj aW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1 ZGUgImNtcC5oIgorI2luY2x1ZGUgImZjcC5oIgorI2luY2x1ZGUgImFtZHRwLmgiCisjaW5jbHVk ZSAibGliLmgiCisKKyNkZWZpbmUgT1hGT1JEX0ZJUk1XQVJFX0lEX0FERFJFU1MJKENTUl9SRUdJ U1RFUl9CQVNFICsgMHg1MDAwMCkKKy8qIDB4OTcwP3Z2dnYgb3IgMHg5NzE/dnZ2diwgd2hlcmUg dnZ2diA9IGZpcm13YXJlIHZlcnNpb24gKi8KKworI2RlZmluZSBPWEZPUkRfSEFSRFdBUkVfSURf QUREUkVTUwkoQ1NSX1JFR0lTVEVSX0JBU0UgKyAweDkwMDIwKQorI2RlZmluZSBPWEZPUkRfSEFS RFdBUkVfSURfT1hGVzk3MAkweDM5NDQzODQxCisjZGVmaW5lIE9YRk9SRF9IQVJEV0FSRV9JRF9P WEZXOTcxCTB4MzkzNzMxMDAKKworI2RlZmluZSBWRU5ET1JfR1JJRkZJTgkJMHgwMDEyOTIKKyNk ZWZpbmUgVkVORE9SX0xBQ0lFCQkweDAwZDA0YgorCisjZGVmaW5lIFNQRUNJRklFUl8xMzk0VEEJ MHgwMGEwMmQKKyNkZWZpbmUgVkVSU0lPTl9BVkMJCTB4MDEwMDAxCisKK3N0cnVjdCBkZXZpY2Vf aW5mbyB7CisJY29uc3QgY2hhciAqZHJpdmVyX25hbWU7CisJY29uc3QgY2hhciAqc2hvcnRfbmFt ZTsKKwljb25zdCBjaGFyICpsb25nX25hbWU7CisJdW5zaWduZWQgaW50IHJhdGVzOworCXVuc2ln bmVkIGludCBjaGFubmVsc19tYXg7Cit9OworCitzdHJ1Y3QgZndzcGsgeworCXN0cnVjdCBzbmRf Y2FyZCAqY2FyZDsKKwlzdHJ1Y3QgZndfdW5pdCAqdW5pdDsKKwljb25zdCBzdHJ1Y3QgZGV2aWNl X2luZm8gKmRldmljZV9pbmZvOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqcGNtOworCXN0 cnVjdCBtdXRleCBtdXRleDsKKwlzdHJ1Y3QgY21wX2Nvbm5lY3Rpb24gY29ubmVjdGlvbjsKKwlz dHJ1Y3QgYW1kdHBfb3V0X3N0cmVhbSBzdHJlYW07CisJYm9vbCBzdHJlYW1fcnVubmluZzsKK307 CisKK01PRFVMRV9ERVNDUklQVElPTigiRmlyZVdpcmUgc3BlYWtlcnMgZHJpdmVyIik7CitNT0RV TEVfQVVUSE9SKCJDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4iKTsKK01PRFVM RV9MSUNFTlNFKCJHUEwgdjIiKTsKKworc3RhdGljIGludCBmd3Nwa19vcGVuKHN0cnVjdCBzbmRf cGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3Bj bV9oYXJkd2FyZSBoYXJkd2FyZSA9IHsKKwkJLmluZm8gPSBTTkRSVl9QQ01fSU5GT19NTUFQIHwK KwkJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJU05EUlZfUENNX0lORk9fQkFUQ0gg fAorCQkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJU05EUlZfUENNX0lORk9fQkxP Q0tfVFJBTlNGRVIsCisJCS5mb3JtYXRzID0gQU1EVFBfT1VUX1BDTV9GT1JNQVRfQklUUywKKwkJ LmNoYW5uZWxzX21pbiA9IDIsCisJCS5idWZmZXJfYnl0ZXNfbWF4ID0gMTYgKiAxMDI0ICogMTAy NCwKKwkJLnBlcmlvZF9ieXRlc19taW4gPSAxLAorCQkucGVyaW9kX2J5dGVzX21heCA9IFVJTlRf TUFYLAorCQkucGVyaW9kc19taW4gPSAxLAorCQkucGVyaW9kc19tYXggPSBVSU5UX01BWCwKKwl9 OworCXN0cnVjdCBmd3NwayAqZndzcGsgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlpbnQg ZXJyOworCisJc3Vic3RyZWFtLT5ydW50aW1lLT5odyA9IGhhcmR3YXJlOworCXN1YnN0cmVhbS0+ cnVudGltZS0+aHcucmF0ZXMgICAgICAgID0gZndzcGstPmRldmljZV9pbmZvLT5yYXRlczsKKwlz dWJzdHJlYW0tPnJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCA9IGZ3c3BrLT5kZXZpY2VfaW5mby0+ Y2hhbm5lbHNfbWF4OworCisJZXJyID0gc25kX3BjbV9saW1pdF9od19yYXRlcyhzdWJzdHJlYW0t PnJ1bnRpbWUpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gc25kX3Bj bV9od19jb25zdHJhaW50X3N0ZXAoc3Vic3RyZWFtLT5ydW50aW1lLCAwLAorCQkJCQkgU05EUlZf UENNX0hXX1BBUkFNX0NIQU5ORUxTLCAyKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsK KworCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgoc3Vic3RyZWFtLT5ydW50aW1l LAorCQkJCQkgICBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX1RJTUUsCisJCQkJCSAgIDUwMDAs IDgxOTIwMDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gc25kX3Bj bV9od19jb25zdHJhaW50X21zYml0cyhzdWJzdHJlYW0tPnJ1bnRpbWUsIDAsIDMyLCAyNCk7CisJ aWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlu dCBmd3Nwa19jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZndzcGtfc3RvcF9zdHJlYW0oc3RydWN0IGZ3c3Br ICpmd3NwaykKK3sKKwlpZiAoZndzcGstPnN0cmVhbV9ydW5uaW5nKSB7CisJCWFtZHRwX291dF9z dHJlYW1fc3RvcCgmZndzcGstPnN0cmVhbSk7CisJCWNtcF9jb25uZWN0aW9uX2JyZWFrKCZmd3Nw ay0+Y29ubmVjdGlvbik7CisJCWZ3c3BrLT5zdHJlYW1fcnVubmluZyA9IGZhbHNlOworCX0KK30K Kworc3RhdGljIGludCBmd3Nwa19zZXRfcmF0ZShzdHJ1Y3QgZndzcGsgKmZ3c3BrLCB1bnNpZ25l ZCBpbnQgc2ZjKQoreworCXU4ICpidWY7CisJaW50IGVycjsKKworCWJ1ZiA9IGttYWxsb2MoOCwg R0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJYnVmWzBdID0g MHgwMDsJCS8qIEFWL0MsIENPTlRST0wgKi8KKwlidWZbMV0gPSAweGZmOwkJLyogdW5pdCAqLwor CWJ1ZlsyXSA9IDB4MTk7CQkvKiBJTlBVVCBQTFVHIFNJR05BTCBGT1JNQVQgKi8KKwlidWZbM10g PSAweDAwOwkJLyogcGx1ZyAwICovCisJYnVmWzRdID0gMHg5MDsJCS8qIGZvcm1hdDogYXVkaW8g Ki8KKwlidWZbNV0gPSAweDAwIHwgc2ZjOwkvKiBBTTgyNCwgZnJlcXVlbmN5ICovCisJYnVmWzZd ID0gMHhmZjsJCS8qIFNZVCAobm90IHVzZWQpICovCisJYnVmWzddID0gMHhmZjsKKworCWVyciA9 IGZjcF9hdmNfdHJhbnNhY3Rpb24oZndzcGstPnVuaXQsIGJ1ZiwgOCwgYnVmLCA4LAorCQkJCSAg QklUKDEpIHwgQklUKDIpIHwgQklUKDMpIHwgQklUKDQpIHwgQklUKDUpKTsKKwlpZiAoZXJyIDwg MCkKKwkJZ290byBlcnJvcjsKKwlpZiAoZXJyIDwgNiB8fCBidWZbMF0gIT0gMHgwOSAvKiBBQ0NF UFRFRCAqLykgeworCQlkZXZfZXJyKCZmd3Nway0+dW5pdC0+ZGV2aWNlLCAiZmFpbGVkIHRvIHNl dCBzYW1wbGUgcmF0ZVxuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyb3I7CisJfQorCisJ ZXJyID0gMDsKKworZXJyb3I6CisJa2ZyZWUoYnVmKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0 YXRpYyBpbnQgZndzcGtfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3Ry ZWFtLAorCQkJICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCit7CisJc3Ry dWN0IGZ3c3BrICpmd3NwayA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWludCBlcnI7CisK KwltdXRleF9sb2NrKCZmd3Nway0+bXV0ZXgpOworCWZ3c3BrX3N0b3Bfc3RyZWFtKGZ3c3BrKTsK KwltdXRleF91bmxvY2soJmZ3c3BrLT5tdXRleCk7CisKKwllcnIgPSBzbmRfcGNtX2xpYl9hbGxv Y192bWFsbG9jX2J1ZmZlcihzdWJzdHJlYW0sCisJCQkJCSAgICAgICBwYXJhbXNfYnVmZmVyX2J5 dGVzKGh3X3BhcmFtcykpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOworCisJYW1kdHBf b3V0X3N0cmVhbV9zZXRfcmF0ZSgmZndzcGstPnN0cmVhbSwgcGFyYW1zX3JhdGUoaHdfcGFyYW1z KSk7CisJYW1kdHBfb3V0X3N0cmVhbV9zZXRfcGNtKCZmd3Nway0+c3RyZWFtLCBwYXJhbXNfY2hh bm5lbHMoaHdfcGFyYW1zKSk7CisKKwllcnIgPSBmd3Nwa19zZXRfcmF0ZShmd3NwaywgZndzcGst PnN0cmVhbS5zZmMpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycl9idWZmZXI7CisKKwlyZXR1 cm4gMDsKKworZXJyX2J1ZmZlcjoKKwlzbmRfcGNtX2xpYl9mcmVlX3ZtYWxsb2NfYnVmZmVyKHN1 YnN0cmVhbSk7CitlcnJvcjoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGZ3c3BrX2h3 X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGZ3 c3BrICpmd3NwayA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCisJbXV0ZXhfbG9jaygmZndz cGstPm11dGV4KTsKKwlmd3Nwa19zdG9wX3N0cmVhbShmd3Nwayk7CisJbXV0ZXhfdW5sb2NrKCZm d3Nway0+bXV0ZXgpOworCisJcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfdm1hbGxvY19idWZmZXIo c3Vic3RyZWFtKTsKK30KKworc3RhdGljIGludCBmd3Nwa19wcmVwYXJlKHN0cnVjdCBzbmRfcGNt X3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBmd3NwayAqZndzcGsgPSBzdWJzdHJl YW0tPnByaXZhdGVfZGF0YTsKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmZndzcGstPm11dGV4 KTsKKworCWlmICghZndzcGstPnN0cmVhbV9ydW5uaW5nKSB7CisJCWVyciA9IGNtcF9jb25uZWN0 aW9uX2VzdGFibGlzaCgmZndzcGstPmNvbm5lY3Rpb24sCisJCQlhbWR0cF9vdXRfc3RyZWFtX2dl dF9tYXhfcGF5bG9hZCgmZndzcGstPnN0cmVhbSkpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8g ZXJyX211dGV4OworCisJCWVyciA9IGFtZHRwX291dF9zdHJlYW1fc3RhcnQoJmZ3c3BrLT5zdHJl YW0sCisJCQkJCWZ3c3BrLT5jb25uZWN0aW9uLnJlc291cmNlcy5jaGFubmVsLAorCQkJCQlmd3Nw ay0+Y29ubmVjdGlvbi5zcGVlZCk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJfY29ubmVj dGlvbjsKKworCQlmd3Nway0+c3RyZWFtX3J1bm5pbmcgPSB0cnVlOworCX0KKworCW11dGV4X3Vu bG9jaygmZndzcGstPm11dGV4KTsKKworCWFtZHRwX291dF9zdHJlYW1fcGNtX3ByZXBhcmUoJmZ3 c3BrLT5zdHJlYW0pOworCisJcmV0dXJuIDA7CisKK2Vycl9jb25uZWN0aW9uOgorCWNtcF9jb25u ZWN0aW9uX2JyZWFrKCZmd3Nway0+Y29ubmVjdGlvbik7CitlcnJfbXV0ZXg6CisJbXV0ZXhfdW5s b2NrKCZmd3Nway0+bXV0ZXgpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBmd3Nw a190cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQor eworCXN0cnVjdCBmd3NwayAqZndzcGsgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1 Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnBjbTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRS Vl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJcGNtID0gc3Vic3RyZWFtOworCQlicmVhazsKKwljYXNl IFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCXBjbSA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1 bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlhbWR0cF9vdXRfc3RyZWFtX3BjbV90cmlnZ2Vy KCZmd3Nway0+c3RyZWFtLCBwY20pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX3BjbV91 ZnJhbWVzX3QgZndzcGtfcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVh bSkKK3sKKwlzdHJ1Y3QgZndzcGsgKmZ3c3BrID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisK KwlyZXR1cm4gYW1kdHBfb3V0X3N0cmVhbV9wY21fcG9pbnRlcigmZndzcGstPnN0cmVhbSk7Cit9 CisKK3N0YXRpYyBpbnQgZndzcGtfY3JlYXRlX3BjbShzdHJ1Y3QgZndzcGsgKmZ3c3BrKQorewor CXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgb3BzID0geworCQkub3BlbiAgICAgID0gZndzcGtf b3BlbiwKKwkJLmNsb3NlICAgICA9IGZ3c3BrX2Nsb3NlLAorCQkuaW9jdGwgICAgID0gc25kX3Bj bV9saWJfaW9jdGwsCisJCS5od19wYXJhbXMgPSBmd3Nwa19od19wYXJhbXMsCisJCS5od19mcmVl ICAgPSBmd3Nwa19od19mcmVlLAorCQkucHJlcGFyZSAgID0gZndzcGtfcHJlcGFyZSwKKwkJLnRy aWdnZXIgICA9IGZ3c3BrX3RyaWdnZXIsCisJCS5wb2ludGVyICAgPSBmd3Nwa19wb2ludGVyLAor CQkucGFnZSAgICAgID0gc25kX3BjbV9saWJfZ2V0X3ZtYWxsb2NfcGFnZSwKKwkJLm1tYXAgICAg ICA9IHNuZF9wY21fbGliX21tYXBfdm1hbGxvYywKKwl9OworCXN0cnVjdCBzbmRfcGNtICpwY207 CisJaW50IGVycjsKKworCWVyciA9IHNuZF9wY21fbmV3KGZ3c3BrLT5jYXJkLCAiT1hGVzk3MCIs IDAsIDEsIDAsICZwY20pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXBjbS0+cHJp dmF0ZV9kYXRhID0gZndzcGs7CisJc3RyY3B5KHBjbS0+bmFtZSwgZndzcGstPmRldmljZV9pbmZv LT5zaG9ydF9uYW1lKTsKKwlmd3Nway0+cGNtID0gcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJF QU1fUExBWUJBQ0tdLnN1YnN0cmVhbTsKKwlmd3Nway0+cGNtLT5vcHMgPSAmb3BzOworCXJldHVy biAwOworfQorCitzdGF0aWMgdTMyIGZ3c3BrX3JlYWRfZmlybXdhcmVfdmVyc2lvbihzdHJ1Y3Qg ZndfdW5pdCAqdW5pdCkKK3sKKwlfX2JlMzIgZGF0YTsKKwlpbnQgZXJyOworCisJZXJyID0gc25k X2Z3X3RyYW5zYWN0aW9uKHVuaXQsIFRDT0RFX1JFQURfUVVBRExFVF9SRVFVRVNULAorCQkJCSBP WEZPUkRfRklSTVdBUkVfSURfQUREUkVTUywgJmRhdGEsIDQpOworCXJldHVybiBlcnIgPj0gMCA/ IGJlMzJfdG9fY3B1KGRhdGEpIDogMDsKK30KKworc3RhdGljIHZvaWQgZndzcGtfY2FyZF9mcmVl KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3QgZndzcGsgKmZ3c3BrID0gY2FyZC0+ cHJpdmF0ZV9kYXRhOworCisJYW1kdHBfb3V0X3N0cmVhbV9kZXN0cm95KCZmd3Nway0+c3RyZWFt KTsKKwljbXBfY29ubmVjdGlvbl9kZXN0cm95KCZmd3Nway0+Y29ubmVjdGlvbik7CisJZndfdW5p dF9wdXQoZndzcGstPnVuaXQpOworCW11dGV4X2Rlc3Ryb3koJmZ3c3BrLT5tdXRleCk7Cit9CisK K3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2aWNlX2luZm8gKl9fZGV2aW5pdCBmd3Nwa19kZXRlY3Qo c3RydWN0IGZ3X2RldmljZSAqZGV2KQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2aWNlX2lu Zm8gZ3JpZmZpbl9maXJld2F2ZSA9IHsKKwkJLmRyaXZlcl9uYW1lID0gIkZpcmVXYXZlIiwKKwkJ LnNob3J0X25hbWUgPSAiRmlyZVdhdmUiLAorCQkubG9uZ19uYW1lID0gIkdyaWZmaW4gRmlyZVdh dmUgU3Vycm91bmQiLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV8zMjAwMCB8CisJCQkgU05E UlZfUENNX1JBVEVfNDQxMDAgfAorCQkJIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKKwkJCSBTTkRS Vl9QQ01fUkFURV85NjAwMCwKKwkJLmNoYW5uZWxzX21heCA9IDYsCisJfTsKKwlzdGF0aWMgY29u c3Qgc3RydWN0IGRldmljZV9pbmZvIGxhY2llX3NwZWFrZXJzID0geworCQkuZHJpdmVyX25hbWUg PSAiRldTcGVha2VycyIsCisJCS5zaG9ydF9uYW1lID0gIkZpcmVXaXJlIFNwZWFrZXJzIiwKKwkJ LmxvbmdfbmFtZSA9ICJMYUNpZSBGaXJlV2lyZSBTcGVha2VycyIsCisJCS5yYXRlcyA9IFNORFJW X1BDTV9SQVRFXzMyMDAwIHwKKwkJCSBTTkRSVl9QQ01fUkFURV80NDEwMCB8CisJCQkgU05EUlZf UENNX1JBVEVfNDgwMDAgfAorCQkJIFNORFJWX1BDTV9SQVRFXzg4MjAwIHwKKwkJCSBTTkRSVl9Q Q01fUkFURV85NjAwMCwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJfTsKKwlzdHJ1Y3QgZndfY3Ny X2l0ZXJhdG9yIGk7CisJaW50IGtleSwgdmFsdWU7CisKKwlmd19jc3JfaXRlcmF0b3JfaW5pdCgm aSwgZGV2LT5jb25maWdfcm9tKTsKKwl3aGlsZSAoZndfY3NyX2l0ZXJhdG9yX25leHQoJmksICZr ZXksICZ2YWx1ZSkpCisJCWlmIChrZXkgPT0gQ1NSX1ZFTkRPUikKKwkJCXN3aXRjaCAodmFsdWUp IHsKKwkJCWNhc2UgVkVORE9SX0dSSUZGSU46CisJCQkJcmV0dXJuICZncmlmZmluX2ZpcmV3YXZl OworCQkJY2FzZSBWRU5ET1JfTEFDSUU6CisJCQkJcmV0dXJuICZsYWNpZV9zcGVha2VyczsKKwkJ CX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBmd3Nwa19wcm9i ZShzdHJ1Y3QgZGV2aWNlICp1bml0X2RldikKK3sKKwlzdHJ1Y3QgZndfdW5pdCAqdW5pdCA9IGZ3 X3VuaXQodW5pdF9kZXYpOworCXN0cnVjdCBmd19kZXZpY2UgKmZ3X2RldiA9IGZ3X3BhcmVudF9k ZXZpY2UodW5pdCk7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkOworCXN0cnVjdCBmd3NwayAqZndz cGs7CisJdTMyIGZpcm13YXJlOworCWludCBlcnI7CisKKwllcnIgPSBzbmRfY2FyZF9jcmVhdGUo LTEsIE5VTEwsIFRISVNfTU9EVUxFLCBzaXplb2YoKmZ3c3BrKSwgJmNhcmQpOworCWlmIChlcnIg PCAwKQorCQlyZXR1cm4gZXJyOworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgdW5pdF9kZXYpOwor CisJZndzcGsgPSBjYXJkLT5wcml2YXRlX2RhdGE7CisJZndzcGstPmNhcmQgPSBjYXJkOworCW11 dGV4X2luaXQoJmZ3c3BrLT5tdXRleCk7CisJZndzcGstPnVuaXQgPSBmd191bml0X2dldCh1bml0 KTsKKwlmd3Nway0+ZGV2aWNlX2luZm8gPSBmd3Nwa19kZXRlY3QoZndfZGV2KTsKKwlpZiAoIWZ3 c3BrLT5kZXZpY2VfaW5mbykgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl91bml0Owor CX0KKworCWVyciA9IGNtcF9jb25uZWN0aW9uX2luaXQoJmZ3c3BrLT5jb25uZWN0aW9uLCB1bml0 LCAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJfdW5pdDsKKworCWVyciA9IGFtZHRwX291 dF9zdHJlYW1faW5pdCgmZndzcGstPnN0cmVhbSwgdW5pdCwgQ0lQX05PTkJMT0NLSU5HKTsKKwlp ZiAoZXJyIDwgMCkKKwkJZ290byBlcnJfY29ubmVjdGlvbjsKKworCWNhcmQtPnByaXZhdGVfZnJl ZSA9IGZ3c3BrX2NhcmRfZnJlZTsKKworCXN0cmNweShjYXJkLT5kcml2ZXIsIGZ3c3BrLT5kZXZp Y2VfaW5mby0+ZHJpdmVyX25hbWUpOworCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsIGZ3c3BrLT5k ZXZpY2VfaW5mby0+c2hvcnRfbmFtZSk7CisJZmlybXdhcmUgPSBmd3Nwa19yZWFkX2Zpcm13YXJl X3ZlcnNpb24odW5pdCk7CisJc25wcmludGYoY2FyZC0+bG9uZ25hbWUsIHNpemVvZihjYXJkLT5s b25nbmFtZSksCisJCSAiJXMgKE9YRlcleCAlMDR4KSwgR1VJRCAlMDh4JTA4eCBhdCAlcywgUyVk IiwKKwkJIGZ3c3BrLT5kZXZpY2VfaW5mby0+bG9uZ19uYW1lLAorCQkgZmlybXdhcmUgPj4gMjAs IGZpcm13YXJlICYgMHhmZmZmLAorCQkgZndfZGV2LT5jb25maWdfcm9tWzNdLCBmd19kZXYtPmNv bmZpZ19yb21bNF0sCisJCSBkZXZfbmFtZSgmdW5pdC0+ZGV2aWNlKSwgMTAwIDw8IGZ3X2Rldi0+ bWF4X3NwZWVkKTsKKwlzdHJjcHkoY2FyZC0+bWl4ZXJuYW1lLCAiT1hGVzk3MCIpOworCisJZXJy ID0gZndzcGtfY3JlYXRlX3BjbShmd3Nwayk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7 CisKKwllcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290 byBlcnJvcjsKKworCWRldl9zZXRfZHJ2ZGF0YSh1bml0X2RldiwgZndzcGspOworCisJcmV0dXJu IDA7CisKK2Vycl9jb25uZWN0aW9uOgorCWNtcF9jb25uZWN0aW9uX2Rlc3Ryb3koJmZ3c3BrLT5j b25uZWN0aW9uKTsKK2Vycl91bml0OgorCWZ3X3VuaXRfcHV0KGZ3c3BrLT51bml0KTsKKwltdXRl eF9kZXN0cm95KCZmd3Nway0+bXV0ZXgpOworZXJyb3I6CisJc25kX2NhcmRfZnJlZShjYXJkKTsK KwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBmd3Nwa19yZW1vdmUoc3Ry dWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBmd3NwayAqZndzcGsgPSBkZXZfZ2V0X2RydmRh dGEoZGV2KTsKKworCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoZndzcGstPmNhcmQpOworCXNuZF9jYXJk X2ZyZWVfd2hlbl9jbG9zZWQoZndzcGstPmNhcmQpOworCXJldHVybiAwOworfQorCitzdGF0aWMg dm9pZCBmd3Nwa19idXNfcmVzZXQoc3RydWN0IGZ3X3VuaXQgKnVuaXQpCit7CisJc3RydWN0IGZ3 c3BrICpmd3NwayA9IGRldl9nZXRfZHJ2ZGF0YSgmdW5pdC0+ZGV2aWNlKTsKKworCWZjcF9idXNf cmVzZXQoZndzcGstPnVuaXQpOworCisJaWYgKGNtcF9jb25uZWN0aW9uX3VwZGF0ZSgmZndzcGst PmNvbm5lY3Rpb24pIDwgMCkgeworCQltdXRleF9sb2NrKCZmd3Nway0+bXV0ZXgpOworCQlhbWR0 cF9vdXRfc3RyZWFtX3BjbV9hYm9ydCgmZndzcGstPnN0cmVhbSk7CisJCWZ3c3BrX3N0b3Bfc3Ry ZWFtKGZ3c3BrKTsKKwkJbXV0ZXhfdW5sb2NrKCZmd3Nway0+bXV0ZXgpOworCQlyZXR1cm47CisJ fQorCisJYW1kdHBfb3V0X3N0cmVhbV91cGRhdGUoJmZ3c3BrLT5zdHJlYW0pOworfQorCitzdGF0 aWMgY29uc3Qgc3RydWN0IGllZWUxMzk0X2RldmljZV9pZCBmd3Nwa19pZF90YWJsZVtdID0gewor CXsKKwkJLm1hdGNoX2ZsYWdzICA9IElFRUUxMzk0X01BVENIX1ZFTkRPUl9JRCB8CisJCQkJSUVF RTEzOTRfTUFUQ0hfTU9ERUxfSUQgfAorCQkJCUlFRUUxMzk0X01BVENIX1NQRUNJRklFUl9JRCB8 CisJCQkJSUVFRTEzOTRfTUFUQ0hfVkVSU0lPTiwKKwkJLnZlbmRvcl9pZCAgICA9IFZFTkRPUl9H UklGRklOLAorCQkubW9kZWxfaWQgICAgID0gMHgwMGY5NzAsCisJCS5zcGVjaWZpZXJfaWQgPSBT UEVDSUZJRVJfMTM5NFRBLAorCQkudmVyc2lvbiAgICAgID0gVkVSU0lPTl9BVkMsCisJfSwKKwl7 CisJCS5tYXRjaF9mbGFncyAgPSBJRUVFMTM5NF9NQVRDSF9WRU5ET1JfSUQgfAorCQkJCUlFRUUx Mzk0X01BVENIX01PREVMX0lEIHwKKwkJCQlJRUVFMTM5NF9NQVRDSF9TUEVDSUZJRVJfSUQgfAor CQkJCUlFRUUxMzk0X01BVENIX1ZFUlNJT04sCisJCS52ZW5kb3JfaWQgICAgPSBWRU5ET1JfTEFD SUUsCisJCS5tb2RlbF9pZCAgICAgPSAweDAwZjk3MCwKKwkJLnNwZWNpZmllcl9pZCA9IFNQRUNJ RklFUl8xMzk0VEEsCisJCS52ZXJzaW9uICAgICAgPSBWRVJTSU9OX0FWQywKKwl9LAorCXsgfQor fTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaWVlZTEzOTQsIGZ3c3BrX2lkX3RhYmxlKTsKKworc3Rh dGljIHN0cnVjdCBmd19kcml2ZXIgZndzcGtfZHJpdmVyID0geworCS5kcml2ZXIgICA9IHsKKwkJ Lm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5uYW1lCT0gS0JVSUxEX01PRE5BTUUsCisJCS5idXMJ PSAmZndfYnVzX3R5cGUsCisJCS5wcm9iZQk9IGZ3c3BrX3Byb2JlLAorCQkucmVtb3ZlCT0gX19k ZXZleGl0X3AoZndzcGtfcmVtb3ZlKSwKKwl9LAorCS51cGRhdGUgICA9IGZ3c3BrX2J1c19yZXNl dCwKKwkuaWRfdGFibGUgPSBmd3Nwa19pZF90YWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0 IGFsc2FfZndzcGtfaW5pdCh2b2lkKQoreworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmZ3c3Br X2RyaXZlci5kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9md3Nwa19leGl0 KHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmZ3c3BrX2RyaXZlci5kcml2ZXIpOworfQor Cittb2R1bGVfaW5pdChhbHNhX2Z3c3BrX2luaXQpOworbW9kdWxlX2V4aXQoYWxzYV9md3Nwa19l eGl0KTsKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9maXJld2lyZS9saWIuYwpAQCAtMCwwICsx LDY4IEBACisvKgorICogbWlzY2VsbGFuZW91cyBoZWxwZXIgZnVuY3Rpb25zCisgKgorICogQ29w eXJpZ2h0IChjKSBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KKyAqIExpY2Vu c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZl cnNpb24gMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51 eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJld2lyZS5oPgorI2luY2x1ZGUgPGxpbnV4 L21vZHVsZS5oPgorI2luY2x1ZGUgImxpYi5oIgorCisjZGVmaW5lIEVSUk9SX1JFVFJZX0RFTEFZ X01TCTUKKworY29uc3QgY2hhciAqcmNvZGVfc3RyaW5nKHVuc2lnbmVkIGludCByY29kZSkKK3sK KwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbmFtZXNbXSA9IHsKKwkJW1JDT0RFX0NPTVBMRVRF XQk9ICJjb21wbGV0ZSIsCisJCVtSQ09ERV9DT05GTElDVF9FUlJPUl0JPSAiY29uZmxpY3QgZXJy b3IiLAorCQlbUkNPREVfREFUQV9FUlJPUl0JPSAiZGF0YSBlcnJvciIsCisJCVtSQ09ERV9UWVBF X0VSUk9SXQk9ICJ0eXBlIGVycm9yIiwKKwkJW1JDT0RFX0FERFJFU1NfRVJST1JdCT0gImFkZHJl c3MgZXJyb3IiLAorCQlbUkNPREVfU0VORF9FUlJPUl0JPSAic2VuZCBlcnJvciIsCisJCVtSQ09E RV9DQU5DRUxMRURdCT0gImNhbmNlbGxlZCIsCisJCVtSQ09ERV9CVVNZXQkJPSAiYnVzeSIsCisJ CVtSQ09ERV9HRU5FUkFUSU9OXQk9ICJnZW5lcmF0aW9uIiwKKwkJW1JDT0RFX05PX0FDS10JCT0g Im5vIGFjayIsCisJfTsKKworCWlmIChyY29kZSA8IEFSUkFZX1NJWkUobmFtZXMpICYmIG5hbWVz W3Jjb2RlXSkKKwkJcmV0dXJuIG5hbWVzW3Jjb2RlXTsKKwllbHNlCisJCXJldHVybiAidW5rbm93 biI7Cit9CitFWFBPUlRfU1lNQk9MKHJjb2RlX3N0cmluZyk7CisKK2ludCBzbmRfZndfdHJhbnNh Y3Rpb24oc3RydWN0IGZ3X3VuaXQgKnVuaXQsIGludCB0Y29kZSwKKwkJICAgICAgIHU2NCBvZmZz ZXQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgZndfZGV2aWNlICpk ZXZpY2UgPSBmd19wYXJlbnRfZGV2aWNlKHVuaXQpOworCWludCBnZW5lcmF0aW9uLCByY29kZSwg dHJpZXMgPSAwOworCisJZm9yICg7OykgeworCQlnZW5lcmF0aW9uID0gZGV2aWNlLT5nZW5lcmF0 aW9uOworCQlzbXBfcm1iKCk7IC8qIG5vZGVfaWQgdnMuIGdlbmVyYXRpb24gKi8KKwkJcmNvZGUg PSBmd19ydW5fdHJhbnNhY3Rpb24oZGV2aWNlLT5jYXJkLCB0Y29kZSwKKwkJCQkJICAgZGV2aWNl LT5ub2RlX2lkLCBnZW5lcmF0aW9uLAorCQkJCQkgICBkZXZpY2UtPm1heF9zcGVlZCwgb2Zmc2V0 LAorCQkJCQkgICBidWZmZXIsIGxlbmd0aCk7CisKKwkJaWYgKHJjb2RlID09IFJDT0RFX0NPTVBM RVRFKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKHJjb2RlX2lzX3Blcm1hbmVudF9lcnJvcihyY29k ZSkgfHwgKyt0cmllcyA+PSAzKSB7CisJCQlkZXZfZXJyKCZ1bml0LT5kZXZpY2UsICJ0cmFuc2Fj dGlvbiBmYWlsZWQ6ICVzXG4iLAorCQkJCXJjb2RlX3N0cmluZyhyY29kZSkpOworCQkJcmV0dXJu IC1FSU87CisJCX0KKworCQltc2xlZXAoRVJST1JfUkVUUllfREVMQVlfTVMpOworCX0KK30KK0VY UE9SVF9TWU1CT0woc25kX2Z3X3RyYW5zYWN0aW9uKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJG aXJlV2lyZSBhdWRpbyBoZWxwZXIgZnVuY3Rpb25zIik7CitNT0RVTEVfQVVUSE9SKCJDbGVtZW5z IExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIi KTsKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9maXJld2lyZS9saWIuaApAQCAtMCwwICsxLDE5 IEBACisjaWZuZGVmIFNPVU5EX0ZJUkVXSVJFX0xJQl9IX0lOQ0xVREVECisjZGVmaW5lIFNPVU5E X0ZJUkVXSVJFX0xJQl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxsaW51eC9maXJld2lyZS1jb25z dGFudHMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgZndfdW5pdDsKKwor aW50IHNuZF9md190cmFuc2FjdGlvbihzdHJ1Y3QgZndfdW5pdCAqdW5pdCwgaW50IHRjb2RlLAor CQkgICAgICAgdTY0IG9mZnNldCwgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKK2NvbnN0 IGNoYXIgKnJjb2RlX3N0cmluZyh1bnNpZ25lZCBpbnQgcmNvZGUpOworCisvKiByZXR1cm5zIHRy dWUgaWYgcmV0cnlpbmcgdGhlIHRyYW5zYWN0aW9uIHdvdWxkIG5vdCBtYWtlIHNlbnNlICovCitz dGF0aWMgaW5saW5lIGJvb2wgcmNvZGVfaXNfcGVybWFuZW50X2Vycm9yKGludCByY29kZSkKK3sK KwlyZXR1cm4gcmNvZGUgPT0gUkNPREVfVFlQRV9FUlJPUiB8fCByY29kZSA9PSBSQ09ERV9BRERS RVNTX0VSUk9SOworfQorCisjZW5kaWYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9maXJld2ly ZS9pc28tcmVzb3VyY2VzLmMKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBpc29jaHJvbm91cyBy ZXNvdXJjZXMgaGVscGVyIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgQ2xlbWVucyBM YWRpc2NoIDxjbGVtZW5zQGxhZGlzY2guZGU+CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIuCisgKi8KKworI2lu Y2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpcmV3aXJlLmg+CisjaW5j bHVkZSA8bGludXgvZmlyZXdpcmUtY29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmll cy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4K KyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgImlzby1yZXNvdXJjZXMuaCIK KworLyoqCisgKiBmd19pc29fcmVzb3VyY2VzX2luaXQgLSBpbml0aWFsaXplcyBhICZzdHJ1Y3Qg ZndfaXNvX3Jlc291cmNlcworICogQHI6IHRoZSByZXNvdXJjZSBtYW5hZ2VyIHRvIGluaXRpYWxp emUKKyAqIEB1bml0OiB0aGUgZGV2aWNlIHVuaXQgZm9yIHdoaWNoIHRoZSByZXNvdXJjZXMgd2ls bCBiZSBuZWVkZWQKKyAqCisgKiBJZiB0aGUgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgYWxsIGNo YW5uZWwgbnVtYmVycywgY2hhbmdlIEByLT5jaGFubmVsc19tYXNrCisgKiBhZnRlciBjYWxsaW5n IHRoaXMgZnVuY3Rpb24uCisgKi8KK3ZvaWQgZndfaXNvX3Jlc291cmNlc19pbml0KHN0cnVjdCBm d19pc29fcmVzb3VyY2VzICpyLCBzdHJ1Y3QgZndfdW5pdCAqdW5pdCkKK3sKKwlyLT5jaGFubmVs c19tYXNrID0gfjB1TEw7CisJci0+dW5pdCA9IGZ3X3VuaXRfZ2V0KHVuaXQpOworCW11dGV4X2lu aXQoJnItPm11dGV4KTsKKwlyLT5hbGxvY2F0ZWQgPSBmYWxzZTsKK30KKworLyoqCisgKiBmd19p c29fcmVzb3VyY2VzX2Rlc3Ryb3kgLSBkZXN0cm95IGEgcmVzb3VyY2UgbWFuYWdlcgorICogQHI6 IHRoZSByZXNvdXJjZSBtYW5hZ2VyIHRoYXQgaXMgbm8gbG9uZ2VyIG5lZWRlZAorICovCit2b2lk IGZ3X2lzb19yZXNvdXJjZXNfZGVzdHJveShzdHJ1Y3QgZndfaXNvX3Jlc291cmNlcyAqcikKK3sK KwlXQVJOX09OKHItPmFsbG9jYXRlZCk7CisJbXV0ZXhfZGVzdHJveSgmci0+bXV0ZXgpOworCWZ3 X3VuaXRfcHV0KHItPnVuaXQpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBhY2tldF9iYW5k d2lkdGgodW5zaWduZWQgaW50IG1heF9wYXlsb2FkX2J5dGVzLCBpbnQgc3BlZWQpCit7CisJdW5z aWduZWQgaW50IGJ5dGVzLCBzNDAwX2J5dGVzOworCisJLyogaXNvIHBhY2tldHMgaGF2ZSB0aHJl ZSBoZWFkZXIgcXVhZGxldHMgYW5kIHF1YWRsZXQtYWxpZ25lZCBwYXlsb2FkICovCisJYnl0ZXMg PSAzICogNCArIEFMSUdOKG1heF9wYXlsb2FkX2J5dGVzLCA0KTsKKworCS8qIGNvbnZlcnQgdG8g YmFuZHdpZHRoIHVuaXRzIChxdWFkbGV0cyBhdCBTMTYwMCA9IGJ5dGVzIGF0IFM0MDApICovCisJ aWYgKHNwZWVkIDw9IFNDT0RFXzQwMCkKKwkJczQwMF9ieXRlcyA9IGJ5dGVzICogKDEgPDwgKFND T0RFXzQwMCAtIHNwZWVkKSk7CisJZWxzZQorCQlzNDAwX2J5dGVzID0gRElWX1JPVU5EX1VQKGJ5 dGVzLCAxIDw8IChzcGVlZCAtIFNDT0RFXzQwMCkpOworCisJcmV0dXJuIHM0MDBfYnl0ZXM7Cit9 CisKK3N0YXRpYyBpbnQgY3VycmVudF9iYW5kd2lkdGhfb3ZlcmhlYWQoc3RydWN0IGZ3X2NhcmQg KmNhcmQpCit7CisJLyoKKwkgKiBVbmRlciB0aGUgdXN1YWwgcGVzc2ltaXN0aWMgYXNzdW1wdGlv biAoY2FibGUgbGVuZ3RoIDQuNSBtKSwgdGhlCisJICogaXNvY2hyb25vdXMgb3ZlcmhlYWQgZm9y IE4gY2FibGVzIGlzIDEuNzk3IMOCwrVzICsgTiAqIDAuNDk0IMOCwrVzLCBvcgorCSAqIDg4LjMg KyBOICogMjQuMyBpbiBiYW5kd2lkdGggdW5pdHMuCisJICoKKwkgKiBUaGUgY2FsY3VsYXRpb24g YmVsb3cgdHJpZXMgdG8gZGVkdWNlIE4gZnJvbSB0aGUgY3VycmVudCBnYXAgY291bnQuCisJICog SWYgdGhlIGdhcCBjb3VudCBoYXMgYmVlbiBvcHRpbWl6ZWQgYnkgbWVhc3VyaW5nIHRoZSBhY3R1 YWwgcGFja2V0CisJICogdHJhbnNtaXNzaW9uIHRpbWUsIHRoaXMgZGVyaXZlZCBvdmVyaGVhZCBz aG91bGQgYmUgbmVhciB0aGUgYWN0dWFsCisJICogb3ZlcmhlYWQgYXMgd2VsbC4KKwkgKi8KKwly ZXR1cm4gY2FyZC0+Z2FwX2NvdW50ICogOTcgLyAxMCArIDg5OworfQorCitzdGF0aWMgaW50IHdh aXRfaXNvY2hfcmVzb3VyY2VfZGVsYXlfYWZ0ZXJfYnVzX3Jlc2V0KHN0cnVjdCBmd19jYXJkICpj YXJkKQoreworCWZvciAoOzspIHsKKwkJczY0IGRlbGF5ID0gKGNhcmQtPnJlc2V0X2ppZmZpZXMg KyBIWikgLSBnZXRfamlmZmllc182NCgpOworCQlpZiAoZGVsYXkgPD0gMCkKKwkJCXJldHVybiAw OworCQlpZiAoc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKGRlbGF5KSA+IDApCisJCQly ZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KK30KKworLyoqCisgKiBmd19pc29fcmVzb3VyY2VzX2Fs bG9jYXRlIC0gYWxsb2NhdGUgaXNvY2hyb25vdXMgY2hhbm5lbCBhbmQgYmFuZHdpZHRoCisgKiBA cjogdGhlIHJlc291cmNlIG1hbmFnZXIKKyAqIEBtYXhfcGF5bG9hZF9ieXRlczogdGhlIGFtb3Vu dCBvZiBkYXRhIChpbmNsdWRpbmcgQ0lQIGhlYWRlcnMpIHBlciBwYWNrZXQKKyAqIEBzcGVlZDog dGhlIHNwZWVkIChlLmcuLCBTQ09ERV80MDApIGF0IHdoaWNoIHRoZSBwYWNrZXRzIHdpbGwgYmUg c2VudAorICoKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIG9uZSBpc29jaHJvbm91cyBjaGFu bmVsIGFuZCBlbm91Z2ggYmFuZHdpZHRoIGZvciB0aGUKKyAqIHNwZWNpZmllZCBwYWNrZXQgc2l6 ZS4KKyAqCisgKiBSZXR1cm5zIHRoZSBjaGFubmVsIG51bWJlciB0aGF0IHRoZSBjYWxsZXIgbXVz dCB1c2UgZm9yIHN0cmVhbWluZywgb3IKKyAqIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4gIER1ZSB0 byBwb3RlbnRpb25hbGx5IGxvbmcgZGVsYXlzLCB0aGlzIGZ1bmN0aW9uIGlzCisgKiBpbnRlcnJ1 cHRpYmxlIGFuZCBjYW4gcmV0dXJuIC1FUkVTVEFSVFNZUy4gIE9uIHN1Y2Nlc3MsIHRoZSBjYWxs ZXIgaXMKKyAqIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGZ3X2lzb19yZXNvdXJjZXNfdXBkYXRl KCkgb24gYnVzIHJlc2V0cywgYW5kCisgKiBmd19pc29fcmVzb3VyY2VzX2ZyZWUoKSB3aGVuIHRo ZSByZXNvdXJjZXMgYXJlIG5vdCBsb25nZXIgbmVlZGVkLgorICovCitpbnQgZndfaXNvX3Jlc291 cmNlc19hbGxvY2F0ZShzdHJ1Y3QgZndfaXNvX3Jlc291cmNlcyAqciwKKwkJCSAgICAgIHVuc2ln bmVkIGludCBtYXhfcGF5bG9hZF9ieXRlcywgaW50IHNwZWVkKQoreworCXN0cnVjdCBmd19jYXJk ICpjYXJkID0gZndfcGFyZW50X2RldmljZShyLT51bml0KS0+Y2FyZDsKKwlpbnQgYmFuZHdpZHRo LCBjaGFubmVsLCBlcnI7CisKKwlpZiAoV0FSTl9PTihyLT5hbGxvY2F0ZWQpKQorCQlyZXR1cm4g LUVCQURGRDsKKworCXItPmJhbmR3aWR0aCA9IHBhY2tldF9iYW5kd2lkdGgobWF4X3BheWxvYWRf Ynl0ZXMsIHNwZWVkKTsKKworcmV0cnlfYWZ0ZXJfYnVzX3Jlc2V0OgorCXNwaW5fbG9ja19pcnEo JmNhcmQtPmxvY2spOworCXItPmdlbmVyYXRpb24gPSBjYXJkLT5nZW5lcmF0aW9uOworCXItPmJh bmR3aWR0aF9vdmVyaGVhZCA9IGN1cnJlbnRfYmFuZHdpZHRoX292ZXJoZWFkKGNhcmQpOworCXNw aW5fdW5sb2NrX2lycSgmY2FyZC0+bG9jayk7CisKKwllcnIgPSB3YWl0X2lzb2NoX3Jlc291cmNl X2RlbGF5X2FmdGVyX2J1c19yZXNldChjYXJkKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVy cjsKKworCW11dGV4X2xvY2soJnItPm11dGV4KTsKKworCWJhbmR3aWR0aCA9IHItPmJhbmR3aWR0 aCArIHItPmJhbmR3aWR0aF9vdmVyaGVhZDsKKwlmd19pc29fcmVzb3VyY2VfbWFuYWdlKGNhcmQs IHItPmdlbmVyYXRpb24sIHItPmNoYW5uZWxzX21hc2ssCisJCQkgICAgICAgJmNoYW5uZWwsICZi YW5kd2lkdGgsIHRydWUsIHItPmJ1ZmZlcik7CisJaWYgKGNoYW5uZWwgPT0gLUVBR0FJTikgewor CQltdXRleF91bmxvY2soJnItPm11dGV4KTsKKwkJZ290byByZXRyeV9hZnRlcl9idXNfcmVzZXQ7 CisJfQorCWlmIChjaGFubmVsID49IDApIHsKKwkJci0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJCXIt PmFsbG9jYXRlZCA9IHRydWU7CisJfSBlbHNlIHsKKwkJaWYgKGNoYW5uZWwgPT0gLUVCVVNZKQor CQkJZGV2X2Vycigmci0+dW5pdC0+ZGV2aWNlLAorCQkJCSJpc29jaHJvbm91cyByZXNvdXJjZXMg ZXhoYXVzdGVkXG4iKTsKKwkJZWxzZQorCQkJZGV2X2Vycigmci0+dW5pdC0+ZGV2aWNlLAorCQkJ CSJpc29jaHJvbm91cyByZXNvdXJjZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJfQorCisJbXV0 ZXhfdW5sb2NrKCZyLT5tdXRleCk7CisKKwlyZXR1cm4gY2hhbm5lbDsKK30KKworLyoqCisgKiBm d19pc29fcmVzb3VyY2VzX3VwZGF0ZSAtIHVwZGF0ZSByZXNvdXJjZSBhbGxvY2F0aW9ucyBhZnRl ciBhIGJ1cyByZXNldAorICogQHI6IHRoZSByZXNvdXJjZSBtYW5hZ2VyCisgKgorICogVGhpcyBm dW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBkcml2ZXIncyAudXBkYXRlIGhhbmRsZXIg dG8gcmVhbGxvY2F0ZQorICogYW55IHJlc291cmNlcyB0aGF0IHdlcmUgYWxsb2NhdGVkIGJlZm9y ZSB0aGUgYnVzIHJlc2V0LiAgSXQgaXMgc2FmZSB0byBjYWxsCisgKiB0aGlzIGZ1bmN0aW9uIGlm IG5vIHJlc291cmNlcyBhcmUgY3VycmVudGx5IGFsbG9jYXRlZC4KKyAqCisgKiBSZXR1cm5zIGEg bmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLiAgSWYgdGhpcyBoYXBwZW5zLCB0aGUgY2Fs bGVyIG11c3QKKyAqIHN0b3Agc3RyZWFtaW5nLgorICovCitpbnQgZndfaXNvX3Jlc291cmNlc191 cGRhdGUoc3RydWN0IGZ3X2lzb19yZXNvdXJjZXMgKnIpCit7CisJc3RydWN0IGZ3X2NhcmQgKmNh cmQgPSBmd19wYXJlbnRfZGV2aWNlKHItPnVuaXQpLT5jYXJkOworCWludCBiYW5kd2lkdGgsIGNo YW5uZWw7CisKKwltdXRleF9sb2NrKCZyLT5tdXRleCk7CisKKwlpZiAoIXItPmFsbG9jYXRlZCkg eworCQltdXRleF91bmxvY2soJnItPm11dGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9s b2NrX2lycSgmY2FyZC0+bG9jayk7CisJci0+Z2VuZXJhdGlvbiA9IGNhcmQtPmdlbmVyYXRpb247 CisJci0+YmFuZHdpZHRoX292ZXJoZWFkID0gY3VycmVudF9iYW5kd2lkdGhfb3ZlcmhlYWQoY2Fy ZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjYXJkLT5sb2NrKTsKKworCWJhbmR3aWR0aCA9IHItPmJh bmR3aWR0aCArIHItPmJhbmR3aWR0aF9vdmVyaGVhZDsKKworCWZ3X2lzb19yZXNvdXJjZV9tYW5h Z2UoY2FyZCwgci0+Z2VuZXJhdGlvbiwgMXVMTCA8PCByLT5jaGFubmVsLAorCQkJICAgICAgICZj aGFubmVsLCAmYmFuZHdpZHRoLCB0cnVlLCByLT5idWZmZXIpOworCS8qCisJICogV2hlbiBhbm90 aGVyIGJ1cyByZXNldCBoYXBwZW5zLCBwcmV0ZW5kIHRoYXQgdGhlIGFsbG9jYXRpb24KKwkgKiBz dWNjZWVkZWQ7IHdlIHdpbGwgdHJ5IGFnYWluIGZvciB0aGUgbmV3IGdlbmVyYXRpb24gbGF0ZXIu CisJICovCisJaWYgKGNoYW5uZWwgPCAwICYmIGNoYW5uZWwgIT0gLUVBR0FJTikgeworCQlyLT5h bGxvY2F0ZWQgPSBmYWxzZTsKKwkJaWYgKGNoYW5uZWwgPT0gLUVCVVNZKQorCQkJZGV2X2Vycigm ci0+dW5pdC0+ZGV2aWNlLAorCQkJCSJpc29jaHJvbm91cyByZXNvdXJjZXMgZXhoYXVzdGVkXG4i KTsKKwkJZWxzZQorCQkJZGV2X2Vycigmci0+dW5pdC0+ZGV2aWNlLAorCQkJCSJpc29jaHJvbm91 cyByZXNvdXJjZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZy LT5tdXRleCk7CisKKwlyZXR1cm4gY2hhbm5lbDsKK30KKworLyoqCisgKiBmd19pc29fcmVzb3Vy Y2VzX2ZyZWUgLSBmcmVlcyBhbGxvY2F0ZWQgcmVzb3VyY2VzCisgKiBAcjogdGhlIHJlc291cmNl IG1hbmFnZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRlYWxsb2NhdGVzIHRoZSBjaGFubmVsIGFu ZCBiYW5kd2lkdGgsIGlmIGFsbG9jYXRlZC4KKyAqLwordm9pZCBmd19pc29fcmVzb3VyY2VzX2Zy ZWUoc3RydWN0IGZ3X2lzb19yZXNvdXJjZXMgKnIpCit7CisJc3RydWN0IGZ3X2NhcmQgKmNhcmQg PSBmd19wYXJlbnRfZGV2aWNlKHItPnVuaXQpLT5jYXJkOworCWludCBiYW5kd2lkdGgsIGNoYW5u ZWw7CisKKwltdXRleF9sb2NrKCZyLT5tdXRleCk7CisKKwlpZiAoci0+YWxsb2NhdGVkKSB7CisJ CWJhbmR3aWR0aCA9IHItPmJhbmR3aWR0aCArIHItPmJhbmR3aWR0aF9vdmVyaGVhZDsKKwkJZndf aXNvX3Jlc291cmNlX21hbmFnZShjYXJkLCByLT5nZW5lcmF0aW9uLCAxdUxMIDw8IHItPmNoYW5u ZWwsCisJCQkJICAgICAgICZjaGFubmVsLCAmYmFuZHdpZHRoLCBmYWxzZSwgci0+YnVmZmVyKTsK KwkJaWYgKGNoYW5uZWwgPCAwKQorCQkJZGV2X2Vycigmci0+dW5pdC0+ZGV2aWNlLAorCQkJCSJp c29jaHJvbm91cyByZXNvdXJjZSBkZWFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKworCQlyLT5hbGxv Y2F0ZWQgPSBmYWxzZTsKKwl9CisKKwltdXRleF91bmxvY2soJnItPm11dGV4KTsKK30KLS0tIC9k ZXYvbnVsbAorKysgYi9zb3VuZC9maXJld2lyZS9pc28tcmVzb3VyY2VzLmgKQEAgLTAsMCArMSwz OSBAQAorI2lmbmRlZiBTT1VORF9GSVJFV0lSRV9JU09fUkVTT1VSQ0VTX0hfSU5DTFVERUQKKyNk ZWZpbmUgU09VTkRfRklSRVdJUkVfSVNPX1JFU09VUkNFU19IX0lOQ0xVREVECisKKyNpbmNsdWRl IDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBmd191 bml0OworCisvKioKKyAqIHN0cnVjdCBmd19pc29fcmVzb3VyY2VzIC0gbWFuYWdlcyBjaGFubmVs L2JhbmR3aWR0aCBhbGxvY2F0aW9uCisgKiBAY2hhbm5lbHNfbWFzazogaWYgdGhlIGRldmljZSBk b2VzIG5vdCBzdXBwb3J0IGFsbCBjaGFubmVsIG51bWJlcnMsIHNldCB0aGlzCisgKiAgICAgICAg ICAgICAgICAgYml0IG1hc2sgdG8gc29tZXRoaW5nIGVsc2UgdGhhbiB0aGUgZGVmYXVsdCAoYWxs IG9uZXMpCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgbWFuYWdlcyAoZGUpYWxsb2NhdGlvbiBvZiBp c29jaHJvbm91cyByZXNvdXJjZXMgKGNoYW5uZWwgYW5kCisgKiBiYW5kd2lkdGgpIGZvciBvbmUg aXNvY2hyb25vdXMgc3RyZWFtLgorICovCitzdHJ1Y3QgZndfaXNvX3Jlc291cmNlcyB7CisJdTY0 IGNoYW5uZWxzX21hc2s7CisJLyogcHJpdmF0ZTogKi8KKwlzdHJ1Y3QgZndfdW5pdCAqdW5pdDsK KwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJdW5zaWduZWQgaW50IGNoYW5uZWw7CisJdW5zaWduZWQg aW50IGJhbmR3aWR0aDsgLyogaW4gYmFuZHdpZHRoIHVuaXRzLCB3aXRob3V0IG92ZXJoZWFkICov CisJdW5zaWduZWQgaW50IGJhbmR3aWR0aF9vdmVyaGVhZDsKKwlpbnQgZ2VuZXJhdGlvbjsgLyog aW4gd2hpY2ggYWxsb2NhdGlvbiBpcyB2YWxpZCAqLworCWJvb2wgYWxsb2NhdGVkOworCV9fYmUz MiBidWZmZXJbMl07Cit9OworCit2b2lkIGZ3X2lzb19yZXNvdXJjZXNfaW5pdChzdHJ1Y3QgZndf aXNvX3Jlc291cmNlcyAqciwKKwkJCSAgIHN0cnVjdCBmd191bml0ICp1bml0KTsKK3ZvaWQgZndf aXNvX3Jlc291cmNlc19kZXN0cm95KHN0cnVjdCBmd19pc29fcmVzb3VyY2VzICpyKTsKKworaW50 IGZ3X2lzb19yZXNvdXJjZXNfYWxsb2NhdGUoc3RydWN0IGZ3X2lzb19yZXNvdXJjZXMgKnIsCisJ CQkgICAgICB1bnNpZ25lZCBpbnQgbWF4X3BheWxvYWRfYnl0ZXMsIGludCBzcGVlZCk7CitpbnQg ZndfaXNvX3Jlc291cmNlc191cGRhdGUoc3RydWN0IGZ3X2lzb19yZXNvdXJjZXMgKnIpOwordm9p ZCBmd19pc29fcmVzb3VyY2VzX2ZyZWUoc3RydWN0IGZ3X2lzb19yZXNvdXJjZXMgKnIpOworCisj ZW5kaWYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9maXJld2lyZS9wYWNrZXRzLWJ1ZmZlci5j CkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBoZWxwZXJzIGZvciBtYW5hZ2luZyBhIGJ1ZmZlciBm b3IgbWFueSBwYWNrZXRzCisgKgorICogQ29weXJpZ2h0IChjKSBDbGVtZW5zIExhZGlzY2ggPGNs ZW1lbnNAbGFkaXNjaC5kZT4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi4KKyAqLworCisjaW5jbHVkZSA8bGlu dXgvZmlyZXdpcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSAicGFja2V0 cy1idWZmZXIuaCIKKworLyoqCisgKiBpc29fcGFja2V0c19idWZmZXJfaW5pdCAtIGFsbG9jYXRl cyB0aGUgbWVtb3J5IGZvciBwYWNrZXRzCisgKiBAYjogdGhlIGJ1ZmZlciBzdHJ1Y3R1cmUgdG8g aW5pdGlhbGl6ZQorICogQHVuaXQ6IHRoZSBkZXZpY2UgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUg c3RyZWFtCisgKiBAY291bnQ6IHRoZSBudW1iZXIgb2YgcGFja2V0cworICogQHBhY2tldF9zaXpl OiB0aGUgKG1heGltdW0pIHNpemUgb2YgYSBwYWNrZXQsIGluIGJ5dGVzCisgKiBAZGlyZWN0aW9u OiAlRE1BX1RPX0RFVklDRSBvciAlRE1BX0ZST01fREVWSUNFCisgKi8KK2ludCBpc29fcGFja2V0 c19idWZmZXJfaW5pdChzdHJ1Y3QgaXNvX3BhY2tldHNfYnVmZmVyICpiLCBzdHJ1Y3QgZndfdW5p dCAqdW5pdCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgY291bnQsIHVuc2lnbmVkIGludCBwYWNrZXRf c2l6ZSwKKwkJCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJdW5z aWduZWQgaW50IHBhY2tldHNfcGVyX3BhZ2UsIHBhZ2VzOworCXVuc2lnbmVkIGludCBpLCBwYWdl X2luZGV4LCBvZmZzZXRfaW5fcGFnZTsKKwl2b2lkICpwOworCWludCBlcnI7CisKKwliLT5wYWNr ZXRzID0ga21hbGxvYyhjb3VudCAqIHNpemVvZigqYi0+cGFja2V0cyksIEdGUF9LRVJORUwpOwor CWlmICghYi0+cGFja2V0cykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0K KworCXBhY2tldF9zaXplID0gTDFfQ0FDSEVfQUxJR04ocGFja2V0X3NpemUpOworCXBhY2tldHNf cGVyX3BhZ2UgPSBQQUdFX1NJWkUgLyBwYWNrZXRfc2l6ZTsKKwlpZiAoV0FSTl9PTighcGFja2V0 c19wZXJfcGFnZSkpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisJcGFn ZXMgPSBESVZfUk9VTkRfVVAoY291bnQsIHBhY2tldHNfcGVyX3BhZ2UpOworCisJZXJyID0gZndf aXNvX2J1ZmZlcl9pbml0KCZiLT5pc29fYnVmZmVyLCBmd19wYXJlbnRfZGV2aWNlKHVuaXQpLT5j YXJkLAorCQkJCSBwYWdlcywgZGlyZWN0aW9uKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJf cGFja2V0czsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisJCXBhZ2VfaW5kZXgg PSBpIC8gcGFja2V0c19wZXJfcGFnZTsKKwkJcCA9IHBhZ2VfYWRkcmVzcyhiLT5pc29fYnVmZmVy LnBhZ2VzW3BhZ2VfaW5kZXhdKTsKKwkJb2Zmc2V0X2luX3BhZ2UgPSAoaSAlIHBhY2tldHNfcGVy X3BhZ2UpICogcGFja2V0X3NpemU7CisJCWItPnBhY2tldHNbaV0uYnVmZmVyID0gcCArIG9mZnNl dF9pbl9wYWdlOworCQliLT5wYWNrZXRzW2ldLm9mZnNldCA9IHBhZ2VfaW5kZXggKiBQQUdFX1NJ WkUgKyBvZmZzZXRfaW5fcGFnZTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3BhY2tldHM6CisJ a2ZyZWUoYi0+cGFja2V0cyk7CitlcnJvcjoKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGlz b19wYWNrZXRzX2J1ZmZlcl9kZXN0cm95IC0gZnJlZXMgcGFja2V0IGJ1ZmZlciByZXNvdXJjZXMK KyAqIEBiOiB0aGUgYnVmZmVyIHN0cnVjdHVyZSB0byBmcmVlCisgKiBAdW5pdDogdGhlIGRldmlj ZSBhdCB0aGUgb3RoZXIgZW5kIG9mIHRoZSBzdHJlYW0KKyAqLwordm9pZCBpc29fcGFja2V0c19i dWZmZXJfZGVzdHJveShzdHJ1Y3QgaXNvX3BhY2tldHNfYnVmZmVyICpiLAorCQkJCXN0cnVjdCBm d191bml0ICp1bml0KQoreworCWZ3X2lzb19idWZmZXJfZGVzdHJveSgmYi0+aXNvX2J1ZmZlciwg ZndfcGFyZW50X2RldmljZSh1bml0KS0+Y2FyZCk7CisJa2ZyZWUoYi0+cGFja2V0cyk7Cit9Ci0t LSAvZGV2L251bGwKKysrIGIvc291bmQvZmlyZXdpcmUvcGFja2V0cy1idWZmZXIuaApAQCAtMCww ICsxLDI2IEBACisjaWZuZGVmIFNPVU5EX0ZJUkVXSVJFX1BBQ0tFVFNfQlVGRkVSX0hfSU5DTFVE RUQKKyNkZWZpbmUgU09VTkRfRklSRVdJUkVfUEFDS0VUU19CVUZGRVJfSF9JTkNMVURFRAorCisj aW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJld2lyZS5o PgorCisvKioKKyAqIHN0cnVjdCBpc29fcGFja2V0c19idWZmZXIgLSBtYW5hZ2VzIGEgYnVmZmVy IGZvciBtYW55IHBhY2tldHMKKyAqIEBpc29fYnVmZmVyOiB0aGUgbWVtb3J5IGNvbnRhaW5pbmcg dGhlIHBhY2tldHMKKyAqIEBwYWNrZXRzOiBhbiBhcnJheSwgd2l0aCBlYWNoIGVsZW1lbnQgcG9p bnRpbmcgdG8gb25lIHBhY2tldAorICovCitzdHJ1Y3QgaXNvX3BhY2tldHNfYnVmZmVyIHsKKwlz dHJ1Y3QgZndfaXNvX2J1ZmZlciBpc29fYnVmZmVyOworCXN0cnVjdCB7CisJCXZvaWQgKmJ1ZmZl cjsKKwkJdW5zaWduZWQgaW50IG9mZnNldDsKKwl9ICpwYWNrZXRzOworfTsKKworaW50IGlzb19w YWNrZXRzX2J1ZmZlcl9pbml0KHN0cnVjdCBpc29fcGFja2V0c19idWZmZXIgKmIsIHN0cnVjdCBm d191bml0ICp1bml0LAorCQkJICAgIHVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgaW50IHBh Y2tldF9zaXplLAorCQkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7Cit2 b2lkIGlzb19wYWNrZXRzX2J1ZmZlcl9kZXN0cm95KHN0cnVjdCBpc29fcGFja2V0c19idWZmZXIg KmIsCisJCQkJc3RydWN0IGZ3X3VuaXQgKnVuaXQpOworCisjZW5kaWYKLS0tIC9kZXYvbnVsbAor KysgYi9zb3VuZC9maXJld2lyZS9hbWR0cC5jCkBAIC0wLDAgKzEsNTExIEBACisvKgorICogQXVk aW8gYW5kIE11c2ljIERhdGEgVHJhbnNtaXNzaW9uIFByb3RvY29sIChJRUMgNjE4ODMtNikgc3Ry ZWFtcworICogd2l0aCBDb21tb24gSXNvY2hyb25vdXMgUGFja2V0IChJRUMgNjE4ODMtMSkgaGVh ZGVycworICoKKyAqIENvcHlyaWdodCAoYykgQ2xlbWVucyBMYWRpc2NoIDxjbGVtZW5zQGxhZGlz Y2guZGU+CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5o PgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpcmV3aXJlLmg+Cisj aW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1 ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgImFtZHRwLmgiCisKKyNkZWZpbmUgVElDS1NfUEVS X0NZQ0xFCQkzMDcyCisjZGVmaW5lIENZQ0xFU19QRVJfU0VDT05ECTgwMDAKKyNkZWZpbmUgVElD S1NfUEVSX1NFQ09ORAkoVElDS1NfUEVSX0NZQ0xFICogQ1lDTEVTX1BFUl9TRUNPTkQpCisKKyNk ZWZpbmUgVFJBTlNGRVJfREVMQVlfVElDS1MJMHgyZTAwIC8qIDQ3OS4xNyDDgsK1cyAqLworCisj ZGVmaW5lIFRBR19DSVAJCQkxCisKKyNkZWZpbmUgQ0lQX0VPSAkJCSgxdSA8PCAzMSkKKyNkZWZp bmUgQ0lQX0ZNVF9BTQkJKDB4MTAgPDwgMjQpCisjZGVmaW5lIEFNRFRQX0ZERl9BTTgyNAkJKDAg PDwgMTkpCisjZGVmaW5lIEFNRFRQX0ZERl9TRkNfU0hJRlQJMTYKKworLyogVE9ETzogbWFrZSB0 aGVzZSBjb25maWd1cmFibGUgKi8KKyNkZWZpbmUgSU5URVJSVVBUX0lOVEVSVkFMCTE2CisjZGVm aW5lIFFVRVVFX0xFTkdUSAkJNDgKKworLyoqCisgKiBhbWR0cF9vdXRfc3RyZWFtX2luaXQgLSBp bml0aWFsaXplIGFuIEFNRFRQIG91dHB1dCBzdHJlYW0gc3RydWN0dXJlCisgKiBAczogdGhlIEFN RFRQIG91dHB1dCBzdHJlYW0gdG8gaW5pdGlhbGl6ZQorICogQHVuaXQ6IHRoZSB0YXJnZXQgb2Yg dGhlIHN0cmVhbQorICogQGZsYWdzOiB0aGUgcGFja2V0IHRyYW5zbWlzc2lvbiBtZXRob2QgdG8g dXNlCisgKi8KK2ludCBhbWR0cF9vdXRfc3RyZWFtX2luaXQoc3RydWN0IGFtZHRwX291dF9zdHJl YW0gKnMsIHN0cnVjdCBmd191bml0ICp1bml0LAorCQkJICBlbnVtIGNpcF9vdXRfZmxhZ3MgZmxh Z3MpCit7CisJaWYgKGZsYWdzICE9IENJUF9OT05CTE9DS0lORykKKwkJcmV0dXJuIC1FSU5WQUw7 CisKKwlzLT51bml0ID0gZndfdW5pdF9nZXQodW5pdCk7CisJcy0+ZmxhZ3MgPSBmbGFnczsKKwlz LT5jb250ZXh0ID0gRVJSX1BUUigtMSk7CisJbXV0ZXhfaW5pdCgmcy0+bXV0ZXgpOworCisJcmV0 dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFtZHRwX291dF9zdHJlYW1faW5pdCk7CisKKy8qKgor ICogYW1kdHBfb3V0X3N0cmVhbV9kZXN0cm95IC0gZnJlZSBzdHJlYW0gcmVzb3VyY2VzCisgKiBA czogdGhlIEFNRFRQIG91dHB1dCBzdHJlYW0gdG8gZGVzdHJveQorICovCit2b2lkIGFtZHRwX291 dF9zdHJlYW1fZGVzdHJveShzdHJ1Y3QgYW1kdHBfb3V0X3N0cmVhbSAqcykKK3sKKwlXQVJOX09O KCFJU19FUlIocy0+Y29udGV4dCkpOworCW11dGV4X2Rlc3Ryb3koJnMtPm11dGV4KTsKKwlmd191 bml0X3B1dChzLT51bml0KTsKK30KK0VYUE9SVF9TWU1CT0woYW1kdHBfb3V0X3N0cmVhbV9kZXN0 cm95KTsKKworLyoqCisgKiBhbWR0cF9vdXRfc3RyZWFtX3NldF9yYXRlIC0gY29uZmlndXJlIHRo ZSBzYW1wbGluZyBmcmVxdWVuY3kKKyAqIEBzOiB0aGUgQU1EVFAgb3V0cHV0IHN0cmVhbSB0byBj b25maWd1cmUKKyAqIEByYXRlOiAzMjAwMCwgNDQxMDAsIDQ4MDAwLCA4ODIwMCwgOTYwMDAsIDE3 NjQwMCwgb3IgMTkyMDAwCisgKgorICogVGhlIHN0cmVhbSByYXRlIG11c3QgYmUgc2V0IGJlZm9y ZSB0aGUgc3RyZWFtIGlzIHN0YXJ0ZWQsIGFuZCBtdXN0IG5vdCBiZQorICogY2hhbmdlZCB3aGls ZSB0aGUgc3RyZWFtIGlzIHJ1bm5pbmcuCisgKi8KK3ZvaWQgYW1kdHBfb3V0X3N0cmVhbV9zZXRf cmF0ZShzdHJ1Y3QgYW1kdHBfb3V0X3N0cmVhbSAqcywgdW5zaWduZWQgaW50IHJhdGUpCit7CisJ c3RhdGljIGNvbnN0IHN0cnVjdCB7CisJCXVuc2lnbmVkIGludCByYXRlOworCQl1bnNpZ25lZCBp bnQgc3l0X2ludGVydmFsOworCX0gcmF0ZV9pbmZvW10gPSB7CisJCVtDSVBfU0ZDXzMyMDAwXSAg PSB7ICAzMjAwMCwgIDgsIH0sCisJCVtDSVBfU0ZDXzQ0MTAwXSAgPSB7ICA0NDEwMCwgIDgsIH0s CisJCVtDSVBfU0ZDXzQ4MDAwXSAgPSB7ICA0ODAwMCwgIDgsIH0sCisJCVtDSVBfU0ZDXzg4MjAw XSAgPSB7ICA4ODIwMCwgMTYsIH0sCisJCVtDSVBfU0ZDXzk2MDAwXSAgPSB7ICA5NjAwMCwgMTYs IH0sCisJCVtDSVBfU0ZDXzE3NjQwMF0gPSB7IDE3NjQwMCwgMzIsIH0sCisJCVtDSVBfU0ZDXzE5 MjAwMF0gPSB7IDE5MjAwMCwgMzIsIH0sCisJfTsKKwl1bnNpZ25lZCBpbnQgc2ZjOworCisJaWYg KFdBUk5fT04oIUlTX0VSUihzLT5jb250ZXh0KSkpCisJCXJldHVybjsKKworCWZvciAoc2ZjID0g MDsgc2ZjIDwgQVJSQVlfU0laRShyYXRlX2luZm8pOyArK3NmYykKKwkJaWYgKHJhdGVfaW5mb1tz ZmNdLnJhdGUgPT0gcmF0ZSkgeworCQkJcy0+c2ZjID0gc2ZjOworCQkJcy0+c3l0X2ludGVydmFs ID0gcmF0ZV9pbmZvW3NmY10uc3l0X2ludGVydmFsOworCQkJcmV0dXJuOworCQl9CisJV0FSTl9P TigxKTsKK30KK0VYUE9SVF9TWU1CT0woYW1kdHBfb3V0X3N0cmVhbV9zZXRfcmF0ZSk7CisKKy8q KgorICogYW1kdHBfb3V0X3N0cmVhbV9nZXRfbWF4X3BheWxvYWQgLSBnZXQgdGhlIHN0cmVhbSdz IHBhY2tldCBzaXplCisgKiBAczogdGhlIEFNRFRQIG91dHB1dCBzdHJlYW0KKyAqCisgKiBUaGlz IGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgdGhlIHN0cmVhbSBoYXMgYmVlbiBj b25maWd1cmVkCisgKiB3aXRoIGFtZHRwX291dF9zdHJlYW1fc2V0X3JhdGUoKSwgYW1kdHBfb3V0 X3N0cmVhbV9zZXRfcGNtKCksIGFuZAorICogYW1kdHBfb3V0X3N0cmVhbV9zZXRfbWlkaSgpLgor ICovCit1bnNpZ25lZCBpbnQgYW1kdHBfb3V0X3N0cmVhbV9nZXRfbWF4X3BheWxvYWQoc3RydWN0 IGFtZHRwX291dF9zdHJlYW0gKnMpCit7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtYXhf ZGF0YV9ibG9ja3NbXSA9IHsKKwkJW0NJUF9TRkNfMzIwMDBdICA9ICA0LAorCQlbQ0lQX1NGQ180 NDEwMF0gID0gIDYsCisJCVtDSVBfU0ZDXzQ4MDAwXSAgPSAgNiwKKwkJW0NJUF9TRkNfODgyMDBd ICA9IDEyLAorCQlbQ0lQX1NGQ185NjAwMF0gID0gMTIsCisJCVtDSVBfU0ZDXzE3NjQwMF0gPSAy MywKKwkJW0NJUF9TRkNfMTkyMDAwXSA9IDI0LAorCX07CisKKwlzLT5kYXRhX2Jsb2NrX3F1YWRs ZXRzID0gcy0+cGNtX2NoYW5uZWxzOworCXMtPmRhdGFfYmxvY2tfcXVhZGxldHMgKz0gRElWX1JP VU5EX1VQKHMtPm1pZGlfcG9ydHMsIDgpOworCisJcmV0dXJuIDggKyBtYXhfZGF0YV9ibG9ja3Nb cy0+c2ZjXSAqIDQgKiBzLT5kYXRhX2Jsb2NrX3F1YWRsZXRzOworfQorRVhQT1JUX1NZTUJPTChh bWR0cF9vdXRfc3RyZWFtX2dldF9tYXhfcGF5bG9hZCk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQg Y2FsY3VsYXRlX2RhdGFfYmxvY2tzKHN0cnVjdCBhbWR0cF9vdXRfc3RyZWFtICpzKQoreworCXVu c2lnbmVkIGludCBwaGFzZSwgZGF0YV9ibG9ja3M7CisKKwlpZiAoIWNpcF9zZmNfaXNfYmFzZV80 NDEwMChzLT5zZmMpKSB7CisJCS8qIFNhbXBsZV9yYXRlIC8gODAwMCBpcyBhbiBpbnRlZ2VyLCBh bmQgcHJlY29tcHV0ZWQuICovCisJCWRhdGFfYmxvY2tzID0gcy0+ZGF0YV9ibG9ja19zdGF0ZTsK Kwl9IGVsc2UgeworCQlwaGFzZSA9IHMtPmRhdGFfYmxvY2tfc3RhdGU7CisKKwkJLyoKKwkJICog VGhpcyBjYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgZGF0YSBibG9ja3MgcGVyIHBhY2tldCBzbyB0 aGF0CisJCSAqIDEpIHRoZSBvdmVyYWxsIHJhdGUgaXMgY29ycmVjdCBhbmQgZXhhY3RseSBzeW5j aHJvbml6ZWQgdG8KKwkJICogICAgdGhlIGJ1cyBjbG9jaywgYW5kCisJCSAqIDIpIHBhY2tldHMg d2l0aCBhIHJvdW5kZWQtdXAgbnVtYmVyIG9mIGJsb2NrcyBvY2N1ciBhcyBlYXJseQorCQkgKiAg ICBhcyBwb3NzaWJsZSBpbiB0aGUgc2VxdWVuY2UgKHRvIHByZXZlbnQgdW5kZXJydW5zIG9mIHRo ZQorCQkgKiAgICBkZXZpY2UncyBidWZmZXIpLgorCQkgKi8KKwkJaWYgKHMtPnNmYyA9PSBDSVBf U0ZDXzQ0MTAwKQorCQkJLyogNiA2IDUgNiA1IDYgNSAuLi4gKi8KKwkJCWRhdGFfYmxvY2tzID0g NSArICgocGhhc2UgJiAxKSBeCisJCQkJCSAgIChwaGFzZSA9PSAwIHx8IHBoYXNlID49IDQwKSk7 CisJCWVsc2UKKwkJCS8qIDEyIDExIDExIDExIDExIC4uLiBvciAyMyAyMiAyMiAyMiAyMiAuLi4g Ki8KKwkJCWRhdGFfYmxvY2tzID0gMTEgKiAocy0+c2ZjID4+IDEpICsgKHBoYXNlID09IDApOwor CQlpZiAoKytwaGFzZSA+PSAoODAgPj4gKHMtPnNmYyA+PiAxKSkpCisJCQlwaGFzZSA9IDA7CisJ CXMtPmRhdGFfYmxvY2tfc3RhdGUgPSBwaGFzZTsKKwl9CisKKwlyZXR1cm4gZGF0YV9ibG9ja3M7 Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FsY3VsYXRlX3N5dChzdHJ1Y3QgYW1kdHBfb3V0 X3N0cmVhbSAqcywgdW5zaWduZWQgaW50IGN5Y2xlKQoreworCXVuc2lnbmVkIGludCBzeXRfb2Zm c2V0LCBwaGFzZSwgaW5kZXgsIHN5dF9pbmRleCwgdGlja19vZmZzZXQsIHN5dDsKKworCWlmIChz LT5sYXN0X3N5dF9vZmZzZXQgPCBUSUNLU19QRVJfQ1lDTEUpIHsKKwkJaWYgKCFjaXBfc2ZjX2lz X2Jhc2VfNDQxMDAocy0+c2ZjKSkKKwkJCXN5dF9vZmZzZXQgPSBzLT5sYXN0X3N5dF9vZmZzZXQg KyBzLT5zeXRfb2Zmc2V0X3N0YXRlOworCQllbHNlIHsKKwkJLyoKKwkJICogVGhlIHRpbWUsIGlu IHRpY2tzLCBvZiB0aGUgbid0aCBTWVRfSU5URVJWQUwgc2FtcGxlIGlzOgorCQkgKiAgIG4gKiBT WVRfSU5URVJWQUwgKiAyNDU3NjAwMCAvIHNhbXBsZV9yYXRlCisJCSAqIE1vZHVsbyBUSUNLU19Q RVJfQ1lDTEUsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc3VjY2Vzc2l2ZQorCQkgKiBlbGVtZW50 cyBpcyBhYm91dCAxMzg2LjIzLiAgUm91bmRpbmcgdGhlIHJlc3VsdHMgb2YgdGhpcworCQkgKiBm b3JtdWxhIHRvIHRoZSBTWVQgcHJlY2lzaW9uIHJlc3VsdHMgaW4gYSBzZXF1ZW5jZSBvZgorCQkg KiBkaWZmZXJlbmNlcyB0aGF0IGJlZ2lucyB3aXRoOgorCQkgKiAgIDEzODYgMTM4NiAxMzg3IDEz ODYgMTM4NiAxMzg2IDEzODcgMTM4NiAxMzg2IDEzODYgMTM4NyAuLi4KKwkJICogVGhpcyBjb2Rl IGdlbmVyYXRlcyBfZXhhY3RseV8gdGhlIHNhbWUgc2VxdWVuY2UuCisJCSAqLworCQkJcGhhc2Ug PSBzLT5zeXRfb2Zmc2V0X3N0YXRlOworCQkJaW5kZXggPSBwaGFzZSAlIDEzOworCQkJc3l0X29m ZnNldCA9IHMtPmxhc3Rfc3l0X29mZnNldDsKKwkJCXN5dF9vZmZzZXQgKz0gMTM4NiArICgoaW5k ZXggJiYgIShpbmRleCAmIDMpKSB8fAorCQkJCQkgICAgICBwaGFzZSA9PSAxNDYpOworCQkJaWYg KCsrcGhhc2UgPj0gMTQ3KQorCQkJCXBoYXNlID0gMDsKKwkJCXMtPnN5dF9vZmZzZXRfc3RhdGUg PSBwaGFzZTsKKwkJfQorCX0gZWxzZQorCQlzeXRfb2Zmc2V0ID0gcy0+bGFzdF9zeXRfb2Zmc2V0 IC0gVElDS1NfUEVSX0NZQ0xFOworCXMtPmxhc3Rfc3l0X29mZnNldCA9IHN5dF9vZmZzZXQ7CisK KwlzeXRfaW5kZXggPSAtcy0+ZGF0YV9ibG9ja19jb3VudGVyICYgKHMtPnN5dF9pbnRlcnZhbCAt IDEpOworCXRpY2tfb2Zmc2V0ID0gVFJBTlNGRVJfREVMQVlfVElDS1MgLSBUSUNLU19QRVJfQ1lD TEUgKyBzeXRfb2Zmc2V0OworCXN5dCA9IChjeWNsZSArIHRpY2tfb2Zmc2V0IC8gVElDS1NfUEVS X0NZQ0xFKSA8PCAxMjsKKwlzeXQgKz0gdGlja19vZmZzZXQgJSBUSUNLU19QRVJfQ1lDTEU7CisK KwlyZXR1cm4gc3l0ICYgMHhmZmZmOworfQorCitzdGF0aWMgYm9vbCBhbWR0cF9maWxsX3BjbShz dHJ1Y3QgYW1kdHBfb3V0X3N0cmVhbSAqcywKKwkJCSAgIF9fYmUzMiAqYnVmZmVyLCB1bnNpZ25l ZCBpbnQgZnJhbWVzKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzLT5w Y20tPnJ1bnRpbWU7CisJdW5zaWduZWQgaW50IGNoYW5uZWxzLCByZW1haW5pbmdfZnJhbWVzLCBm cmFtZV9zdGVwLCBpLCBjLCBwdHI7CisJY29uc3Qgdm9pZCAqc3JjOworCisJY2hhbm5lbHMgPSBz LT5wY21fY2hhbm5lbHM7CisJc3JjID0gcnVudGltZS0+ZG1hX2FyZWEgKworCQkJcy0+cGNtX2J1 ZmZlcl9wb2ludGVyICogKHJ1bnRpbWUtPmZyYW1lX2JpdHMgLyA4KTsKKwlyZW1haW5pbmdfZnJh bWVzID0gcnVudGltZS0+YnVmZmVyX3NpemUgLSBzLT5wY21fYnVmZmVyX3BvaW50ZXI7CisJZnJh bWVfc3RlcCA9IHMtPmRhdGFfYmxvY2tfcXVhZGxldHMgLSBjaGFubmVsczsKKworCXN3aXRjaCAo cnVudGltZS0+Zm9ybWF0KSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMjoKKwkJZm9yIChp ID0gMDsgaSA8IGZyYW1lczsgKytpKSB7CisJCQlmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7ICsr YykgeworCQkJCSpidWZmZXIgPSBjcHVfdG9fYmUzMigoKihjb25zdCB1MzIgKilzcmMgPj4gOCkg fAorCQkJCQkJICAgICAgMHg0MDAwMDAwMCk7CisJCQkJc3JjICs9IDQ7CisJCQkJYnVmZmVyKys7 CisJCQl9CisJCQlidWZmZXIgKz0gZnJhbWVfc3RlcDsKKwkJCWlmICgtLXJlbWFpbmluZ19mcmFt ZXMgPT0gMCkKKwkJCQlzcmMgPSBydW50aW1lLT5kbWFfYXJlYTsKKwkJfQorCQlicmVhazsKKwor CWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTY6CisJCWZvciAoaSA9IDA7IGkgPCBmcmFtZXM7ICsr aSkgeworCQkJZm9yIChjID0gMDsgYyA8IGNoYW5uZWxzOyArK2MpIHsKKwkJCQkqYnVmZmVyID0g Y3B1X3RvX2JlMzIoKCooY29uc3QgdTE2ICopc3JjIDw8IDgpIHwKKwkJCQkJCSAgICAgIDB4NDAw MDAwMDApOworCQkJCXNyYyArPSAyOworCQkJCWJ1ZmZlcisrOworCQkJfQorCQkJYnVmZmVyICs9 IGZyYW1lX3N0ZXA7CisJCQlpZiAoLS1yZW1haW5pbmdfZnJhbWVzID09IDApCisJCQkJc3JjID0g cnVudGltZS0+ZG1hX2FyZWE7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcHRyID0gcy0+cGNtX2J1 ZmZlcl9wb2ludGVyICsgZnJhbWVzOworCWlmIChwdHIgPj0gcnVudGltZS0+YnVmZmVyX3NpemUp CisJCXB0ciAtPSBydW50aW1lLT5idWZmZXJfc2l6ZTsKKwlBQ0NFU1NfT05DRShzLT5wY21fYnVm ZmVyX3BvaW50ZXIpID0gcHRyOworCisJcy0+cGNtX3BlcmlvZF9wb2ludGVyICs9IGZyYW1lczsK KwlpZiAocy0+cGNtX3BlcmlvZF9wb2ludGVyID49IHJ1bnRpbWUtPnBlcmlvZF9zaXplKSB7CisJ CXMtPnBjbV9wZXJpb2RfcG9pbnRlciAtPSBydW50aW1lLT5wZXJpb2Rfc2l6ZTsKKwkJcmV0dXJu IHRydWU7CisJfSBlbHNlCisJCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgYW1kdHBf ZmlsbF9wY21fc2lsZW5jZShzdHJ1Y3QgYW1kdHBfb3V0X3N0cmVhbSAqcywKKwkJCQkgICBfX2Jl MzIgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGZyYW1lcykKK3sKKwl1bnNpZ25lZCBpbnQgaSwgYzsK KworCWZvciAoaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgeworCQlmb3IgKGMgPSAwOyBjIDwgcy0+ cGNtX2NoYW5uZWxzOyArK2MpCisJCQlidWZmZXJbY10gPSBjcHVfdG9fYmUzMigweDQwMDAwMDAw KTsKKwkJYnVmZmVyICs9IHMtPmRhdGFfYmxvY2tfcXVhZGxldHM7CisJfQorfQorCitzdGF0aWMg dm9pZCBhbWR0cF9maWxsX21pZGkoc3RydWN0IGFtZHRwX291dF9zdHJlYW0gKnMsCisJCQkgICAg X19iZTMyICpidWZmZXIsIHVuc2lnbmVkIGludCBmcmFtZXMpCit7CisJdW5zaWduZWQgaW50IGk7 CisKKwlmb3IgKGkgPSAwOyBpIDwgZnJhbWVzOyArK2kpCisJCWJ1ZmZlcltzLT5wY21fY2hhbm5l bHMgKyBpICogcy0+ZGF0YV9ibG9ja19xdWFkbGV0c10gPQorCQkJCQkJY3B1X3RvX2JlMzIoMHg4 MDAwMDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIHF1ZXVlX291dF9wYWNrZXQoc3RydWN0IGFtZHRw X291dF9zdHJlYW0gKnMsIHVuc2lnbmVkIGludCBjeWNsZSkKK3sKKwlfX2JlMzIgKmJ1ZmZlcjsK Kwl1bnNpZ25lZCBpbnQgZGF0YV9ibG9ja3MsIHN5dDsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJl YW0gKnBjbTsKKwlib29sIHBjbV9wZXJpb2RfZWxhcHNlZDsKKwlzdHJ1Y3QgZndfaXNvX3BhY2tl dCBwYWNrZXQ7CisJaW50IGVycjsKKworCWRhdGFfYmxvY2tzID0gY2FsY3VsYXRlX2RhdGFfYmxv Y2tzKHMpOworCXN5dCA9IGNhbGN1bGF0ZV9zeXQocywgY3ljbGUpOworCisJYnVmZmVyID0gcy0+ YnVmZmVyLnBhY2tldHNbcy0+cGFja2V0X2NvdW50ZXJdLmJ1ZmZlcjsKKwlidWZmZXJbMF0gPSBj cHVfdG9fYmUzMihBQ0NFU1NfT05DRShzLT5zb3VyY2Vfbm9kZV9pZF9maWVsZCkgfAorCQkJCShz LT5kYXRhX2Jsb2NrX3F1YWRsZXRzIDw8IDE2KSB8CisJCQkJcy0+ZGF0YV9ibG9ja19jb3VudGVy KTsKKwlidWZmZXJbMV0gPSBjcHVfdG9fYmUzMihDSVBfRU9IIHwgQ0lQX0ZNVF9BTSB8IEFNRFRQ X0ZERl9BTTgyNCB8CisJCQkJKHMtPnNmYyA8PCBBTURUUF9GREZfU0ZDX1NISUZUKSB8IHN5dCk7 CisJYnVmZmVyICs9IDI7CisKKwlwY20gPSBBQ0NFU1NfT05DRShzLT5wY20pOworCWlmIChwY20p CisJCXBjbV9wZXJpb2RfZWxhcHNlZCA9IGFtZHRwX2ZpbGxfcGNtKHMsIGJ1ZmZlciwgZGF0YV9i bG9ja3MpOworCWVsc2UgeworCQlhbWR0cF9maWxsX3BjbV9zaWxlbmNlKHMsIGJ1ZmZlciwgZGF0 YV9ibG9ja3MpOworCQlwY21fcGVyaW9kX2VsYXBzZWQgPSBmYWxzZTsKKwl9CisJaWYgKHMtPm1p ZGlfcG9ydHMpCisJCWFtZHRwX2ZpbGxfbWlkaShzLCBidWZmZXIsIGRhdGFfYmxvY2tzKTsKKwor CXMtPmRhdGFfYmxvY2tfY291bnRlciA9IChzLT5kYXRhX2Jsb2NrX2NvdW50ZXIgKyBkYXRhX2Js b2NrcykgJiAweGZmOworCisJcGFja2V0LnBheWxvYWRfbGVuZ3RoID0gOCArIGRhdGFfYmxvY2tz ICogNCAqIHMtPmRhdGFfYmxvY2tfcXVhZGxldHM7CisJcGFja2V0LmludGVycnVwdCA9IElTX0FM SUdORUQocy0+cGFja2V0X2NvdW50ZXIgKyAxLAorCQkJCSAgICAgIElOVEVSUlVQVF9JTlRFUlZB TCk7CisJcGFja2V0LnNraXAgPSAwOworCXBhY2tldC50YWcgPSBUQUdfQ0lQOworCXBhY2tldC5z eSA9IDA7CisJcGFja2V0LmhlYWRlcl9sZW5ndGggPSAwOworCisJZXJyID0gZndfaXNvX2NvbnRl eHRfcXVldWUocy0+Y29udGV4dCwgJnBhY2tldCwgJnMtPmJ1ZmZlci5pc29fYnVmZmVyLAorCQkJ CSAgIHMtPmJ1ZmZlci5wYWNrZXRzW3MtPnBhY2tldF9jb3VudGVyXS5vZmZzZXQpOworCWlmIChl cnIgPCAwKQorCQlkZXZfZXJyKCZzLT51bml0LT5kZXZpY2UsICJxdWV1ZWluZyBlcnJvcjogJWRc biIsIGVycik7CisKKwlpZiAoKytzLT5wYWNrZXRfY291bnRlciA+PSBRVUVVRV9MRU5HVEgpCisJ CXMtPnBhY2tldF9jb3VudGVyID0gMDsKKworCWlmIChwY21fcGVyaW9kX2VsYXBzZWQpCisJCXNu ZF9wY21fcGVyaW9kX2VsYXBzZWQocGNtKTsKK30KKworc3RhdGljIHZvaWQgb3V0X3BhY2tldF9j YWxsYmFjayhzdHJ1Y3QgZndfaXNvX2NvbnRleHQgKmNvbnRleHQsIHUzMiBjeWNsZSwKKwkJCQlz aXplX3QgaGVhZGVyX2xlbmd0aCwgdm9pZCAqaGVhZGVyLCB2b2lkICpkYXRhKQoreworCXN0cnVj dCBhbWR0cF9vdXRfc3RyZWFtICpzID0gZGF0YTsKKwl1bnNpZ25lZCBpbnQgaSwgcGFja2V0cyA9 IGhlYWRlcl9sZW5ndGggLyA0OworCisJLyoKKwkgKiBDb21wdXRlIHRoZSBjeWNsZSBvZiB0aGUg bGFzdCBxdWV1ZWQgcGFja2V0LgorCSAqIChXZSBuZWVkIG9ubHkgdGhlIGZvdXIgbG93ZXN0IGJp dHMgZm9yIHRoZSBTWVQsIHNvIHdlIGNhbiBpZ25vcmUKKwkgKiB0aGF0IGJpdHMgMC0xMSBtdXN0 IHdyYXAgYXJvdW5kIGF0IDMwNzIuKQorCSAqLworCWN5Y2xlICs9IFFVRVVFX0xFTkdUSCAtIHBh Y2tldHM7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFja2V0czsgKytpKQorCQlxdWV1ZV9vdXRfcGFj a2V0KHMsICsrY3ljbGUpOworfQorCitzdGF0aWMgaW50IHF1ZXVlX2luaXRpYWxfc2tpcF9wYWNr ZXRzKHN0cnVjdCBhbWR0cF9vdXRfc3RyZWFtICpzKQoreworCXN0cnVjdCBmd19pc29fcGFja2V0 IHNraXBfcGFja2V0ID0geworCQkuc2tpcCA9IDEsCisJfTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlp bnQgZXJyOworCisJZm9yIChpID0gMDsgaSA8IFFVRVVFX0xFTkdUSDsgKytpKSB7CisJCXNraXBf cGFja2V0LmludGVycnVwdCA9IElTX0FMSUdORUQocy0+cGFja2V0X2NvdW50ZXIgKyAxLAorCQkJ CQkJICAgSU5URVJSVVBUX0lOVEVSVkFMKTsKKwkJZXJyID0gZndfaXNvX2NvbnRleHRfcXVldWUo cy0+Y29udGV4dCwgJnNraXBfcGFja2V0LCBOVUxMLCAwKTsKKwkJaWYgKGVyciA8IDApCisJCQly ZXR1cm4gZXJyOworCQlpZiAoKytzLT5wYWNrZXRfY291bnRlciA+PSBRVUVVRV9MRU5HVEgpCisJ CQlzLT5wYWNrZXRfY291bnRlciA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICog YW1kdHBfb3V0X3N0cmVhbV9zdGFydCAtIHN0YXJ0IHNlbmRpbmcgcGFja2V0cworICogQHM6IHRo ZSBBTURUUCBvdXRwdXQgc3RyZWFtIHRvIHN0YXJ0CisgKiBAY2hhbm5lbDogdGhlIGlzb2Nocm9u b3VzIGNoYW5uZWwgb24gdGhlIGJ1cworICogQHNwZWVkOiBmaXJld2lyZSBzcGVlZCBjb2RlCisg KgorICogVGhlIHN0cmVhbSBjYW5ub3QgYmUgc3RhcnRlZCB1bnRpbCBpdCBoYXMgYmVlbiBjb25m aWd1cmVkIHdpdGgKKyAqIGFtZHRwX291dF9zdHJlYW1fc2V0X3JhdGUoKSwgYW1kdHBfb3V0X3N0 cmVhbV9zZXRfcGNtKCksIGFuZAorICogYW1kdHBfb3V0X3N0cmVhbV9zZXRfbWlkaSgpOyBhbmQg aXQgbXVzdCBiZSBzdGFydGVkIGJlZm9yZSBhbnkKKyAqIFBDTSBvciBNSURJIGRldmljZSBjYW4g YmUgc3RhcnRlZC4KKyAqLworaW50IGFtZHRwX291dF9zdHJlYW1fc3RhcnQoc3RydWN0IGFtZHRw X291dF9zdHJlYW0gKnMsIGludCBjaGFubmVsLCBpbnQgc3BlZWQpCit7CisJc3RhdGljIGNvbnN0 IHN0cnVjdCB7CisJCXVuc2lnbmVkIGludCBkYXRhX2Jsb2NrOworCQl1bnNpZ25lZCBpbnQgc3l0 X29mZnNldDsKKwl9IGluaXRpYWxfc3RhdGVbXSA9IHsKKwkJW0NJUF9TRkNfMzIwMDBdICA9IHsg IDQsIDMwNzIgfSwKKwkJW0NJUF9TRkNfNDgwMDBdICA9IHsgIDYsIDEwMjQgfSwKKwkJW0NJUF9T RkNfOTYwMDBdICA9IHsgMTIsIDEwMjQgfSwKKwkJW0NJUF9TRkNfMTkyMDAwXSA9IHsgMjQsIDEw MjQgfSwKKwkJW0NJUF9TRkNfNDQxMDBdICA9IHsgIDAsICAgNjcgfSwKKwkJW0NJUF9TRkNfODgy MDBdICA9IHsgIDAsICAgNjcgfSwKKwkJW0NJUF9TRkNfMTc2NDAwXSA9IHsgIDAsICAgNjcgfSwK Kwl9OworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZzLT5tdXRleCk7CisKKwlpZiAoV0FSTl9P TighSVNfRVJSKHMtPmNvbnRleHQpIHx8CisJCSAgICAoIXMtPnBjbV9jaGFubmVscyAmJiAhcy0+ bWlkaV9wb3J0cykpKSB7CisJCWVyciA9IC1FQkFERkQ7CisJCWdvdG8gZXJyX3VubG9jazsKKwl9 CisKKwlzLT5kYXRhX2Jsb2NrX3N0YXRlID0gaW5pdGlhbF9zdGF0ZVtzLT5zZmNdLmRhdGFfYmxv Y2s7CisJcy0+c3l0X29mZnNldF9zdGF0ZSA9IGluaXRpYWxfc3RhdGVbcy0+c2ZjXS5zeXRfb2Zm c2V0OworCXMtPmxhc3Rfc3l0X29mZnNldCA9IFRJQ0tTX1BFUl9DWUNMRTsKKworCWVyciA9IGlz b19wYWNrZXRzX2J1ZmZlcl9pbml0KCZzLT5idWZmZXIsIHMtPnVuaXQsIFFVRVVFX0xFTkdUSCwK KwkJCQkgICAgICBhbWR0cF9vdXRfc3RyZWFtX2dldF9tYXhfcGF5bG9hZChzKSwKKwkJCQkgICAg ICBETUFfVE9fREVWSUNFKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJfdW5sb2NrOworCisJ cy0+Y29udGV4dCA9IGZ3X2lzb19jb250ZXh0X2NyZWF0ZShmd19wYXJlbnRfZGV2aWNlKHMtPnVu aXQpLT5jYXJkLAorCQkJCQkgICBGV19JU09fQ09OVEVYVF9UUkFOU01JVCwKKwkJCQkJICAgY2hh bm5lbCwgc3BlZWQsIDAsCisJCQkJCSAgIG91dF9wYWNrZXRfY2FsbGJhY2ssIHMpOworCWlmIChJ U19FUlIocy0+Y29udGV4dCkpIHsKKwkJZXJyID0gUFRSX0VSUihzLT5jb250ZXh0KTsKKwkJaWYg KGVyciA9PSAtRUJVU1kpCisJCQlkZXZfZXJyKCZzLT51bml0LT5kZXZpY2UsCisJCQkJIm5vIGZy ZWUgb3V0cHV0IHN0cmVhbSBvbiB0aGlzIGNvbnRyb2xsZXJcbiIpOworCQlnb3RvIGVycl9idWZm ZXI7CisJfQorCisJYW1kdHBfb3V0X3N0cmVhbV91cGRhdGUocyk7CisKKwlzLT5wYWNrZXRfY291 bnRlciA9IDA7CisJcy0+ZGF0YV9ibG9ja19jb3VudGVyID0gMDsKKwllcnIgPSBxdWV1ZV9pbml0 aWFsX3NraXBfcGFja2V0cyhzKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJfY29udGV4dDsK KworCWVyciA9IGZ3X2lzb19jb250ZXh0X3N0YXJ0KHMtPmNvbnRleHQsIC0xLCAwLCAwKTsKKwlp ZiAoZXJyIDwgMCkKKwkJZ290byBlcnJfY29udGV4dDsKKworCW11dGV4X3VubG9jaygmcy0+bXV0 ZXgpOworCisJcmV0dXJuIDA7CisKK2Vycl9jb250ZXh0OgorCWZ3X2lzb19jb250ZXh0X2Rlc3Ry b3kocy0+Y29udGV4dCk7CisJcy0+Y29udGV4dCA9IEVSUl9QVFIoLTEpOworZXJyX2J1ZmZlcjoK Kwlpc29fcGFja2V0c19idWZmZXJfZGVzdHJveSgmcy0+YnVmZmVyLCBzLT51bml0KTsKK2Vycl91 bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZzLT5tdXRleCk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQ T1JUX1NZTUJPTChhbWR0cF9vdXRfc3RyZWFtX3N0YXJ0KTsKKworLyoqCisgKiBhbWR0cF9vdXRf c3RyZWFtX3VwZGF0ZSAtIHVwZGF0ZSB0aGUgc3RyZWFtIGFmdGVyIGEgYnVzIHJlc2V0CisgKiBA czogdGhlIEFNRFRQIG91dHB1dCBzdHJlYW0KKyAqLwordm9pZCBhbWR0cF9vdXRfc3RyZWFtX3Vw ZGF0ZShzdHJ1Y3QgYW1kdHBfb3V0X3N0cmVhbSAqcykKK3sKKwlBQ0NFU1NfT05DRShzLT5zb3Vy Y2Vfbm9kZV9pZF9maWVsZCkgPQorCQkoZndfcGFyZW50X2RldmljZShzLT51bml0KS0+Y2FyZC0+ bm9kZV9pZCAmIDB4M2YpIDw8IDI0OworfQorRVhQT1JUX1NZTUJPTChhbWR0cF9vdXRfc3RyZWFt X3VwZGF0ZSk7CisKKy8qKgorICogYW1kdHBfb3V0X3N0cmVhbV9zdG9wIC0gc3RvcCBzZW5kaW5n IHBhY2tldHMKKyAqIEBzOiB0aGUgQU1EVFAgb3V0cHV0IHN0cmVhbSB0byBzdG9wCisgKgorICog QWxsIFBDTSBhbmQgTUlESSBkZXZpY2VzIG9mIHRoZSBzdHJlYW0gbXVzdCBiZSBzdG9wcGVkIGJl Zm9yZSB0aGUgc3RyZWFtCisgKiBpdHNlbGYgY2FuIGJlIHN0b3BwZWQuCisgKi8KK3ZvaWQgYW1k dHBfb3V0X3N0cmVhbV9zdG9wKHN0cnVjdCBhbWR0cF9vdXRfc3RyZWFtICpzKQoreworCW11dGV4 X2xvY2soJnMtPm11dGV4KTsKKworCWlmIChJU19FUlIocy0+Y29udGV4dCkpIHsKKwkJbXV0ZXhf dW5sb2NrKCZzLT5tdXRleCk7CisJCXJldHVybjsKKwl9CisKKwlmd19pc29fY29udGV4dF9zdG9w KHMtPmNvbnRleHQpOworCWZ3X2lzb19jb250ZXh0X2Rlc3Ryb3kocy0+Y29udGV4dCk7CisJcy0+ Y29udGV4dCA9IEVSUl9QVFIoLTEpOworCWlzb19wYWNrZXRzX2J1ZmZlcl9kZXN0cm95KCZzLT5i dWZmZXIsIHMtPnVuaXQpOworCisJbXV0ZXhfdW5sb2NrKCZzLT5tdXRleCk7Cit9CitFWFBPUlRf U1lNQk9MKGFtZHRwX291dF9zdHJlYW1fc3RvcCk7CisKKy8qKgorICogYW1kdHBfb3V0X3N0cmVh bV9wY21fYWJvcnQgLSBhYm9ydCB0aGUgcnVubmluZyBQQ00gZGV2aWNlCisgKiBAczogdGhlIEFN RFRQIHN0cmVhbSBhYm91dCB0byBiZSBzdG9wcGVkCisgKgorICogSWYgdGhlIGlzb2Nocm9ub3Vz IHN0cmVhbSBuZWVkcyB0byBiZSBzdG9wcGVkIGFzeW5jaHJvbm91c2x5LCBjYWxsIHRoaXMKKyAq IGZ1bmN0aW9uIGZpcnN0IHRvIHN0b3AgdGhlIFBDTSBkZXZpY2UuCisgKi8KK3ZvaWQgYW1kdHBf b3V0X3N0cmVhbV9wY21fYWJvcnQoc3RydWN0IGFtZHRwX291dF9zdHJlYW0gKnMpCit7CisJc3Ry dWN0IHNuZF9wY21fc3Vic3RyZWFtICpwY207CisKKwlwY20gPSBBQ0NFU1NfT05DRShzLT5wY20p OworCWlmIChwY20pIHsKKwkJc25kX3BjbV9zdHJlYW1fbG9ja19pcnEocGNtKTsKKwkJaWYgKHNu ZF9wY21fcnVubmluZyhwY20pKQorCQkJc25kX3BjbV9zdG9wKHBjbSwgU05EUlZfUENNX1NUQVRF X1hSVU4pOworCQlzbmRfcGNtX3N0cmVhbV91bmxvY2tfaXJxKHBjbSk7CisJfQorfQorRVhQT1JU X1NZTUJPTChhbWR0cF9vdXRfc3RyZWFtX3BjbV9hYm9ydCk7Ci0tLSAvZGV2L251bGwKKysrIGIv c291bmQvZmlyZXdpcmUvYW1kdHAuaApAQCAtMCwwICsxLDE1MSBAQAorI2lmbmRlZiBTT1VORF9G SVJFV0lSRV9BTURUUF9IX0lOQ0xVREVECisjZGVmaW5lIFNPVU5EX0ZJUkVXSVJFX0FNRFRQX0hf SU5DTFVERUQKKworI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3Bp bmxvY2suaD4KKyNpbmNsdWRlICJwYWNrZXRzLWJ1ZmZlci5oIgorCisvKioKKyAqIGVudW0gY2lw X291dF9mbGFncyAtIGRlc2NyaWJlcyBkZXRhaWxzIG9mIHRoZSBzdHJlYW1pbmcgcHJvdG9jb2wK KyAqIEBDSVBfTk9OQkxPQ0tJTkc6IEluIG5vbi1ibG9ja2luZyBtb2RlLCBlYWNoIHBhY2tldCBj b250YWlucworICoJc2FtcGxlX3JhdGUvODAwMCBzYW1wbGVzLCB3aXRoIHJvdW5kaW5nIHVwIG9y IGRvd24gdG8gYWRqdXN0CisgKglmb3IgY2xvY2sgc2tldyBhbmQgbGVmdC1vdmVyIGZyYWN0aW9u YWwgc2FtcGxlcy4gIFRoaXMgc2hvdWxkCisgKgliZSB1c2VkIGlmIHN1cHBvcnRlZCBieSB0aGUg ZGV2aWNlLgorICovCitlbnVtIGNpcF9vdXRfZmxhZ3MgeworCUNJUF9OT05CTE9DS0lORyA9IDAs Cit9OworCisvKioKKyAqIGVudW0gY2lwX3NmYyAtIGEgc3RyZWFtJ3Mgc2FtcGxlIHJhdGUKKyAq LworZW51bSBjaXBfc2ZjIHsKKwlDSVBfU0ZDXzMyMDAwICA9IDAsCisJQ0lQX1NGQ180NDEwMCAg PSAxLAorCUNJUF9TRkNfNDgwMDAgID0gMiwKKwlDSVBfU0ZDXzg4MjAwICA9IDMsCisJQ0lQX1NG Q185NjAwMCAgPSA0LAorCUNJUF9TRkNfMTc2NDAwID0gNSwKKwlDSVBfU0ZDXzE5MjAwMCA9IDYs Cit9OworCisjZGVmaW5lIEFNRFRQX09VVF9QQ01fRk9STUFUX0JJVFMJKFNORFJWX1BDTV9GTVRC SVRfUzE2IHwgXAorCQkJCQkgU05EUlZfUENNX0ZNVEJJVF9TMzIpCisKK3N0cnVjdCBmd191bml0 Oworc3RydWN0IGZ3X2lzb19jb250ZXh0Oworc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtOworCitz dHJ1Y3QgYW1kdHBfb3V0X3N0cmVhbSB7CisJc3RydWN0IGZ3X3VuaXQgKnVuaXQ7CisJZW51bSBj aXBfb3V0X2ZsYWdzIGZsYWdzOworCXN0cnVjdCBmd19pc29fY29udGV4dCAqY29udGV4dDsKKwlz dHJ1Y3QgbXV0ZXggbXV0ZXg7CisKKwllbnVtIGNpcF9zZmMgc2ZjOworCXVuc2lnbmVkIGludCBk YXRhX2Jsb2NrX3F1YWRsZXRzOworCXVuc2lnbmVkIGludCBwY21fY2hhbm5lbHM7CisJdW5zaWdu ZWQgaW50IG1pZGlfcG9ydHM7CisKKwl1bnNpZ25lZCBpbnQgc3l0X2ludGVydmFsOworCXVuc2ln bmVkIGludCBzb3VyY2Vfbm9kZV9pZF9maWVsZDsKKwlzdHJ1Y3QgaXNvX3BhY2tldHNfYnVmZmVy IGJ1ZmZlcjsKKworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqcGNtOworCisJdW5zaWduZWQg aW50IHBhY2tldF9jb3VudGVyOworCXVuc2lnbmVkIGludCBkYXRhX2Jsb2NrX2NvdW50ZXI7CisK Kwl1bnNpZ25lZCBpbnQgZGF0YV9ibG9ja19zdGF0ZTsKKworCXVuc2lnbmVkIGludCBsYXN0X3N5 dF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHN5dF9vZmZzZXRfc3RhdGU7CisKKwl1bnNpZ25lZCBp bnQgcGNtX2J1ZmZlcl9wb2ludGVyOworCXVuc2lnbmVkIGludCBwY21fcGVyaW9kX3BvaW50ZXI7 Cit9OworCitpbnQgYW1kdHBfb3V0X3N0cmVhbV9pbml0KHN0cnVjdCBhbWR0cF9vdXRfc3RyZWFt ICpzLCBzdHJ1Y3QgZndfdW5pdCAqdW5pdCwKKwkJCSAgZW51bSBjaXBfb3V0X2ZsYWdzIGZsYWdz KTsKK3ZvaWQgYW1kdHBfb3V0X3N0cmVhbV9kZXN0cm95KHN0cnVjdCBhbWR0cF9vdXRfc3RyZWFt ICpzKTsKKwordm9pZCBhbWR0cF9vdXRfc3RyZWFtX3NldF9yYXRlKHN0cnVjdCBhbWR0cF9vdXRf c3RyZWFtICpzLCB1bnNpZ25lZCBpbnQgcmF0ZSk7Cit1bnNpZ25lZCBpbnQgYW1kdHBfb3V0X3N0 cmVhbV9nZXRfbWF4X3BheWxvYWQoc3RydWN0IGFtZHRwX291dF9zdHJlYW0gKnMpOworCitpbnQg YW1kdHBfb3V0X3N0cmVhbV9zdGFydChzdHJ1Y3QgYW1kdHBfb3V0X3N0cmVhbSAqcywgaW50IGNo YW5uZWwsIGludCBzcGVlZCk7Cit2b2lkIGFtZHRwX291dF9zdHJlYW1fdXBkYXRlKHN0cnVjdCBh bWR0cF9vdXRfc3RyZWFtICpzKTsKK3ZvaWQgYW1kdHBfb3V0X3N0cmVhbV9zdG9wKHN0cnVjdCBh bWR0cF9vdXRfc3RyZWFtICpzKTsKK3ZvaWQgYW1kdHBfb3V0X3N0cmVhbV9wY21fYWJvcnQoc3Ry dWN0IGFtZHRwX291dF9zdHJlYW0gKnMpOworCisvKioKKyAqIGFtZHRwX291dF9zdHJlYW1fc2V0 X3BjbSAtIGNvbmZpZ3VyZSBmb3JtYXQgb2YgUENNIHNhbXBsZXMKKyAqIEBzOiB0aGUgQU1EVFAg b3V0cHV0IHN0cmVhbSB0byBiZSBjb25maWd1cmVkCisgKiBAcGNtX2NoYW5uZWxzOiB0aGUgbnVt YmVyIG9mIFBDTSBzYW1wbGVzIGluIGVhY2ggZGF0YSBibG9jaywgdG8gYmUgZW5jb2RlZAorICog ICAgICAgICAgICAgICAgYXMgQU04MjQgbXVsdGktYml0IGxpbmVhciBhdWRpbworICoKKyAqIFRo aXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkIHdoaWxlIHRoZSBzdHJlYW0gaXMgcnVubmlu Zy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGFtZHRwX291dF9zdHJlYW1fc2V0X3BjbShzdHJ1 Y3QgYW1kdHBfb3V0X3N0cmVhbSAqcywKKwkJCQkJICAgIHVuc2lnbmVkIGludCBwY21fY2hhbm5l bHMpCit7CisJcy0+cGNtX2NoYW5uZWxzID0gcGNtX2NoYW5uZWxzOworfQorCisvKioKKyAqIGFt ZHRwX291dF9zdHJlYW1fc2V0X21pZGkgLSBjb25maWd1cmUgZm9ybWF0IG9mIE1JREkgZGF0YQor ICogQHM6IHRoZSBBTURUUCBvdXRwdXQgc3RyZWFtIHRvIGJlIGNvbmZpZ3VyZWQKKyAqIEBtaWRp X3BvcnRzOiB0aGUgbnVtYmVyIG9mIE1JREkgcG9ydHMgKGkuZS4sIE1QWC1NSURJIERhdGEgQ2hh bm5lbHMpCisgKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBjYWxsZWQgd2hpbGUgdGhl IHN0cmVhbSBpcyBydW5uaW5nLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYW1kdHBfb3V0X3N0 cmVhbV9zZXRfbWlkaShzdHJ1Y3QgYW1kdHBfb3V0X3N0cmVhbSAqcywKKwkJCQkJICAgICB1bnNp Z25lZCBpbnQgbWlkaV9wb3J0cykKK3sKKwlzLT5taWRpX3BvcnRzID0gbWlkaV9wb3J0czsKK30K KworLyoqCisgKiBhbWR0cF9vdXRfc3RyZWFtX3BjbV9wcmVwYXJlIC0gcHJlcGFyZSBQQ00gZGV2 aWNlIGZvciBydW5uaW5nCisgKiBAczogdGhlIEFNRFRQIG91dHB1dCBzdHJlYW0KKyAqCisgKiBU aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgUENNIGRldmljZSdzIC5wcmVw YXJlIGNhbGxiYWNrLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYW1kdHBfb3V0X3N0cmVhbV9w Y21fcHJlcGFyZShzdHJ1Y3QgYW1kdHBfb3V0X3N0cmVhbSAqcykKK3sKKwlzLT5wY21fYnVmZmVy X3BvaW50ZXIgPSAwOworCXMtPnBjbV9wZXJpb2RfcG9pbnRlciA9IDA7Cit9CisKKy8qKgorICog YW1kdHBfb3V0X3N0cmVhbV9wY21fdHJpZ2dlciAtIHN0YXJ0L3N0b3AgcGxheWJhY2sgZnJvbSBh IFBDTSBkZXZpY2UKKyAqIEBzOiB0aGUgQU1EVFAgb3V0cHV0IHN0cmVhbQorICogQHBjbTogdGhl IFBDTSBkZXZpY2UgdG8gYmUgc3RhcnRlZCwgb3IgJU5VTEwgdG8gc3RvcCB0aGUgY3VycmVudCBk ZXZpY2UKKyAqCisgKiBDYWxsIHRoaXMgZnVuY3Rpb24gb24gYSBydW5uaW5nIGlzb2Nocm9ub3Vz IHN0cmVhbSB0byBlbmFibGUgdGhlIGFjdHVhbAorICogdHJhbnNtaXNzaW9uIG9mIFBDTSBkYXRh LiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIFBDTQorICogZGV2aWNl J3MgLnRyaWdnZXIgY2FsbGJhY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhbWR0cF9vdXRf c3RyZWFtX3BjbV90cmlnZ2VyKHN0cnVjdCBhbWR0cF9vdXRfc3RyZWFtICpzLAorCQkJCQkJc3Ry dWN0IHNuZF9wY21fc3Vic3RyZWFtICpwY20pCit7CisJQUNDRVNTX09OQ0Uocy0+cGNtKSA9IHBj bTsKK30KKworLyoqCisgKiBhbWR0cF9vdXRfc3RyZWFtX3BjbV9wb2ludGVyIC0gZ2V0IHRoZSBQ Q00gYnVmZmVyIHBvc2l0aW9uCisgKiBAczogdGhlIEFNRFRQIG91dHB1dCBzdHJlYW0gdGhhdCB0 cmFuc3BvcnRzIHRoZSBQQ00gZGF0YQorICoKKyAqIFJldHVybnMgdGhlIGN1cnJlbnQgYnVmZmVy IHBvc2l0aW9uLCBpbiBmcmFtZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwor YW1kdHBfb3V0X3N0cmVhbV9wY21fcG9pbnRlcihzdHJ1Y3QgYW1kdHBfb3V0X3N0cmVhbSAqcykK K3sKKwlyZXR1cm4gQUNDRVNTX09OQ0Uocy0+cGNtX2J1ZmZlcl9wb2ludGVyKTsKK30KKworc3Rh dGljIGlubGluZSBib29sIGNpcF9zZmNfaXNfYmFzZV80NDEwMChlbnVtIGNpcF9zZmMgc2ZjKQor eworCXJldHVybiBzZmMgJiAxOworfQorCisjZW5kaWYKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpU aGUgdWx0aW1hdGUgYWxsLWluLW9uZSBwZXJmb3JtYW5jZSB0b29sa2l0OiBJbnRlbChSKSBQYXJh bGxlbCBTdHVkaW8gWEU6ClBpbnBvaW50IG1lbW9yeSBhbmQgdGhyZWFkaW5nIGVycm9ycyBiZWZv cmUgdGhleSBoYXBwZW4uCkZpbmQgYW5kIGZpeCBtb3JlIHRoYW4gMjUwIHNlY3VyaXR5IGRlZmVj dHMgaW4gdGhlIGRldmVsb3BtZW50IGN5Y2xlLgpMb2NhdGUgYm90dGxlbmVja3MgaW4gc2VyaWFs IGFuZCBwYXJhbGxlbCBjb2RlIHRoYXQgbGltaXQgcGVyZm9ybWFuY2UuCmh0dHA6Ly9wLnNmLm5l dC9zZnUvaW50ZWwtZGV2MmRldmZlYgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwptYWlsaW5nIGxpc3QgbGludXgxMzk0LWRldmVsQGxpc3RzLnNvdXJjZWZv cmdlLm5ldApodHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9saW51 eDEzOTQtZGV2ZWwK