From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-eopbgr150047.outbound.protection.outlook.com [40.107.15.47]) by dpdk.org (Postfix) with ESMTP id 6B39725B3 for ; Tue, 22 Jan 2019 11:12:40 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector1-arm-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=j5vjGO88dfxyfNc31OAPpPDq9WMtUSGH7Tx83HyNeHQ=; b=BIlK7SwDRxGpWIGBkeT31XAiuAOETOEr9g+QjhYzeS+vAtJ1RoULOOR7swvHMZFuv4IKfjyYTLcGZnmc/vm1RQUdfhWIXCsfM6Sk8NNTL3D3xpDI92J5UbEVP2l25a8Xi8JccxCoIHMnN2Pu89YrpbVkSqVcWuxxOrglMd5UKHU= Received: from HE1PR0801MB2076.eurprd08.prod.outlook.com (10.168.95.140) by HE1PR0801MB1705.eurprd08.prod.outlook.com (10.168.149.141) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1537.31; Tue, 22 Jan 2019 10:12:37 +0000 Received: from HE1PR0801MB2076.eurprd08.prod.outlook.com ([fe80::f5e3:70fc:e834:3c42]) by HE1PR0801MB2076.eurprd08.prod.outlook.com ([fe80::f5e3:70fc:e834:3c42%3]) with mapi id 15.20.1537.031; Tue, 22 Jan 2019 10:12:37 +0000 From: Ola Liljedahl To: "gage.eads@intel.com" , "dev@dpdk.org" CC: "olivier.matz@6wind.com" , "stephen@networkplumber.org" , "bruce.richardson@intel.com" , "arybchenko@solarflare.com" , "konstantin.ananyev@intel.com" Thread-Topic: [dpdk-dev] [PATCH v3 2/5] ring: add a non-blocking implementation Thread-Index: AQHUr0H3NsJBTf2hT0+nXGXAmKraP6W7F3wA Date: Tue, 22 Jan 2019 10:12:36 +0000 Message-ID: <1548151958.5247.29.camel@arm.com> References: <20190115235227.14013-1-gage.eads@intel.com> <20190118152326.22686-1-gage.eads@intel.com> <20190118152326.22686-3-gage.eads@intel.com> In-Reply-To: <20190118152326.22686-3-gage.eads@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-mailer: Evolution 3.18.5.2-0ubuntu3.2 authentication-results: spf=none (sender IP is ) smtp.mailfrom=Ola.Liljedahl@arm.com; x-originating-ip: [217.140.106.54] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; HE1PR0801MB1705; 6:hG93B4sfq4wDjIhkNL2EkuXdgoSO3NVTMhWG+M3KW1KqPd5YAngZi/fyRoixqV+n5SQA37zdPuHKVZ+JhtBcA0QkxqtkLwP/MLw4qOT7NrekcjBjR8fkm+42hmEQ1Jj/nj9g0FHWou1JrsfSh53XEyIPK8cpL0cslorpPazn0MxRZjNHPc5fpAfgm2gwro4dLbv0/gLsJ5tYRaPrXkqNeqM/n5AI7G+uPQFvz5AIO5wgzNN4qKHRuSV9ZSK/q9MVh5wr1bSmrhi6sUANBLmpX3ZrlFFies3y77q3VbcfsCxZJAgYwhxQnZIFPnMceIAqchhPmk8d7lurI/x23f9UaG3MapksnofyTcUtqZ03k9IJWcqvqCHGPkSHuppFlCi4yIL7t2NfYk8LOSQdrfuE4saG4zaypTBFKMu4YsQvekL+XJkonQ0EYbGneWRwPTVtfIk7BOkmyMZDSyHCyTlVIw==; 5:7/M+3r5KaQcUtDBOCTRnsXdTa4fCzzFJuLn0YDHO/BUGTvTwX4DQrxW7Np0NMBEZa2ceOAHOnRvvF34HhdUrL5abmgQMOuXQJ/yFU/weLymKSSzZ+hfvzmQHadK+aysyZYl6aHk9PBji3p4vmwjfNCeGQvzNpTqb8XUM/VnrmKFpIL+fdEpUsWvCnKSlrs/NCw2ILnFf9gsCB8d0pcNuAw==; 7:dZn8aqSUWUk32imp1FqEbR7FXMOXYfml+gDJMQeHp+A67pZEv/vTLRELNDxol27wp+oNwdmw0tdmTNlzVFiag/KnRKUY448ii11BArlNp0acqDjuiS33ADiUNS1ZFlh5OQ0k+S79YfaNUKuUDUlNwQ== x-ms-exchange-antispam-srfa-diagnostics: SOS; x-ms-office365-filtering-correlation-id: 637c6ddc-b899-4823-f8da-08d680522253 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600109)(711020)(4618075)(2017052603328)(7153060)(7193020); SRVR:HE1PR0801MB1705; x-ms-traffictypediagnostic: HE1PR0801MB1705: x-microsoft-antispam-prvs: x-forefront-prvs: 0925081676 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(136003)(366004)(39860400002)(346002)(396003)(376002)(51234002)(40434004)(189003)(199004)(54906003)(305945005)(6436002)(6116002)(476003)(81156014)(186003)(3846002)(8676002)(81166006)(4326008)(86362001)(26005)(2616005)(2501003)(110136005)(7736002)(106356001)(446003)(6506007)(316002)(103116003)(25786009)(11346002)(105586002)(66066001)(6486002)(102836004)(71190400001)(71200400001)(99286004)(256004)(14444005)(5024004)(478600001)(14454004)(72206003)(2906002)(30864003)(68736007)(53946003)(6246003)(50226002)(76176011)(53936002)(486006)(6512007)(36756003)(8936002)(97736004)(229853002)(99106002)(579004)(569006); DIR:OUT; SFP:1101; SCL:1; SRVR:HE1PR0801MB1705; H:HE1PR0801MB2076.eurprd08.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: lX8X1BUt2M0Ye9MEfjyKNF/am5WtlRbfhUe7NZtpPnekM9g4BdwFdQHjgB/GXj+gPjHH6GT2w0EdhYQIXCemSD5Fur4ZWSfAIgrV3u5Rv74pnO5oIUPWR1fS+8nwxRFpGS4YNKOWaawFqSka3iOvF2kbLuGXG9eCRKAf+4pbImb8QozWeoCewMXIRuOAvX+3YInp4zbYbGwd87WiWsLK3bYp3ya295wzgcfUVcMykaVC2b/vlYPV5cFvbcn0d+T76/DFwThd66Kf3GBGemLfWsJ91QldfDGmZhIywz8mzpovN0bGImSD/ET7wqm3Rkq2p1BX2d5zxJ+/fg891SfOaAH9TnIzNvZteDvcpOZq2YYM/tqDxAN3Omfn64bb0LaZILKVvI1/XV44Yqh7cCAbwINgiOBxflpEZS9Ya2lanII= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-Network-Message-Id: 637c6ddc-b899-4823-f8da-08d680522253 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Jan 2019 10:12:36.9294 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB1705 Subject: Re: [dpdk-dev] [PATCH v3 2/5] ring: add a non-blocking implementation X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 22 Jan 2019 10:12:40 -0000 T24gRnJpLCAyMDE5LTAxLTE4IGF0IDA5OjIzIC0wNjAwLCBHYWdlIEVhZHMgd3JvdGU6DQo+IFRo aXMgY29tbWl0IGFkZHMgc3VwcG9ydCBmb3Igbm9uLWJsb2NraW5nIGNpcmN1bGFyIHJpbmcgZW5x dWV1ZSBhbmQNCj4gZGVxdWV1ZQ0KPiBmdW5jdGlvbnMuIFRoZSByaW5nIHVzZXMgYSAxMjgtYml0 IGNvbXBhcmUtYW5kLXN3YXAgaW5zdHJ1Y3Rpb24sIGFuZA0KPiB0aHVzDQo+IGlzIGN1cnJlbnRs eSBsaW1pdGVkIHRvIHg4Nl82NC4NCj4NCj4gVGhlIGFsZ29yaXRobSBpcyBiYXNlZCBvbiB0aGUg b3JpZ2luYWwgcnRlIHJpbmcgKGRlcml2ZWQgZnJvbQ0KPiBGcmVlQlNEJ3MNCj4gYnVmcmluZy5o KSBhbmQgaW5zcGlyZWQgYnkgTWljaGFlbCBhbmQgU2NvdHQncyBub24tYmxvY2tpbmcNCj4gY29u Y3VycmVudA0KPiBxdWV1ZS4gSW1wb3J0YW50bHksIGl0IGFkZHMgYSBtb2RpZmljYXRpb24gY291 bnRlciB0byBlYWNoIHJpbmcgZW50cnkNCj4gdG8NCj4gZW5zdXJlIG9ubHkgb25lIHRocmVhZCBj YW4gd3JpdGUgdG8gYW4gdW51c2VkIGVudHJ5Lg0KPiAtLS0tLQ0KPiBBbGdvcml0aG06DQo+DQo+ IE11bHRpLXByb2R1Y2VyIG5vbi1ibG9ja2luZyBlbnF1ZXVlOg0KPiAxLiBNb3ZlIHRoZSBwcm9k dWNlciBoZWFkIGluZGV4ICduJyBsb2NhdGlvbnMgZm9yd2FyZCwgZWZmZWN0aXZlbHkNCj4gICAg cmVzZXJ2aW5nICduJyBsb2NhdGlvbnMuDQo+IDIuIEZvciBlYWNoIHBvaW50ZXI6DQo+ICBhLiBS ZWFkIHRoZSBwcm9kdWNlciB0YWlsIGluZGV4LCB0aGVuIHJpbmdbdGFpbF0uIElmIHJpbmdbdGFp bF0ncw0KPiAgICAgbW9kaWZpY2F0aW9uIGNvdW50ZXIgaXNuJ3QgJ3RhaWwnLCByZXRyeS4NCj4g IGIuIENvbnN0cnVjdCB0aGUgbmV3IGVudHJ5OiB7cG9pbnRlciwgdGFpbCArIHJpbmcgc2l6ZX0N Cj4gIGMuIENvbXBhcmUtYW5kLXN3YXAgdGhlIG9sZCBlbnRyeSB3aXRoIHRoZSBuZXcuIElmIHVu c3VjY2Vzc2Z1bCwgdGhlDQo+ICAgICBuZXh0IGxvb3AgaXRlcmF0aW9uIHdpbGwgdHJ5IHRvIGVu cXVldWUgdGhpcyBwb2ludGVyIGFnYWluLg0KPiAgZC4gQ29tcGFyZS1hbmQtc3dhcCB0aGUgdGFp bCBpbmRleCB3aXRoICd0YWlsICsgMScsIHdoZXRoZXIgb3Igbm90DQo+IHN0ZXAgMmMNCj4gICAg IHN1Y2NlZWRlZC4gVGhpcyBndWFyYW50ZWVzIHRocmVhZHMgY2FuIG1ha2UgZm9yd2FyZCBwcm9n cmVzcy4NCj4NCj4gTXVsdGktY29uc3VtZXIgbm9uLWJsb2NraW5nIGRlcXVldWU6DQo+IDEuIE1v dmUgdGhlIGNvbnN1bWVyIGhlYWQgaW5kZXggJ24nIGxvY2F0aW9ucyBmb3J3YXJkLCBlZmZlY3Rp dmVseQ0KPiAgICByZXNlcnZpbmcgJ24nIHBvaW50ZXJzIHRvIGJlIGRlcXVldWVkLg0KPiAyLiBD b3B5ICduJyBwb2ludGVycyBpbnRvIHRoZSBjYWxsZXIncyBvYmplY3QgdGFibGUgKGlnbm9yaW5n IHRoZQ0KPiAgICBtb2RpZmljYXRpb24gY291bnRlciksIHN0YXJ0aW5nIGZyb20gcmluZ1t0YWls XSwgdGhlbiBjb21wYXJlLWFuZC0NCj4gc3dhcA0KPiAgICB0aGUgdGFpbCBpbmRleCB3aXRoICd0 YWlsICsgbicuICBJZiB1bnN1Y2Nlc3NmdWwsIHJlcGVhdCBzdGVwIDIuDQo+DQo+IC0tLS0tDQo+ IERpc2N1c3Npb246DQo+DQo+IFRoZXJlIGFyZSB0d28gY2FzZXMgd2hlcmUgdGhlIEFCQSBwcm9i bGVtIGlzIG1pdGlnYXRlZDoNCj4gMS4gRW5xdWV1ZWluZyBhIHBvaW50ZXIgdG8gdGhlIHJpbmc6 IHdpdGhvdXQgYSBtb2RpZmljYXRpb24gY291bnRlcg0KPiAgICB0aWVkIHRvIHRoZSB0YWlsIGlu ZGV4LCB0aGUgaW5kZXggY291bGQgYmVjb21lIHN0YWxlIGJ5IHRoZSB0aW1lDQo+IHRoZQ0KPiAg ICBlbnF1ZXVlIGhhcHBlbnMsIGNhdXNpbmcgaXQgdG8gb3ZlcndyaXRlIHZhbGlkIGRhdGEuIFR5 aW5nIHRoZQ0KPiAgICBjb3VudGVyIHRvIHRoZSB0YWlsIGluZGV4IGdpdmVzIHVzIGFuIGV4cGVj dGVkIHZhbHVlIChhcyBvcHBvc2VkDQo+IHRvLA0KPiAgICBzYXksIGEgbW9ub3RvbmljYWxseSBp bmNyZW1lbnRpbmcgY291bnRlcikuDQo+DQo+ICAgIFNpbmNlIHRoZSBjb3VudGVyIHdpbGwgZXZl bnR1YWxseSB3cmFwLCB0aGVyZSBpcyBwb3RlbnRpYWwgZm9yIHRoZQ0KPiBBQkENCj4gICAgcHJv YmxlbS4gSG93ZXZlciwgdXNpbmcgYSA2NC1iaXQgY291bnRlciBtYWtlcyB0aGlzIGxpa2VsaWhv b2QNCj4gICAgZWZmZWN0aXZlbHkgemVyby4NCj4NCj4gMi4gVXBkYXRpbmcgYSB0YWlsIGluZGV4 OiB0aGUgQUJBIHByb2JsZW0gY2FuIG9jY3VyIGlmIHRoZSB0aHJlYWQgaXMNCj4gICAgcHJlZW1w dGVkIGFuZCB0aGUgdGFpbCBpbmRleCB3cmFwcyBhcm91bmQuIEhvd2V2ZXIsIHVzaW5nIDY0LWJp dA0KPiBpbmRleGVzDQo+ICAgIG1ha2VzIHRoaXMgbGlrZWxpaG9vZCBlZmZlY3RpdmVseSB6ZXJv Lg0KPg0KPiBXaXRoIG5vIGNvbnRlbnRpb24sIGFuIGVucXVldWUgb2YgbiBwb2ludGVycyB1c2Vz ICgxICsgMm4pIENBUw0KPiBvcGVyYXRpb25zDQo+IGFuZCBhIGRlcXVldWUgb2YgbiBwb2ludGVy cyB1c2VzIDIuIFRoaXMgYWxnb3JpdGhtIGhhcyB3b3JzZSBhdmVyYWdlLQ0KPiBjYXNlDQo+IHBl cmZvcm1hbmNlIHRoYW4gdGhlIHJlZ3VsYXIgcnRlIHJpbmcgKHBhcnRpY3VsYXJseSBhIGhpZ2hs eS0NCj4gY29udGVuZGVkIHJpbmcNCj4gd2l0aCBsYXJnZSBidWxrIGFjY2Vzc2VzKSwgaG93ZXZl cjoNCj4gLSBGb3IgYXBwbGljYXRpb25zIHdpdGggcHJlZW1wdGlibGUgcHRocmVhZHMsIHRoZSBy ZWd1bGFyIHJ0ZSByaW5nJ3MNCj4gICB3b3JzdC1jYXNlIHBlcmZvcm1hbmNlIChpLmUuIG9uZSB0 aHJlYWQgYmVpbmcgcHJlZW1wdGVkIGluIHRoZQ0KPiAgIHVwZGF0ZV90YWlsKCkgY3JpdGljYWwg c2VjdGlvbikgaXMgbXVjaCB3b3JzZSB0aGFuIHRoZSBub24tYmxvY2tpbmcNCj4gICByaW5nJ3Mu DQo+IC0gU29mdHdhcmUgY2FjaGluZyBjYW4gbWl0aWdhdGUgdGhlIGF2ZXJhZ2UgY2FzZSBwZXJm b3JtYW5jZSBmb3INCj4gcmluZy1iYXNlZA0KPiAgIGFsZ29yaXRobXMuIEZvciBleGFtcGxlLCBh IG5vbi1ibG9ja2luZyByaW5nIGJhc2VkIG1lbXBvb2wgKGENCj4gbGlrZWx5IHVzZQ0KPiAgIGNh c2UgZm9yIHRoaXMgcmluZykgd2l0aCBwZXItdGhyZWFkIGNhY2hpbmcuDQo+DQo+IFRoZSBub24t YmxvY2tpbmcgcmluZyBpcyBlbmFibGVkIHZpYSBhIG5ldyBmbGFnLCBSSU5HX0ZfTkIuIEJlY2F1 c2UNCj4gdGhlDQo+IHJpbmcncyBtZW1zaXplIGlzIG5vdyBhIGZ1bmN0aW9uIG9mIGl0cyBmbGFn cyAodGhlIG5vbi1ibG9ja2luZyByaW5nDQo+IHJlcXVpcmVzIDEyOGIgZm9yIGVhY2ggZW50cnkp LCB0aGlzIGNvbW1pdCBhZGRzIGEgbmV3IGFyZ3VtZW50DQo+ICgnZmxhZ3MnKSB0bw0KPiBydGVf cmluZ19nZXRfbWVtc2l6ZSgpLiBBbiBBUEkgZGVwcmVjYXRpb24gbm90aWNlIHdpbGwgYmUgc2Vu dCBpbiBhDQo+IHNlcGFyYXRlIGNvbW1pdC4NCj4NCj4gRm9yIGVhc2Utb2YtdXNlLCBleGlzdGlu ZyByaW5nIGVucXVldWUgYW5kIGRlcXVldWUgZnVuY3Rpb25zIHdvcmsgb24NCj4gYm90aA0KPiBy ZWd1bGFyIGFuZCBub24tYmxvY2tpbmcgcmluZ3MuIFRoaXMgaW50cm9kdWNlcyBhbiBhZGRpdGlv bmFsIGJyYW5jaA0KPiBpbg0KPiB0aGUgZGF0YXBhdGgsIGJ1dCB0aGlzIHNob3VsZCBiZSBhIGhp Z2hseSBwcmVkaWN0YWJsZSBicmFuY2guDQo+IHJpbmdfcGVyZl9hdXRvdGVzdCBzaG93cyBhIG5l Z2xpZ2libGUgcGVyZm9ybWFuY2UgaW1wYWN0OyBpdCdzIGhhcmQNCj4gdG8NCj4gZGlzdGluZ3Vp c2ggYSByZWFsIGRpZmZlcmVuY2UgdmVyc3VzIHN5c3RlbSBub2lzZS4NCj4NCj4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmluZ19wZXJmX2F1dG90ZXN0IGN5Y2xlcyB3aXRo DQo+IGJyYW5jaCAtDQo+ICAgICAgICAgICAgICBUZXN0ICAgICAgICAgICAgICAgICB8ICAgcmlu Z19wZXJmX2F1dG90ZXN0IGN5Y2xlcw0KPiB3aXRob3V0DQo+IC0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KPiBTUC9TQyBz aW5nbGUgZW5xL2RlcXVldWUgICAgICAgICAgfCAwLjMzDQo+IE1QL01DIHNpbmdsZSBlbnEvZGVx dWV1ZSAgICAgICAgICB8IC00LjAwDQo+IFNQL1NDIGJ1cnN0IGVucS9kZXF1ZXVlIChzaXplIDgp ICB8IDAuMDANCj4gTVAvTUMgYnVyc3QgZW5xL2RlcXVldWUgKHNpemUgOCkgIHwgMC4wMA0KPiBT UC9TQyBidXJzdCBlbnEvZGVxdWV1ZSAoc2l6ZSAzMikgfCAwLjAwDQo+IE1QL01DIGJ1cnN0IGVu cS9kZXF1ZXVlIChzaXplIDMyKSB8IDAuMDANCj4gU0MgZW1wdHkgZGVxdWV1ZSAgICAgICAgICAg ICAgICAgIHwgMS4wMA0KPiBNQyBlbXB0eSBkZXF1ZXVlICAgICAgICAgICAgICAgICAgfCAwLjAw DQo+DQo+IFNpbmdsZSBsY29yZToNCj4gU1AvU0MgYnVsayBlbnEvZGVxdWV1ZSAoc2l6ZSA4KSAg IHwgMC40OQ0KPiBNUC9NQyBidWxrIGVucS9kZXF1ZXVlIChzaXplIDgpICAgfCAwLjA4DQo+IFNQ L1NDIGJ1bGsgZW5xL2RlcXVldWUgKHNpemUgMzIpICB8IDAuMDcNCj4gTVAvTUMgYnVsayBlbnEv ZGVxdWV1ZSAoc2l6ZSAzMikgIHwgMC4wOQ0KPg0KPiBUd28gcGh5c2ljYWwgY29yZXM6DQo+IFNQ L1NDIGJ1bGsgZW5xL2RlcXVldWUgKHNpemUgOCkgICB8IDAuMTkNCj4gTVAvTUMgYnVsayBlbnEv ZGVxdWV1ZSAoc2l6ZSA4KSAgIHwgLTAuMzcNCj4gU1AvU0MgYnVsayBlbnEvZGVxdWV1ZSAoc2l6 ZSAzMikgIHwgMC4wOQ0KPiBNUC9NQyBidWxrIGVucS9kZXF1ZXVlIChzaXplIDMyKSAgfCAtMC4w NQ0KPg0KPiBUd28gTlVNQSBub2RlczoNCj4gU1AvU0MgYnVsayBlbnEvZGVxdWV1ZSAoc2l6ZSA4 KSAgIHwgLTEuOTYNCj4gTVAvTUMgYnVsayBlbnEvZGVxdWV1ZSAoc2l6ZSA4KSAgIHwgMC44OA0K PiBTUC9TQyBidWxrIGVucS9kZXF1ZXVlIChzaXplIDMyKSAgfCAwLjEwDQo+IE1QL01DIGJ1bGsg ZW5xL2RlcXVldWUgKHNpemUgMzIpICB8IDAuNDYNCj4NCj4gVGVzdCBzZXR1cDogeDg2XzY0IGJ1 aWxkIHdpdGggZGVmYXVsdCBjb25maWcsIGR1YWwtc29ja2V0IFhlb24gRTUtDQo+IDI2OTkgdjQs DQo+IHJ1bm5pbmcgb24gaXNvbGNwdXMgY29yZXMgd2l0aCBhIHRpY2tsZXNzIHNjaGVkdWxlci4g RWFjaCB0ZXN0IHJ1bg0KPiB0aHJlZQ0KPiB0aW1lcyBhbmQgdGhlIHJlc3VsdHMgYXZlcmFnZWQu DQo+DQo+IFNpZ25lZC1vZmYtYnk6IEdhZ2UgRWFkcyA8Z2FnZS5lYWRzQGludGVsLmNvbT4NCj4g LS0tDQo+ICBsaWIvbGlicnRlX3JpbmcvcnRlX3JpbmcuYyAgICAgICAgICAgfCAgNzIgKysrKy0N Cj4gIGxpYi9saWJydGVfcmluZy9ydGVfcmluZy5oICAgICAgICAgICB8IDU1MA0KPiArKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKystLQ0KPiAgbGliL2xpYnJ0ZV9yaW5nL3J0ZV9yaW5n X3ZlcnNpb24ubWFwIHwgICA3ICsNCj4gIDMgZmlsZXMgY2hhbmdlZCwgNTg3IGluc2VydGlvbnMo KyksIDQyIGRlbGV0aW9ucygtKQ0KPg0KPiBkaWZmIC0tZ2l0IGEvbGliL2xpYnJ0ZV9yaW5nL3J0 ZV9yaW5nLmMgYi9saWIvbGlicnRlX3JpbmcvcnRlX3JpbmcuYw0KPiBpbmRleCBkMjE1YWNlY2Mu LmYzMzc4ZGNjZCAxMDA2NDQNCj4gLS0tIGEvbGliL2xpYnJ0ZV9yaW5nL3J0ZV9yaW5nLmMNCj4g KysrIGIvbGliL2xpYnJ0ZV9yaW5nL3J0ZV9yaW5nLmMNCj4gQEAgLTQ1LDkgKzQ1LDkgQEAgRUFM X1JFR0lTVEVSX1RBSUxRKHJ0ZV9yaW5nX3RhaWxxKQ0KPg0KPiAgLyogcmV0dXJuIHRoZSBzaXpl IG9mIG1lbW9yeSBvY2N1cGllZCBieSBhIHJpbmcgKi8NCj4gIHNzaXplX3QNCj4gLXJ0ZV9yaW5n X2dldF9tZW1zaXplKHVuc2lnbmVkIGNvdW50KQ0KPiArcnRlX3JpbmdfZ2V0X21lbXNpemVfdjE5 MDUodW5zaWduZWQgaW50IGNvdW50LCB1bnNpZ25lZCBpbnQgZmxhZ3MpDQo+ICB7DQo+IC1zc2l6 ZV90IHN6Ow0KPiArc3NpemVfdCBzeiwgZWx0X3N6Ow0KPg0KPiAgLyogY291bnQgbXVzdCBiZSBh IHBvd2VyIG9mIDIgKi8NCj4gIGlmICgoIVBPV0VST0YyKGNvdW50KSkgfHwgKGNvdW50ID4gUlRF X1JJTkdfU1pfTUFTSyApKSB7DQo+IEBAIC01NywxMCArNTcsMjMgQEAgcnRlX3JpbmdfZ2V0X21l bXNpemUodW5zaWduZWQgY291bnQpDQo+ICByZXR1cm4gLUVJTlZBTDsNCj4gIH0NCj4NCj4gLXN6 ID0gc2l6ZW9mKHN0cnVjdCBydGVfcmluZykgKyBjb3VudCAqIHNpemVvZih2b2lkICopOw0KPiAr ZWx0X3N6ID0gKGZsYWdzICYgUklOR19GX05CKSA/IDIgKiBzaXplb2Yodm9pZCAqKSA6DQo+IHNp emVvZih2b2lkICopOw0KPiArDQo+ICtzeiA9IHNpemVvZihzdHJ1Y3QgcnRlX3JpbmcpICsgY291 bnQgKiBlbHRfc3o7DQo+ICBzeiA9IFJURV9BTElHTihzeiwgUlRFX0NBQ0hFX0xJTkVfU0laRSk7 DQo+ICByZXR1cm4gc3o7DQo+ICB9DQo+ICtCSU5EX0RFRkFVTFRfU1lNQk9MKHJ0ZV9yaW5nX2dl dF9tZW1zaXplLCBfdjE5MDUsIDE5LjA1KTsNCj4gK01BUF9TVEFUSUNfU1lNQk9MKHNzaXplX3Qg cnRlX3JpbmdfZ2V0X21lbXNpemUodW5zaWduZWQgaW50IGNvdW50LA0KPiArICAgICAgIHVuc2ln bmVkIGludCBmbGFncyksDQo+ICsgIHJ0ZV9yaW5nX2dldF9tZW1zaXplX3YxOTA1KTsNCj4gKw0K PiArc3NpemVfdA0KPiArcnRlX3JpbmdfZ2V0X21lbXNpemVfdjIwKHVuc2lnbmVkIGludCBjb3Vu dCkNCj4gK3sNCj4gK3JldHVybiBydGVfcmluZ19nZXRfbWVtc2l6ZV92MTkwNShjb3VudCwgMCk7 DQo+ICt9DQo+ICtWRVJTSU9OX1NZTUJPTChydGVfcmluZ19nZXRfbWVtc2l6ZSwgX3YyMCwgMi4w KTsNCj4NCj4gIGludA0KPiAgcnRlX3JpbmdfaW5pdChzdHJ1Y3QgcnRlX3JpbmcgKnIsIGNvbnN0 IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGNvdW50LA0KPiBAQCAtODIsOCArOTUsNiBAQCBydGVfcmlu Z19pbml0KHN0cnVjdCBydGVfcmluZyAqciwgY29uc3QgY2hhciAqbmFtZSwNCj4gdW5zaWduZWQg Y291bnQsDQo+ICBpZiAocmV0IDwgMCB8fCByZXQgPj0gKGludClzaXplb2Yoci0+bmFtZSkpDQo+ ICByZXR1cm4gLUVOQU1FVE9PTE9ORzsNCj4gIHItPmZsYWdzID0gZmxhZ3M7DQo+IC1yLT5wcm9k LnNpbmdsZSA9IChmbGFncyAmIFJJTkdfRl9TUF9FTlEpID8gX19JU19TUCA6DQo+IF9fSVNfTVA7 DQo+IC1yLT5jb25zLnNpbmdsZSA9IChmbGFncyAmIFJJTkdfRl9TQ19ERVEpID8gX19JU19TQyA6 DQo+IF9fSVNfTUM7DQo+DQo+ICBpZiAoZmxhZ3MgJiBSSU5HX0ZfRVhBQ1RfU1opIHsNCj4gIHIt PnNpemUgPSBydGVfYWxpZ24zMnBvdzIoY291bnQgKyAxKTsNCj4gQEAgLTEwMCw4ICsxMTEsMzAg QEAgcnRlX3JpbmdfaW5pdChzdHJ1Y3QgcnRlX3JpbmcgKnIsIGNvbnN0IGNoYXINCj4gKm5hbWUs IHVuc2lnbmVkIGNvdW50LA0KPiAgci0+bWFzayA9IGNvdW50IC0gMTsNCj4gIHItPmNhcGFjaXR5 ID0gci0+bWFzazsNCj4gIH0NCj4gLXItPnByb2QuaGVhZCA9IHItPmNvbnMuaGVhZCA9IDA7DQo+ IC1yLT5wcm9kLnRhaWwgPSByLT5jb25zLnRhaWwgPSAwOw0KPiArDQo+ICtpZiAoZmxhZ3MgJiBS SU5HX0ZfTkIpIHsNCj4gK3VpbnQ2NF90IGk7DQo+ICsNCj4gK3ItPnByb2RfNjQuc2luZ2xlID0g KGZsYWdzICYgUklOR19GX1NQX0VOUSkgPw0KPiBfX0lTX1NQIDogX19JU19NUDsNCj4gK3ItPmNv bnNfNjQuc2luZ2xlID0gKGZsYWdzICYgUklOR19GX1NDX0RFUSkgPw0KPiBfX0lTX1NDIDogX19J U19NQzsNCj4gK3ItPnByb2RfNjQuaGVhZCA9IHItPmNvbnNfNjQuaGVhZCA9IDA7DQo+ICtyLT5w cm9kXzY0LnRhaWwgPSByLT5jb25zXzY0LnRhaWwgPSAwOw0KPiArDQo+ICtmb3IgKGkgPSAwOyBp IDwgci0+c2l6ZTsgaSsrKSB7DQo+ICtzdHJ1Y3QgbmJfcmluZ19lbnRyeSAqcmluZ19wdHIsICpi YXNlOw0KPiArDQo+ICtiYXNlID0gKChzdHJ1Y3QgbmJfcmluZ19lbnRyeSAqKSZyWzFdKTsNCj4g Kw0KPiArcmluZ19wdHIgPSAmYmFzZVtpICYgci0+bWFza107DQo+ICsNCj4gK3JpbmdfcHRyLT5j bnQgPSBpOw0KPiArfQ0KPiArfSBlbHNlIHsNCj4gK3ItPnByb2Quc2luZ2xlID0gKGZsYWdzICYg UklOR19GX1NQX0VOUSkgPyBfX0lTX1NQIDoNCj4gX19JU19NUDsNCj4gK3ItPmNvbnMuc2luZ2xl ID0gKGZsYWdzICYgUklOR19GX1NDX0RFUSkgPyBfX0lTX1NDIDoNCj4gX19JU19NQzsNCj4gK3It PnByb2QuaGVhZCA9IHItPmNvbnMuaGVhZCA9IDA7DQo+ICtyLT5wcm9kLnRhaWwgPSByLT5jb25z LnRhaWwgPSAwOw0KPiArfQ0KPg0KPiAgcmV0dXJuIDA7DQo+ICB9DQo+IEBAIC0xMjMsMTEgKzE1 NiwxOSBAQCBydGVfcmluZ19jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQNCj4gY291 bnQsIGludCBzb2NrZXRfaWQsDQo+DQo+ICByaW5nX2xpc3QgPSBSVEVfVEFJTFFfQ0FTVChydGVf cmluZ190YWlscS5oZWFkLA0KPiBydGVfcmluZ19saXN0KTsNCj4NCj4gKyNpZiAhZGVmaW5lZChS VEVfQVJDSF9YODZfNjQpDQo+ICtpZiAoZmxhZ3MgJiBSSU5HX0ZfTkIpIHsNCj4gK3ByaW50Zigi UklOR19GX05CIGlzIG9ubHkgc3VwcG9ydGVkIG9uIHg4Ni02NA0KPiBwbGF0Zm9ybXNcbiIpOw0K PiArcnRlX2Vycm5vID0gRUlOVkFMOw0KPiArcmV0dXJuIE5VTEw7DQo+ICt9DQo+ICsjZW5kaWYN Cj4gKw0KPiAgLyogZm9yIGFuIGV4YWN0IHNpemUgcmluZywgcm91bmQgdXAgZnJvbSBjb3VudCB0 byBhIHBvd2VyIG9mDQo+IHR3byAqLw0KPiAgaWYgKGZsYWdzICYgUklOR19GX0VYQUNUX1NaKQ0K PiAgY291bnQgPSBydGVfYWxpZ24zMnBvdzIoY291bnQgKyAxKTsNCj4NCj4gLXJpbmdfc2l6ZSA9 IHJ0ZV9yaW5nX2dldF9tZW1zaXplKGNvdW50KTsNCj4gK3Jpbmdfc2l6ZSA9IHJ0ZV9yaW5nX2dl dF9tZW1zaXplKGNvdW50LCBmbGFncyk7DQo+ICBpZiAocmluZ19zaXplIDwgMCkgew0KPiAgcnRl X2Vycm5vID0gcmluZ19zaXplOw0KPiAgcmV0dXJuIE5VTEw7DQo+IEBAIC0yMjcsMTAgKzI2OCwx NyBAQCBydGVfcmluZ19kdW1wKEZJTEUgKmYsIGNvbnN0IHN0cnVjdCBydGVfcmluZw0KPiAqcikN Cj4gIGZwcmludGYoZiwgIiAgZmxhZ3M9JXhcbiIsIHItPmZsYWdzKTsNCj4gIGZwcmludGYoZiwg IiAgc2l6ZT0lIlBSSXUzMiJcbiIsIHItPnNpemUpOw0KPiAgZnByaW50ZihmLCAiICBjYXBhY2l0 eT0lIlBSSXUzMiJcbiIsIHItPmNhcGFjaXR5KTsNCj4gLWZwcmludGYoZiwgIiAgY3Q9JSJQUkl1 MzIiXG4iLCByLT5jb25zLnRhaWwpOw0KPiAtZnByaW50ZihmLCAiICBjaD0lIlBSSXUzMiJcbiIs IHItPmNvbnMuaGVhZCk7DQo+IC1mcHJpbnRmKGYsICIgIHB0PSUiUFJJdTMyIlxuIiwgci0+cHJv ZC50YWlsKTsNCj4gLWZwcmludGYoZiwgIiAgcGg9JSJQUkl1MzIiXG4iLCByLT5wcm9kLmhlYWQp Ow0KPiAraWYgKHItPmZsYWdzICYgUklOR19GX05CKSB7DQo+ICtmcHJpbnRmKGYsICIgIGN0PSUi UFJJdTY0IlxuIiwgci0+Y29uc182NC50YWlsKTsNCj4gK2ZwcmludGYoZiwgIiAgY2g9JSJQUkl1 NjQiXG4iLCByLT5jb25zXzY0LmhlYWQpOw0KPiArZnByaW50ZihmLCAiICBwdD0lIlBSSXU2NCJc biIsIHItPnByb2RfNjQudGFpbCk7DQo+ICtmcHJpbnRmKGYsICIgIHBoPSUiUFJJdTY0IlxuIiwg ci0+cHJvZF82NC5oZWFkKTsNCj4gK30gZWxzZSB7DQo+ICtmcHJpbnRmKGYsICIgIGN0PSUiUFJJ dTMyIlxuIiwgci0+Y29ucy50YWlsKTsNCj4gK2ZwcmludGYoZiwgIiAgY2g9JSJQUkl1MzIiXG4i LCByLT5jb25zLmhlYWQpOw0KPiArZnByaW50ZihmLCAiICBwdD0lIlBSSXUzMiJcbiIsIHItPnBy b2QudGFpbCk7DQo+ICtmcHJpbnRmKGYsICIgIHBoPSUiUFJJdTMyIlxuIiwgci0+cHJvZC5oZWFk KTsNCj4gK30NCj4gIGZwcmludGYoZiwgIiAgdXNlZD0ldVxuIiwgcnRlX3JpbmdfY291bnQocikp Ow0KPiAgZnByaW50ZihmLCAiICBhdmFpbD0ldVxuIiwgcnRlX3JpbmdfZnJlZV9jb3VudChyKSk7 DQo+ICB9DQo+IGRpZmYgLS1naXQgYS9saWIvbGlicnRlX3JpbmcvcnRlX3JpbmcuaCBiL2xpYi9s aWJydGVfcmluZy9ydGVfcmluZy5oDQo+IGluZGV4IGIyNzBhNDc0Ni4uMDhjOWRlNmE2IDEwMDY0 NA0KPiAtLS0gYS9saWIvbGlicnRlX3JpbmcvcnRlX3JpbmcuaA0KPiArKysgYi9saWIvbGlicnRl X3JpbmcvcnRlX3JpbmcuaA0KPiBAQCAtMTM0LDYgKzEzNCwxOCBAQCBzdHJ1Y3QgcnRlX3Jpbmcg ew0KPiAgICovDQo+ICAjZGVmaW5lIFJJTkdfRl9FWEFDVF9TWiAweDAwMDQNCj4gICNkZWZpbmUg UlRFX1JJTkdfU1pfTUFTSyAgKDB4N2ZmZmZmZmZVKSAvKio8IFJpbmcgc2l6ZSBtYXNrICovDQo+ ICsvKioNCj4gKyAqIFRoZSByaW5nIHVzZXMgbm9uLWJsb2NraW5nIGVucXVldWUgYW5kIGRlcXVl dWUgZnVuY3Rpb25zLiBUaGVzZQ0KPiBmdW5jdGlvbnMNCj4gKyAqIGRvIG5vdCBoYXZlIHRoZSAi bm9uLXByZWVtcHRpdmUiIGNvbnN0cmFpbnQgb2YgYSByZWd1bGFyIHJ0ZQ0KPiByaW5nLCBhbmQg dGh1cw0KPiArICogYXJlIHN1aXRlZCBmb3IgYXBwbGljYXRpb25zIHVzaW5nIHByZWVtcHRpYmxl IHB0aHJlYWRzLiBIb3dldmVyLA0KPiB0aGUNCj4gKyAqIG5vbi1ibG9ja2luZyBmdW5jdGlvbnMg aGF2ZSB3b3JzZSBhdmVyYWdlLWNhc2UgcGVyZm9ybWFuY2UgdGhhbg0KPiB0aGVpcg0KPiArICog cmVndWxhciBydGUgcmluZyBjb3VudGVycGFydHMuIFdoZW4gdXNlZCBhcyB0aGUgaGFuZGxlciBm b3IgYQ0KPiBtZW1wb29sLA0KPiArICogcGVyLXRocmVhZCBjYWNoaW5nIGNhbiBtaXRpZ2F0ZSB0 aGUgcGVyZm9ybWFuY2UgZGlmZmVyZW5jZSBieQ0KPiByZWR1Y2luZyB0aGUNCj4gKyAqIG51bWJl ciAoYW5kIGNvbnRlbnRpb24pIG9mIHJpbmcgYWNjZXNzZXMuDQo+ICsgKg0KPiArICogVGhpcyBm bGFnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIHg4Nl82NCBwbGF0Zm9ybXMuDQo+ICsgKi8NCj4gKyNk ZWZpbmUgUklOR19GX05CIDB4MDAwOA0KPg0KPiAgLyogQGludGVybmFsIGRlZmluZXMgZm9yIHBh c3NpbmcgdG8gdGhlIGVucXVldWUgZGVxdWV1ZSB3b3JrZXINCj4gZnVuY3Rpb25zICovDQo+ICAj ZGVmaW5lIF9fSVNfU1AgMQ0KPiBAQCAtMTUxLDExICsxNjMsMTUgQEAgc3RydWN0IHJ0ZV9yaW5n IHsNCj4gICAqDQo+ICAgKiBAcGFyYW0gY291bnQNCj4gICAqICAgVGhlIG51bWJlciBvZiBlbGVt ZW50cyBpbiB0aGUgcmluZyAobXVzdCBiZSBhIHBvd2VyIG9mIDIpLg0KPiArICogQHBhcmFtIGZs YWdzDQo+ICsgKiAgIFRoZSBmbGFncyB0aGUgcmluZyB3aWxsIGJlIGNyZWF0ZWQgd2l0aC4NCj4g ICAqIEByZXR1cm4NCj4gICAqICAgLSBUaGUgbWVtb3J5IHNpemUgbmVlZGVkIGZvciB0aGUgcmlu ZyBvbiBzdWNjZXNzLg0KPiAgICogICAtIC1FSU5WQUwgaWYgY291bnQgaXMgbm90IGEgcG93ZXIg b2YgMi4NCj4gICAqLw0KPiAtc3NpemVfdCBydGVfcmluZ19nZXRfbWVtc2l6ZSh1bnNpZ25lZCBj b3VudCk7DQo+ICtzc2l6ZV90IHJ0ZV9yaW5nX2dldF9tZW1zaXplKHVuc2lnbmVkIGludCBjb3Vu dCwgdW5zaWduZWQgaW50DQo+IGZsYWdzKTsNCj4gK3NzaXplX3QgcnRlX3JpbmdfZ2V0X21lbXNp emVfdjIwKHVuc2lnbmVkIGludCBjb3VudCk7DQo+ICtzc2l6ZV90IHJ0ZV9yaW5nX2dldF9tZW1z aXplX3YxOTA1KHVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgaW50DQo+IGZsYWdzKTsNCj4N Cj4gIC8qKg0KPiAgICogSW5pdGlhbGl6ZSBhIHJpbmcgc3RydWN0dXJlLg0KPiBAQCAtMTg4LDYg KzIwNCwxMCBAQCBzc2l6ZV90IHJ0ZV9yaW5nX2dldF9tZW1zaXplKHVuc2lnbmVkIGNvdW50KTsN Cj4gICAqICAgIC0gUklOR19GX1NDX0RFUTogSWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlIGRlZmF1 bHQgYmVoYXZpb3INCj4gd2hlbg0KPiAgICogICAgICB1c2luZyBgYHJ0ZV9yaW5nX2RlcXVldWUo KWBgIG9yIGBgcnRlX3JpbmdfZGVxdWV1ZV9idWxrKClgYA0KPiAgICogICAgICBpcyAic2luZ2xl LWNvbnN1bWVyIi4gT3RoZXJ3aXNlLCBpdCBpcyAibXVsdGktY29uc3VtZXJzIi4NCj4gKyAqICAg IC0gUklOR19GX0VYQUNUX1NaOiBJZiB0aGlzIGZsYWcgaXMgc2V0LCBjb3VudCBjYW4gYmUgYSBu b24tDQo+IHBvd2VyLW9mLTINCj4gKyAqICAgICAgbnVtYmVyLCBidXQgdXAgdG8gaGFsZiB0aGUg cmluZyBzcGFjZSBtYXkgYmUgd2FzdGVkLg0KPiArICogICAgLSBSSU5HX0ZfTkI6ICh4ODZfNjQg b25seSkgSWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlIHJpbmcgdXNlcw0KPiArICogICAgICBub24t YmxvY2tpbmcgdmFyaWFudHMgb2YgdGhlIGRlcXVldWUgYW5kIGVucXVldWUgZnVuY3Rpb25zLg0K PiAgICogQHJldHVybg0KPiAgICogICAwIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUg b24gZXJyb3IuDQo+ICAgKi8NCj4gQEAgLTIyMywxMiArMjQzLDE3IEBAIGludCBydGVfcmluZ19p bml0KHN0cnVjdCBydGVfcmluZyAqciwgY29uc3QNCj4gY2hhciAqbmFtZSwgdW5zaWduZWQgY291 bnQsDQo+ICAgKiAgICAtIFJJTkdfRl9TQ19ERVE6IElmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSBk ZWZhdWx0IGJlaGF2aW9yDQo+IHdoZW4NCj4gICAqICAgICAgdXNpbmcgYGBydGVfcmluZ19kZXF1 ZXVlKClgYCBvciBgYHJ0ZV9yaW5nX2RlcXVldWVfYnVsaygpYGANCj4gICAqICAgICAgaXMgInNp bmdsZS1jb25zdW1lciIuIE90aGVyd2lzZSwgaXQgaXMgIm11bHRpLWNvbnN1bWVycyIuDQo+ICsg KiAgICAtIFJJTkdfRl9FWEFDVF9TWjogSWYgdGhpcyBmbGFnIGlzIHNldCwgY291bnQgY2FuIGJl IGEgbm9uLQ0KPiBwb3dlci1vZi0yDQo+ICsgKiAgICAgIG51bWJlciwgYnV0IHVwIHRvIGhhbGYg dGhlIHJpbmcgc3BhY2UgbWF5IGJlIHdhc3RlZC4NCj4gKyAqICAgIC0gUklOR19GX05COiAoeDg2 XzY0IG9ubHkpIElmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSByaW5nIHVzZXMNCj4gKyAqICAgICAg bm9uLWJsb2NraW5nIHZhcmlhbnRzIG9mIHRoZSBkZXF1ZXVlIGFuZCBlbnF1ZXVlIGZ1bmN0aW9u cy4NCj4gICAqIEByZXR1cm4NCj4gICAqICAgT24gc3VjY2VzcywgdGhlIHBvaW50ZXIgdG8gdGhl IG5ldyBhbGxvY2F0ZWQgcmluZy4gTlVMTCBvbg0KPiBlcnJvciB3aXRoDQo+ICAgKiAgICBydGVf ZXJybm8gc2V0IGFwcHJvcHJpYXRlbHkuIFBvc3NpYmxlIGVycm5vIHZhbHVlcyBpbmNsdWRlOg0K PiAgICogICAgLSBFX1JURV9OT19DT05GSUcgLSBmdW5jdGlvbiBjb3VsZCBub3QgZ2V0IHBvaW50 ZXIgdG8NCj4gcnRlX2NvbmZpZyBzdHJ1Y3R1cmUNCj4gICAqICAgIC0gRV9SVEVfU0VDT05EQVJZ IC0gZnVuY3Rpb24gd2FzIGNhbGxlZCBmcm9tIGEgc2Vjb25kYXJ5DQo+IHByb2Nlc3MgaW5zdGFu Y2UNCj4gLSAqICAgIC0gRUlOVkFMIC0gY291bnQgcHJvdmlkZWQgaXMgbm90IGEgcG93ZXIgb2Yg Mg0KPiArICogICAgLSBFSU5WQUwgLSBjb3VudCBwcm92aWRlZCBpcyBub3QgYSBwb3dlciBvZiAy LCBvciBSSU5HX0ZfTkIgaXMNCj4gdXNlZCBvbiBhbg0KPiArICogICAgICB1bnN1cHBvcnRlZCBw bGF0Zm9ybQ0KPiAgICogICAgLSBFTk9TUEMgLSB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVtem9u ZXMgaGFzIGFscmVhZHkgYmVlbg0KPiBhbGxvY2F0ZWQNCj4gICAqICAgIC0gRUVYSVNUIC0gYSBt ZW16b25lIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cw0KPiAgICogICAgLSBFTk9N RU0gLSBubyBhcHByb3ByaWF0ZSBtZW1vcnkgYXJlYSBmb3VuZCBpbiB3aGljaCB0byBjcmVhdGUN Cj4gbWVtem9uZQ0KPiBAQCAtMjg0LDYgKzMwOSw1MCBAQCB2b2lkIHJ0ZV9yaW5nX2R1bXAoRklM RSAqZiwgY29uc3Qgc3RydWN0DQo+IHJ0ZV9yaW5nICpyKTsNCj4gIH0gXA0KPiAgfSB3aGlsZSAo MCkNCj4NCj4gKy8qIFRoZSBhY3R1YWwgZW5xdWV1ZSBvZiBwb2ludGVycyBvbiB0aGUgcmluZy4N Cj4gKyAqIFVzZWQgb25seSBieSB0aGUgc2luZ2xlLXByb2R1Y2VyIG5vbi1ibG9ja2luZyBlbnF1 ZXVlIGZ1bmN0aW9uLA0KPiBidXQNCj4gKyAqIG91dC1saW5lZCBoZXJlIGZvciBjb2RlIHJlYWRh YmlsaXR5Lg0KPiArICovDQo+ICsjZGVmaW5lIEVOUVVFVUVfUFRSU19OQihyLCByaW5nX3N0YXJ0 LCBwcm9kX2hlYWQsIG9ial90YWJsZSwgbikgZG8gew0KPiBcDQo+ICt1bnNpZ25lZCBpbnQgaTsg XA0KPiArY29uc3QgdWludDMyX3Qgc2l6ZSA9IChyKS0+c2l6ZTsgXA0KPiArc2l6ZV90IGlkeCA9 IHByb2RfaGVhZCAmIChyKS0+bWFzazsgXA0KPiArc2l6ZV90IG5ld19jbnQgPSBwcm9kX2hlYWQg KyBzaXplOyBcDQo+ICtzdHJ1Y3QgbmJfcmluZ19lbnRyeSAqcmluZyA9IChzdHJ1Y3QgbmJfcmlu Z19lbnRyeQ0KPiAqKXJpbmdfc3RhcnQ7IFwNCj4gK2lmIChsaWtlbHkoaWR4ICsgbiA8IHNpemUp KSB7IFwNCj4gK2ZvciAoaSA9IDA7IGkgPCAobiAmICgofih1bnNpZ25lZCkweDMpKSk7IGkgKz0g NCwNCj4gaWR4ICs9IDQpIHsgXA0KPiArcmluZ1tpZHhdLnB0ciA9IG9ial90YWJsZVtpXTsgXA0K PiArcmluZ1tpZHhdLmNudCA9IG5ld19jbnQgKyBpOyAgXA0KPiArcmluZ1tpZHggKyAxXS5wdHIg PSBvYmpfdGFibGVbaSArIDFdOyBcDQo+ICtyaW5nW2lkeCArIDFdLmNudCA9IG5ld19jbnQgKyBp ICsgMTsgIFwNCj4gK3JpbmdbaWR4ICsgMl0ucHRyID0gb2JqX3RhYmxlW2kgKyAyXTsgXA0KPiAr cmluZ1tpZHggKyAyXS5jbnQgPSBuZXdfY250ICsgaSArIDI7ICBcDQo+ICtyaW5nW2lkeCArIDNd LnB0ciA9IG9ial90YWJsZVtpICsgM107IFwNCj4gK3JpbmdbaWR4ICsgM10uY250ID0gbmV3X2Nu dCArIGkgKyAzOyAgXA0KPiArfSBcDQo+ICtzd2l0Y2ggKG4gJiAweDMpIHsgXA0KPiArY2FzZSAz OiBcDQo+ICtyaW5nW2lkeF0uY250ID0gbmV3X2NudCArIGk7IFwNCj4gK3JpbmdbaWR4KytdLnB0 ciA9IG9ial90YWJsZVtpKytdOyAvKg0KPiBmYWxsdGhyb3VnaCAqLyBcDQo+ICtjYXNlIDI6IFwN Cj4gK3JpbmdbaWR4XS5jbnQgPSBuZXdfY250ICsgaTsgXA0KPiArcmluZ1tpZHgrK10ucHRyID0g b2JqX3RhYmxlW2krK107IC8qDQo+IGZhbGx0aHJvdWdoICovIFwNCj4gK2Nhc2UgMTogXA0KPiAr cmluZ1tpZHhdLmNudCA9IG5ld19jbnQgKyBpOyBcDQo+ICtyaW5nW2lkeCsrXS5wdHIgPSBvYmpf dGFibGVbaSsrXTsgXA0KPiArfSBcDQo+ICt9IGVsc2UgeyBcDQo+ICtmb3IgKGkgPSAwOyBpZHgg PCBzaXplOyBpKyssIGlkeCsrKSB7IFwNCj4gK3JpbmdbaWR4XS5jbnQgPSBuZXdfY250ICsgaTsg IFwNCj4gK3JpbmdbaWR4XS5wdHIgPSBvYmpfdGFibGVbaV07IFwNCj4gK30gXA0KPiArZm9yIChp ZHggPSAwOyBpIDwgbjsgaSsrLCBpZHgrKykgeyAgICBcDQo+ICtyaW5nW2lkeF0uY250ID0gbmV3 X2NudCArIGk7ICBcDQo+ICtyaW5nW2lkeF0ucHRyID0gb2JqX3RhYmxlW2ldOyBcDQo+ICt9IFwN Cj4gK30gXA0KPiArfSB3aGlsZSAoMCkNCj4gKw0KPiAgLyogdGhlIGFjdHVhbCBjb3B5IG9mIHBv aW50ZXJzIG9uIHRoZSByaW5nIHRvIG9ial90YWJsZS4NCj4gICAqIFBsYWNlZCBoZXJlIHNpbmNl IGlkZW50aWNhbCBjb2RlIG5lZWRlZCBpbiBib3RoDQo+ICAgKiBzaW5nbGUgYW5kIG11bHRpIGNv bnN1bWVyIGRlcXVldWUgZnVuY3Rpb25zICovDQo+IEBAIC0zMTUsNiArMzg0LDM5IEBAIHZvaWQg cnRlX3JpbmdfZHVtcChGSUxFICpmLCBjb25zdCBzdHJ1Y3QNCj4gcnRlX3JpbmcgKnIpOw0KPiAg fSBcDQo+ICB9IHdoaWxlICgwKQ0KPg0KPiArLyogVGhlIGFjdHVhbCBjb3B5IG9mIHBvaW50ZXJz IG9uIHRoZSByaW5nIHRvIG9ial90YWJsZS4NCj4gKyAqIFBsYWNlZCBoZXJlIHNpbmNlIGlkZW50 aWNhbCBjb2RlIG5lZWRlZCBpbiBib3RoDQo+ICsgKiBzaW5nbGUgYW5kIG11bHRpIGNvbnN1bWVy IG5vbi1ibG9ja2luZyBkZXF1ZXVlIGZ1bmN0aW9ucy4NCj4gKyAqLw0KPiArI2RlZmluZSBERVFV RVVFX1BUUlNfTkIociwgcmluZ19zdGFydCwgY29uc19oZWFkLCBvYmpfdGFibGUsIG4pIGRvIHsN Cj4gXA0KPiArdW5zaWduZWQgaW50IGk7IFwNCj4gK3NpemVfdCBpZHggPSBjb25zX2hlYWQgJiAo ciktPm1hc2s7IFwNCj4gK2NvbnN0IHVpbnQzMl90IHNpemUgPSAociktPnNpemU7IFwNCj4gK3N0 cnVjdCBuYl9yaW5nX2VudHJ5ICpyaW5nID0gKHN0cnVjdCBuYl9yaW5nX2VudHJ5DQo+ICopcmlu Z19zdGFydDsgXA0KPiAraWYgKGxpa2VseShpZHggKyBuIDwgc2l6ZSkpIHsgXA0KPiArZm9yIChp ID0gMDsgaSA8IChuICYgKH4odW5zaWduZWQpMHgzKSk7IGkgKz0gNCwgaWR4DQo+ICs9IDQpIHtc DQo+ICtvYmpfdGFibGVbaV0gPSByaW5nW2lkeF0ucHRyOyBcDQo+ICtvYmpfdGFibGVbaSArIDFd ID0gcmluZ1tpZHggKyAxXS5wdHI7IFwNCj4gK29ial90YWJsZVtpICsgMl0gPSByaW5nW2lkeCAr IDJdLnB0cjsgXA0KPiArb2JqX3RhYmxlW2kgKyAzXSA9IHJpbmdbaWR4ICsgM10ucHRyOyBcDQo+ ICt9IFwNCj4gK3N3aXRjaCAobiAmIDB4MykgeyBcDQo+ICtjYXNlIDM6IFwNCj4gK29ial90YWJs ZVtpKytdID0gcmluZ1tpZHgrK10ucHRyOyAvKg0KPiBmYWxsdGhyb3VnaCAqLyBcDQo+ICtjYXNl IDI6IFwNCj4gK29ial90YWJsZVtpKytdID0gcmluZ1tpZHgrK10ucHRyOyAvKg0KPiBmYWxsdGhy b3VnaCAqLyBcDQo+ICtjYXNlIDE6IFwNCj4gK29ial90YWJsZVtpKytdID0gcmluZ1tpZHgrK10u cHRyOyBcDQo+ICt9IFwNCj4gK30gZWxzZSB7IFwNCj4gK2ZvciAoaSA9IDA7IGlkeCA8IHNpemU7 IGkrKywgaWR4KyspIFwNCj4gK29ial90YWJsZVtpXSA9IHJpbmdbaWR4XS5wdHI7IFwNCj4gK2Zv ciAoaWR4ID0gMDsgaSA8IG47IGkrKywgaWR4KyspIFwNCj4gK29ial90YWJsZVtpXSA9IHJpbmdb aWR4XS5wdHI7IFwNCj4gK30gXA0KPiArfSB3aGlsZSAoMCkNCj4gKw0KPiArDQo+ICAvKiBCZXR3 ZWVuIGxvYWQgYW5kIGxvYWQuIHRoZXJlIG1pZ2h0IGJlIGNwdSByZW9yZGVyIGluIHdlYWsgbW9k ZWwNCj4gICAqIChwb3dlcnBjL2FybSkuDQo+ICAgKiBUaGVyZSBhcmUgMiBjaG9pY2VzIGZvciB0 aGUgdXNlcnMNCj4gQEAgLTMzMSw2ICs0MzMsMzE5IEBAIHZvaWQgcnRlX3JpbmdfZHVtcChGSUxF ICpmLCBjb25zdCBzdHJ1Y3QNCj4gcnRlX3JpbmcgKnIpOw0KPiAgI2VuZGlmDQo+ICAjaW5jbHVk ZSAicnRlX3JpbmdfZ2VuZXJpY182NC5oIg0KPg0KPiArLyogQGludGVybmFsIDEyOC1iaXQgc3Ry dWN0dXJlIHVzZWQgYnkgdGhlIG5vbi1ibG9ja2luZyByaW5nICovDQo+ICtzdHJ1Y3QgbmJfcmlu Z19lbnRyeSB7DQo+ICt2b2lkICpwdHI7IC8qKjwgRGF0YSBwb2ludGVyICovDQo+ICt1aW50NjRf dCBjbnQ7IC8qKjwgTW9kaWZpY2F0aW9uIGNvdW50ZXIgKi8NCldoeSBub3QgbWFrZSAnY250JyB1 aW50cHRyX3Q/IFRoaXMgd2F5IDMyLWJpdCBhcmNoaXRlY3R1cmVzIHdpbGwgYWxzbw0KYmUgc3Vw cG9ydGVkLg0KDQo+ICt9Ow0KPiArDQo+ICsvKiBUaGUgbm9uLWJsb2NraW5nIHJpbmcgYWxnb3Jp dGhtIGlzIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBydGUgcmluZw0KPiAoZGVyaXZlZA0KPiArICog ZnJvbSBGcmVlQlNEJ3MgYnVmcmluZy5oKSBhbmQgaW5zcGlyZWQgYnkgTWljaGFlbCBhbmQgU2Nv dHQncw0KPiBub24tYmxvY2tpbmcNCj4gKyAqIGNvbmN1cnJlbnQgcXVldWUuDQo+ICsgKi8NCj4g Kw0KPiArLyoqDQo+ICsgKiBAaW50ZXJuYWwNCj4gKyAqICAgRW5xdWV1ZSBzZXZlcmFsIG9iamVj dHMgb24gdGhlIG5vbi1ibG9ja2luZyByaW5nIChzaW5nbGUtDQo+IHByb2R1Y2VyIG9ubHkpDQo+ ICsgKg0KPiArICogQHBhcmFtIHINCj4gKyAqICAgQSBwb2ludGVyIHRvIHRoZSByaW5nIHN0cnVj dHVyZS4NCj4gKyAqIEBwYXJhbSBvYmpfdGFibGUNCj4gKyAqICAgQSBwb2ludGVyIHRvIGEgdGFi bGUgb2Ygdm9pZCAqIHBvaW50ZXJzIChvYmplY3RzKS4NCj4gKyAqIEBwYXJhbSBuDQo+ICsgKiAg IFRoZSBudW1iZXIgb2Ygb2JqZWN0cyB0byBhZGQgaW4gdGhlIHJpbmcgZnJvbSB0aGUgb2JqX3Rh YmxlLg0KPiArICogQHBhcmFtIGJlaGF2aW9yDQo+ICsgKiAgIFJURV9SSU5HX1FVRVVFX0ZJWEVE OiAgICBFbnF1ZXVlIGEgZml4ZWQgbnVtYmVyIG9mIGl0ZW1zIHRvIHRoZQ0KPiByaW5nDQo+ICsg KiAgIFJURV9SSU5HX1FVRVVFX1ZBUklBQkxFOiBFbnF1ZXVlIGFzIG1hbnkgaXRlbXMgYXMgcG9z c2libGUgdG8NCj4gdGhlIHJpbmcNCj4gKyAqIEBwYXJhbSBmcmVlX3NwYWNlDQo+ICsgKiAgIHJl dHVybnMgdGhlIGFtb3VudCBvZiBzcGFjZSBhZnRlciB0aGUgZW5xdWV1ZSBvcGVyYXRpb24gaGFz DQo+IGZpbmlzaGVkDQo+ICsgKiBAcmV0dXJuDQo+ICsgKiAgIEFjdHVhbCBudW1iZXIgb2Ygb2Jq ZWN0cyBlbnF1ZXVlZC4NCj4gKyAqICAgSWYgYmVoYXZpb3IgPT0gUlRFX1JJTkdfUVVFVUVfRklY RUQsIHRoaXMgd2lsbCBiZSAwIG9yIG4gb25seS4NCj4gKyAqLw0KPiArc3RhdGljIF9fcnRlX2Fs d2F5c19pbmxpbmUgdW5zaWduZWQgaW50DQo+ICtfX3J0ZV9yaW5nX2RvX25iX2VucXVldWVfc3Ao c3RydWN0IHJ0ZV9yaW5nICpyLCB2b2lkICogY29uc3QNCj4gKm9ial90YWJsZSwNCj4gKyAgICB1 bnNpZ25lZCBpbnQgbiwNCj4gKyAgICBlbnVtIHJ0ZV9yaW5nX3F1ZXVlX2JlaGF2aW9yIGJlaGF2 aW9yLA0KPiArICAgIHVuc2lnbmVkIGludCAqZnJlZV9zcGFjZSkNCj4gK3sNCj4gK3VpbnQzMl90 IGZyZWVfZW50cmllczsNCj4gK3NpemVfdCBoZWFkLCBuZXh0Ow0KPiArDQo+ICtuID0gX19ydGVf cmluZ19tb3ZlX3Byb2RfaGVhZF82NChyLCAxLCBuLCBiZWhhdmlvciwNCj4gKyAmaGVhZCwgJm5l eHQsDQo+ICZmcmVlX2VudHJpZXMpOw0KPiAraWYgKG4gPT0gMCkNCj4gK2dvdG8gZW5kOw0KPiAr DQo+ICtFTlFVRVVFX1BUUlNfTkIociwgJnJbMV0sIGhlYWQsIG9ial90YWJsZSwgbik7DQo+ICsN Cj4gK3ItPnByb2RfNjQudGFpbCArPSBuOw0KRG9uJ3Qgd2UgbmVlZCByZWxlYXNlIG9yZGVyIChv ciBzbXBfd21iKSBiZXR3ZWVuIHdyaXRpbmcgb2YgdGhlIHJpbmcNCnBvaW50ZXJzIGFuZCB0aGUg dXBkYXRlIG9mIHRhaWw/IEJ5IHVwZGF0aW5nIHRoZSB0YWlsIHBvaW50ZXIsIHdlIGFyZQ0Kc3lu Y2hyb25pc2luZyB3aXRoIGEgY29uc3VtZXIuDQoNCj4gKw0KPiArZW5kOg0KPiAraWYgKGZyZWVf c3BhY2UgIT0gTlVMTCkNCj4gKypmcmVlX3NwYWNlID0gZnJlZV9lbnRyaWVzIC0gbjsNCj4gK3Jl dHVybiBuOw0KPiArfQ0KPiArDQo+ICsvKioNCj4gKyAqIEBpbnRlcm5hbA0KPiArICogICBFbnF1 ZXVlIHNldmVyYWwgb2JqZWN0cyBvbiB0aGUgbm9uLWJsb2NraW5nIHJpbmcgKG11bHRpLQ0KPiBw cm9kdWNlciBzYWZlKQ0KPiArICoNCj4gKyAqIEBwYXJhbSByDQo+ICsgKiAgIEEgcG9pbnRlciB0 byB0aGUgcmluZyBzdHJ1Y3R1cmUuDQo+ICsgKiBAcGFyYW0gb2JqX3RhYmxlDQo+ICsgKiAgIEEg cG9pbnRlciB0byBhIHRhYmxlIG9mIHZvaWQgKiBwb2ludGVycyAob2JqZWN0cykuDQo+ICsgKiBA cGFyYW0gbg0KPiArICogICBUaGUgbnVtYmVyIG9mIG9iamVjdHMgdG8gYWRkIGluIHRoZSByaW5n IGZyb20gdGhlIG9ial90YWJsZS4NCj4gKyAqIEBwYXJhbSBiZWhhdmlvcg0KPiArICogICBSVEVf UklOR19RVUVVRV9GSVhFRDogICAgRW5xdWV1ZSBhIGZpeGVkIG51bWJlciBvZiBpdGVtcyB0byB0 aGUNCj4gcmluZw0KPiArICogICBSVEVfUklOR19RVUVVRV9WQVJJQUJMRTogRW5xdWV1ZSBhcyBt YW55IGl0ZW1zIGFzIHBvc3NpYmxlIHRvDQo+IHRoZSByaW5nDQo+ICsgKiBAcGFyYW0gZnJlZV9z cGFjZQ0KPiArICogICByZXR1cm5zIHRoZSBhbW91bnQgb2Ygc3BhY2UgYWZ0ZXIgdGhlIGVucXVl dWUgb3BlcmF0aW9uIGhhcw0KPiBmaW5pc2hlZA0KPiArICogQHJldHVybg0KPiArICogICBBY3R1 YWwgbnVtYmVyIG9mIG9iamVjdHMgZW5xdWV1ZWQuDQo+ICsgKiAgIElmIGJlaGF2aW9yID09IFJU RV9SSU5HX1FVRVVFX0ZJWEVELCB0aGlzIHdpbGwgYmUgMCBvciBuIG9ubHkuDQo+ICsgKi8NCj4g K3N0YXRpYyBfX3J0ZV9hbHdheXNfaW5saW5lIHVuc2lnbmVkIGludA0KPiArX19ydGVfcmluZ19k b19uYl9lbnF1ZXVlX21wKHN0cnVjdCBydGVfcmluZyAqciwgdm9pZCAqIGNvbnN0DQo+ICpvYmpf dGFibGUsDQo+ICsgICAgdW5zaWduZWQgaW50IG4sDQo+ICsgICAgZW51bSBydGVfcmluZ19xdWV1 ZV9iZWhhdmlvciBiZWhhdmlvciwNCj4gKyAgICB1bnNpZ25lZCBpbnQgKmZyZWVfc3BhY2UpDQo+ ICt7DQo+ICsjaWYgIWRlZmluZWQoUlRFX0FSQ0hfWDg2XzY0KSB8fCAhZGVmaW5lZChBTExPV19F WFBFUklNRU5UQUxfQVBJKQ0KPiArUlRFX1NFVF9VU0VEKHIpOw0KPiArUlRFX1NFVF9VU0VEKG9i al90YWJsZSk7DQo+ICtSVEVfU0VUX1VTRUQobik7DQo+ICtSVEVfU0VUX1VTRUQoYmVoYXZpb3Ip Ow0KPiArUlRFX1NFVF9VU0VEKGZyZWVfc3BhY2UpOw0KPiArI2lmbmRlZiBBTExPV19FWFBFUklN RU5UQUxfQVBJDQo+ICtwcmludGYoIlslcygpXSBSSU5HX0ZfTkIgcmVxdWlyZXMgYW4gZXhwZXJp bWVudGFsIEFQSS4iDQo+ICsgICAgICAgIiBSZWNvbXBpbGUgd2l0aCBBTExPV19FWFBFUklNRU5U QUxfQVBJIHRvIHVzZSBpdC5cbiINCj4gKyAgICAgICAsIF9fZnVuY19fKTsNCj4gKyNlbmRpZg0K PiArcmV0dXJuIDA7DQo+ICsjZW5kaWYNCj4gKyNpZiBkZWZpbmVkKFJURV9BUkNIX1g4Nl82NCkg JiYgZGVmaW5lZChBTExPV19FWFBFUklNRU5UQUxfQVBJKQ0KPiArc2l6ZV90IGhlYWQsIG5leHQs IHRhaWw7DQo+ICt1aW50MzJfdCBmcmVlX2VudHJpZXM7DQo+ICt1bnNpZ25lZCBpbnQgaTsNCj4g Kw0KPiArbiA9IF9fcnRlX3JpbmdfbW92ZV9wcm9kX2hlYWRfNjQociwgMCwgbiwgYmVoYXZpb3Is DQo+ICsgJmhlYWQsICZuZXh0LA0KPiAmZnJlZV9lbnRyaWVzKTsNCj4gK2lmIChuID09IDApDQo+ ICtnb3RvIGVuZDsNCj4gKw0KPiArZm9yIChpID0gMDsgaSA8IG47IC8qIGkgaW5jcmVtZW50ZWQg aWYgZW5xdWV1ZSBzdWNjZWVkcyAqLykNCj4gew0KPiArc3RydWN0IG5iX3JpbmdfZW50cnkgb2xk X3ZhbHVlLCBuZXdfdmFsdWU7DQo+ICtzdHJ1Y3QgbmJfcmluZ19lbnRyeSAqcmluZ19wdHI7DQo+ ICsNCj4gKy8qIEVucXVldWUgdG8gdGhlIHRhaWwgZW50cnkuIElmIGFub3RoZXIgdGhyZWFkIHdp bnMNCj4gdGhlIHJhY2UsDQo+ICsgKiByZXRyeSB3aXRoIHRoZSBuZXcgdGFpbC4NCj4gKyAqLw0K PiArdGFpbCA9IHItPnByb2RfNjQudGFpbDsNCj4gKw0KPiArcmluZ19wdHIgPSAmKChzdHJ1Y3Qg bmJfcmluZ19lbnRyeSAqKSZyWzFdKVt0YWlsICYNCj4gci0+bWFza107DQpUaGlzIGlzIGEgdmVy eSB1Z2x5IGNhc3QuIEFsc28gSSB0aGluayBpdCBpcyB1bm5lY2Vzc2FyeS4gV2hhdCdzDQpwcmV2 ZW50aW5nIHRoaXMgZnJvbSBiZWluZyB3cml0dGVuIHdpdGhvdXQgYSBjYXN0PyBQZXJoYXBzIHRo ZSByaW5nDQphcnJheSBuZWVkcyB0byBiZSBhIHVuaW9uIG9mICJ2b2lkICoiIGFuZCBzdHJ1Y3Qg bmJfcmluZ19lbnRyeT8NCg0KPiArDQo+ICtvbGRfdmFsdWUgPSAqcmluZ19wdHI7DQo+ICsNCj4g Ky8qIElmIHRoZSB0YWlsIGVudHJ5J3MgbW9kaWZpY2F0aW9uIGNvdW50ZXIgZG9lc24ndA0KPiBt YXRjaCB0aGUNCj4gKyAqIHByb2R1Y2VyIHRhaWwgaW5kZXgsIGl0J3MgYWxyZWFkeSBiZWVuIHVw ZGF0ZWQuDQo+ICsgKi8NCj4gK2lmIChvbGRfdmFsdWUuY250ICE9IHRhaWwpDQo+ICtjb250aW51 ZTsNCkNvbnRpbnVlIHJlc3RhcnRzIHRoZSBsb29wIGF0IHRoZSBjb25kaXRpb24gdGVzdCBpbiB0 aGUgZm9yIHN0YXRlbWVudCwNCidpJyBhbmQgJ24nIGFyZSB1bmNoYW5nZWQuIFRoZW4gd2UgcmUt cmVhZCAncHJvZF82NC50YWlsJyBhbmQNCidyaW5nW3RhaWxdJy4gSWYgc29tZSBvdGhlciB0aHJl YWQgbmV2ZXIgdXBkYXRlcyAncHJvZF82NC50YWlsJywgdGhlDQp0ZXN0IGhlcmUgKHJpbmdbdGFp bF0uY250ICE9IHRhaWwpIHdpbGwgc3RpbGwgYmUgZmFsc2UgYW5kIHdlIHdpbGwgc3Bpbg0KZm9y ZXZlci4NCldhaXRpbmcgZm9yIG90aGVyIHRocmVhZHMgPD0+IGJsb2NraW5nIGJlaGF2aW91ciBz byB0aGlzIGlzIG5vdCBhIG5vbi0NCmJsb2NraW5nIGRlc2lnbi4NCg0KPiArDQo+ICsvKiBQcmVw YXJlIHRoZSBuZXcgZW50cnkuIFRoZSBjbnQgZmllbGQgbWl0aWdhdGVzDQo+IHRoZSBBQkENCj4g KyAqIHByb2JsZW0gb24gdGhlIHJpbmcgd3JpdGUuDQo+ICsgKi8NCj4gK25ld192YWx1ZS5wdHIg PSBvYmpfdGFibGVbaV07DQo+ICtuZXdfdmFsdWUuY250ID0gdGFpbCArIHItPnNpemU7DQo+ICsN Cj4gK2lmIChydGVfYXRvbWljMTI4X2NtcHNldCgodm9sYXRpbGUgcnRlX2ludDEyOF90DQo+ICop cmluZ19wdHIsDQo+ICsgKHJ0ZV9pbnQxMjhfdCAqKSZvbGRfdmFsdWUsDQo+ICsgKHJ0ZV9pbnQx MjhfdA0KPiAqKSZuZXdfdmFsdWUpKQ0KPiAraSsrOw0KPiArDQo+ICsvKiBFdmVyeSB0aHJlYWQg YXR0ZW1wdHMgdGhlIGNtcHNldCwgc28gdGhleSBkb24ndA0KPiBoYXZlIHRvIHdhaXQNCj4gKyAq IGZvciB0aGUgdGhyZWFkIHRoYXQgc3VjY2Vzc2Z1bGx5IGVucXVldWVkIHRvIHRoZQ0KPiByaW5n Lg0KPiArICogVXNpbmcgYSA2NC1iaXQgdGFpbCBtaXRpZ2F0ZXMgdGhlIEFCQSBwcm9ibGVtDQo+ IGhlcmUuDQo+ICsgKg0KPiArICogQnVpbHQtaW4gdXNlZCB0byBoYW5kbGUgdmFyaWFibGUtc2l6 ZWQgdGFpbA0KPiBpbmRleC4NCj4gKyAqLw0KQnV0IHByb2RfNjQudGFpbCBpcyA2NCBiaXRzIHNv IG5vdCByZWFsbHkgdmFyaWFibGUgc2l6ZT8NCg0KPiArX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRf c3dhcCgmci0+cHJvZF82NC50YWlsLCB0YWlsLA0KPiB0YWlsICsgMSk7DQpXaGF0IG1lbW9yeSBv cmRlciBpcyByZXF1aXJlZCBoZXJlPyBXaHkgbm90IHVzZQ0KX19hdG9taWNfY29tcGFyZV9leGNo YW5nZSgpIHdpdGggZXhwbGljaXQgbWVtb3J5IG9yZGVyIHBhcmFtZXRlcnM/DQoNCj4gK30NCj4g Kw0KPiArZW5kOg0KPiAraWYgKGZyZWVfc3BhY2UgIT0gTlVMTCkNCj4gKypmcmVlX3NwYWNlID0g ZnJlZV9lbnRyaWVzIC0gbjsNCj4gK3JldHVybiBuOw0KPiArI2VuZGlmDQo+ICt9DQo+ICsNCj4g Ky8qKg0KPiArICogQGludGVybmFsIEVucXVldWUgc2V2ZXJhbCBvYmplY3RzIG9uIHRoZSBub24t YmxvY2tpbmcgcmluZw0KPiArICoNCj4gKyAqIEBwYXJhbSByDQo+ICsgKiAgIEEgcG9pbnRlciB0 byB0aGUgcmluZyBzdHJ1Y3R1cmUuDQo+ICsgKiBAcGFyYW0gb2JqX3RhYmxlDQo+ICsgKiAgIEEg cG9pbnRlciB0byBhIHRhYmxlIG9mIHZvaWQgKiBwb2ludGVycyAob2JqZWN0cykuDQo+ICsgKiBA cGFyYW0gbg0KPiArICogICBUaGUgbnVtYmVyIG9mIG9iamVjdHMgdG8gYWRkIGluIHRoZSByaW5n IGZyb20gdGhlIG9ial90YWJsZS4NCj4gKyAqIEBwYXJhbSBiZWhhdmlvcg0KPiArICogICBSVEVf UklOR19RVUVVRV9GSVhFRDogICAgRW5xdWV1ZSBhIGZpeGVkIG51bWJlciBvZiBpdGVtcyB0byB0 aGUNCj4gcmluZw0KPiArICogICBSVEVfUklOR19RVUVVRV9WQVJJQUJMRTogRW5xdWV1ZSBhcyBt YW55IGl0ZW1zIGFzIHBvc3NpYmxlIHRvDQo+IHRoZSByaW5nDQo+ICsgKiBAcGFyYW0gaXNfc3AN Cj4gKyAqICAgSW5kaWNhdGVzIHdoZXRoZXIgdG8gdXNlIHNpbmdsZSBwcm9kdWNlciBvciBtdWx0 aS1wcm9kdWNlciBoZWFkDQo+IHVwZGF0ZQ0KPiArICogQHBhcmFtIGZyZWVfc3BhY2UNCj4gKyAq ICAgcmV0dXJucyB0aGUgYW1vdW50IG9mIHNwYWNlIGFmdGVyIHRoZSBlbnF1ZXVlIG9wZXJhdGlv biBoYXMNCj4gZmluaXNoZWQNCj4gKyAqIEByZXR1cm4NCj4gKyAqICAgQWN0dWFsIG51bWJlciBv ZiBvYmplY3RzIGVucXVldWVkLg0KPiArICogICBJZiBiZWhhdmlvciA9PSBSVEVfUklOR19RVUVV RV9GSVhFRCwgdGhpcyB3aWxsIGJlIDAgb3IgbiBvbmx5Lg0KPiArICovDQo+ICtzdGF0aWMgX19y dGVfYWx3YXlzX2lubGluZSB1bnNpZ25lZCBpbnQNCj4gK19fcnRlX3JpbmdfZG9fbmJfZW5xdWV1 ZShzdHJ1Y3QgcnRlX3JpbmcgKnIsIHZvaWQgKiBjb25zdA0KPiAqb2JqX3RhYmxlLA0KPiArIHVu c2lnbmVkIGludCBuLCBlbnVtDQo+IHJ0ZV9yaW5nX3F1ZXVlX2JlaGF2aW9yIGJlaGF2aW9yLA0K PiArIHVuc2lnbmVkIGludCBpc19zcCwgdW5zaWduZWQgaW50DQo+ICpmcmVlX3NwYWNlKQ0KPiAr ew0KPiAraWYgKGlzX3NwKQ0KPiArcmV0dXJuIF9fcnRlX3JpbmdfZG9fbmJfZW5xdWV1ZV9zcChy LCBvYmpfdGFibGUsIG4sDQo+ICsgICBiZWhhdmlvciwNCj4gZnJlZV9zcGFjZSk7DQo+ICtlbHNl DQo+ICtyZXR1cm4gX19ydGVfcmluZ19kb19uYl9lbnF1ZXVlX21wKHIsIG9ial90YWJsZSwgbiwN Cj4gKyAgIGJlaGF2aW9yLA0KPiBmcmVlX3NwYWNlKTsNCj4gK30NCj4gKw0KPiArLyoqDQo+ICsg KiBAaW50ZXJuYWwNCj4gKyAqICAgRGVxdWV1ZSBzZXZlcmFsIG9iamVjdHMgZnJvbSB0aGUgbm9u LWJsb2NraW5nIHJpbmcgKHNpbmdsZS0NCj4gY29uc3VtZXIgb25seSkNCj4gKyAqDQo+ICsgKiBA cGFyYW0gcg0KPiArICogICBBIHBvaW50ZXIgdG8gdGhlIHJpbmcgc3RydWN0dXJlLg0KPiArICog QHBhcmFtIG9ial90YWJsZQ0KPiArICogICBBIHBvaW50ZXIgdG8gYSB0YWJsZSBvZiB2b2lkICog cG9pbnRlcnMgKG9iamVjdHMpLg0KPiArICogQHBhcmFtIG4NCj4gKyAqICAgVGhlIG51bWJlciBv ZiBvYmplY3RzIHRvIHB1bGwgZnJvbSB0aGUgcmluZy4NCj4gKyAqIEBwYXJhbSBiZWhhdmlvcg0K PiArICogICBSVEVfUklOR19RVUVVRV9GSVhFRDogICAgRGVxdWV1ZSBhIGZpeGVkIG51bWJlciBv ZiBpdGVtcyBmcm9tDQo+IHRoZSByaW5nDQo+ICsgKiAgIFJURV9SSU5HX1FVRVVFX1ZBUklBQkxF OiBEZXF1ZXVlIGFzIG1hbnkgaXRlbXMgYXMgcG9zc2libGUgZnJvbQ0KPiB0aGUgcmluZw0KPiAr ICogQHBhcmFtIGF2YWlsYWJsZQ0KPiArICogICByZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVtYWlu aW5nIHJpbmcgZW50cmllcyBhZnRlciB0aGUgZGVxdWV1ZQ0KPiBoYXMgZmluaXNoZWQNCj4gKyAq IEByZXR1cm4NCj4gKyAqICAgLSBBY3R1YWwgbnVtYmVyIG9mIG9iamVjdHMgZGVxdWV1ZWQuDQo+ ICsgKiAgICAgSWYgYmVoYXZpb3IgPT0gUlRFX1JJTkdfUVVFVUVfRklYRUQsIHRoaXMgd2lsbCBi ZSAwIG9yIG4NCj4gb25seS4NCj4gKyAqLw0KPiArc3RhdGljIF9fcnRlX2Fsd2F5c19pbmxpbmUg dW5zaWduZWQgaW50DQo+ICtfX3J0ZV9yaW5nX2RvX25iX2RlcXVldWVfc2Moc3RydWN0IHJ0ZV9y aW5nICpyLCB2b2lkICoqb2JqX3RhYmxlLA0KPiArICAgIHVuc2lnbmVkIGludCBuLA0KPiArICAg IGVudW0gcnRlX3JpbmdfcXVldWVfYmVoYXZpb3IgYmVoYXZpb3IsDQo+ICsgICAgdW5zaWduZWQg aW50ICphdmFpbGFibGUpDQo+ICt7DQo+ICtzaXplX3QgaGVhZCwgbmV4dDsNCj4gK3VpbnQzMl90 IGVudHJpZXM7DQo+ICsNCj4gK24gPSBfX3J0ZV9yaW5nX21vdmVfY29uc19oZWFkXzY0KHIsIDEs IG4sIGJlaGF2aW9yLA0KPiArICZoZWFkLCAmbmV4dCwgJmVudHJpZXMpOw0KPiAraWYgKG4gPT0g MCkNCj4gK2dvdG8gZW5kOw0KPiArDQo+ICtERVFVRVVFX1BUUlNfTkIociwgJnJbMV0sIGhlYWQs IG9ial90YWJsZSwgbik7DQo+ICsNCj4gK3ItPmNvbnNfNjQudGFpbCArPSBuOw0KTWVtb3J5IG9y ZGVyaW5nPyBDb25zdW1lciBzeW5jaHJvbmlzZXMgd2l0aCBwcm9kdWNlci4NCg0KPiArDQo+ICtl bmQ6DQo+ICtpZiAoYXZhaWxhYmxlICE9IE5VTEwpDQo+ICsqYXZhaWxhYmxlID0gZW50cmllcyAt IG47DQo+ICtyZXR1cm4gbjsNCj4gK30NCj4gKw0KPiArLyoqDQo+ICsgKiBAaW50ZXJuYWwNCj4g KyAqICAgRGVxdWV1ZSBzZXZlcmFsIG9iamVjdHMgZnJvbSB0aGUgbm9uLWJsb2NraW5nIHJpbmcg KG11bHRpLQ0KPiBjb25zdW1lciBzYWZlKQ0KPiArICoNCj4gKyAqIEBwYXJhbSByDQo+ICsgKiAg IEEgcG9pbnRlciB0byB0aGUgcmluZyBzdHJ1Y3R1cmUuDQo+ICsgKiBAcGFyYW0gb2JqX3RhYmxl DQo+ICsgKiAgIEEgcG9pbnRlciB0byBhIHRhYmxlIG9mIHZvaWQgKiBwb2ludGVycyAob2JqZWN0 cykuDQo+ICsgKiBAcGFyYW0gbg0KPiArICogICBUaGUgbnVtYmVyIG9mIG9iamVjdHMgdG8gcHVs bCBmcm9tIHRoZSByaW5nLg0KPiArICogQHBhcmFtIGJlaGF2aW9yDQo+ICsgKiAgIFJURV9SSU5H X1FVRVVFX0ZJWEVEOiAgICBEZXF1ZXVlIGEgZml4ZWQgbnVtYmVyIG9mIGl0ZW1zIGZyb20NCj4g dGhlIHJpbmcNCj4gKyAqICAgUlRFX1JJTkdfUVVFVUVfVkFSSUFCTEU6IERlcXVldWUgYXMgbWFu eSBpdGVtcyBhcyBwb3NzaWJsZSBmcm9tDQo+IHRoZSByaW5nDQo+ICsgKiBAcGFyYW0gYXZhaWxh YmxlDQo+ICsgKiAgIHJldHVybnMgdGhlIG51bWJlciBvZiByZW1haW5pbmcgcmluZyBlbnRyaWVz IGFmdGVyIHRoZSBkZXF1ZXVlDQo+IGhhcyBmaW5pc2hlZA0KPiArICogQHJldHVybg0KPiArICog ICAtIEFjdHVhbCBudW1iZXIgb2Ygb2JqZWN0cyBkZXF1ZXVlZC4NCj4gKyAqICAgICBJZiBiZWhh dmlvciA9PSBSVEVfUklOR19RVUVVRV9GSVhFRCwgdGhpcyB3aWxsIGJlIDAgb3Igbg0KPiBvbmx5 Lg0KPiArICovDQo+ICtzdGF0aWMgX19ydGVfYWx3YXlzX2lubGluZSB1bnNpZ25lZCBpbnQNCj4g K19fcnRlX3JpbmdfZG9fbmJfZGVxdWV1ZV9tYyhzdHJ1Y3QgcnRlX3JpbmcgKnIsIHZvaWQgKipv YmpfdGFibGUsDQo+ICsgICAgdW5zaWduZWQgaW50IG4sDQo+ICsgICAgZW51bSBydGVfcmluZ19x dWV1ZV9iZWhhdmlvciBiZWhhdmlvciwNCj4gKyAgICB1bnNpZ25lZCBpbnQgKmF2YWlsYWJsZSkN Cj4gK3sNCj4gK3NpemVfdCBoZWFkLCBuZXh0Ow0KPiArdWludDMyX3QgZW50cmllczsNCj4gKw0K PiArbiA9IF9fcnRlX3JpbmdfbW92ZV9jb25zX2hlYWRfNjQociwgMCwgbiwgYmVoYXZpb3IsDQo+ ICsgJmhlYWQsICZuZXh0LCAmZW50cmllcyk7DQo+ICtpZiAobiA9PSAwKQ0KPiArZ290byBlbmQ7 DQo+ICsNCj4gK3doaWxlICgxKSB7DQo+ICtzaXplX3QgdGFpbCA9IHItPmNvbnNfNjQudGFpbDsN Cj4gKw0KPiArLyogRGVxdWV1ZSBmcm9tIHRoZSBjb25zIHRhaWwgb253YXJkcy4gSWYgbXVsdGlw bGUNCj4gdGhyZWFkcyByZWFkDQo+ICsgKiB0aGUgc2FtZSBwb2ludGVycywgdGhlIHRocmVhZCB0 aGF0IHN1Y2Nlc3NmdWxseQ0KPiBwZXJmb3JtcyB0aGUNCj4gKyAqIENBUyB3aWxsIGtlZXAgdGhl bSBhbmQgdGhlIG90aGVyKHMpIHdpbGwgcmV0cnkuDQo+ICsgKi8NCj4gK0RFUVVFVUVfUFRSU19O QihyLCAmclsxXSwgdGFpbCwgb2JqX3RhYmxlLCBuKTsNCj4gKw0KPiArbmV4dCA9IHRhaWwgKyBu Ow0KPiArDQo+ICsvKiBCdWlsdC1pbiB1c2VkIHRvIGhhbmRsZSB2YXJpYWJsZS1zaXplZCB0YWls DQo+IGluZGV4LiAqLw0KPiAraWYgKF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoJnItPmNv bnNfNjQudGFpbCwNCj4gdGFpbCwgbmV4dCkpDQo+ICsvKiBUaGVyZSBpcyBwb3RlbnRpYWwgZm9y IHRoZSBBQkEgcHJvYmxlbQ0KPiBoZXJlLCBidXQNCj4gKyAqIHRoYXQgaXMgbWl0aWdhdGVkIGJ5 IHRoZSBsYXJnZSAoNjQtYml0KQ0KPiB0YWlsLg0KPiArICovDQo+ICticmVhazsNCj4gK30NCj4g Kw0KPiArZW5kOg0KPiAraWYgKGF2YWlsYWJsZSAhPSBOVUxMKQ0KPiArKmF2YWlsYWJsZSA9IGVu dHJpZXMgLSBuOw0KPiArcmV0dXJuIG47DQo+ICt9DQo+ICsNCj4gKy8qKg0KPiArICogQGludGVy bmFsIERlcXVldWUgc2V2ZXJhbCBvYmplY3RzIGZyb20gdGhlIG5vbi1ibG9ja2luZyByaW5nDQo+ ICsgKg0KPiArICogQHBhcmFtIHINCj4gKyAqICAgQSBwb2ludGVyIHRvIHRoZSByaW5nIHN0cnVj dHVyZS4NCj4gKyAqIEBwYXJhbSBvYmpfdGFibGUNCj4gKyAqICAgQSBwb2ludGVyIHRvIGEgdGFi bGUgb2Ygdm9pZCAqIHBvaW50ZXJzIChvYmplY3RzKS4NCj4gKyAqIEBwYXJhbSBuDQo+ICsgKiAg IFRoZSBudW1iZXIgb2Ygb2JqZWN0cyB0byBwdWxsIGZyb20gdGhlIHJpbmcuDQo+ICsgKiBAcGFy YW0gYmVoYXZpb3INCj4gKyAqICAgUlRFX1JJTkdfUVVFVUVfRklYRUQ6ICAgIERlcXVldWUgYSBm aXhlZCBudW1iZXIgb2YgaXRlbXMgZnJvbQ0KPiB0aGUgcmluZw0KPiArICogICBSVEVfUklOR19R VUVVRV9WQVJJQUJMRTogRGVxdWV1ZSBhcyBtYW55IGl0ZW1zIGFzIHBvc3NpYmxlIGZyb20NCj4g dGhlIHJpbmcNCj4gKyAqIEBwYXJhbSBhdmFpbGFibGUNCj4gKyAqICAgcmV0dXJucyB0aGUgbnVt YmVyIG9mIHJlbWFpbmluZyByaW5nIGVudHJpZXMgYWZ0ZXIgdGhlIGRlcXVldWUNCj4gaGFzIGZp bmlzaGVkDQo+ICsgKiBAcmV0dXJuDQo+ICsgKiAgIC0gQWN0dWFsIG51bWJlciBvZiBvYmplY3Rz IGRlcXVldWVkLg0KPiArICogICAgIElmIGJlaGF2aW9yID09IFJURV9SSU5HX1FVRVVFX0ZJWEVE LCB0aGlzIHdpbGwgYmUgMCBvciBuDQo+IG9ubHkuDQo+ICsgKi8NCj4gK3N0YXRpYyBfX3J0ZV9h bHdheXNfaW5saW5lIHVuc2lnbmVkIGludA0KPiArX19ydGVfcmluZ19kb19uYl9kZXF1ZXVlKHN0 cnVjdCBydGVfcmluZyAqciwgdm9pZCAqKm9ial90YWJsZSwNCj4gKyB1bnNpZ25lZCBpbnQgbiwg ZW51bSBydGVfcmluZ19xdWV1ZV9iZWhhdmlvcg0KPiBiZWhhdmlvciwNCj4gKyB1bnNpZ25lZCBp bnQgaXNfc2MsIHVuc2lnbmVkIGludCAqYXZhaWxhYmxlKQ0KPiArew0KPiAraWYgKGlzX3NjKQ0K PiArcmV0dXJuIF9fcnRlX3JpbmdfZG9fbmJfZGVxdWV1ZV9zYyhyLCBvYmpfdGFibGUsIG4sDQo+ ICsgICBiZWhhdmlvciwNCj4gYXZhaWxhYmxlKTsNCj4gK2Vsc2UNCj4gK3JldHVybiBfX3J0ZV9y aW5nX2RvX25iX2RlcXVldWVfbWMociwgb2JqX3RhYmxlLCBuLA0KPiArICAgYmVoYXZpb3IsDQo+ IGF2YWlsYWJsZSk7DQo+ICt9DQo+ICsNCj4gIC8qKg0KPiAgICogQGludGVybmFsIEVucXVldWUg c2V2ZXJhbCBvYmplY3RzIG9uIHRoZSByaW5nDQo+ICAgKg0KPiBAQCAtNDM4LDggKzg1MywxNCBA QCBzdGF0aWMgX19ydGVfYWx3YXlzX2lubGluZSB1bnNpZ25lZCBpbnQNCj4gIHJ0ZV9yaW5nX21w X2VucXVldWVfYnVsayhzdHJ1Y3QgcnRlX3JpbmcgKnIsIHZvaWQgKiBjb25zdA0KPiAqb2JqX3Rh YmxlLA0KPiAgIHVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgKmZyZWVfc3BhY2UpDQo+ICB7 DQo+IC1yZXR1cm4gX19ydGVfcmluZ19kb19lbnF1ZXVlKHIsIG9ial90YWJsZSwgbiwNCj4gUlRF X1JJTkdfUVVFVUVfRklYRUQsDQo+IC1fX0lTX01QLCBmcmVlX3NwYWNlKTsNCj4gK2lmIChyLT5m bGFncyAmIFJJTkdfRl9OQikNCj4gK3JldHVybiBfX3J0ZV9yaW5nX2RvX25iX2VucXVldWUociwg b2JqX3RhYmxlLCBuLA0KPiArUlRFX1JJTkdfUVVFVUVfRklYRUQNCj4gLCBfX0lTX01QLA0KPiAr ZnJlZV9zcGFjZSk7DQo+ICtlbHNlDQo+ICtyZXR1cm4gX19ydGVfcmluZ19kb19lbnF1ZXVlKHIs IG9ial90YWJsZSwgbiwNCj4gKyAgICAgUlRFX1JJTkdfUVVFVUVfRklYRUQsDQo+IF9fSVNfTVAs DQo+ICsgICAgIGZyZWVfc3BhY2UpOw0KPiAgfQ0KPg0KPiAgLyoqDQo+IEBAIC00NjEsOCArODgy LDE0IEBAIHN0YXRpYyBfX3J0ZV9hbHdheXNfaW5saW5lIHVuc2lnbmVkIGludA0KPiAgcnRlX3Jp bmdfc3BfZW5xdWV1ZV9idWxrKHN0cnVjdCBydGVfcmluZyAqciwgdm9pZCAqIGNvbnN0DQo+ICpv YmpfdGFibGUsDQo+ICAgdW5zaWduZWQgaW50IG4sIHVuc2lnbmVkIGludCAqZnJlZV9zcGFjZSkN Cj4gIHsNCj4gLXJldHVybiBfX3J0ZV9yaW5nX2RvX2VucXVldWUociwgb2JqX3RhYmxlLCBuLA0K PiBSVEVfUklOR19RVUVVRV9GSVhFRCwNCj4gLV9fSVNfU1AsIGZyZWVfc3BhY2UpOw0KPiAraWYg KHItPmZsYWdzICYgUklOR19GX05CKQ0KPiArcmV0dXJuIF9fcnRlX3JpbmdfZG9fbmJfZW5xdWV1 ZShyLCBvYmpfdGFibGUsIG4sDQo+ICtSVEVfUklOR19RVUVVRV9GSVhFRA0KPiAsIF9fSVNfU1As DQo+ICtmcmVlX3NwYWNlKTsNCj4gK2Vsc2UNCj4gK3JldHVybiBfX3J0ZV9yaW5nX2RvX2VucXVl dWUociwgb2JqX3RhYmxlLCBuLA0KPiArICAgICBSVEVfUklOR19RVUVVRV9GSVhFRCwNCj4gX19J U19TUCwNCj4gKyAgICAgZnJlZV9zcGFjZSk7DQo+ICB9DQo+DQo+ICAvKioNCj4gQEAgLTQ4OCw4 ICs5MTUsMTQgQEAgc3RhdGljIF9fcnRlX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50DQo+ICBy dGVfcmluZ19lbnF1ZXVlX2J1bGsoc3RydWN0IHJ0ZV9yaW5nICpyLCB2b2lkICogY29uc3QgKm9i al90YWJsZSwNCj4gICAgICAgIHVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgKmZyZWVfc3Bh Y2UpDQo+ICB7DQo+IC1yZXR1cm4gX19ydGVfcmluZ19kb19lbnF1ZXVlKHIsIG9ial90YWJsZSwg biwNCj4gUlRFX1JJTkdfUVVFVUVfRklYRUQsDQo+IC1yLT5wcm9kLnNpbmdsZSwgZnJlZV9zcGFj ZSk7DQo+ICtpZiAoci0+ZmxhZ3MgJiBSSU5HX0ZfTkIpDQo+ICtyZXR1cm4gX19ydGVfcmluZ19k b19uYl9lbnF1ZXVlKHIsIG9ial90YWJsZSwgbiwNCj4gK1JURV9SSU5HX1FVRVVFX0ZJWEVEDQo+ ICwNCj4gK3ItPnByb2RfNjQuc2luZ2xlLA0KPiBmcmVlX3NwYWNlKTsNCj4gK2Vsc2UNCj4gK3Jl dHVybiBfX3J0ZV9yaW5nX2RvX2VucXVldWUociwgb2JqX3RhYmxlLCBuLA0KPiArICAgICBSVEVf UklOR19RVUVVRV9GSVhFRCwNCj4gKyAgICAgci0+cHJvZC5zaW5nbGUsDQo+IGZyZWVfc3BhY2Up Ow0KPiAgfQ0KPg0KPiAgLyoqDQo+IEBAIC01NzIsOCArMTAwNSwxNCBAQCBzdGF0aWMgX19ydGVf YWx3YXlzX2lubGluZSB1bnNpZ25lZCBpbnQNCj4gIHJ0ZV9yaW5nX21jX2RlcXVldWVfYnVsayhz dHJ1Y3QgcnRlX3JpbmcgKnIsIHZvaWQgKipvYmpfdGFibGUsDQo+ICB1bnNpZ25lZCBpbnQgbiwg dW5zaWduZWQgaW50ICphdmFpbGFibGUpDQo+ICB7DQo+IC1yZXR1cm4gX19ydGVfcmluZ19kb19k ZXF1ZXVlKHIsIG9ial90YWJsZSwgbiwNCj4gUlRFX1JJTkdfUVVFVUVfRklYRUQsDQo+IC1fX0lT X01DLCBhdmFpbGFibGUpOw0KPiAraWYgKHItPmZsYWdzICYgUklOR19GX05CKQ0KPiArcmV0dXJu IF9fcnRlX3JpbmdfZG9fbmJfZGVxdWV1ZShyLCBvYmpfdGFibGUsIG4sDQo+ICtSVEVfUklOR19R VUVVRV9GSVhFRA0KPiAsIF9fSVNfTUMsDQo+ICthdmFpbGFibGUpOw0KPiArZWxzZQ0KPiArcmV0 dXJuIF9fcnRlX3JpbmdfZG9fZGVxdWV1ZShyLCBvYmpfdGFibGUsIG4sDQo+ICsgICAgIFJURV9S SU5HX1FVRVVFX0ZJWEVELA0KPiBfX0lTX01DLA0KPiArICAgICBhdmFpbGFibGUpOw0KPiAgfQ0K Pg0KPiAgLyoqDQo+IEBAIC01OTYsOCArMTAzNSwxNCBAQCBzdGF0aWMgX19ydGVfYWx3YXlzX2lu bGluZSB1bnNpZ25lZCBpbnQNCj4gIHJ0ZV9yaW5nX3NjX2RlcXVldWVfYnVsayhzdHJ1Y3QgcnRl X3JpbmcgKnIsIHZvaWQgKipvYmpfdGFibGUsDQo+ICB1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQg aW50ICphdmFpbGFibGUpDQo+ICB7DQo+IC1yZXR1cm4gX19ydGVfcmluZ19kb19kZXF1ZXVlKHIs IG9ial90YWJsZSwgbiwNCj4gUlRFX1JJTkdfUVVFVUVfRklYRUQsDQo+IC1fX0lTX1NDLCBhdmFp bGFibGUpOw0KPiAraWYgKHItPmZsYWdzICYgUklOR19GX05CKQ0KPiArcmV0dXJuIF9fcnRlX3Jp bmdfZG9fbmJfZGVxdWV1ZShyLCBvYmpfdGFibGUsIG4sDQo+ICtSVEVfUklOR19RVUVVRV9GSVhF RA0KPiAsIF9fSVNfU0MsDQo+ICthdmFpbGFibGUpOw0KPiArZWxzZQ0KPiArcmV0dXJuIF9fcnRl X3JpbmdfZG9fZGVxdWV1ZShyLCBvYmpfdGFibGUsIG4sDQo+ICsgICAgIFJURV9SSU5HX1FVRVVF X0ZJWEVELA0KPiBfX0lTX1NDLA0KPiArICAgICBhdmFpbGFibGUpOw0KPiAgfQ0KPg0KPiAgLyoq DQo+IEBAIC02MjMsOCArMTA2OCwxNCBAQCBzdGF0aWMgX19ydGVfYWx3YXlzX2lubGluZSB1bnNp Z25lZCBpbnQNCj4gIHJ0ZV9yaW5nX2RlcXVldWVfYnVsayhzdHJ1Y3QgcnRlX3JpbmcgKnIsIHZv aWQgKipvYmpfdGFibGUsIHVuc2lnbmVkDQo+IGludCBuLA0KPiAgdW5zaWduZWQgaW50ICphdmFp bGFibGUpDQo+ICB7DQo+IC1yZXR1cm4gX19ydGVfcmluZ19kb19kZXF1ZXVlKHIsIG9ial90YWJs ZSwgbiwNCj4gUlRFX1JJTkdfUVVFVUVfRklYRUQsDQo+IC1yLT5jb25zLnNpbmdsZSwgYXZhaWxh YmxlKTsNCj4gK2lmIChyLT5mbGFncyAmIFJJTkdfRl9OQikNCj4gK3JldHVybiBfX3J0ZV9yaW5n X2RvX25iX2RlcXVldWUociwgb2JqX3RhYmxlLCBuLA0KPiArUlRFX1JJTkdfUVVFVUVfRklYRUQN Cj4gLA0KPiArci0+Y29uc182NC5zaW5nbGUsDQo+IGF2YWlsYWJsZSk7DQo+ICtlbHNlDQo+ICty ZXR1cm4gX19ydGVfcmluZ19kb19kZXF1ZXVlKHIsIG9ial90YWJsZSwgbiwNCj4gKyAgICAgUlRF X1JJTkdfUVVFVUVfRklYRUQsDQo+ICsgICAgIHItPmNvbnMuc2luZ2xlLA0KPiBhdmFpbGFibGUp Ow0KPiAgfQ0KPg0KPiAgLyoqDQo+IEBAIC02OTksOSArMTE1MCwxMyBAQCBydGVfcmluZ19kZXF1 ZXVlKHN0cnVjdCBydGVfcmluZyAqciwgdm9pZA0KPiAqKm9ial9wKQ0KPiAgc3RhdGljIGlubGlu ZSB1bnNpZ25lZA0KPiAgcnRlX3JpbmdfY291bnQoY29uc3Qgc3RydWN0IHJ0ZV9yaW5nICpyKQ0K PiAgew0KPiAtdWludDMyX3QgcHJvZF90YWlsID0gci0+cHJvZC50YWlsOw0KPiAtdWludDMyX3Qg Y29uc190YWlsID0gci0+Y29ucy50YWlsOw0KPiAtdWludDMyX3QgY291bnQgPSAocHJvZF90YWls IC0gY29uc190YWlsKSAmIHItPm1hc2s7DQo+ICt1aW50MzJfdCBjb3VudDsNCj4gKw0KPiAraWYg KHItPmZsYWdzICYgUklOR19GX05CKQ0KPiArY291bnQgPSAoci0+cHJvZF82NC50YWlsIC0gci0+ Y29uc182NC50YWlsKSAmIHItDQo+ID5tYXNrOw0KPiArZWxzZQ0KPiArY291bnQgPSAoci0+cHJv ZC50YWlsIC0gci0+Y29ucy50YWlsKSAmIHItPm1hc2s7DQo+ICsNCj4gIHJldHVybiAoY291bnQg PiByLT5jYXBhY2l0eSkgPyByLT5jYXBhY2l0eSA6IGNvdW50Ow0KPiAgfQ0KPg0KPiBAQCAtODIx LDggKzEyNzYsMTQgQEAgc3RhdGljIF9fcnRlX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQNCj4gIHJ0 ZV9yaW5nX21wX2VucXVldWVfYnVyc3Qoc3RydWN0IHJ0ZV9yaW5nICpyLCB2b2lkICogY29uc3QN Cj4gKm9ial90YWJsZSwNCj4gICB1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50ICpmcmVlX3Nw YWNlKQ0KPiAgew0KPiAtcmV0dXJuIF9fcnRlX3JpbmdfZG9fZW5xdWV1ZShyLCBvYmpfdGFibGUs IG4sDQo+IC1SVEVfUklOR19RVUVVRV9WQVJJQUJMRSwgX19JU19NUCwNCj4gZnJlZV9zcGFjZSk7 DQo+ICtpZiAoci0+ZmxhZ3MgJiBSSU5HX0ZfTkIpDQo+ICtyZXR1cm4gX19ydGVfcmluZ19kb19u Yl9lbnF1ZXVlKHIsIG9ial90YWJsZSwgbiwNCj4gK1JURV9SSU5HX1FVRVVFX1ZBUklBDQo+IEJM RSwNCj4gK19fSVNfTVAsDQo+IGZyZWVfc3BhY2UpOw0KPiArZWxzZQ0KPiArcmV0dXJuIF9fcnRl X3JpbmdfZG9fZW5xdWV1ZShyLCBvYmpfdGFibGUsIG4sDQo+ICsgICAgIFJURV9SSU5HX1FVRVVF X1ZBUklBQkxFDQo+ICwNCj4gKyAgICAgX19JU19NUCwgZnJlZV9zcGFjZSk7DQo+ICB9DQo+DQo+ ICAvKioNCj4gQEAgLTg0NCw4ICsxMzA1LDE0IEBAIHN0YXRpYyBfX3J0ZV9hbHdheXNfaW5saW5l IHVuc2lnbmVkDQo+ICBydGVfcmluZ19zcF9lbnF1ZXVlX2J1cnN0KHN0cnVjdCBydGVfcmluZyAq ciwgdm9pZCAqIGNvbnN0DQo+ICpvYmpfdGFibGUsDQo+ICAgdW5zaWduZWQgaW50IG4sIHVuc2ln bmVkIGludCAqZnJlZV9zcGFjZSkNCj4gIHsNCj4gLXJldHVybiBfX3J0ZV9yaW5nX2RvX2VucXVl dWUociwgb2JqX3RhYmxlLCBuLA0KPiAtUlRFX1JJTkdfUVVFVUVfVkFSSUFCTEUsIF9fSVNfU1As DQo+IGZyZWVfc3BhY2UpOw0KPiAraWYgKHItPmZsYWdzICYgUklOR19GX05CKQ0KPiArcmV0dXJu IF9fcnRlX3JpbmdfZG9fbmJfZW5xdWV1ZShyLCBvYmpfdGFibGUsIG4sDQo+ICtSVEVfUklOR19R VUVVRV9WQVJJQQ0KPiBCTEUsDQo+ICtfX0lTX1NQLA0KPiBmcmVlX3NwYWNlKTsNCj4gK2Vsc2UN Cj4gK3JldHVybiBfX3J0ZV9yaW5nX2RvX2VucXVldWUociwgb2JqX3RhYmxlLCBuLA0KPiArICAg ICBSVEVfUklOR19RVUVVRV9WQVJJQUJMRQ0KPiAsDQo+ICsgICAgIF9fSVNfU1AsIGZyZWVfc3Bh Y2UpOw0KPiAgfQ0KPg0KPiAgLyoqDQo+IEBAIC04NzEsOCArMTMzOCwxNCBAQCBzdGF0aWMgX19y dGVfYWx3YXlzX2lubGluZSB1bnNpZ25lZA0KPiAgcnRlX3JpbmdfZW5xdWV1ZV9idXJzdChzdHJ1 Y3QgcnRlX3JpbmcgKnIsIHZvaWQgKiBjb25zdCAqb2JqX3RhYmxlLA0KPiAgICAgICAgdW5zaWdu ZWQgaW50IG4sIHVuc2lnbmVkIGludCAqZnJlZV9zcGFjZSkNCj4gIHsNCj4gLXJldHVybiBfX3J0 ZV9yaW5nX2RvX2VucXVldWUociwgb2JqX3RhYmxlLCBuLA0KPiBSVEVfUklOR19RVUVVRV9WQVJJ QUJMRSwNCj4gLXItPnByb2Quc2luZ2xlLCBmcmVlX3NwYWNlKTsNCj4gK2lmIChyLT5mbGFncyAm IFJJTkdfRl9OQikNCj4gK3JldHVybiBfX3J0ZV9yaW5nX2RvX25iX2VucXVldWUociwgb2JqX3Rh YmxlLCBuLA0KPiArUlRFX1JJTkdfUVVFVUVfVkFSSUENCj4gQkxFLA0KPiArci0+cHJvZF82NC5z aW5nbGUsDQo+IGZyZWVfc3BhY2UpOw0KPiArZWxzZQ0KPiArcmV0dXJuIF9fcnRlX3JpbmdfZG9f ZW5xdWV1ZShyLCBvYmpfdGFibGUsIG4sDQo+ICsgICAgIFJURV9SSU5HX1FVRVVFX1ZBUklBQkxF DQo+ICwNCj4gKyAgICAgci0+cHJvZC5zaW5nbGUsDQo+IGZyZWVfc3BhY2UpOw0KPiAgfQ0KPg0K PiAgLyoqDQo+IEBAIC04OTksOCArMTM3MiwxNCBAQCBzdGF0aWMgX19ydGVfYWx3YXlzX2lubGlu ZSB1bnNpZ25lZA0KPiAgcnRlX3JpbmdfbWNfZGVxdWV1ZV9idXJzdChzdHJ1Y3QgcnRlX3Jpbmcg KnIsIHZvaWQgKipvYmpfdGFibGUsDQo+ICB1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50ICph dmFpbGFibGUpDQo+ICB7DQo+IC1yZXR1cm4gX19ydGVfcmluZ19kb19kZXF1ZXVlKHIsIG9ial90 YWJsZSwgbiwNCj4gLVJURV9SSU5HX1FVRVVFX1ZBUklBQkxFLCBfX0lTX01DLA0KPiBhdmFpbGFi bGUpOw0KPiAraWYgKHItPmZsYWdzICYgUklOR19GX05CKQ0KPiArcmV0dXJuIF9fcnRlX3Jpbmdf ZG9fbmJfZGVxdWV1ZShyLCBvYmpfdGFibGUsIG4sDQo+ICtSVEVfUklOR19RVUVVRV9WQVJJQQ0K PiBCTEUsDQo+ICtfX0lTX01DLCBhdmFpbGFibGUpOw0KPiArZWxzZQ0KPiArcmV0dXJuIF9fcnRl X3JpbmdfZG9fZGVxdWV1ZShyLCBvYmpfdGFibGUsIG4sDQo+ICsgICAgIFJURV9SSU5HX1FVRVVF X1ZBUklBQkxFDQo+ICwNCj4gKyAgICAgX19JU19NQywgYXZhaWxhYmxlKTsNCj4gIH0NCj4NCj4g IC8qKg0KPiBAQCAtOTI0LDggKzE0MDMsMTQgQEAgc3RhdGljIF9fcnRlX2Fsd2F5c19pbmxpbmUg dW5zaWduZWQNCj4gIHJ0ZV9yaW5nX3NjX2RlcXVldWVfYnVyc3Qoc3RydWN0IHJ0ZV9yaW5nICpy LCB2b2lkICoqb2JqX3RhYmxlLA0KPiAgdW5zaWduZWQgaW50IG4sIHVuc2lnbmVkIGludCAqYXZh aWxhYmxlKQ0KPiAgew0KPiAtcmV0dXJuIF9fcnRlX3JpbmdfZG9fZGVxdWV1ZShyLCBvYmpfdGFi bGUsIG4sDQo+IC1SVEVfUklOR19RVUVVRV9WQVJJQUJMRSwgX19JU19TQywNCj4gYXZhaWxhYmxl KTsNCj4gK2lmIChyLT5mbGFncyAmIFJJTkdfRl9OQikNCj4gK3JldHVybiBfX3J0ZV9yaW5nX2Rv X25iX2RlcXVldWUociwgb2JqX3RhYmxlLCBuLA0KPiArUlRFX1JJTkdfUVVFVUVfVkFSSUENCj4g QkxFLA0KPiArX19JU19TQywgYXZhaWxhYmxlKTsNCj4gK2Vsc2UNCj4gK3JldHVybiBfX3J0ZV9y aW5nX2RvX2RlcXVldWUociwgb2JqX3RhYmxlLCBuLA0KPiArICAgICBSVEVfUklOR19RVUVVRV9W QVJJQUJMRQ0KPiAsDQo+ICsgICAgIF9fSVNfU0MsIGF2YWlsYWJsZSk7DQo+ICB9DQo+DQo+ICAv KioNCj4gQEAgLTk1MSw5ICsxNDM2LDE0IEBAIHN0YXRpYyBfX3J0ZV9hbHdheXNfaW5saW5lIHVu c2lnbmVkDQo+ICBydGVfcmluZ19kZXF1ZXVlX2J1cnN0KHN0cnVjdCBydGVfcmluZyAqciwgdm9p ZCAqKm9ial90YWJsZSwNCj4gIHVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgKmF2YWlsYWJs ZSkNCj4gIHsNCj4gLXJldHVybiBfX3J0ZV9yaW5nX2RvX2RlcXVldWUociwgb2JqX3RhYmxlLCBu LA0KPiAtUlRFX1JJTkdfUVVFVUVfVkFSSUFCTEUsDQo+IC1yLT5jb25zLnNpbmdsZSwgYXZhaWxh YmxlKTsNCj4gK2lmIChyLT5mbGFncyAmIFJJTkdfRl9OQikNCj4gK3JldHVybiBfX3J0ZV9yaW5n X2RvX25iX2RlcXVldWUociwgb2JqX3RhYmxlLCBuLA0KPiArUlRFX1JJTkdfUVVFVUVfVkFSSUEN Cj4gQkxFLA0KPiArci0+Y29uc182NC5zaW5nbGUsDQo+IGF2YWlsYWJsZSk7DQo+ICtlbHNlDQo+ ICtyZXR1cm4gX19ydGVfcmluZ19kb19kZXF1ZXVlKHIsIG9ial90YWJsZSwgbiwNCj4gKyAgICAg UlRFX1JJTkdfUVVFVUVfVkFSSUFCTEUNCj4gLA0KPiArICAgICByLT5jb25zLnNpbmdsZSwNCj4g YXZhaWxhYmxlKTsNCj4gIH0NCj4NCj4gICNpZmRlZiBfX2NwbHVzcGx1cw0KPiBkaWZmIC0tZ2l0 IGEvbGliL2xpYnJ0ZV9yaW5nL3J0ZV9yaW5nX3ZlcnNpb24ubWFwDQo+IGIvbGliL2xpYnJ0ZV9y aW5nL3J0ZV9yaW5nX3ZlcnNpb24ubWFwDQo+IGluZGV4IGQ5MzVlZmQwZC4uODk2OTQ2N2FmIDEw MDY0NA0KPiAtLS0gYS9saWIvbGlicnRlX3JpbmcvcnRlX3JpbmdfdmVyc2lvbi5tYXANCj4gKysr IGIvbGliL2xpYnJ0ZV9yaW5nL3J0ZV9yaW5nX3ZlcnNpb24ubWFwDQo+IEBAIC0xNywzICsxNywx MCBAQCBEUERLXzIuMiB7DQo+ICBydGVfcmluZ19mcmVlOw0KPg0KPiAgfSBEUERLXzIuMDsNCj4g Kw0KPiArRFBES18xOS4wNSB7DQo+ICtnbG9iYWw6DQo+ICsNCj4gK3J0ZV9yaW5nX2dldF9tZW1z aXplOw0KPiArDQo+ICt9IERQREtfMi4yOw0KSU1QT1JUQU5UIE5PVElDRTogVGhlIGNvbnRlbnRz IG9mIHRoaXMgZW1haWwgYW5kIGFueSBhdHRhY2htZW50cyBhcmUgY29uZmlkZW50aWFsIGFuZCBt YXkgYWxzbyBiZSBwcml2aWxlZ2VkLiBJZiB5b3UgYXJlIG5vdCB0aGUgaW50ZW5kZWQgcmVjaXBp ZW50LCBwbGVhc2Ugbm90aWZ5IHRoZSBzZW5kZXIgaW1tZWRpYXRlbHkgYW5kIGRvIG5vdCBkaXNj bG9zZSB0aGUgY29udGVudHMgdG8gYW55IG90aGVyIHBlcnNvbiwgdXNlIGl0IGZvciBhbnkgcHVy cG9zZSwgb3Igc3RvcmUgb3IgY29weSB0aGUgaW5mb3JtYXRpb24gaW4gYW55IG1lZGl1bS4gVGhh bmsgeW91Lg0K