From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com ([134.134.136.24]:1133 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755595AbcCPT7q (ORCPT ); Wed, 16 Mar 2016 15:59:46 -0400 Date: Wed, 16 Mar 2016 21:59:41 +0200 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= To: Lyude Paul Cc: intel-gfx@lists.freedesktop.org, Rob Clark , "open list:INTEL DRM DRIVERS excluding Poulsbo, Moorestow..., linux-kernel@vger.kernel.org open list" , stable@vger.kernel.org, Daniel Vetter Subject: Re: [PATCH] drm/i915: Fix race condition in intel_dp_destroy_mst_connector() Message-ID: <20160316195941.GV4329@intel.com> References: <1458155884-13877-1-git-send-email-cpaul@redhat.com> <20160316193949.GU4329@intel.com> <1458157477.9055.4.camel@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1458157477.9055.4.camel@redhat.com> Sender: stable-owner@vger.kernel.org List-ID: On Wed, Mar 16, 2016 at 03:44:37PM -0400, Lyude Paul wrote: > On Wed, 2016-03-16 at 21:39 +0200, Ville Syrj�l� wrote: > > On Wed, Mar 16, 2016 at 03:18:04PM -0400, Lyude wrote: > > > > > > After unplugging a DP MST display from the system, we have to go through > > > and destroy all of the DRM connectors associated with it since none of > > > them are valid anymore. Unfortunately, intel_dp_destroy_mst_connector() > > > doesn't do a good enough job of ensuring that throughout the destruction > > > process that no modesettings can be done with the connectors. As it is > > > right now, intel_dp_destroy_mst_connector() works like this: > > > > > > * Take all modeset locks > > > * Clear the configuration of the crtc on the connector, if there is one > > > * Drop all modeset locks, this is required because of circular > > > � dependency issues that arise with trying to remove the connector from > > > � sysfs with modeset locks held > > > * Unregister the connector > > > * Take all modeset locks, again > > > * Do the rest of the required cleaning for destroying the connector > > > * Finally drop all modeset locks for good > > So pretty much what I suspected > > https://lists.freedesktop.org/archives/intel-gfx/2016-February/087734.html > > > > > > > > > > > This only works sometimes. During the destruction process, it's very > > > possible that a userspace application will attempt to do a modesetting > > > using the connector. When we drop the modeset locks, an ioctl handler > > > such as drm_mode_setcrtc has the oppurtunity to take all of the modeset > > > locks from us. When this happens, one thing leads to another and > > > eventually we end up committing a mode with the non-existent connector: > > > > > > [drm:intel_dp_link_training_clock_recovery [i915]] *ERROR* failed to > > > enable link training > > > [drm:intel_dp_aux_ch] dp_aux_ch timeout status 0x7cf0001f > > > [drm:intel_dp_start_link_train [i915]] *ERROR* failed to start channel > > > equalization > > > [drm:intel_dp_aux_ch] dp_aux_ch timeout status 0x7cf0001f > > > [drm:intel_mst_pre_enable_dp [i915]] *ERROR* failed to allocate vcpi > > > > > > And in some cases, such as with the T460s using an MST dock, this > > > results in breaking modesetting and/or panicking the system. > > Are these just kernel oopses etc.? If the hardware gets upset from > > modesetting when the sink is gone, well, then we still have a problem > > because the user can of course yank the cable while the modeset is already > > underway. > It is more then that. Unfortunately though, fixing that part is not as easy. We > never expect an atomic modesetting commit to fail, but unfortunately any code > having to do with turning on DP MST has the chance of failing and we turn on DP > MST during commits. So fixing that would take moving quite a bit of code around. SST has the same problems really. The sink may be gone so link training etc. just won't succeed. But we should still finish the modeset without killing the system or something. > > > > > > > > > > > > To work around this, we now unregister the connector at the very > > > beginning of intel_dp_destroy_mst_connector(), grab all the modesetting > > > locks, and then hold them until we finish the rest of the function. > > > > > > CC: stable@vger.kernel.org > > > Signed-off-by: Lyude > > > Signed-off-by: Rob Clark > > These sobs don't make much sense to me. > I should have mentioned that Rob Clark was the one who came up with the idea of > just moving the connector->unregister() call to the top of the function. > > > > > Patch itself does make sense to me, so� > > Reviewed-by: Ville Syrj�l� > > > > > > > > --- > > > �drivers/gpu/drm/i915/intel_dp_mst.c | 6 ++---- > > > �1 file changed, 2 insertions(+), 4 deletions(-) > > > > > > diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c > > > b/drivers/gpu/drm/i915/intel_dp_mst.c > > > index fa0dabf..b21ac88 100644 > > > --- a/drivers/gpu/drm/i915/intel_dp_mst.c > > > +++ b/drivers/gpu/drm/i915/intel_dp_mst.c > > > @@ -499,6 +499,8 @@ static void intel_dp_destroy_mst_connector(struct > > > drm_dp_mst_topology_mgr *mgr, > > > � struct intel_connector *intel_connector = > > > to_intel_connector(connector); > > > � struct drm_device *dev = connector->dev; > > > � > > > + intel_connector->unregister(intel_connector); > > > + > > > � /* need to nuke the connector */ > > > � drm_modeset_lock_all(dev); > > > � if (connector->state->crtc) { > > > @@ -512,11 +514,7 @@ static void intel_dp_destroy_mst_connector(struct > > > drm_dp_mst_topology_mgr *mgr, > > > � > > > � WARN(ret, "Disabling mst crtc failed with %i\n", ret); > > > � } > > > - drm_modeset_unlock_all(dev); > > > � > > > - intel_connector->unregister(intel_connector); > > > - > > > - drm_modeset_lock_all(dev); > > > � intel_connector_remove_from_fbdev(intel_connector); > > > � drm_connector_cleanup(connector); > > > � drm_modeset_unlock_all(dev); > > > --� > > > 2.5.0 > > > > > > _______________________________________________ > > > dri-devel mailing list > > > dri-devel@lists.freedesktop.org > > > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Ville Syrj�l� Intel OTC From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Subject: Re: [PATCH] drm/i915: Fix race condition in intel_dp_destroy_mst_connector() Date: Wed, 16 Mar 2016 21:59:41 +0200 Message-ID: <20160316195941.GV4329@intel.com> References: <1458155884-13877-1-git-send-email-cpaul@redhat.com> <20160316193949.GU4329@intel.com> <1458157477.9055.4.camel@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <1458157477.9055.4.camel@redhat.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Lyude Paul Cc: Daniel Vetter , intel-gfx@lists.freedesktop.org, Rob Clark , stable@vger.kernel.org, "open list:INTEL DRM DRIVERS excluding Poulsbo, Moorestow..., linux-kernel@vger.kernel.org open list" List-Id: dri-devel@lists.freedesktop.org T24gV2VkLCBNYXIgMTYsIDIwMTYgYXQgMDM6NDQ6MzdQTSAtMDQwMCwgTHl1ZGUgUGF1bCB3cm90 ZToKPiBPbiBXZWQsIDIwMTYtMDMtMTYgYXQgMjE6MzkgKzAyMDAsIFZpbGxlIFN5cmrDpGzDpCB3 cm90ZToKPiA+IE9uIFdlZCwgTWFyIDE2LCAyMDE2IGF0IDAzOjE4OjA0UE0gLTA0MDAsIEx5dWRl IHdyb3RlOgo+ID4gPiAKPiA+ID4gQWZ0ZXIgdW5wbHVnZ2luZyBhIERQIE1TVCBkaXNwbGF5IGZy b20gdGhlIHN5c3RlbSwgd2UgaGF2ZSB0byBnbyB0aHJvdWdoCj4gPiA+IGFuZCBkZXN0cm95IGFs bCBvZiB0aGUgRFJNIGNvbm5lY3RvcnMgYXNzb2NpYXRlZCB3aXRoIGl0IHNpbmNlIG5vbmUgb2YK PiA+ID4gdGhlbSBhcmUgdmFsaWQgYW55bW9yZS4gVW5mb3J0dW5hdGVseSwgaW50ZWxfZHBfZGVz dHJveV9tc3RfY29ubmVjdG9yKCkKPiA+ID4gZG9lc24ndCBkbyBhIGdvb2QgZW5vdWdoIGpvYiBv ZiBlbnN1cmluZyB0aGF0IHRocm91Z2hvdXQgdGhlIGRlc3RydWN0aW9uCj4gPiA+IHByb2Nlc3Mg dGhhdCBubyBtb2Rlc2V0dGluZ3MgY2FuIGJlIGRvbmUgd2l0aCB0aGUgY29ubmVjdG9ycy4gQXMg aXQgaXMKPiA+ID4gcmlnaHQgbm93LCBpbnRlbF9kcF9kZXN0cm95X21zdF9jb25uZWN0b3IoKSB3 b3JrcyBsaWtlIHRoaXM6Cj4gPiA+IAo+ID4gPiAqIFRha2UgYWxsIG1vZGVzZXQgbG9ja3MKPiA+ ID4gKiBDbGVhciB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgY3J0YyBvbiB0aGUgY29ubmVjdG9y LCBpZiB0aGVyZSBpcyBvbmUKPiA+ID4gKiBEcm9wIGFsbCBtb2Rlc2V0IGxvY2tzLCB0aGlzIGlz IHJlcXVpcmVkIGJlY2F1c2Ugb2YgY2lyY3VsYXIKPiA+ID4gwqAgZGVwZW5kZW5jeSBpc3N1ZXMg dGhhdCBhcmlzZSB3aXRoIHRyeWluZyB0byByZW1vdmUgdGhlIGNvbm5lY3RvciBmcm9tCj4gPiA+ IMKgIHN5c2ZzIHdpdGggbW9kZXNldCBsb2NrcyBoZWxkCj4gPiA+ICogVW5yZWdpc3RlciB0aGUg Y29ubmVjdG9yCj4gPiA+ICogVGFrZSBhbGwgbW9kZXNldCBsb2NrcywgYWdhaW4KPiA+ID4gKiBE byB0aGUgcmVzdCBvZiB0aGUgcmVxdWlyZWQgY2xlYW5pbmcgZm9yIGRlc3Ryb3lpbmcgdGhlIGNv bm5lY3Rvcgo+ID4gPiAqIEZpbmFsbHkgZHJvcCBhbGwgbW9kZXNldCBsb2NrcyBmb3IgZ29vZAo+ ID4gU28gcHJldHR5IG11Y2ggd2hhdCBJIHN1c3BlY3RlZAo+ID4gaHR0cHM6Ly9saXN0cy5mcmVl ZGVza3RvcC5vcmcvYXJjaGl2ZXMvaW50ZWwtZ2Z4LzIwMTYtRmVicnVhcnkvMDg3NzM0Lmh0bWwK PiA+IAo+ID4gPiAKPiA+ID4gCj4gPiA+IFRoaXMgb25seSB3b3JrcyBzb21ldGltZXMuIER1cmlu ZyB0aGUgZGVzdHJ1Y3Rpb24gcHJvY2VzcywgaXQncyB2ZXJ5Cj4gPiA+IHBvc3NpYmxlIHRoYXQg YSB1c2Vyc3BhY2UgYXBwbGljYXRpb24gd2lsbCBhdHRlbXB0IHRvIGRvIGEgbW9kZXNldHRpbmcK PiA+ID4gdXNpbmcgdGhlIGNvbm5lY3Rvci4gV2hlbiB3ZSBkcm9wIHRoZSBtb2Rlc2V0IGxvY2tz LCBhbiBpb2N0bCBoYW5kbGVyCj4gPiA+IHN1Y2ggYXMgZHJtX21vZGVfc2V0Y3J0YyBoYXMgdGhl IG9wcHVydHVuaXR5IHRvIHRha2UgYWxsIG9mIHRoZSBtb2Rlc2V0Cj4gPiA+IGxvY2tzIGZyb20g dXMuIFdoZW4gdGhpcyBoYXBwZW5zLCBvbmUgdGhpbmcgbGVhZHMgdG8gYW5vdGhlciBhbmQKPiA+ ID4gZXZlbnR1YWxseSB3ZSBlbmQgdXAgY29tbWl0dGluZyBhIG1vZGUgd2l0aCB0aGUgbm9uLWV4 aXN0ZW50IGNvbm5lY3RvcjoKPiA+ID4gCj4gPiA+IAlbZHJtOmludGVsX2RwX2xpbmtfdHJhaW5p bmdfY2xvY2tfcmVjb3ZlcnkgW2k5MTVdXSAqRVJST1IqIGZhaWxlZCB0bwo+ID4gPiBlbmFibGUg bGluayB0cmFpbmluZwo+ID4gPiAJW2RybTppbnRlbF9kcF9hdXhfY2hdIGRwX2F1eF9jaCB0aW1l b3V0IHN0YXR1cyAweDdjZjAwMDFmCj4gPiA+IAlbZHJtOmludGVsX2RwX3N0YXJ0X2xpbmtfdHJh aW4gW2k5MTVdXSAqRVJST1IqIGZhaWxlZCB0byBzdGFydCBjaGFubmVsCj4gPiA+IGVxdWFsaXph dGlvbgo+ID4gPiAJW2RybTppbnRlbF9kcF9hdXhfY2hdIGRwX2F1eF9jaCB0aW1lb3V0IHN0YXR1 cyAweDdjZjAwMDFmCj4gPiA+IAlbZHJtOmludGVsX21zdF9wcmVfZW5hYmxlX2RwIFtpOTE1XV0g KkVSUk9SKiBmYWlsZWQgdG8gYWxsb2NhdGUgdmNwaQo+ID4gPiAKPiA+ID4gQW5kIGluIHNvbWUg Y2FzZXMsIHN1Y2ggYXMgd2l0aCB0aGUgVDQ2MHMgdXNpbmcgYW4gTVNUIGRvY2ssIHRoaXMKPiA+ ID4gcmVzdWx0cyBpbiBicmVha2luZyBtb2Rlc2V0dGluZyBhbmQvb3IgcGFuaWNraW5nIHRoZSBz eXN0ZW0uCj4gPiBBcmUgdGhlc2UganVzdCBrZXJuZWwgb29wc2VzIGV0Yy4/IElmIHRoZSBoYXJk d2FyZSBnZXRzIHVwc2V0IGZyb20KPiA+IG1vZGVzZXR0aW5nIHdoZW4gdGhlIHNpbmsgaXMgZ29u ZSwgd2VsbCwgdGhlbiB3ZSBzdGlsbCBoYXZlIGEgcHJvYmxlbQo+ID4gYmVjYXVzZSB0aGUgdXNl ciBjYW4gb2YgY291cnNlIHlhbmsgdGhlIGNhYmxlIHdoaWxlIHRoZSBtb2Rlc2V0IGlzIGFscmVh ZHkKPiA+IHVuZGVyd2F5Lgo+IEl0IGlzIG1vcmUgdGhlbiB0aGF0LiBVbmZvcnR1bmF0ZWx5IHRo b3VnaCwgZml4aW5nIHRoYXQgcGFydCBpcyBub3QgYXMgZWFzeS4gV2UKPiBuZXZlciBleHBlY3Qg YW4gYXRvbWljIG1vZGVzZXR0aW5nIGNvbW1pdCB0byBmYWlsLCBidXQgdW5mb3J0dW5hdGVseSBh bnkgY29kZQo+IGhhdmluZyB0byBkbyB3aXRoIHR1cm5pbmcgb24gRFAgTVNUIGhhcyB0aGUgY2hh bmNlIG9mIGZhaWxpbmcgYW5kIHdlIHR1cm4gb24gRFAKPiBNU1QgZHVyaW5nIGNvbW1pdHMuIFNv IGZpeGluZyB0aGF0IHdvdWxkIHRha2UgbW92aW5nIHF1aXRlIGEgYml0IG9mIGNvZGUgYXJvdW5k LgoKU1NUIGhhcyB0aGUgc2FtZSBwcm9ibGVtcyByZWFsbHkuIFRoZSBzaW5rIG1heSBiZSBnb25l IHNvIGxpbmsgdHJhaW5pbmcKZXRjLiBqdXN0IHdvbid0IHN1Y2NlZWQuIEJ1dCB3ZSBzaG91bGQg c3RpbGwgZmluaXNoIHRoZSBtb2Rlc2V0IHdpdGhvdXQKa2lsbGluZyB0aGUgc3lzdGVtIG9yIHNv bWV0aGluZy4KCj4gCj4gPiAKPiA+ID4gCj4gPiA+IAo+ID4gPiBUbyB3b3JrIGFyb3VuZCB0aGlz LCB3ZSBub3cgdW5yZWdpc3RlciB0aGUgY29ubmVjdG9yIGF0IHRoZSB2ZXJ5Cj4gPiA+IGJlZ2lu bmluZyBvZiBpbnRlbF9kcF9kZXN0cm95X21zdF9jb25uZWN0b3IoKSwgZ3JhYiBhbGwgdGhlIG1v ZGVzZXR0aW5nCj4gPiA+IGxvY2tzLCBhbmQgdGhlbiBob2xkIHRoZW0gdW50aWwgd2UgZmluaXNo IHRoZSByZXN0IG9mIHRoZSBmdW5jdGlvbi4KPiA+ID4gCj4gPiA+IENDOiBzdGFibGVAdmdlci5r ZXJuZWwub3JnCj4gPiA+IFNpZ25lZC1vZmYtYnk6IEx5dWRlIDxjcGF1bEByZWRoYXQuY29tPgo+ ID4gPiBTaWduZWQtb2ZmLWJ5OiBSb2IgQ2xhcmsgPHJjbGFya0ByZWRoYXQuY29tPgo+ID4gVGhl c2Ugc29icyBkb24ndCBtYWtlIG11Y2ggc2Vuc2UgdG8gbWUuCj4gSSBzaG91bGQgaGF2ZSBtZW50 aW9uZWQgdGhhdCBSb2IgQ2xhcmsgd2FzIHRoZSBvbmUgd2hvIGNhbWUgdXAgd2l0aCB0aGUgaWRl YSBvZgo+IGp1c3QgbW92aW5nIHRoZSBjb25uZWN0b3ItPnVucmVnaXN0ZXIoKSBjYWxsIHRvIHRo ZSB0b3Agb2YgdGhlIGZ1bmN0aW9uLgo+IAo+ID4gCj4gPiBQYXRjaCBpdHNlbGYgZG9lcyBtYWtl IHNlbnNlIHRvIG1lLCBzb8KgCj4gPiBSZXZpZXdlZC1ieTogVmlsbGUgU3lyasOkbMOkIDx2aWxs ZS5zeXJqYWxhQGxpbnV4LmludGVsLmNvbT4KPiA+IAo+ID4gPiAKPiA+ID4gLS0tCj4gPiA+IMKg ZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHBfbXN0LmMgfCA2ICsrLS0tLQo+ID4gPiDCoDEg ZmlsZSBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDQgZGVsZXRpb25zKC0pCj4gPiA+IAo+ID4g PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHBfbXN0LmMKPiA+ID4g Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcF9tc3QuYwo+ID4gPiBpbmRleCBmYTBkYWJm Li5iMjFhYzg4IDEwMDY0NAo+ID4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9k cF9tc3QuYwo+ID4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcF9tc3QuYwo+ ID4gPiBAQCAtNDk5LDYgKzQ5OSw4IEBAIHN0YXRpYyB2b2lkIGludGVsX2RwX2Rlc3Ryb3lfbXN0 X2Nvbm5lY3RvcihzdHJ1Y3QKPiA+ID4gZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKPiA+ ID4gwqAJc3RydWN0IGludGVsX2Nvbm5lY3RvciAqaW50ZWxfY29ubmVjdG9yID0KPiA+ID4gdG9f aW50ZWxfY29ubmVjdG9yKGNvbm5lY3Rvcik7Cj4gPiA+IMKgCXN0cnVjdCBkcm1fZGV2aWNlICpk ZXYgPSBjb25uZWN0b3ItPmRldjsKPiA+ID4gwqAKPiA+ID4gKwlpbnRlbF9jb25uZWN0b3ItPnVu cmVnaXN0ZXIoaW50ZWxfY29ubmVjdG9yKTsKPiA+ID4gKwo+ID4gPiDCoAkvKiBuZWVkIHRvIG51 a2UgdGhlIGNvbm5lY3RvciAqLwo+ID4gPiDCoAlkcm1fbW9kZXNldF9sb2NrX2FsbChkZXYpOwo+ ID4gPiDCoAlpZiAoY29ubmVjdG9yLT5zdGF0ZS0+Y3J0Yykgewo+ID4gPiBAQCAtNTEyLDExICs1 MTQsNyBAQCBzdGF0aWMgdm9pZCBpbnRlbF9kcF9kZXN0cm95X21zdF9jb25uZWN0b3Ioc3RydWN0 Cj4gPiA+IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCj4gPiA+IMKgCj4gPiA+IMKgCQlX QVJOKHJldCwgIkRpc2FibGluZyBtc3QgY3J0YyBmYWlsZWQgd2l0aCAlaVxuIiwgcmV0KTsKPiA+ ID4gwqAJfQo+ID4gPiAtCWRybV9tb2Rlc2V0X3VubG9ja19hbGwoZGV2KTsKPiA+ID4gwqAKPiA+ ID4gLQlpbnRlbF9jb25uZWN0b3ItPnVucmVnaXN0ZXIoaW50ZWxfY29ubmVjdG9yKTsKPiA+ID4g LQo+ID4gPiAtCWRybV9tb2Rlc2V0X2xvY2tfYWxsKGRldik7Cj4gPiA+IMKgCWludGVsX2Nvbm5l Y3Rvcl9yZW1vdmVfZnJvbV9mYmRldihpbnRlbF9jb25uZWN0b3IpOwo+ID4gPiDCoAlkcm1fY29u bmVjdG9yX2NsZWFudXAoY29ubmVjdG9yKTsKPiA+ID4gwqAJZHJtX21vZGVzZXRfdW5sb2NrX2Fs bChkZXYpOwo+ID4gPiAtLcKgCj4gPiA+IDIuNS4wCj4gPiA+IAo+ID4gPiBfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+ID4gPiBkcmktZGV2ZWwgbWFpbGlu ZyBsaXN0Cj4gPiA+IGRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKPiA+ID4gaHR0cHM6 Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwKCi0tIApW aWxsZSBTeXJqw6Rsw6QKSW50ZWwgT1RDCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZy ZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2RyaS1kZXZlbAo=