From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Date: Tue, 15 Oct 2019 18:13:37 +0000 Subject: Re: [PATCH v2 00/15] DRM fbconv helpers for converting fbdev drivers Message-Id: <20191015181337.GG1208@intel.com> List-Id: References: <20191014140416.28517-1-tzimmermann@suse.de> <20191015143318.GP11828@phenom.ffwll.local> <5241e699-f66a-d212-03a5-bb736639e66b@suse.de> In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable To: Daniel Vetter Cc: Linux Fbdev development list , Bartlomiej Zolnierkiewicz , Dave Airlie , Greg KH , Michel =?iso-8859-1?Q?D=E4nzer?= , Jonathan Corbet , Mathieu Malaterre , dri-devel , Thomas Zimmermann , Sean Paul On Tue, Oct 15, 2019 at 07:48:29PM +0200, Daniel Vetter wrote: > On Tue, Oct 15, 2019 at 7:28 PM Thomas Zimmermann w= rote: > > > > Hi Daniel > > > > Am 15.10.19 um 16:33 schrieb Daniel Vetter: > > > Hi Thomas, > > > > > > On Mon, Oct 14, 2019 at 04:04:01PM +0200, Thomas Zimmermann wrote: > > >> (was: DRM driver for fbdev devices) > > >> > > >> This is version 2 of the fbdev conversion helpers. It's more or less= a > > >> rewrite of the original patchset. > > >> > > >> The fbdev subsystem is considered legacy and will probably be remove= d at > > >> some point. This would mean the loss of a signifanct number of drive= rs. > > >> Some of the affected hardware is not in use any longer, but some har= dware > > >> is still around and provides good(-enough) framebuffers. > > >> > > >> The fbconv helpers allow for running the current DRM stack on top of= fbdev > > >> drivers. It's a set of functions that convert between fbdev interfac= es and > > >> DRM interfaces. Based on SHMEM and simple KMS helpers, it only offer= s the > > >> basic functionality of a framebuffer, but should be compatible with = most > > >> existing fbdev drivers. > > >> > > >> A DRM driver using fbconv helpers consists of > > >> > > >> * DRM stub code that calls into fbconv helpers, and > > >> * the original fbdev driver code. > > >> > > >> The fbdev driver code has to be modified to register itself with the > > >> stub driver instead of the fbdev core framework. A tutorial on how t= o use > > >> the helpers is part of this patchset. The resulting driver hybrid ca= n be > > >> refactored into a first-class DRM driver. The fbconv helpers contain= a > > >> number of comments, labeled 'DRM porting note', which explain the re= quired > > >> steps. > > >> > > >> I tested the current patchset with the following drivers: atyfb, aty= 128fb, > > >> matroxfb, pm2fb, pm3fb, rivafb, s3fb, savagefb, sisfb, tdfxfb and tr= identfb. > > >> With each, I was able to successfully start with fbcon enabled, run = weston and > > >> X11. The drivers are available at [1]. For reference, the patchset i= ncludes > > >> the Matrox stub driver. > > > > > > So I really don't want to rain on the parade here, since if you think= this > > > is useful when converting fbdev drivers I'll buy that, and I'm all for > > > getting more modern drivers into drm. > > > > > > But I have a bunch of concerns with the approach you're proposing her= e: > > > > > > - we've tried staging for drm driver refactoring, it hurts. Separate = tree > > > plus the quick pace in refactoring create lots of pains. And for sm= all > > > drivers refacotoring before it's not buying you anything above > > > refactoring in your own personal tree. And for big drivers we're fa= irly > > > lenient with merging drivers that aren't fully polished yet, if the= re's > > > a team serious enough with cleaning up the mess. I think even mergi= ng > > > partial drivers directly under drivers/gpu (but behind CONFIG_BROKE= N) is > > > better than staging. > > > > I mostly put this into staging, because it's the kind of code you'd > > expect there. >=20 > Yeah, except we tried, it's a real pain. Conclusion by everyone > involved is that staging doesn't work for the drm subsystem. >=20 > > > - we've had conversion helpers before (for the legacy kms -> atomic > > > upgrade). They constantly broke, pretty much every release when som= eone > > > wanted to use them they first had to fix them up again. I think hav= ing > > > those helpers is good, but better to just have them in some branch > > > somewhere where it's clear that they might not work anymore on late= st > > > upstream. > > > > > > - especially for some of these simple fbdev drivers I feel like just > > > typing a new driver from scratch might be simpler. > > > > > > A few more concerns specifically for your mga example: > > > > > > - We already have a mga driver. Might be better to integrate support = for > > > older mgas into that than have a parallel driver. > > > > Two colleagues of mine, Takashi and Egbert, send a patch that added > > support for desktop G200s to mgag200. [1] But it was rejected because > > the devices are two old and not relevant any longer. If that opinion has > > changed in the meantime, I wouldn't mind adding support for desktop GPUs > > to the driver. >=20 > Hm that seems to have petered out inconclusive. I definitely think a > merged mga driver is better than 2 drm atomic kms drivers for roughly > the same hardware. I'm also assuming that at least for now no one > plans to resurrect the 3d acceleration support for these old chips. > But even then it's fairly easy to disable all that on the server > chips. >=20 > > > - Your helper is based on simple display pipe, and I think for these = old > > > mga chips (especially the dual pipe mga 450 and 550) simple display= pipe > > > helper is more a hindering detour than actual help. From a quick re= ad > > > through the code (especially all the custom ioctls) you definitely = want > > > separate TV-out connector to expose all the tv mode properties (ins= tead > > > of the custom ioctls). > > > > Around the G100, there's something like a change in generation. Before, > > devices had only a single output and less than 8 MiB of RAM. This works > > well with GEM SHMEM and simple KMS. Afterwards, devices have 8 MiB or > > more and multiple outputs. GEM VRAM and the full set of helpers fit this > > much better. Maybe having 2 drivers that share common code (or 3 with > > the Server Engine chipsets) makes most sense. >=20 > Yeah if that's the case maybe a mga100 and mga200g driver fits better. > Former based on simple display pipe. The display hardware differences are quite minimal from=20 1064SG to G200. G400 did add the second CRTC but essentially nothing else changed from G200 display. G450/G550 changed the PLLS around a bit just for the heck of it, and integrated=20 the TMDS transmitter and TV encoder. And then they did even more PLL madness with the different G200 server chip variants. So IMO from display hw POV G100 vs. G200 split doesn't really make sense. And if you go to the effort of supporting dual head on G400+ then the single head case on earlier platforms is just the same as the single head "trivial" case on G400+, so totally different drivers doesn't make sense there either. Also not all G400 cards have the TVO/TMDS chip present in which case you can only use a single head anyway (it's almost identical to a G200 card at that point, assuming you drive the single output with the primary CRTC). --=20 Ville Syrj=E4l=E4 Intel From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Subject: Re: [PATCH v2 00/15] DRM fbconv helpers for converting fbdev drivers Date: Tue, 15 Oct 2019 21:13:37 +0300 Message-ID: <20191015181337.GG1208@intel.com> References: <20191014140416.28517-1-tzimmermann@suse.de> <20191015143318.GP11828@phenom.ffwll.local> <5241e699-f66a-d212-03a5-bb736639e66b@suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by gabe.freedesktop.org (Postfix) with ESMTPS id 0952C6E878 for ; Tue, 15 Oct 2019 18:13:42 +0000 (UTC) Content-Disposition: inline In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Daniel Vetter Cc: Linux Fbdev development list , Bartlomiej Zolnierkiewicz , Dave Airlie , Greg KH , Michel =?iso-8859-1?Q?D=E4nzer?= , Jonathan Corbet , Mathieu Malaterre , dri-devel , Thomas Zimmermann , Sean Paul List-Id: dri-devel@lists.freedesktop.org T24gVHVlLCBPY3QgMTUsIDIwMTkgYXQgMDc6NDg6MjlQTSArMDIwMCwgRGFuaWVsIFZldHRlciB3 cm90ZToKPiBPbiBUdWUsIE9jdCAxNSwgMjAxOSBhdCA3OjI4IFBNIFRob21hcyBaaW1tZXJtYW5u IDx0emltbWVybWFubkBzdXNlLmRlPiB3cm90ZToKPiA+Cj4gPiBIaSBEYW5pZWwKPiA+Cj4gPiBB bSAxNS4xMC4xOSB1bSAxNjozMyBzY2hyaWViIERhbmllbCBWZXR0ZXI6Cj4gPiA+IEhpIFRob21h cywKPiA+ID4KPiA+ID4gT24gTW9uLCBPY3QgMTQsIDIwMTkgYXQgMDQ6MDQ6MDFQTSArMDIwMCwg VGhvbWFzIFppbW1lcm1hbm4gd3JvdGU6Cj4gPiA+PiAod2FzOiBEUk0gZHJpdmVyIGZvciBmYmRl diBkZXZpY2VzKQo+ID4gPj4KPiA+ID4+IFRoaXMgaXMgdmVyc2lvbiAyIG9mIHRoZSBmYmRldiBj b252ZXJzaW9uIGhlbHBlcnMuIEl0J3MgbW9yZSBvciBsZXNzIGEKPiA+ID4+IHJld3JpdGUgb2Yg dGhlIG9yaWdpbmFsIHBhdGNoc2V0Lgo+ID4gPj4KPiA+ID4+IFRoZSBmYmRldiBzdWJzeXN0ZW0g aXMgY29uc2lkZXJlZCBsZWdhY3kgYW5kIHdpbGwgcHJvYmFibHkgYmUgcmVtb3ZlZCBhdAo+ID4g Pj4gc29tZSBwb2ludC4gVGhpcyB3b3VsZCBtZWFuIHRoZSBsb3NzIG9mIGEgc2lnbmlmYW5jdCBu dW1iZXIgb2YgZHJpdmVycy4KPiA+ID4+IFNvbWUgb2YgdGhlIGFmZmVjdGVkIGhhcmR3YXJlIGlz IG5vdCBpbiB1c2UgYW55IGxvbmdlciwgYnV0IHNvbWUgaGFyZHdhcmUKPiA+ID4+IGlzIHN0aWxs IGFyb3VuZCBhbmQgcHJvdmlkZXMgZ29vZCgtZW5vdWdoKSBmcmFtZWJ1ZmZlcnMuCj4gPiA+Pgo+ ID4gPj4gVGhlIGZiY29udiBoZWxwZXJzIGFsbG93IGZvciBydW5uaW5nIHRoZSBjdXJyZW50IERS TSBzdGFjayBvbiB0b3Agb2YgZmJkZXYKPiA+ID4+IGRyaXZlcnMuIEl0J3MgYSBzZXQgb2YgZnVu Y3Rpb25zIHRoYXQgY29udmVydCBiZXR3ZWVuIGZiZGV2IGludGVyZmFjZXMgYW5kCj4gPiA+PiBE Uk0gaW50ZXJmYWNlcy4gQmFzZWQgb24gU0hNRU0gYW5kIHNpbXBsZSBLTVMgaGVscGVycywgaXQg b25seSBvZmZlcnMgdGhlCj4gPiA+PiBiYXNpYyBmdW5jdGlvbmFsaXR5IG9mIGEgZnJhbWVidWZm ZXIsIGJ1dCBzaG91bGQgYmUgY29tcGF0aWJsZSB3aXRoIG1vc3QKPiA+ID4+IGV4aXN0aW5nIGZi ZGV2IGRyaXZlcnMuCj4gPiA+Pgo+ID4gPj4gQSBEUk0gZHJpdmVyIHVzaW5nIGZiY29udiBoZWxw ZXJzIGNvbnNpc3RzIG9mCj4gPiA+Pgo+ID4gPj4gICAqIERSTSBzdHViIGNvZGUgdGhhdCBjYWxs cyBpbnRvIGZiY29udiBoZWxwZXJzLCBhbmQKPiA+ID4+ICAgKiB0aGUgb3JpZ2luYWwgZmJkZXYg ZHJpdmVyIGNvZGUuCj4gPiA+Pgo+ID4gPj4gVGhlIGZiZGV2IGRyaXZlciBjb2RlIGhhcyB0byBi ZSBtb2RpZmllZCB0byByZWdpc3RlciBpdHNlbGYgd2l0aCB0aGUKPiA+ID4+IHN0dWIgZHJpdmVy IGluc3RlYWQgb2YgdGhlIGZiZGV2IGNvcmUgZnJhbWV3b3JrLiBBIHR1dG9yaWFsIG9uIGhvdyB0 byB1c2UKPiA+ID4+IHRoZSBoZWxwZXJzIGlzIHBhcnQgb2YgdGhpcyBwYXRjaHNldC4gVGhlIHJl c3VsdGluZyBkcml2ZXIgaHlicmlkIGNhbiBiZQo+ID4gPj4gcmVmYWN0b3JlZCBpbnRvIGEgZmly c3QtY2xhc3MgRFJNIGRyaXZlci4gVGhlIGZiY29udiBoZWxwZXJzIGNvbnRhaW4gYQo+ID4gPj4g bnVtYmVyIG9mIGNvbW1lbnRzLCBsYWJlbGVkICdEUk0gcG9ydGluZyBub3RlJywgd2hpY2ggZXhw bGFpbiB0aGUgcmVxdWlyZWQKPiA+ID4+IHN0ZXBzLgo+ID4gPj4KPiA+ID4+IEkgdGVzdGVkIHRo ZSBjdXJyZW50IHBhdGNoc2V0IHdpdGggdGhlIGZvbGxvd2luZyBkcml2ZXJzOiBhdHlmYiwgYXR5 MTI4ZmIsCj4gPiA+PiBtYXRyb3hmYiwgcG0yZmIsIHBtM2ZiLCByaXZhZmIsIHMzZmIsIHNhdmFn ZWZiLCBzaXNmYiwgdGRmeGZiIGFuZCB0cmlkZW50ZmIuCj4gPiA+PiBXaXRoIGVhY2gsIEkgd2Fz IGFibGUgdG8gc3VjY2Vzc2Z1bGx5IHN0YXJ0IHdpdGggZmJjb24gZW5hYmxlZCwgcnVuIHdlc3Rv biBhbmQKPiA+ID4+IFgxMS4gVGhlIGRyaXZlcnMgYXJlIGF2YWlsYWJsZSBhdCBbMV0uIEZvciBy ZWZlcmVuY2UsIHRoZSBwYXRjaHNldCBpbmNsdWRlcwo+ID4gPj4gdGhlIE1hdHJveCBzdHViIGRy aXZlci4KPiA+ID4KPiA+ID4gU28gSSByZWFsbHkgZG9uJ3Qgd2FudCB0byByYWluIG9uIHRoZSBw YXJhZGUgaGVyZSwgc2luY2UgaWYgeW91IHRoaW5rIHRoaXMKPiA+ID4gaXMgdXNlZnVsIHdoZW4g Y29udmVydGluZyBmYmRldiBkcml2ZXJzIEknbGwgYnV5IHRoYXQsIGFuZCBJJ20gYWxsIGZvcgo+ ID4gPiBnZXR0aW5nIG1vcmUgbW9kZXJuIGRyaXZlcnMgaW50byBkcm0uCj4gPiA+Cj4gPiA+IEJ1 dCBJIGhhdmUgYSBidW5jaCBvZiBjb25jZXJucyB3aXRoIHRoZSBhcHByb2FjaCB5b3UncmUgcHJv cG9zaW5nIGhlcmU6Cj4gPiA+Cj4gPiA+IC0gd2UndmUgdHJpZWQgc3RhZ2luZyBmb3IgZHJtIGRy aXZlciByZWZhY3RvcmluZywgaXQgaHVydHMuIFNlcGFyYXRlIHRyZWUKPiA+ID4gICBwbHVzIHRo ZSBxdWljayBwYWNlIGluIHJlZmFjdG9yaW5nIGNyZWF0ZSBsb3RzIG9mIHBhaW5zLiBBbmQgZm9y IHNtYWxsCj4gPiA+ICAgZHJpdmVycyByZWZhY290b3JpbmcgYmVmb3JlIGl0J3Mgbm90IGJ1eWlu ZyB5b3UgYW55dGhpbmcgYWJvdmUKPiA+ID4gICByZWZhY3RvcmluZyBpbiB5b3VyIG93biBwZXJz b25hbCB0cmVlLiBBbmQgZm9yIGJpZyBkcml2ZXJzIHdlJ3JlIGZhaXJseQo+ID4gPiAgIGxlbmll bnQgd2l0aCBtZXJnaW5nIGRyaXZlcnMgdGhhdCBhcmVuJ3QgZnVsbHkgcG9saXNoZWQgeWV0LCBp ZiB0aGVyZSdzCj4gPiA+ICAgYSB0ZWFtIHNlcmlvdXMgZW5vdWdoIHdpdGggY2xlYW5pbmcgdXAg dGhlIG1lc3MuIEkgdGhpbmsgZXZlbiBtZXJnaW5nCj4gPiA+ICAgcGFydGlhbCBkcml2ZXJzIGRp cmVjdGx5IHVuZGVyIGRyaXZlcnMvZ3B1IChidXQgYmVoaW5kIENPTkZJR19CUk9LRU4pIGlzCj4g PiA+ICAgYmV0dGVyIHRoYW4gc3RhZ2luZy4KPiA+Cj4gPiBJIG1vc3RseSBwdXQgdGhpcyBpbnRv IHN0YWdpbmcsIGJlY2F1c2UgaXQncyB0aGUga2luZCBvZiBjb2RlIHlvdSdkCj4gPiBleHBlY3Qg dGhlcmUuCj4gCj4gWWVhaCwgZXhjZXB0IHdlIHRyaWVkLCBpdCdzIGEgcmVhbCBwYWluLiBDb25j bHVzaW9uIGJ5IGV2ZXJ5b25lCj4gaW52b2x2ZWQgaXMgdGhhdCBzdGFnaW5nIGRvZXNuJ3Qgd29y ayBmb3IgdGhlIGRybSBzdWJzeXN0ZW0uCj4gCj4gPiA+IC0gd2UndmUgaGFkIGNvbnZlcnNpb24g aGVscGVycyBiZWZvcmUgKGZvciB0aGUgbGVnYWN5IGttcyAtPiBhdG9taWMKPiA+ID4gICB1cGdy YWRlKS4gVGhleSBjb25zdGFudGx5IGJyb2tlLCBwcmV0dHkgbXVjaCBldmVyeSByZWxlYXNlIHdo ZW4gc29tZW9uZQo+ID4gPiAgIHdhbnRlZCB0byB1c2UgdGhlbSB0aGV5IGZpcnN0IGhhZCB0byBm aXggdGhlbSB1cCBhZ2Fpbi4gSSB0aGluayBoYXZpbmcKPiA+ID4gICB0aG9zZSBoZWxwZXJzIGlz IGdvb2QsIGJ1dCBiZXR0ZXIgdG8ganVzdCBoYXZlIHRoZW0gaW4gc29tZSBicmFuY2gKPiA+ID4g ICBzb21ld2hlcmUgd2hlcmUgaXQncyBjbGVhciB0aGF0IHRoZXkgbWlnaHQgbm90IHdvcmsgYW55 bW9yZSBvbiBsYXRlc3QKPiA+ID4gICB1cHN0cmVhbS4KPiA+ID4KPiA+ID4gLSBlc3BlY2lhbGx5 IGZvciBzb21lIG9mIHRoZXNlIHNpbXBsZSBmYmRldiBkcml2ZXJzIEkgZmVlbCBsaWtlIGp1c3QK PiA+ID4gICB0eXBpbmcgYSBuZXcgZHJpdmVyIGZyb20gc2NyYXRjaCBtaWdodCBiZSBzaW1wbGVy Lgo+ID4gPgo+ID4gPiBBIGZldyBtb3JlIGNvbmNlcm5zIHNwZWNpZmljYWxseSBmb3IgeW91ciBt Z2EgZXhhbXBsZToKPiA+ID4KPiA+ID4gLSBXZSBhbHJlYWR5IGhhdmUgYSBtZ2EgZHJpdmVyLiBN aWdodCBiZSBiZXR0ZXIgdG8gaW50ZWdyYXRlIHN1cHBvcnQgZm9yCj4gPiA+ICAgb2xkZXIgbWdh cyBpbnRvIHRoYXQgdGhhbiBoYXZlIGEgcGFyYWxsZWwgZHJpdmVyLgo+ID4KPiA+IFR3byBjb2xs ZWFndWVzIG9mIG1pbmUsIFRha2FzaGkgYW5kIEVnYmVydCwgc2VuZCBhIHBhdGNoIHRoYXQgYWRk ZWQKPiA+IHN1cHBvcnQgZm9yIGRlc2t0b3AgRzIwMHMgdG8gbWdhZzIwMC4gWzFdIEJ1dCBpdCB3 YXMgcmVqZWN0ZWQgYmVjYXVzZQo+ID4gdGhlIGRldmljZXMgYXJlIHR3byBvbGQgYW5kIG5vdCBy ZWxldmFudCBhbnkgbG9uZ2VyLiBJZiB0aGF0IG9waW5pb24gaGFzCj4gPiBjaGFuZ2VkIGluIHRo ZSBtZWFudGltZSwgSSB3b3VsZG4ndCBtaW5kIGFkZGluZyBzdXBwb3J0IGZvciBkZXNrdG9wIEdQ VXMKPiA+IHRvIHRoZSBkcml2ZXIuCj4gCj4gSG0gdGhhdCBzZWVtcyB0byBoYXZlIHBldGVyZWQg b3V0IGluY29uY2x1c2l2ZS4gSSBkZWZpbml0ZWx5IHRoaW5rIGEKPiBtZXJnZWQgbWdhIGRyaXZl ciBpcyBiZXR0ZXIgdGhhbiAyIGRybSBhdG9taWMga21zIGRyaXZlcnMgZm9yIHJvdWdobHkKPiB0 aGUgc2FtZSBoYXJkd2FyZS4gSSdtIGFsc28gYXNzdW1pbmcgdGhhdCBhdCBsZWFzdCBmb3Igbm93 IG5vIG9uZQo+IHBsYW5zIHRvIHJlc3VycmVjdCB0aGUgM2QgYWNjZWxlcmF0aW9uIHN1cHBvcnQg Zm9yIHRoZXNlIG9sZCBjaGlwcy4KPiBCdXQgZXZlbiB0aGVuIGl0J3MgZmFpcmx5IGVhc3kgdG8g ZGlzYWJsZSBhbGwgdGhhdCBvbiB0aGUgc2VydmVyCj4gY2hpcHMuCj4gCj4gPiA+IC0gWW91ciBo ZWxwZXIgaXMgYmFzZWQgb24gc2ltcGxlIGRpc3BsYXkgcGlwZSwgYW5kIEkgdGhpbmsgZm9yIHRo ZXNlIG9sZAo+ID4gPiAgIG1nYSBjaGlwcyAoZXNwZWNpYWxseSB0aGUgZHVhbCBwaXBlIG1nYSA0 NTAgYW5kIDU1MCkgc2ltcGxlIGRpc3BsYXkgcGlwZQo+ID4gPiAgIGhlbHBlciBpcyBtb3JlIGEg aGluZGVyaW5nIGRldG91ciB0aGFuIGFjdHVhbCBoZWxwLiBGcm9tIGEgcXVpY2sgcmVhZAo+ID4g PiAgIHRocm91Z2ggdGhlIGNvZGUgKGVzcGVjaWFsbHkgYWxsIHRoZSBjdXN0b20gaW9jdGxzKSB5 b3UgZGVmaW5pdGVseSB3YW50Cj4gPiA+ICAgc2VwYXJhdGUgVFYtb3V0IGNvbm5lY3RvciB0byBl eHBvc2UgYWxsIHRoZSB0diBtb2RlIHByb3BlcnRpZXMgKGluc3RlYWQKPiA+ID4gICBvZiB0aGUg Y3VzdG9tIGlvY3RscykuCj4gPgo+ID4gQXJvdW5kIHRoZSBHMTAwLCB0aGVyZSdzIHNvbWV0aGlu ZyBsaWtlIGEgY2hhbmdlIGluIGdlbmVyYXRpb24uIEJlZm9yZSwKPiA+IGRldmljZXMgaGFkIG9u bHkgYSBzaW5nbGUgb3V0cHV0IGFuZCBsZXNzIHRoYW4gOCBNaUIgb2YgUkFNLiBUaGlzIHdvcmtz Cj4gPiB3ZWxsIHdpdGggR0VNIFNITUVNIGFuZCBzaW1wbGUgS01TLiBBZnRlcndhcmRzLCBkZXZp Y2VzIGhhdmUgOCBNaUIgb3IKPiA+IG1vcmUgYW5kIG11bHRpcGxlIG91dHB1dHMuIEdFTSBWUkFN IGFuZCB0aGUgZnVsbCBzZXQgb2YgaGVscGVycyBmaXQgdGhpcwo+ID4gbXVjaCBiZXR0ZXIuIE1h eWJlIGhhdmluZyAyIGRyaXZlcnMgdGhhdCBzaGFyZSBjb21tb24gY29kZSAob3IgMyB3aXRoCj4g PiB0aGUgU2VydmVyIEVuZ2luZSBjaGlwc2V0cykgbWFrZXMgbW9zdCBzZW5zZS4KPiAKPiBZZWFo IGlmIHRoYXQncyB0aGUgY2FzZSBtYXliZSBhIG1nYTEwMCBhbmQgbWdhMjAwZyBkcml2ZXIgZml0 cyBiZXR0ZXIuCj4gRm9ybWVyIGJhc2VkIG9uIHNpbXBsZSBkaXNwbGF5IHBpcGUuCgpUaGUgZGlz cGxheSBoYXJkd2FyZSBkaWZmZXJlbmNlcyBhcmUgcXVpdGUgbWluaW1hbCBmcm9tIAoxMDY0U0cg dG8gRzIwMC4gRzQwMCBkaWQgYWRkIHRoZSBzZWNvbmQgQ1JUQyBidXQgZXNzZW50aWFsbHkKbm90 aGluZyBlbHNlIGNoYW5nZWQgZnJvbSBHMjAwIGRpc3BsYXkuIEc0NTAvRzU1MCBjaGFuZ2VkCnRo ZSBQTExTIGFyb3VuZCBhIGJpdCBqdXN0IGZvciB0aGUgaGVjayBvZiBpdCwgYW5kIGludGVncmF0 ZWQgCnRoZSBUTURTIHRyYW5zbWl0dGVyIGFuZCBUViBlbmNvZGVyLiBBbmQgdGhlbiB0aGV5IGRp ZCBldmVuCm1vcmUgUExMIG1hZG5lc3Mgd2l0aCB0aGUgZGlmZmVyZW50IEcyMDAgc2VydmVyIGNo aXAgdmFyaWFudHMuCgpTbyBJTU8gZnJvbSBkaXNwbGF5IGh3IFBPViBHMTAwIHZzLiBHMjAwIHNw bGl0IGRvZXNuJ3QgcmVhbGx5Cm1ha2Ugc2Vuc2UuCgpBbmQgaWYgeW91IGdvIHRvIHRoZSBlZmZv cnQgb2Ygc3VwcG9ydGluZyBkdWFsIGhlYWQgb24gRzQwMCsgdGhlbgp0aGUgc2luZ2xlIGhlYWQg Y2FzZSBvbiBlYXJsaWVyIHBsYXRmb3JtcyBpcyBqdXN0IHRoZSBzYW1lIGFzIHRoZQpzaW5nbGUg aGVhZCAidHJpdmlhbCIgY2FzZSBvbiBHNDAwKywgc28gdG90YWxseSBkaWZmZXJlbnQgZHJpdmVy cwpkb2Vzbid0IG1ha2Ugc2Vuc2UgdGhlcmUgZWl0aGVyLiBBbHNvIG5vdCBhbGwgRzQwMCBjYXJk cyBoYXZlCnRoZSBUVk8vVE1EUyBjaGlwIHByZXNlbnQgaW4gd2hpY2ggY2FzZSB5b3UgY2FuIG9u bHkgdXNlIGEKc2luZ2xlIGhlYWQgYW55d2F5IChpdCdzIGFsbW9zdCBpZGVudGljYWwgdG8gYSBH MjAwIGNhcmQgYXQKdGhhdCBwb2ludCwgYXNzdW1pbmcgeW91IGRyaXZlIHRoZSBzaW5nbGUgb3V0 cHV0IHdpdGggdGhlCnByaW1hcnkgQ1JUQykuCgotLSAKVmlsbGUgU3lyasOkbMOkCkludGVsCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBt YWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3Rz LmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbA==