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 35C18C4332F for ; Wed, 16 Nov 2022 16:39:52 +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=nz9VTtp0JgsLVrIX+3P3wN5xU0dAm7CYXqqN3xegKjo=; b=bT67vXR9zB1zp+ vg75y/sdArvrtVffmcvCNmRyCtcDayhcxFbTRnqPnT0I1Nd8dQ9IBPh1/VVnWDde9fEsWXBSCiLgd i3At2ZHd1Q3S2dfnvr/PakH8dFjO2iO4eIDWXkbR+of8E+zCAfncTGsMOXl6BVUpMFiIkmwy0Sobg 9+a4qgCEeDiwIU0erLBahbeixMoZP/1U/RM40FBLJpad9qFIaUcjUQfK7nlrtDHzszH3BgxE4qHLJ z1OXgh63EVndYkaIrJAMJ0t4azlJNoamPf4hj4x0p1n1vnIuCaD+DpoQ/W0+YF6zie8XYb/lG/82G VaTtaxaaBA+Qbqqy/dIA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1ovLS3-005yPg-JQ for ath12k@archiver.kernel.org; Wed, 16 Nov 2022 16:39:51 +0000 Received: from desiato.infradead.org ([2001:8b0:10b:1:d65d:64ff:fe57:4e05]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1ovLS2-005yNo-9Z for ath12k@bombadil.infradead.org; Wed, 16 Nov 2022 16:39:50 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=desiato.20200630; h=Content-Transfer-Encoding:Content-Type :MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Sender:Reply-To:Content-ID:Content-Description; bh=j8W5WOOaK6QCsRXHWD5LdrDdIH7iy++74d+5Xn1u7Y0=; b=KHHryHc/baxrKxd7KEURkdb3kj G9Ezby7uCkaRYY7dbplek03SeP2Yf8UJnwpbjZNl6j21HeAa3ohZQKyAex5JkYJywlikUjmw/Zizc yFdIdSQRmcAhejymM3TPtFjJS73jBRnK8MPRd7VVeGWJ9KIlnIOquk/ro6MXh/cjnq+C/D6ktvuo2 CI6d91gkmEJnEugEd3Ky2QwQX2jp/FZUnHAKRI/CUFmn1aI1Uv0v4pR8ClQ1V4QGMCX5VoWZkvy78 ZTz4HnGt9+C3e0vHXpwg8t0sE4Jv/438fqOamLWXkngLiG5ERTP1HffwZbBHm0wgdtlnAOYLSg1xv 5sAKF7MA==; Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by desiato.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1ovLRu-001Oz2-1o for ath12k@lists.infradead.org; Wed, 16 Nov 2022 16:39:47 +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 dfw.source.kernel.org (Postfix) with ESMTPS id BBEBA61EE8 for ; Wed, 16 Nov 2022 16:39:40 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id DC6EFC433B5; Wed, 16 Nov 2022 16:39:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1668616780; bh=12JkcvNb9qy0B0MgQC1nD8QVJ1VzdH7nPmam4UVPA8g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qNJ4Ir/VPf0EDbJkmN2U2pzplsXgSFVyMbur/+BCiuMjKICGAAvpSpyivF27ml3vB tu2cd81Y6pqP5Y3zWtbh7KL4WiuR9E4XKP+eytAfyCLJXz5MBu+oVd8hzxBM7PUxg+ GElOSot0KGGNt8mDJw3coUDXsQm59DO2ep7jxF4qTvCdUEMlsVcgE89Bh7Hd+chrLL T2SistAU6uBrbnkGxVwCtlpWRhl6llbjmtoMeM4bzJFPEdI3REuJEeab0F8Kvkfl1m n90mYS/gQpzR2iO+LpuNvSO9MX8nkvN+1oi3xjflXshDsBt6X46d8g+sgfHiTkRCY0 F6qWQuk6Kslgw== From: Kalle Valo To: linux-wireless@vger.kernel.org Cc: ath12k@lists.infradead.org Subject: [PATCH v2 31/50] wifi: ath12k: add mac.c Date: Wed, 16 Nov 2022 18:38:43 +0200 Message-Id: <20221116163902.24996-32-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 LmNvbT4KLS0tCiBkcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTJrL21hYy5jIHwgNzAzOCAr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDEgZmlsZSBjaGFuZ2VkLCA3MDM4IGlu c2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTJr L21hYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEyay9tYWMuYwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmFjNjU0OGMwODdiYQotLS0gL2Rldi9udWxs CisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMmsvbWFjLmMKQEAgLTAsMCArMSw3 MDM4IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlLUNsZWFyCisv KgorICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjEgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCBy aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMjEtMjAyMiBRdWFsY29tbSBJbm5v dmF0aW9uIENlbnRlciwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICovCisKKyNpbmNsdWRl IDxuZXQvbWFjODAyMTEuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1 ZGUgIm1hYy5oIgorI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1 ZGUgIndtaS5oIgorI2luY2x1ZGUgImh3LmgiCisjaW5jbHVkZSAiZHBfdHguaCIKKyNpbmNsdWRl ICJkcF9yeC5oIgorI2luY2x1ZGUgInBlZXIuaCIKKworI2RlZmluZSBDSEFOMkcoX2NoYW5uZWws IF9mcmVxLCBfZmxhZ3MpIHsgXAorCS5iYW5kICAgICAgICAgICAgICAgICAgID0gTkw4MDIxMV9C QU5EXzJHSFosIFwKKwkuaHdfdmFsdWUgICAgICAgICAgICAgICA9IChfY2hhbm5lbCksIFwKKwku Y2VudGVyX2ZyZXEgICAgICAgICAgICA9IChfZnJlcSksIFwKKwkuZmxhZ3MgICAgICAgICAgICAg ICAgICA9IChfZmxhZ3MpLCBcCisJLm1heF9hbnRlbm5hX2dhaW4gICAgICAgPSAwLCBcCisJLm1h eF9wb3dlciAgICAgICAgICAgICAgPSAzMCwgXAorfQorCisjZGVmaW5lIENIQU41RyhfY2hhbm5l bCwgX2ZyZXEsIF9mbGFncykgeyBcCisJLmJhbmQgICAgICAgICAgICAgICAgICAgPSBOTDgwMjEx X0JBTkRfNUdIWiwgXAorCS5od192YWx1ZSAgICAgICAgICAgICAgID0gKF9jaGFubmVsKSwgXAor CS5jZW50ZXJfZnJlcSAgICAgICAgICAgID0gKF9mcmVxKSwgXAorCS5mbGFncyAgICAgICAgICAg ICAgICAgID0gKF9mbGFncyksIFwKKwkubWF4X2FudGVubmFfZ2FpbiAgICAgICA9IDAsIFwKKwku bWF4X3Bvd2VyICAgICAgICAgICAgICA9IDMwLCBcCit9CisKKyNkZWZpbmUgQ0hBTjZHKF9jaGFu bmVsLCBfZnJlcSwgX2ZsYWdzKSB7IFwKKwkuYmFuZCAgICAgICAgICAgICAgICAgICA9IE5MODAy MTFfQkFORF82R0haLCBcCisJLmh3X3ZhbHVlICAgICAgICAgICAgICAgPSAoX2NoYW5uZWwpLCBc CisJLmNlbnRlcl9mcmVxICAgICAgICAgICAgPSAoX2ZyZXEpLCBcCisJLmZsYWdzICAgICAgICAg ICAgICAgICAgPSAoX2ZsYWdzKSwgXAorCS5tYXhfYW50ZW5uYV9nYWluICAgICAgID0gMCwgXAor CS5tYXhfcG93ZXIgICAgICAgICAgICAgID0gMzAsIFwKK30KKworc3RhdGljIGNvbnN0IHN0cnVj dCBpZWVlODAyMTFfY2hhbm5lbCBhdGgxMmtfMmdoel9jaGFubmVsc1tdID0geworCUNIQU4yRygx LCAyNDEyLCAwKSwKKwlDSEFOMkcoMiwgMjQxNywgMCksCisJQ0hBTjJHKDMsIDI0MjIsIDApLAor CUNIQU4yRyg0LCAyNDI3LCAwKSwKKwlDSEFOMkcoNSwgMjQzMiwgMCksCisJQ0hBTjJHKDYsIDI0 MzcsIDApLAorCUNIQU4yRyg3LCAyNDQyLCAwKSwKKwlDSEFOMkcoOCwgMjQ0NywgMCksCisJQ0hB TjJHKDksIDI0NTIsIDApLAorCUNIQU4yRygxMCwgMjQ1NywgMCksCisJQ0hBTjJHKDExLCAyNDYy LCAwKSwKKwlDSEFOMkcoMTIsIDI0NjcsIDApLAorCUNIQU4yRygxMywgMjQ3MiwgMCksCisJQ0hB TjJHKDE0LCAyNDg0LCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2No YW5uZWwgYXRoMTJrXzVnaHpfY2hhbm5lbHNbXSA9IHsKKwlDSEFONUcoMzYsIDUxODAsIDApLAor CUNIQU41Ryg0MCwgNTIwMCwgMCksCisJQ0hBTjVHKDQ0LCA1MjIwLCAwKSwKKwlDSEFONUcoNDgs IDUyNDAsIDApLAorCUNIQU41Ryg1MiwgNTI2MCwgMCksCisJQ0hBTjVHKDU2LCA1MjgwLCAwKSwK KwlDSEFONUcoNjAsIDUzMDAsIDApLAorCUNIQU41Ryg2NCwgNTMyMCwgMCksCisJQ0hBTjVHKDEw MCwgNTUwMCwgMCksCisJQ0hBTjVHKDEwNCwgNTUyMCwgMCksCisJQ0hBTjVHKDEwOCwgNTU0MCwg MCksCisJQ0hBTjVHKDExMiwgNTU2MCwgMCksCisJQ0hBTjVHKDExNiwgNTU4MCwgMCksCisJQ0hB TjVHKDEyMCwgNTYwMCwgMCksCisJQ0hBTjVHKDEyNCwgNTYyMCwgMCksCisJQ0hBTjVHKDEyOCwg NTY0MCwgMCksCisJQ0hBTjVHKDEzMiwgNTY2MCwgMCksCisJQ0hBTjVHKDEzNiwgNTY4MCwgMCks CisJQ0hBTjVHKDE0MCwgNTcwMCwgMCksCisJQ0hBTjVHKDE0NCwgNTcyMCwgMCksCisJQ0hBTjVH KDE0OSwgNTc0NSwgMCksCisJQ0hBTjVHKDE1MywgNTc2NSwgMCksCisJQ0hBTjVHKDE1NywgNTc4 NSwgMCksCisJQ0hBTjVHKDE2MSwgNTgwNSwgMCksCisJQ0hBTjVHKDE2NSwgNTgyNSwgMCksCisJ Q0hBTjVHKDE2OSwgNTg0NSwgMCksCisJQ0hBTjVHKDE3MywgNTg2NSwgMCksCit9OworCitzdGF0 aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIGF0aDEya182Z2h6X2NoYW5uZWxzW10g PSB7CisJQ0hBTjZHKDEsIDU5NTUsIDApLAorCUNIQU42Ryg1LCA1OTc1LCAwKSwKKwlDSEFONkco OSwgNTk5NSwgMCksCisJQ0hBTjZHKDEzLCA2MDE1LCAwKSwKKwlDSEFONkcoMTcsIDYwMzUsIDAp LAorCUNIQU42RygyMSwgNjA1NSwgMCksCisJQ0hBTjZHKDI1LCA2MDc1LCAwKSwKKwlDSEFONkco MjksIDYwOTUsIDApLAorCUNIQU42RygzMywgNjExNSwgMCksCisJQ0hBTjZHKDM3LCA2MTM1LCAw KSwKKwlDSEFONkcoNDEsIDYxNTUsIDApLAorCUNIQU42Ryg0NSwgNjE3NSwgMCksCisJQ0hBTjZH KDQ5LCA2MTk1LCAwKSwKKwlDSEFONkcoNTMsIDYyMTUsIDApLAorCUNIQU42Ryg1NywgNjIzNSwg MCksCisJQ0hBTjZHKDYxLCA2MjU1LCAwKSwKKwlDSEFONkcoNjUsIDYyNzUsIDApLAorCUNIQU42 Ryg2OSwgNjI5NSwgMCksCisJQ0hBTjZHKDczLCA2MzE1LCAwKSwKKwlDSEFONkcoNzcsIDYzMzUs IDApLAorCUNIQU42Ryg4MSwgNjM1NSwgMCksCisJQ0hBTjZHKDg1LCA2Mzc1LCAwKSwKKwlDSEFO NkcoODksIDYzOTUsIDApLAorCUNIQU42Ryg5MywgNjQxNSwgMCksCisJQ0hBTjZHKDk3LCA2NDM1 LCAwKSwKKwlDSEFONkcoMTAxLCA2NDU1LCAwKSwKKwlDSEFONkcoMTA1LCA2NDc1LCAwKSwKKwlD SEFONkcoMTA5LCA2NDk1LCAwKSwKKwlDSEFONkcoMTEzLCA2NTE1LCAwKSwKKwlDSEFONkcoMTE3 LCA2NTM1LCAwKSwKKwlDSEFONkcoMTIxLCA2NTU1LCAwKSwKKwlDSEFONkcoMTI1LCA2NTc1LCAw KSwKKwlDSEFONkcoMTI5LCA2NTk1LCAwKSwKKwlDSEFONkcoMTMzLCA2NjE1LCAwKSwKKwlDSEFO NkcoMTM3LCA2NjM1LCAwKSwKKwlDSEFONkcoMTQxLCA2NjU1LCAwKSwKKwlDSEFONkcoMTQ1LCA2 Njc1LCAwKSwKKwlDSEFONkcoMTQ5LCA2Njk1LCAwKSwKKwlDSEFONkcoMTUzLCA2NzE1LCAwKSwK KwlDSEFONkcoMTU3LCA2NzM1LCAwKSwKKwlDSEFONkcoMTYxLCA2NzU1LCAwKSwKKwlDSEFONkco MTY1LCA2Nzc1LCAwKSwKKwlDSEFONkcoMTY5LCA2Nzk1LCAwKSwKKwlDSEFONkcoMTczLCA2ODE1 LCAwKSwKKwlDSEFONkcoMTc3LCA2ODM1LCAwKSwKKwlDSEFONkcoMTgxLCA2ODU1LCAwKSwKKwlD SEFONkcoMTg1LCA2ODc1LCAwKSwKKwlDSEFONkcoMTg5LCA2ODk1LCAwKSwKKwlDSEFONkcoMTkz LCA2OTE1LCAwKSwKKwlDSEFONkcoMTk3LCA2OTM1LCAwKSwKKwlDSEFONkcoMjAxLCA2OTU1LCAw KSwKKwlDSEFONkcoMjA1LCA2OTc1LCAwKSwKKwlDSEFONkcoMjA5LCA2OTk1LCAwKSwKKwlDSEFO NkcoMjEzLCA3MDE1LCAwKSwKKwlDSEFONkcoMjE3LCA3MDM1LCAwKSwKKwlDSEFONkcoMjIxLCA3 MDU1LCAwKSwKKwlDSEFONkcoMjI1LCA3MDc1LCAwKSwKKwlDSEFONkcoMjI5LCA3MDk1LCAwKSwK KwlDSEFONkcoMjMzLCA3MTE1LCAwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3Jh dGUgYXRoMTJrX2xlZ2FjeV9yYXRlc1tdID0geworCXsgLmJpdHJhdGUgPSAxMCwKKwkgIC5od192 YWx1ZSA9IEFUSDEyS19IV19SQVRFX0NDS19MUF8xTSB9LAorCXsgLmJpdHJhdGUgPSAyMCwKKwkg IC5od192YWx1ZSA9IEFUSDEyS19IV19SQVRFX0NDS19MUF8yTSwKKwkgIC5od192YWx1ZV9zaG9y dCA9IEFUSDEyS19IV19SQVRFX0NDS19TUF8yTSwKKwkgIC5mbGFncyA9IElFRUU4MDIxMV9SQVRF X1NIT1JUX1BSRUFNQkxFIH0sCisJeyAuYml0cmF0ZSA9IDU1LAorCSAgLmh3X3ZhbHVlID0gQVRI MTJLX0hXX1JBVEVfQ0NLX0xQXzVfNU0sCisJICAuaHdfdmFsdWVfc2hvcnQgPSBBVEgxMktfSFdf UkFURV9DQ0tfU1BfNV81TSwKKwkgIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFN QkxFIH0sCisJeyAuYml0cmF0ZSA9IDExMCwKKwkgIC5od192YWx1ZSA9IEFUSDEyS19IV19SQVRF X0NDS19MUF8xMU0sCisJICAuaHdfdmFsdWVfc2hvcnQgPSBBVEgxMktfSFdfUkFURV9DQ0tfU1Bf MTFNLAorCSAgLmZsYWdzID0gSUVFRTgwMjExX1JBVEVfU0hPUlRfUFJFQU1CTEUgfSwKKworCXsg LmJpdHJhdGUgPSA2MCwgLmh3X3ZhbHVlID0gQVRIMTJLX0hXX1JBVEVfT0ZETV82TSB9LAorCXsg LmJpdHJhdGUgPSA5MCwgLmh3X3ZhbHVlID0gQVRIMTJLX0hXX1JBVEVfT0ZETV85TSB9LAorCXsg LmJpdHJhdGUgPSAxMjAsIC5od192YWx1ZSA9IEFUSDEyS19IV19SQVRFX09GRE1fMTJNIH0sCisJ eyAuYml0cmF0ZSA9IDE4MCwgLmh3X3ZhbHVlID0gQVRIMTJLX0hXX1JBVEVfT0ZETV8xOE0gfSwK Kwl7IC5iaXRyYXRlID0gMjQwLCAuaHdfdmFsdWUgPSBBVEgxMktfSFdfUkFURV9PRkRNXzI0TSB9 LAorCXsgLmJpdHJhdGUgPSAzNjAsIC5od192YWx1ZSA9IEFUSDEyS19IV19SQVRFX09GRE1fMzZN IH0sCisJeyAuYml0cmF0ZSA9IDQ4MCwgLmh3X3ZhbHVlID0gQVRIMTJLX0hXX1JBVEVfT0ZETV80 OE0gfSwKKwl7IC5iaXRyYXRlID0gNTQwLCAuaHdfdmFsdWUgPSBBVEgxMktfSFdfUkFURV9PRkRN XzU0TSB9LAorfTsKKworc3RhdGljIGNvbnN0IGludAorYXRoMTJrX3BoeW1vZGVzW05VTV9OTDgw MjExX0JBTkRTXVtBVEgxMktfQ0hBTl9XSURUSF9OVU1dID0geworCVtOTDgwMjExX0JBTkRfMkdI Wl0gPSB7CisJCQlbTkw4MDIxMV9DSEFOX1dJRFRIXzVdID0gTU9ERV9VTktOT1dOLAorCQkJW05M ODAyMTFfQ0hBTl9XSURUSF8xMF0gPSBNT0RFX1VOS05PV04sCisJCQlbTkw4MDIxMV9DSEFOX1dJ RFRIXzIwX05PSFRdID0gTU9ERV8xMUFYX0hFMjBfMkcsCisJCQlbTkw4MDIxMV9DSEFOX1dJRFRI XzIwXSA9IE1PREVfMTFBWF9IRTIwXzJHLAorCQkJW05MODAyMTFfQ0hBTl9XSURUSF80MF0gPSBN T0RFXzExQVhfSEU0MF8yRywKKwkJCVtOTDgwMjExX0NIQU5fV0lEVEhfODBdID0gTU9ERV8xMUFY X0hFODBfMkcsCisJCQlbTkw4MDIxMV9DSEFOX1dJRFRIXzgwUDgwXSA9IE1PREVfVU5LTk9XTiwK KwkJCVtOTDgwMjExX0NIQU5fV0lEVEhfMTYwXSA9IE1PREVfVU5LTk9XTiwKKwl9LAorCVtOTDgw MjExX0JBTkRfNUdIWl0gPSB7CisJCQlbTkw4MDIxMV9DSEFOX1dJRFRIXzVdID0gTU9ERV9VTktO T1dOLAorCQkJW05MODAyMTFfQ0hBTl9XSURUSF8xMF0gPSBNT0RFX1VOS05PV04sCisJCQlbTkw4 MDIxMV9DSEFOX1dJRFRIXzIwX05PSFRdID0gTU9ERV8xMUFYX0hFMjAsCisJCQlbTkw4MDIxMV9D SEFOX1dJRFRIXzIwXSA9IE1PREVfMTFBWF9IRTIwLAorCQkJW05MODAyMTFfQ0hBTl9XSURUSF80 MF0gPSBNT0RFXzExQVhfSEU0MCwKKwkJCVtOTDgwMjExX0NIQU5fV0lEVEhfODBdID0gTU9ERV8x MUFYX0hFODAsCisJCQlbTkw4MDIxMV9DSEFOX1dJRFRIXzE2MF0gPSBNT0RFXzExQVhfSEUxNjAs CisJCQlbTkw4MDIxMV9DSEFOX1dJRFRIXzgwUDgwXSA9IE1PREVfMTFBWF9IRTgwXzgwLAorCX0s CisJW05MODAyMTFfQkFORF82R0haXSA9IHsKKwkJCVtOTDgwMjExX0NIQU5fV0lEVEhfNV0gPSBN T0RFX1VOS05PV04sCisJCQlbTkw4MDIxMV9DSEFOX1dJRFRIXzEwXSA9IE1PREVfVU5LTk9XTiwK KwkJCVtOTDgwMjExX0NIQU5fV0lEVEhfMjBfTk9IVF0gPSBNT0RFXzExQVhfSEUyMCwKKwkJCVtO TDgwMjExX0NIQU5fV0lEVEhfMjBdID0gTU9ERV8xMUFYX0hFMjAsCisJCQlbTkw4MDIxMV9DSEFO X1dJRFRIXzQwXSA9IE1PREVfMTFBWF9IRTQwLAorCQkJW05MODAyMTFfQ0hBTl9XSURUSF84MF0g PSBNT0RFXzExQVhfSEU4MCwKKwkJCVtOTDgwMjExX0NIQU5fV0lEVEhfMTYwXSA9IE1PREVfMTFB WF9IRTE2MCwKKwkJCVtOTDgwMjExX0NIQU5fV0lEVEhfODBQODBdID0gTU9ERV8xMUFYX0hFODBf ODAsCisJfSwKKworfTsKKworY29uc3Qgc3RydWN0IGh0dF9yeF9yaW5nX3Rsdl9maWx0ZXIgYXRo MTJrX21hY19tb25fc3RhdHVzX2ZpbHRlcl9kZWZhdWx0ID0geworCS5yeF9maWx0ZXIgPSBIVFRf UlhfRklMVEVSX1RMVl9GTEFHU19NUERVX1NUQVJUIHwKKwkJICAgICBIVFRfUlhfRklMVEVSX1RM Vl9GTEFHU19QUERVX0VORCB8CisJCSAgICAgSFRUX1JYX0ZJTFRFUl9UTFZfRkxBR1NfUFBEVV9F TkRfU1RBVFVTX0RPTkUsCisJLnBrdF9maWx0ZXJfZmxhZ3MwID0gSFRUX1JYX0ZQX01HTVRfRklM VEVSX0ZMQUdTMCwKKwkucGt0X2ZpbHRlcl9mbGFnczEgPSBIVFRfUlhfRlBfTUdNVF9GSUxURVJf RkxBR1MxLAorCS5wa3RfZmlsdGVyX2ZsYWdzMiA9IEhUVF9SWF9GUF9DVFJMX0ZJTFRFUl9GTEFT RzIsCisJLnBrdF9maWx0ZXJfZmxhZ3MzID0gSFRUX1JYX0ZQX0RBVEFfRklMVEVSX0ZMQVNHMyB8 CisJCQkgICAgIEhUVF9SWF9GUF9DVFJMX0ZJTFRFUl9GTEFTRzMKK307CisKKyNkZWZpbmUgQVRI MTJLX01BQ19GSVJTVF9PRkRNX1JBVEVfSURYIDQKKyNkZWZpbmUgYXRoMTJrX2dfcmF0ZXMgYXRo MTJrX2xlZ2FjeV9yYXRlcworI2RlZmluZSBhdGgxMmtfZ19yYXRlc19zaXplIChBUlJBWV9TSVpF KGF0aDEya19sZWdhY3lfcmF0ZXMpKQorI2RlZmluZSBhdGgxMmtfYV9yYXRlcyAoYXRoMTJrX2xl Z2FjeV9yYXRlcyArIDQpCisjZGVmaW5lIGF0aDEya19hX3JhdGVzX3NpemUgKEFSUkFZX1NJWkUo YXRoMTJrX2xlZ2FjeV9yYXRlcykgLSA0KQorCisjZGVmaW5lIEFUSDEyS19NQUNfU0NBTl9USU1F T1VUX01TRUNTIDIwMCAvKiBpbiBtc2VjcyAqLworCitzdGF0aWMgY29uc3QgdTMyIGF0aDEya19z bXBzX21hcFtdID0geworCVtXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUNdID0gV01JX1BFRVJfU01Q U19TVEFUSUMsCisJW1dMQU5fSFRfQ0FQX1NNX1BTX0RZTkFNSUNdID0gV01JX1BFRVJfU01QU19E WU5BTUlDLAorCVtXTEFOX0hUX0NBUF9TTV9QU19JTlZBTElEXSA9IFdNSV9QRUVSX1NNUFNfUFNf Tk9ORSwKKwlbV0xBTl9IVF9DQVBfU01fUFNfRElTQUJMRURdID0gV01JX1BFRVJfU01QU19QU19O T05FLAorfTsKKworc3RhdGljIGludCBhdGgxMmtfc3RhcnRfdmRldl9kZWxheShzdHJ1Y3QgaWVl ZTgwMjExX2h3ICpodywKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKKworc3Rh dGljIGNvbnN0IGNoYXIgKmF0aDEya19tYWNfcGh5bW9kZV9zdHIoZW51bSB3bWlfcGh5X21vZGUg bW9kZSkKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIE1PREVfMTFBOgorCQlyZXR1cm4gIjEx YSI7CisJY2FzZSBNT0RFXzExRzoKKwkJcmV0dXJuICIxMWciOworCWNhc2UgTU9ERV8xMUI6CisJ CXJldHVybiAiMTFiIjsKKwljYXNlIE1PREVfMTFHT05MWToKKwkJcmV0dXJuICIxMWdvbmx5IjsK KwljYXNlIE1PREVfMTFOQV9IVDIwOgorCQlyZXR1cm4gIjExbmEtaHQyMCI7CisJY2FzZSBNT0RF XzExTkdfSFQyMDoKKwkJcmV0dXJuICIxMW5nLWh0MjAiOworCWNhc2UgTU9ERV8xMU5BX0hUNDA6 CisJCXJldHVybiAiMTFuYS1odDQwIjsKKwljYXNlIE1PREVfMTFOR19IVDQwOgorCQlyZXR1cm4g IjExbmctaHQ0MCI7CisJY2FzZSBNT0RFXzExQUNfVkhUMjA6CisJCXJldHVybiAiMTFhYy12aHQy MCI7CisJY2FzZSBNT0RFXzExQUNfVkhUNDA6CisJCXJldHVybiAiMTFhYy12aHQ0MCI7CisJY2Fz ZSBNT0RFXzExQUNfVkhUODA6CisJCXJldHVybiAiMTFhYy12aHQ4MCI7CisJY2FzZSBNT0RFXzEx QUNfVkhUMTYwOgorCQlyZXR1cm4gIjExYWMtdmh0MTYwIjsKKwljYXNlIE1PREVfMTFBQ19WSFQ4 MF84MDoKKwkJcmV0dXJuICIxMWFjLXZodDgwKzgwIjsKKwljYXNlIE1PREVfMTFBQ19WSFQyMF8y RzoKKwkJcmV0dXJuICIxMWFjLXZodDIwLTJnIjsKKwljYXNlIE1PREVfMTFBQ19WSFQ0MF8yRzoK KwkJcmV0dXJuICIxMWFjLXZodDQwLTJnIjsKKwljYXNlIE1PREVfMTFBQ19WSFQ4MF8yRzoKKwkJ cmV0dXJuICIxMWFjLXZodDgwLTJnIjsKKwljYXNlIE1PREVfMTFBWF9IRTIwOgorCQlyZXR1cm4g IjExYXgtaGUyMCI7CisJY2FzZSBNT0RFXzExQVhfSEU0MDoKKwkJcmV0dXJuICIxMWF4LWhlNDAi OworCWNhc2UgTU9ERV8xMUFYX0hFODA6CisJCXJldHVybiAiMTFheC1oZTgwIjsKKwljYXNlIE1P REVfMTFBWF9IRTgwXzgwOgorCQlyZXR1cm4gIjExYXgtaGU4MCs4MCI7CisJY2FzZSBNT0RFXzEx QVhfSEUxNjA6CisJCXJldHVybiAiMTFheC1oZTE2MCI7CisJY2FzZSBNT0RFXzExQVhfSEUyMF8y RzoKKwkJcmV0dXJuICIxMWF4LWhlMjAtMmciOworCWNhc2UgTU9ERV8xMUFYX0hFNDBfMkc6CisJ CXJldHVybiAiMTFheC1oZTQwLTJnIjsKKwljYXNlIE1PREVfMTFBWF9IRTgwXzJHOgorCQlyZXR1 cm4gIjExYXgtaGU4MC0yZyI7CisJY2FzZSBNT0RFX1VOS05PV046CisJCS8qIHNraXAgKi8KKwkJ YnJlYWs7CisKKwkJLyogbm8gZGVmYXVsdCBoYW5kbGVyIHRvIGFsbG93IGNvbXBpbGVyIHRvIGNo ZWNrIHRoYXQgdGhlCisJCSAqIGVudW0gaXMgZnVsbHkgaGFuZGxlZAorCQkgKi8KKwl9CisKKwly ZXR1cm4gIjx1bmtub3duPiI7Cit9CisKK2VudW0gcmF0ZV9pbmZvX2J3CithdGgxMmtfbWFjX2J3 X3RvX21hYzgwMjExX2J3KGVudW0gYXRoMTJrX3N1cHBvcnRlZF9idyBidykKK3sKKwl1OCByZXQg PSBSQVRFX0lORk9fQldfMjA7CisKKwlzd2l0Y2ggKGJ3KSB7CisJY2FzZSBBVEgxMktfQldfMjA6 CisJCXJldCA9IFJBVEVfSU5GT19CV18yMDsKKwkJYnJlYWs7CisJY2FzZSBBVEgxMktfQldfNDA6 CisJCXJldCA9IFJBVEVfSU5GT19CV180MDsKKwkJYnJlYWs7CisJY2FzZSBBVEgxMktfQldfODA6 CisJCXJldCA9IFJBVEVfSU5GT19CV184MDsKKwkJYnJlYWs7CisJY2FzZSBBVEgxMktfQldfMTYw OgorCQlyZXQgPSBSQVRFX0lORk9fQldfMTYwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0 OworfQorCitlbnVtIGF0aDEya19zdXBwb3J0ZWRfYncgYXRoMTJrX21hY19tYWM4MDIxMV9id190 b19hdGgxMmtfYncoZW51bSByYXRlX2luZm9fYncgYncpCit7CisJc3dpdGNoIChidykgeworCWNh c2UgUkFURV9JTkZPX0JXXzIwOgorCQlyZXR1cm4gQVRIMTJLX0JXXzIwOworCWNhc2UgUkFURV9J TkZPX0JXXzQwOgorCQlyZXR1cm4gQVRIMTJLX0JXXzQwOworCWNhc2UgUkFURV9JTkZPX0JXXzgw OgorCQlyZXR1cm4gQVRIMTJLX0JXXzgwOworCWNhc2UgUkFURV9JTkZPX0JXXzE2MDoKKwkJcmV0 dXJuIEFUSDEyS19CV18xNjA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEFUSDEyS19CV18yMDsKKwl9 Cit9CisKK2ludCBhdGgxMmtfbWFjX2h3X3JhdGVjb2RlX3RvX2xlZ2FjeV9yYXRlKHU4IGh3X3Jj LCB1OCBwcmVhbWJsZSwgdTggKnJhdGVpZHgsCisJCQkJCSAgdTE2ICpyYXRlKQoreworCS8qIEFz IGRlZmF1bHQsIGl0IGlzIE9GRE0gcmF0ZXMgKi8KKwlpbnQgaSA9IEFUSDEyS19NQUNfRklSU1Rf T0ZETV9SQVRFX0lEWDsKKwlpbnQgbWF4X3JhdGVzX2lkeCA9IGF0aDEya19nX3JhdGVzX3NpemU7 CisKKwlpZiAocHJlYW1ibGUgPT0gV01JX1JBVEVfUFJFQU1CTEVfQ0NLKSB7CisJCWh3X3JjICY9 IH5BVEgxMktfSFdfUkFURUNPREVfQ0NLX1NIT1JUX1BSRUFNX01BU0s7CisJCWkgPSAwOworCQlt YXhfcmF0ZXNfaWR4ID0gQVRIMTJLX01BQ19GSVJTVF9PRkRNX1JBVEVfSURYOworCX0KKworCXdo aWxlIChpIDwgbWF4X3JhdGVzX2lkeCkgeworCQlpZiAoaHdfcmMgPT0gYXRoMTJrX2xlZ2FjeV9y YXRlc1tpXS5od192YWx1ZSkgeworCQkJKnJhdGVpZHggPSBpOworCQkJKnJhdGUgPSBhdGgxMmtf bGVnYWN5X3JhdGVzW2ldLmJpdHJhdGU7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpKys7CisJfQor CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3U4IGF0aDEya19tYWNfYml0cmF0ZV90b19pZHgoY29u c3Qgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisJCQkgICAgIHUzMiBi aXRyYXRlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNiYW5kLT5uX2JpdHJhdGVz OyBpKyspCisJCWlmIChzYmFuZC0+Yml0cmF0ZXNbaV0uYml0cmF0ZSA9PSBiaXRyYXRlKQorCQkJ cmV0dXJuIGk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMgorYXRoMTJrX21hY19tYXhf aHRfbnNzKGNvbnN0IHU4IGh0X21jc19tYXNrW0lFRUU4MDIxMV9IVF9NQ1NfTUFTS19MRU5dKQor eworCWludCBuc3M7CisKKwlmb3IgKG5zcyA9IElFRUU4MDIxMV9IVF9NQ1NfTUFTS19MRU4gLSAx OyBuc3MgPj0gMDsgbnNzLS0pCisJCWlmIChodF9tY3NfbWFza1tuc3NdKQorCQkJcmV0dXJuIG5z cyArIDE7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHUzMgorYXRoMTJrX21hY19tYXhfdmh0 X25zcyhjb25zdCB1MTYgdmh0X21jc19tYXNrW05MODAyMTFfVkhUX05TU19NQVhdKQoreworCWlu dCBuc3M7CisKKwlmb3IgKG5zcyA9IE5MODAyMTFfVkhUX05TU19NQVggLSAxOyBuc3MgPj0gMDsg bnNzLS0pCisJCWlmICh2aHRfbWNzX21hc2tbbnNzXSkKKwkJCXJldHVybiBuc3MgKyAxOworCisJ cmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1OCBhdGgxMmtfcGFyc2VfbXBkdWRlbnNpdHkodTggbXBk dWRlbnNpdHkpCit7CisvKiAgRnJvbSBJRUVFIFN0ZCA4MDIuMTEtMjAyMCBkZWZpbmVkIHZhbHVl cyBmb3IgIk1pbmltdW0gTVBEVSBTdGFydCBTcGFjaW5nIjoKKyAqICAgMCBmb3Igbm8gcmVzdHJp Y3Rpb24KKyAqICAgMSBmb3IgMS80IHVzCisgKiAgIDIgZm9yIDEvMiB1cworICogICAzIGZvciAx IHVzCisgKiAgIDQgZm9yIDIgdXMKKyAqICAgNSBmb3IgNCB1cworICogICA2IGZvciA4IHVzCisg KiAgIDcgZm9yIDE2IHVzCisgKi8KKwlzd2l0Y2ggKG1wZHVkZW5zaXR5KSB7CisJY2FzZSAwOgor CQlyZXR1cm4gMDsKKwljYXNlIDE6CisJY2FzZSAyOgorCWNhc2UgMzoKKwkvKiBPdXIgbG93ZXIg bGF5ZXIgY2FsY3VsYXRpb25zIGxpbWl0IG91ciBwcmVjaXNpb24gdG8KKwkgKiAxIG1pY3Jvc2Vj b25kCisJICovCisJCXJldHVybiAxOworCWNhc2UgNDoKKwkJcmV0dXJuIDI7CisJY2FzZSA1Ogor CQlyZXR1cm4gNDsKKwljYXNlIDY6CisJCXJldHVybiA4OworCWNhc2UgNzoKKwkJcmV0dXJuIDE2 OworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCBhdGgxMmtfbWFj X3ZpZl9jaGFuKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgICAgc3RydWN0IGNm ZzgwMjExX2NoYW5fZGVmICpkZWYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4X2NvbmYg KmNvbmY7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJY29uZiA9IHJjdV9kZXJlZmVyZW5jZSh2aWYt PmJzc19jb25mLmNoYW5jdHhfY29uZik7CisJaWYgKCFjb25mKSB7CisJCXJjdV9yZWFkX3VubG9j aygpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwkqZGVmID0gY29uZi0+ZGVmOworCXJjdV9y ZWFkX3VubG9jaygpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIGF0aDEya19tYWNf Yml0cmF0ZV9pc19jY2soaW50IGJpdHJhdGUpCit7CisJc3dpdGNoIChiaXRyYXRlKSB7CisJY2Fz ZSAxMDoKKwljYXNlIDIwOgorCWNhc2UgNTU6CisJY2FzZSAxMTA6CisJCXJldHVybiB0cnVlOwor CX0KKworCXJldHVybiBmYWxzZTsKK30KKwordTggYXRoMTJrX21hY19od19yYXRlX3RvX2lkeChj b25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKKwkJCSAgICAgdTgg aHdfcmF0ZSwgYm9vbCBjY2spCit7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRl OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNiYW5kLT5uX2JpdHJhdGVzOyBpKyspIHsK KwkJcmF0ZSA9ICZzYmFuZC0+Yml0cmF0ZXNbaV07CisKKwkJaWYgKGF0aDEya19tYWNfYml0cmF0 ZV9pc19jY2socmF0ZS0+Yml0cmF0ZSkgIT0gY2NrKQorCQkJY29udGludWU7CisKKwkJaWYgKHJh dGUtPmh3X3ZhbHVlID09IGh3X3JhdGUpCisJCQlyZXR1cm4gaTsKKwkJZWxzZSBpZiAocmF0ZS0+ ZmxhZ3MgJiBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRSAmJgorCQkJIHJhdGUtPmh3X3Zh bHVlX3Nob3J0ID09IGh3X3JhdGUpCisJCQlyZXR1cm4gaTsKKwl9CisKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIHU4IGF0aDEya19tYWNfYml0cmF0ZV90b19yYXRlKGludCBiaXRyYXRlKQorewor CXJldHVybiBESVZfUk9VTkRfVVAoYml0cmF0ZSwgNSkgfAorCSAgICAgICAoYXRoMTJrX21hY19i aXRyYXRlX2lzX2NjayhiaXRyYXRlKSA/IEJJVCg3KSA6IDApOworfQorCitzdGF0aWMgdm9pZCBh dGgxMmtfZ2V0X2FydmlmX2l0ZXIodm9pZCAqZGF0YSwgdTggKm1hYywKKwkJCQkgIHN0cnVjdCBp ZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGF0aDEya192aWZfaXRlciAqYXJ2aWZfaXRl ciA9IGRhdGE7CisJc3RydWN0IGF0aDEya192aWYgKmFydmlmID0gKHZvaWQgKil2aWYtPmRydl9w cml2OworCisJaWYgKGFydmlmLT52ZGV2X2lkID09IGFydmlmX2l0ZXItPnZkZXZfaWQpCisJCWFy dmlmX2l0ZXItPmFydmlmID0gYXJ2aWY7Cit9CisKK3N0cnVjdCBhdGgxMmtfdmlmICphdGgxMmtf bWFjX2dldF9hcnZpZihzdHJ1Y3QgYXRoMTJrICphciwgdTMyIHZkZXZfaWQpCit7CisJc3RydWN0 IGF0aDEya192aWZfaXRlciBhcnZpZl9pdGVyID0ge307CisJdTMyIGZsYWdzOworCisJYXJ2aWZf aXRlci52ZGV2X2lkID0gdmRldl9pZDsKKworCWZsYWdzID0gSUVFRTgwMjExX0lGQUNFX0lURVJf UkVTVU1FX0FMTDsKKwlpZWVlODAyMTFfaXRlcmF0ZV9hY3RpdmVfaW50ZXJmYWNlc19hdG9taWMo YXItPmh3LAorCQkJCQkJICAgZmxhZ3MsCisJCQkJCQkgICBhdGgxMmtfZ2V0X2FydmlmX2l0ZXIs CisJCQkJCQkgICAmYXJ2aWZfaXRlcik7CisJaWYgKCFhcnZpZl9pdGVyLmFydmlmKSB7CisJCWF0 aDEya193YXJuKGFyLT5hYiwgIk5vIFZJRiBmb3VuZCBmb3IgdmRldiAlZFxuIiwgdmRldl9pZCk7 CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBhcnZpZl9pdGVyLmFydmlmOworfQorCitz dHJ1Y3QgYXRoMTJrX3ZpZiAqYXRoMTJrX21hY19nZXRfYXJ2aWZfYnlfdmRldl9pZChzdHJ1Y3Qg YXRoMTJrX2Jhc2UgKmFiLAorCQkJCQkJICAgdTMyIHZkZXZfaWQpCit7CisJaW50IGk7CisJc3Ry dWN0IGF0aDEya19wZGV2ICpwZGV2OworCXN0cnVjdCBhdGgxMmtfdmlmICphcnZpZjsKKworCWZv ciAoaSA9IDA7IGkgPCBhYi0+bnVtX3JhZGlvczsgaSsrKSB7CisJCXBkZXYgPSByY3VfZGVyZWZl cmVuY2UoYWItPnBkZXZzX2FjdGl2ZVtpXSk7CisJCWlmIChwZGV2ICYmIHBkZXYtPmFyKSB7CisJ CQlhcnZpZiA9IGF0aDEya19tYWNfZ2V0X2FydmlmKHBkZXYtPmFyLCB2ZGV2X2lkKTsKKwkJCWlm IChhcnZpZikKKwkJCQlyZXR1cm4gYXJ2aWY7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30K Kworc3RydWN0IGF0aDEyayAqYXRoMTJrX21hY19nZXRfYXJfYnlfdmRldl9pZChzdHJ1Y3QgYXRo MTJrX2Jhc2UgKmFiLCB1MzIgdmRldl9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYXRoMTJrX3Bk ZXYgKnBkZXY7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWItPm51bV9yYWRpb3M7IGkrKykgeworCQlw ZGV2ID0gcmN1X2RlcmVmZXJlbmNlKGFiLT5wZGV2c19hY3RpdmVbaV0pOworCQlpZiAocGRldiAm JiBwZGV2LT5hcikgeworCQkJaWYgKHBkZXYtPmFyLT5hbGxvY2F0ZWRfdmRldl9tYXAgJiAoMUxM IDw8IHZkZXZfaWQpKQorCQkJCXJldHVybiBwZGV2LT5hcjsKKwkJfQorCX0KKworCXJldHVybiBO VUxMOworfQorCitzdHJ1Y3QgYXRoMTJrICphdGgxMmtfbWFjX2dldF9hcl9ieV9wZGV2X2lkKHN0 cnVjdCBhdGgxMmtfYmFzZSAqYWIsIHUzMiBwZGV2X2lkKQoreworCWludCBpOworCXN0cnVjdCBh dGgxMmtfcGRldiAqcGRldjsKKworCWlmIChhYi0+aHdfcGFyYW1zLT5zaW5nbGVfcGRldl9vbmx5 KSB7CisJCXBkZXYgPSByY3VfZGVyZWZlcmVuY2UoYWItPnBkZXZzX2FjdGl2ZVswXSk7CisJCXJl dHVybiBwZGV2ID8gcGRldi0+YXIgOiBOVUxMOworCX0KKworCWlmIChXQVJOX09OKHBkZXZfaWQg PiBhYi0+bnVtX3JhZGlvcykpCisJCXJldHVybiBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IGFi LT5udW1fcmFkaW9zOyBpKyspIHsKKwkJcGRldiA9IHJjdV9kZXJlZmVyZW5jZShhYi0+cGRldnNf YWN0aXZlW2ldKTsKKworCQlpZiAocGRldiAmJiBwZGV2LT5wZGV2X2lkID09IHBkZXZfaWQpCisJ CQlyZXR1cm4gKHBkZXYtPmFyID8gcGRldi0+YXIgOiBOVUxMKTsKKwl9CisKKwlyZXR1cm4gTlVM TDsKK30KKworc3RhdGljIHZvaWQgYXRoMTJrX3BkZXZfY2Fwc191cGRhdGUoc3RydWN0IGF0aDEy ayAqYXIpCit7CisJc3RydWN0IGF0aDEya19iYXNlICphYiA9IGFyLT5hYjsKKworCWFyLT5tYXhf dHhfcG93ZXIgPSBhYi0+dGFyZ2V0X2NhcHMuaHdfbWF4X3R4X3Bvd2VyOworCisJLyogRklYTUU6 IFNldCBtaW5fdHhfcG93ZXIgdG8gYWItPnRhcmdldF9jYXBzLmh3X21pbl90eF9wb3dlci4KKwkg KiBCdXQgc2luY2UgdGhlIHJlY2VpdmVkIHZhbHVlIGluIHN2Y3JkeSBpcyBzYW1lIGFzIGh3X21h eF90eF9wb3dlciwKKwkgKiB3ZSBjYW4gc2V0IGFyLT5taW5fdHhfcG93ZXIgdG8gMCBjdXJyZW50 bHkgdW50aWwKKwkgKiB0aGlzIGlzIGZpeGVkIGluIGZpcm13YXJlCisJICovCisJYXItPm1pbl90 eF9wb3dlciA9IDA7CisKKwlhci0+dHhwb3dlcl9saW1pdF8yZyA9IGFyLT5tYXhfdHhfcG93ZXI7 CisJYXItPnR4cG93ZXJfbGltaXRfNWcgPSBhci0+bWF4X3R4X3Bvd2VyOworCWFyLT50eHBvd2Vy X3NjYWxlID0gV01JX0hPU1RfVFBfU0NBTEVfTUFYOworfQorCitzdGF0aWMgaW50IGF0aDEya19t YWNfdHhwb3dlcl9yZWNhbGMoc3RydWN0IGF0aDEyayAqYXIpCit7CisJc3RydWN0IGF0aDEya19w ZGV2ICpwZGV2ID0gYXItPnBkZXY7CisJc3RydWN0IGF0aDEya192aWYgKmFydmlmOworCWludCBy ZXQsIHR4cG93ZXIgPSAtMTsKKwl1MzIgcGFyYW07CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZh ci0+Y29uZl9tdXRleCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFydmlmLCAmYXItPmFydmlm cywgbGlzdCkgeworCQlpZiAoYXJ2aWYtPnR4cG93ZXIgPD0gMCkKKwkJCWNvbnRpbnVlOworCisJ CWlmICh0eHBvd2VyID09IC0xKQorCQkJdHhwb3dlciA9IGFydmlmLT50eHBvd2VyOworCQllbHNl CisJCQl0eHBvd2VyID0gbWluKHR4cG93ZXIsIGFydmlmLT50eHBvd2VyKTsKKwl9CisKKwlpZiAo dHhwb3dlciA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwkvKiB0eHB3ciBpcyBzZXQgYXMgMiB1bml0 cyBwZXIgZEJtIGluIEZXKi8KKwl0eHBvd2VyID0gbWluX3QodTMyLCBtYXhfdCh1MzIsIGFyLT5t aW5fdHhfcG93ZXIsIHR4cG93ZXIpLAorCQkJYXItPm1heF90eF9wb3dlcikgKiAyOworCisJYXRo MTJrX2RiZyhhci0+YWIsIEFUSDEyS19EQkdfTUFDLCAidHhwb3dlciB0byBzZXQgaW4gaHcgJWRc biIsCisJCSAgIHR4cG93ZXIgLyAyKTsKKworCWlmICgocGRldi0+Y2FwLnN1cHBvcnRlZF9iYW5k cyAmIFdNSV9IT1NUX1dMQU5fMkdfQ0FQKSAmJgorCSAgICBhci0+dHhwb3dlcl9saW1pdF8yZyAh PSB0eHBvd2VyKSB7CisJCXBhcmFtID0gV01JX1BERVZfUEFSQU1fVFhQT1dFUl9MSU1JVDJHOwor CQlyZXQgPSBhdGgxMmtfd21pX3BkZXZfc2V0X3BhcmFtKGFyLCBwYXJhbSwKKwkJCQkJCXR4cG93 ZXIsIGFyLT5wZGV2LT5wZGV2X2lkKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZmFpbDsKKwkJYXIt PnR4cG93ZXJfbGltaXRfMmcgPSB0eHBvd2VyOworCX0KKworCWlmICgocGRldi0+Y2FwLnN1cHBv cnRlZF9iYW5kcyAmIFdNSV9IT1NUX1dMQU5fNUdfQ0FQKSAmJgorCSAgICBhci0+dHhwb3dlcl9s aW1pdF81ZyAhPSB0eHBvd2VyKSB7CisJCXBhcmFtID0gV01JX1BERVZfUEFSQU1fVFhQT1dFUl9M SU1JVDVHOworCQlyZXQgPSBhdGgxMmtfd21pX3BkZXZfc2V0X3BhcmFtKGFyLCBwYXJhbSwKKwkJ CQkJCXR4cG93ZXIsIGFyLT5wZGV2LT5wZGV2X2lkKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZmFp bDsKKwkJYXItPnR4cG93ZXJfbGltaXRfNWcgPSB0eHBvd2VyOworCX0KKworCXJldHVybiAwOwor CitmYWlsOgorCWF0aDEya193YXJuKGFyLT5hYiwgImZhaWxlZCB0byByZWNhbGMgdHhwb3dlciBs aW1pdCAlZCB1c2luZyBwZGV2IHBhcmFtICVkOiAlZFxuIiwKKwkJICAgIHR4cG93ZXIgLyAyLCBw YXJhbSwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0aDEya19yZWNhbGNf cnRzY3RzX3Byb3Qoc3RydWN0IGF0aDEya192aWYgKmFydmlmKQoreworCXN0cnVjdCBhdGgxMmsg KmFyID0gYXJ2aWYtPmFyOworCXUzMiB2ZGV2X3BhcmFtLCBydHNfY3RzOworCWludCByZXQ7CisK Kwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7CisKKwl2ZGV2X3BhcmFtID0g V01JX1ZERVZfUEFSQU1fRU5BQkxFX1JUU0NUUzsKKworCS8qIEVuYWJsZSBSVFMvQ1RTIHByb3Rl Y3Rpb24gZm9yIHN3IHJldHJpZXMgKHdoZW4gbGVnYWN5IHN0YXRpb25zCisJICogYXJlIGluIEJT Uykgb3IgYnkgZGVmYXVsdCBvbmx5IGZvciBzZWNvbmQgcmF0ZSBzZXJpZXMuCisJICogVE9ETzog Q2hlY2sgaWYgd2UgbmVlZCB0byBlbmFibGUgQ1RTIDIgU2VsZiBpbiBhbnkgY2FzZQorCSAqLwor CXJ0c19jdHMgPSBXTUlfVVNFX1JUU19DVFM7CisKKwlpZiAoYXJ2aWYtPm51bV9sZWdhY3lfc3Rh dGlvbnMgPiAwKQorCQlydHNfY3RzIHw9IFdNSV9SVFNDVFNfQUNST1NTX1NXX1JFVFJJRVMgPDwg NDsKKwllbHNlCisJCXJ0c19jdHMgfD0gV01JX1JUU0NUU19GT1JfU0VDT05EX1JBVEVTRVJJRVMg PDwgNDsKKworCS8qIE5lZWQgbm90IHNlbmQgZHVwbGljYXRlIHBhcmFtIHZhbHVlIHRvIGZpcm13 YXJlICovCisJaWYgKGFydmlmLT5ydHNjdHNfcHJvdF9tb2RlID09IHJ0c19jdHMpCisJCXJldHVy biAwOworCisJYXJ2aWYtPnJ0c2N0c19wcm90X21vZGUgPSBydHNfY3RzOworCisJYXRoMTJrX2Ri Zyhhci0+YWIsIEFUSDEyS19EQkdfTUFDLCAibWFjIHZkZXYgJWQgcmVjYWxjIHJ0cy9jdHMgcHJv dCAlZFxuIiwKKwkJICAgYXJ2aWYtPnZkZXZfaWQsIHJ0c19jdHMpOworCisJcmV0ID0gYXRoMTJr X3dtaV92ZGV2X3NldF9wYXJhbV9jbWQoYXIsIGFydmlmLT52ZGV2X2lkLAorCQkJCQkgICAgdmRl dl9wYXJhbSwgcnRzX2N0cyk7CisJaWYgKHJldCkKKwkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFp bGVkIHRvIHJlY2FsY3VsYXRlIHJ0cy9jdHMgcHJvdCBmb3IgdmRldiAlZDogJWRcbiIsCisJCQkg ICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50 IGF0aDEya19tYWNfc2V0X2tpY2tvdXQoc3RydWN0IGF0aDEya192aWYgKmFydmlmKQoreworCXN0 cnVjdCBhdGgxMmsgKmFyID0gYXJ2aWYtPmFyOworCXUzMiBwYXJhbTsKKwlpbnQgcmV0OworCisJ cmV0ID0gYXRoMTJrX3dtaV9wZGV2X3NldF9wYXJhbShhciwgV01JX1BERVZfUEFSQU1fU1RBX0tJ Q0tPVVRfVEgsCisJCQkJCUFUSDEyS19LSUNLT1VUX1RIUkVTSE9MRCwKKwkJCQkJYXItPnBkZXYt PnBkZXZfaWQpOworCWlmIChyZXQpIHsKKwkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRv IHNldCBraWNrb3V0IHRocmVzaG9sZCBvbiB2ZGV2ICVpOiAlZFxuIiwKKwkJCSAgICBhcnZpZi0+ dmRldl9pZCwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwYXJhbSA9IFdNSV9WREVWX1BB UkFNX0FQX0tFRVBBTElWRV9NSU5fSURMRV9JTkFDVElWRV9USU1FX1NFQ1M7CisJcmV0ID0gYXRo MTJrX3dtaV92ZGV2X3NldF9wYXJhbV9jbWQoYXIsIGFydmlmLT52ZGV2X2lkLCBwYXJhbSwKKwkJ CQkJICAgIEFUSDEyS19LRUVQQUxJVkVfTUlOX0lETEUpOworCWlmIChyZXQpIHsKKwkJYXRoMTJr X3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIHNldCBrZWVwYWxpdmUgbWluaW11bSBpZGxlIHRpbWUg b24gdmRldiAlaTogJWRcbiIsCisJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CisJCXJldHVy biByZXQ7CisJfQorCisJcGFyYW0gPSBXTUlfVkRFVl9QQVJBTV9BUF9LRUVQQUxJVkVfTUFYX0lE TEVfSU5BQ1RJVkVfVElNRV9TRUNTOworCXJldCA9IGF0aDEya193bWlfdmRldl9zZXRfcGFyYW1f Y21kKGFyLCBhcnZpZi0+dmRldl9pZCwgcGFyYW0sCisJCQkJCSAgICBBVEgxMktfS0VFUEFMSVZF X01BWF9JRExFKTsKKwlpZiAocmV0KSB7CisJCWF0aDEya193YXJuKGFyLT5hYiwgImZhaWxlZCB0 byBzZXQga2VlcGFsaXZlIG1heGltdW0gaWRsZSB0aW1lIG9uIHZkZXYgJWk6ICVkXG4iLAorCQkJ ICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXBhcmFtID0g V01JX1ZERVZfUEFSQU1fQVBfS0VFUEFMSVZFX01BWF9VTlJFU1BPTlNJVkVfVElNRV9TRUNTOwor CXJldCA9IGF0aDEya193bWlfdmRldl9zZXRfcGFyYW1fY21kKGFyLCBhcnZpZi0+dmRldl9pZCwg cGFyYW0sCisJCQkJCSAgICBBVEgxMktfS0VFUEFMSVZFX01BWF9VTlJFU1BPTlNJVkUpOworCWlm IChyZXQpIHsKKwkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIHNldCBrZWVwYWxpdmUg bWF4aW11bSB1bnJlc3BvbnNpdmUgdGltZSBvbiB2ZGV2ICVpOiAlZFxuIiwKKwkJCSAgICBhcnZp Zi0+dmRldl9pZCwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwor dm9pZCBhdGgxMmtfbWFjX3BlZXJfY2xlYW51cF9hbGwoc3RydWN0IGF0aDEyayAqYXIpCit7CisJ c3RydWN0IGF0aDEya19wZWVyICpwZWVyLCAqdG1wOworCXN0cnVjdCBhdGgxMmtfYmFzZSAqYWIg PSBhci0+YWI7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7CisKKwlz cGluX2xvY2tfYmgoJmFiLT5iYXNlX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShw ZWVyLCB0bXAsICZhYi0+cGVlcnMsIGxpc3QpIHsKKwkJYXRoMTJrX2RwX3J4X3BlZXJfdGlkX2Ns ZWFudXAoYXIsIHBlZXIpOworCQlsaXN0X2RlbCgmcGVlci0+bGlzdCk7CisJCWtmcmVlKHBlZXIp OworCX0KKwlzcGluX3VubG9ja19iaCgmYWItPmJhc2VfbG9jayk7CisKKwlhci0+bnVtX3BlZXJz ID0gMDsKKwlhci0+bnVtX3N0YXRpb25zID0gMDsKK30KKworc3RhdGljIGludCBhdGgxMmtfbWFj X3ZkZXZfc2V0dXBfc3luYyhzdHJ1Y3QgYXRoMTJrICphcikKK3sKKwlsb2NrZGVwX2Fzc2VydF9o ZWxkKCZhci0+Y29uZl9tdXRleCk7CisKKwlpZiAodGVzdF9iaXQoQVRIMTJLX0ZMQUdfQ1JBU0hf RkxVU0gsICZhci0+YWItPmRldl9mbGFncykpCisJCXJldHVybiAtRVNIVVRET1dOOworCisJaWYg KCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmFyLT52ZGV2X3NldHVwX2RvbmUsCisJCQkJ CSBBVEgxMktfVkRFVl9TRVRVUF9USU1FT1VUX0haKSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisK KwlyZXR1cm4gYXItPmxhc3Rfd21pX3ZkZXZfc3RhcnRfc3RhdHVzID8gLUVJTlZBTCA6IDA7Cit9 CisKK3N0YXRpYyBpbnQgYXRoMTJrX21vbml0b3JfdmRldl91cChzdHJ1Y3QgYXRoMTJrICphciwg aW50IHZkZXZfaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGF0aDEya193bWlfdmRldl91cChh ciwgdmRldl9pZCwgMCwgYXItPm1hY19hZGRyKTsKKwlpZiAocmV0KSB7CisJCWF0aDEya193YXJu KGFyLT5hYiwgImZhaWxlZCB0byBwdXQgdXAgbW9uaXRvciB2ZGV2ICVpOiAlZFxuIiwKKwkJCSAg ICB2ZGV2X2lkLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWF0aDEya19kYmcoYXItPmFi LCBBVEgxMktfREJHX01BQywgIm1hYyBtb25pdG9yIHZkZXYgJWkgc3RhcnRlZFxuIiwKKwkJICAg dmRldl9pZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRoMTJrX21hY19tb25pdG9y X3ZkZXZfc3RhcnQoc3RydWN0IGF0aDEyayAqYXIsIGludCB2ZGV2X2lkLAorCQkJCQkgc3RydWN0 IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmKQoreworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5l bCAqY2hhbm5lbDsKKwlzdHJ1Y3Qgd21pX3ZkZXZfc3RhcnRfcmVxX2FyZyBhcmcgPSB7fTsKKwlp bnQgcmV0OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYXItPmNvbmZfbXV0ZXgpOworCisJY2hh bm5lbCA9IGNoYW5kZWYtPmNoYW47CisJYXJnLnZkZXZfaWQgPSB2ZGV2X2lkOworCWFyZy5mcmVx ID0gY2hhbm5lbC0+Y2VudGVyX2ZyZXE7CisJYXJnLmJhbmRfY2VudGVyX2ZyZXExID0gY2hhbmRl Zi0+Y2VudGVyX2ZyZXExOworCWFyZy5iYW5kX2NlbnRlcl9mcmVxMiA9IGNoYW5kZWYtPmNlbnRl cl9mcmVxMjsKKwlhcmcubW9kZSA9IGF0aDEya19waHltb2Rlc1tjaGFuZGVmLT5jaGFuLT5iYW5k XVtjaGFuZGVmLT53aWR0aF07CisJYXJnLmNoYW5fcmFkYXIgPSAhIShjaGFubmVsLT5mbGFncyAm IElFRUU4MDIxMV9DSEFOX1JBREFSKTsKKworCWFyZy5taW5fcG93ZXIgPSAwOworCWFyZy5tYXhf cG93ZXIgPSBjaGFubmVsLT5tYXhfcG93ZXI7CisJYXJnLm1heF9yZWdfcG93ZXIgPSBjaGFubmVs LT5tYXhfcmVnX3Bvd2VyOworCWFyZy5tYXhfYW50ZW5uYV9nYWluID0gY2hhbm5lbC0+bWF4X2Fu dGVubmFfZ2FpbjsKKworCWFyZy5wcmVmX3R4X3N0cmVhbXMgPSBhci0+bnVtX3R4X2NoYWluczsK KwlhcmcucHJlZl9yeF9zdHJlYW1zID0gYXItPm51bV9yeF9jaGFpbnM7CisKKwlhcmcucGFzc2l2 ZSB8PSAhIShjaGFuZGVmLT5jaGFuLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX05PX0lSKTsKKwor CXJlaW5pdF9jb21wbGV0aW9uKCZhci0+dmRldl9zZXR1cF9kb25lKTsKKwlyZWluaXRfY29tcGxl dGlvbigmYXItPnZkZXZfZGVsZXRlX2RvbmUpOworCisJcmV0ID0gYXRoMTJrX3dtaV92ZGV2X3N0 YXJ0KGFyLCAmYXJnLCBmYWxzZSk7CisJaWYgKHJldCkgeworCQlhdGgxMmtfd2Fybihhci0+YWIs ICJmYWlsZWQgdG8gcmVxdWVzdCBtb25pdG9yIHZkZXYgJWkgc3RhcnQ6ICVkXG4iLAorCQkJICAg IHZkZXZfaWQsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYXRoMTJrX21hY192 ZGV2X3NldHVwX3N5bmMoYXIpOworCWlmIChyZXQpIHsKKwkJYXRoMTJrX3dhcm4oYXItPmFiLCAi ZmFpbGVkIHRvIHN5bmNocm9uaXplIHNldHVwIGZvciBtb25pdG9yIHZkZXYgJWkgc3RhcnQ6ICVk XG4iLAorCQkJICAgIHZkZXZfaWQsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0g YXRoMTJrX3dtaV92ZGV2X3VwKGFyLCB2ZGV2X2lkLCAwLCBhci0+bWFjX2FkZHIpOworCWlmIChy ZXQpIHsKKwkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIHB1dCB1cCBtb25pdG9yIHZk ZXYgJWk6ICVkXG4iLAorCQkJICAgIHZkZXZfaWQsIHJldCk7CisJCWdvdG8gdmRldl9zdG9wOwor CX0KKworCWF0aDEya19kYmcoYXItPmFiLCBBVEgxMktfREJHX01BQywgIm1hYyBtb25pdG9yIHZk ZXYgJWkgc3RhcnRlZFxuIiwKKwkJICAgdmRldl9pZCk7CisJcmV0dXJuIDA7CisKK3ZkZXZfc3Rv cDoKKwlyZXQgPSBhdGgxMmtfd21pX3ZkZXZfc3RvcChhciwgdmRldl9pZCk7CisJaWYgKHJldCkK KwkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIHN0b3AgbW9uaXRvciB2ZGV2ICVpIGFm dGVyIHN0YXJ0IGZhaWx1cmU6ICVkXG4iLAorCQkJICAgIHZkZXZfaWQsIHJldCk7CisJcmV0dXJu IHJldDsKK30KKworc3RhdGljIGludCBhdGgxMmtfbWFjX21vbml0b3JfdmRldl9zdG9wKHN0cnVj dCBhdGgxMmsgKmFyKQoreworCWludCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+ Y29uZl9tdXRleCk7CisKKwlyZWluaXRfY29tcGxldGlvbigmYXItPnZkZXZfc2V0dXBfZG9uZSk7 CisKKwlyZXQgPSBhdGgxMmtfd21pX3ZkZXZfc3RvcChhciwgYXItPm1vbml0b3JfdmRldl9pZCk7 CisJaWYgKHJldCkKKwkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIHJlcXVlc3QgbW9u aXRvciB2ZGV2ICVpIHN0b3A6ICVkXG4iLAorCQkJICAgIGFyLT5tb25pdG9yX3ZkZXZfaWQsIHJl dCk7CisKKwlyZXQgPSBhdGgxMmtfbWFjX3ZkZXZfc2V0dXBfc3luYyhhcik7CisJaWYgKHJldCkK KwkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIHN5bmNocm9uaXplIG1vbml0b3IgdmRl diAlaSBzdG9wOiAlZFxuIiwKKwkJCSAgICBhci0+bW9uaXRvcl92ZGV2X2lkLCByZXQpOworCisJ cmV0ID0gYXRoMTJrX3dtaV92ZGV2X2Rvd24oYXIsIGFyLT5tb25pdG9yX3ZkZXZfaWQpOworCWlm IChyZXQpCisJCWF0aDEya193YXJuKGFyLT5hYiwgImZhaWxlZCB0byBwdXQgZG93biBtb25pdG9y IHZkZXYgJWk6ICVkXG4iLAorCQkJICAgIGFyLT5tb25pdG9yX3ZkZXZfaWQsIHJldCk7CisKKwlh dGgxMmtfZGJnKGFyLT5hYiwgQVRIMTJLX0RCR19NQUMsICJtYWMgbW9uaXRvciB2ZGV2ICVpIHN0 b3BwZWRcbiIsCisJCSAgIGFyLT5tb25pdG9yX3ZkZXZfaWQpOworCXJldHVybiByZXQ7Cit9CisK K3N0YXRpYyBpbnQgYXRoMTJrX21hY19tb25pdG9yX3ZkZXZfY3JlYXRlKHN0cnVjdCBhdGgxMmsg KmFyKQoreworCXN0cnVjdCBhdGgxMmtfcGRldiAqcGRldiA9IGFyLT5wZGV2OworCXN0cnVjdCBh dGgxMmtfd21pX3ZkZXZfY3JlYXRlX2FyZyBhcmcgPSB7fTsKKwlpbnQgYml0LCByZXQ7CisJdTgg dG1wX2FkZHJbNl07CisJdTE2IG5zczsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFyLT5jb25m X211dGV4KTsKKworCWlmIChhci0+bW9uaXRvcl92ZGV2X2NyZWF0ZWQpCisJCXJldHVybiAwOwor CisJaWYgKGFyLT5hYi0+ZnJlZV92ZGV2X21hcCA9PSAwKSB7CisJCWF0aDEya193YXJuKGFyLT5h YiwgImZhaWxlZCB0byBmaW5kIGZyZWUgdmRldiBpZCBmb3IgbW9uaXRvciB2ZGV2XG4iKTsKKwkJ cmV0dXJuIC1FTk9NRU07CisJfQorCisJYml0ID0gX19mZnM2NChhci0+YWItPmZyZWVfdmRldl9t YXApOworCisJYXItPm1vbml0b3JfdmRldl9pZCA9IGJpdDsKKworCWFyZy5pZl9pZCA9IGFyLT5t b25pdG9yX3ZkZXZfaWQ7CisJYXJnLnR5cGUgPSBXTUlfVkRFVl9UWVBFX01PTklUT1I7CisJYXJn LnN1YnR5cGUgPSBXTUlfVkRFVl9TVUJUWVBFX05PTkU7CisJYXJnLnBkZXZfaWQgPSBwZGV2LT5w ZGV2X2lkOworCWFyZy5pZl9zdGF0c19pZCA9IEFUSDEyS19JTlZBTF9WREVWX1NUQVRTX0lEOwor CisJaWYgKHBkZXYtPmNhcC5zdXBwb3J0ZWRfYmFuZHMgJiBXTUlfSE9TVF9XTEFOXzJHX0NBUCkg eworCQlhcmcuY2hhaW5zW05MODAyMTFfQkFORF8yR0haXS50eCA9IGFyLT5udW1fdHhfY2hhaW5z OworCQlhcmcuY2hhaW5zW05MODAyMTFfQkFORF8yR0haXS5yeCA9IGFyLT5udW1fcnhfY2hhaW5z OworCX0KKworCWlmIChwZGV2LT5jYXAuc3VwcG9ydGVkX2JhbmRzICYgV01JX0hPU1RfV0xBTl81 R19DQVApIHsKKwkJYXJnLmNoYWluc1tOTDgwMjExX0JBTkRfNUdIWl0udHggPSBhci0+bnVtX3R4 X2NoYWluczsKKwkJYXJnLmNoYWluc1tOTDgwMjExX0JBTkRfNUdIWl0ucnggPSBhci0+bnVtX3J4 X2NoYWluczsKKwl9CisKKwlyZXQgPSBhdGgxMmtfd21pX3ZkZXZfY3JlYXRlKGFyLCB0bXBfYWRk ciwgJmFyZyk7CisJaWYgKHJldCkgeworCQlhdGgxMmtfd2Fybihhci0+YWIsICJmYWlsZWQgdG8g cmVxdWVzdCBtb25pdG9yIHZkZXYgJWkgY3JlYXRpb246ICVkXG4iLAorCQkJICAgIGFyLT5tb25p dG9yX3ZkZXZfaWQsIHJldCk7CisJCWFyLT5tb25pdG9yX3ZkZXZfaWQgPSAtMTsKKwkJcmV0dXJu IHJldDsKKwl9CisKKwluc3MgPSBod2VpZ2h0MzIoYXItPmNmZ190eF9jaGFpbm1hc2spID8gOiAx OworCXJldCA9IGF0aDEya193bWlfdmRldl9zZXRfcGFyYW1fY21kKGFyLCBhci0+bW9uaXRvcl92 ZGV2X2lkLAorCQkJCQkgICAgV01JX1ZERVZfUEFSQU1fTlNTLCBuc3MpOworCWlmIChyZXQpIHsK KwkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIHNldCB2ZGV2ICVkIGNoYWlubWFzayAw eCV4LCBuc3MgJWQgOiVkXG4iLAorCQkJICAgIGFyLT5tb25pdG9yX3ZkZXZfaWQsIGFyLT5jZmdf dHhfY2hhaW5tYXNrLCBuc3MsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYXRo MTJrX21hY190eHBvd2VyX3JlY2FsYyhhcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwor CWFyLT5hbGxvY2F0ZWRfdmRldl9tYXAgfD0gMUxMIDw8IGFyLT5tb25pdG9yX3ZkZXZfaWQ7CisJ YXItPmFiLT5mcmVlX3ZkZXZfbWFwICY9IH4oMUxMIDw8IGFyLT5tb25pdG9yX3ZkZXZfaWQpOwor CWFyLT5udW1fY3JlYXRlZF92ZGV2cysrOworCWFyLT5tb25pdG9yX3ZkZXZfY3JlYXRlZCA9IHRy dWU7CisJYXRoMTJrX2RiZyhhci0+YWIsIEFUSDEyS19EQkdfTUFDLCAibWFjIG1vbml0b3IgdmRl diAlZCBjcmVhdGVkXG4iLAorCQkgICBhci0+bW9uaXRvcl92ZGV2X2lkKTsKKworCXJldHVybiAw OworfQorCitzdGF0aWMgaW50IGF0aDEya19tYWNfbW9uaXRvcl92ZGV2X2RlbGV0ZShzdHJ1Y3Qg YXRoMTJrICphcikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgdGltZV9sZWZ0OworCisJ bG9ja2RlcF9hc3NlcnRfaGVsZCgmYXItPmNvbmZfbXV0ZXgpOworCisJaWYgKCFhci0+bW9uaXRv cl92ZGV2X2NyZWF0ZWQpCisJCXJldHVybiAwOworCisJcmVpbml0X2NvbXBsZXRpb24oJmFyLT52 ZGV2X2RlbGV0ZV9kb25lKTsKKworCXJldCA9IGF0aDEya193bWlfdmRldl9kZWxldGUoYXIsIGFy LT5tb25pdG9yX3ZkZXZfaWQpOworCWlmIChyZXQpIHsKKwkJYXRoMTJrX3dhcm4oYXItPmFiLCAi ZmFpbGVkIHRvIHJlcXVlc3Qgd21pIG1vbml0b3IgdmRldiAlaSByZW1vdmFsOiAlZFxuIiwKKwkJ CSAgICBhci0+bW9uaXRvcl92ZGV2X2lkLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXRp bWVfbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmYXItPnZkZXZfZGVsZXRlX2Rv bmUsCisJCQkJCQlBVEgxMktfVkRFVl9ERUxFVEVfVElNRU9VVF9IWik7CisJaWYgKHRpbWVfbGVm dCA9PSAwKSB7CisJCWF0aDEya193YXJuKGFyLT5hYiwgIlRpbWVvdXQgaW4gcmVjZWl2aW5nIHZk ZXYgZGVsZXRlIHJlc3BvbnNlXG4iKTsKKwl9IGVsc2UgeworCQlhci0+YWxsb2NhdGVkX3ZkZXZf bWFwICY9IH4oMUxMIDw8IGFyLT5tb25pdG9yX3ZkZXZfaWQpOworCQlhci0+YWItPmZyZWVfdmRl dl9tYXAgfD0gMUxMIDw8IChhci0+bW9uaXRvcl92ZGV2X2lkKTsKKwkJYXRoMTJrX2RiZyhhci0+ YWIsIEFUSDEyS19EQkdfTUFDLCAibWFjIG1vbml0b3IgdmRldiAlZCBkZWxldGVkXG4iLAorCQkJ ICAgYXItPm1vbml0b3JfdmRldl9pZCk7CisJCWFyLT5udW1fY3JlYXRlZF92ZGV2cy0tOworCQlh ci0+bW9uaXRvcl92ZGV2X2lkID0gLTE7CisJCWFyLT5tb25pdG9yX3ZkZXZfY3JlYXRlZCA9IGZh bHNlOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCithdGgxMmtfbWFjX2dl dF9hbnlfY2hhbmRlZl9pdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCXN0cnVjdCBp ZWVlODAyMTFfY2hhbmN0eF9jb25mICpjb25mLAorCQkJCXZvaWQgKmRhdGEpCit7CisJc3RydWN0 IGNmZzgwMjExX2NoYW5fZGVmICoqZGVmID0gZGF0YTsKKworCSpkZWYgPSAmY29uZi0+ZGVmOwor fQorCitzdGF0aWMgaW50IGF0aDEya19tYWNfbW9uaXRvcl9zdGFydChzdHJ1Y3QgYXRoMTJrICph cikKK3sKKwlzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYgPSBOVUxMOworCWludCBy ZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7CisKKwlpZiAoYXIt Pm1vbml0b3Jfc3RhcnRlZCkKKwkJcmV0dXJuIDA7CisKKwlpZWVlODAyMTFfaXRlcl9jaGFuX2Nv bnRleHRzX2F0b21pYyhhci0+aHcsCisJCQkJCSAgICBhdGgxMmtfbWFjX2dldF9hbnlfY2hhbmRl Zl9pdGVyLAorCQkJCQkgICAgJmNoYW5kZWYpOworCWlmICghY2hhbmRlZikKKwkJcmV0dXJuIDA7 CisKKwlyZXQgPSBhdGgxMmtfbWFjX21vbml0b3JfdmRldl9zdGFydChhciwgYXItPm1vbml0b3Jf dmRldl9pZCwgY2hhbmRlZik7CisJaWYgKHJldCkgeworCQlhdGgxMmtfd2Fybihhci0+YWIsICJm YWlsZWQgdG8gc3RhcnQgbW9uaXRvciB2ZGV2OiAlZFxuIiwgcmV0KTsKKwkJYXRoMTJrX21hY19t b25pdG9yX3ZkZXZfZGVsZXRlKGFyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlhci0+bW9uaXRv cl9zdGFydGVkID0gdHJ1ZTsKKwlhci0+bnVtX3N0YXJ0ZWRfdmRldnMrKzsKKwlyZXQgPSBhdGgx MmtfZHBfdHhfaHR0X21vbml0b3JfbW9kZV9yaW5nX2NvbmZpZyhhciwgZmFsc2UpOworCWF0aDEy a19kYmcoYXItPmFiLCBBVEgxMktfREJHX01BQywgIm1hYyBtb25pdG9yIHN0YXJ0ZWQgcmV0ICVk XG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdGgxMmtfbWFjX21v bml0b3Jfc3RvcChzdHJ1Y3QgYXRoMTJrICphcikKK3sKKwlpbnQgcmV0OworCisJbG9ja2RlcF9h c3NlcnRfaGVsZCgmYXItPmNvbmZfbXV0ZXgpOworCisJaWYgKCFhci0+bW9uaXRvcl9zdGFydGVk KQorCQlyZXR1cm4gMDsKKworCXJldCA9IGF0aDEya19tYWNfbW9uaXRvcl92ZGV2X3N0b3AoYXIp OworCWlmIChyZXQpIHsKKwkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIHN0b3AgbW9u aXRvciB2ZGV2OiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlhci0+bW9uaXRv cl9zdGFydGVkID0gZmFsc2U7CisJYXItPm51bV9zdGFydGVkX3ZkZXZzLS07CisJcmV0ID0gYXRo MTJrX2RwX3R4X2h0dF9tb25pdG9yX21vZGVfcmluZ19jb25maWcoYXIsIHRydWUpOworCWF0aDEy a19kYmcoYXItPmFiLCBBVEgxMktfREJHX01BQywgIm1hYyBtb25pdG9yIHN0b3BwZWQgcmV0ICVk XG4iLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXRoMTJrX21hY19vcF9j b25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBjaGFuZ2VkKQoreworCXN0cnVjdCBh dGgxMmsgKmFyID0gaHctPnByaXY7CisJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmh3 LT5jb25mOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZhci0+Y29uZl9tdXRleCk7CisKKwlp ZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9NT05JVE9SKSB7CisJCWFyLT5tb25p dG9yX2NvbmZfZW5hYmxlZCA9IGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfTU9OSVRPUjsK KwkJaWYgKGFyLT5tb25pdG9yX2NvbmZfZW5hYmxlZCkgeworCQkJaWYgKGFyLT5tb25pdG9yX3Zk ZXZfY3JlYXRlZCkKKwkJCQlnb3RvIGV4aXQ7CisJCQlyZXQgPSBhdGgxMmtfbWFjX21vbml0b3Jf dmRldl9jcmVhdGUoYXIpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGV4aXQ7CisJCQlyZXQgPSBh dGgxMmtfbWFjX21vbml0b3Jfc3RhcnQoYXIpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycl9t b25fZGVsOworCQl9IGVsc2UgeworCQkJaWYgKCFhci0+bW9uaXRvcl92ZGV2X2NyZWF0ZWQpCisJ CQkJZ290byBleGl0OworCQkJcmV0ID0gYXRoMTJrX21hY19tb25pdG9yX3N0b3AoYXIpOworCQkJ aWYgKHJldCkKKwkJCQlnb3RvIGV4aXQ7CisJCQlhdGgxMmtfbWFjX21vbml0b3JfdmRldl9kZWxl dGUoYXIpOworCQl9CisJfQorCitleGl0OgorCW11dGV4X3VubG9jaygmYXItPmNvbmZfbXV0ZXgp OworCXJldHVybiByZXQ7CisKK2Vycl9tb25fZGVsOgorCWF0aDEya19tYWNfbW9uaXRvcl92ZGV2 X2RlbGV0ZShhcik7CisJbXV0ZXhfdW5sb2NrKCZhci0+Y29uZl9tdXRleCk7CisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbnQgYXRoMTJrX21hY19zZXR1cF9iY25fdG1wbChzdHJ1Y3QgYXRoMTJr X3ZpZiAqYXJ2aWYpCit7CisJc3RydWN0IGF0aDEyayAqYXIgPSBhcnZpZi0+YXI7CisJc3RydWN0 IGF0aDEya19iYXNlICphYiA9IGFyLT5hYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IGFy LT5odzsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gYXJ2aWYtPnZpZjsKKwlzdHJ1Y3Qg aWVlZTgwMjExX211dGFibGVfb2Zmc2V0cyBvZmZzID0ge307CisJc3RydWN0IHNrX2J1ZmYgKmJj bjsKKwlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7CisJdTggKmllczsKKwlpbnQgcmV0Owor CisJaWYgKGFydmlmLT52ZGV2X3R5cGUgIT0gV01JX1ZERVZfVFlQRV9BUCkKKwkJcmV0dXJuIDA7 CisKKwliY24gPSBpZWVlODAyMTFfYmVhY29uX2dldF90ZW1wbGF0ZShodywgdmlmLCAmb2Zmcywg MCk7CisJaWYgKCFiY24pIHsKKwkJYXRoMTJrX3dhcm4oYWIsICJmYWlsZWQgdG8gZ2V0IGJlYWNv biB0ZW1wbGF0ZSBmcm9tIG1hYzgwMjExXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlp ZXMgPSBiY24tPmRhdGEgKyBpZWVlODAyMTFfZ2V0X2hkcmxlbl9mcm9tX3NrYihiY24pOworCWll cyArPSBzaXplb2YobWdtdC0+dS5iZWFjb24pOworCisJaWYgKGNmZzgwMjExX2ZpbmRfaWUoV0xB Tl9FSURfUlNOLCBpZXMsIChza2JfdGFpbF9wb2ludGVyKGJjbikgLSBpZXMpKSkKKwkJYXJ2aWYt PnJzbmllX3ByZXNlbnQgPSB0cnVlOworCisJaWYgKGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKFdM QU5fT1VJX01JQ1JPU09GVCwKKwkJCQkgICAgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV1BBLAor CQkJCSAgICBpZXMsIChza2JfdGFpbF9wb2ludGVyKGJjbikgLSBpZXMpKSkKKwkJYXJ2aWYtPndw YWllX3ByZXNlbnQgPSB0cnVlOworCisJcmV0ID0gYXRoMTJrX3dtaV9iY25fdG1wbChhciwgYXJ2 aWYtPnZkZXZfaWQsICZvZmZzLCBiY24pOworCisJa2ZyZWVfc2tiKGJjbik7CisKKwlpZiAocmV0 KQorCQlhdGgxMmtfd2FybihhYiwgImZhaWxlZCB0byBzdWJtaXQgYmVhY29uIHRlbXBsYXRlIGNv bW1hbmQ6ICVkXG4iLAorCQkJICAgIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMg dm9pZCBhdGgxMmtfY29udHJvbF9iZWFjb25pbmcoc3RydWN0IGF0aDEya192aWYgKmFydmlmLAor CQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqaW5mbykKK3sKKwlzdHJ1Y3QgYXRo MTJrICphciA9IGFydmlmLT5hcjsKKwlpbnQgcmV0OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgm YXJ2aWYtPmFyLT5jb25mX211dGV4KTsKKworCWlmICghaW5mby0+ZW5hYmxlX2JlYWNvbikgewor CQlyZXQgPSBhdGgxMmtfd21pX3ZkZXZfZG93bihhciwgYXJ2aWYtPnZkZXZfaWQpOworCQlpZiAo cmV0KQorCQkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIGRvd24gdmRldl9pZCAlaTog JWRcbiIsCisJCQkJICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOworCisJCWFydmlmLT5pc191cCA9 IGZhbHNlOworCQlyZXR1cm47CisJfQorCisJLyogSW5zdGFsbCB0aGUgYmVhY29uIHRlbXBsYXRl IHRvIHRoZSBGVyAqLworCXJldCA9IGF0aDEya19tYWNfc2V0dXBfYmNuX3RtcGwoYXJ2aWYpOwor CWlmIChyZXQpIHsKKwkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIHVwZGF0ZSBiY24g dG1wbCBkdXJpbmcgdmRldiB1cDogJWRcbiIsCisJCQkgICAgcmV0KTsKKwkJcmV0dXJuOworCX0K KworCWFydmlmLT5haWQgPSAwOworCisJZXRoZXJfYWRkcl9jb3B5KGFydmlmLT5ic3NpZCwgaW5m by0+YnNzaWQpOworCisJcmV0ID0gYXRoMTJrX3dtaV92ZGV2X3VwKGFydmlmLT5hciwgYXJ2aWYt PnZkZXZfaWQsIGFydmlmLT5haWQsCisJCQkJIGFydmlmLT5ic3NpZCk7CisJaWYgKHJldCkgewor CQlhdGgxMmtfd2Fybihhci0+YWIsICJmYWlsZWQgdG8gYnJpbmcgdXAgdmRldiAlZDogJWlcbiIs CisJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CisJCXJldHVybjsKKwl9CisKKwlhcnZpZi0+ aXNfdXAgPSB0cnVlOworCisJYXRoMTJrX2RiZyhhci0+YWIsIEFUSDEyS19EQkdfTUFDLCAibWFj IHZkZXYgJWQgdXBcbiIsIGFydmlmLT52ZGV2X2lkKTsKK30KKworc3RhdGljIHZvaWQgYXRoMTJr X3BlZXJfYXNzb2NfaF9iYXNpYyhzdHJ1Y3QgYXRoMTJrICphciwKKwkJCQkgICAgICBzdHJ1Y3Qg aWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEs CisJCQkJICAgICAgc3RydWN0IGF0aDEya193bWlfcGVlcl9hc3NvY19hcmcgKmFyZykKK3sKKwlz dHJ1Y3QgYXRoMTJrX3ZpZiAqYXJ2aWYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CisJdTMyIGFp ZDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFyLT5jb25mX211dGV4KTsKKworCWlmICh2aWYt PnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKKwkJYWlkID0gdmlmLT5jZmcuYWlkOwor CWVsc2UKKwkJYWlkID0gc3RhLT5haWQ7CisKKwlldGhlcl9hZGRyX2NvcHkoYXJnLT5wZWVyX21h Yywgc3RhLT5hZGRyKTsKKwlhcmctPnZkZXZfaWQgPSBhcnZpZi0+dmRldl9pZDsKKwlhcmctPnBl ZXJfYXNzb2NpZCA9IGFpZDsKKwlhcmctPmF1dGhfZmxhZyA9IHRydWU7CisJLyogVE9ETzogU1RB IFdBUiBpbiBhdGgxMGsgZm9yIGxpc3RlbiBpbnRlcnZhbCByZXF1aXJlZD8gKi8KKwlhcmctPnBl ZXJfbGlzdGVuX2ludHZhbCA9IGFyLT5ody0+Y29uZi5saXN0ZW5faW50ZXJ2YWw7CisJYXJnLT5w ZWVyX25zcyA9IDE7CisJYXJnLT5wZWVyX2NhcHMgPSB2aWYtPmJzc19jb25mLmFzc29jX2NhcGFi aWxpdHk7Cit9CisKK3N0YXRpYyB2b2lkIGF0aDEya19wZWVyX2Fzc29jX2hfY3J5cHRvKHN0cnVj dCBhdGgxMmsgKmFyLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJ CSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCSAgICAgICBzdHJ1Y3QgYXRo MTJrX3dtaV9wZWVyX2Fzc29jX2FyZyAqYXJnKQoreworCXN0cnVjdCBpZWVlODAyMTFfYnNzX2Nv bmYgKmluZm8gPSAmdmlmLT5ic3NfY29uZjsKKwlzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgZGVm OworCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKKwlzdHJ1Y3QgYXRoMTJrX3ZpZiAqYXJ2aWYg PSAoc3RydWN0IGF0aDEya192aWYgKil2aWYtPmRydl9wcml2OworCWNvbnN0IHU4ICpyc25pZSA9 IE5VTEw7CisJY29uc3QgdTggKndwYWllID0gTlVMTDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQo JmFyLT5jb25mX211dGV4KTsKKworCWlmIChXQVJOX09OKGF0aDEya19tYWNfdmlmX2NoYW4odmlm LCAmZGVmKSkpCisJCXJldHVybjsKKworCWJzcyA9IGNmZzgwMjExX2dldF9ic3MoYXItPmh3LT53 aXBoeSwgZGVmLmNoYW4sIGluZm8tPmJzc2lkLCBOVUxMLCAwLAorCQkJICAgICAgIElFRUU4MDIx MV9CU1NfVFlQRV9BTlksIElFRUU4MDIxMV9QUklWQUNZX0FOWSk7CisKKwlpZiAoYXJ2aWYtPnJz bmllX3ByZXNlbnQgfHwgYXJ2aWYtPndwYWllX3ByZXNlbnQpIHsKKwkJYXJnLT5uZWVkX3B0a180 X3dheSA9IHRydWU7CisJCWlmIChhcnZpZi0+d3BhaWVfcHJlc2VudCkKKwkJCWFyZy0+bmVlZF9n dGtfMl93YXkgPSB0cnVlOworCX0gZWxzZSBpZiAoYnNzKSB7CisJCWNvbnN0IHN0cnVjdCBjZmc4 MDIxMV9ic3NfaWVzICppZXM7CisKKwkJcmN1X3JlYWRfbG9jaygpOworCQlyc25pZSA9IGllZWU4 MDIxMV9ic3NfZ2V0X2llKGJzcywgV0xBTl9FSURfUlNOKTsKKworCQlpZXMgPSByY3VfZGVyZWZl cmVuY2UoYnNzLT5pZXMpOworCisJCXdwYWllID0gY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUoV0xB Tl9PVUlfTUlDUk9TT0ZULAorCQkJCQkJV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV1BBLAorCQkJ CQkJaWVzLT5kYXRhLAorCQkJCQkJaWVzLT5sZW4pOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJ Y2ZnODAyMTFfcHV0X2Jzcyhhci0+aHctPndpcGh5LCBic3MpOworCX0KKworCS8qIEZJWE1FOiBi YXNlIG9uIFJTTiBJRS9XUEEgSUUgaXMgYSBjb3JyZWN0IGlkZWE/ICovCisJaWYgKHJzbmllIHx8 IHdwYWllKSB7CisJCWF0aDEya19kYmcoYXItPmFiLCBBVEgxMktfREJHX1dNSSwKKwkJCSAgICIl czogcnNuIGllIGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJCWFyZy0+bmVlZF9wdGtfNF93YXkgPSB0 cnVlOworCX0KKworCWlmICh3cGFpZSkgeworCQlhdGgxMmtfZGJnKGFyLT5hYiwgQVRIMTJLX0RC R19XTUksCisJCQkgICAiJXM6IHdwYSBpZSBmb3VuZFxuIiwgX19mdW5jX18pOworCQlhcmctPm5l ZWRfZ3RrXzJfd2F5ID0gdHJ1ZTsKKwl9CisKKwlpZiAoc3RhLT5tZnApIHsKKwkJLyogVE9ETzog TmVlZCB0byBjaGVjayBpZiBGVyBzdXBwb3J0cyBQTUY/ICovCisJCWFyZy0+aXNfcG1mX2VuYWJs ZWQgPSB0cnVlOworCX0KKworCS8qIFRPRE86IHNhZmVfbW9kZV9lbmFibGVkIChieXBhc3MgNC13 YXkgaGFuZHNoYWtlKSBmbGFnIHJlcT8gKi8KK30KKworc3RhdGljIHZvaWQgYXRoMTJrX3BlZXJf YXNzb2NfaF9yYXRlcyhzdHJ1Y3QgYXRoMTJrICphciwKKwkJCQkgICAgICBzdHJ1Y3QgaWVlZTgw MjExX3ZpZiAqdmlmLAorCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkJ ICAgICAgc3RydWN0IGF0aDEya193bWlfcGVlcl9hc3NvY19hcmcgKmFyZykKK3sKKwlzdHJ1Y3Qg YXRoMTJrX3ZpZiAqYXJ2aWYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CisJc3RydWN0IHdtaV9y YXRlX3NldF9hcmcgKnJhdGVzZXQgPSAmYXJnLT5wZWVyX2xlZ2FjeV9yYXRlczsKKwlzdHJ1Y3Qg Y2ZnODAyMTFfY2hhbl9kZWYgZGVmOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVk X2JhbmQgKnNiYW5kOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZXM7CisJZW51 bSBubDgwMjExX2JhbmQgYmFuZDsKKwl1MzIgcmF0ZW1hc2s7CisJdTggcmF0ZTsKKwlpbnQgaTsK KworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFyLT5jb25mX211dGV4KTsKKworCWlmIChXQVJOX09O KGF0aDEya19tYWNfdmlmX2NoYW4odmlmLCAmZGVmKSkpCisJCXJldHVybjsKKworCWJhbmQgPSBk ZWYuY2hhbi0+YmFuZDsKKwlzYmFuZCA9IGFyLT5ody0+d2lwaHktPmJhbmRzW2JhbmRdOworCXJh dGVtYXNrID0gc3RhLT5kZWZsaW5rLnN1cHBfcmF0ZXNbYmFuZF07CisJcmF0ZW1hc2sgJj0gYXJ2 aWYtPmJpdHJhdGVfbWFzay5jb250cm9sW2JhbmRdLmxlZ2FjeTsKKwlyYXRlcyA9IHNiYW5kLT5i aXRyYXRlczsKKworCXJhdGVzZXQtPm51bV9yYXRlcyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwg MzI7IGkrKywgcmF0ZW1hc2sgPj49IDEsIHJhdGVzKyspIHsKKwkJaWYgKCEocmF0ZW1hc2sgJiAx KSkKKwkJCWNvbnRpbnVlOworCisJCXJhdGUgPSBhdGgxMmtfbWFjX2JpdHJhdGVfdG9fcmF0ZShy YXRlcy0+Yml0cmF0ZSk7CisJCXJhdGVzZXQtPnJhdGVzW3JhdGVzZXQtPm51bV9yYXRlc10gPSBy YXRlOworCQlyYXRlc2V0LT5udW1fcmF0ZXMrKzsKKwl9Cit9CisKK3N0YXRpYyBib29sCithdGgx MmtfcGVlcl9hc3NvY19oX2h0X21hc2tlZChjb25zdCB1OCBodF9tY3NfbWFza1tJRUVFODAyMTFf SFRfTUNTX01BU0tfTEVOXSkKK3sKKwlpbnQgbnNzOworCisJZm9yIChuc3MgPSAwOyBuc3MgPCBJ RUVFODAyMTFfSFRfTUNTX01BU0tfTEVOOyBuc3MrKykKKwkJaWYgKGh0X21jc19tYXNrW25zc10p CisJCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2F0 aDEya19wZWVyX2Fzc29jX2hfdmh0X21hc2tlZChjb25zdCB1MTYgdmh0X21jc19tYXNrW05MODAy MTFfVkhUX05TU19NQVhdKQoreworCWludCBuc3M7CisKKwlmb3IgKG5zcyA9IDA7IG5zcyA8IE5M ODAyMTFfVkhUX05TU19NQVg7IG5zcysrKQorCQlpZiAodmh0X21jc19tYXNrW25zc10pCisJCQly ZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgYXRoMTJrX3Bl ZXJfYXNzb2NfaF9odChzdHJ1Y3QgYXRoMTJrICphciwKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjEx X3ZpZiAqdmlmLAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkJICAgc3Ry dWN0IGF0aDEya193bWlfcGVlcl9hc3NvY19hcmcgKmFyZykKK3sKKwljb25zdCBzdHJ1Y3QgaWVl ZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCA9ICZzdGEtPmRlZmxpbmsuaHRfY2FwOworCXN0cnVj dCBhdGgxMmtfdmlmICphcnZpZiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgY2Zn ODAyMTFfY2hhbl9kZWYgZGVmOworCWVudW0gbmw4MDIxMV9iYW5kIGJhbmQ7CisJY29uc3QgdTgg Kmh0X21jc19tYXNrOworCWludCBpLCBuOworCXU4IG1heF9uc3M7CisJdTMyIHN0YmM7CisKKwls b2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7CisKKwlpZiAoV0FSTl9PTihhdGgx MmtfbWFjX3ZpZl9jaGFuKHZpZiwgJmRlZikpKQorCQlyZXR1cm47CisKKwlpZiAoIWh0X2NhcC0+ aHRfc3VwcG9ydGVkKQorCQlyZXR1cm47CisKKwliYW5kID0gZGVmLmNoYW4tPmJhbmQ7CisJaHRf bWNzX21hc2sgPSBhcnZpZi0+Yml0cmF0ZV9tYXNrLmNvbnRyb2xbYmFuZF0uaHRfbWNzOworCisJ aWYgKGF0aDEya19wZWVyX2Fzc29jX2hfaHRfbWFza2VkKGh0X21jc19tYXNrKSkKKwkJcmV0dXJu OworCisJYXJnLT5odF9mbGFnID0gdHJ1ZTsKKworCWFyZy0+cGVlcl9tYXhfbXBkdSA9ICgxIDw8 IChJRUVFODAyMTFfSFRfTUFYX0FNUERVX0ZBQ1RPUiArCisJCQkJICAgIGh0X2NhcC0+YW1wZHVf ZmFjdG9yKSkgLSAxOworCisJYXJnLT5wZWVyX21wZHVfZGVuc2l0eSA9CisJCWF0aDEya19wYXJz ZV9tcGR1ZGVuc2l0eShodF9jYXAtPmFtcGR1X2RlbnNpdHkpOworCisJYXJnLT5wZWVyX2h0X2Nh cHMgPSBodF9jYXAtPmNhcDsKKwlhcmctPnBlZXJfcmF0ZV9jYXBzIHw9IFdNSV9IT1NUX1JDX0hU X0ZMQUc7CisKKwlpZiAoaHRfY2FwLT5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX0xEUENfQ09ESU5H KQorCQlhcmctPmxkcGNfZmxhZyA9IHRydWU7CisKKwlpZiAoc3RhLT5kZWZsaW5rLmJhbmR3aWR0 aCA+PSBJRUVFODAyMTFfU1RBX1JYX0JXXzQwKSB7CisJCWFyZy0+YndfNDAgPSB0cnVlOworCQlh cmctPnBlZXJfcmF0ZV9jYXBzIHw9IFdNSV9IT1NUX1JDX0NXNDBfRkxBRzsKKwl9CisKKwlpZiAo YXJ2aWYtPmJpdHJhdGVfbWFzay5jb250cm9sW2JhbmRdLmdpICE9IE5MODAyMTFfVFhSQVRFX0ZP UkNFX0xHSSkgeworCQlpZiAoaHRfY2FwLT5jYXAgJiAoSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAg fAorCQkgICAgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDApKQorCQkJYXJnLT5wZWVyX3JhdGVfY2Fw cyB8PSBXTUlfSE9TVF9SQ19TR0lfRkxBRzsKKwl9CisKKwlpZiAoaHRfY2FwLT5jYXAgJiBJRUVF ODAyMTFfSFRfQ0FQX1RYX1NUQkMpIHsKKwkJYXJnLT5wZWVyX3JhdGVfY2FwcyB8PSBXTUlfSE9T VF9SQ19UWF9TVEJDX0ZMQUc7CisJCWFyZy0+c3RiY19mbGFnID0gdHJ1ZTsKKwl9CisKKwlpZiAo aHRfY2FwLT5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1JYX1NUQkMpIHsKKwkJc3RiYyA9IGh0X2Nh cC0+Y2FwICYgSUVFRTgwMjExX0hUX0NBUF9SWF9TVEJDOworCQlzdGJjID0gc3RiYyA+PiBJRUVF ODAyMTFfSFRfQ0FQX1JYX1NUQkNfU0hJRlQ7CisJCXN0YmMgPSBzdGJjIDw8IFdNSV9IT1NUX1JD X1JYX1NUQkNfRkxBR19TOworCQlhcmctPnBlZXJfcmF0ZV9jYXBzIHw9IHN0YmM7CisJCWFyZy0+ c3RiY19mbGFnID0gdHJ1ZTsKKwl9CisKKwlpZiAoaHRfY2FwLT5tY3MucnhfbWFza1sxXSAmJiBo dF9jYXAtPm1jcy5yeF9tYXNrWzJdKQorCQlhcmctPnBlZXJfcmF0ZV9jYXBzIHw9IFdNSV9IT1NU X1JDX1RTX0ZMQUc7CisJZWxzZSBpZiAoaHRfY2FwLT5tY3MucnhfbWFza1sxXSkKKwkJYXJnLT5w ZWVyX3JhdGVfY2FwcyB8PSBXTUlfSE9TVF9SQ19EU19GTEFHOworCisJZm9yIChpID0gMCwgbiA9 IDAsIG1heF9uc3MgPSAwOyBpIDwgSUVFRTgwMjExX0hUX01DU19NQVNLX0xFTiAqIDg7IGkrKykK KwkJaWYgKChodF9jYXAtPm1jcy5yeF9tYXNrW2kgLyA4XSAmIEJJVChpICUgOCkpICYmCisJCSAg ICAoaHRfbWNzX21hc2tbaSAvIDhdICYgQklUKGkgJSA4KSkpIHsKKwkJCW1heF9uc3MgPSAoaSAv IDgpICsgMTsKKwkJCWFyZy0+cGVlcl9odF9yYXRlcy5yYXRlc1tuKytdID0gaTsKKwkJfQorCisJ LyogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIEhULWVuYWJsZWQgU1RBcyB3aGljaCBicmVhayB0 aGUgc3BlYworCSAqIGFuZCBoYXZlIG5vIEhUIGNhcGFiaWxpdGllcyBSWCBtYXNrIChubyBIVCBS WCBNQ1MgbWFwKS4KKwkgKgorCSAqIEFzIHBlciBzcGVjLCBpbiBzZWN0aW9uIDIwLjMuNSBNb2R1 bGF0aW9uIGFuZCBjb2Rpbmcgc2NoZW1lIChNQ1MpLAorCSAqIE1DUyAwIHRocm91Z2ggNyBhcmUg bWFuZGF0b3J5IGluIDIwTUh6IHdpdGggODAwIG5zIEdJIGF0IGFsbCBTVEFzLgorCSAqCisJICog RmlybXdhcmUgYXNzZXJ0cyBpZiBzdWNoIHNpdHVhdGlvbiBvY2N1cnMuCisJICovCisJaWYgKG4g PT0gMCkgeworCQlhcmctPnBlZXJfaHRfcmF0ZXMubnVtX3JhdGVzID0gODsKKwkJZm9yIChpID0g MDsgaSA8IGFyZy0+cGVlcl9odF9yYXRlcy5udW1fcmF0ZXM7IGkrKykKKwkJCWFyZy0+cGVlcl9o dF9yYXRlcy5yYXRlc1tpXSA9IGk7CisJfSBlbHNlIHsKKwkJYXJnLT5wZWVyX2h0X3JhdGVzLm51 bV9yYXRlcyA9IG47CisJCWFyZy0+cGVlcl9uc3MgPSBtaW4oc3RhLT5kZWZsaW5rLnJ4X25zcywg bWF4X25zcyk7CisJfQorCisJYXRoMTJrX2RiZyhhci0+YWIsIEFUSDEyS19EQkdfTUFDLCAibWFj IGh0IHBlZXIgJXBNIG1jcyBjbnQgJWQgbnNzICVkXG4iLAorCQkgICBhcmctPnBlZXJfbWFjLAor CQkgICBhcmctPnBlZXJfaHRfcmF0ZXMubnVtX3JhdGVzLAorCQkgICBhcmctPnBlZXJfbnNzKTsK K30KKworc3RhdGljIGludCBhdGgxMmtfbWFjX2dldF9tYXhfdmh0X21jc19tYXAodTE2IG1jc19t YXAsIGludCBuc3MpCit7CisJc3dpdGNoICgobWNzX21hcCA+PiAoMiAqIG5zcykpICYgMHgzKSB7 CisJY2FzZSBJRUVFODAyMTFfVkhUX01DU19TVVBQT1JUXzBfNzogcmV0dXJuIEJJVCg4KSAtIDE7 CisJY2FzZSBJRUVFODAyMTFfVkhUX01DU19TVVBQT1JUXzBfODogcmV0dXJuIEJJVCg5KSAtIDE7 CisJY2FzZSBJRUVFODAyMTFfVkhUX01DU19TVVBQT1JUXzBfOTogcmV0dXJuIEJJVCgxMCkgLSAx OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUxNgorYXRoMTJrX3BlZXJfYXNzb2NfaF92 aHRfbGltaXQodTE2IHR4X21jc19zZXQsCisJCQkgICAgICBjb25zdCB1MTYgdmh0X21jc19saW1p dFtOTDgwMjExX1ZIVF9OU1NfTUFYXSkKK3sKKwlpbnQgaWR4X2xpbWl0OworCWludCBuc3M7CisJ dTE2IG1jc19tYXA7CisJdTE2IG1jczsKKworCWZvciAobnNzID0gMDsgbnNzIDwgTkw4MDIxMV9W SFRfTlNTX01BWDsgbnNzKyspIHsKKwkJbWNzX21hcCA9IGF0aDEya19tYWNfZ2V0X21heF92aHRf bWNzX21hcCh0eF9tY3Nfc2V0LCBuc3MpICYKKwkJCSAgdmh0X21jc19saW1pdFtuc3NdOworCisJ CWlmIChtY3NfbWFwKQorCQkJaWR4X2xpbWl0ID0gZmxzKG1jc19tYXApIC0gMTsKKwkJZWxzZQor CQkJaWR4X2xpbWl0ID0gLTE7CisKKwkJc3dpdGNoIChpZHhfbGltaXQpIHsKKwkJY2FzZSAwOgor CQljYXNlIDE6CisJCWNhc2UgMjoKKwkJY2FzZSAzOgorCQljYXNlIDQ6CisJCWNhc2UgNToKKwkJ Y2FzZSA2OgorCQljYXNlIDc6CisJCQltY3MgPSBJRUVFODAyMTFfVkhUX01DU19TVVBQT1JUXzBf NzsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQltY3MgPSBJRUVFODAyMTFfVkhUX01DU19TVVBQ T1JUXzBfODsKKwkJCWJyZWFrOworCQljYXNlIDk6CisJCQltY3MgPSBJRUVFODAyMTFfVkhUX01D U19TVVBQT1JUXzBfOTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJV0FSTl9PTigxKTsKKwkJ CWZhbGx0aHJvdWdoOworCQljYXNlIC0xOgorCQkJbWNzID0gSUVFRTgwMjExX1ZIVF9NQ1NfTk9U X1NVUFBPUlRFRDsKKwkJCWJyZWFrOworCQl9CisKKwkJdHhfbWNzX3NldCAmPSB+KDB4MyA8PCAo bnNzICogMikpOworCQl0eF9tY3Nfc2V0IHw9IG1jcyA8PCAobnNzICogMik7CisJfQorCisJcmV0 dXJuIHR4X21jc19zZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGF0aDEya19wZWVyX2Fzc29jX2hfdmh0 KHN0cnVjdCBhdGgxMmsgKmFyLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAor CQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCSAgICBzdHJ1Y3QgYXRoMTJr X3dtaV9wZWVyX2Fzc29jX2FyZyAqYXJnKQoreworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfc3Rh X3ZodF9jYXAgKnZodF9jYXAgPSAmc3RhLT5kZWZsaW5rLnZodF9jYXA7CisJc3RydWN0IGF0aDEy a192aWYgKmFydmlmID0gKHZvaWQgKil2aWYtPmRydl9wcml2OworCXN0cnVjdCBjZmc4MDIxMV9j aGFuX2RlZiBkZWY7CisJZW51bSBubDgwMjExX2JhbmQgYmFuZDsKKwljb25zdCB1MTYgKnZodF9t Y3NfbWFzazsKKwl1MTYgdHhfbWNzX21hcDsKKwl1OCBhbXBkdV9mYWN0b3I7CisJdTggbWF4X25z cywgdmh0X21jczsKKwlpbnQgaTsKKworCWlmIChXQVJOX09OKGF0aDEya19tYWNfdmlmX2NoYW4o dmlmLCAmZGVmKSkpCisJCXJldHVybjsKKworCWlmICghdmh0X2NhcC0+dmh0X3N1cHBvcnRlZCkK KwkJcmV0dXJuOworCisJYmFuZCA9IGRlZi5jaGFuLT5iYW5kOworCXZodF9tY3NfbWFzayA9IGFy dmlmLT5iaXRyYXRlX21hc2suY29udHJvbFtiYW5kXS52aHRfbWNzOworCisJaWYgKGF0aDEya19w ZWVyX2Fzc29jX2hfdmh0X21hc2tlZCh2aHRfbWNzX21hc2spKQorCQlyZXR1cm47CisKKwlhcmct PnZodF9mbGFnID0gdHJ1ZTsKKworCS8qIFRPRE86IHNpbWlsYXIgZmxhZ3MgcmVxdWlyZWQ/ICov CisJYXJnLT52aHRfY2FwYWJsZSA9IHRydWU7CisKKwlpZiAoZGVmLmNoYW4tPmJhbmQgPT0gTkw4 MDIxMV9CQU5EXzJHSFopCisJCWFyZy0+dmh0X25nX2ZsYWcgPSB0cnVlOworCisJYXJnLT5wZWVy X3ZodF9jYXBzID0gdmh0X2NhcC0+Y2FwOworCisJYW1wZHVfZmFjdG9yID0gKHZodF9jYXAtPmNh cCAmCisJCQlJRUVFODAyMTFfVkhUX0NBUF9NQVhfQV9NUERVX0xFTkdUSF9FWFBPTkVOVF9NQVNL KSA+PgorCQkgICAgICAgSUVFRTgwMjExX1ZIVF9DQVBfTUFYX0FfTVBEVV9MRU5HVEhfRVhQT05F TlRfU0hJRlQ7CisKKwkvKiBXb3JrYXJvdW5kOiBTb21lIE5ldGdlYXIvTGlua3N5cyAxMWFjIEFQ cyBzZXQgUnggQS1NUERVIGZhY3RvciB0bworCSAqIHplcm8gaW4gVkhUIElFLiBVc2luZyBpdCB3 b3VsZCByZXN1bHQgaW4gZGVncmFkZWQgdGhyb3VnaHB1dC4KKwkgKiBhcmctPnBlZXJfbWF4X21w ZHUgYXQgdGhpcyBwb2ludCBjb250YWlucyBIVCBtYXhfbXBkdSBzbyBrZWVwCisJICogaXQgaWYg VkhUIG1heF9tcGR1IGlzIHNtYWxsZXIuCisJICovCisJYXJnLT5wZWVyX21heF9tcGR1ID0gbWF4 KGFyZy0+cGVlcl9tYXhfbXBkdSwKKwkJCQkgKDFVIDw8IChJRUVFODAyMTFfSFRfTUFYX0FNUERV X0ZBQ1RPUiArCisJCQkJCWFtcGR1X2ZhY3RvcikpIC0gMSk7CisKKwlpZiAoc3RhLT5kZWZsaW5r LmJhbmR3aWR0aCA9PSBJRUVFODAyMTFfU1RBX1JYX0JXXzgwKQorCQlhcmctPmJ3XzgwID0gdHJ1 ZTsKKworCWlmIChzdGEtPmRlZmxpbmsuYmFuZHdpZHRoID09IElFRUU4MDIxMV9TVEFfUlhfQldf MTYwKQorCQlhcmctPmJ3XzE2MCA9IHRydWU7CisKKwkvKiBDYWxjdWxhdGUgcGVlciBOU1MgY2Fw YWJpbGl0eSBmcm9tIFZIVCBjYXBhYmlsaXRpZXMgaWYgU1RBCisJICogc3VwcG9ydHMgVkhULgor CSAqLworCWZvciAoaSA9IDAsIG1heF9uc3MgPSAwLCB2aHRfbWNzID0gMDsgaSA8IE5MODAyMTFf VkhUX05TU19NQVg7IGkrKykgeworCQl2aHRfbWNzID0gX19sZTE2X3RvX2NwdSh2aHRfY2FwLT52 aHRfbWNzLnJ4X21jc19tYXApID4+CisJCQkgICgyICogaSkgJiAzOworCisJCWlmICh2aHRfbWNz ICE9IElFRUU4MDIxMV9WSFRfTUNTX05PVF9TVVBQT1JURUQgJiYKKwkJICAgIHZodF9tY3NfbWFz a1tpXSkKKwkJCW1heF9uc3MgPSBpICsgMTsKKwl9CisJYXJnLT5wZWVyX25zcyA9IG1pbihzdGEt PmRlZmxpbmsucnhfbnNzLCBtYXhfbnNzKTsKKwlhcmctPnJ4X21heF9yYXRlID0gX19sZTE2X3Rv X2NwdSh2aHRfY2FwLT52aHRfbWNzLnJ4X2hpZ2hlc3QpOworCWFyZy0+cnhfbWNzX3NldCA9IF9f bGUxNl90b19jcHUodmh0X2NhcC0+dmh0X21jcy5yeF9tY3NfbWFwKTsKKwlhcmctPnR4X21heF9y YXRlID0gX19sZTE2X3RvX2NwdSh2aHRfY2FwLT52aHRfbWNzLnR4X2hpZ2hlc3QpOworCisJdHhf bWNzX21hcCA9IF9fbGUxNl90b19jcHUodmh0X2NhcC0+dmh0X21jcy50eF9tY3NfbWFwKTsKKwlh cmctPnR4X21jc19zZXQgPSBhdGgxMmtfcGVlcl9hc3NvY19oX3ZodF9saW1pdCh0eF9tY3NfbWFw LCB2aHRfbWNzX21hc2spOworCisJLyogSW4gUUNOOTI3NCBwbGF0Zm9ybSwgVkhUIE1DUyByYXRl IDEwIGFuZCAxMSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCisJICogVkhUIE1DUyByYXRlIDEwIGFu ZCAxMSBpcyBub3Qgc3VwcG9ydGVkIGluIDExYWMgc3RhbmRhcmQuCisJICogc28gZXhwbGljaXRs eSBkaXNhYmxlIHRoZSBWSFQgTUNTIHJhdGUgMTAgYW5kIDExIGluIDExYWMgbW9kZS4KKwkgKi8K KwlhcmctPnR4X21jc19zZXQgJj0gfklFRUU4MDIxMV9WSFRfTUNTX1NVUFBPUlRfMF8xMV9NQVNL OworCWFyZy0+dHhfbWNzX3NldCB8PSBJRUVFODAyMTFfRElTQUJMRV9WSFRfTUNTX1NVUFBPUlRf MF8xMTsKKworCWlmICgoYXJnLT50eF9tY3Nfc2V0ICYgSUVFRTgwMjExX1ZIVF9NQ1NfTk9UX1NV UFBPUlRFRCkgPT0KKwkJCUlFRUU4MDIxMV9WSFRfTUNTX05PVF9TVVBQT1JURUQpCisJCWFyZy0+ cGVlcl92aHRfY2FwcyAmPSB+SUVFRTgwMjExX1ZIVF9DQVBfTVVfQkVBTUZPUk1FRV9DQVBBQkxF OworCisJLyogVE9ETzogIENoZWNrICovCisJYXJnLT50eF9tYXhfbWNzX25zcyA9IDB4RkY7CisK KwlhdGgxMmtfZGJnKGFyLT5hYiwgQVRIMTJLX0RCR19NQUMsICJtYWMgdmh0IHBlZXIgJXBNIG1h eF9tcGR1ICVkIGZsYWdzIDB4JXhcbiIsCisJCSAgIHN0YS0+YWRkciwgYXJnLT5wZWVyX21heF9t cGR1LCBhcmctPnBlZXJfZmxhZ3MpOworCisJLyogVE9ETzogcnhuc3Nfb3ZlcnJpZGUgKi8KK30K Kworc3RhdGljIHZvaWQgYXRoMTJrX3BlZXJfYXNzb2NfaF9oZShzdHJ1Y3QgYXRoMTJrICphciwK KwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgIHN0cnVjdCBpZWVlODAy MTFfc3RhICpzdGEsCisJCQkJICAgc3RydWN0IGF0aDEya193bWlfcGVlcl9hc3NvY19hcmcgKmFy ZykKK3sKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9oZV9jYXAgKmhlX2NhcCA9ICZzdGEt PmRlZmxpbmsuaGVfY2FwOworCWludCBpOworCXU4IGFtcGR1X2ZhY3RvciwgcnhfbWNzXzgwLCBy eF9tY3NfMTYwLCBtYXhfbnNzOworCXUxNiBtY3NfMTYwX21hcCwgbWNzXzgwX21hcDsKKwlib29s IHN1cHBvcnRfMTYwOworCXUxNiB2OworCisJaWYgKCFoZV9jYXAtPmhhc19oZSkKKwkJcmV0dXJu OworCisJYXJnLT5oZV9mbGFnID0gdHJ1ZTsKKworCXN1cHBvcnRfMTYwID0gISEoaGVfY2FwLT5o ZV9jYXBfZWxlbS5waHlfY2FwX2luZm9bMF0gJgorCQkgIElFRUU4MDIxMV9IRV9QSFlfQ0FQMF9D SEFOTkVMX1dJRFRIX1NFVF8xNjBNSFpfSU5fNUcpOworCisJLyogU3VwcG9ydGVkIEhFLU1DUyBh bmQgTlNTIFNldCBvZiBwZWVyIGhlX2NhcCBpcyBpbnRlcnNlY3Rpb24gd2l0aCBzZWxmIGhlX2Nw ICovCisJbWNzXzE2MF9tYXAgPSBsZTE2X3RvX2NwdShoZV9jYXAtPmhlX21jc19uc3Nfc3VwcC5y eF9tY3NfMTYwKTsKKwltY3NfODBfbWFwID0gbGUxNl90b19jcHUoaGVfY2FwLT5oZV9tY3NfbnNz X3N1cHAucnhfbWNzXzgwKTsKKworCWlmIChzdXBwb3J0XzE2MCkgeworCQlmb3IgKGkgPSA3OyBp ID49IDA7IGktLSkgeworCQkJdTggbWNzXzE2MCA9IChtY3NfMTYwX21hcCA+PiAoMiAqIGkpKSAm IDM7CisKKwkJCWlmIChtY3NfMTYwICE9IElFRUU4MDIxMV9IRV9NQ1NfTk9UX1NVUFBPUlRFRCkg eworCQkJCXJ4X21jc18xNjAgPSBpICsgMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwor CWZvciAoaSA9IDc7IGkgPj0gMDsgaS0tKSB7CisJCXU4IG1jc184MCA9IChtY3NfODBfbWFwID4+ ICgyICogaSkpICYgMzsKKworCQlpZiAobWNzXzgwICE9IElFRUU4MDIxMV9IRV9NQ1NfTk9UX1NV UFBPUlRFRCkgeworCQkJcnhfbWNzXzgwID0gaSArIDE7CisJCQlicmVhazsKKwkJfQorCX0KKwor CWlmIChzdXBwb3J0XzE2MCkKKwkJbWF4X25zcyA9IG1pbihyeF9tY3NfODAsIHJ4X21jc18xNjAp OworCWVsc2UKKwkJbWF4X25zcyA9IHJ4X21jc184MDsKKworCWFyZy0+cGVlcl9uc3MgPSBtaW4o c3RhLT5kZWZsaW5rLnJ4X25zcywgbWF4X25zcyk7CisKKwltZW1jcHkoJmFyZy0+cGVlcl9oZV9j YXBfbWFjaW5mbywgaGVfY2FwLT5oZV9jYXBfZWxlbS5tYWNfY2FwX2luZm8sCisJICAgICAgIHNp emVvZihhcmctPnBlZXJfaGVfY2FwX21hY2luZm8pKTsKKwltZW1jcHkoJmFyZy0+cGVlcl9oZV9j YXBfcGh5aW5mbywgaGVfY2FwLT5oZV9jYXBfZWxlbS5waHlfY2FwX2luZm8sCisJICAgICAgIHNp emVvZihhcmctPnBlZXJfaGVfY2FwX3BoeWluZm8pKTsKKwlhcmctPnBlZXJfaGVfb3BzID0gdmlm LT5ic3NfY29uZi5oZV9vcGVyLnBhcmFtczsKKworCS8qIHRoZSB0b3AgbW9zdCBieXRlIGlzIHVz ZWQgdG8gaW5kaWNhdGUgQlNTIGNvbG9yIGluZm8gKi8KKwlhcmctPnBlZXJfaGVfb3BzICY9IDB4 ZmZmZmZmOworCisJLyogQXMgcGVyIHNlY3Rpb24gMjYuNi4xIElFRUUgU3RkIDgwMi4xMWF44oCQ MjAyMiwgaWYgdGhlIE1heCBBTVBEVQorCSAqIEV4cG9uZW50IEV4dGVuc2lvbiBpbiBIRSBjYXAg aXMgemVybywgdXNlIHRoZSBhcmctPnBlZXJfbWF4X21wZHUKKwkgKiBhcyBjYWxjdWxhdGVkIHdo aWxlIHBhcnNpbmcgVkhUIGNhcHMoaWYgVkhUIGNhcHMgaXMgcHJlc2VudCkKKwkgKiBvciBIVCBj YXBzIChpZiBWSFQgY2FwcyBpcyBub3QgcHJlc2VudCkuCisJICoKKwkgKiBGb3Igbm9uLXplcm8g dmFsdWUgb2YgTWF4IEFNUERVIEV4cG9uZW50IEV4dGVuc2lvbiBpbiBIRSBNQUMgY2FwcywKKwkg KiBpZiBhIEhFIFNUQSBzZW5kcyBWSFQgY2FwIGFuZCBIRSBjYXAgSUUgaW4gYXNzb2MgcmVxdWVz dCB0aGVuLCB1c2UKKwkgKiBNQVhfQU1QRFVfTEVOX0ZBQ1RPUiBhcyAyMCB0byBjYWxjdWxhdGUg bWF4X2FtcGR1IGxlbmd0aC4KKwkgKiBJZiBhIEhFIFNUQSB0aGF0IGRvZXMgbm90IHNlbmQgVkhU IGNhcCwgYnV0IEhFIGFuZCBIVCBjYXAgaW4gYXNzb2MKKwkgKiByZXF1ZXN0LCB0aGVuIHVzZSBN QVhfQU1QRFVfTEVOX0ZBQ1RPUiBhcyAxNiB0byBjYWxjdWxhdGUgbWF4X2FtcGR1CisJICogbGVu Z3RoLgorCSAqLworCWFtcGR1X2ZhY3RvciA9IChoZV9jYXAtPmhlX2NhcF9lbGVtLm1hY19jYXBf aW5mb1szXSAmCisJCQlJRUVFODAyMTFfSEVfTUFDX0NBUDNfTUFYX0FNUERVX0xFTl9FWFBfTUFT SykgPj4KKwkJCUlFRUU4MDIxMV9IRV9NQUNfQ0FQM19NQVhfQU1QRFVfTEVOX0VYUF9NQVNLOwor CisJaWYgKGFtcGR1X2ZhY3RvcikgeworCQlpZiAoc3RhLT5kZWZsaW5rLnZodF9jYXAudmh0X3N1 cHBvcnRlZCkKKwkJCWFyZy0+cGVlcl9tYXhfbXBkdSA9ICgxIDw8IChJRUVFODAyMTFfSEVfVkhU X01BWF9BTVBEVV9GQUNUT1IgKworCQkJCQkJICAgIGFtcGR1X2ZhY3RvcikpIC0gMTsKKwkJZWxz ZSBpZiAoc3RhLT5kZWZsaW5rLmh0X2NhcC5odF9zdXBwb3J0ZWQpCisJCQlhcmctPnBlZXJfbWF4 X21wZHUgPSAoMSA8PCAoSUVFRTgwMjExX0hFX0hUX01BWF9BTVBEVV9GQUNUT1IgKworCQkJCQkJ ICAgIGFtcGR1X2ZhY3RvcikpIC0gMTsKKwl9CisKKwlpZiAoaGVfY2FwLT5oZV9jYXBfZWxlbS5w aHlfY2FwX2luZm9bNl0gJgorCSAgICBJRUVFODAyMTFfSEVfUEhZX0NBUDZfUFBFX1RIUkVTSE9M RF9QUkVTRU5UKSB7CisJCWludCBiaXQgPSA3OworCQlpbnQgbnNzLCBydTsKKworCQlhcmctPnBl ZXJfcHBldC5udW1zc19tMSA9IGhlX2NhcC0+cHBlX3RocmVzWzBdICYKKwkJCQkJICBJRUVFODAy MTFfUFBFX1RIUkVTX05TU19NQVNLOworCQlhcmctPnBlZXJfcHBldC5ydV9iaXRfbWFzayA9CisJ CQkoaGVfY2FwLT5wcGVfdGhyZXNbMF0gJgorCQkJIElFRUU4MDIxMV9QUEVfVEhSRVNfUlVfSU5E RVhfQklUTUFTS19NQVNLKSA+PgorCQkJSUVFRTgwMjExX1BQRV9USFJFU19SVV9JTkRFWF9CSVRN QVNLX1BPUzsKKworCQlmb3IgKG5zcyA9IDA7IG5zcyA8PSBhcmctPnBlZXJfcHBldC5udW1zc19t MTsgbnNzKyspIHsKKwkJCWZvciAocnUgPSAwOyBydSA8IDQ7IHJ1KyspIHsKKwkJCQl1MzIgdmFs ID0gMDsKKwkJCQlpbnQgaTsKKworCQkJCWlmICgoYXJnLT5wZWVyX3BwZXQucnVfYml0X21hc2sg JiBCSVQocnUpKSA9PSAwKQorCQkJCQljb250aW51ZTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgNjsg aSsrKSB7CisJCQkJCXZhbCA+Pj0gMTsKKwkJCQkJdmFsIHw9ICgoaGVfY2FwLT5wcGVfdGhyZXNb Yml0IC8gOF0gPj4KKwkJCQkJCSAoYml0ICUgOCkpICYgMHgxKSA8PCA1OworCQkJCQliaXQrKzsK KwkJCQl9CisJCQkJYXJnLT5wZWVyX3BwZXQucHBldDE2X3BwZXQ4X3J1M19ydTBbbnNzXSB8PQor CQkJCQkJCQl2YWwgPDwgKHJ1ICogNik7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoaGVfY2FwLT5o ZV9jYXBfZWxlbS5tYWNfY2FwX2luZm9bMF0gJiBJRUVFODAyMTFfSEVfTUFDX0NBUDBfVFdUX1JF UykKKwkJYXJnLT50d3RfcmVzcG9uZGVyID0gdHJ1ZTsKKwlpZiAoaGVfY2FwLT5oZV9jYXBfZWxl bS5tYWNfY2FwX2luZm9bMF0gJiBJRUVFODAyMTFfSEVfTUFDX0NBUDBfVFdUX1JFUSkKKwkJYXJn LT50d3RfcmVxdWVzdGVyID0gdHJ1ZTsKKworCXN3aXRjaCAoc3RhLT5kZWZsaW5rLmJhbmR3aWR0 aCkgeworCWNhc2UgSUVFRTgwMjExX1NUQV9SWF9CV18xNjA6CisJCWlmIChoZV9jYXAtPmhlX2Nh cF9lbGVtLnBoeV9jYXBfaW5mb1swXSAmCisJCSAgICBJRUVFODAyMTFfSEVfUEhZX0NBUDBfQ0hB Tk5FTF9XSURUSF9TRVRfODBQTFVTODBfTUhaX0lOXzVHKSB7CisJCQl2ID0gbGUxNl90b19jcHUo aGVfY2FwLT5oZV9tY3NfbnNzX3N1cHAucnhfbWNzXzgwcDgwKTsKKwkJCWFyZy0+cGVlcl9oZV9y eF9tY3Nfc2V0W1dNSV9IRUNBUF9UWFJYX01DU19OU1NfSURYXzgwXzgwXSA9IHY7CisKKwkJCXYg PSBsZTE2X3RvX2NwdShoZV9jYXAtPmhlX21jc19uc3Nfc3VwcC50eF9tY3NfODBwODApOworCQkJ YXJnLT5wZWVyX2hlX3R4X21jc19zZXRbV01JX0hFQ0FQX1RYUlhfTUNTX05TU19JRFhfODBfODBd ID0gdjsKKworCQkJYXJnLT5wZWVyX2hlX21jc19jb3VudCsrOworCQl9CisJCXYgPSBsZTE2X3Rv X2NwdShoZV9jYXAtPmhlX21jc19uc3Nfc3VwcC5yeF9tY3NfMTYwKTsKKwkJYXJnLT5wZWVyX2hl X3J4X21jc19zZXRbV01JX0hFQ0FQX1RYUlhfTUNTX05TU19JRFhfMTYwXSA9IHY7CisKKwkJdiA9 IGxlMTZfdG9fY3B1KGhlX2NhcC0+aGVfbWNzX25zc19zdXBwLnR4X21jc18xNjApOworCQlhcmct PnBlZXJfaGVfdHhfbWNzX3NldFtXTUlfSEVDQVBfVFhSWF9NQ1NfTlNTX0lEWF8xNjBdID0gdjsK KworCQlhcmctPnBlZXJfaGVfbWNzX2NvdW50Kys7CisJCWZhbGx0aHJvdWdoOworCisJZGVmYXVs dDoKKwkJdiA9IGxlMTZfdG9fY3B1KGhlX2NhcC0+aGVfbWNzX25zc19zdXBwLnJ4X21jc184MCk7 CisJCWFyZy0+cGVlcl9oZV9yeF9tY3Nfc2V0W1dNSV9IRUNBUF9UWFJYX01DU19OU1NfSURYXzgw XSA9IHY7CisKKwkJdiA9IGxlMTZfdG9fY3B1KGhlX2NhcC0+aGVfbWNzX25zc19zdXBwLnR4X21j c184MCk7CisJCWFyZy0+cGVlcl9oZV90eF9tY3Nfc2V0W1dNSV9IRUNBUF9UWFJYX01DU19OU1Nf SURYXzgwXSA9IHY7CisKKwkJYXJnLT5wZWVyX2hlX21jc19jb3VudCsrOworCQlicmVhazsKKwl9 Cit9CisKK3N0YXRpYyB2b2lkIGF0aDEya19wZWVyX2Fzc29jX2hfc21wcyhzdHJ1Y3QgaWVlZTgw MjExX3N0YSAqc3RhLAorCQkJCSAgICAgc3RydWN0IGF0aDEya193bWlfcGVlcl9hc3NvY19hcmcg KmFyZykKK3sKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCA9ICZz dGEtPmRlZmxpbmsuaHRfY2FwOworCWludCBzbXBzOworCisJaWYgKCFodF9jYXAtPmh0X3N1cHBv cnRlZCkKKwkJcmV0dXJuOworCisJc21wcyA9IGh0X2NhcC0+Y2FwICYgSUVFRTgwMjExX0hUX0NB UF9TTV9QUzsKKwlzbXBzID4+PSBJRUVFODAyMTFfSFRfQ0FQX1NNX1BTX1NISUZUOworCisJc3dp dGNoIChzbXBzKSB7CisJY2FzZSBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUM6CisJCWFyZy0+c3Rh dGljX21pbW9wc19mbGFnID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0hUX0NBUF9TTV9Q U19EWU5BTUlDOgorCQlhcmctPmR5bmFtaWNfbWltb3BzX2ZsYWcgPSB0cnVlOworCQlicmVhazsK KwljYXNlIFdMQU5fSFRfQ0FQX1NNX1BTX0RJU0FCTEVEOgorCQlhcmctPnNwYXRpYWxfbXV4X2Zs YWcgPSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRp YyB2b2lkIGF0aDEya19wZWVyX2Fzc29jX2hfcW9zKHN0cnVjdCBhdGgxMmsgKmFyLAorCQkJCSAg ICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0 YSAqc3RhLAorCQkJCSAgICBzdHJ1Y3QgYXRoMTJrX3dtaV9wZWVyX2Fzc29jX2FyZyAqYXJnKQor eworCXN0cnVjdCBhdGgxMmtfdmlmICphcnZpZiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwor CXN3aXRjaCAoYXJ2aWYtPnZkZXZfdHlwZSkgeworCWNhc2UgV01JX1ZERVZfVFlQRV9BUDoKKwkJ aWYgKHN0YS0+d21lKSB7CisJCQkvKiBUT0RPOiBDaGVjayBXTUUgdnMgUW9TICovCisJCQlhcmct PmlzX3dtZV9zZXQgPSB0cnVlOworCQkJYXJnLT5xb3NfZmxhZyA9IHRydWU7CisJCX0KKworCQlp ZiAoc3RhLT53bWUgJiYgc3RhLT51YXBzZF9xdWV1ZXMpIHsKKwkJCS8qIFRPRE86IENoZWNrIFdN RSB2cyBRb1MgKi8KKwkJCWFyZy0+aXNfd21lX3NldCA9IHRydWU7CisJCQlhcmctPmFwc2RfZmxh ZyA9IHRydWU7CisJCQlhcmctPnBlZXJfcmF0ZV9jYXBzIHw9IFdNSV9IT1NUX1JDX1VBUFNEX0ZM QUc7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXTUlfVkRFVl9UWVBFX1NUQToKKwkJaWYgKHN0YS0+ d21lKSB7CisJCQlhcmctPmlzX3dtZV9zZXQgPSB0cnVlOworCQkJYXJnLT5xb3NfZmxhZyA9IHRy dWU7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJYXRoMTJrX2Ri Zyhhci0+YWIsIEFUSDEyS19EQkdfTUFDLCAibWFjIHBlZXIgJXBNIHFvcyAlZFxuIiwKKwkJICAg c3RhLT5hZGRyLCBhcmctPnFvc19mbGFnKTsKK30KKworc3RhdGljIGludCBhdGgxMmtfcGVlcl9h c3NvY19xb3NfYXAoc3RydWN0IGF0aDEyayAqYXIsCisJCQkJICAgIHN0cnVjdCBhdGgxMmtfdmlm ICphcnZpZiwKKwkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlzdHJ1Y3Qg YXRoMTJrX3dtaV9hcF9wc19hcmcgYXJnOworCXUzMiBtYXhfc3A7CisJdTMyIHVhcHNkOworCWlu dCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7CisKKwlhcmcu dmRldl9pZCA9IGFydmlmLT52ZGV2X2lkOworCisJYXRoMTJrX2RiZyhhci0+YWIsIEFUSDEyS19E QkdfTUFDLCAibWFjIHVhcHNkX3F1ZXVlcyAweCV4IG1heF9zcCAlZFxuIiwKKwkJICAgc3RhLT51 YXBzZF9xdWV1ZXMsIHN0YS0+bWF4X3NwKTsKKworCXVhcHNkID0gMDsKKwlpZiAoc3RhLT51YXBz ZF9xdWV1ZXMgJiBJRUVFODAyMTFfV01NX0lFX1NUQV9RT1NJTkZPX0FDX1ZPKQorCQl1YXBzZCB8 PSBXTUlfQVBfUFNfVUFQU0RfQUMzX0RFTElWRVJZX0VOIHwKKwkJCSBXTUlfQVBfUFNfVUFQU0Rf QUMzX1RSSUdHRVJfRU47CisJaWYgKHN0YS0+dWFwc2RfcXVldWVzICYgSUVFRTgwMjExX1dNTV9J RV9TVEFfUU9TSU5GT19BQ19WSSkKKwkJdWFwc2QgfD0gV01JX0FQX1BTX1VBUFNEX0FDMl9ERUxJ VkVSWV9FTiB8CisJCQkgV01JX0FQX1BTX1VBUFNEX0FDMl9UUklHR0VSX0VOOworCWlmIChzdGEt PnVhcHNkX3F1ZXVlcyAmIElFRUU4MDIxMV9XTU1fSUVfU1RBX1FPU0lORk9fQUNfQkspCisJCXVh cHNkIHw9IFdNSV9BUF9QU19VQVBTRF9BQzFfREVMSVZFUllfRU4gfAorCQkJIFdNSV9BUF9QU19V QVBTRF9BQzFfVFJJR0dFUl9FTjsKKwlpZiAoc3RhLT51YXBzZF9xdWV1ZXMgJiBJRUVFODAyMTFf V01NX0lFX1NUQV9RT1NJTkZPX0FDX0JFKQorCQl1YXBzZCB8PSBXTUlfQVBfUFNfVUFQU0RfQUMw X0RFTElWRVJZX0VOIHwKKwkJCSBXTUlfQVBfUFNfVUFQU0RfQUMwX1RSSUdHRVJfRU47CisKKwlt YXhfc3AgPSAwOworCWlmIChzdGEtPm1heF9zcCA8IE1BWF9XTUlfQVBfUFNfUEVFUl9QQVJBTV9N QVhfU1ApCisJCW1heF9zcCA9IHN0YS0+bWF4X3NwOworCisJYXJnLnBhcmFtID0gV01JX0FQX1BT X1BFRVJfUEFSQU1fVUFQU0Q7CisJYXJnLnZhbHVlID0gdWFwc2Q7CisJcmV0ID0gYXRoMTJrX3dt aV9zZW5kX3NldF9hcF9wc19wYXJhbV9jbWQoYXIsIHN0YS0+YWRkciwgJmFyZyk7CisJaWYgKHJl dCkKKwkJZ290byBlcnI7CisKKwlhcmcucGFyYW0gPSBXTUlfQVBfUFNfUEVFUl9QQVJBTV9NQVhf U1A7CisJYXJnLnZhbHVlID0gbWF4X3NwOworCXJldCA9IGF0aDEya193bWlfc2VuZF9zZXRfYXBf cHNfcGFyYW1fY21kKGFyLCBzdGEtPmFkZHIsICZhcmcpOworCWlmIChyZXQpCisJCWdvdG8gZXJy OworCisJLyogVE9ETzogcmV2aXNpdCBkdXJpbmcgdGVzdGluZyAqLworCWFyZy5wYXJhbSA9IFdN SV9BUF9QU19QRUVSX1BBUkFNX1NJRlNfUkVTUF9GUk1UWVBFOworCWFyZy52YWx1ZSA9IERJU0FC TEVfU0lGU19SRVNQT05TRV9UUklHR0VSOworCXJldCA9IGF0aDEya193bWlfc2VuZF9zZXRfYXBf cHNfcGFyYW1fY21kKGFyLCBzdGEtPmFkZHIsICZhcmcpOworCWlmIChyZXQpCisJCWdvdG8gZXJy OworCisJYXJnLnBhcmFtID0gV01JX0FQX1BTX1BFRVJfUEFSQU1fU0lGU19SRVNQX1VBUFNEOwor CWFyZy52YWx1ZSA9IERJU0FCTEVfU0lGU19SRVNQT05TRV9UUklHR0VSOworCXJldCA9IGF0aDEy a193bWlfc2VuZF9zZXRfYXBfcHNfcGFyYW1fY21kKGFyLCBzdGEtPmFkZHIsICZhcmcpOworCWlm IChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlhdGgxMmtfd2Fybihh ci0+YWIsICJmYWlsZWQgdG8gc2V0IGFwIHBzIHBlZXIgcGFyYW0gJWQgZm9yIHZkZXYgJWk6ICVk XG4iLAorCQkgICAgYXJnLnBhcmFtLCBhcnZpZi0+dmRldl9pZCwgcmV0KTsKKwlyZXR1cm4gcmV0 OworfQorCitzdGF0aWMgYm9vbCBhdGgxMmtfbWFjX3N0YV9oYXNfb2ZkbV9vbmx5KHN0cnVjdCBp ZWVlODAyMTFfc3RhICpzdGEpCit7CisJcmV0dXJuIHN0YS0+ZGVmbGluay5zdXBwX3JhdGVzW05M ODAyMTFfQkFORF8yR0haXSA+PgorCSAgICAgICBBVEgxMktfTUFDX0ZJUlNUX09GRE1fUkFURV9J RFg7Cit9CisKK3N0YXRpYyBlbnVtIHdtaV9waHlfbW9kZSBhdGgxMmtfbWFjX2dldF9waHltb2Rl X3ZodChzdHJ1Y3QgYXRoMTJrICphciwKKwkJCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAq c3RhKQoreworCWlmIChzdGEtPmRlZmxpbmsuYmFuZHdpZHRoID09IElFRUU4MDIxMV9TVEFfUlhf QldfMTYwKSB7CisJCXN3aXRjaCAoc3RhLT5kZWZsaW5rLnZodF9jYXAuY2FwICYKKwkJCUlFRUU4 MDIxMV9WSFRfQ0FQX1NVUFBfQ0hBTl9XSURUSF9NQVNLKSB7CisJCWNhc2UgSUVFRTgwMjExX1ZI VF9DQVBfU1VQUF9DSEFOX1dJRFRIXzE2ME1IWjoKKwkJCXJldHVybiBNT0RFXzExQUNfVkhUMTYw OworCQljYXNlIElFRUU4MDIxMV9WSFRfQ0FQX1NVUFBfQ0hBTl9XSURUSF8xNjBfODBQTFVTODBN SFo6CisJCQlyZXR1cm4gTU9ERV8xMUFDX1ZIVDgwXzgwOworCQlkZWZhdWx0OgorCQkJLyogbm90 IHN1cmUgaWYgdGhpcyBpcyBhIHZhbGlkIGNhc2U/ICovCisJCQlyZXR1cm4gTU9ERV8xMUFDX1ZI VDE2MDsKKwkJfQorCX0KKworCWlmIChzdGEtPmRlZmxpbmsuYmFuZHdpZHRoID09IElFRUU4MDIx MV9TVEFfUlhfQldfODApCisJCXJldHVybiBNT0RFXzExQUNfVkhUODA7CisKKwlpZiAoc3RhLT5k ZWZsaW5rLmJhbmR3aWR0aCA9PSBJRUVFODAyMTFfU1RBX1JYX0JXXzQwKQorCQlyZXR1cm4gTU9E RV8xMUFDX1ZIVDQwOworCisJaWYgKHN0YS0+ZGVmbGluay5iYW5kd2lkdGggPT0gSUVFRTgwMjEx X1NUQV9SWF9CV18yMCkKKwkJcmV0dXJuIE1PREVfMTFBQ19WSFQyMDsKKworCXJldHVybiBNT0RF X1VOS05PV047Cit9CisKK3N0YXRpYyBlbnVtIHdtaV9waHlfbW9kZSBhdGgxMmtfbWFjX2dldF9w aHltb2RlX2hlKHN0cnVjdCBhdGgxMmsgKmFyLAorCQkJCQkJICAgc3RydWN0IGllZWU4MDIxMV9z dGEgKnN0YSkKK3sKKwlpZiAoc3RhLT5kZWZsaW5rLmJhbmR3aWR0aCA9PSBJRUVFODAyMTFfU1RB X1JYX0JXXzE2MCkgeworCQlpZiAoc3RhLT5kZWZsaW5rLmhlX2NhcC5oZV9jYXBfZWxlbS5waHlf Y2FwX2luZm9bMF0gJgorCQkgICAgIElFRUU4MDIxMV9IRV9QSFlfQ0FQMF9DSEFOTkVMX1dJRFRI X1NFVF8xNjBNSFpfSU5fNUcpCisJCQlyZXR1cm4gTU9ERV8xMUFYX0hFMTYwOworCQllbHNlIGlm IChzdGEtPmRlZmxpbmsuaGVfY2FwLmhlX2NhcF9lbGVtLnBoeV9jYXBfaW5mb1swXSAmCisJCSAg ICAgSUVFRTgwMjExX0hFX1BIWV9DQVAwX0NIQU5ORUxfV0lEVEhfU0VUXzgwUExVUzgwX01IWl9J Tl81RykKKwkJCXJldHVybiBNT0RFXzExQVhfSEU4MF84MDsKKwkJLyogbm90IHN1cmUgaWYgdGhp cyBpcyBhIHZhbGlkIGNhc2U/ICovCisJCXJldHVybiBNT0RFXzExQVhfSEUxNjA7CisJfQorCisJ aWYgKHN0YS0+ZGVmbGluay5iYW5kd2lkdGggPT0gSUVFRTgwMjExX1NUQV9SWF9CV184MCkKKwkJ cmV0dXJuIE1PREVfMTFBWF9IRTgwOworCisJaWYgKHN0YS0+ZGVmbGluay5iYW5kd2lkdGggPT0g SUVFRTgwMjExX1NUQV9SWF9CV180MCkKKwkJcmV0dXJuIE1PREVfMTFBWF9IRTQwOworCisJaWYg KHN0YS0+ZGVmbGluay5iYW5kd2lkdGggPT0gSUVFRTgwMjExX1NUQV9SWF9CV18yMCkKKwkJcmV0 dXJuIE1PREVfMTFBWF9IRTIwOworCisJcmV0dXJuIE1PREVfVU5LTk9XTjsKK30KKworc3RhdGlj IHZvaWQgYXRoMTJrX3BlZXJfYXNzb2NfaF9waHltb2RlKHN0cnVjdCBhdGgxMmsgKmFyLAorCQkJ CQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAq c3RhLAorCQkJCQlzdHJ1Y3QgYXRoMTJrX3dtaV9wZWVyX2Fzc29jX2FyZyAqYXJnKQoreworCXN0 cnVjdCBhdGgxMmtfdmlmICphcnZpZiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwlzdHJ1Y3Qg Y2ZnODAyMTFfY2hhbl9kZWYgZGVmOworCWVudW0gbmw4MDIxMV9iYW5kIGJhbmQ7CisJY29uc3Qg dTggKmh0X21jc19tYXNrOworCWNvbnN0IHUxNiAqdmh0X21jc19tYXNrOworCWVudW0gd21pX3Bo eV9tb2RlIHBoeW1vZGUgPSBNT0RFX1VOS05PV047CisKKwlpZiAoV0FSTl9PTihhdGgxMmtfbWFj X3ZpZl9jaGFuKHZpZiwgJmRlZikpKQorCQlyZXR1cm47CisKKwliYW5kID0gZGVmLmNoYW4tPmJh bmQ7CisJaHRfbWNzX21hc2sgPSBhcnZpZi0+Yml0cmF0ZV9tYXNrLmNvbnRyb2xbYmFuZF0uaHRf bWNzOworCXZodF9tY3NfbWFzayA9IGFydmlmLT5iaXRyYXRlX21hc2suY29udHJvbFtiYW5kXS52 aHRfbWNzOworCisJc3dpdGNoIChiYW5kKSB7CisJY2FzZSBOTDgwMjExX0JBTkRfMkdIWjoKKwkJ aWYgKHN0YS0+ZGVmbGluay5oZV9jYXAuaGFzX2hlKSB7CisJCQlpZiAoc3RhLT5kZWZsaW5rLmJh bmR3aWR0aCA9PSBJRUVFODAyMTFfU1RBX1JYX0JXXzgwKQorCQkJCXBoeW1vZGUgPSBNT0RFXzEx QVhfSEU4MF8yRzsKKwkJCWVsc2UgaWYgKHN0YS0+ZGVmbGluay5iYW5kd2lkdGggPT0gSUVFRTgw MjExX1NUQV9SWF9CV180MCkKKwkJCQlwaHltb2RlID0gTU9ERV8xMUFYX0hFNDBfMkc7CisJCQll bHNlCisJCQkJcGh5bW9kZSA9IE1PREVfMTFBWF9IRTIwXzJHOworCQl9IGVsc2UgaWYgKHN0YS0+ ZGVmbGluay52aHRfY2FwLnZodF9zdXBwb3J0ZWQgJiYKKwkJICAgICFhdGgxMmtfcGVlcl9hc3Nv Y19oX3ZodF9tYXNrZWQodmh0X21jc19tYXNrKSkgeworCQkJaWYgKHN0YS0+ZGVmbGluay5iYW5k d2lkdGggPT0gSUVFRTgwMjExX1NUQV9SWF9CV180MCkKKwkJCQlwaHltb2RlID0gTU9ERV8xMUFD X1ZIVDQwOworCQkJZWxzZQorCQkJCXBoeW1vZGUgPSBNT0RFXzExQUNfVkhUMjA7CisJCX0gZWxz ZSBpZiAoc3RhLT5kZWZsaW5rLmh0X2NhcC5odF9zdXBwb3J0ZWQgJiYKKwkJCSAgICFhdGgxMmtf cGVlcl9hc3NvY19oX2h0X21hc2tlZChodF9tY3NfbWFzaykpIHsKKwkJCWlmIChzdGEtPmRlZmxp bmsuYmFuZHdpZHRoID09IElFRUU4MDIxMV9TVEFfUlhfQldfNDApCisJCQkJcGh5bW9kZSA9IE1P REVfMTFOR19IVDQwOworCQkJZWxzZQorCQkJCXBoeW1vZGUgPSBNT0RFXzExTkdfSFQyMDsKKwkJ fSBlbHNlIGlmIChhdGgxMmtfbWFjX3N0YV9oYXNfb2ZkbV9vbmx5KHN0YSkpIHsKKwkJCXBoeW1v ZGUgPSBNT0RFXzExRzsKKwkJfSBlbHNlIHsKKwkJCXBoeW1vZGUgPSBNT0RFXzExQjsKKwkJfQor CQlicmVhazsKKwljYXNlIE5MODAyMTFfQkFORF81R0haOgorCWNhc2UgTkw4MDIxMV9CQU5EXzZH SFo6CisJCS8qIENoZWNrIEhFIGZpcnN0ICovCisJCWlmIChzdGEtPmRlZmxpbmsuaGVfY2FwLmhh c19oZSkgeworCQkJcGh5bW9kZSA9IGF0aDEya19tYWNfZ2V0X3BoeW1vZGVfaGUoYXIsIHN0YSk7 CisJCX0gZWxzZSBpZiAoc3RhLT5kZWZsaW5rLnZodF9jYXAudmh0X3N1cHBvcnRlZCAmJgorCQkg ICAgIWF0aDEya19wZWVyX2Fzc29jX2hfdmh0X21hc2tlZCh2aHRfbWNzX21hc2spKSB7CisJCQlw aHltb2RlID0gYXRoMTJrX21hY19nZXRfcGh5bW9kZV92aHQoYXIsIHN0YSk7CisJCX0gZWxzZSBp ZiAoc3RhLT5kZWZsaW5rLmh0X2NhcC5odF9zdXBwb3J0ZWQgJiYKKwkJCSAgICFhdGgxMmtfcGVl cl9hc3NvY19oX2h0X21hc2tlZChodF9tY3NfbWFzaykpIHsKKwkJCWlmIChzdGEtPmRlZmxpbmsu YmFuZHdpZHRoID49IElFRUU4MDIxMV9TVEFfUlhfQldfNDApCisJCQkJcGh5bW9kZSA9IE1PREVf MTFOQV9IVDQwOworCQkJZWxzZQorCQkJCXBoeW1vZGUgPSBNT0RFXzExTkFfSFQyMDsKKwkJfSBl bHNlIHsKKwkJCXBoeW1vZGUgPSBNT0RFXzExQTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0Ogor CQlicmVhazsKKwl9CisKKwlhdGgxMmtfZGJnKGFyLT5hYiwgQVRIMTJLX0RCR19NQUMsICJtYWMg cGVlciAlcE0gcGh5bW9kZSAlc1xuIiwKKwkJICAgc3RhLT5hZGRyLCBhdGgxMmtfbWFjX3BoeW1v ZGVfc3RyKHBoeW1vZGUpKTsKKworCWFyZy0+cGVlcl9waHltb2RlID0gcGh5bW9kZTsKKwlXQVJO X09OKHBoeW1vZGUgPT0gTU9ERV9VTktOT1dOKTsKK30KKworc3RhdGljIHZvaWQgYXRoMTJrX3Bl ZXJfYXNzb2NfcHJlcGFyZShzdHJ1Y3QgYXRoMTJrICphciwKKwkJCQkgICAgICBzdHJ1Y3QgaWVl ZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJ CQkJICAgICAgc3RydWN0IGF0aDEya193bWlfcGVlcl9hc3NvY19hcmcgKmFyZywKKwkJCQkgICAg ICBib29sIHJlYXNzb2MpCit7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYXItPmNvbmZfbXV0ZXgp OworCisJbWVtc2V0KGFyZywgMCwgc2l6ZW9mKCphcmcpKTsKKworCXJlaW5pdF9jb21wbGV0aW9u KCZhci0+cGVlcl9hc3NvY19kb25lKTsKKworCWFyZy0+cGVlcl9uZXdfYXNzb2MgPSAhcmVhc3Nv YzsKKwlhdGgxMmtfcGVlcl9hc3NvY19oX2Jhc2ljKGFyLCB2aWYsIHN0YSwgYXJnKTsKKwlhdGgx MmtfcGVlcl9hc3NvY19oX2NyeXB0byhhciwgdmlmLCBzdGEsIGFyZyk7CisJYXRoMTJrX3BlZXJf YXNzb2NfaF9yYXRlcyhhciwgdmlmLCBzdGEsIGFyZyk7CisJYXRoMTJrX3BlZXJfYXNzb2NfaF9o dChhciwgdmlmLCBzdGEsIGFyZyk7CisJYXRoMTJrX3BlZXJfYXNzb2NfaF92aHQoYXIsIHZpZiwg c3RhLCBhcmcpOworCWF0aDEya19wZWVyX2Fzc29jX2hfaGUoYXIsIHZpZiwgc3RhLCBhcmcpOwor CWF0aDEya19wZWVyX2Fzc29jX2hfcW9zKGFyLCB2aWYsIHN0YSwgYXJnKTsKKwlhdGgxMmtfcGVl cl9hc3NvY19oX3BoeW1vZGUoYXIsIHZpZiwgc3RhLCBhcmcpOworCWF0aDEya19wZWVyX2Fzc29j X2hfc21wcyhzdGEsIGFyZyk7CisKKwkvKiBUT0RPOiBhbXNkdV9kaXNhYmxlIHJlcT8gKi8KK30K Kworc3RhdGljIGludCBhdGgxMmtfc2V0dXBfcGVlcl9zbXBzKHN0cnVjdCBhdGgxMmsgKmFyLCBz dHJ1Y3QgYXRoMTJrX3ZpZiAqYXJ2aWYsCisJCQkJICBjb25zdCB1OCAqYWRkciwKKwkJCQkgIGNv bnN0IHN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwKQoreworCWludCBzbXBzOwor CisJaWYgKCFodF9jYXAtPmh0X3N1cHBvcnRlZCkKKwkJcmV0dXJuIDA7CisKKwlzbXBzID0gaHRf Y2FwLT5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NNX1BTOworCXNtcHMgPj49IElFRUU4MDIxMV9I VF9DQVBfU01fUFNfU0hJRlQ7CisKKwlpZiAoc21wcyA+PSBBUlJBWV9TSVpFKGF0aDEya19zbXBz X21hcCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGF0aDEya193bWlfc2V0X3BlZXJf cGFyYW0oYXIsIGFkZHIsIGFydmlmLT52ZGV2X2lkLAorCQkJCQkgV01JX1BFRVJfTUlNT19QU19T VEFURSwKKwkJCQkJIGF0aDEya19zbXBzX21hcFtzbXBzXSk7Cit9CisKK3N0YXRpYyB2b2lkIGF0 aDEya19ic3NfYXNzb2Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgIHN0cnVjdCBp ZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJz c19jb25mKQoreworCXN0cnVjdCBhdGgxMmsgKmFyID0gaHctPnByaXY7CisJc3RydWN0IGF0aDEy a192aWYgKmFydmlmID0gKHZvaWQgKil2aWYtPmRydl9wcml2OworCXN0cnVjdCBhdGgxMmtfd21p X3BlZXJfYXNzb2NfYXJnIHBlZXJfYXJnOworCXN0cnVjdCBpZWVlODAyMTFfc3RhICphcF9zdGE7 CisJc3RydWN0IGF0aDEya19wZWVyICpwZWVyOworCWJvb2wgaXNfYXV0aCA9IGZhbHNlOworCWlu dCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7CisKKwlhdGgx MmtfZGJnKGFyLT5hYiwgQVRIMTJLX0RCR19NQUMsICJtYWMgdmRldiAlaSBhc3NvYyBic3NpZCAl cE0gYWlkICVkXG4iLAorCQkgICBhcnZpZi0+dmRldl9pZCwgYXJ2aWYtPmJzc2lkLCBhcnZpZi0+ YWlkKTsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCWFwX3N0YSA9IGllZWU4MDIxMV9maW5kX3N0 YSh2aWYsIGJzc19jb25mLT5ic3NpZCk7CisJaWYgKCFhcF9zdGEpIHsKKwkJYXRoMTJrX3dhcm4o YXItPmFiLCAiZmFpbGVkIHRvIGZpbmQgc3RhdGlvbiBlbnRyeSBmb3IgYnNzICVwTSB2ZGV2ICVp XG4iLAorCQkJICAgIGJzc19jb25mLT5ic3NpZCwgYXJ2aWYtPnZkZXZfaWQpOworCQlyY3VfcmVh ZF91bmxvY2soKTsKKwkJcmV0dXJuOworCX0KKworCWF0aDEya19wZWVyX2Fzc29jX3ByZXBhcmUo YXIsIHZpZiwgYXBfc3RhLCAmcGVlcl9hcmcsIGZhbHNlKTsKKworCXJjdV9yZWFkX3VubG9jaygp OworCisJcmV0ID0gYXRoMTJrX3dtaV9zZW5kX3BlZXJfYXNzb2NfY21kKGFyLCAmcGVlcl9hcmcp OworCWlmIChyZXQpIHsKKwkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIHJ1biBwZWVy IGFzc29jIGZvciAlcE0gdmRldiAlaTogJWRcbiIsCisJCQkgICAgYnNzX2NvbmYtPmJzc2lkLCBh cnZpZi0+dmRldl9pZCwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCWlmICghd2FpdF9mb3JfY29t cGxldGlvbl90aW1lb3V0KCZhci0+cGVlcl9hc3NvY19kb25lLCAxICogSFopKSB7CisJCWF0aDEy a193YXJuKGFyLT5hYiwgImZhaWxlZCB0byBnZXQgcGVlciBhc3NvYyBjb25mIGV2ZW50IGZvciAl cE0gdmRldiAlaVxuIiwKKwkJCSAgICBic3NfY29uZi0+YnNzaWQsIGFydmlmLT52ZGV2X2lkKTsK KwkJcmV0dXJuOworCX0KKworCXJldCA9IGF0aDEya19zZXR1cF9wZWVyX3NtcHMoYXIsIGFydmlm LCBic3NfY29uZi0+YnNzaWQsCisJCQkJICAgICAmYXBfc3RhLT5kZWZsaW5rLmh0X2NhcCk7CisJ aWYgKHJldCkgeworCQlhdGgxMmtfd2Fybihhci0+YWIsICJmYWlsZWQgdG8gc2V0dXAgcGVlciBT TVBTIGZvciB2ZGV2ICVkOiAlZFxuIiwKKwkJCSAgICBhcnZpZi0+dmRldl9pZCwgcmV0KTsKKwkJ cmV0dXJuOworCX0KKworCVdBUk5fT04oYXJ2aWYtPmlzX3VwKTsKKworCWFydmlmLT5haWQgPSB2 aWYtPmNmZy5haWQ7CisJZXRoZXJfYWRkcl9jb3B5KGFydmlmLT5ic3NpZCwgYnNzX2NvbmYtPmJz c2lkKTsKKworCXJldCA9IGF0aDEya193bWlfdmRldl91cChhciwgYXJ2aWYtPnZkZXZfaWQsIGFy dmlmLT5haWQsIGFydmlmLT5ic3NpZCk7CisJaWYgKHJldCkgeworCQlhdGgxMmtfd2Fybihhci0+ YWIsICJmYWlsZWQgdG8gc2V0IHZkZXYgJWQgdXA6ICVkXG4iLAorCQkJICAgIGFydmlmLT52ZGV2 X2lkLCByZXQpOworCQlyZXR1cm47CisJfQorCisJYXJ2aWYtPmlzX3VwID0gdHJ1ZTsKKworCWF0 aDEya19kYmcoYXItPmFiLCBBVEgxMktfREJHX01BQywKKwkJICAgIm1hYyB2ZGV2ICVkIHVwIChh c3NvY2lhdGVkKSBic3NpZCAlcE0gYWlkICVkXG4iLAorCQkgICBhcnZpZi0+dmRldl9pZCwgYnNz X2NvbmYtPmJzc2lkLCB2aWYtPmNmZy5haWQpOworCisJc3Bpbl9sb2NrX2JoKCZhci0+YWItPmJh c2VfbG9jayk7CisKKwlwZWVyID0gYXRoMTJrX3BlZXJfZmluZChhci0+YWIsIGFydmlmLT52ZGV2 X2lkLCBhcnZpZi0+YnNzaWQpOworCWlmIChwZWVyICYmIHBlZXItPmlzX2F1dGhvcml6ZWQpCisJ CWlzX2F1dGggPSB0cnVlOworCisJc3Bpbl91bmxvY2tfYmgoJmFyLT5hYi0+YmFzZV9sb2NrKTsK KworCS8qIEF1dGhvcml6ZSBCU1MgUGVlciAqLworCWlmIChpc19hdXRoKSB7CisJCXJldCA9IGF0 aDEya193bWlfc2V0X3BlZXJfcGFyYW0oYXIsIGFydmlmLT5ic3NpZCwKKwkJCQkJCWFydmlmLT52 ZGV2X2lkLAorCQkJCQkJV01JX1BFRVJfQVVUSE9SSVpFLAorCQkJCQkJMSk7CisJCWlmIChyZXQp CisJCQlhdGgxMmtfd2Fybihhci0+YWIsICJVbmFibGUgdG8gYXV0aG9yaXplIEJTUyBwZWVyOiAl ZFxuIiwgcmV0KTsKKwl9CisKKwlyZXQgPSBhdGgxMmtfd21pX3NlbmRfb2Jzc19zcHJfY21kKGFy LCBhcnZpZi0+dmRldl9pZCwKKwkJCQkJICAgJmJzc19jb25mLT5oZV9vYnNzX3BkKTsKKwlpZiAo cmV0KQorCQlhdGgxMmtfd2Fybihhci0+YWIsICJmYWlsZWQgdG8gc2V0IHZkZXYgJWkgT0JTUyBQ RCBwYXJhbWV0ZXJzOiAlZFxuIiwKKwkJCSAgICBhcnZpZi0+dmRldl9pZCwgcmV0KTsKK30KKwor c3RhdGljIHZvaWQgYXRoMTJrX2Jzc19kaXNhc3NvYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywK KwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBhdGgxMmsgKmFyID0g aHctPnByaXY7CisJc3RydWN0IGF0aDEya192aWYgKmFydmlmID0gKHZvaWQgKil2aWYtPmRydl9w cml2OworCWludCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7 CisKKwlhdGgxMmtfZGJnKGFyLT5hYiwgQVRIMTJLX0RCR19NQUMsICJtYWMgdmRldiAlaSBkaXNh c3NvYyBic3NpZCAlcE1cbiIsCisJCSAgIGFydmlmLT52ZGV2X2lkLCBhcnZpZi0+YnNzaWQpOwor CisJcmV0ID0gYXRoMTJrX3dtaV92ZGV2X2Rvd24oYXIsIGFydmlmLT52ZGV2X2lkKTsKKwlpZiAo cmV0KQorCQlhdGgxMmtfd2Fybihhci0+YWIsICJmYWlsZWQgdG8gZG93biB2ZGV2ICVpOiAlZFxu IiwKKwkJCSAgICBhcnZpZi0+dmRldl9pZCwgcmV0KTsKKworCWFydmlmLT5pc191cCA9IGZhbHNl OworCisJLyogVE9ETzogY2FuY2VsIGNvbm5lY3Rpb25fbG9zc193b3JrICovCit9CisKK3N0YXRp YyB1MzIgYXRoMTJrX21hY19nZXRfcmF0ZV9od192YWx1ZShpbnQgYml0cmF0ZSkKK3sKKwl1MzIg cHJlYW1ibGU7CisJdTE2IGh3X3ZhbHVlOworCWludCByYXRlOworCXNpemVfdCBpOworCisJaWYg KGF0aDEya19tYWNfYml0cmF0ZV9pc19jY2soYml0cmF0ZSkpCisJCXByZWFtYmxlID0gV01JX1JB VEVfUFJFQU1CTEVfQ0NLOworCWVsc2UKKwkJcHJlYW1ibGUgPSBXTUlfUkFURV9QUkVBTUJMRV9P RkRNOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXRoMTJrX2xlZ2FjeV9yYXRlcyk7 IGkrKykgeworCQlpZiAoYXRoMTJrX2xlZ2FjeV9yYXRlc1tpXS5iaXRyYXRlICE9IGJpdHJhdGUp CisJCQljb250aW51ZTsKKworCQlod192YWx1ZSA9IGF0aDEya19sZWdhY3lfcmF0ZXNbaV0uaHdf dmFsdWU7CisJCXJhdGUgPSBBVEgxMktfSFdfUkFURV9DT0RFKGh3X3ZhbHVlLCAwLCBwcmVhbWJs ZSk7CisKKwkJcmV0dXJuIHJhdGU7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRp YyB2b2lkIGF0aDEya19yZWNhbGN1bGF0ZV9tZ210X3JhdGUoc3RydWN0IGF0aDEyayAqYXIsCisJ CQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCQkgc3RydWN0IGNmZzgwMjExX2No YW5fZGVmICpkZWYpCit7CisJc3RydWN0IGF0aDEya192aWYgKmFydmlmID0gKHZvaWQgKil2aWYt PmRydl9wcml2OworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5k OworCXU4IGJhc2ljX3JhdGVfaWR4OworCWludCBod19yYXRlX2NvZGU7CisJdTMyIHZkZXZfcGFy YW07CisJdTE2IGJpdHJhdGU7CisJaW50IHJldDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFy LT5jb25mX211dGV4KTsKKworCXNiYW5kID0gYXItPmh3LT53aXBoeS0+YmFuZHNbZGVmLT5jaGFu LT5iYW5kXTsKKwliYXNpY19yYXRlX2lkeCA9IGZmcyh2aWYtPmJzc19jb25mLmJhc2ljX3JhdGVz KSAtIDE7CisJYml0cmF0ZSA9IHNiYW5kLT5iaXRyYXRlc1tiYXNpY19yYXRlX2lkeF0uYml0cmF0 ZTsKKworCWh3X3JhdGVfY29kZSA9IGF0aDEya19tYWNfZ2V0X3JhdGVfaHdfdmFsdWUoYml0cmF0 ZSk7CisJaWYgKGh3X3JhdGVfY29kZSA8IDApIHsKKwkJYXRoMTJrX3dhcm4oYXItPmFiLCAiYml0 cmF0ZSBub3Qgc3VwcG9ydGVkICVkXG4iLCBiaXRyYXRlKTsKKwkJcmV0dXJuOworCX0KKworCXZk ZXZfcGFyYW0gPSBXTUlfVkRFVl9QQVJBTV9NR01UX1JBVEU7CisJcmV0ID0gYXRoMTJrX3dtaV92 ZGV2X3NldF9wYXJhbV9jbWQoYXIsIGFydmlmLT52ZGV2X2lkLCB2ZGV2X3BhcmFtLAorCQkJCQkg ICAgaHdfcmF0ZV9jb2RlKTsKKwlpZiAocmV0KQorCQlhdGgxMmtfd2Fybihhci0+YWIsICJmYWls ZWQgdG8gc2V0IG1nbXQgdHggcmF0ZSAlZFxuIiwgcmV0KTsKKworCXZkZXZfcGFyYW0gPSBXTUlf VkRFVl9QQVJBTV9CRUFDT05fUkFURTsKKwlyZXQgPSBhdGgxMmtfd21pX3ZkZXZfc2V0X3BhcmFt X2NtZChhciwgYXJ2aWYtPnZkZXZfaWQsIHZkZXZfcGFyYW0sCisJCQkJCSAgICBod19yYXRlX2Nv ZGUpOworCWlmIChyZXQpCisJCWF0aDEya193YXJuKGFyLT5hYiwgImZhaWxlZCB0byBzZXQgYmVh Y29uIHR4IHJhdGUgJWRcbiIsIHJldCk7Cit9CisKK3N0YXRpYyBpbnQgYXRoMTJrX21hY19maWxz X2Rpc2NvdmVyeShzdHJ1Y3QgYXRoMTJrX3ZpZiAqYXJ2aWYsCisJCQkJICAgICBzdHJ1Y3QgaWVl ZTgwMjExX2Jzc19jb25mICppbmZvKQoreworCXN0cnVjdCBhdGgxMmsgKmFyID0gYXJ2aWYtPmFy OworCXN0cnVjdCBza19idWZmICp0bXBsOworCWludCByZXQ7CisJdTMyIGludGVydmFsOworCWJv b2wgdW5zb2xfYmNhc3RfcHJvYmVfcmVzcF9lbmFibGVkID0gZmFsc2U7CisKKwlpZiAoaW5mby0+ Zmlsc19kaXNjb3ZlcnkubWF4X2ludGVydmFsKSB7CisJCWludGVydmFsID0gaW5mby0+Zmlsc19k aXNjb3ZlcnkubWF4X2ludGVydmFsOworCisJCXRtcGwgPSBpZWVlODAyMTFfZ2V0X2ZpbHNfZGlz Y292ZXJ5X3RtcGwoYXItPmh3LCBhcnZpZi0+dmlmKTsKKwkJaWYgKHRtcGwpCisJCQlyZXQgPSBh dGgxMmtfd21pX2ZpbHNfZGlzY292ZXJ5X3RtcGwoYXIsIGFydmlmLT52ZGV2X2lkLAorCQkJCQkJ CSAgICAgdG1wbCk7CisJfSBlbHNlIGlmIChpbmZvLT51bnNvbF9iY2FzdF9wcm9iZV9yZXNwX2lu dGVydmFsKSB7CisJCXVuc29sX2JjYXN0X3Byb2JlX3Jlc3BfZW5hYmxlZCA9IDE7CisJCWludGVy dmFsID0gaW5mby0+dW5zb2xfYmNhc3RfcHJvYmVfcmVzcF9pbnRlcnZhbDsKKworCQl0bXBsID0g aWVlZTgwMjExX2dldF91bnNvbF9iY2FzdF9wcm9iZV9yZXNwX3RtcGwoYXItPmh3LAorCQkJCQkJ CQkgYXJ2aWYtPnZpZik7CisJCWlmICh0bXBsKQorCQkJcmV0ID0gYXRoMTJrX3dtaV9wcm9iZV9y ZXNwX3RtcGwoYXIsIGFydmlmLT52ZGV2X2lkLAorCQkJCQkJCSB0bXBsKTsKKwl9IGVsc2UgeyAv KiBEaXNhYmxlICovCisJCXJldHVybiBhdGgxMmtfd21pX2ZpbHNfZGlzY292ZXJ5KGFyLCBhcnZp Zi0+dmRldl9pZCwgMCwgZmFsc2UpOworCX0KKworCWlmICghdG1wbCkgeworCQlhdGgxMmtfd2Fy bihhci0+YWIsCisJCQkgICAgIm1hYyB2ZGV2ICVpIGZhaWxlZCB0byByZXRyaWV2ZSAlcyB0ZW1w bGF0ZVxuIiwKKwkJCSAgICBhcnZpZi0+dmRldl9pZCwgKHVuc29sX2JjYXN0X3Byb2JlX3Jlc3Bf ZW5hYmxlZCA/CisJCQkgICAgInVuc29saWNpdGVkIGJyb2FkY2FzdCBwcm9iZSByZXNwb25zZSIg OgorCQkJICAgICJGSUxTIGRpc2NvdmVyeSIpKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJa2Zy ZWVfc2tiKHRtcGwpOworCisJaWYgKCFyZXQpCisJCXJldCA9IGF0aDEya193bWlfZmlsc19kaXNj b3ZlcnkoYXIsIGFydmlmLT52ZGV2X2lkLCBpbnRlcnZhbCwKKwkJCQkJCXVuc29sX2JjYXN0X3By b2JlX3Jlc3BfZW5hYmxlZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhdGgx MmtfbWFjX29wX2Jzc19pbmZvX2NoYW5nZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJ CSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFf YnNzX2NvbmYgKmluZm8sCisJCQkJCSAgIHU2NCBjaGFuZ2VkKQoreworCXN0cnVjdCBhdGgxMmsg KmFyID0gaHctPnByaXY7CisJc3RydWN0IGF0aDEya192aWYgKmFydmlmID0gYXRoMTJrX3ZpZl90 b19hcnZpZih2aWYpOworCXN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiBkZWY7CisJdTMyIHBhcmFt X2lkLCBwYXJhbV92YWx1ZTsKKwllbnVtIG5sODAyMTFfYmFuZCBiYW5kOworCXUzMiB2ZGV2X3Bh cmFtOworCWludCBtY2FzdF9yYXRlOworCXUzMiBwcmVhbWJsZTsKKwl1MTYgaHdfdmFsdWU7CisJ dTE2IGJpdHJhdGU7CisJaW50IHJldDsKKwl1OCByYXRlaWR4OworCXUzMiByYXRlOworCisJbXV0 ZXhfbG9jaygmYXItPmNvbmZfbXV0ZXgpOworCisJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9C RUFDT05fSU5UKSB7CisJCWFydmlmLT5iZWFjb25faW50ZXJ2YWwgPSBpbmZvLT5iZWFjb25faW50 OworCisJCXBhcmFtX2lkID0gV01JX1ZERVZfUEFSQU1fQkVBQ09OX0lOVEVSVkFMOworCQlyZXQg PSBhdGgxMmtfd21pX3ZkZXZfc2V0X3BhcmFtX2NtZChhciwgYXJ2aWYtPnZkZXZfaWQsCisJCQkJ CQkgICAgcGFyYW1faWQsCisJCQkJCQkgICAgYXJ2aWYtPmJlYWNvbl9pbnRlcnZhbCk7CisJCWlm IChyZXQpCisJCQlhdGgxMmtfd2Fybihhci0+YWIsICJGYWlsZWQgdG8gc2V0IGJlYWNvbiBpbnRl cnZhbCBmb3IgVkRFVjogJWRcbiIsCisJCQkJICAgIGFydmlmLT52ZGV2X2lkKTsKKwkJZWxzZQor CQkJYXRoMTJrX2RiZyhhci0+YWIsIEFUSDEyS19EQkdfTUFDLAorCQkJCSAgICJCZWFjb24gaW50 ZXJ2YWw6ICVkIHNldCBmb3IgVkRFVjogJWRcbiIsCisJCQkJICAgYXJ2aWYtPmJlYWNvbl9pbnRl cnZhbCwgYXJ2aWYtPnZkZXZfaWQpOworCX0KKworCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURf QkVBQ09OKSB7CisJCXBhcmFtX2lkID0gV01JX1BERVZfUEFSQU1fQkVBQ09OX1RYX01PREU7CisJ CXBhcmFtX3ZhbHVlID0gV01JX0JFQUNPTl9TVEFHR0VSRURfTU9ERTsKKwkJcmV0ID0gYXRoMTJr X3dtaV9wZGV2X3NldF9wYXJhbShhciwgcGFyYW1faWQsCisJCQkJCQlwYXJhbV92YWx1ZSwgYXIt PnBkZXYtPnBkZXZfaWQpOworCQlpZiAocmV0KQorCQkJYXRoMTJrX3dhcm4oYXItPmFiLCAiRmFp bGVkIHRvIHNldCBiZWFjb24gbW9kZSBmb3IgVkRFVjogJWRcbiIsCisJCQkJICAgIGFydmlmLT52 ZGV2X2lkKTsKKwkJZWxzZQorCQkJYXRoMTJrX2RiZyhhci0+YWIsIEFUSDEyS19EQkdfTUFDLAor CQkJCSAgICJTZXQgc3RhZ2dlcmVkIGJlYWNvbiBtb2RlIGZvciBWREVWOiAlZFxuIiwKKwkJCQkg ICBhcnZpZi0+dmRldl9pZCk7CisKKwkJcmV0ID0gYXRoMTJrX21hY19zZXR1cF9iY25fdG1wbChh cnZpZik7CisJCWlmIChyZXQpCisJCQlhdGgxMmtfd2Fybihhci0+YWIsICJmYWlsZWQgdG8gdXBk YXRlIGJjbiB0ZW1wbGF0ZTogJWRcbiIsCisJCQkJICAgIHJldCk7CisJfQorCisJaWYgKGNoYW5n ZWQgJiAoQlNTX0NIQU5HRURfQkVBQ09OX0lORk8gfCBCU1NfQ0hBTkdFRF9CRUFDT04pKSB7CisJ CWFydmlmLT5kdGltX3BlcmlvZCA9IGluZm8tPmR0aW1fcGVyaW9kOworCisJCXBhcmFtX2lkID0g V01JX1ZERVZfUEFSQU1fRFRJTV9QRVJJT0Q7CisJCXJldCA9IGF0aDEya193bWlfdmRldl9zZXRf cGFyYW1fY21kKGFyLCBhcnZpZi0+dmRldl9pZCwKKwkJCQkJCSAgICBwYXJhbV9pZCwKKwkJCQkJ CSAgICBhcnZpZi0+ZHRpbV9wZXJpb2QpOworCisJCWlmIChyZXQpCisJCQlhdGgxMmtfd2Fybihh ci0+YWIsICJGYWlsZWQgdG8gc2V0IGR0aW0gcGVyaW9kIGZvciBWREVWICVkOiAlaVxuIiwKKwkJ CQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CisJCWVsc2UKKwkJCWF0aDEya19kYmcoYXItPmFi LCBBVEgxMktfREJHX01BQywKKwkJCQkgICAiRFRJTSBwZXJpb2Q6ICVkIHNldCBmb3IgVkRFVjog JWRcbiIsCisJCQkJICAgYXJ2aWYtPmR0aW1fcGVyaW9kLCBhcnZpZi0+dmRldl9pZCk7CisJfQor CisJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9TU0lEICYmCisJICAgIHZpZi0+dHlwZSA9PSBO TDgwMjExX0lGVFlQRV9BUCkgeworCQlhcnZpZi0+dS5hcC5zc2lkX2xlbiA9IHZpZi0+Y2ZnLnNz aWRfbGVuOworCQlpZiAodmlmLT5jZmcuc3NpZF9sZW4pCisJCQltZW1jcHkoYXJ2aWYtPnUuYXAu c3NpZCwgdmlmLT5jZmcuc3NpZCwgdmlmLT5jZmcuc3NpZF9sZW4pOworCQlhcnZpZi0+dS5hcC5o aWRkZW5fc3NpZCA9IGluZm8tPmhpZGRlbl9zc2lkOworCX0KKworCWlmIChjaGFuZ2VkICYgQlNT X0NIQU5HRURfQlNTSUQgJiYgIWlzX3plcm9fZXRoZXJfYWRkcihpbmZvLT5ic3NpZCkpCisJCWV0 aGVyX2FkZHJfY29weShhcnZpZi0+YnNzaWQsIGluZm8tPmJzc2lkKTsKKworCWlmIChjaGFuZ2Vk ICYgQlNTX0NIQU5HRURfQkVBQ09OX0VOQUJMRUQpIHsKKwkJYXRoMTJrX2NvbnRyb2xfYmVhY29u aW5nKGFydmlmLCBpbmZvKTsKKworCQlpZiAoYXJ2aWYtPmlzX3VwICYmIHZpZi0+YnNzX2NvbmYu aGVfc3VwcG9ydCAmJgorCQkgICAgdmlmLT5ic3NfY29uZi5oZV9vcGVyLnBhcmFtcykgeworCQkJ LyogVE9ETzogRXh0ZW5kIHRvIHN1cHBvcnQgMTAyNCBCQSBCaXRtYXAgc2l6ZSAqLworCQkJcmV0 ID0gYXRoMTJrX3dtaV92ZGV2X3NldF9wYXJhbV9jbWQoYXIsIGFydmlmLT52ZGV2X2lkLAorCQkJ CQkJCSAgICBXTUlfVkRFVl9QQVJBTV9CQV9NT0RFLAorCQkJCQkJCSAgICBXTUlfQkFfTU9ERV9C VUZGRVJfU0laRV8yNTYpOworCQkJaWYgKHJldCkKKwkJCQlhdGgxMmtfd2Fybihhci0+YWIsCisJ CQkJCSAgICAiZmFpbGVkIHRvIHNldCBCQSBCVUZGRVIgU0laRSAyNTYgZm9yIHZkZXY6ICVkXG4i LAorCQkJCQkgICAgYXJ2aWYtPnZkZXZfaWQpOworCisJCQlwYXJhbV9pZCA9IFdNSV9WREVWX1BB UkFNX0hFT1BTXzBfMzE7CisJCQlwYXJhbV92YWx1ZSA9IHZpZi0+YnNzX2NvbmYuaGVfb3Blci5w YXJhbXM7CisJCQlyZXQgPSBhdGgxMmtfd21pX3ZkZXZfc2V0X3BhcmFtX2NtZChhciwgYXJ2aWYt PnZkZXZfaWQsCisJCQkJCQkJICAgIHBhcmFtX2lkLCBwYXJhbV92YWx1ZSk7CisJCQlhdGgxMmtf ZGJnKGFyLT5hYiwgQVRIMTJLX0RCR19NQUMsCisJCQkJICAgImhlIG9wZXIgcGFyYW06ICV4IHNl dCBmb3IgVkRFVjogJWRcbiIsCisJCQkJICAgcGFyYW1fdmFsdWUsIGFydmlmLT52ZGV2X2lkKTsK KworCQkJaWYgKHJldCkKKwkJCQlhdGgxMmtfd2Fybihhci0+YWIsICJGYWlsZWQgdG8gc2V0IGhl IG9wZXIgcGFyYW1zICV4IGZvciBWREVWICVkOiAlaVxuIiwKKwkJCQkJICAgIHBhcmFtX3ZhbHVl LCBhcnZpZi0+dmRldl9pZCwgcmV0KTsKKwkJfQorCX0KKworCWlmIChjaGFuZ2VkICYgQlNTX0NI QU5HRURfRVJQX0NUU19QUk9UKSB7CisJCXUzMiBjdHNfcHJvdDsKKworCQljdHNfcHJvdCA9ICEh KGluZm8tPnVzZV9jdHNfcHJvdCk7CisJCXBhcmFtX2lkID0gV01JX1ZERVZfUEFSQU1fUFJPVEVD VElPTl9NT0RFOworCisJCWlmIChhcnZpZi0+aXNfc3RhcnRlZCkgeworCQkJcmV0ID0gYXRoMTJr X3dtaV92ZGV2X3NldF9wYXJhbV9jbWQoYXIsIGFydmlmLT52ZGV2X2lkLAorCQkJCQkJCSAgICBw YXJhbV9pZCwgY3RzX3Byb3QpOworCQkJaWYgKHJldCkKKwkJCQlhdGgxMmtfd2Fybihhci0+YWIs ICJGYWlsZWQgdG8gc2V0IENUUyBwcm90IGZvciBWREVWOiAlZFxuIiwKKwkJCQkJICAgIGFydmlm LT52ZGV2X2lkKTsKKwkJCWVsc2UKKwkJCQlhdGgxMmtfZGJnKGFyLT5hYiwgQVRIMTJLX0RCR19N QUMsICJTZXQgQ1RTIHByb3Q6ICVkIGZvciBWREVWOiAlZFxuIiwKKwkJCQkJICAgY3RzX3Byb3Qs IGFydmlmLT52ZGV2X2lkKTsKKwkJfSBlbHNlIHsKKwkJCWF0aDEya19kYmcoYXItPmFiLCBBVEgx MktfREJHX01BQywgImRlZmVyIHByb3RlY3Rpb24gbW9kZSBzZXR1cCwgdmRldiBpcyBub3QgcmVh ZHkgeWV0XG4iKTsKKwkJfQorCX0KKworCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfRVJQX1NM T1QpIHsKKwkJdTMyIHNsb3R0aW1lOworCisJCWlmIChpbmZvLT51c2Vfc2hvcnRfc2xvdCkKKwkJ CXNsb3R0aW1lID0gV01JX1ZERVZfU0xPVF9USU1FX1NIT1JUOyAvKiA5dXMgKi8KKworCQllbHNl CisJCQlzbG90dGltZSA9IFdNSV9WREVWX1NMT1RfVElNRV9MT05HOyAvKiAyMHVzICovCisKKwkJ cGFyYW1faWQgPSBXTUlfVkRFVl9QQVJBTV9TTE9UX1RJTUU7CisJCXJldCA9IGF0aDEya193bWlf dmRldl9zZXRfcGFyYW1fY21kKGFyLCBhcnZpZi0+dmRldl9pZCwKKwkJCQkJCSAgICBwYXJhbV9p ZCwgc2xvdHRpbWUpOworCQlpZiAocmV0KQorCQkJYXRoMTJrX3dhcm4oYXItPmFiLCAiRmFpbGVk IHRvIHNldCBlcnAgc2xvdCBmb3IgVkRFVjogJWRcbiIsCisJCQkJICAgIGFydmlmLT52ZGV2X2lk KTsKKwkJZWxzZQorCQkJYXRoMTJrX2RiZyhhci0+YWIsIEFUSDEyS19EQkdfTUFDLAorCQkJCSAg ICJTZXQgc2xvdHRpbWU6ICVkIGZvciBWREVWOiAlZFxuIiwKKwkJCQkgICBzbG90dGltZSwgYXJ2 aWYtPnZkZXZfaWQpOworCX0KKworCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfRVJQX1BSRUFN QkxFKSB7CisJCXUzMiBwcmVhbWJsZTsKKworCQlpZiAoaW5mby0+dXNlX3Nob3J0X3ByZWFtYmxl KQorCQkJcHJlYW1ibGUgPSBXTUlfVkRFVl9QUkVBTUJMRV9TSE9SVDsKKwkJZWxzZQorCQkJcHJl YW1ibGUgPSBXTUlfVkRFVl9QUkVBTUJMRV9MT05HOworCisJCXBhcmFtX2lkID0gV01JX1ZERVZf UEFSQU1fUFJFQU1CTEU7CisJCXJldCA9IGF0aDEya193bWlfdmRldl9zZXRfcGFyYW1fY21kKGFy LCBhcnZpZi0+dmRldl9pZCwKKwkJCQkJCSAgICBwYXJhbV9pZCwgcHJlYW1ibGUpOworCQlpZiAo cmV0KQorCQkJYXRoMTJrX3dhcm4oYXItPmFiLCAiRmFpbGVkIHRvIHNldCBwcmVhbWJsZSBmb3Ig VkRFVjogJWRcbiIsCisJCQkJICAgIGFydmlmLT52ZGV2X2lkKTsKKwkJZWxzZQorCQkJYXRoMTJr X2RiZyhhci0+YWIsIEFUSDEyS19EQkdfTUFDLAorCQkJCSAgICJTZXQgcHJlYW1ibGU6ICVkIGZv ciBWREVWOiAlZFxuIiwKKwkJCQkgICBwcmVhbWJsZSwgYXJ2aWYtPnZkZXZfaWQpOworCX0KKwor CWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQVNTT0MpIHsKKwkJaWYgKHZpZi0+Y2ZnLmFzc29j KQorCQkJYXRoMTJrX2Jzc19hc3NvYyhodywgdmlmLCBpbmZvKTsKKwkJZWxzZQorCQkJYXRoMTJr X2Jzc19kaXNhc3NvYyhodywgdmlmKTsKKwl9CisKKwlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VE X1RYUE9XRVIpIHsKKwkJYXRoMTJrX2RiZyhhci0+YWIsIEFUSDEyS19EQkdfTUFDLCAibWFjIHZk ZXZfaWQgJWkgdHhwb3dlciAlZFxuIiwKKwkJCSAgIGFydmlmLT52ZGV2X2lkLCBpbmZvLT50eHBv d2VyKTsKKworCQlhcnZpZi0+dHhwb3dlciA9IGluZm8tPnR4cG93ZXI7CisJCWF0aDEya19tYWNf dHhwb3dlcl9yZWNhbGMoYXIpOworCX0KKworCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfTUNB U1RfUkFURSAmJgorCSAgICAhYXRoMTJrX21hY192aWZfY2hhbihhcnZpZi0+dmlmLCAmZGVmKSkg eworCQliYW5kID0gZGVmLmNoYW4tPmJhbmQ7CisJCW1jYXN0X3JhdGUgPSB2aWYtPmJzc19jb25m Lm1jYXN0X3JhdGVbYmFuZF07CisKKwkJaWYgKG1jYXN0X3JhdGUgPiAwKQorCQkJcmF0ZWlkeCA9 IG1jYXN0X3JhdGUgLSAxOworCQllbHNlCisJCQlyYXRlaWR4ID0gZmZzKHZpZi0+YnNzX2NvbmYu YmFzaWNfcmF0ZXMpIC0gMTsKKworCQlpZiAoYXItPnBkZXYtPmNhcC5zdXBwb3J0ZWRfYmFuZHMg JiBXTUlfSE9TVF9XTEFOXzVHX0NBUCkKKwkJCXJhdGVpZHggKz0gQVRIMTJLX01BQ19GSVJTVF9P RkRNX1JBVEVfSURYOworCisJCWJpdHJhdGUgPSBhdGgxMmtfbGVnYWN5X3JhdGVzW3JhdGVpZHhd LmJpdHJhdGU7CisJCWh3X3ZhbHVlID0gYXRoMTJrX2xlZ2FjeV9yYXRlc1tyYXRlaWR4XS5od192 YWx1ZTsKKworCQlpZiAoYXRoMTJrX21hY19iaXRyYXRlX2lzX2NjayhiaXRyYXRlKSkKKwkJCXBy ZWFtYmxlID0gV01JX1JBVEVfUFJFQU1CTEVfQ0NLOworCQllbHNlCisJCQlwcmVhbWJsZSA9IFdN SV9SQVRFX1BSRUFNQkxFX09GRE07CisKKwkJcmF0ZSA9IEFUSDEyS19IV19SQVRFX0NPREUoaHdf dmFsdWUsIDAsIHByZWFtYmxlKTsKKworCQlhdGgxMmtfZGJnKGFyLT5hYiwgQVRIMTJLX0RCR19N QUMsCisJCQkgICAibWFjIHZkZXYgJWQgbWNhc3RfcmF0ZSAleFxuIiwKKwkJCSAgIGFydmlmLT52 ZGV2X2lkLCByYXRlKTsKKworCQl2ZGV2X3BhcmFtID0gV01JX1ZERVZfUEFSQU1fTUNBU1RfREFU QV9SQVRFOworCQlyZXQgPSBhdGgxMmtfd21pX3ZkZXZfc2V0X3BhcmFtX2NtZChhciwgYXJ2aWYt PnZkZXZfaWQsCisJCQkJCQkgICAgdmRldl9wYXJhbSwgcmF0ZSk7CisJCWlmIChyZXQpCisJCQlh dGgxMmtfd2Fybihhci0+YWIsCisJCQkJICAgICJmYWlsZWQgdG8gc2V0IG1jYXN0IHJhdGUgb24g dmRldiAlaTogJWRcbiIsCisJCQkJICAgIGFydmlmLT52ZGV2X2lkLCAgcmV0KTsKKworCQl2ZGV2 X3BhcmFtID0gV01JX1ZERVZfUEFSQU1fQkNBU1RfREFUQV9SQVRFOworCQlyZXQgPSBhdGgxMmtf d21pX3ZkZXZfc2V0X3BhcmFtX2NtZChhciwgYXJ2aWYtPnZkZXZfaWQsCisJCQkJCQkgICAgdmRl dl9wYXJhbSwgcmF0ZSk7CisJCWlmIChyZXQpCisJCQlhdGgxMmtfd2Fybihhci0+YWIsCisJCQkJ ICAgICJmYWlsZWQgdG8gc2V0IGJjYXN0IHJhdGUgb24gdmRldiAlaTogJWRcbiIsCisJCQkJICAg IGFydmlmLT52ZGV2X2lkLCAgcmV0KTsKKwl9CisKKwlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VE X0JBU0lDX1JBVEVTICYmCisJICAgICFhdGgxMmtfbWFjX3ZpZl9jaGFuKGFydmlmLT52aWYsICZk ZWYpKQorCQlhdGgxMmtfcmVjYWxjdWxhdGVfbWdtdF9yYXRlKGFyLCB2aWYsICZkZWYpOworCisJ aWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9UV1QpIHsKKwkJaWYgKGluZm8tPnR3dF9yZXF1ZXN0 ZXIgfHwgaW5mby0+dHd0X3Jlc3BvbmRlcikKKwkJCWF0aDEya193bWlfc2VuZF90d3RfZW5hYmxl X2NtZChhciwgYXItPnBkZXYtPnBkZXZfaWQpOworCQllbHNlCisJCQlhdGgxMmtfd21pX3NlbmRf dHd0X2Rpc2FibGVfY21kKGFyLCBhci0+cGRldi0+cGRldl9pZCk7CisJfQorCisJaWYgKGNoYW5n ZWQgJiBCU1NfQ0hBTkdFRF9IRV9PQlNTX1BEKQorCQlhdGgxMmtfd21pX3NlbmRfb2Jzc19zcHJf Y21kKGFyLCBhcnZpZi0+dmRldl9pZCwKKwkJCQkJICAgICAmaW5mby0+aGVfb2Jzc19wZCk7CisK KwlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0hFX0JTU19DT0xPUikgeworCQlpZiAodmlmLT50 eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKSB7CisJCQlyZXQgPSBhdGgxMmtfd21pX29ic3NfY29s b3JfY2ZnX2NtZChhciwKKwkJCQkJCQkgICAgYXJ2aWYtPnZkZXZfaWQsCisJCQkJCQkJICAgIGlu Zm8tPmhlX2Jzc19jb2xvci5jb2xvciwKKwkJCQkJCQkgICAgQVRIMTJLX0JTU19DT0xPUl9BUF9Q RVJJT0RTLAorCQkJCQkJCSAgICBpbmZvLT5oZV9ic3NfY29sb3IuZW5hYmxlZCk7CisJCQlpZiAo cmV0KQorCQkJCWF0aDEya193YXJuKGFyLT5hYiwgImZhaWxlZCB0byBzZXQgYnNzIGNvbG9yIGNv bGxpc2lvbiBvbiB2ZGV2ICVpOiAlZFxuIiwKKwkJCQkJICAgIGFydmlmLT52ZGV2X2lkLCAgcmV0 KTsKKwkJfSBlbHNlIGlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgewor CQkJcmV0ID0gYXRoMTJrX3dtaV9zZW5kX2Jzc19jb2xvcl9jaGFuZ2VfZW5hYmxlX2NtZChhciwK KwkJCQkJCQkJCSAgYXJ2aWYtPnZkZXZfaWQsCisJCQkJCQkJCQkgIDEpOworCQkJaWYgKHJldCkK KwkJCQlhdGgxMmtfd2Fybihhci0+YWIsICJmYWlsZWQgdG8gZW5hYmxlIGJzcyBjb2xvciBjaGFu Z2Ugb24gdmRldiAlaTogJWRcbiIsCisJCQkJCSAgICBhcnZpZi0+dmRldl9pZCwgIHJldCk7CisJ CQlyZXQgPSBhdGgxMmtfd21pX29ic3NfY29sb3JfY2ZnX2NtZChhciwKKwkJCQkJCQkgICAgYXJ2 aWYtPnZkZXZfaWQsCisJCQkJCQkJICAgIDAsCisJCQkJCQkJICAgIEFUSDEyS19CU1NfQ09MT1Jf U1RBX1BFUklPRFMsCisJCQkJCQkJICAgIDEpOworCQkJaWYgKHJldCkKKwkJCQlhdGgxMmtfd2Fy bihhci0+YWIsICJmYWlsZWQgdG8gc2V0IGJzcyBjb2xvciBjb2xsaXNpb24gb24gdmRldiAlaTog JWRcbiIsCisJCQkJCSAgICBhcnZpZi0+dmRldl9pZCwgIHJldCk7CisJCX0KKwl9CisKKwlpZiAo Y2hhbmdlZCAmIEJTU19DSEFOR0VEX0ZJTFNfRElTQ09WRVJZIHx8CisJICAgIGNoYW5nZWQgJiBC U1NfQ0hBTkdFRF9VTlNPTF9CQ0FTVF9QUk9CRV9SRVNQKQorCQlhdGgxMmtfbWFjX2ZpbHNfZGlz Y292ZXJ5KGFydmlmLCBpbmZvKTsKKworCW11dGV4X3VubG9jaygmYXItPmNvbmZfbXV0ZXgpOwor fQorCit2b2lkIF9fYXRoMTJrX21hY19zY2FuX2ZpbmlzaChzdHJ1Y3QgYXRoMTJrICphcikKK3sK Kwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+ZGF0YV9sb2NrKTsKKworCXN3aXRjaCAoYXItPnNj YW4uc3RhdGUpIHsKKwljYXNlIEFUSDEyS19TQ0FOX0lETEU6CisJCWJyZWFrOworCWNhc2UgQVRI MTJLX1NDQU5fUlVOTklORzoKKwljYXNlIEFUSDEyS19TQ0FOX0FCT1JUSU5HOgorCQlpZiAoIWFy LT5zY2FuLmlzX3JvYykgeworCQkJc3RydWN0IGNmZzgwMjExX3NjYW5faW5mbyBpbmZvID0gewor CQkJCS5hYm9ydGVkID0gKGFyLT5zY2FuLnN0YXRlID09CisJCQkJCSAgICBBVEgxMktfU0NBTl9B Qk9SVElORyksCisJCQl9OworCisJCQlpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQoYXItPmh3LCAm aW5mbyk7CisJCX0gZWxzZSBpZiAoYXItPnNjYW4ucm9jX25vdGlmeSkgeworCQkJaWVlZTgwMjEx X3JlbWFpbl9vbl9jaGFubmVsX2V4cGlyZWQoYXItPmh3KTsKKwkJfQorCQlmYWxsdGhyb3VnaDsK KwljYXNlIEFUSDEyS19TQ0FOX1NUQVJUSU5HOgorCQlhci0+c2Nhbi5zdGF0ZSA9IEFUSDEyS19T Q0FOX0lETEU7CisJCWFyLT5zY2FuX2NoYW5uZWwgPSBOVUxMOworCQlhci0+c2Nhbi5yb2NfZnJl cSA9IDA7CisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmFyLT5zY2FuLnRpbWVvdXQpOworCQljb21w bGV0ZSgmYXItPnNjYW4uY29tcGxldGVkKTsKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIGF0aDEy a19tYWNfc2Nhbl9maW5pc2goc3RydWN0IGF0aDEyayAqYXIpCit7CisJc3Bpbl9sb2NrX2JoKCZh ci0+ZGF0YV9sb2NrKTsKKwlfX2F0aDEya19tYWNfc2Nhbl9maW5pc2goYXIpOworCXNwaW5fdW5s b2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKK30KKworc3RhdGljIGludCBhdGgxMmtfc2Nhbl9zdG9w KHN0cnVjdCBhdGgxMmsgKmFyKQoreworCXN0cnVjdCBhdGgxMmtfd21pX3NjYW5fY2FuY2VsX2Fy ZyBhcmcgPSB7CisJCS5yZXFfdHlwZSA9IFdMQU5fU0NBTl9DQU5DRUxfU0lOR0xFLAorCQkuc2Nh bl9pZCA9IEFUSDEyS19TQ0FOX0lELAorCX07CisJaW50IHJldDsKKworCWxvY2tkZXBfYXNzZXJ0 X2hlbGQoJmFyLT5jb25mX211dGV4KTsKKworCS8qIFRPRE86IEZpbGwgb3RoZXIgU1RPUCBQYXJh bXMgKi8KKwlhcmcucGRldl9pZCA9IGFyLT5wZGV2LT5wZGV2X2lkOworCisJcmV0ID0gYXRoMTJr X3dtaV9zZW5kX3NjYW5fc3RvcF9jbWQoYXIsICZhcmcpOworCWlmIChyZXQpIHsKKwkJYXRoMTJr X3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIHN0b3Agd21pIHNjYW46ICVkXG4iLCByZXQpOworCQln b3RvIG91dDsKKwl9CisKKwlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmFyLT5z Y2FuLmNvbXBsZXRlZCwgMyAqIEhaKTsKKwlpZiAocmV0ID09IDApIHsKKwkJYXRoMTJrX3dhcm4o YXItPmFiLAorCQkJICAgICJmYWlsZWQgdG8gcmVjZWl2ZSBzY2FuIGFib3J0IGNvbXBsZTogdGlt ZWQgb3V0XG4iKTsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwl9IGVsc2UgaWYgKHJldCA+IDApIHsK KwkJcmV0ID0gMDsKKwl9CisKK291dDoKKwkvKiBTY2FuIHN0YXRlIHNob3VsZCBiZSB1cGRhdGVk IHVwb24gc2NhbiBjb21wbGV0aW9uIGJ1dCBpbiBjYXNlCisJICogZmlybXdhcmUgZmFpbHMgdG8g ZGVsaXZlciB0aGUgZXZlbnQgKGZvciB3aGF0ZXZlciByZWFzb24pIGl0IGlzCisJICogZGVzaXJl ZCB0byBjbGVhbiB1cCBzY2FuIHN0YXRlIGFueXdheS4gRmlybXdhcmUgbWF5IGhhdmUganVzdAor CSAqIGRyb3BwZWQgdGhlIHNjYW4gY29tcGxldGlvbiBldmVudCBkZWxpdmVyeSBkdWUgdG8gdHJh bnNwb3J0IHBpcGUKKwkgKiBiZWluZyBvdmVyZmxvd24gd2l0aCBkYXRhIGFuZC9vciBpdCBjYW4g cmVjb3ZlciBvbiBpdHMgb3duIGJlZm9yZQorCSAqIG5leHQgc2NhbiByZXF1ZXN0IGlzIHN1Ym1p dHRlZC4KKwkgKi8KKwlzcGluX2xvY2tfYmgoJmFyLT5kYXRhX2xvY2spOworCWlmIChhci0+c2Nh bi5zdGF0ZSAhPSBBVEgxMktfU0NBTl9JRExFKQorCQlfX2F0aDEya19tYWNfc2Nhbl9maW5pc2go YXIpOworCXNwaW5fdW5sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9 CisKK3N0YXRpYyB2b2lkIGF0aDEya19zY2FuX2Fib3J0KHN0cnVjdCBhdGgxMmsgKmFyKQorewor CWludCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7CisKKwlz cGluX2xvY2tfYmgoJmFyLT5kYXRhX2xvY2spOworCisJc3dpdGNoIChhci0+c2Nhbi5zdGF0ZSkg eworCWNhc2UgQVRIMTJLX1NDQU5fSURMRToKKwkJLyogVGhpcyBjYW4gaGFwcGVuIGlmIHRpbWVv dXQgd29ya2VyIGtpY2tlZCBpbiBhbmQgY2FsbGVkCisJCSAqIGFib3J0aW9uIHdoaWxlIHNjYW4g Y29tcGxldGlvbiB3YXMgYmVpbmcgcHJvY2Vzc2VkLgorCQkgKi8KKwkJYnJlYWs7CisJY2FzZSBB VEgxMktfU0NBTl9TVEFSVElORzoKKwljYXNlIEFUSDEyS19TQ0FOX0FCT1JUSU5HOgorCQlhdGgx Mmtfd2Fybihhci0+YWIsICJyZWZ1c2luZyBzY2FuIGFib3J0aW9uIGR1ZSB0byBpbnZhbGlkIHNj YW4gc3RhdGU6ICVkXG4iLAorCQkJICAgIGFyLT5zY2FuLnN0YXRlKTsKKwkJYnJlYWs7CisJY2Fz ZSBBVEgxMktfU0NBTl9SVU5OSU5HOgorCQlhci0+c2Nhbi5zdGF0ZSA9IEFUSDEyS19TQ0FOX0FC T1JUSU5HOworCQlzcGluX3VubG9ja19iaCgmYXItPmRhdGFfbG9jayk7CisKKwkJcmV0ID0gYXRo MTJrX3NjYW5fc3RvcChhcik7CisJCWlmIChyZXQpCisJCQlhdGgxMmtfd2Fybihhci0+YWIsICJm YWlsZWQgdG8gYWJvcnQgc2NhbjogJWRcbiIsIHJldCk7CisKKwkJc3Bpbl9sb2NrX2JoKCZhci0+ ZGF0YV9sb2NrKTsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfYmgoJmFyLT5kYXRhX2xv Y2spOworfQorCitzdGF0aWMgdm9pZCBhdGgxMmtfc2Nhbl90aW1lb3V0X3dvcmsoc3RydWN0IHdv cmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhdGgxMmsgKmFyID0gY29udGFpbmVyX29mKHdv cmssIHN0cnVjdCBhdGgxMmssCisJCQkJCSBzY2FuLnRpbWVvdXQud29yayk7CisKKwltdXRleF9s b2NrKCZhci0+Y29uZl9tdXRleCk7CisJYXRoMTJrX3NjYW5fYWJvcnQoYXIpOworCW11dGV4X3Vu bG9jaygmYXItPmNvbmZfbXV0ZXgpOworfQorCitzdGF0aWMgaW50IGF0aDEya19zdGFydF9zY2Fu KHN0cnVjdCBhdGgxMmsgKmFyLAorCQkJICAgICBzdHJ1Y3QgYXRoMTJrX3dtaV9zY2FuX3JlcV9h cmcgKmFyZykKK3sKKwlpbnQgcmV0OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYXItPmNvbmZf bXV0ZXgpOworCisJcmV0ID0gYXRoMTJrX3dtaV9zZW5kX3NjYW5fc3RhcnRfY21kKGFyLCBhcmcp OworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9u X3RpbWVvdXQoJmFyLT5zY2FuLnN0YXJ0ZWQsIDEgKiBIWik7CisJaWYgKHJldCA9PSAwKSB7CisJ CXJldCA9IGF0aDEya19zY2FuX3N0b3AoYXIpOworCQlpZiAocmV0KQorCQkJYXRoMTJrX3dhcm4o YXItPmFiLCAiZmFpbGVkIHRvIHN0b3Agc2NhbjogJWRcbiIsIHJldCk7CisKKwkJcmV0dXJuIC1F VElNRURPVVQ7CisJfQorCisJLyogSWYgd2UgZmFpbGVkIHRvIHN0YXJ0IHRoZSBzY2FuLCByZXR1 cm4gZXJyb3IgY29kZSBhdAorCSAqIHRoaXMgcG9pbnQuICBUaGlzIGlzIHByb2JhYmx5IGR1ZSB0 byBzb21lIGlzc3VlIGluIHRoZQorCSAqIGZpcm13YXJlLCBidXQgbm8gbmVlZCB0byB3ZWRnZSB0 aGUgZHJpdmVyIGR1ZSB0byB0aGF0Li4uCisJICovCisJc3Bpbl9sb2NrX2JoKCZhci0+ZGF0YV9s b2NrKTsKKwlpZiAoYXItPnNjYW4uc3RhdGUgPT0gQVRIMTJLX1NDQU5fSURMRSkgeworCQlzcGlu X3VubG9ja19iaCgmYXItPmRhdGFfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzcGlu X3VubG9ja19iaCgmYXItPmRhdGFfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlu dCBhdGgxMmtfbWFjX29wX2h3X3NjYW4oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJIHN0 cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfc2Nhbl9yZXF1 ZXN0ICpod19yZXEpCit7CisJc3RydWN0IGF0aDEyayAqYXIgPSBody0+cHJpdjsKKwlzdHJ1Y3Qg YXRoMTJrX3ZpZiAqYXJ2aWYgPSBhdGgxMmtfdmlmX3RvX2FydmlmKHZpZik7CisJc3RydWN0IGNm ZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxID0gJmh3X3JlcS0+cmVxOworCXN0cnVjdCBhdGgxMmtf d21pX3NjYW5fcmVxX2FyZyBhcmcgPSB7fTsKKwlpbnQgcmV0OworCWludCBpOworCisJbXV0ZXhf bG9jaygmYXItPmNvbmZfbXV0ZXgpOworCisJc3Bpbl9sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsK Kwlzd2l0Y2ggKGFyLT5zY2FuLnN0YXRlKSB7CisJY2FzZSBBVEgxMktfU0NBTl9JRExFOgorCQly ZWluaXRfY29tcGxldGlvbigmYXItPnNjYW4uc3RhcnRlZCk7CisJCXJlaW5pdF9jb21wbGV0aW9u KCZhci0+c2Nhbi5jb21wbGV0ZWQpOworCQlhci0+c2Nhbi5zdGF0ZSA9IEFUSDEyS19TQ0FOX1NU QVJUSU5HOworCQlhci0+c2Nhbi5pc19yb2MgPSBmYWxzZTsKKwkJYXItPnNjYW4udmRldl9pZCA9 IGFydmlmLT52ZGV2X2lkOworCQlyZXQgPSAwOworCQlicmVhazsKKwljYXNlIEFUSDEyS19TQ0FO X1NUQVJUSU5HOgorCWNhc2UgQVRIMTJLX1NDQU5fUlVOTklORzoKKwljYXNlIEFUSDEyS19TQ0FO X0FCT1JUSU5HOgorCQlyZXQgPSAtRUJVU1k7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19i aCgmYXItPmRhdGFfbG9jayk7CisKKwlpZiAocmV0KQorCQlnb3RvIGV4aXQ7CisKKwlhdGgxMmtf d21pX3N0YXJ0X3NjYW5faW5pdChhciwgJmFyZyk7CisJYXJnLnZkZXZfaWQgPSBhcnZpZi0+dmRl dl9pZDsKKwlhcmcuc2Nhbl9pZCA9IEFUSDEyS19TQ0FOX0lEOworCisJaWYgKHJlcS0+aWVfbGVu KSB7CisJCWFyZy5leHRyYWllLmxlbiA9IHJlcS0+aWVfbGVuOworCQlhcmcuZXh0cmFpZS5wdHIg PSBremFsbG9jKHJlcS0+aWVfbGVuLCBHRlBfS0VSTkVMKTsKKwkJbWVtY3B5KGFyZy5leHRyYWll LnB0ciwgcmVxLT5pZSwgcmVxLT5pZV9sZW4pOworCX0KKworCWlmIChyZXEtPm5fc3NpZHMpIHsK KwkJYXJnLm51bV9zc2lkcyA9IHJlcS0+bl9zc2lkczsKKwkJZm9yIChpID0gMDsgaSA8IGFyZy5u dW1fc3NpZHM7IGkrKykKKwkJCWFyZy5zc2lkW2ldID0gcmVxLT5zc2lkc1tpXTsKKwl9IGVsc2Ug eworCQlhcmcuc2Nhbl9mbGFncyB8PSBXTUlfU0NBTl9GTEFHX1BBU1NJVkU7CisJfQorCisJaWYg KHJlcS0+bl9jaGFubmVscykgeworCQlhcmcubnVtX2NoYW4gPSByZXEtPm5fY2hhbm5lbHM7CisJ CWZvciAoaSA9IDA7IGkgPCBhcmcubnVtX2NoYW47IGkrKykKKwkJCWFyZy5jaGFuX2xpc3RbaV0g PSByZXEtPmNoYW5uZWxzW2ldLT5jZW50ZXJfZnJlcTsKKwl9CisKKwlyZXQgPSBhdGgxMmtfc3Rh cnRfc2NhbihhciwgJmFyZyk7CisJaWYgKHJldCkgeworCQlhdGgxMmtfd2Fybihhci0+YWIsICJm YWlsZWQgdG8gc3RhcnQgaHcgc2NhbjogJWRcbiIsIHJldCk7CisJCXNwaW5fbG9ja19iaCgmYXIt PmRhdGFfbG9jayk7CisJCWFyLT5zY2FuLnN0YXRlID0gQVRIMTJLX1NDQU5fSURMRTsKKwkJc3Bp bl91bmxvY2tfYmgoJmFyLT5kYXRhX2xvY2spOworCX0KKworCS8qIEFkZCBhIG1hcmdpbiB0byBh Y2NvdW50IGZvciBldmVudC9jb21tYW5kIHByb2Nlc3NpbmcgKi8KKwlpZWVlODAyMTFfcXVldWVf ZGVsYXllZF93b3JrKGFyLT5odywgJmFyLT5zY2FuLnRpbWVvdXQsCisJCQkJICAgICBtc2Vjc190 b19qaWZmaWVzKGFyZy5tYXhfc2Nhbl90aW1lICsKKwkJCQkJCSAgICAgIEFUSDEyS19NQUNfU0NB Tl9USU1FT1VUX01TRUNTKSk7CisKK2V4aXQ6CisJaWYgKHJlcS0+aWVfbGVuKQorCQlrZnJlZShh cmcuZXh0cmFpZS5wdHIpOworCisJbXV0ZXhfdW5sb2NrKCZhci0+Y29uZl9tdXRleCk7CisJcmV0 dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYXRoMTJrX21hY19vcF9jYW5jZWxfaHdfc2Nhbihz dHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYp Cit7CisJc3RydWN0IGF0aDEyayAqYXIgPSBody0+cHJpdjsKKworCW11dGV4X2xvY2soJmFyLT5j b25mX211dGV4KTsKKwlhdGgxMmtfc2Nhbl9hYm9ydChhcik7CisJbXV0ZXhfdW5sb2NrKCZhci0+ Y29uZl9tdXRleCk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmFyLT5zY2FuLnRpbWVv dXQpOworfQorCitzdGF0aWMgaW50IGF0aDEya19pbnN0YWxsX2tleShzdHJ1Y3QgYXRoMTJrX3Zp ZiAqYXJ2aWYsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXksCisJCQkg ICAgICBlbnVtIHNldF9rZXlfY21kIGNtZCwKKwkJCSAgICAgIGNvbnN0IHU4ICptYWNhZGRyLCB1 MzIgZmxhZ3MpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYXRoMTJrICphciA9IGFydmlmLT5hcjsK KwlzdHJ1Y3Qgd21pX3ZkZXZfaW5zdGFsbF9rZXlfYXJnIGFyZyA9IHsKKwkJLnZkZXZfaWQgPSBh cnZpZi0+dmRldl9pZCwKKwkJLmtleV9pZHggPSBrZXktPmtleWlkeCwKKwkJLmtleV9sZW4gPSBr ZXktPmtleWxlbiwKKwkJLmtleV9kYXRhID0ga2V5LT5rZXksCisJCS5rZXlfZmxhZ3MgPSBmbGFn cywKKwkJLm1hY2FkZHIgPSBtYWNhZGRyLAorCX07CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZh cnZpZi0+YXItPmNvbmZfbXV0ZXgpOworCisJcmVpbml0X2NvbXBsZXRpb24oJmFyLT5pbnN0YWxs X2tleV9kb25lKTsKKworCWlmICh0ZXN0X2JpdChBVEgxMktfRkxBR19IV19DUllQVE9fRElTQUJM RUQsICZhci0+YWItPmRldl9mbGFncykpCisJCXJldHVybiAwOworCisJaWYgKGNtZCA9PSBESVNB QkxFX0tFWSkgeworCQkvKiBUT0RPOiBDaGVjayBpZiBGVyBleHBlY3RzICB2YWx1ZSBvdGhlciB0 aGFuIE5PTkUgZm9yIGRlbCAqLworCQkvKiBhcmcua2V5X2NpcGhlciA9IFdNSV9DSVBIRVJfTk9O RTsgKi8KKwkJYXJnLmtleV9sZW4gPSAwOworCQlhcmcua2V5X2RhdGEgPSBOVUxMOworCQlnb3Rv IGluc3RhbGw7CisJfQorCisJc3dpdGNoIChrZXktPmNpcGhlcikgeworCWNhc2UgV0xBTl9DSVBI RVJfU1VJVEVfQ0NNUDoKKwkJYXJnLmtleV9jaXBoZXIgPSBXTUlfQ0lQSEVSX0FFU19DQ007CisJ CS8qIFRPRE86IFJlLWNoZWNrIGlmIGZsYWcgaXMgdmFsaWQgKi8KKwkJa2V5LT5mbGFncyB8PSBJ RUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVZfTUdNVDsKKwkJYnJlYWs7CisJY2FzZSBXTEFO X0NJUEhFUl9TVUlURV9US0lQOgorCQlhcmcua2V5X2NpcGhlciA9IFdNSV9DSVBIRVJfVEtJUDsK KwkJYXJnLmtleV90eG1pY19sZW4gPSA4OworCQlhcmcua2V5X3J4bWljX2xlbiA9IDg7CisJCWJy ZWFrOworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUF8yNTY6CisJCWFyZy5rZXlfY2lwaGVy ID0gV01JX0NJUEhFUl9BRVNfQ0NNOworCQlicmVhazsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRF X0dDTVA6CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9HQ01QXzI1NjoKKwkJYXJnLmtleV9jaXBo ZXIgPSBXTUlfQ0lQSEVSX0FFU19HQ007CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWF0aDEya193 YXJuKGFyLT5hYiwgImNpcGhlciAlZCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBrZXktPmNpcGhlcik7 CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlpZiAodGVzdF9iaXQoQVRIMTJLX0ZMQUdf UkFXX01PREUsICZhci0+YWItPmRldl9mbGFncykpCisJCWtleS0+ZmxhZ3MgfD0gSUVFRTgwMjEx X0tFWV9GTEFHX0dFTkVSQVRFX0lWIHwKKwkJCSAgICAgIElFRUU4MDIxMV9LRVlfRkxBR19SRVNF UlZFX1RBSUxST09NOworCitpbnN0YWxsOgorCXJldCA9IGF0aDEya193bWlfdmRldl9pbnN0YWxs X2tleShhcnZpZi0+YXIsICZhcmcpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlm ICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZhci0+aW5zdGFsbF9rZXlfZG9uZSwgMSAq IEhaKSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlpZiAoZXRoZXJfYWRkcl9lcXVhbChtYWNh ZGRyLCBhcnZpZi0+dmlmLT5hZGRyKSkKKwkJYXJ2aWYtPmtleV9jaXBoZXIgPSBrZXktPmNpcGhl cjsKKworCXJldHVybiBhci0+aW5zdGFsbF9rZXlfc3RhdHVzID8gLUVJTlZBTCA6IDA7Cit9CisK K3N0YXRpYyBpbnQgYXRoMTJrX2NsZWFyX3BlZXJfa2V5cyhzdHJ1Y3QgYXRoMTJrX3ZpZiAqYXJ2 aWYsCisJCQkJICBjb25zdCB1OCAqYWRkcikKK3sKKwlzdHJ1Y3QgYXRoMTJrICphciA9IGFydmlm LT5hcjsKKwlzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiID0gYXItPmFiOworCXN0cnVjdCBhdGgxMmtf cGVlciAqcGVlcjsKKwlpbnQgZmlyc3RfZXJybm8gPSAwOworCWludCByZXQ7CisJaW50IGk7CisJ dTMyIGZsYWdzID0gMDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFyLT5jb25mX211dGV4KTsK KworCXNwaW5fbG9ja19iaCgmYWItPmJhc2VfbG9jayk7CisJcGVlciA9IGF0aDEya19wZWVyX2Zp bmQoYWIsIGFydmlmLT52ZGV2X2lkLCBhZGRyKTsKKwlzcGluX3VubG9ja19iaCgmYWItPmJhc2Vf bG9jayk7CisKKwlpZiAoIXBlZXIpCisJCXJldHVybiAtRU5PRU5UOworCisJZm9yIChpID0gMDsg aSA8IEFSUkFZX1NJWkUocGVlci0+a2V5cyk7IGkrKykgeworCQlpZiAoIXBlZXItPmtleXNbaV0p CisJCQljb250aW51ZTsKKworCQkvKiBrZXkgZmxhZ3MgYXJlIG5vdCByZXF1aXJlZCB0byBkZWxl dGUgdGhlIGtleSAqLworCQlyZXQgPSBhdGgxMmtfaW5zdGFsbF9rZXkoYXJ2aWYsIHBlZXItPmtl eXNbaV0sCisJCQkJCSBESVNBQkxFX0tFWSwgYWRkciwgZmxhZ3MpOworCQlpZiAocmV0IDwgMCAm JiBmaXJzdF9lcnJubyA9PSAwKQorCQkJZmlyc3RfZXJybm8gPSByZXQ7CisKKwkJaWYgKHJldCA8 IDApCisJCQlhdGgxMmtfd2FybihhYiwgImZhaWxlZCB0byByZW1vdmUgcGVlciBrZXkgJWQ6ICVk XG4iLAorCQkJCSAgICBpLCByZXQpOworCisJCXNwaW5fbG9ja19iaCgmYWItPmJhc2VfbG9jayk7 CisJCXBlZXItPmtleXNbaV0gPSBOVUxMOworCQlzcGluX3VubG9ja19iaCgmYWItPmJhc2VfbG9j ayk7CisJfQorCisJcmV0dXJuIGZpcnN0X2Vycm5vOworfQorCitzdGF0aWMgaW50IGF0aDEya19t YWNfb3Bfc2V0X2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBzZXRfa2V5X2NtZCBj bWQsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHN0cnVjdCBpZWVlODAyMTFfc3Rh ICpzdGEsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkKK3sKKwlzdHJ1Y3Qg YXRoMTJrICphciA9IGh3LT5wcml2OworCXN0cnVjdCBhdGgxMmtfYmFzZSAqYWIgPSBhci0+YWI7 CisJc3RydWN0IGF0aDEya192aWYgKmFydmlmID0gYXRoMTJrX3ZpZl90b19hcnZpZih2aWYpOwor CXN0cnVjdCBhdGgxMmtfcGVlciAqcGVlcjsKKwlzdHJ1Y3QgYXRoMTJrX3N0YSAqYXJzdGE7CisJ Y29uc3QgdTggKnBlZXJfYWRkcjsKKwlpbnQgcmV0ID0gMDsKKwl1MzIgZmxhZ3MgPSAwOworCisJ LyogQklQIG5lZWRzIHRvIGJlIGRvbmUgaW4gc29mdHdhcmUgKi8KKwlpZiAoa2V5LT5jaXBoZXIg PT0gV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUMgfHwKKwkgICAga2V5LT5jaXBoZXIgPT0gV0xB Tl9DSVBIRVJfU1VJVEVfQklQX0dNQUNfMTI4IHx8CisJICAgIGtleS0+Y2lwaGVyID09IFdMQU5f Q0lQSEVSX1NVSVRFX0JJUF9HTUFDXzI1NiB8fAorCSAgICBrZXktPmNpcGhlciA9PSBXTEFOX0NJ UEhFUl9TVUlURV9CSVBfQ01BQ18yNTYpCisJCXJldHVybiAxOworCisJaWYgKHRlc3RfYml0KEFU SDEyS19GTEFHX0hXX0NSWVBUT19ESVNBQkxFRCwgJmFyLT5hYi0+ZGV2X2ZsYWdzKSkKKwkJcmV0 dXJuIDE7CisKKwlpZiAoa2V5LT5rZXlpZHggPiBXTUlfTUFYX0tFWV9JTkRFWCkKKwkJcmV0dXJu IC1FTk9TUEM7CisKKwltdXRleF9sb2NrKCZhci0+Y29uZl9tdXRleCk7CisKKwlpZiAoc3RhKQor CQlwZWVyX2FkZHIgPSBzdGEtPmFkZHI7CisJZWxzZSBpZiAoYXJ2aWYtPnZkZXZfdHlwZSA9PSBX TUlfVkRFVl9UWVBFX1NUQSkKKwkJcGVlcl9hZGRyID0gdmlmLT5ic3NfY29uZi5ic3NpZDsKKwll bHNlCisJCXBlZXJfYWRkciA9IHZpZi0+YWRkcjsKKworCWtleS0+aHdfa2V5X2lkeCA9IGtleS0+ a2V5aWR4OworCisJLyogdGhlIHBlZXIgc2hvdWxkIG5vdCBkaXNhcHBlYXIgaW4gbWlkLXdheSAo dW5sZXNzIEZXIGdvZXMgYXdyeSkgc2luY2UKKwkgKiB3ZSBhbHJlYWR5IGhvbGQgY29uZl9tdXRl eC4gd2UganVzdCBtYWtlIHN1cmUgaXRzIHRoZXJlIG5vdy4KKwkgKi8KKwlzcGluX2xvY2tfYmgo JmFiLT5iYXNlX2xvY2spOworCXBlZXIgPSBhdGgxMmtfcGVlcl9maW5kKGFiLCBhcnZpZi0+dmRl dl9pZCwgcGVlcl9hZGRyKTsKKwlzcGluX3VubG9ja19iaCgmYWItPmJhc2VfbG9jayk7CisKKwlp ZiAoIXBlZXIpIHsKKwkJaWYgKGNtZCA9PSBTRVRfS0VZKSB7CisJCQlhdGgxMmtfd2FybihhYiwg ImNhbm5vdCBpbnN0YWxsIGtleSBmb3Igbm9uLWV4aXN0ZW50IHBlZXIgJXBNXG4iLAorCQkJCSAg ICBwZWVyX2FkZHIpOworCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQlnb3RvIGV4aXQ7CisJCX0g ZWxzZSB7CisJCQkvKiBpZiB0aGUgcGVlciBkb2Vzbid0IGV4aXN0IHRoZXJlIGlzIG5vIGtleSB0 byBkaXNhYmxlCisJCQkgKiBhbnltb3JlCisJCQkgKi8KKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0K KworCWlmIChrZXktPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BBSVJXSVNFKQorCQlmbGFn cyB8PSBXTUlfS0VZX1BBSVJXSVNFOworCWVsc2UKKwkJZmxhZ3MgfD0gV01JX0tFWV9HUk9VUDsK KworCXJldCA9IGF0aDEya19pbnN0YWxsX2tleShhcnZpZiwga2V5LCBjbWQsIHBlZXJfYWRkciwg ZmxhZ3MpOworCWlmIChyZXQpIHsKKwkJYXRoMTJrX3dhcm4oYWIsICJhdGgxMmtfaW5zdGFsbF9r ZXkgZmFpbGVkICglZClcbiIsIHJldCk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlyZXQgPSBhdGgx MmtfZHBfcnhfcGVlcl9wbl9yZXBsYXlfY29uZmlnKGFydmlmLCBwZWVyX2FkZHIsIGNtZCwga2V5 KTsKKwlpZiAocmV0KSB7CisJCWF0aDEya193YXJuKGFiLCAiZmFpbGVkIHRvIG9mZmxvYWQgUE4g cmVwbGF5IGRldGVjdGlvbiAlZFxuIiwgcmV0KTsKKwkJZ290byBleGl0OworCX0KKworCXNwaW5f bG9ja19iaCgmYWItPmJhc2VfbG9jayk7CisJcGVlciA9IGF0aDEya19wZWVyX2ZpbmQoYWIsIGFy dmlmLT52ZGV2X2lkLCBwZWVyX2FkZHIpOworCWlmIChwZWVyICYmIGNtZCA9PSBTRVRfS0VZKSB7 CisJCXBlZXItPmtleXNba2V5LT5rZXlpZHhdID0ga2V5OworCQlpZiAoa2V5LT5mbGFncyAmIElF RUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkgeworCQkJcGVlci0+dWNhc3Rfa2V5aWR4ID0ga2V5 LT5rZXlpZHg7CisJCQlwZWVyLT5zZWNfdHlwZSA9IGF0aDEya19kcF90eF9nZXRfZW5jcnlwdF90 eXBlKGtleS0+Y2lwaGVyKTsKKwkJfSBlbHNlIHsKKwkJCXBlZXItPm1jYXN0X2tleWlkeCA9IGtl eS0+a2V5aWR4OworCQkJcGVlci0+c2VjX3R5cGVfZ3JwID0gYXRoMTJrX2RwX3R4X2dldF9lbmNy eXB0X3R5cGUoa2V5LT5jaXBoZXIpOworCQl9CisJfSBlbHNlIGlmIChwZWVyICYmIGNtZCA9PSBE SVNBQkxFX0tFWSkgeworCQlwZWVyLT5rZXlzW2tleS0+a2V5aWR4XSA9IE5VTEw7CisJCWlmIChr ZXktPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BBSVJXSVNFKQorCQkJcGVlci0+dWNhc3Rf a2V5aWR4ID0gMDsKKwkJZWxzZQorCQkJcGVlci0+bWNhc3Rfa2V5aWR4ID0gMDsKKwl9IGVsc2Ug aWYgKCFwZWVyKQorCQkvKiBpbXBvc3NpYmxlIHVubGVzcyBGVyBnb2VzIGNyYXp5ICovCisJCWF0 aDEya193YXJuKGFiLCAicGVlciAlcE0gZGlzYXBwZWFyZWQhXG4iLCBwZWVyX2FkZHIpOworCisJ aWYgKHN0YSkgeworCQlhcnN0YSA9IChzdHJ1Y3QgYXRoMTJrX3N0YSAqKXN0YS0+ZHJ2X3ByaXY7 CisKKwkJc3dpdGNoIChrZXktPmNpcGhlcikgeworCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RL SVA6CisJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKKwkJY2FzZSBXTEFOX0NJUEhFUl9T VUlURV9DQ01QXzI1NjoKKwkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9HQ01QOgorCQljYXNlIFdM QU5fQ0lQSEVSX1NVSVRFX0dDTVBfMjU2OgorCQkJaWYgKGNtZCA9PSBTRVRfS0VZKQorCQkJCWFy c3RhLT5wbl90eXBlID0gSEFMX1BOX1RZUEVfV1BBOworCQkJZWxzZQorCQkJCWFyc3RhLT5wbl90 eXBlID0gSEFMX1BOX1RZUEVfTk9ORTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYXJzdGEt PnBuX3R5cGUgPSBIQUxfUE5fVFlQRV9OT05FOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzcGlu X3VubG9ja19iaCgmYWItPmJhc2VfbG9jayk7CisKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZhci0+ Y29uZl9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorYXRoMTJrX21hY19i aXRyYXRlX21hc2tfbnVtX3ZodF9yYXRlcyhzdHJ1Y3QgYXRoMTJrICphciwKKwkJCQkgICAgICBl bnVtIG5sODAyMTFfYmFuZCBiYW5kLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9i aXRyYXRlX21hc2sgKm1hc2spCit7CisJaW50IG51bV9yYXRlcyA9IDA7CisJaW50IGk7CisKKwlm b3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtYXNrLT5jb250cm9sW2JhbmRdLnZodF9tY3MpOyBp KyspCisJCW51bV9yYXRlcyArPSBod2VpZ2h0MTYobWFzay0+Y29udHJvbFtiYW5kXS52aHRfbWNz W2ldKTsKKworCXJldHVybiBudW1fcmF0ZXM7Cit9CisKK3N0YXRpYyBpbnQKK2F0aDEya19tYWNf c2V0X3BlZXJfdmh0X2ZpeGVkX3JhdGUoc3RydWN0IGF0aDEya192aWYgKmFydmlmLAorCQkJCSAg IHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkJICAgY29uc3Qgc3RydWN0IGNmZzgwMjEx X2JpdHJhdGVfbWFzayAqbWFzaywKKwkJCQkgICBlbnVtIG5sODAyMTFfYmFuZCBiYW5kKQorewor CXN0cnVjdCBhdGgxMmsgKmFyID0gYXJ2aWYtPmFyOworCXU4IHZodF9yYXRlLCBuc3M7CisJdTMy IHJhdGVfY29kZTsKKwlpbnQgcmV0LCBpOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYXItPmNv bmZfbXV0ZXgpOworCisJbnNzID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1h c2stPmNvbnRyb2xbYmFuZF0udmh0X21jcyk7IGkrKykgeworCQlpZiAoaHdlaWdodDE2KG1hc2st PmNvbnRyb2xbYmFuZF0udmh0X21jc1tpXSkgPT0gMSkgeworCQkJbnNzID0gaSArIDE7CisJCQl2 aHRfcmF0ZSA9IGZmcyhtYXNrLT5jb250cm9sW2JhbmRdLnZodF9tY3NbaV0pIC0gMTsKKwkJfQor CX0KKworCWlmICghbnNzKSB7CisJCWF0aDEya193YXJuKGFyLT5hYiwgIk5vIHNpbmdsZSBWSFQg Rml4ZWQgcmF0ZSBmb3VuZCB0byBzZXQgZm9yICVwTSIsCisJCQkgICAgc3RhLT5hZGRyKTsKKwkJ cmV0dXJuIC1FSU5WQUw7CisJfQorCisJYXRoMTJrX2RiZyhhci0+YWIsIEFUSDEyS19EQkdfTUFD LAorCQkgICAiU2V0dGluZyBGaXhlZCBWSFQgUmF0ZSBmb3IgcGVlciAlcE0uIERldmljZSB3aWxs IG5vdCBzd2l0Y2ggdG8gYW55IG90aGVyIHNlbGVjdGVkIHJhdGVzIiwKKwkJICAgc3RhLT5hZGRy KTsKKworCXJhdGVfY29kZSA9IEFUSDEyS19IV19SQVRFX0NPREUodmh0X3JhdGUsIG5zcyAtIDEs CisJCQkJCVdNSV9SQVRFX1BSRUFNQkxFX1ZIVCk7CisJcmV0ID0gYXRoMTJrX3dtaV9zZXRfcGVl cl9wYXJhbShhciwgc3RhLT5hZGRyLAorCQkJCQlhcnZpZi0+dmRldl9pZCwKKwkJCQkJV01JX1BF RVJfUEFSQU1fRklYRURfUkFURSwKKwkJCQkJcmF0ZV9jb2RlKTsKKwlpZiAocmV0KQorCQlhdGgx Mmtfd2Fybihhci0+YWIsCisJCQkgICAgImZhaWxlZCB0byB1cGRhdGUgU1RBICVwTSBGaXhlZCBS YXRlICVkOiAlZFxuIiwKKwkJCSAgICAgc3RhLT5hZGRyLCByYXRlX2NvZGUsIHJldCk7CisKKwly ZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0aDEya19zdGF0aW9uX2Fzc29jKHN0cnVjdCBh dGgxMmsgKmFyLAorCQkJCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJc3RydWN0IGll ZWU4MDIxMV9zdGEgKnN0YSwKKwkJCQlib29sIHJlYXNzb2MpCit7CisJc3RydWN0IGF0aDEya192 aWYgKmFydmlmID0gYXRoMTJrX3ZpZl90b19hcnZpZih2aWYpOworCXN0cnVjdCBhdGgxMmtfd21p X3BlZXJfYXNzb2NfYXJnIHBlZXJfYXJnOworCWludCByZXQ7CisJc3RydWN0IGNmZzgwMjExX2No YW5fZGVmIGRlZjsKKwllbnVtIG5sODAyMTFfYmFuZCBiYW5kOworCXN0cnVjdCBjZmc4MDIxMV9i aXRyYXRlX21hc2sgKm1hc2s7CisJdTggbnVtX3ZodF9yYXRlczsKKworCWxvY2tkZXBfYXNzZXJ0 X2hlbGQoJmFyLT5jb25mX211dGV4KTsKKworCWlmIChXQVJOX09OKGF0aDEya19tYWNfdmlmX2No YW4odmlmLCAmZGVmKSkpCisJCXJldHVybiAtRVBFUk07CisKKwliYW5kID0gZGVmLmNoYW4tPmJh bmQ7CisJbWFzayA9ICZhcnZpZi0+Yml0cmF0ZV9tYXNrOworCisJYXRoMTJrX3BlZXJfYXNzb2Nf cHJlcGFyZShhciwgdmlmLCBzdGEsICZwZWVyX2FyZywgcmVhc3NvYyk7CisKKwlyZXQgPSBhdGgx Mmtfd21pX3NlbmRfcGVlcl9hc3NvY19jbWQoYXIsICZwZWVyX2FyZyk7CisJaWYgKHJldCkgewor CQlhdGgxMmtfd2Fybihhci0+YWIsICJmYWlsZWQgdG8gcnVuIHBlZXIgYXNzb2MgZm9yIFNUQSAl cE0gdmRldiAlaTogJWRcbiIsCisJCQkgICAgc3RhLT5hZGRyLCBhcnZpZi0+dmRldl9pZCwgcmV0 KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91 dCgmYXItPnBlZXJfYXNzb2NfZG9uZSwgMSAqIEhaKSkgeworCQlhdGgxMmtfd2Fybihhci0+YWIs ICJmYWlsZWQgdG8gZ2V0IHBlZXIgYXNzb2MgY29uZiBldmVudCBmb3IgJXBNIHZkZXYgJWlcbiIs CisJCQkgICAgc3RhLT5hZGRyLCBhcnZpZi0+dmRldl9pZCk7CisJCXJldHVybiAtRVRJTUVET1VU OworCX0KKworCW51bV92aHRfcmF0ZXMgPSBhdGgxMmtfbWFjX2JpdHJhdGVfbWFza19udW1fdmh0 X3JhdGVzKGFyLCBiYW5kLCBtYXNrKTsKKworCS8qIElmIHNpbmdsZSBWSFQgcmF0ZSBpcyBjb25m aWd1cmVkIChieSBzZXRfYml0cmF0ZV9tYXNrKCkpLAorCSAqIHBlZXJfYXNzb2Mgd2lsbCBkaXNh YmxlIFZIVC4gVGhpcyBpcyBub3cgZW5hYmxlZCBieSBhIHBlZXIgc3BlY2lmaWMKKwkgKiBmaXhl ZCBwYXJhbS4KKwkgKiBOb3RlIHRoYXQgYWxsIG90aGVyIHJhdGVzIGFuZCBOU1Mgd2lsbCBiZSBk aXNhYmxlZCBmb3IgdGhpcyBwZWVyLgorCSAqLworCWlmIChzdGEtPmRlZmxpbmsudmh0X2NhcC52 aHRfc3VwcG9ydGVkICYmIG51bV92aHRfcmF0ZXMgPT0gMSkgeworCQlyZXQgPSBhdGgxMmtfbWFj X3NldF9wZWVyX3ZodF9maXhlZF9yYXRlKGFydmlmLCBzdGEsIG1hc2ssCisJCQkJCQkJIGJhbmQp OworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBSZS1hc3NvYyBpcyBydW4g b25seSB0byB1cGRhdGUgc3VwcG9ydGVkIHJhdGVzIGZvciBnaXZlbiBzdGF0aW9uLiBJdAorCSAq IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlIHRvIHJlY29uZmlndXJlIHRoZSBwZWVyIGNvbXBsZXRl bHkuCisJICovCisJaWYgKHJlYXNzb2MpCisJCXJldHVybiAwOworCisJcmV0ID0gYXRoMTJrX3Nl dHVwX3BlZXJfc21wcyhhciwgYXJ2aWYsIHN0YS0+YWRkciwKKwkJCQkgICAgICZzdGEtPmRlZmxp bmsuaHRfY2FwKTsKKwlpZiAocmV0KSB7CisJCWF0aDEya193YXJuKGFyLT5hYiwgImZhaWxlZCB0 byBzZXR1cCBwZWVyIFNNUFMgZm9yIHZkZXYgJWQ6ICVkXG4iLAorCQkJICAgIGFydmlmLT52ZGV2 X2lkLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghc3RhLT53bWUpIHsKKwkJYXJ2 aWYtPm51bV9sZWdhY3lfc3RhdGlvbnMrKzsKKwkJcmV0ID0gYXRoMTJrX3JlY2FsY19ydHNjdHNf cHJvdChhcnZpZik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChzdGEt PndtZSAmJiBzdGEtPnVhcHNkX3F1ZXVlcykgeworCQlyZXQgPSBhdGgxMmtfcGVlcl9hc3NvY19x b3NfYXAoYXIsIGFydmlmLCBzdGEpOworCQlpZiAocmV0KSB7CisJCQlhdGgxMmtfd2Fybihhci0+ YWIsICJmYWlsZWQgdG8gc2V0IHFvcyBwYXJhbXMgZm9yIFNUQSAlcE0gZm9yIHZkZXYgJWk6ICVk XG4iLAorCQkJCSAgICBzdGEtPmFkZHIsIGFydmlmLT52ZGV2X2lkLCByZXQpOworCQkJcmV0dXJu IHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0aDEya19zdGF0 aW9uX2Rpc2Fzc29jKHN0cnVjdCBhdGgxMmsgKmFyLAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFf dmlmICp2aWYsCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlzdHJ1Y3Qg YXRoMTJrX3ZpZiAqYXJ2aWYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CisJaW50IHJldDsKKwor CWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFyLT5jb25mX211dGV4KTsKKworCWlmICghc3RhLT53bWUp IHsKKwkJYXJ2aWYtPm51bV9sZWdhY3lfc3RhdGlvbnMtLTsKKwkJcmV0ID0gYXRoMTJrX3JlY2Fs Y19ydHNjdHNfcHJvdChhcnZpZik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwor CXJldCA9IGF0aDEya19jbGVhcl9wZWVyX2tleXMoYXJ2aWYsIHN0YS0+YWRkcik7CisJaWYgKHJl dCkgeworCQlhdGgxMmtfd2Fybihhci0+YWIsICJmYWlsZWQgdG8gY2xlYXIgYWxsIHBlZXIga2V5 cyBmb3IgdmRldiAlaTogJWRcbiIsCisJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CisJCXJl dHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdGgxMmtfc3RhX3Jj X3VwZGF0ZV93ayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndrKQoreworCXN0cnVjdCBhdGgxMmsgKmFy OworCXN0cnVjdCBhdGgxMmtfdmlmICphcnZpZjsKKwlzdHJ1Y3QgYXRoMTJrX3N0YSAqYXJzdGE7 CisJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsKKwlzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYg ZGVmOworCWVudW0gbmw4MDIxMV9iYW5kIGJhbmQ7CisJY29uc3QgdTggKmh0X21jc19tYXNrOwor CWNvbnN0IHUxNiAqdmh0X21jc19tYXNrOworCXUzMiBjaGFuZ2VkLCBidywgbnNzLCBzbXBzOwor CWludCBlcnIsIG51bV92aHRfcmF0ZXM7CisJY29uc3Qgc3RydWN0IGNmZzgwMjExX2JpdHJhdGVf bWFzayAqbWFzazsKKwlzdHJ1Y3QgYXRoMTJrX3dtaV9wZWVyX2Fzc29jX2FyZyBwZWVyX2FyZzsK KworCWFyc3RhID0gY29udGFpbmVyX29mKHdrLCBzdHJ1Y3QgYXRoMTJrX3N0YSwgdXBkYXRlX3dr KTsKKwlzdGEgPSBjb250YWluZXJfb2YoKHZvaWQgKilhcnN0YSwgc3RydWN0IGllZWU4MDIxMV9z dGEsIGRydl9wcml2KTsKKwlhcnZpZiA9IGFyc3RhLT5hcnZpZjsKKwlhciA9IGFydmlmLT5hcjsK KworCWlmIChXQVJOX09OKGF0aDEya19tYWNfdmlmX2NoYW4oYXJ2aWYtPnZpZiwgJmRlZikpKQor CQlyZXR1cm47CisKKwliYW5kID0gZGVmLmNoYW4tPmJhbmQ7CisJaHRfbWNzX21hc2sgPSBhcnZp Zi0+Yml0cmF0ZV9tYXNrLmNvbnRyb2xbYmFuZF0uaHRfbWNzOworCXZodF9tY3NfbWFzayA9IGFy dmlmLT5iaXRyYXRlX21hc2suY29udHJvbFtiYW5kXS52aHRfbWNzOworCisJc3Bpbl9sb2NrX2Jo KCZhci0+ZGF0YV9sb2NrKTsKKworCWNoYW5nZWQgPSBhcnN0YS0+Y2hhbmdlZDsKKwlhcnN0YS0+ Y2hhbmdlZCA9IDA7CisKKwlidyA9IGFyc3RhLT5idzsKKwluc3MgPSBhcnN0YS0+bnNzOworCXNt cHMgPSBhcnN0YS0+c21wczsKKworCXNwaW5fdW5sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKKwor CW11dGV4X2xvY2soJmFyLT5jb25mX211dGV4KTsKKworCW5zcyA9IG1heF90KHUzMiwgMSwgbnNz KTsKKwluc3MgPSBtaW4obnNzLCBtYXgoYXRoMTJrX21hY19tYXhfaHRfbnNzKGh0X21jc19tYXNr KSwKKwkJCSAgIGF0aDEya19tYWNfbWF4X3ZodF9uc3Modmh0X21jc19tYXNrKSkpOworCisJaWYg KGNoYW5nZWQgJiBJRUVFODAyMTFfUkNfQldfQ0hBTkdFRCkgeworCQllcnIgPSBhdGgxMmtfd21p X3NldF9wZWVyX3BhcmFtKGFyLCBzdGEtPmFkZHIsIGFydmlmLT52ZGV2X2lkLAorCQkJCQkJV01J X1BFRVJfQ0hXSURUSCwgYncpOworCQlpZiAoZXJyKQorCQkJYXRoMTJrX3dhcm4oYXItPmFiLCAi ZmFpbGVkIHRvIHVwZGF0ZSBTVEEgJXBNIHBlZXIgYncgJWQ6ICVkXG4iLAorCQkJCSAgICBzdGEt PmFkZHIsIGJ3LCBlcnIpOworCX0KKworCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX1JDX05TU19D SEFOR0VEKSB7CisJCWF0aDEya19kYmcoYXItPmFiLCBBVEgxMktfREJHX01BQywgIm1hYyB1cGRh dGUgc3RhICVwTSBuc3MgJWRcbiIsCisJCQkgICBzdGEtPmFkZHIsIG5zcyk7CisKKwkJZXJyID0g YXRoMTJrX3dtaV9zZXRfcGVlcl9wYXJhbShhciwgc3RhLT5hZGRyLCBhcnZpZi0+dmRldl9pZCwK KwkJCQkJCVdNSV9QRUVSX05TUywgbnNzKTsKKwkJaWYgKGVycikKKwkJCWF0aDEya193YXJuKGFy LT5hYiwgImZhaWxlZCB0byB1cGRhdGUgU1RBICVwTSBuc3MgJWQ6ICVkXG4iLAorCQkJCSAgICBz dGEtPmFkZHIsIG5zcywgZXJyKTsKKwl9CisKKwlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9SQ19T TVBTX0NIQU5HRUQpIHsKKwkJYXRoMTJrX2RiZyhhci0+YWIsIEFUSDEyS19EQkdfTUFDLCAibWFj IHVwZGF0ZSBzdGEgJXBNIHNtcHMgJWRcbiIsCisJCQkgICBzdGEtPmFkZHIsIHNtcHMpOworCisJ CWVyciA9IGF0aDEya193bWlfc2V0X3BlZXJfcGFyYW0oYXIsIHN0YS0+YWRkciwgYXJ2aWYtPnZk ZXZfaWQsCisJCQkJCQlXTUlfUEVFUl9NSU1PX1BTX1NUQVRFLCBzbXBzKTsKKwkJaWYgKGVycikK KwkJCWF0aDEya193YXJuKGFyLT5hYiwgImZhaWxlZCB0byB1cGRhdGUgU1RBICVwTSBzbXBzICVk OiAlZFxuIiwKKwkJCQkgICAgc3RhLT5hZGRyLCBzbXBzLCBlcnIpOworCX0KKworCWlmIChjaGFu Z2VkICYgSUVFRTgwMjExX1JDX1NVUFBfUkFURVNfQ0hBTkdFRCkgeworCQltYXNrID0gJmFydmlm LT5iaXRyYXRlX21hc2s7CisJCW51bV92aHRfcmF0ZXMgPSBhdGgxMmtfbWFjX2JpdHJhdGVfbWFz a19udW1fdmh0X3JhdGVzKGFyLCBiYW5kLAorCQkJCQkJCQkgICAgICBtYXNrKTsKKworCQkvKiBQ ZWVyX2Fzc29jX3ByZXBhcmUgd2lsbCByZWplY3Qgdmh0IHJhdGVzIGluCisJCSAqIGJpdHJhdGVf bWFzayBpZiBpdHMgbm90IGF2YWlsYWJsZSBpbiByYW5nZSBmb3JtYXQgYW5kCisJCSAqIHNldHMg dmh0IHR4X3JhdGVzZXQgYXMgdW5zdXBwb3J0ZWQuIFNvIG11bHRpcGxlIFZIVCBNQ1MKKwkJICog c2V0dGluZyhlZy4gTUNTIDQsNSw2KSBwZXIgcGVlciBpcyBub3Qgc3VwcG9ydGVkIGhlcmUuCisJ CSAqIEJ1dCwgU2luZ2xlIHJhdGUgaW4gVkhUIG1hc2sgY2FuIGJlIHNldCBhcyBwZXItcGVlcgor CQkgKiBmaXhlZCByYXRlLiBCdXQgZXZlbiBpZiBhbnkgSFQgcmF0ZXMgYXJlIGNvbmZpZ3VyZWQg aW4KKwkJICogdGhlIGJpdHJhdGUgbWFzaywgZGV2aWNlIHdpbGwgbm90IHN3aXRjaCB0byB0aG9z ZSByYXRlcworCQkgKiB3aGVuIHBlci1wZWVyIEZpeGVkIHJhdGUgaXMgc2V0LgorCQkgKiBUT0RP OiBDaGVjayBSQVRFTUFTS19DTURJRCB0byBzdXBwb3J0IGF1dG8gcmF0ZXMgc2VsZWN0aW9uCisJ CSAqIGFjcm9zcyBIVC9WSFQgYW5kIGZvciBtdWx0aXBsZSBWSFQgTUNTIHN1cHBvcnQuCisJCSAq LworCQlpZiAoc3RhLT5kZWZsaW5rLnZodF9jYXAudmh0X3N1cHBvcnRlZCAmJiBudW1fdmh0X3Jh dGVzID09IDEpIHsKKwkJCWF0aDEya19tYWNfc2V0X3BlZXJfdmh0X2ZpeGVkX3JhdGUoYXJ2aWYs IHN0YSwgbWFzaywKKwkJCQkJCQkgICBiYW5kKTsKKwkJfSBlbHNlIHsKKwkJCS8qIElmIHRoZSBw ZWVyIGlzIG5vbi1WSFQgb3Igbm8gZml4ZWQgVkhUIHJhdGUKKwkJCSAqIGlzIHByb3ZpZGVkIGlu IHRoZSBuZXcgYml0cmF0ZSBtYXNrIHdlIHNldCB0aGUKKwkJCSAqIG90aGVyIHJhdGVzIHVzaW5n IHBlZXJfYXNzb2MgY29tbWFuZC4KKwkJCSAqLworCQkJYXRoMTJrX3BlZXJfYXNzb2NfcHJlcGFy ZShhciwgYXJ2aWYtPnZpZiwgc3RhLAorCQkJCQkJICAmcGVlcl9hcmcsIHRydWUpOworCisJCQll cnIgPSBhdGgxMmtfd21pX3NlbmRfcGVlcl9hc3NvY19jbWQoYXIsICZwZWVyX2FyZyk7CisJCQlp ZiAoZXJyKQorCQkJCWF0aDEya193YXJuKGFyLT5hYiwgImZhaWxlZCB0byBydW4gcGVlciBhc3Nv YyBmb3IgU1RBICVwTSB2ZGV2ICVpOiAlZFxuIiwKKwkJCQkJICAgIHN0YS0+YWRkciwgYXJ2aWYt PnZkZXZfaWQsIGVycik7CisKKwkJCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZh ci0+cGVlcl9hc3NvY19kb25lLCAxICogSFopKQorCQkJCWF0aDEya193YXJuKGFyLT5hYiwgImZh aWxlZCB0byBnZXQgcGVlciBhc3NvYyBjb25mIGV2ZW50IGZvciAlcE0gdmRldiAlaVxuIiwKKwkJ CQkJICAgIHN0YS0+YWRkciwgYXJ2aWYtPnZkZXZfaWQpOworCQl9CisJfQorCisJbXV0ZXhfdW5s b2NrKCZhci0+Y29uZl9tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgYXRoMTJrX21hY19pbmNfbnVt X3N0YXRpb25zKHN0cnVjdCBhdGgxMmtfdmlmICphcnZpZiwKKwkJCQkgICAgICAgc3RydWN0IGll ZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlzdHJ1Y3QgYXRoMTJrICphciA9IGFydmlmLT5hcjsKKwor CWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFyLT5jb25mX211dGV4KTsKKworCWlmIChhcnZpZi0+dmRl dl90eXBlID09IFdNSV9WREVWX1RZUEVfU1RBICYmICFzdGEtPnRkbHMpCisJCXJldHVybiAwOwor CisJaWYgKGFyLT5udW1fc3RhdGlvbnMgPj0gYXItPm1heF9udW1fc3RhdGlvbnMpCisJCXJldHVy biAtRU5PQlVGUzsKKworCWFyLT5udW1fc3RhdGlvbnMrKzsKKworCXJldHVybiAwOworfQorCitz dGF0aWMgdm9pZCBhdGgxMmtfbWFjX2RlY19udW1fc3RhdGlvbnMoc3RydWN0IGF0aDEya192aWYg KmFydmlmLAorCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCXN0cnVjdCBhdGgx MmsgKmFyID0gYXJ2aWYtPmFyOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYXItPmNvbmZfbXV0 ZXgpOworCisJaWYgKGFydmlmLT52ZGV2X3R5cGUgPT0gV01JX1ZERVZfVFlQRV9TVEEgJiYgIXN0 YS0+dGRscykKKwkJcmV0dXJuOworCisJYXItPm51bV9zdGF0aW9ucy0tOworfQorCitzdGF0aWMg aW50IGF0aDEya19tYWNfc3RhdGlvbl9hZGQoc3RydWN0IGF0aDEyayAqYXIsCisJCQkJICBzdHJ1 Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkK K3sKKwlzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiID0gYXItPmFiOworCXN0cnVjdCBhdGgxMmtfdmlm ICphcnZpZiA9IGF0aDEya192aWZfdG9fYXJ2aWYodmlmKTsKKwlzdHJ1Y3QgYXRoMTJrX3N0YSAq YXJzdGEgPSAoc3RydWN0IGF0aDEya19zdGEgKilzdGEtPmRydl9wcml2OworCXN0cnVjdCBhdGgx Mmtfd21pX3BlZXJfY3JlYXRlX2FyZyBwZWVyX3BhcmFtOworCWludCByZXQ7CisKKwlsb2NrZGVw X2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7CisKKwlyZXQgPSBhdGgxMmtfbWFjX2luY19u dW1fc3RhdGlvbnMoYXJ2aWYsIHN0YSk7CisJaWYgKHJldCkgeworCQlhdGgxMmtfd2FybihhYiwg InJlZnVzaW5nIHRvIGFzc29jaWF0ZSBzdGF0aW9uOiB0b28gbWFueSBjb25uZWN0ZWQgYWxyZWFk eSAoJWQpXG4iLAorCQkJICAgIGFyLT5tYXhfbnVtX3N0YXRpb25zKTsKKwkJZ290byBleGl0Owor CX0KKworCWFyc3RhLT5yeF9zdGF0cyA9IGt6YWxsb2Moc2l6ZW9mKCphcnN0YS0+cnhfc3RhdHMp LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFyc3RhLT5yeF9zdGF0cykgeworCQlyZXQgPSAtRU5PTUVN OworCQlnb3RvIGRlY19udW1fc3RhdGlvbjsKKwl9CisKKwlwZWVyX3BhcmFtLnZkZXZfaWQgPSBh cnZpZi0+dmRldl9pZDsKKwlwZWVyX3BhcmFtLnBlZXJfYWRkciA9IHN0YS0+YWRkcjsKKwlwZWVy X3BhcmFtLnBlZXJfdHlwZSA9IFdNSV9QRUVSX1RZUEVfREVGQVVMVDsKKworCXJldCA9IGF0aDEy a19wZWVyX2NyZWF0ZShhciwgYXJ2aWYsIHN0YSwgJnBlZXJfcGFyYW0pOworCWlmIChyZXQpIHsK KwkJYXRoMTJrX3dhcm4oYWIsICJGYWlsZWQgdG8gYWRkIHBlZXI6ICVwTSBmb3IgVkRFVjogJWRc biIsCisJCQkgICAgc3RhLT5hZGRyLCBhcnZpZi0+dmRldl9pZCk7CisJCWdvdG8gZnJlZV9wZWVy OworCX0KKworCWF0aDEya19kYmcoYWIsIEFUSDEyS19EQkdfTUFDLCAiQWRkZWQgcGVlcjogJXBN IGZvciBWREVWOiAlZFxuIiwKKwkJICAgc3RhLT5hZGRyLCBhcnZpZi0+dmRldl9pZCk7CisKKwlp ZiAoaWVlZTgwMjExX3ZpZl9pc19tZXNoKHZpZikpIHsKKwkJcmV0ID0gYXRoMTJrX3dtaV9zZXRf cGVlcl9wYXJhbShhciwgc3RhLT5hZGRyLAorCQkJCQkJYXJ2aWYtPnZkZXZfaWQsCisJCQkJCQlX TUlfUEVFUl9VU0VfNEFERFIsIDEpOworCQlpZiAocmV0KSB7CisJCQlhdGgxMmtfd2FybihhYiwg ImZhaWxlZCB0byBTVEEgJXBNIDRhZGRyIGNhcGFiaWxpdHk6ICVkXG4iLAorCQkJCSAgICBzdGEt PmFkZHIsIHJldCk7CisJCQlnb3RvIGZyZWVfcGVlcjsKKwkJfQorCX0KKworCXJldCA9IGF0aDEy a19kcF9wZWVyX3NldHVwKGFyLCBhcnZpZi0+dmRldl9pZCwgc3RhLT5hZGRyKTsKKwlpZiAocmV0 KSB7CisJCWF0aDEya193YXJuKGFiLCAiZmFpbGVkIHRvIHNldHVwIGRwIGZvciBwZWVyICVwTSBv biB2ZGV2ICVpICglZClcbiIsCisJCQkgICAgc3RhLT5hZGRyLCBhcnZpZi0+dmRldl9pZCwgcmV0 KTsKKwkJZ290byBmcmVlX3BlZXI7CisJfQorCisJaWYgKGFiLT5od19wYXJhbXMtPnZkZXZfc3Rh cnRfZGVsYXkgJiYKKwkgICAgIWFydmlmLT5pc19zdGFydGVkICYmCisJICAgIGFydmlmLT52ZGV2 X3R5cGUgIT0gV01JX1ZERVZfVFlQRV9BUCkgeworCQlyZXQgPSBhdGgxMmtfc3RhcnRfdmRldl9k ZWxheShhci0+aHcsIHZpZik7CisJCWlmIChyZXQpIHsKKwkJCWF0aDEya193YXJuKGFiLCAiZmFp bGVkIHRvIGRlbGF5IHZkZXYgc3RhcnQ6ICVkXG4iLCByZXQpOworCQkJZ290byBmcmVlX3BlZXI7 CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworZnJlZV9wZWVyOgorCWF0aDEya19wZWVyX2RlbGV0 ZShhciwgYXJ2aWYtPnZkZXZfaWQsIHN0YS0+YWRkcik7CitkZWNfbnVtX3N0YXRpb246CisJYXRo MTJrX21hY19kZWNfbnVtX3N0YXRpb25zKGFydmlmLCBzdGEpOworZXhpdDoKKwlyZXR1cm4gcmV0 OworfQorCitzdGF0aWMgaW50IGF0aDEya19tYWNfb3Bfc3RhX3N0YXRlKHN0cnVjdCBpZWVlODAy MTFfaHcgKmh3LAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJICAgc3Ry dWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCQkgICBlbnVtIGllZWU4MDIxMV9zdGFfc3RhdGUg b2xkX3N0YXRlLAorCQkJCSAgIGVudW0gaWVlZTgwMjExX3N0YV9zdGF0ZSBuZXdfc3RhdGUpCit7 CisJc3RydWN0IGF0aDEyayAqYXIgPSBody0+cHJpdjsKKwlzdHJ1Y3QgYXRoMTJrX3ZpZiAqYXJ2 aWYgPSBhdGgxMmtfdmlmX3RvX2FydmlmKHZpZik7CisJc3RydWN0IGF0aDEya19zdGEgKmFyc3Rh ID0gKHN0cnVjdCBhdGgxMmtfc3RhICopc3RhLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgYXRoMTJrX3Bl ZXIgKnBlZXI7CisJaW50IHJldCA9IDA7CisKKwkvKiBjYW5jZWwgbXVzdCBiZSBkb25lIG91dHNp ZGUgdGhlIG11dGV4IHRvIGF2b2lkIGRlYWRsb2NrICovCisJaWYgKChvbGRfc3RhdGUgPT0gSUVF RTgwMjExX1NUQV9OT05FICYmCisJICAgICBuZXdfc3RhdGUgPT0gSUVFRTgwMjExX1NUQV9OT1RF WElTVCkpCisJCWNhbmNlbF93b3JrX3N5bmMoJmFyc3RhLT51cGRhdGVfd2spOworCisJbXV0ZXhf bG9jaygmYXItPmNvbmZfbXV0ZXgpOworCisJaWYgKG9sZF9zdGF0ZSA9PSBJRUVFODAyMTFfU1RB X05PVEVYSVNUICYmCisJICAgIG5ld19zdGF0ZSA9PSBJRUVFODAyMTFfU1RBX05PTkUpIHsKKwkJ bWVtc2V0KGFyc3RhLCAwLCBzaXplb2YoKmFyc3RhKSk7CisJCWFyc3RhLT5hcnZpZiA9IGFydmlm OworCQlJTklUX1dPUksoJmFyc3RhLT51cGRhdGVfd2ssIGF0aDEya19zdGFfcmNfdXBkYXRlX3dr KTsKKworCQlyZXQgPSBhdGgxMmtfbWFjX3N0YXRpb25fYWRkKGFyLCB2aWYsIHN0YSk7CisJCWlm IChyZXQpCisJCQlhdGgxMmtfd2Fybihhci0+YWIsICJGYWlsZWQgdG8gYWRkIHN0YXRpb246ICVw TSBmb3IgVkRFVjogJWRcbiIsCisJCQkJICAgIHN0YS0+YWRkciwgYXJ2aWYtPnZkZXZfaWQpOwor CX0gZWxzZSBpZiAoKG9sZF9zdGF0ZSA9PSBJRUVFODAyMTFfU1RBX05PTkUgJiYKKwkJICAgIG5l d19zdGF0ZSA9PSBJRUVFODAyMTFfU1RBX05PVEVYSVNUKSkgeworCQlhdGgxMmtfZHBfcGVlcl9j bGVhbnVwKGFyLCBhcnZpZi0+dmRldl9pZCwgc3RhLT5hZGRyKTsKKworCQlyZXQgPSBhdGgxMmtf cGVlcl9kZWxldGUoYXIsIGFydmlmLT52ZGV2X2lkLCBzdGEtPmFkZHIpOworCQlpZiAocmV0KQor CQkJYXRoMTJrX3dhcm4oYXItPmFiLCAiRmFpbGVkIHRvIGRlbGV0ZSBwZWVyOiAlcE0gZm9yIFZE RVY6ICVkXG4iLAorCQkJCSAgICBzdGEtPmFkZHIsIGFydmlmLT52ZGV2X2lkKTsKKwkJZWxzZQor CQkJYXRoMTJrX2RiZyhhci0+YWIsIEFUSDEyS19EQkdfTUFDLCAiUmVtb3ZlZCBwZWVyOiAlcE0g Zm9yIFZERVY6ICVkXG4iLAorCQkJCSAgIHN0YS0+YWRkciwgYXJ2aWYtPnZkZXZfaWQpOworCisJ CWF0aDEya19tYWNfZGVjX251bV9zdGF0aW9ucyhhcnZpZiwgc3RhKTsKKwkJc3Bpbl9sb2NrX2Jo KCZhci0+YWItPmJhc2VfbG9jayk7CisJCXBlZXIgPSBhdGgxMmtfcGVlcl9maW5kKGFyLT5hYiwg YXJ2aWYtPnZkZXZfaWQsIHN0YS0+YWRkcik7CisJCWlmIChwZWVyICYmIHBlZXItPnN0YSA9PSBz dGEpIHsKKwkJCWF0aDEya193YXJuKGFyLT5hYiwgIkZvdW5kIHBlZXIgZW50cnkgJXBNIG4gdmRl diAlaSBhZnRlciBpdCB3YXMgc3VwcG9zZWRseSByZW1vdmVkXG4iLAorCQkJCSAgICB2aWYtPmFk ZHIsIGFydmlmLT52ZGV2X2lkKTsKKwkJCXBlZXItPnN0YSA9IE5VTEw7CisJCQlsaXN0X2RlbCgm cGVlci0+bGlzdCk7CisJCQlrZnJlZShwZWVyKTsKKwkJCWFyLT5udW1fcGVlcnMtLTsKKwkJfQor CQlzcGluX3VubG9ja19iaCgmYXItPmFiLT5iYXNlX2xvY2spOworCisJCWtmcmVlKGFyc3RhLT5y eF9zdGF0cyk7CisJCWFyc3RhLT5yeF9zdGF0cyA9IE5VTEw7CisJfSBlbHNlIGlmIChvbGRfc3Rh dGUgPT0gSUVFRTgwMjExX1NUQV9BVVRIICYmCisJCSAgIG5ld19zdGF0ZSA9PSBJRUVFODAyMTFf U1RBX0FTU09DICYmCisJCSAgICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKKwkJ ICAgIHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UIHx8CisJCSAgICB2aWYt PnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpKSB7CisJCXJldCA9IGF0aDEya19zdGF0aW9u X2Fzc29jKGFyLCB2aWYsIHN0YSwgZmFsc2UpOworCQlpZiAocmV0KQorCQkJYXRoMTJrX3dhcm4o YXItPmFiLCAiRmFpbGVkIHRvIGFzc29jaWF0ZSBzdGF0aW9uOiAlcE1cbiIsCisJCQkJICAgIHN0 YS0+YWRkcik7CisJfSBlbHNlIGlmIChvbGRfc3RhdGUgPT0gSUVFRTgwMjExX1NUQV9BU1NPQyAm JgorCQkgICBuZXdfc3RhdGUgPT0gSUVFRTgwMjExX1NUQV9BVVRIT1JJWkVEKSB7CisJCXNwaW5f bG9ja19iaCgmYXItPmFiLT5iYXNlX2xvY2spOworCisJCXBlZXIgPSBhdGgxMmtfcGVlcl9maW5k KGFyLT5hYiwgYXJ2aWYtPnZkZXZfaWQsIHN0YS0+YWRkcik7CisJCWlmIChwZWVyKQorCQkJcGVl ci0+aXNfYXV0aG9yaXplZCA9IHRydWU7CisKKwkJc3Bpbl91bmxvY2tfYmgoJmFyLT5hYi0+YmFz ZV9sb2NrKTsKKworCQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYg YXJ2aWYtPmlzX3VwKSB7CisJCQlyZXQgPSBhdGgxMmtfd21pX3NldF9wZWVyX3BhcmFtKGFyLCBz dGEtPmFkZHIsCisJCQkJCQkJYXJ2aWYtPnZkZXZfaWQsCisJCQkJCQkJV01JX1BFRVJfQVVUSE9S SVpFLAorCQkJCQkJCTEpOworCQkJaWYgKHJldCkKKwkJCQlhdGgxMmtfd2Fybihhci0+YWIsICJV bmFibGUgdG8gYXV0aG9yaXplIHBlZXIgJXBNIHZkZXYgJWQ6ICVkXG4iLAorCQkJCQkgICAgc3Rh LT5hZGRyLCBhcnZpZi0+dmRldl9pZCwgcmV0KTsKKwkJfQorCX0gZWxzZSBpZiAob2xkX3N0YXRl ID09IElFRUU4MDIxMV9TVEFfQVVUSE9SSVpFRCAmJgorCQkgICBuZXdfc3RhdGUgPT0gSUVFRTgw MjExX1NUQV9BU1NPQykgeworCQlzcGluX2xvY2tfYmgoJmFyLT5hYi0+YmFzZV9sb2NrKTsKKwor CQlwZWVyID0gYXRoMTJrX3BlZXJfZmluZChhci0+YWIsIGFydmlmLT52ZGV2X2lkLCBzdGEtPmFk ZHIpOworCQlpZiAocGVlcikKKwkJCXBlZXItPmlzX2F1dGhvcml6ZWQgPSBmYWxzZTsKKworCQlz cGluX3VubG9ja19iaCgmYXItPmFiLT5iYXNlX2xvY2spOworCX0gZWxzZSBpZiAob2xkX3N0YXRl ID09IElFRUU4MDIxMV9TVEFfQVNTT0MgJiYKKwkJICAgbmV3X3N0YXRlID09IElFRUU4MDIxMV9T VEFfQVVUSCAmJgorCQkgICAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQIHx8CisJCSAg ICB2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCB8fAorCQkgICAgdmlmLT50 eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSkgeworCQlyZXQgPSBhdGgxMmtfc3RhdGlvbl9k aXNhc3NvYyhhciwgdmlmLCBzdGEpOworCQlpZiAocmV0KQorCQkJYXRoMTJrX3dhcm4oYXItPmFi LCAiRmFpbGVkIHRvIGRpc2Fzc29jaWF0ZSBzdGF0aW9uOiAlcE1cbiIsCisJCQkJICAgIHN0YS0+ YWRkcik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZhci0+Y29uZl9tdXRleCk7CisJcmV0dXJuIHJl dDsKK30KKworc3RhdGljIGludCBhdGgxMmtfbWFjX29wX3N0YV9zZXRfdHhwd3Ioc3RydWN0IGll ZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJ CQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCit7CisJc3RydWN0IGF0aDEyayAq YXIgPSBody0+cHJpdjsKKwlzdHJ1Y3QgYXRoMTJrX3ZpZiAqYXJ2aWYgPSAodm9pZCAqKXZpZi0+ ZHJ2X3ByaXY7CisJaW50IHJldDsKKwlzMTYgdHhwd3I7CisKKwlpZiAoc3RhLT5kZWZsaW5rLnR4 cHdyLnR5cGUgPT0gTkw4MDIxMV9UWF9QT1dFUl9BVVRPTUFUSUMpIHsKKwkJdHhwd3IgPSAwOwor CX0gZWxzZSB7CisJCXR4cHdyID0gc3RhLT5kZWZsaW5rLnR4cHdyLnBvd2VyOworCQlpZiAoIXR4 cHdyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHR4cHdyID4gQVRIMTJLX1RYX1BP V0VSX01BWF9WQUwgfHwgdHhwd3IgPCBBVEgxMktfVFhfUE9XRVJfTUlOX1ZBTCkKKwkJcmV0dXJu IC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZhci0+Y29uZl9tdXRleCk7CisKKwlyZXQgPSBhdGgx Mmtfd21pX3NldF9wZWVyX3BhcmFtKGFyLCBzdGEtPmFkZHIsIGFydmlmLT52ZGV2X2lkLAorCQkJ CQlXTUlfUEVFUl9VU0VfRklYRURfUFdSLCB0eHB3cik7CisJaWYgKHJldCkgeworCQlhdGgxMmtf d2Fybihhci0+YWIsICJmYWlsZWQgdG8gc2V0IHR4IHBvd2VyIGZvciBzdGF0aW9uIHJldDogJWRc biIsCisJCQkgICAgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2Nr KCZhci0+Y29uZl9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYXRoMTJr X21hY19vcF9zdGFfcmNfdXBkYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQlzdHJ1 Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAor CQkJCQl1MzIgY2hhbmdlZCkKK3sKKwlzdHJ1Y3QgYXRoMTJrICphciA9IGh3LT5wcml2OworCXN0 cnVjdCBhdGgxMmtfc3RhICphcnN0YSA9IChzdHJ1Y3QgYXRoMTJrX3N0YSAqKXN0YS0+ZHJ2X3By aXY7CisJc3RydWN0IGF0aDEya192aWYgKmFydmlmID0gKHZvaWQgKil2aWYtPmRydl9wcml2Owor CXN0cnVjdCBhdGgxMmtfcGVlciAqcGVlcjsKKwl1MzIgYncsIHNtcHM7CisKKwlzcGluX2xvY2tf YmgoJmFyLT5hYi0+YmFzZV9sb2NrKTsKKworCXBlZXIgPSBhdGgxMmtfcGVlcl9maW5kKGFyLT5h YiwgYXJ2aWYtPnZkZXZfaWQsIHN0YS0+YWRkcik7CisJaWYgKCFwZWVyKSB7CisJCXNwaW5fdW5s b2NrX2JoKCZhci0+YWItPmJhc2VfbG9jayk7CisJCWF0aDEya193YXJuKGFyLT5hYiwgIm1hYyBz dGEgcmMgdXBkYXRlIGZhaWxlZCB0byBmaW5kIHBlZXIgJXBNIG9uIHZkZXYgJWlcbiIsCisJCQkg ICAgc3RhLT5hZGRyLCBhcnZpZi0+dmRldl9pZCk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX3Vu bG9ja19iaCgmYXItPmFiLT5iYXNlX2xvY2spOworCisJYXRoMTJrX2RiZyhhci0+YWIsIEFUSDEy S19EQkdfTUFDLAorCQkgICAibWFjIHN0YSByYyB1cGRhdGUgZm9yICVwTSBjaGFuZ2VkICUwOHgg YncgJWQgbnNzICVkIHNtcHMgJWRcbiIsCisJCSAgIHN0YS0+YWRkciwgY2hhbmdlZCwgc3RhLT5k ZWZsaW5rLmJhbmR3aWR0aCwgc3RhLT5kZWZsaW5rLnJ4X25zcywKKwkJICAgc3RhLT5kZWZsaW5r LnNtcHNfbW9kZSk7CisKKwlzcGluX2xvY2tfYmgoJmFyLT5kYXRhX2xvY2spOworCisJaWYgKGNo YW5nZWQgJiBJRUVFODAyMTFfUkNfQldfQ0hBTkdFRCkgeworCQlidyA9IFdNSV9QRUVSX0NIV0lE VEhfMjBNSFo7CisKKwkJc3dpdGNoIChzdGEtPmRlZmxpbmsuYmFuZHdpZHRoKSB7CisJCWNhc2Ug SUVFRTgwMjExX1NUQV9SWF9CV18yMDoKKwkJCWJ3ID0gV01JX1BFRVJfQ0hXSURUSF8yME1IWjsK KwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9TVEFfUlhfQldfNDA6CisJCQlidyA9IFdNSV9Q RUVSX0NIV0lEVEhfNDBNSFo7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfU1RBX1JYX0JX XzgwOgorCQkJYncgPSBXTUlfUEVFUl9DSFdJRFRIXzgwTUhaOworCQkJYnJlYWs7CisJCWNhc2Ug SUVFRTgwMjExX1NUQV9SWF9CV18xNjA6CisJCQlidyA9IFdNSV9QRUVSX0NIV0lEVEhfMTYwTUha OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlhdGgxMmtfd2Fybihhci0+YWIsICJJbnZhbGlk IGJhbmR3aWR0aCAlZCBpbiByYyB1cGRhdGUgZm9yICVwTVxuIiwKKwkJCQkgICAgc3RhLT5kZWZs aW5rLmJhbmR3aWR0aCwgc3RhLT5hZGRyKTsKKwkJCWJ3ID0gV01JX1BFRVJfQ0hXSURUSF8yME1I WjsKKwkJCWJyZWFrOworCQl9CisKKwkJYXJzdGEtPmJ3ID0gYnc7CisJfQorCisJaWYgKGNoYW5n ZWQgJiBJRUVFODAyMTFfUkNfTlNTX0NIQU5HRUQpCisJCWFyc3RhLT5uc3MgPSBzdGEtPmRlZmxp bmsucnhfbnNzOworCisJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfUkNfU01QU19DSEFOR0VEKSB7 CisJCXNtcHMgPSBXTUlfUEVFUl9TTVBTX1BTX05PTkU7CisKKwkJc3dpdGNoIChzdGEtPmRlZmxp bmsuc21wc19tb2RlKSB7CisJCWNhc2UgSUVFRTgwMjExX1NNUFNfQVVUT01BVElDOgorCQljYXNl IElFRUU4MDIxMV9TTVBTX09GRjoKKwkJCXNtcHMgPSBXTUlfUEVFUl9TTVBTX1BTX05PTkU7CisJ CQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfU01QU19TVEFUSUM6CisJCQlzbXBzID0gV01JX1BF RVJfU01QU19TVEFUSUM7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfU01QU19EWU5BTUlD OgorCQkJc21wcyA9IFdNSV9QRUVSX1NNUFNfRFlOQU1JQzsKKwkJCWJyZWFrOworCQlkZWZhdWx0 OgorCQkJYXRoMTJrX3dhcm4oYXItPmFiLCAiSW52YWxpZCBzbXBzICVkIGluIHN0YSByYyB1cGRh dGUgZm9yICVwTVxuIiwKKwkJCQkgICAgc3RhLT5kZWZsaW5rLnNtcHNfbW9kZSwgc3RhLT5hZGRy KTsKKwkJCXNtcHMgPSBXTUlfUEVFUl9TTVBTX1BTX05PTkU7CisJCQlicmVhazsKKwkJfQorCisJ CWFyc3RhLT5zbXBzID0gc21wczsKKwl9CisKKwlhcnN0YS0+Y2hhbmdlZCB8PSBjaGFuZ2VkOwor CisJc3Bpbl91bmxvY2tfYmgoJmFyLT5kYXRhX2xvY2spOworCisJaWVlZTgwMjExX3F1ZXVlX3dv cmsoaHcsICZhcnN0YS0+dXBkYXRlX3drKTsKK30KKworc3RhdGljIGludCBhdGgxMmtfY29uZl90 eF91YXBzZChzdHJ1Y3QgYXRoMTJrICphciwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJ CQl1MTYgYWMsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBhdGgxMmtfdmlmICphcnZpZiA9IGF0 aDEya192aWZfdG9fYXJ2aWYodmlmKTsKKwl1MzIgdmFsdWU7CisJaW50IHJldDsKKworCWlmIChh cnZpZi0+dmRldl90eXBlICE9IFdNSV9WREVWX1RZUEVfU1RBKQorCQlyZXR1cm4gMDsKKworCXN3 aXRjaCAoYWMpIHsKKwljYXNlIElFRUU4MDIxMV9BQ19WTzoKKwkJdmFsdWUgPSBXTUlfU1RBX1BT X1VBUFNEX0FDM19ERUxJVkVSWV9FTiB8CisJCQlXTUlfU1RBX1BTX1VBUFNEX0FDM19UUklHR0VS X0VOOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9BQ19WSToKKwkJdmFsdWUgPSBXTUlfU1RB X1BTX1VBUFNEX0FDMl9ERUxJVkVSWV9FTiB8CisJCQlXTUlfU1RBX1BTX1VBUFNEX0FDMl9UUklH R0VSX0VOOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9BQ19CRToKKwkJdmFsdWUgPSBXTUlf U1RBX1BTX1VBUFNEX0FDMV9ERUxJVkVSWV9FTiB8CisJCQlXTUlfU1RBX1BTX1VBUFNEX0FDMV9U UklHR0VSX0VOOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9BQ19CSzoKKwkJdmFsdWUgPSBX TUlfU1RBX1BTX1VBUFNEX0FDMF9ERUxJVkVSWV9FTiB8CisJCQlXTUlfU1RBX1BTX1VBUFNEX0FD MF9UUklHR0VSX0VOOworCQlicmVhazsKKwl9CisKKwlpZiAoZW5hYmxlKQorCQlhcnZpZi0+dS5z dGEudWFwc2QgfD0gdmFsdWU7CisJZWxzZQorCQlhcnZpZi0+dS5zdGEudWFwc2QgJj0gfnZhbHVl OworCisJcmV0ID0gYXRoMTJrX3dtaV9zZXRfc3RhX3BzX3BhcmFtKGFyLCBhcnZpZi0+dmRldl9p ZCwKKwkJCQkJICBXTUlfU1RBX1BTX1BBUkFNX1VBUFNELAorCQkJCQkgIGFydmlmLT51LnN0YS51 YXBzZCk7CisJaWYgKHJldCkgeworCQlhdGgxMmtfd2Fybihhci0+YWIsICJjb3VsZCBub3Qgc2V0 IHVhcHNkIHBhcmFtcyAlZFxuIiwgcmV0KTsKKwkJZ290byBleGl0OworCX0KKworCWlmIChhcnZp Zi0+dS5zdGEudWFwc2QpCisJCXZhbHVlID0gV01JX1NUQV9QU19SWF9XQUtFX1BPTElDWV9QT0xM X1VBUFNEOworCWVsc2UKKwkJdmFsdWUgPSBXTUlfU1RBX1BTX1JYX1dBS0VfUE9MSUNZX1dBS0U7 CisKKwlyZXQgPSBhdGgxMmtfd21pX3NldF9zdGFfcHNfcGFyYW0oYXIsIGFydmlmLT52ZGV2X2lk LAorCQkJCQkgIFdNSV9TVEFfUFNfUEFSQU1fUlhfV0FLRV9QT0xJQ1ksCisJCQkJCSAgdmFsdWUp OworCWlmIChyZXQpCisJCWF0aDEya193YXJuKGFyLT5hYiwgImNvdWxkIG5vdCBzZXQgcnggd2Fr ZSBwYXJhbSAlZFxuIiwgcmV0KTsKKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMg aW50IGF0aDEya19tYWNfb3BfY29uZl90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkg c3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkgdW5zaWduZWQgaW50IGxpbmtfaWQsIHUx NiBhYywKKwkJCQkgY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9wYXJhbXMgKnBhcmFt cykKK3sKKwlzdHJ1Y3QgYXRoMTJrICphciA9IGh3LT5wcml2OworCXN0cnVjdCBhdGgxMmtfdmlm ICphcnZpZiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwlzdHJ1Y3Qgd21pX3dtbV9wYXJhbXNf YXJnICpwID0gTlVMTDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmYXItPmNvbmZfbXV0ZXgp OworCisJc3dpdGNoIChhYykgeworCWNhc2UgSUVFRTgwMjExX0FDX1ZPOgorCQlwID0gJmFydmlm LT53bW1fcGFyYW1zLmFjX3ZvOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9BQ19WSToKKwkJ cCA9ICZhcnZpZi0+d21tX3BhcmFtcy5hY192aTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFf QUNfQkU6CisJCXAgPSAmYXJ2aWYtPndtbV9wYXJhbXMuYWNfYmU7CisJCWJyZWFrOworCWNhc2Ug SUVFRTgwMjExX0FDX0JLOgorCQlwID0gJmFydmlmLT53bW1fcGFyYW1zLmFjX2JrOworCQlicmVh azsKKwl9CisKKwlpZiAoV0FSTl9PTighcCkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBl eGl0OworCX0KKworCXAtPmN3bWluID0gcGFyYW1zLT5jd19taW47CisJcC0+Y3dtYXggPSBwYXJh bXMtPmN3X21heDsKKwlwLT5haWZzID0gcGFyYW1zLT5haWZzOworCXAtPnR4b3AgPSBwYXJhbXMt PnR4b3A7CisKKwlyZXQgPSBhdGgxMmtfd21pX3NlbmRfd21tX3VwZGF0ZV9jbWQoYXIsIGFydmlm LT52ZGV2X2lkLAorCQkJCQkgICAgICZhcnZpZi0+d21tX3BhcmFtcyk7CisJaWYgKHJldCkgewor CQlhdGgxMmtfd2Fybihhci0+YWIsICJmYWlsZWQgdG8gc2V0IHdtbSBwYXJhbXM6ICVkXG4iLCBy ZXQpOworCQlnb3RvIGV4aXQ7CisJfQorCisJcmV0ID0gYXRoMTJrX2NvbmZfdHhfdWFwc2QoYXIs IHZpZiwgYWMsIHBhcmFtcy0+dWFwc2QpOworCisJaWYgKHJldCkKKwkJYXRoMTJrX3dhcm4oYXIt PmFiLCAiZmFpbGVkIHRvIHNldCBzdGEgdWFwc2Q6ICVkXG4iLCByZXQpOworCitleGl0OgorCW11 dGV4X3VubG9jaygmYXItPmNvbmZfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBz dHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAKK2F0aDEya19jcmVhdGVfaHRfY2FwKHN0cnVjdCBh dGgxMmsgKmFyLCB1MzIgYXJfaHRfY2FwLCB1MzIgcmF0ZV9jYXBfcnhfY2hhaW5tYXNrKQorewor CWludCBpOworCXN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCBodF9jYXAgPSB7MH07CisJdTMy IGFyX3ZodF9jYXAgPSBhci0+cGRldi0+Y2FwLnZodF9jYXA7CisKKwlpZiAoIShhcl9odF9jYXAg JiBXTUlfSFRfQ0FQX0VOQUJMRUQpKQorCQlyZXR1cm4gaHRfY2FwOworCisJaHRfY2FwLmh0X3N1 cHBvcnRlZCA9IDE7CisJaHRfY2FwLmFtcGR1X2ZhY3RvciA9IElFRUU4MDIxMV9IVF9NQVhfQU1Q RFVfNjRLOworCWh0X2NhcC5hbXBkdV9kZW5zaXR5ID0gSUVFRTgwMjExX0hUX01QRFVfREVOU0lU WV9OT05FOworCWh0X2NhcC5jYXAgfD0gSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDA7 CisJaHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfSFRfQ0FQX0RTU1NDQ0s0MDsKKwlodF9jYXAuY2Fw IHw9IFdMQU5fSFRfQ0FQX1NNX1BTX1NUQVRJQyA8PCBJRUVFODAyMTFfSFRfQ0FQX1NNX1BTX1NI SUZUOworCisJaWYgKGFyX2h0X2NhcCAmIFdNSV9IVF9DQVBfSFQyMF9TR0kpCisJCWh0X2NhcC5j YXAgfD0gSUVFRTgwMjExX0hUX0NBUF9TR0lfMjA7CisKKwlpZiAoYXJfaHRfY2FwICYgV01JX0hU X0NBUF9IVDQwX1NHSSkKKwkJaHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MDsK KworCWlmIChhcl9odF9jYXAgJiBXTUlfSFRfQ0FQX0RZTkFNSUNfU01QUykgeworCQl1MzIgc21w czsKKworCQlzbXBzICAgPSBXTEFOX0hUX0NBUF9TTV9QU19EWU5BTUlDOworCQlzbXBzIDw8PSBJ RUVFODAyMTFfSFRfQ0FQX1NNX1BTX1NISUZUOworCisJCWh0X2NhcC5jYXAgfD0gc21wczsKKwl9 CisKKwlpZiAoYXJfaHRfY2FwICYgV01JX0hUX0NBUF9UWF9TVEJDKQorCQlodF9jYXAuY2FwIHw9 IElFRUU4MDIxMV9IVF9DQVBfVFhfU1RCQzsKKworCWlmIChhcl9odF9jYXAgJiBXTUlfSFRfQ0FQ X1JYX1NUQkMpIHsKKwkJdTMyIHN0YmM7CisKKwkJc3RiYyAgID0gYXJfaHRfY2FwOworCQlzdGJj ICAmPSBXTUlfSFRfQ0FQX1JYX1NUQkM7CisJCXN0YmMgPj49IFdNSV9IVF9DQVBfUlhfU1RCQ19N QVNLX1NISUZUOworCQlzdGJjIDw8PSBJRUVFODAyMTFfSFRfQ0FQX1JYX1NUQkNfU0hJRlQ7CisJ CXN0YmMgICY9IElFRUU4MDIxMV9IVF9DQVBfUlhfU1RCQzsKKworCQlodF9jYXAuY2FwIHw9IHN0 YmM7CisJfQorCisJaWYgKGFyX2h0X2NhcCAmIFdNSV9IVF9DQVBfUlhfTERQQykKKwkJaHRfY2Fw LmNhcCB8PSBJRUVFODAyMTFfSFRfQ0FQX0xEUENfQ09ESU5HOworCisJaWYgKGFyX2h0X2NhcCAm IFdNSV9IVF9DQVBfTF9TSUdfVFhPUF9QUk9UKQorCQlodF9jYXAuY2FwIHw9IElFRUU4MDIxMV9I VF9DQVBfTFNJR19UWE9QX1BST1Q7CisKKwlpZiAoYXJfdmh0X2NhcCAmIFdNSV9WSFRfQ0FQX01B WF9NUERVX0xFTl9NQVNLKQorCQlodF9jYXAuY2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfTUFYX0FN U0RVOworCisJZm9yIChpID0gMDsgaSA8IGFyLT5udW1fcnhfY2hhaW5zOyBpKyspIHsKKwkJaWYg KHJhdGVfY2FwX3J4X2NoYWlubWFzayAmIEJJVChpKSkKKwkJCWh0X2NhcC5tY3MucnhfbWFza1tp XSA9IDB4RkY7CisJfQorCisJaHRfY2FwLm1jcy50eF9wYXJhbXMgfD0gSUVFRTgwMjExX0hUX01D U19UWF9ERUZJTkVEOworCisJcmV0dXJuIGh0X2NhcDsKK30KKworc3RhdGljIGludCBhdGgxMmtf bWFjX3NldF90eGJmX2NvbmYoc3RydWN0IGF0aDEya192aWYgKmFydmlmKQoreworCXUzMiB2YWx1 ZSA9IDA7CisJc3RydWN0IGF0aDEyayAqYXIgPSBhcnZpZi0+YXI7CisJaW50IG5zdHM7CisJaW50 IHNvdW5kX2RpbTsKKwl1MzIgdmh0X2NhcCA9IGFyLT5wZGV2LT5jYXAudmh0X2NhcDsKKwl1MzIg dmRldl9wYXJhbSA9IFdNSV9WREVWX1BBUkFNX1RYQkY7CisKKwlpZiAodmh0X2NhcCAmIChJRUVF ODAyMTFfVkhUX0NBUF9TVV9CRUFNRk9STUVFX0NBUEFCTEUpKSB7CisJCW5zdHMgPSB2aHRfY2Fw ICYgSUVFRTgwMjExX1ZIVF9DQVBfQkVBTUZPUk1FRV9TVFNfTUFTSzsKKwkJbnN0cyA+Pj0gSUVF RTgwMjExX1ZIVF9DQVBfQkVBTUZPUk1FRV9TVFNfU0hJRlQ7CisJCXZhbHVlIHw9IFNNKG5zdHMs IFdNSV9UWEJGX1NUU19DQVBfT0ZGU0VUKTsKKwl9CisKKwlpZiAodmh0X2NhcCAmIChJRUVFODAy MTFfVkhUX0NBUF9TVV9CRUFNRk9STUVSX0NBUEFCTEUpKSB7CisJCXNvdW5kX2RpbSA9IHZodF9j YXAgJgorCQkJICAgIElFRUU4MDIxMV9WSFRfQ0FQX1NPVU5ESU5HX0RJTUVOU0lPTlNfTUFTSzsK KwkJc291bmRfZGltID4+PSBJRUVFODAyMTFfVkhUX0NBUF9TT1VORElOR19ESU1FTlNJT05TX1NI SUZUOworCQlpZiAoc291bmRfZGltID4gKGFyLT5udW1fdHhfY2hhaW5zIC0gMSkpCisJCQlzb3Vu ZF9kaW0gPSBhci0+bnVtX3R4X2NoYWlucyAtIDE7CisJCXZhbHVlIHw9IFNNKHNvdW5kX2RpbSwg V01JX0JGX1NPVU5EX0RJTV9PRkZTRVQpOworCX0KKworCWlmICghdmFsdWUpCisJCXJldHVybiAw OworCisJaWYgKHZodF9jYXAgJiBJRUVFODAyMTFfVkhUX0NBUF9TVV9CRUFNRk9STUVSX0NBUEFC TEUpIHsKKwkJdmFsdWUgfD0gV01JX1ZERVZfUEFSQU1fVFhCRl9TVV9UWF9CRkVSOworCisJCWlm ICgodmh0X2NhcCAmIElFRUU4MDIxMV9WSFRfQ0FQX01VX0JFQU1GT1JNRVJfQ0FQQUJMRSkgJiYK KwkJICAgIGFydmlmLT52ZGV2X3R5cGUgPT0gV01JX1ZERVZfVFlQRV9BUCkKKwkJCXZhbHVlIHw9 IFdNSV9WREVWX1BBUkFNX1RYQkZfTVVfVFhfQkZFUjsKKwl9CisKKwlpZiAodmh0X2NhcCAmIElF RUU4MDIxMV9WSFRfQ0FQX1NVX0JFQU1GT1JNRUVfQ0FQQUJMRSkgeworCQl2YWx1ZSB8PSBXTUlf VkRFVl9QQVJBTV9UWEJGX1NVX1RYX0JGRUU7CisKKwkJaWYgKCh2aHRfY2FwICYgSUVFRTgwMjEx X1ZIVF9DQVBfTVVfQkVBTUZPUk1FRV9DQVBBQkxFKSAmJgorCQkgICAgYXJ2aWYtPnZkZXZfdHlw ZSA9PSBXTUlfVkRFVl9UWVBFX1NUQSkKKwkJCXZhbHVlIHw9IFdNSV9WREVWX1BBUkFNX1RYQkZf TVVfVFhfQkZFRTsKKwl9CisKKwlyZXR1cm4gYXRoMTJrX3dtaV92ZGV2X3NldF9wYXJhbV9jbWQo YXIsIGFydmlmLT52ZGV2X2lkLAorCQkJCQkgICAgIHZkZXZfcGFyYW0sIHZhbHVlKTsKK30KKwor c3RhdGljIHZvaWQgYXRoMTJrX3NldF92aHRfdHhiZl9jYXAoc3RydWN0IGF0aDEyayAqYXIsIHUz MiAqdmh0X2NhcCkKK3sKKwlib29sIHN1YmZlciwgc3ViZmVlOworCWludCBzb3VuZF9kaW0gPSAw OworCisJc3ViZmVyID0gISEoKnZodF9jYXAgJiAoSUVFRTgwMjExX1ZIVF9DQVBfU1VfQkVBTUZP Uk1FUl9DQVBBQkxFKSk7CisJc3ViZmVlID0gISEoKnZodF9jYXAgJiAoSUVFRTgwMjExX1ZIVF9D QVBfU1VfQkVBTUZPUk1FRV9DQVBBQkxFKSk7CisKKwlpZiAoYXItPm51bV90eF9jaGFpbnMgPCAy KSB7CisJCSp2aHRfY2FwICY9IH4oSUVFRTgwMjExX1ZIVF9DQVBfU1VfQkVBTUZPUk1FUl9DQVBB QkxFKTsKKwkJc3ViZmVyID0gZmFsc2U7CisJfQorCisJLyogSWYgU1UgQmVhZm9ybWVyIGlzIG5v dCBzZXQsIHRoZW4gZGlzYWJsZSBNVSBCZWFtZm9ybWVyIENhcGFiaWxpdHkgKi8KKwlpZiAoIXN1 YmZlcikKKwkJKnZodF9jYXAgJj0gfihJRUVFODAyMTFfVkhUX0NBUF9NVV9CRUFNRk9STUVSX0NB UEFCTEUpOworCisJLyogSWYgU1UgQmVhZm9ybWVlIGlzIG5vdCBzZXQsIHRoZW4gZGlzYWJsZSBN VSBCZWFtZm9ybWVlIENhcGFiaWxpdHkgKi8KKwlpZiAoIXN1YmZlZSkKKwkJKnZodF9jYXAgJj0g fihJRUVFODAyMTFfVkhUX0NBUF9NVV9CRUFNRk9STUVFX0NBUEFCTEUpOworCisJc291bmRfZGlt ID0gdTMyX2dldF9iaXRzKCp2aHRfY2FwLAorCQkJCSBJRUVFODAyMTFfVkhUX0NBUF9TT1VORElO R19ESU1FTlNJT05TX01BU0spOworCSp2aHRfY2FwID0gdTMyX3JlcGxhY2VfYml0cygqdmh0X2Nh cCwgMCwKKwkJCQkgICAgSUVFRTgwMjExX1ZIVF9DQVBfU09VTkRJTkdfRElNRU5TSU9OU19NQVNL KTsKKworCS8qIFRPRE86IE5lZWQgdG8gY2hlY2sgaW52YWxpZCBTVFMgYW5kIFNvdW5kX2RpbSB2 YWx1ZXMgc2V0IGJ5IEZXPyAqLworCisJLyogRW5hYmxlIFNvdW5kaW5nIERpbWVuc2lvbiBGaWVs ZCBvbmx5IGlmIFNVIEJGIGlzIGVuYWJsZWQgKi8KKwlpZiAoc3ViZmVyKSB7CisJCWlmIChzb3Vu ZF9kaW0gPiAoYXItPm51bV90eF9jaGFpbnMgLSAxKSkKKwkJCXNvdW5kX2RpbSA9IGFyLT5udW1f dHhfY2hhaW5zIC0gMTsKKworCQkqdmh0X2NhcCA9IHUzMl9yZXBsYWNlX2JpdHMoKnZodF9jYXAs IHNvdW5kX2RpbSwKKwkJCQkJICAgIElFRUU4MDIxMV9WSFRfQ0FQX1NPVU5ESU5HX0RJTUVOU0lP TlNfTUFTSyk7CisJfQorCisJLyogVXNlIHRoZSBTVFMgYWR2ZXJ0aXNlZCBieSBGVyB1bmxlc3Mg U1UgQmVhbWZvcm1lZSBpcyBub3Qgc3VwcG9ydGVkKi8KKwlpZiAoIXN1YmZlZSkKKwkJKnZodF9j YXAgJj0gfihJRUVFODAyMTFfVkhUX0NBUF9CRUFNRk9STUVFX1NUU19NQVNLKTsKK30KKworc3Rh dGljIHN0cnVjdCBpZWVlODAyMTFfc3RhX3ZodF9jYXAKK2F0aDEya19jcmVhdGVfdmh0X2NhcChz dHJ1Y3QgYXRoMTJrICphciwgdTMyIHJhdGVfY2FwX3R4X2NoYWlubWFzaywKKwkJICAgICAgdTMy IHJhdGVfY2FwX3J4X2NoYWlubWFzaykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YV92aHRfY2Fw IHZodF9jYXAgPSB7MH07CisJdTE2IHR4bWNzX21hcCwgcnhtY3NfbWFwOworCWludCBpOworCisJ dmh0X2NhcC52aHRfc3VwcG9ydGVkID0gMTsKKwl2aHRfY2FwLmNhcCA9IGFyLT5wZGV2LT5jYXAu dmh0X2NhcDsKKworCWF0aDEya19zZXRfdmh0X3R4YmZfY2FwKGFyLCAmdmh0X2NhcC5jYXApOwor CisJLyogVE9ETzogRW5hYmxlIGJhY2sgVkhUMTYwIG1vZGUgb25jZSBhc3NvY2lhdGlvbiBpc3N1 ZXMgYXJlIGZpeGVkICovCisJLyogRGlzYWJsaW5nIFZIVDE2MCBhbmQgVkhUODArODAgbW9kZXMg Ki8KKwl2aHRfY2FwLmNhcCAmPSB+SUVFRTgwMjExX1ZIVF9DQVBfU1VQUF9DSEFOX1dJRFRIX01B U0s7CisJdmh0X2NhcC5jYXAgJj0gfklFRUU4MDIxMV9WSFRfQ0FQX1NIT1JUX0dJXzE2MDsKKwor CXJ4bWNzX21hcCA9IDA7CisJdHhtY3NfbWFwID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsr KSB7CisJCWlmIChpIDwgYXItPm51bV90eF9jaGFpbnMgJiYgcmF0ZV9jYXBfdHhfY2hhaW5tYXNr ICYgQklUKGkpKQorCQkJdHhtY3NfbWFwIHw9IElFRUU4MDIxMV9WSFRfTUNTX1NVUFBPUlRfMF85 IDw8IChpICogMik7CisJCWVsc2UKKwkJCXR4bWNzX21hcCB8PSBJRUVFODAyMTFfVkhUX01DU19O T1RfU1VQUE9SVEVEIDw8IChpICogMik7CisKKwkJaWYgKGkgPCBhci0+bnVtX3J4X2NoYWlucyAm JiByYXRlX2NhcF9yeF9jaGFpbm1hc2sgJiBCSVQoaSkpCisJCQlyeG1jc19tYXAgfD0gSUVFRTgw MjExX1ZIVF9NQ1NfU1VQUE9SVF8wXzkgPDwgKGkgKiAyKTsKKwkJZWxzZQorCQkJcnhtY3NfbWFw IHw9IElFRUU4MDIxMV9WSFRfTUNTX05PVF9TVVBQT1JURUQgPDwgKGkgKiAyKTsKKwl9CisKKwlp ZiAocmF0ZV9jYXBfdHhfY2hhaW5tYXNrIDw9IDEpCisJCXZodF9jYXAuY2FwICY9IH5JRUVFODAy MTFfVkhUX0NBUF9UWFNUQkM7CisKKwl2aHRfY2FwLnZodF9tY3MucnhfbWNzX21hcCA9IGNwdV90 b19sZTE2KHJ4bWNzX21hcCk7CisJdmh0X2NhcC52aHRfbWNzLnR4X21jc19tYXAgPSBjcHVfdG9f bGUxNih0eG1jc19tYXApOworCisJcmV0dXJuIHZodF9jYXA7Cit9CisKK3N0YXRpYyB2b2lkIGF0 aDEya19tYWNfc2V0dXBfaHRfdmh0X2NhcChzdHJ1Y3QgYXRoMTJrICphciwKKwkJCQkJc3RydWN0 IGF0aDEya19wZGV2X2NhcCAqY2FwLAorCQkJCQl1MzIgKmh0X2NhcF9pbmZvKQoreworCXN0cnVj dCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKmJhbmQ7CisJdTMyIHJhdGVfY2FwX3R4X2NoYWlu bWFzazsKKwl1MzIgcmF0ZV9jYXBfcnhfY2hhaW5tYXNrOworCXUzMiBodF9jYXA7CisKKwlyYXRl X2NhcF90eF9jaGFpbm1hc2sgPSBhci0+Y2ZnX3R4X2NoYWlubWFzayA+PiBjYXAtPnR4X2NoYWlu X21hc2tfc2hpZnQ7CisJcmF0ZV9jYXBfcnhfY2hhaW5tYXNrID0gYXItPmNmZ19yeF9jaGFpbm1h c2sgPj4gY2FwLT5yeF9jaGFpbl9tYXNrX3NoaWZ0OworCisJaWYgKGNhcC0+c3VwcG9ydGVkX2Jh bmRzICYgV01JX0hPU1RfV0xBTl8yR19DQVApIHsKKwkJYmFuZCA9ICZhci0+bWFjLnNiYW5kc1tO TDgwMjExX0JBTkRfMkdIWl07CisJCWh0X2NhcCA9IGNhcC0+YmFuZFtOTDgwMjExX0JBTkRfMkdI Wl0uaHRfY2FwX2luZm87CisJCWlmIChodF9jYXBfaW5mbykKKwkJCSpodF9jYXBfaW5mbyA9IGh0 X2NhcDsKKwkJYmFuZC0+aHRfY2FwID0gYXRoMTJrX2NyZWF0ZV9odF9jYXAoYXIsIGh0X2NhcCwK KwkJCQkJCSAgICByYXRlX2NhcF9yeF9jaGFpbm1hc2spOworCX0KKworCWlmIChjYXAtPnN1cHBv cnRlZF9iYW5kcyAmIFdNSV9IT1NUX1dMQU5fNUdfQ0FQICYmCisJICAgIChhci0+YWItPmh3X3Bh cmFtcy0+c2luZ2xlX3BkZXZfb25seSB8fAorCSAgICAgIWFyLT5zdXBwb3J0c182Z2h6KSkgewor CQliYW5kID0gJmFyLT5tYWMuc2JhbmRzW05MODAyMTFfQkFORF81R0haXTsKKwkJaHRfY2FwID0g Y2FwLT5iYW5kW05MODAyMTFfQkFORF81R0haXS5odF9jYXBfaW5mbzsKKwkJaWYgKGh0X2NhcF9p bmZvKQorCQkJKmh0X2NhcF9pbmZvID0gaHRfY2FwOworCQliYW5kLT5odF9jYXAgPSBhdGgxMmtf Y3JlYXRlX2h0X2NhcChhciwgaHRfY2FwLAorCQkJCQkJICAgIHJhdGVfY2FwX3J4X2NoYWlubWFz ayk7CisJCWJhbmQtPnZodF9jYXAgPSBhdGgxMmtfY3JlYXRlX3ZodF9jYXAoYXIsIHJhdGVfY2Fw X3R4X2NoYWlubWFzaywKKwkJCQkJCSAgICAgIHJhdGVfY2FwX3J4X2NoYWlubWFzayk7CisJfQor fQorCitzdGF0aWMgaW50IGF0aDEya19jaGVja19jaGFpbl9tYXNrKHN0cnVjdCBhdGgxMmsgKmFy LCB1MzIgYW50LCBib29sIGlzX3R4X2FudCkKK3sKKwkvKiBUT0RPOiBDaGVjayB0aGUgcmVxdWVz dCBjaGFpbm1hc2sgYWdhaW5zdCB0aGUgc3VwcG9ydGVkCisJICogY2hhaW5tYXNrIHRhYmxlIHdo aWNoIGlzIGFkdmVydGlzZWQgaW4gZXh0ZW50ZWRfc2VydmljZV9yZWFkeSBldmVudAorCSAqLwor CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF0aDEya19nZW5fcHBlX3RocmVzaChzdHJ1 Y3QgYXRoMTJrX3dtaV9wcGVfdGhyZXNob2xkX2FyZyAqZndfcHBldCwKKwkJCQkgIHU4ICpoZV9w cGV0KQoreworCWludCBuc3MsIHJ1OworCXU4IGJpdCA9IDc7CisKKwloZV9wcGV0WzBdID0gZndf cHBldC0+bnVtc3NfbTEgJiBJRUVFODAyMTFfUFBFX1RIUkVTX05TU19NQVNLOworCWhlX3BwZXRb MF0gfD0gKGZ3X3BwZXQtPnJ1X2JpdF9tYXNrIDw8CisJCSAgICAgICBJRUVFODAyMTFfUFBFX1RI UkVTX1JVX0lOREVYX0JJVE1BU0tfUE9TKSAmCisJCSAgICAgIElFRUU4MDIxMV9QUEVfVEhSRVNf UlVfSU5ERVhfQklUTUFTS19NQVNLOworCWZvciAobnNzID0gMDsgbnNzIDw9IGZ3X3BwZXQtPm51 bXNzX20xOyBuc3MrKykgeworCQlmb3IgKHJ1ID0gMDsgcnUgPCA0OyBydSsrKSB7CisJCQl1OCB2 YWw7CisJCQlpbnQgaTsKKworCQkJaWYgKChmd19wcGV0LT5ydV9iaXRfbWFzayAmIEJJVChydSkp ID09IDApCisJCQkJY29udGludWU7CisJCQl2YWwgPSAoZndfcHBldC0+cHBldDE2X3BwZXQ4X3J1 M19ydTBbbnNzXSA+PiAocnUgKiA2KSkgJgorCQkJICAgICAgIDB4M2Y7CisJCQl2YWwgPSAoKHZh bCA+PiAzKSAmIDB4NykgfCAoKHZhbCAmIDB4NykgPDwgMyk7CisJCQlmb3IgKGkgPSA1OyBpID49 IDA7IGktLSkgeworCQkJCWhlX3BwZXRbYml0IC8gOF0gfD0KKwkJCQkJKCh2YWwgPj4gaSkgJiAw eDEpIDw8ICgoYml0ICUgOCkpOworCQkJCWJpdCsrOworCQkJfQorCQl9CisJfQorfQorCitzdGF0 aWMgdm9pZAorYXRoMTJrX21hY19maWx0ZXJfaGVfY2FwX21lc2goc3RydWN0IGllZWU4MDIxMV9o ZV9jYXBfZWxlbSAqaGVfY2FwX2VsZW0pCit7CisJdTggbTsKKworCW0gPSBJRUVFODAyMTFfSEVf TUFDX0NBUDBfVFdUX1JFUyB8CisJICAgIElFRUU4MDIxMV9IRV9NQUNfQ0FQMF9UV1RfUkVROwor CWhlX2NhcF9lbGVtLT5tYWNfY2FwX2luZm9bMF0gJj0gfm07CisKKwltID0gSUVFRTgwMjExX0hF X01BQ19DQVAyX1RSUyB8CisJICAgIElFRUU4MDIxMV9IRV9NQUNfQ0FQMl9CQ0FTVF9UV1QgfAor CSAgICBJRUVFODAyMTFfSEVfTUFDX0NBUDJfTVVfQ0FTQ0FESU5HOworCWhlX2NhcF9lbGVtLT5t YWNfY2FwX2luZm9bMl0gJj0gfm07CisKKwltID0gSUVFRTgwMjExX0hFX01BQ19DQVAzX0ZMRVhf VFdUX1NDSEVEIHwKKwkgICAgSUVFRTgwMjExX0hFX01BQ19DQVAyX0JDQVNUX1RXVCB8CisJICAg IElFRUU4MDIxMV9IRV9NQUNfQ0FQMl9NVV9DQVNDQURJTkc7CisJaGVfY2FwX2VsZW0tPm1hY19j YXBfaW5mb1szXSAmPSB+bTsKKworCW0gPSBJRUVFODAyMTFfSEVfTUFDX0NBUDRfQlNSUF9CUVJQ X0FfTVBEVV9BR0cgfAorCSAgICBJRUVFODAyMTFfSEVfTUFDX0NBUDRfQlFSOworCWhlX2NhcF9l bGVtLT5tYWNfY2FwX2luZm9bNF0gJj0gfm07CisKKwltID0gSUVFRTgwMjExX0hFX01BQ19DQVA1 X1NVQkNIQU5fU0VMRUNUSVZFX1RSQU5TTUlTU0lPTiB8CisJICAgIElFRUU4MDIxMV9IRV9NQUNf Q0FQNV9VTF8yeDk5Nl9UT05FX1JVIHwKKwkgICAgSUVFRTgwMjExX0hFX01BQ19DQVA1X1BVTkNU VVJFRF9TT1VORElORyB8CisJICAgIElFRUU4MDIxMV9IRV9NQUNfQ0FQNV9IVF9WSFRfVFJJR19G UkFNRV9SWDsKKwloZV9jYXBfZWxlbS0+bWFjX2NhcF9pbmZvWzVdICY9IH5tOworCisJbSA9IElF RUU4MDIxMV9IRV9QSFlfQ0FQMl9VTF9NVV9GVUxMX01VX01JTU8gfAorCSAgICBJRUVFODAyMTFf SEVfUEhZX0NBUDJfVUxfTVVfUEFSVElBTF9NVV9NSU1POworCWhlX2NhcF9lbGVtLT5waHlfY2Fw X2luZm9bMl0gJj0gfm07CisKKwltID0gSUVFRTgwMjExX0hFX1BIWV9DQVAzX1JYX1BBUlRJQUxf QldfU1VfSU5fMjBNSFpfTVUgfAorCSAgICBJRUVFODAyMTFfSEVfUEhZX0NBUDNfRENNX01BWF9D T05TVF9UWF9NQVNLIHwKKwkgICAgSUVFRTgwMjExX0hFX1BIWV9DQVAzX0RDTV9NQVhfQ09OU1Rf UlhfTUFTSzsKKwloZV9jYXBfZWxlbS0+cGh5X2NhcF9pbmZvWzNdICY9IH5tOworCisJbSA9IElF RUU4MDIxMV9IRV9QSFlfQ0FQNF9NVV9CRUFNRk9STUVSOworCWhlX2NhcF9lbGVtLT5waHlfY2Fw X2luZm9bNF0gJj0gfm07CisKKwltID0gSUVFRTgwMjExX0hFX1BIWV9DQVA1X05HMTZfTVVfRkVF REJBQ0s7CisJaGVfY2FwX2VsZW0tPnBoeV9jYXBfaW5mb1s1XSAmPSB+bTsKKworCW0gPSBJRUVF ODAyMTFfSEVfUEhZX0NBUDZfQ09ERUJPT0tfU0laRV83NV9NVSB8CisJICAgIElFRUU4MDIxMV9I RV9QSFlfQ0FQNl9UUklHX01VX0JFQU1GT1JNSU5HX1BBUlRJQUxfQldfRkIgfAorCSAgICBJRUVF ODAyMTFfSEVfUEhZX0NBUDZfVFJJR19DUUlfRkIgfAorCSAgICBJRUVFODAyMTFfSEVfUEhZX0NB UDZfUEFSVElBTF9CQU5EV0lEVEhfRExfTVVNSU1POworCWhlX2NhcF9lbGVtLT5waHlfY2FwX2lu Zm9bNl0gJj0gfm07CisKKwltID0gSUVFRTgwMjExX0hFX1BIWV9DQVA3X1BTUl9CQVNFRF9TUiB8 CisJICAgIElFRUU4MDIxMV9IRV9QSFlfQ0FQN19QT1dFUl9CT09TVF9GQUNUT1JfU1VQUCB8CisJ ICAgIElFRUU4MDIxMV9IRV9QSFlfQ0FQN19TVEJDX1RYX0FCT1ZFXzgwTUhaIHwKKwkgICAgSUVF RTgwMjExX0hFX1BIWV9DQVA3X1NUQkNfUlhfQUJPVkVfODBNSFo7CisJaGVfY2FwX2VsZW0tPnBo eV9jYXBfaW5mb1s3XSAmPSB+bTsKKworCW0gPSBJRUVFODAyMTFfSEVfUEhZX0NBUDhfSEVfRVJf U1VfUFBEVV80WExURl9BTkRfMDhfVVNfR0kgfAorCSAgICBJRUVFODAyMTFfSEVfUEhZX0NBUDhf MjBNSFpfSU5fNDBNSFpfSEVfUFBEVV9JTl8yRyB8CisJICAgIElFRUU4MDIxMV9IRV9QSFlfQ0FQ OF8yME1IWl9JTl8xNjBNSFpfSEVfUFBEVSB8CisJICAgIElFRUU4MDIxMV9IRV9QSFlfQ0FQOF84 ME1IWl9JTl8xNjBNSFpfSEVfUFBEVTsKKwloZV9jYXBfZWxlbS0+cGh5X2NhcF9pbmZvWzhdICY9 IH5tOworCisJbSA9IElFRUU4MDIxMV9IRV9QSFlfQ0FQOV9MT05HRVJfVEhBTl8xNl9TSUdCX09G RE1fU1lNIHwKKwkgICAgSUVFRTgwMjExX0hFX1BIWV9DQVA5X05PTl9UUklHR0VSRURfQ1FJX0ZF RURCQUNLIHwKKwkgICAgSUVFRTgwMjExX0hFX1BIWV9DQVA5X1JYXzEwMjRfUUFNX0xFU1NfVEhB Tl8yNDJfVE9ORV9SVSB8CisJICAgIElFRUU4MDIxMV9IRV9QSFlfQ0FQOV9UWF8xMDI0X1FBTV9M RVNTX1RIQU5fMjQyX1RPTkVfUlUgfAorCSAgICBJRUVFODAyMTFfSEVfUEhZX0NBUDlfUlhfRlVM TF9CV19TVV9VU0lOR19NVV9XSVRIX0NPTVBfU0lHQiB8CisJICAgIElFRUU4MDIxMV9IRV9QSFlf Q0FQOV9SWF9GVUxMX0JXX1NVX1VTSU5HX01VX1dJVEhfTk9OX0NPTVBfU0lHQjsKKwloZV9jYXBf ZWxlbS0+cGh5X2NhcF9pbmZvWzldICY9IH5tOworfQorCitzdGF0aWMgX19sZTE2IGF0aDEya19t YWNfc2V0dXBfaGVfNmdoel9jYXAoc3RydWN0IGF0aDEya19wZGV2X2NhcCAqcGNhcCwKKwkJCQkJ ICAgc3RydWN0IGF0aDEya19iYW5kX2NhcCAqYmNhcCkKK3sKKwl1OCB2YWw7CisKKwliY2FwLT5o ZV82Z2h6X2NhcGEgPSBJRUVFODAyMTFfSFRfTVBEVV9ERU5TSVRZX05PTkU7CisJaWYgKGJjYXAt Pmh0X2NhcF9pbmZvICYgV01JX0hUX0NBUF9EWU5BTUlDX1NNUFMpCisJCWJjYXAtPmhlXzZnaHpf Y2FwYSB8PQorCQkJdTMyX2VuY29kZV9iaXRzKFdMQU5fSFRfQ0FQX1NNX1BTX0RZTkFNSUMsCisJ CQkJCUlFRUU4MDIxMV9IRV82R0haX0NBUF9TTV9QUyk7CisJZWxzZQorCQliY2FwLT5oZV82Z2h6 X2NhcGEgfD0KKwkJCXUzMl9lbmNvZGVfYml0cyhXTEFOX0hUX0NBUF9TTV9QU19ESVNBQkxFRCwK KwkJCQkJSUVFRTgwMjExX0hFXzZHSFpfQ0FQX1NNX1BTKTsKKwl2YWwgPSB1MzJfZ2V0X2JpdHMo cGNhcC0+dmh0X2NhcCwKKwkJCSAgIElFRUU4MDIxMV9WSFRfQ0FQX01BWF9BX01QRFVfTEVOR1RI X0VYUE9ORU5UX01BU0spOworCWJjYXAtPmhlXzZnaHpfY2FwYSB8PQorCQl1MzJfZW5jb2RlX2Jp dHModmFsLCBJRUVFODAyMTFfSEVfNkdIWl9DQVBfTUFYX0FNUERVX0xFTl9FWFApOworCXZhbCA9 IHUzMl9nZXRfYml0cyhwY2FwLT52aHRfY2FwLAorCQkJICAgSUVFRTgwMjExX1ZIVF9DQVBfTUFY X01QRFVfTUFTSyk7CisJYmNhcC0+aGVfNmdoel9jYXBhIHw9CisJCXUzMl9lbmNvZGVfYml0cyh2 YWwsIElFRUU4MDIxMV9IRV82R0haX0NBUF9NQVhfTVBEVV9MRU4pOworCWlmIChwY2FwLT52aHRf Y2FwICYgSUVFRTgwMjExX1ZIVF9DQVBfUlhfQU5URU5OQV9QQVRURVJOKQorCQliY2FwLT5oZV82 Z2h6X2NhcGEgfD0gSUVFRTgwMjExX0hFXzZHSFpfQ0FQX1JYX0FOVFBBVF9DT05TOworCWlmIChw Y2FwLT52aHRfY2FwICYgSUVFRTgwMjExX1ZIVF9DQVBfVFhfQU5URU5OQV9QQVRURVJOKQorCQli Y2FwLT5oZV82Z2h6X2NhcGEgfD0gSUVFRTgwMjExX0hFXzZHSFpfQ0FQX1RYX0FOVFBBVF9DT05T OworCisJcmV0dXJuIGNwdV90b19sZTE2KGJjYXAtPmhlXzZnaHpfY2FwYSk7Cit9CisKK3N0YXRp YyBpbnQgYXRoMTJrX21hY19jb3B5X2hlX2NhcChzdHJ1Y3QgYXRoMTJrICphciwKKwkJCQkgIHN0 cnVjdCBhdGgxMmtfcGRldl9jYXAgKmNhcCwKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfc2JhbmRf aWZ0eXBlX2RhdGEgKmRhdGEsCisJCQkJICBpbnQgYmFuZCkKK3sKKwlpbnQgaSwgaWR4ID0gMDsK KworCWZvciAoaSA9IDA7IGkgPCBOVU1fTkw4MDIxMV9JRlRZUEVTOyBpKyspIHsKKwkJc3RydWN0 IGllZWU4MDIxMV9zdGFfaGVfY2FwICpoZV9jYXAgPSAmZGF0YVtpZHhdLmhlX2NhcDsKKwkJc3Ry dWN0IGF0aDEya19iYW5kX2NhcCAqYmFuZF9jYXAgPSAmY2FwLT5iYW5kW2JhbmRdOworCQlzdHJ1 Y3QgaWVlZTgwMjExX2hlX2NhcF9lbGVtICpoZV9jYXBfZWxlbSA9CisJCQkJJmhlX2NhcC0+aGVf Y2FwX2VsZW07CisKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElP TjoKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNI X1BPSU5UOgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJ ZGF0YVtpZHhdLnR5cGVzX21hc2sgPSBCSVQoaSk7CisJCWhlX2NhcC0+aGFzX2hlID0gdHJ1ZTsK KwkJbWVtY3B5KGhlX2NhcF9lbGVtLT5tYWNfY2FwX2luZm8sIGJhbmRfY2FwLT5oZV9jYXBfaW5m bywKKwkJICAgICAgIHNpemVvZihoZV9jYXBfZWxlbS0+bWFjX2NhcF9pbmZvKSk7CisJCW1lbWNw eShoZV9jYXBfZWxlbS0+cGh5X2NhcF9pbmZvLCBiYW5kX2NhcC0+aGVfY2FwX3BoeV9pbmZvLAor CQkgICAgICAgc2l6ZW9mKGhlX2NhcF9lbGVtLT5waHlfY2FwX2luZm8pKTsKKworCQloZV9jYXBf ZWxlbS0+bWFjX2NhcF9pbmZvWzFdICY9CisJCQlJRUVFODAyMTFfSEVfTUFDX0NBUDFfVEZfTUFD X1BBRF9EVVJfTUFTSzsKKworCQloZV9jYXBfZWxlbS0+cGh5X2NhcF9pbmZvWzVdICY9CisJCQl+ SUVFRTgwMjExX0hFX1BIWV9DQVA1X0JFQU1GT1JNRUVfTlVNX1NORF9ESU1fVU5ERVJfODBNSFpf TUFTSzsKKwkJaGVfY2FwX2VsZW0tPnBoeV9jYXBfaW5mb1s1XSAmPQorCQkJfklFRUU4MDIxMV9I RV9QSFlfQ0FQNV9CRUFNRk9STUVFX05VTV9TTkRfRElNX0FCT1ZFXzgwTUhaX01BU0s7CisJCWhl X2NhcF9lbGVtLT5waHlfY2FwX2luZm9bNV0gfD0gYXItPm51bV90eF9jaGFpbnMgLSAxOworCisJ CXN3aXRjaCAoaSkgeworCQljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgorCQkJaGVfY2FwX2VsZW0t PnBoeV9jYXBfaW5mb1szXSAmPQorCQkJCX5JRUVFODAyMTFfSEVfUEhZX0NBUDNfRENNX01BWF9D T05TVF9UWF9NQVNLOworCQkJaGVfY2FwX2VsZW0tPnBoeV9jYXBfaW5mb1s5XSB8PQorCQkJCUlF RUU4MDIxMV9IRV9QSFlfQ0FQOV9SWF8xMDI0X1FBTV9MRVNTX1RIQU5fMjQyX1RPTkVfUlU7CisJ CQlicmVhazsKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCQkJaGVfY2FwX2VsZW0t Pm1hY19jYXBfaW5mb1swXSAmPQorCQkJCX5JRUVFODAyMTFfSEVfTUFDX0NBUDBfVFdUX1JFUzsK KwkJCWhlX2NhcF9lbGVtLT5tYWNfY2FwX2luZm9bMF0gfD0KKwkJCQlJRUVFODAyMTFfSEVfTUFD X0NBUDBfVFdUX1JFUTsKKwkJCWhlX2NhcF9lbGVtLT5waHlfY2FwX2luZm9bOV0gfD0KKwkJCQlJ RUVFODAyMTFfSEVfUEhZX0NBUDlfVFhfMTAyNF9RQU1fTEVTU19USEFOXzI0Ml9UT05FX1JVOwor CQkJYnJlYWs7CisJCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKKwkJCWF0aDEya19t YWNfZmlsdGVyX2hlX2NhcF9tZXNoKGhlX2NhcF9lbGVtKTsKKwkJCWJyZWFrOworCQl9CisKKwkJ aGVfY2FwLT5oZV9tY3NfbnNzX3N1cHAucnhfbWNzXzgwID0KKwkJCWNwdV90b19sZTE2KGJhbmRf Y2FwLT5oZV9tY3MgJiAweGZmZmYpOworCQloZV9jYXAtPmhlX21jc19uc3Nfc3VwcC50eF9tY3Nf ODAgPQorCQkJY3B1X3RvX2xlMTYoYmFuZF9jYXAtPmhlX21jcyAmIDB4ZmZmZik7CisJCWhlX2Nh cC0+aGVfbWNzX25zc19zdXBwLnJ4X21jc18xNjAgPQorCQkJY3B1X3RvX2xlMTYoKGJhbmRfY2Fw LT5oZV9tY3MgPj4gMTYpICYgMHhmZmZmKTsKKwkJaGVfY2FwLT5oZV9tY3NfbnNzX3N1cHAudHhf bWNzXzE2MCA9CisJCQljcHVfdG9fbGUxNigoYmFuZF9jYXAtPmhlX21jcyA+PiAxNikgJiAweGZm ZmYpOworCQloZV9jYXAtPmhlX21jc19uc3Nfc3VwcC5yeF9tY3NfODBwODAgPQorCQkJY3B1X3Rv X2xlMTYoKGJhbmRfY2FwLT5oZV9tY3MgPj4gMTYpICYgMHhmZmZmKTsKKwkJaGVfY2FwLT5oZV9t Y3NfbnNzX3N1cHAudHhfbWNzXzgwcDgwID0KKwkJCWNwdV90b19sZTE2KChiYW5kX2NhcC0+aGVf bWNzID4+IDE2KSAmIDB4ZmZmZik7CisKKwkJbWVtc2V0KGhlX2NhcC0+cHBlX3RocmVzLCAwLCBz aXplb2YoaGVfY2FwLT5wcGVfdGhyZXMpKTsKKwkJaWYgKGhlX2NhcF9lbGVtLT5waHlfY2FwX2lu Zm9bNl0gJgorCQkgICAgSUVFRTgwMjExX0hFX1BIWV9DQVA2X1BQRV9USFJFU0hPTERfUFJFU0VO VCkKKwkJCWF0aDEya19nZW5fcHBlX3RocmVzaCgmYmFuZF9jYXAtPmhlX3BwZXQsCisJCQkJCSAg ICAgIGhlX2NhcC0+cHBlX3RocmVzKTsKKworCQlpZiAoYmFuZCA9PSBOTDgwMjExX0JBTkRfNkdI WikgeworCQkJZGF0YVtpZHhdLmhlXzZnaHpfY2FwYS5jYXBhID0KKwkJCQlhdGgxMmtfbWFjX3Nl dHVwX2hlXzZnaHpfY2FwKGNhcCwgYmFuZF9jYXApOworCQl9CisJCWlkeCsrOworCX0KKworCXJl dHVybiBpZHg7Cit9CisKK3N0YXRpYyB2b2lkIGF0aDEya19tYWNfc2V0dXBfaGVfY2FwKHN0cnVj dCBhdGgxMmsgKmFyLAorCQkJCSAgICBzdHJ1Y3QgYXRoMTJrX3BkZXZfY2FwICpjYXApCit7CisJ c3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqYmFuZDsKKwlpbnQgY291bnQ7CisKKwlp ZiAoY2FwLT5zdXBwb3J0ZWRfYmFuZHMgJiBXTUlfSE9TVF9XTEFOXzJHX0NBUCkgeworCQljb3Vu dCA9IGF0aDEya19tYWNfY29weV9oZV9jYXAoYXIsIGNhcCwKKwkJCQkJICAgICAgIGFyLT5tYWMu aWZ0eXBlW05MODAyMTFfQkFORF8yR0haXSwKKwkJCQkJICAgICAgIE5MODAyMTFfQkFORF8yR0ha KTsKKwkJYmFuZCA9ICZhci0+bWFjLnNiYW5kc1tOTDgwMjExX0JBTkRfMkdIWl07CisJCWJhbmQt PmlmdHlwZV9kYXRhID0gYXItPm1hYy5pZnR5cGVbTkw4MDIxMV9CQU5EXzJHSFpdOworCQliYW5k LT5uX2lmdHlwZV9kYXRhID0gY291bnQ7CisJfQorCisJaWYgKGNhcC0+c3VwcG9ydGVkX2JhbmRz ICYgV01JX0hPU1RfV0xBTl81R19DQVApIHsKKwkJY291bnQgPSBhdGgxMmtfbWFjX2NvcHlfaGVf Y2FwKGFyLCBjYXAsCisJCQkJCSAgICAgICBhci0+bWFjLmlmdHlwZVtOTDgwMjExX0JBTkRfNUdI Wl0sCisJCQkJCSAgICAgICBOTDgwMjExX0JBTkRfNUdIWik7CisJCWJhbmQgPSAmYXItPm1hYy5z YmFuZHNbTkw4MDIxMV9CQU5EXzVHSFpdOworCQliYW5kLT5pZnR5cGVfZGF0YSA9IGFyLT5tYWMu aWZ0eXBlW05MODAyMTFfQkFORF81R0haXTsKKwkJYmFuZC0+bl9pZnR5cGVfZGF0YSA9IGNvdW50 OworCX0KKworCWlmIChjYXAtPnN1cHBvcnRlZF9iYW5kcyAmIFdNSV9IT1NUX1dMQU5fNUdfQ0FQ ICYmCisJICAgIGFyLT5zdXBwb3J0c182Z2h6KSB7CisJCWNvdW50ID0gYXRoMTJrX21hY19jb3B5 X2hlX2NhcChhciwgY2FwLAorCQkJCQkgICAgICAgYXItPm1hYy5pZnR5cGVbTkw4MDIxMV9CQU5E XzZHSFpdLAorCQkJCQkgICAgICAgTkw4MDIxMV9CQU5EXzZHSFopOworCQliYW5kID0gJmFyLT5t YWMuc2JhbmRzW05MODAyMTFfQkFORF82R0haXTsKKwkJYmFuZC0+aWZ0eXBlX2RhdGEgPSBhci0+ bWFjLmlmdHlwZVtOTDgwMjExX0JBTkRfNkdIWl07CisJCWJhbmQtPm5faWZ0eXBlX2RhdGEgPSBj b3VudDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19hdGgxMmtfc2V0X2FudGVubmEoc3RydWN0IGF0 aDEyayAqYXIsIHUzMiB0eF9hbnQsIHUzMiByeF9hbnQpCit7CisJaW50IHJldDsKKworCWxvY2tk ZXBfYXNzZXJ0X2hlbGQoJmFyLT5jb25mX211dGV4KTsKKworCWlmIChhdGgxMmtfY2hlY2tfY2hh aW5fbWFzayhhciwgdHhfYW50LCB0cnVlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYXRo MTJrX2NoZWNrX2NoYWluX21hc2soYXIsIHJ4X2FudCwgZmFsc2UpKQorCQlyZXR1cm4gLUVJTlZB TDsKKworCWFyLT5jZmdfdHhfY2hhaW5tYXNrID0gdHhfYW50OworCWFyLT5jZmdfcnhfY2hhaW5t YXNrID0gcnhfYW50OworCisJaWYgKGFyLT5zdGF0ZSAhPSBBVEgxMktfU1RBVEVfT04gJiYKKwkg ICAgYXItPnN0YXRlICE9IEFUSDEyS19TVEFURV9SRVNUQVJURUQpCisJCXJldHVybiAwOworCisJ cmV0ID0gYXRoMTJrX3dtaV9wZGV2X3NldF9wYXJhbShhciwgV01JX1BERVZfUEFSQU1fVFhfQ0hB SU5fTUFTSywKKwkJCQkJdHhfYW50LCBhci0+cGRldi0+cGRldl9pZCk7CisJaWYgKHJldCkgewor CQlhdGgxMmtfd2Fybihhci0+YWIsICJmYWlsZWQgdG8gc2V0IHR4LWNoYWlubWFzazogJWQsIHJl cSAweCV4XG4iLAorCQkJICAgIHJldCwgdHhfYW50KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlh ci0+bnVtX3R4X2NoYWlucyA9IGh3ZWlnaHQzMih0eF9hbnQpOworCisJcmV0ID0gYXRoMTJrX3dt aV9wZGV2X3NldF9wYXJhbShhciwgV01JX1BERVZfUEFSQU1fUlhfQ0hBSU5fTUFTSywKKwkJCQkJ cnhfYW50LCBhci0+cGRldi0+cGRldl9pZCk7CisJaWYgKHJldCkgeworCQlhdGgxMmtfd2Fybihh ci0+YWIsICJmYWlsZWQgdG8gc2V0IHJ4LWNoYWlubWFzazogJWQsIHJlcSAweCV4XG4iLAorCQkJ ICAgIHJldCwgcnhfYW50KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlhci0+bnVtX3J4X2NoYWlu cyA9IGh3ZWlnaHQzMihyeF9hbnQpOworCisJLyogUmVsb2FkIEhUL1ZIVC9IRSBjYXBhYmlsaXR5 ICovCisJYXRoMTJrX21hY19zZXR1cF9odF92aHRfY2FwKGFyLCAmYXItPnBkZXYtPmNhcCwgTlVM TCk7CisJYXRoMTJrX21hY19zZXR1cF9oZV9jYXAoYXIsICZhci0+cGRldi0+Y2FwKTsKKworCXJl dHVybiAwOworfQorCitpbnQgYXRoMTJrX21hY190eF9tZ210X3BlbmRpbmdfZnJlZShpbnQgYnVm X2lkLCB2b2lkICpza2IsIHZvaWQgKmN0eCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXNkdSA9IHNr YjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CisJc3RydWN0IGF0aDEyayAqYXIg PSBjdHg7CisJc3RydWN0IGF0aDEya19iYXNlICphYiA9IGFyLT5hYjsKKworCXNwaW5fbG9ja19i aCgmYXItPnR4bWdtdF9pZHJfbG9jayk7CisJaWRyX3JlbW92ZSgmYXItPnR4bWdtdF9pZHIsIGJ1 Zl9pZCk7CisJc3Bpbl91bmxvY2tfYmgoJmFyLT50eG1nbXRfaWRyX2xvY2spOworCWRtYV91bm1h cF9zaW5nbGUoYWItPmRldiwgQVRIMTJLX1NLQl9DQihtc2R1KS0+cGFkZHIsIG1zZHUtPmxlbiwK KwkJCSBETUFfVE9fREVWSUNFKTsKKworCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKG1zZHUpOwor CW1lbXNldCgmaW5mby0+c3RhdHVzLCAwLCBzaXplb2YoaW5mby0+c3RhdHVzKSk7CisKKwlpZWVl ODAyMTFfZnJlZV90eHNrYihhci0+aHcsIG1zZHUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyBpbnQgYXRoMTJrX21hY192aWZfdHhtZ210X2lkcl9yZW1vdmUoaW50IGJ1Zl9pZCwgdm9pZCAq c2tiLCB2b2lkICpjdHgpCit7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eDsKKwlz dHJ1Y3QgYXRoMTJrX3NrYl9jYiAqc2tiX2NiID0gQVRIMTJLX1NLQl9DQihza2IpOworCXN0cnVj dCBza19idWZmICptc2R1ID0gc2tiOworCXN0cnVjdCBhdGgxMmsgKmFyID0gc2tiX2NiLT5hcjsK KwlzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiID0gYXItPmFiOworCisJaWYgKHNrYl9jYi0+dmlmID09 IHZpZikgeworCQlzcGluX2xvY2tfYmgoJmFyLT50eG1nbXRfaWRyX2xvY2spOworCQlpZHJfcmVt b3ZlKCZhci0+dHhtZ210X2lkciwgYnVmX2lkKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmFyLT50eG1n bXRfaWRyX2xvY2spOworCQlkbWFfdW5tYXBfc2luZ2xlKGFiLT5kZXYsIHNrYl9jYi0+cGFkZHIs IG1zZHUtPmxlbiwKKwkJCQkgRE1BX1RPX0RFVklDRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyBpbnQgYXRoMTJrX21hY19tZ210X3R4X3dtaShzdHJ1Y3QgYXRoMTJrICphciwgc3Ry dWN0IGF0aDEya192aWYgKmFydmlmLAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlz dHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiID0gYXItPmFiOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpo ZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJc3RydWN0IGllZWU4MDIx MV90eF9pbmZvICppbmZvOworCWRtYV9hZGRyX3QgcGFkZHI7CisJaW50IGJ1Zl9pZDsKKwlpbnQg cmV0OworCisJc3Bpbl9sb2NrX2JoKCZhci0+dHhtZ210X2lkcl9sb2NrKTsKKwlidWZfaWQgPSBp ZHJfYWxsb2MoJmFyLT50eG1nbXRfaWRyLCBza2IsIDAsCisJCQkgICBBVEgxMktfVFhfTUdNVF9O VU1fUEVORElOR19NQVgsIEdGUF9BVE9NSUMpOworCXNwaW5fdW5sb2NrX2JoKCZhci0+dHhtZ210 X2lkcl9sb2NrKTsKKwlpZiAoYnVmX2lkIDwgMCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpbmZv ID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCWlmICghKGluZm8tPmZsYWdzICYgSUVFRTgwMjEx X1RYX0NUTF9IV184MDIxMV9FTkNBUCkpIHsKKwkJaWYgKChpZWVlODAyMTFfaXNfYWN0aW9uKGhk ci0+ZnJhbWVfY29udHJvbCkgfHwKKwkJICAgICBpZWVlODAyMTFfaXNfZGVhdXRoKGhkci0+ZnJh bWVfY29udHJvbCkgfHwKKwkJICAgICBpZWVlODAyMTFfaXNfZGlzYXNzb2MoaGRyLT5mcmFtZV9j b250cm9sKSkgJiYKKwkJICAgICBpZWVlODAyMTFfaGFzX3Byb3RlY3RlZChoZHItPmZyYW1lX2Nv bnRyb2wpKSB7CisJCQlza2JfcHV0KHNrYiwgSUVFRTgwMjExX0NDTVBfTUlDX0xFTik7CisJCX0K Kwl9CisKKwlwYWRkciA9IGRtYV9tYXBfc2luZ2xlKGFiLT5kZXYsIHNrYi0+ZGF0YSwgc2tiLT5s ZW4sIERNQV9UT19ERVZJQ0UpOworCWlmIChkbWFfbWFwcGluZ19lcnJvcihhYi0+ZGV2LCBwYWRk cikpIHsKKwkJYXRoMTJrX3dhcm4oYWIsICJmYWlsZWQgdG8gRE1BIG1hcCBtZ210IFR4IGJ1ZmZl clxuIik7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyX2ZyZWVfaWRyOworCX0KKworCUFUSDEy S19TS0JfQ0Ioc2tiKS0+cGFkZHIgPSBwYWRkcjsKKworCXJldCA9IGF0aDEya193bWlfbWdtdF9z ZW5kKGFyLCBhcnZpZi0+dmRldl9pZCwgYnVmX2lkLCBza2IpOworCWlmIChyZXQpIHsKKwkJYXRo MTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIHNlbmQgbWdtdCBmcmFtZTogJWRcbiIsIHJldCk7 CisJCWdvdG8gZXJyX3VubWFwX2J1ZjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3VubWFwX2J1 ZjoKKwlkbWFfdW5tYXBfc2luZ2xlKGFiLT5kZXYsIEFUSDEyS19TS0JfQ0Ioc2tiKS0+cGFkZHIs CisJCQkgc2tiLT5sZW4sIERNQV9UT19ERVZJQ0UpOworZXJyX2ZyZWVfaWRyOgorCXNwaW5fbG9j a19iaCgmYXItPnR4bWdtdF9pZHJfbG9jayk7CisJaWRyX3JlbW92ZSgmYXItPnR4bWdtdF9pZHIs IGJ1Zl9pZCk7CisJc3Bpbl91bmxvY2tfYmgoJmFyLT50eG1nbXRfaWRyX2xvY2spOworCisJcmV0 dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYXRoMTJrX21nbXRfb3Zlcl93bWlfdHhfcHVyZ2Uo c3RydWN0IGF0aDEyayAqYXIpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXdoaWxlICgo c2tiID0gc2tiX2RlcXVldWUoJmFyLT53bWlfbWdtdF90eF9xdWV1ZSkpICE9IE5VTEwpCisJCWll ZWU4MDIxMV9mcmVlX3R4c2tiKGFyLT5odywgc2tiKTsKK30KKworc3RhdGljIHZvaWQgYXRoMTJr X21nbXRfb3Zlcl93bWlfdHhfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3Ry dWN0IGF0aDEyayAqYXIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0aDEyaywgd21pX21n bXRfdHhfd29yayk7CisJc3RydWN0IGF0aDEya19za2JfY2IgKnNrYl9jYjsKKwlzdHJ1Y3QgYXRo MTJrX3ZpZiAqYXJ2aWY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgcmV0OworCisJd2hp bGUgKChza2IgPSBza2JfZGVxdWV1ZSgmYXItPndtaV9tZ210X3R4X3F1ZXVlKSkgIT0gTlVMTCkg eworCQlza2JfY2IgPSBBVEgxMktfU0tCX0NCKHNrYik7CisJCWlmICghc2tiX2NiLT52aWYpIHsK KwkJCWF0aDEya193YXJuKGFyLT5hYiwgIm5vIHZpZiBmb3VuZCBmb3IgbWdtdCBmcmFtZVxuIik7 CisJCQlpZWVlODAyMTFfZnJlZV90eHNrYihhci0+aHcsIHNrYik7CisJCQljb250aW51ZTsKKwkJ fQorCisJCWFydmlmID0gYXRoMTJrX3ZpZl90b19hcnZpZihza2JfY2ItPnZpZik7CisJCWlmIChh ci0+YWxsb2NhdGVkX3ZkZXZfbWFwICYgKDFMTCA8PCBhcnZpZi0+dmRldl9pZCkgJiYKKwkJICAg IGFydmlmLT5pc19zdGFydGVkKSB7CisJCQlyZXQgPSBhdGgxMmtfbWFjX21nbXRfdHhfd21pKGFy LCBhcnZpZiwgc2tiKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlhdGgxMmtfd2Fybihhci0+YWIsICJm YWlsZWQgdG8gdHggbWdtdCBmcmFtZSwgdmRldl9pZCAlZCA6JWRcbiIsCisJCQkJCSAgICBhcnZp Zi0+dmRldl9pZCwgcmV0KTsKKwkJCQlpZWVlODAyMTFfZnJlZV90eHNrYihhci0+aHcsIHNrYik7 CisJCQl9IGVsc2UgeworCQkJCWF0b21pY19pbmMoJmFyLT5udW1fcGVuZGluZ19tZ210X3R4KTsK KwkJCX0KKwkJfSBlbHNlIHsKKwkJCWF0aDEya193YXJuKGFyLT5hYiwKKwkJCQkgICAgImRyb3Bw aW5nIG1nbXQgZnJhbWUgZm9yIHZkZXYgJWQsIGlzX3N0YXJ0ZWQgJWRcbiIsCisJCQkJICAgIGFy dmlmLT52ZGV2X2lkLAorCQkJCSAgICBhcnZpZi0+aXNfc3RhcnRlZCk7CisJCQlpZWVlODAyMTFf ZnJlZV90eHNrYihhci0+aHcsIHNrYik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgYXRoMTJr X21hY19tZ210X3R4KHN0cnVjdCBhdGgxMmsgKmFyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJ ICAgICAgYm9vbCBpc19wcmJfcnNwKQoreworCXN0cnVjdCBza19idWZmX2hlYWQgKnEgPSAmYXIt PndtaV9tZ210X3R4X3F1ZXVlOworCisJaWYgKHRlc3RfYml0KEFUSDEyS19GTEFHX0NSQVNIX0ZM VVNILCAmYXItPmFiLT5kZXZfZmxhZ3MpKQorCQlyZXR1cm4gLUVTSFVURE9XTjsKKworCS8qIERy b3AgcHJvYmUgcmVzcG9uc2UgcGFja2V0cyB3aGVuIHRoZSBwZW5kaW5nIG1hbmFnZW1lbnQgdHgK KwkgKiBjb3VudCBoYXMgcmVhY2hlZCBhIGNlcnRhaW4gdGhyZXNob2xkLCBzbyBhcyB0byBwcmlv cml0aXplCisJICogb3RoZXIgbWdtdCBwYWNrZXRzIGxpa2UgYXV0aCBhbmQgYXNzb2MgdG8gYmUg c2VudCBvbiB0aW1lCisJICogZm9yIGVzdGFibGlzaGluZyBzdWNjZXNzZnVsIGNvbm5lY3Rpb25z LgorCSAqLworCWlmIChpc19wcmJfcnNwICYmCisJICAgIGF0b21pY19yZWFkKCZhci0+bnVtX3Bl bmRpbmdfbWdtdF90eCkgPiBBVEgxMktfUFJCX1JTUF9EUk9QX1RIUkVTSE9MRCkgeworCQlhdGgx Mmtfd2Fybihhci0+YWIsCisJCQkgICAgImRyb3BwaW5nIHByb2JlIHJlc3BvbnNlIGFzIHBlbmRp bmcgcXVldWUgaXMgYWxtb3N0IGZ1bGxcbiIpOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwlp ZiAoc2tiX3F1ZXVlX2xlbihxKSA9PSBBVEgxMktfVFhfTUdNVF9OVU1fUEVORElOR19NQVgpIHsK KwkJYXRoMTJrX3dhcm4oYXItPmFiLCAibWdtdCB0eCBxdWV1ZSBpcyBmdWxsXG4iKTsKKwkJcmV0 dXJuIC1FTk9TUEM7CisJfQorCisJc2tiX3F1ZXVlX3RhaWwocSwgc2tiKTsKKwlpZWVlODAyMTFf cXVldWVfd29yayhhci0+aHcsICZhci0+d21pX21nbXRfdHhfd29yayk7CisKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIHZvaWQgYXRoMTJrX21hY19vcF90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpo dywKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV90eF9jb250cm9sICpjb250cm9sLAorCQkJICAg ICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBhdGgxMmtfc2tiX2NiICpza2JfY2Ig PSBBVEgxMktfU0tCX0NCKHNrYik7CisJc3RydWN0IGF0aDEyayAqYXIgPSBody0+cHJpdjsKKwlz dHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisJ c3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGluZm8tPmNvbnRyb2wudmlmOworCXN0cnVjdCBh dGgxMmtfdmlmICphcnZpZiA9IGF0aDEya192aWZfdG9fYXJ2aWYodmlmKTsKKwlzdHJ1Y3QgaWVl ZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCXN0 cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSA9IGluZm8tPmNvbnRyb2wuaHdfa2V5OworCXUz MiBpbmZvX2ZsYWdzID0gaW5mby0+ZmxhZ3M7CisJYm9vbCBpc19wcmJfcnNwOworCWludCByZXQ7 CisKKwltZW1zZXQoc2tiX2NiLCAwLCBzaXplb2YoKnNrYl9jYikpOworCXNrYl9jYi0+dmlmID0g dmlmOworCisJaWYgKGtleSkgeworCQlza2JfY2ItPmNpcGhlciA9IGtleS0+Y2lwaGVyOworCQlz a2JfY2ItPmZsYWdzIHw9IEFUSDEyS19TS0JfQ0lQSEVSX1NFVDsKKwl9CisKKwlpZiAoaW5mb19m bGFncyAmIElFRUU4MDIxMV9UWF9DVExfSFdfODAyMTFfRU5DQVApIHsKKwkJc2tiX2NiLT5mbGFn cyB8PSBBVEgxMktfU0tCX0hXXzgwMjExX0VOQ0FQOworCX0gZWxzZSBpZiAoaWVlZTgwMjExX2lz X21nbXQoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCQlpc19wcmJfcnNwID0gaWVlZTgwMjExX2lz X3Byb2JlX3Jlc3AoaGRyLT5mcmFtZV9jb250cm9sKTsKKwkJcmV0ID0gYXRoMTJrX21hY19tZ210 X3R4KGFyLCBza2IsIGlzX3ByYl9yc3ApOworCQlpZiAocmV0KSB7CisJCQlhdGgxMmtfd2Fybihh ci0+YWIsICJmYWlsZWQgdG8gcXVldWUgbWFuYWdlbWVudCBmcmFtZSAlZFxuIiwKKwkJCQkgICAg cmV0KTsKKwkJCWllZWU4MDIxMV9mcmVlX3R4c2tiKGFyLT5odywgc2tiKTsKKwkJfQorCQlyZXR1 cm47CisJfQorCisJcmV0ID0gYXRoMTJrX2RwX3R4KGFyLCBhcnZpZiwgc2tiKTsKKwlpZiAocmV0 KSB7CisJCWF0aDEya193YXJuKGFyLT5hYiwgImZhaWxlZCB0byB0cmFuc21pdCBmcmFtZSAlZFxu IiwgcmV0KTsKKwkJaWVlZTgwMjExX2ZyZWVfdHhza2IoYXItPmh3LCBza2IpOworCX0KK30KKwor dm9pZCBhdGgxMmtfbWFjX2RyYWluX3R4KHN0cnVjdCBhdGgxMmsgKmFyKQoreworCS8qIG1ha2Ug c3VyZSByY3UtcHJvdGVjdGVkIG1hYzgwMjExIHR4IHBhdGggaXRzZWxmIGlzIGRyYWluZWQgKi8K KwlzeW5jaHJvbml6ZV9uZXQoKTsKKworCWNhbmNlbF93b3JrX3N5bmMoJmFyLT53bWlfbWdtdF90 eF93b3JrKTsKKwlhdGgxMmtfbWdtdF9vdmVyX3dtaV90eF9wdXJnZShhcik7Cit9CisKK3N0YXRp YyBpbnQgYXRoMTJrX21hY19jb25maWdfbW9uX3N0YXR1c19kZWZhdWx0KHN0cnVjdCBhdGgxMmsg KmFyLCBib29sIGVuYWJsZSkKK3sKKwlyZXR1cm4gLUVOT1RTVVBQOworCS8qIFRPRE86IE5lZWQg dG8gc3VwcG9ydCBuZXcgbW9uaXRvciBtb2RlICovCit9CisKK3N0YXRpYyB2b2lkIGF0aDEya19t YWNfd2FpdF9yZWNvbmZpZ3VyZShzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiKQoreworCWludCByZWNv dmVyeV9zdGFydF9jb3VudDsKKworCWlmICghYWItPmlzX3Jlc2V0KQorCQlyZXR1cm47CisKKwly ZWNvdmVyeV9zdGFydF9jb3VudCA9IGF0b21pY19pbmNfcmV0dXJuKCZhYi0+cmVjb3Zlcnlfc3Rh cnRfY291bnQpOworCisJYXRoMTJrX2RiZyhhYiwgQVRIMTJLX0RCR19NQUMsICJyZWNvdmVyeSBz dGFydCBjb3VudCAlZFxuIiwgcmVjb3Zlcnlfc3RhcnRfY291bnQpOworCisJaWYgKHJlY292ZXJ5 X3N0YXJ0X2NvdW50ID09IGFiLT5udW1fcmFkaW9zKSB7CisJCWNvbXBsZXRlKCZhYi0+cmVjb3Zl cnlfc3RhcnQpOworCQlhdGgxMmtfZGJnKGFiLCBBVEgxMktfREJHX01BQywgInJlY292ZXJ5IHN0 YXJ0ZWQgc3VjY2Vzc1xuIik7CisJfQorCisJYXRoMTJrX2RiZyhhYiwgQVRIMTJLX0RCR19NQUMs ICJ3YWl0aW5nIHJlY29uZmlndXJlLi4uXG4iKTsKKworCXdhaXRfZm9yX2NvbXBsZXRpb25fdGlt ZW91dCgmYWItPnJlY29uZmlndXJlX2NvbXBsZXRlLAorCQkJCSAgICBBVEgxMktfUkVDT05GSUdV UkVfVElNRU9VVF9IWik7Cit9CisKK3N0YXRpYyBpbnQgYXRoMTJrX21hY19vcF9zdGFydChzdHJ1 Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgYXRoMTJrICphciA9IGh3LT5wcml2Owor CXN0cnVjdCBhdGgxMmtfYmFzZSAqYWIgPSBhci0+YWI7CisJc3RydWN0IGF0aDEya19wZGV2ICpw ZGV2ID0gYXItPnBkZXY7CisJaW50IHJldDsKKworCWF0aDEya19tYWNfZHJhaW5fdHgoYXIpOwor CW11dGV4X2xvY2soJmFyLT5jb25mX211dGV4KTsKKworCXN3aXRjaCAoYXItPnN0YXRlKSB7CisJ Y2FzZSBBVEgxMktfU1RBVEVfT0ZGOgorCQlhci0+c3RhdGUgPSBBVEgxMktfU1RBVEVfT047CisJ CWJyZWFrOworCWNhc2UgQVRIMTJLX1NUQVRFX1JFU1RBUlRJTkc6CisJCWFyLT5zdGF0ZSA9IEFU SDEyS19TVEFURV9SRVNUQVJURUQ7CisJCWF0aDEya19tYWNfd2FpdF9yZWNvbmZpZ3VyZShhYik7 CisJCWJyZWFrOworCWNhc2UgQVRIMTJLX1NUQVRFX1JFU1RBUlRFRDoKKwljYXNlIEFUSDEyS19T VEFURV9XRURHRUQ6CisJY2FzZSBBVEgxMktfU1RBVEVfT046CisJCVdBUk5fT04oMSk7CisJCXJl dCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IGF0aDEya193bWlfcGRldl9z ZXRfcGFyYW0oYXIsIFdNSV9QREVWX1BBUkFNX1BNRl9RT1MsCisJCQkJCTEsIHBkZXYtPnBkZXZf aWQpOworCisJaWYgKHJldCkgeworCQlhdGgxMmtfZXJyKGFyLT5hYiwgImZhaWxlZCB0byBlbmFi bGUgUE1GIFFPUzogKCVkXG4iLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSBhdGgx Mmtfd21pX3BkZXZfc2V0X3BhcmFtKGFyLCBXTUlfUERFVl9QQVJBTV9EWU5BTUlDX0JXLCAxLAor CQkJCQlwZGV2LT5wZGV2X2lkKTsKKwlpZiAocmV0KSB7CisJCWF0aDEya19lcnIoYXItPmFiLCAi ZmFpbGVkIHRvIGVuYWJsZSBkeW5hbWljIGJ3OiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnI7CisJ fQorCisJcmV0ID0gYXRoMTJrX3dtaV9wZGV2X3NldF9wYXJhbShhciwgV01JX1BERVZfUEFSQU1f QVJQX0FDX09WRVJSSURFLAorCQkJCQkwLCBwZGV2LT5wZGV2X2lkKTsKKwlpZiAocmV0KSB7CisJ CWF0aDEya19lcnIoYWIsICJmYWlsZWQgdG8gc2V0IGFjIG92ZXJyaWRlIGZvciBBUlA6ICVkXG4i LAorCQkJICAgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gYXRoMTJrX3dtaV9zZW5k X2Rmc19waHllcnJfb2ZmbG9hZF9lbmFibGVfY21kKGFyLCBwZGV2LT5wZGV2X2lkKTsKKwlpZiAo cmV0KSB7CisJCWF0aDEya19lcnIoYWIsICJmYWlsZWQgdG8gb2ZmbG9hZCByYWRhciBkZXRlY3Rp b246ICVkXG4iLAorCQkJICAgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gYXRoMTJr X2RwX3R4X2h0dF9oMnRfcHBkdV9zdGF0c19yZXEoYXIsCisJCQkJCQkgIEhUVF9QUERVX1NUQVRT X1RBR19ERUZBVUxUKTsKKwlpZiAocmV0KSB7CisJCWF0aDEya19lcnIoYWIsICJmYWlsZWQgdG8g cmVxIHBwZHUgc3RhdHM6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSBh dGgxMmtfd21pX3BkZXZfc2V0X3BhcmFtKGFyLCBXTUlfUERFVl9QQVJBTV9NRVNIX01DQVNUX0VO QUJMRSwKKwkJCQkJMSwgcGRldi0+cGRldl9pZCk7CisKKwlpZiAocmV0KSB7CisJCWF0aDEya19l cnIoYXItPmFiLCAiZmFpbGVkIHRvIGVuYWJsZSBNRVNIIE1DQVNUIEVOQUJMRTogKCVkXG4iLCBy ZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwlfX2F0aDEya19zZXRfYW50ZW5uYShhciwgYXItPmNm Z190eF9jaGFpbm1hc2ssIGFyLT5jZmdfcnhfY2hhaW5tYXNrKTsKKworCS8qIFRPRE86IERvIHdl IG5lZWQgdG8gZW5hYmxlIEFOST8gKi8KKworCWF0aDEya19yZWdfdXBkYXRlX2NoYW5fbGlzdChh cik7CisKKwlhci0+bnVtX3N0YXJ0ZWRfdmRldnMgPSAwOworCWFyLT5udW1fY3JlYXRlZF92ZGV2 cyA9IDA7CisJYXItPm51bV9wZWVycyA9IDA7CisJYXItPmFsbG9jYXRlZF92ZGV2X21hcCA9IDA7 CisKKwkvKiBDb25maWd1cmUgbW9uaXRvciBzdGF0dXMgcmluZyB3aXRoIGRlZmF1bHQgcnhfZmls dGVyIHRvIGdldCByeCBzdGF0dXMKKwkgKiBzdWNoIGFzIHJzc2ksIHJ4X2R1cmF0aW9uLgorCSAq LworCXJldCA9IGF0aDEya19tYWNfY29uZmlnX21vbl9zdGF0dXNfZGVmYXVsdChhciwgdHJ1ZSk7 CisJaWYgKHJldCAmJiAocmV0ICE9IC1FTk9UU1VQUCkpIHsKKwkJYXRoMTJrX2VycihhYiwgImZh aWxlZCB0byBjb25maWd1cmUgbW9uaXRvciBzdGF0dXMgcmluZyB3aXRoIGRlZmF1bHQgcnhfZmls dGVyOiAoJWQpXG4iLAorCQkJICAgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKHJldCA9 PSAtRU5PVFNVUFApCisJCWF0aDEya19kYmcoYXItPmFiLCBBVEgxMktfREJHX01BQywKKwkJCSAg ICJtb25pdG9yIHN0YXR1cyBjb25maWcgaXMgbm90IHlldCBzdXBwb3J0ZWQiKTsKKworCS8qIENv bmZpZ3VyZSB0aGUgaGFzaCBzZWVkIGZvciBoYXNoIGJhc2VkIHJlbyBkZXN0IHJpbmcgc2VsZWN0 aW9uICovCisJYXRoMTJrX3dtaV9wZGV2X2xyb19jZmcoYXIsIGFyLT5wZGV2LT5wZGV2X2lkKTsK KworCS8qIGFsbG93IGRldmljZSB0byBlbnRlciBJTVBTICovCisJaWYgKGFiLT5od19wYXJhbXMt PmlkbGVfcHMpIHsKKwkJcmV0ID0gYXRoMTJrX3dtaV9wZGV2X3NldF9wYXJhbShhciwgV01JX1BE RVZfUEFSQU1fSURMRV9QU19DT05GSUcsCisJCQkJCQkxLCBwZGV2LT5wZGV2X2lkKTsKKwkJaWYg KHJldCkgeworCQkJYXRoMTJrX2VycihhYiwgImZhaWxlZCB0byBlbmFibGUgaWRsZSBwczogJWRc biIsIHJldCk7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmYXItPmNv bmZfbXV0ZXgpOworCisJcmN1X2Fzc2lnbl9wb2ludGVyKGFiLT5wZGV2c19hY3RpdmVbYXItPnBk ZXZfaWR4XSwKKwkJCSAgICZhYi0+cGRldnNbYXItPnBkZXZfaWR4XSk7CisKKwlyZXR1cm4gMDsK KworZXJyOgorCWFyLT5zdGF0ZSA9IEFUSDEyS19TVEFURV9PRkY7CisJbXV0ZXhfdW5sb2NrKCZh ci0+Y29uZl9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhdGgxMmtf bWFjX29wX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IGF0aDEyayAq YXIgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaHR0X3BwZHVfc3RhdHNfaW5mbyAqcHBkdV9zdGF0cywg KnRtcDsKKwlpbnQgcmV0OworCisJYXRoMTJrX21hY19kcmFpbl90eChhcik7CisKKwltdXRleF9s b2NrKCZhci0+Y29uZl9tdXRleCk7CisJcmV0ID0gYXRoMTJrX21hY19jb25maWdfbW9uX3N0YXR1 c19kZWZhdWx0KGFyLCBmYWxzZSk7CisJaWYgKHJldCAmJiAocmV0ICE9IC1FTk9UU1VQUCkpCisJ CWF0aDEya19lcnIoYXItPmFiLCAiZmFpbGVkIHRvIGNsZWFyIHJ4X2ZpbHRlciBmb3IgbW9uaXRv ciBzdGF0dXMgcmluZzogKCVkKVxuIiwKKwkJCSAgIHJldCk7CisKKwljbGVhcl9iaXQoQVRIMTJL X0NBQ19SVU5OSU5HLCAmYXItPmRldl9mbGFncyk7CisJYXItPnN0YXRlID0gQVRIMTJLX1NUQVRF X09GRjsKKwltdXRleF91bmxvY2soJmFyLT5jb25mX211dGV4KTsKKworCWNhbmNlbF9kZWxheWVk X3dvcmtfc3luYygmYXItPnNjYW4udGltZW91dCk7CisJY2FuY2VsX3dvcmtfc3luYygmYXItPnJl Z2RfdXBkYXRlX3dvcmspOworCisJc3Bpbl9sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKKwlsaXN0 X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHBkdV9zdGF0cywgdG1wLCAmYXItPnBwZHVfc3RhdHNfaW5m bywgbGlzdCkgeworCQlsaXN0X2RlbCgmcHBkdV9zdGF0cy0+bGlzdCk7CisJCWtmcmVlKHBwZHVf c3RhdHMpOworCX0KKwlzcGluX3VubG9ja19iaCgmYXItPmRhdGFfbG9jayk7CisKKwlyY3VfYXNz aWduX3BvaW50ZXIoYXItPmFiLT5wZGV2c19hY3RpdmVbYXItPnBkZXZfaWR4XSwgTlVMTCk7CisK KwlzeW5jaHJvbml6ZV9yY3UoKTsKKworCWF0b21pY19zZXQoJmFyLT5udW1fcGVuZGluZ19tZ210 X3R4LCAwKTsKK30KKworc3RhdGljIHU4CithdGgxMmtfbWFjX2dldF92ZGV2X3N0YXRzX2lkKHN0 cnVjdCBhdGgxMmtfdmlmICphcnZpZikKK3sKKwlzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiID0gYXJ2 aWYtPmFyLT5hYjsKKwl1OCB2ZGV2X3N0YXRzX2lkID0gMDsKKworCWRvIHsKKwkJaWYgKGFiLT5m cmVlX3ZkZXZfc3RhdHNfaWRfbWFwICYgKDFMTCA8PCB2ZGV2X3N0YXRzX2lkKSkgeworCQkJdmRl dl9zdGF0c19pZCsrOworCQkJaWYgKHZkZXZfc3RhdHNfaWQgPD0gQVRIMTJLX0lOVkFMX1ZERVZf U1RBVFNfSUQpIHsKKwkJCQl2ZGV2X3N0YXRzX2lkID0gQVRIMTJLX0lOVkFMX1ZERVZfU1RBVFNf SUQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlhYi0+ZnJlZV92ZGV2X3N0YXRz X2lkX21hcCB8PSAoMUxMIDw8IHZkZXZfc3RhdHNfaWQpOworCQkJYnJlYWs7CisJCX0KKwl9IHdo aWxlICh2ZGV2X3N0YXRzX2lkKTsKKworCWFydmlmLT52ZGV2X3N0YXRzX2lkID0gdmRldl9zdGF0 c19pZDsKKwlyZXR1cm4gdmRldl9zdGF0c19pZDsKK30KKworc3RhdGljIHZvaWQgYXRoMTJrX21h Y19zZXR1cF92ZGV2X2NyZWF0ZV9hcmcoc3RydWN0IGF0aDEya192aWYgKmFydmlmLAorCQkJCQkg ICAgIHN0cnVjdCBhdGgxMmtfd21pX3ZkZXZfY3JlYXRlX2FyZyAqYXJnKQoreworCXN0cnVjdCBh dGgxMmsgKmFyID0gYXJ2aWYtPmFyOworCXN0cnVjdCBhdGgxMmtfcGRldiAqcGRldiA9IGFyLT5w ZGV2OworCisJYXJnLT5pZl9pZCA9IGFydmlmLT52ZGV2X2lkOworCWFyZy0+dHlwZSA9IGFydmlm LT52ZGV2X3R5cGU7CisJYXJnLT5zdWJ0eXBlID0gYXJ2aWYtPnZkZXZfc3VidHlwZTsKKwlhcmct PnBkZXZfaWQgPSBwZGV2LT5wZGV2X2lkOworCisJaWYgKHBkZXYtPmNhcC5zdXBwb3J0ZWRfYmFu ZHMgJiBXTUlfSE9TVF9XTEFOXzJHX0NBUCkgeworCQlhcmctPmNoYWluc1tOTDgwMjExX0JBTkRf MkdIWl0udHggPSBhci0+bnVtX3R4X2NoYWluczsKKwkJYXJnLT5jaGFpbnNbTkw4MDIxMV9CQU5E XzJHSFpdLnJ4ID0gYXItPm51bV9yeF9jaGFpbnM7CisJfQorCWlmIChwZGV2LT5jYXAuc3VwcG9y dGVkX2JhbmRzICYgV01JX0hPU1RfV0xBTl81R19DQVApIHsKKwkJYXJnLT5jaGFpbnNbTkw4MDIx MV9CQU5EXzVHSFpdLnR4ID0gYXItPm51bV90eF9jaGFpbnM7CisJCWFyZy0+Y2hhaW5zW05MODAy MTFfQkFORF81R0haXS5yeCA9IGFyLT5udW1fcnhfY2hhaW5zOworCX0KKwlpZiAocGRldi0+Y2Fw LnN1cHBvcnRlZF9iYW5kcyAmIFdNSV9IT1NUX1dMQU5fNUdfQ0FQICYmCisJICAgIGFyLT5zdXBw b3J0c182Z2h6KSB7CisJCWFyZy0+Y2hhaW5zW05MODAyMTFfQkFORF82R0haXS50eCA9IGFyLT5u dW1fdHhfY2hhaW5zOworCQlhcmctPmNoYWluc1tOTDgwMjExX0JBTkRfNkdIWl0ucnggPSBhci0+ bnVtX3J4X2NoYWluczsKKwl9CisKKwlhcmctPmlmX3N0YXRzX2lkID0gYXRoMTJrX21hY19nZXRf dmRldl9zdGF0c19pZChhcnZpZik7Cit9CisKK3N0YXRpYyB1MzIKK2F0aDEya19tYWNfcHJlcGFy ZV9oZV9tb2RlKHN0cnVjdCBhdGgxMmtfcGRldiAqcGRldiwgdTMyIHZpZnR5cGUpCit7CisJc3Ry dWN0IGF0aDEya19wZGV2X2NhcCAqcGRldl9jYXAgPSAmcGRldi0+Y2FwOworCXN0cnVjdCBhdGgx MmtfYmFuZF9jYXAgKmNhcF9iYW5kID0gTlVMTDsKKwl1MzIgKmhlY2FwX3BoeV9wdHIgPSBOVUxM OworCXUzMiBoZW1vZGU7CisKKwlpZiAocGRldi0+Y2FwLnN1cHBvcnRlZF9iYW5kcyAmIFdNSV9I T1NUX1dMQU5fMkdfQ0FQKQorCQljYXBfYmFuZCA9ICZwZGV2X2NhcC0+YmFuZFtOTDgwMjExX0JB TkRfMkdIWl07CisJZWxzZQorCQljYXBfYmFuZCA9ICZwZGV2X2NhcC0+YmFuZFtOTDgwMjExX0JB TkRfNUdIWl07CisKKwloZWNhcF9waHlfcHRyID0gJmNhcF9iYW5kLT5oZV9jYXBfcGh5X2luZm9b MF07CisKKwloZW1vZGUgPSB1MzJfZW5jb2RlX2JpdHMoSEVfU1VfQkZFRV9FTkFCTEUsIEhFX01P REVfU1VfVFhfQkZFRSkgfAorCQkgdTMyX2VuY29kZV9iaXRzKEhFQ0FQX1BIWV9TVUJGTVJfR0VU KGhlY2FwX3BoeV9wdHIpLAorCQkJCSBIRV9NT0RFX1NVX1RYX0JGRVIpIHwKKwkJIHUzMl9lbmNv ZGVfYml0cyhIRUNBUF9QSFlfVUxNVU1JTU9fR0VUKGhlY2FwX3BoeV9wdHIpLAorCQkJCSBIRV9N T0RFX1VMX01VTUlNTyk7CisKKwkvKiBUT0RPOiBXRFMgYW5kIG90aGVyIG1vZGVzICovCisJaWYg KHZpZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKKwkJaGVtb2RlIHw9IHUzMl9lbmNvZGVf Yml0cyhIRUNBUF9QSFlfTVVCRk1SX0dFVChoZWNhcF9waHlfcHRyKSwKKwkJCQkJICBIRV9NT0RF X01VX1RYX0JGRVIpIHwKKwkJCSAgdTMyX2VuY29kZV9iaXRzKEhFX0RMX01VT0ZETUFfRU5BQkxF LCBIRV9NT0RFX0RMX09GRE1BKSB8CisJCQkgIHUzMl9lbmNvZGVfYml0cyhIRV9VTF9NVU9GRE1B X0VOQUJMRSwgSEVfTU9ERV9VTF9PRkRNQSk7CisJfSBlbHNlIHsKKwkJaGVtb2RlIHw9IHUzMl9l bmNvZGVfYml0cyhIRV9NVV9CRkVFX0VOQUJMRSwgSEVfTU9ERV9NVV9UWF9CRkVFKTsKKwl9CisK KwlyZXR1cm4gaGVtb2RlOworfQorCitzdGF0aWMgaW50IGF0aDEya19zZXRfaGVfbXVfc291bmRp bmdfbW9kZShzdHJ1Y3QgYXRoMTJrICphciwKKwkJCQkJICBzdHJ1Y3QgYXRoMTJrX3ZpZiAqYXJ2 aWYpCit7CisJdTMyIHBhcmFtX2lkLCBwYXJhbV92YWx1ZTsKKwlzdHJ1Y3QgYXRoMTJrX2Jhc2Ug KmFiID0gYXItPmFiOworCWludCByZXQ7CisKKwlwYXJhbV9pZCA9IFdNSV9WREVWX1BBUkFNX1NF VF9IRU1VX01PREU7CisJcGFyYW1fdmFsdWUgPSBhdGgxMmtfbWFjX3ByZXBhcmVfaGVfbW9kZShh ci0+cGRldiwgYXJ2aWYtPnZpZi0+dHlwZSk7CisJcmV0ID0gYXRoMTJrX3dtaV92ZGV2X3NldF9w YXJhbV9jbWQoYXIsIGFydmlmLT52ZGV2X2lkLAorCQkJCQkgICAgcGFyYW1faWQsIHBhcmFtX3Zh bHVlKTsKKwlpZiAocmV0KSB7CisJCWF0aDEya193YXJuKGFiLCAiZmFpbGVkIHRvIHNldCB2ZGV2 ICVkIEhFIE1VIG1vZGU6ICVkIHBhcmFtX3ZhbHVlICV4XG4iLAorCQkJICAgIGFydmlmLT52ZGV2 X2lkLCByZXQsIHBhcmFtX3ZhbHVlKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcGFyYW1faWQgPSBX TUlfVkRFVl9QQVJBTV9TRVRfSEVfU09VTkRJTkdfTU9ERTsKKwlwYXJhbV92YWx1ZSA9CisJCXUz Ml9lbmNvZGVfYml0cyhIRV9WSFRfU09VTkRJTkdfTU9ERV9FTkFCTEUsIEhFX1ZIVF9TT1VORElO R19NT0RFKSB8CisJCXUzMl9lbmNvZGVfYml0cyhIRV9UUklHX05PTlRSSUdfU09VTkRJTkdfTU9E RV9FTkFCTEUsCisJCQkJSEVfVFJJR19OT05UUklHX1NPVU5ESU5HX01PREUpOworCXJldCA9IGF0 aDEya193bWlfdmRldl9zZXRfcGFyYW1fY21kKGFyLCBhcnZpZi0+dmRldl9pZCwKKwkJCQkJICAg IHBhcmFtX2lkLCBwYXJhbV92YWx1ZSk7CisJaWYgKHJldCkgeworCQlhdGgxMmtfd2FybihhYiwg ImZhaWxlZCB0byBzZXQgdmRldiAlZCBIRSBNVSBtb2RlOiAlZFxuIiwKKwkJCSAgICBhcnZpZi0+ dmRldl9pZCwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3Rh dGljIHZvaWQgYXRoMTJrX21hY19vcF91cGRhdGVfdmlmX29mZmxvYWQoc3RydWN0IGllZWU4MDIx MV9odyAqaHcsCisJCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1 Y3QgYXRoMTJrICphciA9IGh3LT5wcml2OworCXN0cnVjdCBhdGgxMmtfYmFzZSAqYWIgPSBhci0+ YWI7CisJc3RydWN0IGF0aDEya192aWYgKmFydmlmID0gYXRoMTJrX3ZpZl90b19hcnZpZih2aWYp OworCXUzMiBwYXJhbV9pZCwgcGFyYW1fdmFsdWU7CisJaW50IHJldDsKKworCXBhcmFtX2lkID0g V01JX1ZERVZfUEFSQU1fVFhfRU5DQVBfVFlQRTsKKwlpZiAodmlmLT50eXBlICE9IE5MODAyMTFf SUZUWVBFX1NUQVRJT04gJiYKKwkgICAgdmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQKQor CQl2aWYtPm9mZmxvYWRfZmxhZ3MgJj0gfihJRUVFODAyMTFfT0ZGTE9BRF9FTkNBUF9FTkFCTEVE IHwKKwkJCQkJSUVFRTgwMjExX09GRkxPQURfREVDQVBfRU5BQkxFRCk7CisKKwlpZiAodmlmLT5v ZmZsb2FkX2ZsYWdzICYgSUVFRTgwMjExX09GRkxPQURfRU5DQVBfRU5BQkxFRCkKKwkJYXJ2aWYt PnR4X2VuY2FwX3R5cGUgPSBBVEgxMktfSFdfVFhSWF9FVEhFUk5FVDsKKwllbHNlIGlmICh0ZXN0 X2JpdChBVEgxMktfRkxBR19SQVdfTU9ERSwgJmFiLT5kZXZfZmxhZ3MpKQorCQlhcnZpZi0+dHhf ZW5jYXBfdHlwZSA9IEFUSDEyS19IV19UWFJYX1JBVzsKKwllbHNlCisJCWFydmlmLT50eF9lbmNh cF90eXBlID0gQVRIMTJLX0hXX1RYUlhfTkFUSVZFX1dJRkk7CisKKwlyZXQgPSBhdGgxMmtfd21p X3ZkZXZfc2V0X3BhcmFtX2NtZChhciwgYXJ2aWYtPnZkZXZfaWQsCisJCQkJCSAgICBwYXJhbV9p ZCwgYXJ2aWYtPnR4X2VuY2FwX3R5cGUpOworCWlmIChyZXQpIHsKKwkJYXRoMTJrX3dhcm4oYWIs ICJmYWlsZWQgdG8gc2V0IHZkZXYgJWQgdHggZW5jYXAgbW9kZTogJWRcbiIsCisJCQkgICAgYXJ2 aWYtPnZkZXZfaWQsIHJldCk7CisJCXZpZi0+b2ZmbG9hZF9mbGFncyAmPSB+SUVFRTgwMjExX09G RkxPQURfRU5DQVBfRU5BQkxFRDsKKwl9CisKKwlwYXJhbV9pZCA9IFdNSV9WREVWX1BBUkFNX1JY X0RFQ0FQX1RZUEU7CisJaWYgKHZpZi0+b2ZmbG9hZF9mbGFncyAmIElFRUU4MDIxMV9PRkZMT0FE X0RFQ0FQX0VOQUJMRUQpCisJCXBhcmFtX3ZhbHVlID0gQVRIMTJLX0hXX1RYUlhfRVRIRVJORVQ7 CisJZWxzZSBpZiAodGVzdF9iaXQoQVRIMTJLX0ZMQUdfUkFXX01PREUsICZhYi0+ZGV2X2ZsYWdz KSkKKwkJcGFyYW1fdmFsdWUgPSBBVEgxMktfSFdfVFhSWF9SQVc7CisJZWxzZQorCQlwYXJhbV92 YWx1ZSA9IEFUSDEyS19IV19UWFJYX05BVElWRV9XSUZJOworCisJcmV0ID0gYXRoMTJrX3dtaV92 ZGV2X3NldF9wYXJhbV9jbWQoYXIsIGFydmlmLT52ZGV2X2lkLAorCQkJCQkgICAgcGFyYW1faWQs IHBhcmFtX3ZhbHVlKTsKKwlpZiAocmV0KSB7CisJCWF0aDEya193YXJuKGFiLCAiZmFpbGVkIHRv IHNldCB2ZGV2ICVkIHJ4IGRlY2FwIG1vZGU6ICVkXG4iLAorCQkJICAgIGFydmlmLT52ZGV2X2lk LCByZXQpOworCQl2aWYtPm9mZmxvYWRfZmxhZ3MgJj0gfklFRUU4MDIxMV9PRkZMT0FEX0RFQ0FQ X0VOQUJMRUQ7CisJfQorfQorCitzdGF0aWMgaW50IGF0aDEya19tYWNfb3BfYWRkX2ludGVyZmFj ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92 aWYgKnZpZikKK3sKKwlzdHJ1Y3QgYXRoMTJrICphciA9IGh3LT5wcml2OworCXN0cnVjdCBhdGgx MmtfYmFzZSAqYWIgPSBhci0+YWI7CisJc3RydWN0IGF0aDEya192aWYgKmFydmlmID0gYXRoMTJr X3ZpZl90b19hcnZpZih2aWYpOworCXN0cnVjdCBhdGgxMmtfd21pX3ZkZXZfY3JlYXRlX2FyZyB2 ZGV2X2FyZyA9IHswfTsKKwlzdHJ1Y3QgYXRoMTJrX3dtaV9wZWVyX2NyZWF0ZV9hcmcgcGVlcl9w YXJhbTsKKwl1MzIgcGFyYW1faWQsIHBhcmFtX3ZhbHVlOworCXUxNiBuc3M7CisJaW50IGk7CisJ aW50IHJldDsKKwlpbnQgYml0OworCisJdmlmLT5kcml2ZXJfZmxhZ3MgfD0gSUVFRTgwMjExX1ZJ Rl9TVVBQT1JUU19VQVBTRDsKKworCW11dGV4X2xvY2soJmFyLT5jb25mX211dGV4KTsKKworCWlm ICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgJiYKKwkgICAgYXItPm51bV9wZWVycyA+ IChhci0+bWF4X251bV9wZWVycyAtIDEpKSB7CisJCWF0aDEya193YXJuKGFiLCAiZmFpbGVkIHRv IGNyZWF0ZSB2ZGV2IGR1ZSB0byBpbnN1ZmZpY2llbnQgcGVlciBlbnRyeSByZXNvdXJjZSBpbiBm aXJtd2FyZVxuIik7CisJCXJldCA9IC1FTk9CVUZTOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAo YXItPm51bV9jcmVhdGVkX3ZkZXZzID4gKFRBUkdFVF9OVU1fVkRFVlMgLSAxKSkgeworCQlhdGgx Mmtfd2FybihhYiwgImZhaWxlZCB0byBjcmVhdGUgdmRldiwgcmVhY2hlZCBtYXggdmRldiBsaW1p dCAlZFxuIiwKKwkJCSAgICBUQVJHRVRfTlVNX1ZERVZTKTsKKwkJcmV0ID0gLUVCVVNZOworCQln b3RvIGVycjsKKwl9CisKKwltZW1zZXQoYXJ2aWYsIDAsIHNpemVvZigqYXJ2aWYpKTsKKworCWFy dmlmLT5hciA9IGFyOworCWFydmlmLT52aWYgPSB2aWY7CisKKwlJTklUX0xJU1RfSEVBRCgmYXJ2 aWYtPmxpc3QpOworCisJLyogU2hvdWxkIHdlIGluaXRpYWxpemUgYW55IHdvcmtlciB0byBoYW5k bGUgY29ubmVjdGlvbiBsb3NzIGluZGljYXRpb24KKwkgKiBmcm9tIGZpcm13YXJlIGluIHN0YSBt b2RlPworCSAqLworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXJ2aWYtPmJpdHJhdGVf bWFzay5jb250cm9sKTsgaSsrKSB7CisJCWFydmlmLT5iaXRyYXRlX21hc2suY29udHJvbFtpXS5s ZWdhY3kgPSAweGZmZmZmZmZmOworCQltZW1zZXQoYXJ2aWYtPmJpdHJhdGVfbWFzay5jb250cm9s W2ldLmh0X21jcywgMHhmZiwKKwkJICAgICAgIHNpemVvZihhcnZpZi0+Yml0cmF0ZV9tYXNrLmNv bnRyb2xbaV0uaHRfbWNzKSk7CisJCW1lbXNldChhcnZpZi0+Yml0cmF0ZV9tYXNrLmNvbnRyb2xb aV0udmh0X21jcywgMHhmZiwKKwkJICAgICAgIHNpemVvZihhcnZpZi0+Yml0cmF0ZV9tYXNrLmNv bnRyb2xbaV0udmh0X21jcykpOworCX0KKworCWJpdCA9IF9fZmZzNjQoYWItPmZyZWVfdmRldl9t YXApOworCisJYXJ2aWYtPnZkZXZfaWQgPSBiaXQ7CisJYXJ2aWYtPnZkZXZfc3VidHlwZSA9IFdN SV9WREVWX1NVQlRZUEVfTk9ORTsKKworCXN3aXRjaCAodmlmLT50eXBlKSB7CisJY2FzZSBOTDgw MjExX0lGVFlQRV9VTlNQRUNJRklFRDoKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJ CWFydmlmLT52ZGV2X3R5cGUgPSBXTUlfVkRFVl9UWVBFX1NUQTsKKwkJYnJlYWs7CisJY2FzZSBO TDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOgorCQlhcnZpZi0+dmRldl9zdWJ0eXBlID0gV01JX1ZE RVZfU1VCVFlQRV9NRVNIXzExUzsKKwkJZmFsbHRocm91Z2g7CisJY2FzZSBOTDgwMjExX0lGVFlQ RV9BUDoKKwkJYXJ2aWYtPnZkZXZfdHlwZSA9IFdNSV9WREVWX1RZUEVfQVA7CisJCWJyZWFrOwor CWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKKwkJYXJ2aWYtPnZkZXZfdHlwZSA9IFdNSV9W REVWX1RZUEVfTU9OSVRPUjsKKwkJYXItPm1vbml0b3JfdmRldl9pZCA9IGJpdDsKKwkJYnJlYWs7 CisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsKKwkJYnJlYWs7CisJfQorCisJYXRoMTJrX2RiZyhh ci0+YWIsIEFUSDEyS19EQkdfTUFDLCAibWFjIGFkZCBpbnRlcmZhY2UgaWQgJWQgdHlwZSAlZCBz dWJ0eXBlICVkIG1hcCAlbGx4XG4iLAorCQkgICBhcnZpZi0+dmRldl9pZCwgYXJ2aWYtPnZkZXZf dHlwZSwgYXJ2aWYtPnZkZXZfc3VidHlwZSwKKwkJICAgYWItPmZyZWVfdmRldl9tYXApOworCisJ dmlmLT5jYWJfcXVldWUgPSBhcnZpZi0+dmRldl9pZCAlIChBVEgxMktfSFdfTUFYX1FVRVVFUyAt IDEpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZpZi0+aHdfcXVldWUpOyBpKyspCisJ CXZpZi0+aHdfcXVldWVbaV0gPSBpICUgKEFUSDEyS19IV19NQVhfUVVFVUVTIC0gMSk7CisKKwlh dGgxMmtfbWFjX3NldHVwX3ZkZXZfY3JlYXRlX2FyZyhhcnZpZiwgJnZkZXZfYXJnKTsKKworCXJl dCA9IGF0aDEya193bWlfdmRldl9jcmVhdGUoYXIsIHZpZi0+YWRkciwgJnZkZXZfYXJnKTsKKwlp ZiAocmV0KSB7CisJCWF0aDEya193YXJuKGFiLCAiZmFpbGVkIHRvIGNyZWF0ZSBXTUkgdmRldiAl ZDogJWRcbiIsCisJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CisJCWdvdG8gZXJyOworCX0K KworCWFyLT5udW1fY3JlYXRlZF92ZGV2cysrOworCWF0aDEya19kYmcoYWIsIEFUSDEyS19EQkdf TUFDLCAidmRldiAlcE0gY3JlYXRlZCwgdmRldl9pZCAlZFxuIiwKKwkJICAgdmlmLT5hZGRyLCBh cnZpZi0+dmRldl9pZCk7CisJYXItPmFsbG9jYXRlZF92ZGV2X21hcCB8PSAxTEwgPDwgYXJ2aWYt PnZkZXZfaWQ7CisJYWItPmZyZWVfdmRldl9tYXAgJj0gfigxTEwgPDwgYXJ2aWYtPnZkZXZfaWQp OworCisJc3Bpbl9sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKKwlsaXN0X2FkZCgmYXJ2aWYtPmxp c3QsICZhci0+YXJ2aWZzKTsKKwlzcGluX3VubG9ja19iaCgmYXItPmRhdGFfbG9jayk7CisKKwlh dGgxMmtfbWFjX29wX3VwZGF0ZV92aWZfb2ZmbG9hZChodywgdmlmKTsKKworCW5zcyA9IGh3ZWln aHQzMihhci0+Y2ZnX3R4X2NoYWlubWFzaykgPyA6IDE7CisJcmV0ID0gYXRoMTJrX3dtaV92ZGV2 X3NldF9wYXJhbV9jbWQoYXIsIGFydmlmLT52ZGV2X2lkLAorCQkJCQkgICAgV01JX1ZERVZfUEFS QU1fTlNTLCBuc3MpOworCWlmIChyZXQpIHsKKwkJYXRoMTJrX3dhcm4oYWIsICJmYWlsZWQgdG8g c2V0IHZkZXYgJWQgY2hhaW5tYXNrIDB4JXgsIG5zcyAlZCA6JWRcbiIsCisJCQkgICAgYXJ2aWYt PnZkZXZfaWQsIGFyLT5jZmdfdHhfY2hhaW5tYXNrLCBuc3MsIHJldCk7CisJCWdvdG8gZXJyX3Zk ZXZfZGVsOworCX0KKworCXN3aXRjaCAoYXJ2aWYtPnZkZXZfdHlwZSkgeworCWNhc2UgV01JX1ZE RVZfVFlQRV9BUDoKKwkJcGVlcl9wYXJhbS52ZGV2X2lkID0gYXJ2aWYtPnZkZXZfaWQ7CisJCXBl ZXJfcGFyYW0ucGVlcl9hZGRyID0gdmlmLT5hZGRyOworCQlwZWVyX3BhcmFtLnBlZXJfdHlwZSA9 IFdNSV9QRUVSX1RZUEVfREVGQVVMVDsKKwkJcmV0ID0gYXRoMTJrX3BlZXJfY3JlYXRlKGFyLCBh cnZpZiwgTlVMTCwgJnBlZXJfcGFyYW0pOworCQlpZiAocmV0KSB7CisJCQlhdGgxMmtfd2Fybihh YiwgImZhaWxlZCB0byB2ZGV2ICVkIGNyZWF0ZSBwZWVyIGZvciBBUDogJWRcbiIsCisJCQkJICAg IGFydmlmLT52ZGV2X2lkLCByZXQpOworCQkJZ290byBlcnJfdmRldl9kZWw7CisJCX0KKworCQly ZXQgPSBhdGgxMmtfbWFjX3NldF9raWNrb3V0KGFydmlmKTsKKwkJaWYgKHJldCkgeworCQkJYXRo MTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIHNldCB2ZGV2ICVpIGtpY2tvdXQgcGFyYW1ldGVy czogJWRcbiIsCisJCQkJICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOworCQkJZ290byBlcnJfcGVl cl9kZWw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXTUlfVkRFVl9UWVBFX1NUQToKKwkJcGFyYW1f aWQgPSBXTUlfU1RBX1BTX1BBUkFNX1JYX1dBS0VfUE9MSUNZOworCQlwYXJhbV92YWx1ZSA9IFdN SV9TVEFfUFNfUlhfV0FLRV9QT0xJQ1lfV0FLRTsKKwkJcmV0ID0gYXRoMTJrX3dtaV9zZXRfc3Rh X3BzX3BhcmFtKGFyLCBhcnZpZi0+dmRldl9pZCwKKwkJCQkJCSAgcGFyYW1faWQsIHBhcmFtX3Zh bHVlKTsKKwkJaWYgKHJldCkgeworCQkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIHNl dCB2ZGV2ICVkIFJYIHdha2UgcG9saWN5OiAlZFxuIiwKKwkJCQkgICAgYXJ2aWYtPnZkZXZfaWQs IHJldCk7CisJCQlnb3RvIGVycl9wZWVyX2RlbDsKKwkJfQorCisJCXBhcmFtX2lkID0gV01JX1NU QV9QU19QQVJBTV9UWF9XQUtFX1RIUkVTSE9MRDsKKwkJcGFyYW1fdmFsdWUgPSBXTUlfU1RBX1BT X1RYX1dBS0VfVEhSRVNIT0xEX0FMV0FZUzsKKwkJcmV0ID0gYXRoMTJrX3dtaV9zZXRfc3RhX3Bz X3BhcmFtKGFyLCBhcnZpZi0+dmRldl9pZCwKKwkJCQkJCSAgcGFyYW1faWQsIHBhcmFtX3ZhbHVl KTsKKwkJaWYgKHJldCkgeworCQkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIHNldCB2 ZGV2ICVkIFRYIHdha2UgdGhyZXNob2xkOiAlZFxuIiwKKwkJCQkgICAgYXJ2aWYtPnZkZXZfaWQs IHJldCk7CisJCQlnb3RvIGVycl9wZWVyX2RlbDsKKwkJfQorCisJCXBhcmFtX2lkID0gV01JX1NU QV9QU19QQVJBTV9QU1BPTExfQ09VTlQ7CisJCXBhcmFtX3ZhbHVlID0gV01JX1NUQV9QU19QU1BP TExfQ09VTlRfTk9fTUFYOworCQlyZXQgPSBhdGgxMmtfd21pX3NldF9zdGFfcHNfcGFyYW0oYXIs IGFydmlmLT52ZGV2X2lkLAorCQkJCQkJICBwYXJhbV9pZCwgcGFyYW1fdmFsdWUpOworCQlpZiAo cmV0KSB7CisJCQlhdGgxMmtfd2Fybihhci0+YWIsICJmYWlsZWQgdG8gc2V0IHZkZXYgJWQgcHNw b2xsIGNvdW50OiAlZFxuIiwKKwkJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CisJCQlnb3Rv IGVycl9wZWVyX2RlbDsKKwkJfQorCisJCXJldCA9IGF0aDEya193bWlfcGRldl9zZXRfcHNfbW9k ZShhciwgYXJ2aWYtPnZkZXZfaWQsIGZhbHNlKTsKKwkJaWYgKHJldCkgeworCQkJYXRoMTJrX3dh cm4oYXItPmFiLCAiZmFpbGVkIHRvIGRpc2FibGUgdmRldiAlZCBwcyBtb2RlOiAlZFxuIiwKKwkJ CQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CisJCQlnb3RvIGVycl9wZWVyX2RlbDsKKwkJfQor CQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlhcnZpZi0+dHhwb3dlciA9IHZp Zi0+YnNzX2NvbmYudHhwb3dlcjsKKwlyZXQgPSBhdGgxMmtfbWFjX3R4cG93ZXJfcmVjYWxjKGFy KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9wZWVyX2RlbDsKKworCXBhcmFtX2lkID0gV01JX1ZE RVZfUEFSQU1fUlRTX1RIUkVTSE9MRDsKKwlwYXJhbV92YWx1ZSA9IGFyLT5ody0+d2lwaHktPnJ0 c190aHJlc2hvbGQ7CisJcmV0ID0gYXRoMTJrX3dtaV92ZGV2X3NldF9wYXJhbV9jbWQoYXIsIGFy dmlmLT52ZGV2X2lkLAorCQkJCQkgICAgcGFyYW1faWQsIHBhcmFtX3ZhbHVlKTsKKwlpZiAocmV0 KSB7CisJCWF0aDEya193YXJuKGFyLT5hYiwgImZhaWxlZCB0byBzZXQgcnRzIHRocmVzaG9sZCBm b3IgdmRldiAlZDogJWRcbiIsCisJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CisJfQorCisJ YXRoMTJrX2RwX3ZkZXZfdHhfYXR0YWNoKGFyLCBhcnZpZik7CisKKwlpZiAodmlmLT50eXBlICE9 IE5MODAyMTFfSUZUWVBFX01PTklUT1IgJiYgYXItPm1vbml0b3JfY29uZl9lbmFibGVkKQorCQlh dGgxMmtfbWFjX21vbml0b3JfdmRldl9jcmVhdGUoYXIpOworCisJbXV0ZXhfdW5sb2NrKCZhci0+ Y29uZl9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworCitlcnJfcGVlcl9kZWw6CisJaWYgKGFydmlm LT52ZGV2X3R5cGUgPT0gV01JX1ZERVZfVFlQRV9BUCkgeworCQlyZWluaXRfY29tcGxldGlvbigm YXItPnBlZXJfZGVsZXRlX2RvbmUpOworCisJCXJldCA9IGF0aDEya193bWlfc2VuZF9wZWVyX2Rl bGV0ZV9jbWQoYXIsIHZpZi0+YWRkciwKKwkJCQkJCSAgICAgIGFydmlmLT52ZGV2X2lkKTsKKwkJ aWYgKHJldCkgeworCQkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIGRlbGV0ZSBwZWVy IHZkZXZfaWQgJWQgYWRkciAlcE1cbiIsCisJCQkJICAgIGFydmlmLT52ZGV2X2lkLCB2aWYtPmFk ZHIpOworCQkJZ290byBlcnI7CisJCX0KKworCQlyZXQgPSBhdGgxMmtfd2FpdF9mb3JfcGVlcl9k ZWxldGVfZG9uZShhciwgYXJ2aWYtPnZkZXZfaWQsCisJCQkJCQkgICAgICAgdmlmLT5hZGRyKTsK KwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCisJCWFyLT5udW1fcGVlcnMtLTsKKwl9CisKK2Vy cl92ZGV2X2RlbDoKKwlhdGgxMmtfd21pX3ZkZXZfZGVsZXRlKGFyLCBhcnZpZi0+dmRldl9pZCk7 CisJYXItPm51bV9jcmVhdGVkX3ZkZXZzLS07CisJYXItPmFsbG9jYXRlZF92ZGV2X21hcCAmPSB+ KDFMTCA8PCBhcnZpZi0+dmRldl9pZCk7CisJYWItPmZyZWVfdmRldl9tYXAgfD0gMUxMIDw8IGFy dmlmLT52ZGV2X2lkOworCWFiLT5mcmVlX3ZkZXZfc3RhdHNfaWRfbWFwICY9IH4oMUxMIDw8IGFy dmlmLT52ZGV2X3N0YXRzX2lkKTsKKwlzcGluX2xvY2tfYmgoJmFyLT5kYXRhX2xvY2spOworCWxp c3RfZGVsKCZhcnZpZi0+bGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJmFyLT5kYXRhX2xvY2spOwor CitlcnI6CisJbXV0ZXhfdW5sb2NrKCZhci0+Y29uZl9tdXRleCk7CisKKwlyZXR1cm4gcmV0Owor fQorCitzdGF0aWMgdm9pZCBhdGgxMmtfbWFjX3ZpZl91bnJlZihzdHJ1Y3QgYXRoMTJrX2RwICpk cCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgYXRoMTJrX3R4X2Rlc2Nf aW5mbyAqdHhfZGVzY19pbmZvLCAqdG1wMTsKKwlzdHJ1Y3QgYXRoMTJrX3NrYl9jYiAqc2tiX2Ni OworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVRI MTJLX0hXX01BWF9RVUVVRVM7IGkrKykgeworCQlzcGluX2xvY2tfYmgoJmRwLT50eF9kZXNjX2xv Y2tbaV0pOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0eF9kZXNjX2luZm8sIHRtcDEs ICZkcC0+dHhfZGVzY191c2VkX2xpc3RbaV0sCisJCQkJCSBsaXN0KSB7CisJCQlza2IgPSB0eF9k ZXNjX2luZm8tPnNrYjsKKwkJCWlmICghc2tiKQorCQkJCWNvbnRpbnVlOworCisJCQlza2JfY2Ig PSBBVEgxMktfU0tCX0NCKHNrYik7CisJCQlpZiAoc2tiX2NiLT52aWYgPT0gdmlmKQorCQkJCXNr Yl9jYi0+dmlmID0gTlVMTDsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2JoKCZkcC0+dHhfZGVzY19s b2NrW2ldKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGF0aDEya19tYWNfb3BfcmVtb3ZlX2ludGVy ZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJICAgc3RydWN0IGllZWU4MDIxMV92 aWYgKnZpZikKK3sKKwlzdHJ1Y3QgYXRoMTJrICphciA9IGh3LT5wcml2OworCXN0cnVjdCBhdGgx MmtfdmlmICphcnZpZiA9IGF0aDEya192aWZfdG9fYXJ2aWYodmlmKTsKKwlzdHJ1Y3QgYXRoMTJr X2Jhc2UgKmFiID0gYXItPmFiOworCXVuc2lnbmVkIGxvbmcgdGltZV9sZWZ0OworCWludCByZXQ7 CisKKwltdXRleF9sb2NrKCZhci0+Y29uZl9tdXRleCk7CisKKwlhdGgxMmtfZGJnKGFiLCBBVEgx MktfREJHX01BQywgIm1hYyByZW1vdmUgaW50ZXJmYWNlICh2ZGV2ICVkKVxuIiwKKwkJICAgYXJ2 aWYtPnZkZXZfaWQpOworCisJaWYgKGFydmlmLT52ZGV2X3R5cGUgPT0gV01JX1ZERVZfVFlQRV9B UCkgeworCQlyZXQgPSBhdGgxMmtfcGVlcl9kZWxldGUoYXIsIGFydmlmLT52ZGV2X2lkLCB2aWYt PmFkZHIpOworCQlpZiAocmV0KQorCQkJYXRoMTJrX3dhcm4oYWIsICJmYWlsZWQgdG8gc3VibWl0 IEFQIHNlbGYtcGVlciByZW1vdmFsIG9uIHZkZXYgJWQ6ICVkXG4iLAorCQkJCSAgICBhcnZpZi0+ dmRldl9pZCwgcmV0KTsKKwl9CisKKwlyZWluaXRfY29tcGxldGlvbigmYXItPnZkZXZfZGVsZXRl X2RvbmUpOworCisJcmV0ID0gYXRoMTJrX3dtaV92ZGV2X2RlbGV0ZShhciwgYXJ2aWYtPnZkZXZf aWQpOworCWlmIChyZXQpIHsKKwkJYXRoMTJrX3dhcm4oYWIsICJmYWlsZWQgdG8gZGVsZXRlIFdN SSB2ZGV2ICVkOiAlZFxuIiwKKwkJCSAgICBhcnZpZi0+dmRldl9pZCwgcmV0KTsKKwkJZ290byBl cnJfdmRldl9kZWw7CisJfQorCisJdGltZV9sZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1l b3V0KCZhci0+dmRldl9kZWxldGVfZG9uZSwKKwkJCQkJCUFUSDEyS19WREVWX0RFTEVURV9USU1F T1VUX0haKTsKKwlpZiAodGltZV9sZWZ0ID09IDApIHsKKwkJYXRoMTJrX3dhcm4oYWIsICJUaW1l b3V0IGluIHJlY2VpdmluZyB2ZGV2IGRlbGV0ZSByZXNwb25zZVxuIik7CisJCWdvdG8gZXJyX3Zk ZXZfZGVsOworCX0KKworCWlmIChhcnZpZi0+dmRldl90eXBlID09IFdNSV9WREVWX1RZUEVfTU9O SVRPUikgeworCQlhci0+bW9uaXRvcl92ZGV2X2lkID0gLTE7CisJCWFyLT5tb25pdG9yX3ZkZXZf Y3JlYXRlZCA9IGZhbHNlOworCX0gZWxzZSBpZiAoYXItPm1vbml0b3JfdmRldl9jcmVhdGVkICYm ICFhci0+bW9uaXRvcl9zdGFydGVkKSB7CisJCXJldCA9IGF0aDEya19tYWNfbW9uaXRvcl92ZGV2 X2RlbGV0ZShhcik7CisJfQorCisJYWItPmZyZWVfdmRldl9tYXAgfD0gMUxMIDw8IChhcnZpZi0+ dmRldl9pZCk7CisJYXItPmFsbG9jYXRlZF92ZGV2X21hcCAmPSB+KDFMTCA8PCBhcnZpZi0+dmRl dl9pZCk7CisJYWItPmZyZWVfdmRldl9zdGF0c19pZF9tYXAgJj0gfigxTEwgPDwgYXJ2aWYtPnZk ZXZfc3RhdHNfaWQpOworCWFyLT5udW1fY3JlYXRlZF92ZGV2cy0tOworCisJYXRoMTJrX2RiZyhh YiwgQVRIMTJLX0RCR19NQUMsICJ2ZGV2ICVwTSBkZWxldGVkLCB2ZGV2X2lkICVkXG4iLAorCQkg ICB2aWYtPmFkZHIsIGFydmlmLT52ZGV2X2lkKTsKKworZXJyX3ZkZXZfZGVsOgorCXNwaW5fbG9j a19iaCgmYXItPmRhdGFfbG9jayk7CisJbGlzdF9kZWwoJmFydmlmLT5saXN0KTsKKwlzcGluX3Vu bG9ja19iaCgmYXItPmRhdGFfbG9jayk7CisKKwlhdGgxMmtfcGVlcl9jbGVhbnVwKGFyLCBhcnZp Zi0+dmRldl9pZCk7CisKKwlpZHJfZm9yX2VhY2goJmFyLT50eG1nbXRfaWRyLAorCQkgICAgIGF0 aDEya19tYWNfdmlmX3R4bWdtdF9pZHJfcmVtb3ZlLCB2aWYpOworCisJYXRoMTJrX21hY192aWZf dW5yZWYoJmFiLT5kcCwgdmlmKTsKKwlhdGgxMmtfZHBfdHhfcHV0X2JhbmtfcHJvZmlsZSgmYWIt PmRwLCBhcnZpZi0+YmFua19pZCk7CisKKwkvKiBSZWNhbGMgdHhwb3dlciBmb3IgcmVtYWluaW5n IHZkZXYgKi8KKwlhdGgxMmtfbWFjX3R4cG93ZXJfcmVjYWxjKGFyKTsKKwljbGVhcl9iaXQoQVRI MTJLX0ZMQUdfTU9OSVRPUl9FTkFCTEVELCAmYXItPm1vbml0b3JfZmxhZ3MpOworCisJLyogVE9E TzogcmVjYWwgdHJhZmZpYyBwYXVzZSBzdGF0ZSBiYXNlZCBvbiB0aGUgYXZhaWxhYmxlIHZkZXZz ICovCisKKwltdXRleF91bmxvY2soJmFyLT5jb25mX211dGV4KTsKK30KKworLyogRklYTUU6IEhh cyB0byBiZSB2ZXJpZmllZC4gKi8KKyNkZWZpbmUgU1VQUE9SVEVEX0ZJTFRFUlMJCQlcCisJKEZJ Rl9BTExNVUxUSSB8CQkJCVwKKwlGSUZfQ09OVFJPTCB8CQkJCVwKKwlGSUZfUFNQT0xMIHwJCQkJ XAorCUZJRl9PVEhFUl9CU1MgfAkJCQlcCisJRklGX0JDTl9QUkJSRVNQX1BST01JU0MgfAkJXAor CUZJRl9QUk9CRV9SRVEgfAkJCQlcCisJRklGX0ZDU0ZBSUwpCisKK3N0YXRpYyB2b2lkIGF0aDEy a19tYWNfb3BfY29uZmlndXJlX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJ ICAgdW5zaWduZWQgaW50IGNoYW5nZWRfZmxhZ3MsCisJCQkJCSAgIHVuc2lnbmVkIGludCAqdG90 YWxfZmxhZ3MsCisJCQkJCSAgIHU2NCBtdWx0aWNhc3QpCit7CisJc3RydWN0IGF0aDEyayAqYXIg PSBody0+cHJpdjsKKwlib29sIHJlc2V0X2ZsYWc7CisJaW50IHJldDsKKworCW11dGV4X2xvY2so JmFyLT5jb25mX211dGV4KTsKKworCWNoYW5nZWRfZmxhZ3MgJj0gU1VQUE9SVEVEX0ZJTFRFUlM7 CisJKnRvdGFsX2ZsYWdzICY9IFNVUFBPUlRFRF9GSUxURVJTOworCWFyLT5maWx0ZXJfZmxhZ3Mg PSAqdG90YWxfZmxhZ3M7CisKKwkvKiBGb3IgbW9uaXRvciBtb2RlICovCisJcmVzZXRfZmxhZyA9 ICEoYXItPmZpbHRlcl9mbGFncyAmIEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDKTsKKworCXJldCA9 IGF0aDEya19kcF90eF9odHRfbW9uaXRvcl9tb2RlX3JpbmdfY29uZmlnKGFyLCByZXNldF9mbGFn KTsKKwlpZiAoIXJldCkgeworCQlpZiAoIXJlc2V0X2ZsYWcpCisJCQlzZXRfYml0KEFUSDEyS19G TEFHX01PTklUT1JfRU5BQkxFRCwgJmFyLT5tb25pdG9yX2ZsYWdzKTsKKwkJZWxzZQorCQkJY2xl YXJfYml0KEFUSDEyS19GTEFHX01PTklUT1JfRU5BQkxFRCwgJmFyLT5tb25pdG9yX2ZsYWdzKTsK Kwl9IGVsc2UgeworCQlhdGgxMmtfd2Fybihhci0+YWIsCisJCQkgICAgImZhaWwgdG8gc2V0IG1v bml0b3IgZmlsdGVyOiAlZFxuIiwgcmV0KTsKKwl9CisJYXRoMTJrX2RiZyhhci0+YWIsIEFUSDEy S19EQkdfTUFDLAorCQkgICAiY2hhbmdlZF9mbGFnczoweCV4LCB0b3RhbF9mbGFnczoweCV4LCBy ZXNldF9mbGFnOiVkXG4iLAorCQkgICBjaGFuZ2VkX2ZsYWdzLCAqdG90YWxfZmxhZ3MsIHJlc2V0 X2ZsYWcpOworCisJbXV0ZXhfdW5sb2NrKCZhci0+Y29uZl9tdXRleCk7Cit9CisKK3N0YXRpYyBp bnQgYXRoMTJrX21hY19vcF9nZXRfYW50ZW5uYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMy ICp0eF9hbnQsIHUzMiAqcnhfYW50KQoreworCXN0cnVjdCBhdGgxMmsgKmFyID0gaHctPnByaXY7 CisKKwltdXRleF9sb2NrKCZhci0+Y29uZl9tdXRleCk7CisKKwkqdHhfYW50ID0gYXItPmNmZ190 eF9jaGFpbm1hc2s7CisJKnJ4X2FudCA9IGFyLT5jZmdfcnhfY2hhaW5tYXNrOworCisJbXV0ZXhf dW5sb2NrKCZhci0+Y29uZl9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBh dGgxMmtfbWFjX29wX3NldF9hbnRlbm5hKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgdHhf YW50LCB1MzIgcnhfYW50KQoreworCXN0cnVjdCBhdGgxMmsgKmFyID0gaHctPnByaXY7CisJaW50 IHJldDsKKworCW11dGV4X2xvY2soJmFyLT5jb25mX211dGV4KTsKKwlyZXQgPSBfX2F0aDEya19z ZXRfYW50ZW5uYShhciwgdHhfYW50LCByeF9hbnQpOworCW11dGV4X3VubG9jaygmYXItPmNvbmZf bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdGgxMmtfbWFjX29wX2Ft cGR1X2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgICBzdHJ1Y3QgaWVl ZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfYW1wZHVfcGFyYW1z ICpwYXJhbXMpCit7CisJc3RydWN0IGF0aDEyayAqYXIgPSBody0+cHJpdjsKKwlpbnQgcmV0ID0g LUVJTlZBTDsKKworCW11dGV4X2xvY2soJmFyLT5jb25mX211dGV4KTsKKworCXN3aXRjaCAocGFy YW1zLT5hY3Rpb24pIHsKKwljYXNlIElFRUU4MDIxMV9BTVBEVV9SWF9TVEFSVDoKKwkJcmV0ID0g YXRoMTJrX2RwX3J4X2FtcGR1X3N0YXJ0KGFyLCBwYXJhbXMpOworCQlicmVhazsKKwljYXNlIElF RUU4MDIxMV9BTVBEVV9SWF9TVE9QOgorCQlyZXQgPSBhdGgxMmtfZHBfcnhfYW1wZHVfc3RvcChh ciwgcGFyYW1zKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQ6CisJ Y2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUF9DT05UOgorCWNhc2UgSUVFRTgwMjExX0FNUERV X1RYX1NUT1BfRkxVU0g6CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUF9GTFVTSF9DT05U OgorCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX09QRVJBVElPTkFMOgorCQkvKiBUeCBBLU1QRFUg YWdncmVnYXRpb24gb2ZmbG9hZGVkIHRvIGh3L2Z3IHNvIGRlbnkgbWFjODAyMTEKKwkJICogVHgg YWdncmVnYXRpb24gcmVxdWVzdHMuCisJCSAqLworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJYnJl YWs7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZhci0+Y29uZl9tdXRleCk7CisKKwlyZXR1cm4gcmV0 OworfQorCitzdGF0aWMgaW50IGF0aDEya19tYWNfb3BfYWRkX2NoYW5jdHgoc3RydWN0IGllZWU4 MDIxMV9odyAqaHcsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHhfY29uZiAqY3R4 KQoreworCXN0cnVjdCBhdGgxMmsgKmFyID0gaHctPnByaXY7CisJc3RydWN0IGF0aDEya19iYXNl ICphYiA9IGFyLT5hYjsKKworCWF0aDEya19kYmcoYWIsIEFUSDEyS19EQkdfTUFDLAorCQkgICAi bWFjIGNoYW5jdHggYWRkIGZyZXEgJXUgd2lkdGggJWQgcHRyICVwS1xuIiwKKwkJICAgY3R4LT5k ZWYuY2hhbi0+Y2VudGVyX2ZyZXEsIGN0eC0+ZGVmLndpZHRoLCBjdHgpOworCisJbXV0ZXhfbG9j aygmYXItPmNvbmZfbXV0ZXgpOworCisJc3Bpbl9sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKKwkv KiBUT0RPOiBJbiBjYXNlIG9mIG11bHRpcGxlIGNoYW5uZWwgY29udGV4dCwgcG9wdWxhdGUgcnhf Y2hhbm5lbCBmcm9tCisJICogUnggUFBEVSBkZXNjIGluZm9ybWF0aW9uLgorCSAqLworCWFyLT5y eF9jaGFubmVsID0gY3R4LT5kZWYuY2hhbjsKKwlzcGluX3VubG9ja19iaCgmYXItPmRhdGFfbG9j ayk7CisKKwltdXRleF91bmxvY2soJmFyLT5jb25mX211dGV4KTsKKworCXJldHVybiAwOworfQor CitzdGF0aWMgdm9pZCBhdGgxMmtfbWFjX29wX3JlbW92ZV9jaGFuY3R4KHN0cnVjdCBpZWVlODAy MTFfaHcgKmh3LAorCQkJCQkgc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4X2NvbmYgKmN0eCkKK3sK KwlzdHJ1Y3QgYXRoMTJrICphciA9IGh3LT5wcml2OworCXN0cnVjdCBhdGgxMmtfYmFzZSAqYWIg PSBhci0+YWI7CisKKwlhdGgxMmtfZGJnKGFiLCBBVEgxMktfREJHX01BQywKKwkJICAgIm1hYyBj aGFuY3R4IHJlbW92ZSBmcmVxICV1IHdpZHRoICVkIHB0ciAlcEtcbiIsCisJCSAgIGN0eC0+ZGVm LmNoYW4tPmNlbnRlcl9mcmVxLCBjdHgtPmRlZi53aWR0aCwgY3R4KTsKKworCW11dGV4X2xvY2so JmFyLT5jb25mX211dGV4KTsKKworCXNwaW5fbG9ja19iaCgmYXItPmRhdGFfbG9jayk7CisJLyog VE9ETzogSW4gY2FzZSBvZiB0aGVyZSBpcyBvbmUgbW9yZSBjaGFubmVsIGNvbnRleHQgbGVmdCwg cG9wdWxhdGUKKwkgKiByeF9jaGFubmVsIHdpdGggdGhlIGNoYW5uZWwgb2YgdGhhdCByZW1haW5p bmcgY2hhbm5lbCBjb250ZXh0LgorCSAqLworCWFyLT5yeF9jaGFubmVsID0gTlVMTDsKKwlzcGlu X3VubG9ja19iaCgmYXItPmRhdGFfbG9jayk7CisKKwltdXRleF91bmxvY2soJmFyLT5jb25mX211 dGV4KTsKK30KKworc3RhdGljIGludAorYXRoMTJrX21hY192ZGV2X3N0YXJ0X3Jlc3RhcnQoc3Ry dWN0IGF0aDEya192aWYgKmFydmlmLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGNmZzgwMjExX2No YW5fZGVmICpjaGFuZGVmLAorCQkJICAgICAgYm9vbCByZXN0YXJ0KQoreworCXN0cnVjdCBhdGgx MmsgKmFyID0gYXJ2aWYtPmFyOworCXN0cnVjdCBhdGgxMmtfYmFzZSAqYWIgPSBhci0+YWI7CisJ c3RydWN0IHdtaV92ZGV2X3N0YXJ0X3JlcV9hcmcgYXJnID0ge307CisJaW50IGhlX3N1cHBvcnQg PSBhcnZpZi0+dmlmLT5ic3NfY29uZi5oZV9zdXBwb3J0OworCWludCByZXQ7CisKKwlsb2NrZGVw X2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7CisKKwlyZWluaXRfY29tcGxldGlvbigmYXIt PnZkZXZfc2V0dXBfZG9uZSk7CisKKwlhcmcudmRldl9pZCA9IGFydmlmLT52ZGV2X2lkOworCWFy Zy5kdGltX3BlcmlvZCA9IGFydmlmLT5kdGltX3BlcmlvZDsKKwlhcmcuYmNuX2ludHZhbCA9IGFy dmlmLT5iZWFjb25faW50ZXJ2YWw7CisKKwlhcmcuZnJlcSA9IGNoYW5kZWYtPmNoYW4tPmNlbnRl cl9mcmVxOworCWFyZy5iYW5kX2NlbnRlcl9mcmVxMSA9IGNoYW5kZWYtPmNlbnRlcl9mcmVxMTsK KwlhcmcuYmFuZF9jZW50ZXJfZnJlcTIgPSBjaGFuZGVmLT5jZW50ZXJfZnJlcTI7CisJYXJnLm1v ZGUgPSBhdGgxMmtfcGh5bW9kZXNbY2hhbmRlZi0+Y2hhbi0+YmFuZF1bY2hhbmRlZi0+d2lkdGhd OworCisJYXJnLm1pbl9wb3dlciA9IDA7CisJYXJnLm1heF9wb3dlciA9IGNoYW5kZWYtPmNoYW4t Pm1heF9wb3dlciAqIDI7CisJYXJnLm1heF9yZWdfcG93ZXIgPSBjaGFuZGVmLT5jaGFuLT5tYXhf cmVnX3Bvd2VyICogMjsKKwlhcmcubWF4X2FudGVubmFfZ2FpbiA9IGNoYW5kZWYtPmNoYW4tPm1h eF9hbnRlbm5hX2dhaW4gKiAyOworCisJYXJnLnByZWZfdHhfc3RyZWFtcyA9IGFyLT5udW1fdHhf Y2hhaW5zOworCWFyZy5wcmVmX3J4X3N0cmVhbXMgPSBhci0+bnVtX3J4X2NoYWluczsKKworCWlm IChhcnZpZi0+dmRldl90eXBlID09IFdNSV9WREVWX1RZUEVfQVApIHsKKwkJYXJnLnNzaWQgPSBh cnZpZi0+dS5hcC5zc2lkOworCQlhcmcuc3NpZF9sZW4gPSBhcnZpZi0+dS5hcC5zc2lkX2xlbjsK KwkJYXJnLmhpZGRlbl9zc2lkID0gYXJ2aWYtPnUuYXAuaGlkZGVuX3NzaWQ7CisKKwkJLyogRm9y IG5vdyBhbGxvdyBERlMgZm9yIEFQIG1vZGUgKi8KKwkJYXJnLmNoYW5fcmFkYXIgPSAhIShjaGFu ZGVmLT5jaGFuLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX1JBREFSKTsKKworCQlhcmcucGFzc2l2 ZSA9IGFyZy5jaGFuX3JhZGFyOworCisJCXNwaW5fbG9ja19iaCgmYWItPmJhc2VfbG9jayk7CisJ CWFyZy5yZWdkb21haW4gPSBhci0+YWItPmRmc19yZWdpb247CisJCXNwaW5fdW5sb2NrX2JoKCZh Yi0+YmFzZV9sb2NrKTsKKworCQkvKiBUT0RPOiBOb3RpZnkgaWYgc2Vjb25kYXJ5IDgwTWh6IGFs c28gbmVlZHMgcmFkYXIgZGV0ZWN0aW9uICovCisJCWlmIChoZV9zdXBwb3J0KSB7CisJCQlyZXQg PSBhdGgxMmtfc2V0X2hlX211X3NvdW5kaW5nX21vZGUoYXIsIGFydmlmKTsKKwkJCWlmIChyZXQp IHsKKwkJCQlhdGgxMmtfd2Fybihhci0+YWIsICJmYWlsZWQgdG8gc2V0IGhlIG1vZGUgdmRldiAl aVxuIiwKKwkJCQkJICAgIGFyZy52ZGV2X2lkKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9 CisJfQorCisJYXJnLnBhc3NpdmUgfD0gISEoY2hhbmRlZi0+Y2hhbi0+ZmxhZ3MgJiBJRUVFODAy MTFfQ0hBTl9OT19JUik7CisKKwlhdGgxMmtfZGJnKGFiLCBBVEgxMktfREJHX01BQywKKwkJICAg Im1hYyB2ZGV2ICVkIHN0YXJ0IGNlbnRlcl9mcmVxICVkIHBoeW1vZGUgJXNcbiIsCisJCSAgIGFy Zy52ZGV2X2lkLCBhcmcuZnJlcSwKKwkJICAgYXRoMTJrX21hY19waHltb2RlX3N0cihhcmcubW9k ZSkpOworCisJcmV0ID0gYXRoMTJrX3dtaV92ZGV2X3N0YXJ0KGFyLCAmYXJnLCByZXN0YXJ0KTsK KwlpZiAocmV0KSB7CisJCWF0aDEya193YXJuKGFyLT5hYiwgImZhaWxlZCB0byAlcyBXTUkgdmRl diAlaVxuIiwKKwkJCSAgICByZXN0YXJ0ID8gInJlc3RhcnQiIDogInN0YXJ0IiwgYXJnLnZkZXZf aWQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGF0aDEya19tYWNfdmRldl9zZXR1cF9z eW5jKGFyKTsKKwlpZiAocmV0KSB7CisJCWF0aDEya193YXJuKGFiLCAiZmFpbGVkIHRvIHN5bmNo cm9uaXplIHNldHVwIGZvciB2ZGV2ICVpICVzOiAlZFxuIiwKKwkJCSAgICBhcmcudmRldl9pZCwg cmVzdGFydCA/ICJyZXN0YXJ0IiA6ICJzdGFydCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQor CisJYXItPm51bV9zdGFydGVkX3ZkZXZzKys7CisJYXRoMTJrX2RiZyhhYiwgQVRIMTJLX0RCR19N QUMsICAidmRldiAlcE0gc3RhcnRlZCwgdmRldl9pZCAlZFxuIiwKKwkJICAgYXJ2aWYtPnZpZi0+ YWRkciwgYXJ2aWYtPnZkZXZfaWQpOworCisJLyogRW5hYmxlIENBQyBGbGFnIGluIHRoZSBkcml2 ZXIgYnkgY2hlY2tpbmcgdGhlIGNoYW5uZWwgREZTIGNhYyB0aW1lLAorCSAqIGkuZSBkZnNfY2Fj X21zIHZhbHVlIHdoaWNoIHdpbGwgYmUgdmFsaWQgb25seSBmb3IgcmFkYXIgY2hhbm5lbHMKKwkg KiBhbmQgc3RhdGUgYXMgTkw4MDIxMV9ERlNfVVNBQkxFIHdoaWNoIGluZGljYXRlcyBDQUMgbmVl ZHMgdG8gYmUKKwkgKiBkb25lIGJlZm9yZSBjaGFubmVsIHVzYWdlLiBUaGlzIGZsYWdzIGlzIHVz ZWQgdG8gZHJvcCByeCBwYWNrZXRzLgorCSAqIGR1cmluZyBDQUMuCisJICovCisJLyogVE9ETzog U2V0IHRoZSBmbGFnIGZvciBvdGhlciBpbnRlcmZhY2UgdHlwZXMgYXMgcmVxdWlyZWQgKi8KKwlp ZiAoYXJ2aWYtPnZkZXZfdHlwZSA9PSBXTUlfVkRFVl9UWVBFX0FQICYmCisJICAgIGNoYW5kZWYt PmNoYW4tPmRmc19jYWNfbXMgJiYKKwkgICAgY2hhbmRlZi0+Y2hhbi0+ZGZzX3N0YXRlID09IE5M ODAyMTFfREZTX1VTQUJMRSkgeworCQlzZXRfYml0KEFUSDEyS19DQUNfUlVOTklORywgJmFyLT5k ZXZfZmxhZ3MpOworCQlhdGgxMmtfZGJnKGFiLCBBVEgxMktfREJHX01BQywKKwkJCSAgICJDQUMg U3RhcnRlZCBpbiBjaGFuX2ZyZXEgJWQgZm9yIHZkZXYgJWRcbiIsCisJCQkgICBhcmcuZnJlcSwg YXJnLnZkZXZfaWQpOworCX0KKworCXJldCA9IGF0aDEya19tYWNfc2V0X3R4YmZfY29uZihhcnZp Zik7CisJaWYgKHJldCkKKwkJYXRoMTJrX3dhcm4oYWIsICJmYWlsZWQgdG8gc2V0IHR4YmYgY29u ZiBmb3IgdmRldiAlZDogJWRcbiIsCisJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CisKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGgxMmtfbWFjX3ZkZXZfc3RvcChzdHJ1Y3QgYXRo MTJrX3ZpZiAqYXJ2aWYpCit7CisJc3RydWN0IGF0aDEyayAqYXIgPSBhcnZpZi0+YXI7CisJaW50 IHJldDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFyLT5jb25mX211dGV4KTsKKworCXJlaW5p dF9jb21wbGV0aW9uKCZhci0+dmRldl9zZXR1cF9kb25lKTsKKworCXJldCA9IGF0aDEya193bWlf dmRldl9zdG9wKGFyLCBhcnZpZi0+dmRldl9pZCk7CisJaWYgKHJldCkgeworCQlhdGgxMmtfd2Fy bihhci0+YWIsICJmYWlsZWQgdG8gc3RvcCBXTUkgdmRldiAlaTogJWRcbiIsCisJCQkgICAgYXJ2 aWYtPnZkZXZfaWQsIHJldCk7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IGF0aDEya19tYWNf dmRldl9zZXR1cF9zeW5jKGFyKTsKKwlpZiAocmV0KSB7CisJCWF0aDEya193YXJuKGFyLT5hYiwg ImZhaWxlZCB0byBzeW5jaHJvbml6ZSBzZXR1cCBmb3IgdmRldiAlaTogJWRcbiIsCisJCQkgICAg YXJ2aWYtPnZkZXZfaWQsIHJldCk7CisJCWdvdG8gZXJyOworCX0KKworCVdBUk5fT04oYXItPm51 bV9zdGFydGVkX3ZkZXZzID09IDApOworCisJYXItPm51bV9zdGFydGVkX3ZkZXZzLS07CisJYXRo MTJrX2RiZyhhci0+YWIsIEFUSDEyS19EQkdfTUFDLCAidmRldiAlcE0gc3RvcHBlZCwgdmRldl9p ZCAlZFxuIiwKKwkJICAgYXJ2aWYtPnZpZi0+YWRkciwgYXJ2aWYtPnZkZXZfaWQpOworCisJaWYg KHRlc3RfYml0KEFUSDEyS19DQUNfUlVOTklORywgJmFyLT5kZXZfZmxhZ3MpKSB7CisJCWNsZWFy X2JpdChBVEgxMktfQ0FDX1JVTk5JTkcsICZhci0+ZGV2X2ZsYWdzKTsKKwkJYXRoMTJrX2RiZyhh ci0+YWIsIEFUSDEyS19EQkdfTUFDLCAiQ0FDIFN0b3BwZWQgZm9yIHZkZXYgJWRcbiIsCisJCQkg ICBhcnZpZi0+dmRldl9pZCk7CisJfQorCisJcmV0dXJuIDA7CitlcnI6CisJcmV0dXJuIHJldDsK K30KKworc3RhdGljIGludCBhdGgxMmtfbWFjX3ZkZXZfc3RhcnQoc3RydWN0IGF0aDEya192aWYg KmFydmlmLAorCQkJCSBjb25zdCBzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYpCit7 CisJcmV0dXJuIGF0aDEya19tYWNfdmRldl9zdGFydF9yZXN0YXJ0KGFydmlmLCBjaGFuZGVmLCBm YWxzZSk7Cit9CisKK3N0YXRpYyBpbnQgYXRoMTJrX21hY192ZGV2X3Jlc3RhcnQoc3RydWN0IGF0 aDEya192aWYgKmFydmlmLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAq Y2hhbmRlZikKK3sKKwlyZXR1cm4gYXRoMTJrX21hY192ZGV2X3N0YXJ0X3Jlc3RhcnQoYXJ2aWYs IGNoYW5kZWYsIHRydWUpOworfQorCitzdHJ1Y3QgYXRoMTJrX21hY19jaGFuZ2VfY2hhbmN0eF9h cmcgeworCXN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eF9jb25mICpjdHg7CisJc3RydWN0IGllZWU4 MDIxMV92aWZfY2hhbmN0eF9zd2l0Y2ggKnZpZnM7CisJaW50IG5fdmlmczsKKwlpbnQgbmV4dF92 aWY7Cit9OworCitzdGF0aWMgdm9pZAorYXRoMTJrX21hY19jaGFuZ2VfY2hhbmN0eF9jbnRfaXRl cih2b2lkICpkYXRhLCB1OCAqbWFjLAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYp Cit7CisJc3RydWN0IGF0aDEya19tYWNfY2hhbmdlX2NoYW5jdHhfYXJnICphcmcgPSBkYXRhOwor CisJaWYgKHJjdV9hY2Nlc3NfcG9pbnRlcih2aWYtPmJzc19jb25mLmNoYW5jdHhfY29uZikgIT0g YXJnLT5jdHgpCisJCXJldHVybjsKKworCWFyZy0+bl92aWZzKys7Cit9CisKK3N0YXRpYyB2b2lk CithdGgxMmtfbWFjX2NoYW5nZV9jaGFuY3R4X2ZpbGxfaXRlcih2b2lkICpkYXRhLCB1OCAqbWFj LAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBhdGgxMmtf bWFjX2NoYW5nZV9jaGFuY3R4X2FyZyAqYXJnID0gZGF0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2No YW5jdHhfY29uZiAqY3R4OworCisJY3R4ID0gcmN1X2FjY2Vzc19wb2ludGVyKHZpZi0+YnNzX2Nv bmYuY2hhbmN0eF9jb25mKTsKKwlpZiAoY3R4ICE9IGFyZy0+Y3R4KQorCQlyZXR1cm47CisKKwlp ZiAoV0FSTl9PTihhcmctPm5leHRfdmlmID09IGFyZy0+bl92aWZzKSkKKwkJcmV0dXJuOworCisJ YXJnLT52aWZzW2FyZy0+bmV4dF92aWZdLnZpZiA9IHZpZjsKKwlhcmctPnZpZnNbYXJnLT5uZXh0 X3ZpZl0ub2xkX2N0eCA9IGN0eDsKKwlhcmctPnZpZnNbYXJnLT5uZXh0X3ZpZl0ubmV3X2N0eCA9 IGN0eDsKKwlhcmctPm5leHRfdmlmKys7Cit9CisKK3N0YXRpYyB2b2lkCithdGgxMmtfbWFjX3Vw ZGF0ZV92aWZfY2hhbihzdHJ1Y3QgYXRoMTJrICphciwKKwkJCSAgIHN0cnVjdCBpZWVlODAyMTFf dmlmX2NoYW5jdHhfc3dpdGNoICp2aWZzLAorCQkJICAgaW50IG5fdmlmcykKK3sKKwlzdHJ1Y3Qg YXRoMTJrX2Jhc2UgKmFiID0gYXItPmFiOworCXN0cnVjdCBhdGgxMmtfdmlmICphcnZpZjsKKwlp bnQgcmV0OworCWludCBpOworCWJvb2wgbW9uaXRvcl92aWYgPSBmYWxzZTsKKworCWxvY2tkZXBf YXNzZXJ0X2hlbGQoJmFyLT5jb25mX211dGV4KTsKKworCWZvciAoaSA9IDA7IGkgPCBuX3ZpZnM7 IGkrKykgeworCQlhcnZpZiA9ICh2b2lkICopdmlmc1tpXS52aWYtPmRydl9wcml2OworCisJCWlm ICh2aWZzW2ldLnZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKQorCQkJbW9uaXRv cl92aWYgPSB0cnVlOworCisJCWF0aDEya19kYmcoYWIsIEFUSDEyS19EQkdfTUFDLAorCQkJICAg Im1hYyBjaGFuY3R4IHN3aXRjaCB2ZGV2X2lkICVpIGZyZXEgJXUtPiV1IHdpZHRoICVkLT4lZFxu IiwKKwkJCSAgIGFydmlmLT52ZGV2X2lkLAorCQkJICAgdmlmc1tpXS5vbGRfY3R4LT5kZWYuY2hh bi0+Y2VudGVyX2ZyZXEsCisJCQkgICB2aWZzW2ldLm5ld19jdHgtPmRlZi5jaGFuLT5jZW50ZXJf ZnJlcSwKKwkJCSAgIHZpZnNbaV0ub2xkX2N0eC0+ZGVmLndpZHRoLAorCQkJICAgdmlmc1tpXS5u ZXdfY3R4LT5kZWYud2lkdGgpOworCisJCWlmIChXQVJOX09OKCFhcnZpZi0+aXNfc3RhcnRlZCkp CisJCQljb250aW51ZTsKKworCQlpZiAoV0FSTl9PTighYXJ2aWYtPmlzX3VwKSkKKwkJCWNvbnRp bnVlOworCisJCXJldCA9IGF0aDEya193bWlfdmRldl9kb3duKGFyLCBhcnZpZi0+dmRldl9pZCk7 CisJCWlmIChyZXQpIHsKKwkJCWF0aDEya193YXJuKGFiLCAiZmFpbGVkIHRvIGRvd24gdmRldiAl ZDogJWRcbiIsCisJCQkJICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOworCQkJY29udGludWU7CisJ CX0KKwl9CisKKwkvKiBBbGwgcmVsZXZhbnQgdmRldnMgYXJlIGRvd25lZCBhbmQgYXNzb2NpYXRl ZCBjaGFubmVsIHJlc291cmNlcworCSAqIHNob3VsZCBiZSBhdmFpbGFibGUgZm9yIHRoZSBjaGFu bmVsIHN3aXRjaCBub3cuCisJICovCisKKwkvKiBUT0RPOiBVcGRhdGUgYXItPnJ4X2NoYW5uZWwg Ki8KKworCWZvciAoaSA9IDA7IGkgPCBuX3ZpZnM7IGkrKykgeworCQlhcnZpZiA9ICh2b2lkICop dmlmc1tpXS52aWYtPmRydl9wcml2OworCisJCWlmIChXQVJOX09OKCFhcnZpZi0+aXNfc3RhcnRl ZCkpCisJCQljb250aW51ZTsKKworCQlpZiAoV0FSTl9PTighYXJ2aWYtPmlzX3VwKSkKKwkJCWNv bnRpbnVlOworCisJCXJldCA9IGF0aDEya19tYWNfdmRldl9yZXN0YXJ0KGFydmlmLCAmdmlmc1tp XS5uZXdfY3R4LT5kZWYpOworCQlpZiAocmV0KSB7CisJCQlhdGgxMmtfd2FybihhYiwgImZhaWxl ZCB0byByZXN0YXJ0IHZkZXYgJWQ6ICVkXG4iLAorCQkJCSAgICBhcnZpZi0+dmRldl9pZCwgcmV0 KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmV0ID0gYXRoMTJrX21hY19zZXR1cF9iY25fdG1w bChhcnZpZik7CisJCWlmIChyZXQpCisJCQlhdGgxMmtfd2FybihhYiwgImZhaWxlZCB0byB1cGRh dGUgYmNuIHRtcGwgZHVyaW5nIGNzYTogJWRcbiIsCisJCQkJICAgIHJldCk7CisKKwkJcmV0ID0g YXRoMTJrX3dtaV92ZGV2X3VwKGFydmlmLT5hciwgYXJ2aWYtPnZkZXZfaWQsIGFydmlmLT5haWQs CisJCQkJCSBhcnZpZi0+YnNzaWQpOworCQlpZiAocmV0KSB7CisJCQlhdGgxMmtfd2FybihhYiwg ImZhaWxlZCB0byBicmluZyB2ZGV2IHVwICVkOiAlZFxuIiwKKwkJCQkgICAgYXJ2aWYtPnZkZXZf aWQsIHJldCk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKworCS8qIFJlc3RhcnQgdGhlIGludGVy bmFsIG1vbml0b3IgdmRldiBvbiBuZXcgY2hhbm5lbCAqLworCWlmICghbW9uaXRvcl92aWYgJiYg YXItPm1vbml0b3JfdmRldl9jcmVhdGVkKSB7CisJCWlmICghYXRoMTJrX21hY19tb25pdG9yX3N0 b3AoYXIpKQorCQkJYXRoMTJrX21hY19tb25pdG9yX3N0YXJ0KGFyKTsKKwl9Cit9CisKK3N0YXRp YyB2b2lkCithdGgxMmtfbWFjX3VwZGF0ZV9hY3RpdmVfdmlmX2NoYW4oc3RydWN0IGF0aDEyayAq YXIsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHhfY29uZiAqY3R4KQoreworCXN0cnVj dCBhdGgxMmtfbWFjX2NoYW5nZV9jaGFuY3R4X2FyZyBhcmcgPSB7IC5jdHggPSBjdHggfTsKKwor CWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFyLT5jb25mX211dGV4KTsKKworCWllZWU4MDIxMV9pdGVy YXRlX2FjdGl2ZV9pbnRlcmZhY2VzX2F0b21pYyhhci0+aHcsCisJCQkJCQkgICBJRUVFODAyMTFf SUZBQ0VfSVRFUl9OT1JNQUwsCisJCQkJCQkgICBhdGgxMmtfbWFjX2NoYW5nZV9jaGFuY3R4X2Nu dF9pdGVyLAorCQkJCQkJICAgJmFyZyk7CisJaWYgKGFyZy5uX3ZpZnMgPT0gMCkKKwkJcmV0dXJu OworCisJYXJnLnZpZnMgPSBrY2FsbG9jKGFyZy5uX3ZpZnMsIHNpemVvZihhcmcudmlmc1swXSks IEdGUF9LRVJORUwpOworCWlmICghYXJnLnZpZnMpCisJCXJldHVybjsKKworCWllZWU4MDIxMV9p dGVyYXRlX2FjdGl2ZV9pbnRlcmZhY2VzX2F0b21pYyhhci0+aHcsCisJCQkJCQkgICBJRUVFODAy MTFfSUZBQ0VfSVRFUl9OT1JNQUwsCisJCQkJCQkgICBhdGgxMmtfbWFjX2NoYW5nZV9jaGFuY3R4 X2ZpbGxfaXRlciwKKwkJCQkJCSAgICZhcmcpOworCisJYXRoMTJrX21hY191cGRhdGVfdmlmX2No YW4oYXIsIGFyZy52aWZzLCBhcmcubl92aWZzKTsKKworCWtmcmVlKGFyZy52aWZzKTsKK30KKwor c3RhdGljIHZvaWQgYXRoMTJrX21hY19vcF9jaGFuZ2VfY2hhbmN0eChzdHJ1Y3QgaWVlZTgwMjEx X2h3ICpodywKKwkJCQkJIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eF9jb25mICpjdHgsCisJCQkJ CSB1MzIgY2hhbmdlZCkKK3sKKwlzdHJ1Y3QgYXRoMTJrICphciA9IGh3LT5wcml2OworCXN0cnVj dCBhdGgxMmtfYmFzZSAqYWIgPSBhci0+YWI7CisKKwltdXRleF9sb2NrKCZhci0+Y29uZl9tdXRl eCk7CisKKwlhdGgxMmtfZGJnKGFiLCBBVEgxMktfREJHX01BQywKKwkJICAgIm1hYyBjaGFuY3R4 IGNoYW5nZSBmcmVxICV1IHdpZHRoICVkIHB0ciAlcEsgY2hhbmdlZCAleFxuIiwKKwkJICAgY3R4 LT5kZWYuY2hhbi0+Y2VudGVyX2ZyZXEsIGN0eC0+ZGVmLndpZHRoLCBjdHgsIGNoYW5nZWQpOwor CisJLyogVGhpcyBzaG91bGRuJ3QgcmVhbGx5IGhhcHBlbiBiZWNhdXNlIGNoYW5uZWwgc3dpdGNo aW5nIHNob3VsZCB1c2UKKwkgKiBzd2l0Y2hfdmlmX2NoYW5jdHgoKS4KKwkgKi8KKwlpZiAoV0FS Tl9PTihjaGFuZ2VkICYgSUVFRTgwMjExX0NIQU5DVFhfQ0hBTkdFX0NIQU5ORUwpKQorCQlnb3Rv IHVubG9jazsKKworCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NIQU5DVFhfQ0hBTkdFX1dJRFRI KQorCQlhdGgxMmtfbWFjX3VwZGF0ZV9hY3RpdmVfdmlmX2NoYW4oYXIsIGN0eCk7CisKKwkvKiBU T0RPOiBSZWNhbGMgcmFkYXIgZGV0ZWN0aW9uICovCisKK3VubG9jazoKKwltdXRleF91bmxvY2so JmFyLT5jb25mX211dGV4KTsKK30KKworc3RhdGljIGludCBhdGgxMmtfc3RhcnRfdmRldl9kZWxh eShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAq dmlmKQoreworCXN0cnVjdCBhdGgxMmsgKmFyID0gaHctPnByaXY7CisJc3RydWN0IGF0aDEya19i YXNlICphYiA9IGFyLT5hYjsKKwlzdHJ1Y3QgYXRoMTJrX3ZpZiAqYXJ2aWYgPSAodm9pZCAqKXZp Zi0+ZHJ2X3ByaXY7CisJaW50IHJldDsKKworCWlmIChXQVJOX09OKGFydmlmLT5pc19zdGFydGVk KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldCA9IGF0aDEya19tYWNfdmRldl9zdGFydChhcnZp ZiwgJmFydmlmLT5jaGFuY3R4LmRlZik7CisJaWYgKHJldCkgeworCQlhdGgxMmtfd2FybihhYiwg ImZhaWxlZCB0byBzdGFydCB2ZGV2ICVpIGFkZHIgJXBNIG9uIGZyZXEgJWQ6ICVkXG4iLAorCQkJ ICAgIGFydmlmLT52ZGV2X2lkLCB2aWYtPmFkZHIsCisJCQkgICAgYXJ2aWYtPmNoYW5jdHguZGVm LmNoYW4tPmNlbnRlcl9mcmVxLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChhcnZp Zi0+dmRldl90eXBlID09IFdNSV9WREVWX1RZUEVfTU9OSVRPUikgeworCQlyZXQgPSBhdGgxMmtf bW9uaXRvcl92ZGV2X3VwKGFyLCBhcnZpZi0+dmRldl9pZCk7CisJCWlmIChyZXQpIHsKKwkJCWF0 aDEya193YXJuKGFiLCAiZmFpbGVkIHB1dCBtb25pdG9yIHVwOiAlZFxuIiwgcmV0KTsKKwkJCXJl dHVybiByZXQ7CisJCX0KKwl9CisKKwlhcnZpZi0+aXNfc3RhcnRlZCA9IHRydWU7CisKKwkvKiBU T0RPOiBTZXR1cCBwcyBhbmQgY3RzL3J0cyBwcm90ZWN0aW9uICovCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyBpbnQKK2F0aDEya19tYWNfb3BfYXNzaWduX3ZpZl9jaGFuY3R4KHN0cnVjdCBpZWVl ODAyMTFfaHcgKmh3LAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSBzdHJ1 Y3QgaWVlZTgwMjExX2Jzc19jb25mICpsaW5rX2NvbmYsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFf Y2hhbmN0eF9jb25mICpjdHgpCit7CisJc3RydWN0IGF0aDEyayAqYXIgPSBody0+cHJpdjsKKwlz dHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiID0gYXItPmFiOworCXN0cnVjdCBhdGgxMmtfdmlmICphcnZp ZiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwlpbnQgcmV0OworCXN0cnVjdCBhdGgxMmtfd21p X3BlZXJfY3JlYXRlX2FyZyBwYXJhbTsKKworCW11dGV4X2xvY2soJmFyLT5jb25mX211dGV4KTsK KworCWF0aDEya19kYmcoYWIsIEFUSDEyS19EQkdfTUFDLAorCQkgICAibWFjIGNoYW5jdHggYXNz aWduIHB0ciAlcEsgdmRldl9pZCAlaVxuIiwKKwkJICAgY3R4LCBhcnZpZi0+dmRldl9pZCk7CisK KwkvKiBmb3Igc29tZSB0YXJnZXRzIGJzcyBwZWVyIG11c3QgYmUgY3JlYXRlZCBiZWZvcmUgdmRl dl9zdGFydCAqLworCWlmIChhYi0+aHdfcGFyYW1zLT52ZGV2X3N0YXJ0X2RlbGF5ICYmCisJICAg IGFydmlmLT52ZGV2X3R5cGUgIT0gV01JX1ZERVZfVFlQRV9BUCAmJgorCSAgICBhcnZpZi0+dmRl dl90eXBlICE9IFdNSV9WREVWX1RZUEVfTU9OSVRPUiAmJgorCSAgICAhYXRoMTJrX3BlZXJfZXhp c3RfYnlfdmRldl9pZChhYiwgYXJ2aWYtPnZkZXZfaWQpKSB7CisJCW1lbWNweSgmYXJ2aWYtPmNo YW5jdHgsIGN0eCwgc2l6ZW9mKCpjdHgpKTsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisJfQor CisJaWYgKFdBUk5fT04oYXJ2aWYtPmlzX3N0YXJ0ZWQpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJ Z290byBvdXQ7CisJfQorCisJaWYgKGFiLT5od19wYXJhbXMtPnZkZXZfc3RhcnRfZGVsYXkgJiYK KwkgICAgKGFydmlmLT52ZGV2X3R5cGUgPT0gV01JX1ZERVZfVFlQRV9BUCB8fAorCSAgICBhcnZp Zi0+dmRldl90eXBlID09IFdNSV9WREVWX1RZUEVfTU9OSVRPUikpIHsKKwkJcGFyYW0udmRldl9p ZCA9IGFydmlmLT52ZGV2X2lkOworCQlwYXJhbS5wZWVyX3R5cGUgPSBXTUlfUEVFUl9UWVBFX0RF RkFVTFQ7CisJCXBhcmFtLnBlZXJfYWRkciA9IGFyLT5tYWNfYWRkcjsKKworCQlyZXQgPSBhdGgx MmtfcGVlcl9jcmVhdGUoYXIsIGFydmlmLCBOVUxMLCAmcGFyYW0pOworCQlpZiAocmV0KSB7CisJ CQlhdGgxMmtfd2FybihhYiwgImZhaWxlZCB0byBjcmVhdGUgcGVlciBhZnRlciB2ZGV2IHN0YXJ0 IGRlbGF5OiAlZCIsCisJCQkJICAgIHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlm IChhcnZpZi0+dmRldl90eXBlID09IFdNSV9WREVWX1RZUEVfTU9OSVRPUikgeworCQlyZXQgPSBh dGgxMmtfbWFjX21vbml0b3Jfc3RhcnQoYXIpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJ CWFydmlmLT5pc19zdGFydGVkID0gdHJ1ZTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gYXRo MTJrX21hY192ZGV2X3N0YXJ0KGFydmlmLCAmY3R4LT5kZWYpOworCWlmIChyZXQpIHsKKwkJYXRo MTJrX3dhcm4oYWIsICJmYWlsZWQgdG8gc3RhcnQgdmRldiAlaSBhZGRyICVwTSBvbiBmcmVxICVk OiAlZFxuIiwKKwkJCSAgICBhcnZpZi0+dmRldl9pZCwgdmlmLT5hZGRyLAorCQkJICAgIGN0eC0+ ZGVmLmNoYW4tPmNlbnRlcl9mcmVxLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYXJ2 aWYtPnZkZXZfdHlwZSAhPSBXTUlfVkRFVl9UWVBFX01PTklUT1IgJiYgYXItPm1vbml0b3JfdmRl dl9jcmVhdGVkKQorCQlhdGgxMmtfbWFjX21vbml0b3Jfc3RhcnQoYXIpOworCisJYXJ2aWYtPmlz X3N0YXJ0ZWQgPSB0cnVlOworCisJLyogVE9ETzogU2V0dXAgcHMgYW5kIGN0cy9ydHMgcHJvdGVj dGlvbiAqLworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZhci0+Y29uZl9tdXRleCk7CisKKwlyZXR1 cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorYXRoMTJrX21hY19vcF91bmFzc2lnbl92aWZfY2hh bmN0eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3Zp ZiAqdmlmLAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmxpbmtfY29uZiwKKwkJ CQkgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHhfY29uZiAqY3R4KQoreworCXN0cnVjdCBhdGgx MmsgKmFyID0gaHctPnByaXY7CisJc3RydWN0IGF0aDEya19iYXNlICphYiA9IGFyLT5hYjsKKwlz dHJ1Y3QgYXRoMTJrX3ZpZiAqYXJ2aWYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CisJaW50IHJl dDsKKworCW11dGV4X2xvY2soJmFyLT5jb25mX211dGV4KTsKKworCWF0aDEya19kYmcoYWIsIEFU SDEyS19EQkdfTUFDLAorCQkgICAibWFjIGNoYW5jdHggdW5hc3NpZ24gcHRyICVwSyB2ZGV2X2lk ICVpXG4iLAorCQkgICBjdHgsIGFydmlmLT52ZGV2X2lkKTsKKworCVdBUk5fT04oIWFydmlmLT5p c19zdGFydGVkKTsKKworCWlmIChhYi0+aHdfcGFyYW1zLT52ZGV2X3N0YXJ0X2RlbGF5ICYmCisJ ICAgIGFydmlmLT52ZGV2X3R5cGUgPT0gV01JX1ZERVZfVFlQRV9NT05JVE9SICYmCisJICAgIGF0 aDEya19wZWVyX2ZpbmRfYnlfYWRkcihhYiwgYXItPm1hY19hZGRyKSkKKwkJYXRoMTJrX3BlZXJf ZGVsZXRlKGFyLCBhcnZpZi0+dmRldl9pZCwgYXItPm1hY19hZGRyKTsKKworCWlmIChhcnZpZi0+ dmRldl90eXBlID09IFdNSV9WREVWX1RZUEVfTU9OSVRPUikgeworCQlyZXQgPSBhdGgxMmtfbWFj X21vbml0b3Jfc3RvcChhcik7CisJCWlmIChyZXQpIHsKKwkJCW11dGV4X3VubG9jaygmYXItPmNv bmZfbXV0ZXgpOworCQkJcmV0dXJuOworCQl9CisKKwkJYXJ2aWYtPmlzX3N0YXJ0ZWQgPSBmYWxz ZTsKKwkJbXV0ZXhfdW5sb2NrKCZhci0+Y29uZl9tdXRleCk7CisJfQorCisJcmV0ID0gYXRoMTJr X21hY192ZGV2X3N0b3AoYXJ2aWYpOworCWlmIChyZXQpCisJCWF0aDEya193YXJuKGFiLCAiZmFp bGVkIHRvIHN0b3AgdmRldiAlaTogJWRcbiIsCisJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7 CisKKwlhcnZpZi0+aXNfc3RhcnRlZCA9IGZhbHNlOworCisJaWYgKGFiLT5od19wYXJhbXMtPnZk ZXZfc3RhcnRfZGVsYXkgJiYKKwkgICAgYXJ2aWYtPnZkZXZfdHlwZSA9PSBXTUlfVkRFVl9UWVBF X01PTklUT1IpCisJCWF0aDEya193bWlfdmRldl9kb3duKGFyLCBhcnZpZi0+dmRldl9pZCk7CisK KwlpZiAoYXJ2aWYtPnZkZXZfdHlwZSAhPSBXTUlfVkRFVl9UWVBFX01PTklUT1IgJiYKKwkgICAg YXItPm51bV9zdGFydGVkX3ZkZXZzID09IDEgJiYgYXItPm1vbml0b3JfdmRldl9jcmVhdGVkKQor CQlhdGgxMmtfbWFjX21vbml0b3Jfc3RvcChhcik7CisKKwltdXRleF91bmxvY2soJmFyLT5jb25m X211dGV4KTsKK30KKworc3RhdGljIGludAorYXRoMTJrX21hY19vcF9zd2l0Y2hfdmlmX2NoYW5j dHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmX2No YW5jdHhfc3dpdGNoICp2aWZzLAorCQkJCSBpbnQgbl92aWZzLAorCQkJCSBlbnVtIGllZWU4MDIx MV9jaGFuY3R4X3N3aXRjaF9tb2RlIG1vZGUpCit7CisJc3RydWN0IGF0aDEyayAqYXIgPSBody0+ cHJpdjsKKworCW11dGV4X2xvY2soJmFyLT5jb25mX211dGV4KTsKKworCWF0aDEya19kYmcoYXIt PmFiLCBBVEgxMktfREJHX01BQywKKwkJICAgIm1hYyBjaGFuY3R4IHN3aXRjaCBuX3ZpZnMgJWQg bW9kZSAlZFxuIiwKKwkJICAgbl92aWZzLCBtb2RlKTsKKwlhdGgxMmtfbWFjX3VwZGF0ZV92aWZf Y2hhbihhciwgdmlmcywgbl92aWZzKTsKKworCW11dGV4X3VubG9jaygmYXItPmNvbmZfbXV0ZXgp OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2F0aDEya19zZXRfdmRldl9wYXJhbV90 b19hbGxfdmlmcyhzdHJ1Y3QgYXRoMTJrICphciwgaW50IHBhcmFtLCB1MzIgdmFsdWUpCit7CisJ c3RydWN0IGF0aDEya192aWYgKmFydmlmOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygm YXItPmNvbmZfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYXJ2aWYsICZhci0+YXJ2aWZz LCBsaXN0KSB7CisJCWF0aDEya19kYmcoYXItPmFiLCBBVEgxMktfREJHX01BQywgInNldHRpbmcg bWFjIHZkZXYgJWQgcGFyYW0gJWQgdmFsdWUgJWRcbiIsCisJCQkgICBwYXJhbSwgYXJ2aWYtPnZk ZXZfaWQsIHZhbHVlKTsKKworCQlyZXQgPSBhdGgxMmtfd21pX3ZkZXZfc2V0X3BhcmFtX2NtZChh ciwgYXJ2aWYtPnZkZXZfaWQsCisJCQkJCQkgICAgcGFyYW0sIHZhbHVlKTsKKwkJaWYgKHJldCkg eworCQkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIHNldCBwYXJhbSAlZCBmb3IgdmRl diAlZDogJWRcbiIsCisJCQkJICAgIHBhcmFtLCBhcnZpZi0+dmRldl9pZCwgcmV0KTsKKwkJCWJy ZWFrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmYXItPmNvbmZfbXV0ZXgpOworCXJldHVybiBy ZXQ7Cit9CisKKy8qIG1hYzgwMjExIHN0b3JlcyBkZXZpY2Ugc3BlY2lmaWMgUlRTL0ZyYWdtZW50 YXRpb24gdGhyZXNob2xkIHZhbHVlLAorICogdGhpcyBpcyBzZXQgaW50ZXJmYWNlIHNwZWNpZmlj IHRvIGZpcm13YXJlIGZyb20gYXRoMTJrIGRyaXZlcgorICovCitzdGF0aWMgaW50IGF0aDEya19t YWNfb3Bfc2V0X3J0c190aHJlc2hvbGQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiB2YWx1 ZSkKK3sKKwlzdHJ1Y3QgYXRoMTJrICphciA9IGh3LT5wcml2OworCWludCBwYXJhbV9pZCA9IFdN SV9WREVWX1BBUkFNX1JUU19USFJFU0hPTEQ7CisKKwlyZXR1cm4gYXRoMTJrX3NldF92ZGV2X3Bh cmFtX3RvX2FsbF92aWZzKGFyLCBwYXJhbV9pZCwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IGF0 aDEya19tYWNfb3Bfc2V0X2ZyYWdfdGhyZXNob2xkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1 MzIgdmFsdWUpCit7CisJLyogRXZlbiB0aG91Z2ggdGhlcmUncyBhIFdNSSB2ZGV2IHBhcmFtIGZv ciBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCBubworCSAqIGtub3duIGZpcm13YXJlIGFjdHVhbGx5 IGltcGxlbWVudHMgaXQuIE1vcmVvdmVyIGl0IGlzIG5vdCBwb3NzaWJsZSB0bworCSAqIHJlbHkg ZnJhbWUgZnJhZ21lbnRhdGlvbiB0byBtYWM4MDIxMSBiZWNhdXNlIGZpcm13YXJlIGNsZWFycyB0 aGUKKwkgKiAibW9yZSBmcmFnbWVudHMiIGJpdCBpbiBmcmFtZSBjb250cm9sIG1ha2luZyBpdCBp bXBvc3NpYmxlIGZvciByZW1vdGUKKwkgKiBkZXZpY2VzIHRvIHJlYXNzZW1ibGUgZnJhbWVzLgor CSAqCisJICogSGVuY2UgaW1wbGVtZW50IGEgZHVtbXkgY2FsbGJhY2sganVzdCB0byBzYXkgZnJh Z21lbnRhdGlvbiBpc24ndAorCSAqIHN1cHBvcnRlZC4gVGhpcyBlZmZlY3RpdmVseSBwcmV2ZW50 cyBtYWM4MDIxMSBmcm9tIGRvaW5nIGZyYW1lCisJICogZnJhZ21lbnRhdGlvbiBpbiBzb2Z0d2Fy ZS4KKwkgKi8KKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyB2b2lkIGF0aDEya19t YWNfb3BfZmx1c2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlm ICp2aWYsCisJCQkJdTMyIHF1ZXVlcywgYm9vbCBkcm9wKQoreworCXN0cnVjdCBhdGgxMmsgKmFy ID0gaHctPnByaXY7CisJbG9uZyB0aW1lX2xlZnQ7CisKKwlpZiAoZHJvcCkKKwkJcmV0dXJuOwor CisJdGltZV9sZWZ0ID0gd2FpdF9ldmVudF90aW1lb3V0KGFyLT5kcC50eF9lbXB0eV93YWl0cSwK KwkJCQkgICAgICAgKGF0b21pY19yZWFkKCZhci0+ZHAubnVtX3R4X3BlbmRpbmcpID09IDApLAor CQkJCSAgICAgICBBVEgxMktfRkxVU0hfVElNRU9VVCk7CisJaWYgKHRpbWVfbGVmdCA9PSAwKQor CQlhdGgxMmtfd2Fybihhci0+YWIsICJmYWlsZWQgdG8gZmx1c2ggdHJhbnNtaXQgcXVldWUgJWxk XG4iLCB0aW1lX2xlZnQpOworfQorCitzdGF0aWMgaW50CithdGgxMmtfbWFjX2JpdHJhdGVfbWFz a19udW1faHRfcmF0ZXMoc3RydWN0IGF0aDEyayAqYXIsCisJCQkJICAgICBlbnVtIG5sODAyMTFf YmFuZCBiYW5kLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGNmZzgwMjExX2JpdHJhdGVfbWFzayAq bWFzaykKK3sKKwlpbnQgbnVtX3JhdGVzID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkg PCBBUlJBWV9TSVpFKG1hc2stPmNvbnRyb2xbYmFuZF0uaHRfbWNzKTsgaSsrKQorCQludW1fcmF0 ZXMgKz0gaHdlaWdodDE2KG1hc2stPmNvbnRyb2xbYmFuZF0uaHRfbWNzW2ldKTsKKworCXJldHVy biBudW1fcmF0ZXM7Cit9CisKK3N0YXRpYyBib29sCithdGgxMmtfbWFjX2hhc19zaW5nbGVfbGVn YWN5X3JhdGUoc3RydWN0IGF0aDEyayAqYXIsCisJCQkJICBlbnVtIG5sODAyMTFfYmFuZCBiYW5k LAorCQkJCSAgY29uc3Qgc3RydWN0IGNmZzgwMjExX2JpdHJhdGVfbWFzayAqbWFzaykKK3sKKwlp bnQgbnVtX3JhdGVzID0gMDsKKworCW51bV9yYXRlcyA9IGh3ZWlnaHQzMihtYXNrLT5jb250cm9s W2JhbmRdLmxlZ2FjeSk7CisKKwlpZiAoYXRoMTJrX21hY19iaXRyYXRlX21hc2tfbnVtX2h0X3Jh dGVzKGFyLCBiYW5kLCBtYXNrKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKGF0aDEya19tYWNf Yml0cmF0ZV9tYXNrX251bV92aHRfcmF0ZXMoYXIsIGJhbmQsIG1hc2spKQorCQlyZXR1cm4gZmFs c2U7CisKKwlyZXR1cm4gbnVtX3JhdGVzID09IDE7Cit9CisKK3N0YXRpYyBib29sCithdGgxMmtf bWFjX2JpdHJhdGVfbWFza19nZXRfc2luZ2xlX25zcyhzdHJ1Y3QgYXRoMTJrICphciwKKwkJCQkg ICAgICAgZW51bSBubDgwMjExX2JhbmQgYmFuZCwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGNm ZzgwMjExX2JpdHJhdGVfbWFzayAqbWFzaywKKwkJCQkgICAgICAgaW50ICpuc3MpCit7CisJc3Ry dWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQgPSAmYXItPm1hYy5zYmFuZHNbYmFu ZF07CisJdTE2IHZodF9tY3NfbWFwID0gbGUxNl90b19jcHUoc2JhbmQtPnZodF9jYXAudmh0X21j cy50eF9tY3NfbWFwKTsKKwl1OCBodF9uc3NfbWFzayA9IDA7CisJdTggdmh0X25zc19tYXNrID0g MDsKKwlpbnQgaTsKKworCS8qIE5vIG5lZWQgdG8gY29uc2lkZXIgbGVnYWN5IGhlcmUuIEJhc2lj IHJhdGVzIGFyZSBhbHdheXMgcHJlc2VudAorCSAqIGluIGJpdHJhdGUgbWFzaworCSAqLworCisJ Zm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWFzay0+Y29udHJvbFtiYW5kXS5odF9tY3MpOyBp KyspIHsKKwkJaWYgKG1hc2stPmNvbnRyb2xbYmFuZF0uaHRfbWNzW2ldID09IDApCisJCQljb250 aW51ZTsKKwkJZWxzZSBpZiAobWFzay0+Y29udHJvbFtiYW5kXS5odF9tY3NbaV0gPT0KKwkJCSBz YmFuZC0+aHRfY2FwLm1jcy5yeF9tYXNrW2ldKQorCQkJaHRfbnNzX21hc2sgfD0gQklUKGkpOwor CQllbHNlCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJ WkUobWFzay0+Y29udHJvbFtiYW5kXS52aHRfbWNzKTsgaSsrKSB7CisJCWlmIChtYXNrLT5jb250 cm9sW2JhbmRdLnZodF9tY3NbaV0gPT0gMCkKKwkJCWNvbnRpbnVlOworCQllbHNlIGlmIChtYXNr LT5jb250cm9sW2JhbmRdLnZodF9tY3NbaV0gPT0KKwkJCSBhdGgxMmtfbWFjX2dldF9tYXhfdmh0 X21jc19tYXAodmh0X21jc19tYXAsIGkpKQorCQkJdmh0X25zc19tYXNrIHw9IEJJVChpKTsKKwkJ ZWxzZQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChodF9uc3NfbWFzayAhPSB2aHRfbnNz X21hc2spCisJCXJldHVybiBmYWxzZTsKKworCWlmIChodF9uc3NfbWFzayA9PSAwKQorCQlyZXR1 cm4gZmFsc2U7CisKKwlpZiAoQklUKGZscyhodF9uc3NfbWFzaykpIC0gMSAhPSBodF9uc3NfbWFz aykKKwkJcmV0dXJuIGZhbHNlOworCisJKm5zcyA9IGZscyhodF9uc3NfbWFzayk7CisKKwlyZXR1 cm4gdHJ1ZTsKK30KKworc3RhdGljIGludAorYXRoMTJrX21hY19nZXRfc2luZ2xlX2xlZ2FjeV9y YXRlKHN0cnVjdCBhdGgxMmsgKmFyLAorCQkJCSAgZW51bSBubDgwMjExX2JhbmQgYmFuZCwKKwkJ CQkgIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9iaXRyYXRlX21hc2sgKm1hc2ssCisJCQkJICB1MzIg KnJhdGUsIHU4ICpuc3MpCit7CisJaW50IHJhdGVfaWR4OworCXUxNiBiaXRyYXRlOworCXU4IHBy ZWFtYmxlOworCXU4IGh3X3JhdGU7CisKKwlpZiAoaHdlaWdodDMyKG1hc2stPmNvbnRyb2xbYmFu ZF0ubGVnYWN5KSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJhdGVfaWR4ID0gZmZzKG1h c2stPmNvbnRyb2xbYmFuZF0ubGVnYWN5KSAtIDE7CisKKwlpZiAoYmFuZCA9PSBOTDgwMjExX0JB TkRfNUdIWiB8fCBiYW5kID09IE5MODAyMTFfQkFORF82R0haKQorCQlyYXRlX2lkeCArPSBBVEgx MktfTUFDX0ZJUlNUX09GRE1fUkFURV9JRFg7CisKKwlod19yYXRlID0gYXRoMTJrX2xlZ2FjeV9y YXRlc1tyYXRlX2lkeF0uaHdfdmFsdWU7CisJYml0cmF0ZSA9IGF0aDEya19sZWdhY3lfcmF0ZXNb cmF0ZV9pZHhdLmJpdHJhdGU7CisKKwlpZiAoYXRoMTJrX21hY19iaXRyYXRlX2lzX2NjayhiaXRy YXRlKSkKKwkJcHJlYW1ibGUgPSBXTUlfUkFURV9QUkVBTUJMRV9DQ0s7CisJZWxzZQorCQlwcmVh bWJsZSA9IFdNSV9SQVRFX1BSRUFNQkxFX09GRE07CisKKwkqbnNzID0gMTsKKwkqcmF0ZSA9IEFU SDEyS19IV19SQVRFX0NPREUoaHdfcmF0ZSwgMCwgcHJlYW1ibGUpOworCisJcmV0dXJuIDA7Cit9 CisKK3N0YXRpYyBpbnQgYXRoMTJrX21hY19zZXRfZml4ZWRfcmF0ZV9wYXJhbXMoc3RydWN0IGF0 aDEya192aWYgKmFydmlmLAorCQkJCQkgICAgdTMyIHJhdGUsIHU4IG5zcywgdTggc2dpLCB1OCBs ZHBjKQoreworCXN0cnVjdCBhdGgxMmsgKmFyID0gYXJ2aWYtPmFyOworCXUzMiB2ZGV2X3BhcmFt OworCWludCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7CisK KwlhdGgxMmtfZGJnKGFyLT5hYiwgQVRIMTJLX0RCR19NQUMsICJtYWMgc2V0IGZpeGVkIHJhdGUg cGFyYW1zIHZkZXYgJWkgcmF0ZSAweCUwMnggbnNzICV1IHNnaSAldVxuIiwKKwkJICAgYXJ2aWYt PnZkZXZfaWQsIHJhdGUsIG5zcywgc2dpKTsKKworCXZkZXZfcGFyYW0gPSBXTUlfVkRFVl9QQVJB TV9GSVhFRF9SQVRFOworCXJldCA9IGF0aDEya193bWlfdmRldl9zZXRfcGFyYW1fY21kKGFyLCBh cnZpZi0+dmRldl9pZCwKKwkJCQkJICAgIHZkZXZfcGFyYW0sIHJhdGUpOworCWlmIChyZXQpIHsK KwkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRvIHNldCBmaXhlZCByYXRlIHBhcmFtIDB4 JTAyeDogJWRcbiIsCisJCQkgICAgcmF0ZSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl2 ZGV2X3BhcmFtID0gV01JX1ZERVZfUEFSQU1fTlNTOworCXJldCA9IGF0aDEya193bWlfdmRldl9z ZXRfcGFyYW1fY21kKGFyLCBhcnZpZi0+dmRldl9pZCwKKwkJCQkJICAgIHZkZXZfcGFyYW0sIG5z cyk7CisJaWYgKHJldCkgeworCQlhdGgxMmtfd2Fybihhci0+YWIsICJmYWlsZWQgdG8gc2V0IG5z cyBwYXJhbSAlZDogJWRcbiIsCisJCQkgICAgbnNzLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0K KworCXZkZXZfcGFyYW0gPSBXTUlfVkRFVl9QQVJBTV9TR0k7CisJcmV0ID0gYXRoMTJrX3dtaV92 ZGV2X3NldF9wYXJhbV9jbWQoYXIsIGFydmlmLT52ZGV2X2lkLAorCQkJCQkgICAgdmRldl9wYXJh bSwgc2dpKTsKKwlpZiAocmV0KSB7CisJCWF0aDEya193YXJuKGFyLT5hYiwgImZhaWxlZCB0byBz ZXQgc2dpIHBhcmFtICVkOiAlZFxuIiwKKwkJCSAgICBzZ2ksIHJldCk7CisJCXJldHVybiByZXQ7 CisJfQorCisJdmRldl9wYXJhbSA9IFdNSV9WREVWX1BBUkFNX0xEUEM7CisJcmV0ID0gYXRoMTJr X3dtaV92ZGV2X3NldF9wYXJhbV9jbWQoYXIsIGFydmlmLT52ZGV2X2lkLAorCQkJCQkgICAgdmRl dl9wYXJhbSwgbGRwYyk7CisJaWYgKHJldCkgeworCQlhdGgxMmtfd2Fybihhci0+YWIsICJmYWls ZWQgdG8gc2V0IGxkcGMgcGFyYW0gJWQ6ICVkXG4iLAorCQkJICAgIGxkcGMsIHJldCk7CisJCXJl dHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sCithdGgxMmtfbWFj X3ZodF9tY3NfcmFuZ2VfcHJlc2VudChzdHJ1Y3QgYXRoMTJrICphciwKKwkJCQkgZW51bSBubDgw MjExX2JhbmQgYmFuZCwKKwkJCQkgY29uc3Qgc3RydWN0IGNmZzgwMjExX2JpdHJhdGVfbWFzayAq bWFzaykKK3sKKwlpbnQgaTsKKwl1MTYgdmh0X21jczsKKworCWZvciAoaSA9IDA7IGkgPCBOTDgw MjExX1ZIVF9OU1NfTUFYOyBpKyspIHsKKwkJdmh0X21jcyA9IG1hc2stPmNvbnRyb2xbYmFuZF0u dmh0X21jc1tpXTsKKworCQlzd2l0Y2ggKHZodF9tY3MpIHsKKwkJY2FzZSAwOgorCQljYXNlIEJJ VCg4KSAtIDE6CisJCWNhc2UgQklUKDkpIC0gMToKKwkJY2FzZSBCSVQoMTApIC0gMToKKwkJCWJy ZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJcmV0dXJuIHRy dWU7Cit9CisKK3N0YXRpYyB2b2lkIGF0aDEya19tYWNfc2V0X2JpdHJhdGVfbWFza19pdGVyKHZv aWQgKmRhdGEsCisJCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlzdHJ1 Y3QgYXRoMTJrX3ZpZiAqYXJ2aWYgPSBkYXRhOworCXN0cnVjdCBhdGgxMmtfc3RhICphcnN0YSA9 IChzdHJ1Y3QgYXRoMTJrX3N0YSAqKXN0YS0+ZHJ2X3ByaXY7CisJc3RydWN0IGF0aDEyayAqYXIg PSBhcnZpZi0+YXI7CisKKwlzcGluX2xvY2tfYmgoJmFyLT5kYXRhX2xvY2spOworCWFyc3RhLT5j aGFuZ2VkIHw9IElFRUU4MDIxMV9SQ19TVVBQX1JBVEVTX0NIQU5HRUQ7CisJc3Bpbl91bmxvY2tf YmgoJmFyLT5kYXRhX2xvY2spOworCisJaWVlZTgwMjExX3F1ZXVlX3dvcmsoYXItPmh3LCAmYXJz dGEtPnVwZGF0ZV93ayk7Cit9CisKK3N0YXRpYyB2b2lkIGF0aDEya19tYWNfZGlzYWJsZV9wZWVy X2ZpeGVkX3JhdGUodm9pZCAqZGF0YSwKKwkJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3Rh ICpzdGEpCit7CisJc3RydWN0IGF0aDEya192aWYgKmFydmlmID0gZGF0YTsKKwlzdHJ1Y3QgYXRo MTJrICphciA9IGFydmlmLT5hcjsKKwlpbnQgcmV0OworCisJcmV0ID0gYXRoMTJrX3dtaV9zZXRf cGVlcl9wYXJhbShhciwgc3RhLT5hZGRyLAorCQkJCQlhcnZpZi0+dmRldl9pZCwKKwkJCQkJV01J X1BFRVJfUEFSQU1fRklYRURfUkFURSwKKwkJCQkJV01JX0ZJWEVEX1JBVEVfTk9ORSk7CisJaWYg KHJldCkKKwkJYXRoMTJrX3dhcm4oYXItPmFiLAorCQkJICAgICJmYWlsZWQgdG8gZGlzYWJsZSBw ZWVyIGZpeGVkIHJhdGUgZm9yIFNUQSAlcE0gcmV0ICVkXG4iLAorCQkJICAgIHN0YS0+YWRkciwg cmV0KTsKK30KKworc3RhdGljIGludAorYXRoMTJrX21hY19vcF9zZXRfYml0cmF0ZV9tYXNrKHN0 cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2 aWYsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGNmZzgwMjExX2JpdHJhdGVfbWFzayAqbWFzaykK K3sKKwlzdHJ1Y3QgYXRoMTJrX3ZpZiAqYXJ2aWYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CisJ c3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIGRlZjsKKwlzdHJ1Y3QgYXRoMTJrICphciA9IGFydmlm LT5hcjsKKwllbnVtIG5sODAyMTFfYmFuZCBiYW5kOworCWNvbnN0IHU4ICpodF9tY3NfbWFzazsK Kwljb25zdCB1MTYgKnZodF9tY3NfbWFzazsKKwl1MzIgcmF0ZTsKKwl1OCBuc3M7CisJdTggc2dp OworCXU4IGxkcGM7CisJaW50IHNpbmdsZV9uc3M7CisJaW50IHJldDsKKwlpbnQgbnVtX3JhdGVz OworCisJaWYgKGF0aDEya19tYWNfdmlmX2NoYW4odmlmLCAmZGVmKSkKKwkJcmV0dXJuIC1FUEVS TTsKKworCWJhbmQgPSBkZWYuY2hhbi0+YmFuZDsKKwlodF9tY3NfbWFzayA9IG1hc2stPmNvbnRy b2xbYmFuZF0uaHRfbWNzOworCXZodF9tY3NfbWFzayA9IG1hc2stPmNvbnRyb2xbYmFuZF0udmh0 X21jczsKKwlsZHBjID0gISEoYXItPmh0X2NhcF9pbmZvICYgV01JX0hUX0NBUF9MRFBDKTsKKwor CXNnaSA9IG1hc2stPmNvbnRyb2xbYmFuZF0uZ2k7CisJaWYgKHNnaSA9PSBOTDgwMjExX1RYUkFU RV9GT1JDRV9MR0kpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogbWFjODAyMTEgZG9lc24ndCBz dXBwb3J0IHNlbmRpbmcgYSBmaXhlZCBIVC9WSFQgTUNTIGFsb25lLCByYXRoZXIgaXQKKwkgKiBy ZXF1aXJlcyBwYXNzaW5nIGF0IGxlYXN0IG9uZSBvZiB1c2VkIGJhc2ljIHJhdGVzIGFsb25nIHdp dGggdGhlbS4KKwkgKiBGaXhlZCByYXRlIHNldHRpbmcgYWNyb3NzIGRpZmZlcmVudCBwcmVhbWJs ZXMobGVnYWN5LCBIVCwgVkhUKSBpcworCSAqIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIEZXLiBIZW5j ZSB1c2Ugb2YgRklYRURfUkFURSB2ZGV2IHBhcmFtIGlzIG5vdAorCSAqIHN1aXRhYmxlIGZvciBz ZXR0aW5nIHNpbmdsZSBIVC9WSFQgcmF0ZXMuCisJICogQnV0LCB0aGVyZSBjb3VsZCBiZSBhIHNp bmdsZSBiYXNpYyByYXRlIHBhc3NlZCBmcm9tIHVzZXJzcGFjZSB3aGljaAorCSAqIGNhbiBiZSBk b25lIHRocm91Z2ggdGhlIEZJWEVEX1JBVEUgcGFyYW0uCisJICovCisJaWYgKGF0aDEya19tYWNf aGFzX3NpbmdsZV9sZWdhY3lfcmF0ZShhciwgYmFuZCwgbWFzaykpIHsKKwkJcmV0ID0gYXRoMTJr X21hY19nZXRfc2luZ2xlX2xlZ2FjeV9yYXRlKGFyLCBiYW5kLCBtYXNrLCAmcmF0ZSwKKwkJCQkJ CQkmbnNzKTsKKwkJaWYgKHJldCkgeworCQkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFpbGVkIHRv IGdldCBzaW5nbGUgbGVnYWN5IHJhdGUgZm9yIHZkZXYgJWk6ICVkXG4iLAorCQkJCSAgICBhcnZp Zi0+dmRldl9pZCwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJaWVlZTgwMjExX2l0ZXJh dGVfc3RhdGlvbnNfYXRvbWljKGFyLT5odywKKwkJCQkJCSAgYXRoMTJrX21hY19kaXNhYmxlX3Bl ZXJfZml4ZWRfcmF0ZSwKKwkJCQkJCSAgYXJ2aWYpOworCX0gZWxzZSBpZiAoYXRoMTJrX21hY19i aXRyYXRlX21hc2tfZ2V0X3NpbmdsZV9uc3MoYXIsIGJhbmQsIG1hc2ssCisJCQkJCQkJICAmc2lu Z2xlX25zcykpIHsKKwkJcmF0ZSA9IFdNSV9GSVhFRF9SQVRFX05PTkU7CisJCW5zcyA9IHNpbmds ZV9uc3M7CisJfSBlbHNlIHsKKwkJcmF0ZSA9IFdNSV9GSVhFRF9SQVRFX05PTkU7CisJCW5zcyA9 IG1pbl90KHUzMiwgYXItPm51bV90eF9jaGFpbnMsCisJCQkgICAgbWF4KGF0aDEya19tYWNfbWF4 X2h0X25zcyhodF9tY3NfbWFzayksCisJCQkJYXRoMTJrX21hY19tYXhfdmh0X25zcyh2aHRfbWNz X21hc2spKSk7CisKKwkJLyogSWYgbXVsdGlwbGUgcmF0ZXMgYWNyb3NzIGRpZmZlcmVudCBwcmVh bWJsZXMgYXJlIGdpdmVuCisJCSAqIHdlIGNhbiByZWNvbmZpZ3VyZSB0aGlzIGluZm8gd2l0aCBh bGwgcGVlcnMgdXNpbmcgUEVFUl9BU1NPQworCQkgKiBjb21tYW5kIHdpdGggdGhlIGJlbG93IGV4 Y2VwdGlvbiBjYXNlcy4KKwkJICogLSBTaW5nbGUgVkhUIFJhdGUgOiBwZWVyX2Fzc29jIGNvbW1h bmQgYWNjb21tb2RhdGVzIG9ubHkgTUNTCisJCSAqIHJhbmdlIHZhbHVlcyBpLmUgMC03LCAwLTgs IDAtOSBmb3IgVkhULiBUaG91Z2ggbWFjODAyMTEKKwkJICogbWFuZGF0ZXMgcGFzc2luZyBiYXNp YyByYXRlcyBhbG9uZyB3aXRoIEhUL1ZIVCByYXRlcywgRlcKKwkJICogZG9lc24ndCBhbGxvdyBz d2l0Y2hpbmcgZnJvbSBWSFQgdG8gTGVnYWN5LiBIZW5jZSBpbnN0ZWFkIG9mCisJCSAqIHNldHRp bmcgbGVnYWN5IGFuZCBWSFQgcmF0ZXMgdXNpbmcgUkFURU1BU0tfQ01EIHZkZXYgY21kLAorCQkg KiB3ZSBjb3VsZCBzZXQgdGhpcyBWSFQgcmF0ZSBhcyBwZWVyIGZpeGVkIHJhdGUgcGFyYW0sIHdo aWNoCisJCSAqIHdpbGwgb3ZlcnJpZGUgRklYRUQgcmF0ZSBhbmQgRlcgcmF0ZSBjb250cm9sIGFs Z29yaXRobS4KKwkJICogSWYgc2luZ2xlIFZIVCByYXRlIGlzIHBhc3NlZCBhbG9uZyB3aXRoIEhU IHJhdGVzLCB3ZSBzZWxlY3QKKwkJICogdGhlIFZIVCByYXRlIGFzIGZpeGVkIHJhdGUgZm9yIHZo dCBwZWVycy4KKwkJICogLSBNdWx0aXBsZSBWSFQgUmF0ZXMgOiBXaGVuIE11bHRpcGxlIFZIVCBy YXRlcyBhcmUgZ2l2ZW4sdGhpcworCQkgKiBjYW4gYmUgc2V0IHVzaW5nIFJBVEVNQVNLIENNRCB3 aGljaCB1c2VzIEZXIHJhdGUtY3RsIGFsZy4KKwkJICogVE9ETzogU2V0dGluZyBtdWx0aXBsZSBW SFQgTUNTIGFuZCByZXBsYWNpbmcgcGVlcl9hc3NvYyB3aXRoCisJCSAqIFJBVEVNQVNLX0NNRElE IGNhbiBjb3ZlciBhbGwgdXNlIGNhc2VzIG9mIHNldHRpbmcgcmF0ZXMKKwkJICogYWNyb3NzIG11 bHRpcGxlIHByZWFtYmxlcyBhbmQgcmF0ZXMgd2l0aGluIHNhbWUgdHlwZS4KKwkJICogQnV0IHJl cXVpcmVzIG1vcmUgdmFsaWRhdGlvbiBvZiB0aGUgY29tbWFuZCBhdCB0aGlzIHBvaW50LgorCQkg Ki8KKworCQludW1fcmF0ZXMgPSBhdGgxMmtfbWFjX2JpdHJhdGVfbWFza19udW1fdmh0X3JhdGVz KGFyLCBiYW5kLAorCQkJCQkJCQkgIG1hc2spOworCisJCWlmICghYXRoMTJrX21hY192aHRfbWNz X3JhbmdlX3ByZXNlbnQoYXIsIGJhbmQsIG1hc2spICYmCisJCSAgICBudW1fcmF0ZXMgPiAxKSB7 CisJCQkvKiBUT0RPOiBIYW5kbGUgbXVsdGlwbGUgVkhUIE1DUyB2YWx1ZXMgc2V0dGluZyB1c2lu ZworCQkJICogUkFURU1BU0sgQ01ECisJCQkgKi8KKwkJCWF0aDEya193YXJuKGFyLT5hYiwKKwkJ CQkgICAgIlNldHRpbmcgbW9yZSB0aGFuIG9uZSBNQ1MgVmFsdWUgaW4gYml0cmF0ZSBtYXNrIG5v dCBzdXBwb3J0ZWRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZWVlODAyMTFf aXRlcmF0ZV9zdGF0aW9uc19hdG9taWMoYXItPmh3LAorCQkJCQkJICBhdGgxMmtfbWFjX2Rpc2Fi bGVfcGVlcl9maXhlZF9yYXRlLAorCQkJCQkJICBhcnZpZik7CisKKwkJbXV0ZXhfbG9jaygmYXIt PmNvbmZfbXV0ZXgpOworCisJCWFydmlmLT5iaXRyYXRlX21hc2sgPSAqbWFzazsKKwkJaWVlZTgw MjExX2l0ZXJhdGVfc3RhdGlvbnNfYXRvbWljKGFyLT5odywKKwkJCQkJCSAgYXRoMTJrX21hY19z ZXRfYml0cmF0ZV9tYXNrX2l0ZXIsCisJCQkJCQkgIGFydmlmKTsKKworCQltdXRleF91bmxvY2so JmFyLT5jb25mX211dGV4KTsKKwl9CisKKwltdXRleF9sb2NrKCZhci0+Y29uZl9tdXRleCk7CisK KwlyZXQgPSBhdGgxMmtfbWFjX3NldF9maXhlZF9yYXRlX3BhcmFtcyhhcnZpZiwgcmF0ZSwgbnNz LCBzZ2ksIGxkcGMpOworCWlmIChyZXQpIHsKKwkJYXRoMTJrX3dhcm4oYXItPmFiLCAiZmFpbGVk IHRvIHNldCBmaXhlZCByYXRlIHBhcmFtcyBvbiB2ZGV2ICVpOiAlZFxuIiwKKwkJCSAgICBhcnZp Zi0+dmRldl9pZCwgcmV0KTsKKwl9CisKKwltdXRleF91bmxvY2soJmFyLT5jb25mX211dGV4KTsK KworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCithdGgxMmtfbWFjX29wX3JlY29uZmln X2NvbXBsZXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCWVudW0gaWVlZTgwMjExX3Jl Y29uZmlnX3R5cGUgcmVjb25maWdfdHlwZSkKK3sKKwlzdHJ1Y3QgYXRoMTJrICphciA9IGh3LT5w cml2OworCXN0cnVjdCBhdGgxMmtfYmFzZSAqYWIgPSBhci0+YWI7CisJaW50IHJlY292ZXJ5X2Nv dW50OworCisJaWYgKHJlY29uZmlnX3R5cGUgIT0gSUVFRTgwMjExX1JFQ09ORklHX1RZUEVfUkVT VEFSVCkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmYXItPmNvbmZfbXV0ZXgpOworCisJaWYg KGFyLT5zdGF0ZSA9PSBBVEgxMktfU1RBVEVfUkVTVEFSVEVEKSB7CisJCWF0aDEya193YXJuKGFy LT5hYiwgInBkZXYgJWQgc3VjY2Vzc2Z1bGx5IHJlY292ZXJlZFxuIiwKKwkJCSAgICBhci0+cGRl di0+cGRldl9pZCk7CisJCWFyLT5zdGF0ZSA9IEFUSDEyS19TVEFURV9PTjsKKwkJaWVlZTgwMjEx X3dha2VfcXVldWVzKGFyLT5odyk7CisKKwkJaWYgKGFiLT5pc19yZXNldCkgeworCQkJcmVjb3Zl cnlfY291bnQgPSBhdG9taWNfaW5jX3JldHVybigmYWItPnJlY292ZXJ5X2NvdW50KTsKKwkJCWF0 aDEya19kYmcoYWIsIEFUSDEyS19EQkdfQk9PVCwgInJlY292ZXJ5IGNvdW50ICVkXG4iLAorCQkJ CSAgIHJlY292ZXJ5X2NvdW50KTsKKwkJCS8qIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIHJhZGlv cyBpbiBhbiBTT0MsCisJCQkgKiB0aGUgcmVjb3ZlcnkgaGFzIHRvIGJlIGRvbmUgZm9yIGVhY2gg cmFkaW8KKwkJCSAqLworCQkJaWYgKHJlY292ZXJ5X2NvdW50ID09IGFiLT5udW1fcmFkaW9zKSB7 CisJCQkJYXRvbWljX2RlYygmYWItPnJlc2V0X2NvdW50KTsKKwkJCQljb21wbGV0ZSgmYWItPnJl c2V0X2NvbXBsZXRlKTsKKwkJCQlhYi0+aXNfcmVzZXQgPSBmYWxzZTsKKwkJCQlhdG9taWNfc2V0 KCZhYi0+ZmFpbF9jb250X2NvdW50LCAwKTsKKwkJCQlhdGgxMmtfZGJnKGFiLCBBVEgxMktfREJH X0JPT1QsICJyZXNldCBzdWNjZXNzXG4iKTsKKwkJCX0KKwkJfQorCX0KKworCW11dGV4X3VubG9j aygmYXItPmNvbmZfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAorYXRoMTJrX21hY191cGRhdGVf YnNzX2NoYW5fc3VydmV5KHN0cnVjdCBhdGgxMmsgKmFyLAorCQkJCSAgc3RydWN0IGllZWU4MDIx MV9jaGFubmVsICpjaGFubmVsKQoreworCWludCByZXQ7CisJZW51bSB3bWlfYnNzX2NoYW5faW5m b19yZXFfdHlwZSB0eXBlID0gV01JX0JTU19TVVJWRVlfUkVRX1RZUEVfUkVBRDsKKworCWxvY2tk ZXBfYXNzZXJ0X2hlbGQoJmFyLT5jb25mX211dGV4KTsKKworCWlmICghdGVzdF9iaXQoV01JX1RM Vl9TRVJWSUNFX0JTU19DSEFOTkVMX0lORk9fNjQsIGFyLT5hYi0+d21pX2FiLnN2Y19tYXApIHx8 CisJICAgIGFyLT5yeF9jaGFubmVsICE9IGNoYW5uZWwpCisJCXJldHVybjsKKworCWlmIChhci0+ c2Nhbi5zdGF0ZSAhPSBBVEgxMktfU0NBTl9JRExFKSB7CisJCWF0aDEya19kYmcoYXItPmFiLCBB VEgxMktfREJHX01BQywKKwkJCSAgICJpZ25vcmluZyBic3MgY2hhbiBpbmZvIHJlcSB3aGlsZSBz Y2FubmluZy4uXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXJlaW5pdF9jb21wbGV0aW9uKCZhci0+ YnNzX3N1cnZleV9kb25lKTsKKworCXJldCA9IGF0aDEya193bWlfcGRldl9ic3NfY2hhbl9pbmZv X3JlcXVlc3QoYXIsIHR5cGUpOworCWlmIChyZXQpIHsKKwkJYXRoMTJrX3dhcm4oYXItPmFiLCAi ZmFpbGVkIHRvIHNlbmQgcGRldiBic3MgY2hhbiBpbmZvIHJlcXVlc3RcbiIpOworCQlyZXR1cm47 CisJfQorCisJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZhci0+YnNzX3N1cnZl eV9kb25lLCAzICogSFopOworCWlmIChyZXQgPT0gMCkKKwkJYXRoMTJrX3dhcm4oYXItPmFiLCAi YnNzIGNoYW5uZWwgc3VydmV5IHRpbWVkIG91dFxuIik7Cit9CisKK3N0YXRpYyBpbnQgYXRoMTJr X21hY19vcF9nZXRfc3VydmV5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBpbnQgaWR4LAorCQkJ CSAgICBzdHJ1Y3Qgc3VydmV5X2luZm8gKnN1cnZleSkKK3sKKwlzdHJ1Y3QgYXRoMTJrICphciA9 IGh3LT5wcml2OworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOworCXN0 cnVjdCBzdXJ2ZXlfaW5mbyAqYXJfc3VydmV5OworCWludCByZXQgPSAwOworCisJaWYgKGlkeCA+ PSBBVEgxMktfTlVNX0NIQU5TKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWFyX3N1cnZleSA9ICZh ci0+c3VydmV5W2lkeF07CisKKwltdXRleF9sb2NrKCZhci0+Y29uZl9tdXRleCk7CisKKwlzYmFu ZCA9IGh3LT53aXBoeS0+YmFuZHNbTkw4MDIxMV9CQU5EXzJHSFpdOworCWlmIChzYmFuZCAmJiBp ZHggPj0gc2JhbmQtPm5fY2hhbm5lbHMpIHsKKwkJaWR4IC09IHNiYW5kLT5uX2NoYW5uZWxzOwor CQlzYmFuZCA9IE5VTEw7CisJfQorCisJaWYgKCFzYmFuZCkKKwkJc2JhbmQgPSBody0+d2lwaHkt PmJhbmRzW05MODAyMTFfQkFORF81R0haXTsKKworCWlmICghc2JhbmQgfHwgaWR4ID49IHNiYW5k LT5uX2NoYW5uZWxzKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlh dGgxMmtfbWFjX3VwZGF0ZV9ic3NfY2hhbl9zdXJ2ZXkoYXIsICZzYmFuZC0+Y2hhbm5lbHNbaWR4 XSk7CisKKwlzcGluX2xvY2tfYmgoJmFyLT5kYXRhX2xvY2spOworCW1lbWNweShzdXJ2ZXksIGFy X3N1cnZleSwgc2l6ZW9mKCpzdXJ2ZXkpKTsKKwlzcGluX3VubG9ja19iaCgmYXItPmRhdGFfbG9j ayk7CisKKwlzdXJ2ZXktPmNoYW5uZWwgPSAmc2JhbmQtPmNoYW5uZWxzW2lkeF07CisKKwlpZiAo YXItPnJ4X2NoYW5uZWwgPT0gc3VydmV5LT5jaGFubmVsKQorCQlzdXJ2ZXktPmZpbGxlZCB8PSBT VVJWRVlfSU5GT19JTl9VU0U7CisKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZhci0+Y29uZl9tdXRl eCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYXRoMTJrX21hY19vcF9zdGFfc3Rh dGlzdGljcyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJIHN0cnVjdCBpZWVlODAyMTFf dmlmICp2aWYsCisJCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCQkgc3RydWN0 IHN0YXRpb25faW5mbyAqc2luZm8pCit7CisJc3RydWN0IGF0aDEya19zdGEgKmFyc3RhID0gKHN0 cnVjdCBhdGgxMmtfc3RhICopc3RhLT5kcnZfcHJpdjsKKworCXNpbmZvLT5yeF9kdXJhdGlvbiA9 IGFyc3RhLT5yeF9kdXJhdGlvbjsKKwlzaW5mby0+ZmlsbGVkIHw9IEJJVF9VTEwoTkw4MDIxMV9T VEFfSU5GT19SWF9EVVJBVElPTik7CisKKwlzaW5mby0+dHhfZHVyYXRpb24gPSBhcnN0YS0+dHhf ZHVyYXRpb247CisJc2luZm8tPmZpbGxlZCB8PSBCSVRfVUxMKE5MODAyMTFfU1RBX0lORk9fVFhf RFVSQVRJT04pOworCisJaWYgKCFhcnN0YS0+dHhyYXRlLmxlZ2FjeSAmJiAhYXJzdGEtPnR4cmF0 ZS5uc3MpCisJCXJldHVybjsKKworCWlmIChhcnN0YS0+dHhyYXRlLmxlZ2FjeSkgeworCQlzaW5m by0+dHhyYXRlLmxlZ2FjeSA9IGFyc3RhLT50eHJhdGUubGVnYWN5OworCX0gZWxzZSB7CisJCXNp bmZvLT50eHJhdGUubWNzID0gYXJzdGEtPnR4cmF0ZS5tY3M7CisJCXNpbmZvLT50eHJhdGUubnNz ID0gYXJzdGEtPnR4cmF0ZS5uc3M7CisJCXNpbmZvLT50eHJhdGUuYncgPSBhcnN0YS0+dHhyYXRl LmJ3OworCQlzaW5mby0+dHhyYXRlLmhlX2dpID0gYXJzdGEtPnR4cmF0ZS5oZV9naTsKKwkJc2lu Zm8tPnR4cmF0ZS5oZV9kY20gPSBhcnN0YS0+dHhyYXRlLmhlX2RjbTsKKwkJc2luZm8tPnR4cmF0 ZS5oZV9ydV9hbGxvYyA9IGFyc3RhLT50eHJhdGUuaGVfcnVfYWxsb2M7CisJfQorCXNpbmZvLT50 eHJhdGUuZmxhZ3MgPSBhcnN0YS0+dHhyYXRlLmZsYWdzOworCXNpbmZvLT5maWxsZWQgfD0gQklU X1VMTChOTDgwMjExX1NUQV9JTkZPX1RYX0JJVFJBVEUpOworCisJLyogVE9ETzogVXNlIHJlYWwg TkYgaW5zdGVhZCBvZiBkZWZhdWx0IG9uZS4gKi8KKwlzaW5mby0+c2lnbmFsID0gYXJzdGEtPnJz c2lfY29tYiArIEFUSDEyS19ERUZBVUxUX05PSVNFX0ZMT09SOworCXNpbmZvLT5maWxsZWQgfD0g QklUX1VMTChOTDgwMjExX1NUQV9JTkZPX1NJR05BTCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgaWVlZTgwMjExX29wcyBhdGgxMmtfb3BzID0geworCS50eAkJCQk9IGF0aDEya19tYWNfb3Bf dHgsCisJLndha2VfdHhfcXVldWUJCQk9IGllZWU4MDIxMV9oYW5kbGVfd2FrZV90eF9xdWV1ZSwK Kwkuc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgID0gYXRoMTJrX21hY19vcF9zdGFydCwK Kwkuc3RvcCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYXRoMTJrX21hY19vcF9zdG9wLAor CS5yZWNvbmZpZ19jb21wbGV0ZSAgICAgICAgICAgICAgPSBhdGgxMmtfbWFjX29wX3JlY29uZmln X2NvbXBsZXRlLAorCS5hZGRfaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgPSBhdGgxMmtfbWFj X29wX2FkZF9pbnRlcmZhY2UsCisJLnJlbW92ZV9pbnRlcmZhY2UJCT0gYXRoMTJrX21hY19vcF9y ZW1vdmVfaW50ZXJmYWNlLAorCS51cGRhdGVfdmlmX29mZmxvYWQJCT0gYXRoMTJrX21hY19vcF91 cGRhdGVfdmlmX29mZmxvYWQsCisJLmNvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICA9IGF0 aDEya19tYWNfb3BfY29uZmlnLAorCS5ic3NfaW5mb19jaGFuZ2VkICAgICAgICAgICAgICAgPSBh dGgxMmtfbWFjX29wX2Jzc19pbmZvX2NoYW5nZWQsCisJLmNvbmZpZ3VyZV9maWx0ZXIJCT0gYXRo MTJrX21hY19vcF9jb25maWd1cmVfZmlsdGVyLAorCS5od19zY2FuICAgICAgICAgICAgICAgICAg ICAgICAgPSBhdGgxMmtfbWFjX29wX2h3X3NjYW4sCisJLmNhbmNlbF9od19zY2FuICAgICAgICAg ICAgICAgICA9IGF0aDEya19tYWNfb3BfY2FuY2VsX2h3X3NjYW4sCisJLnNldF9rZXkgICAgICAg ICAgICAgICAgICAgICAgICA9IGF0aDEya19tYWNfb3Bfc2V0X2tleSwKKwkuc3RhX3N0YXRlICAg ICAgICAgICAgICAgICAgICAgID0gYXRoMTJrX21hY19vcF9zdGFfc3RhdGUsCisJLnN0YV9zZXRf dHhwd3IJCQk9IGF0aDEya19tYWNfb3Bfc3RhX3NldF90eHB3ciwKKwkuc3RhX3JjX3VwZGF0ZQkJ CT0gYXRoMTJrX21hY19vcF9zdGFfcmNfdXBkYXRlLAorCS5jb25mX3R4ICAgICAgICAgICAgICAg ICAgICAgICAgPSBhdGgxMmtfbWFjX29wX2NvbmZfdHgsCisJLnNldF9hbnRlbm5hCQkJPSBhdGgx MmtfbWFjX29wX3NldF9hbnRlbm5hLAorCS5nZXRfYW50ZW5uYQkJCT0gYXRoMTJrX21hY19vcF9n ZXRfYW50ZW5uYSwKKwkuYW1wZHVfYWN0aW9uCQkJPSBhdGgxMmtfbWFjX29wX2FtcGR1X2FjdGlv biwKKwkuYWRkX2NoYW5jdHgJCQk9IGF0aDEya19tYWNfb3BfYWRkX2NoYW5jdHgsCisJLnJlbW92 ZV9jaGFuY3R4CQkJPSBhdGgxMmtfbWFjX29wX3JlbW92ZV9jaGFuY3R4LAorCS5jaGFuZ2VfY2hh bmN0eAkJCT0gYXRoMTJrX21hY19vcF9jaGFuZ2VfY2hhbmN0eCwKKwkuYXNzaWduX3ZpZl9jaGFu Y3R4CQk9IGF0aDEya19tYWNfb3BfYXNzaWduX3ZpZl9jaGFuY3R4LAorCS51bmFzc2lnbl92aWZf Y2hhbmN0eAkJPSBhdGgxMmtfbWFjX29wX3VuYXNzaWduX3ZpZl9jaGFuY3R4LAorCS5zd2l0Y2hf dmlmX2NoYW5jdHgJCT0gYXRoMTJrX21hY19vcF9zd2l0Y2hfdmlmX2NoYW5jdHgsCisJLnNldF9y dHNfdGhyZXNob2xkCQk9IGF0aDEya19tYWNfb3Bfc2V0X3J0c190aHJlc2hvbGQsCisJLnNldF9m cmFnX3RocmVzaG9sZAkJPSBhdGgxMmtfbWFjX29wX3NldF9mcmFnX3RocmVzaG9sZCwKKwkuc2V0 X2JpdHJhdGVfbWFzawkJPSBhdGgxMmtfbWFjX29wX3NldF9iaXRyYXRlX21hc2ssCisJLmdldF9z dXJ2ZXkJCQk9IGF0aDEya19tYWNfb3BfZ2V0X3N1cnZleSwKKwkuZmx1c2gJCQkJPSBhdGgxMmtf bWFjX29wX2ZsdXNoLAorCS5zdGFfc3RhdGlzdGljcwkJCT0gYXRoMTJrX21hY19vcF9zdGFfc3Rh dGlzdGljcywKK307CisKK3N0YXRpYyB2b2lkIGF0aDEya19tYWNfdXBkYXRlX2NoX2xpc3Qoc3Ry dWN0IGF0aDEyayAqYXIsCisJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFu ZCAqYmFuZCwKKwkJCQkgICAgICB1MzIgZnJlcV9sb3csIHUzMiBmcmVxX2hpZ2gpCit7CisJaW50 IGk7CisKKwlpZiAoIShmcmVxX2xvdyAmJiBmcmVxX2hpZ2gpKQorCQlyZXR1cm47CisKKwlmb3Ig KGkgPSAwOyBpIDwgYmFuZC0+bl9jaGFubmVsczsgaSsrKSB7CisJCWlmIChiYW5kLT5jaGFubmVs c1tpXS5jZW50ZXJfZnJlcSA8IGZyZXFfbG93IHx8CisJCSAgICBiYW5kLT5jaGFubmVsc1tpXS5j ZW50ZXJfZnJlcSA+IGZyZXFfaGlnaCkKKwkJCWJhbmQtPmNoYW5uZWxzW2ldLmZsYWdzIHw9IElF RUU4MDIxMV9DSEFOX0RJU0FCTEVEOworCX0KK30KKworc3RhdGljIHUzMiBhdGgxMmtfZ2V0X3Bo eV9pZChzdHJ1Y3QgYXRoMTJrICphciwgdTMyIGJhbmQpCit7CisJc3RydWN0IGF0aDEya19wZGV2 ICpwZGV2ID0gYXItPnBkZXY7CisJc3RydWN0IGF0aDEya19wZGV2X2NhcCAqcGRldl9jYXAgPSAm cGRldi0+Y2FwOworCisJaWYgKGJhbmQgPT0gV01JX0hPU1RfV0xBTl8yR19DQVApCisJCXJldHVy biBwZGV2X2NhcC0+YmFuZFtOTDgwMjExX0JBTkRfMkdIWl0ucGh5X2lkOworCisJaWYgKGJhbmQg PT0gV01JX0hPU1RfV0xBTl81R19DQVApCisJCXJldHVybiBwZGV2X2NhcC0+YmFuZFtOTDgwMjEx X0JBTkRfNUdIWl0ucGh5X2lkOworCisJYXRoMTJrX3dhcm4oYXItPmFiLCAidW5zdXBwb3J0ZWQg cGh5IGNhcDolZFxuIiwgYmFuZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGgx MmtfbWFjX3NldHVwX2NoYW5uZWxzX3JhdGVzKHN0cnVjdCBhdGgxMmsgKmFyLAorCQkJCQkgICB1 MzIgc3VwcG9ydGVkX2JhbmRzKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQg KmJhbmQ7CisJc3RydWN0IGF0aDEya193bWlfaGFsX3JlZ19jYXBhYmlsaXRpZXNfZXh0X2FyZyAq cmVnX2NhcDsKKwl2b2lkICpjaGFubmVsczsKKwl1MzIgcGh5X2lkOworCisJQlVJTERfQlVHX09O KChBUlJBWV9TSVpFKGF0aDEya18yZ2h6X2NoYW5uZWxzKSArCisJCSAgICAgIEFSUkFZX1NJWkUo YXRoMTJrXzVnaHpfY2hhbm5lbHMpICsKKwkJICAgICAgQVJSQVlfU0laRShhdGgxMmtfNmdoel9j aGFubmVscykpICE9CisJCSAgICAgQVRIMTJLX05VTV9DSEFOUyk7CisKKwlyZWdfY2FwID0gJmFy LT5hYi0+aGFsX3JlZ19jYXBbYXItPnBkZXZfaWR4XTsKKworCWlmIChzdXBwb3J0ZWRfYmFuZHMg JiBXTUlfSE9TVF9XTEFOXzJHX0NBUCkgeworCQljaGFubmVscyA9IGttZW1kdXAoYXRoMTJrXzJn aHpfY2hhbm5lbHMsCisJCQkJICAgc2l6ZW9mKGF0aDEya18yZ2h6X2NoYW5uZWxzKSwKKwkJCQkg ICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjaGFubmVscykKKwkJCXJldHVybiAtRU5PTUVNOworCisJ CWJhbmQgPSAmYXItPm1hYy5zYmFuZHNbTkw4MDIxMV9CQU5EXzJHSFpdOworCQliYW5kLT5iYW5k ID0gTkw4MDIxMV9CQU5EXzJHSFo7CisJCWJhbmQtPm5fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGF0 aDEya18yZ2h6X2NoYW5uZWxzKTsKKwkJYmFuZC0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKwkJYmFu ZC0+bl9iaXRyYXRlcyA9IGF0aDEya19nX3JhdGVzX3NpemU7CisJCWJhbmQtPmJpdHJhdGVzID0g YXRoMTJrX2dfcmF0ZXM7CisJCWFyLT5ody0+d2lwaHktPmJhbmRzW05MODAyMTFfQkFORF8yR0ha XSA9IGJhbmQ7CisKKwkJaWYgKGFyLT5hYi0+aHdfcGFyYW1zLT5zaW5nbGVfcGRldl9vbmx5KSB7 CisJCQlwaHlfaWQgPSBhdGgxMmtfZ2V0X3BoeV9pZChhciwgV01JX0hPU1RfV0xBTl8yR19DQVAp OworCQkJcmVnX2NhcCA9ICZhci0+YWItPmhhbF9yZWdfY2FwW3BoeV9pZF07CisJCX0KKwkJYXRo MTJrX21hY191cGRhdGVfY2hfbGlzdChhciwgYmFuZCwKKwkJCQkJICByZWdfY2FwLT5sb3dfMmdo el9jaGFuLAorCQkJCQkgIHJlZ19jYXAtPmhpZ2hfMmdoel9jaGFuKTsKKwl9CisKKwlpZiAoc3Vw cG9ydGVkX2JhbmRzICYgV01JX0hPU1RfV0xBTl81R19DQVApIHsKKwkJaWYgKHJlZ19jYXAtPmhp Z2hfNWdoel9jaGFuID49IEFUSDEyS19NQVhfNkdfRlJFUSkgeworCQkJY2hhbm5lbHMgPSBrbWVt ZHVwKGF0aDEya182Z2h6X2NoYW5uZWxzLAorCQkJCQkgICBzaXplb2YoYXRoMTJrXzZnaHpfY2hh bm5lbHMpLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghY2hhbm5lbHMpIHsKKwkJCQlrZnJlZShhci0+ bWFjLnNiYW5kc1tOTDgwMjExX0JBTkRfMkdIWl0uY2hhbm5lbHMpOworCQkJCXJldHVybiAtRU5P TUVNOworCQkJfQorCisJCQlhci0+c3VwcG9ydHNfNmdoeiA9IHRydWU7CisJCQliYW5kID0gJmFy LT5tYWMuc2JhbmRzW05MODAyMTFfQkFORF82R0haXTsKKwkJCWJhbmQtPmJhbmQgPSBOTDgwMjEx X0JBTkRfNkdIWjsKKwkJCWJhbmQtPm5fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGF0aDEya182Z2h6 X2NoYW5uZWxzKTsKKwkJCWJhbmQtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisJCQliYW5kLT5uX2Jp dHJhdGVzID0gYXRoMTJrX2FfcmF0ZXNfc2l6ZTsKKwkJCWJhbmQtPmJpdHJhdGVzID0gYXRoMTJr X2FfcmF0ZXM7CisJCQlhci0+aHctPndpcGh5LT5iYW5kc1tOTDgwMjExX0JBTkRfNkdIWl0gPSBi YW5kOworCQkJYXRoMTJrX21hY191cGRhdGVfY2hfbGlzdChhciwgYmFuZCwKKwkJCQkJCSAgcmVn X2NhcC0+bG93XzVnaHpfY2hhbiwKKwkJCQkJCSAgcmVnX2NhcC0+aGlnaF81Z2h6X2NoYW4pOwor CQl9CisKKwkJaWYgKHJlZ19jYXAtPmxvd181Z2h6X2NoYW4gPCBBVEgxMktfTUlOXzZHX0ZSRVEp IHsKKwkJCWNoYW5uZWxzID0ga21lbWR1cChhdGgxMmtfNWdoel9jaGFubmVscywKKwkJCQkJICAg c2l6ZW9mKGF0aDEya181Z2h6X2NoYW5uZWxzKSwKKwkJCQkJICAgR0ZQX0tFUk5FTCk7CisJCQlp ZiAoIWNoYW5uZWxzKSB7CisJCQkJa2ZyZWUoYXItPm1hYy5zYmFuZHNbTkw4MDIxMV9CQU5EXzJH SFpdLmNoYW5uZWxzKTsKKwkJCQlrZnJlZShhci0+bWFjLnNiYW5kc1tOTDgwMjExX0JBTkRfNkdI Wl0uY2hhbm5lbHMpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCisJCQliYW5kID0gJmFy LT5tYWMuc2JhbmRzW05MODAyMTFfQkFORF81R0haXTsKKwkJCWJhbmQtPmJhbmQgPSBOTDgwMjEx X0JBTkRfNUdIWjsKKwkJCWJhbmQtPm5fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGF0aDEya181Z2h6 X2NoYW5uZWxzKTsKKwkJCWJhbmQtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisJCQliYW5kLT5uX2Jp dHJhdGVzID0gYXRoMTJrX2FfcmF0ZXNfc2l6ZTsKKwkJCWJhbmQtPmJpdHJhdGVzID0gYXRoMTJr X2FfcmF0ZXM7CisJCQlhci0+aHctPndpcGh5LT5iYW5kc1tOTDgwMjExX0JBTkRfNUdIWl0gPSBi YW5kOworCisJCQlpZiAoYXItPmFiLT5od19wYXJhbXMtPnNpbmdsZV9wZGV2X29ubHkpIHsKKwkJ CQlwaHlfaWQgPSBhdGgxMmtfZ2V0X3BoeV9pZChhciwgV01JX0hPU1RfV0xBTl81R19DQVApOwor CQkJCXJlZ19jYXAgPSAmYXItPmFiLT5oYWxfcmVnX2NhcFtwaHlfaWRdOworCQkJfQorCisJCQlh dGgxMmtfbWFjX3VwZGF0ZV9jaF9saXN0KGFyLCBiYW5kLAorCQkJCQkJICByZWdfY2FwLT5sb3df NWdoel9jaGFuLAorCQkJCQkJICByZWdfY2FwLT5oaWdoXzVnaHpfY2hhbik7CisJCX0KKwl9CisK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGgxMmtfbWFjX3NldHVwX2lmYWNlX2NvbWJp bmF0aW9ucyhzdHJ1Y3QgYXRoMTJrICphcikKK3sKKwlzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiID0g YXItPmFiOworCXN0cnVjdCBpZWVlODAyMTFfaWZhY2VfY29tYmluYXRpb24gKmNvbWJpbmF0aW9u czsKKwlzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2xpbWl0ICpsaW1pdHM7CisJaW50IG5fbGltaXRz LCBtYXhfaW50ZXJmYWNlczsKKwlib29sIGFwLCBtZXNoOworCisJYXAgPSBhYi0+aHdfcGFyYW1z LT5pbnRlcmZhY2VfbW9kZXMgJiBCSVQoTkw4MDIxMV9JRlRZUEVfQVApOworCisJbWVzaCA9IElT X0VOQUJMRUQoQ09ORklHX01BQzgwMjExX01FU0gpICYmCisJCWFiLT5od19wYXJhbXMtPmludGVy ZmFjZV9tb2RlcyAmIEJJVChOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UKTsKKworCWNvbWJpbmF0 aW9ucyA9IGt6YWxsb2Moc2l6ZW9mKCpjb21iaW5hdGlvbnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAo IWNvbWJpbmF0aW9ucykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoYXAgfHwgbWVzaCkgewor CQluX2xpbWl0cyA9IDI7CisJCW1heF9pbnRlcmZhY2VzID0gMTY7CisJfSBlbHNlIHsKKwkJbl9s aW1pdHMgPSAxOworCQltYXhfaW50ZXJmYWNlcyA9IDE7CisJfQorCisJbGltaXRzID0ga2NhbGxv YyhuX2xpbWl0cywgc2l6ZW9mKCpsaW1pdHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxpbWl0cykg eworCQlrZnJlZShjb21iaW5hdGlvbnMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlsaW1p dHNbMF0ubWF4ID0gMTsKKwlsaW1pdHNbMF0udHlwZXMgfD0gQklUKE5MODAyMTFfSUZUWVBFX1NU QVRJT04pOworCisJaWYgKGFwKSB7CisJCWxpbWl0c1sxXS5tYXggPSBtYXhfaW50ZXJmYWNlczsK KwkJbGltaXRzWzFdLnR5cGVzIHw9IEJJVChOTDgwMjExX0lGVFlQRV9BUCk7CisJfQorCisJaWYg KG1lc2gpCisJCWxpbWl0c1sxXS50eXBlcyB8PSBCSVQoTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lO VCk7CisKKwljb21iaW5hdGlvbnNbMF0ubGltaXRzID0gbGltaXRzOworCWNvbWJpbmF0aW9uc1sw XS5uX2xpbWl0cyA9IG5fbGltaXRzOworCWNvbWJpbmF0aW9uc1swXS5tYXhfaW50ZXJmYWNlcyA9 IG1heF9pbnRlcmZhY2VzOworCWNvbWJpbmF0aW9uc1swXS5udW1fZGlmZmVyZW50X2NoYW5uZWxz ID0gMTsKKwljb21iaW5hdGlvbnNbMF0uYmVhY29uX2ludF9pbmZyYV9tYXRjaCA9IHRydWU7CisJ Y29tYmluYXRpb25zWzBdLmJlYWNvbl9pbnRfbWluX2djZCA9IDEwMDsKKwljb21iaW5hdGlvbnNb MF0ucmFkYXJfZGV0ZWN0X3dpZHRocyA9IEJJVChOTDgwMjExX0NIQU5fV0lEVEhfMjBfTk9IVCkg fAorCQkJCQkJQklUKE5MODAyMTFfQ0hBTl9XSURUSF8yMCkgfAorCQkJCQkJQklUKE5MODAyMTFf Q0hBTl9XSURUSF80MCkgfAorCQkJCQkJQklUKE5MODAyMTFfQ0hBTl9XSURUSF84MCk7CisKKwlh ci0+aHctPndpcGh5LT5pZmFjZV9jb21iaW5hdGlvbnMgPSBjb21iaW5hdGlvbnM7CisJYXItPmh3 LT53aXBoeS0+bl9pZmFjZV9jb21iaW5hdGlvbnMgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBjb25zdCB1OCBhdGgxMmtfaWZfdHlwZXNfZXh0X2NhcGFbXSA9IHsKKwlbMF0gPSBXTEFO X0VYVF9DQVBBMV9FWFRfQ0hBTk5FTF9TV0lUQ0hJTkcsCisJWzddID0gV0xBTl9FWFRfQ0FQQThf T1BNT0RFX05PVElGLAorfTsKKworc3RhdGljIGNvbnN0IHU4IGF0aDEya19pZl90eXBlc19leHRf Y2FwYV9zdGFbXSA9IHsKKwlbMF0gPSBXTEFOX0VYVF9DQVBBMV9FWFRfQ0hBTk5FTF9TV0lUQ0hJ TkcsCisJWzddID0gV0xBTl9FWFRfQ0FQQThfT1BNT0RFX05PVElGLAorCVs5XSA9IFdMQU5fRVhU X0NBUEExMF9UV1RfUkVRVUVTVEVSX1NVUFBPUlQsCit9OworCitzdGF0aWMgY29uc3QgdTggYXRo MTJrX2lmX3R5cGVzX2V4dF9jYXBhX2FwW10gPSB7CisJWzBdID0gV0xBTl9FWFRfQ0FQQTFfRVhU X0NIQU5ORUxfU1dJVENISU5HLAorCVs3XSA9IFdMQU5fRVhUX0NBUEE4X09QTU9ERV9OT1RJRiwK KwlbOV0gPSBXTEFOX0VYVF9DQVBBMTBfVFdUX1JFU1BPTkRFUl9TVVBQT1JULAorfTsKKworc3Rh dGljIGNvbnN0IHN0cnVjdCB3aXBoeV9pZnR5cGVfZXh0X2NhcGFiIGF0aDEya19pZnR5cGVzX2V4 dF9jYXBhW10gPSB7CisJeworCQkuZXh0ZW5kZWRfY2FwYWJpbGl0aWVzID0gYXRoMTJrX2lmX3R5 cGVzX2V4dF9jYXBhLAorCQkuZXh0ZW5kZWRfY2FwYWJpbGl0aWVzX21hc2sgPSBhdGgxMmtfaWZf dHlwZXNfZXh0X2NhcGEsCisJCS5leHRlbmRlZF9jYXBhYmlsaXRpZXNfbGVuID0gc2l6ZW9mKGF0 aDEya19pZl90eXBlc19leHRfY2FwYSksCisJfSwgeworCQkuaWZ0eXBlID0gTkw4MDIxMV9JRlRZ UEVfU1RBVElPTiwKKwkJLmV4dGVuZGVkX2NhcGFiaWxpdGllcyA9IGF0aDEya19pZl90eXBlc19l eHRfY2FwYV9zdGEsCisJCS5leHRlbmRlZF9jYXBhYmlsaXRpZXNfbWFzayA9IGF0aDEya19pZl90 eXBlc19leHRfY2FwYV9zdGEsCisJCS5leHRlbmRlZF9jYXBhYmlsaXRpZXNfbGVuID0KKwkJCQlz aXplb2YoYXRoMTJrX2lmX3R5cGVzX2V4dF9jYXBhX3N0YSksCisJfSwgeworCQkuaWZ0eXBlID0g Tkw4MDIxMV9JRlRZUEVfQVAsCisJCS5leHRlbmRlZF9jYXBhYmlsaXRpZXMgPSBhdGgxMmtfaWZf dHlwZXNfZXh0X2NhcGFfYXAsCisJCS5leHRlbmRlZF9jYXBhYmlsaXRpZXNfbWFzayA9IGF0aDEy a19pZl90eXBlc19leHRfY2FwYV9hcCwKKwkJLmV4dGVuZGVkX2NhcGFiaWxpdGllc19sZW4gPQor CQkJCXNpemVvZihhdGgxMmtfaWZfdHlwZXNfZXh0X2NhcGFfYXApLAorCX0sCit9OworCitzdGF0 aWMgdm9pZCBfX2F0aDEya19tYWNfdW5yZWdpc3RlcihzdHJ1Y3QgYXRoMTJrICphcikKK3sKKwlj YW5jZWxfd29ya19zeW5jKCZhci0+cmVnZF91cGRhdGVfd29yayk7CisKKwlpZWVlODAyMTFfdW5y ZWdpc3Rlcl9odyhhci0+aHcpOworCisJaWRyX2Zvcl9lYWNoKCZhci0+dHhtZ210X2lkciwgYXRo MTJrX21hY190eF9tZ210X3BlbmRpbmdfZnJlZSwgYXIpOworCWlkcl9kZXN0cm95KCZhci0+dHht Z210X2lkcik7CisKKwlrZnJlZShhci0+bWFjLnNiYW5kc1tOTDgwMjExX0JBTkRfMkdIWl0uY2hh bm5lbHMpOworCWtmcmVlKGFyLT5tYWMuc2JhbmRzW05MODAyMTFfQkFORF81R0haXS5jaGFubmVs cyk7CisJa2ZyZWUoYXItPm1hYy5zYmFuZHNbTkw4MDIxMV9CQU5EXzZHSFpdLmNoYW5uZWxzKTsK KworCWtmcmVlKGFyLT5ody0+d2lwaHktPmlmYWNlX2NvbWJpbmF0aW9uc1swXS5saW1pdHMpOwor CWtmcmVlKGFyLT5ody0+d2lwaHktPmlmYWNlX2NvbWJpbmF0aW9ucyk7CisKKwlTRVRfSUVFRTgw MjExX0RFVihhci0+aHcsIE5VTEwpOworfQorCit2b2lkIGF0aDEya19tYWNfdW5yZWdpc3Rlcihz dHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiKQoreworCXN0cnVjdCBhdGgxMmsgKmFyOworCXN0cnVjdCBh dGgxMmtfcGRldiAqcGRldjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhYi0+bnVtX3Jh ZGlvczsgaSsrKSB7CisJCXBkZXYgPSAmYWItPnBkZXZzW2ldOworCQlhciA9IHBkZXYtPmFyOwor CQlpZiAoIWFyKQorCQkJY29udGludWU7CisKKwkJX19hdGgxMmtfbWFjX3VucmVnaXN0ZXIoYXIp OworCX0KK30KKworc3RhdGljIGludCBfX2F0aDEya19tYWNfcmVnaXN0ZXIoc3RydWN0IGF0aDEy ayAqYXIpCit7CisJc3RydWN0IGF0aDEya19iYXNlICphYiA9IGFyLT5hYjsKKwlzdHJ1Y3QgYXRo MTJrX3BkZXZfY2FwICpjYXAgPSAmYXItPnBkZXYtPmNhcDsKKwlzdGF0aWMgY29uc3QgdTMyIGNp cGhlcl9zdWl0ZXNbXSA9IHsKKwkJV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCwKKwkJV0xBTl9DSVBI RVJfU1VJVEVfQ0NNUCwKKwkJV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUMsCisJCVdMQU5fQ0lQ SEVSX1NVSVRFX0JJUF9DTUFDXzI1NiwKKwkJV0xBTl9DSVBIRVJfU1VJVEVfQklQX0dNQUNfMTI4 LAorCQlXTEFOX0NJUEhFUl9TVUlURV9CSVBfR01BQ18yNTYsCisJCVdMQU5fQ0lQSEVSX1NVSVRF X0dDTVAsCisJCVdMQU5fQ0lQSEVSX1NVSVRFX0dDTVBfMjU2LAorCQlXTEFOX0NJUEhFUl9TVUlU RV9DQ01QXzI1NiwKKwl9OworCWludCByZXQ7CisJdTMyIGh0X2NhcCA9IDA7CisKKwlhdGgxMmtf cGRldl9jYXBzX3VwZGF0ZShhcik7CisKKwlTRVRfSUVFRTgwMjExX1BFUk1fQUREUihhci0+aHcs IGFyLT5tYWNfYWRkcik7CisKKwlTRVRfSUVFRTgwMjExX0RFVihhci0+aHcsIGFiLT5kZXYpOwor CisJcmV0ID0gYXRoMTJrX21hY19zZXR1cF9jaGFubmVsc19yYXRlcyhhciwKKwkJCQkJICAgICAg Y2FwLT5zdXBwb3J0ZWRfYmFuZHMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJYXRoMTJr X21hY19zZXR1cF9odF92aHRfY2FwKGFyLCBjYXAsICZodF9jYXApOworCWF0aDEya19tYWNfc2V0 dXBfaGVfY2FwKGFyLCBjYXApOworCisJcmV0ID0gYXRoMTJrX21hY19zZXR1cF9pZmFjZV9jb21i aW5hdGlvbnMoYXIpOworCWlmIChyZXQpIHsKKwkJYXRoMTJrX2Vycihhci0+YWIsICJmYWlsZWQg dG8gc2V0dXAgaW50ZXJmYWNlIGNvbWJpbmF0aW9uczogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJy X2ZyZWVfY2hhbm5lbHM7CisJfQorCisJYXItPmh3LT53aXBoeS0+YXZhaWxhYmxlX2FudGVubmFz X3J4ID0gY2FwLT5yeF9jaGFpbl9tYXNrOworCWFyLT5ody0+d2lwaHktPmF2YWlsYWJsZV9hbnRl bm5hc190eCA9IGNhcC0+dHhfY2hhaW5fbWFzazsKKworCWFyLT5ody0+d2lwaHktPmludGVyZmFj ZV9tb2RlcyA9IGFiLT5od19wYXJhbXMtPmludGVyZmFjZV9tb2RlczsKKworCWllZWU4MDIxMV9o d19zZXQoYXItPmh3LCBTSUdOQUxfREJNKTsKKwlpZWVlODAyMTFfaHdfc2V0KGFyLT5odywgU1VQ UE9SVFNfUFMpOworCWllZWU4MDIxMV9od19zZXQoYXItPmh3LCBTVVBQT1JUU19EWU5BTUlDX1BT KTsKKwlpZWVlODAyMTFfaHdfc2V0KGFyLT5odywgTUZQX0NBUEFCTEUpOworCWllZWU4MDIxMV9o d19zZXQoYXItPmh3LCBSRVBPUlRTX1RYX0FDS19TVEFUVVMpOworCWllZWU4MDIxMV9od19zZXQo YXItPmh3LCBIQVNfUkFURV9DT05UUk9MKTsKKwlpZWVlODAyMTFfaHdfc2V0KGFyLT5odywgQVBf TElOS19QUyk7CisJaWVlZTgwMjExX2h3X3NldChhci0+aHcsIFNQRUNUUlVNX01HTVQpOworCWll ZWU4MDIxMV9od19zZXQoYXItPmh3LCBDT05ORUNUSU9OX01PTklUT1IpOworCWllZWU4MDIxMV9o d19zZXQoYXItPmh3LCBTVVBQT1JUU19QRVJfU1RBX0dUSyk7CisJaWVlZTgwMjExX2h3X3NldChh ci0+aHcsIENIQU5DVFhfU1RBX0NTQSk7CisJaWVlZTgwMjExX2h3X3NldChhci0+aHcsIFFVRVVF X0NPTlRST0wpOworCWllZWU4MDIxMV9od19zZXQoYXItPmh3LCBTVVBQT1JUU19UWF9GUkFHKTsK KwlpZWVlODAyMTFfaHdfc2V0KGFyLT5odywgUkVQT1JUU19MT1dfQUNLKTsKKworCWlmIChodF9j YXAgJiBXTUlfSFRfQ0FQX0VOQUJMRUQpIHsKKwkJaWVlZTgwMjExX2h3X3NldChhci0+aHcsIEFN UERVX0FHR1JFR0FUSU9OKTsKKwkJaWVlZTgwMjExX2h3X3NldChhci0+aHcsIFRYX0FNUERVX1NF VFVQX0lOX0hXKTsKKwkJaWVlZTgwMjExX2h3X3NldChhci0+aHcsIFNVUFBPUlRTX1JFT1JERVJJ TkdfQlVGRkVSKTsKKwkJaWVlZTgwMjExX2h3X3NldChhci0+aHcsIFNVUFBPUlRTX0FNU0RVX0lO X0FNUERVKTsKKwkJaWVlZTgwMjExX2h3X3NldChhci0+aHcsIFVTRVNfUlNTKTsKKwl9CisKKwlh ci0+aHctPndpcGh5LT5mZWF0dXJlcyB8PSBOTDgwMjExX0ZFQVRVUkVfU1RBVElDX1NNUFM7CisJ YXItPmh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19JQlNTX1JTTjsKKworCS8qIFRPRE86 IENoZWNrIGlmIEhUIGNhcGFiaWxpdHkgYWR2ZXJ0aXNlZCBmcm9tIGZpcm13YXJlIGlzIGRpZmZl cmVudAorCSAqIGZvciBlYWNoIGJhbmQgZm9yIGEgZHVhbCBiYW5kIGNhcGFibGUgcmFkaW8uIEl0 IHdpbGwgYmUgdHJpY2t5IHRvCisJICogaGFuZGxlIGl0IHdoZW4gdGhlIGh0IGNhcGFiaWxpdHkg ZGlmZmVyZW50IGZvciBlYWNoIGJhbmQuCisJICovCisJaWYgKGh0X2NhcCAmIFdNSV9IVF9DQVBf RFlOQU1JQ19TTVBTKQorCQlhci0+aHctPndpcGh5LT5mZWF0dXJlcyB8PSBOTDgwMjExX0ZFQVRV UkVfRFlOQU1JQ19TTVBTOworCisJYXItPmh3LT53aXBoeS0+bWF4X3NjYW5fc3NpZHMgPSBXTEFO X1NDQU5fUEFSQU1TX01BWF9TU0lEOworCWFyLT5ody0+d2lwaHktPm1heF9zY2FuX2llX2xlbiA9 IFdMQU5fU0NBTl9QQVJBTVNfTUFYX0lFX0xFTjsKKworCWFyLT5ody0+bWF4X2xpc3Rlbl9pbnRl cnZhbCA9IEFUSDEyS19NQVhfSFdfTElTVEVOX0lOVEVSVkFMOworCisJYXItPmh3LT53aXBoeS0+ ZmxhZ3MgfD0gV0lQSFlfRkxBR19IQVNfUkVNQUlOX09OX0NIQU5ORUw7CisJYXItPmh3LT53aXBo eS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19IQVNfQ0hBTk5FTF9TV0lUQ0g7CisJYXItPmh3LT53aXBo eS0+bWF4X3JlbWFpbl9vbl9jaGFubmVsX2R1cmF0aW9uID0gNTAwMDsKKworCWFyLT5ody0+d2lw aHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfQVBfVUFQU0Q7CisJYXItPmh3LT53aXBoeS0+ZmVhdHVy ZXMgfD0gTkw4MDIxMV9GRUFUVVJFX0FQX01PREVfQ0hBTl9XSURUSF9DSEFOR0UgfAorCQkJCSAg IE5MODAyMTFfRkVBVFVSRV9BUF9TQ0FOOworCisJYXItPm1heF9udW1fc3RhdGlvbnMgPSBUQVJH RVRfTlVNX1NUQVRJT05TOworCWFyLT5tYXhfbnVtX3BlZXJzID0gVEFSR0VUX05VTV9QRUVSU19Q REVWOworCisJYXItPmh3LT53aXBoeS0+bWF4X2FwX2Fzc29jX3N0YSA9IGFyLT5tYXhfbnVtX3N0 YXRpb25zOworCisJYXItPmh3LT5xdWV1ZXMgPSBBVEgxMktfSFdfTUFYX1FVRVVFUzsKKwlhci0+ aHctPndpcGh5LT50eF9xdWV1ZV9sZW4gPSBBVEgxMktfUVVFVUVfTEVOOworCWFyLT5ody0+b2Zm Y2hhbm5lbF90eF9od19xdWV1ZSA9IEFUSDEyS19IV19NQVhfUVVFVUVTIC0gMTsKKwlhci0+aHct Pm1heF9yeF9hZ2dyZWdhdGlvbl9zdWJmcmFtZXMgPSBJRUVFODAyMTFfTUFYX0FNUERVX0JVRl9I RTsKKworCWFyLT5ody0+dmlmX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXRoMTJrX3ZpZik7 CisJYXItPmh3LT5zdGFfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBhdGgxMmtfc3RhKTsKKwor CXdpcGh5X2V4dF9mZWF0dXJlX3NldChhci0+aHctPndpcGh5LCBOTDgwMjExX0VYVF9GRUFUVVJF X0NRTV9SU1NJX0xJU1QpOworCXdpcGh5X2V4dF9mZWF0dXJlX3NldChhci0+aHctPndpcGh5LCBO TDgwMjExX0VYVF9GRUFUVVJFX1NUQV9UWF9QV1IpOworCisJYXItPmh3LT53aXBoeS0+Y2lwaGVy X3N1aXRlcyA9IGNpcGhlcl9zdWl0ZXM7CisJYXItPmh3LT53aXBoeS0+bl9jaXBoZXJfc3VpdGVz ID0gQVJSQVlfU0laRShjaXBoZXJfc3VpdGVzKTsKKworCWFyLT5ody0+d2lwaHktPmlmdHlwZV9l eHRfY2FwYWIgPSBhdGgxMmtfaWZ0eXBlc19leHRfY2FwYTsKKwlhci0+aHctPndpcGh5LT5udW1f aWZ0eXBlX2V4dF9jYXBhYiA9CisJCUFSUkFZX1NJWkUoYXRoMTJrX2lmdHlwZXNfZXh0X2NhcGEp OworCisJaWYgKGFyLT5zdXBwb3J0c182Z2h6KSB7CisJCXdpcGh5X2V4dF9mZWF0dXJlX3NldChh ci0+aHctPndpcGh5LAorCQkJCSAgICAgIE5MODAyMTFfRVhUX0ZFQVRVUkVfRklMU19ESVNDT1ZF UlkpOworCQl3aXBoeV9leHRfZmVhdHVyZV9zZXQoYXItPmh3LT53aXBoeSwKKwkJCQkgICAgICBO TDgwMjExX0VYVF9GRUFUVVJFX1VOU09MX0JDQVNUX1BST0JFX1JFU1ApOworCX0KKworCWF0aDEy a19yZWdfaW5pdChhcik7CisKKwlpZiAoIXRlc3RfYml0KEFUSDEyS19GTEFHX1JBV19NT0RFLCAm YWItPmRldl9mbGFncykpIHsKKwkJYXItPmh3LT5uZXRkZXZfZmVhdHVyZXMgPSBORVRJRl9GX0hX X0NTVU07CisJCWllZWU4MDIxMV9od19zZXQoYXItPmh3LCBTV19DUllQVE9fQ09OVFJPTCk7CisJ CWllZWU4MDIxMV9od19zZXQoYXItPmh3LCBTVVBQT1JUX0ZBU1RfWE1JVCk7CisJfQorCisJcmV0 ID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3KGFyLT5odyk7CisJaWYgKHJldCkgeworCQlhdGgxMmtf ZXJyKGFyLT5hYiwgImllZWU4MDIxMSByZWdpc3RyYXRpb24gZmFpbGVkOiAlZFxuIiwgcmV0KTsK KwkJZ290byBlcnJfZnJlZV9pZl9jb21iczsKKwl9CisKKwlpZiAoIWFiLT5od19wYXJhbXMtPnN1 cHBvcnRzX21vbml0b3IpCisJCS8qIFRoZXJlJ3MgYSByYWNlIGJldHdlZW4gY2FsbGluZyBpZWVl ODAyMTFfcmVnaXN0ZXJfaHcoKQorCQkgKiBhbmQgaGVyZSB3aGVyZSB0aGUgbW9uaXRvciBtb2Rl IGlzIGVuYWJsZWQgZm9yIGEgbGl0dGxlCisJCSAqIHdoaWxlLiBCdXQgdGhhdCB0aW1lIGlzIHNv IHNob3J0IGFuZCBpbiBwcmFjdGlzZSBpdCBtYWtlCisJCSAqIGEgZGlmZmVyZW5jZSBpbiByZWFs IGxpZmUuCisJCSAqLworCQlhci0+aHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgJj0gfkJJVChO TDgwMjExX0lGVFlQRV9NT05JVE9SKTsKKworCS8qIEFwcGx5IHRoZSByZWdkIHJlY2VpdmVkIGR1 cmluZyBpbml0aWFsaXphdGlvbiAqLworCXJldCA9IGF0aDEya19yZWdkX3VwZGF0ZShhciwgdHJ1 ZSk7CisJaWYgKHJldCkgeworCQlhdGgxMmtfZXJyKGFyLT5hYiwgImF0aDEyayByZWdkIHVwZGF0 ZSBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl91bnJlZ2lzdGVyX2h3OworCX0KKwor CXJldHVybiAwOworCitlcnJfdW5yZWdpc3Rlcl9odzoKKwlpZWVlODAyMTFfdW5yZWdpc3Rlcl9o dyhhci0+aHcpOworCitlcnJfZnJlZV9pZl9jb21iczoKKwlrZnJlZShhci0+aHctPndpcGh5LT5p ZmFjZV9jb21iaW5hdGlvbnNbMF0ubGltaXRzKTsKKwlrZnJlZShhci0+aHctPndpcGh5LT5pZmFj ZV9jb21iaW5hdGlvbnMpOworCitlcnJfZnJlZV9jaGFubmVsczoKKwlrZnJlZShhci0+bWFjLnNi YW5kc1tOTDgwMjExX0JBTkRfMkdIWl0uY2hhbm5lbHMpOworCWtmcmVlKGFyLT5tYWMuc2JhbmRz W05MODAyMTFfQkFORF81R0haXS5jaGFubmVscyk7CisJa2ZyZWUoYXItPm1hYy5zYmFuZHNbTkw4 MDIxMV9CQU5EXzZHSFpdLmNoYW5uZWxzKTsKKworZXJyOgorCVNFVF9JRUVFODAyMTFfREVWKGFy LT5odywgTlVMTCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGF0aDEya19tYWNfcmVnaXN0ZXIo c3RydWN0IGF0aDEya19iYXNlICphYikKK3sKKwlzdHJ1Y3QgYXRoMTJrICphcjsKKwlzdHJ1Y3Qg YXRoMTJrX3BkZXYgKnBkZXY7CisJaW50IGk7CisJaW50IHJldDsKKworCWlmICh0ZXN0X2JpdChB VEgxMktfRkxBR19SRUdJU1RFUkVELCAmYWItPmRldl9mbGFncykpCisJCXJldHVybiAwOworCisJ Zm9yIChpID0gMDsgaSA8IGFiLT5udW1fcmFkaW9zOyBpKyspIHsKKwkJcGRldiA9ICZhYi0+cGRl dnNbaV07CisJCWFyID0gcGRldi0+YXI7CisJCWlmIChhYi0+cGRldnNfbWFjYWRkcl92YWxpZCkg eworCQkJZXRoZXJfYWRkcl9jb3B5KGFyLT5tYWNfYWRkciwgcGRldi0+bWFjX2FkZHIpOworCQl9 IGVsc2UgeworCQkJZXRoZXJfYWRkcl9jb3B5KGFyLT5tYWNfYWRkciwgYWItPm1hY19hZGRyKTsK KwkJCWFyLT5tYWNfYWRkcls0XSArPSBpOworCQl9CisKKwkJcmV0ID0gX19hdGgxMmtfbWFjX3Jl Z2lzdGVyKGFyKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2NsZWFudXA7CisKKwkJaWRyX2lu aXQoJmFyLT50eG1nbXRfaWRyKTsKKwkJc3Bpbl9sb2NrX2luaXQoJmFyLT50eG1nbXRfaWRyX2xv Y2spOworCX0KKworCS8qIEluaXRpYWxpemUgY2hhbm5lbCBjb3VudGVycyBmcmVxdWVuY3kgdmFs dWUgaW4gaGVydHogKi8KKwlhYi0+Y2NfZnJlcV9oeiA9IDMyMDAwMDsKKwlhYi0+ZnJlZV92ZGV2 X21hcCA9ICgxTEwgPDwgKGFiLT5udW1fcmFkaW9zICogVEFSR0VUX05VTV9WREVWUykpIC0gMTsK KworCXJldHVybiAwOworCitlcnJfY2xlYW51cDoKKwlmb3IgKGkgPSBpIC0gMTsgaSA+PSAwOyBp LS0pIHsKKwkJcGRldiA9ICZhYi0+cGRldnNbaV07CisJCWFyID0gcGRldi0+YXI7CisJCV9fYXRo MTJrX21hY191bnJlZ2lzdGVyKGFyKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYXRo MTJrX21hY19hbGxvY2F0ZShzdHJ1Y3QgYXRoMTJrX2Jhc2UgKmFiKQoreworCXN0cnVjdCBpZWVl ODAyMTFfaHcgKmh3OworCXN0cnVjdCBhdGgxMmsgKmFyOworCXN0cnVjdCBhdGgxMmtfcGRldiAq cGRldjsKKwlpbnQgcmV0OworCWludCBpOworCisJaWYgKHRlc3RfYml0KEFUSDEyS19GTEFHX1JF R0lTVEVSRUQsICZhYi0+ZGV2X2ZsYWdzKSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBp IDwgYWItPm51bV9yYWRpb3M7IGkrKykgeworCQlwZGV2ID0gJmFiLT5wZGV2c1tpXTsKKwkJaHcg PSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKHN0cnVjdCBhdGgxMmspLCAmYXRoMTJrX29wcyk7 CisJCWlmICghaHcpIHsKKwkJCWF0aDEya193YXJuKGFiLCAiZmFpbGVkIHRvIGFsbG9jYXRlIG1h YzgwMjExIGh3IGRldmljZVxuIik7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnJfZnJl ZV9tYWM7CisJCX0KKworCQlhciA9IGh3LT5wcml2OworCQlhci0+aHcgPSBodzsKKwkJYXItPmFi ID0gYWI7CisJCWFyLT5wZGV2ID0gcGRldjsKKwkJYXItPnBkZXZfaWR4ID0gaTsKKwkJYXItPmxt YWNfaWQgPSBhdGgxMmtfaHdfZ2V0X21hY19mcm9tX3BkZXZfaWQoYWItPmh3X3BhcmFtcywgaSk7 CisKKwkJYXItPndtaSA9ICZhYi0+d21pX2FiLndtaVtpXTsKKwkJLyogRklYTUU6IHdtaVswXSBp cyBhbHJlYWR5IGluaXRpYWxpemVkIGR1cmluZyBhdHRhY2gsCisJCSAqIFNob3VsZCB3ZSBkbyB0 aGlzIGFnYWluPworCQkgKi8KKwkJYXRoMTJrX3dtaV9wZGV2X2F0dGFjaChhYiwgaSk7CisKKwkJ YXItPmNmZ190eF9jaGFpbm1hc2sgPSBwZGV2LT5jYXAudHhfY2hhaW5fbWFzazsKKwkJYXItPmNm Z19yeF9jaGFpbm1hc2sgPSBwZGV2LT5jYXAucnhfY2hhaW5fbWFzazsKKwkJYXItPm51bV90eF9j aGFpbnMgPSBod2VpZ2h0MzIocGRldi0+Y2FwLnR4X2NoYWluX21hc2spOworCQlhci0+bnVtX3J4 X2NoYWlucyA9IGh3ZWlnaHQzMihwZGV2LT5jYXAucnhfY2hhaW5fbWFzayk7CisKKwkJcGRldi0+ YXIgPSBhcjsKKwkJc3Bpbl9sb2NrX2luaXQoJmFyLT5kYXRhX2xvY2spOworCQlJTklUX0xJU1Rf SEVBRCgmYXItPmFydmlmcyk7CisJCUlOSVRfTElTVF9IRUFEKCZhci0+cHBkdV9zdGF0c19pbmZv KTsKKwkJbXV0ZXhfaW5pdCgmYXItPmNvbmZfbXV0ZXgpOworCQlpbml0X2NvbXBsZXRpb24oJmFy LT52ZGV2X3NldHVwX2RvbmUpOworCQlpbml0X2NvbXBsZXRpb24oJmFyLT52ZGV2X2RlbGV0ZV9k b25lKTsKKwkJaW5pdF9jb21wbGV0aW9uKCZhci0+cGVlcl9hc3NvY19kb25lKTsKKwkJaW5pdF9j b21wbGV0aW9uKCZhci0+cGVlcl9kZWxldGVfZG9uZSk7CisJCWluaXRfY29tcGxldGlvbigmYXIt Pmluc3RhbGxfa2V5X2RvbmUpOworCQlpbml0X2NvbXBsZXRpb24oJmFyLT5ic3Nfc3VydmV5X2Rv bmUpOworCQlpbml0X2NvbXBsZXRpb24oJmFyLT5zY2FuLnN0YXJ0ZWQpOworCQlpbml0X2NvbXBs ZXRpb24oJmFyLT5zY2FuLmNvbXBsZXRlZCk7CisKKwkJSU5JVF9ERUxBWUVEX1dPUksoJmFyLT5z Y2FuLnRpbWVvdXQsIGF0aDEya19zY2FuX3RpbWVvdXRfd29yayk7CisJCUlOSVRfV09SSygmYXIt PnJlZ2RfdXBkYXRlX3dvcmssIGF0aDEya19yZWdkX3VwZGF0ZV93b3JrKTsKKworCQlJTklUX1dP UksoJmFyLT53bWlfbWdtdF90eF93b3JrLCBhdGgxMmtfbWdtdF9vdmVyX3dtaV90eF93b3JrKTsK KwkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYXItPndtaV9tZ210X3R4X3F1ZXVlKTsKKwkJY2xlYXJf Yml0KEFUSDEyS19GTEFHX01PTklUT1JfRU5BQkxFRCwgJmFyLT5tb25pdG9yX2ZsYWdzKTsKKwl9 CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfbWFjOgorCWF0aDEya19tYWNfZGVzdHJveShhYik7 CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGF0aDEya19tYWNfZGVzdHJveShzdHJ1Y3QgYXRo MTJrX2Jhc2UgKmFiKQoreworCXN0cnVjdCBhdGgxMmsgKmFyOworCXN0cnVjdCBhdGgxMmtfcGRl diAqcGRldjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhYi0+bnVtX3JhZGlvczsgaSsr KSB7CisJCXBkZXYgPSAmYWItPnBkZXZzW2ldOworCQlhciA9IHBkZXYtPmFyOworCQlpZiAoIWFy KQorCQkJY29udGludWU7CisKKwkJaWVlZTgwMjExX2ZyZWVfaHcoYXItPmh3KTsKKwkJcGRldi0+ YXIgPSBOVUxMOworCX0KK30KCgotLSAKYXRoMTJrIG1haWxpbmcgbGlzdAphdGgxMmtAbGlzdHMu aW5mcmFkZWFkLm9yZwpodHRwczovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5m by9hdGgxMmsK