From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Date: Thu, 15 Mar 2018 20:11:10 +0000 Subject: Re: fbcon non-desktop display use Message-Id: List-Id: References: <87zi39yyx1.fsf@keithp.com> In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Charles Lohr Cc: David Airlie , Keith Packard , Linux Fbdev development list , dri-devel , Bartlomiej Zolnierkiewicz On Thu, Mar 15, 2018 at 9:03 PM, Charles Lohr wrote: > To try to address both concerns, it feels easiest to do not in-line. > > 1) Just for background: The H3, and many other ARM systems use the > framebuffer for all video access, 3D accelerated as well as X11. If we > want to permit HMD (headmount display) or other non-desktop displays > on these devices are going to be used at all, it seems DRM must be set > up for them. I don't think of this as a "feature". There's no open source 3D stack using fbdev. And I really don't care much about the others from an upstream pov. > 2) Although I "wish" there was a way to permit non-desktop use with > multiple displays, I am having difficulty finding a specific need to > be able to turn it on/off. All applications I can imagine with the > HMD currently would involve the HMD being the only connected device. > I am still "submitting" the patch with the parameter, however, if you > folks decide not to accept it, I intend to re-submit with just the && > strict fix (which I just tested and it's good!) -- unless you (Keith) > are willing to put forward the && strict as a patch. I guess we can do that, but I'll defer to Keith/Dave on this since I'm firmly meh for trying to get HMDs to show up on fbcon. Doesn't make sense to me. -Daniel > 3) I am trying "plain text mode" for my patch, so hopefully it doesn't > truncate the lines. Also, I misunderstood "Signed-off-by" Thanks! > > Signed-off-by: Charles Lohr > > diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c > index 035784ddd..e14624d0f 100644 > --- a/drivers/gpu/drm/drm_fb_helper.c > +++ b/drivers/gpu/drm/drm_fb_helper.c > @@ -55,6 +55,11 @@ MODULE_PARM_DESC(drm_fbdev_overalloc, > "Overallocation of the fbdev buffer (%) [default=" > __MODULE_STRING(CONFIG_DRM_FBDEV_OVERALLOC) "]"); > > +static bool drm_fbdev_permit_non_desktop; > +module_param(drm_fbdev_permit_non_desktop, bool, 0644); > +MODULE_PARM_DESC(drm_fbdev_permit_non_desktop, > + "Allow the framebuffer to use non-desktop displays > [default=off]"); > + > static LIST_HEAD(kernel_fb_helper_list); > static DEFINE_MUTEX(kernel_fb_helper_lock); > > @@ -2109,7 +2114,7 @@ static bool drm_connector_enabled(struct > drm_connector *connector, bool strict) > { > bool enable; > > - if (connector->display_info.non_desktop) > + if (connector->display_info.non_desktop && > !drm_fbdev_permit_non_desktop && strict) > return false; > > if (strict) > > On Thu, Mar 15, 2018 at 2:30 PM, Keith Packard wrote: >> Charles Lohr writes: >> >>> Even if the vive is the only device connected, it will still not permit it >>> to be operated. See https://github.com/linux-sunxi/linux-sunxi/issues/291 >>> for dri with a lot of debugging turned on. >> >> Oh, it's not supposed to do that. I had intended to write the code so >> that if the only device available was a non-desktop device that it would >> go ahead and use it. The X server patches did that, but the kernel ones >> did not. It looks like that would be an easy patch -- just skip the >> non_desktop check in the !strict case for drm_connector_enabled. >> >> However, your patch is a good addition as it will allow you to also >> enable the HMD when other monitors are connected. >> >>> I can understand that most users would probably prefer that the vive isn't >>> automatically used if no other displays are available, however, the current >>> behavior prevents use of the vive on all devices that use fbdev for their >>> primary output. >> >> That was definitely not my intention, and thanks for discovering this! >> >>> I've never sent an email to the kernel devel list, so I'm still a little >>> nervous. Especially because this is against a different branch, and I'm >>> starting to think that I should be messaging there, but this is something >>> that really needs to go upstream. >> >> We'll get it sorted out; I'm not sure what Dave's preference is these >> days anyways. >> >> Aside from some minor formatting issues, this patch looks good to me. >> >>> Signed-off-by: >> >> You'll need to add your name and email address here. >> >>> diff --git a/drivers/gpu/drm/drm_fb_helper.c >>> b/drivers/gpu/drm/drm_fb_helper.c >>> index 035784ddd..8bfaf79ff 100644 >>> --- a/drivers/gpu/drm/drm_fb_helper.c >>> +++ b/drivers/gpu/drm/drm_fb_helper.c >>> @@ -55,6 +55,11 @@ MODULE_PARM_DESC(drm_fbdev_overalloc, >>> "Overallocation of the fbdev buffer (%) [default=" >>> __MODULE_STRING(CONFIG_DRM_FBDEV_OVERALLOC) "]"); >>> >>> +static bool drm_fbdev_permit_non_desktop; >>> +module_param(drm_fbdev_permit_non_desktop, bool, 0644); >>> +MODULE_PARM_DESC(drm_fbdev_permit_non_desktop, >>> + "Allow the framebuffer to use non-desktop displays >>> [default=off]"); >>> + >> >> Your email client appears to be wrapping long lines, which breaks the patch. >> >> >>> static LIST_HEAD(kernel_fb_helper_list); >>> static DEFINE_MUTEX(kernel_fb_helper_lock); >>> >>> @@ -2109,7 +2114,7 @@ static bool drm_connector_enabled(struct >>> drm_connector *connector, bool strict) >>> { >>> bool enable; >>> >>> - if (connector->display_info.non_desktop) >>> + if (connector->display_info.non_desktop && >>> !drm_fbdev_permit_non_desktop) >> >> If you added '&& strict' here, it will use the HMD if there aren't any >> desktop monitors connected. >> >> -- >> -keith -- Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: fbcon non-desktop display use Date: Thu, 15 Mar 2018 21:11:10 +0100 Message-ID: References: <87zi39yyx1.fsf@keithp.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-io0-x243.google.com (mail-io0-x243.google.com [IPv6:2607:f8b0:4001:c06::243]) by gabe.freedesktop.org (Postfix) with ESMTPS id EB62489BF8 for ; Thu, 15 Mar 2018 20:11:12 +0000 (UTC) Received: by mail-io0-x243.google.com with SMTP id m83so10006859ioi.8 for ; Thu, 15 Mar 2018 13:11:12 -0700 (PDT) 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: Charles Lohr Cc: David Airlie , Keith Packard , Linux Fbdev development list , dri-devel , Bartlomiej Zolnierkiewicz List-Id: dri-devel@lists.freedesktop.org T24gVGh1LCBNYXIgMTUsIDIwMTggYXQgOTowMyBQTSwgQ2hhcmxlcyBMb2hyIDxsb2hyODVAZ21h aWwuY29tPiB3cm90ZToKPiBUbyB0cnkgdG8gYWRkcmVzcyBib3RoIGNvbmNlcm5zLCBpdCBmZWVs cyBlYXNpZXN0IHRvIGRvIG5vdCBpbi1saW5lLgo+Cj4gMSkgSnVzdCBmb3IgYmFja2dyb3VuZDog VGhlIEgzLCBhbmQgbWFueSBvdGhlciBBUk0gc3lzdGVtcyB1c2UgdGhlCj4gZnJhbWVidWZmZXIg Zm9yIGFsbCB2aWRlbyBhY2Nlc3MsIDNEIGFjY2VsZXJhdGVkIGFzIHdlbGwgYXMgWDExLiBJZiB3 ZQo+IHdhbnQgdG8gcGVybWl0IEhNRCAoaGVhZG1vdW50IGRpc3BsYXkpIG9yIG90aGVyIG5vbi1k ZXNrdG9wIGRpc3BsYXlzCj4gb24gdGhlc2UgZGV2aWNlcyBhcmUgZ29pbmcgdG8gYmUgdXNlZCBh dCBhbGwsIGl0IHNlZW1zIERSTSBtdXN0IGJlIHNldAo+IHVwIGZvciB0aGVtLiAgSSBkb24ndCB0 aGluayBvZiB0aGlzIGFzIGEgImZlYXR1cmUiLgoKVGhlcmUncyBubyBvcGVuIHNvdXJjZSAzRCBz dGFjayB1c2luZyBmYmRldi4gQW5kIEkgcmVhbGx5IGRvbid0IGNhcmUKbXVjaCBhYm91dCB0aGUg b3RoZXJzIGZyb20gYW4gdXBzdHJlYW0gcG92LgoKPiAyKSBBbHRob3VnaCBJICJ3aXNoIiB0aGVy ZSB3YXMgYSB3YXkgdG8gcGVybWl0IG5vbi1kZXNrdG9wIHVzZSB3aXRoCj4gbXVsdGlwbGUgZGlz cGxheXMsIEkgYW0gaGF2aW5nIGRpZmZpY3VsdHkgZmluZGluZyBhIHNwZWNpZmljIG5lZWQgdG8K PiBiZSBhYmxlIHRvIHR1cm4gaXQgb24vb2ZmLiAgQWxsIGFwcGxpY2F0aW9ucyBJIGNhbiBpbWFn aW5lIHdpdGggdGhlCj4gSE1EIGN1cnJlbnRseSB3b3VsZCBpbnZvbHZlIHRoZSBITUQgYmVpbmcg dGhlIG9ubHkgY29ubmVjdGVkIGRldmljZS4KPiBJIGFtIHN0aWxsICJzdWJtaXR0aW5nIiB0aGUg cGF0Y2ggd2l0aCB0aGUgcGFyYW1ldGVyLCBob3dldmVyLCBpZiB5b3UKPiBmb2xrcyBkZWNpZGUg bm90IHRvIGFjY2VwdCBpdCwgSSBpbnRlbmQgdG8gcmUtc3VibWl0IHdpdGgganVzdCB0aGUgJiYK PiBzdHJpY3QgZml4ICh3aGljaCBJIGp1c3QgdGVzdGVkIGFuZCBpdCdzIGdvb2QhKSAtLSB1bmxl c3MgeW91IChLZWl0aCkKPiBhcmUgd2lsbGluZyB0byBwdXQgZm9yd2FyZCB0aGUgJiYgc3RyaWN0 IGFzIGEgcGF0Y2guCgpJIGd1ZXNzIHdlIGNhbiBkbyB0aGF0LCBidXQgSSdsbCBkZWZlciB0byBL ZWl0aC9EYXZlIG9uIHRoaXMgc2luY2UgSSdtCmZpcm1seSBtZWggZm9yIHRyeWluZyB0byBnZXQg SE1EcyB0byBzaG93IHVwIG9uIGZiY29uLiBEb2Vzbid0IG1ha2UKc2Vuc2UgdG8gbWUuCi1EYW5p ZWwKCj4gMykgSSBhbSB0cnlpbmcgInBsYWluIHRleHQgbW9kZSIgZm9yIG15IHBhdGNoLCBzbyBo b3BlZnVsbHkgaXQgZG9lc24ndAo+IHRydW5jYXRlIHRoZSBsaW5lcy4gIEFsc28sIEkgbWlzdW5k ZXJzdG9vZCAiU2lnbmVkLW9mZi1ieSIgVGhhbmtzIQo+Cj4gU2lnbmVkLW9mZi1ieTogQ2hhcmxl cyBMb2hyIDxsb2hyODVAZ21haWwuY29tPgo+Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9kcm1fZmJfaGVscGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCj4gaW5k ZXggMDM1Nzg0ZGRkLi5lMTQ2MjRkMGYgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2Ry bV9mYl9oZWxwZXIuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMKPiBA QCAtNTUsNiArNTUsMTEgQEAgTU9EVUxFX1BBUk1fREVTQyhkcm1fZmJkZXZfb3ZlcmFsbG9jLAo+ ICAgICAgICAgICAgICAgICAgIk92ZXJhbGxvY2F0aW9uIG9mIHRoZSBmYmRldiBidWZmZXIgKCUp IFtkZWZhdWx0PSIKPiAgICAgICAgICAgICAgICAgIF9fTU9EVUxFX1NUUklORyhDT05GSUdfRFJN X0ZCREVWX09WRVJBTExPQykgIl0iKTsKPgo+ICtzdGF0aWMgYm9vbCBkcm1fZmJkZXZfcGVybWl0 X25vbl9kZXNrdG9wOwo+ICttb2R1bGVfcGFyYW0oZHJtX2ZiZGV2X3Blcm1pdF9ub25fZGVza3Rv cCwgYm9vbCwgMDY0NCk7Cj4gK01PRFVMRV9QQVJNX0RFU0MoZHJtX2ZiZGV2X3Blcm1pdF9ub25f ZGVza3RvcCwKPiArICAgICAgICAgICAgICAgIkFsbG93IHRoZSBmcmFtZWJ1ZmZlciB0byB1c2Ug bm9uLWRlc2t0b3AgZGlzcGxheXMKPiBbZGVmYXVsdD1vZmZdIik7Cj4gKwo+ICBzdGF0aWMgTElT VF9IRUFEKGtlcm5lbF9mYl9oZWxwZXJfbGlzdCk7Cj4gIHN0YXRpYyBERUZJTkVfTVVURVgoa2Vy bmVsX2ZiX2hlbHBlcl9sb2NrKTsKPgo+IEBAIC0yMTA5LDcgKzIxMTQsNyBAQCBzdGF0aWMgYm9v bCBkcm1fY29ubmVjdG9yX2VuYWJsZWQoc3RydWN0Cj4gZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9y LCBib29sIHN0cmljdCkKPiAgewo+ICAgICAgICAgYm9vbCBlbmFibGU7Cj4KPiAtICAgICAgIGlm IChjb25uZWN0b3ItPmRpc3BsYXlfaW5mby5ub25fZGVza3RvcCkKPiArICAgICAgIGlmIChjb25u ZWN0b3ItPmRpc3BsYXlfaW5mby5ub25fZGVza3RvcCAmJgo+ICFkcm1fZmJkZXZfcGVybWl0X25v bl9kZXNrdG9wICYmIHN0cmljdCkKPiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwo+Cj4g ICAgICAgICBpZiAoc3RyaWN0KQo+Cj4gT24gVGh1LCBNYXIgMTUsIDIwMTggYXQgMjozMCBQTSwg S2VpdGggUGFja2FyZCA8a2VpdGhwQGtlaXRocC5jb20+IHdyb3RlOgo+PiBDaGFybGVzIExvaHIg PGxvaHI4NUBnbWFpbC5jb20+IHdyaXRlczoKPj4KPj4+IEV2ZW4gaWYgdGhlIHZpdmUgaXMgdGhl IG9ubHkgZGV2aWNlIGNvbm5lY3RlZCwgaXQgd2lsbCBzdGlsbCBub3QgcGVybWl0IGl0Cj4+PiB0 byBiZSBvcGVyYXRlZC4gIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbGludXgtc3VueGkvbGludXgt c3VueGkvaXNzdWVzLzI5MQo+Pj4gZm9yIGRyaSB3aXRoIGEgbG90IG9mIGRlYnVnZ2luZyB0dXJu ZWQgb24uCj4+Cj4+IE9oLCBpdCdzIG5vdCBzdXBwb3NlZCB0byBkbyB0aGF0LiBJIGhhZCBpbnRl bmRlZCB0byB3cml0ZSB0aGUgY29kZSBzbwo+PiB0aGF0IGlmIHRoZSBvbmx5IGRldmljZSBhdmFp bGFibGUgd2FzIGEgbm9uLWRlc2t0b3AgZGV2aWNlIHRoYXQgaXQgd291bGQKPj4gZ28gYWhlYWQg YW5kIHVzZSBpdC4gVGhlIFggc2VydmVyIHBhdGNoZXMgZGlkIHRoYXQsIGJ1dCB0aGUga2VybmVs IG9uZXMKPj4gZGlkIG5vdC4gSXQgbG9va3MgbGlrZSB0aGF0IHdvdWxkIGJlIGFuIGVhc3kgcGF0 Y2ggLS0ganVzdCBza2lwIHRoZQo+PiBub25fZGVza3RvcCBjaGVjayBpbiB0aGUgIXN0cmljdCBj YXNlIGZvciBkcm1fY29ubmVjdG9yX2VuYWJsZWQuCj4+Cj4+IEhvd2V2ZXIsIHlvdXIgcGF0Y2gg aXMgYSBnb29kIGFkZGl0aW9uIGFzIGl0IHdpbGwgYWxsb3cgeW91IHRvIGFsc28KPj4gZW5hYmxl IHRoZSBITUQgd2hlbiBvdGhlciBtb25pdG9ycyBhcmUgY29ubmVjdGVkLgo+Pgo+Pj4gSSBjYW4g dW5kZXJzdGFuZCB0aGF0IG1vc3QgdXNlcnMgd291bGQgcHJvYmFibHkgcHJlZmVyIHRoYXQgdGhl IHZpdmUgaXNuJ3QKPj4+IGF1dG9tYXRpY2FsbHkgdXNlZCBpZiBubyBvdGhlciBkaXNwbGF5cyBh cmUgYXZhaWxhYmxlLCBob3dldmVyLCB0aGUgY3VycmVudAo+Pj4gYmVoYXZpb3IgcHJldmVudHMg dXNlIG9mIHRoZSB2aXZlIG9uIGFsbCBkZXZpY2VzIHRoYXQgdXNlIGZiZGV2IGZvciB0aGVpcgo+ Pj4gcHJpbWFyeSBvdXRwdXQuCj4+Cj4+IFRoYXQgd2FzIGRlZmluaXRlbHkgbm90IG15IGludGVu dGlvbiwgYW5kIHRoYW5rcyBmb3IgZGlzY292ZXJpbmcgdGhpcyEKPj4KPj4+IEkndmUgbmV2ZXIg c2VudCBhbiBlbWFpbCB0byB0aGUga2VybmVsIGRldmVsIGxpc3QsIHNvIEknbSBzdGlsbCBhIGxp dHRsZQo+Pj4gbmVydm91cy4gIEVzcGVjaWFsbHkgYmVjYXVzZSB0aGlzIGlzIGFnYWluc3QgYSBk aWZmZXJlbnQgYnJhbmNoLCBhbmQgSSdtCj4+PiBzdGFydGluZyB0byB0aGluayB0aGF0IEkgc2hv dWxkIGJlIG1lc3NhZ2luZyB0aGVyZSwgYnV0IHRoaXMgaXMgc29tZXRoaW5nCj4+PiB0aGF0IHJl YWxseSBuZWVkcyB0byBnbyB1cHN0cmVhbS4KPj4KPj4gV2UnbGwgZ2V0IGl0IHNvcnRlZCBvdXQ7 IEknbSBub3Qgc3VyZSB3aGF0IERhdmUncyBwcmVmZXJlbmNlIGlzIHRoZXNlCj4+IGRheXMgYW55 d2F5cy4KPj4KPj4gQXNpZGUgZnJvbSBzb21lIG1pbm9yIGZvcm1hdHRpbmcgaXNzdWVzLCB0aGlz IHBhdGNoIGxvb2tzIGdvb2QgdG8gbWUuCj4+Cj4+PiBTaWduZWQtb2ZmLWJ5Ogo+Pgo+PiBZb3Un bGwgbmVlZCB0byBhZGQgeW91ciBuYW1lIGFuZCBlbWFpbCBhZGRyZXNzIGhlcmUuCj4+Cj4+PiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYwo+Pj4gYi9kcml2ZXJz L2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCj4+PiBpbmRleCAwMzU3ODRkZGQuLjhiZmFmNzlmZiAx MDA2NDQKPj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMKPj4+ICsrKyBi L2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMKPj4+IEBAIC01NSw2ICs1NSwxMSBAQCBN T0RVTEVfUEFSTV9ERVNDKGRybV9mYmRldl9vdmVyYWxsb2MsCj4+PiAgICAgICAgICAgICAgICAg ICJPdmVyYWxsb2NhdGlvbiBvZiB0aGUgZmJkZXYgYnVmZmVyICglKSBbZGVmYXVsdD0iCj4+PiAg ICAgICAgICAgICAgICAgIF9fTU9EVUxFX1NUUklORyhDT05GSUdfRFJNX0ZCREVWX09WRVJBTExP QykgIl0iKTsKPj4+Cj4+PiArc3RhdGljIGJvb2wgZHJtX2ZiZGV2X3Blcm1pdF9ub25fZGVza3Rv cDsKPj4+ICttb2R1bGVfcGFyYW0oZHJtX2ZiZGV2X3Blcm1pdF9ub25fZGVza3RvcCwgYm9vbCwg MDY0NCk7Cj4+PiArTU9EVUxFX1BBUk1fREVTQyhkcm1fZmJkZXZfcGVybWl0X25vbl9kZXNrdG9w LAo+Pj4gKyAgICAgICAgICAgICAgICJBbGxvdyB0aGUgZnJhbWVidWZmZXIgdG8gdXNlIG5vbi1k ZXNrdG9wIGRpc3BsYXlzCj4+PiBbZGVmYXVsdD1vZmZdIik7Cj4+PiArCj4+Cj4+IFlvdXIgZW1h aWwgY2xpZW50IGFwcGVhcnMgdG8gYmUgd3JhcHBpbmcgbG9uZyBsaW5lcywgd2hpY2ggYnJlYWtz IHRoZSBwYXRjaC4KPj4KPj4KPj4+ICBzdGF0aWMgTElTVF9IRUFEKGtlcm5lbF9mYl9oZWxwZXJf bGlzdCk7Cj4+PiAgc3RhdGljIERFRklORV9NVVRFWChrZXJuZWxfZmJfaGVscGVyX2xvY2spOwo+ Pj4KPj4+IEBAIC0yMTA5LDcgKzIxMTQsNyBAQCBzdGF0aWMgYm9vbCBkcm1fY29ubmVjdG9yX2Vu YWJsZWQoc3RydWN0Cj4+PiBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGJvb2wgc3RyaWN0KQo+ Pj4gIHsKPj4+ICAgICAgICAgYm9vbCBlbmFibGU7Cj4+Pgo+Pj4gLSAgICAgICBpZiAoY29ubmVj dG9yLT5kaXNwbGF5X2luZm8ubm9uX2Rlc2t0b3ApCj4+PiArICAgICAgIGlmIChjb25uZWN0b3It PmRpc3BsYXlfaW5mby5ub25fZGVza3RvcCAmJgo+Pj4gIWRybV9mYmRldl9wZXJtaXRfbm9uX2Rl c2t0b3ApCj4+Cj4+IElmIHlvdSBhZGRlZCAnJiYgc3RyaWN0JyBoZXJlLCBpdCB3aWxsIHVzZSB0 aGUgSE1EIGlmIHRoZXJlIGFyZW4ndCBhbnkKPj4gZGVza3RvcCBtb25pdG9ycyBjb25uZWN0ZWQu Cj4+Cj4+IC0tCj4+IC1rZWl0aAoKCgotLSAKRGFuaWVsIFZldHRlcgpTb2Z0d2FyZSBFbmdpbmVl ciwgSW50ZWwgQ29ycG9yYXRpb24KKzQxICgwKSA3OSAzNjUgNTcgNDggLSBodHRwOi8vYmxvZy5m ZndsbC5jaApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpk cmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0 cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK