Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp1082588pxb; Thu, 5 Nov 2020 23:52:13 -0800 (PST) X-Google-Smtp-Source: ABdhPJwYSuJeWCVpIpjWY0PmeSJJdyMD2dXGdVf1qJIeP2We5RAwGJo0B0A99r05ZLU0g0JsYVrJ X-Received: by 2002:a50:9993:: with SMTP id m19mr737008edb.99.1604649133185; Thu, 05 Nov 2020 23:52:13 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1604649133; cv=pass; d=google.com; s=arc-20160816; b=deU7FnrZMxNFUPRSjyCSAyUdd3jnNJ7n/bHUrDg1RFE90m8uk4NcApNyPF7HahMHsv rNm9Ua2mmc9eHnUeoAuM77YCNu6Gl89wldoHuIsiQFfHJaZmoPFBQ0UXTNQn3mNw3xRH lWK3C2+g89TEW4vnHl6WT09wHPCHhnp0nT9/ZTaZZ3pE4CxYVYiSDtio5jyytM6JElGY WCYUtsUXh8xGATjyDHGVkzMqDsMSCQXyWtf78zZSJwAhwrJ21YFhl0uP6tAXKhxGl3SD /1eOouXe8WGKWHxHgh8iGjEZ0MFyzfIZQb+blamgsUFsC+/cNitflcD1LXk6MOunZ/sM X10g== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:content-transfer-encoding :content-language:accept-language:in-reply-to:references:message-id :date:thread-index:thread-topic:subject:cc:to:from; bh=2DDdGIvC0fxs4ICBCyVpYYtHWO2OujWpeEPqoOxXUCU=; b=zPAWV6Kw2zJ2V3U3w1Ek29k6pC6/2Phu6wwIx5AiYOg1Hg2QU8g/xOAJ5exWarkyVJ 4JB9AkEJq8gYRSIadDtig8yb2Tp/wxVTTbYxSvpip7wzFe8ZAekqWKWMzvZCooq04ThL 3EcAdFRGpsFDRjeFYAuAnAAg1xRk4Y0x2vjOM9e6RRP7pMKOOjoSsuJ6rO+yYg3IucGd /FyoKscqGlxiA/O/oEFmKWSbABxKbRaWDiwTSnJbrPmoxtEp6TN0qw14hD5dZNcrc+S9 p0GvsjydAsq4wvJJdKHpK33Y3n9YRwkOojC4vLrlg/G95FMZ9Qpy212TJpn2nEwtYwHi 40aA== ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=aspeedtech.com dkim=pass dkdomain=aspeedtech.com dmarc=pass fromdomain=aspeedtech.com); spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id c8si374151edr.540.2020.11.05.23.51.50; Thu, 05 Nov 2020 23:52:13 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; arc=pass (i=1 spf=pass spfdomain=aspeedtech.com dkim=pass dkdomain=aspeedtech.com dmarc=pass fromdomain=aspeedtech.com); spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726519AbgKFHtq (ORCPT + 99 others); Fri, 6 Nov 2020 02:49:46 -0500 Received: from mail-eopbgr1300094.outbound.protection.outlook.com ([40.107.130.94]:52160 "EHLO APC01-HK2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725830AbgKFHtq (ORCPT ); Fri, 6 Nov 2020 02:49:46 -0500 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=cvm0YpSaLet9GRUu4hoPckpWh5qXgQOvUPJHNBPpOCEuQBOgwftwouTNR1mXm64zkzalvZUNi3VCpH3g4geCAQzmqXy2TxaeynJ/DSSK/vOeuNgYF2Q8mRQERek08qpwPR8zuIOdQWvwZQL0u64SsTfoLTBW/hR4Z6ZE0np8M0iXOq7MRClbtyYK6yRpAl4hPmf9ixN07Ash/7Jg9SunIdjJIfIMAp/drHx+AGMZllEMaY2ktHpzu+dHYTGF1nmbZgSitHy3/wOzpbZEsL3AF70keaOskeAWz5ntBSrFNyiqfkJ7V/xWZUvkmZKPHCqaDk4NYX9npiRJlsROAnrxeg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=2DDdGIvC0fxs4ICBCyVpYYtHWO2OujWpeEPqoOxXUCU=; b=oNZTLJPJPbcMR+Vqfg7A9L2ltXpGG0rlE50D6b8fTeYJFe0Fh/vGHXupaRNTEFszHzfkF4Juei73Vv/UPTTxsQCaoIfBiNPruLPZzHUKYJ1NAu2vidYAqlN+s5j8Ouwi+6OOtH/Y4GfOk0jNOGNMLo5gHRJZq8jqVhz1XoiHK+aSffctv7y4+94gUTLQTWGQMqdFrICiTzE8EC0LUfeRWHzd3eRQ8bWAMn/VkpbtHyaxBaVtJg4NKsPMzkS+F4nsJddOp3gYOvVN+eRxsd1h9Gzyo5CLeLuDIqy2Iex9OuhAUlFpXtbF6Q3kU4irD9ccvfY9GWzL+i4UOeKIegflAQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none Received: from HK0PR06MB2786.apcprd06.prod.outlook.com (2603:1096:203:5b::22) by HK2PR0601MB1940.apcprd06.prod.outlook.com (2603:1096:202:4::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3499.18; Fri, 6 Nov 2020 07:38:59 +0000 Received: from HK0PR06MB2786.apcprd06.prod.outlook.com ([fe80::c9cf:b4b1:3371:d532]) by HK0PR06MB2786.apcprd06.prod.outlook.com ([fe80::c9cf:b4b1:3371:d532%7]) with mapi id 15.20.3499.033; Fri, 6 Nov 2020 07:38:59 +0000 From: Chin-Ting Kuo To: =?utf-8?B?Q8OpZHJpYyBMZSBHb2F0ZXI=?= , "broonie@kernel.org" , "robh+dt@kernel.org" , "joel@jms.id.au" , "andrew@aj.id.au" , "bbrezillon@kernel.org" , "devicetree@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "linux-aspeed@lists.ozlabs.org" , "linux-spi@vger.kernel.org" CC: BMC-SW Subject: RE: [v3 4/4] spi: aspeed: Add ASPEED FMC/SPI memory controller driver Thread-Topic: [v3 4/4] spi: aspeed: Add ASPEED FMC/SPI memory controller driver Thread-Index: AQHWs2u0IlfHv/sBxE+PVdt+kUjCzqm5k6CAgAET/tA= Date: Fri, 6 Nov 2020 07:38:58 +0000 Message-ID: References: <20201105120331.9853-1-chin-ting_kuo@aspeedtech.com> <20201105120331.9853-5-chin-ting_kuo@aspeedtech.com> In-Reply-To: Accept-Language: zh-TW, en-US Content-Language: zh-TW X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: kaod.org; dkim=none (message not signed) header.d=none;kaod.org; dmarc=none action=none header.from=aspeedtech.com; x-originating-ip: [211.20.114.70] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 7e6c08b6-41a9-4c0f-26cd-08d882270615 x-ms-traffictypediagnostic: HK2PR0601MB1940: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:2887; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: k1Eu3EC5fEVsaaej1PmWsjlkJTOtjkCLf8IkK5Jw9kdUyoZu05YUpQ/Pkv6IQ7gTO2ynddSE9h4TepK23RVC/BSy0fYDOKtiK/kRJ8b+vi2lrw23RYA0SrycpKy2OSas5dhimH7tCvQvXty18z83rBKWWfF4ZaGoNilwdLdr7w6BpNrHcO9tYkMGViZP1r55AE43ky9WEbDKDJKbRC2twXkf96c0iN1nSvAIRi0mKUOb6K1hrrzlQj5Dsb4BInwGJFIXNWsSVnQ5QHyXOElOTJGfhv+vesKBq0KFyzmyFf9mhwSWE+n1BYtkE8A9TZDGYF68bX0AunnYV8eD2AYr6i4od3vJF5HlSuY09NC7lbfpNeL+1X0NBZLo2TapoZo6 x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:HK0PR06MB2786.apcprd06.prod.outlook.com;PTR:;CAT:NONE;SFS:(346002)(136003)(39840400004)(376002)(366004)(396003)(66446008)(7696005)(53546011)(64756008)(6506007)(66574015)(55236004)(66946007)(30864003)(110136005)(66556008)(86362001)(83380400001)(76116006)(66476007)(5660300002)(52536014)(7416002)(2906002)(33656002)(71200400001)(8936002)(186003)(107886003)(55016002)(4326008)(8676002)(26005)(478600001)(316002)(9686003)(921003)(559001)(579004);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata: QDiwwUZYV6gU/lVGpbosjVYkkJXj+M3F22EU1ocY19nzF21aRnLAFOQPRPQzNNVwZIGH6cgta0fm1B7B0TkhFJjNoAQG8fdcPdvDslAp4Tapdy1fvT6hBmdg60uZszP1vodH8pS+NGPgvHic5rrzCPfZ1u3GwvbSucovbXHDe+ZbMppKR3DY9ncu292vNuW0Oq/r4Ze8YTLqMM9CqXZAM1lCgC9qwU9pDtpjqaAGAH78NOhH3lRHEG9OrUWiRcc+NMOXJyT8aquV+1u4GPwr6/SQs9V1E207ePiz/n4myC+jEiqWFoGfWRArPuadoG78vMANrC1PDbJmncSE3OA7DlsD8fZNIGIz7eoDiECxBxRf6JxiYNhR8EX1X/ODlOdn3urEk3fdFqRkHdIQabZzJGp8gYtcHdITksncXXwnpH/9IsEr0cPOaSG0gZFh7/hogNelpnbspnRTK4i7mNm2SFym7dkoaOkPWHoiSWdC0VGn4ts5DDlH7T4b+Ro0niC4b7o0zCz/COAS9+avH1vWVf0LtTBSTfRp+4rfG2xsUBbAv/4foolahdajSdXKfCXEorEPe/G54174A1RWJbKp8CPS655tJrwuiqgFwtDZlbaTLqjSzXBbimKZEEZcqBgEEhfHcPxTL0O/jBZmI6Sskg== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: HK0PR06MB2786.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7e6c08b6-41a9-4c0f-26cd-08d882270615 X-MS-Exchange-CrossTenant-originalarrivaltime: 06 Nov 2020 07:38:58.8880 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: rNrK5kaumcRf7jl1eKDtvYPTRy/2oAH+yNVfxQm9+XMxnUBB4V1C5rnyKIu9RuR8fmsbwuNdNcP8pE1bRIO6btEtasBvKAPPQSEGY/t7qmc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: HK2PR0601MB1940 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org SGkgQywNCg0KVGhhbmtzIGZvciB5b3VyIHJlcGx5Lg0KDQo+IC0tLS0tT3JpZ2luYWwgTWVzc2Fn ZS0tLS0tDQo+IEZyb206IEPDqWRyaWMgTGUgR29hdGVyIDxjbGdAa2FvZC5vcmc+DQo+IFNlbnQ6 IFRodXJzZGF5LCBOb3ZlbWJlciA1LCAyMDIwIDEwOjA5IFBNDQo+IFRvOiBDaGluLVRpbmcgS3Vv IDxjaGluLXRpbmdfa3VvQGFzcGVlZHRlY2guY29tPjsgYnJvb25pZUBrZXJuZWwub3JnOw0KPiBy b2JoK2R0QGtlcm5lbC5vcmc7IGpvZWxAam1zLmlkLmF1OyBhbmRyZXdAYWouaWQuYXU7IGJicmV6 aWxsb25Aa2VybmVsLm9yZzsNCj4gZGV2aWNldHJlZUB2Z2VyLmtlcm5lbC5vcmc7IGxpbnV4LWtl cm5lbEB2Z2VyLmtlcm5lbC5vcmc7DQo+IGxpbnV4LWFzcGVlZEBsaXN0cy5vemxhYnMub3JnOyBs aW51eC1zcGlAdmdlci5rZXJuZWwub3JnDQo+IENjOiBCTUMtU1cgPEJNQy1TV0Bhc3BlZWR0ZWNo LmNvbT4NCj4gU3ViamVjdDogUmU6IFt2MyA0LzRdIHNwaTogYXNwZWVkOiBBZGQgQVNQRUVEIEZN Qy9TUEkgbWVtb3J5IGNvbnRyb2xsZXINCj4gZHJpdmVyDQo+IA0KPiBIZWxsbyBDaGluLVRpbmcs DQo+IA0KPiBUaGFua3MgZm9yIHRoaXMgZHJpdmVyLiBJdCdzIG11Y2ggY2xlYW5lciB0aGFuIHRo ZSBwcmV2aW91cyBhbmQgd2Ugc2hvdWxkIHRyeQ0KPiBhZGRpbmcgc3VwcG9ydCBmb3IgdGhlIEFT VDI1MDAgU29DIGFsc28uIEkgZ3Vlc3Mgd2UgY2FuIGtlZXAgdGhlIG9sZCBkcml2ZXINCj4gZm9y IHRoZSBBU1QyNDAwIHdoaWNoIGhhcyBhIGRpZmZlcmVudCByZWdpc3RlciBsYXlvdXQuDQo+IA0K DQpJIHdpbGwgYWxzbyBhZGQgQVNUMjUwMCBwYXJ0IGludG8gbmV4dCBwYXRjaCB2ZXJzaW9uLg0K DQo+IE9uIHRoZSBwYXRjaHNldCwgSSB0aGluayB3ZSBzaG91bGQgc3BsaXQgdGhpcyBwYXRjaCBp biB0aHJlZSA6DQo+IA0KPiAgLSBiYXNpYyBzdXBwb3J0DQo+ICAtIEFIQiB3aW5kb3cgY2FsY3Vs YXRpb24gZGVwZW5kaW5nIG9uIHRoZSBmbGFzaCBzaXplDQo+ICAtIHJlYWQgdHJhaW5pbmcgc3Vw cG9ydA0KDQpPYWt5LCBpdCBpcyBtb3JlIGNsZWFyLg0KDQo+IFdlIHNob3VsZCBhdm9pZCBtYWdp YyB2YWx1ZXMgd2hlbiBzZXR0aW5nIHJlZ2lzdGVycy4gVGhpcyBpcyBjb25mdXNpbmcgYW5kDQo+ IGRlZmluZXMgYXJlIG11Y2ggYmV0dGVyLg0KDQpPa2F5LCBpdCB3aWxsIGJlIG1vZGlmaWVkIGF0 IG5leHQgcGF0Y2guDQoNCj4gQVNUMjUwMCBzdXBwb3J0IHdpbGwgYmUgYSBiaXQgY2hhbGxlbmdp bmcgYmVjYXVzZSBIVyBkb2VzIG5vdCBhbGxvdw0KPiB0byBjb25maWd1cmUgYSAxMjhNQiBBSEIg d2luZG93LCBtYXggaXMgMTIwTUIgVGhpcyBpcyBhIGJ1ZyBhbmQgdGhlIHdvcmsNCj4gYXJvdW5k IGlzIHRvIHVzZSB1c2VyIG1vZGUgZm9yIHRoZSByZW1haW5pbmcgOE1CLiBTb21ldGhpbmcgdG8g a2VlcCBpbg0KPiBtaW5kLg0KDQpUaGlzIGlzIHdoeSB0aGVyZSBpcyBhICJtaW5fZGVjb2RlX3N6 IiBlbGVtZW50IGluICJhc3BlZWRfc3BpX2luZm8iIHN0cnVjdC4NClRoYW5rcyBmb3IgeW91ciBy ZW1pbmRlci4NCg0KU29tZSByZXBsaWVzIGZvciB0aGUgY29tbWVudHMgYmVsb3cuDQoNCj4gSSBn YXZlIGl0IGEgdHJ5IG9uIFFFTVUuIEl0IGxvb2tzIGdvb2QuIFdoZW4gSSBjYW4gcmV2aXZlIG15 IEVWQiwgSSB3aWxsIGRvIHRoZQ0KPiBzYW1lLg0KPiANCj4gTW9yZSBjb21tZW50cyBiZWxvdywN Cj4gDQo+IFRoYW5rcywNCj4gDQo+IEMuDQo+IA0KPiANCj4gT24gMTEvNS8yMCAxOjAzIFBNLCBD aGluLVRpbmcgS3VvIHdyb3RlOg0KPiA+IEFkZCBkcml2ZXIgZm9yIEFTUEVFRCBCTUMgRk1DL1NQ SSBtZW1vcnkgY29udHJvbGxlciB3aGljaCBzdXBwb3J0cw0KPiA+IHNwaS1tZW0gaW50ZXJmYWNl Lg0KPiA+DQo+ID4gVGhlcmUgYXJlIHRocmVlIFNQSSBtZW1vcnkgY29udHJvbGxlcnMgZW1iZWRk ZWQgaW4gYW4gQVNQRUVEIFNvQy4NCj4gPiBFYWNoIG9mIHRoZW0gY2FuIGNvbm5lY3QgdG8gdHdv IG9yIHRocmVlIFNQSSBOT1IgZmxhc2hlcy4gVGhlIGZpcnN0DQo+ID4gU1BJIG1lbW9yeSBjb250 cm9sbGVyIGlzIGFsc28gbmFtZWQgYXMgRmlybXdhcmUgTWVtb3J5IENvbnRyb2xsZXINCj4gPiAo Rk1DKSwgd2hpY2ggaXMgc2ltaWxhciB0byBTUEkgbWVtb3J5IGNvbnRyb2xsZXIuIEFmdGVyIGRl dmljZSBBQyBvbiwNCj4gPiBNQ1UgUk9NIGNhbiBmZXRjaCBkZXZpY2UgYm9vdCBjb2RlIGZyb20g Rk1DIENTIDAuIFRodXMsIHRoZXJlIGV4aXN0cw0KPiA+IGFkZGl0aW9uYWwgcmVnaXN0ZXJzIGZv ciBib290IHByb2Nlc3MgY29udHJvbCBpbiBGTUMuDQo+ID4NCj4gPiBBU1BFRUQgU1BJIG1lbW9y eSBjb250cm9sbGVyIHN1cHBvcnRzIHNpbmdsZSwgZHVhbCBhbmQgcXVhZCBtb2RlIGZvcg0KPiA+ IFNQSSBOT1IgZmxhc2guIEl0IGFsc28gc3VwcG9ydHMgdHdvIHR5cGVzIG9mIGNvbW1hbmQgbW9k ZSwgdXNlciBtb2RlDQo+ID4gYW5kIGNvbW1hbmQgcmVhZC93cml0ZSBtb2RlLiBVc2VyIG1vZGUg aXMgdHJhZGl0aW9uYWwgcHVyZSBTUEkNCj4gPiBvcGVyYXRpb25zIHdoZXJlIGFsbCB0cmFuc21p c3Npb24gaXMgY29udHJvbGxlZCBieSBDUFUuIENvbnRyYXJpbHksDQo+ID4gd2l0aCBjb21tYW5k IHJlYWQvd3JpdGUgbW9kZSwgU1BJIGNvbnRyb2xsZXIgY2FuIHNlbmQgY29tbWFuZCBhbmQNCj4g PiBhZGRyZXNzIGF1dG9tYXRpY2FsbHkgd2hlbiBDUFUgcmVhZC93cml0ZSByZWxhdGVkIHJlbWFw cGVkIGFkZHJlc3MuDQo+ID4NCj4gPiBCZXNpZGVzLCBkaWZmZXJlbnQgd2FmZXIgcHJvY2Vzc2Vz IG9mIFNQSSBOT1IgZmxhc2ggcmVzdWx0IGluDQo+ID4gZGlmZmVyZW50IHNpZ25hbCByZXNwb25z ZSB0aW1lLiBUaGlzIHBoZW5vbWVub24gd2lsbCBiZSBlbmxhcmdlZCB3aGVuDQo+ID4gU1BJIGNs b2NrIGZyZXF1ZW5jeSBpbmNyZWFzZXMuIEFTUEVFRCBTUEkgbWVtb3J5IGNvbnRyb2xsZXIgcHJv dmlkZXMgYQ0KPiA+IG1lY2hhbmlzbSBmb3IgdGltaW5nIGNvbXBlbnNhdGlvbiBpbiBvcmRlciB0 byBzYXRpc2Z5IHZhcmlvdXMgU1BJIE5PUg0KPiA+IGZsYXNoIHBhcnRzIGFuZCBQQ0IgbGF5b3V0 Lg0KPiA+DQo+ID4gU2lnbmVkLW9mZi1ieTogQ2hpbi1UaW5nIEt1byA8Y2hpbi10aW5nX2t1b0Bh c3BlZWR0ZWNoLmNvbT4NCj4gPiAtLS0NCj4gPiAgdjI6IEZpeCBzcGFyc2Ugd2FybmluZ3MgcmVw b3J0ZWQgYnkga2VybmVsIHRlc3Qgcm9ib3QgPGxrcEBpbnRlbC5jb20+Lg0KPiA+ICB2MzogRml4 IGJ1aWxkIHdhcm5pbmdzIHdpdGggeDg2IGFsbG1vZGNvbmZpZy4NCj4gPg0KPiA+ICBkcml2ZXJz L3NwaS9LY29uZmlnICAgICAgfCAgMTAgKw0KPiA+ICBkcml2ZXJzL3NwaS9NYWtlZmlsZSAgICAg fCAgIDEgKw0KPiA+ICBkcml2ZXJzL3NwaS9zcGktYXNwZWVkLmMgfCA5NjkNCj4gPiArKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysNCj4gPiAgMyBmaWxlcyBjaGFuZ2VkLCA5 ODAgaW5zZXJ0aW9ucygrKQ0KPiA+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9zcGkvc3Bp LWFzcGVlZC5jDQo+ID4NCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvS2NvbmZpZyBiL2Ry aXZlcnMvc3BpL0tjb25maWcgaW5kZXgNCj4gPiA1Y2ZmNjBkZThlODMuLmM4NDhmMmY3YjY5NCAx MDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL3NwaS9LY29uZmlnDQo+ID4gKysrIGIvZHJpdmVycy9z cGkvS2NvbmZpZw0KPiA+IEBAIC03MCw2ICs3MCwxNiBAQCBjb25maWcgU1BJX0FSOTM0WA0KPiA+ ICAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFNQSSBjb250cm9sbGVyIHByZXNlbnQg b24gdGhlDQo+ID4gIAkgIFF1YWxjb21tIEF0aGVyb3MgQVI5MzRYL1FDQTk1WFggU29Dcy4NCj4g Pg0KPiA+ICtjb25maWcgU1BJX0FTUEVFRA0KPiA+ICsJdHJpc3RhdGUgIkFTUEVFRCBGTUMvU1BJ IE1lbW9yeSBDb250cm9sbGVyIg0KPiA+ICsJZGVwZW5kcyBvbiBPRiAmJiBIQVNfSU9NRU0gJiYg KEFSQ0hfQVNQRUVEIHx8IENPTVBJTEVfVEVTVCkNCj4gDQo+IFdlIHdpbGwgbmVlZCB0byBkbyBz b21ldGhpbmcgYWJvdXQgdGhlIG90aGVyIGRyaXZlci4gRm9yIHRoZSBtb21lbnQsIHdlIGNhbg0K PiBzZWxlY3QgYm90aCBidXQgdGhhdCB3b24ndCBiZSB0aGUgY2FzZSBhbnltb3JlIHdoZW4gd2Ug YWRkDQo+IEFTVDI1MDAgc3VwcG9ydC4NCj4NCg0KWWVzLCBtYXliZSwgIiFTUElfQVNQRUVEX1NN QyIgc2hvdWxkIGJlIGFkZGVkIGFuZCBhbHNvIGFkZCAiIVNQSV9BU1BFRUQiIGZvciB0aGUgb3Ro ZXIgZHJpdmVyLg0KVGhhbmtzIGZvciByZW1pbmRlci4NCg0KPiA+ICsJaGVscA0KPiA+ICsJICBF bmFibGUgZHJpdmVyIGZvciBBU1BFRUQgRk1DL1NQSSBNZW1vcnkgQ29udHJvbGxlci4NCj4gPiAr DQo+ID4gKwkgIFRoaXMgZHJpdmVyIGlzIG5vdCBhIGdlbmVyaWMgcHVyZSBTUEkgZHJpdmVyLCB3 aGljaA0KPiA+ICsJICBpcyBlc3BlY2lhbGx5IGRlc2lnbmVkIGZvciBzcGktbWVtIGZyYW1ld29y ayB3aXRoDQo+ID4gKwkgIFNQSSBOT1IgZmxhc2ggZGlyZWN0IHJlYWQgYW5kIHdyaXRlIGZlYXR1 cmVzLg0KPiA+ICsNCj4gPiAgY29uZmlnIFNQSV9BVEg3OQ0KPiA+ICAJdHJpc3RhdGUgIkF0aGVy b3MgQVI3MVhYL0FSNzI0WC9BUjkxM1ggU1BJIGNvbnRyb2xsZXIgZHJpdmVyIg0KPiA+ICAJZGVw ZW5kcyBvbiBBVEg3OSB8fCBDT01QSUxFX1RFU1QNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9z cGkvTWFrZWZpbGUgYi9kcml2ZXJzL3NwaS9NYWtlZmlsZSBpbmRleA0KPiA+IDZmZWE1ODIxNjYy ZS4uOWU2MmM2NTBmY2EwIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvc3BpL01ha2VmaWxlDQo+ ID4gKysrIGIvZHJpdmVycy9zcGkvTWFrZWZpbGUNCj4gPiBAQCAtMTcsNiArMTcsNyBAQCBvYmot JChDT05GSUdfU1BJX0xPT1BCQUNLX1RFU1QpCQkrPQ0KPiBzcGktbG9vcGJhY2stdGVzdC5vDQo+ ID4gIG9iai0kKENPTkZJR19TUElfQUxURVJBKQkJKz0gc3BpLWFsdGVyYS5vDQo+ID4gIG9iai0k KENPTkZJR19TUElfQVI5MzRYKQkJKz0gc3BpLWFyOTM0eC5vDQo+ID4gIG9iai0kKENPTkZJR19T UElfQVJNQURBXzM3MDApCQkrPSBzcGktYXJtYWRhLTM3MDAubw0KPiA+ICtvYmotJChDT05GSUdf U1BJX0FTUEVFRCkJCSs9IHNwaS1hc3BlZWQubw0KPiA+ICBvYmotJChDT05GSUdfU1BJX0FUTUVM KQkJCSs9IHNwaS1hdG1lbC5vDQo+ID4gIG9iai0kKENPTkZJR19TUElfQVRNRUxfUVVBRFNQSSkJ CSs9IGF0bWVsLXF1YWRzcGkubw0KPiA+ICBvYmotJChDT05GSUdfU1BJX0FUOTFfVVNBUlQpCQkr PSBzcGktYXQ5MS11c2FydC5vDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1hc3Bl ZWQuYyBiL2RyaXZlcnMvc3BpL3NwaS1hc3BlZWQuYyBuZXcNCj4gPiBmaWxlIG1vZGUgMTAwNjQ0 IGluZGV4IDAwMDAwMDAwMDAwMC4uY2ZhYWEwZDViYWM2DQo+ID4gLS0tIC9kZXYvbnVsbA0KPiA+ ICsrKyBiL2RyaXZlcnMvc3BpL3NwaS1hc3BlZWQuYw0KPiA+IEBAIC0wLDAgKzEsOTY5IEBADQo+ ID4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKw0KPiA+ICsNCj4gPiArLyoN Cj4gPiArICogQVNQRUVEIEZNQy9TUEkgTWVtb3J5IENvbnRyb2xsZXIgRHJpdmVyDQo+ID4gKyAq DQo+ID4gKyAqIENvcHlyaWdodCAoYykgMjAyMCwgQVNQRUVEIENvcnBvcmF0aW9uLg0KPiA+ICsg KiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgSUJNIENvcnBvcmF0aW9uLg0KPiA+ICsgKi8NCj4g PiArDQo+ID4gKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4 L2Nsay5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+DQo+ID4gKyNpbmNsdWRlIDxs aW51eC9lcnIuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+DQo+ID4gKyNpbmNsdWRl IDxsaW51eC9pby5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgva2VybmVsLmg+DQo+ID4gKyNpbmNs dWRlIDxsaW51eC9tb2R1bGUuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L29mLmg+DQo+ID4gKyNp bmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3Jt X2RldmljZS5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+DQo+ID4gKyNpbmNsdWRl IDxsaW51eC9zaXplcy5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPg0KPiA+ICsj aW5jbHVkZSA8bGludXgvc3BpL3NwaS1tZW0uaD4NCj4gPiArDQo+ID4gKy8qIEFTUEVFRCBGTUMv U1BJIG1lbW9yeSBjb250cm9sIHJlZ2lzdGVyIHJlbGF0ZWQgKi8NCj4gPiArI2RlZmluZSBPRkZT RVRfQ0VfVFlQRV9TRVRUSU5HCQkweDAwDQo+ID4gKyNkZWZpbmUgT0ZGU0VUX0NFX0FERFJfTU9E RV9DVFJMCTB4MDQNCj4gPiArI2RlZmluZSBPRkZTRVRfSU5UUl9DVFJMX1NUQVRVUwkJMHgwOA0K PiA+ICsjZGVmaW5lIE9GRlNFVF9BRERSX0RBVEFfTUFTSwkJMHgwYw0KPiA+ICsjZGVmaW5lIE9G RlNFVF9DRTBfQ1RSTF9SRUcJCTB4MTANCj4gPiArI2RlZmluZSBPRkZTRVRfQ0UwX0RFQ09ERV9S QU5HRV9SRUcJMHgzMA0KPiA+ICsjZGVmaW5lIE9GRlNFVF9ETUFfQ1RSTAkJCTB4ODANCj4gPiAr I2RlZmluZSBPRkZTRVRfRE1BX0ZMQVNIX0FERFJfUkVHCTB4ODQNCj4gPiArI2RlZmluZSBPRkZT RVRfRE1BX1JBTV9BRERSX1JFRwkJMHg4OA0KPiA+ICsjZGVmaW5lIE9GRlNFVF9ETUFfTEVOX1JF RwkJMHg4Yw0KPiA+ICsjZGVmaW5lIE9GRlNFVF9ETUFfQ0hFQ0tTVU1fUkVTVUxUCTB4OTANCj4g PiArI2RlZmluZSBPRkZTRVRfQ0UwX1RJTUlOR19DT01QRU5TQVRJT04JMHg5NA0KPiA+ICsNCj4g PiArI2RlZmluZSBDVFJMX0lPX1NJTkdMRV9EQVRBCTANCj4gPiArI2RlZmluZSBDVFJMX0lPX0RV QUxfREFUQQlCSVQoMjkpDQo+ID4gKyNkZWZpbmUgQ1RSTF9JT19RVUFEX0RBVEEJQklUKDMwKQ0K PiA+ICsNCj4gPiArI2RlZmluZSBDVFJMX0lPX01PREVfVVNFUglHRU5NQVNLKDEsIDApDQo+ID4g KyNkZWZpbmUgQ1RSTF9JT19NT0RFX0NNRF9SRUFECUJJVCgwKQ0KPiA+ICsjZGVmaW5lIENUUkxf SU9fTU9ERV9DTURfV1JJVEUJQklUKDEpDQo+ID4gKyNkZWZpbmUgQ1RSTF9TVE9QX0FDVElWRQlC SVQoMikNCj4gPiArDQo+ID4gKyNkZWZpbmUgQ0FMSUJSQVRJT05fTEVOCQkweDQwMA0KPiA+ICsj ZGVmaW5lIFNQSV9EQU1fUkVRVUVTVAkJQklUKDMxKQ0KPiA+ICsjZGVmaW5lIFNQSV9EQU1fR1JB TlQJCUJJVCgzMCkNCj4gDQo+IFdoYXQgYXJlIHRoZXNlIGJpdHMgPyBUaGVyZSBpcyBubyBkb2N1 bWVudGF0aW9uIGZvciB0aGVtLg0KDQpUaGV5IGFyZSBETUEgcmVsYXRlZCBiaXRzIGZvciBBU1Qy NjAwIFNQSSBjb250cm9sbGVycywgcmVjb3JkZWQgaW4gQVNUMjYwMCBTUEkgcmVnaXN0ZXIgU1BJ UjgwLg0KU2luY2UgYm90aCBTUEkxIGFuZCBTUEkyIGNvbnRyb2xsZXJzIHNoYXJlIHRoZSBzYW1l IERNQSBlbmdpbmUsIHRoZXJlIGV4aXN0cyBhIEhXIGZsYWcNCmluIG9yZGVyIHRvIGF2b2lkIFNQ STEgYW5kIFNQSTIgY29udHJvbGxlciB1c2luZyB0aGF0IERNQSBlbmdpbmUgYXQgdGhlIHNhbWUg dGltZS4NCg0KPiANCj4gPiArI2RlZmluZSBTUElfRE1BX0NBTElCX01PREUJQklUKDMpDQo+ID4g KyNkZWZpbmUgU1BJX0RNQV9DQUxDX0NLU1VNCUJJVCgyKQ0KPiA+ICsjZGVmaW5lIFNQSV9ETUFf RU5BQkxFCQlCSVQoMCkNCj4gPiArI2RlZmluZSBTUElfRE1BX1NUQVRVUwkJQklUKDExKQ0KPiA+ ICsNCj4gPiArZW51bSBhc3BlZWRfc3BpX2N0bF9yZWdfdmFsdWUgew0KPiA+ICsJQVNQRUVEX1NQ SV9CQVNFLA0KPiA+ICsJQVNQRUVEX1NQSV9SRUFELA0KPiA+ICsJQVNQRUVEX1NQSV9XUklURSwN Cj4gPiArCUFTUEVFRF9TUElfTUFYLA0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArI2RlZmluZSBBU1BF RURfU1BJX01BWF9DUyA1DQo+ID4gKw0KPiA+ICtzdHJ1Y3QgYXNwZWVkX3NwaV9jb250cm9sbGVy Ow0KPiA+ICtzdHJ1Y3QgYXNwZWVkX3NwaV9jaGlwOw0KPiA+ICsNCj4gPiArc3RydWN0IGFzcGVl ZF9zcGlfaW5mbyB7DQo+ID4gKwl1aW50MzJfdCBjbWRfaW9fY3RybF9tYXNrOw0KPiA+ICsJdWlu dDMyX3QgbWF4X2RhdGFfYnVzX3dpZHRoOw0KPiA+ICsJdWludDMyX3QgbWluX2RlY29kZV9zejsN Cj4gPiArCXZvaWQgKCpzZXRfNGJ5dGUpKHN0cnVjdCBhc3BlZWRfc3BpX2NvbnRyb2xsZXIgKmFz dF9jdHJsLCB1aW50MzJfdCBjcyk7DQo+ID4gKwlpbnQgKCpjYWxpYnJhdGUpKHN0cnVjdCBhc3Bl ZWRfc3BpX2NvbnRyb2xsZXIgKmFzdF9jdHJsLCB1aW50MzJfdCBjcyk7DQo+ID4gKwl2b2lkICgq YWRqdXN0X2RlY29kZV9zeikodWludDMyX3QgZGVjb2RlX3N6X2FycltdLCBpbnQgbGVuKTsNCj4g PiArCXVpbnQzMl90ICgqc2VnbWVudF9zdGFydCkoc3RydWN0IGFzcGVlZF9zcGlfY29udHJvbGxl ciAqYXN0X2N0cmwsDQo+ID4gKwkJCQkgIHVpbnQzMl90IHJlZyk7DQo+ID4gKwl1aW50MzJfdCAo KnNlZ21lbnRfZW5kKShzdHJ1Y3QgYXNwZWVkX3NwaV9jb250cm9sbGVyICphc3RfY3RybCwNCj4g PiArCQkJCXVpbnQzMl90IHJlZyk7DQo+ID4gKwl1aW50MzJfdCAoKnNlZ21lbnRfcmVnKShzdHJ1 Y3QgYXNwZWVkX3NwaV9jb250cm9sbGVyICphc3RfY3RybCwNCj4gPiArCQkJCXVpbnQzMl90IHN0 YXJ0LCB1aW50MzJfdCBlbmQpOw0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArc3RydWN0IGFzcGVlZF9z cGlfY2hpcCB7DQo+ID4gKwl2b2lkIF9faW9tZW0gKmFoYl9iYXNlOw0KPiA+ICsJcGh5c19hZGRy X3QgYWhiX2Jhc2VfcGh5Ow0KPiA+ICsJdWludDMyX3QgYWhiX3dpbmRvd19zejsNCj4gPiArCXVp bnQzMl90IGN0cmxfdmFsW0FTUEVFRF9TUElfTUFYXTsNCj4gPiArCXVpbnQzMl90IG1heF9jbGtf ZnJlcTsNCj4gPiArfTsNCj4gPiArDQo+ID4gK3N0cnVjdCBhc3BlZWRfc3BpX2NvbnRyb2xsZXIg ew0KPiA+ICsJc3RydWN0IGRldmljZSAqZGV2Ow0KPiA+ICsJY29uc3Qgc3RydWN0IGFzcGVlZF9z cGlfaW5mbyAqaW5mbzsgLyogY29udHJvbGxlciBpbmZvICovDQo+ID4gKwl2b2lkIF9faW9tZW0g KnJlZ3M7IC8qIGNvbnRyb2xsZXIgcmVnaXN0ZXJzICovDQo+ID4gKwl2b2lkIF9faW9tZW0gKmFo Yl9iYXNlOw0KPiA+ICsJcGh5c19hZGRyX3QgYWhiX2Jhc2VfcGh5OyAvKiBwaHlzaWNhbCBhZGRy IG9mIEFIQiB3aW5kb3cgKi8NCj4gPiArCXVpbnQzMl90IGFoYl93aW5kb3dfc3o7IC8qIEFIQiB3 aW5kb3cgc2l6ZSAqLw0KPiA+ICsJdWludDMyX3QgbnVtX2NzOw0KPiA+ICsJdWludDY0X3QgYWhi X2NsazsNCj4gPiArCXN0cnVjdCBhc3BlZWRfc3BpX2NoaXAgKmNoaXBzOyAvKiBwb2ludGVycyB0 byBhdHRhY2hlZCBjaGlwcyAqLyB9Ow0KPiA+ICsNCj4gPiArc3RhdGljIHVpbnQzMl90DQo+ID4g K2FzcGVlZF8yNjAwX3NwaV9zZWdtZW50X3N0YXJ0KHN0cnVjdCBhc3BlZWRfc3BpX2NvbnRyb2xs ZXIgKmFzdF9jdHJsLA0KPiA+ICsJCQkgICAgICB1aW50MzJfdCByZWcpDQo+ID4gK3sNCj4gPiAr CXVpbnQzMl90IHN0YXJ0X29mZnNldCA9IChyZWcgPDwgMTYpICYgMHgwZmYwMDAwMDsNCj4gPiAr DQo+ID4gKwlyZXR1cm4gKHVpbnQzMl90KShhc3RfY3RybC0+YWhiX2Jhc2VfcGh5ICsgc3RhcnRf b2Zmc2V0KTsgfQ0KPiA+ICsNCj4gPiArc3RhdGljIHVpbnQzMl90DQo+ID4gK2FzcGVlZF8yNjAw X3NwaV9zZWdtZW50X2VuZChzdHJ1Y3QgYXNwZWVkX3NwaV9jb250cm9sbGVyICphc3RfY3RybCwN Cj4gPiArCQkJICAgIHVpbnQzMl90IHJlZykNCj4gPiArew0KPiA+ICsJdWludDMyX3QgZW5kX29m ZnNldCA9IHJlZyAmIDB4MGZmMDAwMDA7DQo+ID4gKw0KPiA+ICsJLyogbm8gZGVjb2RlIHJhbmdl LCBzZXQgdG8gcGh5c2ljYWwgYWhiIGJhc2UgKi8NCj4gPiArCWlmIChlbmRfb2Zmc2V0ID09IDAp DQo+ID4gKwkJcmV0dXJuIGFzdF9jdHJsLT5haGJfYmFzZV9waHk7DQo+ID4gKw0KPiA+ICsJcmV0 dXJuICh1aW50MzJfdCkoYXN0X2N0cmwtPmFoYl9iYXNlX3BoeSArIGVuZF9vZmZzZXQgKyAweDEw MDAwMCk7IH0NCj4gPiArDQo+ID4gK3N0YXRpYyB1aW50MzJfdA0KPiA+ICthc3BlZWRfMjYwMF9z cGlfc2VnbWVudF9yZWcoc3RydWN0IGFzcGVlZF9zcGlfY29udHJvbGxlciAqYXN0X2N0cmwsDQo+ ID4gKwkJCSAgICB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgZW5kKQ0KPiA+ICt7DQo+ID4gKwkv KiBubyBkZWNvZGUgcmFuZ2UsIGFzc2lnbiB6ZXJvIHZhbHVlICovDQo+ID4gKwlpZiAoc3RhcnQg PT0gZW5kKQ0KPiA+ICsJCXJldHVybiAwOw0KPiA+ICsNCj4gPiArCXJldHVybiAoKHN0YXJ0ICYg MHgwZmYwMDAwMCkgPj4gMTYpIHwgKChlbmQgLSAweDEwMDAwMCkgJg0KPiA+ICsweDBmZjAwMDAw KTsgfQ0KPiA+ICsNCj4gPiArc3RhdGljIHZvaWQgYXNwZWVkX3NwaV9jaGlwX3NldF80Ynl0ZShz dHJ1Y3QgYXNwZWVkX3NwaV9jb250cm9sbGVyDQo+ICphc3RfY3RybCwNCj4gPiArCQkJCSAgICAg IHVpbnQzMl90IGNzKQ0KPiA+ICt7DQo+ID4gKwl1aW50MzJfdCByZWdfdmFsOw0KPiA+ICsNCj4g PiArCXJlZ192YWwgPSByZWFkbChhc3RfY3RybC0+cmVncyArIE9GRlNFVF9DRV9BRERSX01PREVf Q1RSTCk7DQo+ID4gKwlyZWdfdmFsIHw9IDB4MTEgPDwgY3M7DQo+ID4gKwl3cml0ZWwocmVnX3Zh bCwgYXN0X2N0cmwtPnJlZ3MgKyBPRkZTRVRfQ0VfQUREUl9NT0RFX0NUUkwpOyB9DQo+ID4gKw0K PiA+ICtzdGF0aWMgdWludDMyX3QgYXNwZWVkX3NwaV9nZXRfaW9fbW9kZSh1aW50MzJfdCBidXNf d2lkdGgpIHsNCj4gPiArCXN3aXRjaCAoYnVzX3dpZHRoKSB7DQo+ID4gKwljYXNlIDE6DQo+ID4g KwkJcmV0dXJuIENUUkxfSU9fU0lOR0xFX0RBVEE7DQo+ID4gKwljYXNlIDI6DQo+ID4gKwkJcmV0 dXJuIENUUkxfSU9fRFVBTF9EQVRBOw0KPiA+ICsJY2FzZSA0Og0KPiA+ICsJCXJldHVybiBDVFJM X0lPX1FVQURfREFUQTsNCj4gPiArCWRlZmF1bHQ6DQo+ID4gKwkJcmV0dXJuIENUUkxfSU9fU0lO R0xFX0RBVEE7DQo+ID4gKwl9DQo+ID4gK30NCj4gPiArDQo+ID4gKy8qDQo+ID4gKyAqIENoZWNr IHdoZXRoZXIgdGhlIGRhdGEgaXMgbm90IGFsbCAwIG9yIDEgaW4gb3JkZXIgdG8NCj4gPiArICog YXZvaWQgY2FsaWJyaWF0ZSB1bW91bnQgc3BpLWZsYXNoLg0KPiA+ICsgKi8NCj4gPiArc3RhdGlj IGJvb2wgYXNwZWVkX3NwaV9jYWxpYnJpYXRpb25fZW5hYmxlKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwN Cj4gPiArdWludDMyX3Qgc3opIHsNCj4gPiArCWNvbnN0IHVpbnQzMl90ICpidWZfMzIgPSAoY29u c3QgdWludDMyX3QgKilidWY7DQo+ID4gKwl1aW50MzJfdCBpOw0KPiA+ICsJdWludDMyX3QgdmFs aWRfY291bnQgPSAwOw0KPiA+ICsNCj4gPiArCWZvciAoaSA9IDA7IGkgPCAoc3ogLyA0KTsgaSsr KSB7DQo+ID4gKwkJaWYgKGJ1Zl8zMltpXSAhPSAwICYmIGJ1Zl8zMltpXSAhPSAweGZmZmZmZmZm KQ0KPiA+ICsJCQl2YWxpZF9jb3VudCsrOw0KPiA+ICsJCWlmICh2YWxpZF9jb3VudCA+IDEwMCkN Cj4gPiArCQkJcmV0dXJuIHRydWU7DQo+ID4gKwl9DQo+ID4gKwlyZXR1cm4gZmFsc2U7DQo+ID4g K30NCj4gPiArDQo+ID4gK3N0YXRpYyB1aW50MzJfdA0KPiA+ICthc3BlZWRfMjYwMF9zcGlfZG1h X2NoZWNrc3VtKHN0cnVjdCBhc3BlZWRfc3BpX2NvbnRyb2xsZXIgKmFzdF9jdHJsLA0KPiA+ICsJ CQkgICAgIHVpbnQzMl90IGNzLCB1aW50MzJfdCBkaXYsIHVpbnQzMl90IGRlbGF5KSB7DQo+ID4g Kwl1aW50MzJfdCBjdHJsX3ZhbDsNCj4gPiArCXVpbnQzMl90IGNoZWNrc3VtOw0KPiA+ICsNCj4g PiArCXdyaXRlbCgweGFlZWQwMDAwLCBhc3RfY3RybC0+cmVncyArIE9GRlNFVF9ETUFfQ1RSTCk7 DQo+IA0KPiBZb3Ugc2hvdWxkIHVzZSBkZWZpbmUgZm9yIHRoZSBtYWdpYyB2YWx1ZSBhYm92ZSBe DQoNCk9rYXksIGl0IHdpbGwgYmUgdXBkYXRlZCB3aXRoIG5leHQgcGF0Y2ggdmVyc2lvbi4NCg0K PiANCj4gPiArCWlmIChyZWFkbChhc3RfY3RybC0+cmVncyArIE9GRlNFVF9ETUFfQ1RSTCkgJiBT UElfREFNX1JFUVVFU1QpIHsNCj4gPiArCQl3aGlsZSAoIShyZWFkbChhc3RfY3RybC0+cmVncyAr IE9GRlNFVF9ETUFfQ1RSTCkgJg0KPiA+ICsJCQkgU1BJX0RBTV9HUkFOVCkpDQo+ID4gKwkJCTsN Cj4gPiArCX0NCj4gDQo+IFdoYXQgYXJlIHRoZXNlIERBTSBiaXRzIGZvciA/DQoNCkFzIGFib3Zl IGV4cGxhbmF0aW9uLCB0aGVyZSBhcmUgYSBETUEgZW5naW5lIHNoYXJlZCBieSBib3RoIFNQSTEg YW5kIFNQSTIgY29udHJvbGxlci4NCkJlZm9yZSB1c2luZyBETUEgZW5naW5lLCB0aGV5IG5lZWQg dG8gc2VuZCBhIHJlcXVlc3QgYW5kIGdldCB0aGUgZ3JhbnQgYml0Lg0KDQo+IA0KPiBJIGRvbid0 IHRoaW5rIHRoZSBBU1QyNTAwIFNQSSBjb250cm9sbGVycyBzdXBwb3J0cyBETUEuIEl0IHdvdWxk IGJlIGJldHRlciB0bw0KPiB1c2UgYSBjb21tb24gbWV0aG9kLg0KDQpZZXMsIEFTVDI1MDAgU1BJ IGNvbnRyb2xsZXIgZG9lcyBub3Qgc3VwcG9ydCBETUEuIEZvciBBU1QyNjAwLCBTUEkgRE1BIGVu Z2luZSBzdXBwb3J0cw0KY2FsaWJyYXRpb24gbW9kZS4gVGhlIGNoZWNrc3VtIGZvciBhIHNwZWNp ZmljIHJlYWQgYXJlYSBjYW4gYmUgcmVhZCBhbmQgY2FsY3VsYXRlZCBieSBTb0MgSFcuDQpJIHRo aW5rIHRoaXMgd2lsbCBpbXByb3ZlIGNhbGlicmF0aW9uIHBlcmZvcm1hbmNlLiBUaHVzLCBJIHBs YW4gdG8gdXNlIGRpZmZlcmVudCBjYWxpYnJhdGlvbiBmdW5jdGlvbg0KZm9yIEFTVDI1MDAgYW5k IEFTVDI2MDAuDQoNCj4gPiArDQo+ID4gKwl3cml0ZWwoKHVpbnQzMl90KWFzdF9jdHJsLT5jaGlw c1tjc10uYWhiX2Jhc2VfcGh5LA0KPiA+ICsJICAgICAgIGFzdF9jdHJsLT5yZWdzICsgT0ZGU0VU X0RNQV9GTEFTSF9BRERSX1JFRyk7DQo+ID4gKwl3cml0ZWwoQ0FMSUJSQVRJT05fTEVOLCBhc3Rf Y3RybC0+cmVncyArIE9GRlNFVF9ETUFfTEVOX1JFRyk7DQo+ID4gKw0KPiA+ICsJY3RybF92YWwg PSBTUElfRE1BX0VOQUJMRSB8IFNQSV9ETUFfQ0FMQ19DS1NVTSB8DQo+IFNQSV9ETUFfQ0FMSUJf TU9ERSB8DQo+ID4gKwkJICAgKGRlbGF5IDw8IDgpIHwgKChkaXYgJiAweGYpIDw8IDE2KTsNCj4g PiArCXdyaXRlbChjdHJsX3ZhbCwgYXN0X2N0cmwtPnJlZ3MgKyBPRkZTRVRfRE1BX0NUUkwpOw0K PiA+ICsJd2hpbGUgKCEocmVhZGwoYXN0X2N0cmwtPnJlZ3MgKyBPRkZTRVRfSU5UUl9DVFJMX1NU QVRVUykgJg0KPiA+ICsJCSBTUElfRE1BX1NUQVRVUykpDQo+ID4gKwkJOw0KPiA+ICsNCj4gPiAr CWNoZWNrc3VtID0gcmVhZGwoYXN0X2N0cmwtPnJlZ3MgKyBPRkZTRVRfRE1BX0NIRUNLU1VNX1JF U1VMVCk7DQo+ID4gKw0KPiA+ICsJd3JpdGVsKDB4ZGVlYTAwMDAsIGFzdF9jdHJsLT5yZWdzICsg T0ZGU0VUX0RNQV9DVFJMKTsNCj4gPiArCXdyaXRlbCgweDAsIGFzdF9jdHJsLT5yZWdzICsgT0ZG U0VUX0RNQV9DVFJMKTsNCj4gPiArDQo+ID4gKwlyZXR1cm4gY2hlY2tzdW07DQo+ID4gK30NCj4g PiArDQo+ID4gK3N0YXRpYyBpbnQgZ2V0X21pZF9wb2ludF9vZl9sb25nZXN0X29uZSh1aW50OF90 ICpidWYsIHVpbnQzMl90IGxlbikgew0KPiA+ICsJaW50IGk7DQo+ID4gKwlpbnQgc3RhcnQgPSAw LCBtaWRfcG9pbnQgPSAwOw0KPiA+ICsJaW50IG1heF9jbnQgPSAwLCBjbnQgPSAwOw0KPiA+ICsN Cj4gPiArCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgew0KPiA+ICsJCWlmIChidWZbaV0gPT0g MSkgew0KPiA+ICsJCQljbnQrKzsNCj4gPiArCQl9IGVsc2Ugew0KPiA+ICsJCQljbnQgPSAwOw0K PiA+ICsJCQlzdGFydCA9IGk7DQo+ID4gKwkJfQ0KPiA+ICsNCj4gPiArCQlpZiAobWF4X2NudCA8 IGNudCkgew0KPiA+ICsJCQltYXhfY250ID0gY250Ow0KPiA+ICsJCQltaWRfcG9pbnQgPSBzdGFy dCArIChjbnQgLyAyKTsNCj4gPiArCQl9DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJLyoNCj4gPiAr CSAqIEluIG9yZGVyIHRvIGdldCBhIHN0YWJsZSBTUEkgcmVhZCB0aW1pbmcsDQo+ID4gKwkgKiBh YmFuZG9uIHRoZSByZXN1bHQgaWYgdGhlIGxlbmd0aCBvZiBsb25nZXN0DQo+ID4gKwkgKiBjb25z ZWN1dGl2ZSBnb29kIHBvaW50cyBpcyB0b28gc2hvcnQuDQo+ID4gKwkgKi8NCj4gPiArCWlmICht YXhfY250IDwgNCkNCj4gPiArCQlyZXR1cm4gLTE7DQo+ID4gKw0KPiA+ICsJcmV0dXJuIG1pZF9w b2ludDsNCj4gPiArfQ0KPiA+ICsNCj4gPiArLyogVHJhbnNmZXIgbWF4aW11bSBjbG9jayBmcmVx dWVuY3kgdG8gcmVnaXN0ZXIgc2V0dGluZyAqLyBzdGF0aWMNCj4gPiArdWludDMyX3QgYXNwZWVk XzI2MDBfc3BpX2Nsa19iYXNpY19zZXR0aW5nKHN0cnVjdA0KPiA+ICthc3BlZWRfc3BpX2NvbnRy b2xsZXIgKmFzdF9jdHJsLA0KPiA+ICsJCQkJICB1aW50MzJfdCAqbWF4X2NsaykNCj4gPiArew0K PiA+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gYXN0X2N0cmwtPmRldjsNCj4gPiArCXVpbnQzMl90 IGhjbGtfY2xrID0gYXN0X2N0cmwtPmFoYl9jbGs7DQo+ID4gKwl1aW50MzJfdCBoY2xrX2RpdiA9 IDB4NDAwOyAvKiBkZWZhdWx0IHZhbHVlICovDQo+ID4gKwl1aW50MzJfdCBpLCBqID0gMDsNCj4g PiArCWJvb2wgZm91bmQgPSBmYWxzZTsNCj4gPiArCS8qIEhDTEsvMSAuLglIQ0xLLzE2ICovDQo+ ID4gKwl1aW50MzJfdCBoY2xrX21hc2tzW10gPSB7IDE1LCA3LCAxNCwgNiwgMTMsIDUsIDEyLCA0 LA0KPiA+ICsJCQkJICAxMSwgMywgMTAsIDIsIDksICAxLCA4LCAgMCB9Ow0KPiA+ICsNCj4gPiAr CS8qIEZNQy9TUElSMTBbMjc6MjRdICovDQo+ID4gKwlmb3IgKGogPSAwOyBqIDwgMHhmOyBpKysp IHsNCj4gPiArCQkvKiBGTUMvU1BJUjEwWzExOjhdICovDQo+ID4gKwkJZm9yIChpID0gMDsgaSA8 IEFSUkFZX1NJWkUoaGNsa19tYXNrcyk7IGkrKykgew0KPiA+ICsJCQlpZiAoaSA9PSAwICYmIGog PT0gMCkNCj4gPiArCQkJCWNvbnRpbnVlOw0KPiA+ICsNCj4gPiArCQkJaWYgKGhjbGtfY2xrIC8g KGkgKyAxICsgKGogKiAxNikpIDw9ICptYXhfY2xrKSB7DQo+ID4gKwkJCQlmb3VuZCA9IDE7DQo+ ID4gKwkJCQkqbWF4X2NsayA9IGhjbGtfY2xrIC8gKGkgKyAxICsgKGogKiAxNikpOw0KPiA+ICsJ CQkJYnJlYWs7DQo+ID4gKwkJCX0NCj4gPiArCQl9DQo+ID4gKw0KPiA+ICsJCWlmIChmb3VuZCkg ew0KPiA+ICsJCQloY2xrX2RpdiA9ICgoaiA8PCAyNCkgfCBoY2xrX21hc2tzW2ldIDw8IDgpOw0K PiA+ICsJCQlicmVhazsNCj4gPiArCQl9DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJZGV2X2RiZyhk ZXYsICJmb3VuZDogJXMsIGhjbGs6ICVkLCBtYXhfY2xrOiAlZFxuIiwgZm91bmQgPyAieWVzIiA6 ICJubyIsDQo+ID4gKwkJaGNsa19jbGssICptYXhfY2xrKTsNCj4gPiArCWRldl9kYmcoZGV2LCAi YmFzZV9jbGs6ICVkLCBoX2RpdjogJWQgKG1hc2sgJXgpLCBzcGVlZDogJWRcbiIsIGosIGkgKyAx LA0KPiA+ICsJCWhjbGtfbWFza3NbaV0sIGhjbGtfY2xrIC8gKGkgKyAxICsgaiAqIDE2KSk7DQo+ ID4gKw0KPiA+ICsJcmV0dXJuIGhjbGtfZGl2Ow0KPiA+ICt9DQo+ID4gKw0KPiA+ICsvKg0KPiA+ ICsgKiBJZiBTUEkgZnJlcXVlbmN5IGlzIHRvbyBoaWdoLCB0aW1pbmcgY29tcGVuc2F0aW9uIGlz IG5lZWRlZCwNCj4gPiArICogb3RoZXJ3aXNlLCBTUEkgY29udHJvbGxlciB3aWxsIHNhbXBsZSB1 bnJlYWR5IGRhdGEuIEZvciBBU1QyNjAwDQo+ID4gKyAqIFNQSSBtZW1vcnkgY29udHJvbGxlciwg b25seSB0aGUgZmlyc3QgZm91ciBmcmVxdWVuY3kgbGV2ZWxzDQo+ID4gKyAqIChIQ0xLLzIsIEhD TEsvMywuLi4sIEhDS0wvNSkgbWF5IG5lZWQgdGltaW5nIGNvbXBlbnNhdGlvbi4NCj4gPiArICog SGVyZSwgZm9yIGVhY2ggZnJlcXVlbmN5LCB3ZSB3aWxsIGdldCBhIHNlcXVlbmNlIG9mIHJlYWRp bmcNCj4gPiArICogcmVzdWx0IChwYXNzIG9yIGZhaWwpIGNvbXBhcmVkIHRvIGdvbGRlbiBkYXRh LiBUaGVuLCBnZXR0aW5nIHRoZQ0KPiA+ICsgKiBtaWRkbGUgcG9pbnQgb2YgdGhlIG1heGltdW0g cGFzcyB3aWRvdy4gQmVzaWRlcywgaWYgdGhlIGZsYXNoJ3MNCj4gPiArICogY29udGVudCBpcyB0 b28gbW9ub3Rvbm91cywgdGhlIGZyZXF1ZW5jeSByZWNvcmRlZCBpbiB0aGUgZGV2aWNlDQo+ID4g KyAqIHRyZWUgd2lsbCBiZSBhZG9wdGVkLg0KPiA+ICsgKi8NCj4gPiArc3RhdGljIGludA0KPiA+ ICthc3BlZWRfMjYwMF9zcGlfdGltaW5nX2NhbGlicmF0aW9uKHN0cnVjdCBhc3BlZWRfc3BpX2Nv bnRyb2xsZXIgKmFzdF9jdHJsLA0KPiA+ICsJCQkJICAgdWludDMyX3QgY3MpDQo+ID4gK3sNCj4g PiArCWludCByZXQgPSAwOw0KPiA+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gYXN0X2N0cmwtPmRl djsNCj4gPiArCXN0cnVjdCBhc3BlZWRfc3BpX2NoaXAgKmNoaXAgPSAmYXN0X2N0cmwtPmNoaXBz W2NzXTsNCj4gPiArCXVpbnQzMl90IG1heF9mcmVxID0gY2hpcC0+bWF4X2Nsa19mcmVxOw0KPiA+ ICsJLyogSENMSy8yLCAuLi4sIEhDS0wvNSAqLw0KPiA+ICsJdWludDMyX3QgaGNsa19tYXNrc1td ID0geyA3LCAxNCwgNiwgMTMgfTsNCj4gPiArCXVpbnQ4X3QgKmNhbGliX3JlcyA9IE5VTEw7DQo+ ID4gKwl1aW50OF90ICpjaGVja19idWYgPSBOVUxMOw0KPiA+ICsJdWludDMyX3QgcmVnX3ZhbDsN Cj4gPiArCXVpbnQzMl90IGNoZWNrc3VtLCBnb2xkX2NoZWNrc3VtOw0KPiA+ICsJdWludDMyX3Qg aSwgaGN5Y2xlLCBkZWxheV9ucywgZmluYWxfZGVsYXkgPSAwOw0KPiA+ICsJdWludDMyX3QgaGNs a19kaXY7DQo+ID4gKwlib29sIHBhc3M7DQo+ID4gKwlpbnQgY2FsaWJfcG9pbnQ7DQo+ID4gKw0K PiA+ICsJcmVnX3ZhbCA9DQo+ID4gKwkJcmVhZGwoYXN0X2N0cmwtPnJlZ3MgKyBPRkZTRVRfQ0Uw X1RJTUlOR19DT01QRU5TQVRJT04gKyBjcyAqDQo+IDQpOw0KPiA+ICsJaWYgKHJlZ192YWwgIT0g MCkgew0KPiA+ICsJCWRldl9kYmcoZGV2LCAiaGFzIGV4ZWN1dGVkIGNhbGlicmF0aW9uLlxuIik7 DQo+ID4gKwkJZ290byBub19jYWxpYjsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwlkZXZfZGJnKGRl diwgImNhbGN1bGF0ZSB0aW1pbmcgY29tcGVuc2F0aW9uIDpcbiIpOw0KPiA+ICsJLyoNCj4gPiAr CSAqIHVzZSB0aGUgcmVsYXRlZCBsb3cgZnJlcXVlbmN5IHRvIGdldCBjaGVjayBjYWxpYnJhdGlv biBkYXRhDQo+ID4gKwkgKiBhbmQgZ2V0IGdvbGRlbiBkYXRhLg0KPiA+ICsJICovDQo+ID4gKwly ZWdfdmFsID0gY2hpcC0+Y3RybF92YWxbQVNQRUVEX1NQSV9SRUFEXSAmIDB4ZjBmZmYwZmY7DQo+ ID4gKwl3cml0ZWwocmVnX3ZhbCwgYXN0X2N0cmwtPnJlZ3MgKyBPRkZTRVRfQ0UwX0NUUkxfUkVH ICsgY3MgKiA0KTsNCj4gPiArDQo+ID4gKwljaGVja19idWYgPSBremFsbG9jKENBTElCUkFUSU9O X0xFTiwgR0ZQX0tFUk5FTCk7DQo+ID4gKwlpZiAoIWNoZWNrX2J1ZikNCj4gPiArCQlyZXR1cm4g LUVOT01FTTsNCj4gPiArDQo+ID4gKwltZW1jcHlfZnJvbWlvKGNoZWNrX2J1ZiwgY2hpcC0+YWhi X2Jhc2UsIENBTElCUkFUSU9OX0xFTik7DQo+ID4gKwlpZiAoIWFzcGVlZF9zcGlfY2FsaWJyaWF0 aW9uX2VuYWJsZShjaGVja19idWYsIENBTElCUkFUSU9OX0xFTikpIHsNCj4gPiArCQlkZXZfaW5m byhkZXYsICJmbGFzaCBkYXRhIGlzIG1vbm90b25vdXMsIHNraXAgY2FsaWJyYXRpb24uIik7DQo+ ID4gKwkJZ290byBub19jYWxpYjsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwlnb2xkX2NoZWNrc3Vt ID0gYXNwZWVkXzI2MDBfc3BpX2RtYV9jaGVja3N1bShhc3RfY3RybCwgY3MsIDAsIDApOw0KPiA+ ICsNCj4gPiArCS8qDQo+ID4gKwkgKiBhbGxvY2F0ZSBhIHNwYWNlIHRvIHJlY29yZCBjYWxpYnJh dGlvbiByZXN1bHQgZm9yDQo+ID4gKwkgKiBkaWZmZXJlbnQgdGltaW5nIGNvbXBlbnNhdGlvbiB3 aXRoIGZpeGVkDQo+ID4gKwkgKiBIQ0xLIGRpdmlzaW9uLg0KPiA+ICsJICovDQo+ID4gKwljYWxp Yl9yZXMgPSBremFsbG9jKDYgKiAxNywgR0ZQX0tFUk5FTCk7DQo+ID4gKwlpZiAoIWNhbGliX3Jl cykgew0KPiA+ICsJCXJldCA9IC1FTk9NRU07DQo+ID4gKwkJZ290byBub19jYWxpYjsNCj4gPiAr CX0NCj4gPiArDQo+ID4gKwkvKiBGcm9tIEhDTEsvMiB0byBIQ0xLLzUgKi8NCj4gPiArCWZvciAo aSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhjbGtfbWFza3MpOyBpKyspIHsNCj4gPiArCQlpZiAobWF4 X2ZyZXEgPCAodWludDMyX3QpYXN0X2N0cmwtPmFoYl9jbGsgLyAoaSArIDIpKSB7DQo+ID4gKwkJ CWRldl9kYmcoZGV2LCAic2tpcHBpbmcgZnJlcSAlZFxuIiwNCj4gPiArCQkJCSh1aW50MzJfdClh c3RfY3RybC0+YWhiX2NsayAvIChpICsgMikpOw0KPiA+ICsJCQljb250aW51ZTsNCj4gPiArCQl9 DQo+ID4gKwkJbWF4X2ZyZXEgPSAodWludDMyX3QpYXN0X2N0cmwtPmFoYl9jbGsgLyAoaSArIDIp Ow0KPiA+ICsNCj4gPiArCQljaGVja3N1bSA9IGFzcGVlZF8yNjAwX3NwaV9kbWFfY2hlY2tzdW0o YXN0X2N0cmwsIGNzLA0KPiA+ICsJCQkJCQkJaGNsa19tYXNrc1tpXSwgMCk7DQo+ID4gKwkJcGFz cyA9IChjaGVja3N1bSA9PSBnb2xkX2NoZWNrc3VtKTsNCj4gPiArCQlkZXZfZGJnKGRldiwgIkhD TEsvJWQsIG5vIHRpbWluZyBjb21wZW5zYXRpb246ICVzXG4iLCBpICsgMiwNCj4gPiArCQkJcGFz cyA/ICJQQVNTIiA6ICJGQUlMIik7DQo+ID4gKw0KPiA+ICsJCWlmIChwYXNzKQ0KPiA+ICsJCQli cmVhazsNCj4gPiArDQo+ID4gKwkJbWVtc2V0KGNhbGliX3JlcywgMHgwLCA2ICogMTcpOw0KPiA+ ICsNCj4gPiArCQlmb3IgKGhjeWNsZSA9IDA7IGhjeWNsZSA8PSA1OyBoY3ljbGUrKykgew0KPiA+ ICsJCQkvKiBpbmNyZWFzZSBESSBkZWxheSBieSB0aGUgc3RlcCBvZiAwLjVucyAqLw0KPiA+ICsJ CQlkZXZfZGJnKGRldiwgIkRlbGF5IEVuYWJsZSA6IGhjeWNsZSAleFxuIiwgaGN5Y2xlKTsNCj4g PiArCQkJZm9yIChkZWxheV9ucyA9IDA7IGRlbGF5X25zIDw9IDB4ZjsgZGVsYXlfbnMrKykgew0K PiA+ICsJCQkJY2hlY2tzdW0gPSBhc3BlZWRfMjYwMF9zcGlfZG1hX2NoZWNrc3VtKA0KPiA+ICsJ CQkJCWFzdF9jdHJsLCBjcywgaGNsa19tYXNrc1tpXSwNCj4gPiArCQkJCQlCSVQoMykgfCBoY3lj bGUgfCAoZGVsYXlfbnMgPDwgNCkpOw0KPiA+ICsJCQkJcGFzcyA9IChjaGVja3N1bSA9PSBnb2xk X2NoZWNrc3VtKTsNCj4gPiArCQkJCWNhbGliX3Jlc1toY3ljbGUgKiAxNyArIGRlbGF5X25zXSA9 IHBhc3M7DQo+ID4gKwkJCQlkZXZfZGJnKGRldiwNCj4gPiArCQkJCQkiSENMSy8lZCwgJWQgSENM SyBjeWNsZSwgJWQgZGVsYXlfbnMgOiAlc1xuIiwNCj4gPiArCQkJCQlpICsgMiwgaGN5Y2xlLCBk ZWxheV9ucywNCj4gPiArCQkJCQlwYXNzID8gIlBBU1MiIDogIkZBSUwiKTsNCj4gPiArCQkJfQ0K PiA+ICsJCX0NCj4gPiArDQo+ID4gKwkJY2FsaWJfcG9pbnQgPSBnZXRfbWlkX3BvaW50X29mX2xv bmdlc3Rfb25lKGNhbGliX3JlcywgNiAqIDE3KTsNCj4gPiArCQlpZiAoY2FsaWJfcG9pbnQgPCAw KSB7DQo+ID4gKwkJCWRldl9pbmZvKGRldiwgImNhbm5vdCBnZXQgZ29vZCBjYWxpYnJhdGlvbiBw b2ludC5cbiIpOw0KPiA+ICsJCQljb250aW51ZTsNCj4gPiArCQl9DQo+ID4gKw0KPiA+ICsJCWhj eWNsZSA9IGNhbGliX3BvaW50IC8gMTc7DQo+ID4gKwkJZGVsYXlfbnMgPSBjYWxpYl9wb2ludCAl IDE3Ow0KPiA+ICsJCWRldl9kYmcoZGV2LCAiZmluYWwgaGN5Y2xlOiAlZCwgZGVsYXlfbnM6ICVk XG4iLCBoY3ljbGUsDQo+ID4gKwkJCWRlbGF5X25zKTsNCj4gPiArDQo+ID4gKwkJZmluYWxfZGVs YXkgPSAoQklUKDMpIHwgaGN5Y2xlIHwgKGRlbGF5X25zIDw8IDQpKSA8PCAoaSAqIDgpOw0KPiA+ ICsJCXdyaXRlbChmaW5hbF9kZWxheSwgYXN0X2N0cmwtPnJlZ3MgKw0KPiA+ICsJCQkJCSAgICBP RkZTRVRfQ0UwX1RJTUlOR19DT01QRU5TQVRJT04gKw0KPiA+ICsJCQkJCSAgICBjcyAqIDQpOw0K PiA+ICsJCWJyZWFrOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArbm9fY2FsaWI6DQo+ID4gKw0KPiA+ ICsJaGNsa19kaXYgPSBhc3BlZWRfMjYwMF9zcGlfY2xrX2Jhc2ljX3NldHRpbmcoYXN0X2N0cmws ICZtYXhfZnJlcSk7DQo+ID4gKw0KPiA+ICsJLyogY29uZmlndXJlIFNQSSBjbG9jayBmcmVxdWVu Y3kgKi8NCj4gPiArCXJlZ192YWwgPSByZWFkbChhc3RfY3RybC0+cmVncyArIE9GRlNFVF9DRTBf Q1RSTF9SRUcgKyBjcyAqIDQpOw0KPiA+ICsJcmVnX3ZhbCA9IChyZWdfdmFsICYgMHhmMGZmZjBm ZikgfCBoY2xrX2RpdjsNCj4gPiArCXdyaXRlbChyZWdfdmFsLCBhc3RfY3RybC0+cmVncyArIE9G RlNFVF9DRTBfQ1RSTF9SRUcgKyBjcyAqIDQpOw0KPiA+ICsNCj4gPiArCS8qIGFkZCBjbG9jayBz ZXR0aW5nIGluZm8gZm9yIENFIGN0cmwgc2V0dGluZyAqLw0KPiA+ICsJZm9yIChpID0gMDsgaSA8 IEFTUEVFRF9TUElfTUFYOyBpKyspDQo+ID4gKwkJY2hpcC0+Y3RybF92YWxbaV0gPSAoY2hpcC0+ Y3RybF92YWxbaV0gJiAweGYwZmZmMGZmKSB8IGhjbGtfZGl2Ow0KPiA+ICsNCj4gPiArCWRldl9p bmZvKGRldiwgImZyZXE6ICVkTUh6XG4iLCBtYXhfZnJlcSAvIDEwMDAwMDApOw0KPiA+ICsNCj4g PiArCWtmcmVlKGNoZWNrX2J1Zik7DQo+ID4gKwlrZnJlZShjYWxpYl9yZXMpOw0KPiA+ICsNCj4g PiArCXJldHVybiByZXQ7DQo+ID4gK30NCj4gPiArDQo+ID4gKy8qDQo+ID4gKyAqIEFTVDI2MDAg U1BJIG1lbW9yeSBjb250cm9sbGVycyBzdXBwb3J0IG11bHRpcGxlIGNoaXAgc2VsZWN0cy4NCj4g PiArICogVGhlIHN0YXJ0IGFkZHJlc3Mgb2YgYSBkZWNvZGUgcmFuZ2Ugc2hvdWxkIGJlIG11bHRp cGxlDQo+ID4gKyAqIG9mIGl0cyByZWxhdGVkIGZsYXNoIHNpemUuIE5hbWVseSwgdGhlIHRvdGFs IGRlY29kZWQgc2l6ZQ0KPiA+ICsgKiBmcm9tIGZsYXNoIDAgdG8gZmxhc2ggTiBzaG91bGQgYmUg bXVsdGlwbGUgb2YgZmxhc2ggKE4gKyAxKS4NCj4gPiArICovDQo+ID4gK3N0YXRpYyB2b2lkIGFz cGVlZF8yNjAwX2FkanVzdF9kZWNvZGVfc3oodWludDMyX3QgZGVjb2RlX3N6X2FycltdLA0KPiA+ ICtpbnQgbGVuKSB7DQo+ID4gKwlpbnQgY3MsIGo7DQo+ID4gKwl1aW50MzJfdCBzejsNCj4gPiAr DQo+ID4gKwlmb3IgKGNzID0gbGVuIC0gMTsgY3MgPj0gMDsgY3MtLSkgew0KPiA+ICsJCXN6ID0g MDsNCj4gPiArCQlmb3IgKGogPSAwOyBqIDwgY3M7IGorKykNCj4gPiArCQkJc3ogKz0gZGVjb2Rl X3N6X2FycltqXTsNCj4gPiArDQo+ID4gKwkJaWYgKHN6ICUgZGVjb2RlX3N6X2Fycltjc10gIT0g MCkNCj4gPiArCQkJZGVjb2RlX3N6X2FyclswXSArPSAoc3ogJSBkZWNvZGVfc3pfYXJyW2NzXSk7 DQo+ID4gKwl9DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQNCj4gPiArYXNwZWVkX3Nw aV9kZWNvZGVfcmFuZ2VfY29uZmlnKHN0cnVjdCBhc3BlZWRfc3BpX2NvbnRyb2xsZXIgKmFzdF9j dHJsLA0KPiA+ICsJCQkgICAgICAgdWludDMyX3QgZGVjb2RlX3N6X2FycltdKQ0KPiA+ICt7DQo+ ID4gKwlzdHJ1Y3QgYXNwZWVkX3NwaV9jaGlwICpjaGlwID0gYXN0X2N0cmwtPmNoaXBzOw0KPiA+ ICsJdWludDMyX3QgaTsNCj4gPiArCXVpbnQzMl90IGNzOw0KPiA+ICsJdWludDMyX3QgZGVjb2Rl X3JlZ192YWw7DQo+ID4gKwlwaHlzX2FkZHJfdCBzdGFydF9hZGRyX3BoeSwgZW5kX2FkZHJfcGh5 LCBwcmVfZW5kX2FkZHJfcGh5ID0gMDsNCj4gPiArCXVpbnQzMl90IHRvdGFsX2RlY29kZV9zeiA9 IDA7DQo+ID4gKw0KPiA+ICsJLyogZGVjb2RlIHJhbmdlIHNhbml0eSAqLw0KPiA+ICsJZm9yIChj cyA9IDA7IGNzIDwgYXN0X2N0cmwtPm51bV9jczsgY3MrKykgew0KPiA+ICsJCXRvdGFsX2RlY29k ZV9zeiArPSBkZWNvZGVfc3pfYXJyW2NzXTsNCj4gPiArCQlpZiAoYXN0X2N0cmwtPmFoYl93aW5k b3dfc3ogPCB0b3RhbF9kZWNvZGVfc3opIHsNCj4gPiArCQkJZGV2X2Vycihhc3RfY3RybC0+ZGV2 LCAiaW5zdWZmaWNpZW50IGRlY29kZSBzaXplXG4iKTsNCj4gPiArCQkJZm9yIChpID0gMDsgaSA8 PSBjczsgaSsrKQ0KPiA+ICsJCQkJZGV2X2Vycihhc3RfY3RybC0+ZGV2LCAiY3M6JWQgJXhcbiIs IGksDQo+ID4gKwkJCQkJZGVjb2RlX3N6X2FycltpXSk7DQo+ID4gKwkJCXJldHVybiAtRU5PU1BD Ow0KPiA+ICsJCX0NCj4gPiArCX0NCj4gPiArDQo+ID4gKwlmb3IgKGNzID0gMDsgY3MgPCBhc3Rf Y3RybC0+bnVtX2NzOyBjcysrKSB7DQo+ID4gKwkJaWYgKGNoaXBbY3NdLmFoYl9iYXNlKQ0KPiA+ ICsJCQlkZXZtX2lvdW5tYXAoYXN0X2N0cmwtPmRldiwgY2hpcFtjc10uYWhiX2Jhc2UpOw0KPiA+ ICsJfQ0KPiA+ICsNCj4gPiArCS8qIGNvbmZpZ3VyZSBlYWNoIENFJ3MgZGVjb2RlIHJhbmdlICov DQo+ID4gKwlmb3IgKGNzID0gMDsgY3MgPCBhc3RfY3RybC0+bnVtX2NzOyBjcysrKSB7DQo+ID4g KwkJaWYgKGNzID09IDApDQo+ID4gKwkJCXN0YXJ0X2FkZHJfcGh5ID0gYXN0X2N0cmwtPmFoYl9i YXNlX3BoeTsNCj4gPiArCQllbHNlDQo+ID4gKwkJCXN0YXJ0X2FkZHJfcGh5ID0gcHJlX2VuZF9h ZGRyX3BoeTsNCj4gPiArDQo+ID4gKwkJY2hpcFtjc10uYWhiX2Jhc2UgPSBkZXZtX2lvcmVtYXAo YXN0X2N0cmwtPmRldiwgc3RhcnRfYWRkcl9waHksDQo+ID4gKwkJCQkJCSBkZWNvZGVfc3pfYXJy W2NzXSk7DQo+ID4gKwkJY2hpcFtjc10uYWhiX2Jhc2VfcGh5ID0gc3RhcnRfYWRkcl9waHk7DQo+ ID4gKw0KPiA+ICsJCWNoaXBbY3NdLmFoYl93aW5kb3dfc3ogPSBkZWNvZGVfc3pfYXJyW2NzXTsN Cj4gPiArCQllbmRfYWRkcl9waHkgPSBzdGFydF9hZGRyX3BoeSArIGRlY29kZV9zel9hcnJbY3Nd Ow0KPiA+ICsNCj4gPiArCQlkZWNvZGVfcmVnX3ZhbCA9IGFzdF9jdHJsLT5pbmZvLT5zZWdtZW50 X3JlZygNCj4gPiArCQkJYXN0X2N0cmwsIHN0YXJ0X2FkZHJfcGh5LCBlbmRfYWRkcl9waHkpOw0K PiA+ICsNCj4gPiArCQl3cml0ZWwoZGVjb2RlX3JlZ192YWwsDQo+ID4gKwkJICAgICAgIGFzdF9j dHJsLT5yZWdzICsgT0ZGU0VUX0NFMF9ERUNPREVfUkFOR0VfUkVHICsgY3MgKg0KPiA0KTsNCj4g PiArDQo+ID4gKwkJcHJlX2VuZF9hZGRyX3BoeSA9IGVuZF9hZGRyX3BoeTsNCj4gPiArDQo+ID4g KwkJZGV2X2RiZyhhc3RfY3RybC0+ZGV2LCAiY3M6ICVkLCBkZWNvZGVfcmVnOiAweCV4XG4iLCBj cywNCj4gPiArCQkJZGVjb2RlX3JlZ192YWwpOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXJldHVy biAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGFzcGVlZF9zcGlf aW5mbyBhc3QyNjAwX3NwaV9pbmZvID0gew0KPiA+ICsJLm1heF9kYXRhX2J1c193aWR0aCA9IDQs DQo+ID4gKwkuY21kX2lvX2N0cmxfbWFzayA9IDB4ZjBmZjQwYzMsDQo+ID4gKwkvKiBmb3IgYXN0 MjYwMCwgdGhlIG1pbmltdW0gZGVjb2RlIHNpemUgZm9yIGVhY2ggQ0UgaXMgMk1CICovDQo+ID4g KwkubWluX2RlY29kZV9zeiA9IDB4MjAwMDAwLA0KPiA+ICsJLnNldF80Ynl0ZSA9IGFzcGVlZF9z cGlfY2hpcF9zZXRfNGJ5dGUsDQo+ID4gKwkuY2FsaWJyYXRlID0gYXNwZWVkXzI2MDBfc3BpX3Rp bWluZ19jYWxpYnJhdGlvbiwNCj4gPiArCS5hZGp1c3RfZGVjb2RlX3N6ID0gYXNwZWVkXzI2MDBf YWRqdXN0X2RlY29kZV9zeiwNCj4gPiArCS5zZWdtZW50X3N0YXJ0ID0gYXNwZWVkXzI2MDBfc3Bp X3NlZ21lbnRfc3RhcnQsDQo+ID4gKwkuc2VnbWVudF9lbmQgPSBhc3BlZWRfMjYwMF9zcGlfc2Vn bWVudF9lbmQsDQo+ID4gKwkuc2VnbWVudF9yZWcgPSBhc3BlZWRfMjYwMF9zcGlfc2VnbWVudF9y ZWcsIH07DQo+ID4gKw0KPiA+ICsvKg0KPiA+ICsgKiBJZiB0aGUgc2xhdmUgZGV2aWNlIGlzIFNQ SSBOT1IgZmxhc2gsIHRoZXJlIGFyZSB0d28gdHlwZXMNCj4gPiArICogb2YgY29tbWFuZCBtb2Rl IGZvciBBU1BFRUQgU1BJIG1lbW9yeSBjb250cm9sbGVyIHVzZWQgdG8NCj4gPiArICogdHJhbnNm ZXIgZGF0YS4gVGhlIGZpcnN0IG9uZSBpcyB1c2VyIG1vZGUgYW5kIHRoZSBvdGhlciBpcw0KPiA+ ICsgKiBjb21tYW5kIHJlYWQvd3JpdGUgbW9kZS4gV2l0aCB1c2VyIG1vZGUsIFNQSSBOT1IgZmxh c2gNCj4gPiArICogY29tbWFuZCwgYWRkcmVzcyBhbmQgZGF0YSBwcm9jZXNzZXMgYXJlIGFsbCBo YW5kbGVkIGJ5IENQVS4NCj4gPiArICogQnV0LCB3aGVuIGFkZHJlc3MgZmlsdGVyIGlzIGVuYWJs ZWQgdG8gcHJvdGVjdCBzb21lIGZsYXNoDQo+ID4gKyAqIHJlZ2lvbnMgZnJvbSBiZWluZyB3cml0 dGVuLCB1c2VyIG1vZGUgd2lsbCBiZSBkaXNhYmxlZC4NCj4gPiArICogVGh1cywgaGVyZSwgd2Ug dXNlIGNvbW1hbmQgcmVhZC93cml0ZSBtb2RlIHRvIGlzc3VlIFNQSQ0KPiA+ICsgKiBvcGVyYXRp b25zLiBBZnRlciByZW1hcHBpbmcgZmxhc2ggc3BhY2UgY29ycmVjdGx5LCB3ZSBjYW4NCj4gPiAr ICogZWFzaWx5IHJlYWQvd3JpdGUgZGF0YSB0byBmbGFzaCBieSByZWFkaW5nIG9yIHdyaXRpbmcN Cj4gPiArICogcmVsYXRlZCByZW1hcHBlZCBhZGRyZXNzLCB0aGVuLCBTUEkgTk9SIGZsYXNoIGNv bW1hbmQgYW5kDQo+ID4gKyAqIGFkZHJlc3Mgd2lsbCBiZSB0cmFuc2ZlcnJlZCB0byBmbGFzaCBi eSBjb250cm9sbGVyDQo+ID4gKyAqIGF1dG9tYXRpY2FsbHkuIEJlc2lkZXMsIEFTUEVFRCBTUEkg bWVtb3J5IGNvbnRyb2xsZXIgY2FuDQo+ID4gKyAqIGFsc28gYmxvY2sgYWRkcmVzcyBvciBkYXRh IGJ5dGVzIGJ5IGNvbmZpZ3VyZSBGTUMwQy9TUElSMEMNCj4gPiArICogYWRkcmVzcyBhbmQgZGF0 YSBtYXNrIHJlZ2lzdGVyIGluIG9yZGVyIHRvIHNhdGlzZnkgdGhlDQo+ID4gKyAqIGZvbGxvd2lu ZyBTUEkgZmxhc2ggb3BlcmF0aW9uIHNlcXVlbmNlczogKGNvbW1hbmQpIG9ubHksDQo+ID4gKyAq IChjb21tYW5kIGFuZCBhZGRyZXNzKSBvbmx5IG9yIChjb29tbWFuZCBhbmQgZGF0YSkgb25seS4N Cj4gPiArICovDQo+ID4gK3N0YXRpYyBpbnQgYXNwZWVkX3NwaV9leGVjX29wKHN0cnVjdCBzcGlf bWVtICptZW0sIGNvbnN0IHN0cnVjdA0KPiA+ICtzcGlfbWVtX29wICpvcCkgew0KPiA+ICsJc3Ry dWN0IGFzcGVlZF9zcGlfY29udHJvbGxlciAqYXN0X2N0cmwgPQ0KPiA+ICsJCXNwaV9jb250cm9s bGVyX2dldF9kZXZkYXRhKG1lbS0+c3BpLT5tYXN0ZXIpOw0KPiA+ICsJc3RydWN0IGRldmljZSAq ZGV2ID0gYXN0X2N0cmwtPmRldjsNCj4gPiArCXVpbnQzMl90IGNzID0gbWVtLT5zcGktPmNoaXBf c2VsZWN0Ow0KPiA+ICsJc3RydWN0IGFzcGVlZF9zcGlfY2hpcCAqY2hpcCA9ICZhc3RfY3RybC0+ Y2hpcHNbY3NdOw0KPiA+ICsJdWludDMyX3QgY3RybF92YWw7DQo+ID4gKwl1aW50MzJfdCBhZGRy X21vZGVfcmVnLCBhZGRyX21vZGVfcmVnX2JhY2t1cDsNCj4gPiArCXVpbnQzMl90IGFkZHJfZGF0 YV9tYXNrID0gMDsNCj4gPiArCXZvaWQgX19pb21lbSAqb3BfYWRkcjsNCj4gPiArCWNvbnN0IHZv aWQgKmRhdGFfYnVmOw0KPiA+ICsJdWludDMyX3QgZGF0YV9ieXRlID0gMDsNCj4gPiArCXVpbnQz Ml90IGR1bW15X2RhdGEgPSAwOw0KPiA+ICsNCj4gPiArCWRldl9kYmcoZGV2LA0KPiAiY21kOiV4 KCVkKSxhZGRyOiVsbHgoJWQpLGR1bW15OiVkKCVkKSxkYXRhX2xlbjoleCglZClcbiIsDQo+ID4g KwkJb3AtPmNtZC5vcGNvZGUsIG9wLT5jbWQuYnVzd2lkdGgsIG9wLT5hZGRyLnZhbCwNCj4gPiAr CQlvcC0+YWRkci5idXN3aWR0aCwgb3AtPmR1bW15Lm5ieXRlcywgb3AtPmR1bW15LmJ1c3dpZHRo LA0KPiA+ICsJCW9wLT5kYXRhLm5ieXRlcywgb3AtPmRhdGEuYnVzd2lkdGgpOw0KPiA+ICsNCj4g PiArCWFkZHJfbW9kZV9yZWcgPSBhZGRyX21vZGVfcmVnX2JhY2t1cCA9DQo+ID4gKwkJcmVhZGwo YXN0X2N0cmwtPnJlZ3MgKyBPRkZTRVRfQ0VfQUREUl9NT0RFX0NUUkwpOw0KPiA+ICsJYWRkcl9k YXRhX21hc2sgPSByZWFkbChhc3RfY3RybC0+cmVncyArIE9GRlNFVF9BRERSX0RBVEFfTUFTSyk7 DQo+ID4gKw0KPiA+ICsJY3RybF92YWwgPSBjaGlwLT5jdHJsX3ZhbFtBU1BFRURfU1BJX0JBU0Vd Ow0KPiA+ICsJY3RybF92YWwgJj0gfmFzdF9jdHJsLT5pbmZvLT5jbWRfaW9fY3RybF9tYXNrOw0K PiA+ICsNCj4gPiArCS8qIGNvbmZpZ3VyZSBvcGNvZGUgKi8NCj4gPiArCWN0cmxfdmFsIHw9IG9w LT5jbWQub3Bjb2RlIDw8IDE2Ow0KPiA+ICsNCj4gPiArCS8qIGNvbmZpZ3VyZSBvcGVyYXRpb24g YWRkcmVzcywgYWRkcmVzcyBsZW5ndGggYW5kIGFkZHJlc3MgbWFzayAqLw0KPiA+ICsJaWYgKG9w LT5hZGRyLm5ieXRlcyAhPSAwKSB7DQo+ID4gKwkJaWYgKG9wLT5hZGRyLm5ieXRlcyA9PSAzKQ0K PiA+ICsJCQlhZGRyX21vZGVfcmVnICY9IH4oMHgxMSA8PCBjcyk7DQo+ID4gKwkJZWxzZQ0KPiA+ ICsJCQlhZGRyX21vZGVfcmVnIHw9ICgweDExIDw8IGNzKTsNCj4gDQo+IHBsZWFzZSB1c2UgZGVm aW5lLg0KDQpPa2F5LCBpdCB3aWxsIGJlIHVwZGF0ZWQgb24gdGhlIG5leHQgcGF0Y2guDQoNCj4g DQo+ID4gKw0KPiA+ICsJCWFkZHJfZGF0YV9tYXNrICY9IDB4MGY7DQo+ID4gKwkJb3BfYWRkciA9 IGNoaXAtPmFoYl9iYXNlICsgb3AtPmFkZHIudmFsOw0KPiA+ICsJfSBlbHNlIHsNCj4gPiArCQlh ZGRyX2RhdGFfbWFzayB8PSAweGYwOw0KPiANCj4gRGlzYWJsaW5nIHRoZSBhZGRyZXNzIGxhbmVz IG5lZWRzIGFuIGV4cGxhbmF0aW9uLg0KDQpJdCB3aWxsIGJlIGFkZGVkIGluIHRoZSBjb21tZW50 IGFib3ZlIHRoaXMgZnVuY3Rpb24uDQoNCj4gDQo+ID4gKwkJb3BfYWRkciA9IGNoaXAtPmFoYl9i YXNlOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCWlmIChvcC0+ZHVtbXkubmJ5dGVzICE9IDApIHsN Cj4gPiArCQljdHJsX3ZhbCB8PSAoKG9wLT5kdW1teS5uYnl0ZXMgJiAweDMpIDw8IDYgfA0KPiA+ ICsJCQkgICAgIChvcC0+ZHVtbXkubmJ5dGVzICYgMHg0KSA8PCAxNCk7DQo+ID4gKwl9DQo+ID4g Kw0KPiA+ICsJLyogY29uZmlndXJlIGRhdGEgaW8gbW9kZSBhbmQgZGF0YSBtYXNrICovDQo+ID4g KwlpZiAob3AtPmRhdGEubmJ5dGVzICE9IDApIHsNCj4gPiArCQlhZGRyX2RhdGFfbWFzayAmPSAw eEYwOw0KPiA+ICsJCWRhdGFfYnl0ZSA9IG9wLT5kYXRhLm5ieXRlczsNCj4gPiArCQlpZiAob3At PmRhdGEuZGlyID09IFNQSV9NRU1fREFUQV9PVVQpDQo+ID4gKwkJCWRhdGFfYnVmID0gb3AtPmRh dGEuYnVmLm91dDsNCj4gPiArCQllbHNlDQo+ID4gKwkJCWRhdGFfYnVmID0gb3AtPmRhdGEuYnVm LmluOw0KPiA+ICsNCj4gPiArCQlpZiAob3AtPmRhdGEuYnVzd2lkdGgpDQo+ID4gKwkJCWN0cmxf dmFsIHw9IGFzcGVlZF9zcGlfZ2V0X2lvX21vZGUob3AtPmRhdGEuYnVzd2lkdGgpOw0KPiA+ICsN Cj4gPiArCX0gZWxzZSB7DQo+ID4gKwkJYWRkcl9kYXRhX21hc2sgfD0gMHgwZjsNCj4gPiArCQlk YXRhX2J5dGUgPSAxOw0KPiA+ICsJCWRhdGFfYnVmID0gJmR1bW15X2RhdGE7DQo+ID4gKwl9DQo+ ID4gKw0KPiA+ICsJLyogY29uZmlndXJlIGNvbW1hbmQgbW9kZSAqLw0KPiA+ICsJaWYgKG9wLT5k YXRhLmRpciA9PSBTUElfTUVNX0RBVEFfT1VUKQ0KPiA+ICsJCWN0cmxfdmFsIHw9IENUUkxfSU9f TU9ERV9DTURfV1JJVEU7DQo+ID4gKwllbHNlDQo+ID4gKwkJY3RybF92YWwgfD0gQ1RSTF9JT19N T0RFX0NNRF9SRUFEOw0KPiA+ICsNCj4gPiArCS8qIHNldCBjb250cm9sbGVyIHJlZ2lzdGVycyAq Lw0KPiA+ICsJd3JpdGVsKGN0cmxfdmFsLCBhc3RfY3RybC0+cmVncyArIE9GRlNFVF9DRTBfQ1RS TF9SRUcgKyBjcyAqIDQpOw0KPiA+ICsJd3JpdGVsKGFkZHJfbW9kZV9yZWcsIGFzdF9jdHJsLT5y ZWdzICsgT0ZGU0VUX0NFX0FERFJfTU9ERV9DVFJMKTsNCj4gPiArCXdyaXRlbChhZGRyX2RhdGFf bWFzaywgYXN0X2N0cmwtPnJlZ3MgKyBPRkZTRVRfQUREUl9EQVRBX01BU0spOw0KPiA+ICsNCj4g PiArCWRldl9kYmcoZGV2LCAiY3RybDogMHglMDh4LCBhZGRyX21vZGU6IDB4JXgsIG1hc2s6IDB4 JXgsIGFkZHI6JXB4XG4iLA0KPiA+ICsJCWN0cmxfdmFsLCBhZGRyX21vZGVfcmVnLCBhZGRyX2Rh dGFfbWFzaywgb3BfYWRkcik7DQo+ID4gKw0KPiA+ICsJLyogdHJpZ2dlciBzcGkgdHJhbnNtaXNz aW9uIG9yIHJlY2VwdGlvbiBzZXF1ZW5jZSAqLw0KPiA+ICsJaWYgKG9wLT5kYXRhLmRpciA9PSBT UElfTUVNX0RBVEFfT1VUKQ0KPiA+ICsJCW1lbWNweV90b2lvKG9wX2FkZHIsIGRhdGFfYnVmLCBk YXRhX2J5dGUpOw0KPiA+ICsJZWxzZQ0KPiA+ICsJCW1lbWNweV9mcm9taW8oKHZvaWQgKilkYXRh X2J1Ziwgb3BfYWRkciwgZGF0YV9ieXRlKTsNCj4gPiArDQo+ID4gKwkvKiByZXN0b3JlIGNvbnRy b2xsZXIgc2V0dGluZyAqLw0KPiA+ICsJd3JpdGVsKGNoaXAtPmN0cmxfdmFsW0FTUEVFRF9TUElf UkVBRF0sDQo+ID4gKwkgICAgICAgYXN0X2N0cmwtPnJlZ3MgKyBPRkZTRVRfQ0UwX0NUUkxfUkVH ICsgY3MgKiA0KTsNCj4gPiArCXdyaXRlbChhZGRyX21vZGVfcmVnX2JhY2t1cCwgYXN0X2N0cmwt PnJlZ3MgKw0KPiBPRkZTRVRfQ0VfQUREUl9NT0RFX0NUUkwpOw0KPiA+ICsJd3JpdGVsKDB4MCwg YXN0X2N0cmwtPnJlZ3MgKyBPRkZTRVRfQUREUl9EQVRBX01BU0spOw0KPiA+ICsNCj4gPiArCXJl dHVybiAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgc3NpemVfdCBhc3BlZWRfc3BpX2Rp cm1hcF9yZWFkKHN0cnVjdCBzcGlfbWVtX2Rpcm1hcF9kZXNjICpkZXNjLA0KPiA+ICsJCQkJICB1 aW50NjRfdCBvZmZzLCBzaXplX3QgbGVuLCB2b2lkICpidWYpIHsNCj4gPiArCXN0cnVjdCBhc3Bl ZWRfc3BpX2NvbnRyb2xsZXIgKmFzdF9jdHJsID0NCj4gPiArCQlzcGlfY29udHJvbGxlcl9nZXRf ZGV2ZGF0YShkZXNjLT5tZW0tPnNwaS0+bWFzdGVyKTsNCj4gPiArCXN0cnVjdCBhc3BlZWRfc3Bp X2NoaXAgKmNoaXAgPQ0KPiA+ICsJCSZhc3RfY3RybC0+Y2hpcHNbZGVzYy0+bWVtLT5zcGktPmNo aXBfc2VsZWN0XTsNCj4gPiArCXN0cnVjdCBzcGlfbWVtX29wIG9wX3RtcGwgPSBkZXNjLT5pbmZv Lm9wX3RtcGw7DQo+ID4gKw0KPiA+ICsJaWYgKGNoaXAtPmFoYl93aW5kb3dfc3ogPCBvZmZzICsg bGVuKSB7DQo+ID4gKwkJZGV2X2luZm8oYXN0X2N0cmwtPmRldiwNCj4gPiArCQkJICJyZWFkIHJh bmdlIGV4Y2VlZHMgZmxhc2ggcmVtYXBwaW5nIHNpemVcbiIpOw0KPiA+ICsJCXJldHVybiAwOw0K PiA+ICsJfQ0KPiA+ICsNCj4gPiArCWRldl9kYmcoYXN0X2N0cmwtPmRldiwgInJlYWQgb3A6MHgl eCwgYWRkcjoweCVsbHgsIGxlbjoweCV6eFxuIiwNCj4gPiArCQlvcF90bXBsLmNtZC5vcGNvZGUs IG9mZnMsIGxlbik7DQo+ID4gKw0KPiA+ICsJbWVtY3B5X2Zyb21pbyhidWYsIGNoaXAtPmFoYl9i YXNlICsgb2ZmcywgbGVuKTsNCj4gPiArDQo+ID4gKwlyZXR1cm4gbGVuOw0KPiA+ICt9DQo+ID4g Kw0KPiA+ICtzdGF0aWMgc3NpemVfdCBhc3BlZWRfc3BpX2Rpcm1hcF93cml0ZShzdHJ1Y3Qgc3Bp X21lbV9kaXJtYXBfZGVzYw0KPiAqZGVzYywNCj4gPiArCQkJCSAgIHVpbnQ2NF90IG9mZnMsIHNp emVfdCBsZW4sIGNvbnN0IHZvaWQgKmJ1Zikgew0KPiA+ICsJc3RydWN0IGFzcGVlZF9zcGlfY29u dHJvbGxlciAqYXN0X2N0cmwgPQ0KPiA+ICsJCXNwaV9jb250cm9sbGVyX2dldF9kZXZkYXRhKGRl c2MtPm1lbS0+c3BpLT5tYXN0ZXIpOw0KPiA+ICsJc3RydWN0IGFzcGVlZF9zcGlfY2hpcCAqY2hp cCA9DQo+ID4gKwkJJmFzdF9jdHJsLT5jaGlwc1tkZXNjLT5tZW0tPnNwaS0+Y2hpcF9zZWxlY3Rd Ow0KPiA+ICsJdWludDMyX3QgcmVnX3ZhbDsNCj4gPiArCXVpbnQzMl90IHRhcmdldF9jcyA9IGRl c2MtPm1lbS0+c3BpLT5jaGlwX3NlbGVjdDsNCj4gPiArCXN0cnVjdCBzcGlfbWVtX29wIG9wX3Rt cGwgPSBkZXNjLT5pbmZvLm9wX3RtcGw7DQo+ID4gKw0KPiA+ICsJaWYgKGNoaXAtPmFoYl93aW5k b3dfc3ogPCBvZmZzICsgbGVuKSB7DQo+ID4gKwkJZGV2X2luZm8oYXN0X2N0cmwtPmRldiwNCj4g PiArCQkJICJ3cml0ZSByYW5nZSBleGNlZWRzIGZsYXNoIHJlbWFwcGluZyBzaXplXG4iKTsNCj4g PiArCQlyZXR1cm4gMDsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwlkZXZfZGJnKGFzdF9jdHJsLT5k ZXYsICJ3cml0ZSBvcDoweCV4LCBhZGRyOjB4JWxseCwgbGVuOjB4JXp4XG4iLA0KPiA+ICsJCW9w X3RtcGwuY21kLm9wY29kZSwgb2ZmcywgbGVuKTsNCj4gPiArDQo+ID4gKwlyZWdfdmFsID0gYXN0 X2N0cmwtPmNoaXBzW3RhcmdldF9jc10uY3RybF92YWxbQVNQRUVEX1NQSV9XUklURV07DQo+ID4g Kwl3cml0ZWwocmVnX3ZhbCwgYXN0X2N0cmwtPnJlZ3MgKyBPRkZTRVRfQ0UwX0NUUkxfUkVHICsg dGFyZ2V0X2NzICoNCj4gPiArNCk7DQo+ID4gKw0KPiA+ICsJbWVtY3B5X3RvaW8oY2hpcC0+YWhi X2Jhc2UgKyBvZmZzLCBidWYsIGxlbik7DQo+ID4gKw0KPiA+ICsJcmVnX3ZhbCA9IGFzdF9jdHJs LT5jaGlwc1t0YXJnZXRfY3NdLmN0cmxfdmFsW0FTUEVFRF9TUElfUkVBRF07DQo+ID4gKwl3cml0 ZWwocmVnX3ZhbCwgYXN0X2N0cmwtPnJlZ3MgKyBPRkZTRVRfQ0UwX0NUUkxfUkVHICsgdGFyZ2V0 X2NzICoNCj4gPiArNCk7DQo+ID4gKw0KPiA+ICsJcmV0dXJuIGxlbjsNCj4gPiArfQ0KPiA+ICsN Cj4gPiArc3RhdGljIGludCBhc3BlZWRfc3BpX2Rpcm1hcF9jcmVhdGUoc3RydWN0IHNwaV9tZW1f ZGlybWFwX2Rlc2MgKmRlc2MpDQo+ID4gK3sNCj4gPiArCWludCByZXQgPSAwOw0KPiA+ICsJc3Ry dWN0IGFzcGVlZF9zcGlfY29udHJvbGxlciAqYXN0X2N0cmwgPQ0KPiA+ICsJCXNwaV9jb250cm9s bGVyX2dldF9kZXZkYXRhKGRlc2MtPm1lbS0+c3BpLT5tYXN0ZXIpOw0KPiA+ICsJc3RydWN0IGRl dmljZSAqZGV2ID0gYXN0X2N0cmwtPmRldjsNCj4gPiArCWNvbnN0IHN0cnVjdCBhc3BlZWRfc3Bp X2luZm8gKmluZm8gPSBhc3RfY3RybC0+aW5mbzsNCj4gPiArCXN0cnVjdCBzcGlfbWVtX29wIG9w X3RtcGwgPSBkZXNjLT5pbmZvLm9wX3RtcGw7DQo+ID4gKwl1aW50MzJfdCBkZWNvZGVfc3pfYXJy WzVdOw0KPiA+ICsJdWludDMyX3QgY3MsIHRhcmdldF9jcyA9IGRlc2MtPm1lbS0+c3BpLT5jaGlw X3NlbGVjdDsNCj4gPiArCXVpbnQzMl90IHJlZ192YWw7DQo+ID4gKw0KPiA+ICsJaWYgKGRlc2Mt PmluZm8ub3BfdG1wbC5kYXRhLmRpciA9PSBTUElfTUVNX0RBVEFfSU4pIHsNCj4gPiArCQkvKiBy ZWNvcmQgb3JpZ2luYWwgZGVjb2RlIHNpemUgKi8NCj4gPiArCQlmb3IgKGNzID0gMDsgY3MgPCBh c3RfY3RybC0+bnVtX2NzOyBjcysrKSB7DQo+ID4gKwkJCXJlZ192YWwgPSByZWFkbChhc3RfY3Ry bC0+cmVncyArDQo+ID4gKwkJCQkJT0ZGU0VUX0NFMF9ERUNPREVfUkFOR0VfUkVHICsgY3MgKiA0 KTsNCj4gPiArCQkJZGVjb2RlX3N6X2Fycltjc10gPQ0KPiA+ICsJCQkJaW5mby0+c2VnbWVudF9l bmQoYXN0X2N0cmwsIHJlZ192YWwpIC0NCj4gPiArCQkJCWluZm8tPnNlZ21lbnRfc3RhcnQoYXN0 X2N0cmwsIHJlZ192YWwpOw0KPiA+ICsJCX0NCj4gPiArDQo+ID4gKwkJZGVjb2RlX3N6X2Fyclt0 YXJnZXRfY3NdID0gZGVzYy0+aW5mby5sZW5ndGg7DQo+ID4gKw0KPiA+ICsJCWlmIChpbmZvLT5h ZGp1c3RfZGVjb2RlX3N6KQ0KPiA+ICsJCQlpbmZvLT5hZGp1c3RfZGVjb2RlX3N6KGRlY29kZV9z el9hcnIsIGFzdF9jdHJsLT5udW1fY3MpOw0KPiA+ICsNCj4gPiArCQlmb3IgKGNzID0gMDsgY3Mg PCBhc3RfY3RybC0+bnVtX2NzOyBjcysrKSB7DQo+ID4gKwkJCWRldl9kYmcoZGV2LCAiY3M6ICVk LCBzejogMHgleFxuIiwgY3MsDQo+ID4gKwkJCQlkZWNvZGVfc3pfYXJyW2NzXSk7DQo+ID4gKwkJ fQ0KPiA+ICsNCj4gPiArCQlyZXQgPSBhc3BlZWRfc3BpX2RlY29kZV9yYW5nZV9jb25maWcoYXN0 X2N0cmwsIGRlY29kZV9zel9hcnIpOw0KPiA+ICsJCWlmIChyZXQpDQo+ID4gKwkJCXJldHVybiBy ZXQ7DQo+ID4gKw0KPiA+ICsJCXJlZ192YWwgPSByZWFkbChhc3RfY3RybC0+cmVncyArIE9GRlNF VF9DRTBfQ1RSTF9SRUcgKw0KPiA+ICsJCQkJdGFyZ2V0X2NzICogNCkgJg0KPiA+ICsJCQkgICh+ aW5mby0+Y21kX2lvX2N0cmxfbWFzayk7DQo+ID4gKwkJcmVnX3ZhbCB8PSBhc3BlZWRfc3BpX2dl dF9pb19tb2RlKG9wX3RtcGwuZGF0YS5idXN3aWR0aCkgfA0KPiA+ICsJCQkgICBvcF90bXBsLmNt ZC5vcGNvZGUgPDwgMTYgfA0KPiA+ICsJCQkgICAoKG9wX3RtcGwuZHVtbXkubmJ5dGVzKSAmIDB4 MykgPDwgNiB8DQo+ID4gKwkJCSAgICgob3BfdG1wbC5kdW1teS5uYnl0ZXMpICYgMHg0KSA8PCAx NCB8DQo+ID4gKwkJCSAgIENUUkxfSU9fTU9ERV9DTURfUkVBRDsNCj4gPiArDQo+ID4gKwkJd3Jp dGVsKHJlZ192YWwsDQo+ID4gKwkJICAgICAgIGFzdF9jdHJsLT5yZWdzICsgT0ZGU0VUX0NFMF9D VFJMX1JFRyArIHRhcmdldF9jcyAqIDQpOw0KPiA+ICsJCWFzdF9jdHJsLT5jaGlwc1t0YXJnZXRf Y3NdLmN0cmxfdmFsW0FTUEVFRF9TUElfUkVBRF0gPSByZWdfdmFsOw0KPiA+ICsJCWFzdF9jdHJs LT5jaGlwc1t0YXJnZXRfY3NdLm1heF9jbGtfZnJlcSA9DQo+ID4gKwkJCWRlc2MtPm1lbS0+c3Bp LT5tYXhfc3BlZWRfaHo7DQo+ID4gKw0KPiA+ICsJCXJldCA9IGluZm8tPmNhbGlicmF0ZShhc3Rf Y3RybCwgdGFyZ2V0X2NzKTsNCj4gPiArDQo+ID4gKwkJZGV2X2luZm8oZGV2LCAicmVhZCBidXMg d2lkdGg6ICVkIFsweCUwOHhdXG4iLA0KPiA+ICsJCQkgb3BfdG1wbC5kYXRhLmJ1c3dpZHRoLA0K PiA+ICsJCQkgYXN0X2N0cmwtPmNoaXBzW3RhcmdldF9jc10uY3RybF92YWxbQVNQRUVEX1NQSV9S RUFEXSk7DQo+ID4gKw0KPiA+ICsJfSBlbHNlIGlmIChkZXNjLT5pbmZvLm9wX3RtcGwuZGF0YS5k aXIgPT0gU1BJX01FTV9EQVRBX09VVCkgew0KPiA+ICsJCXJlZ192YWwgPSByZWFkbChhc3RfY3Ry bC0+cmVncyArIE9GRlNFVF9DRTBfQ1RSTF9SRUcgKw0KPiA+ICsJCQkJdGFyZ2V0X2NzICogNCkg Jg0KPiA+ICsJCQkgICh+aW5mby0+Y21kX2lvX2N0cmxfbWFzayk7DQo+ID4gKwkJcmVnX3ZhbCB8 PSBhc3BlZWRfc3BpX2dldF9pb19tb2RlKG9wX3RtcGwuZGF0YS5idXN3aWR0aCkgfA0KPiA+ICsJ CQkgICBvcF90bXBsLmNtZC5vcGNvZGUgPDwgMTYgfA0KPiBDVFJMX0lPX01PREVfQ01EX1dSSVRF Ow0KPiA+ICsJCWFzdF9jdHJsLT5jaGlwc1t0YXJnZXRfY3NdLmN0cmxfdmFsW0FTUEVFRF9TUElf V1JJVEVdID0gcmVnX3ZhbDsNCj4gPiArDQo+ID4gKwkJZGV2X2luZm8oZGV2LCAid3JpdGUgYnVz IHdpZHRoOiAlZCBbMHglMDh4XVxuIiwNCj4gPiArCQkJIG9wX3RtcGwuZGF0YS5idXN3aWR0aCwN Cj4gPiArCQkJIGFzdF9jdHJsLT5jaGlwc1t0YXJnZXRfY3NdLmN0cmxfdmFsW0FTUEVFRF9TUElf V1JJVEVdKTsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwlyZXR1cm4gcmV0Ow0KPiA+ICt9DQo+ID4g Kw0KPiA+ICtzdGF0aWMgY29uc3QgY2hhciAqYXNwZWVkX3NwaV9nZXRfbmFtZShzdHJ1Y3Qgc3Bp X21lbSAqbWVtKSB7DQo+ID4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmbWVtLT5zcGktPm1hc3Rl ci0+ZGV2Ow0KPiA+ICsJY29uc3QgY2hhciAqbmFtZTsNCj4gPiArDQo+ID4gKwluYW1lID0gZGV2 bV9rYXNwcmludGYoZGV2LCBHRlBfS0VSTkVMLCAiJXMtJWQiLCBkZXZfbmFtZShkZXYpLA0KPiA+ ICsJCQkgICAgICBtZW0tPnNwaS0+Y2hpcF9zZWxlY3QpOw0KPiA+ICsNCj4gPiArCWlmICghbmFt ZSkgew0KPiA+ICsJCWRldl9lcnIoZGV2LCAiY2Fubm90IGdldCBzcGkgbmFtZVxuIik7DQo+ID4g KwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJcmV0dXJu IG5hbWU7DQo+ID4gK30NCj4gPiArDQo+ID4gKy8qDQo+ID4gKyAqIEN1cnJlbnRseSwgb25seSBz dXBwb3J0IDEtMS0xLCAxLTEtMiBvciAxLTEtNA0KPiA+ICsgKiBTUEkgTk9SIGZsYXNoIG9wZXJh dGlvbiBmb3JtYXQuDQo+ID4gKyAqLw0KPiA+ICtzdGF0aWMgYm9vbCBhc3BlZWRfc3BpX3N1cHBv cnRfb3Aoc3RydWN0IHNwaV9tZW0gKm1lbSwNCj4gPiArCQkJCSAgY29uc3Qgc3RydWN0IHNwaV9t ZW1fb3AgKm9wKQ0KPiA+ICt7DQo+ID4gKwlzdHJ1Y3QgYXNwZWVkX3NwaV9jb250cm9sbGVyICph c3RfY3RybCA9DQo+ID4gKwkJc3BpX2NvbnRyb2xsZXJfZ2V0X2RldmRhdGEobWVtLT5zcGktPm1h c3Rlcik7DQo+ID4gKw0KPiA+ICsJaWYgKG9wLT5jbWQuYnVzd2lkdGggPiAxKQ0KPiA+ICsJCXJl dHVybiBmYWxzZTsNCj4gPiArDQo+ID4gKwlpZiAob3AtPmFkZHIubmJ5dGVzICE9IDApIHsNCj4g PiArCQlpZiAob3AtPmFkZHIuYnVzd2lkdGggPiAxIHx8IG9wLT5hZGRyLm5ieXRlcyA+IDQpDQo+ ID4gKwkJCXJldHVybiBmYWxzZTsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwlpZiAob3AtPmR1bW15 Lm5ieXRlcyAhPSAwKSB7DQo+ID4gKwkJaWYgKG9wLT5kdW1teS5idXN3aWR0aCA+IDEgfHwgb3At PmR1bW15Lm5ieXRlcyA+IDcpDQo+ID4gKwkJCXJldHVybiBmYWxzZTsNCj4gPiArCX0NCj4gPiAr DQo+ID4gKwlpZiAob3AtPmRhdGEubmJ5dGVzICE9IDAgJiYNCj4gPiArCSAgICBhc3RfY3RybC0+ aW5mby0+bWF4X2RhdGFfYnVzX3dpZHRoIDwgb3AtPmRhdGEuYnVzd2lkdGgpDQo+ID4gKwkJcmV0 dXJuIGZhbHNlOw0KPiA+ICsNCj4gPiArCWlmICghc3BpX21lbV9kZWZhdWx0X3N1cHBvcnRzX29w KG1lbSwgb3ApKQ0KPiA+ICsJCXJldHVybiBmYWxzZTsNCj4gPiArDQo+ID4gKwlpZiAob3AtPmFk ZHIubmJ5dGVzID09IDQpDQo+ID4gKwkJYXN0X2N0cmwtPmluZm8tPnNldF80Ynl0ZShhc3RfY3Ry bCwgbWVtLT5zcGktPmNoaXBfc2VsZWN0KTsNCj4gPiArDQo+ID4gKwlyZXR1cm4gdHJ1ZTsNCj4g PiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfY29udHJvbGxlcl9tZW1f b3BzIGFzcGVlZF9zcGlfbWVtX29wcyA9IHsNCj4gPiArCS5leGVjX29wID0gYXNwZWVkX3NwaV9l eGVjX29wLA0KPiA+ICsJLmdldF9uYW1lID0gYXNwZWVkX3NwaV9nZXRfbmFtZSwNCj4gPiArCS5z dXBwb3J0c19vcCA9IGFzcGVlZF9zcGlfc3VwcG9ydF9vcCwNCj4gPiArCS5kaXJtYXBfY3JlYXRl ID0gYXNwZWVkX3NwaV9kaXJtYXBfY3JlYXRlLA0KPiA+ICsJLmRpcm1hcF9yZWFkID0gYXNwZWVk X3NwaV9kaXJtYXBfcmVhZCwNCj4gPiArCS5kaXJtYXBfd3JpdGUgPSBhc3BlZWRfc3BpX2Rpcm1h cF93cml0ZSwgfTsNCj4gPiArDQo+ID4gKy8qDQo+ID4gKyAqIEluaXRpYWxpemUgU1BJIGNvbnRy b2xsZXIgZm9yIGVhY2ggY2hpcCBzZWxlY3QuDQo+ID4gKyAqIEhlcmUsIG9ubHkgdGhlIG1pbmlt dW0gZGVjb2RlIHJhbmdlIGlzIGNvbmZpZ3VyZWQNCj4gPiArICogaW4gb3JkZXIgdG8gZ2V0IGRl dmljZSAoU1BJIE5PUiBmbGFzaCkgaW5mb3JtYXRpb24NCj4gPiArICogYXQgdGhlIGVhcmx5IHN0 YWdlLg0KPiA+ICsgKi8NCj4gPiArc3RhdGljIGludCBhc3BlZWRfc3BpX2N0cmxfaW5pdChzdHJ1 Y3QgYXNwZWVkX3NwaV9jb250cm9sbGVyDQo+ID4gKyphc3RfY3RybCkgew0KPiA+ICsJaW50IHJl dDsNCj4gPiArCXVpbnQzMl90IGNzOw0KPiA+ICsJdWludDMyX3QgdmFsOw0KPiA+ICsJdWludDMy X3QgZGVjb2RlX3N6X2FycltBU1BFRURfU1BJX01BWF9DU107DQo+ID4gKw0KPiA+ICsJLyogZW5h YmxlIHdyaXRlIGNhcGFiaWxpdHkgZm9yIGFsbCBDRXMgKi8NCj4gPiArCXZhbCA9IHJlYWRsKGFz dF9jdHJsLT5yZWdzICsgT0ZGU0VUX0NFX1RZUEVfU0VUVElORyk7DQo+ID4gKwl3cml0ZWwodmFs IHwgKEdFTk1BU0soYXN0X2N0cmwtPm51bV9jcywgMCkgPDwgMTYpLA0KPiA+ICsJICAgICAgIGFz dF9jdHJsLT5yZWdzICsgT0ZGU0VUX0NFX1RZUEVfU0VUVElORyk7DQo+ID4gKw0KPiA+ICsJLyog aW5pdGlhbCBlYWNoIENFJ3MgY29udHJvbGxlciByZWdpc3RlciAqLw0KPiA+ICsJZm9yIChjcyA9 IDA7IGNzIDwgYXN0X2N0cmwtPm51bV9jczsgY3MrKykgew0KPiA+ICsJCXZhbCA9IENUUkxfU1RP UF9BQ1RJVkUgfCBDVFJMX0lPX01PREVfVVNFUjsNCj4gPiArCQl3cml0ZWwodmFsLCBhc3RfY3Ry bC0+cmVncyArIE9GRlNFVF9DRTBfQ1RSTF9SRUcgKyBjcyAqIDQpOw0KPiA+ICsJCWFzdF9jdHJs LT5jaGlwc1tjc10uY3RybF92YWxbQVNQRUVEX1NQSV9CQVNFXSA9IHZhbDsNCj4gPiArCX0NCj4g PiArDQo+ID4gKwlmb3IgKGNzID0gMDsgY3MgPCBhc3RfY3RybC0+bnVtX2NzICYmIGNzIDwgQVNQ RUVEX1NQSV9NQVhfQ1M7IGNzKyspDQo+ID4gKwkJZGVjb2RlX3N6X2Fycltjc10gPSBhc3RfY3Ry bC0+aW5mby0+bWluX2RlY29kZV9zejsNCj4gPiArDQo+ID4gKwlyZXQgPSBhc3BlZWRfc3BpX2Rl Y29kZV9yYW5nZV9jb25maWcoYXN0X2N0cmwsIGRlY29kZV9zel9hcnIpOw0KPiA+ICsNCj4gPiAr CXJldHVybiByZXQ7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2Zf ZGV2aWNlX2lkIGFzcGVlZF9zcGlfbWF0Y2hlc1tdID0gew0KPiA+ICsJeyAuY29tcGF0aWJsZSA9 ICJhc3BlZWQsYXN0MjYwMC1mbWMiLCAuZGF0YSA9ICZhc3QyNjAwX3NwaV9pbmZvIH0sDQo+ID4g Kwl7IC5jb21wYXRpYmxlID0gImFzcGVlZCxhc3QyNjAwLXNwaSIsIC5kYXRhID0gJmFzdDI2MDBf c3BpX2luZm8gfSwNCj4gPiArCXsgLyogc2VudGluZWwgKi8gfQ0KPiA+ICt9Ow0KPiA+ICtNT0RV TEVfREVWSUNFX1RBQkxFKG9mLCBhc3BlZWRfc3BpX21hdGNoZXMpOw0KPiA+ICsNCj4gPiArc3Rh dGljIGludCBhc3BlZWRfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpIHsN Cj4gPiArCWludCByZXQ7DQo+ID4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2Ow0K PiA+ICsJc3RydWN0IHNwaV9jb250cm9sbGVyICpzcGlfY3RybDsNCj4gPiArCXN0cnVjdCBhc3Bl ZWRfc3BpX2NvbnRyb2xsZXIgKmFzdF9jdHJsOw0KPiA+ICsJY29uc3Qgc3RydWN0IG9mX2Rldmlj ZV9pZCAqbWF0Y2g7DQo+ID4gKwlzdHJ1Y3QgY2xrICpjbGs7DQo+ID4gKwlzdHJ1Y3QgcmVzb3Vy Y2UgKnJlczsNCj4gPiArDQo+ID4gKwlzcGlfY3RybCA9IHNwaV9hbGxvY19tYXN0ZXIoZGV2LCBz aXplb2Yoc3RydWN0IGFzcGVlZF9zcGlfY29udHJvbGxlcikpOw0KPiA+ICsJaWYgKCFzcGlfY3Ry bCkNCj4gPiArCQlyZXR1cm4gLUVOT01FTTsNCj4gPiArDQo+ID4gKwlhc3RfY3RybCA9IHNwaV9j b250cm9sbGVyX2dldF9kZXZkYXRhKHNwaV9jdHJsKTsNCj4gPiArDQo+ID4gKwltYXRjaCA9IG9m X21hdGNoX2RldmljZShhc3BlZWRfc3BpX21hdGNoZXMsIGRldik7DQo+ID4gKwlpZiAoIW1hdGNo IHx8ICFtYXRjaC0+ZGF0YSkgew0KPiA+ICsJCWRldl9lcnIoZGV2LCAibm8gY29tcGF0aWJsZSBP RiBtYXRjaFxuIik7DQo+ID4gKwkJcmV0dXJuIC1FTk9ERVY7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ ICsJYXN0X2N0cmwtPmluZm8gPSBtYXRjaC0+ZGF0YTsNCj4gPiArDQo+ID4gKwlyZXMgPSBwbGF0 Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLA0KPiA+ICsJCQkJ CSAgICJzcGlfY3RybF9yZWciKTsNCj4gPiArCWFzdF9jdHJsLT5yZWdzID0gZGV2bV9pb3JlbWFw X3Jlc291cmNlKGRldiwgcmVzKTsNCj4gPiArCWlmIChJU19FUlIoYXN0X2N0cmwtPnJlZ3MpKQ0K PiA+ICsJCXJldHVybiBQVFJfRVJSKGFzdF9jdHJsLT5yZWdzKTsNCj4gPiArDQo+ID4gKwlyZXMg PSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLA0KPiAi c3BpX21tYXAiKTsNCj4gPiArCWFzdF9jdHJsLT5haGJfYmFzZV9waHkgPSByZXMtPnN0YXJ0Ow0K PiA+ICsJYXN0X2N0cmwtPmFoYl93aW5kb3dfc3ogPSByZXNvdXJjZV9zaXplKHJlcyk7DQo+ID4g Kw0KPiA+ICsJYXN0X2N0cmwtPmRldiA9IGRldjsNCj4gPiArDQo+ID4gKwljbGsgPSBkZXZtX2Ns a19nZXQoJnBkZXYtPmRldiwgTlVMTCk7DQo+ID4gKwlpZiAoSVNfRVJSKGNsaykpDQo+ID4gKwkJ cmV0dXJuIFBUUl9FUlIoY2xrKTsNCj4gPiArCWFzdF9jdHJsLT5haGJfY2xrID0gY2xrX2dldF9y YXRlKGNsayk7DQo+ID4gKwlkZXZtX2Nsa19wdXQoJnBkZXYtPmRldiwgY2xrKTsNCj4gPiArDQo+ ID4gKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCAibnVtLWNzIiwgJmFz dF9jdHJsLT5udW1fY3MpKSB7DQo+ID4gKwkJZGV2X2VycihkZXYsICJmYWlsIHRvIGdldCBjaGlw IG51bWJlci5cbiIpOw0KPiA+ICsJCWdvdG8gZW5kOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCWlm IChhc3RfY3RybC0+bnVtX2NzID4gQVNQRUVEX1NQSV9NQVhfQ1MpIHsNCj4gPiArCQlkZXZfZXJy KGRldiwgImNoaXAgbnVtYmVyLCAlZCwgZXhjZWVkcyAlZC5cbiIsIGFzdF9jdHJsLT5udW1fY3Ms DQo+ID4gKwkJCUFTUEVFRF9TUElfTUFYX0NTKTsNCj4gPiArCQlnb3RvIGVuZDsNCj4gPiArCX0N Cj4gPiArDQo+ID4gKwlhc3RfY3RybC0+Y2hpcHMgPQ0KPiA+ICsJCWRldm1fa3phbGxvYyhkZXYs DQo+ID4gKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBhc3BlZWRfc3BpX2NoaXApICogYXN0X2N0cmwt Pm51bV9jcywNCj4gPiArCQkJICAgICBHRlBfS0VSTkVMKTsNCj4gPiArDQo+ID4gKwlwbGF0Zm9y bV9zZXRfZHJ2ZGF0YShwZGV2LCBhc3RfY3RybCk7DQo+ID4gKw0KPiA+ICsJc3BpX2N0cmwtPm1v ZGVfYml0cyA9DQo+ID4gKwkJU1BJX1JYX0RVQUwgfCBTUElfUlhfUVVBRCB8IFNQSV9UWF9EVUFM IHwgU1BJX1RYX1FVQUQ7DQo+ID4gKw0KPiA+ICsJc3BpX2N0cmwtPmJ1c19udW0gPSAtMTsNCj4g PiArCXNwaV9jdHJsLT5tZW1fb3BzID0gJmFzcGVlZF9zcGlfbWVtX29wczsNCj4gPiArCXNwaV9j dHJsLT5kZXYub2Zfbm9kZSA9IGRldi0+b2Zfbm9kZTsNCj4gPiArCXNwaV9jdHJsLT5udW1fY2hp cHNlbGVjdCA9IGFzdF9jdHJsLT5udW1fY3M7DQo+ID4gKw0KPiA+ICsJcmV0ID0gYXNwZWVkX3Nw aV9jdHJsX2luaXQoYXN0X2N0cmwpOw0KPiA+ICsJaWYgKHJldCkNCj4gPiArCQlnb3RvIGVuZDsN Cj4gPiArDQo+ID4gKwlyZXQgPSBkZXZtX3NwaV9yZWdpc3Rlcl9tYXN0ZXIoZGV2LCBzcGlfY3Ry bCk7DQo+ID4gKw0KPiA+ICtlbmQ6DQo+ID4gKwlyZXR1cm4gcmV0Ow0KPiA+ICt9DQo+ID4gKw0K PiA+ICtzdGF0aWMgaW50IGFzcGVlZF9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ug KnBkZXYpIHsNCj4gPiArCXN0cnVjdCBhc3BlZWRfc3BpX2NvbnRyb2xsZXIgKmFzdF9jdHJsID0g cGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7DQo+ID4gKwl1aW50MzJfdCB2YWw7DQo+ID4gKw0K PiA+ICsJLyogZGlzYWJsZSB3cml0ZSBjYXBhYmlsaXR5IGZvciBhbGwgQ0VzICovDQo+ID4gKwl2 YWwgPSByZWFkbChhc3RfY3RybC0+cmVncyArIE9GRlNFVF9DRV9UWVBFX1NFVFRJTkcpOw0KPiA+ ICsJd3JpdGVsKHZhbCAmIH4oR0VOTUFTSyhhc3RfY3RybC0+bnVtX2NzLCAwKSA8PCAxNiksDQo+ ID4gKwkgICAgICAgYXN0X2N0cmwtPnJlZ3MgKyBPRkZTRVRfQ0VfVFlQRV9TRVRUSU5HKTsNCj4g PiArDQo+ID4gKwlyZXR1cm4gMDsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIHN0cnVjdCBw bGF0Zm9ybV9kcml2ZXIgYXNwZWVkX3NwaV9kcml2ZXIgPSB7DQo+ID4gKwkuZHJpdmVyID0gew0K PiA+ICsJCS5uYW1lID0gIkFTUEVFRF9GTUNfU1BJIiwNCj4gPiArCQkuYnVzID0gJnBsYXRmb3Jt X2J1c190eXBlLA0KPiA+ICsJCS5vZl9tYXRjaF90YWJsZSA9IGFzcGVlZF9zcGlfbWF0Y2hlcywN Cj4gPiArCX0sDQo+ID4gKwkucHJvYmUgPSBhc3BlZWRfc3BpX3Byb2JlLA0KPiA+ICsJLnJlbW92 ZSA9IGFzcGVlZF9zcGlfcmVtb3ZlLA0KPiA+ICt9Ow0KPiA+ICttb2R1bGVfcGxhdGZvcm1fZHJp dmVyKGFzcGVlZF9zcGlfZHJpdmVyKTsNCj4gPiArDQo+ID4gK01PRFVMRV9ERVNDUklQVElPTigi QVNQRUVEIEZNQy9TUEkgTWVtb3J5IENvbnRyb2xsZXIgRHJpdmVyIik7DQo+ID4gK01PRFVMRV9B VVRIT1IoIkNoaW4tVGluZyBLdW8gPGNoaW4tdGluZ19rdW9AYXNwZWVkdGVjaC5jb20+Iik7DQo+ ID4gK01PRFVMRV9BVVRIT1IoIkNlZHJpYyBMZSBHb2F0ZXIgPGNsZ0BrYW9kLm9yZz4iKTsNCj4g TU9EVUxFX0xJQ0VOU0UoIkdQTA0KPiA+ICt2MiIpOw0KPiA+DQoNCg==