From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id D1067C4167D for ; Wed, 16 Nov 2022 17:46:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=r11D8b2mfFfZBXjMyN74AjfULE7dSUOhndxQ99Ll2ps=; b=I+FUcjYz3h3jw8 aLF+UOOGe1ankb6UCENra+uQpNL6eGcX84WcM9Q0v5HzO+5TpVmiaT9P0gBz3CpE2HkzcDUxcBFeW T28dGvitmokeGpBdPRqN50ZXh2LlOY/yGU6XawDQGI3HBycri4ZfA7Sh1H9PRsHFaKS+FtSfn0/VQ qf/UMXSH7/JlbjyyJc2zkrnVBYdr4X6RwfEVcFnFhWnrREq2Nwmuw7JUr4xF1IDeNS7TueFkjBjuS frLdx09HdlQoXsUGVI8fPc5/ectnHQYL0yQVRqbelZ8sC7flPpLsExA27fRvbRO3Z3i/qiMn6SBXk pakGQl7mfS6FlU+Sb4Xw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1ovMUH-006bv0-6J for ath12k@archiver.kernel.org; Wed, 16 Nov 2022 17:46:13 +0000 Received: from sin.source.kernel.org ([145.40.73.55]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1ovLRg-005xnM-K6 for ath12k@lists.infradead.org; Wed, 16 Nov 2022 16:39:35 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sin.source.kernel.org (Postfix) with ESMTPS id 78398CE1BEE for ; Wed, 16 Nov 2022 16:39:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 09F91C433D6; Wed, 16 Nov 2022 16:39:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1668616763; bh=RxJryhdQctRWGH4HQFKiIrGGeY4jwyzxCEfwY8l41ZU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=E7BXLobBxi8LRnE7dgSq2zdaY4l3i49ssur5nbLriBZes41u8DXs0sN9YOJtu6uhy rOY2iXRmeNxqNjZeZkyxvNRAg+p0QxIjEqi8RO+kIAl+dgHBnz/aDQNzFeJxupA/rG osJbMQeaAwYyEJ2dLQ+ANvN+EFzTVouECvCipUj1wb/YSL+QlfnuV2kt4DVA1mNPbR XVnp3LgbemD5PU/lcCAkLJTyN1+9FXKqYnL5MeWY/6DU3Sk3U1pmxsa64iIOnl7gFb wOZ9TZd29rRNF7WMCAIe90UameYNbmI4ltq5XJQ4R07qYyXd7jvVlvESedTGU/Cwkv zmCJpvz8/Gx/Q== From: Kalle Valo To: linux-wireless@vger.kernel.org Cc: ath12k@lists.infradead.org Subject: [PATCH v2 15/50] wifi: ath12k: add dp_rx.c Date: Wed, 16 Nov 2022 18:38:27 +0200 Message-Id: <20221116163902.24996-16-kvalo@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20221116163902.24996-1-kvalo@kernel.org> References: <20221116163902.24996-1-kvalo@kernel.org> MIME-Version: 1.0 X-BeenThere: ath12k@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "ath12k" Errors-To: ath12k-bounces+ath12k=archiver.kernel.org@lists.infradead.org RnJvbTogS2FsbGUgVmFsbyA8cXVpY19rdmFsb0BxdWljaW5jLmNvbT4KCihQYXRjaGVzIHNwbGl0 IGludG8gb25lIHBhdGNoIHBlciBmaWxlIGZvciBlYXNpZXIgcmV2aWV3LCBidXQgdGhlIGZpbmFs CmNvbW1pdCB3aWxsIGJlIG9uZSBiaWcgcGF0Y2guIFNlZSB0aGUgY292ZXIgbGV0dGVyIGZvciBt b3JlIGluZm8uKQoKU2lnbmVkLW9mZi1ieTogS2FsbGUgVmFsbyA8cXVpY19rdmFsb0BxdWljaW5j LmNvbT4KLS0tCiBkcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTJrL2RwX3J4LmMgfCA0MjM1 ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDEgZmlsZSBjaGFuZ2VkLCA0MjM1IGlu c2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTJr L2RwX3J4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTJrL2RwX3J4LmMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5kNjgzNWQxM2Y3ZWMKLS0tIC9kZXYv bnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTJrL2RwX3J4LmMKQEAgLTAs MCArMSw0MjM1IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlLUNs ZWFyCisvKgorICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjEgVGhlIExpbnV4IEZvdW5kYXRpb24u IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMjEtMjAyMiBRdWFsY29t bSBJbm5vdmF0aW9uIENlbnRlciwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICovCisKKyNp bmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNp bmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxjcnlwdG8vaGFzaC5oPgorI2luY2x1 ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImhhbF9kZXNjLmgiCisj aW5jbHVkZSAiaHcuaCIKKyNpbmNsdWRlICJkcF9yeC5oIgorI2luY2x1ZGUgImhhbF9yeC5oIgor I2luY2x1ZGUgImRwX3R4LmgiCisjaW5jbHVkZSAicGVlci5oIgorI2luY2x1ZGUgImRwX21vbi5o IgorCisjZGVmaW5lIEFUSDEyS19EUF9SWF9GUkFHTUVOVF9USU1FT1VUX01TICgyICogSFopCisK K3N0YXRpYyBlbnVtIGhhbF9lbmNyeXB0X3R5cGUgYXRoMTJrX2RwX3J4X2hfZW5jdHlwZShzdHJ1 Y3QgYXRoMTJrX2Jhc2UgKmFiLAorCQkJCQkJICAgIHN0cnVjdCBoYWxfcnhfZGVzYyAqZGVzYykK K3sKKwlpZiAoIWFiLT5od19wYXJhbXMtPmhhbF9vcHMtPnJ4X2Rlc2NfZW5jcnlwdF92YWxpZChk ZXNjKSkKKwkJcmV0dXJuIEhBTF9FTkNSWVBUX1RZUEVfT1BFTjsKKworCXJldHVybiBhYi0+aHdf cGFyYW1zLT5oYWxfb3BzLT5yeF9kZXNjX2dldF9lbmNyeXB0X3R5cGUoZGVzYyk7Cit9CisKK3U4 IGF0aDEya19kcF9yeF9oX2RlY2FwX3R5cGUoc3RydWN0IGF0aDEya19iYXNlICphYiwKKwkJCSAg ICAgc3RydWN0IGhhbF9yeF9kZXNjICpkZXNjKQoreworCXJldHVybiBhYi0+aHdfcGFyYW1zLT5o YWxfb3BzLT5yeF9kZXNjX2dldF9kZWNhcF90eXBlKGRlc2MpOworfQorCitzdGF0aWMgdTggYXRo MTJrX2RwX3J4X2hfbWVzaF9jdGxfcHJlc2VudChzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLAorCQkJ CQkgIHN0cnVjdCBoYWxfcnhfZGVzYyAqZGVzYykKK3sKKwlyZXR1cm4gYWItPmh3X3BhcmFtcy0+ aGFsX29wcy0+cnhfZGVzY19nZXRfbWVzaF9jdGwoZGVzYyk7Cit9CisKK3N0YXRpYyBib29sIGF0 aDEya19kcF9yeF9oX3NlcV9jdHJsX3ZhbGlkKHN0cnVjdCBhdGgxMmtfYmFzZSAqYWIsCisJCQkJ CSAgc3RydWN0IGhhbF9yeF9kZXNjICpkZXNjKQoreworCXJldHVybiBhYi0+aHdfcGFyYW1zLT5o YWxfb3BzLT5yeF9kZXNjX2dldF9tcGR1X3NlcV9jdGxfdmxkKGRlc2MpOworfQorCitzdGF0aWMg Ym9vbCBhdGgxMmtfZHBfcnhfaF9mY192YWxpZChzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLAorCQkJ CSAgICBzdHJ1Y3QgaGFsX3J4X2Rlc2MgKmRlc2MpCit7CisJcmV0dXJuIGFiLT5od19wYXJhbXMt PmhhbF9vcHMtPnJ4X2Rlc2NfZ2V0X21wZHVfZmNfdmFsaWQoZGVzYyk7Cit9CisKK3N0YXRpYyBi b29sIGF0aDEya19kcF9yeF9oX21vcmVfZnJhZ3Moc3RydWN0IGF0aDEya19iYXNlICphYiwKKwkJ CQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpo ZHI7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikoc2tiLT5kYXRhICsgYWItPmh3 X3BhcmFtcy0+aGFsX2Rlc2Nfc3opOworCXJldHVybiBpZWVlODAyMTFfaGFzX21vcmVmcmFncyho ZHItPmZyYW1lX2NvbnRyb2wpOworfQorCitzdGF0aWMgdTE2IGF0aDEya19kcF9yeF9oX2ZyYWdf bm8oc3RydWN0IGF0aDEya19iYXNlICphYiwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCit7 CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjEx X2hkciAqKShza2ItPmRhdGEgKyBhYi0+aHdfcGFyYW1zLT5oYWxfZGVzY19zeik7CisJcmV0dXJu IGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0cmwpICYgSUVFRTgwMjExX1NDVExfRlJBRzsKK30KKwor c3RhdGljIHUxNiBhdGgxMmtfZHBfcnhfaF9zZXFfbm8oc3RydWN0IGF0aDEya19iYXNlICphYiwK KwkJCQkgc3RydWN0IGhhbF9yeF9kZXNjICpkZXNjKQoreworCXJldHVybiBhYi0+aHdfcGFyYW1z LT5oYWxfb3BzLT5yeF9kZXNjX2dldF9tcGR1X3N0YXJ0X3NlcV9ubyhkZXNjKTsKK30KKworc3Rh dGljIGJvb2wgYXRoMTJrX2RwX3J4X2hfbXNkdV9kb25lKHN0cnVjdCBhdGgxMmtfYmFzZSAqYWIs CisJCQkJICAgICBzdHJ1Y3QgaGFsX3J4X2Rlc2MgKmRlc2MpCit7CisJcmV0dXJuIGFiLT5od19w YXJhbXMtPmhhbF9vcHMtPmRwX3J4X2hfbXNkdV9kb25lKGRlc2MpOworfQorCitzdGF0aWMgYm9v bCBhdGgxMmtfZHBfcnhfaF9sNF9ja3N1bV9mYWlsKHN0cnVjdCBhdGgxMmtfYmFzZSAqYWIsCisJ CQkJCSBzdHJ1Y3QgaGFsX3J4X2Rlc2MgKmRlc2MpCit7CisJcmV0dXJuIGFiLT5od19wYXJhbXMt PmhhbF9vcHMtPmRwX3J4X2hfbDRfY2tzdW1fZmFpbChkZXNjKTsKK30KKworc3RhdGljIGJvb2wg YXRoMTJrX2RwX3J4X2hfaXBfY2tzdW1fZmFpbChzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLAorCQkJ CQkgc3RydWN0IGhhbF9yeF9kZXNjICpkZXNjKQoreworCXJldHVybiBhYi0+aHdfcGFyYW1zLT5o YWxfb3BzLT5kcF9yeF9oX2lwX2Nrc3VtX2ZhaWwoZGVzYyk7Cit9CisKK3N0YXRpYyBib29sIGF0 aDEya19kcF9yeF9oX2lzX2RlY3J5cHRlZChzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLAorCQkJCQlz dHJ1Y3QgaGFsX3J4X2Rlc2MgKmRlc2MpCit7CisJcmV0dXJuIGFiLT5od19wYXJhbXMtPmhhbF9v cHMtPmRwX3J4X2hfaXNfZGVjcnlwdGVkKGRlc2MpOworfQorCit1MzIgYXRoMTJrX2RwX3J4X2hf bXBkdV9lcnIoc3RydWN0IGF0aDEya19iYXNlICphYiwKKwkJCSAgICBzdHJ1Y3QgaGFsX3J4X2Rl c2MgKmRlc2MpCit7CisJcmV0dXJuIGFiLT5od19wYXJhbXMtPmhhbF9vcHMtPmRwX3J4X2hfbXBk dV9lcnIoZGVzYyk7Cit9CisKK3N0YXRpYyB1MTYgYXRoMTJrX2RwX3J4X2hfbXNkdV9sZW4oc3Ry dWN0IGF0aDEya19iYXNlICphYiwKKwkJCQkgICBzdHJ1Y3QgaGFsX3J4X2Rlc2MgKmRlc2MpCit7 CisJcmV0dXJuIGFiLT5od19wYXJhbXMtPmhhbF9vcHMtPnJ4X2Rlc2NfZ2V0X21zZHVfbGVuKGRl c2MpOworfQorCitzdGF0aWMgdTggYXRoMTJrX2RwX3J4X2hfc2dpKHN0cnVjdCBhdGgxMmtfYmFz ZSAqYWIsCisJCQkgICAgIHN0cnVjdCBoYWxfcnhfZGVzYyAqZGVzYykKK3sKKwlyZXR1cm4gYWIt Pmh3X3BhcmFtcy0+aGFsX29wcy0+cnhfZGVzY19nZXRfbXNkdV9zZ2koZGVzYyk7Cit9CisKK3N0 YXRpYyB1OCBhdGgxMmtfZHBfcnhfaF9yYXRlX21jcyhzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLAor CQkJCSAgc3RydWN0IGhhbF9yeF9kZXNjICpkZXNjKQoreworCXJldHVybiBhYi0+aHdfcGFyYW1z LT5oYWxfb3BzLT5yeF9kZXNjX2dldF9tc2R1X3JhdGVfbWNzKGRlc2MpOworfQorCitzdGF0aWMg dTggYXRoMTJrX2RwX3J4X2hfcnhfYncoc3RydWN0IGF0aDEya19iYXNlICphYiwKKwkJCSAgICAg ICBzdHJ1Y3QgaGFsX3J4X2Rlc2MgKmRlc2MpCit7CisJcmV0dXJuIGFiLT5od19wYXJhbXMtPmhh bF9vcHMtPnJ4X2Rlc2NfZ2V0X21zZHVfcnhfYncoZGVzYyk7Cit9CisKK3N0YXRpYyB1MzIgYXRo MTJrX2RwX3J4X2hfZnJlcShzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLAorCQkJICAgICAgIHN0cnVj dCBoYWxfcnhfZGVzYyAqZGVzYykKK3sKKwlyZXR1cm4gYWItPmh3X3BhcmFtcy0+aGFsX29wcy0+ cnhfZGVzY19nZXRfbXNkdV9mcmVxKGRlc2MpOworfQorCitzdGF0aWMgdTggYXRoMTJrX2RwX3J4 X2hfcGt0X3R5cGUoc3RydWN0IGF0aDEya19iYXNlICphYiwKKwkJCQkgIHN0cnVjdCBoYWxfcnhf ZGVzYyAqZGVzYykKK3sKKwlyZXR1cm4gYWItPmh3X3BhcmFtcy0+aGFsX29wcy0+cnhfZGVzY19n ZXRfbXNkdV9wa3RfdHlwZShkZXNjKTsKK30KKworc3RhdGljIHU4IGF0aDEya19kcF9yeF9oX25z cyhzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLAorCQkJICAgICBzdHJ1Y3QgaGFsX3J4X2Rlc2MgKmRl c2MpCit7CisJcmV0dXJuIGh3ZWlnaHQ4KGFiLT5od19wYXJhbXMtPmhhbF9vcHMtPnJ4X2Rlc2Nf Z2V0X21zZHVfbnNzKGRlc2MpKTsKK30KKworc3RhdGljIHU4IGF0aDEya19kcF9yeF9oX3RpZChz dHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLAorCQkJICAgICBzdHJ1Y3QgaGFsX3J4X2Rlc2MgKmRlc2Mp Cit7CisJcmV0dXJuIGFiLT5od19wYXJhbXMtPmhhbF9vcHMtPnJ4X2Rlc2NfZ2V0X21wZHVfdGlk KGRlc2MpOworfQorCitzdGF0aWMgdTE2IGF0aDEya19kcF9yeF9oX3BlZXJfaWQoc3RydWN0IGF0 aDEya19iYXNlICphYiwKKwkJCQkgIHN0cnVjdCBoYWxfcnhfZGVzYyAqZGVzYykKK3sKKwlyZXR1 cm4gYWItPmh3X3BhcmFtcy0+aGFsX29wcy0+cnhfZGVzY19nZXRfbXBkdV9wZWVyX2lkKGRlc2Mp OworfQorCit1OCBhdGgxMmtfZHBfcnhfaF9sM3BhZChzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLAor CQkJc3RydWN0IGhhbF9yeF9kZXNjICpkZXNjKQoreworCXJldHVybiBhYi0+aHdfcGFyYW1zLT5o YWxfb3BzLT5yeF9kZXNjX2dldF9sM19wYWRfYnl0ZXMoZGVzYyk7Cit9CisKK3N0YXRpYyBib29s IGF0aDEya19kcF9yeF9oX2ZpcnN0X21zZHUoc3RydWN0IGF0aDEya19iYXNlICphYiwKKwkJCQkg ICAgICBzdHJ1Y3QgaGFsX3J4X2Rlc2MgKmRlc2MpCit7CisJcmV0dXJuIGFiLT5od19wYXJhbXMt PmhhbF9vcHMtPnJ4X2Rlc2NfZ2V0X2ZpcnN0X21zZHUoZGVzYyk7Cit9CisKK3N0YXRpYyBib29s IGF0aDEya19kcF9yeF9oX2xhc3RfbXNkdShzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLAorCQkJCSAg ICAgc3RydWN0IGhhbF9yeF9kZXNjICpkZXNjKQoreworCXJldHVybiBhYi0+aHdfcGFyYW1zLT5o YWxfb3BzLT5yeF9kZXNjX2dldF9sYXN0X21zZHUoZGVzYyk7Cit9CisKK3N0YXRpYyB2b2lkIGF0 aDEya19kcF9yeF9kZXNjX2VuZF90bHZfY29weShzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLAorCQkJ CQkgICBzdHJ1Y3QgaGFsX3J4X2Rlc2MgKmZkZXNjLAorCQkJCQkgICBzdHJ1Y3QgaGFsX3J4X2Rl c2MgKmxkZXNjKQoreworCWFiLT5od19wYXJhbXMtPmhhbF9vcHMtPnJ4X2Rlc2NfY29weV9lbmRf dGx2KGZkZXNjLCBsZGVzYyk7Cit9CisKK3N0YXRpYyB2b2lkIGF0aDEya19kcF9yeGRlc2Nfc2V0 X21zZHVfbGVuKHN0cnVjdCBhdGgxMmtfYmFzZSAqYWIsCisJCQkJCSAgc3RydWN0IGhhbF9yeF9k ZXNjICpkZXNjLAorCQkJCQkgIHUxNiBsZW4pCit7CisJYWItPmh3X3BhcmFtcy0+aGFsX29wcy0+ cnhfZGVzY19zZXRfbXNkdV9sZW4oZGVzYywgbGVuKTsKK30KKworc3RhdGljIGJvb2wgYXRoMTJr X2RwX3J4X2hfaXNfbWNiYyhzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLAorCQkJCSAgIHN0cnVjdCBo YWxfcnhfZGVzYyAqZGVzYykKK3sKKwlyZXR1cm4gYWItPmh3X3BhcmFtcy0+aGFsX29wcy0+cnhf ZGVzY19pc19tY2JjKGRlc2MpOworfQorCitzdGF0aWMgYm9vbCBhdGgxMmtfZHBfcnhkZXNjX21h Y19hZGRyMl92YWxpZChzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLAorCQkJCQkgICAgIHN0cnVjdCBo YWxfcnhfZGVzYyAqZGVzYykKK3sKKwlyZXR1cm4gYWItPmh3X3BhcmFtcy0+aGFsX29wcy0+cnhf ZGVzY19tYWNfYWRkcjJfdmFsaWQoZGVzYyk7Cit9CisKK3N0YXRpYyB1OCAqYXRoMTJrX2RwX3J4 ZGVzY19nZXRfbXBkdV9zdGFydF9hZGRyMihzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLAorCQkJCQkJ IHN0cnVjdCBoYWxfcnhfZGVzYyAqZGVzYykKK3sKKwlyZXR1cm4gYWItPmh3X3BhcmFtcy0+aGFs X29wcy0+cnhfZGVzY19tcGR1X3N0YXJ0X2FkZHIyKGRlc2MpOworfQorCitzdGF0aWMgdm9pZCBh dGgxMmtfZHBfcnhfZGVzY19nZXRfZG90MTFfaGRyKHN0cnVjdCBhdGgxMmtfYmFzZSAqYWIsCisJ CQkJCSAgICBzdHJ1Y3QgaGFsX3J4X2Rlc2MgKmRlc2MsCisJCQkJCSAgICBzdHJ1Y3QgaWVlZTgw MjExX2hkciAqaGRyKQoreworCWFiLT5od19wYXJhbXMtPmhhbF9vcHMtPnJ4X2Rlc2NfZ2V0X2Rv dDExX2hkcihkZXNjLCBoZHIpOworfQorCitzdGF0aWMgdm9pZCBhdGgxMmtfZHBfcnhfZGVzY19n ZXRfY3J5cHRvX2hlYWRlcihzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLAorCQkJCQkJc3RydWN0IGhh bF9yeF9kZXNjICpkZXNjLAorCQkJCQkJdTggKmNyeXB0b19oZHIsCisJCQkJCQllbnVtIGhhbF9l bmNyeXB0X3R5cGUgZW5jdHlwZSkKK3sKKwlhYi0+aHdfcGFyYW1zLT5oYWxfb3BzLT5yeF9kZXNj X2dldF9jcnlwdG9faGVhZGVyKGRlc2MsIGNyeXB0b19oZHIsIGVuY3R5cGUpOworfQorCitzdGF0 aWMgdTE2IGF0aDEya19kcF9yeGRlc2NfZ2V0X21wZHVfZnJhbWVfY3RybChzdHJ1Y3QgYXRoMTJr X2Jhc2UgKmFiLAorCQkJCQkJc3RydWN0IGhhbF9yeF9kZXNjICpkZXNjKQoreworCXJldHVybiBh Yi0+aHdfcGFyYW1zLT5oYWxfb3BzLT5yeF9kZXNjX2dldF9tcGR1X2ZyYW1lX2N0bChkZXNjKTsK K30KKworc3RhdGljIGludCBhdGgxMmtfZHBfcHVyZ2VfbW9uX3Jpbmcoc3RydWN0IGF0aDEya19i YXNlICphYikKK3sKKwlpbnQgaSwgcmVhcGVkID0gMDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQg PSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhEUF9NT05fUFVSR0VfVElNRU9VVF9NUyk7CisK KwlkbyB7CisJCWZvciAoaSA9IDA7IGkgPCBhYi0+aHdfcGFyYW1zLT5udW1fcnhtZGFfcGVyX3Bk ZXY7IGkrKykKKwkJCXJlYXBlZCArPSBhdGgxMmtfZHBfbW9uX3Byb2Nlc3NfcmluZyhhYiwgaSwg TlVMTCwKKwkJCQkJCQkgICAgIERQX01PTl9TRVJWSUNFX0JVREdFVCwKKwkJCQkJCQkgICAgIEFU SDEyS19EUF9SWF9NT05JVE9SX01PREUpOworCisJCS8qIG5vdGhpbmcgbW9yZSB0byByZWFwICov CisJCWlmIChyZWFwZWQgPCBEUF9NT05fU0VSVklDRV9CVURHRVQpCisJCQlyZXR1cm4gMDsKKwor CX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKTsKKworCWF0aDEya193YXJu KGFiLCAiZHAgbW9uIHJpbmcgcHVyZ2UgdGltZW91dCIpOworCisJcmV0dXJuIC1FVElNRURPVVQ7 Cit9CisKKy8qIFJldHVybnMgbnVtYmVyIG9mIFJ4IGJ1ZmZlcnMgcmVwbGVuaXNoZWQgKi8KK2lu dCBhdGgxMmtfZHBfcnhfYnVmc19yZXBsZW5pc2goc3RydWN0IGF0aDEya19iYXNlICphYiwgaW50 IG1hY19pZCwKKwkJCQlzdHJ1Y3QgZHBfcnhkbWFfcmluZyAqcnhfcmluZywKKwkJCQlpbnQgcmVx X2VudHJpZXMsCisJCQkJZW51bSBoYWxfcnhfYnVmX3JldHVybl9idWZfbWFuYWdlciBtZ3IsCisJ CQkJYm9vbCBod19jYykKK3sKKwlzdHJ1Y3QgYXRoMTJrX2J1ZmZlcl9hZGRyICpkZXNjOworCXN0 cnVjdCBoYWxfc3JuZyAqc3JuZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBudW1fZnJl ZTsKKwlpbnQgbnVtX3JlbWFpbjsKKwlpbnQgYnVmX2lkOworCXUzMiBjb29raWU7CisJZG1hX2Fk ZHJfdCBwYWRkcjsKKwlzdHJ1Y3QgYXRoMTJrX2RwICpkcCA9ICZhYi0+ZHA7CisJc3RydWN0IGF0 aDEya19yeF9kZXNjX2luZm8gKnJ4X2Rlc2M7CisKKwlyZXFfZW50cmllcyA9IG1pbihyZXFfZW50 cmllcywgcnhfcmluZy0+YnVmc19tYXgpOworCisJc3JuZyA9ICZhYi0+aGFsLnNybmdfbGlzdFty eF9yaW5nLT5yZWZpbGxfYnVmX3JpbmcucmluZ19pZF07CisKKwlzcGluX2xvY2tfYmgoJnNybmct PmxvY2spOworCisJYXRoMTJrX2hhbF9zcm5nX2FjY2Vzc19iZWdpbihhYiwgc3JuZyk7CisKKwlu dW1fZnJlZSA9IGF0aDEya19oYWxfc3JuZ19zcmNfbnVtX2ZyZWUoYWIsIHNybmcsIHRydWUpOwor CWlmICghcmVxX2VudHJpZXMgJiYgKG51bV9mcmVlID4gKHJ4X3JpbmctPmJ1ZnNfbWF4ICogMykg LyA0KSkKKwkJcmVxX2VudHJpZXMgPSBudW1fZnJlZTsKKworCXJlcV9lbnRyaWVzID0gbWluKG51 bV9mcmVlLCByZXFfZW50cmllcyk7CisJbnVtX3JlbWFpbiA9IHJlcV9lbnRyaWVzOworCisJd2hp bGUgKG51bV9yZW1haW4gPiAwKSB7CisJCXNrYiA9IGRldl9hbGxvY19za2IoRFBfUlhfQlVGRkVS X1NJWkUgKworCQkJCSAgICBEUF9SWF9CVUZGRVJfQUxJR05fU0laRSk7CisJCWlmICghc2tiKQor CQkJYnJlYWs7CisKKwkJaWYgKCFJU19BTElHTkVEKCh1bnNpZ25lZCBsb25nKXNrYi0+ZGF0YSwK KwkJCQlEUF9SWF9CVUZGRVJfQUxJR05fU0laRSkpIHsKKwkJCXNrYl9wdWxsKHNrYiwKKwkJCQkg UFRSX0FMSUdOKHNrYi0+ZGF0YSwgRFBfUlhfQlVGRkVSX0FMSUdOX1NJWkUpIC0KKwkJCQkgc2ti LT5kYXRhKTsKKwkJfQorCisJCXBhZGRyID0gZG1hX21hcF9zaW5nbGUoYWItPmRldiwgc2tiLT5k YXRhLAorCQkJCSAgICAgICBza2ItPmxlbiArIHNrYl90YWlscm9vbShza2IpLAorCQkJCSAgICAg ICBETUFfRlJPTV9ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoYWItPmRldiwgcGFk ZHIpKQorCQkJZ290byBmYWlsX2ZyZWVfc2tiOworCisJCWlmIChod19jYykgeworCQkJc3Bpbl9s b2NrX2JoKCZkcC0+cnhfZGVzY19sb2NrKTsKKworCQkJLyogR2V0IGRlc2MgZnJvbSBmcmVlIGxp c3QgYW5kIHN0b3JlIGluIHVzZWQgbGlzdAorCQkJICogZm9yIGNsZWFudXAgcHVycG9zZXMKKwkJ CSAqCisJCQkgKiBUT0RPOiBwYXNzIHRoZSByZW1vdmVkIGRlc2NzIHJhdGhlciB0aGFuCisJCQkg KiBhZGQvcmVhZCB0byBvcHRpbWl6ZQorCQkJICovCisJCQlyeF9kZXNjID0gbGlzdF9maXJzdF9l bnRyeV9vcl9udWxsKCZkcC0+cnhfZGVzY19mcmVlX2xpc3QsCisJCQkJCQkJICAgc3RydWN0IGF0 aDEya19yeF9kZXNjX2luZm8sCisJCQkJCQkJICAgbGlzdCk7CisJCQlpZiAoIXJ4X2Rlc2MpIHsK KwkJCQlzcGluX3VubG9ja19iaCgmZHAtPnJ4X2Rlc2NfbG9jayk7CisJCQkJZ290byBmYWlsX2Rt YV91bm1hcDsKKwkJCX0KKworCQkJcnhfZGVzYy0+c2tiID0gc2tiOworCQkJY29va2llID0gcnhf ZGVzYy0+Y29va2llOworCQkJbGlzdF9kZWwoJnJ4X2Rlc2MtPmxpc3QpOworCQkJbGlzdF9hZGRf dGFpbCgmcnhfZGVzYy0+bGlzdCwgJmRwLT5yeF9kZXNjX3VzZWRfbGlzdCk7CisKKwkJCXNwaW5f dW5sb2NrX2JoKCZkcC0+cnhfZGVzY19sb2NrKTsKKwkJfSBlbHNlIHsKKwkJCXNwaW5fbG9ja19i aCgmcnhfcmluZy0+aWRyX2xvY2spOworCQkJYnVmX2lkID0gaWRyX2FsbG9jKCZyeF9yaW5nLT5i dWZzX2lkciwgc2tiLCAwLAorCQkJCQkgICByeF9yaW5nLT5idWZzX21heCAqIDMsIEdGUF9BVE9N SUMpOworCQkJc3Bpbl91bmxvY2tfYmgoJnJ4X3JpbmctPmlkcl9sb2NrKTsKKwkJCWlmIChidWZf aWQgPCAwKQorCQkJCWdvdG8gZmFpbF9kbWFfdW5tYXA7CisJCQljb29raWUgPSB1MzJfZW5jb2Rl X2JpdHMobWFjX2lkLAorCQkJCQkJIERQX1JYRE1BX0JVRl9DT09LSUVfUERFVl9JRCkgfAorCQkJ CSB1MzJfZW5jb2RlX2JpdHMoYnVmX2lkLAorCQkJCQkJIERQX1JYRE1BX0JVRl9DT09LSUVfQlVG X0lEKTsKKwkJfQorCisJCWRlc2MgPSBhdGgxMmtfaGFsX3Nybmdfc3JjX2dldF9uZXh0X2VudHJ5 KGFiLCBzcm5nKTsKKwkJaWYgKCFkZXNjKQorCQkJZ290byBmYWlsX2J1Zl91bmFzc2lnbjsKKwor CQlBVEgxMktfU0tCX1JYQ0Ioc2tiKS0+cGFkZHIgPSBwYWRkcjsKKworCQludW1fcmVtYWluLS07 CisKKwkJYXRoMTJrX2hhbF9yeF9idWZfYWRkcl9pbmZvX3NldChkZXNjLCBwYWRkciwgY29va2ll LCBtZ3IpOworCX0KKworCWF0aDEya19oYWxfc3JuZ19hY2Nlc3NfZW5kKGFiLCBzcm5nKTsKKwor CXNwaW5fdW5sb2NrX2JoKCZzcm5nLT5sb2NrKTsKKworCXJldHVybiByZXFfZW50cmllcyAtIG51 bV9yZW1haW47CisKK2ZhaWxfYnVmX3VuYXNzaWduOgorCWlmIChod19jYykgeworCQlzcGluX2xv Y2tfYmgoJmRwLT5yeF9kZXNjX2xvY2spOworCQlsaXN0X2RlbCgmcnhfZGVzYy0+bGlzdCk7CisJ CWxpc3RfYWRkX3RhaWwoJnJ4X2Rlc2MtPmxpc3QsICZkcC0+cnhfZGVzY19mcmVlX2xpc3QpOwor CQlyeF9kZXNjLT5za2IgPSBOVUxMOworCQlzcGluX3VubG9ja19iaCgmZHAtPnJ4X2Rlc2NfbG9j ayk7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2JoKCZyeF9yaW5nLT5pZHJfbG9jayk7CisJCWlk cl9yZW1vdmUoJnJ4X3JpbmctPmJ1ZnNfaWRyLCBidWZfaWQpOworCQlzcGluX3VubG9ja19iaCgm cnhfcmluZy0+aWRyX2xvY2spOworCX0KK2ZhaWxfZG1hX3VubWFwOgorCWRtYV91bm1hcF9zaW5n bGUoYWItPmRldiwgcGFkZHIsIHNrYi0+bGVuICsgc2tiX3RhaWxyb29tKHNrYiksCisJCQkgRE1B X0ZST01fREVWSUNFKTsKK2ZhaWxfZnJlZV9za2I6CisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsK KworCWF0aDEya19oYWxfc3JuZ19hY2Nlc3NfZW5kKGFiLCBzcm5nKTsKKworCXNwaW5fdW5sb2Nr X2JoKCZzcm5nLT5sb2NrKTsKKworCXJldHVybiByZXFfZW50cmllcyAtIG51bV9yZW1haW47Cit9 CisKK3N0YXRpYyBpbnQgYXRoMTJrX2RwX3J4ZG1hX2J1Zl9yaW5nX2ZyZWUoc3RydWN0IGF0aDEy a19iYXNlICphYiwKKwkJCQkJIHN0cnVjdCBkcF9yeGRtYV9yaW5nICpyeF9yaW5nKQoreworCXN0 cnVjdCBza19idWZmICpza2I7CisJaW50IGJ1Zl9pZDsKKworCXNwaW5fbG9ja19iaCgmcnhfcmlu Zy0+aWRyX2xvY2spOworCWlkcl9mb3JfZWFjaF9lbnRyeSgmcnhfcmluZy0+YnVmc19pZHIsIHNr YiwgYnVmX2lkKSB7CisJCWlkcl9yZW1vdmUoJnJ4X3JpbmctPmJ1ZnNfaWRyLCBidWZfaWQpOwor CQkvKiBUT0RPOiBVbmRlcnN0YW5kIHdoZXJlIGludGVybmFsIGRyaXZlciBkb2VzIHRoaXMgZG1h X3VubWFwCisJCSAqIG9mIHJ4ZG1hX2J1ZmZlci4KKwkJICovCisJCWRtYV91bm1hcF9zaW5nbGUo YWItPmRldiwgQVRIMTJLX1NLQl9SWENCKHNrYiktPnBhZGRyLAorCQkJCSBza2ItPmxlbiArIHNr Yl90YWlscm9vbShza2IpLCBETUFfRlJPTV9ERVZJQ0UpOworCQlkZXZfa2ZyZWVfc2tiX2FueShz a2IpOworCX0KKworCWlkcl9kZXN0cm95KCZyeF9yaW5nLT5idWZzX2lkcik7CisJc3Bpbl91bmxv Y2tfYmgoJnJ4X3JpbmctPmlkcl9sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50 IGF0aDEya19kcF9yeGRtYV9idWZfZnJlZShzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiKQoreworCXN0 cnVjdCBhdGgxMmtfZHAgKmRwID0gJmFiLT5kcDsKKwlzdHJ1Y3QgZHBfcnhkbWFfcmluZyAqcnhf cmluZyA9ICZkcC0+cnhfcmVmaWxsX2J1Zl9yaW5nOworCisJYXRoMTJrX2RwX3J4ZG1hX2J1Zl9y aW5nX2ZyZWUoYWIsIHJ4X3JpbmcpOworCisJcnhfcmluZyA9ICZkcC0+cnhkbWFfbW9uX2J1Zl9y aW5nOworCWF0aDEya19kcF9yeGRtYV9idWZfcmluZ19mcmVlKGFiLCByeF9yaW5nKTsKKworCXJ4 X3JpbmcgPSAmZHAtPnR4X21vbl9idWZfcmluZzsKKwlhdGgxMmtfZHBfcnhkbWFfYnVmX3Jpbmdf ZnJlZShhYiwgcnhfcmluZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGgxMmtf ZHBfcnhkbWFfcmluZ19idWZfc2V0dXAoc3RydWN0IGF0aDEya19iYXNlICphYiwKKwkJCQkJICBz dHJ1Y3QgZHBfcnhkbWFfcmluZyAqcnhfcmluZywKKwkJCQkJICB1MzIgcmluZ3R5cGUpCit7CisJ aW50IG51bV9lbnRyaWVzOworCisJbnVtX2VudHJpZXMgPSByeF9yaW5nLT5yZWZpbGxfYnVmX3Jp bmcuc2l6ZSAvCisJCWF0aDEya19oYWxfc3JuZ19nZXRfZW50cnlzaXplKGFiLCByaW5ndHlwZSk7 CisKKwlyeF9yaW5nLT5idWZzX21heCA9IG51bV9lbnRyaWVzOworCWlmICgocmluZ3R5cGUgPT0g SEFMX1JYRE1BX01PTklUT1JfQlVGKSB8fCAocmluZ3R5cGUgPT0gSEFMX1RYX01PTklUT1JfQlVG KSkKKwkJYXRoMTJrX2RwX21vbl9idWZfcmVwbGVuaXNoKGFiLCByeF9yaW5nLCBudW1fZW50cmll cyk7CisJZWxzZQorCQlhdGgxMmtfZHBfcnhfYnVmc19yZXBsZW5pc2goYWIsIDAsIHJ4X3Jpbmcs IG51bV9lbnRyaWVzLAorCQkJCQkgICAgYWItPmh3X3BhcmFtcy0+aGFsX3BhcmFtcy0+cnhfYnVm X3JibSwKKwkJCQkJICAgIHJpbmd0eXBlID09IEhBTF9SWERNQV9CVUYpOworCXJldHVybiAwOwor fQorCitzdGF0aWMgaW50IGF0aDEya19kcF9yeGRtYV9idWZfc2V0dXAoc3RydWN0IGF0aDEya19i YXNlICphYikKK3sKKwlzdHJ1Y3QgYXRoMTJrX2RwICpkcCA9ICZhYi0+ZHA7CisJc3RydWN0IGRw X3J4ZG1hX3JpbmcgKnJ4X3JpbmcgPSAmZHAtPnJ4X3JlZmlsbF9idWZfcmluZzsKKwlpbnQgcmV0 OworCisJcmV0ID0gYXRoMTJrX2RwX3J4ZG1hX3JpbmdfYnVmX3NldHVwKGFiLCByeF9yaW5nLAor CQkJCQkgICAgIEhBTF9SWERNQV9CVUYpOworCWlmIChyZXQpIHsKKwkJYXRoMTJrX3dhcm4oYWIs CisJCQkgICAgImZhaWxlZCB0byBzZXR1cCBIQUxfUlhETUFfQlVGXG4iKTsKKwkJcmV0dXJuIHJl dDsKKwl9CisKKwlpZiAoYWItPmh3X3BhcmFtcy0+cnhkbWExX2VuYWJsZSkgeworCQlyeF9yaW5n ID0gJmRwLT5yeGRtYV9tb25fYnVmX3Jpbmc7CisJCXJldCA9IGF0aDEya19kcF9yeGRtYV9yaW5n X2J1Zl9zZXR1cChhYiwgcnhfcmluZywKKwkJCQkJCSAgICAgSEFMX1JYRE1BX01PTklUT1JfQlVG KTsKKwkJaWYgKHJldCkgeworCQkJYXRoMTJrX3dhcm4oYWIsCisJCQkJICAgICJmYWlsZWQgdG8g c2V0dXAgSEFMX1JYRE1BX01PTklUT1JfQlVGXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwor CQlyeF9yaW5nID0gJmRwLT50eF9tb25fYnVmX3Jpbmc7CisJCXJldCA9IGF0aDEya19kcF9yeGRt YV9yaW5nX2J1Zl9zZXR1cChhYiwgcnhfcmluZywKKwkJCQkJCSAgICAgSEFMX1RYX01PTklUT1Jf QlVGKTsKKwkJaWYgKHJldCkgeworCQkJYXRoMTJrX3dhcm4oYWIsCisJCQkJICAgICJmYWlsZWQg dG8gc2V0dXAgSEFMX1RYX01PTklUT1JfQlVGXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9 CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXRoMTJrX2RwX3J4X3BkZXZfc3JuZ19m cmVlKHN0cnVjdCBhdGgxMmsgKmFyKQoreworCXN0cnVjdCBhdGgxMmtfcGRldl9kcCAqZHAgPSAm YXItPmRwOworCXN0cnVjdCBhdGgxMmtfYmFzZSAqYWIgPSBhci0+YWI7CisJaW50IGk7CisKKwlm b3IgKGkgPSAwOyBpIDwgYWItPmh3X3BhcmFtcy0+bnVtX3J4bWRhX3Blcl9wZGV2OyBpKyspIHsK KwkJYXRoMTJrX2RwX3NybmdfY2xlYW51cChhYiwgJmRwLT5yeGRtYV9tb25fZHN0X3JpbmdbaV0p OworCQlhdGgxMmtfZHBfc3JuZ19jbGVhbnVwKGFiLCAmZHAtPnR4X21vbl9kc3RfcmluZ1tpXSk7 CisJfQorfQorCit2b2lkIGF0aDEya19kcF9yeF9wZGV2X3Jlb19jbGVhbnVwKHN0cnVjdCBhdGgx MmtfYmFzZSAqYWIpCit7CisJc3RydWN0IGF0aDEya19kcCAqZHAgPSAmYWItPmRwOworCWludCBp OworCisJZm9yIChpID0gMDsgaSA8IERQX1JFT19EU1RfUklOR19NQVg7IGkrKykKKwkJYXRoMTJr X2RwX3NybmdfY2xlYW51cChhYiwgJmRwLT5yZW9fZHN0X3JpbmdbaV0pOworfQorCitpbnQgYXRo MTJrX2RwX3J4X3BkZXZfcmVvX3NldHVwKHN0cnVjdCBhdGgxMmtfYmFzZSAqYWIpCit7CisJc3Ry dWN0IGF0aDEya19kcCAqZHAgPSAmYWItPmRwOworCWludCByZXQ7CisJaW50IGk7CisKKwlmb3Ig KGkgPSAwOyBpIDwgRFBfUkVPX0RTVF9SSU5HX01BWDsgaSsrKSB7CisJCXJldCA9IGF0aDEya19k cF9zcm5nX3NldHVwKGFiLCAmZHAtPnJlb19kc3RfcmluZ1tpXSwKKwkJCQkJICAgSEFMX1JFT19E U1QsIGksIDAsCisJCQkJCSAgIERQX1JFT19EU1RfUklOR19TSVpFKTsKKwkJaWYgKHJldCkgewor CQkJYXRoMTJrX3dhcm4oYWIsICJmYWlsZWQgdG8gc2V0dXAgcmVvX2RzdF9yaW5nXG4iKTsKKwkJ CWdvdG8gZXJyX3Jlb19jbGVhbnVwOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9yZW9f Y2xlYW51cDoKKwlhdGgxMmtfZHBfcnhfcGRldl9yZW9fY2xlYW51cChhYik7CisKKwlyZXR1cm4g cmV0OworfQorCitzdGF0aWMgaW50IGF0aDEya19kcF9yeF9wZGV2X3NybmdfYWxsb2Moc3RydWN0 IGF0aDEyayAqYXIpCit7CisJc3RydWN0IGF0aDEya19wZGV2X2RwICpkcCA9ICZhci0+ZHA7CisJ c3RydWN0IGF0aDEya19iYXNlICphYiA9IGFyLT5hYjsKKwlpbnQgaTsKKwlpbnQgcmV0OworCXUz MiBtYWNfaWQgPSBkcC0+bWFjX2lkOworCisJZm9yIChpID0gMDsgaSA8IGFiLT5od19wYXJhbXMt Pm51bV9yeG1kYV9wZXJfcGRldjsgaSsrKSB7CisJCXJldCA9IGF0aDEya19kcF9zcm5nX3NldHVw KGFyLT5hYiwKKwkJCQkJICAgJmRwLT5yeGRtYV9tb25fZHN0X3JpbmdbaV0sCisJCQkJCSAgIEhB TF9SWERNQV9NT05JVE9SX0RTVCwKKwkJCQkJICAgMCwgbWFjX2lkICsgaSwKKwkJCQkJICAgRFBf UlhETUFfTU9OSVRPUl9EU1RfUklOR19TSVpFKTsKKwkJaWYgKHJldCkgeworCQkJYXRoMTJrX3dh cm4oYXItPmFiLAorCQkJCSAgICAiZmFpbGVkIHRvIHNldHVwIEhBTF9SWERNQV9NT05JVE9SX0RT VFxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gYXRoMTJrX2RwX3Nybmdfc2V0 dXAoYXItPmFiLAorCQkJCQkgICAmZHAtPnR4X21vbl9kc3RfcmluZ1tpXSwKKwkJCQkJICAgSEFM X1RYX01PTklUT1JfRFNULAorCQkJCQkgICAwLCBtYWNfaWQgKyBpLAorCQkJCQkgICBEUF9UWF9N T05JVE9SX0RFU1RfUklOR19TSVpFKTsKKwkJaWYgKHJldCkgeworCQkJYXRoMTJrX3dhcm4oYXIt PmFiLAorCQkJCSAgICAiZmFpbGVkIHRvIHNldHVwIEhBTF9UWF9NT05JVE9SX0RTVFxuIik7CisJ CQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYXRoMTJrX2Rw X3J4X3Jlb19jbWRfbGlzdF9jbGVhbnVwKHN0cnVjdCBhdGgxMmtfYmFzZSAqYWIpCit7CisJc3Ry dWN0IGF0aDEya19kcCAqZHAgPSAmYWItPmRwOworCXN0cnVjdCBhdGgxMmtfZHBfcnhfcmVvX2Nt ZCAqY21kLCAqdG1wOworCXN0cnVjdCBhdGgxMmtfZHBfcnhfcmVvX2NhY2hlX2ZsdXNoX2VsZW0g KmNtZF9jYWNoZSwgKnRtcF9jYWNoZTsKKworCXNwaW5fbG9ja19iaCgmZHAtPnJlb19jbWRfbG9j ayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNtZCwgdG1wLCAmZHAtPnJlb19jbWRfbGlz dCwgbGlzdCkgeworCQlsaXN0X2RlbCgmY21kLT5saXN0KTsKKwkJZG1hX3VubWFwX3NpbmdsZShh Yi0+ZGV2LCBjbWQtPmRhdGEucGFkZHIsCisJCQkJIGNtZC0+ZGF0YS5zaXplLCBETUFfQklESVJF Q1RJT05BTCk7CisJCWtmcmVlKGNtZC0+ZGF0YS52YWRkcik7CisJCWtmcmVlKGNtZCk7CisJfQor CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNtZF9jYWNoZSwgdG1wX2NhY2hlLAorCQkJCSAm ZHAtPnJlb19jbWRfY2FjaGVfZmx1c2hfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmY21kX2Nh Y2hlLT5saXN0KTsKKwkJZHAtPnJlb19jbWRfY2FjaGVfZmx1c2hfY291bnQtLTsKKwkJZG1hX3Vu bWFwX3NpbmdsZShhYi0+ZGV2LCBjbWRfY2FjaGUtPmRhdGEucGFkZHIsCisJCQkJIGNtZF9jYWNo ZS0+ZGF0YS5zaXplLCBETUFfQklESVJFQ1RJT05BTCk7CisJCWtmcmVlKGNtZF9jYWNoZS0+ZGF0 YS52YWRkcik7CisJCWtmcmVlKGNtZF9jYWNoZSk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZkcC0+ cmVvX2NtZF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgYXRoMTJrX2RwX3Jlb19jbWRfZnJlZShz dHJ1Y3QgYXRoMTJrX2RwICpkcCwgdm9pZCAqY3R4LAorCQkJCSAgIGVudW0gaGFsX3Jlb19jbWRf c3RhdHVzIHN0YXR1cykKK3sKKwlzdHJ1Y3QgYXRoMTJrX2RwX3J4X3RpZCAqcnhfdGlkID0gY3R4 OworCisJaWYgKHN0YXR1cyAhPSBIQUxfUkVPX0NNRF9TVUNDRVNTKQorCQlhdGgxMmtfd2Fybihk cC0+YWIsICJmYWlsZWQgdG8gZmx1c2ggcnggdGlkIGh3IGRlc2MsIHRpZCAlZCBzdGF0dXMgJWRc biIsCisJCQkgICAgcnhfdGlkLT50aWQsIHN0YXR1cyk7CisKKwlkbWFfdW5tYXBfc2luZ2xlKGRw LT5hYi0+ZGV2LCByeF90aWQtPnBhZGRyLCByeF90aWQtPnNpemUsCisJCQkgRE1BX0JJRElSRUNU SU9OQUwpOworCWtmcmVlKHJ4X3RpZC0+dmFkZHIpOworCXJ4X3RpZC0+dmFkZHIgPSBOVUxMOwor fQorCitzdGF0aWMgaW50IGF0aDEya19kcF9yZW9fY21kX3NlbmQoc3RydWN0IGF0aDEya19iYXNl ICphYiwgc3RydWN0IGF0aDEya19kcF9yeF90aWQgKnJ4X3RpZCwKKwkJCQkgIGVudW0gaGFsX3Jl b19jbWRfdHlwZSB0eXBlLAorCQkJCSAgc3RydWN0IGF0aDEya19oYWxfcmVvX2NtZCAqY21kLAor CQkJCSAgdm9pZCAoKmNiKShzdHJ1Y3QgYXRoMTJrX2RwICpkcCwgdm9pZCAqY3R4LAorCQkJCQkg ICAgIGVudW0gaGFsX3Jlb19jbWRfc3RhdHVzIHN0YXR1cykpCit7CisJc3RydWN0IGF0aDEya19k cCAqZHAgPSAmYWItPmRwOworCXN0cnVjdCBhdGgxMmtfZHBfcnhfcmVvX2NtZCAqZHBfY21kOwor CXN0cnVjdCBoYWxfc3JuZyAqY21kX3Jpbmc7CisJaW50IGNtZF9udW07CisKKwljbWRfcmluZyA9 ICZhYi0+aGFsLnNybmdfbGlzdFtkcC0+cmVvX2NtZF9yaW5nLnJpbmdfaWRdOworCWNtZF9udW0g PSBhdGgxMmtfaGFsX3Jlb19jbWRfc2VuZChhYiwgY21kX3JpbmcsIHR5cGUsIGNtZCk7CisKKwkv KiBjbWRfbnVtIHNob3VsZCBzdGFydCBmcm9tIDEsIGR1cmluZyBmYWlsdXJlIHJldHVybiB0aGUg ZXJyb3IgY29kZSAqLworCWlmIChjbWRfbnVtIDwgMCkKKwkJcmV0dXJuIGNtZF9udW07CisKKwkv KiByZW8gY21kIHJpbmcgZGVzY3JpcHRvcnMgaGFzIGNtZF9udW0gc3RhcnRpbmcgZnJvbSAxICov CisJaWYgKGNtZF9udW0gPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWNiKQorCQly ZXR1cm4gMDsKKworCS8qIENhbiB0aGlzIGJlIG9wdGltaXplZCBzbyB0aGF0IHdlIGtlZXAgdGhl IHBlbmRpbmcgY29tbWFuZCBsaXN0IG9ubHkKKwkgKiBmb3IgdGlkIGRlbGV0ZSBjb21tYW5kIHRv IGZyZWUgdXAgdGhlIHJlc291cmNlIG9uIHRoZSBjb21tYW5kIHN0YXR1cworCSAqIGluZGljYXRp b24/CisJICovCisJZHBfY21kID0ga3phbGxvYyhzaXplb2YoKmRwX2NtZCksIEdGUF9BVE9NSUMp OworCisJaWYgKCFkcF9jbWQpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtY3B5KCZkcF9jbWQt PmRhdGEsIHJ4X3RpZCwgc2l6ZW9mKCpyeF90aWQpKTsKKwlkcF9jbWQtPmNtZF9udW0gPSBjbWRf bnVtOworCWRwX2NtZC0+aGFuZGxlciA9IGNiOworCisJc3Bpbl9sb2NrX2JoKCZkcC0+cmVvX2Nt ZF9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZkcF9jbWQtPmxpc3QsICZkcC0+cmVvX2NtZF9saXN0 KTsKKwlzcGluX3VubG9ja19iaCgmZHAtPnJlb19jbWRfbG9jayk7CisKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIHZvaWQgYXRoMTJrX2RwX3Jlb19jYWNoZV9mbHVzaChzdHJ1Y3QgYXRoMTJrX2Jh c2UgKmFiLAorCQkJCSAgICAgIHN0cnVjdCBhdGgxMmtfZHBfcnhfdGlkICpyeF90aWQpCit7CisJ c3RydWN0IGF0aDEya19oYWxfcmVvX2NtZCBjbWQgPSB7MH07CisJdW5zaWduZWQgbG9uZyB0b3Rf ZGVzY19zeiwgZGVzY19zejsKKwlpbnQgcmV0OworCisJdG90X2Rlc2Nfc3ogPSByeF90aWQtPnNp emU7CisJZGVzY19zeiA9IGF0aDEya19oYWxfcmVvX3FkZXNjX3NpemUoMCwgSEFMX0RFU0NfUkVP X05PTl9RT1NfVElEKTsKKworCXdoaWxlICh0b3RfZGVzY19zeiA+IGRlc2Nfc3opIHsKKwkJdG90 X2Rlc2Nfc3ogLT0gZGVzY19zejsKKwkJY21kLmFkZHJfbG8gPSBsb3dlcl8zMl9iaXRzKHJ4X3Rp ZC0+cGFkZHIgKyB0b3RfZGVzY19zeik7CisJCWNtZC5hZGRyX2hpID0gdXBwZXJfMzJfYml0cyhy eF90aWQtPnBhZGRyKTsKKwkJcmV0ID0gYXRoMTJrX2RwX3Jlb19jbWRfc2VuZChhYiwgcnhfdGlk LAorCQkJCQkgICAgIEhBTF9SRU9fQ01EX0ZMVVNIX0NBQ0hFLCAmY21kLAorCQkJCQkgICAgIE5V TEwpOworCQlpZiAocmV0KQorCQkJYXRoMTJrX3dhcm4oYWIsCisJCQkJICAgICJmYWlsZWQgdG8g c2VuZCBIQUxfUkVPX0NNRF9GTFVTSF9DQUNIRSwgdGlkICVkICglZClcbiIsCisJCQkJICAgIHJ4 X3RpZC0+dGlkLCByZXQpOworCX0KKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJ Y21kLmFkZHJfbG8gPSBsb3dlcl8zMl9iaXRzKHJ4X3RpZC0+cGFkZHIpOworCWNtZC5hZGRyX2hp ID0gdXBwZXJfMzJfYml0cyhyeF90aWQtPnBhZGRyKTsKKwljbWQuZmxhZyA9IEhBTF9SRU9fQ01E X0ZMR19ORUVEX1NUQVRVUzsKKwlyZXQgPSBhdGgxMmtfZHBfcmVvX2NtZF9zZW5kKGFiLCByeF90 aWQsCisJCQkJICAgICBIQUxfUkVPX0NNRF9GTFVTSF9DQUNIRSwKKwkJCQkgICAgICZjbWQsIGF0 aDEya19kcF9yZW9fY21kX2ZyZWUpOworCWlmIChyZXQpIHsKKwkJYXRoMTJrX2VycihhYiwgImZh aWxlZCB0byBzZW5kIEhBTF9SRU9fQ01EX0ZMVVNIX0NBQ0hFIGNtZCwgdGlkICVkICglZClcbiIs CisJCQkgICByeF90aWQtPnRpZCwgcmV0KTsKKwkJZG1hX3VubWFwX3NpbmdsZShhYi0+ZGV2LCBy eF90aWQtPnBhZGRyLCByeF90aWQtPnNpemUsCisJCQkJIERNQV9CSURJUkVDVElPTkFMKTsKKwkJ a2ZyZWUocnhfdGlkLT52YWRkcik7CisJCXJ4X3RpZC0+dmFkZHIgPSBOVUxMOworCX0KK30KKwor c3RhdGljIHZvaWQgYXRoMTJrX2RwX3J4X3RpZF9kZWxfZnVuYyhzdHJ1Y3QgYXRoMTJrX2RwICpk cCwgdm9pZCAqY3R4LAorCQkJCSAgICAgIGVudW0gaGFsX3Jlb19jbWRfc3RhdHVzIHN0YXR1cykK K3sKKwlzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiID0gZHAtPmFiOworCXN0cnVjdCBhdGgxMmtfZHBf cnhfdGlkICpyeF90aWQgPSBjdHg7CisJc3RydWN0IGF0aDEya19kcF9yeF9yZW9fY2FjaGVfZmx1 c2hfZWxlbSAqZWxlbSwgKnRtcDsKKworCWlmIChzdGF0dXMgPT0gSEFMX1JFT19DTURfRFJBSU4p IHsKKwkJZ290byBmcmVlX2Rlc2M7CisJfSBlbHNlIGlmIChzdGF0dXMgIT0gSEFMX1JFT19DTURf U1VDQ0VTUykgeworCQkvKiBTaG91bGRuJ3QgaGFwcGVuISBDbGVhbnVwIGluIGNhc2Ugb2Ygb3Ro ZXIgZmFpbHVyZT8gKi8KKwkJYXRoMTJrX3dhcm4oYWIsICJmYWlsZWQgdG8gZGVsZXRlIHJ4IHRp ZCAlZCBodyBkZXNjcmlwdG9yICVkXG4iLAorCQkJICAgIHJ4X3RpZC0+dGlkLCBzdGF0dXMpOwor CQlyZXR1cm47CisJfQorCisJZWxlbSA9IGt6YWxsb2Moc2l6ZW9mKCplbGVtKSwgR0ZQX0FUT01J Qyk7CisJaWYgKCFlbGVtKQorCQlnb3RvIGZyZWVfZGVzYzsKKworCWVsZW0tPnRzID0gamlmZmll czsKKwltZW1jcHkoJmVsZW0tPmRhdGEsIHJ4X3RpZCwgc2l6ZW9mKCpyeF90aWQpKTsKKworCXNw aW5fbG9ja19iaCgmZHAtPnJlb19jbWRfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmZWxlbS0+bGlz dCwgJmRwLT5yZW9fY21kX2NhY2hlX2ZsdXNoX2xpc3QpOworCWRwLT5yZW9fY21kX2NhY2hlX2Zs dXNoX2NvdW50Kys7CisKKwkvKiBGbHVzaCBhbmQgaW52YWxpZGF0ZSBhZ2VkIFJFTyBkZXNjIGZy b20gSFcgY2FjaGUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZWxlbSwgdG1wLCAmZHAt PnJlb19jbWRfY2FjaGVfZmx1c2hfbGlzdCwKKwkJCQkgbGlzdCkgeworCQlpZiAoZHAtPnJlb19j bWRfY2FjaGVfZmx1c2hfY291bnQgPiBBVEgxMktfRFBfUlhfUkVPX0RFU0NfRlJFRV9USFJFUyB8 fAorCQkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBlbGVtLT50cyArCisJCQkgICAgICAgbXNlY3Nf dG9famlmZmllcyhBVEgxMktfRFBfUlhfUkVPX0RFU0NfRlJFRV9USU1FT1VUX01TKSkpIHsKKwkJ CWxpc3RfZGVsKCZlbGVtLT5saXN0KTsKKwkJCWRwLT5yZW9fY21kX2NhY2hlX2ZsdXNoX2NvdW50 LS07CisKKwkJCS8qIFVubG9jayB0aGUgcmVvX2NtZF9sb2NrIGJlZm9yZSB1c2luZyBhdGgxMmtf ZHBfcmVvX2NtZF9zZW5kKCkKKwkJCSAqIHdpdGhpbiBhdGgxMmtfZHBfcmVvX2NhY2hlX2ZsdXNo LiBUaGUgcmVvX2NtZF9jYWNoZV9mbHVzaF9saXN0CisJCQkgKiBpcyB1c2VkIGluIG9ubHkgdHdv IGNvbnRleHRzLCBvbmUgaXMgaW4gdGhpcyBmdW5jdGlvbiBjYWxsZWQKKwkJCSAqIGZyb20gbmFw aSBhbmQgdGhlIG90aGVyIGluIGF0aDEya19kcF9mcmVlIGR1cmluZyBjb3JlIGRlc3Ryb3kuCisJ CQkgKiBCZWZvcmUgZHBfZnJlZSwgdGhlIGlycXMgd291bGQgYmUgZGlzYWJsZWQgYW5kIHdvdWxk IHdhaXQgdG8KKwkJCSAqIHN5bmNocm9uaXplLiBIZW5jZSB0aGVyZSB3b3VsZG7igJl0IGJlIGFu eSByYWNlIGFnYWluc3QgYWRkIG9yCisJCQkgKiBkZWxldGUgdG8gdGhpcyBsaXN0LiBIZW5jZSB1 bmxvY2stbG9jayBpcyBzYWZlIGhlcmUuCisJCQkgKi8KKwkJCXNwaW5fdW5sb2NrX2JoKCZkcC0+ cmVvX2NtZF9sb2NrKTsKKworCQkJYXRoMTJrX2RwX3Jlb19jYWNoZV9mbHVzaChhYiwgJmVsZW0t PmRhdGEpOworCQkJa2ZyZWUoZWxlbSk7CisJCQlzcGluX2xvY2tfYmgoJmRwLT5yZW9fY21kX2xv Y2spOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2JoKCZkcC0+cmVvX2NtZF9sb2NrKTsKKworCXJl dHVybjsKK2ZyZWVfZGVzYzoKKwlkbWFfdW5tYXBfc2luZ2xlKGFiLT5kZXYsIHJ4X3RpZC0+cGFk ZHIsIHJ4X3RpZC0+c2l6ZSwKKwkJCSBETUFfQklESVJFQ1RJT05BTCk7CisJa2ZyZWUocnhfdGlk LT52YWRkcik7CisJcnhfdGlkLT52YWRkciA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGF0aDEy a19wZWVyX3J4X3RpZF9xcmVmX3NldHVwKHN0cnVjdCBhdGgxMmtfYmFzZSAqYWIsIHUxNiBwZWVy X2lkLCB1MTYgdGlkLAorCQkJCQkgIGRtYV9hZGRyX3QgcGFkZHIpCit7CisJc3RydWN0IGF0aDEy a19yZW9fcXVldWVfcmVmICpxcmVmOworCXN0cnVjdCBhdGgxMmtfZHAgKmRwID0gJmFiLT5kcDsK KworCWlmICghYWItPmh3X3BhcmFtcy0+cmVvcV9sdXRfc3VwcG9ydCkKKwkJcmV0dXJuOworCisJ LyogVE9ETzogYmFzZWQgb24gTUwgcGVlciBvciBub3QsIHNlbGVjdCB0aGUgTFVULiBiZWxvdyBh c3N1bWVzIG5vbgorCSAqIE1MIHBlZXIKKwkgKi8KKwlxcmVmID0gKHN0cnVjdCBhdGgxMmtfcmVv X3F1ZXVlX3JlZiAqKWRwLT5yZW9xX2x1dC52YWRkciArCisJCQkocGVlcl9pZCAqIChJRUVFODAy MTFfTlVNX1RJRFMgKyAxKSArIHRpZCk7CisKKwlxcmVmLT5pbmZvMCA9IHUzMl9lbmNvZGVfYml0 cyhsb3dlcl8zMl9iaXRzKHBhZGRyKSwKKwkJCQkgICAgICBCVUZGRVJfQUREUl9JTkZPMF9BRERS KTsKKwlxcmVmLT5pbmZvMSA9IHUzMl9lbmNvZGVfYml0cyh1cHBlcl8zMl9iaXRzKHBhZGRyKSwK KwkJCQkgICAgICBCVUZGRVJfQUREUl9JTkZPMV9BRERSKSB8CisJCSAgICAgIHUzMl9lbmNvZGVf Yml0cyh0aWQsIERQX1JFT19RUkVGX05VTSk7Cit9CisKK3N0YXRpYyB2b2lkIGF0aDEya19wZWVy X3J4X3RpZF9xcmVmX3Jlc2V0KHN0cnVjdCBhdGgxMmtfYmFzZSAqYWIsIHUxNiBwZWVyX2lkLCB1 MTYgdGlkKQoreworCXN0cnVjdCBhdGgxMmtfcmVvX3F1ZXVlX3JlZiAqcXJlZjsKKwlzdHJ1Y3Qg YXRoMTJrX2RwICpkcCA9ICZhYi0+ZHA7CisKKwlpZiAoIWFiLT5od19wYXJhbXMtPnJlb3FfbHV0 X3N1cHBvcnQpCisJCXJldHVybjsKKworCS8qIFRPRE86IGJhc2VkIG9uIE1MIHBlZXIgb3Igbm90 LCBzZWxlY3QgdGhlIExVVC4gYmVsb3cgYXNzdW1lcyBub24KKwkgKiBNTCBwZWVyCisJICovCisJ cXJlZiA9IChzdHJ1Y3QgYXRoMTJrX3Jlb19xdWV1ZV9yZWYgKilkcC0+cmVvcV9sdXQudmFkZHIg KworCQkJKHBlZXJfaWQgKiAoSUVFRTgwMjExX05VTV9USURTICsgMSkgKyB0aWQpOworCisJcXJl Zi0+aW5mbzAgPSB1MzJfZW5jb2RlX2JpdHMoMCwgQlVGRkVSX0FERFJfSU5GTzBfQUREUik7CisJ cXJlZi0+aW5mbzEgPSB1MzJfZW5jb2RlX2JpdHMoMCwgQlVGRkVSX0FERFJfSU5GTzFfQUREUikg fAorCQkgICAgICB1MzJfZW5jb2RlX2JpdHModGlkLCBEUF9SRU9fUVJFRl9OVU0pOworfQorCit2 b2lkIGF0aDEya19kcF9yeF9wZWVyX3RpZF9kZWxldGUoc3RydWN0IGF0aDEyayAqYXIsCisJCQkJ ICBzdHJ1Y3QgYXRoMTJrX3BlZXIgKnBlZXIsIHU4IHRpZCkKK3sKKwlzdHJ1Y3QgYXRoMTJrX2hh bF9yZW9fY21kIGNtZCA9IHswfTsKKwlzdHJ1Y3QgYXRoMTJrX2RwX3J4X3RpZCAqcnhfdGlkID0g JnBlZXItPnJ4X3RpZFt0aWRdOworCWludCByZXQ7CisKKwlpZiAoIXJ4X3RpZC0+YWN0aXZlKQor CQlyZXR1cm47CisKKwljbWQuZmxhZyA9IEhBTF9SRU9fQ01EX0ZMR19ORUVEX1NUQVRVUzsKKwlj bWQuYWRkcl9sbyA9IGxvd2VyXzMyX2JpdHMocnhfdGlkLT5wYWRkcik7CisJY21kLmFkZHJfaGkg PSB1cHBlcl8zMl9iaXRzKHJ4X3RpZC0+cGFkZHIpOworCWNtZC51cGQwID0gSEFMX1JFT19DTURf VVBEMF9WTEQ7CisJcmV0ID0gYXRoMTJrX2RwX3Jlb19jbWRfc2VuZChhci0+YWIsIHJ4X3RpZCwK KwkJCQkgICAgIEhBTF9SRU9fQ01EX1VQREFURV9SWF9RVUVVRSwgJmNtZCwKKwkJCQkgICAgIGF0 aDEya19kcF9yeF90aWRfZGVsX2Z1bmMpOworCWlmIChyZXQpIHsKKwkJYXRoMTJrX2Vycihhci0+ YWIsICJmYWlsZWQgdG8gc2VuZCBIQUxfUkVPX0NNRF9VUERBVEVfUlhfUVVFVUUgY21kLCB0aWQg JWQgKCVkKVxuIiwKKwkJCSAgIHRpZCwgcmV0KTsKKwkJZG1hX3VubWFwX3NpbmdsZShhci0+YWIt PmRldiwgcnhfdGlkLT5wYWRkciwgcnhfdGlkLT5zaXplLAorCQkJCSBETUFfQklESVJFQ1RJT05B TCk7CisJCWtmcmVlKHJ4X3RpZC0+dmFkZHIpOworCQlyeF90aWQtPnZhZGRyID0gTlVMTDsKKwl9 CisKKwlhdGgxMmtfcGVlcl9yeF90aWRfcXJlZl9yZXNldChhci0+YWIsIHBlZXItPnBlZXJfaWQs IHRpZCk7CisKKwlyeF90aWQtPmFjdGl2ZSA9IGZhbHNlOworfQorCisvKiBUT0RPOiBpdCdzIHN0 cmFuZ2UgKGFuZCB1Z2x5KSB0aGF0IHN0cnVjdCBoYWxfcmVvX2Rlc3RfcmluZyBpcyBjb252ZXJ0 ZWQKKyAqIHRvIHN0cnVjdCBoYWxfd2JtX3JlbGVhc2VfcmluZywgSSBjb3VsZG4ndCBmaWd1cmUg b3V0IHRoZSBsb2dpYyBiZWhpbmQKKyAqIHRoYXQuCisgKi8KK3N0YXRpYyBpbnQgYXRoMTJrX2Rw X3J4X2xpbmtfZGVzY19yZXR1cm4oc3RydWN0IGF0aDEya19iYXNlICphYiwKKwkJCQkJIHN0cnVj dCBoYWxfcmVvX2Rlc3RfcmluZyAqcmluZywKKwkJCQkJIGVudW0gaGFsX3dibV9yZWxfYm1fYWN0 IGFjdGlvbikKK3sKKwlzdHJ1Y3QgaGFsX3dibV9yZWxlYXNlX3JpbmcgKmxpbmtfZGVzYyA9IChz dHJ1Y3QgaGFsX3dibV9yZWxlYXNlX3JpbmcgKilyaW5nOworCXN0cnVjdCBoYWxfd2JtX3JlbGVh c2VfcmluZyAqZGVzYzsKKwlzdHJ1Y3QgYXRoMTJrX2RwICpkcCA9ICZhYi0+ZHA7CisJc3RydWN0 IGhhbF9zcm5nICpzcm5nOworCWludCByZXQgPSAwOworCisJc3JuZyA9ICZhYi0+aGFsLnNybmdf bGlzdFtkcC0+d2JtX2Rlc2NfcmVsX3JpbmcucmluZ19pZF07CisKKwlzcGluX2xvY2tfYmgoJnNy bmctPmxvY2spOworCisJYXRoMTJrX2hhbF9zcm5nX2FjY2Vzc19iZWdpbihhYiwgc3JuZyk7CisK KwlkZXNjID0gYXRoMTJrX2hhbF9zcm5nX3NyY19nZXRfbmV4dF9lbnRyeShhYiwgc3JuZyk7CisJ aWYgKCFkZXNjKSB7CisJCXJldCA9IC1FTk9CVUZTOworCQlnb3RvIGV4aXQ7CisJfQorCisJYXRo MTJrX2hhbF9yeF9tc2R1X2xpbmtfZGVzY19zZXQoYWIsIGRlc2MsIGxpbmtfZGVzYywgYWN0aW9u KTsKKworZXhpdDoKKwlhdGgxMmtfaGFsX3NybmdfYWNjZXNzX2VuZChhYiwgc3JuZyk7CisKKwlz cGluX3VubG9ja19iaCgmc3JuZy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMg dm9pZCBhdGgxMmtfZHBfcnhfZnJhZ3NfY2xlYW51cChzdHJ1Y3QgYXRoMTJrX2RwX3J4X3RpZCAq cnhfdGlkLAorCQkJCSAgICAgICBib29sIHJlbF9saW5rX2Rlc2MpCit7CisJc3RydWN0IGF0aDEy a19iYXNlICphYiA9IHJ4X3RpZC0+YWI7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhYi0+YmFz ZV9sb2NrKTsKKworCWlmIChyeF90aWQtPmRzdF9yaW5nX2Rlc2MpIHsKKwkJaWYgKHJlbF9saW5r X2Rlc2MpCisJCQlhdGgxMmtfZHBfcnhfbGlua19kZXNjX3JldHVybihhYiwgcnhfdGlkLT5kc3Rf cmluZ19kZXNjLAorCQkJCQkJICAgICAgSEFMX1dCTV9SRUxfQk1fQUNUX1BVVF9JTl9JRExFKTsK KwkJa2ZyZWUocnhfdGlkLT5kc3RfcmluZ19kZXNjKTsKKwkJcnhfdGlkLT5kc3RfcmluZ19kZXNj ID0gTlVMTDsKKwl9CisKKwlyeF90aWQtPmN1cl9zbiA9IDA7CisJcnhfdGlkLT5sYXN0X2ZyYWdf bm8gPSAwOworCXJ4X3RpZC0+cnhfZnJhZ19iaXRtYXAgPSAwOworCV9fc2tiX3F1ZXVlX3B1cmdl KCZyeF90aWQtPnJ4X2ZyYWdzKTsKK30KKwordm9pZCBhdGgxMmtfZHBfcnhfcGVlcl90aWRfY2xl YW51cChzdHJ1Y3QgYXRoMTJrICphciwgc3RydWN0IGF0aDEya19wZWVyICpwZWVyKQoreworCXN0 cnVjdCBhdGgxMmtfZHBfcnhfdGlkICpyeF90aWQ7CisJaW50IGk7CisKKwlsb2NrZGVwX2Fzc2Vy dF9oZWxkKCZhci0+YWItPmJhc2VfbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IElFRUU4MDIx MV9OVU1fVElEUzsgaSsrKSB7CisJCXJ4X3RpZCA9ICZwZWVyLT5yeF90aWRbaV07CisKKwkJYXRo MTJrX2RwX3J4X3BlZXJfdGlkX2RlbGV0ZShhciwgcGVlciwgaSk7CisJCWF0aDEya19kcF9yeF9m cmFnc19jbGVhbnVwKHJ4X3RpZCwgdHJ1ZSk7CisKKwkJc3Bpbl91bmxvY2tfYmgoJmFyLT5hYi0+ YmFzZV9sb2NrKTsKKwkJZGVsX3RpbWVyX3N5bmMoJnJ4X3RpZC0+ZnJhZ190aW1lcik7CisJCXNw aW5fbG9ja19iaCgmYXItPmFiLT5iYXNlX2xvY2spOworCX0KK30KKworc3RhdGljIGludCBhdGgx MmtfcGVlcl9yeF90aWRfcmVvX3VwZGF0ZShzdHJ1Y3QgYXRoMTJrICphciwKKwkJCQkJIHN0cnVj dCBhdGgxMmtfcGVlciAqcGVlciwKKwkJCQkJIHN0cnVjdCBhdGgxMmtfZHBfcnhfdGlkICpyeF90 aWQsCisJCQkJCSB1MzIgYmFfd2luX3N6LCB1MTYgc3NuLAorCQkJCQkgYm9vbCB1cGRhdGVfc3Nu KQoreworCXN0cnVjdCBhdGgxMmtfaGFsX3Jlb19jbWQgY21kID0gezB9OworCWludCByZXQ7CisK KwljbWQuYWRkcl9sbyA9IGxvd2VyXzMyX2JpdHMocnhfdGlkLT5wYWRkcik7CisJY21kLmFkZHJf aGkgPSB1cHBlcl8zMl9iaXRzKHJ4X3RpZC0+cGFkZHIpOworCWNtZC5mbGFnID0gSEFMX1JFT19D TURfRkxHX05FRURfU1RBVFVTOworCWNtZC51cGQwID0gSEFMX1JFT19DTURfVVBEMF9CQV9XSU5E T1dfU0laRTsKKwljbWQuYmFfd2luZG93X3NpemUgPSBiYV93aW5fc3o7CisKKwlpZiAodXBkYXRl X3NzbikgeworCQljbWQudXBkMCB8PSBIQUxfUkVPX0NNRF9VUEQwX1NTTjsKKwkJY21kLnVwZDIg PSB1MzJfZW5jb2RlX2JpdHMoc3NuLCBIQUxfUkVPX0NNRF9VUEQyX1NTTik7CisJfQorCisJcmV0 ID0gYXRoMTJrX2RwX3Jlb19jbWRfc2VuZChhci0+YWIsIHJ4X3RpZCwKKwkJCQkgICAgIEhBTF9S RU9fQ01EX1VQREFURV9SWF9RVUVVRSwgJmNtZCwKKwkJCQkgICAgIE5VTEwpOworCWlmIChyZXQp IHsKKwkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIHVwZGF0ZSByeCB0aWQgcXVldWUs IHRpZCAlZCAoJWQpXG4iLAorCQkJICAgIHJ4X3RpZC0+dGlkLCByZXQpOworCQlyZXR1cm4gcmV0 OworCX0KKworCXJ4X3RpZC0+YmFfd2luX3N6ID0gYmFfd2luX3N6OworCisJcmV0dXJuIDA7Cit9 CisKK2ludCBhdGgxMmtfZHBfcnhfcGVlcl90aWRfc2V0dXAoc3RydWN0IGF0aDEyayAqYXIsIGNv bnN0IHU4ICpwZWVyX21hYywgaW50IHZkZXZfaWQsCisJCQkJdTggdGlkLCB1MzIgYmFfd2luX3N6 LCB1MTYgc3NuLAorCQkJCWVudW0gaGFsX3BuX3R5cGUgcG5fdHlwZSkKK3sKKwlzdHJ1Y3QgYXRo MTJrX2Jhc2UgKmFiID0gYXItPmFiOworCXN0cnVjdCBhdGgxMmtfZHAgKmRwID0gJmFiLT5kcDsK KwlzdHJ1Y3QgaGFsX3J4X3Jlb19xdWV1ZSAqYWRkcl9hbGlnbmVkOworCXN0cnVjdCBhdGgxMmtf cGVlciAqcGVlcjsKKwlzdHJ1Y3QgYXRoMTJrX2RwX3J4X3RpZCAqcnhfdGlkOworCXUzMiBod19k ZXNjX3N6OworCXZvaWQgKnZhZGRyOworCWRtYV9hZGRyX3QgcGFkZHI7CisJaW50IHJldDsKKwor CXNwaW5fbG9ja19iaCgmYWItPmJhc2VfbG9jayk7CisKKwlwZWVyID0gYXRoMTJrX3BlZXJfZmlu ZChhYiwgdmRldl9pZCwgcGVlcl9tYWMpOworCWlmICghcGVlcikgeworCQlzcGluX3VubG9ja19i aCgmYWItPmJhc2VfbG9jayk7CisJCWF0aDEya193YXJuKGFiLCAiZmFpbGVkIHRvIGZpbmQgdGhl IHBlZXIgdG8gc2V0IHVwIHJ4IHRpZFxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWlm IChhYi0+aHdfcGFyYW1zLT5yZW9xX2x1dF9zdXBwb3J0ICYmICFkcC0+cmVvcV9sdXQudmFkZHIp IHsKKwkJc3Bpbl91bmxvY2tfYmgoJmFiLT5iYXNlX2xvY2spOworCQlhdGgxMmtfd2FybihhYiwg InJlbyBxcmVmIHRhYmxlIGlzIG5vdCBzZXR1cFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0K KworCWlmIChwZWVyLT5wZWVyX2lkID4gRFBfTUFYX1BFRVJfSUQgfHwgdGlkID4gSUVFRTgwMjEx X05VTV9USURTKSB7CisJCWF0aDEya193YXJuKGFiLCAicGVlciBpZCBvZiBwZWVyICVkIG9yIHRp ZCAlZCBkb2Vzbid0IGFsbG93IHJlb3Egc2V0dXBcbiIsCisJCQkgICAgcGVlci0+cGVlcl9pZCwg dGlkKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmFiLT5iYXNlX2xvY2spOworCQlyZXR1cm4gLUVJTlZB TDsKKwl9CisKKwlyeF90aWQgPSAmcGVlci0+cnhfdGlkW3RpZF07CisJLyogVXBkYXRlIHRoZSB0 aWQgcXVldWUgaWYgaXQgaXMgYWxyZWFkeSBzZXR1cCAqLworCWlmIChyeF90aWQtPmFjdGl2ZSkg eworCQlwYWRkciA9IHJ4X3RpZC0+cGFkZHI7CisJCXJldCA9IGF0aDEya19wZWVyX3J4X3RpZF9y ZW9fdXBkYXRlKGFyLCBwZWVyLCByeF90aWQsCisJCQkJCQkgICAgYmFfd2luX3N6LCBzc24sIHRy dWUpOworCQlzcGluX3VubG9ja19iaCgmYWItPmJhc2VfbG9jayk7CisJCWlmIChyZXQpIHsKKwkJ CWF0aDEya193YXJuKGFiLCAiZmFpbGVkIHRvIHVwZGF0ZSByZW8gZm9yIHJ4IHRpZCAlZFxuIiwg dGlkKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0KKworCXJ4X3Rp ZC0+dGlkID0gdGlkOworCisJcnhfdGlkLT5iYV93aW5fc3ogPSBiYV93aW5fc3o7CisKKwkvKiBU T0RPOiBPcHRpbWl6ZSB0aGUgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHFvcyB0aWQgYmFzZWQgb24K KwkgKiB0aGUgYWN0dWFsIEJBIHdpbmRvdyBzaXplIGluIFJFTyB0aWQgdXBkYXRlIHBhdGguCisJ ICovCisJaWYgKHRpZCA9PSBIQUxfREVTQ19SRU9fTk9OX1FPU19USUQpCisJCWh3X2Rlc2Nfc3og PSBhdGgxMmtfaGFsX3Jlb19xZGVzY19zaXplKGJhX3dpbl9zeiwgdGlkKTsKKwllbHNlCisJCWh3 X2Rlc2Nfc3ogPSBhdGgxMmtfaGFsX3Jlb19xZGVzY19zaXplKERQX0JBX1dJTl9TWl9NQVgsIHRp ZCk7CisKKwl2YWRkciA9IGt6YWxsb2MoaHdfZGVzY19zeiArIEhBTF9MSU5LX0RFU0NfQUxJR04g LSAxLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXZhZGRyKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZhYi0+ YmFzZV9sb2NrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYWRkcl9hbGlnbmVkID0gUFRS X0FMSUdOKHZhZGRyLCBIQUxfTElOS19ERVNDX0FMSUdOKTsKKworCWF0aDEya19oYWxfcmVvX3Fk ZXNjX3NldHVwKGFkZHJfYWxpZ25lZCwgdGlkLCBiYV93aW5fc3osCisJCQkJICAgc3NuLCBwbl90 eXBlKTsKKworCXBhZGRyID0gZG1hX21hcF9zaW5nbGUoYWItPmRldiwgYWRkcl9hbGlnbmVkLCBo d19kZXNjX3N6LAorCQkJICAgICAgIERNQV9CSURJUkVDVElPTkFMKTsKKworCXJldCA9IGRtYV9t YXBwaW5nX2Vycm9yKGFiLT5kZXYsIHBhZGRyKTsKKwlpZiAocmV0KSB7CisJCXNwaW5fdW5sb2Nr X2JoKCZhYi0+YmFzZV9sb2NrKTsKKwkJZ290byBlcnJfbWVtX2ZyZWU7CisJfQorCisJcnhfdGlk LT52YWRkciA9IHZhZGRyOworCXJ4X3RpZC0+cGFkZHIgPSBwYWRkcjsKKwlyeF90aWQtPnNpemUg PSBod19kZXNjX3N6OworCXJ4X3RpZC0+YWN0aXZlID0gdHJ1ZTsKKworCWlmIChhYi0+aHdfcGFy YW1zLT5yZW9xX2x1dF9zdXBwb3J0KSB7CisJCS8qIFVwZGF0ZSB0aGUgUkVPIHF1ZXVlIExVVCBh dCB0aGUgY29ycmVzcG9uZGluZyBwZWVyIGlkCisJCSAqIGFuZCB0aWQgd2l0aCBxYWRkci4KKwkJ ICovCisJCWF0aDEya19wZWVyX3J4X3RpZF9xcmVmX3NldHVwKGFiLCBwZWVyLT5wZWVyX2lkLCB0 aWQsIHBhZGRyKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmFiLT5iYXNlX2xvY2spOworCX0gZWxzZSB7 CisJCXNwaW5fdW5sb2NrX2JoKCZhYi0+YmFzZV9sb2NrKTsKKwkJcmV0ID0gYXRoMTJrX3dtaV9w ZWVyX3J4X3Jlb3JkZXJfcXVldWVfc2V0dXAoYXIsIHZkZXZfaWQsIHBlZXJfbWFjLAorCQkJCQkJ CSAgICAgcGFkZHIsIHRpZCwgMSwgYmFfd2luX3N6KTsKKwl9CisKKwlyZXR1cm4gcmV0OworCitl cnJfbWVtX2ZyZWU6CisJa2ZyZWUodmFkZHIpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGF0 aDEya19kcF9yeF9hbXBkdV9zdGFydChzdHJ1Y3QgYXRoMTJrICphciwKKwkJCSAgICAgc3RydWN0 IGllZWU4MDIxMV9hbXBkdV9wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgYXRoMTJrX2Jhc2Ug KmFiID0gYXItPmFiOworCXN0cnVjdCBhdGgxMmtfc3RhICphcnN0YSA9ICh2b2lkICopcGFyYW1z LT5zdGEtPmRydl9wcml2OworCWludCB2ZGV2X2lkID0gYXJzdGEtPmFydmlmLT52ZGV2X2lkOwor CWludCByZXQ7CisKKwlyZXQgPSBhdGgxMmtfZHBfcnhfcGVlcl90aWRfc2V0dXAoYXIsIHBhcmFt cy0+c3RhLT5hZGRyLCB2ZGV2X2lkLAorCQkJCQkgIHBhcmFtcy0+dGlkLCBwYXJhbXMtPmJ1Zl9z aXplLAorCQkJCQkgIHBhcmFtcy0+c3NuLCBhcnN0YS0+cG5fdHlwZSk7CisJaWYgKHJldCkKKwkJ YXRoMTJrX3dhcm4oYWIsICJmYWlsZWQgdG8gc2V0dXAgcnggdGlkICVkXG4iLCByZXQpOworCisJ cmV0dXJuIHJldDsKK30KKworaW50IGF0aDEya19kcF9yeF9hbXBkdV9zdG9wKHN0cnVjdCBhdGgx MmsgKmFyLAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfYW1wZHVfcGFyYW1zICpwYXJhbXMpCit7 CisJc3RydWN0IGF0aDEya19iYXNlICphYiA9IGFyLT5hYjsKKwlzdHJ1Y3QgYXRoMTJrX3BlZXIg KnBlZXI7CisJc3RydWN0IGF0aDEya19zdGEgKmFyc3RhID0gKHZvaWQgKilwYXJhbXMtPnN0YS0+ ZHJ2X3ByaXY7CisJaW50IHZkZXZfaWQgPSBhcnN0YS0+YXJ2aWYtPnZkZXZfaWQ7CisJYm9vbCBh Y3RpdmU7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19iaCgmYWItPmJhc2VfbG9jayk7CisKKwlw ZWVyID0gYXRoMTJrX3BlZXJfZmluZChhYiwgdmRldl9pZCwgcGFyYW1zLT5zdGEtPmFkZHIpOwor CWlmICghcGVlcikgeworCQlzcGluX3VubG9ja19iaCgmYWItPmJhc2VfbG9jayk7CisJCWF0aDEy a193YXJuKGFiLCAiZmFpbGVkIHRvIGZpbmQgdGhlIHBlZXIgdG8gc3RvcCByeCBhZ2dyZWdhdGlv blxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWFjdGl2ZSA9IHBlZXItPnJ4X3RpZFtw YXJhbXMtPnRpZF0uYWN0aXZlOworCisJaWYgKCFhY3RpdmUpIHsKKwkJc3Bpbl91bmxvY2tfYmgo JmFiLT5iYXNlX2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBhdGgxMmtfcGVlcl9y eF90aWRfcmVvX3VwZGF0ZShhciwgcGVlciwgcGVlci0+cnhfdGlkLCAxLCAwLCBmYWxzZSk7CisJ c3Bpbl91bmxvY2tfYmgoJmFiLT5iYXNlX2xvY2spOworCWlmIChyZXQpIHsKKwkJYXRoMTJrX3dh cm4oYWIsICJmYWlsZWQgdG8gdXBkYXRlIHJlbyBmb3IgcnggdGlkICVkOiAlZFxuIiwKKwkJCSAg ICBwYXJhbXMtPnRpZCwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcmV0Owor fQorCitpbnQgYXRoMTJrX2RwX3J4X3BlZXJfcG5fcmVwbGF5X2NvbmZpZyhzdHJ1Y3QgYXRoMTJr X3ZpZiAqYXJ2aWYsCisJCQkJICAgICAgIGNvbnN0IHU4ICpwZWVyX2FkZHIsCisJCQkJICAgICAg IGVudW0gc2V0X2tleV9jbWQga2V5X2NtZCwKKwkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9r ZXlfY29uZiAqa2V5KQoreworCXN0cnVjdCBhdGgxMmsgKmFyID0gYXJ2aWYtPmFyOworCXN0cnVj dCBhdGgxMmtfYmFzZSAqYWIgPSBhci0+YWI7CisJc3RydWN0IGF0aDEya19oYWxfcmVvX2NtZCBj bWQgPSB7MH07CisJc3RydWN0IGF0aDEya19wZWVyICpwZWVyOworCXN0cnVjdCBhdGgxMmtfZHBf cnhfdGlkICpyeF90aWQ7CisJdTggdGlkOworCWludCByZXQgPSAwOworCisJLyogTk9URTogRW5h YmxlIFBOL1RTQyByZXBsYXkgY2hlY2sgb2ZmbG9hZCBvbmx5IGZvciB1bmljYXN0IGZyYW1lcy4K KwkgKiBXZSB1c2UgbWFjODAyMTEgUE4vVFNDIHJlcGxheSBjaGVjayBmdW5jdGlvbmFsaXR5IGZv ciBiY2FzdC9tY2FzdAorCSAqIGZvciBub3cuCisJICovCisJaWYgKCEoa2V5LT5mbGFncyAmIElF RUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkpCisJCXJldHVybiAwOworCisJY21kLmZsYWcgPSBI QUxfUkVPX0NNRF9GTEdfTkVFRF9TVEFUVVM7CisJY21kLnVwZDAgPSBIQUxfUkVPX0NNRF9VUEQw X1BOIHwKKwkJICAgIEhBTF9SRU9fQ01EX1VQRDBfUE5fU0laRSB8CisJCSAgICBIQUxfUkVPX0NN RF9VUEQwX1BOX1ZBTElEIHwKKwkJICAgIEhBTF9SRU9fQ01EX1VQRDBfUE5fQ0hFQ0sgfAorCQkg ICAgSEFMX1JFT19DTURfVVBEMF9TVkxEOworCisJc3dpdGNoIChrZXktPmNpcGhlcikgeworCWNh c2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6 CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QXzI1NjoKKwljYXNlIFdMQU5fQ0lQSEVSX1NV SVRFX0dDTVA6CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9HQ01QXzI1NjoKKwkJaWYgKGtleV9j bWQgPT0gU0VUX0tFWSkgeworCQkJY21kLnVwZDEgfD0gSEFMX1JFT19DTURfVVBEMV9QTl9DSEVD SzsKKwkJCWNtZC5wbl9zaXplID0gNDg7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJl YWs7CisJfQorCisJc3Bpbl9sb2NrX2JoKCZhYi0+YmFzZV9sb2NrKTsKKworCXBlZXIgPSBhdGgx MmtfcGVlcl9maW5kKGFiLCBhcnZpZi0+dmRldl9pZCwgcGVlcl9hZGRyKTsKKwlpZiAoIXBlZXIp IHsKKwkJc3Bpbl91bmxvY2tfYmgoJmFiLT5iYXNlX2xvY2spOworCQlhdGgxMmtfd2FybihhYiwg ImZhaWxlZCB0byBmaW5kIHRoZSBwZWVyICVwTSB0byBjb25maWd1cmUgcG4gcmVwbGF5IGRldGVj dGlvblxuIiwKKwkJCSAgICBwZWVyX2FkZHIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlm b3IgKHRpZCA9IDA7IHRpZCA8PSBJRUVFODAyMTFfTlVNX1RJRFM7IHRpZCsrKSB7CisJCXJ4X3Rp ZCA9ICZwZWVyLT5yeF90aWRbdGlkXTsKKwkJaWYgKCFyeF90aWQtPmFjdGl2ZSkKKwkJCWNvbnRp bnVlOworCQljbWQuYWRkcl9sbyA9IGxvd2VyXzMyX2JpdHMocnhfdGlkLT5wYWRkcik7CisJCWNt ZC5hZGRyX2hpID0gdXBwZXJfMzJfYml0cyhyeF90aWQtPnBhZGRyKTsKKwkJcmV0ID0gYXRoMTJr X2RwX3Jlb19jbWRfc2VuZChhYiwgcnhfdGlkLAorCQkJCQkgICAgIEhBTF9SRU9fQ01EX1VQREFU RV9SWF9RVUVVRSwKKwkJCQkJICAgICAmY21kLCBOVUxMKTsKKwkJaWYgKHJldCkgeworCQkJYXRo MTJrX3dhcm4oYWIsICJmYWlsZWQgdG8gY29uZmlndXJlIHJ4IHRpZCAlZCBxdWV1ZSBvZiBwZWVy ICVwTSBmb3IgcG4gcmVwbGF5IGRldGVjdGlvbiAlZFxuIiwKKwkJCQkgICAgdGlkLCBwZWVyX2Fk ZHIsIHJldCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2JoKCZhYi0+YmFz ZV9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXRoMTJrX2dldF9wcGR1 X3VzZXJfaW5kZXgoc3RydWN0IGh0dF9wcGR1X3N0YXRzICpwcGR1X3N0YXRzLAorCQkJCSAgICAg IHUxNiBwZWVyX2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEhUVF9QUERVX1NU QVRTX01BWF9VU0VSUyAtIDE7IGkrKykgeworCQlpZiAocHBkdV9zdGF0cy0+dXNlcl9zdGF0c1tp XS5pc192YWxpZF9wZWVyX2lkKSB7CisJCQlpZiAocGVlcl9pZCA9PSBwcGR1X3N0YXRzLT51c2Vy X3N0YXRzW2ldLnBlZXJfaWQpCisJCQkJcmV0dXJuIGk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4g aTsKKwkJfQorCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGF0aDEya19o dHRfdGx2X3BwZHVfc3RhdHNfcGFyc2Uoc3RydWN0IGF0aDEya19iYXNlICphYiwKKwkJCQkJICAg dTE2IHRhZywgdTE2IGxlbiwgY29uc3Qgdm9pZCAqcHRyLAorCQkJCQkgICB2b2lkICpkYXRhKQor eworCWNvbnN0IHN0cnVjdCBodHRfcHBkdV9zdGF0c191c3JfY21wbHRuX2Fja19iYV9zdGF0dXMg KmJhX3N0YXR1czsKKwljb25zdCBzdHJ1Y3QgaHR0X3BwZHVfc3RhdHNfdXNyX2NtcGx0bl9jbW4g KmNtcGx0X2NtbjsKKwljb25zdCBzdHJ1Y3QgaHR0X3BwZHVfc3RhdHNfdXNlcl9yYXRlICp1c2Vy X3JhdGU7CisJc3RydWN0IGh0dF9wcGR1X3N0YXRzX2luZm8gKnBwZHVfaW5mbzsKKwlzdHJ1Y3Qg aHR0X3BwZHVfdXNlcl9zdGF0cyAqdXNlcl9zdGF0czsKKwlpbnQgY3VyX3VzZXI7CisJdTE2IHBl ZXJfaWQ7CisKKwlwcGR1X2luZm8gPSBkYXRhOworCisJc3dpdGNoICh0YWcpIHsKKwljYXNlIEhU VF9QUERVX1NUQVRTX1RBR19DT01NT046CisJCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IGh0dF9w cGR1X3N0YXRzX2NvbW1vbikpIHsKKwkJCWF0aDEya193YXJuKGFiLCAiSW52YWxpZCBsZW4gJWQg Zm9yIHRoZSB0YWcgMHgleFxuIiwKKwkJCQkgICAgbGVuLCB0YWcpOworCQkJcmV0dXJuIC1FSU5W QUw7CisJCX0KKwkJbWVtY3B5KCZwcGR1X2luZm8tPnBwZHVfc3RhdHMuY29tbW9uLCBwdHIsCisJ CSAgICAgICBzaXplb2Yoc3RydWN0IGh0dF9wcGR1X3N0YXRzX2NvbW1vbikpOworCQlicmVhazsK KwljYXNlIEhUVF9QUERVX1NUQVRTX1RBR19VU1JfUkFURToKKwkJaWYgKGxlbiA8IHNpemVvZihz dHJ1Y3QgaHR0X3BwZHVfc3RhdHNfdXNlcl9yYXRlKSkgeworCQkJYXRoMTJrX3dhcm4oYWIsICJJ bnZhbGlkIGxlbiAlZCBmb3IgdGhlIHRhZyAweCV4XG4iLAorCQkJCSAgICBsZW4sIHRhZyk7CisJ CQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQl1c2VyX3JhdGUgPSBwdHI7CisJCXBlZXJfaWQgPSBs ZTE2X3RvX2NwdSh1c2VyX3JhdGUtPnN3X3BlZXJfaWQpOworCQljdXJfdXNlciA9IGF0aDEya19n ZXRfcHBkdV91c2VyX2luZGV4KCZwcGR1X2luZm8tPnBwZHVfc3RhdHMsCisJCQkJCQkgICAgICBw ZWVyX2lkKTsKKwkJaWYgKGN1cl91c2VyIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQl1c2Vy X3N0YXRzID0gJnBwZHVfaW5mby0+cHBkdV9zdGF0cy51c2VyX3N0YXRzW2N1cl91c2VyXTsKKwkJ dXNlcl9zdGF0cy0+cGVlcl9pZCA9IHBlZXJfaWQ7CisJCXVzZXJfc3RhdHMtPmlzX3ZhbGlkX3Bl ZXJfaWQgPSB0cnVlOworCQltZW1jcHkoJnVzZXJfc3RhdHMtPnJhdGUsIHB0ciwKKwkJICAgICAg IHNpemVvZihzdHJ1Y3QgaHR0X3BwZHVfc3RhdHNfdXNlcl9yYXRlKSk7CisJCXVzZXJfc3RhdHMt PnRsdl9mbGFncyB8PSBCSVQodGFnKTsKKwkJYnJlYWs7CisJY2FzZSBIVFRfUFBEVV9TVEFUU19U QUdfVVNSX0NPTVBMVE5fQ09NTU9OOgorCQlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBodHRfcHBk dV9zdGF0c191c3JfY21wbHRuX2NtbikpIHsKKwkJCWF0aDEya193YXJuKGFiLCAiSW52YWxpZCBs ZW4gJWQgZm9yIHRoZSB0YWcgMHgleFxuIiwKKwkJCQkgICAgbGVuLCB0YWcpOworCQkJcmV0dXJu IC1FSU5WQUw7CisJCX0KKworCQljbXBsdF9jbW4gPSBwdHI7CisJCXBlZXJfaWQgPSBsZTE2X3Rv X2NwdShjbXBsdF9jbW4tPnN3X3BlZXJfaWQpOworCQljdXJfdXNlciA9IGF0aDEya19nZXRfcHBk dV91c2VyX2luZGV4KCZwcGR1X2luZm8tPnBwZHVfc3RhdHMsCisJCQkJCQkgICAgICBwZWVyX2lk KTsKKwkJaWYgKGN1cl91c2VyIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQl1c2VyX3N0YXRz ID0gJnBwZHVfaW5mby0+cHBkdV9zdGF0cy51c2VyX3N0YXRzW2N1cl91c2VyXTsKKwkJdXNlcl9z dGF0cy0+cGVlcl9pZCA9IHBlZXJfaWQ7CisJCXVzZXJfc3RhdHMtPmlzX3ZhbGlkX3BlZXJfaWQg PSB0cnVlOworCQltZW1jcHkoJnVzZXJfc3RhdHMtPmNtcGx0bl9jbW4sIHB0ciwKKwkJICAgICAg IHNpemVvZihzdHJ1Y3QgaHR0X3BwZHVfc3RhdHNfdXNyX2NtcGx0bl9jbW4pKTsKKwkJdXNlcl9z dGF0cy0+dGx2X2ZsYWdzIHw9IEJJVCh0YWcpOworCQlicmVhazsKKwljYXNlIEhUVF9QUERVX1NU QVRTX1RBR19VU1JfQ09NUExUTl9BQ0tfQkFfU1RBVFVTOgorCQlpZiAobGVuIDwKKwkJICAgIHNp emVvZihzdHJ1Y3QgaHR0X3BwZHVfc3RhdHNfdXNyX2NtcGx0bl9hY2tfYmFfc3RhdHVzKSkgewor CQkJYXRoMTJrX3dhcm4oYWIsICJJbnZhbGlkIGxlbiAlZCBmb3IgdGhlIHRhZyAweCV4XG4iLAor CQkJCSAgICBsZW4sIHRhZyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWJhX3N0YXR1 cyA9IHB0cjsKKwkJcGVlcl9pZCA9IGxlMTZfdG9fY3B1KGJhX3N0YXR1cy0+c3dfcGVlcl9pZCk7 CisJCWN1cl91c2VyID0gYXRoMTJrX2dldF9wcGR1X3VzZXJfaW5kZXgoJnBwZHVfaW5mby0+cHBk dV9zdGF0cywKKwkJCQkJCSAgICAgIHBlZXJfaWQpOworCQlpZiAoY3VyX3VzZXIgPCAwKQorCQkJ cmV0dXJuIC1FSU5WQUw7CisJCXVzZXJfc3RhdHMgPSAmcHBkdV9pbmZvLT5wcGR1X3N0YXRzLnVz ZXJfc3RhdHNbY3VyX3VzZXJdOworCQl1c2VyX3N0YXRzLT5wZWVyX2lkID0gcGVlcl9pZDsKKwkJ dXNlcl9zdGF0cy0+aXNfdmFsaWRfcGVlcl9pZCA9IHRydWU7CisJCW1lbWNweSgmdXNlcl9zdGF0 cy0+YWNrX2JhLCBwdHIsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGh0dF9wcGR1X3N0YXRzX3Vz cl9jbXBsdG5fYWNrX2JhX3N0YXR1cykpOworCQl1c2VyX3N0YXRzLT50bHZfZmxhZ3MgfD0gQklU KHRhZyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGgxMmtf ZHBfaHR0X3Rsdl9pdGVyKHN0cnVjdCBhdGgxMmtfYmFzZSAqYWIsIGNvbnN0IHZvaWQgKnB0ciwg c2l6ZV90IGxlbiwKKwkJCQkgIGludCAoKml0ZXIpKHN0cnVjdCBhdGgxMmtfYmFzZSAqYXIsIHUx NiB0YWcsIHUxNiBsZW4sCisJCQkJCSAgICAgIGNvbnN0IHZvaWQgKnB0ciwgdm9pZCAqZGF0YSks CisJCQkJICB2b2lkICpkYXRhKQoreworCWNvbnN0IHN0cnVjdCBodHRfdGx2ICp0bHY7CisJY29u c3Qgdm9pZCAqYmVnaW4gPSBwdHI7CisJdTE2IHRsdl90YWcsIHRsdl9sZW47CisJaW50IHJldCA9 IC1FSU5WQUw7CisKKwl3aGlsZSAobGVuID4gMCkgeworCQlpZiAobGVuIDwgc2l6ZW9mKCp0bHYp KSB7CisJCQlhdGgxMmtfZXJyKGFiLCAiaHR0IHRsdiBwYXJzZSBmYWlsdXJlIGF0IGJ5dGUgJXpk ICglenUgYnl0ZXMgbGVmdCwgJXp1IGV4cGVjdGVkKVxuIiwKKwkJCQkgICBwdHIgLSBiZWdpbiwg bGVuLCBzaXplb2YoKnRsdikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJdGx2ID0gKHN0 cnVjdCBodHRfdGx2ICopcHRyOworCQl0bHZfdGFnID0gbGUzMl9nZXRfYml0cyh0bHYtPmhlYWRl ciwgSFRUX1RMVl9UQUcpOworCQl0bHZfbGVuID0gbGUzMl9nZXRfYml0cyh0bHYtPmhlYWRlciwg SFRUX1RMVl9MRU4pOworCQlwdHIgKz0gc2l6ZW9mKCp0bHYpOworCQlsZW4gLT0gc2l6ZW9mKCp0 bHYpOworCisJCWlmICh0bHZfbGVuID4gbGVuKSB7CisJCQlhdGgxMmtfZXJyKGFiLCAiaHR0IHRs diBwYXJzZSBmYWlsdXJlIG9mIHRhZyAldSBhdCBieXRlICV6ZCAoJXp1IGJ5dGVzIGxlZnQsICV1 IGV4cGVjdGVkKVxuIiwKKwkJCQkgICB0bHZfdGFnLCBwdHIgLSBiZWdpbiwgbGVuLCB0bHZfbGVu KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldCA9IGl0ZXIoYWIsIHRsdl90YWcsIHRs dl9sZW4sIHB0ciwgZGF0YSk7CisJCWlmIChyZXQgPT0gLUVOT01FTSkKKwkJCXJldHVybiByZXQ7 CisKKwkJcHRyICs9IHRsdl9sZW47CisJCWxlbiAtPSB0bHZfbGVuOworCX0KKwlyZXR1cm4gMDsK K30KKworc3RhdGljIHZvaWQKK2F0aDEya191cGRhdGVfcGVyX3BlZXJfdHhfc3RhdHMoc3RydWN0 IGF0aDEyayAqYXIsCisJCQkJc3RydWN0IGh0dF9wcGR1X3N0YXRzICpwcGR1X3N0YXRzLCB1OCB1 c2VyKQoreworCXN0cnVjdCBhdGgxMmtfYmFzZSAqYWIgPSBhci0+YWI7CisJc3RydWN0IGF0aDEy a19wZWVyICpwZWVyOworCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7CisJc3RydWN0IGF0aDEy a19zdGEgKmFyc3RhOworCXN0cnVjdCBodHRfcHBkdV9zdGF0c191c2VyX3JhdGUgKnVzZXJfcmF0 ZTsKKwlzdHJ1Y3QgYXRoMTJrX3Blcl9wZWVyX3R4X3N0YXRzICpwZWVyX3N0YXRzID0gJmFyLT5w ZWVyX3R4X3N0YXRzOworCXN0cnVjdCBodHRfcHBkdV91c2VyX3N0YXRzICp1c3Jfc3RhdHMgPSAm cHBkdV9zdGF0cy0+dXNlcl9zdGF0c1t1c2VyXTsKKwlzdHJ1Y3QgaHR0X3BwZHVfc3RhdHNfY29t bW9uICpjb21tb24gPSAmcHBkdV9zdGF0cy0+Y29tbW9uOworCWludCByZXQ7CisJdTggZmxhZ3Ms IG1jcywgbnNzLCBidywgc2dpLCBkY20sIHJhdGVfaWR4ID0gMDsKKwl1MzIgdiwgc3VjY19ieXRl cyA9IDA7CisJdTE2IHRvbmVzLCByYXRlID0gMCwgc3VjY19wa3RzID0gMDsKKwl1MzIgdHhfZHVy YXRpb24gPSAwOworCXU4IHRpZCA9IEhUVF9QUERVX1NUQVRTX05PTl9RT1NfVElEOworCWJvb2wg aXNfYW1wZHUgPSBmYWxzZTsKKworCWlmICghdXNyX3N0YXRzKQorCQlyZXR1cm47CisKKwlpZiAo ISh1c3Jfc3RhdHMtPnRsdl9mbGFncyAmIEJJVChIVFRfUFBEVV9TVEFUU19UQUdfVVNSX1JBVEUp KSkKKwkJcmV0dXJuOworCisJaWYgKHVzcl9zdGF0cy0+dGx2X2ZsYWdzICYgQklUKEhUVF9QUERV X1NUQVRTX1RBR19VU1JfQ09NUExUTl9DT01NT04pKQorCQlpc19hbXBkdSA9CisJCQlIVFRfVVNS X0NNUExUTl9JU19BTVBEVSh1c3Jfc3RhdHMtPmNtcGx0bl9jbW4uZmxhZ3MpOworCisJaWYgKHVz cl9zdGF0cy0+dGx2X2ZsYWdzICYKKwkgICAgQklUKEhUVF9QUERVX1NUQVRTX1RBR19VU1JfQ09N UExUTl9BQ0tfQkFfU1RBVFVTKSkgeworCQlzdWNjX2J5dGVzID0gbGUzMl90b19jcHUodXNyX3N0 YXRzLT5hY2tfYmEuc3VjY2Vzc19ieXRlcyk7CisJCXN1Y2NfcGt0cyA9IGxlMzJfZ2V0X2JpdHMo dXNyX3N0YXRzLT5hY2tfYmEuaW5mbywKKwkJCQkJICBIVFRfUFBEVV9TVEFUU19BQ0tfQkFfSU5G T19OVU1fTVNEVV9NKTsKKwkJdGlkID0gbGUzMl9nZXRfYml0cyh1c3Jfc3RhdHMtPmFja19iYS5p bmZvLAorCQkJCSAgICBIVFRfUFBEVV9TVEFUU19BQ0tfQkFfSU5GT19USURfTlVNKTsKKwl9CisK KwlpZiAoY29tbW9uLT5mZXNfZHVyYXRpb25fdXMpCisJCXR4X2R1cmF0aW9uID0gbGUzMl90b19j cHUoY29tbW9uLT5mZXNfZHVyYXRpb25fdXMpOworCisJdXNlcl9yYXRlID0gJnVzcl9zdGF0cy0+ cmF0ZTsKKwlmbGFncyA9IEhUVF9VU1JfUkFURV9QUkVBTUJMRSh1c2VyX3JhdGUtPnJhdGVfZmxh Z3MpOworCWJ3ID0gSFRUX1VTUl9SQVRFX0JXKHVzZXJfcmF0ZS0+cmF0ZV9mbGFncykgLSAyOwor CW5zcyA9IEhUVF9VU1JfUkFURV9OU1ModXNlcl9yYXRlLT5yYXRlX2ZsYWdzKSArIDE7CisJbWNz ID0gSFRUX1VTUl9SQVRFX01DUyh1c2VyX3JhdGUtPnJhdGVfZmxhZ3MpOworCXNnaSA9IEhUVF9V U1JfUkFURV9HSSh1c2VyX3JhdGUtPnJhdGVfZmxhZ3MpOworCWRjbSA9IEhUVF9VU1JfUkFURV9E Q00odXNlcl9yYXRlLT5yYXRlX2ZsYWdzKTsKKworCS8qIE5vdGU6IElmIGhvc3QgY29uZmlndXJl ZCBmaXhlZCByYXRlcyBhbmQgaW4gc29tZSBvdGhlciBzcGVjaWFsCisJICogY2FzZXMsIHRoZSBi cm9hZGNhc3QvbWFuYWdlbWVudCBmcmFtZXMgYXJlIHNlbnQgaW4gZGlmZmVyZW50IHJhdGVzLgor CSAqIEZpcm13YXJlIHJhdGUncyBjb250cm9sIHRvIGJlIHNraXBwZWQgZm9yIHRoaXM/CisJICov CisKKwlpZiAoZmxhZ3MgPT0gV01JX1JBVEVfUFJFQU1CTEVfSEUgJiYgbWNzID4gMTEpIHsKKwkJ YXRoMTJrX3dhcm4oYWIsICJJbnZhbGlkIEhFIG1jcyAlZCBwZWVyIHN0YXRzIiwgIG1jcyk7CisJ CXJldHVybjsKKwl9CisKKwlpZiAoZmxhZ3MgPT0gV01JX1JBVEVfUFJFQU1CTEVfSEUgJiYgbWNz ID4gQVRIMTJLX0hFX01DU19NQVgpIHsKKwkJYXRoMTJrX3dhcm4oYWIsICJJbnZhbGlkIEhFIG1j cyAlZCBwZWVyIHN0YXRzIiwgIG1jcyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZmxhZ3MgPT0g V01JX1JBVEVfUFJFQU1CTEVfVkhUICYmIG1jcyA+IEFUSDEyS19WSFRfTUNTX01BWCkgeworCQlh dGgxMmtfd2FybihhYiwgIkludmFsaWQgVkhUIG1jcyAlZCBwZWVyIHN0YXRzIiwgIG1jcyk7CisJ CXJldHVybjsKKwl9CisKKwlpZiAoZmxhZ3MgPT0gV01JX1JBVEVfUFJFQU1CTEVfSFQgJiYgKG1j cyA+IEFUSDEyS19IVF9NQ1NfTUFYIHx8IG5zcyA8IDEpKSB7CisJCWF0aDEya193YXJuKGFiLCAi SW52YWxpZCBIVCBtY3MgJWQgbnNzICVkIHBlZXIgc3RhdHMiLAorCQkJICAgIG1jcywgbnNzKTsK KwkJcmV0dXJuOworCX0KKworCWlmIChmbGFncyA9PSBXTUlfUkFURV9QUkVBTUJMRV9DQ0sgfHwg ZmxhZ3MgPT0gV01JX1JBVEVfUFJFQU1CTEVfT0ZETSkgeworCQlyZXQgPSBhdGgxMmtfbWFjX2h3 X3JhdGVjb2RlX3RvX2xlZ2FjeV9yYXRlKG1jcywKKwkJCQkJCQkgICAgZmxhZ3MsCisJCQkJCQkJ ICAgICZyYXRlX2lkeCwKKwkJCQkJCQkgICAgJnJhdGUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJl dHVybjsKKwl9CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJc3Bpbl9sb2NrX2JoKCZhYi0+YmFzZV9s b2NrKTsKKwlwZWVyID0gYXRoMTJrX3BlZXJfZmluZF9ieV9pZChhYiwgdXNyX3N0YXRzLT5wZWVy X2lkKTsKKworCWlmICghcGVlciB8fCAhcGVlci0+c3RhKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZh Yi0+YmFzZV9sb2NrKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybjsKKwl9CisKKwlz dGEgPSBwZWVyLT5zdGE7CisJYXJzdGEgPSAoc3RydWN0IGF0aDEya19zdGEgKilzdGEtPmRydl9w cml2OworCisJbWVtc2V0KCZhcnN0YS0+dHhyYXRlLCAwLCBzaXplb2YoYXJzdGEtPnR4cmF0ZSkp OworCisJc3dpdGNoIChmbGFncykgeworCWNhc2UgV01JX1JBVEVfUFJFQU1CTEVfT0ZETToKKwkJ YXJzdGEtPnR4cmF0ZS5sZWdhY3kgPSByYXRlOworCQlicmVhazsKKwljYXNlIFdNSV9SQVRFX1BS RUFNQkxFX0NDSzoKKwkJYXJzdGEtPnR4cmF0ZS5sZWdhY3kgPSByYXRlOworCQlicmVhazsKKwlj YXNlIFdNSV9SQVRFX1BSRUFNQkxFX0hUOgorCQlhcnN0YS0+dHhyYXRlLm1jcyA9IG1jcyArIDgg KiAobnNzIC0gMSk7CisJCWFyc3RhLT50eHJhdGUuZmxhZ3MgPSBSQVRFX0lORk9fRkxBR1NfTUNT OworCQlpZiAoc2dpKQorCQkJYXJzdGEtPnR4cmF0ZS5mbGFncyB8PSBSQVRFX0lORk9fRkxBR1Nf U0hPUlRfR0k7CisJCWJyZWFrOworCWNhc2UgV01JX1JBVEVfUFJFQU1CTEVfVkhUOgorCQlhcnN0 YS0+dHhyYXRlLm1jcyA9IG1jczsKKwkJYXJzdGEtPnR4cmF0ZS5mbGFncyA9IFJBVEVfSU5GT19G TEFHU19WSFRfTUNTOworCQlpZiAoc2dpKQorCQkJYXJzdGEtPnR4cmF0ZS5mbGFncyB8PSBSQVRF X0lORk9fRkxBR1NfU0hPUlRfR0k7CisJCWJyZWFrOworCWNhc2UgV01JX1JBVEVfUFJFQU1CTEVf SEU6CisJCWFyc3RhLT50eHJhdGUubWNzID0gbWNzOworCQlhcnN0YS0+dHhyYXRlLmZsYWdzID0g UkFURV9JTkZPX0ZMQUdTX0hFX01DUzsKKwkJYXJzdGEtPnR4cmF0ZS5oZV9kY20gPSBkY207CisJ CWFyc3RhLT50eHJhdGUuaGVfZ2kgPSBhdGgxMmtfaGVfZ2lfdG9fbmw4MDIxMV9oZV9naShzZ2kp OworCQl0b25lcyA9IGxlMTZfdG9fY3B1KHVzZXJfcmF0ZS0+cnVfZW5kKSAtCisJCQlsZTE2X3Rv X2NwdSh1c2VyX3JhdGUtPnJ1X3N0YXJ0KSArIDE7CisJCXYgPSBhdGgxMmtfaGVfcnVfdG9uZXNf dG9fbmw4MDIxMV9oZV9ydV9hbGxvYyh0b25lcyk7CisJCWFyc3RhLT50eHJhdGUuaGVfcnVfYWxs b2MgPSB2OworCQlicmVhazsKKwl9CisKKwlhcnN0YS0+dHhyYXRlLm5zcyA9IG5zczsKKwlhcnN0 YS0+dHhyYXRlLmJ3ID0gYXRoMTJrX21hY19id190b19tYWM4MDIxMV9idyhidyk7CisJYXJzdGEt PnR4X2R1cmF0aW9uICs9IHR4X2R1cmF0aW9uOworCW1lbWNweSgmYXJzdGEtPmxhc3RfdHhyYXRl LCAmYXJzdGEtPnR4cmF0ZSwgc2l6ZW9mKHN0cnVjdCByYXRlX2luZm8pKTsKKworCS8qIFBQRFUg c3RhdHMgcmVwb3J0ZWQgZm9yIG1nbXQgcGFja2V0IGRvZXNuJ3QgaGF2ZSB2YWxpZCB0eCBieXRl cy4KKwkgKiBTbyBza2lwIHBlZXIgc3RhdHMgdXBkYXRlIGZvciBtZ210IHBhY2tldHMuCisJICov CisJaWYgKHRpZCA8IEhUVF9QUERVX1NUQVRTX05PTl9RT1NfVElEKSB7CisJCW1lbXNldChwZWVy X3N0YXRzLCAwLCBzaXplb2YoKnBlZXJfc3RhdHMpKTsKKwkJcGVlcl9zdGF0cy0+c3VjY19wa3Rz ID0gc3VjY19wa3RzOworCQlwZWVyX3N0YXRzLT5zdWNjX2J5dGVzID0gc3VjY19ieXRlczsKKwkJ cGVlcl9zdGF0cy0+aXNfYW1wZHUgPSBpc19hbXBkdTsKKwkJcGVlcl9zdGF0cy0+ZHVyYXRpb24g PSB0eF9kdXJhdGlvbjsKKwkJcGVlcl9zdGF0cy0+YmFfZmFpbHMgPQorCQkJSFRUX1VTUl9DTVBM VE5fTE9OR19SRVRSWSh1c3Jfc3RhdHMtPmNtcGx0bl9jbW4uZmxhZ3MpICsKKwkJCUhUVF9VU1Jf Q01QTFROX1NIT1JUX1JFVFJZKHVzcl9zdGF0cy0+Y21wbHRuX2Ntbi5mbGFncyk7CisJfQorCisJ c3Bpbl91bmxvY2tfYmgoJmFiLT5iYXNlX2xvY2spOworCXJjdV9yZWFkX3VubG9jaygpOworfQor CitzdGF0aWMgdm9pZCBhdGgxMmtfaHR0X3VwZGF0ZV9wcGR1X3N0YXRzKHN0cnVjdCBhdGgxMmsg KmFyLAorCQkJCQkgc3RydWN0IGh0dF9wcGR1X3N0YXRzICpwcGR1X3N0YXRzKQoreworCXU4IHVz ZXI7CisKKwlmb3IgKHVzZXIgPSAwOyB1c2VyIDwgSFRUX1BQRFVfU1RBVFNfTUFYX1VTRVJTIC0g MTsgdXNlcisrKQorCQlhdGgxMmtfdXBkYXRlX3Blcl9wZWVyX3R4X3N0YXRzKGFyLCBwcGR1X3N0 YXRzLCB1c2VyKTsKK30KKworc3RhdGljCitzdHJ1Y3QgaHR0X3BwZHVfc3RhdHNfaW5mbyAqYXRo MTJrX2RwX2h0dF9nZXRfcHBkdV9kZXNjKHN0cnVjdCBhdGgxMmsgKmFyLAorCQkJCQkJCXUzMiBw cGR1X2lkKQoreworCXN0cnVjdCBodHRfcHBkdV9zdGF0c19pbmZvICpwcGR1X2luZm87CisKKwls b2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+ZGF0YV9sb2NrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmFy LT5wcGR1X3N0YXRzX2luZm8pKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocHBkdV9pbmZvLCAm YXItPnBwZHVfc3RhdHNfaW5mbywgbGlzdCkgeworCQkJaWYgKHBwZHVfaW5mby0+cHBkdV9pZCA9 PSBwcGR1X2lkKQorCQkJCXJldHVybiBwcGR1X2luZm87CisJCX0KKworCQlpZiAoYXItPnBwZHVf c3RhdF9saXN0X2RlcHRoID4gSFRUX1BQRFVfREVTQ19NQVhfREVQVEgpIHsKKwkJCXBwZHVfaW5m byA9IGxpc3RfZmlyc3RfZW50cnkoJmFyLT5wcGR1X3N0YXRzX2luZm8sCisJCQkJCQkgICAgIHR5 cGVvZigqcHBkdV9pbmZvKSwgbGlzdCk7CisJCQlsaXN0X2RlbCgmcHBkdV9pbmZvLT5saXN0KTsK KwkJCWFyLT5wcGR1X3N0YXRfbGlzdF9kZXB0aC0tOworCQkJYXRoMTJrX2h0dF91cGRhdGVfcHBk dV9zdGF0cyhhciwgJnBwZHVfaW5mby0+cHBkdV9zdGF0cyk7CisJCQlrZnJlZShwcGR1X2luZm8p OworCQl9CisJfQorCisJcHBkdV9pbmZvID0ga3phbGxvYyhzaXplb2YoKnBwZHVfaW5mbyksIEdG UF9BVE9NSUMpOworCWlmICghcHBkdV9pbmZvKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfYWRk X3RhaWwoJnBwZHVfaW5mby0+bGlzdCwgJmFyLT5wcGR1X3N0YXRzX2luZm8pOworCWFyLT5wcGR1 X3N0YXRfbGlzdF9kZXB0aCsrOworCisJcmV0dXJuIHBwZHVfaW5mbzsKK30KKworc3RhdGljIHZv aWQgYXRoMTJrX2NvcHlfdG9fZGVsYXlfc3RhdHMoc3RydWN0IGF0aDEya19wZWVyICpwZWVyLAor CQkJCSAgICAgICBzdHJ1Y3QgaHR0X3BwZHVfdXNlcl9zdGF0cyAqdXNyX3N0YXRzKQoreworCXBl ZXItPnBwZHVfc3RhdHNfZGVsYXliYS5zd19wZWVyX2lkID0gbGUxNl90b19jcHUodXNyX3N0YXRz LT5yYXRlLnN3X3BlZXJfaWQpOworCXBlZXItPnBwZHVfc3RhdHNfZGVsYXliYS5pbmZvMCA9IGxl MzJfdG9fY3B1KHVzcl9zdGF0cy0+cmF0ZS5pbmZvMCk7CisJcGVlci0+cHBkdV9zdGF0c19kZWxh eWJhLnJ1X2VuZCA9IGxlMTZfdG9fY3B1KHVzcl9zdGF0cy0+cmF0ZS5ydV9lbmQpOworCXBlZXIt PnBwZHVfc3RhdHNfZGVsYXliYS5ydV9zdGFydCA9IGxlMTZfdG9fY3B1KHVzcl9zdGF0cy0+cmF0 ZS5ydV9zdGFydCk7CisJcGVlci0+cHBkdV9zdGF0c19kZWxheWJhLmluZm8xID0gbGUzMl90b19j cHUodXNyX3N0YXRzLT5yYXRlLmluZm8xKTsKKwlwZWVyLT5wcGR1X3N0YXRzX2RlbGF5YmEucmF0 ZV9mbGFncyA9IGxlMzJfdG9fY3B1KHVzcl9zdGF0cy0+cmF0ZS5yYXRlX2ZsYWdzKTsKKwlwZWVy LT5wcGR1X3N0YXRzX2RlbGF5YmEucmVzcF9yYXRlX2ZsYWdzID0KKwkJbGUzMl90b19jcHUodXNy X3N0YXRzLT5yYXRlLnJlc3BfcmF0ZV9mbGFncyk7CisKKwlwZWVyLT5kZWxheWJhX2ZsYWcgPSB0 cnVlOworfQorCitzdGF0aWMgdm9pZCBhdGgxMmtfY29weV90b19iYXIoc3RydWN0IGF0aDEya19w ZWVyICpwZWVyLAorCQkJICAgICAgIHN0cnVjdCBodHRfcHBkdV91c2VyX3N0YXRzICp1c3Jfc3Rh dHMpCit7CisJdXNyX3N0YXRzLT5yYXRlLnN3X3BlZXJfaWQgPSBjcHVfdG9fbGUxNihwZWVyLT5w cGR1X3N0YXRzX2RlbGF5YmEuc3dfcGVlcl9pZCk7CisJdXNyX3N0YXRzLT5yYXRlLmluZm8wID0g Y3B1X3RvX2xlMzIocGVlci0+cHBkdV9zdGF0c19kZWxheWJhLmluZm8wKTsKKwl1c3Jfc3RhdHMt PnJhdGUucnVfZW5kID0gY3B1X3RvX2xlMTYocGVlci0+cHBkdV9zdGF0c19kZWxheWJhLnJ1X2Vu ZCk7CisJdXNyX3N0YXRzLT5yYXRlLnJ1X3N0YXJ0ID0gY3B1X3RvX2xlMTYocGVlci0+cHBkdV9z dGF0c19kZWxheWJhLnJ1X3N0YXJ0KTsKKwl1c3Jfc3RhdHMtPnJhdGUuaW5mbzEgPSBjcHVfdG9f bGUzMihwZWVyLT5wcGR1X3N0YXRzX2RlbGF5YmEuaW5mbzEpOworCXVzcl9zdGF0cy0+cmF0ZS5y YXRlX2ZsYWdzID0gY3B1X3RvX2xlMzIocGVlci0+cHBkdV9zdGF0c19kZWxheWJhLnJhdGVfZmxh Z3MpOworCXVzcl9zdGF0cy0+cmF0ZS5yZXNwX3JhdGVfZmxhZ3MgPQorCQljcHVfdG9fbGUzMihw ZWVyLT5wcGR1X3N0YXRzX2RlbGF5YmEucmVzcF9yYXRlX2ZsYWdzKTsKKworCXBlZXItPmRlbGF5 YmFfZmxhZyA9IGZhbHNlOworfQorCitzdGF0aWMgaW50IGF0aDEya19odHRfcHVsbF9wcGR1X3N0 YXRzKHN0cnVjdCBhdGgxMmtfYmFzZSAqYWIsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNr YikKK3sKKwlzdHJ1Y3QgYXRoMTJrX2h0dF9wcGR1X3N0YXRzX21zZyAqbXNnOworCXN0cnVjdCBo dHRfcHBkdV9zdGF0c19pbmZvICpwcGR1X2luZm87CisJc3RydWN0IGF0aDEya19wZWVyICpwZWVy ID0gTlVMTDsKKwlzdHJ1Y3QgaHR0X3BwZHVfdXNlcl9zdGF0cyAqdXNyX3N0YXRzID0gTlVMTDsK Kwl1MzIgcGVlcl9pZCA9IDA7CisJc3RydWN0IGF0aDEyayAqYXI7CisJaW50IHJldCwgaTsKKwl1 OCBwZGV2X2lkOworCXUzMiBwcGR1X2lkLCBsZW47CisKKwltc2cgPSAoc3RydWN0IGF0aDEya19o dHRfcHBkdV9zdGF0c19tc2cgKilza2ItPmRhdGE7CisJbGVuID0gbGUzMl9nZXRfYml0cyhtc2ct PmluZm8sIEhUVF9UMkhfUFBEVV9TVEFUU19JTkZPX1BBWUxPQURfU0laRSk7CisJcGRldl9pZCA9 IGxlMzJfZ2V0X2JpdHMobXNnLT5pbmZvLCBIVFRfVDJIX1BQRFVfU1RBVFNfSU5GT19QREVWX0lE KTsKKwlwcGR1X2lkID0gbGUzMl90b19jcHUobXNnLT5wcGR1X2lkKTsKKworCXJjdV9yZWFkX2xv Y2soKTsKKwlhciA9IGF0aDEya19tYWNfZ2V0X2FyX2J5X3BkZXZfaWQoYWIsIHBkZXZfaWQpOwor CWlmICghYXIpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCXNwaW5f bG9ja19iaCgmYXItPmRhdGFfbG9jayk7CisJcHBkdV9pbmZvID0gYXRoMTJrX2RwX2h0dF9nZXRf cHBkdV9kZXNjKGFyLCBwcGR1X2lkKTsKKwlpZiAoIXBwZHVfaW5mbykgeworCQlzcGluX3VubG9j a19iaCgmYXItPmRhdGFfbG9jayk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9 CisKKwlwcGR1X2luZm8tPnBwZHVfaWQgPSBwcGR1X2lkOworCXJldCA9IGF0aDEya19kcF9odHRf dGx2X2l0ZXIoYWIsIG1zZy0+ZGF0YSwgbGVuLAorCQkJCSAgICAgYXRoMTJrX2h0dF90bHZfcHBk dV9zdGF0c19wYXJzZSwKKwkJCQkgICAgICh2b2lkICopcHBkdV9pbmZvKTsKKwlpZiAocmV0KSB7 CisJCXNwaW5fdW5sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKKwkJYXRoMTJrX3dhcm4oYWIsICJG YWlsZWQgdG8gcGFyc2UgdGx2ICVkXG4iLCByZXQpOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyog YmFjayB1cCBkYXRhIHJhdGUgdGx2IGZvciBhbGwgcGVlcnMgKi8KKwlpZiAocHBkdV9pbmZvLT5m cmFtZV90eXBlID09IEhUVF9TVEFUU19QUERVX0ZUWVBFX0RBVEEgJiYKKwkgICAgKHBwZHVfaW5m by0+dGx2X2JpdG1hcCAmICgxIDw8IEhUVF9QUERVX1NUQVRTX1RBR19VU1JfQ09NTU9OKSkgJiYK KwkgICAgcHBkdV9pbmZvLT5kZWxheV9iYSkgeworCQlmb3IgKGkgPSAwOyBpIDwgcHBkdV9pbmZv LT5wcGR1X3N0YXRzLmNvbW1vbi5udW1fdXNlcnM7IGkrKykgeworCQkJcGVlcl9pZCA9IHBwZHVf aW5mby0+cHBkdV9zdGF0cy51c2VyX3N0YXRzW2ldLnBlZXJfaWQ7CisJCQlzcGluX2xvY2tfYmgo JmFiLT5iYXNlX2xvY2spOworCQkJcGVlciA9IGF0aDEya19wZWVyX2ZpbmRfYnlfaWQoYWIsIHBl ZXJfaWQpOworCQkJaWYgKCFwZWVyKSB7CisJCQkJc3Bpbl91bmxvY2tfYmgoJmFiLT5iYXNlX2xv Y2spOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQl1c3Jfc3RhdHMgPSAmcHBkdV9pbmZvLT5w cGR1X3N0YXRzLnVzZXJfc3RhdHNbaV07CisJCQlpZiAodXNyX3N0YXRzLT5kZWxheV9iYSkKKwkJ CQlhdGgxMmtfY29weV90b19kZWxheV9zdGF0cyhwZWVyLCB1c3Jfc3RhdHMpOworCQkJc3Bpbl91 bmxvY2tfYmgoJmFiLT5iYXNlX2xvY2spOworCQl9CisJfQorCisJLyogcmVzdG9yZSBhbGwgcGVl cnMnIGRhdGEgcmF0ZSB0bHYgdG8gbXUtYmFyIHRsdiAqLworCWlmIChwcGR1X2luZm8tPmZyYW1l X3R5cGUgPT0gSFRUX1NUQVRTX1BQRFVfRlRZUEVfQkFSICYmCisJICAgIChwcGR1X2luZm8tPnRs dl9iaXRtYXAgJiAoMSA8PCBIVFRfUFBEVV9TVEFUU19UQUdfVVNSX0NPTU1PTikpKSB7CisJCWZv ciAoaSA9IDA7IGkgPCBwcGR1X2luZm8tPmJhcl9udW1fdXNlcnM7IGkrKykgeworCQkJcGVlcl9p ZCA9IHBwZHVfaW5mby0+cHBkdV9zdGF0cy51c2VyX3N0YXRzW2ldLnBlZXJfaWQ7CisJCQlzcGlu X2xvY2tfYmgoJmFiLT5iYXNlX2xvY2spOworCQkJcGVlciA9IGF0aDEya19wZWVyX2ZpbmRfYnlf aWQoYWIsIHBlZXJfaWQpOworCQkJaWYgKCFwZWVyKSB7CisJCQkJc3Bpbl91bmxvY2tfYmgoJmFi LT5iYXNlX2xvY2spOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQl1c3Jfc3RhdHMgPSAmcHBk dV9pbmZvLT5wcGR1X3N0YXRzLnVzZXJfc3RhdHNbaV07CisJCQlpZiAocGVlci0+ZGVsYXliYV9m bGFnKQorCQkJCWF0aDEya19jb3B5X3RvX2JhcihwZWVyLCB1c3Jfc3RhdHMpOworCQkJc3Bpbl91 bmxvY2tfYmgoJmFiLT5iYXNlX2xvY2spOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfYmgoJmFy LT5kYXRhX2xvY2spOworCitleGl0OgorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIHJl dDsKK30KKworc3RhdGljIHZvaWQgYXRoMTJrX2h0dF9tbG9fb2Zmc2V0X2V2ZW50X2hhbmRsZXIo c3RydWN0IGF0aDEya19iYXNlICphYiwKKwkJCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJ c3RydWN0IGF0aDEya19odHRfbWxvX29mZnNldF9tc2cgKm1zZzsKKwlzdHJ1Y3QgYXRoMTJrX3Bk ZXYgKnBkZXY7CisJc3RydWN0IGF0aDEyayAqYXI7CisJdTggcGRldl9pZDsKKworCW1zZyA9IChz dHJ1Y3QgYXRoMTJrX2h0dF9tbG9fb2Zmc2V0X21zZyAqKXNrYi0+ZGF0YTsKKwlwZGV2X2lkID0g dTMyX2dldF9iaXRzKF9fbGUzMl90b19jcHUobXNnLT5pbmZvKSwKKwkJCSAgICAgICBIVFRfVDJI X01MT19PRkZTRVRfSU5GT19QREVWX0lEKTsKKwlhciA9IGF0aDEya19tYWNfZ2V0X2FyX2J5X3Bk ZXZfaWQoYWIsIHBkZXZfaWQpOworCisJaWYgKCFhcikgeworCQlhdGgxMmtfd2FybihhYiwgImlu dmFsaWQgcGRldiBpZCAlZCBvbiBodHQgbWxvIG9mZnNldFxuIiwgcGRldl9pZCk7CisJCXJldHVy bjsKKwl9CisKKwlzcGluX2xvY2tfYmgoJmFyLT5kYXRhX2xvY2spOworCXBkZXYgPSBhci0+cGRl djsKKworCXBkZXYtPnRpbWVzdGFtcC5pbmZvID0gX19sZTMyX3RvX2NwdShtc2ctPmluZm8pOwor CXBkZXYtPnRpbWVzdGFtcC5zeW5jX3RpbWVzdGFtcF9sb191cyA9IF9fbGUzMl90b19jcHUobXNn LT5zeW5jX3RpbWVzdGFtcF9sb191cyk7CisJcGRldi0+dGltZXN0YW1wLnN5bmNfdGltZXN0YW1w X2hpX3VzID0gX19sZTMyX3RvX2NwdShtc2ctPnN5bmNfdGltZXN0YW1wX2hpX3VzKTsKKwlwZGV2 LT50aW1lc3RhbXAubWxvX29mZnNldF9sbyA9IF9fbGUzMl90b19jcHUobXNnLT5tbG9fb2Zmc2V0 X2xvKTsKKwlwZGV2LT50aW1lc3RhbXAubWxvX29mZnNldF9oaSA9IF9fbGUzMl90b19jcHUobXNn LT5tbG9fb2Zmc2V0X2hpKTsKKwlwZGV2LT50aW1lc3RhbXAubWxvX29mZnNldF9jbGtzID0gX19s ZTMyX3RvX2NwdShtc2ctPm1sb19vZmZzZXRfY2xrcyk7CisJcGRldi0+dGltZXN0YW1wLm1sb19j b21wX2Nsa3MgPSBfX2xlMzJfdG9fY3B1KG1zZy0+bWxvX2NvbXBfY2xrcyk7CisJcGRldi0+dGlt ZXN0YW1wLm1sb19jb21wX3RpbWVyID0gX19sZTMyX3RvX2NwdShtc2ctPm1sb19jb21wX3RpbWVy KTsKKworCXNwaW5fdW5sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKK30KKwordm9pZCBhdGgxMmtf ZHBfaHR0X2h0Y190MmhfbXNnX2hhbmRsZXIoc3RydWN0IGF0aDEya19iYXNlICphYiwKKwkJCQkg ICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgYXRoMTJrX2RwICpkcCA9ICZh Yi0+ZHA7CisJc3RydWN0IGh0dF9yZXNwX21zZyAqcmVzcCA9IChzdHJ1Y3QgaHR0X3Jlc3BfbXNn ICopc2tiLT5kYXRhOworCWVudW0gaHR0X3QyaF9tc2dfdHlwZSB0eXBlOworCXUxNiBwZWVyX2lk OworCXU4IHZkZXZfaWQ7CisJdTggbWFjX2FkZHJbRVRIX0FMRU5dOworCXUxNiBwZWVyX21hY19o MTY7CisJdTE2IGFzdF9oYXNoID0gMDsKKwl1MTYgaHdfcGVlcl9pZDsKKworCXR5cGUgPSBsZTMy X2dldF9iaXRzKHJlc3AtPnZlcnNpb25fbXNnLnZlcnNpb24sIEhUVF9UMkhfTVNHX1RZUEUpOwor CisJYXRoMTJrX2RiZyhhYiwgQVRIMTJLX0RCR19EUF9IVFQsICJkcF9odHQgcnggbXNnIHR5cGUg OjB4JTB4XG4iLCB0eXBlKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSFRUX1QySF9NU0df VFlQRV9WRVJTSU9OX0NPTkY6CisJCWRwLT5odHRfdGd0X3Zlcl9tYWpvciA9IGxlMzJfZ2V0X2Jp dHMocmVzcC0+dmVyc2lvbl9tc2cudmVyc2lvbiwKKwkJCQkJCSAgICAgIEhUVF9UMkhfVkVSU0lP Tl9DT05GX01BSk9SKTsKKwkJZHAtPmh0dF90Z3RfdmVyX21pbm9yID0gbGUzMl9nZXRfYml0cyhy ZXNwLT52ZXJzaW9uX21zZy52ZXJzaW9uLAorCQkJCQkJICAgICAgSFRUX1QySF9WRVJTSU9OX0NP TkZfTUlOT1IpOworCQljb21wbGV0ZSgmZHAtPmh0dF90Z3RfdmVyc2lvbl9yZWNlaXZlZCk7CisJ CWJyZWFrOworCS8qIFRPRE86IHJlbW92ZSB1bnVzZWQgcGVlciBtYXAgdmVyc2lvbnMgYWZ0ZXIg dGVzdGluZyAqLworCWNhc2UgSFRUX1QySF9NU0dfVFlQRV9QRUVSX01BUDoKKwkJdmRldl9pZCA9 IGxlMzJfZ2V0X2JpdHMocmVzcC0+cGVlcl9tYXBfZXYuaW5mbywKKwkJCQkJSFRUX1QySF9QRUVS X01BUF9JTkZPX1ZERVZfSUQpOworCQlwZWVyX2lkID0gbGUzMl9nZXRfYml0cyhyZXNwLT5wZWVy X21hcF9ldi5pbmZvLAorCQkJCQlIVFRfVDJIX1BFRVJfTUFQX0lORk9fUEVFUl9JRCk7CisJCXBl ZXJfbWFjX2gxNiA9IGxlMzJfZ2V0X2JpdHMocmVzcC0+cGVlcl9tYXBfZXYuaW5mbzEsCisJCQkJ CSAgICAgSFRUX1QySF9QRUVSX01BUF9JTkZPMV9NQUNfQUREUl9IMTYpOworCQlhdGgxMmtfZHBf Z2V0X21hY19hZGRyKGxlMzJfdG9fY3B1KHJlc3AtPnBlZXJfbWFwX2V2Lm1hY19hZGRyX2wzMiks CisJCQkJICAgICAgIHBlZXJfbWFjX2gxNiwgbWFjX2FkZHIpOworCQlhdGgxMmtfcGVlcl9tYXBf ZXZlbnQoYWIsIHZkZXZfaWQsIHBlZXJfaWQsIG1hY19hZGRyLCAwLCAwKTsKKwkJYnJlYWs7CisJ Y2FzZSBIVFRfVDJIX01TR19UWVBFX1BFRVJfTUFQMjoKKwkJdmRldl9pZCA9IGxlMzJfZ2V0X2Jp dHMocmVzcC0+cGVlcl9tYXBfZXYuaW5mbywKKwkJCQkJSFRUX1QySF9QRUVSX01BUF9JTkZPX1ZE RVZfSUQpOworCQlwZWVyX2lkID0gbGUzMl9nZXRfYml0cyhyZXNwLT5wZWVyX21hcF9ldi5pbmZv LAorCQkJCQlIVFRfVDJIX1BFRVJfTUFQX0lORk9fUEVFUl9JRCk7CisJCXBlZXJfbWFjX2gxNiA9 IGxlMzJfZ2V0X2JpdHMocmVzcC0+cGVlcl9tYXBfZXYuaW5mbzEsCisJCQkJCSAgICAgSFRUX1Qy SF9QRUVSX01BUF9JTkZPMV9NQUNfQUREUl9IMTYpOworCQlhdGgxMmtfZHBfZ2V0X21hY19hZGRy KGxlMzJfdG9fY3B1KHJlc3AtPnBlZXJfbWFwX2V2Lm1hY19hZGRyX2wzMiksCisJCQkJICAgICAg IHBlZXJfbWFjX2gxNiwgbWFjX2FkZHIpOworCQlhc3RfaGFzaCA9IGxlMzJfZ2V0X2JpdHMocmVz cC0+cGVlcl9tYXBfZXYuaW5mbzIsCisJCQkJCSBIVFRfVDJIX1BFRVJfTUFQX0lORk8yX0FTVF9I QVNIX1ZBTCk7CisJCWh3X3BlZXJfaWQgPSBsZTMyX2dldF9iaXRzKHJlc3AtPnBlZXJfbWFwX2V2 LmluZm8xLAorCQkJCQkgICBIVFRfVDJIX1BFRVJfTUFQX0lORk8xX0hXX1BFRVJfSUQpOworCQlh dGgxMmtfcGVlcl9tYXBfZXZlbnQoYWIsIHZkZXZfaWQsIHBlZXJfaWQsIG1hY19hZGRyLCBhc3Rf aGFzaCwKKwkJCQkgICAgICBod19wZWVyX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBIVFRfVDJIX01T R19UWVBFX1BFRVJfTUFQMzoKKwkJdmRldl9pZCA9IGxlMzJfZ2V0X2JpdHMocmVzcC0+cGVlcl9t YXBfZXYuaW5mbywKKwkJCQkJSFRUX1QySF9QRUVSX01BUF9JTkZPX1ZERVZfSUQpOworCQlwZWVy X2lkID0gbGUzMl9nZXRfYml0cyhyZXNwLT5wZWVyX21hcF9ldi5pbmZvLAorCQkJCQlIVFRfVDJI X1BFRVJfTUFQX0lORk9fUEVFUl9JRCk7CisJCXBlZXJfbWFjX2gxNiA9IGxlMzJfZ2V0X2JpdHMo cmVzcC0+cGVlcl9tYXBfZXYuaW5mbzEsCisJCQkJCSAgICAgSFRUX1QySF9QRUVSX01BUF9JTkZP MV9NQUNfQUREUl9IMTYpOworCQlhdGgxMmtfZHBfZ2V0X21hY19hZGRyKGxlMzJfdG9fY3B1KHJl c3AtPnBlZXJfbWFwX2V2Lm1hY19hZGRyX2wzMiksCisJCQkJICAgICAgIHBlZXJfbWFjX2gxNiwg bWFjX2FkZHIpOworCQlhdGgxMmtfcGVlcl9tYXBfZXZlbnQoYWIsIHZkZXZfaWQsIHBlZXJfaWQs IG1hY19hZGRyLCBhc3RfaGFzaCwKKwkJCQkgICAgICBwZWVyX2lkKTsKKwkJYnJlYWs7CisJY2Fz ZSBIVFRfVDJIX01TR19UWVBFX1BFRVJfVU5NQVA6CisJY2FzZSBIVFRfVDJIX01TR19UWVBFX1BF RVJfVU5NQVAyOgorCQlwZWVyX2lkID0gbGUzMl9nZXRfYml0cyhyZXNwLT5wZWVyX3VubWFwX2V2 LmluZm8sCisJCQkJCUhUVF9UMkhfUEVFUl9VTk1BUF9JTkZPX1BFRVJfSUQpOworCQlhdGgxMmtf cGVlcl91bm1hcF9ldmVudChhYiwgcGVlcl9pZCk7CisJCWJyZWFrOworCWNhc2UgSFRUX1QySF9N U0dfVFlQRV9QUERVX1NUQVRTX0lORDoKKwkJYXRoMTJrX2h0dF9wdWxsX3BwZHVfc3RhdHMoYWIs IHNrYik7CisJCWJyZWFrOworCWNhc2UgSFRUX1QySF9NU0dfVFlQRV9FWFRfU1RBVFNfQ09ORjoK KwkJYnJlYWs7CisJY2FzZSBIVFRfVDJIX01TR19UWVBFX01MT19USU1FU1RBTVBfT0ZGU0VUX0lO RDoKKwkJYXRoMTJrX2h0dF9tbG9fb2Zmc2V0X2V2ZW50X2hhbmRsZXIoYWIsIHNrYik7CisJCWJy ZWFrOworCWRlZmF1bHQ6CisJCWF0aDEya19kYmcoYWIsIEFUSDEyS19EQkdfRFBfSFRULCAiZHBf aHR0IGV2ZW50ICVkIG5vdCBoYW5kbGVkXG4iLAorCQkJICAgdHlwZSk7CisJCWJyZWFrOworCX0K KworCWRldl9rZnJlZV9za2JfYW55KHNrYik7Cit9CisKK3N0YXRpYyBpbnQgYXRoMTJrX2RwX3J4 X21zZHVfY29hbGVzY2Uoc3RydWN0IGF0aDEyayAqYXIsCisJCQkJICAgICAgc3RydWN0IHNrX2J1 ZmZfaGVhZCAqbXNkdV9saXN0LAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpmaXJzdCwgc3Ry dWN0IHNrX2J1ZmYgKmxhc3QsCisJCQkJICAgICAgdTggbDNwYWRfYnl0ZXMsIGludCBtc2R1X2xl bikKK3sKKwlzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiID0gYXItPmFiOworCXN0cnVjdCBza19idWZm ICpza2I7CisJc3RydWN0IGF0aDEya19za2JfcnhjYiAqcnhjYiA9IEFUSDEyS19TS0JfUlhDQihm aXJzdCk7CisJaW50IGJ1Zl9maXJzdF9oZHJfbGVuLCBidWZfZmlyc3RfbGVuOworCXN0cnVjdCBo YWxfcnhfZGVzYyAqbGRlc2M7CisJaW50IHNwYWNlX2V4dHJhLCByZW1fbGVuLCBidWZfbGVuOwor CXUzMiBoYWxfcnhfZGVzY19zeiA9IGFyLT5hYi0+aHdfcGFyYW1zLT5oYWxfZGVzY19zejsKKwor CS8qIEFzIHRoZSBtc2R1IGlzIHNwcmVhZCBhY3Jvc3MgbXVsdGlwbGUgcnggYnVmZmVycywKKwkg KiBmaW5kIHRoZSBvZmZzZXQgdG8gdGhlIHN0YXJ0IG9mIG1zZHUgZm9yIGNvbXB1dGluZworCSAq IHRoZSBsZW5ndGggb2YgdGhlIG1zZHUgaW4gdGhlIGZpcnN0IGJ1ZmZlci4KKwkgKi8KKwlidWZf Zmlyc3RfaGRyX2xlbiA9IGhhbF9yeF9kZXNjX3N6ICsgbDNwYWRfYnl0ZXM7CisJYnVmX2ZpcnN0 X2xlbiA9IERQX1JYX0JVRkZFUl9TSVpFIC0gYnVmX2ZpcnN0X2hkcl9sZW47CisKKwlpZiAoV0FS Tl9PTl9PTkNFKG1zZHVfbGVuIDw9IGJ1Zl9maXJzdF9sZW4pKSB7CisJCXNrYl9wdXQoZmlyc3Qs IGJ1Zl9maXJzdF9oZHJfbGVuICsgbXNkdV9sZW4pOworCQlza2JfcHVsbChmaXJzdCwgYnVmX2Zp cnN0X2hkcl9sZW4pOworCQlyZXR1cm4gMDsKKwl9CisKKwlsZGVzYyA9IChzdHJ1Y3QgaGFsX3J4 X2Rlc2MgKilsYXN0LT5kYXRhOworCXJ4Y2ItPmlzX2ZpcnN0X21zZHUgPSBhdGgxMmtfZHBfcnhf aF9maXJzdF9tc2R1KGFiLCBsZGVzYyk7CisJcnhjYi0+aXNfbGFzdF9tc2R1ID0gYXRoMTJrX2Rw X3J4X2hfbGFzdF9tc2R1KGFiLCBsZGVzYyk7CisKKwkvKiBNU0RVIHNwYW5zIG92ZXIgbXVsdGlw bGUgYnVmZmVycyBiZWNhdXNlIHRoZSBsZW5ndGggb2YgdGhlIE1TRFUKKwkgKiBleGNlZWRzIERQ X1JYX0JVRkZFUl9TSVpFIC0gSEFMX1JYX0RFU0NfU0laRS4gU28gYXNzdW1lIHRoZSBkYXRhCisJ ICogaW4gdGhlIGZpcnN0IGJ1ZiBpcyBvZiBsZW5ndGggRFBfUlhfQlVGRkVSX1NJWkUgLSBIQUxf UlhfREVTQ19TSVpFLgorCSAqLworCXNrYl9wdXQoZmlyc3QsIERQX1JYX0JVRkZFUl9TSVpFKTsK Kwlza2JfcHVsbChmaXJzdCwgYnVmX2ZpcnN0X2hkcl9sZW4pOworCisJLyogV2hlbiBhbiBNU0RV IHNwcmVhZCBvdmVyIG11bHRpcGxlIGJ1ZmZlcnMgTVNEVV9FTkQKKwkgKiB0bHZzIGFyZSB2YWxp ZCBvbmx5IGluIHRoZSBsYXN0IGJ1ZmZlci4gQ29weSB0aG9zZSB0bHZzLgorCSAqLworCWF0aDEy a19kcF9yeF9kZXNjX2VuZF90bHZfY29weShhYiwgcnhjYi0+cnhfZGVzYywgbGRlc2MpOworCisJ c3BhY2VfZXh0cmEgPSBtc2R1X2xlbiAtIChidWZfZmlyc3RfbGVuICsgc2tiX3RhaWxyb29tKGZp cnN0KSk7CisJaWYgKHNwYWNlX2V4dHJhID4gMCAmJgorCSAgICAocHNrYl9leHBhbmRfaGVhZChm aXJzdCwgMCwgc3BhY2VfZXh0cmEsIEdGUF9BVE9NSUMpIDwgMCkpIHsKKwkJLyogRnJlZSB1cCBh bGwgYnVmZmVycyBvZiB0aGUgTVNEVSAqLworCQl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUo bXNkdV9saXN0KSkgIT0gTlVMTCkgeworCQkJcnhjYiA9IEFUSDEyS19TS0JfUlhDQihza2IpOwor CQkJaWYgKCFyeGNiLT5pc19jb250aW51YXRpb24pIHsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShz a2IpOworCQkJCWJyZWFrOworCQkJfQorCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJfQor CQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZW1fbGVuID0gbXNkdV9sZW4gLSBidWZfZmlyc3Rf bGVuOworCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZShtc2R1X2xpc3QpKSAhPSBOVUxMICYm IHJlbV9sZW4gPiAwKSB7CisJCXJ4Y2IgPSBBVEgxMktfU0tCX1JYQ0Ioc2tiKTsKKwkJaWYgKHJ4 Y2ItPmlzX2NvbnRpbnVhdGlvbikKKwkJCWJ1Zl9sZW4gPSBEUF9SWF9CVUZGRVJfU0laRSAtIGhh bF9yeF9kZXNjX3N6OworCQllbHNlCisJCQlidWZfbGVuID0gcmVtX2xlbjsKKworCQlpZiAoYnVm X2xlbiA+IChEUF9SWF9CVUZGRVJfU0laRSAtIGhhbF9yeF9kZXNjX3N6KSkgeworCQkJV0FSTl9P Tl9PTkNFKDEpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCXJldHVybiAtRUlOVkFM OworCQl9CisKKwkJc2tiX3B1dChza2IsIGJ1Zl9sZW4gKyBoYWxfcnhfZGVzY19zeik7CisJCXNr Yl9wdWxsKHNrYiwgaGFsX3J4X2Rlc2Nfc3opOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRh KHNrYiwgc2tiX3B1dChmaXJzdCwgYnVmX2xlbiksCisJCQkJCSAgYnVmX2xlbik7CisJCWRldl9r ZnJlZV9za2JfYW55KHNrYik7CisKKwkJcmVtX2xlbiAtPSBidWZfbGVuOworCQlpZiAoIXJ4Y2It PmlzX2NvbnRpbnVhdGlvbikKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0 aWMgc3RydWN0IHNrX2J1ZmYgKmF0aDEya19kcF9yeF9nZXRfbXNkdV9sYXN0X2J1ZihzdHJ1Y3Qg c2tfYnVmZl9oZWFkICptc2R1X2xpc3QsCisJCQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqZmly c3QpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgYXRoMTJrX3NrYl9yeGNiICpy eGNiID0gQVRIMTJLX1NLQl9SWENCKGZpcnN0KTsKKworCWlmICghcnhjYi0+aXNfY29udGludWF0 aW9uKQorCQlyZXR1cm4gZmlyc3Q7CisKKwlza2JfcXVldWVfd2Fsayhtc2R1X2xpc3QsIHNrYikg eworCQlyeGNiID0gQVRIMTJLX1NLQl9SWENCKHNrYik7CisJCWlmICghcnhjYi0+aXNfY29udGlu dWF0aW9uKQorCQkJcmV0dXJuIHNrYjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGlj IHZvaWQgYXRoMTJrX2RwX3J4X2hfY3N1bV9vZmZsb2FkKHN0cnVjdCBhdGgxMmsgKmFyLCBzdHJ1 Y3Qgc2tfYnVmZiAqbXNkdSkKK3sKKwlzdHJ1Y3QgYXRoMTJrX3NrYl9yeGNiICpyeGNiID0gQVRI MTJLX1NLQl9SWENCKG1zZHUpOworCXN0cnVjdCBhdGgxMmtfYmFzZSAqYWIgPSBhci0+YWI7CisJ Ym9vbCBpcF9jc3VtX2ZhaWwsIGw0X2NzdW1fZmFpbDsKKworCWlwX2NzdW1fZmFpbCA9IGF0aDEy a19kcF9yeF9oX2lwX2Nrc3VtX2ZhaWwoYWIsIHJ4Y2ItPnJ4X2Rlc2MpOworCWw0X2NzdW1fZmFp bCA9IGF0aDEya19kcF9yeF9oX2w0X2Nrc3VtX2ZhaWwoYWIsIHJ4Y2ItPnJ4X2Rlc2MpOworCisJ bXNkdS0+aXBfc3VtbWVkID0gKGlwX2NzdW1fZmFpbCB8fCBsNF9jc3VtX2ZhaWwpID8KKwkJCSAg Q0hFQ0tTVU1fTk9ORSA6IENIRUNLU1VNX1VOTkVDRVNTQVJZOworfQorCitzdGF0aWMgaW50IGF0 aDEya19kcF9yeF9jcnlwdG9fbWljX2xlbihzdHJ1Y3QgYXRoMTJrICphciwKKwkJCQkgICAgICAg ZW51bSBoYWxfZW5jcnlwdF90eXBlIGVuY3R5cGUpCit7CisJc3dpdGNoIChlbmN0eXBlKSB7CisJ Y2FzZSBIQUxfRU5DUllQVF9UWVBFX09QRU46CisJY2FzZSBIQUxfRU5DUllQVF9UWVBFX1RLSVBf Tk9fTUlDOgorCWNhc2UgSEFMX0VOQ1JZUFRfVFlQRV9US0lQX01JQzoKKwkJcmV0dXJuIDA7CisJ Y2FzZSBIQUxfRU5DUllQVF9UWVBFX0NDTVBfMTI4OgorCQlyZXR1cm4gSUVFRTgwMjExX0NDTVBf TUlDX0xFTjsKKwljYXNlIEhBTF9FTkNSWVBUX1RZUEVfQ0NNUF8yNTY6CisJCXJldHVybiBJRUVF ODAyMTFfQ0NNUF8yNTZfTUlDX0xFTjsKKwljYXNlIEhBTF9FTkNSWVBUX1RZUEVfR0NNUF8xMjg6 CisJY2FzZSBIQUxfRU5DUllQVF9UWVBFX0FFU19HQ01QXzI1NjoKKwkJcmV0dXJuIElFRUU4MDIx MV9HQ01QX01JQ19MRU47CisJY2FzZSBIQUxfRU5DUllQVF9UWVBFX1dFUF80MDoKKwljYXNlIEhB TF9FTkNSWVBUX1RZUEVfV0VQXzEwNDoKKwljYXNlIEhBTF9FTkNSWVBUX1RZUEVfV0VQXzEyODoK KwljYXNlIEhBTF9FTkNSWVBUX1RZUEVfV0FQSV9HQ01fU000OgorCWNhc2UgSEFMX0VOQ1JZUFRf VFlQRV9XQVBJOgorCQlicmVhazsKKwl9CisKKwlhdGgxMmtfd2Fybihhci0+YWIsICJ1bnN1cHBv cnRlZCBlbmNyeXB0aW9uIHR5cGUgJWQgZm9yIG1pYyBsZW5cbiIsIGVuY3R5cGUpOworCXJldHVy biAwOworfQorCitzdGF0aWMgaW50IGF0aDEya19kcF9yeF9jcnlwdG9fcGFyYW1fbGVuKHN0cnVj dCBhdGgxMmsgKmFyLAorCQkJCQkgZW51bSBoYWxfZW5jcnlwdF90eXBlIGVuY3R5cGUpCit7CisJ c3dpdGNoIChlbmN0eXBlKSB7CisJY2FzZSBIQUxfRU5DUllQVF9UWVBFX09QRU46CisJCXJldHVy biAwOworCWNhc2UgSEFMX0VOQ1JZUFRfVFlQRV9US0lQX05PX01JQzoKKwljYXNlIEhBTF9FTkNS WVBUX1RZUEVfVEtJUF9NSUM6CisJCXJldHVybiBJRUVFODAyMTFfVEtJUF9JVl9MRU47CisJY2Fz ZSBIQUxfRU5DUllQVF9UWVBFX0NDTVBfMTI4OgorCQlyZXR1cm4gSUVFRTgwMjExX0NDTVBfSERS X0xFTjsKKwljYXNlIEhBTF9FTkNSWVBUX1RZUEVfQ0NNUF8yNTY6CisJCXJldHVybiBJRUVFODAy MTFfQ0NNUF8yNTZfSERSX0xFTjsKKwljYXNlIEhBTF9FTkNSWVBUX1RZUEVfR0NNUF8xMjg6CisJ Y2FzZSBIQUxfRU5DUllQVF9UWVBFX0FFU19HQ01QXzI1NjoKKwkJcmV0dXJuIElFRUU4MDIxMV9H Q01QX0hEUl9MRU47CisJY2FzZSBIQUxfRU5DUllQVF9UWVBFX1dFUF80MDoKKwljYXNlIEhBTF9F TkNSWVBUX1RZUEVfV0VQXzEwNDoKKwljYXNlIEhBTF9FTkNSWVBUX1RZUEVfV0VQXzEyODoKKwlj YXNlIEhBTF9FTkNSWVBUX1RZUEVfV0FQSV9HQ01fU000OgorCWNhc2UgSEFMX0VOQ1JZUFRfVFlQ RV9XQVBJOgorCQlicmVhazsKKwl9CisKKwlhdGgxMmtfd2Fybihhci0+YWIsICJ1bnN1cHBvcnRl ZCBlbmNyeXB0aW9uIHR5cGUgJWRcbiIsIGVuY3R5cGUpOworCXJldHVybiAwOworfQorCitzdGF0 aWMgaW50IGF0aDEya19kcF9yeF9jcnlwdG9faWN2X2xlbihzdHJ1Y3QgYXRoMTJrICphciwKKwkJ CQkgICAgICAgZW51bSBoYWxfZW5jcnlwdF90eXBlIGVuY3R5cGUpCit7CisJc3dpdGNoIChlbmN0 eXBlKSB7CisJY2FzZSBIQUxfRU5DUllQVF9UWVBFX09QRU46CisJY2FzZSBIQUxfRU5DUllQVF9U WVBFX0NDTVBfMTI4OgorCWNhc2UgSEFMX0VOQ1JZUFRfVFlQRV9DQ01QXzI1NjoKKwljYXNlIEhB TF9FTkNSWVBUX1RZUEVfR0NNUF8xMjg6CisJY2FzZSBIQUxfRU5DUllQVF9UWVBFX0FFU19HQ01Q XzI1NjoKKwkJcmV0dXJuIDA7CisJY2FzZSBIQUxfRU5DUllQVF9UWVBFX1RLSVBfTk9fTUlDOgor CWNhc2UgSEFMX0VOQ1JZUFRfVFlQRV9US0lQX01JQzoKKwkJcmV0dXJuIElFRUU4MDIxMV9US0lQ X0lDVl9MRU47CisJY2FzZSBIQUxfRU5DUllQVF9UWVBFX1dFUF80MDoKKwljYXNlIEhBTF9FTkNS WVBUX1RZUEVfV0VQXzEwNDoKKwljYXNlIEhBTF9FTkNSWVBUX1RZUEVfV0VQXzEyODoKKwljYXNl IEhBTF9FTkNSWVBUX1RZUEVfV0FQSV9HQ01fU000OgorCWNhc2UgSEFMX0VOQ1JZUFRfVFlQRV9X QVBJOgorCQlicmVhazsKKwl9CisKKwlhdGgxMmtfd2Fybihhci0+YWIsICJ1bnN1cHBvcnRlZCBl bmNyeXB0aW9uIHR5cGUgJWRcbiIsIGVuY3R5cGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMg dm9pZCBhdGgxMmtfZHBfcnhfaF91bmRlY2FwX253aWZpKHN0cnVjdCBhdGgxMmsgKmFyLAorCQkJ CQkgc3RydWN0IHNrX2J1ZmYgKm1zZHUsCisJCQkJCSBlbnVtIGhhbF9lbmNyeXB0X3R5cGUgZW5j dHlwZSwKKwkJCQkJIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0dXMpCit7CisJc3Ry dWN0IGF0aDEya19iYXNlICphYiA9IGFyLT5hYjsKKwlzdHJ1Y3QgYXRoMTJrX3NrYl9yeGNiICpy eGNiID0gQVRIMTJLX1NLQl9SWENCKG1zZHUpOworCXU4IGRlY2FwX2hkcltEUF9NQVhfTldJRklf SERSX0xFTl07CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwlzaXplX3QgaGRyX2xlbjsK Kwl1OCAqY3J5cHRvX2hkcjsKKwl1MTYgcW9zX2N0bDsKKworCS8qIHB1bGwgZGVjYXBwZWQgaGVh ZGVyICovCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopbXNkdS0+ZGF0YTsKKwloZHJf bGVuID0gaWVlZTgwMjExX2hkcmxlbihoZHItPmZyYW1lX2NvbnRyb2wpOworCXNrYl9wdWxsKG1z ZHUsIGhkcl9sZW4pOworCisJLyogIFJlYnVpbGQgcW9zIGhlYWRlciAqLworCWhkci0+ZnJhbWVf Y29udHJvbCB8PSBfX2NwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQSk7CisKKwkv KiBSZXNldCB0aGUgb3JkZXIgYml0IGFzIHRoZSBIVF9Db250cm9sIGhlYWRlciBpcyBzdHJpcHBl ZCAqLworCWhkci0+ZnJhbWVfY29udHJvbCAmPSB+KF9fY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZD VExfT1JERVIpKTsKKworCXFvc19jdGwgPSByeGNiLT50aWQ7CisKKwlpZiAoYXRoMTJrX2RwX3J4 X2hfbWVzaF9jdGxfcHJlc2VudChhYiwgcnhjYi0+cnhfZGVzYykpCisJCXFvc19jdGwgfD0gSUVF RTgwMjExX1FPU19DVExfTUVTSF9DT05UUk9MX1BSRVNFTlQ7CisKKwkvKiBUT0RPOiBBZGQgb3Ro ZXIgUW9TIGN0bCBmaWVsZHMgd2hlbiByZXF1aXJlZCAqLworCisJLyogY29weSBkZWNhcCBoZWFk ZXIgYmVmb3JlIG92ZXJ3cml0aW5nIGZvciByZXVzZSBiZWxvdyAqLworCW1lbWNweShkZWNhcF9o ZHIsIGhkciwgaGRyX2xlbik7CisKKwkvKiBSZWJ1aWxkIGNyeXB0byBoZWFkZXIgZm9yIG1hYzgw MjExIHVzZSAqLworCWlmICghKHN0YXR1cy0+ZmxhZyAmIFJYX0ZMQUdfSVZfU1RSSVBQRUQpKSB7 CisJCWNyeXB0b19oZHIgPSBza2JfcHVzaChtc2R1LCBhdGgxMmtfZHBfcnhfY3J5cHRvX3BhcmFt X2xlbihhciwgZW5jdHlwZSkpOworCQlhdGgxMmtfZHBfcnhfZGVzY19nZXRfY3J5cHRvX2hlYWRl cihhci0+YWIsCisJCQkJCQkgICAgcnhjYi0+cnhfZGVzYywgY3J5cHRvX2hkciwKKwkJCQkJCSAg ICBlbmN0eXBlKTsKKwl9CisKKwltZW1jcHkoc2tiX3B1c2gobXNkdSwKKwkJCUlFRUU4MDIxMV9R T1NfQ1RMX0xFTiksICZxb3NfY3RsLAorCQkJSUVFRTgwMjExX1FPU19DVExfTEVOKTsKKwltZW1j cHkoc2tiX3B1c2gobXNkdSwgaGRyX2xlbiksIGRlY2FwX2hkciwgaGRyX2xlbik7Cit9CisKK3N0 YXRpYyB2b2lkIGF0aDEya19kcF9yeF9oX3VuZGVjYXBfcmF3KHN0cnVjdCBhdGgxMmsgKmFyLCBz dHJ1Y3Qgc2tfYnVmZiAqbXNkdSwKKwkJCQkgICAgICAgZW51bSBoYWxfZW5jcnlwdF90eXBlIGVu Y3R5cGUsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0dXMsCisJ CQkJICAgICAgIGJvb2wgZGVjcnlwdGVkKQoreworCXN0cnVjdCBhdGgxMmtfc2tiX3J4Y2IgKnJ4 Y2IgPSBBVEgxMktfU0tCX1JYQ0IobXNkdSk7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsK KwlzaXplX3QgaGRyX2xlbjsKKwlzaXplX3QgY3J5cHRvX2xlbjsKKworCWlmICghcnhjYi0+aXNf Zmlyc3RfbXNkdSB8fAorCSAgICAhKHJ4Y2ItPmlzX2ZpcnN0X21zZHUgJiYgcnhjYi0+aXNfbGFz dF9tc2R1KSkgeworCQlXQVJOX09OX09OQ0UoMSk7CisJCXJldHVybjsKKwl9CisKKwlza2JfdHJp bShtc2R1LCBtc2R1LT5sZW4gLSBGQ1NfTEVOKTsKKworCWlmICghZGVjcnlwdGVkKQorCQlyZXR1 cm47CisKKwloZHIgPSAodm9pZCAqKW1zZHUtPmRhdGE7CisKKwkvKiBUYWlsICovCisJaWYgKHN0 YXR1cy0+ZmxhZyAmIFJYX0ZMQUdfSVZfU1RSSVBQRUQpIHsKKwkJc2tiX3RyaW0obXNkdSwgbXNk dS0+bGVuIC0KKwkJCSBhdGgxMmtfZHBfcnhfY3J5cHRvX21pY19sZW4oYXIsIGVuY3R5cGUpKTsK KworCQlza2JfdHJpbShtc2R1LCBtc2R1LT5sZW4gLQorCQkJIGF0aDEya19kcF9yeF9jcnlwdG9f aWN2X2xlbihhciwgZW5jdHlwZSkpOworCX0gZWxzZSB7CisJCS8qIE1JQyAqLworCQlpZiAoc3Rh dHVzLT5mbGFnICYgUlhfRkxBR19NSUNfU1RSSVBQRUQpCisJCQlza2JfdHJpbShtc2R1LCBtc2R1 LT5sZW4gLQorCQkJCSBhdGgxMmtfZHBfcnhfY3J5cHRvX21pY19sZW4oYXIsIGVuY3R5cGUpKTsK KworCQkvKiBJQ1YgKi8KKwkJaWYgKHN0YXR1cy0+ZmxhZyAmIFJYX0ZMQUdfSUNWX1NUUklQUEVE KQorCQkJc2tiX3RyaW0obXNkdSwgbXNkdS0+bGVuIC0KKwkJCQkgYXRoMTJrX2RwX3J4X2NyeXB0 b19pY3ZfbGVuKGFyLCBlbmN0eXBlKSk7CisJfQorCisJLyogTU1JQyAqLworCWlmICgoc3RhdHVz LT5mbGFnICYgUlhfRkxBR19NTUlDX1NUUklQUEVEKSAmJgorCSAgICAhaWVlZTgwMjExX2hhc19t b3JlZnJhZ3MoaGRyLT5mcmFtZV9jb250cm9sKSAmJgorCSAgICBlbmN0eXBlID09IEhBTF9FTkNS WVBUX1RZUEVfVEtJUF9NSUMpCisJCXNrYl90cmltKG1zZHUsIG1zZHUtPmxlbiAtIElFRUU4MDIx MV9DQ01QX01JQ19MRU4pOworCisJLyogSGVhZCAqLworCWlmIChzdGF0dXMtPmZsYWcgJiBSWF9G TEFHX0lWX1NUUklQUEVEKSB7CisJCWhkcl9sZW4gPSBpZWVlODAyMTFfaGRybGVuKGhkci0+ZnJh bWVfY29udHJvbCk7CisJCWNyeXB0b19sZW4gPSBhdGgxMmtfZHBfcnhfY3J5cHRvX3BhcmFtX2xl bihhciwgZW5jdHlwZSk7CisKKwkJbWVtbW92ZShtc2R1LT5kYXRhICsgY3J5cHRvX2xlbiwgbXNk dS0+ZGF0YSwgaGRyX2xlbik7CisJCXNrYl9wdWxsKG1zZHUsIGNyeXB0b19sZW4pOworCX0KK30K Kworc3RhdGljIHZvaWQgYXRoMTJrX2dldF9kb3QxMV9oZHJfZnJvbV9yeF9kZXNjKHN0cnVjdCBh dGgxMmsgKmFyLAorCQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqbXNkdSwKKwkJCQkJICAgICAg c3RydWN0IGF0aDEya19za2JfcnhjYiAqcnhjYiwKKwkJCQkJICAgICAgc3RydWN0IGllZWU4MDIx MV9yeF9zdGF0dXMgKnN0YXR1cywKKwkJCQkJICAgICAgZW51bSBoYWxfZW5jcnlwdF90eXBlIGVu Y3R5cGUpCit7CisJc3RydWN0IGhhbF9yeF9kZXNjICpyeF9kZXNjID0gcnhjYi0+cnhfZGVzYzsK KwlzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiID0gYXItPmFiOworCXNpemVfdCBoZHJfbGVuLCBjcnlw dG9fbGVuOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJdTE2IHFvc19jdGw7CisJX19s ZTE2IGZjOworCXU4ICpjcnlwdG9faGRyOworCisJaWYgKCEoc3RhdHVzLT5mbGFnICYgUlhfRkxB R19JVl9TVFJJUFBFRCkpIHsKKwkJY3J5cHRvX2xlbiA9IGF0aDEya19kcF9yeF9jcnlwdG9fcGFy YW1fbGVuKGFyLCBlbmN0eXBlKTsKKwkJY3J5cHRvX2hkciA9IHNrYl9wdXNoKG1zZHUsIGNyeXB0 b19sZW4pOworCQlhdGgxMmtfZHBfcnhfZGVzY19nZXRfY3J5cHRvX2hlYWRlcihhYiwgcnhfZGVz YywgY3J5cHRvX2hkciwgZW5jdHlwZSk7CisJfQorCisJZmMgPSBjcHVfdG9fbGUxNihhdGgxMmtf ZHBfcnhkZXNjX2dldF9tcGR1X2ZyYW1lX2N0cmwoYWIsIHJ4X2Rlc2MpKTsKKwloZHJfbGVuID0g aWVlZTgwMjExX2hkcmxlbihmYyk7CisJc2tiX3B1c2gobXNkdSwgaGRyX2xlbik7CisJaGRyID0g KHN0cnVjdCBpZWVlODAyMTFfaGRyICopbXNkdS0+ZGF0YTsKKwloZHItPmZyYW1lX2NvbnRyb2wg PSBmYzsKKworCS8qIEdldCB3aWZpIGhlYWRlciBmcm9tIHJ4X2Rlc2MgKi8KKwlhdGgxMmtfZHBf cnhfZGVzY19nZXRfZG90MTFfaGRyKGFiLCByeF9kZXNjLCBoZHIpOworCisJaWYgKHJ4Y2ItPmlz X21jYmMpCisJCXN0YXR1cy0+ZmxhZyAmPSB+UlhfRkxBR19QTl9WQUxJREFURUQ7CisKKwkvKiBB ZGQgUU9TIGhlYWRlciAqLworCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9j b250cm9sKSkgeworCQlxb3NfY3RsID0gcnhjYi0+dGlkOworCQlpZiAoYXRoMTJrX2RwX3J4X2hf bWVzaF9jdGxfcHJlc2VudChhYiwgcnhfZGVzYykpCisJCQlxb3NfY3RsIHw9IElFRUU4MDIxMV9R T1NfQ1RMX01FU0hfQ09OVFJPTF9QUkVTRU5UOworCisJCS8qIFRPRE86IEFkZCBvdGhlciBRb1Mg Y3RsIGZpZWxkcyB3aGVuIHJlcXVpcmVkICovCisJCW1lbWNweShtc2R1LT5kYXRhICsgKGhkcl9s ZW4gLSBJRUVFODAyMTFfUU9TX0NUTF9MRU4pLAorCQkgICAgICAgJnFvc19jdGwsIElFRUU4MDIx MV9RT1NfQ1RMX0xFTik7CisJfQorfQorCitzdGF0aWMgdm9pZCBhdGgxMmtfZHBfcnhfaF91bmRl Y2FwX2V0aChzdHJ1Y3QgYXRoMTJrICphciwKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKm1z ZHUsCisJCQkJICAgICAgIGVudW0gaGFsX2VuY3J5cHRfdHlwZSBlbmN0eXBlLAorCQkJCSAgICAg ICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzKQoreworCXN0cnVjdCBpZWVlODAy MTFfaGRyICpoZHI7CisJc3RydWN0IGV0aGhkciAqZXRoOworCXU4IGRhW0VUSF9BTEVOXTsKKwl1 OCBzYVtFVEhfQUxFTl07CisJc3RydWN0IGF0aDEya19za2JfcnhjYiAqcnhjYiA9IEFUSDEyS19T S0JfUlhDQihtc2R1KTsKKwlzdHJ1Y3QgYXRoMTJrX2RwX3J4X3JmYzEwNDJfaGRyIHJmYyA9IHsw eGFhLCAweGFhLCAweDAzLCB7MHgwMCwgMHgwMCwgMHgwMH19OworCisJZXRoID0gKHN0cnVjdCBl dGhoZHIgKiltc2R1LT5kYXRhOworCWV0aGVyX2FkZHJfY29weShkYSwgZXRoLT5oX2Rlc3QpOwor CWV0aGVyX2FkZHJfY29weShzYSwgZXRoLT5oX3NvdXJjZSk7CisJcmZjLnNuYXBfdHlwZSA9IGV0 aC0+aF9wcm90bzsKKwlza2JfcHVsbChtc2R1LCBzaXplb2YoKmV0aCkpOworCW1lbWNweShza2Jf cHVzaChtc2R1LCBzaXplb2YocmZjKSksICZyZmMsCisJICAgICAgIHNpemVvZihyZmMpKTsKKwlh dGgxMmtfZ2V0X2RvdDExX2hkcl9mcm9tX3J4X2Rlc2MoYXIsIG1zZHUsIHJ4Y2IsIHN0YXR1cywg ZW5jdHlwZSk7CisKKwkvKiBvcmlnaW5hbCA4MDIuMTEgaGVhZGVyIGhhcyBhIGRpZmZlcmVudCBE QSBhbmQgaW4KKwkgKiBjYXNlIG9mIDRhZGRyIGl0IG1heSBhbHNvIGhhdmUgZGlmZmVyZW50IFNB CisJICovCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopbXNkdS0+ZGF0YTsKKwlldGhl cl9hZGRyX2NvcHkoaWVlZTgwMjExX2dldF9EQShoZHIpLCBkYSk7CisJZXRoZXJfYWRkcl9jb3B5 KGllZWU4MDIxMV9nZXRfU0EoaGRyKSwgc2EpOworfQorCitzdGF0aWMgdm9pZCBhdGgxMmtfZHBf cnhfaF91bmRlY2FwKHN0cnVjdCBhdGgxMmsgKmFyLCBzdHJ1Y3Qgc2tfYnVmZiAqbXNkdSwKKwkJ CQkgICBzdHJ1Y3QgaGFsX3J4X2Rlc2MgKnJ4X2Rlc2MsCisJCQkJICAgZW51bSBoYWxfZW5jcnlw dF90eXBlIGVuY3R5cGUsCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXR1 cywKKwkJCQkgICBib29sIGRlY3J5cHRlZCkKK3sKKwlzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiID0g YXItPmFiOworCXU4IGRlY2FwOworCXN0cnVjdCBldGhoZHIgKmVoZHI7CisKKwlkZWNhcCA9IGF0 aDEya19kcF9yeF9oX2RlY2FwX3R5cGUoYWIsIHJ4X2Rlc2MpOworCisJc3dpdGNoIChkZWNhcCkg eworCWNhc2UgRFBfUlhfREVDQVBfVFlQRV9OQVRJVkVfV0lGSToKKwkJYXRoMTJrX2RwX3J4X2hf dW5kZWNhcF9ud2lmaShhciwgbXNkdSwgZW5jdHlwZSwgc3RhdHVzKTsKKwkJYnJlYWs7CisJY2Fz ZSBEUF9SWF9ERUNBUF9UWVBFX1JBVzoKKwkJYXRoMTJrX2RwX3J4X2hfdW5kZWNhcF9yYXcoYXIs IG1zZHUsIGVuY3R5cGUsIHN0YXR1cywKKwkJCQkJICAgZGVjcnlwdGVkKTsKKwkJYnJlYWs7CisJ Y2FzZSBEUF9SWF9ERUNBUF9UWVBFX0VUSEVSTkVUMl9ESVg6CisJCWVoZHIgPSAoc3RydWN0IGV0 aGhkciAqKW1zZHUtPmRhdGE7CisKKwkJLyogbWFjODAyMTEgYWxsb3dzIGZhc3QgcGF0aCBvbmx5 IGZvciBhdXRob3JpemVkIFNUQSAqLworCQlpZiAoZWhkci0+aF9wcm90byA9PSBjcHVfdG9fYmUx NihFVEhfUF9QQUUpKSB7CisJCQlBVEgxMktfU0tCX1JYQ0IobXNkdSktPmlzX2VhcG9sID0gdHJ1 ZTsKKwkJCWF0aDEya19kcF9yeF9oX3VuZGVjYXBfZXRoKGFyLCBtc2R1LCBlbmN0eXBlLCBzdGF0 dXMpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBQTiBmb3IgbWNhc3QgcGFja2V0cyB3aWxsIGJl IHZhbGlkYXRlZCBpbiBtYWM4MDIxMTsKKwkJICogcmVtb3ZlIGV0aCBoZWFkZXIgYW5kIGFkZCA4 MDIuMTEgaGVhZGVyLgorCQkgKi8KKwkJaWYgKEFUSDEyS19TS0JfUlhDQihtc2R1KS0+aXNfbWNi YyAmJiBkZWNyeXB0ZWQpCisJCQlhdGgxMmtfZHBfcnhfaF91bmRlY2FwX2V0aChhciwgbXNkdSwg ZW5jdHlwZSwgc3RhdHVzKTsKKwkJYnJlYWs7CisJY2FzZSBEUF9SWF9ERUNBUF9UWVBFXzgwMjM6 CisJCS8qIFRPRE86IEhhbmRsZSB1bmRlY2FwIGZvciB0aGVzZSBmb3JtYXRzICovCisJCWJyZWFr OworCX0KK30KKworc3RydWN0IGF0aDEya19wZWVyICoKK2F0aDEya19kcF9yeF9oX2ZpbmRfcGVl cihzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLCBzdHJ1Y3Qgc2tfYnVmZiAqbXNkdSkKK3sKKwlzdHJ1 Y3QgYXRoMTJrX3NrYl9yeGNiICpyeGNiID0gQVRIMTJLX1NLQl9SWENCKG1zZHUpOworCXN0cnVj dCBoYWxfcnhfZGVzYyAqcnhfZGVzYyA9IHJ4Y2ItPnJ4X2Rlc2M7CisJc3RydWN0IGF0aDEya19w ZWVyICpwZWVyID0gTlVMTDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFiLT5iYXNlX2xvY2sp OworCisJaWYgKHJ4Y2ItPnBlZXJfaWQpCisJCXBlZXIgPSBhdGgxMmtfcGVlcl9maW5kX2J5X2lk KGFiLCByeGNiLT5wZWVyX2lkKTsKKworCWlmIChwZWVyKQorCQlyZXR1cm4gcGVlcjsKKworCWlm ICghcnhfZGVzYyB8fCAhKGF0aDEya19kcF9yeGRlc2NfbWFjX2FkZHIyX3ZhbGlkKGFiLCByeF9k ZXNjKSkpCisJCXJldHVybiBOVUxMOworCisJcGVlciA9IGF0aDEya19wZWVyX2ZpbmRfYnlfYWRk cihhYiwKKwkJCQkJYXRoMTJrX2RwX3J4ZGVzY19nZXRfbXBkdV9zdGFydF9hZGRyMihhYiwKKwkJ CQkJCQkJCSAgICAgIHJ4X2Rlc2MpKTsKKwlyZXR1cm4gcGVlcjsKK30KKworc3RhdGljIHZvaWQg YXRoMTJrX2RwX3J4X2hfbXBkdShzdHJ1Y3QgYXRoMTJrICphciwKKwkJCQlzdHJ1Y3Qgc2tfYnVm ZiAqbXNkdSwKKwkJCQlzdHJ1Y3QgaGFsX3J4X2Rlc2MgKnJ4X2Rlc2MsCisJCQkJc3RydWN0IGll ZWU4MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXR1cykKK3sKKwlib29sICBmaWxsX2NyeXB0b19oZHI7 CisJc3RydWN0IGF0aDEya19iYXNlICphYiA9IGFyLT5hYjsKKwlzdHJ1Y3QgYXRoMTJrX3NrYl9y eGNiICpyeGNiOworCWVudW0gaGFsX2VuY3J5cHRfdHlwZSBlbmN0eXBlOworCWJvb2wgaXNfZGVj cnlwdGVkID0gZmFsc2U7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwlzdHJ1Y3QgYXRo MTJrX3BlZXIgKnBlZXI7CisJdTMyIGVycl9iaXRtYXA7CisKKwkvKiBQTiBmb3IgbXVsdGljYXN0 IHBhY2tldHMgd2lsbCBiZSBjaGVja2VkIGluIG1hYzgwMjExICovCisJcnhjYiA9IEFUSDEyS19T S0JfUlhDQihtc2R1KTsKKwlmaWxsX2NyeXB0b19oZHIgPSBhdGgxMmtfZHBfcnhfaF9pc19tY2Jj KGFyLT5hYiwgcnhfZGVzYyk7CisJcnhjYi0+aXNfbWNiYyA9IGZpbGxfY3J5cHRvX2hkcjsKKwor CWlmIChyeGNiLT5pc19tY2JjKQorCQlyeGNiLT5wZWVyX2lkID0gYXRoMTJrX2RwX3J4X2hfcGVl cl9pZChhci0+YWIsIHJ4X2Rlc2MpOworCisJc3Bpbl9sb2NrX2JoKCZhci0+YWItPmJhc2VfbG9j ayk7CisJcGVlciA9IGF0aDEya19kcF9yeF9oX2ZpbmRfcGVlcihhci0+YWIsIG1zZHUpOworCWlm IChwZWVyKSB7CisJCWlmIChyeGNiLT5pc19tY2JjKQorCQkJZW5jdHlwZSA9IHBlZXItPnNlY190 eXBlX2dycDsKKwkJZWxzZQorCQkJZW5jdHlwZSA9IHBlZXItPnNlY190eXBlOworCX0gZWxzZSB7 CisJCWVuY3R5cGUgPSBIQUxfRU5DUllQVF9UWVBFX09QRU47CisJfQorCXNwaW5fdW5sb2NrX2Jo KCZhci0+YWItPmJhc2VfbG9jayk7CisKKwllcnJfYml0bWFwID0gYXRoMTJrX2RwX3J4X2hfbXBk dV9lcnIoYWIsIHJ4X2Rlc2MpOworCWlmIChlbmN0eXBlICE9IEhBTF9FTkNSWVBUX1RZUEVfT1BF TiAmJiAhZXJyX2JpdG1hcCkKKwkJaXNfZGVjcnlwdGVkID0gYXRoMTJrX2RwX3J4X2hfaXNfZGVj cnlwdGVkKGFiLCByeF9kZXNjKTsKKworCS8qIENsZWFyIHBlci1NUERVIGZsYWdzIHdoaWxlIGxl YXZpbmcgcGVyLVBQRFUgZmxhZ3MgaW50YWN0ICovCisJcnhfc3RhdHVzLT5mbGFnICY9IH4oUlhf RkxBR19GQUlMRURfRkNTX0NSQyB8CisJCQkgICAgIFJYX0ZMQUdfTU1JQ19FUlJPUiB8CisJCQkg ICAgIFJYX0ZMQUdfREVDUllQVEVEIHwKKwkJCSAgICAgUlhfRkxBR19JVl9TVFJJUFBFRCB8CisJ CQkgICAgIFJYX0ZMQUdfTU1JQ19TVFJJUFBFRCk7CisKKwlpZiAoZXJyX2JpdG1hcCAmIEhBTF9S WF9NUERVX0VSUl9GQ1MpCisJCXJ4X3N0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX0ZBSUxFRF9GQ1Nf Q1JDOworCWlmIChlcnJfYml0bWFwICYgSEFMX1JYX01QRFVfRVJSX1RLSVBfTUlDKQorCQlyeF9z dGF0dXMtPmZsYWcgfD0gUlhfRkxBR19NTUlDX0VSUk9SOworCisJaWYgKGlzX2RlY3J5cHRlZCkg eworCQlyeF9zdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19ERUNSWVBURUQgfCBSWF9GTEFHX01NSUNf U1RSSVBQRUQ7CisKKwkJaWYgKGZpbGxfY3J5cHRvX2hkcikKKwkJCXJ4X3N0YXR1cy0+ZmxhZyB8 PSBSWF9GTEFHX01JQ19TVFJJUFBFRCB8CisJCQkJCVJYX0ZMQUdfSUNWX1NUUklQUEVEOworCQll bHNlCisJCQlyeF9zdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19JVl9TVFJJUFBFRCB8CisJCQkJCSAg IFJYX0ZMQUdfUE5fVkFMSURBVEVEOworCX0KKworCWF0aDEya19kcF9yeF9oX2NzdW1fb2ZmbG9h ZChhciwgbXNkdSk7CisJYXRoMTJrX2RwX3J4X2hfdW5kZWNhcChhciwgbXNkdSwgcnhfZGVzYywK KwkJCSAgICAgICBlbmN0eXBlLCByeF9zdGF0dXMsIGlzX2RlY3J5cHRlZCk7CisKKwlpZiAoIWlz X2RlY3J5cHRlZCB8fCBmaWxsX2NyeXB0b19oZHIpCisJCXJldHVybjsKKworCWlmIChhdGgxMmtf ZHBfcnhfaF9kZWNhcF90eXBlKGFyLT5hYiwgcnhfZGVzYykgIT0KKwkgICAgRFBfUlhfREVDQVBf VFlQRV9FVEhFUk5FVDJfRElYKSB7CisJCWhkciA9ICh2b2lkICopbXNkdS0+ZGF0YTsKKwkJaGRy LT5mcmFtZV9jb250cm9sICY9IH5fX2NwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RF RCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhdGgxMmtfZHBfcnhfaF9yYXRlKHN0cnVjdCBhdGgx MmsgKmFyLCBzdHJ1Y3QgaGFsX3J4X2Rlc2MgKnJ4X2Rlc2MsCisJCQkJc3RydWN0IGllZWU4MDIx MV9yeF9zdGF0dXMgKnJ4X3N0YXR1cykKK3sKKwlzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiID0gYXIt PmFiOworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOworCWVudW0gcnhf bXNkdV9zdGFydF9wa3RfdHlwZSBwa3RfdHlwZTsKKwl1OCBidzsKKwl1OCByYXRlX21jcywgbnNz OworCXU4IHNnaTsKKwlib29sIGlzX2NjazsKKworCXBrdF90eXBlID0gYXRoMTJrX2RwX3J4X2hf cGt0X3R5cGUoYWIsIHJ4X2Rlc2MpOworCWJ3ID0gYXRoMTJrX2RwX3J4X2hfcnhfYncoYWIsIHJ4 X2Rlc2MpOworCXJhdGVfbWNzID0gYXRoMTJrX2RwX3J4X2hfcmF0ZV9tY3MoYWIsIHJ4X2Rlc2Mp OworCW5zcyA9IGF0aDEya19kcF9yeF9oX25zcyhhYiwgcnhfZGVzYyk7CisJc2dpID0gYXRoMTJr X2RwX3J4X2hfc2dpKGFiLCByeF9kZXNjKTsKKworCXN3aXRjaCAocGt0X3R5cGUpIHsKKwljYXNl IFJYX01TRFVfU1RBUlRfUEtUX1RZUEVfMTFBOgorCWNhc2UgUlhfTVNEVV9TVEFSVF9QS1RfVFlQ RV8xMUI6CisJCWlzX2NjayA9IChwa3RfdHlwZSA9PSBSWF9NU0RVX1NUQVJUX1BLVF9UWVBFXzEx Qik7CisJCXNiYW5kID0gJmFyLT5tYWMuc2JhbmRzW3J4X3N0YXR1cy0+YmFuZF07CisJCXJ4X3N0 YXR1cy0+cmF0ZV9pZHggPSBhdGgxMmtfbWFjX2h3X3JhdGVfdG9faWR4KHNiYW5kLCByYXRlX21j cywKKwkJCQkJCQkJaXNfY2NrKTsKKwkJYnJlYWs7CisJY2FzZSBSWF9NU0RVX1NUQVJUX1BLVF9U WVBFXzExTjoKKwkJcnhfc3RhdHVzLT5lbmNvZGluZyA9IFJYX0VOQ19IVDsKKwkJaWYgKHJhdGVf bWNzID4gQVRIMTJLX0hUX01DU19NQVgpIHsKKwkJCWF0aDEya193YXJuKGFyLT5hYiwKKwkJCQkg ICAgIlJlY2VpdmVkIHdpdGggaW52YWxpZCBtY3MgaW4gSFQgbW9kZSAlZFxuIiwKKwkJCQkgICAg IHJhdGVfbWNzKTsKKwkJCWJyZWFrOworCQl9CisJCXJ4X3N0YXR1cy0+cmF0ZV9pZHggPSByYXRl X21jcyArICg4ICogKG5zcyAtIDEpKTsKKwkJaWYgKHNnaSkKKwkJCXJ4X3N0YXR1cy0+ZW5jX2Zs YWdzIHw9IFJYX0VOQ19GTEFHX1NIT1JUX0dJOworCQlyeF9zdGF0dXMtPmJ3ID0gYXRoMTJrX21h Y19id190b19tYWM4MDIxMV9idyhidyk7CisJCWJyZWFrOworCWNhc2UgUlhfTVNEVV9TVEFSVF9Q S1RfVFlQRV8xMUFDOgorCQlyeF9zdGF0dXMtPmVuY29kaW5nID0gUlhfRU5DX1ZIVDsKKwkJcnhf c3RhdHVzLT5yYXRlX2lkeCA9IHJhdGVfbWNzOworCQlpZiAocmF0ZV9tY3MgPiBBVEgxMktfVkhU X01DU19NQVgpIHsKKwkJCWF0aDEya193YXJuKGFyLT5hYiwKKwkJCQkgICAgIlJlY2VpdmVkIHdp dGggaW52YWxpZCBtY3MgaW4gVkhUIG1vZGUgJWRcbiIsCisJCQkJICAgICByYXRlX21jcyk7CisJ CQlicmVhazsKKwkJfQorCQlyeF9zdGF0dXMtPm5zcyA9IG5zczsKKwkJaWYgKHNnaSkKKwkJCXJ4 X3N0YXR1cy0+ZW5jX2ZsYWdzIHw9IFJYX0VOQ19GTEFHX1NIT1JUX0dJOworCQlyeF9zdGF0dXMt PmJ3ID0gYXRoMTJrX21hY19id190b19tYWM4MDIxMV9idyhidyk7CisJCWJyZWFrOworCWNhc2Ug UlhfTVNEVV9TVEFSVF9QS1RfVFlQRV8xMUFYOgorCQlyeF9zdGF0dXMtPnJhdGVfaWR4ID0gcmF0 ZV9tY3M7CisJCWlmIChyYXRlX21jcyA+IEFUSDEyS19IRV9NQ1NfTUFYKSB7CisJCQlhdGgxMmtf d2Fybihhci0+YWIsCisJCQkJICAgICJSZWNlaXZlZCB3aXRoIGludmFsaWQgbWNzIGluIEhFIG1v ZGUgJWRcbiIsCisJCQkJICAgIHJhdGVfbWNzKTsKKwkJCWJyZWFrOworCQl9CisJCXJ4X3N0YXR1 cy0+ZW5jb2RpbmcgPSBSWF9FTkNfSEU7CisJCXJ4X3N0YXR1cy0+bnNzID0gbnNzOworCQlyeF9z dGF0dXMtPmhlX2dpID0gYXRoMTJrX2hlX2dpX3RvX25sODAyMTFfaGVfZ2koc2dpKTsKKwkJcnhf c3RhdHVzLT5idyA9IGF0aDEya19tYWNfYndfdG9fbWFjODAyMTFfYncoYncpOworCQlicmVhazsK Kwl9Cit9CisKK3ZvaWQgYXRoMTJrX2RwX3J4X2hfcHBkdShzdHJ1Y3QgYXRoMTJrICphciwgc3Ry dWN0IGhhbF9yeF9kZXNjICpyeF9kZXNjLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVz ICpyeF9zdGF0dXMpCit7CisJc3RydWN0IGF0aDEya19iYXNlICphYiA9IGFyLT5hYjsKKwl1OCBj aGFubmVsX251bTsKKwl1MzIgY2VudGVyX2ZyZXEsIG1ldGFfZGF0YTsKKwlzdHJ1Y3QgaWVlZTgw MjExX2NoYW5uZWwgKmNoYW5uZWw7CisKKwlyeF9zdGF0dXMtPmZyZXEgPSAwOworCXJ4X3N0YXR1 cy0+cmF0ZV9pZHggPSAwOworCXJ4X3N0YXR1cy0+bnNzID0gMDsKKwlyeF9zdGF0dXMtPmVuY29k aW5nID0gUlhfRU5DX0xFR0FDWTsKKwlyeF9zdGF0dXMtPmJ3ID0gUkFURV9JTkZPX0JXXzIwOwor CXJ4X3N0YXR1cy0+ZW5jX2ZsYWdzID0gMDsKKworCXJ4X3N0YXR1cy0+ZmxhZyB8PSBSWF9GTEFH X05PX1NJR05BTF9WQUw7CisKKwltZXRhX2RhdGEgPSBhdGgxMmtfZHBfcnhfaF9mcmVxKGFiLCBy eF9kZXNjKTsKKwljaGFubmVsX251bSA9IG1ldGFfZGF0YTsKKwljZW50ZXJfZnJlcSA9IG1ldGFf ZGF0YSA+PiAxNjsKKworCWlmIChjZW50ZXJfZnJlcSA+PSA1OTM1ICYmIGNlbnRlcl9mcmVxIDw9 IDcxMDUpIHsKKwkJcnhfc3RhdHVzLT5iYW5kID0gTkw4MDIxMV9CQU5EXzZHSFo7CisJfSBlbHNl IGlmIChjaGFubmVsX251bSA+PSAxICYmIGNoYW5uZWxfbnVtIDw9IDE0KSB7CisJCXJ4X3N0YXR1 cy0+YmFuZCA9IE5MODAyMTFfQkFORF8yR0haOworCX0gZWxzZSBpZiAoY2hhbm5lbF9udW0gPj0g MzYgJiYgY2hhbm5lbF9udW0gPD0gMTczKSB7CisJCXJ4X3N0YXR1cy0+YmFuZCA9IE5MODAyMTFf QkFORF81R0haOworCX0gZWxzZSB7CisJCXNwaW5fbG9ja19iaCgmYXItPmRhdGFfbG9jayk7CisJ CWNoYW5uZWwgPSBhci0+cnhfY2hhbm5lbDsKKwkJaWYgKGNoYW5uZWwpIHsKKwkJCXJ4X3N0YXR1 cy0+YmFuZCA9IGNoYW5uZWwtPmJhbmQ7CisJCQljaGFubmVsX251bSA9CisJCQkJaWVlZTgwMjEx X2ZyZXF1ZW5jeV90b19jaGFubmVsKGNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKKwkJfQorCQlzcGlu X3VubG9ja19iaCgmYXItPmRhdGFfbG9jayk7CisJCWF0aDEya19kYmdfZHVtcChhci0+YWIsIEFU SDEyS19EQkdfREFUQSwgTlVMTCwgInJ4X2Rlc2M6ICIsCisJCQkJcnhfZGVzYywgc2l6ZW9mKCpy eF9kZXNjKSk7CisJfQorCisJcnhfc3RhdHVzLT5mcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9f ZnJlcXVlbmN5KGNoYW5uZWxfbnVtLAorCQkJCQkJCSByeF9zdGF0dXMtPmJhbmQpOworCisJYXRo MTJrX2RwX3J4X2hfcmF0ZShhciwgcnhfZGVzYywgcnhfc3RhdHVzKTsKK30KKworc3RhdGljIHZv aWQgYXRoMTJrX2RwX3J4X2RlbGl2ZXJfbXNkdShzdHJ1Y3QgYXRoMTJrICphciwgc3RydWN0IG5h cGlfc3RydWN0ICpuYXBpLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICptc2R1LAorCQkJCSAg ICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0dXMpCit7CisJc3RydWN0IGF0aDEy a19iYXNlICphYiA9IGFyLT5hYjsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYWRp b3RhcF9oZSBrbm93biA9IHsKKwkJLmRhdGExID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1JBRElP VEFQX0hFX0RBVEExX0RBVEFfTUNTX0tOT1dOIHwKKwkJCQkgICAgIElFRUU4MDIxMV9SQURJT1RB UF9IRV9EQVRBMV9CV19SVV9BTExPQ19LTk9XTiksCisJCS5kYXRhMiA9IGNwdV90b19sZTE2KElF RUU4MDIxMV9SQURJT1RBUF9IRV9EQVRBMl9HSV9LTk9XTiksCisJfTsKKwlzdHJ1Y3QgaWVlZTgw MjExX3JhZGlvdGFwX2hlICpoZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqcnhfc3Rh dHVzOworCXN0cnVjdCBpZWVlODAyMTFfc3RhICpwdWJzdGE7CisJc3RydWN0IGF0aDEya19wZWVy ICpwZWVyOworCXN0cnVjdCBhdGgxMmtfc2tiX3J4Y2IgKnJ4Y2IgPSBBVEgxMktfU0tCX1JYQ0Io bXNkdSk7CisJdTggZGVjYXAgPSBEUF9SWF9ERUNBUF9UWVBFX1JBVzsKKwlib29sIGlzX21jYmMg PSByeGNiLT5pc19tY2JjOworCWJvb2wgaXNfZWFwb2wgPSByeGNiLT5pc19lYXBvbDsKKworCWlm IChzdGF0dXMtPmVuY29kaW5nID09IFJYX0VOQ19IRSAmJiAhKHN0YXR1cy0+ZmxhZyAmIFJYX0ZM QUdfUkFESU9UQVBfSEUpICYmCisJICAgICEoc3RhdHVzLT5mbGFnICYgUlhfRkxBR19TS0lQX01P TklUT1IpKSB7CisJCWhlID0gc2tiX3B1c2gobXNkdSwgc2l6ZW9mKGtub3duKSk7CisJCW1lbWNw eShoZSwgJmtub3duLCBzaXplb2Yoa25vd24pKTsKKwkJc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdf UkFESU9UQVBfSEU7CisJfQorCisJaWYgKCEoc3RhdHVzLT5mbGFnICYgUlhfRkxBR19PTkxZX01P TklUT1IpKQorCQlkZWNhcCA9IGF0aDEya19kcF9yeF9oX2RlY2FwX3R5cGUoYWIsIHJ4Y2ItPnJ4 X2Rlc2MpOworCisJc3Bpbl9sb2NrX2JoKCZhYi0+YmFzZV9sb2NrKTsKKwlwZWVyID0gYXRoMTJr X2RwX3J4X2hfZmluZF9wZWVyKGFiLCBtc2R1KTsKKworCXB1YnN0YSA9IHBlZXIgPyBwZWVyLT5z dGEgOiBOVUxMOworCisJc3Bpbl91bmxvY2tfYmgoJmFiLT5iYXNlX2xvY2spOworCisJYXRoMTJr X2RiZyhhYiwgQVRIMTJLX0RCR19EQVRBLAorCQkgICAicnggc2tiICVwSyBsZW4gJXUgcGVlciAl cE0gJWQgJXMgc24gJXUgJXMlcyVzJXMlcyVzJXMlcyByYXRlX2lkeCAldSB2aHRfbnNzICV1IGZy ZXEgJXUgYmFuZCAldSBmbGFnIDB4JXggZmNzLWVyciAlaSBtaWMtZXJyICVpIGFtc2R1LW1vcmUg JWlcbiIsCisJCSAgIG1zZHUsCisJCSAgIG1zZHUtPmxlbiwKKwkJICAgcGVlciA/IHBlZXItPmFk ZHIgOiBOVUxMLAorCQkgICByeGNiLT50aWQsCisJCSAgIGlzX21jYmMgPyAibWNhc3QiIDogInVj YXN0IiwKKwkJICAgYXRoMTJrX2RwX3J4X2hfc2VxX25vKGFiLCByeGNiLT5yeF9kZXNjKSwKKwkJ ICAgKHN0YXR1cy0+ZW5jb2RpbmcgPT0gUlhfRU5DX0xFR0FDWSkgPyAibGVnYWN5IiA6ICIiLAor CQkgICAoc3RhdHVzLT5lbmNvZGluZyA9PSBSWF9FTkNfSFQpID8gImh0IiA6ICIiLAorCQkgICAo c3RhdHVzLT5lbmNvZGluZyA9PSBSWF9FTkNfVkhUKSA/ICJ2aHQiIDogIiIsCisJCSAgIChzdGF0 dXMtPmVuY29kaW5nID09IFJYX0VOQ19IRSkgPyAiaGUiIDogIiIsCisJCSAgIChzdGF0dXMtPmJ3 ID09IFJBVEVfSU5GT19CV180MCkgPyAiNDAiIDogIiIsCisJCSAgIChzdGF0dXMtPmJ3ID09IFJB VEVfSU5GT19CV184MCkgPyAiODAiIDogIiIsCisJCSAgIChzdGF0dXMtPmJ3ID09IFJBVEVfSU5G T19CV18xNjApID8gIjE2MCIgOiAiIiwKKwkJICAgc3RhdHVzLT5lbmNfZmxhZ3MgJiBSWF9FTkNf RkxBR19TSE9SVF9HSSA/ICJzZ2kgIiA6ICIiLAorCQkgICBzdGF0dXMtPnJhdGVfaWR4LAorCQkg ICBzdGF0dXMtPm5zcywKKwkJICAgc3RhdHVzLT5mcmVxLAorCQkgICBzdGF0dXMtPmJhbmQsIHN0 YXR1cy0+ZmxhZywKKwkJICAgISEoc3RhdHVzLT5mbGFnICYgUlhfRkxBR19GQUlMRURfRkNTX0NS QyksCisJCSAgICEhKHN0YXR1cy0+ZmxhZyAmIFJYX0ZMQUdfTU1JQ19FUlJPUiksCisJCSAgICEh KHN0YXR1cy0+ZmxhZyAmIFJYX0ZMQUdfQU1TRFVfTU9SRSkpOworCisJYXRoMTJrX2RiZ19kdW1w KGFiLCBBVEgxMktfREJHX0RQX1JYLCBOVUxMLCAiZHAgcnggbXNkdTogIiwKKwkJCW1zZHUtPmRh dGEsIG1zZHUtPmxlbik7CisKKwlyeF9zdGF0dXMgPSBJRUVFODAyMTFfU0tCX1JYQ0IobXNkdSk7 CisJKnJ4X3N0YXR1cyA9ICpzdGF0dXM7CisKKwkvKiBUT0RPOiB0cmFjZSByeCBwYWNrZXQgKi8K KworCS8qIFBOIGZvciBtdWx0aWNhc3QgcGFja2V0cyBhcmUgbm90IHZhbGlkYXRlIGluIEhXLAor CSAqIHNvIHNraXAgODAyLjMgcnggcGF0aAorCSAqIEFsc28sIGZhc3RfcnggZXhwZWN0ZXMgdGhl IFNUQSB0byBiZSBhdXRob3JpemVkLCBoZW5jZQorCSAqIGVhcG9sIHBhY2tldHMgYXJlIHNlbnQg aW4gc2xvdyBwYXRoLgorCSAqLworCWlmIChkZWNhcCA9PSBEUF9SWF9ERUNBUF9UWVBFX0VUSEVS TkVUMl9ESVggJiYgIWlzX2VhcG9sICYmCisJICAgICEoaXNfbWNiYyAmJiByeF9zdGF0dXMtPmZs YWcgJiBSWF9GTEFHX0RFQ1JZUFRFRCkpCisJCXJ4X3N0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHXzgw MjM7CisKKwlpZWVlODAyMTFfcnhfbmFwaShhci0+aHcsIHB1YnN0YSwgbXNkdSwgbmFwaSk7Cit9 CisKK3N0YXRpYyBpbnQgYXRoMTJrX2RwX3J4X3Byb2Nlc3NfbXNkdShzdHJ1Y3QgYXRoMTJrICph ciwKKwkJCQkgICAgIHN0cnVjdCBza19idWZmICptc2R1LAorCQkJCSAgICAgc3RydWN0IHNrX2J1 ZmZfaGVhZCAqbXNkdV9saXN0LAorCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMg KnJ4X3N0YXR1cykKK3sKKwlzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiID0gYXItPmFiOworCXN0cnVj dCBoYWxfcnhfZGVzYyAqcnhfZGVzYywgKmxyeF9kZXNjOworCXN0cnVjdCBhdGgxMmtfc2tiX3J4 Y2IgKnJ4Y2I7CisJc3RydWN0IHNrX2J1ZmYgKmxhc3RfYnVmOworCXU4IGwzX3BhZF9ieXRlczsK Kwl1MTYgbXNkdV9sZW47CisJaW50IHJldDsKKwl1MzIgaGFsX3J4X2Rlc2Nfc3ogPSBhci0+YWIt Pmh3X3BhcmFtcy0+aGFsX2Rlc2Nfc3o7CisKKwlsYXN0X2J1ZiA9IGF0aDEya19kcF9yeF9nZXRf bXNkdV9sYXN0X2J1Zihtc2R1X2xpc3QsIG1zZHUpOworCWlmICghbGFzdF9idWYpIHsKKwkJYXRo MTJrX3dhcm4oYWIsCisJCQkgICAgIk5vIHZhbGlkIFJ4IGJ1ZmZlciB0byBhY2Nlc3MgTVNEVV9F TkQgdGx2XG4iKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBmcmVlX291dDsKKwl9CisKKwlyeF9k ZXNjID0gKHN0cnVjdCBoYWxfcnhfZGVzYyAqKW1zZHUtPmRhdGE7CisJbHJ4X2Rlc2MgPSAoc3Ry dWN0IGhhbF9yeF9kZXNjICopbGFzdF9idWYtPmRhdGE7CisJaWYgKCFhdGgxMmtfZHBfcnhfaF9t c2R1X2RvbmUoYWIsIGxyeF9kZXNjKSkgeworCQlhdGgxMmtfd2FybihhYiwgIm1zZHVfZG9uZSBi aXQgaW4gbXNkdV9lbmQgaXMgbm90IHNldFxuIik7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZnJl ZV9vdXQ7CisJfQorCisJcnhjYiA9IEFUSDEyS19TS0JfUlhDQihtc2R1KTsKKwlyeGNiLT5yeF9k ZXNjID0gcnhfZGVzYzsKKwltc2R1X2xlbiA9IGF0aDEya19kcF9yeF9oX21zZHVfbGVuKGFiLCBs cnhfZGVzYyk7CisJbDNfcGFkX2J5dGVzID0gYXRoMTJrX2RwX3J4X2hfbDNwYWQoYWIsIGxyeF9k ZXNjKTsKKworCWlmIChyeGNiLT5pc19mcmFnKSB7CisJCXNrYl9wdWxsKG1zZHUsIGhhbF9yeF9k ZXNjX3N6KTsKKwl9IGVsc2UgaWYgKCFyeGNiLT5pc19jb250aW51YXRpb24pIHsKKwkJaWYgKCht c2R1X2xlbiArIGhhbF9yeF9kZXNjX3N6KSA+IERQX1JYX0JVRkZFUl9TSVpFKSB7CisJCQlyZXQg PSAtRUlOVkFMOworCQkJYXRoMTJrX3dhcm4oYWIsICJpbnZhbGlkIG1zZHUgbGVuICV1XG4iLCBt c2R1X2xlbik7CisJCQlhdGgxMmtfZGJnX2R1bXAoYWIsIEFUSDEyS19EQkdfREFUQSwgTlVMTCwg IiIsIHJ4X2Rlc2MsCisJCQkJCXNpemVvZigqcnhfZGVzYykpOworCQkJZ290byBmcmVlX291dDsK KwkJfQorCQlza2JfcHV0KG1zZHUsIGhhbF9yeF9kZXNjX3N6ICsgbDNfcGFkX2J5dGVzICsgbXNk dV9sZW4pOworCQlza2JfcHVsbChtc2R1LCBoYWxfcnhfZGVzY19zeiArIGwzX3BhZF9ieXRlcyk7 CisJfSBlbHNlIHsKKwkJcmV0ID0gYXRoMTJrX2RwX3J4X21zZHVfY29hbGVzY2UoYXIsIG1zZHVf bGlzdCwKKwkJCQkJCSBtc2R1LCBsYXN0X2J1ZiwKKwkJCQkJCSBsM19wYWRfYnl0ZXMsIG1zZHVf bGVuKTsKKwkJaWYgKHJldCkgeworCQkJYXRoMTJrX3dhcm4oYWIsCisJCQkJICAgICJmYWlsZWQg dG8gY29hbGVzY2UgbXNkdSByeCBidWZmZXIlZFxuIiwgcmV0KTsKKwkJCWdvdG8gZnJlZV9vdXQ7 CisJCX0KKwl9CisKKwlhdGgxMmtfZHBfcnhfaF9wcGR1KGFyLCByeF9kZXNjLCByeF9zdGF0dXMp OworCWF0aDEya19kcF9yeF9oX21wZHUoYXIsIG1zZHUsIHJ4X2Rlc2MsIHJ4X3N0YXR1cyk7CisK KwlyeF9zdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19TS0lQX01PTklUT1IgfCBSWF9GTEFHX0RVUF9W QUxJREFURUQ7CisKKwlyZXR1cm4gMDsKKworZnJlZV9vdXQ6CisJcmV0dXJuIHJldDsKK30KKwor c3RhdGljIHZvaWQgYXRoMTJrX2RwX3J4X3Byb2Nlc3NfcmVjZWl2ZWRfcGFja2V0cyhzdHJ1Y3Qg YXRoMTJrX2Jhc2UgKmFiLAorCQkJCQkJICBzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksCisJCQkJ CQkgIHN0cnVjdCBza19idWZmX2hlYWQgKm1zZHVfbGlzdCwKKwkJCQkJCSAgaW50IHJpbmdfaWQp Cit7CisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgcnhfc3RhdHVzID0gezB9OworCXN0cnVj dCBhdGgxMmtfc2tiX3J4Y2IgKnJ4Y2I7CisJc3RydWN0IHNrX2J1ZmYgKm1zZHU7CisJc3RydWN0 IGF0aDEyayAqYXI7CisJdTggbWFjX2lkOworCWludCByZXQ7CisKKwlpZiAoc2tiX3F1ZXVlX2Vt cHR5KG1zZHVfbGlzdCkpCisJCXJldHVybjsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCXdoaWxl ICgobXNkdSA9IF9fc2tiX2RlcXVldWUobXNkdV9saXN0KSkpIHsKKwkJcnhjYiA9IEFUSDEyS19T S0JfUlhDQihtc2R1KTsKKwkJbWFjX2lkID0gcnhjYi0+bWFjX2lkOworCQlhciA9IGFiLT5wZGV2 c1ttYWNfaWRdLmFyOworCQlpZiAoIXJjdV9kZXJlZmVyZW5jZShhYi0+cGRldnNfYWN0aXZlW21h Y19pZF0pKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShtc2R1KTsKKwkJCWNvbnRpbnVlOworCQl9 CisKKwkJaWYgKHRlc3RfYml0KEFUSDEyS19DQUNfUlVOTklORywgJmFyLT5kZXZfZmxhZ3MpKSB7 CisJCQlkZXZfa2ZyZWVfc2tiX2FueShtc2R1KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmV0 ID0gYXRoMTJrX2RwX3J4X3Byb2Nlc3NfbXNkdShhciwgbXNkdSwgbXNkdV9saXN0LCAmcnhfc3Rh dHVzKTsKKwkJaWYgKHJldCkgeworCQkJYXRoMTJrX2RiZyhhYiwgQVRIMTJLX0RCR19EQVRBLAor CQkJCSAgICJVbmFibGUgdG8gcHJvY2VzcyBtc2R1ICVkIiwgcmV0KTsKKwkJCWRldl9rZnJlZV9z a2JfYW55KG1zZHUpOworCQkJY29udGludWU7CisJCX0KKworCQlhdGgxMmtfZHBfcnhfZGVsaXZl cl9tc2R1KGFyLCBuYXBpLCBtc2R1LCAmcnhfc3RhdHVzKTsKKwl9CisKKwlyY3VfcmVhZF91bmxv Y2soKTsKK30KKworaW50IGF0aDEya19kcF9yeF9wcm9jZXNzKHN0cnVjdCBhdGgxMmtfYmFzZSAq YWIsIGludCByaW5nX2lkLAorCQkJIHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdl dCkKK3sKKwlzdHJ1Y3QgYXRoMTJrX3J4X2Rlc2NfaW5mbyAqZGVzY19pbmZvOworCXN0cnVjdCBh dGgxMmtfZHAgKmRwID0gJmFiLT5kcDsKKwlzdHJ1Y3QgZHBfcnhkbWFfcmluZyAqcnhfcmluZyA9 ICZkcC0+cnhfcmVmaWxsX2J1Zl9yaW5nOworCXN0cnVjdCBoYWxfcmVvX2Rlc3RfcmluZyAqZGVz YzsKKwlpbnQgbnVtX2J1ZmZzX3JlYXBlZCA9IDA7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBtc2R1 X2xpc3Q7CisJc3RydWN0IGF0aDEya19za2JfcnhjYiAqcnhjYjsKKwlpbnQgdG90YWxfbXNkdV9y ZWFwZWQgPSAwOworCXN0cnVjdCBoYWxfc3JuZyAqc3JuZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXNk dTsKKwlib29sIGRvbmUgPSBmYWxzZTsKKwlpbnQgbWFjX2lkOworCWludCBpOworCXU2NCBkZXNj X3ZhOworCisJX19za2JfcXVldWVfaGVhZF9pbml0KCZtc2R1X2xpc3QpOworCisJc3JuZyA9ICZh Yi0+aGFsLnNybmdfbGlzdFtkcC0+cmVvX2RzdF9yaW5nW3JpbmdfaWRdLnJpbmdfaWRdOworCisJ c3Bpbl9sb2NrX2JoKCZzcm5nLT5sb2NrKTsKKwordHJ5X2FnYWluOgorCWF0aDEya19oYWxfc3Ju Z19hY2Nlc3NfYmVnaW4oYWIsIHNybmcpOworCisJd2hpbGUgKChkZXNjID0gYXRoMTJrX2hhbF9z cm5nX2RzdF9nZXRfbmV4dF9lbnRyeShhYiwgc3JuZykpKSB7CisJCWVudW0gaGFsX3Jlb19kZXN0 X3JpbmdfcHVzaF9yZWFzb24gcHVzaF9yZWFzb247CisJCXUzMiBjb29raWU7CisKKwkJY29va2ll ID0gbGUzMl9nZXRfYml0cyhkZXNjLT5idWZfYWRkcl9pbmZvLmluZm8xLAorCQkJCSAgICAgICBC VUZGRVJfQUREUl9JTkZPMV9TV19DT09LSUUpOworCisJCW1hY19pZCA9IGxlMzJfZ2V0X2JpdHMo ZGVzYy0+aW5mbzAsCisJCQkJICAgICAgIEhBTF9SRU9fREVTVF9SSU5HX0lORk8wX1NSQ19MSU5L X0lEKTsKKworCQlkZXNjX3ZhID0gKCh1NjQpbGUzMl90b19jcHUoZGVzYy0+YnVmX3ZhX2hpKSA8 PCAzMiB8CisJCQkgICBsZTMyX3RvX2NwdShkZXNjLT5idWZfdmFfbG8pKTsKKwkJZGVzY19pbmZv ID0gKHN0cnVjdCBhdGgxMmtfcnhfZGVzY19pbmZvICopKCh1bnNpZ25lZCBsb25nKWRlc2NfdmEp OworCisJCS8qIHJldHJ5IG1hbnVhbCBkZXNjIHJldHJpZXZhbCAqLworCQlpZiAoIWRlc2NfaW5m bykgeworCQkJZGVzY19pbmZvID0gYXRoMTJrX2RwX2dldF9yeF9kZXNjKGFiLCBjb29raWUpOwor CQkJaWYgKCFkZXNjX2luZm8pIHsKKwkJCQlhdGgxMmtfd2FybihhYiwgIkludmFsaWQgY29va2ll IGluIG1hbnVhbCBkZXNjIHJldHJpdmFsIik7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwor CQlpZiAoZGVzY19pbmZvLT5tYWdpYyAhPSBBVEgxMktfRFBfUlhfREVTQ19NQUdJQykKKwkJCWF0 aDEya193YXJuKGFiLCAiQ2hlY2sgSFcgQ0MgaW1wbGVtZW50YXRpb24iKTsKKworCQltc2R1ID0g ZGVzY19pbmZvLT5za2I7CisJCWRlc2NfaW5mby0+c2tiID0gTlVMTDsKKworCQlzcGluX2xvY2tf YmgoJmRwLT5yeF9kZXNjX2xvY2spOworCQlsaXN0X21vdmVfdGFpbCgmZGVzY19pbmZvLT5saXN0 LCAmZHAtPnJ4X2Rlc2NfZnJlZV9saXN0KTsKKwkJc3Bpbl91bmxvY2tfYmgoJmRwLT5yeF9kZXNj X2xvY2spOworCisJCXJ4Y2IgPSBBVEgxMktfU0tCX1JYQ0IobXNkdSk7CisJCWRtYV91bm1hcF9z aW5nbGUoYWItPmRldiwgcnhjYi0+cGFkZHIsCisJCQkJIG1zZHUtPmxlbiArIHNrYl90YWlscm9v bShtc2R1KSwKKwkJCQkgRE1BX0ZST01fREVWSUNFKTsKKworCQludW1fYnVmZnNfcmVhcGVkKys7 CisKKwkJcHVzaF9yZWFzb24gPSBsZTMyX2dldF9iaXRzKGRlc2MtPmluZm8wLAorCQkJCQkgICAg SEFMX1JFT19ERVNUX1JJTkdfSU5GTzBfUFVTSF9SRUFTT04pOworCQlpZiAocHVzaF9yZWFzb24g IT0KKwkJICAgIEhBTF9SRU9fREVTVF9SSU5HX1BVU0hfUkVBU09OX1JPVVRJTkdfSU5TVFJVQ1RJ T04pIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KG1zZHUpOworCQkJYWItPnNvY19zdGF0cy5oYWxf cmVvX2Vycm9yW2RwLT5yZW9fZHN0X3JpbmdbcmluZ19pZF0ucmluZ19pZF0rKzsKKwkJCWNvbnRp bnVlOworCQl9CisKKwkJcnhjYi0+aXNfZmlyc3RfbXNkdSA9ICEhKGxlMzJfdG9fY3B1KGRlc2Mt PnJ4X21zZHVfaW5mby5pbmZvMCkgJgorCQkJCQkgUlhfTVNEVV9ERVNDX0lORk8wX0ZJUlNUX01T RFVfSU5fTVBEVSk7CisJCXJ4Y2ItPmlzX2xhc3RfbXNkdSA9ICEhKGxlMzJfdG9fY3B1KGRlc2Mt PnJ4X21zZHVfaW5mby5pbmZvMCkgJgorCQkJCQlSWF9NU0RVX0RFU0NfSU5GTzBfTEFTVF9NU0RV X0lOX01QRFUpOworCQlyeGNiLT5pc19jb250aW51YXRpb24gPSAhIShsZTMyX3RvX2NwdShkZXNj LT5yeF9tc2R1X2luZm8uaW5mbzApICYKKwkJCQkJICAgUlhfTVNEVV9ERVNDX0lORk8wX01TRFVf Q09OVElOVUFUSU9OKTsKKwkJcnhjYi0+bWFjX2lkID0gbWFjX2lkOworCQlyeGNiLT5wZWVyX2lk ID0gbGUzMl9nZXRfYml0cyhkZXNjLT5yeF9tcGR1X2luZm8ucGVlcl9tZXRhX2RhdGEsCisJCQkJ CSAgICAgIFJYX01QRFVfREVTQ19NRVRBX0RBVEFfUEVFUl9JRCk7CisJCXJ4Y2ItPnRpZCA9IGxl MzJfZ2V0X2JpdHMoZGVzYy0+cnhfbXBkdV9pbmZvLmluZm8wLAorCQkJCQkgIFJYX01QRFVfREVT Q19JTkZPMF9USUQpOworCisJCV9fc2tiX3F1ZXVlX3RhaWwoJm1zZHVfbGlzdCwgbXNkdSk7CisK KwkJaWYgKCFyeGNiLT5pc19jb250aW51YXRpb24pIHsKKwkJCXRvdGFsX21zZHVfcmVhcGVkKys7 CisJCQlkb25lID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCWRvbmUgPSBmYWxzZTsKKwkJfQorCisJ CWlmICh0b3RhbF9tc2R1X3JlYXBlZCA+PSBidWRnZXQpCisJCQlicmVhazsKKwl9CisKKwkvKiBI dyBtaWdodCBoYXZlIHVwZGF0ZWQgdGhlIGhlYWQgcG9pbnRlciBhZnRlciB3ZSBjYWNoZWQgaXQu CisJICogSW4gdGhpcyBjYXNlLCBldmVuIHRob3VnaCB0aGVyZSBhcmUgZW50cmllcyBpbiB0aGUg cmluZyB3ZSdsbAorCSAqIGdldCByeF9kZXNjIE5VTEwuIEdpdmUgdGhlIHJlYWQgYW5vdGhlciB0 cnkgd2l0aCB1cGRhdGVkIGNhY2hlZAorCSAqIGhlYWQgcG9pbnRlciBzbyB0aGF0IHdlIGNhbiBy ZWFwIGNvbXBsZXRlIE1QRFUgaW4gdGhlIGN1cnJlbnQKKwkgKiByeCBwcm9jZXNzaW5nLgorCSAq LworCWlmICghZG9uZSAmJiBhdGgxMmtfaGFsX3NybmdfZHN0X251bV9mcmVlKGFiLCBzcm5nLCB0 cnVlKSkgeworCQlhdGgxMmtfaGFsX3NybmdfYWNjZXNzX2VuZChhYiwgc3JuZyk7CisJCWdvdG8g dHJ5X2FnYWluOworCX0KKworCWF0aDEya19oYWxfc3JuZ19hY2Nlc3NfZW5kKGFiLCBzcm5nKTsK KworCXNwaW5fdW5sb2NrX2JoKCZzcm5nLT5sb2NrKTsKKworCWlmICghdG90YWxfbXNkdV9yZWFw ZWQpCisJCWdvdG8gZXhpdDsKKworCS8qIFRPRE86IE1vdmUgdG8gaW1wbGljaXQgQk0/ICovCisJ YXRoMTJrX2RwX3J4X2J1ZnNfcmVwbGVuaXNoKGFiLCBpLCByeF9yaW5nLCBudW1fYnVmZnNfcmVh cGVkLAorCQkJCSAgICBhYi0+aHdfcGFyYW1zLT5oYWxfcGFyYW1zLT5yeF9idWZfcmJtLCB0cnVl KTsKKworCWF0aDEya19kcF9yeF9wcm9jZXNzX3JlY2VpdmVkX3BhY2tldHMoYWIsIG5hcGksICZt c2R1X2xpc3QsCisJCQkJCSAgICAgIHJpbmdfaWQpOworCitleGl0OgorCXJldHVybiB0b3RhbF9t c2R1X3JlYXBlZDsKK30KKworc3RhdGljIHZvaWQgYXRoMTJrX2RwX3J4X2ZyYWdfdGltZXIoc3Ry dWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCXN0cnVjdCBhdGgxMmtfZHBfcnhfdGlkICpyeF90 aWQgPSBmcm9tX3RpbWVyKHJ4X3RpZCwgdGltZXIsIGZyYWdfdGltZXIpOworCisJc3Bpbl9sb2Nr X2JoKCZyeF90aWQtPmFiLT5iYXNlX2xvY2spOworCWlmIChyeF90aWQtPmxhc3RfZnJhZ19ubyAm JgorCSAgICByeF90aWQtPnJ4X2ZyYWdfYml0bWFwID09IEdFTk1BU0socnhfdGlkLT5sYXN0X2Zy YWdfbm8sIDApKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZyeF90aWQtPmFiLT5iYXNlX2xvY2spOwor CQlyZXR1cm47CisJfQorCWF0aDEya19kcF9yeF9mcmFnc19jbGVhbnVwKHJ4X3RpZCwgdHJ1ZSk7 CisJc3Bpbl91bmxvY2tfYmgoJnJ4X3RpZC0+YWItPmJhc2VfbG9jayk7Cit9CisKK2ludCBhdGgx MmtfZHBfcnhfcGVlcl9mcmFnX3NldHVwKHN0cnVjdCBhdGgxMmsgKmFyLCBjb25zdCB1OCAqcGVl cl9tYWMsIGludCB2ZGV2X2lkKQoreworCXN0cnVjdCBhdGgxMmtfYmFzZSAqYWIgPSBhci0+YWI7 CisJc3RydWN0IGNyeXB0b19zaGFzaCAqdGZtOworCXN0cnVjdCBhdGgxMmtfcGVlciAqcGVlcjsK KwlzdHJ1Y3QgYXRoMTJrX2RwX3J4X3RpZCAqcnhfdGlkOworCWludCBpOworCisJdGZtID0gY3J5 cHRvX2FsbG9jX3NoYXNoKCJtaWNoYWVsX21pYyIsIDAsIDApOworCWlmIChJU19FUlIodGZtKSkK KwkJcmV0dXJuIFBUUl9FUlIodGZtKTsKKworCXNwaW5fbG9ja19iaCgmYWItPmJhc2VfbG9jayk7 CisKKwlwZWVyID0gYXRoMTJrX3BlZXJfZmluZChhYiwgdmRldl9pZCwgcGVlcl9tYWMpOworCWlm ICghcGVlcikgeworCQlzcGluX3VubG9ja19iaCgmYWItPmJhc2VfbG9jayk7CisJCWF0aDEya193 YXJuKGFiLCAiZmFpbGVkIHRvIGZpbmQgdGhlIHBlZXIgdG8gc2V0IHVwIGZyYWdtZW50IGluZm9c biIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDw9IElFRUU4MDIx MV9OVU1fVElEUzsgaSsrKSB7CisJCXJ4X3RpZCA9ICZwZWVyLT5yeF90aWRbaV07CisJCXJ4X3Rp ZC0+YWIgPSBhYjsKKwkJdGltZXJfc2V0dXAoJnJ4X3RpZC0+ZnJhZ190aW1lciwgYXRoMTJrX2Rw X3J4X2ZyYWdfdGltZXIsIDApOworCQlza2JfcXVldWVfaGVhZF9pbml0KCZyeF90aWQtPnJ4X2Zy YWdzKTsKKwl9CisKKwlwZWVyLT50Zm1fbW1pYyA9IHRmbTsKKwlzcGluX3VubG9ja19iaCgmYWIt PmJhc2VfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGgxMmtfZHBfcnhf aF9taWNoYWVsX21pYyhzdHJ1Y3QgY3J5cHRvX3NoYXNoICp0Zm0sIHU4ICprZXksCisJCQkJICAg ICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwgdTggKmRhdGEsCisJCQkJICAgICAgc2l6ZV90 IGRhdGFfbGVuLCB1OCAqbWljKQoreworCVNIQVNIX0RFU0NfT05fU1RBQ0soZGVzYywgdGZtKTsK Kwl1OCBtaWNfaGRyWzE2XSA9IHswfTsKKwl1OCB0aWQgPSAwOworCWludCByZXQ7CisKKwlpZiAo IXRmbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXNjLT50Zm0gPSB0Zm07CisKKwlyZXQgPSBj cnlwdG9fc2hhc2hfc2V0a2V5KHRmbSwga2V5LCA4KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsK KworCXJldCA9IGNyeXB0b19zaGFzaF9pbml0KGRlc2MpOworCWlmIChyZXQpCisJCWdvdG8gb3V0 OworCisJLyogVEtJUCBNSUMgaGVhZGVyICovCisJbWVtY3B5KG1pY19oZHIsIGllZWU4MDIxMV9n ZXRfREEoaGRyKSwgRVRIX0FMRU4pOworCW1lbWNweShtaWNfaGRyICsgRVRIX0FMRU4sIGllZWU4 MDIxMV9nZXRfU0EoaGRyKSwgRVRIX0FMRU4pOworCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3Mo aGRyLT5mcmFtZV9jb250cm9sKSkKKwkJdGlkID0gaWVlZTgwMjExX2dldF90aWQoaGRyKTsKKwlt aWNfaGRyWzEyXSA9IHRpZDsKKworCXJldCA9IGNyeXB0b19zaGFzaF91cGRhdGUoZGVzYywgbWlj X2hkciwgMTYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXJldCA9IGNyeXB0b19zaGFzaF91 cGRhdGUoZGVzYywgZGF0YSwgZGF0YV9sZW4pOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXJl dCA9IGNyeXB0b19zaGFzaF9maW5hbChkZXNjLCBtaWMpOworb3V0OgorCXNoYXNoX2Rlc2NfemVy byhkZXNjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0aDEya19kcF9yeF9oX3Zl cmlmeV90a2lwX21pYyhzdHJ1Y3QgYXRoMTJrICphciwgc3RydWN0IGF0aDEya19wZWVyICpwZWVy LAorCQkJCQkgIHN0cnVjdCBza19idWZmICptc2R1KQoreworCXN0cnVjdCBhdGgxMmtfYmFzZSAq YWIgPSBhci0+YWI7CisJc3RydWN0IGhhbF9yeF9kZXNjICpyeF9kZXNjID0gKHN0cnVjdCBoYWxf cnhfZGVzYyAqKW1zZHUtPmRhdGE7CisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4cyA9 IElFRUU4MDIxMV9TS0JfUlhDQihtc2R1KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICpr ZXlfY29uZjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXU4IG1pY1tJRUVFODAyMTFf Q0NNUF9NSUNfTEVOXTsKKwlpbnQgaGVhZF9sZW4sIHRhaWxfbGVuLCByZXQ7CisJc2l6ZV90IGRh dGFfbGVuOworCXUzMiBoZHJfbGVuLCBoYWxfcnhfZGVzY19zeiA9IGFyLT5hYi0+aHdfcGFyYW1z LT5oYWxfZGVzY19zejsKKwl1OCAqa2V5LCAqZGF0YTsKKwl1OCBrZXlfaWR4OworCisJaWYgKGF0 aDEya19kcF9yeF9oX2VuY3R5cGUoYWIsIHJ4X2Rlc2MpICE9IEhBTF9FTkNSWVBUX1RZUEVfVEtJ UF9NSUMpCisJCXJldHVybiAwOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopKG1z ZHUtPmRhdGEgKyBoYWxfcnhfZGVzY19zeik7CisJaGRyX2xlbiA9IGllZWU4MDIxMV9oZHJsZW4o aGRyLT5mcmFtZV9jb250cm9sKTsKKwloZWFkX2xlbiA9IGhkcl9sZW4gKyBoYWxfcnhfZGVzY19z eiArIElFRUU4MDIxMV9US0lQX0lWX0xFTjsKKwl0YWlsX2xlbiA9IElFRUU4MDIxMV9DQ01QX01J Q19MRU4gKyBJRUVFODAyMTFfVEtJUF9JQ1ZfTEVOICsgRkNTX0xFTjsKKworCWlmICghaXNfbXVs dGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpCisJCWtleV9pZHggPSBwZWVyLT51Y2FzdF9r ZXlpZHg7CisJZWxzZQorCQlrZXlfaWR4ID0gcGVlci0+bWNhc3Rfa2V5aWR4OworCisJa2V5X2Nv bmYgPSBwZWVyLT5rZXlzW2tleV9pZHhdOworCisJZGF0YSA9IG1zZHUtPmRhdGEgKyBoZWFkX2xl bjsKKwlkYXRhX2xlbiA9IG1zZHUtPmxlbiAtIGhlYWRfbGVuIC0gdGFpbF9sZW47CisJa2V5ID0g JmtleV9jb25mLT5rZXlbTkw4MDIxMV9US0lQX0RBVEFfT0ZGU0VUX1JYX01JQ19LRVldOworCisJ cmV0ID0gYXRoMTJrX2RwX3J4X2hfbWljaGFlbF9taWMocGVlci0+dGZtX21taWMsIGtleSwgaGRy LCBkYXRhLCBkYXRhX2xlbiwgbWljKTsKKwlpZiAocmV0IHx8IG1lbWNtcChtaWMsIGRhdGEgKyBk YXRhX2xlbiwgSUVFRTgwMjExX0NDTVBfTUlDX0xFTikpCisJCWdvdG8gbWljX2ZhaWw7CisKKwly ZXR1cm4gMDsKKworbWljX2ZhaWw6CisJKEFUSDEyS19TS0JfUlhDQihtc2R1KSktPmlzX2ZpcnN0 X21zZHUgPSB0cnVlOworCShBVEgxMktfU0tCX1JYQ0IobXNkdSkpLT5pc19sYXN0X21zZHUgPSB0 cnVlOworCisJcnhzLT5mbGFnIHw9IFJYX0ZMQUdfTU1JQ19FUlJPUiB8IFJYX0ZMQUdfTU1JQ19T VFJJUFBFRCB8CisJCSAgICBSWF9GTEFHX0lWX1NUUklQUEVEIHwgUlhfRkxBR19ERUNSWVBURUQ7 CisJc2tiX3B1bGwobXNkdSwgaGFsX3J4X2Rlc2Nfc3opOworCisJYXRoMTJrX2RwX3J4X2hfcHBk dShhciwgcnhfZGVzYywgcnhzKTsKKwlhdGgxMmtfZHBfcnhfaF91bmRlY2FwKGFyLCBtc2R1LCBy eF9kZXNjLAorCQkJICAgICAgIEhBTF9FTkNSWVBUX1RZUEVfVEtJUF9NSUMsIHJ4cywgdHJ1ZSk7 CisJaWVlZTgwMjExX3J4KGFyLT5odywgbXNkdSk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0 YXRpYyB2b2lkIGF0aDEya19kcF9yeF9oX3VuZGVjYXBfZnJhZyhzdHJ1Y3QgYXRoMTJrICphciwg c3RydWN0IHNrX2J1ZmYgKm1zZHUsCisJCQkJCWVudW0gaGFsX2VuY3J5cHRfdHlwZSBlbmN0eXBl LCB1MzIgZmxhZ3MpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwlzaXplX3QgaGRy X2xlbjsKKwlzaXplX3QgY3J5cHRvX2xlbjsKKwl1MzIgaGFsX3J4X2Rlc2Nfc3ogPSBhci0+YWIt Pmh3X3BhcmFtcy0+aGFsX2Rlc2Nfc3o7CisKKwlpZiAoIWZsYWdzKQorCQlyZXR1cm47CisKKwlo ZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikobXNkdS0+ZGF0YSArIGhhbF9yeF9kZXNjX3N6 KTsKKworCWlmIChmbGFncyAmIFJYX0ZMQUdfTUlDX1NUUklQUEVEKQorCQlza2JfdHJpbShtc2R1 LCBtc2R1LT5sZW4gLQorCQkJIGF0aDEya19kcF9yeF9jcnlwdG9fbWljX2xlbihhciwgZW5jdHlw ZSkpOworCisJaWYgKGZsYWdzICYgUlhfRkxBR19JQ1ZfU1RSSVBQRUQpCisJCXNrYl90cmltKG1z ZHUsIG1zZHUtPmxlbiAtCisJCQkgYXRoMTJrX2RwX3J4X2NyeXB0b19pY3ZfbGVuKGFyLCBlbmN0 eXBlKSk7CisKKwlpZiAoZmxhZ3MgJiBSWF9GTEFHX0lWX1NUUklQUEVEKSB7CisJCWhkcl9sZW4g PSBpZWVlODAyMTFfaGRybGVuKGhkci0+ZnJhbWVfY29udHJvbCk7CisJCWNyeXB0b19sZW4gPSBh dGgxMmtfZHBfcnhfY3J5cHRvX3BhcmFtX2xlbihhciwgZW5jdHlwZSk7CisKKwkJbWVtbW92ZSht c2R1LT5kYXRhICsgaGFsX3J4X2Rlc2Nfc3ogKyBjcnlwdG9fbGVuLAorCQkJbXNkdS0+ZGF0YSAr IGhhbF9yeF9kZXNjX3N6LCBoZHJfbGVuKTsKKwkJc2tiX3B1bGwobXNkdSwgY3J5cHRvX2xlbik7 CisJfQorfQorCitzdGF0aWMgaW50IGF0aDEya19kcF9yeF9oX2RlZnJhZyhzdHJ1Y3QgYXRoMTJr ICphciwKKwkJCQkgc3RydWN0IGF0aDEya19wZWVyICpwZWVyLAorCQkJCSBzdHJ1Y3QgYXRoMTJr X2RwX3J4X3RpZCAqcnhfdGlkLAorCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqKmRlZnJhZ19za2IpCit7 CisJc3RydWN0IGF0aDEya19iYXNlICphYiA9IGFyLT5hYjsKKwlzdHJ1Y3QgaGFsX3J4X2Rlc2Mg KnJ4X2Rlc2M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKmZpcnN0X2ZyYWcsICpsYXN0X2ZyYWc7 CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwllbnVtIGhhbF9lbmNyeXB0X3R5cGUgZW5j dHlwZTsKKwlib29sIGlzX2RlY3J5cHRlZCA9IGZhbHNlOworCWludCBtc2R1X2xlbiA9IDA7CisJ aW50IGV4dHJhX3NwYWNlOworCXUzMiBmbGFncywgaGFsX3J4X2Rlc2Nfc3ogPSBhci0+YWItPmh3 X3BhcmFtcy0+aGFsX2Rlc2Nfc3o7CisKKwlmaXJzdF9mcmFnID0gc2tiX3BlZWsoJnJ4X3RpZC0+ cnhfZnJhZ3MpOworCWxhc3RfZnJhZyA9IHNrYl9wZWVrX3RhaWwoJnJ4X3RpZC0+cnhfZnJhZ3Mp OworCisJc2tiX3F1ZXVlX3dhbGsoJnJ4X3RpZC0+cnhfZnJhZ3MsIHNrYikgeworCQlmbGFncyA9 IDA7CisJCXJ4X2Rlc2MgPSAoc3RydWN0IGhhbF9yeF9kZXNjICopc2tiLT5kYXRhOworCQloZHIg PSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikoc2tiLT5kYXRhICsgaGFsX3J4X2Rlc2Nfc3opOwor CisJCWVuY3R5cGUgPSBhdGgxMmtfZHBfcnhfaF9lbmN0eXBlKGFiLCByeF9kZXNjKTsKKwkJaWYg KGVuY3R5cGUgIT0gSEFMX0VOQ1JZUFRfVFlQRV9PUEVOKQorCQkJaXNfZGVjcnlwdGVkID0gYXRo MTJrX2RwX3J4X2hfaXNfZGVjcnlwdGVkKGFiLAorCQkJCQkJCQkgICByeF9kZXNjKTsKKworCQlp ZiAoaXNfZGVjcnlwdGVkKSB7CisJCQlpZiAoc2tiICE9IGZpcnN0X2ZyYWcpCisJCQkJZmxhZ3Mg fD0gUlhfRkxBR19JVl9TVFJJUFBFRDsKKwkJCWlmIChza2IgIT0gbGFzdF9mcmFnKQorCQkJCWZs YWdzIHw9IFJYX0ZMQUdfSUNWX1NUUklQUEVEIHwKKwkJCQkJIFJYX0ZMQUdfTUlDX1NUUklQUEVE OworCQl9CisKKwkJLyogUlggZnJhZ21lbnRzIGFyZSBhbHdheXMgcmF3IHBhY2tldHMgKi8KKwkJ aWYgKHNrYiAhPSBsYXN0X2ZyYWcpCisJCQlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gRkNTX0xF Tik7CisJCWF0aDEya19kcF9yeF9oX3VuZGVjYXBfZnJhZyhhciwgc2tiLCBlbmN0eXBlLCBmbGFn cyk7CisKKwkJaWYgKHNrYiAhPSBmaXJzdF9mcmFnKQorCQkJc2tiX3B1bGwoc2tiLCBoYWxfcnhf ZGVzY19zeiArCisJCQkJICAgICAgaWVlZTgwMjExX2hkcmxlbihoZHItPmZyYW1lX2NvbnRyb2wp KTsKKwkJbXNkdV9sZW4gKz0gc2tiLT5sZW47CisJfQorCisJZXh0cmFfc3BhY2UgPSBtc2R1X2xl biAtIChEUF9SWF9CVUZGRVJfU0laRSArIHNrYl90YWlscm9vbShmaXJzdF9mcmFnKSk7CisJaWYg KGV4dHJhX3NwYWNlID4gMCAmJgorCSAgICAocHNrYl9leHBhbmRfaGVhZChmaXJzdF9mcmFnLCAw LCBleHRyYV9zcGFjZSwgR0ZQX0FUT01JQykgPCAwKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlf X3NrYl91bmxpbmsoZmlyc3RfZnJhZywgJnJ4X3RpZC0+cnhfZnJhZ3MpOworCXdoaWxlICgoc2ti ID0gX19za2JfZGVxdWV1ZSgmcnhfdGlkLT5yeF9mcmFncykpKSB7CisJCXNrYl9wdXRfZGF0YShm aXJzdF9mcmFnLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2ti KTsKKwl9CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikoZmlyc3RfZnJhZy0+ZGF0 YSArIGhhbF9yeF9kZXNjX3N6KTsKKwloZHItPmZyYW1lX2NvbnRyb2wgJj0gfl9fY3B1X3RvX2xl MTYoSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKTsKKwlBVEgxMktfU0tCX1JYQ0IoZmlyc3RfZnJh ZyktPmlzX2ZyYWcgPSAxOworCisJaWYgKGF0aDEya19kcF9yeF9oX3ZlcmlmeV90a2lwX21pYyhh ciwgcGVlciwgZmlyc3RfZnJhZykpCisJCWZpcnN0X2ZyYWcgPSBOVUxMOworCisJKmRlZnJhZ19z a2IgPSBmaXJzdF9mcmFnOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0aDEya19kcF9y eF9oX2RlZnJhZ19yZW9fcmVpbmplY3Qoc3RydWN0IGF0aDEyayAqYXIsCisJCQkJCSAgICAgIHN0 cnVjdCBhdGgxMmtfZHBfcnhfdGlkICpyeF90aWQsCisJCQkJCSAgICAgIHN0cnVjdCBza19idWZm ICpkZWZyYWdfc2tiKQoreworCXN0cnVjdCBhdGgxMmtfYmFzZSAqYWIgPSBhci0+YWI7CisJc3Ry dWN0IGF0aDEya19kcCAqZHAgPSAmYWItPmRwOworCXN0cnVjdCBoYWxfcnhfZGVzYyAqcnhfZGVz YyA9IChzdHJ1Y3QgaGFsX3J4X2Rlc2MgKilkZWZyYWdfc2tiLT5kYXRhOworCXN0cnVjdCBoYWxf cmVvX2VudHJhbmNlX3JpbmcgKnJlb19lbnRfcmluZzsKKwlzdHJ1Y3QgaGFsX3Jlb19kZXN0X3Jp bmcgKnJlb19kZXN0X3Jpbmc7CisJc3RydWN0IGRwX2xpbmtfZGVzY19iYW5rICpsaW5rX2Rlc2Nf YmFua3M7CisJc3RydWN0IGhhbF9yeF9tc2R1X2xpbmsgKm1zZHVfbGluazsKKwlzdHJ1Y3QgaGFs X3J4X21zZHVfZGV0YWlscyAqbXNkdTA7CisJc3RydWN0IGhhbF9zcm5nICpzcm5nOworCWRtYV9h ZGRyX3QgbGlua19wYWRkciwgYnVmX3BhZGRyOworCXUzMiBkZXNjX2JhbmssIG1zZHVfaW5mbywg bXNkdV9leHRfaW5mbywgbXBkdV9pbmZvOworCXUzMiBjb29raWUsIGhhbF9yeF9kZXNjX3N6LCBk ZXN0X3JpbmdfaW5mbzA7CisJaW50IHJldDsKKwlzdHJ1Y3QgYXRoMTJrX3J4X2Rlc2NfaW5mbyAq ZGVzY19pbmZvOworCXU4IGRzdF9pbmQ7CisKKwloYWxfcnhfZGVzY19zeiA9IGFiLT5od19wYXJh bXMtPmhhbF9kZXNjX3N6OworCWxpbmtfZGVzY19iYW5rcyA9IGRwLT5saW5rX2Rlc2NfYmFua3M7 CisJcmVvX2Rlc3RfcmluZyA9IHJ4X3RpZC0+ZHN0X3JpbmdfZGVzYzsKKworCWF0aDEya19oYWxf cnhfcmVvX2VudF9wYWRkcl9nZXQoYWIsICZyZW9fZGVzdF9yaW5nLT5idWZfYWRkcl9pbmZvLAor CQkJCQkmbGlua19wYWRkciwgJmNvb2tpZSk7CisJZGVzY19iYW5rID0gdTMyX2dldF9iaXRzKGNv b2tpZSwgRFBfTElOS19ERVNDX0JBTktfTUFTSyk7CisKKwltc2R1X2xpbmsgPSAoc3RydWN0IGhh bF9yeF9tc2R1X2xpbmsgKikobGlua19kZXNjX2JhbmtzW2Rlc2NfYmFua10udmFkZHIgKworCQkJ KGxpbmtfcGFkZHIgLSBsaW5rX2Rlc2NfYmFua3NbZGVzY19iYW5rXS5wYWRkcikpOworCW1zZHUw ID0gJm1zZHVfbGluay0+bXNkdV9saW5rWzBdOworCW1zZHVfZXh0X2luZm8gPSBsZTMyX3RvX2Nw dShtc2R1MC0+cnhfbXNkdV9leHRfaW5mby5pbmZvMCk7CisJZHN0X2luZCA9IHUzMl9nZXRfYml0 cyhtc2R1X2V4dF9pbmZvLCBSWF9NU0RVX0VYVF9ERVNDX0lORk8wX1JFT19ERVNUX0lORCk7CisK KwltZW1zZXQobXNkdTAsIDAsIHNpemVvZigqbXNkdTApKTsKKworCW1zZHVfaW5mbyA9IHUzMl9l bmNvZGVfYml0cygxLCBSWF9NU0RVX0RFU0NfSU5GTzBfRklSU1RfTVNEVV9JTl9NUERVKSB8CisJ CSAgICB1MzJfZW5jb2RlX2JpdHMoMSwgUlhfTVNEVV9ERVNDX0lORk8wX0xBU1RfTVNEVV9JTl9N UERVKSB8CisJCSAgICB1MzJfZW5jb2RlX2JpdHMoMCwgUlhfTVNEVV9ERVNDX0lORk8wX01TRFVf Q09OVElOVUFUSU9OKSB8CisJCSAgICB1MzJfZW5jb2RlX2JpdHMoZGVmcmFnX3NrYi0+bGVuIC0g aGFsX3J4X2Rlc2Nfc3osCisJCQkJICAgIFJYX01TRFVfREVTQ19JTkZPMF9NU0RVX0xFTkdUSCkg fAorCQkgICAgdTMyX2VuY29kZV9iaXRzKDEsIFJYX01TRFVfREVTQ19JTkZPMF9WQUxJRF9TQSkg fAorCQkgICAgdTMyX2VuY29kZV9iaXRzKDEsIFJYX01TRFVfREVTQ19JTkZPMF9WQUxJRF9EQSk7 CisJbXNkdTAtPnJ4X21zZHVfaW5mby5pbmZvMCA9IGNwdV90b19sZTMyKG1zZHVfaW5mbyk7CisJ bXNkdTAtPnJ4X21zZHVfZXh0X2luZm8uaW5mbzAgPSBjcHVfdG9fbGUzMihtc2R1X2V4dF9pbmZv KTsKKworCS8qIGNoYW5nZSBtc2R1IGxlbiBpbiBoYWwgcnggZGVzYyAqLworCWF0aDEya19kcF9y eGRlc2Nfc2V0X21zZHVfbGVuKGFiLCByeF9kZXNjLCBkZWZyYWdfc2tiLT5sZW4gLSBoYWxfcnhf ZGVzY19zeik7CisKKwlidWZfcGFkZHIgPSBkbWFfbWFwX3NpbmdsZShhYi0+ZGV2LCBkZWZyYWdf c2tiLT5kYXRhLAorCQkJCSAgIGRlZnJhZ19za2ItPmxlbiArIHNrYl90YWlscm9vbShkZWZyYWdf c2tiKSwKKwkJCQkgICBETUFfRlJPTV9ERVZJQ0UpOworCWlmIChkbWFfbWFwcGluZ19lcnJvcihh Yi0+ZGV2LCBidWZfcGFkZHIpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19iaCgm ZHAtPnJ4X2Rlc2NfbG9jayk7CisJZGVzY19pbmZvID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxs KCZkcC0+cnhfZGVzY19mcmVlX2xpc3QsCisJCQkJCSAgICAgc3RydWN0IGF0aDEya19yeF9kZXNj X2luZm8sCisJCQkJCSAgICAgbGlzdCk7CisJaWYgKCFkZXNjX2luZm8pIHsKKwkJc3Bpbl91bmxv Y2tfYmgoJmRwLT5yeF9kZXNjX2xvY2spOworCQlhdGgxMmtfd2FybihhYiwgImZhaWxlZCB0byBm aW5kIHJ4IGRlc2MgZm9yIHJlaW5qZWN0XG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBl cnJfdW5tYXBfZG1hOworCX0KKworCWRlc2NfaW5mby0+c2tiID0gZGVmcmFnX3NrYjsKKworCWxp c3RfZGVsKCZkZXNjX2luZm8tPmxpc3QpOworCWxpc3RfYWRkX3RhaWwoJmRlc2NfaW5mby0+bGlz dCwgJmRwLT5yeF9kZXNjX3VzZWRfbGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJmRwLT5yeF9kZXNj X2xvY2spOworCisJQVRIMTJLX1NLQl9SWENCKGRlZnJhZ19za2IpLT5wYWRkciA9IGJ1Zl9wYWRk cjsKKworCWF0aDEya19oYWxfcnhfYnVmX2FkZHJfaW5mb19zZXQoJm1zZHUwLT5idWZfYWRkcl9p bmZvLCBidWZfcGFkZHIsCisJCQkJCWRlc2NfaW5mby0+Y29va2llLAorCQkJCQlIQUxfUlhfQlVG X1JCTV9TVzNfQk0pOworCisJLyogRmlsbCBtcGR1IGRldGFpbHMgaW50byByZW8gZW50cmFjZSBy aW5nICovCisJc3JuZyA9ICZhYi0+aGFsLnNybmdfbGlzdFtkcC0+cmVvX3JlaW5qZWN0X3Jpbmcu cmluZ19pZF07CisKKwlzcGluX2xvY2tfYmgoJnNybmctPmxvY2spOworCWF0aDEya19oYWxfc3Ju Z19hY2Nlc3NfYmVnaW4oYWIsIHNybmcpOworCisJcmVvX2VudF9yaW5nID0gYXRoMTJrX2hhbF9z cm5nX3NyY19nZXRfbmV4dF9lbnRyeShhYiwgc3JuZyk7CisJaWYgKCFyZW9fZW50X3JpbmcpIHsK KwkJYXRoMTJrX2hhbF9zcm5nX2FjY2Vzc19lbmQoYWIsIHNybmcpOworCQlzcGluX3VubG9ja19i aCgmc3JuZy0+bG9jayk7CisJCXJldCA9IC1FTk9TUEM7CisJCWdvdG8gZXJyX2ZyZWVfZGVzYzsK Kwl9CisJbWVtc2V0KHJlb19lbnRfcmluZywgMCwgc2l6ZW9mKCpyZW9fZW50X3JpbmcpKTsKKwor CWF0aDEya19oYWxfcnhfYnVmX2FkZHJfaW5mb19zZXQoJnJlb19lbnRfcmluZy0+YnVmX2FkZHJf aW5mbywgbGlua19wYWRkciwKKwkJCQkJY29va2llLAorCQkJCQlIQUxfUlhfQlVGX1JCTV9XQk1f Q0hJUDBfSURMRV9ERVNDX0xJU1QpOworCisJbXBkdV9pbmZvID0gdTMyX2VuY29kZV9iaXRzKDEs IFJYX01QRFVfREVTQ19JTkZPMF9NU0RVX0NPVU5UKSB8CisJCSAgICB1MzJfZW5jb2RlX2JpdHMo MCwgUlhfTVBEVV9ERVNDX0lORk8wX0ZSQUdfRkxBRykgfAorCQkgICAgdTMyX2VuY29kZV9iaXRz KDEsIFJYX01QRFVfREVTQ19JTkZPMF9SQVdfTVBEVSkgfAorCQkgICAgdTMyX2VuY29kZV9iaXRz KDEsIFJYX01QRFVfREVTQ19JTkZPMF9WQUxJRF9QTikgfAorCQkgICAgdTMyX2VuY29kZV9iaXRz KHJ4X3RpZC0+dGlkLCBSWF9NUERVX0RFU0NfSU5GTzBfVElEKTsKKworCXJlb19lbnRfcmluZy0+ cnhfbXBkdV9pbmZvLmluZm8wID0gY3B1X3RvX2xlMzIobXBkdV9pbmZvKTsKKwlyZW9fZW50X3Jp bmctPnJ4X21wZHVfaW5mby5wZWVyX21ldGFfZGF0YSA9CisJCXJlb19kZXN0X3JpbmctPnJ4X21w ZHVfaW5mby5wZWVyX21ldGFfZGF0YTsKKworCXJlb19lbnRfcmluZy0+cXVldWVfYWRkcl9sbyA9 IGNwdV90b19sZTMyKGxvd2VyXzMyX2JpdHMocnhfdGlkLT5wYWRkcikpOworCXJlb19lbnRfcmlu Zy0+aW5mbzAgPSBsZTMyX2VuY29kZV9iaXRzKHVwcGVyXzMyX2JpdHMocnhfdGlkLT5wYWRkciks CisJCQkJCSAgICAgICBIQUxfUkVPX0VOVFJfUklOR19JTkZPMF9RVUVVRV9BRERSX0hJKSB8CisJ CWxlMzJfZW5jb2RlX2JpdHMoZHN0X2luZCwgSEFMX1JFT19FTlRSX1JJTkdfSU5GTzBfREVTVF9J TkQpOworCisJcmVvX2VudF9yaW5nLT5pbmZvMSA9IGxlMzJfZW5jb2RlX2JpdHMocnhfdGlkLT5j dXJfc24sCisJCQkJCSAgICAgICBIQUxfUkVPX0VOVFJfUklOR19JTkZPMV9NUERVX1NFUV9OVU0p OworCWRlc3RfcmluZ19pbmZvMCA9IGxlMzJfZ2V0X2JpdHMocmVvX2Rlc3RfcmluZy0+aW5mbzAs CisJCQkJCUhBTF9SRU9fREVTVF9SSU5HX0lORk8wX1NSQ19MSU5LX0lEKTsKKwlyZW9fZW50X3Jp bmctPmluZm8yID0KKwkJY3B1X3RvX2xlMzIodTMyX2dldF9iaXRzKGRlc3RfcmluZ19pbmZvMCwK KwkJCQkJIEhBTF9SRU9fRU5UUl9SSU5HX0lORk8yX1NSQ19MSU5LX0lEKSk7CisKKwlhdGgxMmtf aGFsX3NybmdfYWNjZXNzX2VuZChhYiwgc3JuZyk7CisJc3Bpbl91bmxvY2tfYmgoJnNybmctPmxv Y2spOworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2Rlc2M6CisJc3Bpbl9sb2NrX2JoKCZkcC0+ cnhfZGVzY19sb2NrKTsKKwlsaXN0X2RlbCgmZGVzY19pbmZvLT5saXN0KTsKKwlsaXN0X2FkZF90 YWlsKCZkZXNjX2luZm8tPmxpc3QsICZkcC0+cnhfZGVzY19mcmVlX2xpc3QpOworCWRlc2NfaW5m by0+c2tiID0gTlVMTDsKKwlzcGluX3VubG9ja19iaCgmZHAtPnJ4X2Rlc2NfbG9jayk7CitlcnJf dW5tYXBfZG1hOgorCWRtYV91bm1hcF9zaW5nbGUoYWItPmRldiwgYnVmX3BhZGRyLCBkZWZyYWdf c2tiLT5sZW4gKyBza2JfdGFpbHJvb20oZGVmcmFnX3NrYiksCisJCQkgRE1BX0ZST01fREVWSUNF KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0aDEya19kcF9yeF9oX2NtcF9mcmFn cyhzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqYSwgc3Ry dWN0IHNrX2J1ZmYgKmIpCit7CisJaW50IGZyYWcxLCBmcmFnMjsKKworCWZyYWcxID0gYXRoMTJr X2RwX3J4X2hfZnJhZ19ubyhhYiwgYSk7CisJZnJhZzIgPSBhdGgxMmtfZHBfcnhfaF9mcmFnX25v KGFiLCBiKTsKKworCXJldHVybiBmcmFnMSAtIGZyYWcyOworfQorCitzdGF0aWMgdm9pZCBhdGgx MmtfZHBfcnhfaF9zb3J0X2ZyYWdzKHN0cnVjdCBhdGgxMmtfYmFzZSAqYWIsCisJCQkJICAgICAg c3RydWN0IHNrX2J1ZmZfaGVhZCAqZnJhZ19saXN0LAorCQkJCSAgICAgIHN0cnVjdCBza19idWZm ICpjdXJfZnJhZykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBjbXA7CisKKwlza2Jf cXVldWVfd2FsayhmcmFnX2xpc3QsIHNrYikgeworCQljbXAgPSBhdGgxMmtfZHBfcnhfaF9jbXBf ZnJhZ3MoYWIsIHNrYiwgY3VyX2ZyYWcpOworCQlpZiAoY21wIDwgMCkKKwkJCWNvbnRpbnVlOwor CQlfX3NrYl9xdWV1ZV9iZWZvcmUoZnJhZ19saXN0LCBza2IsIGN1cl9mcmFnKTsKKwkJcmV0dXJu OworCX0KKwlfX3NrYl9xdWV1ZV90YWlsKGZyYWdfbGlzdCwgY3VyX2ZyYWcpOworfQorCitzdGF0 aWMgdTY0IGF0aDEya19kcF9yeF9oX2dldF9wbihzdHJ1Y3QgYXRoMTJrICphciwgc3RydWN0IHNr X2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXU2NCBwbiA9IDA7 CisJdTggKmVoZHI7CisJdTMyIGhhbF9yeF9kZXNjX3N6ID0gYXItPmFiLT5od19wYXJhbXMtPmhh bF9kZXNjX3N6OworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopKHNrYi0+ZGF0YSAr IGhhbF9yeF9kZXNjX3N6KTsKKwllaGRyID0gc2tiLT5kYXRhICsgaGFsX3J4X2Rlc2Nfc3ogKyBp ZWVlODAyMTFfaGRybGVuKGhkci0+ZnJhbWVfY29udHJvbCk7CisKKwlwbiA9IGVoZHJbMF07CisJ cG4gfD0gKHU2NCllaGRyWzFdIDw8IDg7CisJcG4gfD0gKHU2NCllaGRyWzRdIDw8IDE2OworCXBu IHw9ICh1NjQpZWhkcls1XSA8PCAyNDsKKwlwbiB8PSAodTY0KWVoZHJbNl0gPDwgMzI7CisJcG4g fD0gKHU2NCllaGRyWzddIDw8IDQwOworCisJcmV0dXJuIHBuOworfQorCitzdGF0aWMgYm9vbAor YXRoMTJrX2RwX3J4X2hfZGVmcmFnX3ZhbGlkYXRlX2luY3JfcG4oc3RydWN0IGF0aDEyayAqYXIs IHN0cnVjdCBhdGgxMmtfZHBfcnhfdGlkICpyeF90aWQpCit7CisJc3RydWN0IGF0aDEya19iYXNl ICphYiA9IGFyLT5hYjsKKwllbnVtIGhhbF9lbmNyeXB0X3R5cGUgZW5jcnlwdF90eXBlOworCXN0 cnVjdCBza19idWZmICpmaXJzdF9mcmFnLCAqc2tiOworCXN0cnVjdCBoYWxfcnhfZGVzYyAqZGVz YzsKKwl1NjQgbGFzdF9wbjsKKwl1NjQgY3VyX3BuOworCisJZmlyc3RfZnJhZyA9IHNrYl9wZWVr KCZyeF90aWQtPnJ4X2ZyYWdzKTsKKwlkZXNjID0gKHN0cnVjdCBoYWxfcnhfZGVzYyAqKWZpcnN0 X2ZyYWctPmRhdGE7CisKKwllbmNyeXB0X3R5cGUgPSBhdGgxMmtfZHBfcnhfaF9lbmN0eXBlKGFi LCBkZXNjKTsKKwlpZiAoZW5jcnlwdF90eXBlICE9IEhBTF9FTkNSWVBUX1RZUEVfQ0NNUF8xMjgg JiYKKwkgICAgZW5jcnlwdF90eXBlICE9IEhBTF9FTkNSWVBUX1RZUEVfQ0NNUF8yNTYgJiYKKwkg ICAgZW5jcnlwdF90eXBlICE9IEhBTF9FTkNSWVBUX1RZUEVfR0NNUF8xMjggJiYKKwkgICAgZW5j cnlwdF90eXBlICE9IEhBTF9FTkNSWVBUX1RZUEVfQUVTX0dDTVBfMjU2KQorCQlyZXR1cm4gdHJ1 ZTsKKworCWxhc3RfcG4gPSBhdGgxMmtfZHBfcnhfaF9nZXRfcG4oYXIsIGZpcnN0X2ZyYWcpOwor CXNrYl9xdWV1ZV93YWxrKCZyeF90aWQtPnJ4X2ZyYWdzLCBza2IpIHsKKwkJaWYgKHNrYiA9PSBm aXJzdF9mcmFnKQorCQkJY29udGludWU7CisKKwkJY3VyX3BuID0gYXRoMTJrX2RwX3J4X2hfZ2V0 X3BuKGFyLCBza2IpOworCQlpZiAoY3VyX3BuICE9IGxhc3RfcG4gKyAxKQorCQkJcmV0dXJuIGZh bHNlOworCQlsYXN0X3BuID0gY3VyX3BuOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGlj IGludCBhdGgxMmtfZHBfcnhfZnJhZ19oX21wZHUoc3RydWN0IGF0aDEyayAqYXIsCisJCQkJICAg IHN0cnVjdCBza19idWZmICptc2R1LAorCQkJCSAgICBzdHJ1Y3QgaGFsX3Jlb19kZXN0X3Jpbmcg KnJpbmdfZGVzYykKK3sKKwlzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiID0gYXItPmFiOworCXN0cnVj dCBoYWxfcnhfZGVzYyAqcnhfZGVzYzsKKwlzdHJ1Y3QgYXRoMTJrX3BlZXIgKnBlZXI7CisJc3Ry dWN0IGF0aDEya19kcF9yeF90aWQgKnJ4X3RpZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqZGVmcmFnX3Nr YiA9IE5VTEw7CisJdTMyIHBlZXJfaWQ7CisJdTE2IHNlcW5vLCBmcmFnX25vOworCXU4IHRpZDsK KwlpbnQgcmV0ID0gMDsKKwlib29sIG1vcmVfZnJhZ3M7CisKKwlyeF9kZXNjID0gKHN0cnVjdCBo YWxfcnhfZGVzYyAqKW1zZHUtPmRhdGE7CisJcGVlcl9pZCA9IGF0aDEya19kcF9yeF9oX3BlZXJf aWQoYWIsIHJ4X2Rlc2MpOworCXRpZCA9IGF0aDEya19kcF9yeF9oX3RpZChhYiwgcnhfZGVzYyk7 CisJc2Vxbm8gPSBhdGgxMmtfZHBfcnhfaF9zZXFfbm8oYWIsIHJ4X2Rlc2MpOworCWZyYWdfbm8g PSBhdGgxMmtfZHBfcnhfaF9mcmFnX25vKGFiLCBtc2R1KTsKKwltb3JlX2ZyYWdzID0gYXRoMTJr X2RwX3J4X2hfbW9yZV9mcmFncyhhYiwgbXNkdSk7CisKKwlpZiAoIWF0aDEya19kcF9yeF9oX3Nl cV9jdHJsX3ZhbGlkKGFiLCByeF9kZXNjKSB8fAorCSAgICAhYXRoMTJrX2RwX3J4X2hfZmNfdmFs aWQoYWIsIHJ4X2Rlc2MpIHx8CisJICAgIHRpZCA+IElFRUU4MDIxMV9OVU1fVElEUykKKwkJcmV0 dXJuIC1FSU5WQUw7CisKKwkvKiByZWNlaXZlZCB1bmZyYWdtZW50ZWQgcGFja2V0IGluIHJlbwor CSAqIGV4Y2VwdGlvbiByaW5nLCB0aGlzIHNob3VsZG4ndCBoYXBwZW4KKwkgKiBhcyB0aGVzZSBw YWNrZXRzIHR5cGljYWxseSBjb21lIGZyb20KKwkgKiByZW8yc3cgc3JuZ3MuCisJICovCisJaWYg KFdBUk5fT05fT05DRSghZnJhZ19ubyAmJiAhbW9yZV9mcmFncykpCisJCXJldHVybiAtRUlOVkFM OworCisJc3Bpbl9sb2NrX2JoKCZhYi0+YmFzZV9sb2NrKTsKKwlwZWVyID0gYXRoMTJrX3BlZXJf ZmluZF9ieV9pZChhYiwgcGVlcl9pZCk7CisJaWYgKCFwZWVyKSB7CisJCWF0aDEya193YXJuKGFi LCAiZmFpbGVkIHRvIGZpbmQgdGhlIHBlZXIgdG8gZGUtZnJhZ21lbnQgcmVjZWl2ZWQgZnJhZ21l bnQgcGVlcl9pZCAlZFxuIiwKKwkJCSAgICBwZWVyX2lkKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJ Z290byBvdXRfdW5sb2NrOworCX0KKwlyeF90aWQgPSAmcGVlci0+cnhfdGlkW3RpZF07CisKKwlp ZiAoKCFza2JfcXVldWVfZW1wdHkoJnJ4X3RpZC0+cnhfZnJhZ3MpICYmIHNlcW5vICE9IHJ4X3Rp ZC0+Y3VyX3NuKSB8fAorCSAgICBza2JfcXVldWVfZW1wdHkoJnJ4X3RpZC0+cnhfZnJhZ3MpKSB7 CisJCS8qIEZsdXNoIHN0b3JlZCBmcmFnbWVudHMgYW5kIHN0YXJ0IGEgbmV3IHNlcXVlbmNlICov CisJCWF0aDEya19kcF9yeF9mcmFnc19jbGVhbnVwKHJ4X3RpZCwgdHJ1ZSk7CisJCXJ4X3RpZC0+ Y3VyX3NuID0gc2Vxbm87CisJfQorCisJaWYgKHJ4X3RpZC0+cnhfZnJhZ19iaXRtYXAgJiBCSVQo ZnJhZ19ubykpIHsKKwkJLyogRnJhZ21lbnQgYWxyZWFkeSBwcmVzZW50ICovCisJCXJldCA9IC1F SU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlpZiAoZnJhZ19ubyA+IF9fZmxzKHJ4 X3RpZC0+cnhfZnJhZ19iaXRtYXApKQorCQlfX3NrYl9xdWV1ZV90YWlsKCZyeF90aWQtPnJ4X2Zy YWdzLCBtc2R1KTsKKwllbHNlCisJCWF0aDEya19kcF9yeF9oX3NvcnRfZnJhZ3MoYWIsICZyeF90 aWQtPnJ4X2ZyYWdzLCBtc2R1KTsKKworCXJ4X3RpZC0+cnhfZnJhZ19iaXRtYXAgfD0gQklUKGZy YWdfbm8pOworCWlmICghbW9yZV9mcmFncykKKwkJcnhfdGlkLT5sYXN0X2ZyYWdfbm8gPSBmcmFn X25vOworCisJaWYgKGZyYWdfbm8gPT0gMCkgeworCQlyeF90aWQtPmRzdF9yaW5nX2Rlc2MgPSBr bWVtZHVwKHJpbmdfZGVzYywKKwkJCQkJCXNpemVvZigqcnhfdGlkLT5kc3RfcmluZ19kZXNjKSwK KwkJCQkJCUdGUF9BVE9NSUMpOworCQlpZiAoIXJ4X3RpZC0+ZHN0X3JpbmdfZGVzYykgeworCQkJ cmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCX0gZWxzZSB7CisJCWF0 aDEya19kcF9yeF9saW5rX2Rlc2NfcmV0dXJuKGFiLCByaW5nX2Rlc2MsCisJCQkJCSAgICAgIEhB TF9XQk1fUkVMX0JNX0FDVF9QVVRfSU5fSURMRSk7CisJfQorCisJaWYgKCFyeF90aWQtPmxhc3Rf ZnJhZ19ubyB8fAorCSAgICByeF90aWQtPnJ4X2ZyYWdfYml0bWFwICE9IEdFTk1BU0socnhfdGlk LT5sYXN0X2ZyYWdfbm8sIDApKSB7CisJCW1vZF90aW1lcigmcnhfdGlkLT5mcmFnX3RpbWVyLCBq aWZmaWVzICsKKwkJCQkJICAgICAgIEFUSDEyS19EUF9SWF9GUkFHTUVOVF9USU1FT1VUX01TKTsK KwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXNwaW5fdW5sb2NrX2JoKCZhYi0+YmFzZV9sb2Nr KTsKKwlkZWxfdGltZXJfc3luYygmcnhfdGlkLT5mcmFnX3RpbWVyKTsKKwlzcGluX2xvY2tfYmgo JmFiLT5iYXNlX2xvY2spOworCisJcGVlciA9IGF0aDEya19wZWVyX2ZpbmRfYnlfaWQoYWIsIHBl ZXJfaWQpOworCWlmICghcGVlcikKKwkJZ290byBlcnJfZnJhZ3NfY2xlYW51cDsKKworCWlmICgh YXRoMTJrX2RwX3J4X2hfZGVmcmFnX3ZhbGlkYXRlX2luY3JfcG4oYXIsIHJ4X3RpZCkpCisJCWdv dG8gZXJyX2ZyYWdzX2NsZWFudXA7CisKKwlpZiAoYXRoMTJrX2RwX3J4X2hfZGVmcmFnKGFyLCBw ZWVyLCByeF90aWQsICZkZWZyYWdfc2tiKSkKKwkJZ290byBlcnJfZnJhZ3NfY2xlYW51cDsKKwor CWlmICghZGVmcmFnX3NrYikKKwkJZ290byBlcnJfZnJhZ3NfY2xlYW51cDsKKworCWlmIChhdGgx MmtfZHBfcnhfaF9kZWZyYWdfcmVvX3JlaW5qZWN0KGFyLCByeF90aWQsIGRlZnJhZ19za2IpKQor CQlnb3RvIGVycl9mcmFnc19jbGVhbnVwOworCisJYXRoMTJrX2RwX3J4X2ZyYWdzX2NsZWFudXAo cnhfdGlkLCBmYWxzZSk7CisJZ290byBvdXRfdW5sb2NrOworCitlcnJfZnJhZ3NfY2xlYW51cDoK KwlkZXZfa2ZyZWVfc2tiX2FueShkZWZyYWdfc2tiKTsKKwlhdGgxMmtfZHBfcnhfZnJhZ3NfY2xl YW51cChyeF90aWQsIHRydWUpOworb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19iaCgmYWItPmJh c2VfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorYXRoMTJrX2RwX3Byb2Nl c3NfcnhfZXJyX2J1ZihzdHJ1Y3QgYXRoMTJrICphciwgc3RydWN0IGhhbF9yZW9fZGVzdF9yaW5n ICpkZXNjLAorCQkJICAgICBib29sIGRyb3AsIHUzMiBjb29raWUpCit7CisJc3RydWN0IGF0aDEy a19iYXNlICphYiA9IGFyLT5hYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXNkdTsKKwlzdHJ1Y3QgYXRo MTJrX3NrYl9yeGNiICpyeGNiOworCXN0cnVjdCBoYWxfcnhfZGVzYyAqcnhfZGVzYzsKKwl1MTYg bXNkdV9sZW47CisJdTMyIGhhbF9yeF9kZXNjX3N6ID0gYWItPmh3X3BhcmFtcy0+aGFsX2Rlc2Nf c3o7CisJc3RydWN0IGF0aDEya19yeF9kZXNjX2luZm8gKmRlc2NfaW5mbzsKKwl1NjQgZGVzY192 YTsKKworCWRlc2NfdmEgPSAoKHU2NClsZTMyX3RvX2NwdShkZXNjLT5idWZfdmFfaGkpIDw8IDMy IHwKKwkJICAgbGUzMl90b19jcHUoZGVzYy0+YnVmX3ZhX2xvKSk7CisJZGVzY19pbmZvID0gKHN0 cnVjdCBhdGgxMmtfcnhfZGVzY19pbmZvICopKCh1bnNpZ25lZCBsb25nKWRlc2NfdmEpOworCisJ LyogcmV0cnkgbWFudWFsIGRlc2MgcmV0cmlldmFsICovCisJaWYgKCFkZXNjX2luZm8pIHsKKwkJ ZGVzY19pbmZvID0gYXRoMTJrX2RwX2dldF9yeF9kZXNjKGFiLCBjb29raWUpOworCQlpZiAoIWRl c2NfaW5mbykgeworCQkJYXRoMTJrX3dhcm4oYWIsICJJbnZhbGlkIGNvb2tpZSBpbiBtYW51YWwg ZGVzYyByZXRyaXZhbCIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoZGVz Y19pbmZvLT5tYWdpYyAhPSBBVEgxMktfRFBfUlhfREVTQ19NQUdJQykKKwkJYXRoMTJrX3dhcm4o YWIsICIgUlggRXhjZXB0aW9uLCBDaGVjayBIVyBDQyBpbXBsZW1lbnRhdGlvbiIpOworCisJbXNk dSA9IGRlc2NfaW5mby0+c2tiOworCWRlc2NfaW5mby0+c2tiID0gTlVMTDsKKwlzcGluX2xvY2tf YmgoJmFiLT5kcC5yeF9kZXNjX2xvY2spOworCWxpc3RfbW92ZV90YWlsKCZkZXNjX2luZm8tPmxp c3QsICZhYi0+ZHAucnhfZGVzY19mcmVlX2xpc3QpOworCXNwaW5fdW5sb2NrX2JoKCZhYi0+ZHAu cnhfZGVzY19sb2NrKTsKKworCXJ4Y2IgPSBBVEgxMktfU0tCX1JYQ0IobXNkdSk7CisJZG1hX3Vu bWFwX3NpbmdsZShhci0+YWItPmRldiwgcnhjYi0+cGFkZHIsCisJCQkgbXNkdS0+bGVuICsgc2ti X3RhaWxyb29tKG1zZHUpLAorCQkJIERNQV9GUk9NX0RFVklDRSk7CisKKwlpZiAoZHJvcCkgewor CQlkZXZfa2ZyZWVfc2tiX2FueShtc2R1KTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmN1X3JlYWRf bG9jaygpOworCWlmICghcmN1X2RlcmVmZXJlbmNlKGFyLT5hYi0+cGRldnNfYWN0aXZlW2FyLT5w ZGV2X2lkeF0pKSB7CisJCWRldl9rZnJlZV9za2JfYW55KG1zZHUpOworCQlnb3RvIGV4aXQ7CisJ fQorCisJaWYgKHRlc3RfYml0KEFUSDEyS19DQUNfUlVOTklORywgJmFyLT5kZXZfZmxhZ3MpKSB7 CisJCWRldl9rZnJlZV9za2JfYW55KG1zZHUpOworCQlnb3RvIGV4aXQ7CisJfQorCisJcnhfZGVz YyA9IChzdHJ1Y3QgaGFsX3J4X2Rlc2MgKiltc2R1LT5kYXRhOworCW1zZHVfbGVuID0gYXRoMTJr X2RwX3J4X2hfbXNkdV9sZW4oYXItPmFiLCByeF9kZXNjKTsKKwlpZiAoKG1zZHVfbGVuICsgaGFs X3J4X2Rlc2Nfc3opID4gRFBfUlhfQlVGRkVSX1NJWkUpIHsKKwkJYXRoMTJrX3dhcm4oYXItPmFi LCAiaW52YWxpZCBtc2R1IGxlbmcgJXUiLCBtc2R1X2xlbik7CisJCWF0aDEya19kYmdfZHVtcChh ci0+YWIsIEFUSDEyS19EQkdfREFUQSwgTlVMTCwgIiIsIHJ4X2Rlc2MsCisJCQkJc2l6ZW9mKCpy eF9kZXNjKSk7CisJCWRldl9rZnJlZV9za2JfYW55KG1zZHUpOworCQlnb3RvIGV4aXQ7CisJfQor CisJc2tiX3B1dChtc2R1LCBoYWxfcnhfZGVzY19zeiArIG1zZHVfbGVuKTsKKworCWlmIChhdGgx MmtfZHBfcnhfZnJhZ19oX21wZHUoYXIsIG1zZHUsIGRlc2MpKSB7CisJCWRldl9rZnJlZV9za2Jf YW55KG1zZHUpOworCQlhdGgxMmtfZHBfcnhfbGlua19kZXNjX3JldHVybihhci0+YWIsIGRlc2Ms CisJCQkJCSAgICAgIEhBTF9XQk1fUkVMX0JNX0FDVF9QVVRfSU5fSURMRSk7CisJfQorZXhpdDoK KwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGF0aDEya19kcF9yeF9w cm9jZXNzX2VycihzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLCBzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5h cGksCisJCQkgICAgIGludCBidWRnZXQpCit7CisJdTMyIG1zZHVfY29va2llc1tIQUxfTlVNX1JY X01TRFVTX1BFUl9MSU5LX0RFU0NdOworCXN0cnVjdCBkcF9saW5rX2Rlc2NfYmFuayAqbGlua19k ZXNjX2JhbmtzOworCWVudW0gaGFsX3J4X2J1Zl9yZXR1cm5fYnVmX21hbmFnZXIgcmJtOworCXN0 cnVjdCBoYWxfcnhfbXNkdV9saW5rICpsaW5rX2Rlc2NfdmE7CisJaW50IHRvdF9uX2J1ZnNfcmVh cGVkLCBxdW90YSwgcmV0LCBpOworCXN0cnVjdCBoYWxfcmVvX2Rlc3RfcmluZyAqcmVvX2Rlc2M7 CisJc3RydWN0IGRwX3J4ZG1hX3JpbmcgKnJ4X3Jpbmc7CisJc3RydWN0IGRwX3NybmcgKnJlb19l eGNlcHQ7CisJdTMyIGRlc2NfYmFuaywgbnVtX21zZHVzOworCXN0cnVjdCBoYWxfc3JuZyAqc3Ju ZzsKKwlzdHJ1Y3QgYXRoMTJrX2RwICpkcDsKKwlpbnQgbWFjX2lkOworCXN0cnVjdCBhdGgxMmsg KmFyOworCWRtYV9hZGRyX3QgcGFkZHI7CisJYm9vbCBpc19mcmFnOworCWJvb2wgZHJvcCA9IGZh bHNlOworCisJdG90X25fYnVmc19yZWFwZWQgPSAwOworCXF1b3RhID0gYnVkZ2V0OworCisJZHAg PSAmYWItPmRwOworCXJlb19leGNlcHQgPSAmZHAtPnJlb19leGNlcHRfcmluZzsKKwlsaW5rX2Rl c2NfYmFua3MgPSBkcC0+bGlua19kZXNjX2JhbmtzOworCisJc3JuZyA9ICZhYi0+aGFsLnNybmdf bGlzdFtyZW9fZXhjZXB0LT5yaW5nX2lkXTsKKworCXNwaW5fbG9ja19iaCgmc3JuZy0+bG9jayk7 CisKKwlhdGgxMmtfaGFsX3NybmdfYWNjZXNzX2JlZ2luKGFiLCBzcm5nKTsKKworCXdoaWxlIChi dWRnZXQgJiYKKwkgICAgICAgKHJlb19kZXNjID0gYXRoMTJrX2hhbF9zcm5nX2RzdF9nZXRfbmV4 dF9lbnRyeShhYiwgc3JuZykpKSB7CisJCWFiLT5zb2Nfc3RhdHMuZXJyX3JpbmdfcGt0cysrOwor CQlyZXQgPSBhdGgxMmtfaGFsX2Rlc2NfcmVvX3BhcnNlX2VycihhYiwgcmVvX2Rlc2MsICZwYWRk ciwKKwkJCQkJCSAgICAmZGVzY19iYW5rKTsKKwkJaWYgKHJldCkgeworCQkJYXRoMTJrX3dhcm4o YWIsICJmYWlsZWQgdG8gcGFyc2UgZXJyb3IgcmVvIGRlc2MgJWRcbiIsCisJCQkJICAgIHJldCk7 CisJCQljb250aW51ZTsKKwkJfQorCQlsaW5rX2Rlc2NfdmEgPSBsaW5rX2Rlc2NfYmFua3NbZGVz Y19iYW5rXS52YWRkciArCisJCQkgICAgICAgKHBhZGRyIC0gbGlua19kZXNjX2JhbmtzW2Rlc2Nf YmFua10ucGFkZHIpOworCQlhdGgxMmtfaGFsX3J4X21zZHVfbGlua19pbmZvX2dldChsaW5rX2Rl c2NfdmEsICZudW1fbXNkdXMsIG1zZHVfY29va2llcywKKwkJCQkJCSAmcmJtKTsKKwkJaWYgKHJi bSAhPSBIQUxfUlhfQlVGX1JCTV9XQk1fQ0hJUDBfSURMRV9ERVNDX0xJU1QgJiYKKwkJICAgIHJi bSAhPSBIQUxfUlhfQlVGX1JCTV9TVzNfQk0gJiYKKwkJICAgIHJibSAhPSBhYi0+aHdfcGFyYW1z LT5oYWxfcGFyYW1zLT5yeF9idWZfcmJtKSB7CisJCQlhYi0+c29jX3N0YXRzLmludmFsaWRfcmJt Kys7CisJCQlhdGgxMmtfd2FybihhYiwgImludmFsaWQgcmV0dXJuIGJ1ZmZlciBtYW5hZ2VyICVk XG4iLCByYm0pOworCQkJYXRoMTJrX2RwX3J4X2xpbmtfZGVzY19yZXR1cm4oYWIsIHJlb19kZXNj LAorCQkJCQkJICAgICAgSEFMX1dCTV9SRUxfQk1fQUNUX1JFTF9NU0RVKTsKKwkJCWNvbnRpbnVl OworCQl9CisKKwkJaXNfZnJhZyA9ICEhKGxlMzJfdG9fY3B1KHJlb19kZXNjLT5yeF9tcGR1X2lu Zm8uaW5mbzApICYKKwkJCSAgICAgUlhfTVBEVV9ERVNDX0lORk8wX0ZSQUdfRkxBRyk7CisKKwkJ LyogUHJvY2VzcyBvbmx5IHJ4IGZyYWdtZW50cyB3aXRoIG9uZSBtc2R1IHBlciBsaW5rIGRlc2Mg YmVsb3csIGFuZCBkcm9wCisJCSAqIG1zZHUncyBpbmRpY2F0ZWQgZHVlIHRvIGVycm9yIHJlYXNv bnMuCisJCSAqLworCQlpZiAoIWlzX2ZyYWcgfHwgbnVtX21zZHVzID4gMSkgeworCQkJZHJvcCA9 IHRydWU7CisJCQkvKiBSZXR1cm4gdGhlIGxpbmsgZGVzYyBiYWNrIHRvIHdibSBpZGxlIGxpc3Qg Ki8KKwkJCWF0aDEya19kcF9yeF9saW5rX2Rlc2NfcmV0dXJuKGFiLCByZW9fZGVzYywKKwkJCQkJ CSAgICAgIEhBTF9XQk1fUkVMX0JNX0FDVF9QVVRfSU5fSURMRSk7CisJCX0KKworCQlmb3IgKGkg PSAwOyBpIDwgbnVtX21zZHVzOyBpKyspIHsKKwkJCW1hY19pZCA9IGxlMzJfZ2V0X2JpdHMocmVv X2Rlc2MtPmluZm8wLAorCQkJCQkgICAgICAgSEFMX1JFT19ERVNUX1JJTkdfSU5GTzBfU1JDX0xJ TktfSUQpOworCisJCQlhciA9IGFiLT5wZGV2c1ttYWNfaWRdLmFyOworCisJCQlpZiAoIWF0aDEy a19kcF9wcm9jZXNzX3J4X2Vycl9idWYoYXIsIHJlb19kZXNjLCBkcm9wLAorCQkJCQkJCSAgbXNk dV9jb29raWVzW2ldKSkKKwkJCQl0b3Rfbl9idWZzX3JlYXBlZCsrOworCQl9CisKKwkJaWYgKHRv dF9uX2J1ZnNfcmVhcGVkID49IHF1b3RhKSB7CisJCQl0b3Rfbl9idWZzX3JlYXBlZCA9IHF1b3Rh OworCQkJZ290byBleGl0OworCQl9CisKKwkJYnVkZ2V0ID0gcXVvdGEgLSB0b3Rfbl9idWZzX3Jl YXBlZDsKKwl9CisKK2V4aXQ6CisJYXRoMTJrX2hhbF9zcm5nX2FjY2Vzc19lbmQoYWIsIHNybmcp OworCisJc3Bpbl91bmxvY2tfYmgoJnNybmctPmxvY2spOworCisJcnhfcmluZyA9ICZkcC0+cnhf cmVmaWxsX2J1Zl9yaW5nOworCisJYXRoMTJrX2RwX3J4X2J1ZnNfcmVwbGVuaXNoKGFiLCAwLCBy eF9yaW5nLCB0b3Rfbl9idWZzX3JlYXBlZCwKKwkJCQkgICAgYWItPmh3X3BhcmFtcy0+aGFsX3Bh cmFtcy0+cnhfYnVmX3JibSwgdHJ1ZSk7CisKKwlyZXR1cm4gdG90X25fYnVmc19yZWFwZWQ7Cit9 CisKK3N0YXRpYyB2b2lkIGF0aDEya19kcF9yeF9udWxsX3FfZGVzY19zZ19kcm9wKHN0cnVjdCBh dGgxMmsgKmFyLAorCQkJCQkgICAgIGludCBtc2R1X2xlbiwKKwkJCQkJICAgICBzdHJ1Y3Qgc2tf YnVmZl9oZWFkICptc2R1X2xpc3QpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnRtcDsKKwlz dHJ1Y3QgYXRoMTJrX3NrYl9yeGNiICpyeGNiOworCWludCBuX2J1ZmZzOworCisJbl9idWZmcyA9 IERJVl9ST1VORF9VUChtc2R1X2xlbiwKKwkJCSAgICAgICAoRFBfUlhfQlVGRkVSX1NJWkUgLSBh ci0+YWItPmh3X3BhcmFtcy0+aGFsX2Rlc2Nfc3opKTsKKworCXNrYl9xdWV1ZV93YWxrX3NhZmUo bXNkdV9saXN0LCBza2IsIHRtcCkgeworCQlyeGNiID0gQVRIMTJLX1NLQl9SWENCKHNrYik7CisJ CWlmIChyeGNiLT5lcnJfcmVsX3NyYyA9PSBIQUxfV0JNX1JFTF9TUkNfTU9EVUxFX1JFTyAmJgor CQkgICAgcnhjYi0+ZXJyX2NvZGUgPT0gSEFMX1JFT19ERVNUX1JJTkdfRVJST1JfQ09ERV9ERVND X0FERFJfWkVSTykgeworCQkJaWYgKCFuX2J1ZmZzKQorCQkJCWJyZWFrOworCQkJX19za2JfdW5s aW5rKHNrYiwgbXNkdV9saXN0KTsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQluX2J1 ZmZzLS07CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgYXRoMTJrX2RwX3J4X2hfbnVsbF9xX2Rl c2Moc3RydWN0IGF0aDEyayAqYXIsIHN0cnVjdCBza19idWZmICptc2R1LAorCQkJCSAgICAgIHN0 cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0dXMsCisJCQkJICAgICAgc3RydWN0IHNrX2J1 ZmZfaGVhZCAqbXNkdV9saXN0KQoreworCXN0cnVjdCBhdGgxMmtfYmFzZSAqYWIgPSBhci0+YWI7 CisJdTE2IG1zZHVfbGVuLCBwZWVyX2lkOworCXN0cnVjdCBoYWxfcnhfZGVzYyAqZGVzYyA9IChz dHJ1Y3QgaGFsX3J4X2Rlc2MgKiltc2R1LT5kYXRhOworCXU4IGwzcGFkX2J5dGVzOworCXN0cnVj dCBhdGgxMmtfc2tiX3J4Y2IgKnJ4Y2IgPSBBVEgxMktfU0tCX1JYQ0IobXNkdSk7CisJdTMyIGhh bF9yeF9kZXNjX3N6ID0gYXItPmFiLT5od19wYXJhbXMtPmhhbF9kZXNjX3N6OworCisJbXNkdV9s ZW4gPSBhdGgxMmtfZHBfcnhfaF9tc2R1X2xlbihhYiwgZGVzYyk7CisJcGVlcl9pZCA9IGF0aDEy a19kcF9yeF9oX3BlZXJfaWQoYWIsIGRlc2MpOworCisJaWYgKCFhdGgxMmtfcGVlcl9maW5kX2J5 X2lkKGFiLCBwZWVyX2lkKSkgeworCQlhdGgxMmtfZGJnKGFiLCBBVEgxMktfREJHX0RBVEEsICJp bnZhbGlkIHBlZXIgaWQgcmVjZWl2ZWQgaW4gd2JtIGVyciBwa3QlZFxuIiwKKwkJCSAgIHBlZXJf aWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXJ4Y2ItPmlzX2ZyYWcgJiYgKCht c2R1X2xlbiArIGhhbF9yeF9kZXNjX3N6KSA+IERQX1JYX0JVRkZFUl9TSVpFKSkgeworCQkvKiBG aXJzdCBidWZmZXIgd2lsbCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLCBzbyBkZWR1Y3QgaXQncyBs ZW5ndGggKi8KKwkJbXNkdV9sZW4gPSBtc2R1X2xlbiAtIChEUF9SWF9CVUZGRVJfU0laRSAtIGhh bF9yeF9kZXNjX3N6KTsKKwkJYXRoMTJrX2RwX3J4X251bGxfcV9kZXNjX3NnX2Ryb3AoYXIsIG1z ZHVfbGVuLCBtc2R1X2xpc3QpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBFdmVuIGFm dGVyIGNsZWFuaW5nIHVwIHRoZSBzZyBidWZmZXJzIGluIHRoZSBtc2R1IGxpc3Qgd2l0aCBhYm92 ZSBjaGVjaworCSAqIGFueSBtc2R1IHJlY2VpdmVkIHdpdGggY29udGludWF0aW9uIGZsYWcgbmVl ZHMgdG8gYmUgZHJvcHBlZCBhcyBpbnZhbGlkLgorCSAqIFRoaXMgcHJvdGVjdHMgYWdhaW5zdCBz b21lIHJhbmRvbSBlcnIgZnJhbWUgd2l0aCBjb250aW51YXRpb24gZmxhZy4KKwkgKi8KKwlpZiAo cnhjYi0+aXNfY29udGludWF0aW9uKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghYXRoMTJr X2RwX3J4X2hfbXNkdV9kb25lKGFiLCBkZXNjKSkgeworCQlhdGgxMmtfd2Fybihhci0+YWIsCisJ CQkgICAgIm1zZHVfZG9uZSBiaXQgbm90IHNldCBpbiBudWxsX3FfZGVzIHByb2Nlc3NpbmdcbiIp OworCQlfX3NrYl9xdWV1ZV9wdXJnZShtc2R1X2xpc3QpOworCQlyZXR1cm4gLUVJTzsKKwl9CisK KwkvKiBIYW5kbGUgTlVMTCBxdWV1ZSBkZXNjcmlwdG9yIHZpb2xhdGlvbnMgYXJpc2luZyBvdXQg YSBtaXNzaW5nCisJICogUkVPIHF1ZXVlIGZvciBhIGdpdmVuIHBlZXIgb3IgYSBnaXZlbiBUSUQu IFRoaXMgdHlwaWNhbGx5CisJICogbWF5IGhhcHBlbiBpZiBhIHBhY2tldCBpcyByZWNlaXZlZCBv biBhIFFPUyBlbmFibGVkIFRJRCBiZWZvcmUgdGhlCisJICogQUREQkEgbmVnb3RpYXRpb24gZm9y IHRoYXQgVElELCB3aGVuIHRoZSBUSUQgcXVldWUgaXMgc2V0dXAuIE9yCisJICogaXQgbWF5IGFs c28gaGFwcGVuIGZvciBNQy9CQyBmcmFtZXMgaWYgdGhleSBhcmUgbm90IHJvdXRlZCB0byB0aGUK KwkgKiBub24tUU9TIFRJRCBxdWV1ZSwgaW4gdGhlIGFic2VuY2Ugb2YgYW55IG90aGVyIGRlZmF1 bHQgVElEIHF1ZXVlLgorCSAqIFRoaXMgZXJyb3IgY2FuIHNob3cgdXAgYm90aCBpbiBhIFJFTyBk ZXN0aW5hdGlvbiBvciBXQk0gcmVsZWFzZSByaW5nLgorCSAqLworCisJaWYgKHJ4Y2ItPmlzX2Zy YWcpIHsKKwkJc2tiX3B1bGwobXNkdSwgaGFsX3J4X2Rlc2Nfc3opOworCX0gZWxzZSB7CisJCWwz cGFkX2J5dGVzID0gYXRoMTJrX2RwX3J4X2hfbDNwYWQoYWIsIGRlc2MpOworCisJCWlmICgoaGFs X3J4X2Rlc2Nfc3ogKyBsM3BhZF9ieXRlcyArIG1zZHVfbGVuKSA+IERQX1JYX0JVRkZFUl9TSVpF KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJc2tiX3B1dChtc2R1LCBoYWxfcnhfZGVzY19zeiAr IGwzcGFkX2J5dGVzICsgbXNkdV9sZW4pOworCQlza2JfcHVsbChtc2R1LCBoYWxfcnhfZGVzY19z eiArIGwzcGFkX2J5dGVzKTsKKwl9CisJYXRoMTJrX2RwX3J4X2hfcHBkdShhciwgZGVzYywgc3Rh dHVzKTsKKworCWF0aDEya19kcF9yeF9oX21wZHUoYXIsIG1zZHUsIGRlc2MsIHN0YXR1cyk7CisK KwlyeGNiLT50aWQgPSBhdGgxMmtfZHBfcnhfaF90aWQoYWIsIGRlc2MpOworCisJLyogUGxlYXNl IG5vdGUgdGhhdCBjYWxsZXIgd2lsbCBoYXZpbmcgdGhlIGFjY2VzcyB0byBtc2R1IGFuZCBjb21w bGV0aW5nCisJICogcnggd2l0aCBtYWM4MDIxMS4gTmVlZCBub3Qgd29ycnkgYWJvdXQgY2xlYW5p bmcgdXAgYW1zZHVfbGlzdC4KKwkgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCBh dGgxMmtfZHBfcnhfaF9yZW9fZXJyKHN0cnVjdCBhdGgxMmsgKmFyLCBzdHJ1Y3Qgc2tfYnVmZiAq bXNkdSwKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzLAorCQkJCSAg IHN0cnVjdCBza19idWZmX2hlYWQgKm1zZHVfbGlzdCkKK3sKKwlzdHJ1Y3QgYXRoMTJrX3NrYl9y eGNiICpyeGNiID0gQVRIMTJLX1NLQl9SWENCKG1zZHUpOworCWJvb2wgZHJvcCA9IGZhbHNlOwor CisJYXItPmFiLT5zb2Nfc3RhdHMucmVvX2Vycm9yW3J4Y2ItPmVycl9jb2RlXSsrOworCisJc3dp dGNoIChyeGNiLT5lcnJfY29kZSkgeworCWNhc2UgSEFMX1JFT19ERVNUX1JJTkdfRVJST1JfQ09E RV9ERVNDX0FERFJfWkVSTzoKKwkJaWYgKGF0aDEya19kcF9yeF9oX251bGxfcV9kZXNjKGFyLCBt c2R1LCBzdGF0dXMsIG1zZHVfbGlzdCkpCisJCQlkcm9wID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2Fz ZSBIQUxfUkVPX0RFU1RfUklOR19FUlJPUl9DT0RFX1BOX0NIRUNLX0ZBSUxFRDoKKwkJLyogVE9E TzogRG8gbm90IGRyb3AgUE4gZmFpbGVkIHBhY2tldHMgaW4gdGhlIGRyaXZlcjsKKwkJICogaW5z dGVhZCwgaXQgaXMgZ29vZCB0byBkcm9wIHN1Y2ggcGFja2V0cyBpbiBtYWM4MDIxMQorCQkgKiBh ZnRlciBpbmNyZW1lbnRpbmcgdGhlIHJlcGxheSBjb3VudGVycy4KKwkJICovCisJCWZhbGx0aHJv dWdoOworCWRlZmF1bHQ6CisJCS8qIFRPRE86IFJldmlldyBvdGhlciBlcnJvcnMgYW5kIHByb2Nl c3MgdGhlbSB0byBtYWM4MDIxMQorCQkgKiBhcyBhcHByb3ByaWF0ZS4KKwkJICovCisJCWRyb3Ag PSB0cnVlOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZHJvcDsKK30KKworc3RhdGljIHZvaWQg YXRoMTJrX2RwX3J4X2hfdGtpcF9taWNfZXJyKHN0cnVjdCBhdGgxMmsgKmFyLCBzdHJ1Y3Qgc2tf YnVmZiAqbXNkdSwKKwkJCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXR1cykKK3sK KwlzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiID0gYXItPmFiOworCXUxNiBtc2R1X2xlbjsKKwlzdHJ1 Y3QgaGFsX3J4X2Rlc2MgKmRlc2MgPSAoc3RydWN0IGhhbF9yeF9kZXNjICopbXNkdS0+ZGF0YTsK Kwl1OCBsM3BhZF9ieXRlczsKKwlzdHJ1Y3QgYXRoMTJrX3NrYl9yeGNiICpyeGNiID0gQVRIMTJL X1NLQl9SWENCKG1zZHUpOworCXUzMiBoYWxfcnhfZGVzY19zeiA9IGFyLT5hYi0+aHdfcGFyYW1z LT5oYWxfZGVzY19zejsKKworCXJ4Y2ItPmlzX2ZpcnN0X21zZHUgPSBhdGgxMmtfZHBfcnhfaF9m aXJzdF9tc2R1KGFiLCBkZXNjKTsKKwlyeGNiLT5pc19sYXN0X21zZHUgPSBhdGgxMmtfZHBfcnhf aF9sYXN0X21zZHUoYWIsIGRlc2MpOworCisJbDNwYWRfYnl0ZXMgPSBhdGgxMmtfZHBfcnhfaF9s M3BhZChhYiwgZGVzYyk7CisJbXNkdV9sZW4gPSBhdGgxMmtfZHBfcnhfaF9tc2R1X2xlbihhYiwg ZGVzYyk7CisJc2tiX3B1dChtc2R1LCBoYWxfcnhfZGVzY19zeiArIGwzcGFkX2J5dGVzICsgbXNk dV9sZW4pOworCXNrYl9wdWxsKG1zZHUsIGhhbF9yeF9kZXNjX3N6ICsgbDNwYWRfYnl0ZXMpOwor CisJYXRoMTJrX2RwX3J4X2hfcHBkdShhciwgZGVzYywgc3RhdHVzKTsKKworCXN0YXR1cy0+Zmxh ZyB8PSAoUlhfRkxBR19NTUlDX1NUUklQUEVEIHwgUlhfRkxBR19NTUlDX0VSUk9SIHwKKwkJCSBS WF9GTEFHX0RFQ1JZUFRFRCk7CisKKwlhdGgxMmtfZHBfcnhfaF91bmRlY2FwKGFyLCBtc2R1LCBk ZXNjLAorCQkJICAgICAgIEhBTF9FTkNSWVBUX1RZUEVfVEtJUF9NSUMsIHN0YXR1cywgZmFsc2Up OworfQorCitzdGF0aWMgYm9vbCBhdGgxMmtfZHBfcnhfaF9yeGRtYV9lcnIoc3RydWN0IGF0aDEy ayAqYXIsICBzdHJ1Y3Qgc2tfYnVmZiAqbXNkdSwKKwkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFf cnhfc3RhdHVzICpzdGF0dXMpCit7CisJc3RydWN0IGF0aDEya19iYXNlICphYiA9IGFyLT5hYjsK KwlzdHJ1Y3QgYXRoMTJrX3NrYl9yeGNiICpyeGNiID0gQVRIMTJLX1NLQl9SWENCKG1zZHUpOwor CXN0cnVjdCBoYWxfcnhfZGVzYyAqcnhfZGVzYyA9IChzdHJ1Y3QgaGFsX3J4X2Rlc2MgKiltc2R1 LT5kYXRhOworCWJvb2wgZHJvcCA9IGZhbHNlOworCXUzMiBlcnJfYml0bWFwOworCisJYXItPmFi LT5zb2Nfc3RhdHMucnhkbWFfZXJyb3JbcnhjYi0+ZXJyX2NvZGVdKys7CisKKwlzd2l0Y2ggKHJ4 Y2ItPmVycl9jb2RlKSB7CisJY2FzZSBIQUxfUkVPX0VOVFJfUklOR19SWERNQV9FQ09ERV9ERUNS WVBUX0VSUjoKKwljYXNlIEhBTF9SRU9fRU5UUl9SSU5HX1JYRE1BX0VDT0RFX1RLSVBfTUlDX0VS UjoKKwkJZXJyX2JpdG1hcCA9IGF0aDEya19kcF9yeF9oX21wZHVfZXJyKGFiLCByeF9kZXNjKTsK KwkJaWYgKGVycl9iaXRtYXAgJiBIQUxfUlhfTVBEVV9FUlJfVEtJUF9NSUMpIHsKKwkJCWF0aDEy a19kcF9yeF9oX3RraXBfbWljX2VycihhciwgbXNkdSwgc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9 CisJCWZhbGx0aHJvdWdoOworCWRlZmF1bHQ6CisJCS8qIFRPRE86IFJldmlldyBvdGhlciByeGRt YSBlcnJvciBjb2RlIHRvIGNoZWNrIGlmIGFueXRoaW5nIGlzCisJCSAqIHdvcnRoIHJlcG9ydGlu ZyB0byBtYWM4MDIxMQorCQkgKi8KKwkJZHJvcCA9IHRydWU7CisJCWJyZWFrOworCX0KKworCXJl dHVybiBkcm9wOworfQorCitzdGF0aWMgdm9pZCBhdGgxMmtfZHBfcnhfd2JtX2VycihzdHJ1Y3Qg YXRoMTJrICphciwKKwkJCQkgc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLAorCQkJCSBzdHJ1Y3Qg c2tfYnVmZiAqbXNkdSwKKwkJCQkgc3RydWN0IHNrX2J1ZmZfaGVhZCAqbXNkdV9saXN0KQorewor CXN0cnVjdCBhdGgxMmtfc2tiX3J4Y2IgKnJ4Y2IgPSBBVEgxMktfU0tCX1JYQ0IobXNkdSk7CisJ c3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgcnhzID0gezB9OworCWJvb2wgZHJvcCA9IHRydWU7 CisKKwlzd2l0Y2ggKHJ4Y2ItPmVycl9yZWxfc3JjKSB7CisJY2FzZSBIQUxfV0JNX1JFTF9TUkNf TU9EVUxFX1JFTzoKKwkJZHJvcCA9IGF0aDEya19kcF9yeF9oX3Jlb19lcnIoYXIsIG1zZHUsICZy eHMsIG1zZHVfbGlzdCk7CisJCWJyZWFrOworCWNhc2UgSEFMX1dCTV9SRUxfU1JDX01PRFVMRV9S WERNQToKKwkJZHJvcCA9IGF0aDEya19kcF9yeF9oX3J4ZG1hX2VycihhciwgbXNkdSwgJnJ4cyk7 CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIG1zZHUgd2lsbCBnZXQgZnJlZWQgKi8KKwkJYnJl YWs7CisJfQorCisJaWYgKGRyb3ApIHsKKwkJZGV2X2tmcmVlX3NrYl9hbnkobXNkdSk7CisJCXJl dHVybjsKKwl9CisKKwlhdGgxMmtfZHBfcnhfZGVsaXZlcl9tc2R1KGFyLCBuYXBpLCBtc2R1LCAm cnhzKTsKK30KKworaW50IGF0aDEya19kcF9yeF9wcm9jZXNzX3dibV9lcnIoc3RydWN0IGF0aDEy a19iYXNlICphYiwKKwkJCQkgc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQor eworCXN0cnVjdCBhdGgxMmsgKmFyOworCXN0cnVjdCBhdGgxMmtfZHAgKmRwID0gJmFiLT5kcDsK KwlzdHJ1Y3QgZHBfcnhkbWFfcmluZyAqcnhfcmluZzsKKwlzdHJ1Y3QgaGFsX3J4X3dibV9yZWxf aW5mbyBlcnJfaW5mbzsKKwlzdHJ1Y3QgaGFsX3NybmcgKnNybmc7CisJc3RydWN0IHNrX2J1ZmYg Km1zZHU7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBtc2R1X2xpc3RbTUFYX1JBRElPU107CisJc3Ry dWN0IGF0aDEya19za2JfcnhjYiAqcnhjYjsKKwl2b2lkICpyeF9kZXNjOworCWludCBtYWNfaWQ7 CisJaW50IG51bV9idWZmc19yZWFwZWQgPSAwOworCXN0cnVjdCBhdGgxMmtfcnhfZGVzY19pbmZv ICpkZXNjX2luZm87CisJaW50IHJldCwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhYi0+bnVtX3Jh ZGlvczsgaSsrKQorCQlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJm1zZHVfbGlzdFtpXSk7CisKKwlz cm5nID0gJmFiLT5oYWwuc3JuZ19saXN0W2RwLT5yeF9yZWxfcmluZy5yaW5nX2lkXTsKKwlyeF9y aW5nID0gJmRwLT5yeF9yZWZpbGxfYnVmX3Jpbmc7CisKKwlzcGluX2xvY2tfYmgoJnNybmctPmxv Y2spOworCisJYXRoMTJrX2hhbF9zcm5nX2FjY2Vzc19iZWdpbihhYiwgc3JuZyk7CisKKwl3aGls ZSAoYnVkZ2V0KSB7CisJCXJ4X2Rlc2MgPSBhdGgxMmtfaGFsX3NybmdfZHN0X2dldF9uZXh0X2Vu dHJ5KGFiLCBzcm5nKTsKKwkJaWYgKCFyeF9kZXNjKQorCQkJYnJlYWs7CisKKwkJcmV0ID0gYXRo MTJrX2hhbF93Ym1fZGVzY19wYXJzZV9lcnIoYWIsIHJ4X2Rlc2MsICZlcnJfaW5mbyk7CisJCWlm IChyZXQpIHsKKwkJCWF0aDEya193YXJuKGFiLAorCQkJCSAgICAiZmFpbGVkIHRvIHBhcnNlIHJ4 IGVycm9yIGluIHdibV9yZWwgcmluZyBkZXNjICVkXG4iLAorCQkJCSAgICByZXQpOworCQkJY29u dGludWU7CisJCX0KKworCQlkZXNjX2luZm8gPSAoc3RydWN0IGF0aDEya19yeF9kZXNjX2luZm8g KillcnJfaW5mby5yeF9kZXNjOworCisJCS8qIHJldHJ5IG1hbnVhbCBkZXNjIHJldHJpZXZhbCBp ZiBodyBjYyBpcyBub3QgZG9uZSAqLworCQlpZiAoIWRlc2NfaW5mbykgeworCQkJZGVzY19pbmZv ID0gYXRoMTJrX2RwX2dldF9yeF9kZXNjKGFiLCBlcnJfaW5mby5jb29raWUpOworCQkJaWYgKCFk ZXNjX2luZm8pIHsKKwkJCQlhdGgxMmtfd2FybihhYiwgIkludmFsaWQgY29va2llIGluIG1hbnVh bCBkZXNjIHJldHJpdmFsIik7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKiBGSVhN RTogRXh0cmFjdCBtYWMgaWQgY29ycmVjdGx5LiBTaW5jZSBkZXNjcyBhcmUgbm90IHRpZWQKKwkJ ICogdG8gbWFjLCB3ZSBjYW4gZXh0cmFjdCBmcm9tIHZkZXYgaWQgaW4gcmluZyBkZXNjLgorCQkg Ki8KKwkJbWFjX2lkID0gMDsKKworCQlpZiAoZGVzY19pbmZvLT5tYWdpYyAhPSBBVEgxMktfRFBf UlhfREVTQ19NQUdJQykKKwkJCWF0aDEya193YXJuKGFiLCAiV0JNIFJYIGVyciwgQ2hlY2sgSFcg Q0MgaW1wbGVtZW50YXRpb24iKTsKKworCQltc2R1ID0gZGVzY19pbmZvLT5za2I7CisJCWRlc2Nf aW5mby0+c2tiID0gTlVMTDsKKworCQlzcGluX2xvY2tfYmgoJmRwLT5yeF9kZXNjX2xvY2spOwor CQlsaXN0X21vdmVfdGFpbCgmZGVzY19pbmZvLT5saXN0LCAmZHAtPnJ4X2Rlc2NfZnJlZV9saXN0 KTsKKwkJc3Bpbl91bmxvY2tfYmgoJmRwLT5yeF9kZXNjX2xvY2spOworCisJCXJ4Y2IgPSBBVEgx MktfU0tCX1JYQ0IobXNkdSk7CisJCWRtYV91bm1hcF9zaW5nbGUoYWItPmRldiwgcnhjYi0+cGFk ZHIsCisJCQkJIG1zZHUtPmxlbiArIHNrYl90YWlscm9vbShtc2R1KSwKKwkJCQkgRE1BX0ZST01f REVWSUNFKTsKKworCQludW1fYnVmZnNfcmVhcGVkKys7CisKKwkJaWYgKCFlcnJfaW5mby5jb250 aW51YXRpb24pCisJCQlidWRnZXQtLTsKKworCQlpZiAoZXJyX2luZm8ucHVzaF9yZWFzb24gIT0K KwkJICAgIEhBTF9SRU9fREVTVF9SSU5HX1BVU0hfUkVBU09OX0VSUl9ERVRFQ1RFRCkgeworCQkJ ZGV2X2tmcmVlX3NrYl9hbnkobXNkdSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJ4Y2ItPmVy cl9yZWxfc3JjID0gZXJyX2luZm8uZXJyX3JlbF9zcmM7CisJCXJ4Y2ItPmVycl9jb2RlID0gZXJy X2luZm8uZXJyX2NvZGU7CisJCXJ4Y2ItPnJ4X2Rlc2MgPSAoc3RydWN0IGhhbF9yeF9kZXNjICop bXNkdS0+ZGF0YTsKKwkJX19za2JfcXVldWVfdGFpbCgmbXNkdV9saXN0W21hY19pZF0sIG1zZHUp OworCisJCXJ4Y2ItPmlzX2ZpcnN0X21zZHUgPSBlcnJfaW5mby5maXJzdF9tc2R1OworCQlyeGNi LT5pc19sYXN0X21zZHUgPSBlcnJfaW5mby5sYXN0X21zZHU7CisJCXJ4Y2ItPmlzX2NvbnRpbnVh dGlvbiA9IGVycl9pbmZvLmNvbnRpbnVhdGlvbjsKKwl9CisKKwlhdGgxMmtfaGFsX3NybmdfYWNj ZXNzX2VuZChhYiwgc3JuZyk7CisKKwlzcGluX3VubG9ja19iaCgmc3JuZy0+bG9jayk7CisKKwlp ZiAoIW51bV9idWZmc19yZWFwZWQpCisJCWdvdG8gZG9uZTsKKworCWF0aDEya19kcF9yeF9idWZz X3JlcGxlbmlzaChhYiwgMCwgcnhfcmluZywgbnVtX2J1ZmZzX3JlYXBlZCwKKwkJCQkgICAgYWIt Pmh3X3BhcmFtcy0+aGFsX3BhcmFtcy0+cnhfYnVmX3JibSwgdHJ1ZSk7CisKKwlyY3VfcmVhZF9s b2NrKCk7CisJZm9yIChpID0gMDsgaSA8ICBhYi0+bnVtX3JhZGlvczsgaSsrKSB7CisJCWlmICgh cmN1X2RlcmVmZXJlbmNlKGFiLT5wZGV2c19hY3RpdmVbaV0pKSB7CisJCQlfX3NrYl9xdWV1ZV9w dXJnZSgmbXNkdV9saXN0W2ldKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYXIgPSBhYi0+cGRl dnNbaV0uYXI7CisKKwkJaWYgKHRlc3RfYml0KEFUSDEyS19DQUNfUlVOTklORywgJmFyLT5kZXZf ZmxhZ3MpKSB7CisJCQlfX3NrYl9xdWV1ZV9wdXJnZSgmbXNkdV9saXN0W2ldKTsKKwkJCWNvbnRp bnVlOworCQl9CisKKwkJd2hpbGUgKChtc2R1ID0gX19za2JfZGVxdWV1ZSgmbXNkdV9saXN0W2ld KSkgIT0gTlVMTCkKKwkJCWF0aDEya19kcF9yeF93Ym1fZXJyKGFyLCBuYXBpLCBtc2R1LCAmbXNk dV9saXN0W2ldKTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7Citkb25lOgorCXJldHVybiBudW1f YnVmZnNfcmVhcGVkOworfQorCit2b2lkIGF0aDEya19kcF9yeF9wcm9jZXNzX3Jlb19zdGF0dXMo c3RydWN0IGF0aDEya19iYXNlICphYikKK3sKKwlzdHJ1Y3QgYXRoMTJrX2RwICpkcCA9ICZhYi0+ ZHA7CisJc3RydWN0IGhhbF90bHZfNjRfaGRyICpoZHI7CisJc3RydWN0IGhhbF9zcm5nICpzcm5n OworCXN0cnVjdCBhdGgxMmtfZHBfcnhfcmVvX2NtZCAqY21kLCAqdG1wOworCWJvb2wgZm91bmQg PSBmYWxzZTsKKwl1MTYgdGFnOworCXN0cnVjdCBoYWxfcmVvX3N0YXR1cyByZW9fc3RhdHVzOwor CisJc3JuZyA9ICZhYi0+aGFsLnNybmdfbGlzdFtkcC0+cmVvX3N0YXR1c19yaW5nLnJpbmdfaWRd OworCisJbWVtc2V0KCZyZW9fc3RhdHVzLCAwLCBzaXplb2YocmVvX3N0YXR1cykpOworCisJc3Bp bl9sb2NrX2JoKCZzcm5nLT5sb2NrKTsKKworCWF0aDEya19oYWxfc3JuZ19hY2Nlc3NfYmVnaW4o YWIsIHNybmcpOworCisJd2hpbGUgKChoZHIgPSBhdGgxMmtfaGFsX3NybmdfZHN0X2dldF9uZXh0 X2VudHJ5KGFiLCBzcm5nKSkpIHsKKwkJdGFnID0gdTY0X2dldF9iaXRzKGhkci0+dGwsIEhBTF9T Uk5HX1RMVl9IRFJfVEFHKTsKKworCQlzd2l0Y2ggKHRhZykgeworCQljYXNlIEhBTF9SRU9fR0VU X1FVRVVFX1NUQVRTX1NUQVRVUzoKKwkJCWF0aDEya19oYWxfcmVvX3N0YXR1c19xdWV1ZV9zdGF0 cyhhYiwgaGRyLAorCQkJCQkJCSAgJnJlb19zdGF0dXMpOworCQkJYnJlYWs7CisJCWNhc2UgSEFM X1JFT19GTFVTSF9RVUVVRV9TVEFUVVM6CisJCQlhdGgxMmtfaGFsX3Jlb19mbHVzaF9xdWV1ZV9z dGF0dXMoYWIsIGhkciwKKwkJCQkJCQkgICZyZW9fc3RhdHVzKTsKKwkJCWJyZWFrOworCQljYXNl IEhBTF9SRU9fRkxVU0hfQ0FDSEVfU1RBVFVTOgorCQkJYXRoMTJrX2hhbF9yZW9fZmx1c2hfY2Fj aGVfc3RhdHVzKGFiLCBoZHIsCisJCQkJCQkJICAmcmVvX3N0YXR1cyk7CisJCQlicmVhazsKKwkJ Y2FzZSBIQUxfUkVPX1VOQkxPQ0tfQ0FDSEVfU1RBVFVTOgorCQkJYXRoMTJrX2hhbF9yZW9fdW5i bGtfY2FjaGVfc3RhdHVzKGFiLCBoZHIsCisJCQkJCQkJICAmcmVvX3N0YXR1cyk7CisJCQlicmVh azsKKwkJY2FzZSBIQUxfUkVPX0ZMVVNIX1RJTUVPVVRfTElTVF9TVEFUVVM6CisJCQlhdGgxMmtf aGFsX3Jlb19mbHVzaF90aW1lb3V0X2xpc3Rfc3RhdHVzKGFiLCBoZHIsCisJCQkJCQkJCSAmcmVv X3N0YXR1cyk7CisJCQlicmVhazsKKwkJY2FzZSBIQUxfUkVPX0RFU0NSSVBUT1JfVEhSRVNIT0xE X1JFQUNIRURfU1RBVFVTOgorCQkJYXRoMTJrX2hhbF9yZW9fZGVzY190aHJlc2hfcmVhY2hlZF9z dGF0dXMoYWIsIGhkciwKKwkJCQkJCQkJICAmcmVvX3N0YXR1cyk7CisJCQlicmVhazsKKwkJY2Fz ZSBIQUxfUkVPX1VQREFURV9SWF9SRU9fUVVFVUVfU1RBVFVTOgorCQkJYXRoMTJrX2hhbF9yZW9f dXBkYXRlX3J4X3Jlb19xdWV1ZV9zdGF0dXMoYWIsIGhkciwKKwkJCQkJCQkJICAmcmVvX3N0YXR1 cyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWF0aDEya193YXJuKGFiLCAiVW5rbm93biBy ZW8gc3RhdHVzIHR5cGUgJWRcbiIsIHRhZyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXNwaW5f bG9ja19iaCgmZHAtPnJlb19jbWRfbG9jayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShj bWQsIHRtcCwgJmRwLT5yZW9fY21kX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChyZW9fc3RhdHVzLnVu aWZvcm1faGRyLmNtZF9udW0gPT0gY21kLT5jbWRfbnVtKSB7CisJCQkJZm91bmQgPSB0cnVlOwor CQkJCWxpc3RfZGVsKCZjbWQtPmxpc3QpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXNwaW5f dW5sb2NrX2JoKCZkcC0+cmVvX2NtZF9sb2NrKTsKKworCQlpZiAoZm91bmQpIHsKKwkJCWNtZC0+ aGFuZGxlcihkcCwgKHZvaWQgKikmY21kLT5kYXRhLAorCQkJCSAgICAgcmVvX3N0YXR1cy51bmlm b3JtX2hkci5jbWRfc3RhdHVzKTsKKwkJCWtmcmVlKGNtZCk7CisJCX0KKworCQlmb3VuZCA9IGZh bHNlOworCX0KKworCWF0aDEya19oYWxfc3JuZ19hY2Nlc3NfZW5kKGFiLCBzcm5nKTsKKworCXNw aW5fdW5sb2NrX2JoKCZzcm5nLT5sb2NrKTsKK30KKwordm9pZCBhdGgxMmtfZHBfcnhfZnJlZShz dHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiKQoreworCXN0cnVjdCBhdGgxMmtfZHAgKmRwID0gJmFiLT5k cDsKKwlpbnQgaTsKKworCWF0aDEya19kcF9zcm5nX2NsZWFudXAoYWIsICZkcC0+cnhfcmVmaWxs X2J1Zl9yaW5nLnJlZmlsbF9idWZfcmluZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWItPmh3X3Bh cmFtcy0+bnVtX3J4bWRhX3Blcl9wZGV2OyBpKyspIHsKKwkJaWYgKGFiLT5od19wYXJhbXMtPnJ4 X21hY19idWZfcmluZykKKwkJCWF0aDEya19kcF9zcm5nX2NsZWFudXAoYWIsICZkcC0+cnhfbWFj X2J1Zl9yaW5nW2ldKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgYWItPmh3X3BhcmFtcy0+bnVt X3J4ZG1hX2RzdF9yaW5nOyBpKyspCisJCWF0aDEya19kcF9zcm5nX2NsZWFudXAoYWIsICZkcC0+ cnhkbWFfZXJyX2RzdF9yaW5nW2ldKTsKKworCWF0aDEya19kcF9zcm5nX2NsZWFudXAoYWIsICZk cC0+cnhkbWFfbW9uX2J1Zl9yaW5nLnJlZmlsbF9idWZfcmluZyk7CisJYXRoMTJrX2RwX3Nybmdf Y2xlYW51cChhYiwgJmRwLT50eF9tb25fYnVmX3JpbmcucmVmaWxsX2J1Zl9yaW5nKTsKKworCWF0 aDEya19kcF9yeGRtYV9idWZfZnJlZShhYik7Cit9CisKK3ZvaWQgYXRoMTJrX2RwX3J4X3BkZXZf ZnJlZShzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLCBpbnQgbWFjX2lkKQoreworCXN0cnVjdCBhdGgx MmsgKmFyID0gYWItPnBkZXZzW21hY19pZF0uYXI7CisKKwlhdGgxMmtfZHBfcnhfcGRldl9zcm5n X2ZyZWUoYXIpOworfQorCitpbnQgYXRoMTJrX2RwX3J4ZG1hX3Jpbmdfc2VsX2NvbmZpZ19xY245 Mjc0KHN0cnVjdCBhdGgxMmtfYmFzZSAqYWIpCit7CisJc3RydWN0IGF0aDEya19kcCAqZHAgPSAm YWItPmRwOworCXN0cnVjdCBodHRfcnhfcmluZ190bHZfZmlsdGVyIHRsdl9maWx0ZXIgPSB7MH07 CisJdTMyIHJpbmdfaWQ7CisJaW50IHJldDsKKwl1MzIgaGFsX3J4X2Rlc2Nfc3ogPSBhYi0+aHdf cGFyYW1zLT5oYWxfZGVzY19zejsKKworCXJpbmdfaWQgPSBkcC0+cnhfcmVmaWxsX2J1Zl9yaW5n LnJlZmlsbF9idWZfcmluZy5yaW5nX2lkOworCisJdGx2X2ZpbHRlci5yeF9maWx0ZXIgPSBIVFRf UlhfVExWX0ZMQUdTX1JYRE1BX1JJTkc7CisJdGx2X2ZpbHRlci5wa3RfZmlsdGVyX2ZsYWdzMiA9 IEhUVF9SWF9GUF9DVFJMX1BLVF9GSUxURVJfVExWX0ZMQUdTMl9CQVI7CisJdGx2X2ZpbHRlci5w a3RfZmlsdGVyX2ZsYWdzMyA9IEhUVF9SWF9GUF9EQVRBX1BLVF9GSUxURVJfVExWX0ZMQVNHM19N Q0FTVCB8CisJCQkJCUhUVF9SWF9GUF9EQVRBX1BLVF9GSUxURVJfVExWX0ZMQVNHM19VQ0FTVCB8 CisJCQkJCUhUVF9SWF9GUF9EQVRBX1BLVF9GSUxURVJfVExWX0ZMQVNHM19OVUxMX0RBVEE7CisJ dGx2X2ZpbHRlci5vZmZzZXRfdmFsaWQgPSB0cnVlOworCXRsdl9maWx0ZXIucnhfcGFja2V0X29m ZnNldCA9IGhhbF9yeF9kZXNjX3N6OworCisJdGx2X2ZpbHRlci5yeF9tcGR1X3N0YXJ0X29mZnNl dCA9CisJCQlhYi0+aHdfcGFyYW1zLT5oYWxfb3BzLT5yeF9kZXNjX2dldF9tcGR1X3N0YXJ0X29m ZnNldCgpOworCXRsdl9maWx0ZXIucnhfbXNkdV9lbmRfb2Zmc2V0ID0KKwkJYWItPmh3X3BhcmFt cy0+aGFsX29wcy0+cnhfZGVzY19nZXRfbXNkdV9lbmRfb2Zmc2V0KCk7CisKKwkvKiBUT0RPOiBT ZWxlY3RpdmVseSBzdWJzY3JpYmUgdG8gcmVxdWlyZWQgcXdvcmRzIHdpdGhpbiBtc2R1X2VuZAor CSAqIGFuZCBtcGR1X3N0YXJ0IGFuZCBzZXR1cCB0aGUgbWFzayBpbiBiZWxvdyBtc2cKKwkgKiBh bmQgbW9kaWZ5IHRoZSByeF9kZXNjIHN0cnVjdAorCSAqLworCXJldCA9IGF0aDEya19kcF90eF9o dHRfcnhfZmlsdGVyX3NldHVwKGFiLCByaW5nX2lkLCAwLAorCQkJCQkgICAgICAgSEFMX1JYRE1B X0JVRiwKKwkJCQkJICAgICAgIERQX1JYRE1BX1JFRklMTF9SSU5HX1NJWkUsCisJCQkJCSAgICAg ICAmdGx2X2ZpbHRlcik7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYXRoMTJrX2RwX3J4ZG1h X3Jpbmdfc2VsX2NvbmZpZ193Y243ODUwKHN0cnVjdCBhdGgxMmtfYmFzZSAqYWIpCit7CisJc3Ry dWN0IGF0aDEya19kcCAqZHAgPSAmYWItPmRwOworCXN0cnVjdCBodHRfcnhfcmluZ190bHZfZmls dGVyIHRsdl9maWx0ZXIgPSB7MH07CisJdTMyIHJpbmdfaWQ7CisJaW50IHJldDsKKwl1MzIgaGFs X3J4X2Rlc2Nfc3ogPSBhYi0+aHdfcGFyYW1zLT5oYWxfZGVzY19zejsKKwlpbnQgaTsKKworCXJp bmdfaWQgPSBkcC0+cnhfcmVmaWxsX2J1Zl9yaW5nLnJlZmlsbF9idWZfcmluZy5yaW5nX2lkOwor CisJdGx2X2ZpbHRlci5yeF9maWx0ZXIgPSBIVFRfUlhfVExWX0ZMQUdTX1JYRE1BX1JJTkc7CisJ dGx2X2ZpbHRlci5wa3RfZmlsdGVyX2ZsYWdzMiA9IEhUVF9SWF9GUF9DVFJMX1BLVF9GSUxURVJf VExWX0ZMQUdTMl9CQVI7CisJdGx2X2ZpbHRlci5wa3RfZmlsdGVyX2ZsYWdzMyA9IEhUVF9SWF9G UF9EQVRBX1BLVF9GSUxURVJfVExWX0ZMQVNHM19NQ0FTVCB8CisJCQkJCUhUVF9SWF9GUF9EQVRB X1BLVF9GSUxURVJfVExWX0ZMQVNHM19VQ0FTVCB8CisJCQkJCUhUVF9SWF9GUF9EQVRBX1BLVF9G SUxURVJfVExWX0ZMQVNHM19OVUxMX0RBVEE7CisJdGx2X2ZpbHRlci5vZmZzZXRfdmFsaWQgPSB0 cnVlOworCXRsdl9maWx0ZXIucnhfcGFja2V0X29mZnNldCA9IGhhbF9yeF9kZXNjX3N6OworCisJ dGx2X2ZpbHRlci5yeF9oZWFkZXJfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGhhbF9yeF9kZXNj X3djbjc4NTAsIHBrdF9oZHJfdGx2KTsKKworCXRsdl9maWx0ZXIucnhfbXBkdV9zdGFydF9vZmZz ZXQgPQorCQkJYWItPmh3X3BhcmFtcy0+aGFsX29wcy0+cnhfZGVzY19nZXRfbXBkdV9zdGFydF9v ZmZzZXQoKTsKKwl0bHZfZmlsdGVyLnJ4X21zZHVfZW5kX29mZnNldCA9CisJCWFiLT5od19wYXJh bXMtPmhhbF9vcHMtPnJ4X2Rlc2NfZ2V0X21zZHVfZW5kX29mZnNldCgpOworCisJLyogVE9ETzog U2VsZWN0aXZlbHkgc3Vic2NyaWJlIHRvIHJlcXVpcmVkIHF3b3JkcyB3aXRoaW4gbXNkdV9lbmQK KwkgKiBhbmQgbXBkdV9zdGFydCBhbmQgc2V0dXAgdGhlIG1hc2sgaW4gYmVsb3cgbXNnCisJICog YW5kIG1vZGlmeSB0aGUgcnhfZGVzYyBzdHJ1Y3QKKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCBh Yi0+aHdfcGFyYW1zLT5udW1fcnhtZGFfcGVyX3BkZXY7IGkrKykgeworCQlyaW5nX2lkID0gZHAt PnJ4X21hY19idWZfcmluZ1tpXS5yaW5nX2lkOworCQlyZXQgPSBhdGgxMmtfZHBfdHhfaHR0X3J4 X2ZpbHRlcl9zZXR1cChhYiwgcmluZ19pZCwgaSwKKwkJCQkJCSAgICAgICBIQUxfUlhETUFfQlVG LAorCQkJCQkJICAgICAgIERQX1JYRE1BX1JFRklMTF9SSU5HX1NJWkUsCisJCQkJCQkgICAgICAg JnRsdl9maWx0ZXIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBhdGgxMmtfZHBfcnhf aHR0X3NldHVwKHN0cnVjdCBhdGgxMmtfYmFzZSAqYWIpCit7CisJc3RydWN0IGF0aDEya19kcCAq ZHAgPSAmYWItPmRwOworCXUzMiByaW5nX2lkOworCWludCBpLCByZXQ7CisKKwkvKiBUT0RPOiBO ZWVkIHRvIHZlcmlmeSB0aGUgSFRUIHNldHVwIGZvciBRQ045MjI0ICovCisJcmluZ19pZCA9IGRw LT5yeF9yZWZpbGxfYnVmX3JpbmcucmVmaWxsX2J1Zl9yaW5nLnJpbmdfaWQ7CisJcmV0ID0gYXRo MTJrX2RwX3R4X2h0dF9zcm5nX3NldHVwKGFiLCByaW5nX2lkLCAwLCBIQUxfUlhETUFfQlVGKTsK KwlpZiAocmV0KSB7CisJCWF0aDEya193YXJuKGFiLCAiZmFpbGVkIHRvIGNvbmZpZ3VyZSByeF9y ZWZpbGxfYnVmX3JpbmcgJWRcbiIsCisJCQkgICAgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisK KwlpZiAoYWItPmh3X3BhcmFtcy0+cnhfbWFjX2J1Zl9yaW5nKSB7CisJCWZvciAoaSA9IDA7IGkg PCBhYi0+aHdfcGFyYW1zLT5udW1fcnhtZGFfcGVyX3BkZXY7IGkrKykgeworCQkJcmluZ19pZCA9 IGRwLT5yeF9tYWNfYnVmX3JpbmdbaV0ucmluZ19pZDsKKwkJCXJldCA9IGF0aDEya19kcF90eF9o dHRfc3JuZ19zZXR1cChhYiwgcmluZ19pZCwKKwkJCQkJCQkgIGksIEhBTF9SWERNQV9CVUYpOwor CQkJaWYgKHJldCkgeworCQkJCWF0aDEya193YXJuKGFiLCAiZmFpbGVkIHRvIGNvbmZpZ3VyZSBy eF9tYWNfYnVmX3JpbmclZCAlZFxuIiwKKwkJCQkJICAgIGksIHJldCk7CisJCQkJcmV0dXJuIHJl dDsKKwkJCX0KKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBhYi0+aHdfcGFyYW1zLT5udW1f cnhkbWFfZHN0X3Jpbmc7IGkrKykgeworCQlyaW5nX2lkID0gZHAtPnJ4ZG1hX2Vycl9kc3Rfcmlu Z1tpXS5yaW5nX2lkOworCQlyZXQgPSBhdGgxMmtfZHBfdHhfaHR0X3Nybmdfc2V0dXAoYWIsIHJp bmdfaWQsCisJCQkJCQkgIGksIEhBTF9SWERNQV9EU1QpOworCQlpZiAocmV0KSB7CisJCQlhdGgx Mmtfd2FybihhYiwgImZhaWxlZCB0byBjb25maWd1cmUgcnhkbWFfZXJyX2Rlc3RfcmluZyVkICVk XG4iLAorCQkJCSAgICBpLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWlmIChh Yi0+aHdfcGFyYW1zLT5yeGRtYTFfZW5hYmxlKSB7CisJCXJpbmdfaWQgPSBkcC0+cnhkbWFfbW9u X2J1Zl9yaW5nLnJlZmlsbF9idWZfcmluZy5yaW5nX2lkOworCQlyZXQgPSBhdGgxMmtfZHBfdHhf aHR0X3Nybmdfc2V0dXAoYWIsIHJpbmdfaWQsCisJCQkJCQkgIDAsIEhBTF9SWERNQV9NT05JVE9S X0JVRik7CisJCWlmIChyZXQpIHsKKwkJCWF0aDEya193YXJuKGFiLCAiZmFpbGVkIHRvIGNvbmZp Z3VyZSByeGRtYV9tb25fYnVmX3JpbmcgJWRcbiIsCisJCQkJICAgIHJldCk7CisJCQlyZXR1cm4g cmV0OworCQl9CisKKwkJcmluZ19pZCA9IGRwLT50eF9tb25fYnVmX3JpbmcucmVmaWxsX2J1Zl9y aW5nLnJpbmdfaWQ7CisJCXJldCA9IGF0aDEya19kcF90eF9odHRfc3JuZ19zZXR1cChhYiwgcmlu Z19pZCwKKwkJCQkJCSAgMCwgSEFMX1RYX01PTklUT1JfQlVGKTsKKwkJaWYgKHJldCkgeworCQkJ YXRoMTJrX3dhcm4oYWIsICJmYWlsZWQgdG8gY29uZmlndXJlIHJ4ZG1hX21vbl9idWZfcmluZyAl ZFxuIiwKKwkJCQkgICAgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXQgPSBh Yi0+aHdfcGFyYW1zLT5od19vcHMtPnJ4ZG1hX3Jpbmdfc2VsX2NvbmZpZyhhYik7CisJaWYgKHJl dCkgeworCQlhdGgxMmtfd2FybihhYiwgImZhaWxlZCB0byBzZXR1cCByeGRtYSByaW5nIHNlbGVj dGlvbiBjb25maWdcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitp bnQgYXRoMTJrX2RwX3J4X2FsbG9jKHN0cnVjdCBhdGgxMmtfYmFzZSAqYWIpCit7CisJc3RydWN0 IGF0aDEya19kcCAqZHAgPSAmYWItPmRwOworCWludCBpLCByZXQ7CisKKwlpZHJfaW5pdCgmZHAt PnJ4X3JlZmlsbF9idWZfcmluZy5idWZzX2lkcik7CisJc3Bpbl9sb2NrX2luaXQoJmRwLT5yeF9y ZWZpbGxfYnVmX3JpbmcuaWRyX2xvY2spOworCisJaWRyX2luaXQoJmRwLT5yeGRtYV9tb25fYnVm X3JpbmcuYnVmc19pZHIpOworCXNwaW5fbG9ja19pbml0KCZkcC0+cnhkbWFfbW9uX2J1Zl9yaW5n Lmlkcl9sb2NrKTsKKworCWlkcl9pbml0KCZkcC0+dHhfbW9uX2J1Zl9yaW5nLmJ1ZnNfaWRyKTsK KwlzcGluX2xvY2tfaW5pdCgmZHAtPnR4X21vbl9idWZfcmluZy5pZHJfbG9jayk7CisKKwlyZXQg PSBhdGgxMmtfZHBfc3JuZ19zZXR1cChhYiwKKwkJCQkgICAmZHAtPnJ4X3JlZmlsbF9idWZfcmlu Zy5yZWZpbGxfYnVmX3JpbmcsCisJCQkJICAgSEFMX1JYRE1BX0JVRiwgMCwgMCwKKwkJCQkgICBE UF9SWERNQV9CVUZfUklOR19TSVpFKTsKKwlpZiAocmV0KSB7CisJCWF0aDEya193YXJuKGFiLCAi ZmFpbGVkIHRvIHNldHVwIHJ4X3JlZmlsbF9idWZfcmluZ1xuIik7CisJCXJldHVybiByZXQ7CisJ fQorCisJaWYgKGFiLT5od19wYXJhbXMtPnJ4X21hY19idWZfcmluZykgeworCQlmb3IgKGkgPSAw OyBpIDwgYWItPmh3X3BhcmFtcy0+bnVtX3J4bWRhX3Blcl9wZGV2OyBpKyspIHsKKwkJCXJldCA9 IGF0aDEya19kcF9zcm5nX3NldHVwKGFiLAorCQkJCQkJICAgJmRwLT5yeF9tYWNfYnVmX3Jpbmdb aV0sCisJCQkJCQkgICBIQUxfUlhETUFfQlVGLCAxLAorCQkJCQkJICAgaSwgMTAyNCk7CisJCQlp ZiAocmV0KSB7CisJCQkJYXRoMTJrX3dhcm4oYWIsICJmYWlsZWQgdG8gc2V0dXAgcnhfbWFjX2J1 Zl9yaW5nICVkXG4iLAorCQkJCQkgICAgaSk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQor CX0KKworCWZvciAoaSA9IDA7IGkgPCBhYi0+aHdfcGFyYW1zLT5udW1fcnhkbWFfZHN0X3Jpbmc7 IGkrKykgeworCQlyZXQgPSBhdGgxMmtfZHBfc3JuZ19zZXR1cChhYiwgJmRwLT5yeGRtYV9lcnJf ZHN0X3JpbmdbaV0sCisJCQkJCSAgIEhBTF9SWERNQV9EU1QsIDAsIGksCisJCQkJCSAgIERQX1JY RE1BX0VSUl9EU1RfUklOR19TSVpFKTsKKwkJaWYgKHJldCkgeworCQkJYXRoMTJrX3dhcm4oYWIs ICJmYWlsZWQgdG8gc2V0dXAgcnhkbWFfZXJyX2RzdF9yaW5nICVkXG4iLCBpKTsKKwkJCXJldHVy biByZXQ7CisJCX0KKwl9CisKKwlpZiAoYWItPmh3X3BhcmFtcy0+cnhkbWExX2VuYWJsZSkgewor CQlyZXQgPSBhdGgxMmtfZHBfc3JuZ19zZXR1cChhYiwKKwkJCQkJICAgJmRwLT5yeGRtYV9tb25f YnVmX3JpbmcucmVmaWxsX2J1Zl9yaW5nLAorCQkJCQkgICBIQUxfUlhETUFfTU9OSVRPUl9CVUYs IDAsIDAsCisJCQkJCSAgIERQX1JYRE1BX01PTklUT1JfQlVGX1JJTkdfU0laRSk7CisJCWlmIChy ZXQpIHsKKwkJCWF0aDEya193YXJuKGFiLCAiZmFpbGVkIHRvIHNldHVwIEhBTF9SWERNQV9NT05J VE9SX0JVRlxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gYXRoMTJrX2RwX3Ny bmdfc2V0dXAoYWIsCisJCQkJCSAgICZkcC0+dHhfbW9uX2J1Zl9yaW5nLnJlZmlsbF9idWZfcmlu ZywKKwkJCQkJICAgSEFMX1RYX01PTklUT1JfQlVGLCAwLCAwLAorCQkJCQkgICBEUF9UWF9NT05J VE9SX0JVRl9SSU5HX1NJWkUpOworCQlpZiAocmV0KSB7CisJCQlhdGgxMmtfd2FybihhYiwgImZh aWxlZCB0byBzZXR1cCBEUF9UWF9NT05JVE9SX0JVRl9SSU5HX1NJWkVcbiIpOworCQkJcmV0dXJu IHJldDsKKwkJfQorCX0KKworCXJldCA9IGF0aDEya19kcF9yeGRtYV9idWZfc2V0dXAoYWIpOwor CWlmIChyZXQpIHsKKwkJYXRoMTJrX3dhcm4oYWIsICJmYWlsZWQgdG8gc2V0dXAgcnhkbWEgcmlu Z1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBhdGgxMmtf ZHBfcnhfcGRldl9hbGxvYyhzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLCBpbnQgbWFjX2lkKQorewor CXN0cnVjdCBhdGgxMmsgKmFyID0gYWItPnBkZXZzW21hY19pZF0uYXI7CisJc3RydWN0IGF0aDEy a19wZGV2X2RwICpkcCA9ICZhci0+ZHA7CisJdTMyIHJpbmdfaWQ7CisJaW50IGk7CisJaW50IHJl dDsKKworCWlmICghYWItPmh3X3BhcmFtcy0+cnhkbWExX2VuYWJsZSkKKwkJZ290byBvdXQ7CisK KwlyZXQgPSBhdGgxMmtfZHBfcnhfcGRldl9zcm5nX2FsbG9jKGFyKTsKKwlpZiAocmV0KSB7CisJ CWF0aDEya193YXJuKGFiLCAiZmFpbGVkIHRvIHNldHVwIHJ4IHNybmdzXG4iKTsKKwkJcmV0dXJu IHJldDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgYWItPmh3X3BhcmFtcy0+bnVtX3J4bWRhX3Bl cl9wZGV2OyBpKyspIHsKKwkJcmluZ19pZCA9IGRwLT5yeGRtYV9tb25fZHN0X3JpbmdbaV0ucmlu Z19pZDsKKwkJcmV0ID0gYXRoMTJrX2RwX3R4X2h0dF9zcm5nX3NldHVwKGFiLCByaW5nX2lkLAor CQkJCQkJICBtYWNfaWQgKyBpLAorCQkJCQkJICBIQUxfUlhETUFfTU9OSVRPUl9EU1QpOworCQlp ZiAocmV0KSB7CisJCQlhdGgxMmtfd2FybihhYiwKKwkJCQkgICAgImZhaWxlZCB0byBjb25maWd1 cmUgcnhkbWFfbW9uX2RzdF9yaW5nICVkICVkXG4iLAorCQkJCSAgICBpLCByZXQpOworCQkJcmV0 dXJuIHJldDsKKwkJfQorCisJCXJpbmdfaWQgPSBkcC0+dHhfbW9uX2RzdF9yaW5nW2ldLnJpbmdf aWQ7CisJCXJldCA9IGF0aDEya19kcF90eF9odHRfc3JuZ19zZXR1cChhYiwgcmluZ19pZCwKKwkJ CQkJCSAgbWFjX2lkICsgaSwKKwkJCQkJCSAgSEFMX1RYX01PTklUT1JfRFNUKTsKKwkJaWYgKHJl dCkgeworCQkJYXRoMTJrX3dhcm4oYWIsCisJCQkJICAgICJmYWlsZWQgdG8gY29uZmlndXJlIHR4 X21vbl9kc3RfcmluZyAlZCAlZFxuIiwKKwkJCQkgICAgaSwgcmV0KTsKKwkJCXJldHVybiByZXQ7 CisJCX0KKwl9CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRoMTJrX2RwX3J4 X3BkZXZfbW9uX3N0YXR1c19hdHRhY2goc3RydWN0IGF0aDEyayAqYXIpCit7CisJc3RydWN0IGF0 aDEya19wZGV2X2RwICpkcCA9ICZhci0+ZHA7CisJc3RydWN0IGF0aDEya19tb25fZGF0YSAqcG1v biA9IChzdHJ1Y3QgYXRoMTJrX21vbl9kYXRhICopJmRwLT5tb25fZGF0YTsKKworCXNrYl9xdWV1 ZV9oZWFkX2luaXQoJnBtb24tPnJ4X3N0YXR1c19xKTsKKworCXBtb24tPm1vbl9wcGR1X3N0YXR1 cyA9IERQX1BQRFVfU1RBVFVTX1NUQVJUOworCisJbWVtc2V0KCZwbW9uLT5yeF9tb25fc3RhdHMs IDAsCisJICAgICAgIHNpemVvZihwbW9uLT5yeF9tb25fc3RhdHMpKTsKKwlyZXR1cm4gMDsKK30K KworaW50IGF0aDEya19kcF9yeF9wZGV2X21vbl9hdHRhY2goc3RydWN0IGF0aDEyayAqYXIpCit7 CisJc3RydWN0IGF0aDEya19wZGV2X2RwICpkcCA9ICZhci0+ZHA7CisJc3RydWN0IGF0aDEya19t b25fZGF0YSAqcG1vbiA9ICZkcC0+bW9uX2RhdGE7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBh dGgxMmtfZHBfcnhfcGRldl9tb25fc3RhdHVzX2F0dGFjaChhcik7CisJaWYgKHJldCkgeworCQlh dGgxMmtfd2Fybihhci0+YWIsICJwZGV2X21vbl9zdGF0dXNfYXR0YWNoKCkgZmFpbGVkIik7CisJ CXJldHVybiByZXQ7CisJfQorCisJLyogaWYgcnhkbWExX2VuYWJsZSBpcyBmYWxzZSwgbm8gbmVl ZCB0byBzZXR1cAorCSAqIHJ4ZG1hX21vbl9kZXNjX3JpbmcuCisJICovCisJaWYgKCFhci0+YWIt Pmh3X3BhcmFtcy0+cnhkbWExX2VuYWJsZSkKKwkJcmV0dXJuIDA7CisKKwlwbW9uLT5tb25fbGFz dF9saW5rZGVzY19wYWRkciA9IDA7CisJcG1vbi0+bW9uX2xhc3RfYnVmX2Nvb2tpZSA9IERQX1JY X0RFU0NfQ09PS0lFX01BWCArIDE7CisJc3Bpbl9sb2NrX2luaXQoJnBtb24tPm1vbl9sb2NrKTsK KworCXJldHVybiAwOworfQorCitpbnQgYXRoMTJrX2RwX3J4X3BrdGxvZ19zdGFydChzdHJ1Y3Qg YXRoMTJrX2Jhc2UgKmFiKQoreworCS8qIHN0YXJ0IHJlYXAgdGltZXIgKi8KKwltb2RfdGltZXIo JmFiLT5tb25fcmVhcF90aW1lciwKKwkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhBVEgx MktfTU9OX1RJTUVSX0lOVEVSVkFMKSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGF0aDEya19k cF9yeF9wa3Rsb2dfc3RvcChzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiLCBib29sIHN0b3BfdGltZXIp Cit7CisJaW50IHJldDsKKworCWlmIChzdG9wX3RpbWVyKQorCQlkZWxfdGltZXJfc3luYygmYWIt Pm1vbl9yZWFwX3RpbWVyKTsKKworCS8qIHJlYXAgYWxsIHRoZSBtb25pdG9yIHJlbGF0ZWQgcmlu Z3MgKi8KKwlyZXQgPSBhdGgxMmtfZHBfcHVyZ2VfbW9uX3JpbmcoYWIpOworCWlmIChyZXQpIHsK KwkJYXRoMTJrX3dhcm4oYWIsICJmYWlsZWQgdG8gcHVyZ2UgZHAgbW9uIHJpbmc6ICVkXG4iLCBy ZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQoKCi0tIAphdGgxMmsgbWFp bGluZyBsaXN0CmF0aDEya0BsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHBzOi8vbGlzdHMuaW5mcmFk ZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2F0aDEyawo=