From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mblankhorst.nl (mblankhorst.nl [141.105.120.124]) by gabe.freedesktop.org (Postfix) with ESMTPS id F09DF6E898 for ; Wed, 3 Apr 2019 10:30:25 +0000 (UTC) From: Maarten Lankhorst Date: Wed, 3 Apr 2019 12:30:09 +0200 Message-Id: <20190403103009.5258-2-maarten.lankhorst@linux.intel.com> In-Reply-To: <20190403103009.5258-1-maarten.lankhorst@linux.intel.com> References: <20190403103009.5258-1-maarten.lankhorst@linux.intel.com> MIME-Version: 1.0 Subject: [igt-dev] [PATCH i-g-t 2/2] otests/kms_yuv: Add yuv specific tests, v5.1. List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: igt-dev@lists.freedesktop.org List-ID: QWRkIHRlc3RzIGV4Y2VyY2lzaW5nIHN3aXRjaGluZyBiZXR3ZWVuIHZhcmlvdXMgc2NhbGVkL3Vu c2NhbGVkCnRyYW5zaXRpb25zIHRvIGFuZCBmcm9tIHZhcmlvdXMgbnYxMiBmb3JtYXRzLCBzaW5j ZSBzb21lIG9mIHRoZQp3b3JrYXJvdW5kcyBtZW50aW9uIHRoaXMgbWF5IGZhaWwuCgpXZSBhbHNv IGFkZCBOVjEyIHNwZWNpZmljIGNsaXBwaW5nL3NjYWxpbmcgdGVzdHMsIHRvIG1ha2Ugc3VyZQp0 aGF0IFlVViBzcmMgY29vcmRpbmF0ZXMgYXJlIGFsd2F5cyBwcm9ncmFtbWVkIGFzIGEgbXVsdGlw bGUgb2YgMgpjb3JyZWN0bHksIGFuZCB2ZXJpZnkgc2NhbGluZy9jbGlwcGluZyB3b3JrcyB3aXRo IENSQyB0ZXN0cy4KCmNyb3Atc2NhbGUtYnVnIHNob3dzIGEgY29ycnVwdGlvbiB3aGVuIHNjYWxp bmcgYW5kIGNyb3BwaW5nIGF0IHRoZQpzYW1lIHRpbWUuCgpUaGUgc3VicGl4ZWwgY2xpcCB0ZXN0 IHJvdGF0ZXMgYW5kIGNsaXBzIGEgcmVjdGFuZ2xlIG9uIGVhY2ggc2lkZSwKd2hpY2ggc2hvdWxk IHByb2R1Y2UgdGhlIHNhbWUgQ1JDIGFzIHdoZW4gdGhhdCBwYXJ0IG9mIHRoZSByZWN0YW5nbGUK aXMgaGlkZGVuIGJ5IGEgY3Vyc29yIGFuZCBhIHdob2xlIDJ4MiBwaXhlbCBpcyBoaWRkZW4uCgpD aGFuZ2VzIHNpbmNlIHYxOgotIFJlc2V0IHBsYW5lIHBvc2l0aW9uIHRvIDAsMCBhdCB0aGUgc3Rh cnQgb2YgeXV2X3ZhbGlkX3dpZHRoX3BsYW5lKCkuCi0gSGFuZGxlIFN3YXRpJ3MgZmVlZGJhY2su CkNoYW5nZXMgc2luY2UgdjI6Ci0gU2tpcCA5MMKwLzI3MMKwIHJvdGF0aW9uIGluIHRlc3RzIHdo ZW4gZm9ybWF0cyBkb24ndCBzdXBwb3J0IGl0LgotIEFkZCBhbGwgbmV3IEhEUiBmb3JtYXRzIHRv IHRlc3QuCi0gVXNlIGlndF9wbGFuZV9oYXNfZm9ybWF0X21vZC4KLSBTdXBwb3J0IHRlc3RzIG9u ICFpOTE1IGJ5IGNoZWNraW5nIGlmIFgvWSB0aWxpbmcgbW9kaWZpZXJzIGFyZSBzdXBwb3J0ZWQu Ci0gRG8gbm90IGVuYWJsZSB1bnRlc3RlZCBwbGFuZXMgdG8gcHJldmVudCBleGhhdXNpbmcgbWVt b3J5IGJhbmR3aWR0aAogIGFuZCBhdmFpbGFibGUgTlYxMiBZIHBsYW5lcyBpbiB0aGUgcmdiLXN3 aXRjaC1zY2FsZWQgdGVzdC4KQ2hhbmdlcyBzaW5jZSB2MzoKLSBBZGQgYSBzYW5pdHkgdGVzdCB0 byBzYW5pdHkgdGVzdCBZVVYgY29udmVyc2lvbiBwYXRocywgb24gYWxsIHBsYW5lcyBhbmQgcGlw ZXMuCi0gRHluYW1pY2FsbHkgZ2VuZXJhdGUgbGlzdCBvZiBZVVYgdGVzdHMgdGhyb3VnaCBpZ3Rf Zm9ybWF0X2FycmF5X2ZpbGwuCkNoYW5nZXMgc2luY2UgdjQ6Ci0gRGVjcmVhc2Ugc2l6ZSB0byA2 NHg2NCB0byByZWR1Y2UgdGVzdCBleGVjdXRpb24gdGltZSBldmVuIG1vcmUsCiAgc29tZSBZVVYg Y29udmVyc2lvbiByb3V0aW5lcyBhcmUgc2xvdy4KLSBEb24ndCBjbGVhciBkZWdhbW1hL2N0bSwg dGhpcyBpcyBkb25lIGluIGNvcmUgbm93LgpDaGFuZ2VzIHNpbmNlIHY1OgotIEZpeCBtaW5vciBj b21waWxlIGVycm9yLgoKU2lnbmVkLW9mZi1ieTogTWFhcnRlbiBMYW5raG9yc3QgPG1hYXJ0ZW4u bGFua2hvcnN0QGxpbnV4LmludGVsLmNvbT4KLS0tCiB0ZXN0cy9NYWtlZmlsZS5zb3VyY2VzIHwg ICAxICsKIHRlc3RzL2ttc195dXYuYyAgICAgICAgfCA5MzYgKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysKIHRlc3RzL21lc29uLmJ1aWxkICAgICAgfCAgIDEgKwogMyBm aWxlcyBjaGFuZ2VkLCA5MzggaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHRlc3Rz L2ttc195dXYuYwoKZGlmZiAtLWdpdCBhL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMgYi90ZXN0cy9N YWtlZmlsZS5zb3VyY2VzCmluZGV4IDcxY2NmMDBhZjI1Ni4uNWViNDYwODdlMzYyIDEwMDY0NAot LS0gYS90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzCisrKyBiL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMK QEAgLTc0LDYgKzc0LDcgQEAgVEVTVFNfcHJvZ3MgPSBcCiAJa21zX3VuaXZlcnNhbF9wbGFuZSBc CiAJa21zX3ZibGFuayBcCiAJa21zX3ZyciBcCisJa21zX3l1diBcCiAJbWV0YV90ZXN0IFwKIAlw ZXJmIFwKIAlwZXJmX3BtdSBcCmRpZmYgLS1naXQgYS90ZXN0cy9rbXNfeXV2LmMgYi90ZXN0cy9r bXNfeXV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi42MzE4N2M0 OGMyOGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9rbXNfeXV2LmMKQEAgLTAsMCArMSw5MzYg QEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxOSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBl cm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29u IG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9j dW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29m dHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgor ICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3Ry aWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJl LCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5p c2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgor ICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ug c2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlv bnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMg SVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVE LCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5U QUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZS SU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQg SE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElB QklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJ U0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNP RlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4K KyAqCisgKiBBdXRob3JzOgorICogICAgTWFhcnRlbiBMYW5raG9yc3QgPG1hYXJ0ZW4ubGFua2hv cnN0QGxpbnV4LmludGVsLmNvbT4KKyAqLworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVk ZSAiaWd0LmgiCisjaW5jbHVkZSA8Y2Fpcm8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1 ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+ CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpZ3RfZGlzcGxheV90IGRpc3BsYXk7CisKKwlpZ3RfcGlw ZV9jcmNfdCAqcGlwZV9jcmM7CisJc3RydWN0IGlndF9mYiBmYls2XTsKK30gZGF0YV90OworCitz dGF0aWMgdWludDY0X3QgeF9tb2RpZmllciA9IExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkU7Citz dGF0aWMgdWludDY0X3QgeV9tb2RpZmllciA9IExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkU7Citz dGF0aWMgdWludDMyX3QgKmZvcm1hdHMsIGNvdW50X2Zvcm1hdHM7CisKK3N0YXRpYyBib29sIHBp cGVfc3VwcG9ydHNfZm9ybWF0KGlndF9kaXNwbGF5X3QgKmRpc3BsYXksIGVudW0gcGlwZSBwaXBl LAorCQkJCSB1aW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHRpbGluZykKK3sKKwlpZ3RfcGxhbmVf dCAqcGxhbmU7CisKKwlmb3JfZWFjaF9wbGFuZV9vbl9waXBlKGRpc3BsYXksIHBpcGUsIHBsYW5l KQorCQlpZiAoaWd0X3BsYW5lX2hhc19mb3JtYXRfbW9kKHBsYW5lLCBmb3JtYXQsIHRpbGluZykp CisJCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworCitzdGF0aWMgdm9pZCBy ZW1vdmVfZmJzKGRhdGFfdCAqZGF0YSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBB UlJBWV9TSVpFKGRhdGEtPmZiKTsgaSsrKQorCQlpZ3RfcmVtb3ZlX2ZiKGRhdGEtPmRpc3BsYXku ZHJtX2ZkLCAmZGF0YS0+ZmJbaV0pOworfQorCitzdGF0aWMgdm9pZCBwcmVwYXJlX2NydGMoZGF0 YV90ICpkYXRhLCBlbnVtIHBpcGUgcGlwZSwgaWd0X291dHB1dF90ICpvdXRwdXQpCit7CisJaWd0 X2Rpc3BsYXlfdCAqZGlzcGxheSA9ICZkYXRhLT5kaXNwbGF5OworCisJcmVtb3ZlX2ZicyhkYXRh KTsKKwlpZ3RfZGlzcGxheV9yZXNldChkaXNwbGF5KTsKKwlpZ3Rfb3V0cHV0X3NldF9waXBlKG91 dHB1dCwgcGlwZSk7CisJaWd0X2Rpc3BsYXlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlD KTsKKworCWlndF9waXBlX2NyY19mcmVlKGRhdGEtPnBpcGVfY3JjKTsKKwlkYXRhLT5waXBlX2Ny YyA9IGlndF9waXBlX2NyY19uZXcoZGlzcGxheS0+ZHJtX2ZkLCBwaXBlLAorCQkJCQkgIElOVEVM X1BJUEVfQ1JDX1NPVVJDRV9BVVRPKTsKK30KKworc3RhdGljIHZvaWQgZnVkZ2VfbHV0KGRhdGFf dCAqZGF0YSwgZW51bSBwaXBlIHBpcGUsIHVpbnQxNl90IG1hc2spCit7CisJaWd0X3BpcGVfdCAq cGlwZV9vYmogPSAmZGF0YS0+ZGlzcGxheS5waXBlc1twaXBlXTsKKwl1aW50MTZfdCAqbHV0Owor CWludCBpLCBsdXRfc2l6ZTsKKworCWlmICghaWd0X3BpcGVfb2JqX2hhc19wcm9wKHBpcGVfb2Jq LCBJR1RfQ1JUQ19HQU1NQV9MVVRfU0laRSkpCisJCXJldHVybjsKKworCWx1dF9zaXplID0gaWd0 X3BpcGVfb2JqX2dldF9wcm9wKHBpcGVfb2JqLCBJR1RfQ1JUQ19HQU1NQV9MVVRfU0laRSk7CisK KwlsdXQgPSBtYWxsb2Moc2l6ZW9mKHVpbnQxNl90KSAqIGx1dF9zaXplKTsKKwlmb3IgKGkgPSAw OyBpIDwgbHV0X3NpemU7IGkrKykKKwkJbHV0W2ldID0gKGkgKiAweGZmZmYgLyAobHV0X3NpemUg LSAxKSkgJiBtYXNrOworCisJaWd0X3BpcGVfb2JqX3JlcGxhY2VfcHJvcF9ibG9iKHBpcGVfb2Jq LCBJR1RfQ1JUQ19HQU1NQV9MVVQsIGx1dCwgbHV0X3NpemUgKiBzaXplb2YodWludDE2X3QpKTsK KwlmcmVlKGx1dCk7Cit9CisKK3N0YXRpYyB2b2lkIHVuZnVkZ2VfbHV0KGRhdGFfdCAqZGF0YSwg ZW51bSBwaXBlIHBpcGUpCit7CisJaWd0X3BpcGVfdCAqcGlwZV9vYmogPSAmZGF0YS0+ZGlzcGxh eS5waXBlc1twaXBlXTsKKworCWlmIChpZ3RfcGlwZV9vYmpfaGFzX3Byb3AocGlwZV9vYmosIElH VF9DUlRDX0dBTU1BX0xVVCkpCisJCWlndF9waXBlX29ial9yZXBsYWNlX3Byb3BfYmxvYihwaXBl X29iaiwgSUdUX0NSVENfR0FNTUFfTFVULCBOVUxMLCAwKTsKK30KKworLyoKKyAqIFRlc3QgdGhh dCB3ZSBpbml0aWFsaXplIGEgWVVWIGZiIGFzIGJsYWNrIGNvcnJlY3RseSwKKyAqIHRoYXQgd2hl biB3ZSB3cml0ZSBhIGJsYWNrIEZCIGl0IHdpbGwgZ2V0IHRoZSBzYW1lIENSQywgYW5kIHRoYXQK KyAqIGFsbCBjb2xvcnMgd2UgdGVzdCB3aWxsIGdpdmUgdGhlIHNhbWUgQ1JDIG9uIGFsbCBmb3Jt YXRzLgorICovCitzdGF0aWMgdm9pZCB5dXZfc2FuaXR5KGRhdGFfdCAqZGF0YSwgZW51bSBwaXBl IHBpcGUsIGlndF9vdXRwdXRfdCAqb3V0cHV0KQoreworCWlndF9kaXNwbGF5X3QgKmRpc3BsYXkg PSAmZGF0YS0+ZGlzcGxheTsKKwlpZ3RfcGxhbmVfdCAqcGxhbmU7CisJaWd0X2NyY190IGJsYWNr X2NyYywgY29sb3JfY3JjLCBjcmM7CisJYm9vbCBmaXJzdCA9IHRydWU7CisKKwlwcmVwYXJlX2Ny dGMoZGF0YSwgcGlwZSwgb3V0cHV0KTsKKworCWZvcl9lYWNoX3BsYW5lX29uX3BpcGUoZGlzcGxh eSwgcGlwZSwgcGxhbmUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudF9mb3JtYXRzOyBp KyspIHsKKwkJCXN0cnVjdCBpZ3RfZmIgKmZiID0gJmRhdGEtPmZiWzBdOworCQkJY2Fpcm9fdCAq Y3I7CisKKwkJCWlmICghaWd0X2Zvcm1hdF9pc195dXYoZm9ybWF0c1tpXSkgfHwKKwkJCSAgICAh aWd0X3BsYW5lX2hhc19mb3JtYXRfbW9kKHBsYW5lLCBmb3JtYXRzW2ldLCB4X21vZGlmaWVyKSkK KwkJCQljb250aW51ZTsKKworCQkJaWd0X2RlYnVnKCJUZXN0aW5nIGZvcm1hdCAlLjRzIG9uIHBs YW5lICVpXG4iLAorCQkJCSAoY2hhciAqKSZmb3JtYXRzW2ldLCBwbGFuZS0+aW5kZXgpOworCQkJ aWd0X2NyZWF0ZV9mYihkaXNwbGF5LT5kcm1fZmQsIDY0LCA2NCwgZm9ybWF0c1tpXSwKKwkJCQkg ICAgICB4X21vZGlmaWVyLCBmYik7CisKKwkJCWlndF9wbGFuZV9zZXRfZmIocGxhbmUsIGZiKTsK KwkJCWlndF9kaXNwbGF5X2NvbW1pdDIoZGlzcGxheSwgQ09NTUlUX0FUT01JQyk7CisJCQlpZiAo IWZpcnN0KSB7CisJCQkJaWd0X3BpcGVfY3JjX2NvbGxlY3RfY3JjKGRhdGEtPnBpcGVfY3JjLCAm Y3JjKTsKKwkJCQlpZ3RfYXNzZXJ0X2NyY19lcXVhbCgmYmxhY2tfY3JjLCAmY3JjKTsKKwkJCX0g ZWxzZSB7CisJCQkJaWd0X3BpcGVfY3JjX2NvbGxlY3RfY3JjKGRhdGEtPnBpcGVfY3JjLCAmYmxh Y2tfY3JjKTsKKwkJCX0KKworCQkJLyogQ29tcGFyZSBpbml0aWFsIGJsYWNrIGZiIHdpdGggcmVm ZXJlbmNlIHBhaW50ZWQgYmxhY2sgY29sb3IgKi8KKwkJCWNyID0gaWd0X2dldF9jYWlyb19jdHgo ZGlzcGxheS0+ZHJtX2ZkLCBmYik7CisJCQlpZ3RfcGFpbnRfY29sb3IoY3IsIDAsIDAsIGZiLT53 aWR0aCwgZmItPmhlaWdodCwgMC4sIDAuLCAwLik7CisJCQlpZ3RfcHV0X2NhaXJvX2N0eChkaXNw bGF5LT5kcm1fZmQsIGZiLCBjcik7CisJCQlpZ3RfZGlydHlfZmIoZGlzcGxheS0+ZHJtX2ZkLCBm Yik7CisJCQlpZ3Rfd2FpdF9mb3JfdmJsYW5rKGRpc3BsYXktPmRybV9mZCwgcGlwZSk7CisJCQlp Z3RfcGlwZV9jcmNfY29sbGVjdF9jcmMoZGF0YS0+cGlwZV9jcmMsICZjcmMpOworCQkJaWd0X2Fz c2VydF9jcmNfZXF1YWwoJmJsYWNrX2NyYywgJmNyYyk7CisKKworCQkJLyogV3JpdGUgYSBjb2xv ciBmYiAqLworCQkJY3IgPSBpZ3RfZ2V0X2NhaXJvX2N0eChkaXNwbGF5LT5kcm1fZmQsIGZiKTsK KwkJCWlndF9wYWludF9jb2xvcihjciwgMCwgMCwgZmItPndpZHRoLCBmYi0+aGVpZ2h0LCAxLiwg MS4sIDAuKTsKKwkJCWlndF9wdXRfY2Fpcm9fY3R4KGRpc3BsYXktPmRybV9mZCwgZmIsIGNyKTsK KwkJCWZ1ZGdlX2x1dChkYXRhLCBwaXBlLCAweGZjMDApOworCQkJaWd0X3BsYW5lX3NldF9mYihw bGFuZSwgZmIpOworCQkJaWd0X2Rpc3BsYXlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlD KTsKKworCQkJaWYgKCFmaXJzdCkgeworCQkJCWlndF9waXBlX2NyY19jb2xsZWN0X2NyYyhkYXRh LT5waXBlX2NyYywgJmNyYyk7CisJCQkJaWd0X2Fzc2VydF9jcmNfZXF1YWwoJmNvbG9yX2NyYywg JmNyYyk7CisJCQl9IGVsc2UgeworCQkJCWlndF9waXBlX2NyY19jb2xsZWN0X2NyYyhkYXRhLT5w aXBlX2NyYywgJmNvbG9yX2NyYyk7CisJCQkJZmlyc3QgPSBmYWxzZTsKKwkJCX0KKworCQkJLyog Q29udmVydCBmcm9tIFlVViwgYmFjayB0byBZVVYsIHRvIGV4cG9zZSBidWdzIGluIGNvbnZlcnNp b24gcm91dGluZXMgKi8KKwkJCWNyID0gaWd0X2dldF9jYWlyb19jdHgoZGlzcGxheS0+ZHJtX2Zk LCBmYik7CisJCQlpZ3RfcHV0X2NhaXJvX2N0eChkaXNwbGF5LT5kcm1fZmQsIGZiLCBjcik7CisJ CQlpZ3RfZGlydHlfZmIoZGlzcGxheS0+ZHJtX2ZkLCBmYik7CisJCQlpZ3Rfd2FpdF9mb3JfdmJs YW5rKGRpc3BsYXktPmRybV9mZCwgcGlwZSk7CisJCQlpZ3RfcGlwZV9jcmNfY29sbGVjdF9jcmMo ZGF0YS0+cGlwZV9jcmMsICZjcmMpOworCQkJaWd0X2Fzc2VydF9jcmNfZXF1YWwoJmNvbG9yX2Ny YywgJmNyYyk7CisKKwkJCXVuZnVkZ2VfbHV0KGRhdGEsIHBpcGUpOworCQkJaWd0X3BsYW5lX3Nl dF9mYihwbGFuZSwgTlVMTCk7CisJCQlpZ3RfcmVtb3ZlX2ZiKGRpc3BsYXktPmRybV9mZCwgJmRh dGEtPmZiWzBdKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc2V0X2ZiKGlndF9wbGFuZV90 ICpwbGFuZSwgc3RydWN0IGlndF9mYiAqZmIsCisJCSAgIGJvb2wgc2NhbGVkLCBpZ3Rfcm90YXRp b25fdCByb3QpCit7CisJaWd0X3BsYW5lX3NldF9mYihwbGFuZSwgZmIpOworCisJaWYgKHNjYWxl ZCAmJiBmYikKKwkJaWd0X2ZiX3NldF9zaXplKGZiLCBwbGFuZSwgZmItPndpZHRoLCAxNik7CisK KwlpZ3RfcGxhbmVfc2V0X3JvdGF0aW9uKHBsYW5lLCByb3QpOworCWlmIChmYiAmJiAocm90ID09 IElHVF9ST1RBVElPTl85MCB8fCByb3QgPT0gSUdUX1JPVEFUSU9OXzI3MCkpCisJCWlndF9wbGFu ZV9zZXRfc2l6ZShwbGFuZSwgZmItPmhlaWdodCwgZmItPndpZHRoKTsKK30KKworc3RhdGljIHZv aWQgeXV2X3JnYl9zd2l0Y2goZGF0YV90ICpkYXRhLCBlbnVtIHBpcGUgcGlwZSwKKwkJCSAgIGln dF9vdXRwdXRfdCAqb3V0cHV0LCBib29sIHNjYWxlZCwgdW5zaWduZWQgZm9ybWF0KQoreworCWRy bU1vZGVNb2RlSW5mbyAqbW9kZSA9IGlndF9vdXRwdXRfZ2V0X21vZGUob3V0cHV0KTsKKwlpZ3Rf ZGlzcGxheV90ICpkaXNwbGF5ID0gJmRhdGEtPmRpc3BsYXk7CisJaWd0X3BsYW5lX3QgKnBsYW5l OworCWludCBpOworCWlndF9jcmNfdCByZWZfY3JjWzRdLCBjcmM7CisJYm9vbCB2YWxpZFs0XSA9 IHt9OworCisJcHJlcGFyZV9jcnRjKGRhdGEsIHBpcGUsIG91dHB1dCk7CisKKwlpZ3RfY3JlYXRl X3BhdHRlcm5fZmIoZGlzcGxheS0+ZHJtX2ZkLCBtb2RlLT5oZGlzcGxheSwgbW9kZS0+dmRpc3Bs YXksCisJCQkgICAgICBmb3JtYXQsIHhfbW9kaWZpZXIsICZkYXRhLT5mYlswXSk7CisKKwlpZ3Rf Y3JlYXRlX3BhdHRlcm5fZmIoZGlzcGxheS0+ZHJtX2ZkLCBtb2RlLT52ZGlzcGxheSwgbW9kZS0+ aGRpc3BsYXksCisJCQkgICAgICBmb3JtYXQsIHlfbW9kaWZpZXIsICZkYXRhLT5mYlsxXSk7CisK KwlpZ3RfY3JlYXRlX3BhdHRlcm5fZmIoZGlzcGxheS0+ZHJtX2ZkLCBtb2RlLT5oZGlzcGxheSwg bW9kZS0+dmRpc3BsYXksCisJCQkgICAgICBEUk1fRk9STUFUX1hSR0I4ODg4LCB4X21vZGlmaWVy LCAmZGF0YS0+ZmJbMl0pOworCisJaWd0X2NyZWF0ZV9wYXR0ZXJuX2ZiKGRpc3BsYXktPmRybV9m ZCwgbW9kZS0+dmRpc3BsYXksIG1vZGUtPmhkaXNwbGF5LAorCQkJICAgICAgRFJNX0ZPUk1BVF9Y UkdCODg4OCwgeV9tb2RpZmllciwgJmRhdGEtPmZiWzNdKTsKKworCWZvcl9lYWNoX3BsYW5lX29u X3BpcGUoZGlzcGxheSwgcGlwZSwgcGxhbmUpIHsKKwkJY29uc3QgaW50IHNlcVtdID0geworCQkJ MiwgMCwgMiwgMSwgMywgMSwgMworCQl9OworCisJCWlmICghaWd0X3BsYW5lX2hhc19mb3JtYXRf bW9kKHBsYW5lLCBmb3JtYXQsIGRhdGEtPmZiWzBdLm1vZGlmaWVyKSkKKwkJCWNvbnRpbnVlOwor CisJCS8qIENvbGxlY3QgcmVmZXJlbmNlIGNyYyB3aXRoIHRvZ2dsZSBpbiBiZXR3ZWVuLiAqLwor CQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZWZfY3JjKTsgaSsrKSB7CisJCQlpZ3Rfcm90 YXRpb25fdCByb3QgPSAoaSA9PSAxIHx8IGkgPT0gMykgPworCQkJCUlHVF9ST1RBVElPTl85MCA6 IElHVF9ST1RBVElPTl8wOworCisJCQlzZXRfZmIocGxhbmUsICZkYXRhLT5mYltpXSwgc2NhbGVk LCByb3QpOworCisJCQlpZ3RfZGlzcGxheV9jb21taXQyKGRpc3BsYXksIENPTU1JVF9BVE9NSUMp OworCQkJaWd0X3BpcGVfY3JjX2NvbGxlY3RfY3JjKGRhdGEtPnBpcGVfY3JjLCAmcmVmX2NyY1tp XSk7CisJCQl2YWxpZFtpXSA9IHRydWU7CisKKwkJCXNldF9mYihwbGFuZSwgTlVMTCwgc2NhbGVk LCByb3QpOworCQkJaWd0X2Rpc3BsYXlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlDKTsK KwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNlcSk7IGkrKykgeworCQkJaW50 IGogPSBzZXFbaV07CisJCQlpZ3Rfcm90YXRpb25fdCByb3QgPSAoaiA9PSAxIHx8IGogPT0gMykg PworCQkJCUlHVF9ST1RBVElPTl85MCA6IElHVF9ST1RBVElPTl8wOworCisJCQlpZiAoIXZhbGlk W2pdKQorCQkJCWNvbnRpbnVlOworCisJCQlzZXRfZmIocGxhbmUsICZkYXRhLT5mYltqXSwgc2Nh bGVkLCByb3QpOworCQkJaWd0X2Rpc3BsYXlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlD KTsKKworCQkJaWd0X3BpcGVfY3JjX2NvbGxlY3RfY3JjKGRhdGEtPnBpcGVfY3JjLCAmY3JjKTsK KwkJCWlndF9hc3NlcnRfY3JjX2VxdWFsKCZyZWZfY3JjW2pdLCAmY3JjKTsKKwkJfQorCisJCS8q IFdlIG9ubHkgaGF2ZSBmZXcgc2NhbGVycywgZG9uJ3QgdXNlIDEgZm9yIHVudXNlZCBwbGFuZXMg Ki8KKwkJaWd0X3BsYW5lX3NldF9mYihwbGFuZSwgTlVMTCk7CisJfQorfQorCisjZGVmaW5lIGFz c2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKHBpcGVfY3JjLCBjcmMsIHJlZl9jcmMpIFwKKwlkbyB7 IFwKKwkJaWd0X3BpcGVfY3JjX2dldF9jdXJyZW50KGRpc3BsYXktPmRybV9mZCwgcGlwZV9jcmMs IGNyYyk7CVwKKwkJaWd0X2Fzc2VydF9jcmNfZXF1YWwocmVmX2NyYywgY3JjKTsJXAorCX0gd2hp bGUgKDApCisKK3N0YXRpYyB2b2lkIHNldF9zcmNfY29vcmRzKGlndF9wbGFuZV90ICpwbGFuZSwg c3RydWN0IGlndF9mYiAqZmIsCisJCQkgICBpZ3Rfcm90YXRpb25fdCByb3QsIGludCB2aXMsIGlu dCBoaWRkZW4pCit7CisJc3dpdGNoIChyb3QpIHsKKwljYXNlIElHVF9ST1RBVElPTl8wOgorCQlp Z3RfZmJfc2V0X3Bvc2l0aW9uKGZiLCBwbGFuZSwgZmItPndpZHRoIC8gMiAtIHZpcywgZmItPmhl aWdodCAvIDIgLSB2aXMpOworCQlicmVhazsKKwljYXNlIElHVF9ST1RBVElPTl85MDoKKwkJaWd0 X2ZiX3NldF9wb3NpdGlvbihmYiwgcGxhbmUsIGZiLT53aWR0aCAvIDIgLSBoaWRkZW4sIGZiLT5o ZWlnaHQgLyAyIC0gdmlzKTsKKwkJYnJlYWs7CisJY2FzZSBJR1RfUk9UQVRJT05fMTgwOgorCQlp Z3RfZmJfc2V0X3Bvc2l0aW9uKGZiLCBwbGFuZSwgZmItPndpZHRoIC8gMiAtIGhpZGRlbiwgZmIt PmhlaWdodCAvIDIgLSBoaWRkZW4pOworCQlicmVhazsKKwljYXNlIElHVF9ST1RBVElPTl8yNzA6 CisJCWlndF9mYl9zZXRfcG9zaXRpb24oZmIsIHBsYW5lLCBmYi0+d2lkdGggLyAyIC0gdmlzLCBm Yi0+aGVpZ2h0IC8gMiAtIGhpZGRlbik7CisJCWJyZWFrOworCWRlZmF1bHQ6IGlndF9hc3NlcnQo MCk7CisJfQorCWlndF9mYl9zZXRfc2l6ZShmYiwgcGxhbmUsIHZpcyArIGhpZGRlbiwgdmlzICsg aGlkZGVuKTsKK30KKworc3RhdGljIHZvaWQgeXV2X3ZhbGlkX3dpZHRoX3BsYW5lKGRhdGFfdCAq ZGF0YSwgZHJtTW9kZU1vZGVJbmZvICptb2RlLAorCQkJCSAgaWd0X3BsYW5lX3QgKnBsYW5lLCBp Z3Rfcm90YXRpb25fdCByb3QsCisJCQkJICBpZ3RfY3JjX3QgKnJlZl9jcmMpCit7CisJaWd0X2Rp c3BsYXlfdCAqZGlzcGxheSA9ICZkYXRhLT5kaXNwbGF5OworCWlndF9jcmNfdCBjcmM7CisJc3Ry dWN0IGlndF9mYiAqY2xpcF9mYiA9ICZkYXRhLT5mYlsyXTsKKwlpbnQgaSwgcmV0OworCisJLyog SnVzdCBjbGlwcGluZy4uICovCisJaWd0X3BsYW5lX3NldF9mYihwbGFuZSwgY2xpcF9mYik7CisJ aWd0X3BsYW5lX3NldF9yb3RhdGlvbihwbGFuZSwgcm90KTsKKwlpZiAocm90ICYgKElHVF9ST1RB VElPTl85MCB8IElHVF9ST1RBVElPTl8yNzApKQorCQlpZ3RfcGxhbmVfc2V0X3NpemUocGxhbmUs IGNsaXBfZmItPmhlaWdodCwgY2xpcF9mYi0+d2lkdGgpOworCWlndF9wbGFuZV9zZXRfcG9zaXRp b24ocGxhbmUsIG1vZGUtPmhkaXNwbGF5IC0gY2xpcF9mYi0+d2lkdGggLyAyLCBtb2RlLT52ZGlz cGxheSAtIGNsaXBfZmItPmhlaWdodCAvIDIpOworCWlmICgocm90ID09IElHVF9ST1RBVElPTl85 MCB8fCByb3QgPT0gSUdUX1JPVEFUSU9OXzI3MCkgJiYKKwkgICAgaWd0X2Rpc3BsYXlfdHJ5X2Nv bW1pdDIoZGlzcGxheSwgQ09NTUlUX0FUT01JQykgPCAwKSB7CisJCWlndF9kZWJ1ZygiVGhpcyBy b3RhdGlvbiBub3QgYXZhaWxhYmxlIGZvciB0aGlzIGZvcm1hdC5cbiIpOworCQlyZXR1cm47CisJ fQorCisJaWd0X2Rpc3BsYXlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlDKTsKKwlhc3Nl cnRfY29sbGVjdGVkX2NyY19lcXVhbChkYXRhLT5waXBlX2NyYywgJmNyYywgcmVmX2NyYyk7CisK KwkvKiBDbGlwcGluZyBhbmQgc2NhbGluZy4gKi8KKwlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGNsaXBf ZmIsIHBsYW5lLCBjbGlwX2ZiLT53aWR0aCAvIDIgLSAxNiwgY2xpcF9mYi0+aGVpZ2h0IC8gMiAt IDE2KTsKKwlpZ3RfZmJfc2V0X3NpemUoY2xpcF9mYiwgcGxhbmUsIDMyLCAzMik7CisJaWd0X2Rp c3BsYXlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlDKTsKKwlhc3NlcnRfY29sbGVjdGVk X2NyY19lcXVhbChkYXRhLT5waXBlX2NyYywgJmNyYywgcmVmX2NyYyk7CisKKwkvKiBUcnkgbnZh bGlkIDwgOCBzcmMgdmlzaWJsZS4gKi8KKwlzZXRfc3JjX2Nvb3JkcyhwbGFuZSwgY2xpcF9mYiwg cm90LCA0LCA0KTsKKwlpZ3RfZGlzcGxheV90cnlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRP TUlDKTsKKworCS8qIFRyeSBkaWZmZXJlbnQgYWxpZ25tZW50cyBmb3IgeC95IHRvIHNlZSBpZiBh bnkgaGl0IHVuZGVycnVucyAqLworCWZvciAoaSA9IDE7IGkgPCA0OyBpKyspIHsKKwkJc2V0X3Ny Y19jb29yZHMocGxhbmUsIGNsaXBfZmIsIHJvdCwgMTYgKyAyICogaSwgMTYgLSAyICogaSk7CisJ CWlndF9kaXNwbGF5X2NvbW1pdDIoZGlzcGxheSwgQ09NTUlUX0FUT01JQyk7CisJCWFzc2VydF9j b2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBpcGVfY3JjLCAmY3JjLCByZWZfY3JjKTsKKworCQkv KiBBbmQgYWxzbyBzaG93IG1vcmUgb2YgdGhlIHNjcmVlbiAqLworCQlzZXRfc3JjX2Nvb3Jkcyhw bGFuZSwgY2xpcF9mYiwgcm90LCAxNiArIGksIDE2ICsgaSk7CisJCXJldCA9IGlndF9kaXNwbGF5 X3RyeV9jb21taXQyKGRpc3BsYXksIENPTU1JVF9BVE9NSUMpOworCisJCWlmIChyZXQgPT0gLUVJ TlZBTCkgeworCQkJaWd0X2Fzc2VydChpICUgMiB8fCByb3QgPT0gSUdUX1JPVEFUSU9OXzI3MCB8 fCByb3QgPT0gKElHVF9ST1RBVElPTl85MCB8IElHVF9SRUZMRUNUX1gpKTsKKwkJCWNvbnRpbnVl OworCQl9IGVsc2UKKwkJCWlndF9hc3NlcnRfZXEocmV0LCAwKTsKKwkJYXNzZXJ0X2NvbGxlY3Rl ZF9jcmNfZXF1YWwoZGF0YS0+cGlwZV9jcmMsICZjcmMsIHJlZl9jcmMpOworCX0KKworCS8qCisJ ICogQXMgYSBmaW5hbCB0ZXN0LCB0cnkgd2l0aCAxNiBzcmMgdmlzaWJsZSwgYW5kIHZhcmlvdXMg aW52aXNpYmxlCisJICogY29tcG9uZW50cyB0byBjaGVjayBjbGlwcGluZyBkb2Vzbid0IGRyb3Ag dGhlIHZpc2libGUgc3JjIGJlbG93IDE2LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSAr PSA0KSB7CisJCXNldF9zcmNfY29vcmRzKHBsYW5lLCBjbGlwX2ZiLCByb3QsIDE2LCBpKTsKKwkJ aWYgKHJvdCAmIChJR1RfUk9UQVRJT05fOTAgfCBJR1RfUk9UQVRJT05fMjcwKSkKKwkJCWlndF9w bGFuZV9zZXRfc2l6ZShwbGFuZSwgKGNsaXBfZmItPmhlaWdodCAvIDMyKSAqICgxNiArIGkpLAor CQkJCQkgICAoY2xpcF9mYi0+d2lkdGggLyAzMikgKiAoMTYgKyBpKSk7CisJCWVsc2UKKwkJCWln dF9wbGFuZV9zZXRfc2l6ZShwbGFuZSwgKGNsaXBfZmItPndpZHRoIC8gMzIpICogKDE2ICsgaSks CisJCQkJCSAgIChjbGlwX2ZiLT5oZWlnaHQgLyAzMikgKiAoMTYgKyBpKSk7CisJCWlndF9kaXNw bGF5X2NvbW1pdDIoZGlzcGxheSwgQ09NTUlUX0FUT01JQyk7CisJCWFzc2VydF9jb2xsZWN0ZWRf Y3JjX2VxdWFsKGRhdGEtPnBpcGVfY3JjLCAmY3JjLCByZWZfY3JjKTsKKwl9Cit9CisKK3N0YXRp YyB2b2lkIHl1dl92YWxpZF93aWR0aChkYXRhX3QgKmRhdGEsIGVudW0gcGlwZSBwaXBlLCBpZ3Rf b3V0cHV0X3QgKm91dHB1dCwgdW5zaWduZWQgZm9ybWF0KQoreworCWRybU1vZGVNb2RlSW5mbyAq bW9kZSA9IGlndF9vdXRwdXRfZ2V0X21vZGUob3V0cHV0KTsKKwlpZ3RfZGlzcGxheV90ICpkaXNw bGF5ID0gJmRhdGEtPmRpc3BsYXk7CisJaWd0X3BsYW5lX3QgKnBsYW5lOworCXN0cnVjdCBpZ3Rf ZmIgKmNsaXBfZmIgPSAmZGF0YS0+ZmJbMl07CisJc3RydWN0IGlndF9mYiAqcmVmX2ZiID0gJmRh dGEtPmZiWzNdOworCisJcHJlcGFyZV9jcnRjKGRhdGEsIHBpcGUsIG91dHB1dCk7CisKKwlpZ3Rf Y3JlYXRlX2ZiKGRpc3BsYXktPmRybV9mZCwgNjQsIDY0LCBmb3JtYXQsIHlfbW9kaWZpZXIsIHJl Zl9mYik7CisKKwlpZ3RfY3JlYXRlX2ZiKGRpc3BsYXktPmRybV9mZCwgMiAqIHJlZl9mYi0+d2lk dGgsCisJCSAgICAgIDIgKiByZWZfZmItPmhlaWdodCwgZm9ybWF0LCB5X21vZGlmaWVyLCBjbGlw X2ZiKTsKKworCWlndF9waXBlX2NyY19zdGFydChkYXRhLT5waXBlX2NyYyk7CisKKwlmb3JfZWFj aF9wbGFuZV9vbl9waXBlKGRpc3BsYXksIHBpcGUsIHBsYW5lKSB7CisJCWlndF9jcmNfdCByZWZf Y3JjWzRdOworCQljYWlyb190ICpjcjsKKwkJc3RhdGljIGNvbnN0IGRvdWJsZSBjb2xvcnNbNF1b M10gPSB7CisJCQl7IDEuLCAwLiwgMC4gfSwKKwkJCXsgMC4sIDEuLCAwLiB9LAorCQkJeyAwLiwg MC4sIDEuIH0sCisJCQl7IDEuLCAxLiwgMS4gfQorCQl9OworCQlpbnQgaTsKKworCQlpZiAoIWln dF9wbGFuZV9oYXNfZm9ybWF0X21vZChwbGFuZSwgZm9ybWF0LCBkYXRhLT5mYlswXS5tb2RpZmll cikpCisJCQljb250aW51ZTsKKworCQkvKiBEcmF3IHRoZSBGQiB0aGF0IHdpbGwgYmUgdXNlZCBm b3IgY2xpcHBpbmcgdGVzdHMuICovCisJCWNyID0gaWd0X2dldF9jYWlyb19jdHgoZGlzcGxheS0+ ZHJtX2ZkLCBjbGlwX2ZiKTsKKwkJaWd0X3BhaW50X2NvbG9yKGNyLCAwLCAwLCBjbGlwX2ZiLT53 aWR0aCAvIDIsIGNsaXBfZmItPmhlaWdodCAvIDIsCisJCQkJY29sb3JzWzBdWzBdLCBjb2xvcnNb MF1bMV0sIGNvbG9yc1swXVsyXSk7CisKKwkJaWd0X3BhaW50X2NvbG9yKGNyLCBjbGlwX2ZiLT53 aWR0aCAvIDIsIDAsCisJCQkJY2xpcF9mYi0+d2lkdGggLyAyLCBjbGlwX2ZiLT5oZWlnaHQgLyAy LAorCQkJCWNvbG9yc1sxXVswXSwgY29sb3JzWzFdWzFdLCBjb2xvcnNbMV1bMl0pOworCisJCWln dF9wYWludF9jb2xvcihjciwgY2xpcF9mYi0+d2lkdGggLyAyLCBjbGlwX2ZiLT5oZWlnaHQgLyAy LAorCQkJCWNsaXBfZmItPndpZHRoIC8gMiwgY2xpcF9mYi0+aGVpZ2h0IC8gMiwKKwkJCQljb2xv cnNbMl1bMF0sIGNvbG9yc1syXVsxXSwgY29sb3JzWzJdWzJdKTsKKworCQlpZ3RfcGFpbnRfY29s b3IoY3IsIDAsIGNsaXBfZmItPmhlaWdodCAvIDIsCisJCQkJY2xpcF9mYi0+d2lkdGggLyAyLCBj bGlwX2ZiLT5oZWlnaHQgLyAyLAorCQkJCWNvbG9yc1szXVswXSwgY29sb3JzWzNdWzFdLCBjb2xv cnNbM11bMl0pOworCisJCWlndF9wdXRfY2Fpcm9fY3R4KGRpc3BsYXktPmRybV9mZCwgY2xpcF9m YiwgY3IpOworCisJCS8qIERyYXcgYWxsIHJlZmVyZW5jZSBGQidzIHRvIGNvbGxlY3QgdGhlIENS Qy4gKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJY3IgPSBpZ3RfZ2V0X2NhaXJv X2N0eChkaXNwbGF5LT5kcm1fZmQsIHJlZl9mYik7CisJCQlpZ3RfcGFpbnRfY29sb3IoY3IsIDAs IDAsIHJlZl9mYi0+d2lkdGgsIHJlZl9mYi0+aGVpZ2h0LAorCQkJCQljb2xvcnNbaV1bMF0sIGNv bG9yc1tpXVsxXSwgY29sb3JzW2ldWzJdKTsKKwkJCWlndF9wdXRfY2Fpcm9fY3R4KGRpc3BsYXkt PmRybV9mZCwgJmRhdGEtPmZiWzNdLCBjcik7CisKKwkJCWlmICghaSkgeworCQkJCWlndF9wbGFu ZV9zZXRfZmIocGxhbmUsIHJlZl9mYik7CisJCQkJaWd0X3BsYW5lX3NldF9wb3NpdGlvbihwbGFu ZSwgbW9kZS0+aGRpc3BsYXkgLSByZWZfZmItPndpZHRoLCBtb2RlLT52ZGlzcGxheSAtIHJlZl9m Yi0+aGVpZ2h0KTsKKwkJCQlpZ3RfZGlzcGxheV9jb21taXQyKGRpc3BsYXksIENPTU1JVF9BVE9N SUMpOworCQkJfSBlbHNlIHsKKwkJCQlpZ3RfZGlydHlfZmIoZGlzcGxheS0+ZHJtX2ZkLCByZWZf ZmIpOworCQkJCWlndF93YWl0X2Zvcl92YmxhbmsoZGlzcGxheS0+ZHJtX2ZkLCBwaXBlKTsKKwkJ CX0KKworCQkJaWd0X3BpcGVfY3JjX2RyYWluKGRhdGEtPnBpcGVfY3JjKTsKKwkJCWlndF9waXBl X2NyY19nZXRfc2luZ2xlKGRhdGEtPnBpcGVfY3JjLCAmcmVmX2NyY1tpXSk7CisJCX0KKworCQlp Z3RfcGxhbmVfc2V0X2ZiKHBsYW5lLCBOVUxMKTsKKwkJaWd0X3BsYW5lX3NldF9wb3NpdGlvbihw bGFuZSwgMCwgMCk7CisKKwkJeXV2X3ZhbGlkX3dpZHRoX3BsYW5lKGRhdGEsIG1vZGUsIHBsYW5l LCBJR1RfUk9UQVRJT05fMCwgJnJlZl9jcmNbMF0pOworCQl5dXZfdmFsaWRfd2lkdGhfcGxhbmUo ZGF0YSwgbW9kZSwgcGxhbmUsIElHVF9ST1RBVElPTl85MCwgJnJlZl9jcmNbMV0pOworCQl5dXZf dmFsaWRfd2lkdGhfcGxhbmUoZGF0YSwgbW9kZSwgcGxhbmUsIElHVF9ST1RBVElPTl8xODAsICZy ZWZfY3JjWzJdKTsKKwkJeXV2X3ZhbGlkX3dpZHRoX3BsYW5lKGRhdGEsIG1vZGUsIHBsYW5lLCBJ R1RfUk9UQVRJT05fMjcwLCAmcmVmX2NyY1szXSk7CisKKwkJaWd0X3BsYW5lX3NldF9mYihwbGFu ZSwgTlVMTCk7CisJfQorfQorCitzdGF0aWMgYm9vbCB5dXZfY29tbWl0X3JvdGF0ZWQoaWd0X2Rp c3BsYXlfdCAqZGlzcGxheSwgaWd0X3JvdGF0aW9uX3Qgcm90KQoreworCWlmIChpZ3RfZGlzcGxh eV90cnlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlDKSA8IDApIHsKKwkJaWd0X2RlYnVn KCJTa2lwcGluZyByb3RhdGVkIHRlc3QsIGFsaWdubWVudCBpcyB3cm9uZy5cbiIpOworCQlyZXR1 cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHl1dl9jcm9w X3NjYWxlX2J1Z19wbGFuZShkYXRhX3QgKmRhdGEsIGRybU1vZGVNb2RlSW5mbyAqbW9kZSwKKwkJ CQkgICAgICBpZ3RfcGxhbmVfdCAqcGxhbmUsIHN0cnVjdCBpZ3RfZmIgKmZiLAorCQkJCSAgICAg IGlndF9yb3RhdGlvbl90IHJvdCwgaWd0X2NyY190ICpyZWZfY3JjKQoreworCWlndF9kaXNwbGF5 X3QgKmRpc3BsYXkgPSAmZGF0YS0+ZGlzcGxheTsKKwlpZ3RfY3JjX3QgY3JjOworCWludCBvZnNb XSA9IHsgMCwgMSwgLTEsIDIsIC0yIH07CisJaW50IGksIGo7CisKKwlpZ3RfcGxhbmVfc2V0X2Zi KHBsYW5lLCBmYik7CisJaWd0X3BsYW5lX3NldF9yb3RhdGlvbihwbGFuZSwgcm90KTsKKwlpZ3Rf cGxhbmVfc2V0X3Bvc2l0aW9uKHBsYW5lLCA2NCwgNjQpOworCWlndF9wbGFuZV9zZXRfc2l6ZShw bGFuZSwgMjU2LCAyNTYpOworCisJaWd0X2ZiX3NldF9wb3NpdGlvbihmYiwgcGxhbmUsIGZiLT53 aWR0aCAvIDQsIGZiLT5oZWlnaHQgLyA0KTsKKwlpZ3RfZmJfc2V0X3NpemUoZmIsIHBsYW5lLCBm Yi0+d2lkdGggLyAyLCBmYi0+aGVpZ2h0IC8gMik7CisJaWYgKChyb3QgPT0gSUdUX1JPVEFUSU9O XzkwIHx8IHJvdCA9PSBJR1RfUk9UQVRJT05fMjcwKSAmJgorCSAgICBpZ3RfZGlzcGxheV90cnlf Y29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlDKSA8IDApIHsKKwkJaWd0X2RlYnVnKCJUaGlz IHJvdGF0aW9uIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgZm9ybWF0LlxuIik7CisJCXJldHVybjsK Kwl9CisKKwlpZ3RfZGlzcGxheV9jb21taXQyKGRpc3BsYXksIENPTU1JVF9BVE9NSUMpOworCWFz c2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBpcGVfY3JjLCAmY3JjLCByZWZfY3JjKTsK KworCS8qIE1ha2Ugc3VyZSBib3VuZGFyaWVzIG1hdGNoICovCisJaWd0X2ZiX3NldF9wb3NpdGlv bihmYiwgcGxhbmUsIGZiLT53aWR0aCAvIDQgLSAyLCBmYi0+aGVpZ2h0IC8gNCAtIDIpOworCWln dF9mYl9zZXRfc2l6ZShmYiwgcGxhbmUsIGZiLT53aWR0aCAvIDIgKyA0LCBmYi0+aGVpZ2h0IC8g MiArIDQpOworCWlndF9kaXNwbGF5X2NvbW1pdDIoZGlzcGxheSwgQ09NTUlUX0FUT01JQyk7CisJ YXNzZXJ0X2NvbGxlY3RlZF9jcmNfZXF1YWwoZGF0YS0+cGlwZV9jcmMsICZjcmMsIHJlZl9jcmMp OworCisJZm9yIChpID0gMTsgaSA8IEFSUkFZX1NJWkUob2ZzKTsgaSsrKSB7CisJCWlndF9kZWJ1 ZygiVGVzdGluZyB3aXRoIHJvdCAleCBhbmQgZXh0cmEgJWkgb24gdGhlIGxlZnQgc2lkZVxuIiwg cm90LCBvZnNbaV0pOworCQlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGZiLCBwbGFuZSwgZmItPndpZHRo IC8gNCArIG9mc1tpXSwgZmItPmhlaWdodCAvIDQgLSAyKTsKKwkJaWd0X2ZiX3NldF9zaXplKGZi LCBwbGFuZSwgZmItPndpZHRoIC8gMiArIDIgLSBvZnNbaV0sIGZiLT5oZWlnaHQgLyAyICsgNCk7 CisJCWlmICh5dXZfY29tbWl0X3JvdGF0ZWQoZGlzcGxheSwgcm90KSkKKwkJCWFzc2VydF9jb2xs ZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBpcGVfY3JjLCAmY3JjLCByZWZfY3JjKTsKKworCQlpZ3Rf ZGVidWcoIlRlc3Rpbmcgd2l0aCByb3QgJXggYW5kIGV4dHJhICVpIG9uIHRoZSB0b3Agc2lkZVxu Iiwgcm90LCBvZnNbaV0pOworCQlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGZiLCBwbGFuZSwgZmItPndp ZHRoIC8gNCAtIDIsIGZiLT5oZWlnaHQgLyA0ICsgb2ZzW2ldKTsKKwkJaWd0X2ZiX3NldF9zaXpl KGZiLCBwbGFuZSwgZmItPndpZHRoIC8gMiArIDQsIGZiLT5oZWlnaHQgLyAyICsgMiAtIG9mc1tp XSk7CisJCWlmICh5dXZfY29tbWl0X3JvdGF0ZWQoZGlzcGxheSwgcm90KSkKKwkJCWFzc2VydF9j b2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBpcGVfY3JjLCAmY3JjLCByZWZfY3JjKTsKKworCQlp Z3RfZGVidWcoIlRlc3Rpbmcgd2l0aCByb3QgJXggYW5kIGV4dHJhICVpIG9uIHRoZSByaWdodCBz aWRlXG4iLCByb3QsIG9mc1tpXSk7CisJCWlndF9mYl9zZXRfcG9zaXRpb24oZmIsIHBsYW5lLCBm Yi0+d2lkdGggLyA0IC0gMiwgZmItPmhlaWdodCAvIDQpOworCQlpZ3RfZmJfc2V0X3NpemUoZmIs IHBsYW5lLCBmYi0+d2lkdGggLyAyICsgMiArIG9mc1tpXSwgZmItPmhlaWdodCAvIDIpOworCQlp ZiAoeXV2X2NvbW1pdF9yb3RhdGVkKGRpc3BsYXksIHJvdCkpCisJCQlhc3NlcnRfY29sbGVjdGVk X2NyY19lcXVhbChkYXRhLT5waXBlX2NyYywgJmNyYywgcmVmX2NyYyk7CisKKwkJaWd0X2RlYnVn KCJUZXN0aW5nIHdpdGggcm90ICV4IGFuZCBleHRyYSAlaSBvbiB0aGUgYm90dG9tIHNpZGVcbiIs IHJvdCwgb2ZzW2ldKTsKKwkJaWd0X2ZiX3NldF9wb3NpdGlvbihmYiwgcGxhbmUsIGZiLT53aWR0 aCAvIDQgLSAyLCBmYi0+aGVpZ2h0IC8gNCAtIDIpOworCQlpZ3RfZmJfc2V0X3NpemUoZmIsIHBs YW5lLCBmYi0+d2lkdGggLyAyICsgNCwgZmItPmhlaWdodCAvIDIgKyAyICsgb2ZzW2ldKTsKKwkJ aWYgKHl1dl9jb21taXRfcm90YXRlZChkaXNwbGF5LCByb3QpKQorCQkJYXNzZXJ0X2NvbGxlY3Rl ZF9jcmNfZXF1YWwoZGF0YS0+cGlwZV9jcmMsICZjcmMsIHJlZl9jcmMpOworCisJfQorCisJZm9y IChpID0gMDsgaSA8IEFSUkFZX1NJWkUob2ZzKTsgaSsrKQorCQlmb3IgKGogPSAhaTsgaiA8IEFS UkFZX1NJWkUob2ZzKTsgaisrKSB7CisJCQlpZ3RfZGVidWcoIlRlc3Rpbmcgd2l0aCByb3QgJXgg YW5kIGV4dHJhICglaSwgJWkpIGF0IHRoZSBlZGdlc1xuIiwgcm90LCBvZnNbaV0sIG9mc1tqXSk7 CisKKwkJCWlndF9mYl9zZXRfcG9zaXRpb24oZmIsIHBsYW5lLCBmYi0+d2lkdGggLyA0ICsgb2Zz W2ldLCBmYi0+aGVpZ2h0IC8gNCArIG9mc1tqXSk7CisJCQlpZ3RfZmJfc2V0X3NpemUoZmIsIHBs YW5lLCBmYi0+d2lkdGggLyAyIC0gMiAqIG9mc1tpXSwgZmItPmhlaWdodCAvIDIgLSAyICogb2Zz W2pdKTsKKworCQkJaWYgKHl1dl9jb21taXRfcm90YXRlZChkaXNwbGF5LCByb3QpKQorCQkJCWFz c2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBpcGVfY3JjLCAmY3JjLCByZWZfY3JjKTsK KwkJfQorfQorCitzdGF0aWMgdm9pZCBkcmF3X2NsaXBfZmIoaWd0X2Rpc3BsYXlfdCAqZGlzcGxh eSwgc3RydWN0IGlndF9mYiAqY2xpcF9mYikKK3sKKwljYWlyb190ICpjciA9IGlndF9nZXRfY2Fp cm9fY3R4KGRpc3BsYXktPmRybV9mZCwgY2xpcF9mYik7CisKKwlpZ3RfcGFpbnRfY29sb3IoY3Is IDAsIDAsIGNsaXBfZmItPndpZHRoLCBjbGlwX2ZiLT5oZWlnaHQsIC4wLCAuMCwgLjUpOworCWln dF9wYWludF9jb2xvcihjciwgY2xpcF9mYi0+d2lkdGggLyA0IC0gMiwgY2xpcF9mYi0+aGVpZ2h0 IC8gNCAtIDIsCisJCQljbGlwX2ZiLT53aWR0aCAvIDIgKyA0LCBjbGlwX2ZiLT5oZWlnaHQgLyAy ICsgNCwgMS4sIDEuLCAxLik7CisKKwlpZ3RfcHV0X2NhaXJvX2N0eChkaXNwbGF5LT5kcm1fZmQs IGNsaXBfZmIsIGNyKTsKK30KKworc3RhdGljIHZvaWQgeXV2X2Nyb3Bfc2NhbGVfYnVnKGRhdGFf dCAqZGF0YSwgZW51bSBwaXBlIHBpcGUsIGlndF9vdXRwdXRfdCAqb3V0cHV0LCB1bnNpZ25lZCBm b3JtYXQpCit7CisJZHJtTW9kZU1vZGVJbmZvICptb2RlID0gaWd0X291dHB1dF9nZXRfbW9kZShv dXRwdXQpOworCWlndF9kaXNwbGF5X3QgKmRpc3BsYXkgPSAmZGF0YS0+ZGlzcGxheTsKKwlpZ3Rf cGxhbmVfdCAqcGxhbmUsICpwcmltYXJ5ID0gaWd0X3BpcGVfZ2V0X3BsYW5lX3R5cGUoJmRpc3Bs YXktPnBpcGVzW3BpcGVdLCBEUk1fUExBTkVfVFlQRV9QUklNQVJZKTsKKwlzdHJ1Y3QgaWd0X2Zi ICpyZWZfZmIgPSAmZGF0YS0+ZmJbMl07CisJc3RydWN0IGlndF9mYiAqY2xpcF9mYiA9ICZkYXRh LT5mYlszXTsKKwlzdHJ1Y3QgaWd0X2ZiICpjbGlwX2ZiX3h0aWxlZCA9ICZkYXRhLT5mYls0XTsK KwlzdHJ1Y3QgaWd0X2ZiICpjbGlwX2ZiX3l0aWxlZCA9ICZkYXRhLT5mYls1XTsKKworCXByZXBh cmVfY3J0YyhkYXRhLCBwaXBlLCBvdXRwdXQpOworCisJaWd0X2NyZWF0ZV9jb2xvcl9mYihkaXNw bGF5LT5kcm1fZmQsIG1vZGUtPmhkaXNwbGF5LCBtb2RlLT52ZGlzcGxheSwKKwkJCSAgICBmb3Jt YXQsIHhfbW9kaWZpZXIsIC41LCAuNSwgLjUsICZkYXRhLT5mYlswXSk7CisKKwlpZ3RfY3JlYXRl X2NvbG9yX2ZiKGRpc3BsYXktPmRybV9mZCwgMjU2LCAyNTYsIGZvcm1hdCwKKwkJCSAgICB4X21v ZGlmaWVyLCAxLiwgMS4sIDEuLCByZWZfZmIpOworCisJaWd0X2NyZWF0ZV9mYihkaXNwbGF5LT5k cm1fZmQsIDgwLCAxMjgsIGZvcm1hdCwKKwkJICAgICAgTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9O RSwgY2xpcF9mYik7CisKKwlpZ3RfY3JlYXRlX2ZiKGRpc3BsYXktPmRybV9mZCwgODAsIDEyOCwg Zm9ybWF0LAorCQkgICAgICB4X21vZGlmaWVyLCBjbGlwX2ZiX3h0aWxlZCk7CisJaWd0X2NyZWF0 ZV9mYihkaXNwbGF5LT5kcm1fZmQsIDgwLCAxMjgsIGZvcm1hdCwKKwkJICAgICAgeV9tb2RpZmll ciwgY2xpcF9mYl95dGlsZWQpOworCisJZHJhd19jbGlwX2ZiKGRpc3BsYXksIGNsaXBfZmIpOwor CWRyYXdfY2xpcF9mYihkaXNwbGF5LCBjbGlwX2ZiX3h0aWxlZCk7CisJZHJhd19jbGlwX2ZiKGRp c3BsYXksIGNsaXBfZmJfeXRpbGVkKTsKKworCWlndF9wbGFuZV9zZXRfZmIocHJpbWFyeSwgJmRh dGEtPmZiWzBdKTsKKworCWZvcl9lYWNoX3BsYW5lX29uX3BpcGUoZGlzcGxheSwgcGlwZSwgcGxh bmUpIHsKKwkJaWd0X2NyY190IHJlZl9jcmM7CisKKwkJaWYgKCFpZ3RfcGxhbmVfaGFzX2Zvcm1h dF9tb2QocGxhbmUsIGZvcm1hdCwgZGF0YS0+ZmJbMF0ubW9kaWZpZXIpKQorCQkJY29udGludWU7 CisKKwkJaWd0X3BsYW5lX3NldF9mYihwbGFuZSwgcmVmX2ZiKTsKKwkJaWd0X3BsYW5lX3NldF9w b3NpdGlvbihwbGFuZSwgNjQsIDY0KTsKKwkJaWd0X2Rpc3BsYXlfY29tbWl0MihkaXNwbGF5LCBD T01NSVRfQVRPTUlDKTsKKworCQlpZ3RfcGlwZV9jcmNfc3RhcnQoZGF0YS0+cGlwZV9jcmMpOwor CQlpZ3RfcGlwZV9jcmNfZ2V0X3NpbmdsZShkYXRhLT5waXBlX2NyYywgJnJlZl9jcmMpOworCisJ CXl1dl9jcm9wX3NjYWxlX2J1Z19wbGFuZShkYXRhLCBtb2RlLCBwbGFuZSwgY2xpcF9mYiwgSUdU X1JPVEFUSU9OXzAsICZyZWZfY3JjKTsKKwkJeXV2X2Nyb3Bfc2NhbGVfYnVnX3BsYW5lKGRhdGEs IG1vZGUsIHBsYW5lLCBjbGlwX2ZiX3h0aWxlZCwgSUdUX1JPVEFUSU9OXzAsICZyZWZfY3JjKTsK KwkJeXV2X2Nyb3Bfc2NhbGVfYnVnX3BsYW5lKGRhdGEsIG1vZGUsIHBsYW5lLCBjbGlwX2ZiX3l0 aWxlZCwgSUdUX1JPVEFUSU9OXzAsICZyZWZfY3JjKTsKKwkJeXV2X2Nyb3Bfc2NhbGVfYnVnX3Bs YW5lKGRhdGEsIG1vZGUsIHBsYW5lLCBjbGlwX2ZiX3l0aWxlZCwgSUdUX1JPVEFUSU9OXzkwLCAm cmVmX2NyYyk7CisJCXl1dl9jcm9wX3NjYWxlX2J1Z19wbGFuZShkYXRhLCBtb2RlLCBwbGFuZSwg Y2xpcF9mYiwgSUdUX1JPVEFUSU9OXzE4MCwgJnJlZl9jcmMpOworCQl5dXZfY3JvcF9zY2FsZV9i dWdfcGxhbmUoZGF0YSwgbW9kZSwgcGxhbmUsIGNsaXBfZmJfeHRpbGVkLCBJR1RfUk9UQVRJT05f MTgwLCAmcmVmX2NyYyk7CisJCXl1dl9jcm9wX3NjYWxlX2J1Z19wbGFuZShkYXRhLCBtb2RlLCBw bGFuZSwgY2xpcF9mYl95dGlsZWQsIElHVF9ST1RBVElPTl8xODAsICZyZWZfY3JjKTsKKwkJeXV2 X2Nyb3Bfc2NhbGVfYnVnX3BsYW5lKGRhdGEsIG1vZGUsIHBsYW5lLCBjbGlwX2ZiX3l0aWxlZCwg SUdUX1JPVEFUSU9OXzI3MCwgJnJlZl9jcmMpOworCisJCWlndF9wbGFuZV9zZXRfZmIocGxhbmUs IHBsYW5lICE9IHByaW1hcnkgPyBOVUxMIDogJmRhdGEtPmZiWzBdKTsKKwkJYnJlYWs7CisJfQor fQorCitzdGF0aWMgdm9pZCB5dXZfY2hyb21hX3N1YnBpeGVsX2NsaXBfcGxhbmVfd2l0aF9jdXJz b3IoZGF0YV90ICpkYXRhLAorCQkJCQkJCWlndF9wbGFuZV90ICpwbGFuZSwKKwkJCQkJCQlzdHJ1 Y3QgaWd0X2ZiICpjbGlwX2ZiLAorCQkJCQkJCWlndF9wbGFuZV90ICpjdXJzb3IsCisJCQkJCQkJ c3RydWN0IGlndF9mYiAqY3Vyc29yX2ZiLAorCQkJCQkJCWlndF9jcmNfdCAqcmVmX2NyYywKKwkJ CQkJCQlpbnQgY3Vyc29yX3gsIGludCBjdXJzb3JfeSkKK3sKKwlpZ3RfZGlzcGxheV90ICpkaXNw bGF5ID0gJmRhdGEtPmRpc3BsYXk7CisKKwlpZ3RfcGxhbmVfc2V0X2ZiKHBsYW5lLCBjbGlwX2Zi KTsKKwlpZ3RfcGxhbmVfc2V0X3Bvc2l0aW9uKHBsYW5lLCA2NCwgNjQpOworCWlndF9wbGFuZV9z ZXRfcm90YXRpb24ocGxhbmUsIElHVF9ST1RBVElPTl8wKTsKKworCWlndF9wbGFuZV9zZXRfZmIo Y3Vyc29yLCBjdXJzb3JfZmIpOworCWlndF9wbGFuZV9zZXRfcG9zaXRpb24oY3Vyc29yLCBjdXJz b3JfeCwgY3Vyc29yX3kpOworCWlndF9kaXNwbGF5X2NvbW1pdDIoZGlzcGxheSwgQ09NTUlUX0FU T01JQyk7CisKKwlpZ3RfcGlwZV9jcmNfZHJhaW4oZGF0YS0+cGlwZV9jcmMpOworCWlndF9waXBl X2NyY19nZXRfc2luZ2xlKGRhdGEtPnBpcGVfY3JjLCByZWZfY3JjKTsKKworCWlndF9wbGFuZV9z ZXRfZmIoY3Vyc29yLCBOVUxMKTsKK30KKworc3RhdGljIGJvb2wgeXV2X2Nocm9tYV9zdWJwaXhl bF9jbGlwX3BsYW5lX3JpZ2h0KGRhdGFfdCAqZGF0YSwKKwkJCQkJCSBpZ3Rfcm90YXRpb25fdCBy b3RhdGlvbiwKKwkJCQkJCSBpZ3RfcGxhbmVfdCAqcGxhbmUsCisJCQkJCQkgc3RydWN0IGlndF9m YiAqY2xpcF9mYiwKKwkJCQkJCSBpZ3RfY3JjX3QgKnJlZl9jcmMpCit7CisJaWd0X2Rpc3BsYXlf dCAqZGlzcGxheSA9ICZkYXRhLT5kaXNwbGF5OworCWlndF9jcmNfdCBjcmMgPSB7fTsKKworCWln dF9wbGFuZV9zZXRfZmIocGxhbmUsIGNsaXBfZmIpOworCWlndF9wbGFuZV9zZXRfcG9zaXRpb24o cGxhbmUsIDY0LCA2NCk7CisJaWd0X3BsYW5lX3NldF9yb3RhdGlvbihwbGFuZSwgcm90YXRpb24p OworCWlndF9wbGFuZV9zZXRfc2l6ZShwbGFuZSwgY2xpcF9mYi0+d2lkdGggLSAxLCBjbGlwX2Zi LT5oZWlnaHQpOworCisJc3dpdGNoIChyb3RhdGlvbikgeworCWNhc2UgSUdUX1JPVEFUSU9OXzE4 MDoKKwkJaWd0X2ZiX3NldF9wb3NpdGlvbihjbGlwX2ZiLCBwbGFuZSwgMSwgMCk7CisJY2FzZSBJ R1RfUk9UQVRJT05fMDoKKwkJaWd0X2ZiX3NldF9zaXplKGNsaXBfZmIsIHBsYW5lLCBjbGlwX2Zi LT53aWR0aCAtIDEsIGNsaXBfZmItPmhlaWdodCk7CisJCWJyZWFrOworCisJY2FzZSBJR1RfUk9U QVRJT05fMjcwOgorCQlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGNsaXBfZmIsIHBsYW5lLCAwLCAxKTsK KwljYXNlIElHVF9ST1RBVElPTl85MDoKKwkJaWd0X2ZiX3NldF9zaXplKGNsaXBfZmIsIHBsYW5l LCBjbGlwX2ZiLT53aWR0aCwgY2xpcF9mYi0+aGVpZ2h0IC0gMSk7CisJCWJyZWFrOworCWRlZmF1 bHQ6CisJCWlndF9hc3NlcnRfZigwLCAiVW5oYW5kbGVkIHJvdGF0aW9uICV4XG4iLCByb3RhdGlv bik7CisJfQorCisJaWYgKGlndF9kaXNwbGF5X3RyeV9jb21taXQyKGRpc3BsYXksIENPTU1JVF9B VE9NSUMpIDwgMCkKKwkJcmV0dXJuIGZhbHNlOworCisJYXNzZXJ0X2NvbGxlY3RlZF9jcmNfZXF1 YWwoZGF0YS0+cGlwZV9jcmMsICZjcmMsIHJlZl9jcmMpOworCXJldHVybiB0cnVlOworfQorCitz dGF0aWMgYm9vbCB5dXZfY2hyb21hX3N1YnBpeGVsX2NsaXBfcGxhbmVfYm90dG9tKGRhdGFfdCAq ZGF0YSwKKwkJCQkJCSAgaWd0X3JvdGF0aW9uX3Qgcm90YXRpb24sCisJCQkJCQkgIGlndF9wbGFu ZV90ICpwbGFuZSwKKwkJCQkJCSAgc3RydWN0IGlndF9mYiAqY2xpcF9mYiwKKwkJCQkJCSAgaWd0 X2NyY190ICpyZWZfY3JjKQoreworCWlndF9kaXNwbGF5X3QgKmRpc3BsYXkgPSAmZGF0YS0+ZGlz cGxheTsKKwlpZ3RfY3JjX3QgY3JjID0ge307CisKKwlpZ3RfcGxhbmVfc2V0X2ZiKHBsYW5lLCBj bGlwX2ZiKTsKKwlpZ3RfcGxhbmVfc2V0X3Bvc2l0aW9uKHBsYW5lLCA2NCwgNjQpOworCWlndF9w bGFuZV9zZXRfcm90YXRpb24ocGxhbmUsIHJvdGF0aW9uKTsKKwlpZ3RfcGxhbmVfc2V0X3NpemUo cGxhbmUsIGNsaXBfZmItPndpZHRoLCBjbGlwX2ZiLT5oZWlnaHQgLSAxKTsKKworCXN3aXRjaCAo cm90YXRpb24pIHsKKwljYXNlIElHVF9ST1RBVElPTl8xODA6CisJCWlndF9mYl9zZXRfcG9zaXRp b24oY2xpcF9mYiwgcGxhbmUsIDAsIDEpOworCWNhc2UgSUdUX1JPVEFUSU9OXzA6CisJCWlndF9m Yl9zZXRfc2l6ZShjbGlwX2ZiLCBwbGFuZSwgY2xpcF9mYi0+d2lkdGgsIGNsaXBfZmItPmhlaWdo dCAtIDEpOworCQlicmVhazsKKworCWNhc2UgSUdUX1JPVEFUSU9OXzkwOgorCQlpZ3RfZmJfc2V0 X3Bvc2l0aW9uKGNsaXBfZmIsIHBsYW5lLCAxLCAwKTsKKwljYXNlIElHVF9ST1RBVElPTl8yNzA6 CisJCWlndF9mYl9zZXRfc2l6ZShjbGlwX2ZiLCBwbGFuZSwgY2xpcF9mYi0+d2lkdGggLSAxLCBj bGlwX2ZiLT5oZWlnaHQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZ3RfYXNzZXJ0X2YoMCwg IlVuaGFuZGxlZCByb3RhdGlvbiAleFxuIiwgcm90YXRpb24pOworCX0KKworCWlmIChpZ3RfZGlz cGxheV90cnlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlDKSA8IDApCisJCXJldHVybiBm YWxzZTsKKworCWFzc2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBpcGVfY3JjLCAmY3Jj LCByZWZfY3JjKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgeXV2X2Nocm9tYV9z dWJwaXhlbF9jbGlwX3BsYW5lX2xlZnQoZGF0YV90ICpkYXRhLAorCQkJCQkJaWd0X3JvdGF0aW9u X3Qgcm90YXRpb24sCisJCQkJCQlpZ3RfcGxhbmVfdCAqcGxhbmUsCisJCQkJCQlzdHJ1Y3QgaWd0 X2ZiICpjbGlwX2ZiLAorCQkJCQkJaWd0X2NyY190ICpyZWZfY3JjKQoreworCWlndF9kaXNwbGF5 X3QgKmRpc3BsYXkgPSAmZGF0YS0+ZGlzcGxheTsKKwlpZ3RfY3JjX3QgY3JjID0ge307CisKKwlp Z3RfcGxhbmVfc2V0X2ZiKHBsYW5lLCBjbGlwX2ZiKTsKKwlpZ3RfcGxhbmVfc2V0X3Bvc2l0aW9u KHBsYW5lLCA2NSwgNjQpOworCWlndF9wbGFuZV9zZXRfcm90YXRpb24ocGxhbmUsIHJvdGF0aW9u KTsKKwlpZ3RfcGxhbmVfc2V0X3NpemUocGxhbmUsIGNsaXBfZmItPndpZHRoIC0gMSwgY2xpcF9m Yi0+aGVpZ2h0KTsKKworCXN3aXRjaCAocm90YXRpb24pIHsKKwljYXNlIElHVF9ST1RBVElPTl8w OgorCQlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGNsaXBfZmIsIHBsYW5lLCAxLCAwKTsKKwljYXNlIElH VF9ST1RBVElPTl8xODA6CisJCWlndF9mYl9zZXRfc2l6ZShjbGlwX2ZiLCBwbGFuZSwgY2xpcF9m Yi0+d2lkdGggLSAxLCBjbGlwX2ZiLT5oZWlnaHQpOworCQlicmVhazsKKworCWNhc2UgSUdUX1JP VEFUSU9OXzkwOgorCQlpZ3RfZmJfc2V0X3Bvc2l0aW9uKGNsaXBfZmIsIHBsYW5lLCAwLCAxKTsK KwljYXNlIElHVF9ST1RBVElPTl8yNzA6CisJCWlndF9mYl9zZXRfc2l6ZShjbGlwX2ZiLCBwbGFu ZSwgY2xpcF9mYi0+d2lkdGgsIGNsaXBfZmItPmhlaWdodCAtIDEpOworCQlicmVhazsKKwlkZWZh dWx0OgorCQlpZ3RfYXNzZXJ0X2YoMCwgIlVuaGFuZGxlZCByb3RhdGlvbiAleFxuIiwgcm90YXRp b24pOworCX0KKworCWlmIChpZ3RfZGlzcGxheV90cnlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRf QVRPTUlDKSA8IDApCisJCXJldHVybiBmYWxzZTsKKworCWFzc2VydF9jb2xsZWN0ZWRfY3JjX2Vx dWFsKGRhdGEtPnBpcGVfY3JjLCAmY3JjLCByZWZfY3JjKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKwor CitzdGF0aWMgYm9vbCB5dXZfY2hyb21hX3N1YnBpeGVsX2NsaXBfcGxhbmVfdG9wKGRhdGFfdCAq ZGF0YSwKKwkJCQkJICAgICAgaWd0X3JvdGF0aW9uX3Qgcm90YXRpb24sCisJCQkJCSAgICAgIGln dF9wbGFuZV90ICpwbGFuZSwKKwkJCQkJICAgICAgc3RydWN0IGlndF9mYiAqY2xpcF9mYiwKKwkJ CQkJICAgICAgaWd0X2NyY190ICpyZWZfY3JjKQoreworCWlndF9kaXNwbGF5X3QgKmRpc3BsYXkg PSAmZGF0YS0+ZGlzcGxheTsKKwlpZ3RfY3JjX3QgY3JjID0ge307CisKKwlpZ3RfcGxhbmVfc2V0 X2ZiKHBsYW5lLCBjbGlwX2ZiKTsKKwlpZ3RfcGxhbmVfc2V0X3Bvc2l0aW9uKHBsYW5lLCA2NCwg NjUpOworCWlndF9wbGFuZV9zZXRfcm90YXRpb24ocGxhbmUsIHJvdGF0aW9uKTsKKwlpZ3RfcGxh bmVfc2V0X3NpemUocGxhbmUsIGNsaXBfZmItPndpZHRoLCBjbGlwX2ZiLT5oZWlnaHQgLSAxKTsK KworCXN3aXRjaCAocm90YXRpb24pIHsKKwljYXNlIElHVF9ST1RBVElPTl8wOgorCQlpZ3RfZmJf c2V0X3Bvc2l0aW9uKGNsaXBfZmIsIHBsYW5lLCAwLCAxKTsKKwljYXNlIElHVF9ST1RBVElPTl8x ODA6CisJCWlndF9mYl9zZXRfc2l6ZShjbGlwX2ZiLCBwbGFuZSwgY2xpcF9mYi0+d2lkdGgsIGNs aXBfZmItPmhlaWdodCAtIDEpOworCQlicmVhazsKKworCWNhc2UgSUdUX1JPVEFUSU9OXzI3MDoK KwkJaWd0X2ZiX3NldF9wb3NpdGlvbihjbGlwX2ZiLCBwbGFuZSwgMSwgMCk7CisJY2FzZSBJR1Rf Uk9UQVRJT05fOTA6CisJCWlndF9mYl9zZXRfc2l6ZShjbGlwX2ZiLCBwbGFuZSwgY2xpcF9mYi0+ d2lkdGggLSAxLCBjbGlwX2ZiLT5oZWlnaHQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZ3Rf YXNzZXJ0X2YoMCwgIlVuaGFuZGxlZCByb3RhdGlvbiAleFxuIiwgcm90YXRpb24pOworCX0KKwor CWlmIChpZ3RfZGlzcGxheV90cnlfY29tbWl0MihkaXNwbGF5LCBDT01NSVRfQVRPTUlDKSA8IDAp CisJCXJldHVybiBmYWxzZTsKKworCWFzc2VydF9jb2xsZWN0ZWRfY3JjX2VxdWFsKGRhdGEtPnBp cGVfY3JjLCAmY3JjLCByZWZfY3JjKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQg eXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwKGRhdGFfdCAqZGF0YSwgZW51bSBwaXBlIHBpcGUsIGln dF9vdXRwdXRfdCAqb3V0cHV0LCB1bnNpZ25lZCBmb3JtYXQpCit7CisJZHJtTW9kZU1vZGVJbmZv ICptb2RlID0gaWd0X291dHB1dF9nZXRfbW9kZShvdXRwdXQpOworCWlndF9kaXNwbGF5X3QgKmRp c3BsYXkgPSAmZGF0YS0+ZGlzcGxheTsKKwlpZ3RfcGlwZV90ICpwaXBlX29iaiA9ICZkaXNwbGF5 LT5waXBlc1twaXBlXTsKKwlzdHJ1Y3QgaWd0X2ZiICpiZ19mYiA9ICZkYXRhLT5mYlswXTsKKwlz dHJ1Y3QgaWd0X2ZiICpiZ19jdXJzb3JfZmIgPSAmZGF0YS0+ZmJbMV07CisJc3RydWN0IGlndF9m YiAqYmxhY2tfY3Vyc29yX2ZiID0gJmRhdGEtPmZiWzJdOworCXN0cnVjdCBpZ3RfZmIgKmNsaXBf ZmIgPSAmZGF0YS0+ZmJbM107CisJaWd0X3BsYW5lX3QgKnByaW1hcnkgPSBpZ3RfcGlwZV9nZXRf cGxhbmVfdHlwZShwaXBlX29iaiwgRFJNX1BMQU5FX1RZUEVfUFJJTUFSWSk7CisJaWd0X3BsYW5l X3QgKmN1cnNvciA9IGlndF9waXBlX2dldF9wbGFuZV90eXBlKHBpcGVfb2JqLCBEUk1fUExBTkVf VFlQRV9DVVJTT1IpOworCWlndF9wbGFuZV90ICpwbGFuZTsKKwljYWlyb190ICpjcjsKKwlib29s IHJldCA9IGZhbHNlOworCisJcHJlcGFyZV9jcnRjKGRhdGEsIHBpcGUsIG91dHB1dCk7CisKKwlp Z3RfY3JlYXRlX2NvbG9yX2ZiKGRpc3BsYXktPmRybV9mZCwgbW9kZS0+aGRpc3BsYXksIG1vZGUt PnZkaXNwbGF5LAorCQkJICAgIERSTV9GT1JNQVRfWFJHQjg4ODgsIHhfbW9kaWZpZXIsCisJCQkg ICAgLjAsIC4wLCAxLiwgYmdfZmIpOworCisJaWd0X2NyZWF0ZV9jb2xvcl9mYihkaXNwbGF5LT5k cm1fZmQsIDI1NiwgMjU2LAorCQkgICAgICAgICAgICBEUk1fRk9STUFUX0FSR0I4ODg4LCBMT0NB TF9EUk1fRk9STUFUX01PRF9OT05FLAorCQkJICAgIC4wLCAuMCwgMS4sIGJnX2N1cnNvcl9mYik7 CisKKwlpZ3RfY3JlYXRlX2NvbG9yX2ZiKGRpc3BsYXktPmRybV9mZCwgMjU2LCAyNTYsCisJCSAg ICAgICAgICAgIERSTV9GT1JNQVRfQVJHQjg4ODgsIExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUs CisJCQkgICAgLjAsIC4wLCAuMCwgYmxhY2tfY3Vyc29yX2ZiKTsKKworCWlndF9jcmVhdGVfZmIo ZGlzcGxheS0+ZHJtX2ZkLCAyNTYsIDI1NiwKKwkJICAgICAgZm9ybWF0LCB5X21vZGlmaWVyLCBj bGlwX2ZiKTsKKworCS8qIERyYXcgdGhlIEZCIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBjbGlwcGlu ZyB0aGUgY2hyb21hIHN1YnBpeGVsIHRlc3QuICovCisJY3IgPSBpZ3RfZ2V0X2NhaXJvX2N0eChk aXNwbGF5LT5kcm1fZmQsIGNsaXBfZmIpOworCisJaWd0X3BhaW50X2NvbG9yKGNyLCAwLCAwLCBj bGlwX2ZiLT53aWR0aCwgY2xpcF9mYi0+aGVpZ2h0LCAxLiwgMC4sIDAuKTsKKwlpZ3RfcGFpbnRf Y29sb3IoY3IsIDIsIDIsIGNsaXBfZmItPndpZHRoIC0gNCwgY2xpcF9mYi0+aGVpZ2h0IC0gNCwg MC4sIDEuLCAxLik7CisJaWd0X3BhaW50X2NvbG9yKGNyLCA0LCA0LCBjbGlwX2ZiLT53aWR0aCAt IDgsIGNsaXBfZmItPmhlaWdodCAtIDgsIC43NSwgLjc1LCAxLik7CisKKwkvKiBXaGl0ZSBkb3Rz IGluIHRoZSBjb3JuZXJzLiAqLworCWlndF9wYWludF9jb2xvcihjciwgMCwgMCwgNiwgNiwgMS4s IDEuLCAxLik7CisJaWd0X3BhaW50X2NvbG9yKGNyLCBjbGlwX2ZiLT53aWR0aCAtIDYsIDAsIDYs IDYsIDEuLCAxLiwgMS4pOworCWlndF9wYWludF9jb2xvcihjciwgMCwgY2xpcF9mYi0+aGVpZ2h0 IC0gNiwgNiwgNiwgMS4sIDEuLCAxLik7CisJaWd0X3BhaW50X2NvbG9yKGNyLCBjbGlwX2ZiLT53 aWR0aCAtIDYsIGNsaXBfZmItPmhlaWdodCAtIDYsIDYsIDYsIDEuLCAxLiwgMS4pOworCisJaWd0 X3B1dF9jYWlyb19jdHgoZGlzcGxheS0+ZHJtX2ZkLCBjbGlwX2ZiLCBjcik7CisKKwlpZ3RfcGlw ZV9jcmNfc3RhcnQoZGF0YS0+cGlwZV9jcmMpOworCisJaWd0X3BsYW5lX3NldF9mYihwcmltYXJ5 LCBiZ19mYik7CisJZm9yX2VhY2hfcGxhbmVfb25fcGlwZShkaXNwbGF5LCBwaXBlLCBwbGFuZSkg eworCQlzdHJ1Y3QgaWd0X2ZiICpjdXJzb3JfZmIgPSBwbGFuZSA9PSBwcmltYXJ5ID8gYmxhY2tf Y3Vyc29yX2ZiIDogYmdfY3Vyc29yX2ZiOworCQlpZ3RfY3JjX3QgcmVmX2NyYzsKKworCQlpZiAo IWlndF9wbGFuZV9oYXNfZm9ybWF0X21vZChwbGFuZSwgZm9ybWF0LCBjbGlwX2ZiLT5tb2RpZmll cikgfHwgcGxhbmUgPT0gY3Vyc29yKQorCQkJY29udGludWU7CisKKwkJeXV2X2Nocm9tYV9zdWJw aXhlbF9jbGlwX3BsYW5lX3dpdGhfY3Vyc29yKGRhdGEsIHBsYW5lLCBjbGlwX2ZiLCBjdXJzb3Is IGN1cnNvcl9mYiwgJnJlZl9jcmMsIDYzICsgY2xpcF9mYi0+d2lkdGgsIDY0KTsKKwkJcmV0IHw9 IHl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV9yaWdodChkYXRhLCBJR1RfUk9UQVRJT05f MCwgcGxhbmUsIGNsaXBfZmIsICZyZWZfY3JjKTsKKwkJcmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4 ZWxfY2xpcF9wbGFuZV9yaWdodChkYXRhLCBJR1RfUk9UQVRJT05fOTAsIHBsYW5lLCBjbGlwX2Zi LCAmcmVmX2NyYyk7CisJCXJldCB8PSB5dXZfY2hyb21hX3N1YnBpeGVsX2NsaXBfcGxhbmVfcmln aHQoZGF0YSwgSUdUX1JPVEFUSU9OXzE4MCwgcGxhbmUsIGNsaXBfZmIsICZyZWZfY3JjKTsKKwkJ cmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV9yaWdodChkYXRhLCBJR1RfUk9U QVRJT05fMjcwLCBwbGFuZSwgY2xpcF9mYiwgJnJlZl9jcmMpOworCisJCXl1dl9jaHJvbWFfc3Vi cGl4ZWxfY2xpcF9wbGFuZV93aXRoX2N1cnNvcihkYXRhLCBwbGFuZSwgY2xpcF9mYiwgY3Vyc29y LCBjdXJzb3JfZmIsICZyZWZfY3JjLCA2NCwgNjMgKyBjbGlwX2ZiLT5oZWlnaHQpOworCQlyZXQg fD0geXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwX3BsYW5lX2JvdHRvbShkYXRhLCBJR1RfUk9UQVRJ T05fMCwgcGxhbmUsIGNsaXBfZmIsICZyZWZfY3JjKTsKKwkJcmV0IHw9IHl1dl9jaHJvbWFfc3Vi cGl4ZWxfY2xpcF9wbGFuZV9ib3R0b20oZGF0YSwgSUdUX1JPVEFUSU9OXzkwLCBwbGFuZSwgY2xp cF9mYiwgJnJlZl9jcmMpOworCQlyZXQgfD0geXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwX3BsYW5l X2JvdHRvbShkYXRhLCBJR1RfUk9UQVRJT05fMTgwLCBwbGFuZSwgY2xpcF9mYiwgJnJlZl9jcmMp OworCQlyZXQgfD0geXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwX3BsYW5lX2JvdHRvbShkYXRhLCBJ R1RfUk9UQVRJT05fMjcwLCBwbGFuZSwgY2xpcF9mYiwgJnJlZl9jcmMpOworCisJCXl1dl9jaHJv bWFfc3VicGl4ZWxfY2xpcF9wbGFuZV93aXRoX2N1cnNvcihkYXRhLCBwbGFuZSwgY2xpcF9mYiwg Y3Vyc29yLCBjdXJzb3JfZmIsICZyZWZfY3JjLCA2NSAtIGN1cnNvcl9mYi0+d2lkdGgsIDY0KTsK KwkJcmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV9sZWZ0KGRhdGEsIElHVF9S T1RBVElPTl8wLCBwbGFuZSwgY2xpcF9mYiwgJnJlZl9jcmMpOworCQlyZXQgfD0geXV2X2Nocm9t YV9zdWJwaXhlbF9jbGlwX3BsYW5lX2xlZnQoZGF0YSwgSUdUX1JPVEFUSU9OXzkwLCBwbGFuZSwg Y2xpcF9mYiwgJnJlZl9jcmMpOworCQlyZXQgfD0geXV2X2Nocm9tYV9zdWJwaXhlbF9jbGlwX3Bs YW5lX2xlZnQoZGF0YSwgSUdUX1JPVEFUSU9OXzE4MCwgcGxhbmUsIGNsaXBfZmIsICZyZWZfY3Jj KTsKKwkJcmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV9sZWZ0KGRhdGEsIElH VF9ST1RBVElPTl8yNzAsIHBsYW5lLCBjbGlwX2ZiLCAmcmVmX2NyYyk7CisKKwkJeXV2X2Nocm9t YV9zdWJwaXhlbF9jbGlwX3BsYW5lX3dpdGhfY3Vyc29yKGRhdGEsIHBsYW5lLCBjbGlwX2ZiLCBj dXJzb3IsIGN1cnNvcl9mYiwgJnJlZl9jcmMsIDY0LCA2NSAtIGN1cnNvcl9mYi0+aGVpZ2h0KTsK KwkJcmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV90b3AoZGF0YSwgSUdUX1JP VEFUSU9OXzAsIHBsYW5lLCBjbGlwX2ZiLCAmcmVmX2NyYyk7CisJCXJldCB8PSB5dXZfY2hyb21h X3N1YnBpeGVsX2NsaXBfcGxhbmVfdG9wKGRhdGEsIElHVF9ST1RBVElPTl85MCwgcGxhbmUsIGNs aXBfZmIsICZyZWZfY3JjKTsKKwkJcmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFu ZV90b3AoZGF0YSwgSUdUX1JPVEFUSU9OXzE4MCwgcGxhbmUsIGNsaXBfZmIsICZyZWZfY3JjKTsK KwkJcmV0IHw9IHl1dl9jaHJvbWFfc3VicGl4ZWxfY2xpcF9wbGFuZV90b3AoZGF0YSwgSUdUX1JP VEFUSU9OXzI3MCwgcGxhbmUsIGNsaXBfZmIsICZyZWZfY3JjKTsKKworCQkvKiBSZXNldCB0byBk ZWZhdWx0cyAqLworCQlpZ3RfcGxhbmVfc2V0X3Bvc2l0aW9uKHBsYW5lLCAwLCAwKTsKKwkJaWd0 X3BsYW5lX3NldF9yb3RhdGlvbihwbGFuZSwgSUdUX1JPVEFUSU9OXzApOworCQlpZ3RfcGxhbmVf c2V0X2ZiKHBsYW5lLCBwbGFuZSA9PSBwcmltYXJ5ID8gYmdfZmIgOiBOVUxMKTsKKwl9CisKKwlp Z3RfcmVxdWlyZV9mKHJldCwgIkNvdWxkIG5vdCB0ZXN0IHN1YnBpeGVsIGNsaXBwaW5nIGluIGFu eSBjb3JuZXJcbiIpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcHJldHRpZnkodWludDMyX3Qg Zm91cmNjKQoreworCXN0YXRpYyBjaGFyIHN0cls1XTsKKworCW1lbWNweShzdHIsICZmb3VyY2Ms IDQpOworCXN0cls0XSA9IDA7CisJcmV0dXJuIHN0cjsKK30KKworc3RhdGljIHZvaWQgcnVuX3Rl c3RzX2Zvcl9mb3JtYXQoZGF0YV90ICpkYXRhLCBlbnVtIHBpcGUgcGlwZSwgaWd0X291dHB1dF90 ICpvdXRwdXQsIHVuc2lnbmVkIGludCBmb3JtYXQpCit7CisJaWd0X2Rpc3BsYXlfdCAqZGlzcGxh eSA9ICZkYXRhLT5kaXNwbGF5OworCWNvbnN0IGNoYXIgKmZzdHIgPSBwcmV0dGlmeShmb3JtYXQp OworCisJaWd0X2ZpeHR1cmUKKwkJaWd0X3JlcXVpcmUocGlwZV9zdXBwb3J0c19mb3JtYXQoZGlz cGxheSwgcGlwZSwgZm9ybWF0LCB4X21vZGlmaWVyKSk7CisKKwlpZ3Rfc3VidGVzdF9mKCJwaXBl LSVzLSVzLXJnYi1zd2l0Y2giLCBrbXN0ZXN0X3BpcGVfbmFtZShwaXBlKSwgZnN0cikKKwkJeXV2 X3JnYl9zd2l0Y2goZGF0YSwgcGlwZSwgb3V0cHV0LCBmYWxzZSwgZm9ybWF0KTsKKworCWlndF9z dWJ0ZXN0X2YoInBpcGUtJXMtJXMtcmdiLXNjYWxlZC1zd2l0Y2giLCBrbXN0ZXN0X3BpcGVfbmFt ZShwaXBlKSwgZnN0cikKKwkJeXV2X3JnYl9zd2l0Y2goZGF0YSwgcGlwZSwgb3V0cHV0LCB0cnVl LCBmb3JtYXQpOworCisJaWd0X3N1YnRlc3RfZigicGlwZS0lcy0lcy12YWxpZC13aWR0aCIsIGtt c3Rlc3RfcGlwZV9uYW1lKHBpcGUpLCBmc3RyKQorCQl5dXZfdmFsaWRfd2lkdGgoZGF0YSwgcGlw ZSwgb3V0cHV0LCBmb3JtYXQpOworCisJaWd0X3N1YnRlc3RfZigicGlwZS0lcy0lcy1jcm9wLXNj YWxlLWJ1ZyIsIGttc3Rlc3RfcGlwZV9uYW1lKHBpcGUpLCBmc3RyKQorCQl5dXZfY3JvcF9zY2Fs ZV9idWcoZGF0YSwgcGlwZSwgb3V0cHV0LCBmb3JtYXQpOworCisJaWd0X3N1YnRlc3RfZigicGlw ZS0lcy0lcy1jaHJvbWEtc3VicGl4ZWwtY2xpcCIsIGttc3Rlc3RfcGlwZV9uYW1lKHBpcGUpLCBm c3RyKQorCQl5dXZfY2hyb21hX3N1YnBpeGVsX2NsaXAoZGF0YSwgcGlwZSwgb3V0cHV0LCBmb3Jt YXQpOworfQorCitzdGF0aWMgdm9pZCBydW5fdGVzdHNfZm9yX3BpcGUoZGF0YV90ICpkYXRhLCBl bnVtIHBpcGUgcGlwZSkKK3sKKwlpZ3Rfb3V0cHV0X3QgKm91dHB1dCA9IE5VTEw7CisKKwlpZ3Rf Zml4dHVyZQorCQlpZ3RfcmVxdWlyZSgob3V0cHV0ID0gaWd0X2dldF9zaW5nbGVfb3V0cHV0X2Zv cl9waXBlKCZkYXRhLT5kaXNwbGF5LCBwaXBlKSkpOworCisJaWd0X3N1YnRlc3RfZigicGlwZS0l cy15dXYtc2FuaXR5LWNyYyIsIGttc3Rlc3RfcGlwZV9uYW1lKHBpcGUpKQorCQl5dXZfc2FuaXR5 KGRhdGEsIHBpcGUsIG91dHB1dCk7CisKKwlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50X2Zvcm1h dHM7IGkrKykKKwkJaWYgKGlndF9mb3JtYXRfaXNfeXV2KGZvcm1hdHNbaV0pKQorCQkJcnVuX3Rl c3RzX2Zvcl9mb3JtYXQoZGF0YSwgcGlwZSwgb3V0cHV0LCBmb3JtYXRzW2ldKTsKK30KKworaWd0 X21haW4KK3sKKwlkYXRhX3QgZGF0YSA9IHt9OworCWVudW0gcGlwZSBwaXBlOworCisJaWd0X3Nr aXBfb25fc2ltdWxhdGlvbigpOworCisJaWd0X2ZpeHR1cmUgeworCQlkYXRhLmRpc3BsYXkuZHJt X2ZkID0gZHJtX29wZW5fZHJpdmVyX21hc3RlcihEUklWRVJfQU5ZKTsKKworCQlrbXN0ZXN0X3Nl dF92dF9ncmFwaGljc19tb2RlKCk7CisJCWlndF9kaXNwbGF5X3JlcXVpcmUoJmRhdGEuZGlzcGxh eSwgZGF0YS5kaXNwbGF5LmRybV9mZCk7CisJCWlndF9yZXF1aXJlKGRhdGEuZGlzcGxheS5pc19h dG9taWMpOworCQlpZ3RfcmVxdWlyZV9waXBlX2NyYyhkYXRhLmRpc3BsYXkuZHJtX2ZkKTsKKwor CQlpZiAoaWd0X2Rpc3BsYXlfaGFzX2Zvcm1hdF9tb2QoJmRhdGEuZGlzcGxheSwgRFJNX0ZPUk1B VF9YUkdCODg4OCwgTE9DQUxfSTkxNV9GT1JNQVRfTU9EX1hfVElMRUQpKQorCQkJeF9tb2RpZmll ciA9IExPQ0FMX0k5MTVfRk9STUFUX01PRF9YX1RJTEVEOworCisJCWlmIChpZ3RfZGlzcGxheV9o YXNfZm9ybWF0X21vZCgmZGF0YS5kaXNwbGF5LCBEUk1fRk9STUFUX1hSR0I4ODg4LCBMT0NBTF9J OTE1X0ZPUk1BVF9NT0RfWV9USUxFRCkpCisJCQl5X21vZGlmaWVyID0gTE9DQUxfSTkxNV9GT1JN QVRfTU9EX1lfVElMRUQ7CisJfQorCisJaWd0X2Zvcm1hdF9hcnJheV9maWxsKCZmb3JtYXRzLCAm Y291bnRfZm9ybWF0cywgdHJ1ZSk7CisKKwlmb3JfZWFjaF9waXBlX3N0YXRpYyhwaXBlKQorCQlp Z3Rfc3VidGVzdF9ncm91cAorCQkJcnVuX3Rlc3RzX2Zvcl9waXBlKCZkYXRhLCBwaXBlKTsKKwor CWlndF9maXh0dXJlIHsKKwkJaWd0X2Rpc3BsYXlfZmluaSgmZGF0YS5kaXNwbGF5KTsKKwkJY2xv c2UoZGF0YS5kaXNwbGF5LmRybV9mZCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzb24u YnVpbGQgYi90ZXN0cy9tZXNvbi5idWlsZAppbmRleCA5MDE1ZjgwOWVkMDUuLjhjYTdmZTVmNDkx NyAxMDA2NDQKLS0tIGEvdGVzdHMvbWVzb24uYnVpbGQKKysrIGIvdGVzdHMvbWVzb24uYnVpbGQK QEAgLTYxLDYgKzYxLDcgQEAgdGVzdF9wcm9ncyA9IFsKIAkna21zX3VuaXZlcnNhbF9wbGFuZScs CiAJJ2ttc192YmxhbmsnLAogCSdrbXNfdnJyJywKKwkna21zX3l1dicsCiAJJ21ldGFfdGVzdCcs CiAJJ3BlcmYnLAogCSdwcmltZV9idXN5JywKLS0gCjIuMjAuMQoKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KaWd0LWRldiBtYWlsaW5nIGxpc3QKaWd0LWRl dkBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9pZ3QtZGV2