From mboxrd@z Thu Jan 1 00:00:00 1970 From: Takashi Sakamoto Subject: [PATCH 28/39] bebob: Add commands and connections/streams management Date: Wed, 5 Mar 2014 19:48:16 +0900 Message-ID: <1394016507-15761-29-git-send-email-o-takashi@sakamocchi.jp> References: <5316963F.1000206@sakamocchi.jp> <1394016507-15761-1-git-send-email-o-takashi@sakamocchi.jp> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from smtp311.phy.lolipop.jp (smtp311.phy.lolipop.jp [210.157.22.79]) by alsa0.perex.cz (Postfix) with ESMTP id 1DF0F265903 for ; Wed, 5 Mar 2014 11:49:20 +0100 (CET) In-Reply-To: <1394016507-15761-1-git-send-email-o-takashi@sakamocchi.jp> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org To: clemens@ladisch.de, tiwai@suse.de, perex@perex.cz Cc: alsa-devel@alsa-project.org, ffado-devel@lists.sf.net List-Id: alsa-devel@alsa-project.org VGhpcyBjb21taXQgYWRkcyBtYW5hZ2VtZW50IGZ1bmN0aW9uYWxpdHkgZm9yIGNvbm5lY3Rpb25z IGFuZCBzdHJlYW1zLgpCZUJvQiB1c2VzIENNUCB0byBtYW5hZ2UgY29ubmVjdGlvbnMgYW5kIHVz ZXMgQU1EVFAgZm9yIHN0cmVhbXMuCgpUaGlzIGNvbW1pdCBhbHNvIGFkZHMgc29tZSBCcmlkZ2VD bydzIEFWL0MgZXh0ZW5zaW9uIGNvbW1hbmRzLiBUaGVyZSBhcmUgbWFueQpCcmlkZ2VDbydzIEFW L0MgZXh0ZW5zaW9uIGNvbW1hbmRzIGJ1dCB0aGlzIGNvbW1pdCBhZGRzIGJlbG93IGNvbW1hbmRz IHRvIGdldApkZXZpY2UncyBjYXBhYmlsaXR5IGFuZCBzdGF0dXM6CgogMS5FeHRlbmRlZCBQbHVn IEluZm8gY29tbWFuZHMKICAtIFBsdWcgQ2hhbm5lbCBQb3NpdGlvbiBTcGVjaWZpYyBEYXRhCiAg LSBQbHVnIFR5cGUgU3BlY2lmaWMgRGF0YQogIC0gQ2x1c3RlcihTZWN0aW9uKSBJbmZvIFNwZWNp ZmljIERhdGEKICAtIFBsdWcgSW5wdXQgU3BlY2lmaWMgRGF0YQogMi5FeHRlbmRlZCBTdHJlYW0g Rm9ybWF0IEluZm9ybWF0aW9uIGNvbW1hbmRzCiAgLSBFeHRlbmRlZCBTdHJlYW0gRm9ybWF0IElu Zm9ybWF0aW9uIENvbW1hbmQgLSBTaW5nbGUgUmVxdWVzdAoKRm9yIEV4dGVuZGVkIFBsdWcgSW5m byBjb21tYW5kcyBmb3IgQ2x1c3RlciBJbmZvIFNwZWNpZmljIERhdGEsIEkgcGljayB1cAonc2Vj dGlvbicgaW5zdGVhZCBvZiAnY2x1c3RlcicgZnJvbSBkb2N1bWVudCB0byBwcmV2ZW50IGZyb20g bWlzdW5kZXJzdGFuZGluZwpiZWNhdXNlICdjbHVzdGVyJyBpcyBhbHNvIHVzZWQgaW4gSUVDIDYx ODgzLTYuCi0tLQogc291bmQvZmlyZXdpcmUvYmVib2IvTWFrZWZpbGUgICAgICAgIHwgICAyICst CiBzb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYi5jICAgICAgICAgfCAgMTAgKwogc291bmQvZmly ZXdpcmUvYmVib2IvYmVib2IuaCAgICAgICAgIHwgMTIyICsrKysrKwogc291bmQvZmlyZXdpcmUv YmVib2IvYmVib2JfY29tbWFuZC5jIHwgMjczICsrKysrKysrKysrKwogc291bmQvZmlyZXdpcmUv YmVib2IvYmVib2Jfc3RyZWFtLmMgIHwgNzg0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrCiA1IGZpbGVzIGNoYW5nZWQsIDExOTAgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigt KQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iX2NvbW1hbmQu YwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iX3N0cmVhbS5j CgpkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvYmVib2IvTWFrZWZpbGUgYi9zb3VuZC9maXJl d2lyZS9iZWJvYi9NYWtlZmlsZQppbmRleCBjNmYwMTQxLi41Y2VjZTYyIDEwMDY0NAotLS0gYS9z b3VuZC9maXJld2lyZS9iZWJvYi9NYWtlZmlsZQorKysgYi9zb3VuZC9maXJld2lyZS9iZWJvYi9N YWtlZmlsZQpAQCAtMSwyICsxLDIgQEAKLXNuZC1iZWJvYi1vYmpzIDo9IGJlYm9iLm8KK3NuZC1i ZWJvYi1vYmpzIDo9IGJlYm9iX2NvbW1hbmQubyBiZWJvYl9zdHJlYW0ubyBiZWJvYi5vCiBvYmot bSArPSBzbmQtYmVib2IubwpkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2Iu YyBiL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iLmMKaW5kZXggMzYyNjU1Ny4uMzlmZTE3YyAx MDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2IuYworKysgYi9zb3VuZC9maXJl d2lyZS9iZWJvYi9iZWJvYi5jCkBAIC0xNTcsNiArMTU3LDE0IEBAIGJlYm9iX3Byb2JlKHN0cnVj dCBmd191bml0ICp1bml0LAogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm9yOwogCisJZXJyID0g c25kX2JlYm9iX3N0cmVhbV9kaXNjb3ZlcihiZWJvYik7CisJaWYgKGVyciA8IDApCisJCWdvdG8g ZXJyb3I7CisKKwllcnIgPSBzbmRfYmVib2Jfc3RyZWFtX2luaXRfZHVwbGV4KGJlYm9iKTsKKwlp ZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKwogCWVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNh cmQpOwogCWlmIChlcnIgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CkBAIC0xNzksMTIg KzE4NywxNCBAQCBiZWJvYl91cGRhdGUoc3RydWN0IGZ3X3VuaXQgKnVuaXQpCiB7CiAJc3RydWN0 IHNuZF9iZWJvYiAqYmVib2IgPSBkZXZfZ2V0X2RydmRhdGEoJnVuaXQtPmRldmljZSk7CiAJZmNw X2J1c19yZXNldChiZWJvYi0+dW5pdCk7CisJc25kX2JlYm9iX3N0cmVhbV91cGRhdGVfZHVwbGV4 KGJlYm9iKTsKIH0KIAogCiBzdGF0aWMgdm9pZCBiZWJvYl9yZW1vdmUoc3RydWN0IGZ3X3VuaXQg KnVuaXQpCiB7CiAJc3RydWN0IHNuZF9iZWJvYiAqYmVib2IgPSBkZXZfZ2V0X2RydmRhdGEoJnVu aXQtPmRldmljZSk7CisJc25kX2JlYm9iX3N0cmVhbV9kZXN0cm95X2R1cGxleChiZWJvYik7CiAJ c25kX2NhcmRfZGlzY29ubmVjdChiZWJvYi0+Y2FyZCk7CiAJc25kX2NhcmRfZnJlZV93aGVuX2Ns b3NlZChiZWJvYi0+Y2FyZCk7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9iZWJvYi9i ZWJvYi5oIGIvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2IuaAppbmRleCAxNzNmNDU1OC4uYjNh NjQxYyAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2IuaAorKysgYi9zb3Vu ZC9maXJld2lyZS9iZWJvYi9iZWJvYi5oCkBAIC0yMywxMSArMjMsMjUgQEAKIAogI2luY2x1ZGUg Ii4uL2xpYi5oIgogI2luY2x1ZGUgIi4uL2ZjcC5oIgorI2luY2x1ZGUgIi4uL3BhY2tldHMtYnVm ZmVyLmgiCisjaW5jbHVkZSAiLi4vaXNvLXJlc291cmNlcy5oIgorI2luY2x1ZGUgIi4uL2FtZHRw LmgiCisjaW5jbHVkZSAiLi4vY21wLmgiCiAKIC8qIGJhc2ljIHJlZ2lzdGVyIGFkZHJlc3NlcyBv biBETTEwMDAgKi8KICNkZWZpbmUgQkVCT0JfQUREUl9SRUdfSU5GTwkweGZmZmZjODAyMDAwMAog I2RlZmluZSBCRUJPQl9BRERSX1JFR19SRVEJMHhmZmZmYzgwMjEwMDAKIAorc3RydWN0IHNuZF9i ZWJvYjsKKworI2RlZmluZSBTTkRfQkVCT0JfU1RSTV9GTVRfRU5UUklFUwk3CitzdHJ1Y3Qgc25k X2JlYm9iX3N0cmVhbV9mb3JtYXRpb24geworCXVuc2lnbmVkIGludCBwY207CisJdW5zaWduZWQg aW50IG1pZGk7Cit9OworLyogdGhpcyBpcyBhIGxvb2t1cCB0YWJsZSBmb3IgaW5kZXggb2Ygc3Ry ZWFtIGZvcm1hdGlvbnMgKi8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgc25kX2JlYm9iX3Jh dGVfdGFibGVbU05EX0JFQk9CX1NUUk1fRk1UX0VOVFJJRVNdOworCiBzdHJ1Y3Qgc25kX2JlYm9i IHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IGZ3X3VuaXQgKnVuaXQ7CkBAIC0z NSw2ICs0OSwyMyBAQCBzdHJ1Y3Qgc25kX2JlYm9iIHsKIAogCXN0cnVjdCBtdXRleCBtdXRleDsK IAlzcGlubG9ja190IGxvY2s7CisKKwl1bnNpZ25lZCBpbnQgbWlkaV9pbnB1dF9wb3J0czsKKwl1 bnNpZ25lZCBpbnQgbWlkaV9vdXRwdXRfcG9ydHM7CisKKwlzdHJ1Y3QgY21wX2Nvbm5lY3Rpb24g b3V0X2Nvbm47CisJc3RydWN0IGFtZHRwX3N0cmVhbSB0eF9zdHJlYW07CisJc3RydWN0IGNtcF9j b25uZWN0aW9uIGluX2Nvbm47CisJc3RydWN0IGFtZHRwX3N0cmVhbSByeF9zdHJlYW07CisJdW5z aWduZWQgaW50IGNhcHR1cmVfc3Vic3RyZWFtczsKKwl1bnNpZ25lZCBpbnQgcGxheWJhY2tfc3Vi c3RyZWFtczsKKworCXN0cnVjdCBzbmRfYmVib2Jfc3RyZWFtX2Zvcm1hdGlvbgorCQl0eF9zdHJl YW1fZm9ybWF0aW9uc1tTTkRfQkVCT0JfU1RSTV9GTVRfRU5UUklFU107CisJc3RydWN0IHNuZF9i ZWJvYl9zdHJlYW1fZm9ybWF0aW9uCisJCXJ4X3N0cmVhbV9mb3JtYXRpb25zW1NORF9CRUJPQl9T VFJNX0ZNVF9FTlRSSUVTXTsKKworCWludCBzeW5jX2lucHV0X3BsdWc7CiB9OwogCiBzdGF0aWMg aW5saW5lIGludApAQCAtNTMsNiArODQsOTcgQEAgc25kX2JlYm9iX3JlYWRfcXVhZChzdHJ1Y3Qg ZndfdW5pdCAqdW5pdCwgdTY0IGFkZHIsIHUzMiAqYnVmKQogCQkJCSAgKHZvaWQgKilidWYsIHNp emVvZih1MzIpLCAwKTsKIH0KIAorLyoKKyAqIEFWQyBjb21tYW5kIGV4dGVuc2lvbnMsIEFWL0Mg VW5pdCBhbmQgU3VidW5pdCwgUmV2aXNpb24gMTcKKyAqIChOb3YgMjAwMywgQnJpZGdlQ28pCisg Ki8KKyNkZWZpbmUJQVZDX0JSSURHRUNPX0FERFJfQllURVMJNgorZW51bSBhdmNfYnJpZGdlY29f cGx1Z19kaXIgeworCUFWQ19CUklER0VDT19QTFVHX0RJUl9JTgk9IDB4MDAsCisJQVZDX0JSSURH RUNPX1BMVUdfRElSX09VVAk9IDB4MDEKK307CitlbnVtIGF2Y19icmlkZ2Vjb19wbHVnX21vZGUg eworCUFWQ19CUklER0VDT19QTFVHX01PREVfVU5JVAkJPSAweDAwLAorCUFWQ19CUklER0VDT19Q TFVHX01PREVfU1VCVU5JVAkJPSAweDAxLAorCUFWQ19CUklER0VDT19QTFVHX01PREVfRlVOQ1RJ T05fQkxPQ0sJPSAweDAyCit9OworZW51bSBhdmNfYnJpZGdlY29fcGx1Z191bml0IHsKKwlBVkNf QlJJREdFQ09fUExVR19VTklUX0lTT0MJPSAweDAwLAorCUFWQ19CUklER0VDT19QTFVHX1VOSVRf RVhUCT0gMHgwMSwKKwlBVkNfQlJJREdFQ09fUExVR19VTklUX0FTWU5DCT0gMHgwMgorfTsKK2Vu dW0gYXZjX2JyaWRnZWNvX3BsdWdfdHlwZSB7CisJQVZDX0JSSURHRUNPX1BMVUdfVFlQRV9JU09D CT0gMHgwMCwKKwlBVkNfQlJJREdFQ09fUExVR19UWVBFX0FTWU5DCT0gMHgwMSwKKwlBVkNfQlJJ REdFQ09fUExVR19UWVBFX01JREkJPSAweDAyLAorCUFWQ19CUklER0VDT19QTFVHX1RZUEVfU1lO Qwk9IDB4MDMsCisJQVZDX0JSSURHRUNPX1BMVUdfVFlQRV9BTkEJPSAweDA0LAorCUFWQ19CUklE R0VDT19QTFVHX1RZUEVfRElHCT0gMHgwNQorfTsKK3N0YXRpYyBpbmxpbmUgdm9pZAorYXZjX2Jy aWRnZWNvX2ZpbGxfdW5pdF9hZGRyKHU4IGJ1ZltBVkNfQlJJREdFQ09fQUREUl9CWVRFU10sCisJ CQkgICAgZW51bSBhdmNfYnJpZGdlY29fcGx1Z19kaXIgZGlyLAorCQkJICAgIGVudW0gYXZjX2Jy aWRnZWNvX3BsdWdfdW5pdCB1bml0LAorCQkJICAgIHVuc2lnbmVkIGludCBwaWQpCit7CisJYnVm WzBdID0gMHhmZjsJLyogVW5pdCAqLworCWJ1ZlsxXSA9IGRpcjsKKwlidWZbMl0gPSBBVkNfQlJJ REdFQ09fUExVR19NT0RFX1VOSVQ7CisJYnVmWzNdID0gdW5pdDsKKwlidWZbNF0gPSAweGZmICYg cGlkOworCWJ1Zls1XSA9IDB4ZmY7CS8qIHJlc2VydmVkICovCit9CitzdGF0aWMgaW5saW5lIHZv aWQKK2F2Y19icmlkZ2Vjb19maWxsX3N1YnVuaXRfYWRkcih1OCBidWZbQVZDX0JSSURHRUNPX0FE RFJfQllURVNdLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBtb2RlLAorCQkJICAgICAgIGVudW0g YXZjX2JyaWRnZWNvX3BsdWdfZGlyIGRpciwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcGlkKQor eworCWJ1ZlswXSA9IDB4ZmYgJiBtb2RlOwkvKiBTdWJ1bml0ICovCisJYnVmWzFdID0gZGlyOwor CWJ1ZlsyXSA9IEFWQ19CUklER0VDT19QTFVHX01PREVfU1VCVU5JVDsKKwlidWZbM10gPSAweGZm ICYgcGlkOworCWJ1Zls0XSA9IDB4ZmY7CS8qIHJlc2VydmVkICovCisJYnVmWzVdID0gMHhmZjsJ LyogcmVzZXJ2ZWQgKi8KK30KK2ludCBhdmNfYnJpZGdlY29fZ2V0X3BsdWdfY2hfcG9zKHN0cnVj dCBmd191bml0ICp1bml0LAorCQkJCSB1OCBhZGRbQVZDX0JSSURHRUNPX0FERFJfQllURVNdLAor CQkJCSB1OCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKTsKK2ludCBhdmNfYnJpZGdlY29fZ2V0X3Bs dWdfdHlwZShzdHJ1Y3QgZndfdW5pdCAqdW5pdCwKKwkJCSAgICAgICB1OCBhZGRyW0FWQ19CUklE R0VDT19BRERSX0JZVEVTXSwKKwkJCSAgICAgICBlbnVtIGF2Y19icmlkZ2Vjb19wbHVnX3R5cGUg KnR5cGUpOworaW50IGF2Y19icmlkZ2Vjb19nZXRfcGx1Z19zZWN0aW9uX3R5cGUoc3RydWN0IGZ3 X3VuaXQgKnVuaXQsCisJCQkJICAgICAgIHU4IGFkZHJbQVZDX0JSSURHRUNPX0FERFJfQllURVNd LAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9pZCwgdTggKmN0eXBlKTsKK2ludCBh dmNfYnJpZGdlY29fZ2V0X3BsdWdfaW5wdXQoc3RydWN0IGZ3X3VuaXQgKnVuaXQsCisJCQkJdTgg YWRkcltBVkNfQlJJREdFQ09fQUREUl9CWVRFU10sCisJCQkJdTggaW5wdXRbN10pOworaW50IGF2 Y19icmlkZ2Vjb19nZXRfcGx1Z19zdHJtX2ZtdChzdHJ1Y3QgZndfdW5pdCAqdW5pdCwKKwkJCQkg ICB1OCBhZGRyW0FWQ19CUklER0VDT19BRERSX0JZVEVTXSwKKwkJCQkgICB1bnNpZ25lZCBpbnQg ZW50cnlpZCwgdTggKmJ1ZiwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKmxlbik7CisKK2ludCBzbmRf YmVib2JfZ2V0X3JhdGUoc3RydWN0IHNuZF9iZWJvYiAqYmVib2IsIHVuc2lnbmVkIGludCAqcmF0 ZSwKKwkJICAgICAgIGVudW0gYXZjX2dlbmVyYWxfcGx1Z19kaXIgZGlyKTsKK2ludCBzbmRfYmVi b2Jfc2V0X3JhdGUoc3RydWN0IHNuZF9iZWJvYiAqYmVib2IsIHVuc2lnbmVkIGludCByYXRlLAor CQkgICAgICAgZW51bSBhdmNfZ2VuZXJhbF9wbHVnX2RpciBkaXIpOworCisvKiBmb3IgQU1EVFAg c3RyZWFtaW5nICovCitpbnQgc25kX2JlYm9iX3N0cmVhbV9nZXRfcmF0ZShzdHJ1Y3Qgc25kX2Jl Ym9iICpiZWJvYiwgdW5zaWduZWQgaW50ICpyYXRlKTsKK2ludCBzbmRfYmVib2Jfc3RyZWFtX3Nl dF9yYXRlKHN0cnVjdCBzbmRfYmVib2IgKmJlYm9iLCB1bnNpZ25lZCBpbnQgcmF0ZSk7CitpbnQg c25kX2JlYm9iX3N0cmVhbV9jaGVja19pbnRlcm5hbF9jbG9jayhzdHJ1Y3Qgc25kX2JlYm9iICpi ZWJvYiwKKwkJCQkJICBib29sICppbnRlcm5hbCk7CitpbnQgc25kX2JlYm9iX3N0cmVhbV9kaXNj b3ZlcihzdHJ1Y3Qgc25kX2JlYm9iICpiZWJvYik7CitpbnQgc25kX2JlYm9iX3N0cmVhbV9tYXAo c3RydWN0IHNuZF9iZWJvYiAqYmVib2IsCisJCQkgc3RydWN0IGFtZHRwX3N0cmVhbSAqc3RyZWFt KTsKK2ludCBzbmRfYmVib2Jfc3RyZWFtX2luaXRfZHVwbGV4KHN0cnVjdCBzbmRfYmVib2IgKmJl Ym9iKTsKK2ludCBzbmRfYmVib2Jfc3RyZWFtX3N0YXJ0X2R1cGxleChzdHJ1Y3Qgc25kX2JlYm9i ICpiZWJvYiwKKwkJCQkgIHN0cnVjdCBhbWR0cF9zdHJlYW0gKnN0cmVhbSwKKwkJCQkgICB1bnNp Z25lZCBpbnQgc2FtcGxpbmdfcmF0ZSk7CitpbnQgc25kX2JlYm9iX3N0cmVhbV9zdG9wX2R1cGxl eChzdHJ1Y3Qgc25kX2JlYm9iICpiZWJvYik7Cit2b2lkIHNuZF9iZWJvYl9zdHJlYW1fdXBkYXRl X2R1cGxleChzdHJ1Y3Qgc25kX2JlYm9iICpiZWJvYik7Cit2b2lkIHNuZF9iZWJvYl9zdHJlYW1f ZGVzdHJveV9kdXBsZXgoc3RydWN0IHNuZF9iZWJvYiAqYmVib2IpOworCiAjZGVmaW5lIFNORF9C RUJPQl9ERVZfRU5UUlkodmVuZG9yLCBtb2RlbCkgXAogeyBcCiAJLm1hdGNoX2ZsYWdzCT0gSUVF RTEzOTRfTUFUQ0hfVkVORE9SX0lEIHwgXApkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvYmVi b2IvYmVib2JfY29tbWFuZC5jIGIvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2JfY29tbWFuZC5j Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYmExM2QKLS0tIC9kZXYvbnVs bAorKysgYi9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYl9jb21tYW5kLmMKQEAgLTAsMCArMSwy NzMgQEAKKy8qCisgKiBiZWJvYl9jb21tYW5kLmMgLSBkcml2ZXIgZm9yIEJlQm9CIGJhc2VkIGRl dmljZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGFrYXNoaSBTYWthbW90bworICoKKyAq IExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UsIHZlcnNpb24gMi4KKyAqLworCisjaW5jbHVkZSAiLi9iZWJvYi5oIgorCisjZGVmaW5lIEJF Qk9CX0NPTU1BTkRfTUFYX1RSSUFMCTMKKyNkZWZpbmUgQkVCT0JfQ09NTUFORF9XQUlUX01TRUMJ MTAwCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYXZjX2JyaWRnZWNvX2ZpbGxfY29tbWFuZF9iYXNl KHU4ICpidWYsIHVuc2lnbmVkIGludCBjdHlwZSwgdW5zaWduZWQgaW50IG9wY29kZSwKKwkJCSAg ICAgICB1bnNpZ25lZCBpbnQgc3ViZnVuY3Rpb24sCisJCQkgICAgICAgdTggYWRkcltBVkNfQlJJ REdFQ09fQUREUl9CWVRFU10pCit7CisJYnVmWzBdID0gMHg3ICYgY3R5cGU7CisJYnVmWzFdID0g YWRkclswXTsKKwlidWZbMl0gPSAweGZmICYgb3Bjb2RlOworCWJ1ZlszXSA9IDB4ZmYgJiBzdWJm dW5jdGlvbjsKKwlidWZbNF0gPSBhZGRyWzFdOworCWJ1Zls1XSA9IGFkZHJbMl07CisJYnVmWzZd ID0gYWRkclszXTsKKwlidWZbN10gPSBhZGRyWzRdOworCWJ1Zls4XSA9IGFkZHJbNV07Cit9CisK K2ludCBhdmNfYnJpZGdlY29fZ2V0X3BsdWdfdHlwZShzdHJ1Y3QgZndfdW5pdCAqdW5pdCwKKwkJ CSAgICAgICB1OCBhZGRyW0FWQ19CUklER0VDT19BRERSX0JZVEVTXSwKKwkJCSAgICAgICBlbnVt IGF2Y19icmlkZ2Vjb19wbHVnX3R5cGUgKnR5cGUpCit7CisJdTggKmJ1ZjsKKwlpbnQgZXJyOwor CisJYnVmID0ga3phbGxvYygxMiwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQly ZXR1cm4gLUVOT01FTTsKKworCS8qIHN0YXR1cyBmb3IgcGx1ZyBpbmZvIHdpdGggYnJpZGdlY28g ZXh0ZW5zaW9uICovCisJYXZjX2JyaWRnZWNvX2ZpbGxfY29tbWFuZF9iYXNlKGJ1ZiwgMHgwMSwg MHgwMiwgMHhjMCwgYWRkcik7CisJYnVmWzldICA9IDB4MDA7CQkvKiBpbmZvIHR5cGUgaXMgJ3Bs dWcgdHlwZScgKi8KKwlidWZbMTBdID0gMHhmZjsJCS8qIHBsdWcgdHlwZSBpbiByZXNwb25zZSAq LworCisJLyogZG8gdHJhbnNhY3Rpb24gYW5kIGNoZWNrIGJ1ZlsxLTcsOV0gYXJlIHRoZSBzYW1l IGFnYWluc3QgY29tbWFuZCAqLworCWVyciA9IGZjcF9hdmNfdHJhbnNhY3Rpb24odW5pdCwgYnVm LCAxMiwgYnVmLCAxMiwKKwkJCQkgIEJJVCgxKSB8IEJJVCgyKSB8IEJJVCgzKSB8IEJJVCg0KSB8 IEJJVCg1KSB8CisJCQkJICBCSVQoNikgfCBCSVQoNykgfCBCSVQoOSkpOworCWlmIChlcnIgPCAw KQorCQlnb3RvIGVuZDsKKwkvKiBJTVBMRU1FTlRFRC9TVEFCTEUgaXMgT0sgKi8KKwllbHNlIGlm ICgoZXJyIDwgNikgfHwgKGJ1ZlswXSAhPSAweDBjKSkgeworCQllcnIgPSAtRUlPOworCQlnb3Rv IGVuZDsKKwl9CisKKwkqdHlwZSA9IGJ1ZlsxMF07CisJZXJyID0gMDsKK2VuZDoKKwlrZnJlZShi dWYpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBhdmNfYnJpZGdlY29fZ2V0X3BsdWdfY2hfcG9z KHN0cnVjdCBmd191bml0ICp1bml0LAorCQkJCSB1OCBhZGRyW0FWQ19CUklER0VDT19BRERSX0JZ VEVTXSwKKwkJCQkgdTggKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBpbnQg dHJpYWw7CisJaW50IGVycjsKKworCS8qIGNoZWNrIGdpdmVuIGJ1ZmZlciAqLworCWlmICgoYnVm ID09IE5VTEwpIHx8IChsZW4gPCAyNTYpKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZW5k OworCX0KKworCS8qIHN0YXR1cyBmb3IgcGx1ZyBpbmZvIHdpdGggYnJpZGdlY28gZXh0ZW5zaW9u ICovCisJYXZjX2JyaWRnZWNvX2ZpbGxfY29tbWFuZF9iYXNlKGJ1ZiwgMHgwMSwgMHgwMiwgMHhj MCwgYWRkcik7CisKKwkvKiBpbmZvIHR5cGUgaXMgJ2NoYW5uZWwgcG9zaXRpb24nICovCisJYnVm WzldID0gMHgwMzsKKworCS8qCisJICogTk9URToKKwkgKiBNLUF1ZGlvIEZpcmV3aXJlIDQxMCBy ZXR1cm5zIDB4MDkgKEFDQ0VQVEVEKSBqdXN0IGFmdGVyIGNoYW5naW5nCisJICogc2lnbmFsIGZv cm1hdCBldmVuIGlmIHRoaXMgY29tbWFuZCBhc2tzIFNUQVRVUy4gVGhpcyBpcyBub3QgaW4KKwkg KiBBVi9DIGNvbW1hbmQgc3BlY2lmaWNhdGlvbi4KKwkgKi8KKwlmb3IgKHRyaWFsID0gMDsgdHJp YWwgPCBCRUJPQl9DT01NQU5EX01BWF9UUklBTDsgdHJpYWwrKykgeworCQkvKiBkbyB0cmFuc2Fj dGlvbiBhbmQgY2hlY2sgYnVmWzEtNyw5XSBhcmUgdGhlIHNhbWUgKi8KKwkJZXJyID0gZmNwX2F2 Y190cmFuc2FjdGlvbih1bml0LCBidWYsIDEyLCBidWYsIDI1NiwKKwkJCQkJICBCSVQoMSkgfCBC SVQoMikgfCBCSVQoMykgfCBCSVQoNCkgfAorCQkJCQkgIEJJVCg1KSB8IEJJVCg2KSB8IEJJVCg3 KSB8IEJJVCg5KSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlbmQ7CisJCWVsc2UgaWYgKGVy ciA8IDYpIHsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIGVuZDsKKwkJfSBlbHNlIGlmIChidWZb MF0gPT0gMHgwYykKKwkJCWJyZWFrOworCQllbHNlIGlmICh0cmlhbCA8IEJFQk9CX0NPTU1BTkRf TUFYX1RSSUFMKQorCQkJbXNsZWVwKEJFQk9CX0NPTU1BTkRfV0FJVF9NU0VDKTsKKwkJZWxzZSB7 CisJCQllcnIgPSAtRUlPOworCQkJZ290byBlbmQ7CisJCX0KKwl9CisKKwkvKiBzdHJpcCBjb21t YW5kIGhlYWRlciAqLworCW1lbW1vdmUoYnVmLCBidWYgKyAxMCwgZXJyIC0gMTApOworCWVyciA9 IDA7CitlbmQ6CisJcmV0dXJuIGVycjsKK30KKworaW50IGF2Y19icmlkZ2Vjb19nZXRfcGx1Z19z ZWN0aW9uX3R5cGUoc3RydWN0IGZ3X3VuaXQgKnVuaXQsCisJCQkJICAgICAgIHU4IGFkZHJbQVZD X0JSSURHRUNPX0FERFJfQllURVNdLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9p ZCwgdTggKnR5cGUpCit7CisJdTggKmJ1ZjsKKwlpbnQgZXJyOworCisJLyogc2VjdGlvbiBpbmZv IGluY2x1ZGVzIGNoYXJhY3RvcnMgYnV0IHRoaXMgbW9kdWxlIGRvbid0IG5lZWQgaXQgKi8KKwli dWYgPSBremFsbG9jKDEyLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVy biAtRU5PTUVNOworCisJLyogc3RhdHVzIGZvciBwbHVnIGluZm8gd2l0aCBicmlkZ2VjbyBleHRl bnNpb24gKi8KKwlhdmNfYnJpZGdlY29fZmlsbF9jb21tYW5kX2Jhc2UoYnVmLCAweDAxLCAweDAy LCAweGMwLCBhZGRyKTsKKworCWJ1Zls5XSA9IDB4MDc7CQkvKiBpbmZvIHR5cGUgaXMgJ3NlY3Rp b24gaW5mbycgKi8KKwlidWZbMTBdID0gMHhmZiAmIChzZWN0aW9uX2lkICsgMSk7CS8qIHNlY3Rp b24gaWQgKi8KKwlidWZbMTFdID0gMHgwMDsJCS8qIHR5cGUgaW4gcmVzcG9uc2UgKi8KKworCS8q IGRvIHRyYW5zYWN0aW9uIGFuZCBjaGVjayBidWZbMS03LDksMTBdIGFyZSB0aGUgc2FtZSAqLwor CWVyciA9IGZjcF9hdmNfdHJhbnNhY3Rpb24odW5pdCwgYnVmLCAxMiwgYnVmLCAxMiwKKwkJCQkg IEJJVCgxKSB8IEJJVCgyKSB8IEJJVCgzKSB8IEJJVCg0KSB8IEJJVCg1KSB8CisJCQkJICBCSVQo NikgfCBCSVQoNykgfCBCSVQoOSkgfCBCSVQoMTApKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBl bmQ7CisJZWxzZSBpZiAoKGVyciA8IDEyKSAmJiAoYnVmWzBdICE9IDB4MGMpKSB7CisJCWVyciA9 IC1FSU87CisJCWdvdG8gZW5kOworCX0KKworCSp0eXBlID0gYnVmWzExXTsKKwllcnIgPSAwOwor ZW5kOgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIGVycjsKK30KKworaW50IGF2Y19icmlkZ2Vjb19n ZXRfcGx1Z19pbnB1dChzdHJ1Y3QgZndfdW5pdCAqdW5pdCwKKwkJCQl1OCBhZGRyW0FWQ19CUklE R0VDT19BRERSX0JZVEVTXSwgdTggaW5wdXRbN10pCit7CisJaW50IGVycjsKKwl1OCAqYnVmOwor CisJYnVmID0ga3phbGxvYygxOCwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQly ZXR1cm4gLUVOT01FTTsKKworCS8qIHN0YXR1cyBmb3IgcGx1ZyBpbmZvIHdpdGggYnJpZGdlY28g ZXh0ZW5zaW9uICovCisJYXZjX2JyaWRnZWNvX2ZpbGxfY29tbWFuZF9iYXNlKGJ1ZiwgMHgwMSwg MHgwMiwgMHhjMCwgYWRkcik7CisKKwkvKiBpbmZvIHR5cGUgaXMgJ1BsdWcgSW5wdXQgU3BlY2lm aWMgRGF0YScgKi8KKwlidWZbOV0gPSAweDA1OworCisJLyogZG8gdHJhbnNhY3Rpb24gYW5kIGNo ZWNrIGJ1ZlsxLTddIGFyZSB0aGUgc2FtZSAqLworCWVyciA9IGZjcF9hdmNfdHJhbnNhY3Rpb24o dW5pdCwgYnVmLCAxNiwgYnVmLCAxNiwKKwkJCQkgIEJJVCgxKSB8IEJJVCgyKSB8IEJJVCgzKSB8 IEJJVCg0KSB8IEJJVCg1KSB8CisJCQkJICBCSVQoNikgfCBCSVQoNykpOworCWlmIChlcnIgPCAw KQorCQlnb3RvIGVuZDsKKwllbHNlIGlmICgoZXJyIDwgMTgpICYmIChidWZbMF0gIT0gMHgwYykp IHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBlbmQ7CisJfQorCisJbWVtY3B5KGlucHV0LCBidWYg KyAxMCwgNSk7CitlbmQ6CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgYXZj X2JyaWRnZWNvX2dldF9wbHVnX3N0cm1fZm10KHN0cnVjdCBmd191bml0ICp1bml0LAorCQkJCSAg IHU4IGFkZHJbQVZDX0JSSURHRUNPX0FERFJfQllURVNdLAorCQkJCSAgIHVuc2lnbmVkIGludCBl bnRyeWlkLCB1OCAqYnVmLAorCQkJCSAgIHVuc2lnbmVkIGludCAqbGVuKQoreworCWludCBlcnI7 CisKKwkvKiBjaGVjayBnaXZlbiBidWZmZXIgKi8KKwlpZiAoKGJ1ZiA9PSBOVUxMKSB8fCAoKmxl biA8IDEyKSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisKKwkvKiBzdGF0 dXMgZm9yIHBsdWcgaW5mbyB3aXRoIGJyaWRnZWNvIGV4dGVuc2lvbiAqLworCWF2Y19icmlkZ2Vj b19maWxsX2NvbW1hbmRfYmFzZShidWYsIDB4MDEsIDB4MmYsIDB4YzEsIGFkZHIpOworCisJYnVm WzldID0gMHhmZjsJCQkvKiBzdHJlYW0gc3RhdHVzIGluIHJlc3BvbnNlICovCisJYnVmWzEwXSA9 IDB4ZmYgJiBlbnRyeWlkOwkvKiBlbnRyeSBJRCAqLworCisJLyogZG8gdHJhbnNhY3Rpb24gYW5k IGNoZWNrIGJ1ZlsxLTcsMTBdIGFyZSB0aGUgc2FtZSBhZ2FpbnN0IGNvbW1hbmQgKi8KKwllcnIg PSBmY3BfYXZjX3RyYW5zYWN0aW9uKHVuaXQsIGJ1ZiwgMTIsIGJ1ZiwgKmxlbiwKKwkJCQkgIEJJ VCgxKSB8IEJJVCgyKSB8IEJJVCgzKSB8IEJJVCg0KSB8IEJJVCg1KSB8CisJCQkJICBCSVQoNikg fCBCSVQoNykgfCBCSVQoMTApKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlbmQ7CisJLyogcmVh Y2ggdGhlIGVuZCBvZiBlbnRyaWVzICovCisJZWxzZSBpZiAoYnVmWzBdID09IDB4MGEpIHsKKwkJ ZXJyID0gMDsKKwkJKmxlbiA9IDA7CisJCWdvdG8gZW5kOworCX0gZWxzZSBpZiAoYnVmWzBdICE9 IDB4MGMpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJLyogdGhlIGhlYWRlciBv ZiB0aGlzIGNvbW1hbmQgaXMgMTEgYnl0ZXMgKi8KKwl9IGVsc2UgaWYgKGVyciA8IDEyKSB7CisJ CWVyciA9IC1FSU87CisJCWdvdG8gZW5kOworCX0gZWxzZSBpZiAoYnVmWzEwXSAhPSBlbnRyeWlk KSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZW5kOworCX0KKworCS8qIHN0cmlwIGNvbW1hbmQg aGVhZGVyICovCisJbWVtbW92ZShidWYsIGJ1ZiArIDExLCBlcnIgLSAxMSk7CisJKmxlbiA9IGVy ciAtIDExOworCWVyciA9IDA7CitlbmQ6CisJcmV0dXJuIGVycjsKK30KKworaW50IHNuZF9iZWJv Yl9nZXRfcmF0ZShzdHJ1Y3Qgc25kX2JlYm9iICpiZWJvYiwgdW5zaWduZWQgaW50ICpyYXRlLAor CQkgICAgICAgZW51bSBhdmNfZ2VuZXJhbF9wbHVnX2RpciBkaXIpCit7CisJaW50IGVycjsKKwor CWVyciA9IGF2Y19nZW5lcmFsX2dldF9zaWdfZm10KGJlYm9iLT51bml0LCByYXRlLCBkaXIsIDAp OworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVuZDsKKworCS8qIElNUExFTUVOVEVEL1NUQUJMRSBp cyBPSyAqLworCWlmIChlcnIgIT0gMHgwYykgeworCQlkZXZfZXJyKCZiZWJvYi0+dW5pdC0+ZGV2 aWNlLAorCQkJImZhaWxlZCB0byBnZXQgc2FtcGxpbmcgcmF0ZVxuIik7CisJCWVyciA9IC1FSU87 CisJfQorZW5kOgorCXJldHVybiBlcnI7Cit9CisKK2ludCBzbmRfYmVib2Jfc2V0X3JhdGUoc3Ry dWN0IHNuZF9iZWJvYiAqYmVib2IsIHVuc2lnbmVkIGludCByYXRlLAorCQkgICAgICAgZW51bSBh dmNfZ2VuZXJhbF9wbHVnX2RpciBkaXIpCit7CisJaW50IGVycjsKKworCWVyciA9IGF2Y19nZW5l cmFsX3NldF9zaWdfZm10KGJlYm9iLT51bml0LCByYXRlLCBkaXIsIDApOworCWlmIChlcnIgPCAw KQorCQlnb3RvIGVuZDsKKworCS8qIEFDQ0VQVEVEIG9yIElOVEVSSU0gaXMgT0sgKi8KKwlpZiAo KGVyciAhPSAweDBmKSAmJiAoZXJyICE9IDB4MDkpKSB7CisJCWRldl9lcnIoJmJlYm9iLT51bml0 LT5kZXZpY2UsCisJCQkiZmFpbGVkIHRvIHNldCBzYW1wbGluZyByYXRlXG4iKTsKKwkJZXJyID0g LUVJTzsKKwl9CitlbmQ6CisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3 aXJlL2JlYm9iL2JlYm9iX3N0cmVhbS5jIGIvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2Jfc3Ry ZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk3ZDFjNgotLS0gL2Rl di9udWxsCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iX3N0cmVhbS5jCkBAIC0wLDAg KzEsNzg0IEBACisvKgorICogYmVib2Jfc3RyZWFtLmMgLSBhIHBhcnQgb2YgZHJpdmVyIGZvciBC ZUJvQiBiYXNlZCBkZXZpY2VzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEzIFRha2FzaGkgU2Fr YW1vdG8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIuCisgKi8KKworI2luY2x1ZGUgIi4vYmVib2IuaCIK KworI2RlZmluZSBDQUxMQkFDS19USU1FT1VUCTEwMDAKKworLyoKKyAqIE5PVEU7CisgKiBGb3Ig QmVCb0Igc3RyZWFtcywgQm90aCBvZiBpbnB1dCBhbmQgb3V0cHV0IENNUCBjb25uZWN0aW9uIGFy ZSBpbXBvcnRhbnQuCisgKgorICogRm9yIG1vc3QgZGV2aWNlcywgZWFjaCBDTVAgY29ubmVjdGlv biBzdGFydHMgdG8gdHJhbnNtaXQvcmVjZWl2ZSBhCisgKiBjb3JyZXNwb25kaW5nIHN0cmVhbXMu IEJ1dCBmb3IgYSBmZXcgZGV2aWNlcywgYm90aCBvZiBDTVAgY29ubmVjdGlvbiBuZWVkcworICog dG8gc3RhcnQgdHJhbnNtaXR0aW5nIHN0cmVhbS4gQW4gZXhhbXBsZSBpcyAnTS1BdWRpbyBGaXJl d2lyZSA0MTAnLgorICovCisKKy8qIDEyOCBpcyBhbiBhcmJpdHJhcnkgbGVuZ3RoIGJ1dCBpdCBz ZWVtcyB0byBiZSBlbm91Z2ggKi8KKyNkZWZpbmUgRk9STUFUX01BWElNVU1fTEVOR1RIIDEyOAor Citjb25zdCB1bnNpZ25lZCBpbnQgc25kX2JlYm9iX3JhdGVfdGFibGVbU05EX0JFQk9CX1NUUk1f Rk1UX0VOVFJJRVNdID0geworCVswXSA9IDMyMDAwLAorCVsxXSA9IDQ0MTAwLAorCVsyXSA9IDQ4 MDAwLAorCVszXSA9IDg4MjAwLAorCVs0XSA9IDk2MDAwLAorCVs1XSA9IDE3NjQwMCwKKwlbNl0g PSAxOTIwMDAsCit9OworCisvKgorICogU2VlOiBUYWJsZSA1MTogRXh0ZW5kZWQgU3RyZWFtIEZv cm1hdCBJbmZvIOKAmFNhbXBsaW5nIEZyZXF1ZW5jeeKAmQorICogaW4gQWRkaXRpb25hbCBBVkMg Y29tbWFuZHMgKE5vdiAyMDAzLCBCcmlkZ2VDbykKKyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVk IGludCBicmlkZ2Vjb19mcmVxX3RhYmxlW10gPSB7CisJWzBdID0gMHgwMiwKKwlbMV0gPSAweDAz LAorCVsyXSA9IDB4MDQsCisJWzNdID0gMHgwYSwKKwlbNF0gPSAweDA1LAorCVs1XSA9IDB4MDYs CisJWzZdID0gMHgwNywKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2dldF9mb3JtYXRpb25f aW5kZXgodW5zaWduZWQgaW50IHJhdGUpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkg PSAwOyBpIDwgc2l6ZW9mKHNuZF9iZWJvYl9yYXRlX3RhYmxlKTsgaSsrKSB7CisJCWlmIChzbmRf YmVib2JfcmF0ZV90YWJsZVtpXSA9PSByYXRlKQorCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiAt MTsKK30KKworaW50CitzbmRfYmVib2Jfc3RyZWFtX2dldF9yYXRlKHN0cnVjdCBzbmRfYmVib2Ig KmJlYm9iLCB1bnNpZ25lZCBpbnQgKmN1cnJfcmF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdHhfcmF0 ZSwgcnhfcmF0ZTsKKwlpbnQgZXJyOworCisJZXJyID0gc25kX2JlYm9iX2dldF9yYXRlKGJlYm9i LCAmdHhfcmF0ZSwgQVZDX0dFTkVSQUxfUExVR19ESVJfT1VUKTsKKwlpZiAoZXJyIDwgMCkKKwkJ Z290byBlbmQ7CisKKwllcnIgPSBzbmRfYmVib2JfZ2V0X3JhdGUoYmVib2IsICZyeF9yYXRlLCBB VkNfR0VORVJBTF9QTFVHX0RJUl9JTik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZW5kOworCisJ KmN1cnJfcmF0ZSA9IHJ4X3JhdGU7CisJaWYgKHJ4X3JhdGUgPT0gdHhfcmF0ZSkKKwkJZ290byBl bmQ7CisKKwkvKiBzeW5jaHJvbml6ZSByZWNlaXZlIHN0cmVhbSByYXRlIHRvIHRyYW5zbWl0IHN0 cmVhbSByYXRlICovCisJZXJyID0gc25kX2JlYm9iX3NldF9yYXRlKGJlYm9iLCByeF9yYXRlLCBB VkNfR0VORVJBTF9QTFVHX0RJUl9JTik7CitlbmQ6CisJcmV0dXJuIGVycjsKK30KKworaW50Citz bmRfYmVib2Jfc3RyZWFtX3NldF9yYXRlKHN0cnVjdCBzbmRfYmVib2IgKmJlYm9iLCB1bnNpZ25l ZCBpbnQgcmF0ZSkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gc25kX2JlYm9iX3NldF9yYXRlKGJl Ym9iLCByYXRlLCBBVkNfR0VORVJBTF9QTFVHX0RJUl9PVVQpOworCWlmIChlcnIgPCAwKQorCQln b3RvIGVuZDsKKworCWVyciA9IHNuZF9iZWJvYl9zZXRfcmF0ZShiZWJvYiwgcmF0ZSwgQVZDX0dF TkVSQUxfUExVR19ESVJfSU4pOworZW5kOgorCXJldHVybiBlcnI7Cit9CisKK2ludAorc25kX2Jl Ym9iX3N0cmVhbV9jaGVja19pbnRlcm5hbF9jbG9jayhzdHJ1Y3Qgc25kX2JlYm9iICpiZWJvYiwg Ym9vbCAqaW50ZXJuYWwpCit7CisJdTggYWRkcltBVkNfQlJJREdFQ09fQUREUl9CWVRFU10sIGlu cHV0WzddOworCWludCBlcnIgPSAwOworCisJKmludGVybmFsID0gZmFsc2U7CisKKwkvKgorCSAq IDEuVGhlIGRldmljZSBkb24ndCBzdXBwb3J0IGZvciBzd2l0Y2hpbmcgc291cmNlIG9mIGNsb2Nr CisJICogICB0aGVuIGFzc3VtZWQgdG8gdXNlIGludGVybmFsIGNsb2NrIGFsd2F5cworCSAqLwor CWlmIChiZWJvYi0+c3luY19pbnB1dF9wbHVnIDwgMCkgeworCQkqaW50ZXJuYWwgPSB0cnVlOwor CQlnb3RvIGVuZDsKKwl9CisKKwkvKgorCSAqIDIuVGhlIGRldmljZSBzdXBwb3J0cyB0byBzd2l0 Y2ggc291cmNlIG9mIGNsb2NrIGJ5IGFuIHVzdWFsIHdheS4KKwkgKiAgIExldCdzIGNoZWNrIGlu cHV0IGZvciAnTXVzaWMgU3ViIFVuaXQgU3luYyBJbnB1dCcgcGx1Zy4KKwkgKi8KKwlhdmNfYnJp ZGdlY29fZmlsbF9zdWJ1bml0X2FkZHIoYWRkciwgMHg2MCwgQVZDX0JSSURHRUNPX1BMVUdfRElS X0lOLAorCQkJCSAgICAgICBiZWJvYi0+c3luY19pbnB1dF9wbHVnKTsKKwllcnIgPSBhdmNfYnJp ZGdlY29fZ2V0X3BsdWdfaW5wdXQoYmVib2ItPnVuaXQsIGFkZHIsIGlucHV0KTsKKwlpZiAoZXJy IDwgMCkKKwkJZ290byBlbmQ7CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBubyBpbnB1dCBwbHVn cywgYWxsIG9mIGZpZWxkcyBhcmUgMHhmZi4KKwkgKiBIZXJlIGNoZWNrIHRoZSBmaXJzdCBmaWVs ZC4gVGhpcyBmaWVsZCBpcyB1c2VkIGZvciBkaXJlY3Rpb24uCisJICovCisJaWYgKGlucHV0WzBd ID09IDB4ZmYpIHsKKwkJKmludGVybmFsID0gdHJ1ZTsKKwkJZ290byBlbmQ7CisJfQorCisJLyoK KwkgKiBJZiBzb3VyY2Ugb2YgY2xvY2sgaXMgaW50ZXJuYWwgQ1NSLCBNdXNpYyBTdWIgVW5pdCBT eW5jIElucHV0IGlzCisJICogYSBkZXN0aW5hdGlvbiBvZiBNdXNpYyBTdWIgVW5pdCBTeW5jIE91 dHB1dC4KKwkgKi8KKwkqaW50ZXJuYWwgPSAoKGlucHV0WzBdID09IEFWQ19CUklER0VDT19QTFVH X0RJUl9PVVQpICYmCisJCSAgICAgKGlucHV0WzFdID09IEFWQ19CUklER0VDT19QTFVHX01PREVf U1VCVU5JVCkgJiYKKwkJICAgICAoaW5wdXRbMl0gPT0gMHgwYykgJiYKKwkJICAgICAoaW5wdXRb M10gPT0gMHgwMCkpOworZW5kOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBp bnQKK21hcF9kYXRhX2NoYW5uZWxzKHN0cnVjdCBzbmRfYmVib2IgKmJlYm9iLCBzdHJ1Y3QgYW1k dHBfc3RyZWFtICpzKQoreworCXVuc2lnbmVkIGludCBzZWMsIHNlY3Rpb25zLCBjaCwgY2hhbm5l bHM7CisJdW5zaWduZWQgaW50IHBjbSwgbWlkaSwgbG9jYXRpb247CisJdW5zaWduZWQgaW50IHN0 bV9wb3MsIHNlY19sb2MsIHBvczsKKwl1OCAqYnVmLCBhZGRyW0FWQ19CUklER0VDT19BRERSX0JZ VEVTXSwgdHlwZTsKKwllbnVtIGF2Y19icmlkZ2Vjb19wbHVnX2RpciBkaXI7CisJaW50IGVycjsK KworCS8qCisJICogVGhlIGxlbmd0aCBvZiByZXR1cm4gdmFsdWUgb2YgdGhpcyBjb21tYW5kIGNh bm5vdCBiZSBleHBlY3RlZC4gSGVyZQorCSAqIHVzZSB0aGUgbWF4aW11bSBsZW5ndGggb2YgRkNQ LgorCSAqLworCWJ1ZiA9IGt6YWxsb2MoMjU2LCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmID09IE5V TEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKHMgPT0gJmJlYm9iLT50eF9zdHJlYW0pCisJ CWRpciA9IEFWQ19CUklER0VDT19QTFVHX0RJUl9PVVQ7CisJZWxzZQorCQlkaXIgPSBBVkNfQlJJ REdFQ09fUExVR19ESVJfSU47CisKKwlhdmNfYnJpZGdlY29fZmlsbF91bml0X2FkZHIoYWRkciwg ZGlyLCBBVkNfQlJJREdFQ09fUExVR19VTklUX0lTT0MsIDApOworCWVyciA9IGF2Y19icmlkZ2Vj b19nZXRfcGx1Z19jaF9wb3MoYmVib2ItPnVuaXQsIGFkZHIsIGJ1ZiwgMjU2KTsKKwlpZiAoZXJy IDwgMCkKKwkJZ290byBlbmQ7CisJcG9zID0gMDsKKworCS8qIHBvc2l0aW9ucyBpbiBJL08gYnVm ZmVyICovCisJcGNtID0gMDsKKwltaWRpID0gMDsKKworCS8qIHRoZSBudW1iZXIgb2Ygc2VjdGlv bnMgaW4gQU1EVFAgcGFja2V0ICovCisJc2VjdGlvbnMgPSBidWZbcG9zKytdOworCisJZm9yIChz ZWMgPSAwOyBzZWMgPCBzZWN0aW9uczsgc2VjKyspIHsKKwkJLyogdHlwZSBvZiB0aGlzIHNlY3Rp b24gKi8KKwkJYXZjX2JyaWRnZWNvX2ZpbGxfdW5pdF9hZGRyKGFkZHIsIGRpciwKKwkJCQkJICAg IEFWQ19CUklER0VDT19QTFVHX1VOSVRfSVNPQywgMCk7CisJCWVyciA9IGF2Y19icmlkZ2Vjb19n ZXRfcGx1Z19zZWN0aW9uX3R5cGUoYmVib2ItPnVuaXQsIGFkZHIsCisJCQkJCQkJIHNlYywgJnR5 cGUpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZW5kOworCQkvKiBOb1R5cGUgKi8KKwkJaWYg KHR5cGUgPT0gMHhmZikgeworCQkJZXJyID0gLUVOT1NZUzsKKwkJCWdvdG8gZW5kOworCQl9CisK KwkJLyogdGhlIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGlzIHNlY3Rpb24gKi8KKwkJY2hhbm5l bHMgPSBidWZbcG9zKytdOworCisJCWZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7 CisJCQkvKiBwb3NpdGlvbiBvZiB0aGlzIGNoYW5uZWwgaW4gQU1EVFAgcGFja2V0ICovCisJCQlz dG1fcG9zID0gYnVmW3BvcysrXSAtIDE7CisJCQkvKiBsb2NhdGlvbiBvZiB0aGlzIGNoYW5uZWwg aW4gdGhpcyBzZWN0aW9uICovCisJCQlzZWNfbG9jID0gYnVmW3BvcysrXSAtIDE7CisKKwkJCXN3 aXRjaCAodHlwZSkgeworCQkJLyogZm9yIE1JREkgY29uZm9ybWFudCBkYXRhIGNoYW5uZWwgKi8K KwkJCWNhc2UgMHgwYToKKwkJCQkvKiBBTURUUF9NQVhfQ0hBTk5FTFNfRk9SX01JREkgaXMgMS4g Ki8KKwkJCQlpZiAoKG1pZGkgPiAwKSAmJiAoc3RtX3BvcyAhPSBtaWRpKSkgeworCQkJCQllcnIg PSAtRU5PU1lTOworCQkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQkJcy0+bWlkaV9wb3NpdGlvbiA9 IHN0bV9wb3M7CisJCQkJbWlkaSA9IHN0bV9wb3M7CisJCQkJYnJlYWs7CisJCQkvKiBmb3IgUENN IGRhdGEgY2hhbm5lbCAqLworCQkJY2FzZSAweDAxOgkvKiBIZWFkcGhvbmUgKi8KKwkJCWNhc2Ug MHgwMjoJLyogTWljcm9waG9uZSAqLworCQkJY2FzZSAweDAzOgkvKiBMaW5lICovCisJCQljYXNl IDB4MDQ6CS8qIFNQRElGICovCisJCQljYXNlIDB4MDU6CS8qIEFEQVQgKi8KKwkJCWNhc2UgMHgw NjoJLyogVERJRiAqLworCQkJY2FzZSAweDA3OgkvKiBNQURJICovCisJCQkvKiBmb3IgdW5kZWZp bmVkL2NoYW5nZWFibGUgc2lnbmFsICAqLworCQkJY2FzZSAweDA4OgkvKiBBbmFsb2cgKi8KKwkJ CWNhc2UgMHgwOToJLyogRGlnaXRhbCAqLworCQkJZGVmYXVsdDoKKwkJCQlsb2NhdGlvbiA9IHBj bSArIHNlY19sb2M7CisJCQkJaWYgKGxvY2F0aW9uID49IEFNRFRQX01BWF9DSEFOTkVMU19GT1Jf UENNKSB7CisJCQkJCWVyciA9IC1FTk9TWVM7CisJCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCQlz LT5wY21fcG9zaXRpb25zW2xvY2F0aW9uXSA9IHN0bV9wb3M7CisJCQkJYnJlYWs7CisJCQl9CisJ CX0KKworCQlpZiAodHlwZSAhPSAweDBhKQorCQkJcGNtICs9IGNoYW5uZWxzOworCQllbHNlCisJ CQltaWRpICs9IGNoYW5uZWxzOworCX0KK2VuZDoKKwlrZnJlZShidWYpOworCXJldHVybiBlcnI7 Cit9CisKK3N0YXRpYyBpbnQKK2luaXRfYm90aF9jb25uZWN0aW9ucyhzdHJ1Y3Qgc25kX2JlYm9i ICpiZWJvYikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gY21wX2Nvbm5lY3Rpb25faW5pdCgmYmVi b2ItPmluX2Nvbm4sCisJCQkJICBiZWJvYi0+dW5pdCwgQ01QX0lOUFVULCAwKTsKKwlpZiAoZXJy IDwgMCkKKwkJZ290byBlbmQ7CisKKwllcnIgPSBjbXBfY29ubmVjdGlvbl9pbml0KCZiZWJvYi0+ b3V0X2Nvbm4sCisJCQkJICBiZWJvYi0+dW5pdCwgQ01QX09VVFBVVCwgMCk7CisJaWYgKGVyciA8 IDApCisJCWNtcF9jb25uZWN0aW9uX2Rlc3Ryb3koJmJlYm9iLT5pbl9jb25uKTsKK2VuZDoKKwly ZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CitjaGVja19jb25uZWN0aW9uX3VzZWRfYnlfb3Ro ZXJzKHN0cnVjdCBzbmRfYmVib2IgKmJlYm9iLCBzdHJ1Y3QgYW1kdHBfc3RyZWFtICpzKQorewor CXN0cnVjdCBjbXBfY29ubmVjdGlvbiAqY29ubjsKKwlib29sIHVzZWQ7CisJaW50IGVycjsKKwor CWlmIChzID09ICZiZWJvYi0+dHhfc3RyZWFtKQorCQljb25uID0gJmJlYm9iLT5vdXRfY29ubjsK KwllbHNlCisJCWNvbm4gPSAmYmVib2ItPmluX2Nvbm47CisKKwllcnIgPSBjbXBfY29ubmVjdGlv bl9jaGVja191c2VkKGNvbm4sICZ1c2VkKTsKKwlpZiAoKGVyciA+PSAwKSAmJiB1c2VkICYmICFh bWR0cF9zdHJlYW1fcnVubmluZyhzKSkgeworCQlkZXZfZXJyKCZiZWJvYi0+dW5pdC0+ZGV2aWNl LAorCQkJIkNvbm5lY3Rpb24gZXN0YWJsaXNoZWQgYnkgb3RoZXJzOiAlY1BDUlslZF1cbiIsCisJ CQkoY29ubi0+ZGlyZWN0aW9uID09IENNUF9PVVRQVVQpID8gJ28nIDogJ2knLAorCQkJY29ubi0+ cGNyX2luZGV4KTsKKwkJZXJyID0gLUVCVVNZOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0 YXRpYyBpbnQKK21ha2VfYm90aF9jb25uZWN0aW9ucyhzdHJ1Y3Qgc25kX2JlYm9iICpiZWJvYiwg dW5zaWduZWQgaW50IHJhdGUpCit7CisJaW50IGluZGV4LCBwY21fY2hhbm5lbHMsIG1pZGlfY2hh bm5lbHMsIGVycjsKKworCS8qIGNvbmZpcm0gcGFyYW1zIGZvciBib3RoIHN0cmVhbXMgKi8KKwlp bmRleCA9IGdldF9mb3JtYXRpb25faW5kZXgocmF0ZSk7CisJcGNtX2NoYW5uZWxzID0gYmVib2It PnR4X3N0cmVhbV9mb3JtYXRpb25zW2luZGV4XS5wY207CisJbWlkaV9jaGFubmVscyA9IGJlYm9i LT50eF9zdHJlYW1fZm9ybWF0aW9uc1tpbmRleF0ubWlkaTsKKwlhbWR0cF9zdHJlYW1fc2V0X3Bh cmFtZXRlcnMoJmJlYm9iLT50eF9zdHJlYW0sCisJCQkJICAgIHJhdGUsIHBjbV9jaGFubmVscywg bWlkaV9jaGFubmVscyAqIDgpOworCXBjbV9jaGFubmVscyA9IGJlYm9iLT5yeF9zdHJlYW1fZm9y bWF0aW9uc1tpbmRleF0ucGNtOworCW1pZGlfY2hhbm5lbHMgPSBiZWJvYi0+cnhfc3RyZWFtX2Zv cm1hdGlvbnNbaW5kZXhdLm1pZGk7CisJYW1kdHBfc3RyZWFtX3NldF9wYXJhbWV0ZXJzKCZiZWJv Yi0+cnhfc3RyZWFtLAorCQkJCSAgICByYXRlLCBwY21fY2hhbm5lbHMsIG1pZGlfY2hhbm5lbHMg KiA4KTsKKworCS8qIGVzdGFibGlzaCBjb25uZWN0aW9ucyBmb3IgYm90aCBzdHJlYW1zICovCisJ ZXJyID0gY21wX2Nvbm5lY3Rpb25fZXN0YWJsaXNoKCZiZWJvYi0+b3V0X2Nvbm4sCisJCQlhbWR0 cF9zdHJlYW1fZ2V0X21heF9wYXlsb2FkKCZiZWJvYi0+dHhfc3RyZWFtKSk7CisJaWYgKGVyciA8 IDApCisJCWdvdG8gZW5kOworCWVyciA9IGNtcF9jb25uZWN0aW9uX2VzdGFibGlzaCgmYmVib2It PmluX2Nvbm4sCisJCQlhbWR0cF9zdHJlYW1fZ2V0X21heF9wYXlsb2FkKCZiZWJvYi0+cnhfc3Ry ZWFtKSk7CisJaWYgKGVyciA8IDApCisJCWNtcF9jb25uZWN0aW9uX2JyZWFrKCZiZWJvYi0+b3V0 X2Nvbm4pOworZW5kOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkCiticmVha19ib3Ro X2Nvbm5lY3Rpb25zKHN0cnVjdCBzbmRfYmVib2IgKmJlYm9iKQoreworCWNtcF9jb25uZWN0aW9u X2JyZWFrKCZiZWJvYi0+aW5fY29ubik7CisJY21wX2Nvbm5lY3Rpb25fYnJlYWsoJmJlYm9iLT5v dXRfY29ubik7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZGVzdHJveV9ib3RoX2Nvbm5l Y3Rpb25zKHN0cnVjdCBzbmRfYmVib2IgKmJlYm9iKQoreworCWJyZWFrX2JvdGhfY29ubmVjdGlv bnMoYmVib2IpOworCisJY21wX2Nvbm5lY3Rpb25fZGVzdHJveSgmYmVib2ItPmluX2Nvbm4pOwor CWNtcF9jb25uZWN0aW9uX2Rlc3Ryb3koJmJlYm9iLT5vdXRfY29ubik7Cit9CisKK3N0YXRpYyBp bnQKK2dldF9yb2xlcyhzdHJ1Y3Qgc25kX2JlYm9iICpiZWJvYiwgZW51bSBjaXBfZmxhZ3MgKnN5 bmNfbW9kZSwKKwkgIHN0cnVjdCBhbWR0cF9zdHJlYW0gKiptYXN0ZXIsIHN0cnVjdCBhbWR0cF9z dHJlYW0gKipzbGF2ZSkKK3sKKwkvKiBjdXJyZW50bHkgdGhpcyBtb2R1bGUgZG9lc24ndCBzdXBw b3J0IFNZVC1NYXRjaCBtb2RlICovCisJKnN5bmNfbW9kZSA9IENJUF9TWU5DX1RPX0RFVklDRTsK KwkqbWFzdGVyID0gJmJlYm9iLT50eF9zdHJlYW07CisJKnNsYXZlID0gJmJlYm9iLT5yeF9zdHJl YW07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc3RhcnRfc3RyZWFtKHN0cnVjdCBz bmRfYmVib2IgKmJlYm9iLCBzdHJ1Y3QgYW1kdHBfc3RyZWFtICpzdHJlYW0sCisJICAgICB1bnNp Z25lZCBpbnQgcmF0ZSkKK3sKKwlzdHJ1Y3QgY21wX2Nvbm5lY3Rpb24gKmNvbm47CisJaW50IGVy ciA9IDA7CisKKwlpZiAoc3RyZWFtID09ICZiZWJvYi0+cnhfc3RyZWFtKQorCQljb25uID0gJmJl Ym9iLT5pbl9jb25uOworCWVsc2UKKwkJY29ubiA9ICZiZWJvYi0+b3V0X2Nvbm47CisKKwkvKiBj aGFubmVsIG1hcHBpbmcgKi8KKwllcnIgPSBtYXBfZGF0YV9jaGFubmVscyhiZWJvYiwgc3RyZWFt KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlbmQ7CisKKwkvKiBzdGFydCBhbWR0cCBzdHJlYW0g Ki8KKwllcnIgPSBhbWR0cF9zdHJlYW1fc3RhcnQoc3RyZWFtLAorCQkJCSBjb25uLT5yZXNvdXJj ZXMuY2hhbm5lbCwKKwkJCQkgY29ubi0+c3BlZWQpOworZW5kOgorCXJldHVybiBlcnI7Cit9CisK K2ludCBzbmRfYmVib2Jfc3RyZWFtX2luaXRfZHVwbGV4KHN0cnVjdCBzbmRfYmVib2IgKmJlYm9i KQoreworCWludCBlcnI7CisKKwllcnIgPSBpbml0X2JvdGhfY29ubmVjdGlvbnMoYmVib2IpOwor CWlmIChlcnIgPCAwKQorCQlnb3RvIGVuZDsKKworCWVyciA9IGFtZHRwX3N0cmVhbV9pbml0KCZi ZWJvYi0+dHhfc3RyZWFtLCBiZWJvYi0+dW5pdCwKKwkJCQlBTURUUF9JTl9TVFJFQU0sIENJUF9C TE9DS0lORyk7CisJaWYgKGVyciA8IDApIHsKKwkJZGVzdHJveV9ib3RoX2Nvbm5lY3Rpb25zKGJl Ym9iKTsKKwkJZ290byBlbmQ7CisJfQorCisJZXJyID0gYW1kdHBfc3RyZWFtX2luaXQoJmJlYm9i LT5yeF9zdHJlYW0sIGJlYm9iLT51bml0LAorCQkJCUFNRFRQX09VVF9TVFJFQU0sIENJUF9CTE9D S0lORyk7CisJaWYgKGVyciA8IDApIHsKKwkJYW1kdHBfc3RyZWFtX2Rlc3Ryb3koJmJlYm9iLT50 eF9zdHJlYW0pOworCQlkZXN0cm95X2JvdGhfY29ubmVjdGlvbnMoYmVib2IpOworCX0KK2VuZDoK KwlyZXR1cm4gZXJyOworfQorCitpbnQgc25kX2JlYm9iX3N0cmVhbV9zdGFydF9kdXBsZXgoc3Ry dWN0IHNuZF9iZWJvYiAqYmVib2IsCisJCQkJICBzdHJ1Y3QgYW1kdHBfc3RyZWFtICpyZXF1ZXN0 LAorCQkJCSAgdW5zaWduZWQgaW50IHJhdGUpCit7CisJc3RydWN0IGFtZHRwX3N0cmVhbSAqbWFz dGVyLCAqc2xhdmU7CisJZW51bSBjaXBfZmxhZ3Mgc3luY19tb2RlOworCXVuc2lnbmVkIGludCBj dXJyX3JhdGU7CisJYm9vbCBzbGF2ZV9mbGFnOworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZi ZWJvYi0+bXV0ZXgpOworCisJZXJyID0gZ2V0X3JvbGVzKGJlYm9iLCAmc3luY19tb2RlLCAmbWFz dGVyLCAmc2xhdmUpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVuZDsKKworCS8qCisJICogQ29u c2lkZXJpbmcgSkFDSy9GRkFETyBzdHJlYW1pbmc6CisJICogVE9ETzogVGhpcyBjYW4gYmUgcmVt b3ZlZCBod2RlcCBmdW5jdGlvbmFsaXR5IGJlY29tZXMgcG9wdWxhci4KKwkgKi8KKwllcnIgPSBj aGVja19jb25uZWN0aW9uX3VzZWRfYnlfb3RoZXJzKGJlYm9iLCBtYXN0ZXIpOworCWlmIChlcnIg PCAwKQorCQlnb3RvIGVuZDsKKworCS8qIG5lZWQgdG8gdG91Y2ggc2xhdmUgc3RyZWFtICovCisJ c2xhdmVfZmxhZyA9IChyZXF1ZXN0ID09IHNsYXZlKSB8fCBhbWR0cF9zdHJlYW1fcnVubmluZyhz bGF2ZSk7CisKKwkvKiBwYWNrZXQgcXVldWVpbmcgZXJyb3IgKi8KKwlpZiAoYW1kdHBfc3RyZWFt aW5nX2Vycm9yKHNsYXZlKSkKKwkJYW1kdHBfc3RyZWFtX3N0b3Aoc2xhdmUpOworCWlmIChhbWR0 cF9zdHJlYW1pbmdfZXJyb3IobWFzdGVyKSkKKwkJYW1kdHBfc3RyZWFtX3N0b3AobWFzdGVyKTsK KworCS8qIHN0b3Agc3RyZWFtcyBpZiByYXRlIGlzIGRpZmZlcmVudCAqLworCWVyciA9IHNuZF9i ZWJvYl9zdHJlYW1fZ2V0X3JhdGUoYmVib2IsICZjdXJyX3JhdGUpOworCWlmIChlcnIgPCAwKQor CQlnb3RvIGVuZDsKKwlpZiAocmF0ZSA9PSAwKQorCQlyYXRlID0gY3Vycl9yYXRlOworCWlmIChy YXRlICE9IGN1cnJfcmF0ZSkgeworCQlhbWR0cF9zdHJlYW1fc3RvcChzbGF2ZSk7CisJCWFtZHRw X3N0cmVhbV9zdG9wKG1hc3Rlcik7CisJCWJyZWFrX2JvdGhfY29ubmVjdGlvbnMoYmVib2IpOwor CX0KKworCS8qIG1hc3RlciBzaG91bGQgYmUgYWx3YXlzIHJ1bm5pbmcgKi8KKwlpZiAoIWFtZHRw X3N0cmVhbV9ydW5uaW5nKG1hc3RlcikpIHsKKwkJYW1kdHBfc3RyZWFtX3NldF9zeW5jKHN5bmNf bW9kZSwgbWFzdGVyLCBzbGF2ZSk7CisKKwkJLyoKKwkJICogTk9URToKKwkJICogSWYgZXN0YWJs aXNoaW5nIGNvbm5lY3Rpb25zIGF0IGZpcnN0LCBZYW1haGEgR080NgorCQkgKiAoYW5kIG1heWJl IFRlcnJhdGVjIFgyNCkgZG9uJ3QgZ2VuZXJhdGUgc291bmQuCisJCSAqLworCQllcnIgPSBzbmRf YmVib2Jfc3RyZWFtX3NldF9yYXRlKGJlYm9iLCByYXRlKTsKKwkJaWYgKGVyciA8IDApCisJCQln b3RvIGVuZDsKKworCQllcnIgPSBtYWtlX2JvdGhfY29ubmVjdGlvbnMoYmVib2IsIHJhdGUpOwor CQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZW5kOworCisJCWVyciA9IHN0YXJ0X3N0cmVhbShiZWJv YiwgbWFzdGVyLCByYXRlKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWRldl9lcnIoJmJlYm9iLT51 bml0LT5kZXZpY2UsCisJCQkJImZhaWwgdG8gcnVuIEFNRFRQIG1hc3RlciBzdHJlYW06JWRcbiIs IGVycik7CisJCQlicmVha19ib3RoX2Nvbm5lY3Rpb25zKGJlYm9iKTsKKwkJCWdvdG8gZW5kOwor CQl9CisKKwkJLyogd2FpdCBmaXJzdCBjYWxsYmFjayAqLworCQlpZiAoIWFtZHRwX3N0cmVhbV93 YWl0X2NhbGxiYWNrKG1hc3RlciwgQ0FMTEJBQ0tfVElNRU9VVCkpIHsKKwkJCWFtZHRwX3N0cmVh bV9zdG9wKG1hc3Rlcik7CisJCQlicmVha19ib3RoX2Nvbm5lY3Rpb25zKGJlYm9iKTsKKwkJCWVy ciA9IC1FVElNRURPVVQ7CisJCQlnb3RvIGVuZDsKKwkJfQorCX0KKworCS8qIHN0YXJ0IHNsYXZl IGlmIG5lZWRlZCAqLworCWlmIChzbGF2ZV9mbGFnICYmICFhbWR0cF9zdHJlYW1fcnVubmluZyhz bGF2ZSkpIHsKKwkJZXJyID0gc3RhcnRfc3RyZWFtKGJlYm9iLCBzbGF2ZSwgcmF0ZSk7CisJCWlm IChlcnIgPCAwKSB7CisJCQlkZXZfZXJyKCZiZWJvYi0+dW5pdC0+ZGV2aWNlLAorCQkJCSJmYWls IHRvIHJ1biBBTURUUCBzbGF2ZSBzdHJlYW06JWRcbiIsIGVycik7CisJCQlhbWR0cF9zdHJlYW1f c3RvcChtYXN0ZXIpOworCQkJYnJlYWtfYm90aF9jb25uZWN0aW9ucyhiZWJvYik7CisJCQlnb3Rv IGVuZDsKKwkJfQorCisJCS8qIHdhaXQgZmlyc3QgY2FsbGJhY2sgKi8KKwkJaWYgKCFhbWR0cF9z dHJlYW1fd2FpdF9jYWxsYmFjayhzbGF2ZSwgQ0FMTEJBQ0tfVElNRU9VVCkpIHsKKwkJCWFtZHRw X3N0cmVhbV9zdG9wKHNsYXZlKTsKKwkJCWFtZHRwX3N0cmVhbV9zdG9wKG1hc3Rlcik7CisJCQli cmVha19ib3RoX2Nvbm5lY3Rpb25zKGJlYm9iKTsKKwkJCWVyciA9IC1FVElNRURPVVQ7CisJCX0K Kwl9CitlbmQ6CisJbXV0ZXhfdW5sb2NrKCZiZWJvYi0+bXV0ZXgpOworCXJldHVybiBlcnI7Cit9 CisKK2ludCBzbmRfYmVib2Jfc3RyZWFtX3N0b3BfZHVwbGV4KHN0cnVjdCBzbmRfYmVib2IgKmJl Ym9iKQoreworCXN0cnVjdCBhbWR0cF9zdHJlYW0gKm1hc3RlciwgKnNsYXZlOworCWVudW0gY2lw X2ZsYWdzIHN5bmNfbW9kZTsKKwl1bnNpZ25lZCBpbnQgc2xhdmVfc3Vic3RyZWFtczsKKwlpbnQg ZXJyOworCisJbXV0ZXhfbG9jaygmYmVib2ItPm11dGV4KTsKKworCWVyciA9IGdldF9yb2xlcyhi ZWJvYiwgJnN5bmNfbW9kZSwgJm1hc3RlciwgJnNsYXZlKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290 byBlbmQ7CisKKwlpZiAoc2xhdmUgPT0gJmJlYm9iLT50eF9zdHJlYW0pCisJCXNsYXZlX3N1YnN0 cmVhbXMgPSBiZWJvYi0+Y2FwdHVyZV9zdWJzdHJlYW1zOworCWVsc2UKKwkJc2xhdmVfc3Vic3Ry ZWFtcyA9IGJlYm9iLT5wbGF5YmFja19zdWJzdHJlYW1zOworCisJaWYgKHNsYXZlX3N1YnN0cmVh bXMgPiAwKQorCQlnb3RvIGVuZDsKKworCWFtZHRwX3N0cmVhbV9zdG9wKHNsYXZlKTsKKworCWlm ICgoYmVib2ItPmNhcHR1cmVfc3Vic3RyZWFtcyA+IDApIHx8IChiZWJvYi0+cGxheWJhY2tfc3Vi c3RyZWFtcyA+IDApKQorCQlnb3RvIGVuZDsKKworCWFtZHRwX3N0cmVhbV9zdG9wKG1hc3Rlcik7 CisJYnJlYWtfYm90aF9jb25uZWN0aW9ucyhiZWJvYik7CitlbmQ6CisJbXV0ZXhfdW5sb2NrKCZi ZWJvYi0+bXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgc25kX2JlYm9iX3N0cmVhbV91 cGRhdGVfZHVwbGV4KHN0cnVjdCBzbmRfYmVib2IgKmJlYm9iKQoreworCWlmICgoY21wX2Nvbm5l Y3Rpb25fdXBkYXRlKCZiZWJvYi0+aW5fY29ubikgPCAwKSB8fAorCSAgICAoY21wX2Nvbm5lY3Rp b25fdXBkYXRlKCZiZWJvYi0+b3V0X2Nvbm4pIDwgMCkpIHsKKwkJYW1kdHBfc3RyZWFtX3BjbV9h Ym9ydCgmYmVib2ItPnJ4X3N0cmVhbSk7CisJCWFtZHRwX3N0cmVhbV9wY21fYWJvcnQoJmJlYm9i LT50eF9zdHJlYW0pOworCQltdXRleF9sb2NrKCZiZWJvYi0+bXV0ZXgpOworCQlhbWR0cF9zdHJl YW1fc3RvcCgmYmVib2ItPnJ4X3N0cmVhbSk7CisJCWFtZHRwX3N0cmVhbV9zdG9wKCZiZWJvYi0+ dHhfc3RyZWFtKTsKKwkJYnJlYWtfYm90aF9jb25uZWN0aW9ucyhiZWJvYik7CisJCW11dGV4X3Vu bG9jaygmYmVib2ItPm11dGV4KTsKKwl9IGVsc2UgeworCQlhbWR0cF9zdHJlYW1fdXBkYXRlKCZi ZWJvYi0+cnhfc3RyZWFtKTsKKwkJYW1kdHBfc3RyZWFtX3VwZGF0ZSgmYmVib2ItPnR4X3N0cmVh bSk7CisJfQorfQorCit2b2lkIHNuZF9iZWJvYl9zdHJlYW1fZGVzdHJveV9kdXBsZXgoc3RydWN0 IHNuZF9iZWJvYiAqYmVib2IpCit7CisJbXV0ZXhfbG9jaygmYmVib2ItPm11dGV4KTsKKworCWFt ZHRwX3N0cmVhbV9wY21fYWJvcnQoJmJlYm9iLT5yeF9zdHJlYW0pOworCWFtZHRwX3N0cmVhbV9w Y21fYWJvcnQoJmJlYm9iLT50eF9zdHJlYW0pOworCisJYW1kdHBfc3RyZWFtX3N0b3AoJmJlYm9i LT5yeF9zdHJlYW0pOworCWFtZHRwX3N0cmVhbV9zdG9wKCZiZWJvYi0+dHhfc3RyZWFtKTsKKwlk ZXN0cm95X2JvdGhfY29ubmVjdGlvbnMoYmVib2IpOworCisJbXV0ZXhfdW5sb2NrKCZiZWJvYi0+ bXV0ZXgpOworfQorCisvKgorICogU2VlOiBUYWJsZSA1MDogRXh0ZW5kZWQgU3RyZWFtIEZvcm1h dCBJbmZvIOKAmEZvcm1hdCBIaWVyYXJjaHkgTGV2ZWwgMuKAmQorICogaW4gQWRkaXRpb25hbCBB VkMgY29tbWFuZHMgKE5vdiAyMDAzLCBCcmlkZ2VDbykKKyAqLworc3RhdGljIGludAorcGFyc2Vf c3RyZWFtX2Zvcm1hdGlvbih1OCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkgICAgICAgc3Ry dWN0IHNuZF9iZWJvYl9zdHJlYW1fZm9ybWF0aW9uICpmb3JtYXRpb24pCit7CisJdW5zaWduZWQg aW50IGksIGUsIGNoYW5uZWxzLCBmb3JtYXQ7CisKKwkvKgorCSAqIHRoaXMgbW9kdWxlIGNhbiBz dXBwb3J0IGEgaGllcmFyY2h5IGNvbWJpbmF0aW9uIHRoYXQ6CisJICogIFJvb3Q6CUF1ZGlvIGFu ZCBNdXNpYyAoMHg5MCkKKwkgKiAgTGV2ZWwgMToJQU04MjQgQ29tcG91bmQgICgweDQwKQorCSAq LworCWlmICgoYnVmWzBdICE9IDB4OTApIHx8IChidWZbMV0gIT0gMHg0MCkpCisJCXJldHVybiAt RU5PU1lTOworCisJLyogY2hlY2sgc2FtcGxpbmcgcmF0ZSAqLworCWZvciAoaSA9IDA7IGkgPCBz aXplb2YoYnJpZGdlY29fZnJlcV90YWJsZSk7IGkrKykgeworCQlpZiAoYnVmWzJdID09IGJyaWRn ZWNvX2ZyZXFfdGFibGVbaV0pCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gc2l6ZW9mKGJyaWRn ZWNvX2ZyZXFfdGFibGUpKQorCQlyZXR1cm4gLUVOT1NZUzsKKworCWZvciAoZSA9IDA7IGUgPCBi dWZbNF07IGUrKykgeworCQljaGFubmVscyA9IGJ1Zls1ICsgZSAqIDJdOworCQlmb3JtYXQgPSBi dWZbNiArIGUgKiAyXTsKKworCQlzd2l0Y2ggKGZvcm1hdCkgeworCQkvKiBQQ00gZm9yIElFQyA2 MDk1OC0zICovCisJCWNhc2UgMHgwMDoKKwkJLyogUENNIGZvciBNdWx0aSBiaXQgbGluZWFyIGF1 ZGlvIChyYXcpICovCisJCWNhc2UgMHgwNjoKKwkJCWZvcm1hdGlvbltpXS5wY20gKz0gY2hhbm5l bHM7CisJCQlicmVhazsKKwkJLyogTUlESSBjb21mb3JtYW50IChNTUEvQU1FSSBSUC0wMjcpICov CisJCWNhc2UgMHgwZDoKKwkJCWZvcm1hdGlvbltpXS5taWRpICs9IGNoYW5uZWxzOworCQkJYnJl YWs7CisJCS8qIFBDTSBmb3IgTXVsdGkgYml0IGxpbmVhciBhdWRpbyAoRFZELWF1ZGlvKSAqLwor CQljYXNlIDB4MDc6CisJCS8qIElFQyA2MTkzNy0zIHRvIDcgKi8KKwkJY2FzZSAweDAxOgorCQlj YXNlIDB4MDI6CisJCWNhc2UgMHgwMzoKKwkJY2FzZSAweDA0OgorCQljYXNlIDB4MDU6CisJCS8q IE9uZSBCaXQgQXVkaW8gKi8KKwkJY2FzZSAweDA4OgkvKiAoUGxhaW4pIFJhdyAqLworCQljYXNl IDB4MDk6CS8qIChQbGFpbikgU0FDRCAqLworCQljYXNlIDB4MGE6CS8qIChFbmNvZGVkKSBSYXcg Ki8KKwkJY2FzZSAweDBiOgkvKiAoRU5jb2RlZCkgU0FDRCAqLworCQkvKiBIaWdoIHByZWNpc2lv biBNdWx0aS1iaXQgTGluZWFyIEF1ZGlvICovCisJCWNhc2UgMHgwYzoKKwkJLyogU3luY2hyb25p emF0aW9uIFN0cmVhbSAoU3RlcmVvIFJhdyBhdWRpbykgKi8KKwkJY2FzZSAweDQwOgorCQkvKiBE b24ndCBjYXJlICovCisJCWNhc2UgMHhmZjoKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PU1lT OwkvKiBub3Qgc3VwcG9ydGVkICovCisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IGludAorZmlsbF9zdHJlYW1fZm9ybWF0aW9ucyhzdHJ1Y3Qgc25kX2JlYm9iICpiZWJvYiwgZW51 bSBhdmNfYnJpZGdlY29fcGx1Z19kaXIgZGlyLAorCQkgICAgICAgdW5zaWduZWQgc2hvcnQgcGlk KQoreworCXU4ICpidWY7CisJc3RydWN0IHNuZF9iZWJvYl9zdHJlYW1fZm9ybWF0aW9uICpmb3Jt YXRpb25zOworCXVuc2lnbmVkIGludCBsZW4sIGVpZDsKKwl1OCBhZGRyW0FWQ19CUklER0VDT19B RERSX0JZVEVTXTsKKwlpbnQgZXJyOworCisJYnVmID0ga21hbGxvYyhGT1JNQVRfTUFYSU1VTV9M RU5HVEgsIEdGUF9LRVJORUwpOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07 CisKKwlpZiAoZGlyID09IEFWQ19CUklER0VDT19QTFVHX0RJUl9JTikKKwkJZm9ybWF0aW9ucyA9 IGJlYm9iLT5yeF9zdHJlYW1fZm9ybWF0aW9uczsKKwllbHNlCisJCWZvcm1hdGlvbnMgPSBiZWJv Yi0+dHhfc3RyZWFtX2Zvcm1hdGlvbnM7CisKKwlmb3IgKGVpZCA9IDA7IGVpZCA8IFNORF9CRUJP Ql9TVFJNX0ZNVF9FTlRSSUVTOyBlaWQrKykgeworCQlsZW4gPSBGT1JNQVRfTUFYSU1VTV9MRU5H VEg7CisKKwkJbWVtc2V0KGJ1ZiwgMCwgbGVuKTsKKwkJYXZjX2JyaWRnZWNvX2ZpbGxfdW5pdF9h ZGRyKGFkZHIsIGRpciwKKwkJCQkJICAgIEFWQ19CUklER0VDT19QTFVHX1VOSVRfSVNPQywgcGlk KTsKKwkJZXJyID0gYXZjX2JyaWRnZWNvX2dldF9wbHVnX3N0cm1fZm10KGJlYm9iLT51bml0LCBh ZGRyLAorCQkJCQkJICAgICBlaWQsIGJ1ZiwgJmxlbik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290 byBlbmQ7CisJCWVsc2UgaWYgKGxlbiA8IDMpCisJCQlicmVhazsKKworCQkvKiBwYXJzZSBhbmQg c2V0IHN0cmVhbSBmb3JtYXRpb24gKi8KKwkJZXJyID0gcGFyc2Vfc3RyZWFtX2Zvcm1hdGlvbihi dWYsIGxlbiwgZm9ybWF0aW9ucyk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlbmQ7CisJfQor ZW5kOgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAorc2Vla19t c3Vfc3luY19pbnB1dF9wbHVnKHN0cnVjdCBzbmRfYmVib2IgKmJlYm9iKQoreworCXU4IHBsdWdz W0FWQ19QTFVHX0lORk9fQlVGX0NPVU5UXSwgYWRkcltBVkNfQlJJREdFQ09fQUREUl9CWVRFU107 CisJdW5zaWduZWQgaW50IGksIHR5cGU7CisJaW50IGVycjsKKworCS8qIGdldCBpbmZvcm1hdGlv biBhYm91dCBNdXNpYyBTdWIgVW5pdCAqLworCWVyciA9IGF2Y19nZW5lcmFsX2dldF9wbHVnX2lu Zm8oYmVib2ItPnVuaXQsIDB4MGMsIDB4MDAsIDB4MDAsIHBsdWdzKTsKKwlpZiAoZXJyIDwgMCkK KwkJZ290byBlbmQ7CisKKwkvKiBzZWVrIGRlc3RpbmF0aW9uIHBsdWdzIGZvciAnTVNVIHN5bmMg aW5wdXQnICovCisJYmVib2ItPnN5bmNfaW5wdXRfcGx1ZyA9IC0xOworCWZvciAoaSA9IDA7IGkg PCBwbHVnc1swXTsgaSsrKSB7CisJCWF2Y19icmlkZ2Vjb19maWxsX3N1YnVuaXRfYWRkcihhZGRy LCAweDYwLAorCQkJCQkgICAgICAgQVZDX0JSSURHRUNPX1BMVUdfRElSX0lOLCBpKTsKKwkJZXJy ID0gYXZjX2JyaWRnZWNvX2dldF9wbHVnX3R5cGUoYmVib2ItPnVuaXQsIGFkZHIsICZ0eXBlKTsK KwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVuZDsKKworCQlpZiAodHlwZSA9PSBBVkNfQlJJREdF Q09fUExVR19UWVBFX1NZTkMpCisJCQliZWJvYi0+c3luY19pbnB1dF9wbHVnID0gaTsKKwl9Citl bmQ6CisJcmV0dXJuIGVycjsKK30KKworLyogSW4gdGhpcyBmdW5jdGlvbiwgMiBtZWFucyBpbnB1 dCBhbmQgb3V0cHV0ICovCitpbnQgc25kX2JlYm9iX3N0cmVhbV9kaXNjb3ZlcihzdHJ1Y3Qgc25k X2JlYm9iICpiZWJvYikKK3sKKwl1OCBwbHVnc1tBVkNfUExVR19JTkZPX0JVRl9DT1VOVF0sIGFk ZHJbQVZDX0JSSURHRUNPX0FERFJfQllURVNdOworCWVudW0gYXZjX2JyaWRnZWNvX3BsdWdfdHlw ZSB0eXBlOworCXVuc2lnbmVkIGludCBpOworCWludCBlcnI7CisKKwkvKiB0aGUgbnVtYmVyIG9m IHBsdWdzIGZvciBpc29jIGluL291dCwgZXh0IGluL291dCAgKi8KKwllcnIgPSBhdmNfZ2VuZXJh bF9nZXRfcGx1Z19pbmZvKGJlYm9iLT51bml0LCAweDFmLCAweDA3LCAweDAwLCBwbHVncyk7CisJ aWYgKGVyciA8IDApCisJCWdvdG8gZW5kOworCisJLyoKKwkgKiBUaGlzIG1vZHVsZSBzdXBwb3J0 cyBvbmUgSVNPQyBpbnB1dCBwbHVnIGFuZCBvbmUgSVNPQyBvdXRwdXQgcGx1ZworCSAqIHRoZW4g aWdub3JlcyB0aGUgb3RoZXJzLgorCSAqLworCWlmIChwbHVnc1swXSA9PSAwKSB7CisJCWVyciA9 IC1FSU87CisJCWdvdG8gZW5kOworCX0KKwlhdmNfYnJpZGdlY29fZmlsbF91bml0X2FkZHIoYWRk ciwgQVZDX0JSSURHRUNPX1BMVUdfRElSX0lOLAorCQkJCSAgICBBVkNfQlJJREdFQ09fUExVR19V TklUX0lTT0MsIDApOworCWVyciA9IGF2Y19icmlkZ2Vjb19nZXRfcGx1Z190eXBlKGJlYm9iLT51 bml0LCBhZGRyLCAmdHlwZSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZW5kOworCWVsc2UgaWYg KHR5cGUgIT0gQVZDX0JSSURHRUNPX1BMVUdfVFlQRV9JU09DKSB7CisJCWVyciA9IC1FSU87CisJ CWdvdG8gZW5kOworCX0KKworCWlmIChwbHVnc1sxXSA9PSAwKSB7CisJCWVyciA9IC1FSU87CisJ CWdvdG8gZW5kOworCX0KKwlhdmNfYnJpZGdlY29fZmlsbF91bml0X2FkZHIoYWRkciwgQVZDX0JS SURHRUNPX1BMVUdfRElSX09VVCwKKwkJCQkgICAgQVZDX0JSSURHRUNPX1BMVUdfVU5JVF9JU09D LCAwKTsKKwllcnIgPSBhdmNfYnJpZGdlY29fZ2V0X3BsdWdfdHlwZShiZWJvYi0+dW5pdCwgYWRk ciwgJnR5cGUpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVuZDsKKwllbHNlIGlmICh0eXBlICE9 IEFWQ19CUklER0VDT19QTFVHX1RZUEVfSVNPQykgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGVu ZDsKKwl9CisKKwkvKiBzdG9yZSBmb3JtYXRpb25zICovCisJZm9yIChpID0gMDsgaSA8IDI7IGkr KykgeworCQllcnIgPSBmaWxsX3N0cmVhbV9mb3JtYXRpb25zKGJlYm9iLCBpLCAwKTsKKwkJaWYg KGVyciA8IDApCisJCQlnb3RvIGVuZDsKKwl9CisKKwkvKiBjb3VudCBleHRlcm5hbCBpbnB1dCBw bHVncyBmb3IgTUlESSAqLworCWJlYm9iLT5taWRpX2lucHV0X3BvcnRzID0gMDsKKwlmb3IgKGkg PSAwOyBpIDwgcGx1Z3NbMl07IGkrKykgeworCQlhdmNfYnJpZGdlY29fZmlsbF91bml0X2FkZHIo YWRkciwgQVZDX0JSSURHRUNPX1BMVUdfRElSX0lOLAorCQkJCQkgICAgQVZDX0JSSURHRUNPX1BM VUdfVU5JVF9FWFQsIGkpOworCQllcnIgPSBhdmNfYnJpZGdlY29fZ2V0X3BsdWdfdHlwZShiZWJv Yi0+dW5pdCwgYWRkciwgJnR5cGUpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZW5kOworCQll bHNlIGlmICh0eXBlID09IEFWQ19CUklER0VDT19QTFVHX1RZUEVfTUlESSkKKwkJCWJlYm9iLT5t aWRpX2lucHV0X3BvcnRzKys7CisJfQorCisJLyogY291bnQgZXh0ZXJuYWwgb3V0cHV0IHBsdWdz IGZvciBNSURJICovCisJYmVib2ItPm1pZGlfb3V0cHV0X3BvcnRzID0gMDsKKwlmb3IgKGkgPSAw OyBpIDwgcGx1Z3NbM107IGkrKykgeworCQlhdmNfYnJpZGdlY29fZmlsbF91bml0X2FkZHIoYWRk ciwgQVZDX0JSSURHRUNPX1BMVUdfRElSX09VVCwKKwkJCQkJICAgIEFWQ19CUklER0VDT19QTFVH X1VOSVRfRVhULCBpKTsKKwkJZXJyID0gYXZjX2JyaWRnZWNvX2dldF9wbHVnX3R5cGUoYmVib2It PnVuaXQsIGFkZHIsICZ0eXBlKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVuZDsKKwkJZWxz ZSBpZiAodHlwZSA9PSBBVkNfQlJJREdFQ09fUExVR19UWVBFX01JREkpCisJCQliZWJvYi0+bWlk aV9vdXRwdXRfcG9ydHMrKzsKKwl9CisKKwkvKiBmb3IgY2hlY2sgc291cmNlIG9mIGNsb2NrIGxh dGVyICovCisJZXJyID0gc2Vla19tc3Vfc3luY19pbnB1dF9wbHVnKGJlYm9iKTsKK2VuZDoKKwly ZXR1cm4gZXJyOworfQotLSAKMS44LjMuMgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KQWxzYS1kZXZlbCBtYWlsaW5nIGxpc3QKQWxzYS1kZXZlbEBhbHNh LXByb2plY3Qub3JnCmh0dHA6Ly9tYWlsbWFuLmFsc2EtcHJvamVjdC5vcmcvbWFpbG1hbi9saXN0 aW5mby9hbHNhLWRldmVsCg==