From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [RFC,v3,1/7] dmaengine: Add Synopsys eDMA IP core driver From: Gustavo Pimentel Message-Id: Date: Wed, 6 Feb 2019 18:06:27 +0000 To: Vinod Koul , Gustavo Pimentel Cc: "linux-pci@vger.kernel.org" , "dmaengine@vger.kernel.org" , Dan Williams , Eugeniy Paltsev , Andy Shevchenko , Russell King , Niklas Cassel , Joao Pinto , Jose Abreu , Luis Oliveira , Vitor Soares , Nelson Costa , Pedro Sousa List-ID: T24gMDIvMDIvMjAxOSAxMDowNywgVmlub2QgS291bCB3cm90ZToKPiBPbiAwMS0wMi0xOSwgMTE6 MjMsIEd1c3Rhdm8gUGltZW50ZWwgd3JvdGU6Cj4+IE9uIDAxLzAyLzIwMTkgMDQ6MTQsIFZpbm9k IEtvdWwgd3JvdGU6Cj4+PiBPbiAzMS0wMS0xOSwgMTE6MzMsIEd1c3Rhdm8gUGltZW50ZWwgd3Jv dGU6Cj4+Pj4gT24gMjMvMDEvMjAxOSAxMzowOCwgVmlub2QgS291bCB3cm90ZToKPj4+Pj4gT24g MjEtMDEtMTksIDE1OjQ4LCBHdXN0YXZvIFBpbWVudGVsIHdyb3RlOgo+Pj4+Pj4gT24gMjAvMDEv MjAxOSAxMTo0NCwgVmlub2QgS291bCB3cm90ZToKPj4+Pj4+PiBPbiAxMS0wMS0xOSwgMTk6MzMs IEd1c3Rhdm8gUGltZW50ZWwgd3JvdGU6Cj4+Pgo+Pj4+Pj4+PiBAQCAtMCwwICsxLDEwNTkgQEAK Pj4+Pj4+Pj4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4+Pj4+Pj4+ICsv Kgo+Pj4+Pj4+PiArICogQ29weXJpZ2h0IChjKSAyMDE4IFN5bm9wc3lzLCBJbmMuIGFuZC9vciBp dHMgYWZmaWxpYXRlcy4KPj4+Pj4+Pgo+Pj4+Pj4+IDIwMTkgbm93Cj4+Pj4+Pgo+Pj4+Pj4gSSd2 ZSBjaGFuZ2VkIHRvICJDb3B5cmlnaHQgKGMpIDIwMTgtcHJlc2VudCBTeW5vcHN5cywgSW5jLiBh bmQvb3IgaXRzCj4+Pj4+PiBhZmZpbGlhdGVzLiIgdGhpcyB3YXkgaXQncyBhbHdheXMgdXAgdG8g ZGF0ZSBhbmQgSSBhbHNvIGtlcHQgMjAxOCwgYmVjYXVzZSBpdAo+Pj4+Pj4gd2FzIHRoZSBkYXRl IHRoYXQgSSBzdGFydGVkIHRvIGRldmVsb3AgdGhpcyBkcml2ZXIsIGlmIHlvdSBkb24ndCBtaW5k Lgo+Pj4+Pgo+Pj4+PiB5ZWFoIDE4IGlzIGZpbmUgOikgaXQgbmVlZCB0byBlbmQgd2l0aCBjdXJy ZW50IHllYXIgYWx3YXlzCj4+Pj4KPj4+PiBKdXN0IHRvIGJlIHN1cmUsIGFyZSB5b3Ugc2F5aW5n IHRoYXQgbXVzdCBiZTogIkNvcHlyaWdodCAoYykgMjAxOC0yMDE5IFN5bm9wc3lzLAo+Pj4+IElu Yy4gYW5kL29yIGl0cyBhZmZpbGlhdGVzLiI/Cj4+Pgo+Pj4gWXVwIDopCj4+Pgo+Pj4+Pj4+PiAr c3RhdGljIHN0cnVjdCBkd19lZG1hX2NodW5rICpkd19lZG1hX2FsbG9jX2NodW5rKHN0cnVjdCBk d19lZG1hX2Rlc2MgKmRlc2MpCj4+Pj4+Pj4+ICt7Cj4+Pj4+Pj4+ICsJc3RydWN0IGR3X2VkbWFf Y2hhbiAqY2hhbiA9IGRlc2MtPmNoYW47Cj4+Pj4+Pj4+ICsJc3RydWN0IGR3X2VkbWEgKmR3ID0g Y2hhbi0+Y2hpcC0+ZHc7Cj4+Pj4+Pj4+ICsJc3RydWN0IGR3X2VkbWFfY2h1bmsgKmNodW5rOwo+ Pj4+Pj4+PiArCj4+Pj4+Pj4+ICsJY2h1bmsgPSBrdnphbGxvYyhzaXplb2YoKmNodW5rKSwgR0ZQ X05PV0FJVCk7Cj4+Pj4+Pj4+ICsJaWYgKHVubGlrZWx5KCFjaHVuaykpCj4+Pj4+Pj4+ICsJCXJl dHVybiBOVUxMOwo+Pj4+Pj4+PiArCj4+Pj4+Pj4+ICsJSU5JVF9MSVNUX0hFQUQoJmNodW5rLT5s aXN0KTsKPj4+Pj4+Pj4gKwljaHVuay0+Y2hhbiA9IGNoYW47Cj4+Pj4+Pj4+ICsJY2h1bmstPmNi ID0gIShkZXNjLT5jaHVua3NfYWxsb2MgJSAyKTsKPj4+Pj4+Pgo+Pj4+Pj4+IGNiIC4uPwo+Pj4+ Pj4KPj4+Pj4+IENCID0gY2hhbmdlIGJpdCwgaXMgYSBwcm9wZXJ0eSBvZiB0aGlzIGVETUEgSVAu IEJhc2ljYWxseSBpdCBpcyBhIGtpbmQgb2YKPj4+Pj4+IGhhbmRzaGFrZSB3aGljaCBzZXJ2ZXMg dG8gdmFsaWRhdGUgd2hldGhlciB0aGUgbGlua2VkIGxpc3QgaGFzIGJlZW4gdXBkYXRlZCBvcgo+ Pj4+Pj4gbm90LCBlc3BlY2lhbGx5IHVzZWZ1bCBpbiBjYXNlcyBvZiByZWN5Y2xlZCBsaW5rZWQg bGlzdCBlbGVtZW50cyAoZXZlcnkgbGlua2VkCj4+Pj4+PiBsaXN0IHJlY3ljbGUgaXMgYSBuZXcg Y2h1bmssIHRoaXMgd2lsbCBhbGxvdyB0byBkaWZmZXJlbnRpYXRlIGVhY2ggY2h1bmspLgo+Pj4+ Pgo+Pj4+PiBva2F5IHBsZWFzZSBhZGQgdGhhdCBzb21ld2hlcmUuIEFsc28gaXQgd291bGQgaGVs cCBtZSBpZiB5b3UgZXhwbGFpbgo+Pj4+PiB3aGF0IGlzIGNodW5rIGFuZCBvdGhlciB0ZXJtaW5v bG9naWVzIHVzZWQgaW4gdGhpcyBkcml2ZXIKPj4+Pgo+Pj4+IEknbSB0aGlua2luZyB0byBwdXQg dGhlIGJlbG93IGRlc2NyaXB0aW9uIG9uIHRoZSBwYXRjaCwgcGxlYXNlIGNoZWNrIGlmIHRoaXMg aXMKPj4+PiBzdWZmaWNpZW50IGV4cGxpY2l0IGFuZCBjbGVhciB0byB1bmRlcnN0YW5kIHdoYXQg dGhpcyBJUCBuZWVkcyBhbmQgZG9lcy4KPj4+Pgo+Pj4+IEluIG9yZGVyIHRvIHRyYW5zZmVyIGRh dGEgZnJvbSBwb2ludCBBIHRvIEIgYXMgZmFzdCBhcyBwb3NzaWJsZSB0aGlzIElQIHJlcXVpcmVz Cj4+Pj4gYSBkZWRpY2F0ZWQgbWVtb3J5IHNwYWNlIHdoZXJlIHdpbGwgcmVzaWRlIGEgbGlua2Vk IGxpc3Qgb2YgZWxlbWVudHMuCj4+Pgo+Pj4gcmVwaHJhc2luZzogYSBkZWRpY2F0ZWQgbWVtb3J5 IHNwYWNlIGNvbnRhaW5pbmcgbGlua2VkIGxpc3Qgb2YgZWxlbWVudHMKPj4+Cj4+Pj4gQWxsIGVs ZW1lbnRzIG9mIHRoaXMgbGlua2VkIGxpc3QgYXJlIGNvbnRpbnVvdXMgYW5kIGVhY2ggb25lIGRl c2NyaWJlcyBhIGRhdGEKPj4+PiB0cmFuc2ZlciAoc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRy ZXNzZXMsIGxlbmd0aCBhbmQgYSBjb250cm9sIHZhcmlhYmxlKS4KPj4+Pgo+Pj4+IEZvciB0aGUg c2FrZSBvZiBzaW1wbGljaXR5LCBsZXRzIGFzc3VtZSBhIG1lbW9yeSBzcGFjZSBmb3IgY2hhbm5l bCB3cml0ZSAwIHdoaWNoCj4+Pj4gYWxsb3dzIGFib3V0IDQyIGVsZW1lbnRzLgo+Pj4+Cj4+Pj4g Ky0tLS0tLS0tLSsKPj4+PiB8IERlc2MgIzAgfC0tKwo+Pj4+ICstLS0tLS0tLS0rICB8Cj4+Pj4g ICAgICAgICAgICAgIFYKPj4+PiAgICAgICAgICstLS0tLS0tLS0tKwo+Pj4+ICAgICAgICAgfCBD aHVuayAjMCB8LS0tKwo+Pj4+ICAgICAgICAgfCAgQ0IgPSAxICB8ICAgfCAgICstLS0tLS0tLS0t KyAgICstLS0tLSsgICArLS0tLS0tLS0tLS0rICAgKy0tLS0tKwo+Pj4+ICAgICAgICAgKy0tLS0t LS0tLS0rICAgKy0tPnwgQnVyc3QgIzAgfC0tPnwgLi4uIHwtLT58IEJ1cnN0ICM0MSB8LS0+fCBs bHAgfAo+Pj4+ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICstLS0tLS0tLS0tKyAgICstLS0t LSsgICArLS0tLS0tLS0tLS0rICAgKy0tLS0tKwo+Pj4+ICAgICAgICAgICAgICAgVgo+Pj4+ICAg ICAgICAgKy0tLS0tLS0tLS0rCj4+Pj4gICAgICAgICB8IENodW5rICMxIHwtLS0rCj4+Pj4gICAg ICAgICB8ICBDQiA9IDAgIHwgICB8ICAgKy0tLS0tLS0tLS0tKyAgICstLS0tLSsgICArLS0tLS0t LS0tLS0rICAgKy0tLS0tKwo+Pj4+ICAgICAgICAgKy0tLS0tLS0tLS0rICAgKy0tPnwgQnVyc3Qg IzQyIHwtLT58IC4uLiB8LS0+fCBCdXJzdCAjODMgfC0tPnwgbGxwIHwKPj4+PiAgICAgICAgICAg ICAgIHwgICAgICAgICAgICArLS0tLS0tLS0tLS0rICAgKy0tLS0tKyAgICstLS0tLS0tLS0tLSsg ICArLS0tLS0rCj4+Pj4gICAgICAgICAgICAgICBWCj4+Pj4gICAgICAgICArLS0tLS0tLS0tLSsK Pj4+PiAgICAgICAgIHwgQ2h1bmsgIzIgfC0tLSsKPj4+PiAgICAgICAgIHwgIENCID0gMSAgfCAg IHwgICArLS0tLS0tLS0tLS0rICAgKy0tLS0tKyAgICstLS0tLS0tLS0tLS0rICAgKy0tLS0tKwo+ Pj4+ICAgICAgICAgKy0tLS0tLS0tLS0rICAgKy0tPnwgQnVyc3QgIzg0IHwtLT58IC4uLiB8LS0+ fCBCdXJzdCAjMTI1IHwtLT58IGxscCB8Cj4+Pj4gICAgICAgICAgICAgICB8ICAgICAgICAgICAg Ky0tLS0tLS0tLS0tKyAgICstLS0tLSsgICArLS0tLS0tLS0tLS0tKyAgICstLS0tLSsKPj4+PiAg ICAgICAgICAgICAgIFYKPj4+PiAgICAgICAgICstLS0tLS0tLS0tKwo+Pj4+ICAgICAgICAgfCBD aHVuayAjMyB8LS0tKwo+Pj4+ICAgICAgICAgfCAgQ0IgPSAwICB8ICAgfCAgICstLS0tLS0tLS0t LS0rICAgKy0tLS0tKyAgICstLS0tLS0tLS0tLS0rICAgKy0tLS0tKwo+Pj4+ICAgICAgICAgKy0t LS0tLS0tLS0rICAgKy0tPnwgQnVyc3QgIzEyNiB8LS0+fCAuLi4gfC0tPnwgQnVyc3QgIzEyOSB8 LS0+fCBsbHAgfAo+Pj4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0r ICAgKy0tLS0tKyAgICstLS0tLS0tLS0tLS0rICAgKy0tLS0tKwo+Pj4KPj4+IFRoaXMgaXMgZ3Jl YXQgYW5kIHJlcXVpcmVkIHRvIHVuZGVyc3RhbmQgdGhlIGRyaXZlci4KPj4+Cj4+PiBIb3cgZG9l cyBjb250cm9sbGVyIG1vdmUgZnJvbSBCdXJuc3QgIzQxIG9mIENodW5rIDAgdG8gQ2h1bmsgMSA/ Cj4+Cj4+IEkgZm9yZ290IHRvIGV4cGxhaW4gdGhhdC4uLgo+Pgo+PiBPbiBldmVyeSBsYXN0IEJ1 cnN0IG9mIHRoZSBDaHVuayAoQnVyc3QgIzQxLCBCdXJzdCAjODMsIEJ1cnN0ICMxMjUgb3IgZXZl biBCdXJzdAo+PiAjMTI5KSBpcyBzZXQgc29tZSBmbGFncyBvbiB0aGVpciBjb250cm9sIHZhcmlh YmxlIChSSUUgYW5kIExJRSBiaXRzKSB0aGF0IHdpbGwKPj4gdHJpZ2dlciB0aGUgc2VuZCBvZiAi ZG9uZSIgaW50ZXJydXB0aW9uLgo+Pgo+PiBPbiB0aGUgaW50ZXJydXB0aW9ucyBjYWxsYmFjaywg aXMgZGVjaWRlZCB3aGV0aGVyIHRvIHJlY3ljbGUgdGhlIGxpbmtlZCBsaXN0Cj4+IG1lbW9yeSBz cGFjZSBieSB3cml0aW5nIGEgbmV3IHNldCBvZiBCdXJzdHMgZWxlbWVudHMgKGlmIHN0aWxsIGV4 aXN0cyBDaHVua3MgdG8KPj4gdHJhbnNmZXIpIG9yIGlzIGNvbnNpZGVyZWQgY29tcGxldGVkIChp ZiB0aGVyZSBpcyBubyBDaHVua3MgYXZhaWxhYmxlIHRvIHRyYW5zZmVyKQo+Pgo+Pj4gSXMgQnVy c3QgMCB0byAxMjkgYSBsaW5rIGxpc3Qgd2l0aCBCdXJzdCAwLCA0MiwgODQgYW5kIDEyNiBoYXZp bmcgYQo+Pj4gY2FsbGJhY2sgKGRvbmUgYml0IHNldCkuLgo+Pgo+PiBJIGRpZG4ndCBxdWl0ZSB1 bmRlcnN0YW5kIGl0IHlvdXIgcXVlc3Rpb24uCj4+Cj4+IEl0IGNvbWVzIGZyb20gdGhlIHByZXBf c2xhdmVfc2cgbiBlbGVtZW50cyAoMTMwIGFwcGx5aW5nIHRoZSBleGFtcGxlKSwgd2hlcmUKPj4g d2lsbCBiZSBkaXZpZGUgaW4gc2V2ZXJhbCBDaHVua3MgKCMwLCAjMSwgIzIsICMzIGFuZCAjNCBh cHBseWluZyB0aGUgZXhhbXBsZSkgKGEKPj4gbGlua2VkIGxpc3QgdGhhdCB3aWxsIGNvbnRhaW4g YW5vdGhlciBsaW5rZWQgbGlzdCBmb3IgdGhlIEJ1cnN0cywgQ0IsIENodW5rCj4+IHNpemUpLiBU aGUgbGlua2VkIGxpc3QgaW5zaWRlIG9mIGVhY2ggQ2h1bmsgd2lsbCBjb250YWluIGEgbnVtYmVy IG9mIEJ1cnN0cwo+PiAobGltaXRlZCB0byB0aGUgbWVtb3J5IHNwYWNlIHNpemUpLCBlYWNoIG9u ZSB3aWxsIHBvc3Nlc3MgU291cmNlIEFkZHJlc3MsCj4+IERlc3RpbmF0aW9uIEFkZHJlc3MgYW5k IHNpemUgb2YgdGhhdCBzdWItdHJhbnNmZXIuCj4gCj4gVGhhbmtzIHRoaXMgaGVscHMgOikKPiAK PiBzbyBpbiB0aGlzIGNhc2Ugd2hhdCBkb2VzIHByZXBfc2xhdmVfc2cgbiBlbGVtZW50cyBjb3Jy b3Nwb25kcyB0byAoMTMwCj4gYnVyc3RzKSAuLj8gSWYgc28gaG93IGRvIHlvdSBzcGxpdCBhIHRy YW5zYWN0aW9uIHRvIGNodW5rcyBhbmQgYnVyc3RzPwoKSW4gdGhlIGV4YW1wbGUgY2FzZSwgcHJl cF9zbGF2ZV9zZyBBUEkgcmVjZWl2ZXMgYSB0b3RhbCBvZiAxMzAgZWxlbWVudHMgYW5kIHRoZQpk dy1lZG1hLWNvcmUgaW1wbGVtZW50YXRpb24gd2lsbCBzbGljZSBpbiA0IGNodW5rcyAodGhlIGZp cnN0IDMgY2h1bmtzIHdpbGwKY29udGFpbmluZyA0MiBidXJzdHMgZWFjaCBhbmQgdGhlIGxhc3Qg Y2h1bmsgb25seSBjb250YWluaW5nIDQgYnVyc3RzKS4KClRoZSBidXJzdCBtYXhpbXVtIGNhcGFj aXR5IG9mIGVhY2ggY2h1bmsgZGVwZW5kcyBvZiB0aGUgbGlua2VkIGxpc3QgbWVtb3J5IHNwYWNl CnNpemUgYXZhaWxhYmxlIG9yIGRlc3RpbmVkIGZvciwgaW4gdGhlIGV4YW1wbGUgY2FzZSBJIGRp ZG4ndCBzcGVjaWZ5IHRoZQphY3R1YWxseSBzcGFjZSBhbW91bnQsIGJ1dCB0aGUgbWF4aW11bSBu dW1iZXIgb2YgYnVyc3RzIGlzIGNhbGN1bGF0ZWQgYnk6CgptYXhpbXVtIG51bWJlciBvZiBidXJz dHMgPSAobGlua2VkIGxpc3QgbWVtb3J5IHNpemUgLyAyNCkgLSAxCgp0aGUgc2l6ZSBpcyBpbiBi eXRlcyBhbmQgMjQgaXMgdGhlIHNpemUgb2YgZWFjaCBidXJzdCBpbmZvcm1hdGlvbiBlbGVtZW50 LgpJdCdzIGFsc28gc3VidHJhY3RlZCAxIGVsZW1lbnQgYmVjYXVzZSBvbiB0aGUgZW5kIG9mIGVh Y2ggYnVyc3Qgc3RyZWFtIGlzIG5lZWRlZAp0aGUgbGxwIGVsZW1lbnQgYW5kIGZvciBzaW1wbGlj aXR5IGl0J3Mgc2l6ZSBpcyBjb25zaWRlcmVkIHRvIGJlIGVxdWFsIHRvIHRoZQpidXJzdCBlbGVt ZW50LgoKPiAKPiAKPj4KPj4+Cj4+PiBUaGlzIHNvdW5kICoqdmVyeSoqIHNpbWlsYXIgdG8gZHcg ZG1hIGNvbmNlcHRzIQo+Pgo+PiBJIGJlbGlldmUgc29tZSBwYXJ0cyBvZiBkdyBkbWEgYW5kIGR3 IGVkbWEgYmVoYXZpb3IgYXJlIHNpbWlsYXIgYW5kIHRoYXQgbWFrZXMKPj4gcGVyZmVjdGx5IHNl bnNlIHNpbmNlIGJvdGggZG1hIGFyZSBkb25lIGJ5IFN5bm9wc3lzIGFuZCBtYXkgYmUgZXhpc3Qg YSBzaGFyZWQKPj4ga25vd2xlZGdlLCBob3dldmVyIHRoZXkgYXJlIGRpZmZlcmVudCBJUHMgYXBw bGllZCB0byBkaWZmZXJlbnQgcHJvZHVjdHMuCj4+Cj4+Pgo+Pj4+Cj4+Pj4gTGVnZW5kOgo+Pj4+ Cj4+Pj4gKkxpbmtlZCBsaXN0KiwgYWxzbyBrbm93IGFzIENodW5rCj4+Pj4gKkxpbmtlZCBsaXN0 IGVsZW1lbnQqLCBhbHNvIGtub3cgYXMgQnVyc3QKPj4+PiAqQ0IqLCBhbHNvIGtub3cgYXMgQ2hh bmdlIEJpdCwgaXQncyBhIGNvbnRyb2wgYml0IChhbmQgdHlwaWNhbGx5IGlzIHRvZ2dsZWQpCj4+ Pj4gdGhhdCBhbGxvd3MgdG8gZWFzaWx5IGlkZW50aWZ5IGFuZCBkaWZmZXJlbnRpYXRlIGJldHdl ZW4gdGhlIGN1cnJlbnQgbGlua2VkIGxpc3QKPj4+PiBhbmQgdGhlIHByZXZpb3VzIG9yIHRoZSBu ZXh0IG9uZS4KPj4+PiAqTExQKiwgaXMgYSBzcGVjaWFsIGVsZW1lbnQgdGhhdCBpbmRpY2F0ZXMg dGhlIGVuZCBvZiB0aGUgbGlua2VkIGxpc3QgZWxlbWVudAo+Pj4+IHN0cmVhbSBhbHNvIGluZm9y bXMgdGhhdCB0aGUgbmV4dCBDQiBzaG91bGQgYmUgdG9nZ2xlLgo+Pj4+Cj4+Pj4gT24gc2NhdHRl ci1nYXRoZXIgdHJhbnNmZXIgbW9kZSwgdGhlIGNsaWVudCB3aWxsIHN1Ym1pdCBhIHNjYXR0ZXIt Z2F0aGVyIGxpc3Qgb2YKPj4+PiBuIChvbiB0aGlzIGNhc2UgMTMwKSBlbGVtZW50cywgdGhhdCB3 aWxsIGJlIGRpdmlkZSBpbiBtdWx0aXBsZSBDaHVua3MsIGVhY2gKPj4+PiBDaHVuayB3aWxsIGhh dmUgKG9uIHRoaXMgY2FzZSA0MikgYSBsaW1pdGVkIG51bWJlciBvZiBCdXJzdHMgYW5kIGFmdGVy Cj4+Pj4gdHJhbnNmZXJyaW5nIGFsbCBCdXJzdHMsIGFuIGludGVycnVwdCB3aWxsIGJlIHRyaWdn ZXJlZCwgd2hpY2ggd2lsbCBhbGxvdyB0bwo+Pj4+IHJlY3ljbGUgdGhlIGFsbCBsaW5rZWQgbGlz dCBkZWRpY2F0ZWQgbWVtb3J5IGFnYWluIHdpdGggdGhlIG5ldyBpbmZvcm1hdGlvbgo+Pj4+IHJl bGF0aXZlIHRvIHRoZSBuZXh0IENodW5rIGFuZCByZXNwZWN0aXZlIEJ1cnN0IGFzc29jaWF0ZWQg YW5kIHJlcGVhdCB0aGUgd2hvbGUKPj4+PiBjeWNsZSBhZ2Fpbi4KPj4+Pgo+Pj4+IE9uIGN5Y2xp YyB0cmFuc2ZlciBtb2RlLCB0aGUgY2xpZW50IHdpbGwgc3VibWl0IGEgYnVmZmVyIHBvaW50ZXIs IGxlbmd0aCBvZiBpdAo+Pj4+IGFuZCBudW1iZXIgb2YgcmVwZXRpdGlvbnMsIGluIHRoaXMgY2Fz ZSBlYWNoIGJ1cnN0IHdpbGwgY29ycmVzcG9uZCBkaXJlY3RseSB0bwo+Pj4+IGVhY2ggcmVwZXRp dGlvbi4KPj4+Pgo+Pj4+IEVhY2ggQnVyc3QgY2FuIGRlc2NyaWJlcyBhIGRhdGEgdHJhbnNmZXIg ZnJvbSBwb2ludCBBKHNvdXJjZSkgdG8gcG9pbnQKPj4+PiBCKGRlc3RpbmF0aW9uKSB3aXRoIGEg bGVuZ3RoIHRoYXQgY2FuIGJlIGZyb20gMSBieXRlIHVwIHRvIDQgR0IuIFNpbmNlIGRlZGljYXRl ZAo+Pj4+IHRoZSBtZW1vcnkgc3BhY2Ugd2hlcmUgdGhlIGxpbmtlZCBsaXN0IHdpbGwgcmVzaWRl IGlzIGxpbWl0ZWQsIHRoZSB3aG9sZSBuIGJ1cnN0Cj4+Pj4gZWxlbWVudHMgd2lsbCBiZSBvcmdh bml6ZWQgaW4gc2V2ZXJhbCBDaHVua3MsIHRoYXQgd2lsbCBiZSB1c2VkIGxhdGVyIHRvIHJlY3lj bGUKPj4+PiB0aGUgZGVkaWNhdGVkIG1lbW9yeSBzcGFjZSB0byBpbml0aWF0ZSBhIG5ldyBzZXF1 ZW5jZSBvZiBkYXRhIHRyYW5zZmVycy4KPj4+Pgo+Pj4+IFRoZSB3aG9sZSB0cmFuc2ZlciBpcyBj b25zaWRlcmVkIGhhcyBjb21wbGV0ZWQgd2hlbiBpdCB3YXMgdHJhbnNmZXJyZWQgYWxsIGJ1cnN0 cy4KPj4+Pgo+Pj4+IEN1cnJlbnRseSB0aGlzIElQIGhhcyBhIHNldCB3ZWxsLWtub3duIHJlZ2lz dGVyIG1hcCwgd2hpY2ggaW5jbHVkZXMgc3VwcG9ydCBmb3IKPj4+PiBsZWdhY3kgYW5kIHVucm9s bCBtb2Rlcy4gTGVnYWN5IG1vZGUgaXMgdmVyc2lvbiBvZiB0aGlzIHJlZ2lzdGVyIG1hcCB0aGF0 IGhhcwo+Pj4KPj4+IHdoYXRzICB1bnJvbGwuLgo+Pj4KPj4+PiBtdWx0aXBsZXhlciByZWdpc3Rl ciB0aGF0IGFsbG93cyB0byBzd2l0Y2ggcmVnaXN0ZXJzIGJldHdlZW4gYWxsIHdyaXRlIGFuZCBy ZWFkCj4+Cj4+IFRoZSB1bnJvbGwgaXMgZXhwbGFpbmVkIGhlcmUsIHNlZSBiZWxvdwo+Pgo+Pj4+ IGNoYW5uZWxzIGFuZCB0aGUgdW5yb2xsIG1vZGVzIHJlcGVhdHMgYWxsIHdyaXRlIGFuZCByZWFk IGNoYW5uZWxzIHJlZ2lzdGVycyB3aXRoCj4+Pj4gYW4gb2Zmc2V0IGJldHdlZW4gdGhlbS4gVGhp cyByZWdpc3RlciBtYXAgaXMgY2FsbGVkIHYwLgo+Pj4+Cj4+Pj4gVGhlIElQIHRlYW0gaXMgY3Jl YXRpbmcgYSBuZXcgcmVnaXN0ZXIgbWFwIG1vcmUgc3VpdGFibGUgdG8gdGhlIGxhdGVzdCBQQ0ll Cj4+Pj4gZmVhdHVyZXMsIHRoYXQgdmVyeSBsaWtlbHkgd2lsbCBjaGFuZ2UgdGhlIG1hcCByZWdp c3Rlciwgd2hpY2ggdGhpcyB2ZXJzaW9uIHdpbGwKPj4+PiBiZSBjYWxsZWQgdjEuIEFzIHNvb24g YXMgdGhpcyBuZXcgdmVyc2lvbiBpcyByZWxlYXNlZCBieSB0aGUgSVAgdGVhbSB0aGUgc3VwcG9y dAo+Pj4+IGZvciB0aGlzIHZlcnNpb24gaW4gYmUgaW5jbHVkZWQgb24gdGhpcyBkcml2ZXIuCj4+ Pj4KPj4+PiBXaGF0IGRvIHlvdSB0aGluaz8gVGhlcmUgaXMgYW55IGdyYXkgYXJlYSB0aGF0IEkg Y291bGQgY2xhcmlmeT8KPj4+Cj4+PiBUaGlzIHNvdW5kcyBnb29kLiBCdXQgd2UgYXJlIGFsc28g Y2F0ZXJpbmcgdG8gYSBXSVAgSVAgd2hpY2ggY2FuIGNoYW5nZQo+Pj4gcmlnaHQuIERvZXNudCBz b3VuZCB2ZXJ5IGdvb2QgaWRlYSB0byBtZSA6KQo+Pgo+PiBUaGlzIElQIGV4aXN0cyBmb3Igc2V2 ZXJhbCB5ZWFycyBsaWtlIHRoaXMgYW5kIGl0IHdvcmtzIHF1aXRlIGZpbmUsIGhvd2V2ZXIKPj4g YmVjYXVzZSBvZiBuZXcgZmVhdHVyZXMgYW5kIHJlcXVlc3RzIChTUi1JT1YsIG1vcmUgZG1hIGNo YW5uZWxzLCBmdW5jdGlvbgo+PiBzZWdyZWdhdGlvbiBhbmQgaXNvbGF0aW9uLCBwZXJmb3JtYW5j ZSBpbXByb3ZlbWVudCkgdGhhdCBhcmUgY29taW5nIGl0J3MgbmF0dXJhbAo+PiB0byBoYXZlIGV4 aXN0IGltcHJvdmVtZW50cy4gVGhlIGRyaXZlcnMgc2hvdWxkIGZvbGxvdyB0aGUgZXZvbHV0aW9u IGFuZCBiZQo+PiBzdWZmaWNpZW50IHJvYnVzdCBlbm91Z2ggdG8gYWRhcHQgdG8gdGhpcyBuZXcg Y2lyY3Vtc3RhbmNlLgo+IAo+IEtlcm5lbCBkcml2ZXIgc2hvdWxkIGJlIG1vZHVsYXIgYmUgZGVz aWduLCBpZiB3ZSBrZWVwIHRoaW5ncyBzaW1wbGUgdGhlbgo+IGFkZGluZy9zcGxpdHRpbmcgdG8g c3VwcG9ydCBmdXR1cmUgcmV2aXNpb25zIHNob3VsZCBiZSBlYXN5IQo+IAo+Pj4+Pj4+PiArCWRl dl9kYmcoY2hhbjJkZXYoY2hhbiksICJhZGRyKHBoeXNpY2FsKSBzcmM9JXBhLCBkc3Q9JXBhXG4i LAo+Pj4+Pj4+PiArCQkmY29uZmlnLT5zcmNfYWRkciwgJmNvbmZpZy0+ZHN0X2FkZHIpOwo+Pj4+ Pj4+PiArCj4+Pj4+Pj4+ICsJY2hhbi0+c3JjX2FkZHIgPSBjb25maWctPnNyY19hZGRyOwo+Pj4+ Pj4+PiArCWNoYW4tPmRzdF9hZGRyID0gY29uZmlnLT5kc3RfYWRkcjsKPj4+Pj4+Pj4gKwo+Pj4+ Pj4+PiArCWVyciA9IG9wcy0+ZGV2aWNlX2NvbmZpZyhkY2hhbik7Cj4+Pj4+Pj4KPj4+Pj4+PiB3 aGF0IGRvZXMgdGhpcyBkbz8KPj4+Pj4+Cj4+Pj4+PiBUaGlzIGlzIGFuIGluaXRpYWxpemF0aW9u IHByb2NlZHVyZSB0byBzZXR1cCBpbnRlcnJ1cHRzIChkYXRhIGFuZCBhZGRyZXNzZXMpIHRvCj4+ Pj4+PiBlYWNoIGNoYW5uZWwgb24gdGhlIGVETUEgSVAsICBpbiBvcmRlciB0byBiZSB0cmlnZ2Vy ZWQgYWZ0ZXIgdHJhbnNmZXIgYmVpbmcKPj4+Pj4+IGNvbXBsZXRlZCBvciBhYm9ydGVkLiBEdWUg dGhlIGZhY3QgdGhlIGNvbmZpZygpIGNhbiBiZSBjYWxsZWQgYXQgYW55dGltZSwKPj4+Pj4+IGRv ZXNuJ3QgbWFrZSBzZW5zZSB0byBoYXZlIHRoaXMgcHJvY2VkdXJlIGhlcmUsIEknbGwgbW92ZWQg aXQgdG8gcHJvYmUoKS4KPj4+Pj4KPj4+Pj4gWWVhaCBJIGFtIG5vdCBzdGlsbCBjb252aW5jZWQg YWJvdXQgaGF2aW5nIGFub3RoZXIgbGF5ZXIhIEhhdmUgeW91Cj4+Pj4+IHRob3VnaCBhYm91dCB1 c2luZyBjb21tb24gbGliIGZvciBjb21tb24gcGFydHMgLi4/Cj4+Pj4KPj4+PiBNYXliZSBJJ20g ZXhwbGFpbmluZyBteXNlbGYgd3JvbmdseS4gSSBkb24ndCBoYXZlIGFueSBjbHVlIGFib3V0IHRo ZSBuZXcKPj4+PiByZWdpc3RlciBtYXAgZm9yIHRoZSBmdXR1cmUgdmVyc2lvbnMuIEkgaG9uZXN0 bHkgdHJpZWQgdG8gaW1wbGVtZW50IHRoZSBjb21tb24KPj4+PiBsaWIgZm9yIHRoZSB3aG9sZSBw cm9jZXNzIHRoYXQgaW50ZXJhY3Qgd2l0aCBkbWEgZW5naW5lIGNvbnRyb2xsZXIgdG8gZWFzZSBp bgo+Pj4+IHRoZSBmdXR1cmUgYW55IG5ldyBhZGRpdGlvbiBvZiByZWdpc3RlciBtYXBwaW5nLCBi eSBoYXZpbmcgdGhpcyBjb21tb24gY2FsbGJhY2tzCj4+Pj4gdGhhdCB3aWxsIG9ubHkgYmUgcmVz cG9uc2libGUgZm9yIGludGVyZmFjaW5nIHRoZSBIVyBhY2NvcmRpbmdseSB0byByZWdpc3RlciBt YXAKPj4+PiB2ZXJzaW9uLiBNYXliZSBJIGNhbiBzaW1wbGlmeSBzb21ldGhpbmcgaW4gdGhlIGZ1 dHVyZSwgYnV0IEkgb25seSBiZSBhYmxlIHRvCj4+Pj4gY29uY2x1ZGUgdGhhdCBhZnRlciBoYXZp bmcgc29tZSBpZGVhIGFib3V0IHRoZSBuZXcgcmVnaXN0ZXIgbWFwLgo+Pj4+Cj4+Pj4gSU1ITyBJ IHRoaW5rIHRoaXMgaXMgdGhlIGVhc2llciBhbmQgY2xlYW4gd2F5IHRvIGRvIGl0LCBpbiB0ZXJt cyBvZiBjb2RlCj4+Pj4gbWFpbnRlbmFuY2UgYW5kIGFyY2hpdGVjdHVyZSwgYnV0IGlmIHlvdSBo YXZlIGFub3RoZXIgaWRlYSB0aGF0IHlvdSBjYW4gc2hvdyBtZQo+Pj4+IG9yIHBvaW50aW5nIG91 dCBmb3IgYSBkcml2ZXIgdGhhdCBpbXBsZW1lbnRzIHNvbWV0aGluZyBzaW1pbGFyLCBJJ20gbm8g cHJvYmxlbQo+Pj4+IHRvIGNoZWNrIGl0IG91dC4KPj4+Cj4+PiBUaGF0IGlzIHdoYXQgbXkgZmVh ciB3YXMgOikKPj4+Cj4+PiBMZXRzIHN0ZXAgYmFjayBhbmQgc29sdmUgb25lIHByb2JsZW0gYXQg YSB0aW1lLiBSaWdodCBub3cgdGhhdCBpcyB2MCBvZgo+Pj4gSVAuIFBsZWFzZSB3cml0ZSBhIHNp bXBsZSBkcml2ZXIgd2hpY2ggc29sdmUgdjAgd2l0aG91dCBhbnkgbGF5ZXJzCj4+PiBpbnZvbHZl ZC4KPj4+Cj4+PiBPbmNlIHYxIGlzIGluIGdvb2Qgc2hhcGUsIHlvdSB3b3VsZCBrbm93IHdoYXQg aXQgcmVxdWlyZWQgYW5kIHRoZW4gd2UKPj4+IGNhbiBzcGxpdCB2MCBkcml2ZXIgaW50byBjb21t b24gbGliIGFuZCB2MCBkcml2ZXIgYW5kIHRoZW4gYWRkIHYxCj4+PiBkcml2ZXIuCj4+Cj4+IENh biBJIGtlZXAgdGhlIGNvZGUgc2VncmVnYXRpb24gYXMgaXQgaXMgbm93PyBXaXRoIHRoZSBkdy1l ZG1hLXYwLWNvcmUuYy9oLAo+PiBkdy1lZG1hLXYwLWRlYnVnZnMuYy9oIGFuZCBkdy1lZG1hLXYw LXJlZ3MuaAo+Pgo+PiBUaGF0IHdheSBJIHdvdWxkIG9ubHkgcmVwbGFjZSB0aGUgY2FsbGJhY2tz IGNhbGxzIHRvIGRpcmVjdCBmdW5jdGlvbiBjYWxscyBhbmQKPj4gcmVtb3ZlIHRoZSBzd2l0Y2gg Y2FzZSBjYWxsYmFjayBzZWxlY3Rpb24gYmFzZSBvbiB0aGUgdmVyc2lvbi4KPiAKPiBUaGF0IHNv dW5kIGJldHRlciwgcGxlYXNlIGtlZXAgcGF0Y2hlcyBzbWFsbGlzaCAoYW55dGhpbmcgZ29pbmcg bW9yZQo+IHRoYW4gNjAwIGxpbmVzIGJlY29tZXMgaGFyZGVyIHRvIHJldmlldykgYW5kIGxvZ2lj YWxseSBzcGxpdC4KPiAKPj4+Pj4+PiB3aGF0IGlzIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgY2hl Y2ssIGNhbiB5b3UgZXhwbGFpbiB0aGF0LCB3aG8gc2V0cwo+Pj4+Pj4+IGNoYW4tPmRpcj8KPj4+ Pj4+Cj4+Pj4+PiBUaGUgY2hhbi0+ZGlyIGlzIHNldCBvbiBwcm9iZSgpIGR1cmluZyB0aGUgcHJv Y2VzcyBvZiBjb25maWd1cmluZyBlYWNoIGNoYW5uZWwuCj4+Pj4+Cj4+Pj4+IFNvIHlvdSBoYXZl IGNoYW5uZWxzIHRoYXQgYXJlIHVuaWRpcmVjdGlvbmFsPwo+Pj4+Cj4+Pj4gWWVzLiBUaGF0J3Mg b25lIGFub3RoZXIgcmVhc29uIElNSE8gdG8ga2VlcCB0aGUgZHctZWRtYS10ZXN0IHNlcGFyYXRl IGZyb20KPj4+PiBkbWEtdGVzdCwgc2luY2UgdGhpcyBJUCBpcyBtb3JlIHBpY2t5IGFuZCBoYXZl IHRoaXMgcGFydGljdWxhcml0aWVzLgo+Pj4KPj4+IFRoYXQgaXMgb2theSwgdGhhdCBzaG91bGQg YmUgaGFuZGxlZCBieSBwcmVwIGNhbGxzLCBpZiB5b3UgZ2V0IGEgcHJlcAo+Pj4gY2FsbCBmb3Ig ZGlyZWN0aW9uIHlvdSBkb250IHN1cHBvcnQgcmV0dXJuIGVycm9yIGFuZCBtb3ZlIHRvIG5leHQK Pj4+IGF2YWlsYWJsZSBvbmUuCj4+Pgo+Pj4gVGhhdCBjYW4gYmUgZG9uZSBnZW5lcmljYWxseSBp biBkbWF0ZXN0IGRyaXZlciBhbmQgdG8gYW5zd2VyIHlvdXIKPj4+IHF1ZXN0aW9uLCB5ZXMgSSB3 b3VsZCB0ZXN0IHRoYXQgOikKPj4KPj4gTGlrZSB5b3Ugc2FpZCwgbGV0IGRvIHRoaXMgaW4gc21h bGwgc3RlcHMuIEZvciBub3cgSSB3b3VsZCBsaWtlIHRvIHN1Z2dlc3QgdG8KPj4gbGVhdmUgb3V0 IHRoZSBkdy1kbWEtdGVzdCBkcml2ZXIgYW5kIGp1c3QgZm9jdXMgb24gdGhlIGN1cnJlbnQgZHJp dmVyLCBpZiB5b3UKPj4gZG9uJ3QgbWluZC4gSSBuZXZlciB0aG91Z2h0IHRoYXQgaGlzIHRlc3Qg ZHJpdmVyIHdvdWxkIHJhaXNlIHRoaXMga2luZCBvZiBkaXNjdXNzLgo+IAo+IFdlbGwgZG1hdGVz dCBpcyBqdXN0IGEgdGVzdGluZyBhaWQgYW5kIGRvZXNudCBjYXJlIGFib3V0IGludGVybmFsCj4g ZGVzaWducyBvZiB5b3VyIGRyaXZlci4gSSB3b3VsZCBzYXkga2VlcCBpdCBhcyBpdCBpcyB1c2Vm dWwgYWlkIGFuZCB3aWxsCj4gaGVscCBvdGhlciBmb2xrcyBhcyB3ZWxsIDopCj4gCgpMZXQncyBz ZWUsIEkgaG9uZXN0bHkgaG9wZSBzby4uLgoKR3VzdGF2bwo=