From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from szxga06-in.huawei.com (szxga06-in.huawei.com [45.249.212.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D613245975 for ; Thu, 22 Feb 2024 11:31:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.32 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708601488; cv=none; b=fZPGWR2+81kKJjpFzJr8VU8davOrkp4XHgMEbPNuOjvlMkDGSyhGwaS8B9gkDlsPcGKh1OZNIadckE3XSwSlQe6dEhuQrtoBmA0Kfp5N6hfkSf7NdEpcZjGgDtPsQQo806sIjNpzi5D3jsz15cTA8ZRymtLn3ncYY+1xYDBoGfc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708601488; c=relaxed/simple; bh=F4am/n7NRcpyCYiYEb/VlrfOLQWcEB1g1+lHxOal0wQ=; h=From:To:CC:Subject:Date:Message-ID:References:In-Reply-To: Content-Type:MIME-Version; b=IjLAw+C3pxutGqgkJPKaPEWVD232giJysWtK4za73CDc0BJctncSabwMHc0pe8DToBVez4/eWeE4Zf5qbUAsKqf5CfF2zNdt3uDbxWsqGCAlicLXmenKuy5HWlR9oXHjNA+RNmMd9TS6W6lFaWTp6FpkUuh2M1Jftzj7bJ0xn1Y= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.88.163]) by szxga06-in.huawei.com (SkyGuard) with ESMTP id 4TgWD66hp6z1vv47; Thu, 22 Feb 2024 19:30:46 +0800 (CST) Received: from dggems704-chm.china.huawei.com (unknown [10.3.19.181]) by mail.maildlp.com (Postfix) with ESMTPS id 8AF6E18002F; Thu, 22 Feb 2024 19:31:21 +0800 (CST) Received: from lhrpeml500005.china.huawei.com (7.191.163.240) by dggems704-chm.china.huawei.com (10.3.19.181) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Thu, 22 Feb 2024 19:31:20 +0800 Received: from lhrpeml500005.china.huawei.com ([7.191.163.240]) by lhrpeml500005.china.huawei.com ([7.191.163.240]) with mapi id 15.01.2507.035; Thu, 22 Feb 2024 11:31:18 +0000 From: Shameerali Kolothum Thodi To: Joao Martins CC: "joro@8bytes.org" , "jgg@nvidia.com" , "kevin.tian@intel.com" , "nicolinc@nvidia.com" , "iommu@lists.linux.dev" , "mshavit@google.com" , "robin.murphy@arm.com" , "will@kernel.org" , jiangkunkun , zhukeqian , Linuxarm , "linux-arm-kernel@lists.infradead.org" Subject: RE: [PATCH v2 3/4] iommu/arm-smmu-v3: Add support for dirty tracking in domain alloc Thread-Topic: [PATCH v2 3/4] iommu/arm-smmu-v3: Add support for dirty tracking in domain alloc Thread-Index: AQHaZXTSExgSw/uTxUa44V9Mknrnh7EWMsuAgAAGflA= Date: Thu, 22 Feb 2024 11:31:18 +0000 Message-ID: References: <20240222094923.33104-1-shameerali.kolothum.thodi@huawei.com> <20240222094923.33104-4-shameerali.kolothum.thodi@huawei.com> In-Reply-To: Accept-Language: en-GB, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Precedence: bulk X-Mailing-List: iommu@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogSm9hbyBNYXJ0aW5zIDxq b2FvLm0ubWFydGluc0BvcmFjbGUuY29tPg0KPiBTZW50OiBUaHVyc2RheSwgRmVicnVhcnkgMjIs IDIwMjQgMTE6MDQgQU0NCj4gVG86IFNoYW1lZXJhbGkgS29sb3RodW0gVGhvZGkgPHNoYW1lZXJh bGkua29sb3RodW0udGhvZGlAaHVhd2VpLmNvbT4NCj4gQ2M6IGpvcm9AOGJ5dGVzLm9yZzsgamdn QG52aWRpYS5jb207IGtldmluLnRpYW5AaW50ZWwuY29tOw0KPiBuaWNvbGluY0BudmlkaWEuY29t OyBpb21tdUBsaXN0cy5saW51eC5kZXY7IG1zaGF2aXRAZ29vZ2xlLmNvbTsNCj4gcm9iaW4ubXVy cGh5QGFybS5jb207IHdpbGxAa2VybmVsLm9yZzsgamlhbmdrdW5rdW4NCj4gPGppYW5na3Vua3Vu QGh1YXdlaS5jb20+OyB6aHVrZXFpYW4gPHpodWtlcWlhbjFAaHVhd2VpLmNvbT47DQo+IExpbnV4 YXJtIDxsaW51eGFybUBodWF3ZWkuY29tPjsgbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRl YWQub3JnDQo+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggdjIgMy80XSBpb21tdS9hcm0tc21tdS12Mzog QWRkIHN1cHBvcnQgZm9yIGRpcnR5DQo+IHRyYWNraW5nIGluIGRvbWFpbiBhbGxvYw0KPiANCj4g T24gMjIvMDIvMjAyNCAwOTo0OSwgU2hhbWVlciBLb2xvdGh1bSB3cm90ZToNCj4gPiBGcm9tOiBK b2FvIE1hcnRpbnMgPGpvYW8ubS5tYXJ0aW5zQG9yYWNsZS5jb20+DQo+ID4NCj4gPiBUaGlzIHBy b3ZpZGVzIGFsbCB0aGUgaW5mcmFzdHJ1Y3R1cmUgdG8gZW5hYmxlIGRpcnR5IHRyYWNraW5nIGlm IHRoZQ0KPiA+IGhhcmR3YXJlIGhhcyB0aGUgY2FwYWJpbGl0eSBhbmQgZG9tYWluIGFsbG9jIHJl cXVlc3QgZm9yIGl0Lg0KPiA+DQo+ID4gUGxlYXNlIG5vdGUsIHdlIHN0aWxsIHJlcG9ydCBubyBz dXBwb3J0IGZvciBJT01NVV9DQVBfRElSVFlfVFJBQ0tJTkcNCj4gPiBhcyBpdCB3aWxsIGZpbmFs bHkgYmUgZW5hYmxlZCBpbiBhIHN1YnNlcXVlbnQgcGF0Y2guDQo+ID4NCj4gPiBTaWduZWQtb2Zm LWJ5OiBKb2FvIE1hcnRpbnMgPGpvYW8ubS5tYXJ0aW5zQG9yYWNsZS5jb20+DQo+ID4gU2lnbmVk LW9mZi1ieTogU2hhbWVlciBLb2xvdGh1bQ0KPiA8c2hhbWVlcmFsaS5rb2xvdGh1bS50aG9kaUBo dWF3ZWkuY29tPg0KPiA+IC0tLQ0KPiA+ICBkcml2ZXJzL2lvbW11L2FybS9hcm0tc21tdS12My9h cm0tc21tdS12My5jIHwgOTUNCj4gKysrKysrKysrKysrKysrKy0tLS0tDQo+ID4gIGluY2x1ZGUv bGludXgvaW8tcGd0YWJsZS5oICAgICAgICAgICAgICAgICAgfCAgNCArDQo+ID4gIDIgZmlsZXMg Y2hhbmdlZCwgNzcgaW5zZXJ0aW9ucygrKSwgMjIgZGVsZXRpb25zKC0pDQo+ID4NCj4gPiBkaWZm IC0tZ2l0IGEvZHJpdmVycy9pb21tdS9hcm0vYXJtLXNtbXUtdjMvYXJtLXNtbXUtdjMuYw0KPiA+ IGIvZHJpdmVycy9pb21tdS9hcm0vYXJtLXNtbXUtdjMvYXJtLXNtbXUtdjMuYw0KPiA+IGluZGV4 IGJkMzA3MzllMzU4OC4uMDU4YmJiMGRiZTJlIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvaW9t bXUvYXJtL2FybS1zbW11LXYzL2FybS1zbW11LXYzLmMNCj4gPiArKysgYi9kcml2ZXJzL2lvbW11 L2FybS9hcm0tc21tdS12My9hcm0tc21tdS12My5jDQo+ID4gQEAgLTQzLDYgKzQzLDcgQEAgTU9E VUxFX1BBUk1fREVTQyhkaXNhYmxlX21zaXBvbGxpbmcsDQo+ID4gIAkiRGlzYWJsZSBNU0ktYmFz ZWQgcG9sbGluZyBmb3IgQ01EX1NZTkMgY29tcGxldGlvbi4iKTsNCj4gPg0KPiA+ICBzdGF0aWMg c3RydWN0IGlvbW11X29wcyBhcm1fc21tdV9vcHM7DQo+ID4gK3N0YXRpYyBzdHJ1Y3QgaW9tbXVf ZGlydHlfb3BzIGFybV9zbW11X2RpcnR5X29wczsNCj4gPg0KPiA+ICBlbnVtIGFybV9zbW11X21z aV9pbmRleCB7DQo+ID4gIAlFVlRRX01TSV9JTkRFWCwNCj4gPiBAQCAtODYsNyArODcsOCBAQCBz dGF0aWMgc3RydWN0IGFybV9zbW11X29wdGlvbl9wcm9wDQo+ID4gYXJtX3NtbXVfb3B0aW9uc1td ID0gew0KPiA+DQo+ID4gIHN0YXRpYyB2b2lkIGFybV9zbW11X3Jtcl9pbnN0YWxsX2J5cGFzc19z dGUoc3RydWN0IGFybV9zbW11X2RldmljZQ0KPiA+ICpzbW11KTsgIHN0YXRpYyBpbnQgYXJtX3Nt bXVfZG9tYWluX2ZpbmFsaXNlKHN0cnVjdCBhcm1fc21tdV9kb21haW4NCj4gKnNtbXVfZG9tYWlu LA0KPiA+IC0JCQkJICAgIHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpOw0KPiA+ICsJCQkJ ICAgIHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUsDQo+ID4gKwkJCQkgICAgYm9vbCBlbmFi bGVfZGlydHkpOw0KPiA+ICBzdGF0aWMgaW50IGFybV9zbW11X2FsbG9jX2NkX3RhYmxlcyhzdHJ1 Y3QgYXJtX3NtbXVfbWFzdGVyICptYXN0ZXIpOw0KPiA+IHN0YXRpYyB2b2lkIGFybV9zbW11X3Rs Yl9pbnZfYWxsX3MyKHN0cnVjdCBhcm1fc21tdV9kb21haW4NCj4gPiAqc21tdV9kb21haW4pOw0K PiA+DQo+ID4gQEAgLTIzNzgsNyArMjM4MCw3IEBAIHN0YXRpYyBzdHJ1Y3QgaW9tbXVfZG9tYWlu DQo+ICphcm1fc21tdV9kb21haW5fYWxsb2NfcGFnaW5nKHN0cnVjdCBkZXZpY2UgKmRldikNCj4g PiAgCQlzdHJ1Y3QgYXJtX3NtbXVfbWFzdGVyICptYXN0ZXIgPQ0KPiBkZXZfaW9tbXVfcHJpdl9n ZXQoZGV2KTsNCj4gPiAgCQlpbnQgcmV0Ow0KPiA+DQo+ID4gLQkJcmV0ID0gYXJtX3NtbXVfZG9t YWluX2ZpbmFsaXNlKHNtbXVfZG9tYWluLCBtYXN0ZXItDQo+ID5zbW11KTsNCj4gPiArCQlyZXQg PSBhcm1fc21tdV9kb21haW5fZmluYWxpc2Uoc21tdV9kb21haW4sIG1hc3Rlci0NCj4gPnNtbXUs IGZhbHNlKTsNCj4gPiAgCQlpZiAocmV0KSB7DQo+ID4gIAkJCWtmcmVlKHNtbXVfZG9tYWluKTsN Cj4gPiAgCQkJcmV0dXJuIEVSUl9QVFIocmV0KTsNCj4gPiBAQCAtMjQ0NSwxMCArMjQ0NywxMSBA QCBzdGF0aWMgdm9pZCBhcm1fc21tdV9kb21haW5fZnJlZShzdHJ1Y3QNCj4gPiBpb21tdV9kb21h aW4gKmRvbWFpbikgIH0NCj4gPg0KPiA+ICBzdGF0aWMgaW50IGFybV9zbW11X2RvbWFpbl9maW5h bGlzZShzdHJ1Y3QgYXJtX3NtbXVfZG9tYWluDQo+ICpzbW11X2RvbWFpbiwNCj4gPiAtCQkJCSAg ICBzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQ0KPiA+ICsJCQkJICAgIHN0cnVjdCBhcm1f c21tdV9kZXZpY2UgKnNtbXUsDQo+ID4gKwkJCQkgICAgYm9vbCBlbmFibGVfZGlydHkpDQo+ID4g IHsNCj4gPiAgCWludCByZXQ7DQo+ID4gLQl1bnNpZ25lZCBsb25nIGlhcywgb2FzOw0KPiA+ICsJ dW5zaWduZWQgbG9uZyBpYXM7DQo+ID4gIAllbnVtIGlvX3BndGFibGVfZm10IGZtdDsNCj4gPiAg CXN0cnVjdCBpb19wZ3RhYmxlX2NmZyBwZ3RibF9jZmc7DQo+ID4gIAlzdHJ1Y3QgaW9fcGd0YWJs ZV9vcHMgKnBndGJsX29wczsNCj4gPiBAQCAtMjQ1OSwzMSArMjQ2MiwzMSBAQCBzdGF0aWMgaW50 IGFybV9zbW11X2RvbWFpbl9maW5hbGlzZShzdHJ1Y3QNCj4gYXJtX3NtbXVfZG9tYWluICpzbW11 X2RvbWFpbiwNCj4gPiAgCWlmICghKHNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF9UUkFO U19TMikpDQo+ID4gIAkJc21tdV9kb21haW4tPnN0YWdlID0gQVJNX1NNTVVfRE9NQUlOX1MxOw0K PiA+DQo+ID4gKwlwZ3RibF9jZmcgPSAoc3RydWN0IGlvX3BndGFibGVfY2ZnKSB7DQo+ID4gKwkJ LnBnc2l6ZV9iaXRtYXAJPSBzbW11LT5wZ3NpemVfYml0bWFwLA0KPiA+ICsJCS5jb2hlcmVudF93 YWxrCT0gc21tdS0+ZmVhdHVyZXMgJg0KPiBBUk1fU01NVV9GRUFUX0NPSEVSRU5DWSwNCj4gPiAr CQkudGxiCQk9ICZhcm1fc21tdV9mbHVzaF9vcHMsDQo+ID4gKwkJLmlvbW11X2Rldgk9IHNtbXUt PmRldiwNCj4gPiArCX07DQo+ID4gKw0KPiA+ICAJc3dpdGNoIChzbW11X2RvbWFpbi0+c3RhZ2Up IHsNCj4gPiAgCWNhc2UgQVJNX1NNTVVfRE9NQUlOX1MxOg0KPiA+ICAJCWlhcyA9IChzbW11LT5m ZWF0dXJlcyAmIEFSTV9TTU1VX0ZFQVRfVkFYKSA/IDUyIDogNDg7DQo+ID4gLQkJaWFzID0gbWlu X3QodW5zaWduZWQgbG9uZywgaWFzLCBWQV9CSVRTKTsNCj4gPiAtCQlvYXMgPSBzbW11LT5pYXM7 DQo+ID4gKwkJcGd0YmxfY2ZnLmlhcyA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGlhcywgVkFfQklU Uyk7DQo+ID4gKwkJcGd0YmxfY2ZnLm9hcyA9IHNtbXUtPmlhczsNCj4gPiArCQlpZiAoZW5hYmxl X2RpcnR5KQ0KPiA+ICsJCQlwZ3RibF9jZmcucXVpcmtzIHw9IElPX1BHVEFCTEVfUVVJUktfQVJN X0hEOw0KPiA+ICAJCWZtdCA9IEFSTV82NF9MUEFFX1MxOw0KPiA+ICAJCWJyZWFrOw0KPiA+ICAJ Y2FzZSBBUk1fU01NVV9ET01BSU5fUzI6DQo+ID4gLQkJaWFzID0gc21tdS0+aWFzOw0KPiA+IC0J CW9hcyA9IHNtbXUtPm9hczsNCj4gPiArCQlwZ3RibF9jZmcuaWFzID0gc21tdS0+aWFzOw0KPiA+ ICsJCXBndGJsX2NmZy5vYXMgPSBzbW11LT5vYXM7DQo+ID4gIAkJZm10ID0gQVJNXzY0X0xQQUVf UzI7DQo+ID4gIAkJYnJlYWs7DQo+ID4gIAlkZWZhdWx0Og0KPiA+ICAJCXJldHVybiAtRUlOVkFM Ow0KPiA+ICAJfQ0KPiA+DQo+ID4gLQlwZ3RibF9jZmcgPSAoc3RydWN0IGlvX3BndGFibGVfY2Zn KSB7DQo+ID4gLQkJLnBnc2l6ZV9iaXRtYXAJPSBzbW11LT5wZ3NpemVfYml0bWFwLA0KPiA+IC0J CS5pYXMJCT0gaWFzLA0KPiA+IC0JCS5vYXMJCT0gb2FzLA0KPiA+IC0JCS5jb2hlcmVudF93YWxr CT0gc21tdS0+ZmVhdHVyZXMgJg0KPiBBUk1fU01NVV9GRUFUX0NPSEVSRU5DWSwNCj4gPiAtCQku dGxiCQk9ICZhcm1fc21tdV9mbHVzaF9vcHMsDQo+ID4gLQkJLmlvbW11X2Rldgk9IHNtbXUtPmRl diwNCj4gPiAtCX07DQo+ID4gLQ0KPiA+ICAJcGd0Ymxfb3BzID0gYWxsb2NfaW9fcGd0YWJsZV9v cHMoZm10LCAmcGd0YmxfY2ZnLCBzbW11X2RvbWFpbik7DQo+ID4gIAlpZiAoIXBndGJsX29wcykN Cj4gPiAgCQlyZXR1cm4gLUVOT01FTTsNCj4gPiBAQCAtMjQ5MSw3ICsyNDk0LDggQEAgc3RhdGlj IGludCBhcm1fc21tdV9kb21haW5fZmluYWxpc2Uoc3RydWN0DQo+IGFybV9zbW11X2RvbWFpbiAq c21tdV9kb21haW4sDQo+ID4gIAlzbW11X2RvbWFpbi0+ZG9tYWluLnBnc2l6ZV9iaXRtYXAgPSBw Z3RibF9jZmcucGdzaXplX2JpdG1hcDsNCj4gPiAgCXNtbXVfZG9tYWluLT5kb21haW4uZ2VvbWV0 cnkuYXBlcnR1cmVfZW5kID0gKDFVTCA8PA0KPiBwZ3RibF9jZmcuaWFzKSAtIDE7DQo+ID4gIAlz bW11X2RvbWFpbi0+ZG9tYWluLmdlb21ldHJ5LmZvcmNlX2FwZXJ0dXJlID0gdHJ1ZTsNCj4gPiAt DQo+ID4gKwlpZiAoZW5hYmxlX2RpcnR5ICYmIHNtbXVfZG9tYWluLT5zdGFnZSA9PQ0KPiBBUk1f U01NVV9ET01BSU5fUzEpDQo+ID4gKwkJc21tdV9kb21haW4tPmRvbWFpbi5kaXJ0eV9vcHMgPQ0K PiAmYXJtX3NtbXVfZGlydHlfb3BzOw0KPiA+ICAJcmV0ID0gYXJtX3NtbXVfZG9tYWluX2FsbG9j X2lkKHNtbXUsIHNtbXVfZG9tYWluKTsNCj4gPiAgCWlmIChyZXQgPCAwKSB7DQo+ID4gIAkJZnJl ZV9pb19wZ3RhYmxlX29wcyhwZ3RibF9vcHMpOw0KPiA+IEBAIC0yODExLDcgKzI4MTUsNyBAQCBz dGF0aWMgaW50IGFybV9zbW11X2F0dGFjaF9kZXYoc3RydWN0DQo+IGlvbW11X2RvbWFpbiAqZG9t YWluLCBzdHJ1Y3QgZGV2aWNlICpkZXYpDQo+ID4gIAltdXRleF9sb2NrKCZzbW11X2RvbWFpbi0+ aW5pdF9tdXRleCk7DQo+ID4NCj4gPiAgCWlmICghc21tdV9kb21haW4tPnNtbXUpIHsNCj4gPiAt CQlyZXQgPSBhcm1fc21tdV9kb21haW5fZmluYWxpc2Uoc21tdV9kb21haW4sIHNtbXUpOw0KPiA+ ICsJCXJldCA9IGFybV9zbW11X2RvbWFpbl9maW5hbGlzZShzbW11X2RvbWFpbiwgc21tdSwNCj4g ZmFsc2UpOw0KPiA+ICAJfSBlbHNlIGlmIChzbW11X2RvbWFpbi0+c21tdSAhPSBzbW11KQ0KPiA+ ICAJCXJldCA9IC1FSU5WQUw7DQo+ID4NCj4gDQo+IA0KPiBJIHRoaW5rIHdlIGFyZSBtaXNzaW5n IHRoZSBkb21haW4gYXR0YWNoX2RldiBjaGVjayBmb3IgZGlydHkgdHJhY2tpbmcuDQo+IA0KPiBT b21ldGhpbmcgbGlrZToNCj4gDQo+IGlmIChkb21haW4tPmRpcnR5X29wcyAmJiAhYXJtX3NtbXVf ZGJtX2NhcGFibGUoc21tdSkpDQo+IAlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+IEJ1dCB0aGF0IGhl bHBlciBpcyBvbmx5IGludHJvZHVjZWQgaW4gdGhlIGxhc3QgcGF0Y2gsIHNvIG1heWJlOg0KPiAN Cj4gaWYgKGRvbWFpbi0+ZGlydHlfb3BzICYmDQo+ICAgICAhZGV2aWNlX2lvbW11X2NhcGFibGUo ZGV2LCBJT01NVV9DQVBfRElSVFlfVFJBQ0tJTkcpKQ0KPiAJcmV0dXJuIC1FSU5WQUw7DQoNCk9r LiBCdXQgZG8gd2UgcmVhbGx5IG5lZWQgdG8gY2hlY2sgdGhpcyBpbiBhdHRhY2goKT8gQXMgZGly dHlfb3BzIGFyZSBhZGRlZCBvbmx5DQppZiBpdCBpcyByZXF1ZXN0ZWQgaW4gYWxsb2NfdXNlcigp IGFuZCB0aGVyZSB3ZSByZXR1cm4gZXJyIHdoZW4gaGFyZHdhcmUgZG9lc24ndCANCmhhdmUgdGhl IGNhcGFiaWxpdHkuICBTbyBub3Qgc3VyZSBob3cgdGhpcyBtYXR0ZXJzIGluIGF0dGFjaCgpIHBh dGguIE1heSBiZSBJIGFtIA0KbWlzc2luZyBzb21ldGhpbmcuDQoNClRoYW5rcywNClNoYW1lZXIN Cg0K