From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 006BA3B42C7 for ; Fri, 10 Jul 2026 21:15:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783718153; cv=none; b=qYohTOR3/yBMBvSZTtbEzcqRE45IsZ/85liabgZdEU3DvpFjAu7mZacSYPdiQ/V5UPd123/cwNtV7QnBY533DCxcmspFoDDiR/L5rgTHve2eA2H7ohn6Bvijs8lRmnwcp5d4FurR3UBFHAAwr4oaReTUhskSCMOFembuDZK0vh0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783718153; c=relaxed/simple; bh=KekjYWrvHsyyFrfwRPkNMqJv9lT9xl0+lnZ6hkbiJ/M=; h=From:Subject:To:Cc:In-Reply-To:References:Content-Type:Date: Message-Id; b=Edq239gus81TSRu3JnN4lQgyxkg/RsMfwob2DF53iUrndXdJoq+3t7u0Tz01BtFag1PnMA6h4BqbTmxIhzpQTP1gi1WdNUWjlsSmQp6+jBW3C1+F49iPv8CqJyONkcgKH4PPLAUIYD5GJ28a9oLNx+wX6Obga1Hoo7zEnclNwc8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bW1nQwT8; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="bW1nQwT8" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 002EC1F000E9; Fri, 10 Jul 2026 21:15:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783718150; bh=S4w/WzBaC7XVHQOu7BfUI05BFXtmiNaIGkXXpWGnD8Y=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=bW1nQwT867HW/ulHPL3M9leiG9e+sWZtus+lPvDFb1ttCR43sjNI7sBbnrb7r/NsC BC390hqYIC70H1NYocMiVJEFXyEuP3G9i10v4sFtYK+9i0tnliiOTJaTdlvKJIjeWs 757dAEtU28PqfmKU48az24/x1Ma5Eh+AWdvXH7yVfJ3hQFuFEZ8EISOnF8WshNYThe /g2DT8t45X9KGDbeLN71ZZH0YwtKnPFiyDoauNYkYCwawMZYiVNKHmGnGuxYqavpcQ T1G38GcZqvgdJ1QIRhg1Tja/X3kO9Z43c+TpgorOA50C22caSCLBGBzeb0TVTwojAZ UogJQQxoBY2KA== From: sashiko-bot@kernel.org Subject: Re: [PATCH v12 19/36] phy: rockchip: usbdp: Re-init the PHY on orientation change Reply-To: sashiko-reviews@lists.linux.dev To: "Sebastian Reichel" Cc: robh@kernel.org, vkoul@kernel.org, conor+dt@kernel.org, olteanv@gmail.com, linux-phy@lists.infradead.org, neil.armstrong@linaro.org, devicetree@vger.kernel.org In-Reply-To: <20260710-rockchip-usbdp-cleanup-v12-19-8b41a9a9bef0@collabora.com> References: <20260710-rockchip-usbdp-cleanup-v12-0-8b41a9a9bef0@collabora.com> <20260710-rockchip-usbdp-cleanup-v12-19-8b41a9a9bef0@collabora.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Fri, 10 Jul 2026 21:15:49 +0000 Message-Id: <20260710211550.002EC1F000E9@smtp.kernel.org> Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Thank you for your contribution! Sashiko AI review found 2 potential issue(= s) to consider: Pre-existing issues: - [High] Deferred hardware initialization via `phy_needs_reinit` fixes Disp= layPort but leaves USB-only replugs broken if the USB PHY remains powered o= n. - [Medium] The function `rk_udphy_dp_phy_configure` accesses shared states = locklessly, leading to a data race with concurrent orientation switches. -- --- Patch [19]: [PATCH v12 19/36] phy: rockchip: usbdp: Re-init the PHY on = orientation change --- commit c45d3419a6f4b9509b416ffd7965a918e7fad8e4 Author: Sebastian Reichel phy: rockchip: usbdp: Re-init the PHY on orientation change Changing the cable orientation reconfigures the lane muxing, which requires re-initializing the PHY. The patch introduces a flag to trigger PHY re-initialization upon orientation change. > diff --git a/drivers/phy/rockchip/phy-rockchip-usbdp.c b/drivers/phy/rock= chip/phy-rockchip-usbdp.c > index e44d19c9d1193..4b454798c4ed4 100644 > --- a/drivers/phy/rockchip/phy-rockchip-usbdp.c > +++ b/drivers/phy/rockchip/phy-rockchip-usbdp.c > @@ -620,6 +620,7 @@ static int rk_udphy_orien_sw_set(struct typec_switch_= dev *sw, > enum typec_orientation orien) > { > struct rk_udphy *udphy =3D typec_switch_get_drvdata(sw); > + bool flipped =3D orien =3D=3D TYPEC_ORIENTATION_REVERSE; > =20 > mutex_lock(&udphy->mutex); > =20 [ ... ] > @@ -631,7 +632,10 @@ static int rk_udphy_orien_sw_set(struct typec_switch= _dev *sw, > goto unlock_ret; > } > =20 > - udphy->flip =3D orien =3D=3D TYPEC_ORIENTATION_REVERSE; > + if (udphy->flip !=3D flipped) > + udphy->phy_needs_reinit =3D true; [Severity: High] This is a pre-existing issue, but does this deferred initialization handle USB-only replugs correctly if the USB PHY remains powered on? When a user unplugs and replugs a Type-C cable, this sets udphy->phy_needs_reinit =3D true. However, in configurations where the DWC3 controller remains active (e.g., fixed host mode) or during rapid replugs, the USB controller doesn't restart and thus never calls phy_init() again. Because rk_udphy_usb3_phy_ops only implements .init and has no .power_on callback, rk_udphy_power_on() is never invoked to process the deferred initialization flag: drivers/phy/rockchip/phy-rockchip-usbdp.c:rk_udphy_power_on() { ... } else if (udphy->phy_needs_reinit) { ... ret =3D rk_udphy_init(udphy); ... } Will this cause the USB SuperSpeed connection to fail to train if the cable is inserted in reverse orientation? > + > + udphy->flip =3D flipped; > rk_udphy_set_typec_default_mapping(udphy); [Severity: Medium] This is a pre-existing issue, but can this lead to a data race with concurr= ent orientation switches? While rk_udphy_orien_sw_set() acquires udphy->mutex and updates the shared = lane and mux selections here via rk_udphy_set_typec_default_mapping(), rk_udphy_dp_phy_configure() iterates over and accesses the shared lane state locklessly: drivers/phy/rockchip/phy-rockchip-usbdp.c:rk_udphy_dp_phy_configure() { ... for (i =3D 0; i < udphy->lanes; i++) { lane =3D udphy->dp_lane_sel[i]; ... udphy->lane_mux_sel[lane])); ... } Could this cause rk_udphy_dp_phy_configure() to read partially updated arra= ys if the DP controller triggers link training concurrently with an orientation change? > rk_udphy_usb_bvalid_enable(udphy, true); > --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20260710-rockchip-u= sbdp-cleanup-v12-0-8b41a9a9bef0@collabora.com?part=3D19 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 1D5B8C43458 for ; Fri, 10 Jul 2026 21:15:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Reply-To:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Message-Id:Date: References:In-Reply-To:Cc:To:Subject:From:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=tkwT/Anii04dG60laIvnWVO6AaL+CgYG3RsHTgn3990=; b=ewGTneIW/9hX2b ojivWKKFYuk4SFbUL+fkEs8x3fx4jXYT6j9U0xdMqJYZYSwzNlc8LqHqM05fVILU3YE//Q0dJt+uR oVBLMFS9yJ5QSQ7GLNI+YetBue8WwO5WwCv53ZeN+eheoLA8ikg1CfpGxzIVieixZ6k2TohGk4a8/ QxVKV/2VGWgvaCeCJP2rAGkTnIXrFt7nUChmsu1FMuNd+JChMlDouXZxbdS04SN0QO7cVDSMzBUr9 1/QqCVw7Cl/JNZmHnxUIAsH/k1lU+riPJhXuC7eGlL88RjjARgMcARejngt26d/wCzsJKJUiHJVmn Tcts/0dKE3vgnnrX1FKA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wiIZc-00000005mpG-3Xqi; Fri, 10 Jul 2026 21:15:52 +0000 Received: from sea.source.kernel.org ([2600:3c0a:e001:78e:0:1991:8:25]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wiIZa-00000005mov-37Qs for linux-phy@lists.infradead.org; Fri, 10 Jul 2026 21:15:50 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id 8128E42A22; Fri, 10 Jul 2026 21:15:50 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 002EC1F000E9; Fri, 10 Jul 2026 21:15:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783718150; bh=S4w/WzBaC7XVHQOu7BfUI05BFXtmiNaIGkXXpWGnD8Y=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=bW1nQwT867HW/ulHPL3M9leiG9e+sWZtus+lPvDFb1ttCR43sjNI7sBbnrb7r/NsC BC390hqYIC70H1NYocMiVJEFXyEuP3G9i10v4sFtYK+9i0tnliiOTJaTdlvKJIjeWs 757dAEtU28PqfmKU48az24/x1Ma5Eh+AWdvXH7yVfJ3hQFuFEZ8EISOnF8WshNYThe /g2DT8t45X9KGDbeLN71ZZH0YwtKnPFiyDoauNYkYCwawMZYiVNKHmGnGuxYqavpcQ T1G38GcZqvgdJ1QIRhg1Tja/X3kO9Z43c+TpgorOA50C22caSCLBGBzeb0TVTwojAZ UogJQQxoBY2KA== From: sashiko-bot@kernel.org Subject: Re: [PATCH v12 19/36] phy: rockchip: usbdp: Re-init the PHY on orientation change To: "Sebastian Reichel" Cc: robh@kernel.org, vkoul@kernel.org, conor+dt@kernel.org, olteanv@gmail.com, linux-phy@lists.infradead.org, neil.armstrong@linaro.org, devicetree@vger.kernel.org In-Reply-To: <20260710-rockchip-usbdp-cleanup-v12-19-8b41a9a9bef0@collabora.com> References: <20260710-rockchip-usbdp-cleanup-v12-0-8b41a9a9bef0@collabora.com> <20260710-rockchip-usbdp-cleanup-v12-19-8b41a9a9bef0@collabora.com> Date: Fri, 10 Jul 2026 21:15:49 +0000 Message-Id: <20260710211550.002EC1F000E9@smtp.kernel.org> X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: sashiko-reviews@lists.linux.dev MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org VGhhbmsgeW91IGZvciB5b3VyIGNvbnRyaWJ1dGlvbiEgU2FzaGlrbyBBSSByZXZpZXcgZm91bmQg MiBwb3RlbnRpYWwgaXNzdWUocykgdG8gY29uc2lkZXI6CgpQcmUtZXhpc3RpbmcgaXNzdWVzOgot IFtIaWdoXSBEZWZlcnJlZCBoYXJkd2FyZSBpbml0aWFsaXphdGlvbiB2aWEgYHBoeV9uZWVkc19y ZWluaXRgIGZpeGVzIERpc3BsYXlQb3J0IGJ1dCBsZWF2ZXMgVVNCLW9ubHkgcmVwbHVncyBicm9r ZW4gaWYgdGhlIFVTQiBQSFkgcmVtYWlucyBwb3dlcmVkIG9uLgotIFtNZWRpdW1dIFRoZSBmdW5j dGlvbiBgcmtfdWRwaHlfZHBfcGh5X2NvbmZpZ3VyZWAgYWNjZXNzZXMgc2hhcmVkIHN0YXRlcyBs b2NrbGVzc2x5LCBsZWFkaW5nIHRvIGEgZGF0YSByYWNlIHdpdGggY29uY3VycmVudCBvcmllbnRh dGlvbiBzd2l0Y2hlcy4KLS0KCi0tLSBQYXRjaCBbMTldOiBbUEFUQ0ggdjEyIDE5LzM2XSBwaHk6 IHJvY2tjaGlwOiB1c2JkcDogUmUtaW5pdCB0aGUgUEhZIG9uIG9yaWVudGF0aW9uIGNoYW5nZSAt LS0KY29tbWl0IGM0NWQzNDE5YTZmNGI5NTA5YjQxNmZmZDc5NjVhOTE4ZTdmYWQ4ZTQKQXV0aG9y OiBTZWJhc3RpYW4gUmVpY2hlbCA8c2ViYXN0aWFuLnJlaWNoZWxAY29sbGFib3JhLmNvbT4KCnBo eTogcm9ja2NoaXA6IHVzYmRwOiBSZS1pbml0IHRoZSBQSFkgb24gb3JpZW50YXRpb24gY2hhbmdl CgpDaGFuZ2luZyB0aGUgY2FibGUgb3JpZW50YXRpb24gcmVjb25maWd1cmVzIHRoZSBsYW5lIG11 eGluZywgd2hpY2ggcmVxdWlyZXMKcmUtaW5pdGlhbGl6aW5nIHRoZSBQSFkuIFRoZSBwYXRjaCBp bnRyb2R1Y2VzIGEgZmxhZyB0byB0cmlnZ2VyIFBIWQpyZS1pbml0aWFsaXphdGlvbiB1cG9uIG9y aWVudGF0aW9uIGNoYW5nZS4KCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3JvY2tjaGlwL3Bo eS1yb2NrY2hpcC11c2JkcC5jIGIvZHJpdmVycy9waHkvcm9ja2NoaXAvcGh5LXJvY2tjaGlwLXVz YmRwLmMKPiBpbmRleCBlNDRkMTljOWQxMTkzLi40YjQ1NDc5OGM0ZWQ0IDEwMDY0NAo+IC0tLSBh L2RyaXZlcnMvcGh5L3JvY2tjaGlwL3BoeS1yb2NrY2hpcC11c2JkcC5jCj4gKysrIGIvZHJpdmVy cy9waHkvcm9ja2NoaXAvcGh5LXJvY2tjaGlwLXVzYmRwLmMKPiBAQCAtNjIwLDYgKzYyMCw3IEBA IHN0YXRpYyBpbnQgcmtfdWRwaHlfb3JpZW5fc3dfc2V0KHN0cnVjdCB0eXBlY19zd2l0Y2hfZGV2 ICpzdywKPiAgCQkJCSBlbnVtIHR5cGVjX29yaWVudGF0aW9uIG9yaWVuKQo+ICB7Cj4gIAlzdHJ1 Y3QgcmtfdWRwaHkgKnVkcGh5ID0gdHlwZWNfc3dpdGNoX2dldF9kcnZkYXRhKHN3KTsKPiArCWJv b2wgZmxpcHBlZCA9IG9yaWVuID09IFRZUEVDX09SSUVOVEFUSU9OX1JFVkVSU0U7Cj4gIAo+ICAJ bXV0ZXhfbG9jaygmdWRwaHktPm11dGV4KTsKPiAgCgpbIC4uLiBdCgo+IEBAIC02MzEsNyArNjMy LDEwIEBAIHN0YXRpYyBpbnQgcmtfdWRwaHlfb3JpZW5fc3dfc2V0KHN0cnVjdCB0eXBlY19zd2l0 Y2hfZGV2ICpzdywKPiAgCQlnb3RvIHVubG9ja19yZXQ7Cj4gIAl9Cj4gIAo+IC0JdWRwaHktPmZs aXAgPSBvcmllbiA9PSBUWVBFQ19PUklFTlRBVElPTl9SRVZFUlNFOwo+ICsJaWYgKHVkcGh5LT5m bGlwICE9IGZsaXBwZWQpCj4gKwkJdWRwaHktPnBoeV9uZWVkc19yZWluaXQgPSB0cnVlOwoKW1Nl dmVyaXR5OiBIaWdoXQpUaGlzIGlzIGEgcHJlLWV4aXN0aW5nIGlzc3VlLCBidXQgZG9lcyB0aGlz IGRlZmVycmVkIGluaXRpYWxpemF0aW9uIGhhbmRsZQpVU0Itb25seSByZXBsdWdzIGNvcnJlY3Rs eSBpZiB0aGUgVVNCIFBIWSByZW1haW5zIHBvd2VyZWQgb24/CgpXaGVuIGEgdXNlciB1bnBsdWdz IGFuZCByZXBsdWdzIGEgVHlwZS1DIGNhYmxlLCB0aGlzIHNldHMKdWRwaHktPnBoeV9uZWVkc19y ZWluaXQgPSB0cnVlLiBIb3dldmVyLCBpbiBjb25maWd1cmF0aW9ucyB3aGVyZSB0aGUgRFdDMwpj b250cm9sbGVyIHJlbWFpbnMgYWN0aXZlIChlLmcuLCBmaXhlZCBob3N0IG1vZGUpIG9yIGR1cmlu ZyByYXBpZCByZXBsdWdzLAp0aGUgVVNCIGNvbnRyb2xsZXIgZG9lc24ndCByZXN0YXJ0IGFuZCB0 aHVzIG5ldmVyIGNhbGxzIHBoeV9pbml0KCkgYWdhaW4uCgpCZWNhdXNlIHJrX3VkcGh5X3VzYjNf cGh5X29wcyBvbmx5IGltcGxlbWVudHMgLmluaXQgYW5kIGhhcyBubyAucG93ZXJfb24KY2FsbGJh Y2ssIHJrX3VkcGh5X3Bvd2VyX29uKCkgaXMgbmV2ZXIgaW52b2tlZCB0byBwcm9jZXNzIHRoZSBk ZWZlcnJlZAppbml0aWFsaXphdGlvbiBmbGFnOgoKZHJpdmVycy9waHkvcm9ja2NoaXAvcGh5LXJv Y2tjaGlwLXVzYmRwLmM6cmtfdWRwaHlfcG93ZXJfb24oKSB7CiAgICAuLi4KCX0gZWxzZSBpZiAo dWRwaHktPnBoeV9uZWVkc19yZWluaXQpIHsKCQkuLi4KCQlyZXQgPSBya191ZHBoeV9pbml0KHVk cGh5KTsKICAgIC4uLgp9CgpXaWxsIHRoaXMgY2F1c2UgdGhlIFVTQiBTdXBlclNwZWVkIGNvbm5l Y3Rpb24gdG8gZmFpbCB0byB0cmFpbiBpZiB0aGUKY2FibGUgaXMgaW5zZXJ0ZWQgaW4gcmV2ZXJz ZSBvcmllbnRhdGlvbj8KCj4gKwo+ICsJdWRwaHktPmZsaXAgPSBmbGlwcGVkOwo+ICAJcmtfdWRw aHlfc2V0X3R5cGVjX2RlZmF1bHRfbWFwcGluZyh1ZHBoeSk7CgpbU2V2ZXJpdHk6IE1lZGl1bV0K VGhpcyBpcyBhIHByZS1leGlzdGluZyBpc3N1ZSwgYnV0IGNhbiB0aGlzIGxlYWQgdG8gYSBkYXRh IHJhY2Ugd2l0aCBjb25jdXJyZW50Cm9yaWVudGF0aW9uIHN3aXRjaGVzPwoKV2hpbGUgcmtfdWRw aHlfb3JpZW5fc3dfc2V0KCkgYWNxdWlyZXMgdWRwaHktPm11dGV4IGFuZCB1cGRhdGVzIHRoZSBz aGFyZWQgbGFuZQphbmQgbXV4IHNlbGVjdGlvbnMgaGVyZSB2aWEgcmtfdWRwaHlfc2V0X3R5cGVj X2RlZmF1bHRfbWFwcGluZygpLApya191ZHBoeV9kcF9waHlfY29uZmlndXJlKCkgaXRlcmF0ZXMg b3ZlciBhbmQgYWNjZXNzZXMgdGhlIHNoYXJlZCBsYW5lIHN0YXRlCmxvY2tsZXNzbHk6Cgpkcml2 ZXJzL3BoeS9yb2NrY2hpcC9waHktcm9ja2NoaXAtdXNiZHAuYzpya191ZHBoeV9kcF9waHlfY29u ZmlndXJlKCkgewogICAgLi4uCgkJZm9yIChpID0gMDsgaSA8IHVkcGh5LT5sYW5lczsgaSsrKSB7 CgkJCWxhbmUgPSB1ZHBoeS0+ZHBfbGFuZV9zZWxbaV07CiAgICAuLi4KCQkJCQkJICAgdWRwaHkt PmxhbmVfbXV4X3NlbFtsYW5lXSkpOwogICAgLi4uCn0KCkNvdWxkIHRoaXMgY2F1c2UgcmtfdWRw aHlfZHBfcGh5X2NvbmZpZ3VyZSgpIHRvIHJlYWQgcGFydGlhbGx5IHVwZGF0ZWQgYXJyYXlzCmlm IHRoZSBEUCBjb250cm9sbGVyIHRyaWdnZXJzIGxpbmsgdHJhaW5pbmcgY29uY3VycmVudGx5IHdp dGggYW4gb3JpZW50YXRpb24KY2hhbmdlPwoKPiAgCXJrX3VkcGh5X3VzYl9idmFsaWRfZW5hYmxl KHVkcGh5LCB0cnVlKTsKPgoKLS0gClNhc2hpa28gQUkgcmV2aWV3IMK3IGh0dHBzOi8vc2FzaGlr by5kZXYvIy9wYXRjaHNldC8yMDI2MDcxMC1yb2NrY2hpcC11c2JkcC1jbGVhbnVwLXYxMi0wLThi NDFhOWE5YmVmMEBjb2xsYWJvcmEuY29tP3BhcnQ9MTkKCi0tIApsaW51eC1waHkgbWFpbGluZyBs aXN0CmxpbnV4LXBoeUBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHBzOi8vbGlzdHMuaW5mcmFkZWFk Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXBoeQo=