From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <akhil.goyal@nxp.com>
Received: from EUR02-HE1-obe.outbound.protection.outlook.com
 (mail-eopbgr10077.outbound.protection.outlook.com [40.107.1.77])
 by dpdk.org (Postfix) with ESMTP id EFD551B5E1
 for <dev@dpdk.org>; Wed, 19 Dec 2018 16:32:15 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; 
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=PeC8HeLusPHyvhoQpPQxBIS4HOPrI6zZd96nga3NE+M=;
 b=vdQr/5COIVxVNH9emRIqNjM/HzAGsx+Jp2Xkf3WLMWv2Q+oaKXN0WOwvc6FSkrWPyu2VxcOyF7aiU/uL4LC7ORHpTdbksZ48UbBv/WF1uvE4nqzkJFs0CcJQO4lyceAvPhoIGSRl6BN6kI9RzYD5n/EndQHCLtACHQgBze1XVMc=
Received: from VI1PR04MB4893.eurprd04.prod.outlook.com (20.177.49.154) by
 VI1PR04MB1549.eurprd04.prod.outlook.com (10.164.84.23) with Microsoft SMTP
 Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
 15.20.1446.19; Wed, 19 Dec 2018 15:32:13 +0000
Received: from VI1PR04MB4893.eurprd04.prod.outlook.com
 ([fe80::7dc4:610b:d0c1:146b]) by VI1PR04MB4893.eurprd04.prod.outlook.com
 ([fe80::7dc4:610b:d0c1:146b%4]) with mapi id 15.20.1446.018; Wed, 19 Dec 2018
 15:32:13 +0000
From: Akhil Goyal <akhil.goyal@nxp.com>
To: Konstantin Ananyev <konstantin.ananyev@intel.com>, "dev@dpdk.org"
 <dev@dpdk.org>
CC: Thomas Monjalon <thomas@monjalon.net>, Mohammad Abdul Awal
 <mohammad.abdul.awal@intel.com>
Thread-Topic: [dpdk-dev] [PATCH v4 06/10] ipsec: implement SA data-path API
Thread-Index: AQHUk8l2jP/G8oUcr0SNuYp6NUBDraWGOGsA
Date: Wed, 19 Dec 2018 15:32:13 +0000
Message-ID: <c627d8d1-fa0f-697f-7231-71d1c10ca356@nxp.com>
References: <1544110714-4514-2-git-send-email-konstantin.ananyev@intel.com>
 <1544804589-10338-6-git-send-email-konstantin.ananyev@intel.com>
In-Reply-To: <1544804589-10338-6-git-send-email-konstantin.ananyev@intel.com>
Accept-Language: en-IN, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
x-clientproxiedby: BM1PR01CA0084.INDPRD01.PROD.OUTLOOK.COM
 (2603:1096:b00:1::24) To VI1PR04MB4893.eurprd04.prod.outlook.com
 (2603:10a6:803:56::26)
authentication-results: spf=none (sender IP is )
 smtp.mailfrom=akhil.goyal@nxp.com; 
x-ms-exchange-messagesentrepresentingtype: 1
x-originating-ip: [14.143.30.134]
x-ms-publictraffictype: Email
x-microsoft-exchange-diagnostics: 1; VI1PR04MB1549;
 6:WVZ0qY4zNvWZRjYQORP9vK5KlUoyala7oi6a3TVl/gVJtZ83DevJx350UrfwP4wasZ3CSkt7w1gKxwaATH7JAuIWX0iDG+o2V+Ule5HUaeSKv1Arw6B7XnRMPhTxG/Qwjb9JtUVR1zVb3vSU0XiHZh8vdfF6HsMUgsze68G9BMg5W1LVE6Ah1DP3xXciM6YfD9UnqKq7fzHoPSWxoqmdgVoJtqGzSNb76ihp3E8mefa32Mzoux26NKGdy3c7sUOmaaSPw+LxOEyFvbbVILKmRCEGKqH7kqke6e7K7iIobkyCvqiKePrbG8PMLnDQhdb4rPnjaoEpP1yCNEv43jGRb89B9B2xuCoRGwK2uS2vAMaEzk5gxxcuLGYg7BuWHxzLC8MrEq9S/8UTn5SNYcIeK3vc4eEdzihiQGT2OT8HrbfPy7YFuXTbvmNcIeYWg51D7OpJwcBs3uAsllHY3hZGyg==;
 5:dQmV4fyox26V9aJhunZMzMOOH3BbRQcWqFE0TEx2IzwjkCE906KIlPTfYsR59O836034Y1S4zo8uPbVZP+z0LYRBEXI8yWgADzng9+9ipbUZY0BwGreiBzM/LpQcpKogD48ak4kr205LNCTEvukt30nGMjDXiAtJokYAhDoi0do=;
 7:wM/Wk9RQ4H16Pwd8FVTlofaZkewY2DMJaFqmgRhOLZzBbHk4jk5QMpf8tb1fzYjZPzCuxIgtJvTGRijn9dPrjf5c2dORDO3BZVVnHwOvY6bNoofU0Y767sLSnAGec1Qf+D4JlIHxYgEsCZeG1iBR+Q==
x-ms-office365-filtering-correlation-id: f6a46c39-385e-4e82-7eaa-08d665c725ae
x-ms-office365-filtering-ht: Tenant
x-microsoft-antispam: BCL:0; PCL:0;
 RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(7168020)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020);
 SRVR:VI1PR04MB1549; 
x-ms-traffictypediagnostic: VI1PR04MB1549:
x-microsoft-antispam-prvs: <VI1PR04MB1549BC67CF64DBC0B162FA05E6BE0@VI1PR04MB1549.eurprd04.prod.outlook.com>
x-ms-exchange-senderadcheck: 1
x-exchange-antispam-report-cfa-test: BCL:0; PCL:0;
 RULEID:(8211001083)(3230021)(999002)(5005020)(6040522)(2401047)(8121501046)(3002001)(10201501046)(93006095)(93001095)(3231475)(944501520)(52105112)(6055026)(148016)(149066)(150057)(6041310)(20161123558120)(20161123564045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(201708071742011)(7699051)(76991095);
 SRVR:VI1PR04MB1549; BCL:0; PCL:0; RULEID:; SRVR:VI1PR04MB1549; 
x-forefront-prvs: 0891BC3F3D
x-forefront-antispam-report: SFV:NSPM;
 SFS:(10009020)(39860400002)(376002)(346002)(366004)(396003)(136003)(199004)(189003)(99286004)(31686004)(256004)(14444005)(106356001)(5024004)(2906002)(105586002)(5660300001)(316002)(25786009)(54906003)(110136005)(71200400001)(68736007)(71190400001)(4744004)(14454004)(78486014)(11346002)(478600001)(36756003)(4326008)(86362001)(229853002)(305945005)(76176011)(446003)(186003)(66066001)(8676002)(486006)(2501003)(6436002)(6246003)(6486002)(476003)(31696002)(7736002)(8936002)(2616005)(53546011)(6506007)(386003)(3846002)(53946003)(44832011)(55236004)(26005)(6512007)(97736004)(53936002)(81156014)(52116002)(102836004)(81166006)(6116002)(569006);
 DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR04MB1549;
 H:VI1PR04MB4893.eurprd04.prod.outlook.com; FPR:; SPF:None; LANG:en;
 PTR:InfoNoRecords; A:1; MX:1; 
received-spf: None (protection.outlook.com: nxp.com does not designate
 permitted sender hosts)
x-microsoft-antispam-message-info: fz5IAk/9aa4rsGn0pukQlBTIbiyYQmSZnf21wuUad4Rc6wTTCWT3uO8Lw+fnq6rJZNB5WqBFI6uG2odB5U4oFkEzW5j8dASW38AGsdZQkHoguH+oUnfE8Kij7unHdw081SVE6le6EpB0+JoGvTQLKHUGZL0PudMAqgc8oPQ+lqQ9gDjypbCW+zrPOk1nY4mwGNp3x9v8H2jfBLGONTNMkgcePybfF+Ck6atzQR3i+o7VdcYdTFo225c9+qGIZvVfCI69v0H37H8Pv1yjQS5/Bxp+QpunXsg2K4Z9hXZXqaROdLcwbZoDEq2XZaa/T28C
spamdiagnosticoutput: 1:99
spamdiagnosticmetadata: NSPM
Content-Type: text/plain; charset="utf-8"
Content-ID: <0C68793B3108504CAA798818FE56761B@eurprd04.prod.outlook.com>
Content-Transfer-Encoding: base64
MIME-Version: 1.0
X-OriginatorOrg: nxp.com
X-MS-Exchange-CrossTenant-Network-Message-Id: f6a46c39-385e-4e82-7eaa-08d665c725ae
X-MS-Exchange-CrossTenant-originalarrivaltime: 19 Dec 2018 15:32:13.2909 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635
X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR04MB1549
Subject: Re: [dpdk-dev] [PATCH v4 06/10] ipsec: implement SA data-path API
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Wed, 19 Dec 2018 15:32:16 -0000

DQoNCk9uIDEyLzE0LzIwMTggOTo1MyBQTSwgS29uc3RhbnRpbiBBbmFueWV2IHdyb3RlOg0KPiBQ
cm92aWRlIGltcGxlbWVudGF0aW9uIGZvciBydGVfaXBzZWNfcGt0X2NyeXB0b19wcmVwYXJlKCkg
YW5kDQo+IHJ0ZV9pcHNlY19wa3RfcHJvY2VzcygpLg0KPiBDdXJyZW50IGltcGxlbWVudGF0aW9u
Og0KPiAgIC0gc3VwcG9ydHMgRVNQIHByb3RvY29sIHR1bm5lbCBtb2RlLg0KPiAgIC0gc3VwcG9y
dHMgRVNQIHByb3RvY29sIHRyYW5zcG9ydCBtb2RlLg0KPiAgIC0gc3VwcG9ydHMgRVNOIGFuZCBy
ZXBsYXkgd2luZG93Lg0KPiAgIC0gc3VwcG9ydHMgYWxnb3JpdGhtczogQUVTLUNCQywgQUVTLUdD
TSwgSE1BQy1TSEExLCBOVUxMLg0KPiAgIC0gY292ZXJzIGFsbCBjdXJyZW50bHkgZGVmaW5lZCBz
ZWN1cml0eSBzZXNzaW9uIHR5cGVzOg0KPiAgICAgICAgICAtIFJURV9TRUNVUklUWV9BQ1RJT05f
VFlQRV9OT05FDQo+ICAgICAgICAgIC0gUlRFX1NFQ1VSSVRZX0FDVElPTl9UWVBFX0lOTElORV9D
UllQVE8NCj4gICAgICAgICAgLSBSVEVfU0VDVVJJVFlfQUNUSU9OX1RZUEVfSU5MSU5FX1BST1RP
Q09MDQo+ICAgICAgICAgIC0gUlRFX1NFQ1VSSVRZX0FDVElPTl9UWVBFX0xPT0tBU0lERV9QUk9U
T0NPTA0KPg0KPiBGb3IgZmlyc3QgdHdvIHR5cGVzIFNRTiBjaGVjay91cGRhdGUgaXMgZG9uZSBi
eSBTVyAoaW5zaWRlIHRoZSBsaWJyYXJ5KS4NCj4gRm9yIGxhc3QgdHdvIHR5cGUgaXQgaXMgSFcv
UE1EIHJlc3BvbnNpYmlsaXR5Lg0KPg0KPiBTaWduZWQtb2ZmLWJ5OiBNb2hhbW1hZCBBYmR1bCBB
d2FsIDxtb2hhbW1hZC5hYmR1bC5hd2FsQGludGVsLmNvbT4NCj4gU2lnbmVkLW9mZi1ieTogS29u
c3RhbnRpbiBBbmFueWV2IDxrb25zdGFudGluLmFuYW55ZXZAaW50ZWwuY29tPg0KPiBBY2tlZC1i
eTogRGVjbGFuIERvaGVydHkgPGRlY2xhbi5kb2hlcnR5QGludGVsLmNvbT4NCj4gLS0tDQo+ICAg
bGliL2xpYnJ0ZV9pcHNlYy9jcnlwdG8uaCAgICB8ICAxMjMgKysrKw0KPiAgIGxpYi9saWJydGVf
aXBzZWMvaXBoLmggICAgICAgfCAgIDg0ICsrKw0KPiAgIGxpYi9saWJydGVfaXBzZWMvaXBzZWNf
c3FuLmggfCAgMTg2ICsrKysrKw0KPiAgIGxpYi9saWJydGVfaXBzZWMvcGFkLmggICAgICAgfCAg
IDQ1ICsrDQo+ICAgbGliL2xpYnJ0ZV9pcHNlYy9zYS5jICAgICAgICB8IDEwNDQgKysrKysrKysr
KysrKysrKysrKysrKysrKysrKysrKysrLQ0KPiAgIDUgZmlsZXMgY2hhbmdlZCwgMTQ4MCBpbnNl
cnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQ0KPiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvbGli
cnRlX2lwc2VjL2NyeXB0by5oDQo+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYi9saWJydGVfaXBz
ZWMvaXBoLmgNCj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgbGliL2xpYnJ0ZV9pcHNlYy9wYWQuaA0K
Pg0KPiBkaWZmIC0tZ2l0IGEvbGliL2xpYnJ0ZV9pcHNlYy9jcnlwdG8uaCBiL2xpYi9saWJydGVf
aXBzZWMvY3J5cHRvLmgNCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4gaW5kZXggMDAwMDAwMDAw
Li42MWY1YzE0MzMNCj4gLS0tIC9kZXYvbnVsbA0KPiArKysgYi9saWIvbGlicnRlX2lwc2VjL2Ny
eXB0by5oDQo+IEBAIC0wLDAgKzEsMTIzIEBADQo+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmll
cjogQlNELTMtQ2xhdXNlDQo+ICsgKiBDb3B5cmlnaHQoYykgMjAxOCBJbnRlbCBDb3Jwb3JhdGlv
bg0KPiArICovDQo+ICsNCj4gKyNpZm5kZWYgX0NSWVBUT19IXw0KPiArI2RlZmluZSBfQ1JZUFRP
X0hfDQo+ICsNCj4gKy8qKg0KPiArICogQGZpbGUgY3J5cHRvLmgNCj4gKyAqIENvbnRhaW5zIGNy
eXB0byBzcGVjaWZpYyBmdW5jdGlvbnMvc3RydWN0dXJlcy9tYWNyb3MgdXNlZCBpbnRlcm5hbGx5
DQo+ICsgKiBieSBpcHNlYyBsaWJyYXJ5Lg0KPiArICovDQo+ICsNCj4gKyAvKg0KPiArICAqIEFF
Uy1HQ00gZGV2aWNlcyBoYXZlIHNvbWUgc3BlY2lmaWMgcmVxdWlyZW1lbnRzIGZvciBJViBhbmQg
QUFEIGZvcm1hdHMuDQo+ICsgICogSWRlYWxseSB0aGF0IHRvIGJlIGRvbmUgYnkgdGhlIGRyaXZl
ciBpdHNlbGYuDQo+ICsgICovDQpJIGJlbGlldmUgdGhlc2UgY2FuIGJlIG1vdmVkIHRvIHJ0ZV9j
cnlwdG9fc3ltLmguIEFsbCBjcnlwdG8gcmVsYXRlZCANCnN0dWZmIHNob3VsZCBiZSBhdCBzYW1l
IHBsYWNlLg0KPiArDQo+ICtzdHJ1Y3QgYWVhZF9nY21faXYgew0KPiArCXVpbnQzMl90IHNhbHQ7
DQo+ICsJdWludDY0X3QgaXY7DQo+ICsJdWludDMyX3QgY250Ow0KPiArfSBfX2F0dHJpYnV0ZV9f
KChwYWNrZWQpKTsNCj4gKw0KPiArc3RydWN0IGFlYWRfZ2NtX2FhZCB7DQo+ICsJdWludDMyX3Qg
c3BpOw0KPiArCS8qDQo+ICsJICogUkZDIDQxMDYsIHNlY3Rpb24gNToNCj4gKwkgKiBUd28gZm9y
bWF0cyBvZiB0aGUgQUFEIGFyZSBkZWZpbmVkOg0KPiArCSAqIG9uZSBmb3IgMzItYml0IHNlcXVl
bmNlIG51bWJlcnMsIGFuZCBvbmUgZm9yIDY0LWJpdCBFU04uDQo+ICsJICovDQo+ICsJdW5pb24g
ew0KPiArCQl1aW50MzJfdCB1MzJbMl07DQo+ICsJCXVpbnQ2NF90IHU2NDsNCj4gKwl9IHNxbjsN
Cj4gKwl1aW50MzJfdCBhbGlnbjA7IC8qIGFsaWduIHRvIDE2QiBib3VuZGFyeSAqLw0KPiArfSBf
X2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsNCj4gKw0KPiArc3RydWN0IGdjbV9lc3BoX2l2IHsNCj4g
KwlzdHJ1Y3QgZXNwX2hkciBlc3BoOw0KPiArCXVpbnQ2NF90IGl2Ow0KPiArfSBfX2F0dHJpYnV0
ZV9fKChwYWNrZWQpKTsNCj4gKw0KPiArDQo+ICtzdGF0aWMgaW5saW5lIHZvaWQNCj4gK2FlYWRf
Z2NtX2l2X2ZpbGwoc3RydWN0IGFlYWRfZ2NtX2l2ICpnY20sIHVpbnQ2NF90IGl2LCB1aW50MzJf
dCBzYWx0KQ0KPiArew0KPiArCWdjbS0+c2FsdCA9IHNhbHQ7DQo+ICsJZ2NtLT5pdiA9IGl2Ow0K
PiArCWdjbS0+Y250ID0gcnRlX2NwdV90b19iZV8zMigxKTsNCj4gK30NCj4gKw0KPiArLyoNCj4g
KyAqIFJGQyA0MTA2LCA1IEFBRCBDb25zdHJ1Y3Rpb24NCj4gKyAqIHNwaSBhbmQgc3FuIHNob3Vs
ZCBhbHJlYWR5IGJlIGNvbnZlcnRlZCBpbnRvIG5ldHdvcmsgYnl0ZSBvcmRlci4NCj4gKyAqIE1h
a2Ugc3VyZSB0aGF0IG5vdCB1c2VkIGJ5dGVzIGFyZSB6ZXJvZWQuDQo+ICsgKi8NCj4gK3N0YXRp
YyBpbmxpbmUgdm9pZA0KPiArYWVhZF9nY21fYWFkX2ZpbGwoc3RydWN0IGFlYWRfZ2NtX2FhZCAq
YWFkLCBydGVfYmUzMl90IHNwaSwgcnRlX2JlNjRfdCBzcW4sDQo+ICsJaW50IGVzbikNCj4gK3sN
Cj4gKwlhYWQtPnNwaSA9IHNwaTsNCj4gKwlpZiAoZXNuKQ0KPiArCQlhYWQtPnNxbi51NjQgPSBz
cW47DQo+ICsJZWxzZSB7DQo+ICsJCWFhZC0+c3FuLnUzMlswXSA9IHNxbl9sb3czMihzcW4pOw0K
PiArCQlhYWQtPnNxbi51MzJbMV0gPSAwOw0KPiArCX0NCj4gKwlhYWQtPmFsaWduMCA9IDA7DQo+
ICt9DQo+ICsNCj4gK3N0YXRpYyBpbmxpbmUgdm9pZA0KPiArZ2VuX2l2KHVpbnQ2NF90IGl2W0lQ
U0VDX01BWF9JVl9RV09SRF0sIHJ0ZV9iZTY0X3Qgc3FuKQ0KPiArew0KPiArCWl2WzBdID0gc3Fu
Ow0KPiArCWl2WzFdID0gMDsNCj4gK30NCj4gKw0KPiArLyoNCj4gKyAqIGZyb20gUkZDIDQzMDMg
My4zLjIuMS40Og0KPiArICogSWYgdGhlIEVTTiBvcHRpb24gaXMgZW5hYmxlZCBmb3IgdGhlIFNB
LCB0aGUgaGlnaC1vcmRlciAzMg0KPiArICogYml0cyBvZiB0aGUgc2VxdWVuY2UgbnVtYmVyIGFy
ZSBhcHBlbmRlZCBhZnRlciB0aGUgTmV4dCBIZWFkZXIgZmllbGQNCj4gKyAqIGZvciBwdXJwb3Nl
cyBvZiB0aGlzIGNvbXB1dGF0aW9uLCBidXQgYXJlIG5vdCB0cmFuc21pdHRlZC4NCj4gKyAqLw0K
PiArDQo+ICsvKg0KPiArICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgbW92ZXMgSUNWIGJ5IDRCIGJl
bG93LCBhbmQgaW5zZXJ0cyBTUU4uaGliaXRzLg0KPiArICogaWN2IHBhcmFtZXRlciBwb2ludHMg
dG8gdGhlIG5ldyBzdGFydCBvZiBJQ1YuDQo+ICsgKi8NCj4gK3N0YXRpYyBpbmxpbmUgdm9pZA0K
PiAraW5zZXJ0X3NxaCh1aW50MzJfdCBzcWgsIHZvaWQgKnBpY3YsIHVpbnQzMl90IGljdl9sZW4p
DQo+ICt7DQo+ICsJdWludDMyX3QgKmljdjsNCj4gKwlpbnQzMl90IGk7DQo+ICsNCj4gKwlSVEVf
QVNTRVJUKGljdl9sZW4gJSBzaXplb2YodWludDMyX3QpID09IDApOw0KPiArDQo+ICsJaWN2ID0g
cGljdjsNCj4gKwlpY3ZfbGVuID0gaWN2X2xlbiAvIHNpemVvZih1aW50MzJfdCk7DQo+ICsJZm9y
IChpID0gaWN2X2xlbjsgaS0tICE9IDA7IGljdltpXSA9IGljdltpIC0gMV0pDQo+ICsJCTsNCj4g
Kw0KPiArCWljdltpXSA9IHNxaDsNCj4gK30NCj4gKw0KPiArLyoNCj4gKyAqIEhlbHBlciBmdW5j
dGlvbiB0aGF0IG1vdmVzIElDViBieSA0QiB1cCwgYW5kIHJlbW92ZXMgU1FOLmhpYml0cy4NCj4g
KyAqIGljdiBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSBuZXcgc3RhcnQgb2YgSUNWLg0KPiArICov
DQo+ICtzdGF0aWMgaW5saW5lIHZvaWQNCj4gK3JlbW92ZV9zcWgodm9pZCAqcGljdiwgdWludDMy
X3QgaWN2X2xlbikNCj4gK3sNCj4gKwl1aW50MzJfdCBpLCAqaWN2Ow0KPiArDQo+ICsJUlRFX0FT
U0VSVChpY3ZfbGVuICUgc2l6ZW9mKHVpbnQzMl90KSA9PSAwKTsNCj4gKw0KPiArCWljdiA9IHBp
Y3Y7DQo+ICsJaWN2X2xlbiA9IGljdl9sZW4gLyBzaXplb2YodWludDMyX3QpOw0KPiArCWZvciAo
aSA9IDA7IGkgIT0gaWN2X2xlbjsgaSsrKQ0KPiArCQlpY3ZbaV0gPSBpY3ZbaSArIDFdOw0KPiAr
fQ0KPiArDQo+ICsjZW5kaWYgLyogX0NSWVBUT19IXyAqLw0KPiBkaWZmIC0tZ2l0IGEvbGliL2xp
YnJ0ZV9pcHNlYy9pcGguaCBiL2xpYi9saWJydGVfaXBzZWMvaXBoLmgNCj4gbmV3IGZpbGUgbW9k
ZSAxMDA2NDQNCj4gaW5kZXggMDAwMDAwMDAwLi4zZmQ5MzAxNmQNCj4gLS0tIC9kZXYvbnVsbA0K
PiArKysgYi9saWIvbGlicnRlX2lwc2VjL2lwaC5oDQo+IEBAIC0wLDAgKzEsODQgQEANCj4gKy8q
IFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UNCj4gKyAqIENvcHlyaWdodChj
KSAyMDE4IEludGVsIENvcnBvcmF0aW9uDQo+ICsgKi8NCj4gKw0KPiArI2lmbmRlZiBfSVBIX0hf
DQo+ICsjZGVmaW5lIF9JUEhfSF8NCj4gKw0KPiArLyoqDQo+ICsgKiBAZmlsZSBpcGguaA0KPiAr
ICogQ29udGFpbnMgZnVuY3Rpb25zL3N0cnVjdHVyZXMvbWFjcm9zIHRvIG1hbmlwdWxhdGUgSVB2
L0lQdjYgaGVhZGVycw0KSVB2NA0KPiArICogdXNlZCBpbnRlcm5hbGx5IGJ5IGlwc2VjIGxpYnJh
cnkuDQo+ICsgKi8NCj4gKw0KPiArLyoNCj4gKyAqIE1vdmUgcHJlY2VkaW5nIChMMykgaGVhZGVy
cyBkb3duIHRvIHJlbW92ZSBFU1AgaGVhZGVyIGFuZCBJVi4NCj4gKyAqLw0Kd2h5IGNhbnQgd2Ug
dXNlIHJ0ZV9tYnVmIEFQSXMgdG8gYXBwZW5kL3ByZXBlbmQvdHJpbS9hZGp1c3QgbGVuZ3Rocy4N
CkkgYmVsaWV2ZSB0aGVzZSBhZGp1c3RtZW50cyBhcmUgaGFwcGVuaW5nIGluIHRoZSBtYnVmIGl0
c2VsZi4NCk1vcmVvdmVyIHRoZXNlIEFQSXMgYXJlIG5vdCBzcGVjaWZpYyB0byBlc3AgaGVhZGVy
cy4NCj4gK3N0YXRpYyBpbmxpbmUgdm9pZA0KPiArcmVtb3ZlX2VzcGgoY2hhciAqbnAsIGNoYXIg
Km9wLCB1aW50MzJfdCBobGVuKQ0KPiArew0KPiArCXVpbnQzMl90IGk7DQo+ICsNCj4gKwlmb3Ig
KGkgPSBobGVuOyBpLS0gIT0gMDsgbnBbaV0gPSBvcFtpXSkNCj4gKwkJOw0KPiArfQ0KPiArDQo+
ICsvKg0KPiArICogTW92ZSBwcmVjZWRpbmcgKEwzKSBoZWFkZXJzIHVwIHRvIGZyZWUgc3BhY2Ug
Zm9yIEVTUCBoZWFkZXIgYW5kIElWLg0KPiArICovDQo+ICtzdGF0aWMgaW5saW5lIHZvaWQNCj4g
K2luc2VydF9lc3BoKGNoYXIgKm5wLCBjaGFyICpvcCwgdWludDMyX3QgaGxlbikNCj4gK3sNCj4g
Kwl1aW50MzJfdCBpOw0KPiArDQo+ICsJZm9yIChpID0gMDsgaSAhPSBobGVuOyBpKyspDQo+ICsJ
CW5wW2ldID0gb3BbaV07DQo+ICt9DQo+ICsNCj4gKy8qIHVwZGF0ZSBvcmlnaW5hbCBpcCBoZWFk
ZXIgZmllbGRzIGZvciB0cmFzbnBvcnQgY2FzZSAqLw0Kc3BlbGwgY2hlY2sNCj4gK3N0YXRpYyBp
bmxpbmUgaW50DQo+ICt1cGRhdGVfdHJzX2wzaGRyKGNvbnN0IHN0cnVjdCBydGVfaXBzZWNfc2Eg
KnNhLCB2b2lkICpwLCB1aW50MzJfdCBwbGVuLA0KPiArCQl1aW50MzJfdCBsMmxlbiwgdWludDMy
X3QgbDNsZW4sIHVpbnQ4X3QgcHJvdG8pDQo+ICt7DQo+ICsJc3RydWN0IGlwdjRfaGRyICp2NGg7
DQo+ICsJc3RydWN0IGlwdjZfaGRyICp2Nmg7DQo+ICsJaW50MzJfdCByYzsNCj4gKw0KPiArCWlm
ICgoc2EtPnR5cGUgJiBSVEVfSVBTRUNfU0FUUF9JUFZfTUFTSykgPT0gUlRFX0lQU0VDX1NBVFBf
SVBWNCkgew0KPiArCQl2NGggPSBwOw0KPiArCQlyYyA9IHY0aC0+bmV4dF9wcm90b19pZDsNCj4g
KwkJdjRoLT5uZXh0X3Byb3RvX2lkID0gcHJvdG87DQo+ICsJCXY0aC0+dG90YWxfbGVuZ3RoID0g
cnRlX2NwdV90b19iZV8xNihwbGVuIC0gbDJsZW4pOw0KPiArCX0gZWxzZSBpZiAobDNsZW4gPT0g
c2l6ZW9mKCp2NmgpKSB7DQo+ICsJCXY2aCA9IHA7DQo+ICsJCXJjID0gdjZoLT5wcm90bzsNCj4g
KwkJdjZoLT5wcm90byA9IHByb3RvOw0KPiArCQl2NmgtPnBheWxvYWRfbGVuID0gcnRlX2NwdV90
b19iZV8xNihwbGVuIC0gbDJsZW4gLQ0KPiArCQkJCXNpemVvZigqdjZoKSk7DQo+ICsJLyogbmVl
ZCB0byBhZGQgc3VwcG9ydCBmb3IgSVB2NiB3aXRoIG9wdGlvbnMgKi8NCj4gKwl9IGVsc2UNCj4g
KwkJcmMgPSAtRU5PVFNVUDsNCj4gKw0KPiArCXJldHVybiByYzsNCj4gK30NCj4gKw0KPiArLyog
dXBkYXRlIG9yaWdpbmFsIGFuZCBuZXcgaXAgaGVhZGVyIGZpZWxkcyBmb3IgdHVubmVsIGNhc2Ug
Ki8NCj4gK3N0YXRpYyBpbmxpbmUgdm9pZA0KPiArdXBkYXRlX3R1bl9sM2hkcihjb25zdCBzdHJ1
Y3QgcnRlX2lwc2VjX3NhICpzYSwgdm9pZCAqcCwgdWludDMyX3QgcGxlbiwNCj4gKwkJdWludDMy
X3QgbDJsZW4sIHJ0ZV9iZTE2X3QgcGlkKQ0KPiArew0KPiArCXN0cnVjdCBpcHY0X2hkciAqdjRo
Ow0KPiArCXN0cnVjdCBpcHY2X2hkciAqdjZoOw0KPiArDQo+ICsJaWYgKHNhLT50eXBlICYgUlRF
X0lQU0VDX1NBVFBfTU9ERV9UVU5MVjQpIHsNCj4gKwkJdjRoID0gcDsNCj4gKwkJdjRoLT5wYWNr
ZXRfaWQgPSBwaWQ7DQo+ICsJCXY0aC0+dG90YWxfbGVuZ3RoID0gcnRlX2NwdV90b19iZV8xNihw
bGVuIC0gbDJsZW4pOw0Kd2hlcmUgYXJlIHdlIHVwZGF0aW5nIHRoZSByZXN0IG9mIHRoZSBmaWVs
ZHMsIGxpa2UgdHRsLCBjaGVja3N1bSwgaXAgDQphZGRyZXNzZXMsIGV0Yw0KPiArCX0gZWxzZSB7
DQo+ICsJCXY2aCA9IHA7DQo+ICsJCXY2aC0+cGF5bG9hZF9sZW4gPSBydGVfY3B1X3RvX2JlXzE2
KHBsZW4gLSBsMmxlbiAtDQo+ICsJCQkJc2l6ZW9mKCp2NmgpKTsNCj4gKwl9DQo+ICt9DQo+ICsN
Cj4gKyNlbmRpZiAvKiBfSVBIX0hfICovDQo+IGRpZmYgLS1naXQgYS9saWIvbGlicnRlX2lwc2Vj
L2lwc2VjX3Nxbi5oIGIvbGliL2xpYnJ0ZV9pcHNlYy9pcHNlY19zcW4uaA0KPiBpbmRleCAxOTM1
ZjZlMzAuLjZlMThjMzRlYiAxMDA2NDQNCj4gLS0tIGEvbGliL2xpYnJ0ZV9pcHNlYy9pcHNlY19z
cW4uaA0KPiArKysgYi9saWIvbGlicnRlX2lwc2VjL2lwc2VjX3Nxbi5oDQo+IEBAIC0xNSw2ICsx
NSw0NSBAQA0KPiAgIA0KPiAgICNkZWZpbmUgSVNfRVNOKHNhKQkoKHNhKS0+c3FuX21hc2sgPT0g
VUlOVDY0X01BWCkNCj4gICANCj4gKy8qDQo+ICsgKiBnZXRzIFNRTi5oaTMyIGJpdHMsIFNRTiBz
dXBwb3NlZCB0byBiZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuDQo+ICsgKi8NCj4gK3N0YXRpYyBp
bmxpbmUgcnRlX2JlMzJfdA0KPiArc3FuX2hpMzIocnRlX2JlNjRfdCBzcW4pDQo+ICt7DQo+ICsj
aWYgUlRFX0JZVEVfT1JERVIgPT0gUlRFX0JJR19FTkRJQU4NCj4gKwlyZXR1cm4gKHNxbiA+PiAz
Mik7DQo+ICsjZWxzZQ0KPiArCXJldHVybiBzcW47DQo+ICsjZW5kaWYNCj4gK30NCj4gKw0KPiAr
LyoNCj4gKyAqIGdldHMgU1FOLmxvdzMyIGJpdHMsIFNRTiBzdXBwb3NlZCB0byBiZSBpbiBuZXR3
b3JrIGJ5dGUgb3JkZXIuDQo+ICsgKi8NCj4gK3N0YXRpYyBpbmxpbmUgcnRlX2JlMzJfdA0KPiAr
c3FuX2xvdzMyKHJ0ZV9iZTY0X3Qgc3FuKQ0KPiArew0KPiArI2lmIFJURV9CWVRFX09SREVSID09
IFJURV9CSUdfRU5ESUFODQo+ICsJcmV0dXJuIHNxbjsNCj4gKyNlbHNlDQo+ICsJcmV0dXJuIChz
cW4gPj4gMzIpOw0KPiArI2VuZGlmDQo+ICt9DQo+ICsNCj4gKy8qDQo+ICsgKiBnZXRzIFNRTi5s
b3cxNiBiaXRzLCBTUU4gc3VwcG9zZWQgdG8gYmUgaW4gbmV0d29yayBieXRlIG9yZGVyLg0KPiAr
ICovDQo+ICtzdGF0aWMgaW5saW5lIHJ0ZV9iZTE2X3QNCj4gK3Nxbl9sb3cxNihydGVfYmU2NF90
IHNxbikNCj4gK3sNCj4gKyNpZiBSVEVfQllURV9PUkRFUiA9PSBSVEVfQklHX0VORElBTg0KPiAr
CXJldHVybiBzcW47DQo+ICsjZWxzZQ0KPiArCXJldHVybiAoc3FuID4+IDQ4KTsNCj4gKyNlbmRp
Zg0KPiArfQ0KPiArDQpzaG91bGRuJ3Qgd2UgbW92ZSB0aGVzZSBzZXEgbnVtYmVyIEFQSXMgaW4g
cnRlX2VzcC5oIGFuZCBtYWtlIHRoZW0gZ2VuZXJpYw0KPiAgIC8qDQo+ICAgICogZm9yIGdpdmVu
IHNpemUsIGNhbGN1bGF0ZSByZXF1aXJlZCBudW1iZXIgb2YgYnVja2V0cy4NCj4gICAgKi8NCj4g
QEAgLTMwLDYgKzY5LDE1MyBAQCByZXBsYXlfbnVtX2J1Y2tldCh1aW50MzJfdCB3c3opDQo+ICAg
CXJldHVybiBuYjsNCj4gICB9DQo+ICAgDQo+ICsvKg0KPiArICogQWNjb3JkaW5nIHRvIFJGQzQz
MDMgQTIuMSwgZGV0ZXJtaW5lIHRoZSBoaWdoLW9yZGVyIGJpdCBvZiBzZXF1ZW5jZSBudW1iZXIu
DQo+ICsgKiB1c2UgMzJiaXQgYXJpdGhtZXRpYyBpbnNpZGUsIHJldHVybiB1aW50NjRfdC4NCj4g
KyAqLw0KPiArc3RhdGljIGlubGluZSB1aW50NjRfdA0KPiArcmVjb25zdHJ1Y3RfZXNuKHVpbnQ2
NF90IHQsIHVpbnQzMl90IHNxbiwgdWludDMyX3QgdykNCj4gK3sNCj4gKwl1aW50MzJfdCB0aCwg
dGwsIGJsOw0KPiArDQo+ICsJdGwgPSB0Ow0KPiArCXRoID0gdCA+PiAzMjsNCj4gKwlibCA9IHRs
IC0gdyArIDE7DQo+ICsNCj4gKwkvKiBjYXNlIEE6IHdpbmRvdyBpcyB3aXRoaW4gb25lIHNlcXVl
bmNlIG51bWJlciBzdWJzcGFjZSAqLw0KPiArCWlmICh0bCA+PSAodyAtIDEpKQ0KPiArCQl0aCAr
PSAoc3FuIDwgYmwpOw0KPiArCS8qIGNhc2UgQjogd2luZG93IHNwYW5zIHR3byBzZXF1ZW5jZSBu
dW1iZXIgc3Vic3BhY2VzICovDQo+ICsJZWxzZSBpZiAodGggIT0gMCkNCj4gKwkJdGggLT0gKHNx
biA+PSBibCk7DQo+ICsNCj4gKwkvKiByZXR1cm4gY29uc3RydWN0ZWQgc2VxdWVuY2Ugd2l0aCBw
cm9wZXIgaGlnaC1vcmRlciBiaXRzICovDQo+ICsJcmV0dXJuICh1aW50NjRfdCl0aCA8PCAzMiB8
IHNxbjsNCj4gK30NCj4gKw0KPiArLyoqDQo+ICsgKiBQZXJmb3JtIHRoZSByZXBsYXkgY2hlY2tp
bmcuDQo+ICsgKg0KPiArICogc3RydWN0IHJ0ZV9pcHNlY19zYSBjb250YWlucyB0aGUgd2luZG93
IGFuZCB3aW5kb3cgcmVsYXRlZCBwYXJhbWV0ZXJzLA0KPiArICogc3VjaCBhcyB0aGUgd2luZG93
IHNpemUsIGJpdG1hc2ssIGFuZCB0aGUgbGFzdCBhY2tub3dsZWRnZWQgc2VxdWVuY2UgbnVtYmVy
Lg0KPiArICoNCj4gKyAqIEJhc2VkIG9uIFJGQyA2NDc5Lg0KPiArICogQmxvY2tzIGFyZSA2NCBi
aXRzIHVuc2lnbmVkIGludGVnZXJzDQo+ICsgKi8NCj4gK3N0YXRpYyBpbmxpbmUgaW50MzJfdA0K
PiArZXNuX2luYl9jaGVja19zcW4oY29uc3Qgc3RydWN0IHJlcGxheV9zcW4gKnJzbiwgY29uc3Qg
c3RydWN0IHJ0ZV9pcHNlY19zYSAqc2EsDQo+ICsJdWludDY0X3Qgc3FuKQ0KPiArew0KPiArCXVp
bnQzMl90IGJpdCwgYnVja2V0Ow0KPiArDQo+ICsJLyogcmVwbGF5IG5vdCBlbmFibGVkICovDQo+
ICsJaWYgKHNhLT5yZXBsYXkud2luX3N6ID09IDApDQo+ICsJCXJldHVybiAwOw0KPiArDQo+ICsJ
Lyogc2VxIGlzIGxhcmdlciB0aGFuIGxhc3RzZXEgKi8NCj4gKwlpZiAoc3FuID4gcnNuLT5zcW4p
DQo+ICsJCXJldHVybiAwOw0KPiArDQo+ICsJLyogc2VxIGlzIG91dHNpZGUgd2luZG93ICovDQo+
ICsJaWYgKHNxbiA9PSAwIHx8IHNxbiArIHNhLT5yZXBsYXkud2luX3N6IDwgcnNuLT5zcW4pDQo+
ICsJCXJldHVybiAtRUlOVkFMOw0KPiArDQo+ICsJLyogc2VxIGlzIGluc2lkZSB0aGUgd2luZG93
ICovDQo+ICsJYml0ID0gc3FuICYgV0lORE9XX0JJVF9MT0NfTUFTSzsNCj4gKwlidWNrZXQgPSAo
c3FuID4+IFdJTkRPV19CVUNLRVRfQklUUykgJiBzYS0+cmVwbGF5LmJ1Y2tldF9pbmRleF9tYXNr
Ow0KPiArDQo+ICsJLyogYWxyZWFkeSBzZWVuIHBhY2tldCAqLw0KPiArCWlmIChyc24tPndpbmRv
d1tidWNrZXRdICYgKCh1aW50NjRfdCkxIDw8IGJpdCkpDQo+ICsJCXJldHVybiAtRUlOVkFMOw0K
PiArDQo+ICsJcmV0dXJuIDA7DQo+ICt9DQo+ICsNCj4gKy8qKg0KPiArICogRm9yIG91dGJvdW5k
IFNBIHBlcmZvcm0gdGhlIHNlcXVlbmNlIG51bWJlciB1cGRhdGUuDQo+ICsgKi8NCj4gK3N0YXRp
YyBpbmxpbmUgdWludDY0X3QNCj4gK2Vzbl9vdXRiX3VwZGF0ZV9zcW4oc3RydWN0IHJ0ZV9pcHNl
Y19zYSAqc2EsIHVpbnQzMl90ICpudW0pDQo+ICt7DQo+ICsJdWludDY0X3Qgbiwgcywgc3FuOw0K
PiArDQo+ICsJbiA9ICpudW07DQo+ICsJc3FuID0gc2EtPnNxbi5vdXRiICsgbjsNCj4gKwlzYS0+
c3FuLm91dGIgPSBzcW47DQo+ICsNCj4gKwkvKiBvdmVyZmxvdyAqLw0KPiArCWlmIChzcW4gPiBz
YS0+c3FuX21hc2spIHsNCj4gKwkJcyA9IHNxbiAtIHNhLT5zcW5fbWFzazsNCj4gKwkJKm51bSA9
IChzIDwgbikgPyAgbiAtIHMgOiAwOw0KPiArCX0NCj4gKw0KPiArCXJldHVybiBzcW4gLSBuOw0K
PiArfQ0KPiArDQo+ICsvKioNCj4gKyAqIEZvciBpbmJvdW5kIFNBIHBlcmZvcm0gdGhlIHNlcXVl
bmNlIG51bWJlciBhbmQgcmVwbGF5IHdpbmRvdyB1cGRhdGUuDQo+ICsgKi8NCj4gK3N0YXRpYyBp
bmxpbmUgaW50MzJfdA0KPiArZXNuX2luYl91cGRhdGVfc3FuKHN0cnVjdCByZXBsYXlfc3FuICpy
c24sIGNvbnN0IHN0cnVjdCBydGVfaXBzZWNfc2EgKnNhLA0KPiArCXVpbnQ2NF90IHNxbikNCj4g
K3sNCj4gKwl1aW50MzJfdCBiaXQsIGJ1Y2tldCwgbGFzdF9idWNrZXQsIG5ld19idWNrZXQsIGRp
ZmYsIGk7DQo+ICsNCj4gKwkvKiByZXBsYXkgbm90IGVuYWJsZWQgKi8NCj4gKwlpZiAoc2EtPnJl
cGxheS53aW5fc3ogPT0gMCkNCj4gKwkJcmV0dXJuIDA7DQo+ICsNCj4gKwkvKiBoYW5kbGUgRVNO
ICovDQo+ICsJaWYgKElTX0VTTihzYSkpDQo+ICsJCXNxbiA9IHJlY29uc3RydWN0X2Vzbihyc24t
PnNxbiwgc3FuLCBzYS0+cmVwbGF5Lndpbl9zeik7DQo+ICsNCj4gKwkvKiBzZXEgaXMgb3V0c2lk
ZSB3aW5kb3cqLw0KPiArCWlmIChzcW4gPT0gMCB8fCBzcW4gKyBzYS0+cmVwbGF5Lndpbl9zeiA8
IHJzbi0+c3FuKQ0KPiArCQlyZXR1cm4gLUVJTlZBTDsNCj4gKw0KPiArCS8qIHVwZGF0ZSB0aGUg
Yml0ICovDQo+ICsJYnVja2V0ID0gKHNxbiA+PiBXSU5ET1dfQlVDS0VUX0JJVFMpOw0KPiArDQo+
ICsJLyogY2hlY2sgaWYgdGhlIHNlcSBpcyB3aXRoaW4gdGhlIHJhbmdlICovDQo+ICsJaWYgKHNx
biA+IHJzbi0+c3FuKSB7DQo+ICsJCWxhc3RfYnVja2V0ID0gcnNuLT5zcW4gPj4gV0lORE9XX0JV
Q0tFVF9CSVRTOw0KPiArCQlkaWZmID0gYnVja2V0IC0gbGFzdF9idWNrZXQ7DQo+ICsJCS8qIHNl
cSBpcyB3YXkgYWZ0ZXIgdGhlIHJhbmdlIG9mIFdJTkRPV19TSVpFICovDQo+ICsJCWlmIChkaWZm
ID4gc2EtPnJlcGxheS5uYl9idWNrZXQpDQo+ICsJCQlkaWZmID0gc2EtPnJlcGxheS5uYl9idWNr
ZXQ7DQo+ICsNCj4gKwkJZm9yIChpID0gMDsgaSAhPSBkaWZmOyBpKyspIHsNCj4gKwkJCW5ld19i
dWNrZXQgPSAoaSArIGxhc3RfYnVja2V0ICsgMSkgJg0KPiArCQkJCXNhLT5yZXBsYXkuYnVja2V0
X2luZGV4X21hc2s7DQo+ICsJCQlyc24tPndpbmRvd1tuZXdfYnVja2V0XSA9IDA7DQo+ICsJCX0N
Cj4gKwkJcnNuLT5zcW4gPSBzcW47DQo+ICsJfQ0KPiArDQo+ICsJYnVja2V0ICY9IHNhLT5yZXBs
YXkuYnVja2V0X2luZGV4X21hc2s7DQo+ICsJYml0ID0gKHVpbnQ2NF90KTEgPDwgKHNxbiAmIFdJ
TkRPV19CSVRfTE9DX01BU0spOw0KPiArDQo+ICsJLyogYWxyZWFkeSBzZWVuIHBhY2tldCAqLw0K
PiArCWlmIChyc24tPndpbmRvd1tidWNrZXRdICYgYml0KQ0KPiArCQlyZXR1cm4gLUVJTlZBTDsN
Cj4gKw0KPiArCXJzbi0+d2luZG93W2J1Y2tldF0gfD0gYml0Ow0KPiArCXJldHVybiAwOw0KPiAr
fQ0KPiArDQo+ICsvKioNCj4gKyAqIFRvIGFjaGlldmUgYWJpbGl0eSB0byBkbyBtdWx0aXBsZSBy
ZWFkZXJzIHNpbmdsZSB3cml0ZXIgZm9yDQo+ICsgKiBTQSByZXBsYXkgd2luZG93IGluZm9ybWF0
aW9uIGFuZCBzZXF1ZW5jZSBudW1iZXIgKFJTTikNCj4gKyAqIGJhc2ljIFJDVSBzY2hlbWEgaXMg
dXNlZDoNCj4gKyAqIFNBIGhhdmUgMiBjb3BpZXMgb2YgUlNOIChvbmUgZm9yIHJlYWRlcnMsIGFu
b3RoZXIgZm9yIHdyaXRlcnMpLg0KPiArICogRWFjaCBSU04gY29udGFpbnMgYSByd2xvY2sgdGhh
dCBoYXMgdG8gYmUgZ3JhYmJlZCAoZm9yIHJlYWQvd3JpdGUpDQo+ICsgKiB0byBhdm9pZCByYWNl
cyBiZXR3ZWVuIHJlYWRlcnMgYW5kIHdyaXRlci4NCj4gKyAqIFdyaXRlciBpcyByZXNwb25zaWJs
ZSB0byBtYWtlIGEgY29weSBvciByZWFkZXIgUlNOLCB1cGRhdGUgaXQNCj4gKyAqIGFuZCBtYXJr
IG5ld2x5IHVwZGF0ZWQgUlNOIGFzIHJlYWRlcnMgb25lLg0KPiArICogVGhhdCBhcHByb2FjaCBp
cyBpbnRlbmRlZCB0byBtaW5pbWl6ZSBjb250ZW50aW9uIGFuZCBjYWNoZSBzaGFyaW5nDQo+ICsg
KiBiZXR3ZWVuIHdyaXRlciBhbmQgcmVhZGVycy4NCj4gKyAqLw0KPiArDQo+ICAgLyoqDQo+ICAg
ICogQmFzZWQgb24gbnVtYmVyIG9mIGJ1Y2tldHMgY2FsY3VsYXRlZCByZXF1aXJlZCBzaXplIGZv
ciB0aGUNCj4gICAgKiBzdHJ1Y3R1cmUgdGhhdCBob2xkcyByZXBsYXkgd2luZG93IGFuZCBzZXF1
ZW5jZSBudW1iZXIgKFJTTikgaW5mb3JtYXRpb24uDQo+IGRpZmYgLS1naXQgYS9saWIvbGlicnRl
X2lwc2VjL3BhZC5oIGIvbGliL2xpYnJ0ZV9pcHNlYy9wYWQuaA0KPiBuZXcgZmlsZSBtb2RlIDEw
MDY0NA0KPiBpbmRleCAwMDAwMDAwMDAuLjJmNWNjZDAwZQ0KPiAtLS0gL2Rldi9udWxsDQo+ICsr
KyBiL2xpYi9saWJydGVfaXBzZWMvcGFkLmgNCj4gQEAgLTAsMCArMSw0NSBAQA0KPiArLyogU1BE
WC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQ0KPiArICogQ29weXJpZ2h0KGMpIDIw
MTggSW50ZWwgQ29ycG9yYXRpb24NCj4gKyAqLw0KPiArDQo+ICsjaWZuZGVmIF9QQURfSF8NCj4g
KyNkZWZpbmUgX1BBRF9IXw0KPiArDQo+ICsjZGVmaW5lIElQU0VDX01BWF9QQURfU0laRQlVSU5U
OF9NQVgNCj4gKw0KPiArc3RhdGljIGNvbnN0IHVpbnQ4X3QgZXNwX3BhZF9ieXRlc1tJUFNFQ19N
QVhfUEFEX1NJWkVdID0gew0KPiArCTEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsDQo+ICsJOSwgMTAs
IDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsDQo+ICsJMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMs
IDI0LA0KPiArCTI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwNCj4gKwkzMywgMzQsIDM1
LCAzNiwgMzcsIDM4LCAzOSwgNDAsDQo+ICsJNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4
LA0KPiArCTQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwNCj4gKwk1NywgNTgsIDU5LCA2
MCwgNjEsIDYyLCA2MywgNjQsDQo+ICsJNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLA0K
PiArCTczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwNCj4gKwk4MSwgODIsIDgzLCA4NCwg
ODUsIDg2LCA4NywgODgsDQo+ICsJODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LA0KPiAr
CTk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LA0KPiArCTEwNSwgMTA2LCAxMDcs
IDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLA0KPiArCTExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAx
MTgsIDExOSwgMTIwLA0KPiArCTEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywgMTI4
LA0KPiArCTEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LA0KPiArCTEzNywg
MTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywgMTQ0LA0KPiArCTE0NSwgMTQ2LCAxNDcsIDE0
OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLA0KPiArCTE1MywgMTU0LCAxNTUsIDE1NiwgMTU3LCAxNTgs
IDE1OSwgMTYwLA0KPiArCTE2MSwgMTYyLCAxNjMsIDE2NCwgMTY1LCAxNjYsIDE2NywgMTY4LA0K
PiArCTE2OSwgMTcwLCAxNzEsIDE3MiwgMTczLCAxNzQsIDE3NSwgMTc2LA0KPiArCTE3NywgMTc4
LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LA0KPiArCTE4NSwgMTg2LCAxODcsIDE4OCwg
MTg5LCAxOTAsIDE5MSwgMTkyLA0KPiArCTE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5
OSwgMjAwLA0KPiArCTIwMSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LA0KPiAr
CTIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLCAyMTQsIDIxNSwgMjE2LA0KPiArCTIxNywgMjE4LCAy
MTksIDIyMCwgMjIxLCAyMjIsIDIyMywgMjI0LA0KPiArCTIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5
LCAyMzAsIDIzMSwgMjMyLA0KPiArCTIzMywgMjM0LCAyMzUsIDIzNiwgMjM3LCAyMzgsIDIzOSwg
MjQwLA0KPiArCTI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ4LA0KPiArCTI0
OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwNCj4gK307DQo+ICsNCj4gKyNlbmRpZiAv
KiBfUEFEX0hfICovDQo+IGRpZmYgLS1naXQgYS9saWIvbGlicnRlX2lwc2VjL3NhLmMgYi9saWIv
bGlicnRlX2lwc2VjL3NhLmMNCj4gaW5kZXggZTRjNTM2MWU3Li5iYjU2ZjQyZWIgMTAwNjQ0DQo+
IC0tLSBhL2xpYi9saWJydGVfaXBzZWMvc2EuYw0KPiArKysgYi9saWIvbGlicnRlX2lwc2VjL3Nh
LmMNCj4gQEAgLTYsOSArNiwxMyBAQA0KPiAgICNpbmNsdWRlIDxydGVfZXNwLmg+DQo+ICAgI2lu
Y2x1ZGUgPHJ0ZV9pcC5oPg0KPiAgICNpbmNsdWRlIDxydGVfZXJybm8uaD4NCj4gKyNpbmNsdWRl
IDxydGVfY3J5cHRvZGV2Lmg+DQo+ICAgDQo+ICAgI2luY2x1ZGUgInNhLmgiDQo+ICAgI2luY2x1
ZGUgImlwc2VjX3Nxbi5oIg0KPiArI2luY2x1ZGUgImNyeXB0by5oIg0KPiArI2luY2x1ZGUgImlw
aC5oIg0KPiArI2luY2x1ZGUgInBhZC5oIg0KPiAgIA0KPiAgIC8qIHNvbWUgaGVscGVyIHN0cnVj
dHVyZXMgKi8NCj4gICBzdHJ1Y3QgY3J5cHRvX3hmb3JtIHsNCj4gQEAgLTIwNyw2ICsyMTEsNyBA
QCBlc3Bfc2FfaW5pdChzdHJ1Y3QgcnRlX2lwc2VjX3NhICpzYSwgY29uc3Qgc3RydWN0IHJ0ZV9p
cHNlY19zYV9wcm0gKnBybSwNCj4gICAJCS8qIFJGQyA0MTA2ICovDQo+ICAgCQlpZiAoY3hmLT5h
ZWFkLT5hbGdvICE9IFJURV9DUllQVE9fQUVBRF9BRVNfR0NNKQ0KPiAgIAkJCXJldHVybiAtRUlO
VkFMOw0KPiArCQlzYS0+YWFkX2xlbiA9IHNpemVvZihzdHJ1Y3QgYWVhZF9nY21fYWFkKTsNCj4g
ICAJCXNhLT5pY3ZfbGVuID0gY3hmLT5hZWFkLT5kaWdlc3RfbGVuZ3RoOw0KPiAgIAkJc2EtPml2
X29mcyA9IGN4Zi0+YWVhZC0+aXYub2Zmc2V0Ow0KPiAgIAkJc2EtPml2X2xlbiA9IHNpemVvZih1
aW50NjRfdCk7DQo+IEBAIC0zMjYsMTggKzMzMSwxMDUzIEBAIHJ0ZV9pcHNlY19zYV9pbml0KHN0
cnVjdCBydGVfaXBzZWNfc2EgKnNhLCBjb25zdCBzdHJ1Y3QgcnRlX2lwc2VjX3NhX3BybSAqcHJt
LA0KPiAgIAlyZXR1cm4gc3o7DQo+ICAgfQ0KPiAgIA0KPiArc3RhdGljIGlubGluZSB2b2lkDQo+
ICttYnVmX2J1bGtfY29weShzdHJ1Y3QgcnRlX21idWYgKmRzdFtdLCBzdHJ1Y3QgcnRlX21idWYg
KiBjb25zdCBzcmNbXSwNCj4gKwl1aW50MzJfdCBudW0pDQo+ICt7DQo+ICsJdWludDMyX3QgaTsN
Cj4gKw0KPiArCWZvciAoaSA9IDA7IGkgIT0gbnVtOyBpKyspDQo+ICsJCWRzdFtpXSA9IHNyY1tp
XTsNCj4gK30NCj4gKw0KPiArc3RhdGljIGlubGluZSB2b2lkDQo+ICtsa3NkX25vbmVfY29wX3By
ZXBhcmUoY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zZXNzaW9uICpzcywNCj4gKwlzdHJ1Y3QgcnRl
X21idWYgKm1iW10sIHN0cnVjdCBydGVfY3J5cHRvX29wICpjb3BbXSwgdWludDE2X3QgbnVtKQ0K
PiArew0KPiArCXVpbnQzMl90IGk7DQo+ICsJc3RydWN0IHJ0ZV9jcnlwdG9fc3ltX29wICpzb3A7
DQo+ICsNCj4gKwlmb3IgKGkgPSAwOyBpICE9IG51bTsgaSsrKSB7DQo+ICsJCXNvcCA9IGNvcFtp
XS0+c3ltOw0KPiArCQljb3BbaV0tPnR5cGUgPSBSVEVfQ1JZUFRPX09QX1RZUEVfU1lNTUVUUklD
Ow0KPiArCQljb3BbaV0tPnN0YXR1cyA9IFJURV9DUllQVE9fT1BfU1RBVFVTX05PVF9QUk9DRVNT
RUQ7DQo+ICsJCWNvcFtpXS0+c2Vzc190eXBlID0gUlRFX0NSWVBUT19PUF9XSVRIX1NFU1NJT047
DQo+ICsJCXNvcC0+bV9zcmMgPSBtYltpXTsNCj4gKwkJX19ydGVfY3J5cHRvX3N5bV9vcF9hdHRh
Y2hfc3ltX3Nlc3Npb24oc29wLCBzcy0+Y3J5cHRvLnNlcyk7DQo+ICsJfQ0KPiArfQ0KPiArDQo+
ICtzdGF0aWMgaW5saW5lIHZvaWQNCj4gK2VzcF9vdXRiX2NvcF9wcmVwYXJlKHN0cnVjdCBydGVf
Y3J5cHRvX29wICpjb3AsDQo+ICsJY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zYSAqc2EsIGNvbnN0
IHVpbnQ2NF90IGl2cFtJUFNFQ19NQVhfSVZfUVdPUkRdLA0KPiArCWNvbnN0IHVuaW9uIHN5bV9v
cF9kYXRhICppY3YsIHVpbnQzMl90IGhsZW4sIHVpbnQzMl90IHBsZW4pDQo+ICt7DQo+ICsJc3Ry
dWN0IHJ0ZV9jcnlwdG9fc3ltX29wICpzb3A7DQo+ICsJc3RydWN0IGFlYWRfZ2NtX2l2ICpnY207
DQo+ICsNCj4gKwkvKiBmaWxsIHN5bSBvcCBmaWVsZHMgKi8NCj4gKwlzb3AgPSBjb3AtPnN5bTsN
Cj4gKw0KPiArCS8qIEFFQUQgKEFFU19HQ00pIGNhc2UgKi8NCj4gKwlpZiAoc2EtPmFhZF9sZW4g
IT0gMCkgew0KPiArCQlzb3AtPmFlYWQuZGF0YS5vZmZzZXQgPSBzYS0+Y3RwLmNpcGhlci5vZmZz
ZXQgKyBobGVuOw0KPiArCQlzb3AtPmFlYWQuZGF0YS5sZW5ndGggPSBzYS0+Y3RwLmNpcGhlci5s
ZW5ndGggKyBwbGVuOw0KPiArCQlzb3AtPmFlYWQuZGlnZXN0LmRhdGEgPSBpY3YtPnZhOw0KPiAr
CQlzb3AtPmFlYWQuZGlnZXN0LnBoeXNfYWRkciA9IGljdi0+cGE7DQo+ICsJCXNvcC0+YWVhZC5h
YWQuZGF0YSA9IGljdi0+dmEgKyBzYS0+aWN2X2xlbjsNCj4gKwkJc29wLT5hZWFkLmFhZC5waHlz
X2FkZHIgPSBpY3YtPnBhICsgc2EtPmljdl9sZW47DQo+ICsNCj4gKwkJLyogZmlsbCBBQUQgSVYg
KGxvY2F0ZWQgaW5zaWRlIGNyeXB0byBvcCkgKi8NCj4gKwkJZ2NtID0gcnRlX2NyeXB0b19vcF9j
dG9kX29mZnNldChjb3AsIHN0cnVjdCBhZWFkX2djbV9pdiAqLA0KPiArCQkJc2EtPml2X29mcyk7
DQo+ICsJCWFlYWRfZ2NtX2l2X2ZpbGwoZ2NtLCBpdnBbMF0sIHNhLT5zYWx0KTsNCj4gKwkvKiBD
UllQVCtBVVRIIGNhc2UgKi8NCj4gKwl9IGVsc2Ugew0KPiArCQlzb3AtPmNpcGhlci5kYXRhLm9m
ZnNldCA9IHNhLT5jdHAuY2lwaGVyLm9mZnNldCArIGhsZW47DQo+ICsJCXNvcC0+Y2lwaGVyLmRh
dGEubGVuZ3RoID0gc2EtPmN0cC5jaXBoZXIubGVuZ3RoICsgcGxlbjsNCj4gKwkJc29wLT5hdXRo
LmRhdGEub2Zmc2V0ID0gc2EtPmN0cC5hdXRoLm9mZnNldCArIGhsZW47DQo+ICsJCXNvcC0+YXV0
aC5kYXRhLmxlbmd0aCA9IHNhLT5jdHAuYXV0aC5sZW5ndGggKyBwbGVuOw0KPiArCQlzb3AtPmF1
dGguZGlnZXN0LmRhdGEgPSBpY3YtPnZhOw0KPiArCQlzb3AtPmF1dGguZGlnZXN0LnBoeXNfYWRk
ciA9IGljdi0+cGE7DQpwbGVhc2UgaWdub3JlIG15IHByZXZpb3VzIGNvbW1lbnQgb24gY3RwIGlu
IHRoZSBwcmV2aW91cyBwYXRjaC4NCnlvdSBhcmUgbWFraW5nIHRoZSBzeW1fb3AgYWxzbyBpbiB0
aGlzIGxpYnJhcnkuIEl0IHdvdWxkIGJlIGJldHRlciB0byANCnVzZSBzeW1fb3AgaW5zdGVhZCBv
ZiBzb3AgdG8gYWxpZ24gd2l0aCByZXN0IG9mIGRwZGsgY29kZS4NCj4gKwl9DQo+ICt9DQo+ICsN
Cj4gK3N0YXRpYyBpbmxpbmUgaW50MzJfdA0KPiArZXNwX291dGJfdHVuX3BrdF9wcmVwYXJlKHN0
cnVjdCBydGVfaXBzZWNfc2EgKnNhLCBydGVfYmU2NF90IHNxYywNCj4gKwljb25zdCB1aW50NjRf
dCBpdnBbSVBTRUNfTUFYX0lWX1FXT1JEXSwgc3RydWN0IHJ0ZV9tYnVmICptYiwNCj4gKwl1bmlv
biBzeW1fb3BfZGF0YSAqaWN2KQ0KPiArew0KPiArCXVpbnQzMl90IGNsZW4sIGhsZW4sIGwybGVu
LCBwZGxlbiwgcGRvZnMsIHBsZW4sIHRsZW47DQo+ICsJc3RydWN0IHJ0ZV9tYnVmICptbDsNCj4g
KwlzdHJ1Y3QgZXNwX2hkciAqZXNwaDsNCj4gKwlzdHJ1Y3QgZXNwX3RhaWwgKmVzcHQ7DQo+ICsJ
Y2hhciAqcGgsICpwdDsNCj4gKwl1aW50NjRfdCAqaXY7DQo+ICsNCj4gKwkvKiBjYWxjdWxhdGUg
ZXh0cmEgaGVhZGVyIHNwYWNlIHJlcXVpcmVkICovDQo+ICsJaGxlbiA9IHNhLT5oZHJfbGVuICsg
c2EtPml2X2xlbiArIHNpemVvZigqZXNwaCk7DQo+ICsNCj4gKwkvKiBzaXplIG9mIGlwc2VjIHBy
b3RlY3RlZCBkYXRhICovDQo+ICsJbDJsZW4gPSBtYi0+bDJfbGVuOw0KPiArCXBsZW4gPSBtYi0+
cGt0X2xlbiAtIG1iLT5sMl9sZW47DQo+ICsNCj4gKwkvKiBudW1iZXIgb2YgYnl0ZXMgdG8gZW5j
cnlwdCAqLw0KPiArCWNsZW4gPSBwbGVuICsgc2l6ZW9mKCplc3B0KTsNCj4gKwljbGVuID0gUlRF
X0FMSUdOX0NFSUwoY2xlbiwgc2EtPnBhZF9hbGlnbik7DQo+ICsNCj4gKwkvKiBwYWQgbGVuZ3Ro
ICsgZXNwIHRhaWwgKi8NCj4gKwlwZGxlbiA9IGNsZW4gLSBwbGVuOw0KPiArCXRsZW4gPSBwZGxl
biArIHNhLT5pY3ZfbGVuOw0KPiArDQo+ICsJLyogZG8gYXBwZW5kIGFuZCBwcmVwZW5kICovDQo+
ICsJbWwgPSBydGVfcGt0bWJ1Zl9sYXN0c2VnKG1iKTsNCj4gKwlpZiAodGxlbiArIHNhLT5zcWhf
bGVuICsgc2EtPmFhZF9sZW4gPiBydGVfcGt0bWJ1Zl90YWlscm9vbShtbCkpDQo+ICsJCXJldHVy
biAtRU5PU1BDOw0KPiArDQo+ICsJLyogcHJlcGVuZCBoZWFkZXIgKi8NCj4gKwlwaCA9IHJ0ZV9w
a3RtYnVmX3ByZXBlbmQobWIsIGhsZW4gLSBsMmxlbik7DQo+ICsJaWYgKHBoID09IE5VTEwpDQo+
ICsJCXJldHVybiAtRU5PU1BDOw0KPiArDQo+ICsJLyogYXBwZW5kIHRhaWwgKi8NCj4gKwlwZG9m
cyA9IG1sLT5kYXRhX2xlbjsNCj4gKwltbC0+ZGF0YV9sZW4gKz0gdGxlbjsNCj4gKwltYi0+cGt0
X2xlbiArPSB0bGVuOw0KPiArCXB0ID0gcnRlX3BrdG1idWZfbXRvZF9vZmZzZXQobWwsIHR5cGVv
ZihwdCksIHBkb2ZzKTsNCj4gKw0KPiArCS8qIHVwZGF0ZSBwa3QgbDIvbDMgbGVuICovDQo+ICsJ
bWItPmwyX2xlbiA9IHNhLT5oZHJfbDNfb2ZmOw0KPiArCW1iLT5sM19sZW4gPSBzYS0+aGRyX2xl
biAtIHNhLT5oZHJfbDNfb2ZmOw0KPiArDQo+ICsJLyogY29weSB0dW5uZWwgcGt0IGhlYWRlciAq
Lw0KPiArCXJ0ZV9tZW1jcHkocGgsIHNhLT5oZHIsIHNhLT5oZHJfbGVuKTsNCj4gKw0KPiArCS8q
IHVwZGF0ZSBvcmlnaW5hbCBhbmQgbmV3IGlwIGhlYWRlciBmaWVsZHMgKi8NCj4gKwl1cGRhdGVf
dHVuX2wzaGRyKHNhLCBwaCArIHNhLT5oZHJfbDNfb2ZmLCBtYi0+cGt0X2xlbiwgc2EtPmhkcl9s
M19vZmYsDQo+ICsJCQlzcW5fbG93MTYoc3FjKSk7DQo+ICsNCj4gKwkvKiB1cGRhdGUgc3BpLCBz
ZXFuIGFuZCBpdiAqLw0KPiArCWVzcGggPSAoc3RydWN0IGVzcF9oZHIgKikocGggKyBzYS0+aGRy
X2xlbik7DQo+ICsJaXYgPSAodWludDY0X3QgKikoZXNwaCArIDEpOw0KPiArCXJ0ZV9tZW1jcHko
aXYsIGl2cCwgc2EtPml2X2xlbik7DQo+ICsNCj4gKwllc3BoLT5zcGkgPSBzYS0+c3BpOw0KPiAr
CWVzcGgtPnNlcSA9IHNxbl9sb3czMihzcWMpOw0KPiArDQo+ICsJLyogb2Zmc2V0IGZvciBJQ1Yg
Ki8NCj4gKwlwZG9mcyArPSBwZGxlbiArIHNhLT5zcWhfbGVuOw0KPiArDQo+ICsJLyogcGFkIGxl
bmd0aCAqLw0KPiArCXBkbGVuIC09IHNpemVvZigqZXNwdCk7DQo+ICsNCj4gKwkvKiBjb3B5IHBh
ZGRpbmcgZGF0YSAqLw0KPiArCXJ0ZV9tZW1jcHkocHQsIGVzcF9wYWRfYnl0ZXMsIHBkbGVuKTsN
Cj4gKw0KPiArCS8qIHVwZGF0ZSBlc3AgdHJhaWxlciAqLw0KPiArCWVzcHQgPSAoc3RydWN0IGVz
cF90YWlsICopKHB0ICsgcGRsZW4pOw0KPiArCWVzcHQtPnBhZF9sZW4gPSBwZGxlbjsNCj4gKwll
c3B0LT5uZXh0X3Byb3RvID0gc2EtPnByb3RvOw0KPiArDQo+ICsJaWN2LT52YSA9IHJ0ZV9wa3Rt
YnVmX210b2Rfb2Zmc2V0KG1sLCB2b2lkICosIHBkb2ZzKTsNCj4gKwlpY3YtPnBhID0gcnRlX3Br
dG1idWZfaW92YV9vZmZzZXQobWwsIHBkb2ZzKTsNCj4gKw0KPiArCXJldHVybiBjbGVuOw0KPiAr
fQ0KPiArDQo+ICsvKg0KPiArICogZm9yIHB1cmUgY3J5cHRvZGV2IChsb29rYXNpZGUgbm9uZSkg
ZGVwZW5kaW5nIG9uIFNBIHNldHRpbmdzLA0KPiArICogd2UgbWlnaHQgaGF2ZSB0byB3cml0ZSBz
b21lIGV4dHJhIGRhdGEgdG8gdGhlIHBhY2tldC4NCj4gKyAqLw0KPiArc3RhdGljIGlubGluZSB2
b2lkDQo+ICtvdXRiX3BrdF94cHJlcGFyZShjb25zdCBzdHJ1Y3QgcnRlX2lwc2VjX3NhICpzYSwg
cnRlX2JlNjRfdCBzcWMsDQo+ICsJY29uc3QgdW5pb24gc3ltX29wX2RhdGEgKmljdikNCj4gK3sN
Cj4gKwl1aW50MzJfdCAqcHNxaDsNCj4gKwlzdHJ1Y3QgYWVhZF9nY21fYWFkICphYWQ7DQo+ICsN
Cj4gKwkvKiBpbnNlcnQgU1FOLmhpIGJldHdlZW4gRVNQIHRyYWlsZXIgYW5kIElDViAqLw0KPiAr
CWlmIChzYS0+c3FoX2xlbiAhPSAwKSB7DQo+ICsJCXBzcWggPSAodWludDMyX3QgKikoaWN2LT52
YSAtIHNhLT5zcWhfbGVuKTsNCj4gKwkJcHNxaFswXSA9IHNxbl9oaTMyKHNxYyk7DQo+ICsJfQ0K
PiArDQo+ICsJLyoNCj4gKwkgKiBmaWxsIElWIGFuZCBBQUQgZmllbGRzLCBpZiBhbnkgKGFhZCBm
aWVsZHMgYXJlIHBsYWNlZCBhZnRlciBpY3YpLA0KPiArCSAqIHJpZ2h0IG5vdyB3ZSBzdXBwb3J0
IG9ubHkgb25lIEFFQUQgYWxnb3JpdGhtOiBBRVMtR0NNIC4NCj4gKwkgKi8NCj4gKwlpZiAoc2Et
PmFhZF9sZW4gIT0gMCkgew0KPiArCQlhYWQgPSAoc3RydWN0IGFlYWRfZ2NtX2FhZCAqKShpY3Yt
PnZhICsgc2EtPmljdl9sZW4pOw0KPiArCQlhZWFkX2djbV9hYWRfZmlsbChhYWQsIHNhLT5zcGks
IHNxYywgSVNfRVNOKHNhKSk7DQo+ICsJfQ0KPiArfQ0KPiArDQpwcm9iYWJseSBhIGNvbW1lbnQg
YmVmb3JlIGV2ZXJ5IGZ1bmN0aW9uIHdvdWxkIGJlIGJldHRlciBpbiBhIGxpYnJhcnkgY29kZQ0K
PiArc3RhdGljIHVpbnQxNl90DQo+ICtvdXRiX3R1bl9wcmVwYXJlKGNvbnN0IHN0cnVjdCBydGVf
aXBzZWNfc2Vzc2lvbiAqc3MsIHN0cnVjdCBydGVfbWJ1ZiAqbWJbXSwNCj4gKwlzdHJ1Y3QgcnRl
X2NyeXB0b19vcCAqY29wW10sIHVpbnQxNl90IG51bSkNCj4gK3sNCj4gKwlpbnQzMl90IHJjOw0K
PiArCXVpbnQzMl90IGksIGssIG47DQo+ICsJdWludDY0X3Qgc3FuOw0KPiArCXJ0ZV9iZTY0X3Qg
c3FjOw0KPiArCXN0cnVjdCBydGVfaXBzZWNfc2EgKnNhOw0KPiArCXVuaW9uIHN5bV9vcF9kYXRh
IGljdjsNCj4gKwl1aW50NjRfdCBpdltJUFNFQ19NQVhfSVZfUVdPUkRdOw0KPiArCXN0cnVjdCBy
dGVfbWJ1ZiAqZHJbbnVtXTsNCj4gKw0KPiArCXNhID0gc3MtPnNhOw0KPiArDQo+ICsJbiA9IG51
bTsNCj4gKwlzcW4gPSBlc25fb3V0Yl91cGRhdGVfc3FuKHNhLCAmbik7DQo+ICsJaWYgKG4gIT0g
bnVtKQ0KPiArCQlydGVfZXJybm8gPSBFT1ZFUkZMT1c7DQo+ICsNCj4gKwlrID0gMDsNCj4gKwlm
b3IgKGkgPSAwOyBpICE9IG47IGkrKykgew0KPiArDQo+ICsJCXNxYyA9IHJ0ZV9jcHVfdG9fYmVf
NjQoc3FuICsgaSk7DQo+ICsJCWdlbl9pdihpdiwgc3FjKTsNCj4gKw0KPiArCQkvKiB0cnkgdG8g
dXBkYXRlIHRoZSBwYWNrZXQgaXRzZWxmICovDQo+ICsJCXJjID0gZXNwX291dGJfdHVuX3BrdF9w
cmVwYXJlKHNhLCBzcWMsIGl2LCBtYltpXSwgJmljdik7DQo+ICsNCj4gKwkJLyogc3VjY2Vzcywg
c2V0dXAgY3J5cHRvIG9wICovDQo+ICsJCWlmIChyYyA+PSAwKSB7DQo+ICsJCQltYltrXSA9IG1i
W2ldOw0KPiArCQkJb3V0Yl9wa3RfeHByZXBhcmUoc2EsIHNxYywgJmljdik7DQo+ICsJCQllc3Bf
b3V0Yl9jb3BfcHJlcGFyZShjb3Bba10sIHNhLCBpdiwgJmljdiwgMCwgcmMpOw0KPiArCQkJaysr
Ow0KPiArCQkvKiBmYWlsdXJlLCBwdXQgcGFja2V0IGludG8gdGhlIGRlYXRoLXJvdyAqLw0KPiAr
CQl9IGVsc2Ugew0KPiArCQkJZHJbaSAtIGtdID0gbWJbaV07DQo+ICsJCQlydGVfZXJybm8gPSAt
cmM7DQo+ICsJCX0NCj4gKwl9DQo+ICsNCj4gKwkvKiB1cGRhdGUgY29wcyAqLw0KPiArCWxrc2Rf
bm9uZV9jb3BfcHJlcGFyZShzcywgbWIsIGNvcCwgayk7DQo+ICsNCj4gKwkgLyogY29weSBub3Qg
cHJlcGFyZWQgbWJ1ZnMgYmV5b25kIGdvb2Qgb25lcyAqLw0KPiArCWlmIChrICE9IG51bSAmJiBr
ICE9IDApDQo+ICsJCW1idWZfYnVsa19jb3B5KG1iICsgaywgZHIsIG51bSAtIGspOw0KPiArDQo+
ICsJcmV0dXJuIGs7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBpbmxpbmUgaW50MzJfdA0KPiArZXNw
X291dGJfdHJzX3BrdF9wcmVwYXJlKHN0cnVjdCBydGVfaXBzZWNfc2EgKnNhLCBydGVfYmU2NF90
IHNxYywNCj4gKwljb25zdCB1aW50NjRfdCBpdnBbSVBTRUNfTUFYX0lWX1FXT1JEXSwgc3RydWN0
IHJ0ZV9tYnVmICptYiwNCj4gKwl1aW50MzJfdCBsMmxlbiwgdWludDMyX3QgbDNsZW4sIHVuaW9u
IHN5bV9vcF9kYXRhICppY3YpDQo+ICt7DQo+ICsJdWludDhfdCBucDsNCj4gKwl1aW50MzJfdCBj
bGVuLCBobGVuLCBwZGxlbiwgcGRvZnMsIHBsZW4sIHRsZW4sIHVobGVuOw0KPiArCXN0cnVjdCBy
dGVfbWJ1ZiAqbWw7DQo+ICsJc3RydWN0IGVzcF9oZHIgKmVzcGg7DQo+ICsJc3RydWN0IGVzcF90
YWlsICplc3B0Ow0KPiArCWNoYXIgKnBoLCAqcHQ7DQo+ICsJdWludDY0X3QgKml2Ow0KPiArDQo+
ICsJdWhsZW4gPSBsMmxlbiArIGwzbGVuOw0KPiArCXBsZW4gPSBtYi0+cGt0X2xlbiAtIHVobGVu
Ow0KPiArDQo+ICsJLyogY2FsY3VsYXRlIGV4dHJhIGhlYWRlciBzcGFjZSByZXF1aXJlZCAqLw0K
PiArCWhsZW4gPSBzYS0+aXZfbGVuICsgc2l6ZW9mKCplc3BoKTsNCj4gKw0KPiArCS8qIG51bWJl
ciBvZiBieXRlcyB0byBlbmNyeXB0ICovDQo+ICsJY2xlbiA9IHBsZW4gKyBzaXplb2YoKmVzcHQp
Ow0KPiArCWNsZW4gPSBSVEVfQUxJR05fQ0VJTChjbGVuLCBzYS0+cGFkX2FsaWduKTsNCj4gKw0K
PiArCS8qIHBhZCBsZW5ndGggKyBlc3AgdGFpbCAqLw0KPiArCXBkbGVuID0gY2xlbiAtIHBsZW47
DQo+ICsJdGxlbiA9IHBkbGVuICsgc2EtPmljdl9sZW47DQo+ICsNCj4gKwkvKiBkbyBhcHBlbmQg
YW5kIGluc2VydCAqLw0KPiArCW1sID0gcnRlX3BrdG1idWZfbGFzdHNlZyhtYik7DQo+ICsJaWYg
KHRsZW4gKyBzYS0+c3FoX2xlbiArIHNhLT5hYWRfbGVuID4gcnRlX3BrdG1idWZfdGFpbHJvb20o
bWwpKQ0KPiArCQlyZXR1cm4gLUVOT1NQQzsNCj4gKw0KPiArCS8qIHByZXBlbmQgc3BhY2UgZm9y
IEVTUCBoZWFkZXIgKi8NCj4gKwlwaCA9IHJ0ZV9wa3RtYnVmX3ByZXBlbmQobWIsIGhsZW4pOw0K
PiArCWlmIChwaCA9PSBOVUxMKQ0KPiArCQlyZXR1cm4gLUVOT1NQQzsNCj4gKw0KPiArCS8qIGFw
cGVuZCB0YWlsICovDQo+ICsJcGRvZnMgPSBtbC0+ZGF0YV9sZW47DQo+ICsJbWwtPmRhdGFfbGVu
ICs9IHRsZW47DQo+ICsJbWItPnBrdF9sZW4gKz0gdGxlbjsNCj4gKwlwdCA9IHJ0ZV9wa3RtYnVm
X210b2Rfb2Zmc2V0KG1sLCB0eXBlb2YocHQpLCBwZG9mcyk7DQo+ICsNCj4gKwkvKiBzaGlmdCBM
Mi9MMyBoZWFkZXJzICovDQo+ICsJaW5zZXJ0X2VzcGgocGgsIHBoICsgaGxlbiwgdWhsZW4pOw0K
PiArDQo+ICsJLyogdXBkYXRlIGlwICBoZWFkZXIgZmllbGRzICovDQo+ICsJbnAgPSB1cGRhdGVf
dHJzX2wzaGRyKHNhLCBwaCArIGwybGVuLCBtYi0+cGt0X2xlbiwgbDJsZW4sIGwzbGVuLA0KPiAr
CQkJSVBQUk9UT19FU1ApOw0KPiArDQo+ICsJLyogdXBkYXRlIHNwaSwgc2VxbiBhbmQgaXYgKi8N
Cj4gKwllc3BoID0gKHN0cnVjdCBlc3BfaGRyICopKHBoICsgdWhsZW4pOw0KPiArCWl2ID0gKHVp
bnQ2NF90ICopKGVzcGggKyAxKTsNCj4gKwlydGVfbWVtY3B5KGl2LCBpdnAsIHNhLT5pdl9sZW4p
Ow0KPiArDQo+ICsJZXNwaC0+c3BpID0gc2EtPnNwaTsNCj4gKwllc3BoLT5zZXEgPSBzcW5fbG93
MzIoc3FjKTsNCj4gKw0KPiArCS8qIG9mZnNldCBmb3IgSUNWICovDQo+ICsJcGRvZnMgKz0gcGRs
ZW4gKyBzYS0+c3FoX2xlbjsNCj4gKw0KPiArCS8qIHBhZCBsZW5ndGggKi8NCj4gKwlwZGxlbiAt
PSBzaXplb2YoKmVzcHQpOw0KPiArDQo+ICsJLyogY29weSBwYWRkaW5nIGRhdGEgKi8NCj4gKwly
dGVfbWVtY3B5KHB0LCBlc3BfcGFkX2J5dGVzLCBwZGxlbik7DQo+ICsNCj4gKwkvKiB1cGRhdGUg
ZXNwIHRyYWlsZXIgKi8NCj4gKwllc3B0ID0gKHN0cnVjdCBlc3BfdGFpbCAqKShwdCArIHBkbGVu
KTsNCj4gKwllc3B0LT5wYWRfbGVuID0gcGRsZW47DQo+ICsJZXNwdC0+bmV4dF9wcm90byA9IG5w
Ow0KPiArDQo+ICsJaWN2LT52YSA9IHJ0ZV9wa3RtYnVmX210b2Rfb2Zmc2V0KG1sLCB2b2lkICos
IHBkb2ZzKTsNCj4gKwlpY3YtPnBhID0gcnRlX3BrdG1idWZfaW92YV9vZmZzZXQobWwsIHBkb2Zz
KTsNCj4gKw0KPiArCXJldHVybiBjbGVuOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgdWludDE2X3QN
Cj4gK291dGJfdHJzX3ByZXBhcmUoY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zZXNzaW9uICpzcywg
c3RydWN0IHJ0ZV9tYnVmICptYltdLA0KPiArCXN0cnVjdCBydGVfY3J5cHRvX29wICpjb3BbXSwg
dWludDE2X3QgbnVtKQ0KPiArew0KPiArCWludDMyX3QgcmM7DQo+ICsJdWludDMyX3QgaSwgaywg
biwgbDIsIGwzOw0KPiArCXVpbnQ2NF90IHNxbjsNCj4gKwlydGVfYmU2NF90IHNxYzsNCj4gKwlz
dHJ1Y3QgcnRlX2lwc2VjX3NhICpzYTsNCj4gKwl1bmlvbiBzeW1fb3BfZGF0YSBpY3Y7DQo+ICsJ
dWludDY0X3QgaXZbSVBTRUNfTUFYX0lWX1FXT1JEXTsNCj4gKwlzdHJ1Y3QgcnRlX21idWYgKmRy
W251bV07DQo+ICsNCj4gKwlzYSA9IHNzLT5zYTsNCj4gKw0KPiArCW4gPSBudW07DQo+ICsJc3Fu
ID0gZXNuX291dGJfdXBkYXRlX3NxbihzYSwgJm4pOw0KPiArCWlmIChuICE9IG51bSkNCj4gKwkJ
cnRlX2Vycm5vID0gRU9WRVJGTE9XOw0KPiArDQo+ICsJayA9IDA7DQo+ICsJZm9yIChpID0gMDsg
aSAhPSBuOyBpKyspIHsNCj4gKw0KPiArCQlsMiA9IG1iW2ldLT5sMl9sZW47DQo+ICsJCWwzID0g
bWJbaV0tPmwzX2xlbjsNCj4gKw0KPiArCQlzcWMgPSBydGVfY3B1X3RvX2JlXzY0KHNxbiArIGkp
Ow0KPiArCQlnZW5faXYoaXYsIHNxYyk7DQo+ICsNCj4gKwkJLyogdHJ5IHRvIHVwZGF0ZSB0aGUg
cGFja2V0IGl0c2VsZiAqLw0KPiArCQlyYyA9IGVzcF9vdXRiX3Ryc19wa3RfcHJlcGFyZShzYSwg
c3FjLCBpdiwgbWJbaV0sDQo+ICsJCQkJbDIsIGwzLCAmaWN2KTsNCj4gKw0KPiArCQkvKiBzdWNj
ZXNzLCBzZXR1cCBjcnlwdG8gb3AgKi8NCj4gKwkJaWYgKHJjID49IDApIHsNCj4gKwkJCW1iW2td
ID0gbWJbaV07DQo+ICsJCQlvdXRiX3BrdF94cHJlcGFyZShzYSwgc3FjLCAmaWN2KTsNCj4gKwkJ
CWVzcF9vdXRiX2NvcF9wcmVwYXJlKGNvcFtrXSwgc2EsIGl2LCAmaWN2LCBsMiArIGwzLCByYyk7
DQo+ICsJCQlrKys7DQo+ICsJCS8qIGZhaWx1cmUsIHB1dCBwYWNrZXQgaW50byB0aGUgZGVhdGgt
cm93ICovDQo+ICsJCX0gZWxzZSB7DQo+ICsJCQlkcltpIC0ga10gPSBtYltpXTsNCj4gKwkJCXJ0
ZV9lcnJubyA9IC1yYzsNCj4gKwkJfQ0KPiArCX0NCj4gKw0KPiArCS8qIHVwZGF0ZSBjb3BzICov
DQo+ICsJbGtzZF9ub25lX2NvcF9wcmVwYXJlKHNzLCBtYiwgY29wLCBrKTsNCj4gKw0KPiArCS8q
IGNvcHkgbm90IHByZXBhcmVkIG1idWZzIGJleW9uZCBnb29kIG9uZXMgKi8NCj4gKwlpZiAoayAh
PSBudW0gJiYgayAhPSAwKQ0KPiArCQltYnVmX2J1bGtfY29weShtYiArIGssIGRyLCBudW0gLSBr
KTsNCj4gKw0KPiArCXJldHVybiBrOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW5saW5lIGludDMy
X3QNCj4gK2VzcF9pbmJfdHVuX2NvcF9wcmVwYXJlKHN0cnVjdCBydGVfY3J5cHRvX29wICpjb3As
DQo+ICsJY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zYSAqc2EsIHN0cnVjdCBydGVfbWJ1ZiAqbWIs
DQo+ICsJY29uc3QgdW5pb24gc3ltX29wX2RhdGEgKmljdiwgdWludDMyX3QgcG9mcywgdWludDMy
X3QgcGxlbikNCj4gK3sNCj4gKwlzdHJ1Y3QgcnRlX2NyeXB0b19zeW1fb3AgKnNvcDsNCj4gKwlz
dHJ1Y3QgYWVhZF9nY21faXYgKmdjbTsNCj4gKwl1aW50NjRfdCAqaXZjLCAqaXZwOw0KPiArCXVp
bnQzMl90IGNsZW47DQo+ICsNCj4gKwljbGVuID0gcGxlbiAtIHNhLT5jdHAuY2lwaGVyLmxlbmd0
aDsNCj4gKwlpZiAoKGludDMyX3QpY2xlbiA8IDAgfHwgKGNsZW4gJiAoc2EtPnBhZF9hbGlnbiAt
IDEpKSAhPSAwKQ0KPiArCQlyZXR1cm4gLUVJTlZBTDsNCj4gKw0KPiArCS8qIGZpbGwgc3ltIG9w
IGZpZWxkcyAqLw0KPiArCXNvcCA9IGNvcC0+c3ltOw0KPiArDQo+ICsJLyogQUVBRCAoQUVTX0dD
TSkgY2FzZSAqLw0KPiArCWlmIChzYS0+YWFkX2xlbiAhPSAwKSB7DQo+ICsJCXNvcC0+YWVhZC5k
YXRhLm9mZnNldCA9IHBvZnMgKyBzYS0+Y3RwLmNpcGhlci5vZmZzZXQ7DQo+ICsJCXNvcC0+YWVh
ZC5kYXRhLmxlbmd0aCA9IGNsZW47DQo+ICsJCXNvcC0+YWVhZC5kaWdlc3QuZGF0YSA9IGljdi0+
dmE7DQo+ICsJCXNvcC0+YWVhZC5kaWdlc3QucGh5c19hZGRyID0gaWN2LT5wYTsNCj4gKwkJc29w
LT5hZWFkLmFhZC5kYXRhID0gaWN2LT52YSArIHNhLT5pY3ZfbGVuOw0KPiArCQlzb3AtPmFlYWQu
YWFkLnBoeXNfYWRkciA9IGljdi0+cGEgKyBzYS0+aWN2X2xlbjsNCj4gKw0KPiArCQkvKiBmaWxs
IEFBRCBJViAobG9jYXRlZCBpbnNpZGUgY3J5cHRvIG9wKSAqLw0KPiArCQlnY20gPSBydGVfY3J5
cHRvX29wX2N0b2Rfb2Zmc2V0KGNvcCwgc3RydWN0IGFlYWRfZ2NtX2l2ICosDQo+ICsJCQlzYS0+
aXZfb2ZzKTsNCj4gKwkJaXZwID0gcnRlX3BrdG1idWZfbXRvZF9vZmZzZXQobWIsIHVpbnQ2NF90
ICosDQo+ICsJCQlwb2ZzICsgc2l6ZW9mKHN0cnVjdCBlc3BfaGRyKSk7DQo+ICsJCWFlYWRfZ2Nt
X2l2X2ZpbGwoZ2NtLCBpdnBbMF0sIHNhLT5zYWx0KTsNCj4gKwkvKiBDUllQVCtBVVRIIGNhc2Ug
Ki8NCj4gKwl9IGVsc2Ugew0KPiArCQlzb3AtPmNpcGhlci5kYXRhLm9mZnNldCA9IHBvZnMgKyBz
YS0+Y3RwLmNpcGhlci5vZmZzZXQ7DQo+ICsJCXNvcC0+Y2lwaGVyLmRhdGEubGVuZ3RoID0gY2xl
bjsNCj4gKwkJc29wLT5hdXRoLmRhdGEub2Zmc2V0ID0gcG9mcyArIHNhLT5jdHAuYXV0aC5vZmZz
ZXQ7DQo+ICsJCXNvcC0+YXV0aC5kYXRhLmxlbmd0aCA9IHBsZW4gLSBzYS0+Y3RwLmF1dGgubGVu
Z3RoOw0KPiArCQlzb3AtPmF1dGguZGlnZXN0LmRhdGEgPSBpY3YtPnZhOw0KPiArCQlzb3AtPmF1
dGguZGlnZXN0LnBoeXNfYWRkciA9IGljdi0+cGE7DQo+ICsNCj4gKwkJLyogY29weSBpdiBmcm9t
IHRoZSBpbnB1dCBwYWNrZXQgdG8gdGhlIGNvcCAqLw0KPiArCQlpdmMgPSBydGVfY3J5cHRvX29w
X2N0b2Rfb2Zmc2V0KGNvcCwgdWludDY0X3QgKiwgc2EtPml2X29mcyk7DQo+ICsJCWl2cCA9IHJ0
ZV9wa3RtYnVmX210b2Rfb2Zmc2V0KG1iLCB1aW50NjRfdCAqLA0KPiArCQkJcG9mcyArIHNpemVv
ZihzdHJ1Y3QgZXNwX2hkcikpOw0KPiArCQlydGVfbWVtY3B5KGl2YywgaXZwLCBzYS0+aXZfbGVu
KTsNCj4gKwl9DQo+ICsJcmV0dXJuIDA7DQo+ICt9DQo+ICsNCj4gKy8qDQo+ICsgKiBmb3IgcHVy
ZSBjcnlwdG9kZXYgKGxvb2thc2lkZSBub25lKSBkZXBlbmRpbmcgb24gU0Egc2V0dGluZ3MsDQo+
ICsgKiB3ZSBtaWdodCBoYXZlIHRvIHdyaXRlIHNvbWUgZXh0cmEgZGF0YSB0byB0aGUgcGFja2V0
Lg0KPiArICovDQo+ICtzdGF0aWMgaW5saW5lIHZvaWQNCj4gK2luYl9wa3RfeHByZXBhcmUoY29u
c3Qgc3RydWN0IHJ0ZV9pcHNlY19zYSAqc2EsIHJ0ZV9iZTY0X3Qgc3FjLA0KPiArCWNvbnN0IHVu
aW9uIHN5bV9vcF9kYXRhICppY3YpDQo+ICt7DQo+ICsJc3RydWN0IGFlYWRfZ2NtX2FhZCAqYWFk
Ow0KPiArDQo+ICsJLyogaW5zZXJ0IFNRTi5oaSBiZXR3ZWVuIEVTUCB0cmFpbGVyIGFuZCBJQ1Yg
Ki8NCj4gKwlpZiAoc2EtPnNxaF9sZW4gIT0gMCkNCj4gKwkJaW5zZXJ0X3NxaChzcW5faGkzMihz
cWMpLCBpY3YtPnZhLCBzYS0+aWN2X2xlbik7DQo+ICsNCj4gKwkvKg0KPiArCSAqIGZpbGwgQUFE
IGZpZWxkcywgaWYgYW55IChhYWQgZmllbGRzIGFyZSBwbGFjZWQgYWZ0ZXIgaWN2KSwNCj4gKwkg
KiByaWdodCBub3cgd2Ugc3VwcG9ydCBvbmx5IG9uZSBBRUFEIGFsZ29yaXRobTogQUVTLUdDTS4N
Cj4gKwkgKi8NCj4gKwlpZiAoc2EtPmFhZF9sZW4gIT0gMCkgew0KPiArCQlhYWQgPSAoc3RydWN0
IGFlYWRfZ2NtX2FhZCAqKShpY3YtPnZhICsgc2EtPmljdl9sZW4pOw0KPiArCQlhZWFkX2djbV9h
YWRfZmlsbChhYWQsIHNhLT5zcGksIHNxYywgSVNfRVNOKHNhKSk7DQo+ICsJfQ0KPiArfQ0KPiAr
DQo+ICtzdGF0aWMgaW5saW5lIGludDMyX3QNCj4gK2VzcF9pbmJfdHVuX3BrdF9wcmVwYXJlKGNv
bnN0IHN0cnVjdCBydGVfaXBzZWNfc2EgKnNhLA0KPiArCWNvbnN0IHN0cnVjdCByZXBsYXlfc3Fu
ICpyc24sIHN0cnVjdCBydGVfbWJ1ZiAqbWIsDQo+ICsJdWludDMyX3QgaGxlbiwgdW5pb24gc3lt
X29wX2RhdGEgKmljdikNCj4gK3sNCj4gKwlpbnQzMl90IHJjOw0KPiArCXVpbnQ2NF90IHNxbjsN
Cj4gKwl1aW50MzJfdCBpY3Zfb2ZzLCBwbGVuOw0KPiArCXN0cnVjdCBydGVfbWJ1ZiAqbWw7DQo+
ICsJc3RydWN0IGVzcF9oZHIgKmVzcGg7DQo+ICsNCj4gKwllc3BoID0gcnRlX3BrdG1idWZfbXRv
ZF9vZmZzZXQobWIsIHN0cnVjdCBlc3BfaGRyICosIGhsZW4pOw0KPiArDQo+ICsJLyoNCj4gKwkg
KiByZXRyaWV2ZSBhbmQgcmVjb25zdHJ1Y3QgU1FOLCB0aGVuIGNoZWNrIGl0LCB0aGVuDQo+ICsJ
ICogY29udmVydCBpdCBiYWNrIGludG8gbmV0d29yayBieXRlIG9yZGVyLg0KPiArCSAqLw0KPiAr
CXNxbiA9IHJ0ZV9iZV90b19jcHVfMzIoZXNwaC0+c2VxKTsNCj4gKwlpZiAoSVNfRVNOKHNhKSkN
Cj4gKwkJc3FuID0gcmVjb25zdHJ1Y3RfZXNuKHJzbi0+c3FuLCBzcW4sIHNhLT5yZXBsYXkud2lu
X3N6KTsNCj4gKw0KPiArCXJjID0gZXNuX2luYl9jaGVja19zcW4ocnNuLCBzYSwgc3FuKTsNCj4g
KwlpZiAocmMgIT0gMCkNCj4gKwkJcmV0dXJuIHJjOw0KPiArDQo+ICsJc3FuID0gcnRlX2NwdV90
b19iZV82NChzcW4pOw0KPiArDQo+ICsJLyogc3RhcnQgcGFja2V0IG1hbmlwdWxhdGlvbiAqLw0K
PiArCXBsZW4gPSBtYi0+cGt0X2xlbjsNCj4gKwlwbGVuID0gcGxlbiAtIGhsZW47DQo+ICsNCj4g
KwltbCA9IHJ0ZV9wa3RtYnVmX2xhc3RzZWcobWIpOw0KPiArCWljdl9vZnMgPSBtbC0+ZGF0YV9s
ZW4gLSBzYS0+aWN2X2xlbiArIHNhLT5zcWhfbGVuOw0KPiArDQo+ICsJLyogd2UgaGF2ZSB0byBh
bGxvY2F0ZSBzcGFjZSBmb3IgQUFEIHNvbWV3aGVyZSwNCj4gKwkgKiByaWdodCBub3cgLSBqdXN0
IHVzZSBmcmVlIHRyYWlsaW5nIHNwYWNlIGF0IHRoZSBsYXN0IHNlZ21lbnQuDQo+ICsJICogV291
bGQgcHJvYmFibHkgYmUgbW9yZSBjb252ZW5pZW50IHRvIHJlc2VydmUgc3BhY2UgZm9yIEFBRA0K
PiArCSAqIGluc2lkZSBydGVfY3J5cHRvX29wIGl0c2VsZg0KPiArCSAqIChhZ2FpbiBmb3IgSVYg
c3BhY2UgaXMgYWxyZWFkeSByZXNlcnZlZCBpbnNpZGUgY29wKS4NCj4gKwkgKi8NCj4gKwlpZiAo
c2EtPmFhZF9sZW4gKyBzYS0+c3FoX2xlbiA+IHJ0ZV9wa3RtYnVmX3RhaWxyb29tKG1sKSkNCj4g
KwkJcmV0dXJuIC1FTk9TUEM7DQo+ICsNCj4gKwlpY3YtPnZhID0gcnRlX3BrdG1idWZfbXRvZF9v
ZmZzZXQobWwsIHZvaWQgKiwgaWN2X29mcyk7DQo+ICsJaWN2LT5wYSA9IHJ0ZV9wa3RtYnVmX2lv
dmFfb2Zmc2V0KG1sLCBpY3Zfb2ZzKTsNCj4gKw0KPiArCWluYl9wa3RfeHByZXBhcmUoc2EsIHNx
biwgaWN2KTsNCj4gKwlyZXR1cm4gcGxlbjsNCj4gK30NCj4gKw0KPiArc3RhdGljIHVpbnQxNl90
DQo+ICtpbmJfcGt0X3ByZXBhcmUoY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zZXNzaW9uICpzcywg
c3RydWN0IHJ0ZV9tYnVmICptYltdLA0KPiArCXN0cnVjdCBydGVfY3J5cHRvX29wICpjb3BbXSwg
dWludDE2X3QgbnVtKQ0KPiArew0KPiArCWludDMyX3QgcmM7DQo+ICsJdWludDMyX3QgaSwgaywg
aGw7DQo+ICsJc3RydWN0IHJ0ZV9pcHNlY19zYSAqc2E7DQo+ICsJc3RydWN0IHJlcGxheV9zcW4g
KnJzbjsNCj4gKwl1bmlvbiBzeW1fb3BfZGF0YSBpY3Y7DQo+ICsJc3RydWN0IHJ0ZV9tYnVmICpk
cltudW1dOw0KPiArDQo+ICsJc2EgPSBzcy0+c2E7DQo+ICsJcnNuID0gc2EtPnNxbi5pbmI7DQo+
ICsNCj4gKwlrID0gMDsNCj4gKwlmb3IgKGkgPSAwOyBpICE9IG51bTsgaSsrKSB7DQo+ICsNCj4g
KwkJaGwgPSBtYltpXS0+bDJfbGVuICsgbWJbaV0tPmwzX2xlbjsNCj4gKwkJcmMgPSBlc3BfaW5i
X3R1bl9wa3RfcHJlcGFyZShzYSwgcnNuLCBtYltpXSwgaGwsICZpY3YpOw0KPiArCQlpZiAocmMg
Pj0gMCkNCj4gKwkJCXJjID0gZXNwX2luYl90dW5fY29wX3ByZXBhcmUoY29wW2tdLCBzYSwgbWJb
aV0sICZpY3YsDQo+ICsJCQkJaGwsIHJjKTsNCj4gKw0KPiArCQlpZiAocmMgPT0gMCkNCj4gKwkJ
CW1iW2srK10gPSBtYltpXTsNCj4gKwkJZWxzZSB7DQo+ICsJCQlkcltpIC0ga10gPSBtYltpXTsN
Cj4gKwkJCXJ0ZV9lcnJubyA9IC1yYzsNCj4gKwkJfQ0KPiArCX0NCj4gKw0KPiArCS8qIHVwZGF0
ZSBjb3BzICovDQo+ICsJbGtzZF9ub25lX2NvcF9wcmVwYXJlKHNzLCBtYiwgY29wLCBrKTsNCj4g
Kw0KPiArCS8qIGNvcHkgbm90IHByZXBhcmVkIG1idWZzIGJleW9uZCBnb29kIG9uZXMgKi8NCj4g
KwlpZiAoayAhPSBudW0gJiYgayAhPSAwKQ0KPiArCQltYnVmX2J1bGtfY29weShtYiArIGssIGRy
LCBudW0gLSBrKTsNCj4gKw0KPiArCXJldHVybiBrOw0KPiArfQ0KPiArDQpuYW1pbmcgY29udmVu
dGlvbiB1c2VkIGlzIGNyeXB0aWMuIEEgY29tbWVudCB3b3VsZCBiZSBhcHByZWNpYXRlZC4NCj4g
K3N0YXRpYyBpbmxpbmUgdm9pZA0KPiArbGtzZF9wcm90b19jb3BfcHJlcGFyZShjb25zdCBzdHJ1
Y3QgcnRlX2lwc2VjX3Nlc3Npb24gKnNzLA0KPiArCXN0cnVjdCBydGVfbWJ1ZiAqbWJbXSwgc3Ry
dWN0IHJ0ZV9jcnlwdG9fb3AgKmNvcFtdLCB1aW50MTZfdCBudW0pDQo+ICt7DQo+ICsJdWludDMy
X3QgaTsNCj4gKwlzdHJ1Y3QgcnRlX2NyeXB0b19zeW1fb3AgKnNvcDsNCj4gKw0KPiArCWZvciAo
aSA9IDA7IGkgIT0gbnVtOyBpKyspIHsNCj4gKwkJc29wID0gY29wW2ldLT5zeW07DQo+ICsJCWNv
cFtpXS0+dHlwZSA9IFJURV9DUllQVE9fT1BfVFlQRV9TWU1NRVRSSUM7DQo+ICsJCWNvcFtpXS0+
c3RhdHVzID0gUlRFX0NSWVBUT19PUF9TVEFUVVNfTk9UX1BST0NFU1NFRDsNCj4gKwkJY29wW2ld
LT5zZXNzX3R5cGUgPSBSVEVfQ1JZUFRPX09QX1NFQ1VSSVRZX1NFU1NJT047DQo+ICsJCXNvcC0+
bV9zcmMgPSBtYltpXTsNCj4gKwkJX19ydGVfc2VjdXJpdHlfYXR0YWNoX3Nlc3Npb24oc29wLCBz
cy0+c2VjdXJpdHkuc2VzKTsNCj4gKwl9DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyB1aW50MTZfdA0K
PiArbGtzZF9wcm90b19wcmVwYXJlKGNvbnN0IHN0cnVjdCBydGVfaXBzZWNfc2Vzc2lvbiAqc3Ms
DQo+ICsJc3RydWN0IHJ0ZV9tYnVmICptYltdLCBzdHJ1Y3QgcnRlX2NyeXB0b19vcCAqY29wW10s
IHVpbnQxNl90IG51bSkNCj4gK3sNCj4gKwlsa3NkX3Byb3RvX2NvcF9wcmVwYXJlKHNzLCBtYiwg
Y29wLCBudW0pOw0KPiArCXJldHVybiBudW07DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBpbmxpbmUg
aW50DQo+ICtlc3BfaW5iX3R1bl9zaW5nbGVfcGt0X3Byb2Nlc3Moc3RydWN0IHJ0ZV9pcHNlY19z
YSAqc2EsIHN0cnVjdCBydGVfbWJ1ZiAqbWIsDQo+ICsJdWludDMyX3QgKnNxbikNCj4gK3sNCj4g
Kwl1aW50MzJfdCBobGVuLCBpY3ZfbGVuLCB0bGVuOw0KPiArCXN0cnVjdCBlc3BfaGRyICplc3Bo
Ow0KPiArCXN0cnVjdCBlc3BfdGFpbCAqZXNwdDsNCj4gKwlzdHJ1Y3QgcnRlX21idWYgKm1sOw0K
PiArCWNoYXIgKnBkOw0KPiArDQo+ICsJaWYgKG1iLT5vbF9mbGFncyAmIFBLVF9SWF9TRUNfT0ZG
TE9BRF9GQUlMRUQpDQo+ICsJCXJldHVybiAtRUJBRE1TRzsNCj4gKw0KPiArCWljdl9sZW4gPSBz
YS0+aWN2X2xlbjsNCj4gKw0KPiArCW1sID0gcnRlX3BrdG1idWZfbGFzdHNlZyhtYik7DQo+ICsJ
ZXNwdCA9IHJ0ZV9wa3RtYnVmX210b2Rfb2Zmc2V0KG1sLCBzdHJ1Y3QgZXNwX3RhaWwgKiwNCj4g
KwkJbWwtPmRhdGFfbGVuIC0gaWN2X2xlbiAtIHNpemVvZigqZXNwdCkpOw0KPiArDQo+ICsJLyoN
Cj4gKwkgKiBjaGVjayBwYWRkaW5nIGFuZCBuZXh0IHByb3RvLg0KPiArCSAqIHJldHVybiBhbiBl
cnJvciBpZiBzb21ldGhpbmcgaXMgd3JvbmcuDQo+ICsJICovDQo+ICsJcGQgPSAoY2hhciAqKWVz
cHQgLSBlc3B0LT5wYWRfbGVuOw0KPiArCWlmIChlc3B0LT5uZXh0X3Byb3RvICE9IHNhLT5wcm90
byB8fA0KPiArCQkJbWVtY21wKHBkLCBlc3BfcGFkX2J5dGVzLCBlc3B0LT5wYWRfbGVuKSkNCj4g
KwkJcmV0dXJuIC1FSU5WQUw7DQo+ICsNCj4gKwkvKiBjdXQgb2YgSUNWLCBFU1AgdGFpbCBhbmQg
cGFkZGluZyBieXRlcyAqLw0KPiArCXRsZW4gPSBpY3ZfbGVuICsgc2l6ZW9mKCplc3B0KSArIGVz
cHQtPnBhZF9sZW47DQo+ICsJbWwtPmRhdGFfbGVuIC09IHRsZW47DQo+ICsJbWItPnBrdF9sZW4g
LT0gdGxlbjsNCj4gKw0KPiArCS8qIGN1dCBvZiBMMi9MMyBoZWFkZXJzLCBFU1AgaGVhZGVyIGFu
ZCBJViAqLw0KPiArCWhsZW4gPSBtYi0+bDJfbGVuICsgbWItPmwzX2xlbjsNCj4gKwllc3BoID0g
cnRlX3BrdG1idWZfbXRvZF9vZmZzZXQobWIsIHN0cnVjdCBlc3BfaGRyICosIGhsZW4pOw0KPiAr
CXJ0ZV9wa3RtYnVmX2FkaihtYiwgaGxlbiArIHNhLT5jdHAuY2lwaGVyLm9mZnNldCk7DQo+ICsN
Cj4gKwkvKiByZXRyaWV2ZSBTUU4gZm9yIGxhdGVyIGNoZWNrICovDQo+ICsJKnNxbiA9IHJ0ZV9i
ZV90b19jcHVfMzIoZXNwaC0+c2VxKTsNCj4gKw0KPiArCS8qIHJlc2V0IG1idWYgbWV0YXRkYXRh
OiBMMi9MMyBsZW4sIHBhY2tldCB0eXBlICovDQo+ICsJbWItPnBhY2tldF90eXBlID0gUlRFX1BU
WVBFX1VOS05PV047DQo+ICsJbWItPmwyX2xlbiA9IDA7DQo+ICsJbWItPmwzX2xlbiA9IDA7DQo+
ICsNCj4gKwkvKiBjbGVhciB0aGUgUEtUX1JYX1NFQ19PRkZMT0FEIGZsYWcgaWYgc2V0ICovDQo+
ICsJbWItPm9sX2ZsYWdzICY9IH4obWItPm9sX2ZsYWdzICYgUEtUX1JYX1NFQ19PRkZMT0FEKTsN
Cj4gKwlyZXR1cm4gMDsNCj4gK30NCj4gKw0KPiArc3RhdGljIGlubGluZSBpbnQNCj4gK2VzcF9p
bmJfdHJzX3NpbmdsZV9wa3RfcHJvY2VzcyhzdHJ1Y3QgcnRlX2lwc2VjX3NhICpzYSwgc3RydWN0
IHJ0ZV9tYnVmICptYiwNCj4gKwl1aW50MzJfdCAqc3FuKQ0KPiArew0KPiArCXVpbnQzMl90IGhs
ZW4sIGljdl9sZW4sIGwybGVuLCBsM2xlbiwgdGxlbjsNCj4gKwlzdHJ1Y3QgZXNwX2hkciAqZXNw
aDsNCj4gKwlzdHJ1Y3QgZXNwX3RhaWwgKmVzcHQ7DQo+ICsJc3RydWN0IHJ0ZV9tYnVmICptbDsN
Cj4gKwljaGFyICpucCwgKm9wLCAqcGQ7DQo+ICsNCj4gKwlpZiAobWItPm9sX2ZsYWdzICYgUEtU
X1JYX1NFQ19PRkZMT0FEX0ZBSUxFRCkNCj4gKwkJcmV0dXJuIC1FQkFETVNHOw0KPiArDQo+ICsJ
aWN2X2xlbiA9IHNhLT5pY3ZfbGVuOw0KPiArDQo+ICsJbWwgPSBydGVfcGt0bWJ1Zl9sYXN0c2Vn
KG1iKTsNCj4gKwllc3B0ID0gcnRlX3BrdG1idWZfbXRvZF9vZmZzZXQobWwsIHN0cnVjdCBlc3Bf
dGFpbCAqLA0KPiArCQltbC0+ZGF0YV9sZW4gLSBpY3ZfbGVuIC0gc2l6ZW9mKCplc3B0KSk7DQo+
ICsNCj4gKwkvKiBjaGVjayBwYWRkaW5nLCByZXR1cm4gYW4gZXJyb3IgaWYgc29tZXRoaW5nIGlz
IHdyb25nLiAqLw0KPiArCXBkID0gKGNoYXIgKillc3B0IC0gZXNwdC0+cGFkX2xlbjsNCj4gKwlp
ZiAobWVtY21wKHBkLCBlc3BfcGFkX2J5dGVzLCBlc3B0LT5wYWRfbGVuKSkNCj4gKwkJcmV0dXJu
IC1FSU5WQUw7DQo+ICsNCj4gKwkvKiBjdXQgb2YgSUNWLCBFU1AgdGFpbCBhbmQgcGFkZGluZyBi
eXRlcyAqLw0KPiArCXRsZW4gPSBpY3ZfbGVuICsgc2l6ZW9mKCplc3B0KSArIGVzcHQtPnBhZF9s
ZW47DQo+ICsJbWwtPmRhdGFfbGVuIC09IHRsZW47DQo+ICsJbWItPnBrdF9sZW4gLT0gdGxlbjsN
Cj4gKw0KPiArCS8qIHJldHJpZXZlIFNRTiBmb3IgbGF0ZXIgY2hlY2sgKi8NCj4gKwlsMmxlbiA9
IG1iLT5sMl9sZW47DQo+ICsJbDNsZW4gPSBtYi0+bDNfbGVuOw0KPiArCWhsZW4gPSBsMmxlbiAr
IGwzbGVuOw0KPiArCW9wID0gcnRlX3BrdG1idWZfbXRvZChtYiwgY2hhciAqKTsNCj4gKwllc3Bo
ID0gKHN0cnVjdCBlc3BfaGRyICopKG9wICsgaGxlbik7DQo+ICsJKnNxbiA9IHJ0ZV9iZV90b19j
cHVfMzIoZXNwaC0+c2VxKTsNCj4gKw0KPiArCS8qIGN1dCBvZmYgRVNQIGhlYWRlciBhbmQgSVYs
IHVwZGF0ZSBMMyBoZWFkZXIgKi8NCj4gKwlucCA9IHJ0ZV9wa3RtYnVmX2FkaihtYiwgc2EtPmN0
cC5jaXBoZXIub2Zmc2V0KTsNCj4gKwlyZW1vdmVfZXNwaChucCwgb3AsIGhsZW4pOw0KPiArCXVw
ZGF0ZV90cnNfbDNoZHIoc2EsIG5wICsgbDJsZW4sIG1iLT5wa3RfbGVuLCBsMmxlbiwgbDNsZW4s
DQo+ICsJCQllc3B0LT5uZXh0X3Byb3RvKTsNCj4gKw0KPiArCS8qIHJlc2V0IG1idWYgcGFja2V0
IHR5cGUgKi8NCj4gKwltYi0+cGFja2V0X3R5cGUgJj0gKFJURV9QVFlQRV9MMl9NQVNLIHwgUlRF
X1BUWVBFX0wzX01BU0spOw0KPiArDQo+ICsJLyogY2xlYXIgdGhlIFBLVF9SWF9TRUNfT0ZGTE9B
RCBmbGFnIGlmIHNldCAqLw0KPiArCW1iLT5vbF9mbGFncyAmPSB+KG1iLT5vbF9mbGFncyAmIFBL
VF9SWF9TRUNfT0ZGTE9BRCk7DQo+ICsJcmV0dXJuIDA7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBp
bmxpbmUgdWludDE2X3QNCj4gK2VzcF9pbmJfcnNuX3VwZGF0ZShzdHJ1Y3QgcnRlX2lwc2VjX3Nh
ICpzYSwgY29uc3QgdWludDMyX3Qgc3FuW10sDQo+ICsJc3RydWN0IHJ0ZV9tYnVmICptYltdLCBz
dHJ1Y3QgcnRlX21idWYgKmRyW10sIHVpbnQxNl90IG51bSkNCj4gK3sNCj4gKwl1aW50MzJfdCBp
LCBrOw0KPiArCXN0cnVjdCByZXBsYXlfc3FuICpyc247DQo+ICsNCj4gKwlyc24gPSBzYS0+c3Fu
LmluYjsNCj4gKw0KPiArCWsgPSAwOw0KPiArCWZvciAoaSA9IDA7IGkgIT0gbnVtOyBpKyspIHsN
Cj4gKwkJaWYgKGVzbl9pbmJfdXBkYXRlX3Nxbihyc24sIHNhLCBzcW5baV0pID09IDApDQo+ICsJ
CQltYltrKytdID0gbWJbaV07DQo+ICsJCWVsc2UNCj4gKwkJCWRyW2kgLSBrXSA9IG1iW2ldOw0K
PiArCX0NCj4gKw0KPiArCXJldHVybiBrOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgdWludDE2X3QN
Cj4gK2luYl90dW5fcGt0X3Byb2Nlc3MoY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zZXNzaW9uICpz
cywgc3RydWN0IHJ0ZV9tYnVmICptYltdLA0KPiArCXVpbnQxNl90IG51bSkNCj4gK3sNCj4gKwl1
aW50MzJfdCBpLCBrOw0KPiArCXN0cnVjdCBydGVfaXBzZWNfc2EgKnNhOw0KPiArCXVpbnQzMl90
IHNxbltudW1dOw0KPiArCXN0cnVjdCBydGVfbWJ1ZiAqZHJbbnVtXTsNCj4gKw0KPiArCXNhID0g
c3MtPnNhOw0KPiArDQo+ICsJLyogcHJvY2VzcyBwYWNrZXRzLCBleHRyYWN0IHNlcSBudW1iZXJz
ICovDQo+ICsNCj4gKwlrID0gMDsNCj4gKwlmb3IgKGkgPSAwOyBpICE9IG51bTsgaSsrKSB7DQo+
ICsJCS8qIGdvb2QgcGFja2V0ICovDQo+ICsJCWlmIChlc3BfaW5iX3R1bl9zaW5nbGVfcGt0X3By
b2Nlc3Moc2EsIG1iW2ldLCBzcW4gKyBrKSA9PSAwKQ0KPiArCQkJbWJbaysrXSA9IG1iW2ldOw0K
PiArCQkvKiBiYWQgcGFja2V0LCB3aWxsIGRyb3AgZnJvbSBmdXJodGVyIHByb2Nlc3NpbmcgKi8N
Cj4gKwkJZWxzZQ0KPiArCQkJZHJbaSAtIGtdID0gbWJbaV07DQo+ICsJfQ0KPiArDQo+ICsJLyog
dXBkYXRlIHNlcSAjIGFuZCByZXBsYXkgd2lub3cgKi8NCj4gKwlrID0gZXNwX2luYl9yc25fdXBk
YXRlKHNhLCBzcW4sIG1iLCBkciArIGkgLSBrLCBrKTsNCj4gKw0KPiArCS8qIGhhbmRsZSB1bnBy
b2Nlc3NlZCBtYnVmcyAqLw0KPiArCWlmIChrICE9IG51bSkgew0KPiArCQlydGVfZXJybm8gPSBF
QkFETVNHOw0KPiArCQlpZiAoayAhPSAwKQ0KPiArCQkJbWJ1Zl9idWxrX2NvcHkobWIgKyBrLCBk
ciwgbnVtIC0gayk7DQo+ICsJfQ0KPiArDQo+ICsJcmV0dXJuIGs7DQo+ICt9DQo+ICsNCj4gK3N0
YXRpYyB1aW50MTZfdA0KPiAraW5iX3Ryc19wa3RfcHJvY2Vzcyhjb25zdCBzdHJ1Y3QgcnRlX2lw
c2VjX3Nlc3Npb24gKnNzLCBzdHJ1Y3QgcnRlX21idWYgKm1iW10sDQo+ICsJdWludDE2X3QgbnVt
KQ0KPiArew0KPiArCXVpbnQzMl90IGksIGs7DQo+ICsJdWludDMyX3Qgc3FuW251bV07DQo+ICsJ
c3RydWN0IHJ0ZV9pcHNlY19zYSAqc2E7DQo+ICsJc3RydWN0IHJ0ZV9tYnVmICpkcltudW1dOw0K
PiArDQo+ICsJc2EgPSBzcy0+c2E7DQo+ICsNCj4gKwkvKiBwcm9jZXNzIHBhY2tldHMsIGV4dHJh
Y3Qgc2VxIG51bWJlcnMgKi8NCj4gKw0KPiArCWsgPSAwOw0KPiArCWZvciAoaSA9IDA7IGkgIT0g
bnVtOyBpKyspIHsNCj4gKwkJLyogZ29vZCBwYWNrZXQgKi8NCj4gKwkJaWYgKGVzcF9pbmJfdHJz
X3NpbmdsZV9wa3RfcHJvY2VzcyhzYSwgbWJbaV0sIHNxbiArIGspID09IDApDQo+ICsJCQltYltr
KytdID0gbWJbaV07DQo+ICsJCS8qIGJhZCBwYWNrZXQsIHdpbGwgZHJvcCBmcm9tIGZ1cmh0ZXIg
cHJvY2Vzc2luZyAqLw0KPiArCQllbHNlDQo+ICsJCQlkcltpIC0ga10gPSBtYltpXTsNCj4gKwl9
DQo+ICsNCj4gKwkvKiB1cGRhdGUgc2VxICMgYW5kIHJlcGxheSB3aW5vdyAqLw0KPiArCWsgPSBl
c3BfaW5iX3Jzbl91cGRhdGUoc2EsIHNxbiwgbWIsIGRyICsgaSAtIGssIGspOw0KPiArDQo+ICsJ
LyogaGFuZGxlIHVucHJvY2Vzc2VkIG1idWZzICovDQo+ICsJaWYgKGsgIT0gbnVtKSB7DQo+ICsJ
CXJ0ZV9lcnJubyA9IEVCQURNU0c7DQo+ICsJCWlmIChrICE9IDApDQo+ICsJCQltYnVmX2J1bGtf
Y29weShtYiArIGssIGRyLCBudW0gLSBrKTsNCj4gKwl9DQo+ICsNCj4gKwlyZXR1cm4gazsNCj4g
K30NCj4gKw0KPiArLyoNCj4gKyAqIHByb2Nlc3Mgb3V0Ym91bmQgcGFja2V0cyBmb3IgU0Egd2l0
aCBFU04gc3VwcG9ydCwNCj4gKyAqIGZvciBhbGdvcml0aG1zIHRoYXQgcmVxdWlyZSBTUU4uaGli
aXRzIHRvIGJlIGltcGxpY3RseSBpbmNsdWRlZA0KPiArICogaW50byBkaWdlc3QgY29tcHV0YXRp
b24uDQo+ICsgKiBJbiB0aGF0IGNhc2Ugd2UgaGF2ZSB0byBtb3ZlIElDViBieXRlcyBiYWNrIHRv
IHRoZWlyIHByb3BlciBwbGFjZS4NCj4gKyAqLw0KPiArc3RhdGljIHVpbnQxNl90DQo+ICtvdXRi
X3NxaF9wcm9jZXNzKGNvbnN0IHN0cnVjdCBydGVfaXBzZWNfc2Vzc2lvbiAqc3MsIHN0cnVjdCBy
dGVfbWJ1ZiAqbWJbXSwNCj4gKwl1aW50MTZfdCBudW0pDQo+ICt7DQo+ICsJdWludDMyX3QgaSwg
aywgaWN2X2xlbiwgKmljdjsNCj4gKwlzdHJ1Y3QgcnRlX21idWYgKm1sOw0KPiArCXN0cnVjdCBy
dGVfaXBzZWNfc2EgKnNhOw0KPiArCXN0cnVjdCBydGVfbWJ1ZiAqZHJbbnVtXTsNCj4gKw0KPiAr
CXNhID0gc3MtPnNhOw0KPiArDQo+ICsJayA9IDA7DQo+ICsJaWN2X2xlbiA9IHNhLT5pY3ZfbGVu
Ow0KPiArDQo+ICsJZm9yIChpID0gMDsgaSAhPSBudW07IGkrKykgew0KPiArCQlpZiAoKG1iW2ld
LT5vbF9mbGFncyAmIFBLVF9SWF9TRUNfT0ZGTE9BRF9GQUlMRUQpID09IDApIHsNCj4gKwkJCW1s
ID0gcnRlX3BrdG1idWZfbGFzdHNlZyhtYltpXSk7DQo+ICsJCQlpY3YgPSBydGVfcGt0bWJ1Zl9t
dG9kX29mZnNldChtbCwgdm9pZCAqLA0KPiArCQkJCW1sLT5kYXRhX2xlbiAtIGljdl9sZW4pOw0K
PiArCQkJcmVtb3ZlX3NxaChpY3YsIGljdl9sZW4pOw0KPiArCQkJbWJbaysrXSA9IG1iW2ldOw0K
PiArCQl9IGVsc2UNCj4gKwkJCWRyW2kgLSBrXSA9IG1iW2ldOw0KPiArCX0NCj4gKw0KPiArCS8q
IGhhbmRsZSB1bnByb2Nlc3NlZCBtYnVmcyAqLw0KPiArCWlmIChrICE9IG51bSkgew0KPiArCQly
dGVfZXJybm8gPSBFQkFETVNHOw0KPiArCQlpZiAoayAhPSAwKQ0KPiArCQkJbWJ1Zl9idWxrX2Nv
cHkobWIgKyBrLCBkciwgbnVtIC0gayk7DQo+ICsJfQ0KPiArDQo+ICsJcmV0dXJuIGs7DQo+ICt9
DQo+ICsNCj4gKy8qDQo+ICsgKiBzaW1wbGVzdCBwa3QgcHJvY2VzcyByb3V0aW5lOg0KPiArICog
YWxsIGFjdHVhbCBwcm9jZXNzaW5nIGlzIGRvbmUgYWxyZWFkeSBkb25lYnkgSFcvUE1ELA0KDQph
bGwgYWN0dWFsIHByb2Nlc3NpbmcgaXMgYWxyZWFkeSBkb25lIGJ5IEhXL1BNRA0KDQo+ICsgKiBq
dXN0IGNoZWNrIG1idWYgb2xfZmxhZ3MuDQo+ICsgKiB1c2VkIGZvcjoNCj4gKyAqIC0gaW5ib3Vu
ZCBmb3IgUlRFX1NFQ1VSSVRZX0FDVElPTl9UWVBFX0lOTElORV9QUk9UT0NPTA0KPiArICogLSBp
bmJvdW5kL291dGJvdW5kIGZvciBSVEVfU0VDVVJJVFlfQUNUSU9OX1RZUEVfTE9PS0FTSURFX1BS
T1RPQ09MDQo+ICsgKiAtIG91dGJvdW5kIGZvciBSVEVfU0VDVVJJVFlfQUNUSU9OX1RZUEVfTk9O
RSB3aGVuIEVTTiBpcyBkaXNhYmxlZA0KPiArICovDQo+ICtzdGF0aWMgdWludDE2X3QNCj4gK3Br
dF9mbGFnX3Byb2Nlc3MoY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zZXNzaW9uICpzcywgc3RydWN0
IHJ0ZV9tYnVmICptYltdLA0KPiArCXVpbnQxNl90IG51bSkNCj4gK3sNCj4gKwl1aW50MzJfdCBp
LCBrOw0KPiArCXN0cnVjdCBydGVfbWJ1ZiAqZHJbbnVtXTsNCj4gKw0KPiArCVJURV9TRVRfVVNF
RChzcyk7DQo+ICsNCj4gKwlrID0gMDsNCj4gKwlmb3IgKGkgPSAwOyBpICE9IG51bTsgaSsrKSB7
DQo+ICsJCWlmICgobWJbaV0tPm9sX2ZsYWdzICYgUEtUX1JYX1NFQ19PRkZMT0FEX0ZBSUxFRCkg
PT0gMCkNCj4gKwkJCW1iW2srK10gPSBtYltpXTsNCj4gKwkJZWxzZQ0KPiArCQkJZHJbaSAtIGtd
ID0gbWJbaV07DQo+ICsJfQ0KPiArDQo+ICsJLyogaGFuZGxlIHVucHJvY2Vzc2VkIG1idWZzICov
DQo+ICsJaWYgKGsgIT0gbnVtKSB7DQo+ICsJCXJ0ZV9lcnJubyA9IEVCQURNU0c7DQo+ICsJCWlm
IChrICE9IDApDQo+ICsJCQltYnVmX2J1bGtfY29weShtYiArIGssIGRyLCBudW0gLSBrKTsNCj4g
Kwl9DQo+ICsNCj4gKwlyZXR1cm4gazsNCj4gK30NCj4gKw0KPiArLyoNCj4gKyAqIHByZXBhcmUg
cGFja2V0cyBmb3IgaW5saW5lIGlwc2VjIHByb2Nlc3Npbmc6DQo+ICsgKiBzZXQgb2xfZmxhZ3Mg
YW5kIGF0dGFjaCBtZXRhZGF0YS4NCj4gKyAqLw0KPiArc3RhdGljIGlubGluZSB2b2lkDQo+ICtp
bmxpbmVfb3V0Yl9tYnVmX3ByZXBhcmUoY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zZXNzaW9uICpz
cywNCj4gKwlzdHJ1Y3QgcnRlX21idWYgKm1iW10sIHVpbnQxNl90IG51bSkNCj4gK3sNCj4gKwl1
aW50MzJfdCBpLCBvbF9mbGFnczsNCj4gKw0KPiArCW9sX2ZsYWdzID0gc3MtPnNlY3VyaXR5Lm9s
X2ZsYWdzICYgUlRFX1NFQ1VSSVRZX1RYX09MT0FEX05FRURfTURBVEE7DQo+ICsJZm9yIChpID0g
MDsgaSAhPSBudW07IGkrKykgew0KPiArDQo+ICsJCW1iW2ldLT5vbF9mbGFncyB8PSBQS1RfVFhf
U0VDX09GRkxPQUQ7DQo+ICsJCWlmIChvbF9mbGFncyAhPSAwKQ0KPiArCQkJcnRlX3NlY3VyaXR5
X3NldF9wa3RfbWV0YWRhdGEoc3MtPnNlY3VyaXR5LmN0eCwNCj4gKwkJCQlzcy0+c2VjdXJpdHku
c2VzLCBtYltpXSwgTlVMTCk7DQo+ICsJfQ0KPiArfQ0KPiArDQo+ICtzdGF0aWMgdWludDE2X3QN
Cj4gK2lubGluZV9vdXRiX3R1bl9wa3RfcHJvY2Vzcyhjb25zdCBzdHJ1Y3QgcnRlX2lwc2VjX3Nl
c3Npb24gKnNzLA0KPiArCXN0cnVjdCBydGVfbWJ1ZiAqbWJbXSwgdWludDE2X3QgbnVtKQ0KPiAr
ew0KPiArCWludDMyX3QgcmM7DQo+ICsJdWludDMyX3QgaSwgaywgbjsNCj4gKwl1aW50NjRfdCBz
cW47DQo+ICsJcnRlX2JlNjRfdCBzcWM7DQo+ICsJc3RydWN0IHJ0ZV9pcHNlY19zYSAqc2E7DQo+
ICsJdW5pb24gc3ltX29wX2RhdGEgaWN2Ow0KPiArCXVpbnQ2NF90IGl2W0lQU0VDX01BWF9JVl9R
V09SRF07DQo+ICsJc3RydWN0IHJ0ZV9tYnVmICpkcltudW1dOw0KPiArDQo+ICsJc2EgPSBzcy0+
c2E7DQo+ICsNCj4gKwluID0gbnVtOw0KPiArCXNxbiA9IGVzbl9vdXRiX3VwZGF0ZV9zcW4oc2Es
ICZuKTsNCj4gKwlpZiAobiAhPSBudW0pDQo+ICsJCXJ0ZV9lcnJubyA9IEVPVkVSRkxPVzsNCj4g
Kw0KPiArCWsgPSAwOw0KPiArCWZvciAoaSA9IDA7IGkgIT0gbjsgaSsrKSB7DQo+ICsNCj4gKwkJ
c3FjID0gcnRlX2NwdV90b19iZV82NChzcW4gKyBpKTsNCj4gKwkJZ2VuX2l2KGl2LCBzcWMpOw0K
PiArDQo+ICsJCS8qIHRyeSB0byB1cGRhdGUgdGhlIHBhY2tldCBpdHNlbGYgKi8NCj4gKwkJcmMg
PSBlc3Bfb3V0Yl90dW5fcGt0X3ByZXBhcmUoc2EsIHNxYywgaXYsIG1iW2ldLCAmaWN2KTsNCj4g
Kw0KPiArCQkvKiBzdWNjZXNzLCB1cGRhdGUgbWJ1ZiBmaWVsZHMgKi8NCj4gKwkJaWYgKHJjID49
IDApDQo+ICsJCQltYltrKytdID0gbWJbaV07DQo+ICsJCS8qIGZhaWx1cmUsIHB1dCBwYWNrZXQg
aW50byB0aGUgZGVhdGgtcm93ICovDQo+ICsJCWVsc2Ugew0KPiArCQkJZHJbaSAtIGtdID0gbWJb
aV07DQo+ICsJCQlydGVfZXJybm8gPSAtcmM7DQo+ICsJCX0NCj4gKwl9DQo+ICsNCj4gKwlpbmxp
bmVfb3V0Yl9tYnVmX3ByZXBhcmUoc3MsIG1iLCBrKTsNCj4gKw0KPiArCS8qIGNvcHkgbm90IHBy
b2Nlc3NlZCBtYnVmcyBiZXlvbmQgZ29vZCBvbmVzICovDQo+ICsJaWYgKGsgIT0gbnVtICYmIGsg
IT0gMCkNCj4gKwkJbWJ1Zl9idWxrX2NvcHkobWIgKyBrLCBkciwgbnVtIC0gayk7DQo+ICsNCj4g
KwlyZXR1cm4gazsNCj4gK30NCj4gKw0KPiArc3RhdGljIHVpbnQxNl90DQo+ICtpbmxpbmVfb3V0
Yl90cnNfcGt0X3Byb2Nlc3MoY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zZXNzaW9uICpzcywNCj4g
KwlzdHJ1Y3QgcnRlX21idWYgKm1iW10sIHVpbnQxNl90IG51bSkNCj4gK3sNCj4gKwlpbnQzMl90
IHJjOw0KPiArCXVpbnQzMl90IGksIGssIG4sIGwyLCBsMzsNCj4gKwl1aW50NjRfdCBzcW47DQo+
ICsJcnRlX2JlNjRfdCBzcWM7DQo+ICsJc3RydWN0IHJ0ZV9pcHNlY19zYSAqc2E7DQo+ICsJdW5p
b24gc3ltX29wX2RhdGEgaWN2Ow0KPiArCXVpbnQ2NF90IGl2W0lQU0VDX01BWF9JVl9RV09SRF07
DQo+ICsJc3RydWN0IHJ0ZV9tYnVmICpkcltudW1dOw0KPiArDQo+ICsJc2EgPSBzcy0+c2E7DQo+
ICsNCj4gKwluID0gbnVtOw0KPiArCXNxbiA9IGVzbl9vdXRiX3VwZGF0ZV9zcW4oc2EsICZuKTsN
Cj4gKwlpZiAobiAhPSBudW0pDQo+ICsJCXJ0ZV9lcnJubyA9IEVPVkVSRkxPVzsNCj4gKw0KPiAr
CWsgPSAwOw0KPiArCWZvciAoaSA9IDA7IGkgIT0gbjsgaSsrKSB7DQo+ICsNCj4gKwkJbDIgPSBt
YltpXS0+bDJfbGVuOw0KPiArCQlsMyA9IG1iW2ldLT5sM19sZW47DQo+ICsNCj4gKwkJc3FjID0g
cnRlX2NwdV90b19iZV82NChzcW4gKyBpKTsNCj4gKwkJZ2VuX2l2KGl2LCBzcWMpOw0KPiArDQo+
ICsJCS8qIHRyeSB0byB1cGRhdGUgdGhlIHBhY2tldCBpdHNlbGYgKi8NCj4gKwkJcmMgPSBlc3Bf
b3V0Yl90cnNfcGt0X3ByZXBhcmUoc2EsIHNxYywgaXYsIG1iW2ldLA0KPiArCQkJCWwyLCBsMywg
Jmljdik7DQo+ICsNCj4gKwkJLyogc3VjY2VzcywgdXBkYXRlIG1idWYgZmllbGRzICovDQo+ICsJ
CWlmIChyYyA+PSAwKQ0KPiArCQkJbWJbaysrXSA9IG1iW2ldOw0KPiArCQkvKiBmYWlsdXJlLCBw
dXQgcGFja2V0IGludG8gdGhlIGRlYXRoLXJvdyAqLw0KPiArCQllbHNlIHsNCj4gKwkJCWRyW2kg
LSBrXSA9IG1iW2ldOw0KPiArCQkJcnRlX2Vycm5vID0gLXJjOw0KPiArCQl9DQo+ICsJfQ0KPiAr
DQo+ICsJaW5saW5lX291dGJfbWJ1Zl9wcmVwYXJlKHNzLCBtYiwgayk7DQo+ICsNCj4gKwkvKiBj
b3B5IG5vdCBwcm9jZXNzZWQgbWJ1ZnMgYmV5b25kIGdvb2Qgb25lcyAqLw0KPiArCWlmIChrICE9
IG51bSAmJiBrICE9IDApDQo+ICsJCW1idWZfYnVsa19jb3B5KG1iICsgaywgZHIsIG51bSAtIGsp
Ow0KPiArDQo+ICsJcmV0dXJuIGs7DQo+ICt9DQo+ICsNCj4gKy8qDQo+ICsgKiBvdXRib3VuZCBm
b3IgUlRFX1NFQ1VSSVRZX0FDVElPTl9UWVBFX0lOTElORV9QUk9UT0NPTDoNCj4gKyAqIGFjdHVh
bCBwcm9jZXNzaW5nIGlzIGRvbmUgYnkgSFcvUE1ELCBqdXN0IHNldCBmbGFncyBhbmQgbWV0YWRh
dGEuDQo+ICsgKi8NCj4gK3N0YXRpYyB1aW50MTZfdA0KPiArb3V0Yl9pbmxpbmVfcHJvdG9fcHJv
Y2Vzcyhjb25zdCBzdHJ1Y3QgcnRlX2lwc2VjX3Nlc3Npb24gKnNzLA0KPiArCQlzdHJ1Y3QgcnRl
X21idWYgKm1iW10sIHVpbnQxNl90IG51bSkNCj4gK3sNCj4gKwlpbmxpbmVfb3V0Yl9tYnVmX3By
ZXBhcmUoc3MsIG1iLCBudW0pOw0KPiArCXJldHVybiBudW07DQo+ICt9DQo+ICsNCj4gK3N0YXRp
YyBpbnQNCj4gK2xrc2Rfbm9uZV9wa3RfZnVuY19zZWxlY3QoY29uc3Qgc3RydWN0IHJ0ZV9pcHNl
Y19zYSAqc2EsDQo+ICsJCXN0cnVjdCBydGVfaXBzZWNfc2FfcGt0X2Z1bmMgKnBmKQ0KPiArew0K
PiArCWludDMyX3QgcmM7DQo+ICsNCj4gKwlzdGF0aWMgY29uc3QgdWludDY0X3QgbXNrID0gUlRF
X0lQU0VDX1NBVFBfRElSX01BU0sgfA0KPiArCQkJUlRFX0lQU0VDX1NBVFBfTU9ERV9NQVNLOw0K
PiArDQo+ICsJcmMgPSAwOw0KPiArCXN3aXRjaCAoc2EtPnR5cGUgJiBtc2spIHsNCj4gKwljYXNl
IChSVEVfSVBTRUNfU0FUUF9ESVJfSUIgfCBSVEVfSVBTRUNfU0FUUF9NT0RFX1RVTkxWNCk6DQo+
ICsJY2FzZSAoUlRFX0lQU0VDX1NBVFBfRElSX0lCIHwgUlRFX0lQU0VDX1NBVFBfTU9ERV9UVU5M
VjYpOg0KPiArCQlwZi0+cHJlcGFyZSA9IGluYl9wa3RfcHJlcGFyZTsNCj4gKwkJcGYtPnByb2Nl
c3MgPSBpbmJfdHVuX3BrdF9wcm9jZXNzOw0KPiArCQlicmVhazsNCj4gKwljYXNlIChSVEVfSVBT
RUNfU0FUUF9ESVJfSUIgfCBSVEVfSVBTRUNfU0FUUF9NT0RFX1RSQU5TKToNCj4gKwkJcGYtPnBy
ZXBhcmUgPSBpbmJfcGt0X3ByZXBhcmU7DQo+ICsJCXBmLT5wcm9jZXNzID0gaW5iX3Ryc19wa3Rf
cHJvY2VzczsNCj4gKwkJYnJlYWs7DQo+ICsJY2FzZSAoUlRFX0lQU0VDX1NBVFBfRElSX09CIHwg
UlRFX0lQU0VDX1NBVFBfTU9ERV9UVU5MVjQpOg0KPiArCWNhc2UgKFJURV9JUFNFQ19TQVRQX0RJ
Ul9PQiB8IFJURV9JUFNFQ19TQVRQX01PREVfVFVOTFY2KToNCj4gKwkJcGYtPnByZXBhcmUgPSBv
dXRiX3R1bl9wcmVwYXJlOw0KPiArCQlwZi0+cHJvY2VzcyA9IChzYS0+c3FoX2xlbiAhPSAwKSA/
DQo+ICsJCQlvdXRiX3NxaF9wcm9jZXNzIDogcGt0X2ZsYWdfcHJvY2VzczsNCj4gKwkJYnJlYWs7
DQo+ICsJY2FzZSAoUlRFX0lQU0VDX1NBVFBfRElSX09CIHwgUlRFX0lQU0VDX1NBVFBfTU9ERV9U
UkFOUyk6DQo+ICsJCXBmLT5wcmVwYXJlID0gb3V0Yl90cnNfcHJlcGFyZTsNCj4gKwkJcGYtPnBy
b2Nlc3MgPSAoc2EtPnNxaF9sZW4gIT0gMCkgPw0KPiArCQkJb3V0Yl9zcWhfcHJvY2VzcyA6IHBr
dF9mbGFnX3Byb2Nlc3M7DQo+ICsJCWJyZWFrOw0KPiArCWRlZmF1bHQ6DQo+ICsJCXJjID0gLUVO
T1RTVVA7DQo+ICsJfQ0KPiArDQo+ICsJcmV0dXJuIHJjOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMg
aW50DQo+ICtpbmxpbmVfY3J5cHRvX3BrdF9mdW5jX3NlbGVjdChjb25zdCBzdHJ1Y3QgcnRlX2lw
c2VjX3NhICpzYSwNCj4gKwkJc3RydWN0IHJ0ZV9pcHNlY19zYV9wa3RfZnVuYyAqcGYpDQo+ICt7
DQo+ICsJaW50MzJfdCByYzsNCj4gKw0KPiArCXN0YXRpYyBjb25zdCB1aW50NjRfdCBtc2sgPSBS
VEVfSVBTRUNfU0FUUF9ESVJfTUFTSyB8DQo+ICsJCQlSVEVfSVBTRUNfU0FUUF9NT0RFX01BU0s7
DQo+ICsNCj4gKwlyYyA9IDA7DQo+ICsJc3dpdGNoIChzYS0+dHlwZSAmIG1zaykgew0KPiArCWNh
c2UgKFJURV9JUFNFQ19TQVRQX0RJUl9JQiB8IFJURV9JUFNFQ19TQVRQX01PREVfVFVOTFY0KToN
Cj4gKwljYXNlIChSVEVfSVBTRUNfU0FUUF9ESVJfSUIgfCBSVEVfSVBTRUNfU0FUUF9NT0RFX1RV
TkxWNik6DQo+ICsJCXBmLT5wcm9jZXNzID0gaW5iX3R1bl9wa3RfcHJvY2VzczsNCj4gKwkJYnJl
YWs7DQo+ICsJY2FzZSAoUlRFX0lQU0VDX1NBVFBfRElSX0lCIHwgUlRFX0lQU0VDX1NBVFBfTU9E
RV9UUkFOUyk6DQo+ICsJCXBmLT5wcm9jZXNzID0gaW5iX3Ryc19wa3RfcHJvY2VzczsNCj4gKwkJ
YnJlYWs7DQo+ICsJY2FzZSAoUlRFX0lQU0VDX1NBVFBfRElSX09CIHwgUlRFX0lQU0VDX1NBVFBf
TU9ERV9UVU5MVjQpOg0KPiArCWNhc2UgKFJURV9JUFNFQ19TQVRQX0RJUl9PQiB8IFJURV9JUFNF
Q19TQVRQX01PREVfVFVOTFY2KToNCj4gKwkJcGYtPnByb2Nlc3MgPSBpbmxpbmVfb3V0Yl90dW5f
cGt0X3Byb2Nlc3M7DQo+ICsJCWJyZWFrOw0KPiArCWNhc2UgKFJURV9JUFNFQ19TQVRQX0RJUl9P
QiB8IFJURV9JUFNFQ19TQVRQX01PREVfVFJBTlMpOg0KPiArCQlwZi0+cHJvY2VzcyA9IGlubGlu
ZV9vdXRiX3Ryc19wa3RfcHJvY2VzczsNCj4gKwkJYnJlYWs7DQo+ICsJZGVmYXVsdDoNCj4gKwkJ
cmMgPSAtRU5PVFNVUDsNCj4gKwl9DQo+ICsNCj4gKwlyZXR1cm4gcmM7DQo+ICt9DQo+ICsNCj4g
ICBpbnQNCj4gICBpcHNlY19zYV9wa3RfZnVuY19zZWxlY3QoY29uc3Qgc3RydWN0IHJ0ZV9pcHNl
Y19zZXNzaW9uICpzcywNCj4gICAJY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zYSAqc2EsIHN0cnVj
dCBydGVfaXBzZWNfc2FfcGt0X2Z1bmMgKnBmKQ0KPiAgIHsNCj4gICAJaW50MzJfdCByYzsNCj4g
ICANCj4gLQlSVEVfU0VUX1VTRUQoc2EpOw0KPiAtDQo+ICAgCXJjID0gMDsNCj4gICAJcGZbMF0g
PSAoc3RydWN0IHJ0ZV9pcHNlY19zYV9wa3RfZnVuYykgeyAwIH07DQo+ICAgDQo+ICAgCXN3aXRj
aCAoc3MtPnR5cGUpIHsNCj4gKwljYXNlIFJURV9TRUNVUklUWV9BQ1RJT05fVFlQRV9OT05FOg0K
PiArCQlyYyA9IGxrc2Rfbm9uZV9wa3RfZnVuY19zZWxlY3Qoc2EsIHBmKTsNCj4gKwkJYnJlYWs7
DQo+ICsJY2FzZSBSVEVfU0VDVVJJVFlfQUNUSU9OX1RZUEVfSU5MSU5FX0NSWVBUTzoNCj4gKwkJ
cmMgPSBpbmxpbmVfY3J5cHRvX3BrdF9mdW5jX3NlbGVjdChzYSwgcGYpOw0KPiArCQlicmVhazsN
Cj4gKwljYXNlIFJURV9TRUNVUklUWV9BQ1RJT05fVFlQRV9JTkxJTkVfUFJPVE9DT0w6DQo+ICsJ
CWlmICgoc2EtPnR5cGUgJiBSVEVfSVBTRUNfU0FUUF9ESVJfTUFTSykgPT0NCj4gKwkJCQlSVEVf
SVBTRUNfU0FUUF9ESVJfSUIpDQo+ICsJCQlwZi0+cHJvY2VzcyA9IHBrdF9mbGFnX3Byb2Nlc3M7
DQo+ICsJCWVsc2UNCj4gKwkJCXBmLT5wcm9jZXNzID0gb3V0Yl9pbmxpbmVfcHJvdG9fcHJvY2Vz
czsNCj4gKwkJYnJlYWs7DQo+ICsJY2FzZSBSVEVfU0VDVVJJVFlfQUNUSU9OX1RZUEVfTE9PS0FT
SURFX1BST1RPQ09MOg0KPiArCQlwZi0+cHJlcGFyZSA9IGxrc2RfcHJvdG9fcHJlcGFyZTsNCmJl
dHRlciB0byB1c2UgbG9va2FzaWRlIGluc3RlYWQgb2YgbGtzZA0KPiArCQlwZi0+cHJvY2VzcyA9
IHBrdF9mbGFnX3Byb2Nlc3M7DQo+ICsJCWJyZWFrOw0KPiAgIAlkZWZhdWx0Og0KPiAgIAkJcmMg
PSAtRU5PVFNVUDsNCj4gICAJfQ0KDQo=