From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by dpdk.org (Postfix) with ESMTP id 3685C5F20 for ; Fri, 30 Mar 2018 18:22:18 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 30 Mar 2018 09:22:17 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,382,1517904000"; d="scan'208";a="46651160" Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by orsmga002.jf.intel.com with ESMTP; 30 Mar 2018 09:22:17 -0700 Received: from fmsmsx120.amr.corp.intel.com (10.18.124.208) by fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS) id 14.3.319.2; Fri, 30 Mar 2018 09:22:17 -0700 Received: from fmsmsx117.amr.corp.intel.com ([169.254.3.206]) by fmsmsx120.amr.corp.intel.com ([169.254.15.18]) with mapi id 14.03.0319.002; Fri, 30 Mar 2018 09:22:16 -0700 From: "Wiles, Keith" To: =?utf-8?B?R2HDq3RhbiBSaXZldA==?= CC: "dev@dpdk.org" Thread-Topic: [dpdk-dev] [PATCH v4 09/20] eal/dev: implement device iteration initialization Thread-Index: AQHTyD9U6zDyw/7kv02XAeqJzd1vQ6Ppa2GA Date: Fri, 30 Mar 2018 16:22:15 +0000 Message-ID: <5BF83C02-5266-4F6F-9A99-065FC92CB8CC@intel.com> References: <20180330155335.3tnaczturi6gvnzl@bidouze.vm.6wind.com> In-Reply-To: <20180330155335.3tnaczturi6gvnzl@bidouze.vm.6wind.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.255.79.31] Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 Subject: Re: [dpdk-dev] [PATCH v4 09/20] eal/dev: implement device iteration initialization 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: Fri, 30 Mar 2018 16:22:19 -0000 DQoNCj4gT24gTWFyIDMwLCAyMDE4LCBhdCAxMDo1MyBBTSwgR2HDq3RhbiBSaXZldCA8Z2FldGFu LnJpdmV0QDZ3aW5kLmNvbT4gd3JvdGU6DQo+IA0KPiBIZWxsbyBLZWl0aCwNCg0KSGVsbG8gR2HD q3RhbiwNCg0KPj4+ICsJCWxheWVyc1tpXS5rdmxpc3QgPSBydGVfa3ZhcmdzX3BhcnNlKGNvcHks IE5VTEwpOw0KPj4+ICsJCWZyZWUoY29weSk7DQo+PiANCj4+IEkgYW0gc29ycnkgdGhpcyBtZXRo b2Qgb2Ygbm90IGFkZGluZyBibGFuayBsaW5lcyBpcyBhIGJpdCBzaWxseSBhbmQgd2UgbmVlZCB0 byByZXRoaW5rIGF0IGxlYXN0IGFkZGluZyBhIGZldyBibGFuayBsaW5lcyB0byBoZWxwIHdpdGgg Z3JvdXBpbmcgdGhlIGNvZGUuIFRoaXMgc3R5bGUgd2lsbCBjYXVzZSBwcm9ibGVtcyBmb3IgbmV3 IHJlYWRlcnMgKG9sZCByZWFkZXJzKSB0byB1bmRlcnN0YW5kIHRoZSBjb2RlLiBUaGlzIHRvIG1l IGlzIGEgbWFpbnRlbmFuY2UgcHJvYmxlbSBmb3IgdGhlIGZ1dHVyZSBhbmQgd2UgbmVlZCB0byBm aXggdGhpcyBub3cuDQo+PiANCj4+IEJsYW5rIGxpbmVzIGFmdGVyIGlmIHN0YXRlbWVudHMgKHdp dGggcG9zc2libGUgbW9yZSBjb21tZW50cykgY2FuIGhlbHAgYWxvbmcgd2l0aCBhZGRpbmcgYmxh bmsgbGluZXMgdG8gZ3JvdXAgY29kZSBpcyByZWFsbHkgdGhlIG1pbmltdW0gYW1vdW50IG9mIGxp bmVzIHJlcXVpcmVkLiBJIGhhdmUgbmV2ZXIgc2VlbiBzb21lb25lIHN0YXRlIHlvdSBoYXZlIHRv IG1hbnkgYmxhbmtzIGxpbmVzIGluIHRoZSBjb2RlIGV4Y2VwdCB0d28gb3IgbW9yZSBibGFuayBs aW5lcyBpbiBhIHJvdy4gVGhpcyBpcyBha2luIHRvIGhhdmluZyBhIHNpbmdsZSBwYXJhZ3JhcGgg aW4gYSBub3ZlbCBvciBsZXR0ZXIgYW5kIGl0IG1ha2VzIGl0IHZlcnkgaGFyZCB0byByZWFkLiBJ dCBpcyBub3QgaGFyZCB0byBhZGQgc29tZSBibGFuayBsaW5lcyB0byB0aGUgY29kZSBmb3IgcmVh ZGFiaWxpdHkuDQo+PiANCj4gDQo+IEkgdW5kZXJzdGFuZC4gV2hhdCBJIGRpc2xpa2UgaXMgaGF2 aW5nIGluY29uc2lzdGVuY2llcyBpbiB0aGUgbGF5b3V0IG9mDQo+IHRoZSBjb2RlLg0KPiANCj4g IlBhcmFncmFwaHMiLCBmb3IgbGFjayBvZiBhIGJldHRlciB3b3JkLCBhcmUgaGlnaCBzdWJqZWN0 aXZlIGFuZCBhDQo+IG1hdHRlciBvZiB0YXN0ZS4NCg0KSSBiZXQgeW91ciB0ZWFjaGVyKHMpIHdv dWxkIGRpc2FncmVlIHdpdGggdGhhdCBzdGF0ZW1lbnQgd2l0aCBvbmUgc2luZ2xlIHBhcmFncmFw aCBpbiB5b3VyIGJvb2sgcmVwb3J0cyA6LSkNCj4gDQo+IEdpdmVuIHRoYXQgc3ViamVjdGl2aXR5 IGlzIG5vdCBoZWxwZnVsIGluIHJldmlldyBhbmQgdGFzdGUgaXMgaGFyZCB0bw0KPiBkZWJhdGUs IEkgcHJlZmVyIHRvIGhhdmUgYSBzaW5nbGUgdGVyc2UgcnVsZSwgdGhhdCBpcyB0byBhdm9pZCBh bnkNCj4gYWRkaXRpb25hbCBieXRlcyBiZXNpZGUgdGhlIGJhcmUgbWluaW11bSB0byByZXNwZWN0 IGNoZWNrcGF0Y2guDQoNClRhc3RlIGlzIGhhcmQgdG8gZGViYXRlLCBidXQgeW91IGhhdmUgZ29u ZSB0aGUgZXh0cmVtZSByb3V0ZSB3aXRoIG9ubHkgdGhlIGJhcmUgbWluaW11bSBibGFuayBsaW5l cyBhbmQgdGhhdCBpcyBub3QgZ29vZCBhcyB3ZWxsLiBBIHNpbGx5IHNjcmlwdCBkb2VzIG5vdCBy ZWFkIGNvZGUgb3IgdW5kZXJzdGFuZCBjb2RlIHdlIHRoZSBodW1hbnMgaGF2ZSB0byBtYWtlIHRo ZSBjb2RlIHJlYWRhYmxlLg0KPiANCj4gV2hlbiBJIGZlZWwgdGhlIG5lZWQgdG8gaGF2ZSBhIG5l dyAiY29uY2VwdHVhbCBncm91cCIsIHRoZW4gSSBhbSBmb3JjZWQNCj4gdG8gYWRkIGEgY29tbWVu dCB0byBleHBsYWluIHdoYXQgaXMgaGFwcGVuaW5nLiBCeSBub3QgYWxsb3dpbmcgYmxhbmsNCj4g bGluZXMsIEkgdGh1cyBmZWVsIHRoZSBwcmVzc3VyZSBmb3Igc3BhY2UgYW5kIGV4cGxhbmF0aW9u IG1vcmUgYWN1dGVseS4NCg0KQSBibGFuayBjYW4gZ2l2ZSBzb21ld2hhdCBjb252ZXkgdGhlIHNh bWUgaW5mb3JtYXRpb24gd2l0aG91dCBhIGNvbW1lbnQsIGJ1dCBub3QgaW4gYWxsIGNhc2VzLiBF dmVuIGEgYmxhbmsgYmVmb3JlIGEgZ3JvdXAgb2YgbGluZXMgY2FuIGNvbnZleSB0aGlzIGlzIGEg bmV3IGxvZ2ljIHNlY3Rpb24uIEkgZG8gbm90IGJ1eSB0aGUgcG9pbnQgZm9yIG5lZWRpbmcgdGhl IHNhbWUgdGVyc2UgcnVsZSBoZXJlIGFzIG1vc3Qgb2YgdGhlIGNvZGluZyBzdHlsZSBpcyBmcmVl IGZvcm0gYW5kIGFsbG93cyBmb3IgcmVhZGluZyBiZXR3ZWVuIHRoZSBsaW5lcyBhIGJpdC4NCg0K V2UgY2FuIG1ha2UgYSBydWxlIGhlcmUsIGJ1dCBubyBibGFuayBsaW5lcyBpbiBhIGZ1bmN0aW9u IHRoaXMgc2l6ZSBhbmQgdGhlIHBhdGNoIG9mIHRoaXMgc2l6ZSBpcyBtYWtpbmcgRFBESyBub3Qg YXMgcHJvZmVzc2lvbmFsIGxvb2tpbmcgYXMgaXQgY291bGQgYmUuDQoNCkkgYW0gbm90IGFza2lu ZyBmb3IgYSBibGFuayBsaW5lIGFmdGVyIGV2ZXJ5IHN0YXRlbWVudCwgYnV0IHdoZW4gSSBzZWUg ZnVuY3Rpb25zIG9mIHRoaXMgc2l6ZSB3aXRob3V0IGEgYmxhbmsgbGluZXMgaXQgbWVhbnMgd2Ug YXJlIG5vdCBhZGRyZXNzaW5nIHJlYWRhYmlsaXR5IGZvciBmdXR1cmUgZGV2ZWxvcGVycyB0byBy ZWFkIHRoaXMgY29kZS4gSWYgeW91IGhhdmUgdG8gcHV0IGEgY29tbWVudCBiZWZvcmUgYSBzZWN0 aW9uIG9mIGNvZGUgdGhlbiBub3JtYWxseSBhIGJsYW5rIGxpbmUgYmVmb3JlIHRoZSBjb21tZW50 IGlzIHJlYXNvbmFibGUuDQoNCkxvb2sgYXQgdGhlIHJlc3Qgb2YgRFBESyBjb2RlIGFuZCB0ZWxs IG1lIHRoYXQgd2UgZG8gbm90IHVzZSBibGFuayBsaW5lcyB3aXNlbHkgb3Igbm8gYmxhbmsgbGlu ZXMgb3RoZXIgdGhlbiB3aGF0IHRoZSBzaWxseSBjaGVja3BhdGNoIHNjcmlwdCBmbGFncy4NCg0K DQpCZWxvdyBJIGFkZGVkIGEgZmV3IGJsYW5rIGxpbmVzIG5vdCBtYW55LCBidXQganVzdCBmZXcg dG8gaGVscCB0aGUgcmVhZGVyIGRldGVjdCBzZWN0aW9ucyBhbmQgYnJlYWtzIGluIHRoZSBjb2Rl LiBFdmVuIGlmIHlvdSBhZGRlZCBhIGZldyBsaW5lcyBvciByZW1vdmVkIGEgZmV3IGxpbmVzIEkg d291bGQgdGhpbmsgdGhpcyBpcyBtdWNoIG1vcmUgcmVhZGFibGUgaW4gdGhlIGxvbmcgcnVuLg0K DQooV2lzaCBJIGNvdWxkIHJlbW92ZSB0aGUg4oCYK+KAmSBpdCB3b3VsZCBoZWxwIHRvIG1ha2Ug bXkgcG9pbnQgY2xlYXJlciwgYnV0IGFmcmFpZCBlbWFpbCB3aWxsIGxlZnQganVzdGlmeSB0aGUg Y29kZSkuIA0KDQoraW50IF9fcnRlX2V4cGVyaW1lbnRhbA0KK3J0ZV9kZXZfaXRlcmF0b3JfaW5p dChzdHJ1Y3QgcnRlX2Rldl9pdGVyYXRvciAqaXQsDQorCQkgICAgICBjb25zdCBjaGFyICpkZXZz dHIpDQorew0KKwlzdHJ1Y3Qgew0KKwkJY29uc3QgY2hhciAqa2V5Ow0KKwkJY29uc3QgY2hhciAq c3RyOw0KKwkJc3RydWN0IHJ0ZV9rdmFyZ3MgKmt2bGlzdDsNCisJfSBsYXllcnNbXSA9IHsNCisJ CXsgImJ1cz0iLCAgICBOVUxMLCBOVUxMLCB9LA0KKwkJeyAiY2xhc3M9IiwgIE5VTEwsIE5VTEws IH0sDQorCQl7ICJkcml2ZXI9IiwgTlVMTCwgTlVMTCwgfSwNCisJfTsNCisJc3RydWN0IHJ0ZV9r dmFyZ3NfcGFpciAqa3YgPSBOVUxMOw0KKwlzdHJ1Y3QgcnRlX2NsYXNzICpjbHMgPSBOVUxMOw0K KwlzdHJ1Y3QgcnRlX2J1cyAqYnVzID0gTlVMTDsNCisJY29uc3QgY2hhciAqcyA9IGRldnN0cjsN CisJc2l6ZV90IG5ibGF5ZXI7DQorCXNpemVfdCBpID0gMDsNCisNCisJLyogSGF2aW5nIGJvdGgg YnVzc3RyIGFuZCBjbHNzdHIgTlVMTCBpcyBpbGxlZ2FsLA0KKwkgKiBtYXJraW5nIHRoaXMgaXRl cmF0b3IgYXMgaW52YWxpZCB1bmxlc3MNCisJICogZXZlcnl0aGluZyBnb2VzIHdlbGwuDQorCSAq Lw0KKwlpdC0+YnVzc3RyID0gTlVMTDsNCisJaXQtPmNsc3N0ciA9IE5VTEw7DQorDQorCS8qIFNw bGl0IGVhY2ggc3ViLWxpc3RzLiAqLw0KKwluYmxheWVyID0gZGV2X2xheWVyX2NvdW50KGRldnN0 cik7DQorCWlmIChuYmxheWVyID4gUlRFX0RJTShsYXllcnMpKSB7DQorCQlSVEVfTE9HKEVSUiwg RUFMLCAiSW52YWxpZCBxdWVyeTogdG9vIG1hbnkgbGF5ZXJzICglenUpXG4iLA0KKwkJCW5ibGF5 ZXIpOw0KKwkJcnRlX2Vycm5vID0gRUlOVkFMOw0KKwkJZ290byBnZXRfb3V0Ow0KKwl9DQorDQor CXdoaWxlIChzICE9IE5VTEwpIHsNCisJCWNoYXIgKmNvcHk7DQorCQljaGFyICplbmQ7DQorDQor CQlpZiAoc3RybmNtcChsYXllcnNbaV0ua2V5LCBzLA0KKwkJCSAgICBzdHJsZW4obGF5ZXJzW2ld LmtleSkpKQ0KKwkJCWdvdG8gbmV4dF9sYXllcjsNCisNCisJCWxheWVyc1tpXS5zdHIgPSBzOw0K KwkJY29weSA9IHN0cmR1cChzKTsNCisJCWlmIChjb3B5ID09IE5VTEwpIHsNCisJCQlSVEVfTE9H KEVSUiwgRUFMLCAiT09NXG4iKTsNCisJCQlydGVfZXJybm8gPSBFTk9NRU07DQorCQkJZ290byBn ZXRfb3V0Ow0KKwkJfQ0KKw0KKwkJZW5kID0gc3RyY2hyKGNvcHksICcvJyk7DQorCQllbmQgPSBl bmQgPyBlbmQgOiBzdHJjaHIoY29weSwgJ1wwJyk7DQorCQllbmRbMF0gPSAnXDAnOw0KKwkJbGF5 ZXJzW2ldLmt2bGlzdCA9IHJ0ZV9rdmFyZ3NfcGFyc2UoY29weSwgTlVMTCk7DQorCQlmcmVlKGNv cHkpOw0KKw0KKwkJaWYgKGxheWVyc1tpXS5rdmxpc3QgPT0gTlVMTCkgew0KKwkJCVJURV9MT0co RVJSLCBFQUwsICJDb3VsZCBub3QgcGFyc2UgJXNcbiIsIHMpOw0KKwkJCXJ0ZV9lcnJubyA9IEVJ TlZBTDsNCisJCQlnb3RvIGdldF9vdXQ7DQorCQl9DQorDQorCQlzID0gc3RyY2hyKHMsICcvJyk7 DQorCQlpZiAocyAhPSBOVUxMKQ0KKwkJCXMrKzsNCisNCituZXh0X2xheWVyOg0KKwkJaWYgKGkg Pj0gUlRFX0RJTShsYXllcnMpKSB7DQorCQkJUlRFX0xPRyhFUlIsIEVBTCwgIlVucmVjb2duaXpl ZCBsYXllciAlc1xuIiwgcyk7DQorCQkJcnRlX2Vycm5vID0gRUlOVkFMOw0KKwkJCWdvdG8gZ2V0 X291dDsNCisJCX0NCisJCWkrKzsNCisJfQ0KKw0KKwkvKiBQYXJzZSBlYWNoIHN1Yi1saXN0LiAq Lw0KKwlmb3IgKGkgPSAwOyBpIDwgUlRFX0RJTShsYXllcnMpOyBpKyspIHsNCisJCWlmIChsYXll cnNbaV0ua3ZsaXN0ID09IE5VTEwpDQorCQkJY29udGludWU7DQorDQorCQlrdiA9ICZsYXllcnNb aV0ua3ZsaXN0LT5wYWlyc1swXTsNCisJCWlmIChzdHJjbXAoa3YtPmtleSwgImJ1cyIpID09IDAp IHsNCisJCQlidXMgPSBydGVfYnVzX2ZpbmRfYnlfbmFtZShrdi0+dmFsdWUpOw0KKwkJCWlmIChi dXMgPT0gTlVMTCkgew0KKwkJCQlSVEVfTE9HKEVSUiwgRUFMLCAiQ291bGQgbm90IGZpbmQgYnVz IFwiJXNcIlxuIiwNCisJCQkJCWt2LT52YWx1ZSk7DQorCQkJCXJ0ZV9lcnJubyA9IEVGQVVMVDsN CisJCQkJZ290byBnZXRfb3V0Ow0KKwkJCX0NCisJCX0gZWxzZSBpZiAoc3RyY21wKGt2LT5rZXks ICJjbGFzcyIpID09IDApIHsNCisJCQljbHMgPSBydGVfY2xhc3NfZmluZF9ieV9uYW1lKGt2LT52 YWx1ZSk7DQorCQkJaWYgKGNscyA9PSBOVUxMKSB7DQorCQkJCVJURV9MT0coRVJSLCBFQUwsICJD b3VsZCBub3QgZmluZCBjbGFzcyBcIiVzXCJcbiIsDQorCQkJCQlrdi0+dmFsdWUpOw0KKwkJCQly dGVfZXJybm8gPSBFRkFVTFQ7DQorCQkJCWdvdG8gZ2V0X291dDsNCisJCQl9DQorCQl9IGVsc2Ug aWYgKHN0cmNtcChrdi0+a2V5LCAiZHJpdmVyIikgPT0gMCkgew0KKwkJCS8qIElnbm9yZSAqLw0K KwkJCWNvbnRpbnVlOw0KKwkJfQ0KKwl9DQorDQorCS8qIFRoZSBzdHJpbmcgc2hvdWxkIGhhdmUg YXQgbGVhc3QNCisJICogb25lIGxheWVyIHNwZWNpZmllZC4NCisJICovDQorCWlmIChidXMgPT0g TlVMTCAmJiBjbHMgPT0gTlVMTCkgew0KKwkJUlRFX0xPRyhFUlIsIEVBTCwNCisJCQkiRWl0aGVy IGJ1cyBvciBjbGFzcyBtdXN0IGJlIHNwZWNpZmllZC5cbiIpOw0KKwkJcnRlX2Vycm5vID0gRUlO VkFMOw0KKwkJZ290byBnZXRfb3V0Ow0KKwl9DQorDQorCWlmIChidXMgIT0gTlVMTCAmJiBidXMt PmRldl9pdGVyYXRlID09IE5VTEwpIHsNCisJCVJURV9MT0coRVJSLCBFQUwsICJCdXMgJXMgbm90 IHN1cHBvcnRlZFxuIiwgYnVzLT5uYW1lKTsNCisJCXJ0ZV9lcnJubyA9IEVOT1RTVVA7DQorCQln b3RvIGdldF9vdXQ7DQorCX0NCisNCisJaWYgKGNscyAhPSBOVUxMICYmIGNscy0+ZGV2X2l0ZXJh dGUgPT0gTlVMTCkgew0KKwkJUlRFX0xPRyhFUlIsIEVBTCwgIkNsYXNzICVzIG5vdCBzdXBwb3J0 ZWRcbiIsIGNscy0+bmFtZSk7DQorCQlydGVfZXJybm8gPSBFTk9UU1VQOw0KKwkJZ290byBnZXRf b3V0Ow0KKwl9DQorDQorCS8qIEZpbGwgaXRlcmF0b3IgZmllbGRzLiAqLw0KKwlpZiAoYnVzICE9 IE5VTEwpDQorCQlpdC0+YnVzc3RyID0gbGF5ZXJzWzBdLnN0cjsNCisJaWYgKGNscyAhPSBOVUxM KQ0KKwkJaXQtPmNsc3N0ciA9IGxheWVyc1sxXS5zdHI7DQorDQorCWl0LT5kZXZzdHIgPSBkZXZz dHI7DQorCWl0LT5idXMgPSBidXM7DQorCWl0LT5jbHMgPSBjbHM7DQorCWl0LT5kZXZpY2UgPSBO VUxMOw0KKwlpdC0+Y2xhc3NfZGV2aWNlID0gTlVMTDsNCisNCitnZXRfb3V0Og0KKwlmb3IgKGkg PSAwOyBpIDwgUlRFX0RJTShsYXllcnMpOyBpKyspIHsNCisJCWlmIChsYXllcnNbaV0ua3ZsaXN0 KQ0KKwkJCXJ0ZV9rdmFyZ3NfZnJlZShsYXllcnNbaV0ua3ZsaXN0KTsNCisJfQ0KKw0KKwlyZXR1 cm4gLXJ0ZV9lcnJubzsNCit9DQoNCj4gDQo+IEFsc28sIHRoaXMgbWFrZXMgYSBwYXRjaCBjb250 ZXh0IGFzIGluZm9ybWF0aW9uLXJpY2ggYXMgcG9zc2libGUuDQo+IA0KPj4gSSBzdG9wcGVkIHJl dmlld2luZyB0aGUgY29kZSBhcyBpdCBiZWNhbWUgZGlmZmljdWx0IHRvIHJlYWQgSU1PIGFuZCBq dXN0IGNhdXNpbmcgbWUgYSBoZWFkYWNoZS4NCj4+IA0KPj4gVGhpcyBwcm9ibGVtIG5lZWRzIHRv IGJlIGFkZHJlc3NlZCBieSB0aGUgVFNDIElNTy4NCj4gDQo+IFNvcnJ5IHRoYXQgaXQgbWFkZSBp dCBtb3JlIGRpZmZpY3VsdCB0aGFuIG5lY2Vzc2FyeS4NCj4gSXQgd291bGQgYmUgaW50ZXJlc3Rp bmcgaWYgYW4gYWRkZW5kdW0gdG8gdGhlIGtlcm5lbCBjb2Rpbmcgc3R5bGUgd2FzDQo+IG1hZGUg cmVnYXJkaW5nIGJsYW5rIGxpbmVzLg0KPiANCj4gUmVnYXJkcywNCj4gLS0gDQo+IEdhw6t0YW4g Uml2ZXQNCj4gNldJTkQNCg0KUmVnYXJkcywNCktlaXRoDQoNCg==