From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793949177; b=tUvj3u+8Qm9CmGPQI9qxo2RIAnnRT2d84/Dx6Jre3j9RlcfgcuMWQjjb9CyBWaUuENxC p54m5g3UDlDP2QOpotLcEpYH88zb/oxRR8dKA07aWKJ7Qf6agomiU1zhjmh14YAiY7ZPs tfBTVc8MidS+6xbWn9J/+dajGrZGzvuEeJOQJImrpV7h9/XOOq3x+jvnHoC4tb4A73FLf MHwboYzwjFqFhJ2aydGwia8J9jjDF8GJHwZWlzr5V+z/FIxYrim/U1Nmat0+98EYMubbS qNGfgRyZOYVBu3cSzCUzEGKveHZWOliusPQYamxSijd3B30L41fjdoW9trR8jP/6s3A== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793949177; h=Received:DKIM-Signature:Message-ID:From:Subject:Reply-To:To:Cc: In-Reply-To:References:Content-Type:Content-Transfer-Encoding:Date; bh=5XLHt4ws72v48Z4v6bAzP2rEp3zyelYVNcBAKn+rWw4=; b=1nm5ByylCKx/xszz0BkaFsLzhWJctpPqqNSdqdhZL5IVTJZTP1Z2tGP9ht1839A0WQjc IeYYrV9eYryVOdi/SBvM2ZhcmukwcDIK/w3AxIooA8y3kv7A3dummKcwdqwY1n7LmpPcw /RSwsEPLDIhqqo9KVGx2xbgq+332reGD8byXfeZO4aCenKIVznuJlpw7gqgO84ckTP5gF bqVmzbfAcBuswbAUaOmXMXzlr8mDz5Pl9xZaMKVpreXh0wLE1yXcMZRBBAJ5LJB/J1zfk Kr8F58KxBvM91lit1ol/JDf5U5jpgozQhwtM3Sdt2alvq0c59t2L2chhg2oSY0hDcLw== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=mYv7bpXx; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C726B606EE82 for ; Fri, 6 Nov 2026 07:12:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=mYv7bpXx Received: by smtp.kernel.org (Postfix) with ESMTPSA id 23CE41F008A5; Fri, 6 Nov 2026 07:12:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1793949176; bh=5XLHt4ws72v48Z4v6bAzP2rEp3zyelYVNcBAKn+rWw4=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=mYv7bpXxoTN7QXBqQXDD9DAK+Eue3xRiIB0U1wjD1Aeg2BQPvPkvxgdRk/zXY7pcS XRn4+uv88gx6h9gWC2sJp1w7caG8i1EWQX39S/ak5+fW0vdA80G9AkSRuKPuko4mnn i6Lt8AKbNcE4l8DIEsZuNAEIW15dnJrS6vJNpt0/FqE1qmKEQXYuRTj5So64MiZI5g N197i17O8aKtL8CCMeweNKjw8Tz2w+x6RK+t0tDIKQbmjWJsbVpGUu8wlYG2WayI6I KCwRiOPKgCGjeinLh4Qph27Rht5rReTfMxMYrjvlTAaOCqgn5UpNxltwGAaXF+6TPV Zt+TSrhIgwKBA== Message-ID: From: sashiko-bot@kernel.org Subject: Re: [PATCH v4 6/6] media: qcom: camss: Add support for Hawi Reply-To: sashiko-reviews@lists.linux.dev To: "Nihal Kumar Gupta" Cc: devicetree@vger.kernel.org, linux-phy@lists.infradead.org, robh@kernel.org, conor+dt@kernel.org, media-ci@linuxtv.org, vkoul@kernel.org, neil.armstrong@linaro.org, olteanv@gmail.com In-Reply-To: <20261106-hawi-maili-camss-v4-6-d528c7a797b4@oss.qualcomm.com> References: <20261106-hawi-maili-camss-v4-0-d528c7a797b4@oss.qualcomm.com> <20261106-hawi-maili-camss-v4-6-d528c7a797b4@oss.qualcomm.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Fri, 06 Nov 2026 07:12:55 +0000 X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list Thank you for your contribution! Sashiko AI review found 5 potential issues to consider: - [High] media: qcom: camss: unconditional AUP strobes in csid_configure_stream() - [Medium] media: qcom: camss: race on csid->addr_update and csid->reg_update - [Medium] media: qcom: camss: wrong camnoc_rt_axi clock rates in vfe_res_hawi - [Low] media: qcom: camss: duplicate CSID/VFE 1080 code and inaccurate changelog - [Low] media: qcom: camss: commit message mismatch with hawi_resources -- commit 56bf9cdebfcac8b831c8b140e2703b5aa2fdcc78 Author: Hangxiang Ma media: qcom: camss: Add support for Hawi This commit adds CAMSS support for the Qualcomm Hawi SoC, including CSID 1190, VFE 1190, and the Hawi subdevice resource tables. > diff --git a/drivers/media/platform/qcom/camss/camss-csid-1190.c b/driver= s/media/platform/qcom/camss/camss-csid-1190.c > new file mode 100644 > index 0000000000000..4bd2cce094402 > --- /dev/null > +++ b/drivers/media/platform/qcom/camss/camss-csid-1190.c [ ... ] > +static void __csid_aup_rup_trigger(struct csid_device *csid) > +{ > + /* trigger SET in combined register */ > + writel(RUP_SET, csid->base + CSID_RUP_AUP_CMD); > +} > + > +static void __csid_addr_update(struct csid_device *csid, int port_id) > +{ > + csid->addr_update |=3D CSID_RUP_AUP_RDI(port_id); > + writel(csid->addr_update, csid->base + CSID_AUP_CMD); > + > + __csid_aup_rup_trigger(csid); > +} > + > +static void __csid_addr_update_clear(struct csid_device *csid, int port_= id) > +{ > + /* Hardware clears the registers upon consuming the settings */ > + csid->addr_update &=3D ~CSID_RUP_AUP_RDI(port_id); > +} > + > +static void __csid_reg_update(struct csid_device *csid, int port_id) > +{ > + csid->reg_update |=3D CSID_RUP_AUP_RDI(port_id); > + writel(csid->reg_update, csid->base + CSID_RUP_CMD); > + > + __csid_aup_rup_trigger(csid); > +} > + > +static void __csid_reg_update_clear(struct csid_device *csid, int port_i= d) > +{ > + /* Hardware clears the registers upon consuming the settings */ > + csid->reg_update &=3D ~CSID_RUP_AUP_RDI(port_id); > +} [Severity: Medium] Can concurrent updates to csid->addr_update and csid->reg_update race with csid_isr()? vfe_queue_buffer_v2() and vfe_enable_output_v2() call ops->addr_update() and ops->reg_update() under vfe->output_lock, whereas csid_isr() clears those bitmasks on INFO_RUP_DONE without holding vfe->output_lock or a CSID spinlock, and csid_configure_stream() sets them without a spinlock: CPU0 CPU1 () vfe_queue_buffer_v2() csid_isr() spin_lock_irqsave(&vfe->output_lock) ... __csid_addr_update_clear(csid, i) __csid_addr_update(csid, port_id) load csid->addr_update load csid->addr_update and ~CSID_RUP_AUP_RDI(i) or CSID_RUP_AUP_RDI(port_id) store csid->addr_update store csid->addr_update <-- clobbers clear (or loses set bit) writel(csid->addr_update, ...) This data race can drop a pending RDI address or register update or re-write a stale RDI bit to CSID_AUP_CMD and CSID_RUP_CMD. [ ... ] > +static void csid_configure_stream(struct csid_device *csid, u8 enable) > +{ > + u8 i, k; > + > + __csid_configure_rx(csid, &csid->phy); > + > + for (i =3D 0; i < MSM_CSID_MAX_SRC_STREAMS_1190; i++) { > + if (csid->phy.en_vc & BIT(i)) { > + __csid_configure_rdi_stream(csid, enable, i, 0); > + __csid_configure_rx_vc(csid, 0); > + > + for (k =3D 0; k < CAMSS_INIT_BUF_COUNT; k++) > + __csid_addr_update(csid, i); > + > + __csid_reg_update(csid, i); > + > + __csid_ctrl_rdi(csid, enable, i); > + } > + } > +} [Severity: High] Does unconditionally issuing CAMSS_INIT_BUF_COUNT address updates here desynchronize the hardware write master when fewer than two buffers are queued before VIDIOC_STREAMON? Because vb2_queue.min_queued_buffers is 0 in msm_video_register(), vfe_enable_output_v2() only programs VFE_BUS_WM_IMAGE_ADDR for as many pending buffers as are actually queued (0, 1, or 2): drivers/media/platform/qcom/camss/camss-vfe.c:vfe_enable_output_v2() { for (i =3D 0; i < CAMSS_INIT_BUF_COUNT; i++) { output->buf[i] =3D vfe_buf_get_pending(output); if (!output->buf[i]) break; output->gen2.active_num++; ops->vfe_wm_update(vfe, output->wm_idx[0], output->buf[i]->addr[0], line); if (!ops->addr_update) ops->reg_update(vfe, line->id); } } csid_configure_stream() then runs and triggers two __csid_addr_update() strobes even if 0 or 1 buffer was written to VFE_BUS_WM_IMAGE_ADDR (and also when enable is 0 or on other link-enabled RDI ports in csid->phy.en_vc). Latching uninitialized or duplicate buffer addresses into the hardware FIFO and then issuing further addr_update strobes from vfe_queue_buffer_v2() when buffers arrive while active_num < 2 corrupts buffer tracking and DMA target addresses. [ ... ] > +const struct csid_hw_ops csid_ops_1190 =3D { > + .configure_stream =3D csid_configure_stream, > + .configure_testgen_pattern =3D csid_configure_testgen_pattern, > + .hw_version =3D csid_hw_version, > + .isr =3D csid_isr, > + .reset =3D csid_reset, > + .src_pad_code =3D csid_src_pad_code, > + .subdev_init =3D csid_subdev_init, > + .reg_update =3D csid_subdev_reg_update, > + .addr_update =3D csid_subdev_addr_update, > +}; [Severity: Low] This isn't a bug, but camss-csid-1190.c is register-for-register and functionally identical to camss-csid-1080.c, including the unused local variable lane_cnt in __csid_configure_rdi_stream(). Could csid_res_hawi reuse csid_ops_1080 directly instead of duplicating the file, and could camss-vfe-1190.c share the identical helper functions with camss-vfe-1080.c? > diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/pl= atform/qcom/camss/camss.c > index 7976796dca598..70d4306581a23 100644 > --- a/drivers/media/platform/qcom/camss/camss.c > +++ b/drivers/media/platform/qcom/camss/camss.c > @@ -4308,6 +4308,218 @@ static const struct resources_icc icc_res_sa8775p= [] =3D { > }, > }; > =20 > +static const struct camss_subdev_resources vfe_res_hawi[] =3D { > + /* VFE0 - TFE Full */ > + { > + .clock =3D { "vfe0_fast_ahb", "vfe0", "cpas_vfe0", > + "camnoc_rt_axi", "camnoc_nrt_axi", "qdss_debug_xo", > + "cpas_mnoc_hf", "cpas_mnoc_sf" }, > + .clock_rate =3D { { 0 }, > + { 238200000, 397000000, 440000000, 480000000, > + 630000000, 750000000, 833000000 }, > + { 0 }, > + { 171428571, 240000000, 300000000, 400000000, > + 480000000, 600000000 }, [Severity: Medium] Do the camnoc_rt_axi frequencies in vfe_res_hawi (VFE0 through VFE4) match the Hawi CAMCC clock driver? In drivers/clk/qcom/camcc-hawi.c, ftbl_cam_cc_camnoc_rt_axi_clk_src defines the supported rates on Hawi as 19.2 MHz, 120 MHz, 160 MHz, 240 MHz, 320 MHz, and a maximum of 480 MHz: drivers/clk/qcom/camcc-hawi.c: static const struct freq_tbl ftbl_cam_cc_camnoc_rt_axi_clk_src[] =3D { F(19200000, P_BI_TCXO, 1, 0, 0), F(120000000, P_CAM_CC_PLL6_OUT_EVEN, 4, 0, 0), F(160000000, P_CAM_CC_PLL6_OUT_EVEN, 3, 0, 0), F(240000000, P_CAM_CC_PLL6_OUT_EVEN, 2, 0, 0), F(320000000, P_CAM_CC_PLL6_OUT_EVEN, 1.5, 0, 0), F(480000000, P_CAM_CC_PLL6_OUT_EVEN, 1, 0, 0), { } }; When vfe_set_clock_rates() selects 600 MHz for a min_rate between 480 MHz and 600 MHz, clk_round_rate() clamps the rate down to 480 MHz, causing a subsequent vfe_check_clock_rates() call on the same VFE to fail with -EBUSY because clk_get_rate() is below min_rate. [ ... ] > @@ -6030,6 +6242,21 @@ static const struct camss_resources sm8650_resourc= es =3D { > .vfe_num =3D ARRAY_SIZE(vfe_res_sm8650), > }; > =20 > +static const struct camss_resources hawi_resources =3D { > + .version =3D CAMSS_HAWI, > + .pd_name =3D "top", > + .pm_clks =3D { "cpas_fast_ahb", "cpas_ahb", "gcc_axi_hf" }, > + .tpg_res =3D tpg_res_8775p, > + .csid_res =3D csid_res_hawi, > + .vfe_res =3D vfe_res_hawi, > + .icc_res =3D icc_res_hawi, > + .icc_path_num =3D ARRAY_SIZE(icc_res_hawi), > + .csiphy_num =3D 6, > + .tpg_num =3D ARRAY_SIZE(tpg_res_8775p), > + .csid_num =3D ARRAY_SIZE(csid_res_hawi), > + .vfe_num =3D ARRAY_SIZE(vfe_res_hawi), > +}; [Severity: Low] Does the commit message match hawi_resources? The changelog states that the CSIPHY resource table is reused from Kaanapal= i, the TPG table is reused from X1E80100, and the common CPAS clocks are manag= ed as PM clocks rather than per-VFE clocks. However, hawi_resources sets .tpg_res to tpg_res_8775p (not tpg_res_x1e80100), has no .csiphy_res table, and vfe_res_hawi still lists the shared cpas_mnoc_hf and cpas_mnoc_sf clocks in every VFE entry rather than in .pm_clks. --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20261106-hawi-maili= -camss-v4-0-d528c7a797b4@oss.qualcomm.com?part=3D6 From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 31661606A32F for ; Fri, 6 Nov 2026 07:12:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=DLVnDDFQ; dkim=fail reason="signature verification failed" (2048-bit key, unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=mYv7bpXx 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:Date:References: In-Reply-To:Cc:To:Subject:From:Message-ID:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Unsubscribe-Post:List-Owner; bh=RZhBCrEWztf+zAvkwDJeVuWgb7UZ+YwBUsq7AZBtORg=; b=DLVnDDFQOS/+MXO256F1ZPOYeo fbKGnEcgMI1GgVsBSKZrpYIWPGI1uvTc9ASigmB8xX1QxbLMNCkdwN40h8HZXW+kst6hDzgdxUrxs zLsmOoC9R9JzCDafhBab9gC3olwaXzqMMAeYB9uDkvwPHDizlPVdAEYcoruQknJKEYuUO/SnEyrYb S4OlHOAJHNhE9W4trq49J8Rmt5wxk+vNudqkJyHuJe651IAKCJYs8HQ1+j8hUFkPZ/X39d4bAkydJ tnAHw/tzLq2JcI1UtmWLMpXs2R5lmjQ6LCLl7tdwwxsXtFmXN1PDoKbAeXXQHrbCzhguGvpljHFuJ EoYQ2X2g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.100.1 #2 (Red Hat Linux)) id 1xPE8A-0000000BPIv-3uOe; Fri, 06 Nov 2026 07:12:58 +0000 Received: from sea.source.kernel.org ([2600:3c0a:e001:78e:0:1991:8:25]) by bombadil.infradead.org with esmtps (Exim 4.100.1 #2 (Red Hat Linux)) id 1xPE89-0000000BPIo-2E41 for linux-phy@lists.infradead.org; Fri, 06 Nov 2026 07:12:57 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id BE96E44655; Fri, 6 Nov 2026 07:12:56 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 23CE41F008A5; Fri, 6 Nov 2026 07:12:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1793949176; bh=5XLHt4ws72v48Z4v6bAzP2rEp3zyelYVNcBAKn+rWw4=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=mYv7bpXxoTN7QXBqQXDD9DAK+Eue3xRiIB0U1wjD1Aeg2BQPvPkvxgdRk/zXY7pcS XRn4+uv88gx6h9gWC2sJp1w7caG8i1EWQX39S/ak5+fW0vdA80G9AkSRuKPuko4mnn i6Lt8AKbNcE4l8DIEsZuNAEIW15dnJrS6vJNpt0/FqE1qmKEQXYuRTj5So64MiZI5g N197i17O8aKtL8CCMeweNKjw8Tz2w+x6RK+t0tDIKQbmjWJsbVpGUu8wlYG2WayI6I KCwRiOPKgCGjeinLh4Qph27Rht5rReTfMxMYrjvlTAaOCqgn5UpNxltwGAaXF+6TPV Zt+TSrhIgwKBA== Message-ID: From: sashiko-bot@kernel.org Subject: Re: [PATCH v4 6/6] media: qcom: camss: Add support for Hawi To: "Nihal Kumar Gupta" Cc: devicetree@vger.kernel.org, linux-phy@lists.infradead.org, robh@kernel.org, conor+dt@kernel.org, media-ci@linuxtv.org, vkoul@kernel.org, neil.armstrong@linaro.org, olteanv@gmail.com In-Reply-To: <20261106-hawi-maili-camss-v4-6-d528c7a797b4@oss.qualcomm.com> References: <20261106-hawi-maili-camss-v4-0-d528c7a797b4@oss.qualcomm.com> <20261106-hawi-maili-camss-v4-6-d528c7a797b4@oss.qualcomm.com> Date: Fri, 06 Nov 2026 07:12:55 +0000 X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: sashiko-reviews@lists.linux.dev X-Archived-By: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-phy" X-Spam-Status: No, score=-8.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=4.0.1 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on aws-us-west-2-korg-listserv-alma10-1 VGhhbmsgeW91IGZvciB5b3VyIGNvbnRyaWJ1dGlvbiEgU2FzaGlrbyBBSSByZXZpZXcgZm91bmQg NSBwb3RlbnRpYWwKaXNzdWVzIHRvIGNvbnNpZGVyOgotIFtIaWdoXSBtZWRpYTogcWNvbTogY2Ft c3M6IHVuY29uZGl0aW9uYWwgQVVQIHN0cm9iZXMgaW4KICBjc2lkX2NvbmZpZ3VyZV9zdHJlYW0o KQotIFtNZWRpdW1dIG1lZGlhOiBxY29tOiBjYW1zczogcmFjZSBvbiBjc2lkLT5hZGRyX3VwZGF0 ZSBhbmQKICBjc2lkLT5yZWdfdXBkYXRlCi0gW01lZGl1bV0gbWVkaWE6IHFjb206IGNhbXNzOiB3 cm9uZyBjYW1ub2NfcnRfYXhpIGNsb2NrIHJhdGVzIGluCiAgdmZlX3Jlc19oYXdpCi0gW0xvd10g bWVkaWE6IHFjb206IGNhbXNzOiBkdXBsaWNhdGUgQ1NJRC9WRkUgMTA4MCBjb2RlIGFuZCBpbmFj Y3VyYXRlCiAgY2hhbmdlbG9nCi0gW0xvd10gbWVkaWE6IHFjb206IGNhbXNzOiBjb21taXQgbWVz c2FnZSBtaXNtYXRjaCB3aXRoIGhhd2lfcmVzb3VyY2VzCi0tCgpjb21taXQgNTZiZjljZGViZmNh YzhiODMxYzhiMTQwZTI3MDNiNWFhMmZkY2M3OApBdXRob3I6IEhhbmd4aWFuZyBNYSA8aGFuZ3hp YW5nLm1hQG9zcy5xdWFsY29tbS5jb20+CgptZWRpYTogcWNvbTogY2Ftc3M6IEFkZCBzdXBwb3J0 IGZvciBIYXdpCgpUaGlzIGNvbW1pdCBhZGRzIENBTVNTIHN1cHBvcnQgZm9yIHRoZSBRdWFsY29t bSBIYXdpIFNvQywgaW5jbHVkaW5nIENTSUQKMTE5MCwgVkZFIDExOTAsIGFuZCB0aGUgSGF3aSBz dWJkZXZpY2UgcmVzb3VyY2UgdGFibGVzLgoKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9w bGF0Zm9ybS9xY29tL2NhbXNzL2NhbXNzLWNzaWQtMTE5MC5jIGIvZHJpdmVycy9tZWRpYS9wbGF0 Zm9ybS9xY29tL2NhbXNzL2NhbXNzLWNzaWQtMTE5MC5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQK PiBpbmRleCAwMDAwMDAwMDAwMDAwLi40YmQyY2NlMDk0NDAyCj4gLS0tIC9kZXYvbnVsbAo+ICsr KyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vcWNvbS9jYW1zcy9jYW1zcy1jc2lkLTExOTAuYwoK WyAuLi4gXQoKPiArc3RhdGljIHZvaWQgX19jc2lkX2F1cF9ydXBfdHJpZ2dlcihzdHJ1Y3QgY3Np ZF9kZXZpY2UgKmNzaWQpCj4gK3sKPiArCS8qIHRyaWdnZXIgU0VUIGluIGNvbWJpbmVkIHJlZ2lz dGVyICovCj4gKwl3cml0ZWwoUlVQX1NFVCwgY3NpZC0+YmFzZSArIENTSURfUlVQX0FVUF9DTUQp Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2NzaWRfYWRkcl91cGRhdGUoc3RydWN0IGNzaWRf ZGV2aWNlICpjc2lkLCBpbnQgcG9ydF9pZCkKPiArewo+ICsJY3NpZC0+YWRkcl91cGRhdGUgfD0g Q1NJRF9SVVBfQVVQX1JESShwb3J0X2lkKTsKPiArCXdyaXRlbChjc2lkLT5hZGRyX3VwZGF0ZSwg Y3NpZC0+YmFzZSArIENTSURfQVVQX0NNRCk7Cj4gKwo+ICsJX19jc2lkX2F1cF9ydXBfdHJpZ2dl cihjc2lkKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgX19jc2lkX2FkZHJfdXBkYXRlX2NsZWFy KHN0cnVjdCBjc2lkX2RldmljZSAqY3NpZCwgaW50IHBvcnRfaWQpCj4gK3sKPiArCS8qIEhhcmR3 YXJlIGNsZWFycyB0aGUgcmVnaXN0ZXJzIHVwb24gY29uc3VtaW5nIHRoZSBzZXR0aW5ncyAqLwo+ ICsJY3NpZC0+YWRkcl91cGRhdGUgJj0gfkNTSURfUlVQX0FVUF9SREkocG9ydF9pZCk7Cj4gK30K PiArCj4gK3N0YXRpYyB2b2lkIF9fY3NpZF9yZWdfdXBkYXRlKHN0cnVjdCBjc2lkX2RldmljZSAq Y3NpZCwgaW50IHBvcnRfaWQpCj4gK3sKPiArCWNzaWQtPnJlZ191cGRhdGUgfD0gQ1NJRF9SVVBf QVVQX1JESShwb3J0X2lkKTsKPiArCXdyaXRlbChjc2lkLT5yZWdfdXBkYXRlLCBjc2lkLT5iYXNl ICsgQ1NJRF9SVVBfQ01EKTsKPiArCj4gKwlfX2NzaWRfYXVwX3J1cF90cmlnZ2VyKGNzaWQpOwo+ ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2NzaWRfcmVnX3VwZGF0ZV9jbGVhcihzdHJ1Y3QgY3Np ZF9kZXZpY2UgKmNzaWQsIGludCBwb3J0X2lkKQo+ICt7Cj4gKwkvKiBIYXJkd2FyZSBjbGVhcnMg dGhlIHJlZ2lzdGVycyB1cG9uIGNvbnN1bWluZyB0aGUgc2V0dGluZ3MgKi8KPiArCWNzaWQtPnJl Z191cGRhdGUgJj0gfkNTSURfUlVQX0FVUF9SREkocG9ydF9pZCk7Cj4gK30KCltTZXZlcml0eTog TWVkaXVtXQpDYW4gY29uY3VycmVudCB1cGRhdGVzIHRvIGNzaWQtPmFkZHJfdXBkYXRlIGFuZCBj c2lkLT5yZWdfdXBkYXRlIHJhY2Ugd2l0aApjc2lkX2lzcigpPwoKdmZlX3F1ZXVlX2J1ZmZlcl92 MigpIGFuZCB2ZmVfZW5hYmxlX291dHB1dF92MigpIGNhbGwgb3BzLT5hZGRyX3VwZGF0ZSgpIGFu ZApvcHMtPnJlZ191cGRhdGUoKSB1bmRlciB2ZmUtPm91dHB1dF9sb2NrLCB3aGVyZWFzIGNzaWRf aXNyKCkgY2xlYXJzIHRob3NlCmJpdG1hc2tzIG9uIElORk9fUlVQX0RPTkUgd2l0aG91dCBob2xk aW5nIHZmZS0+b3V0cHV0X2xvY2sgb3IgYSBDU0lECnNwaW5sb2NrLCBhbmQgY3NpZF9jb25maWd1 cmVfc3RyZWFtKCkgc2V0cyB0aGVtIHdpdGhvdXQgYSBzcGlubG9jazoKCkNQVTAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgQ1BVMSAoPGhhcmRpcnE+KQp2ZmVfcXVldWVfYnVmZmVy X3YyKCkgICAgICAgICAgICAgICAgIGNzaWRfaXNyKCkKICBzcGluX2xvY2tfaXJxc2F2ZSgmdmZl LT5vdXRwdXRfbG9jaykKICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9f Y3NpZF9hZGRyX3VwZGF0ZV9jbGVhcihjc2lkLCBpKQogIF9fY3NpZF9hZGRyX3VwZGF0ZShjc2lk LCBwb3J0X2lkKSAgICAgICBsb2FkIGNzaWQtPmFkZHJfdXBkYXRlCiAgICBsb2FkIGNzaWQtPmFk ZHJfdXBkYXRlICAgICAgICAgICAgICAgIGFuZCB+Q1NJRF9SVVBfQVVQX1JESShpKQogICAgb3Ig Q1NJRF9SVVBfQVVQX1JESShwb3J0X2lkKSAgICAgICAgICBzdG9yZSBjc2lkLT5hZGRyX3VwZGF0 ZQogICAgc3RvcmUgY3NpZC0+YWRkcl91cGRhdGUgIDwtLSBjbG9iYmVycyBjbGVhciAob3IgbG9z ZXMgc2V0IGJpdCkKICAgIHdyaXRlbChjc2lkLT5hZGRyX3VwZGF0ZSwgLi4uKQoKVGhpcyBkYXRh IHJhY2UgY2FuIGRyb3AgYSBwZW5kaW5nIFJESSBhZGRyZXNzIG9yIHJlZ2lzdGVyIHVwZGF0ZSBv cgpyZS13cml0ZSBhIHN0YWxlIFJESSBiaXQgdG8gQ1NJRF9BVVBfQ01EIGFuZCBDU0lEX1JVUF9D TUQuCgpbIC4uLiBdCgo+ICtzdGF0aWMgdm9pZCBjc2lkX2NvbmZpZ3VyZV9zdHJlYW0oc3RydWN0 IGNzaWRfZGV2aWNlICpjc2lkLCB1OCBlbmFibGUpCj4gK3sKPiArCXU4IGksIGs7Cj4gKwo+ICsJ X19jc2lkX2NvbmZpZ3VyZV9yeChjc2lkLCAmY3NpZC0+cGh5KTsKPiArCj4gKwlmb3IgKGkgPSAw OyBpIDwgTVNNX0NTSURfTUFYX1NSQ19TVFJFQU1TXzExOTA7IGkrKykgewo+ICsJCWlmIChjc2lk LT5waHkuZW5fdmMgJiBCSVQoaSkpIHsKPiArCQkJX19jc2lkX2NvbmZpZ3VyZV9yZGlfc3RyZWFt KGNzaWQsIGVuYWJsZSwgaSwgMCk7Cj4gKwkJCV9fY3NpZF9jb25maWd1cmVfcnhfdmMoY3NpZCwg MCk7Cj4gKwo+ICsJCQlmb3IgKGsgPSAwOyBrIDwgQ0FNU1NfSU5JVF9CVUZfQ09VTlQ7IGsrKykK PiArCQkJCV9fY3NpZF9hZGRyX3VwZGF0ZShjc2lkLCBpKTsKPiArCj4gKwkJCV9fY3NpZF9yZWdf dXBkYXRlKGNzaWQsIGkpOwo+ICsKPiArCQkJX19jc2lkX2N0cmxfcmRpKGNzaWQsIGVuYWJsZSwg aSk7Cj4gKwkJfQo+ICsJfQo+ICt9CgpbU2V2ZXJpdHk6IEhpZ2hdCkRvZXMgdW5jb25kaXRpb25h bGx5IGlzc3VpbmcgQ0FNU1NfSU5JVF9CVUZfQ09VTlQgYWRkcmVzcyB1cGRhdGVzIGhlcmUKZGVz eW5jaHJvbml6ZSB0aGUgaGFyZHdhcmUgd3JpdGUgbWFzdGVyIHdoZW4gZmV3ZXIgdGhhbiB0d28g YnVmZmVycyBhcmUKcXVldWVkIGJlZm9yZSBWSURJT0NfU1RSRUFNT04/CgpCZWNhdXNlIHZiMl9x dWV1ZS5taW5fcXVldWVkX2J1ZmZlcnMgaXMgMCBpbiBtc21fdmlkZW9fcmVnaXN0ZXIoKSwKdmZl X2VuYWJsZV9vdXRwdXRfdjIoKSBvbmx5IHByb2dyYW1zIFZGRV9CVVNfV01fSU1BR0VfQUREUiBm b3IgYXMgbWFueQpwZW5kaW5nIGJ1ZmZlcnMgYXMgYXJlIGFjdHVhbGx5IHF1ZXVlZCAoMCwgMSwg b3IgMik6Cgpkcml2ZXJzL21lZGlhL3BsYXRmb3JtL3Fjb20vY2Ftc3MvY2Ftc3MtdmZlLmM6dmZl X2VuYWJsZV9vdXRwdXRfdjIoKSB7Cglmb3IgKGkgPSAwOyBpIDwgQ0FNU1NfSU5JVF9CVUZfQ09V TlQ7IGkrKykgewoJCW91dHB1dC0+YnVmW2ldID0gdmZlX2J1Zl9nZXRfcGVuZGluZyhvdXRwdXQp OwoJCWlmICghb3V0cHV0LT5idWZbaV0pCgkJCWJyZWFrOwoJCW91dHB1dC0+Z2VuMi5hY3RpdmVf bnVtKys7CgkJb3BzLT52ZmVfd21fdXBkYXRlKHZmZSwgb3V0cHV0LT53bV9pZHhbMF0sCgkJCQkg ICBvdXRwdXQtPmJ1ZltpXS0+YWRkclswXSwgbGluZSk7CgkJaWYgKCFvcHMtPmFkZHJfdXBkYXRl KQoJCQlvcHMtPnJlZ191cGRhdGUodmZlLCBsaW5lLT5pZCk7Cgl9Cn0KCmNzaWRfY29uZmlndXJl X3N0cmVhbSgpIHRoZW4gcnVucyBhbmQgdHJpZ2dlcnMgdHdvIF9fY3NpZF9hZGRyX3VwZGF0ZSgp CnN0cm9iZXMgZXZlbiBpZiAwIG9yIDEgYnVmZmVyIHdhcyB3cml0dGVuIHRvIFZGRV9CVVNfV01f SU1BR0VfQUREUiAoYW5kIGFsc28Kd2hlbiBlbmFibGUgaXMgMCBvciBvbiBvdGhlciBsaW5rLWVu YWJsZWQgUkRJIHBvcnRzIGluIGNzaWQtPnBoeS5lbl92YykuCkxhdGNoaW5nIHVuaW5pdGlhbGl6 ZWQgb3IgZHVwbGljYXRlIGJ1ZmZlciBhZGRyZXNzZXMgaW50byB0aGUgaGFyZHdhcmUgRklGTwph bmQgdGhlbiBpc3N1aW5nIGZ1cnRoZXIgYWRkcl91cGRhdGUgc3Ryb2JlcyBmcm9tIHZmZV9xdWV1 ZV9idWZmZXJfdjIoKSB3aGVuCmJ1ZmZlcnMgYXJyaXZlIHdoaWxlIGFjdGl2ZV9udW0gPCAyIGNv cnJ1cHRzIGJ1ZmZlciB0cmFja2luZyBhbmQgRE1BIHRhcmdldAphZGRyZXNzZXMuCgpbIC4uLiBd Cgo+ICtjb25zdCBzdHJ1Y3QgY3NpZF9od19vcHMgY3NpZF9vcHNfMTE5MCA9IHsKPiArCS5jb25m aWd1cmVfc3RyZWFtID0gY3NpZF9jb25maWd1cmVfc3RyZWFtLAo+ICsJLmNvbmZpZ3VyZV90ZXN0 Z2VuX3BhdHRlcm4gPSBjc2lkX2NvbmZpZ3VyZV90ZXN0Z2VuX3BhdHRlcm4sCj4gKwkuaHdfdmVy c2lvbiA9IGNzaWRfaHdfdmVyc2lvbiwKPiArCS5pc3IgPSBjc2lkX2lzciwKPiArCS5yZXNldCA9 IGNzaWRfcmVzZXQsCj4gKwkuc3JjX3BhZF9jb2RlID0gY3NpZF9zcmNfcGFkX2NvZGUsCj4gKwku c3ViZGV2X2luaXQgPSBjc2lkX3N1YmRldl9pbml0LAo+ICsJLnJlZ191cGRhdGUgPSBjc2lkX3N1 YmRldl9yZWdfdXBkYXRlLAo+ICsJLmFkZHJfdXBkYXRlID0gY3NpZF9zdWJkZXZfYWRkcl91cGRh dGUsCj4gK307CgpbU2V2ZXJpdHk6IExvd10KVGhpcyBpc24ndCBhIGJ1ZywgYnV0IGNhbXNzLWNz aWQtMTE5MC5jIGlzIHJlZ2lzdGVyLWZvci1yZWdpc3RlciBhbmQKZnVuY3Rpb25hbGx5IGlkZW50 aWNhbCB0byBjYW1zcy1jc2lkLTEwODAuYywgaW5jbHVkaW5nIHRoZSB1bnVzZWQgbG9jYWwKdmFy aWFibGUgbGFuZV9jbnQgaW4gX19jc2lkX2NvbmZpZ3VyZV9yZGlfc3RyZWFtKCkuICBDb3VsZCBj c2lkX3Jlc19oYXdpCnJldXNlIGNzaWRfb3BzXzEwODAgZGlyZWN0bHkgaW5zdGVhZCBvZiBkdXBs aWNhdGluZyB0aGUgZmlsZSwgYW5kIGNvdWxkCmNhbXNzLXZmZS0xMTkwLmMgc2hhcmUgdGhlIGlk ZW50aWNhbCBoZWxwZXIgZnVuY3Rpb25zIHdpdGggY2Ftc3MtdmZlLTEwODAuYz8KCj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vcWNvbS9jYW1zcy9jYW1zcy5jIGIvZHJpdmVy cy9tZWRpYS9wbGF0Zm9ybS9xY29tL2NhbXNzL2NhbXNzLmMKPiBpbmRleCA3OTc2Nzk2ZGNhNTk4 Li43MGQ0MzA2NTgxYTIzIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vcWNv bS9jYW1zcy9jYW1zcy5jCj4gKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9xY29tL2NhbXNz L2NhbXNzLmMKPiBAQCAtNDMwOCw2ICs0MzA4LDIxOCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IHJl c291cmNlc19pY2MgaWNjX3Jlc19zYTg3NzVwW10gPSB7Cj4gIAl9LAo+ICB9Owo+ICAKPiArc3Rh dGljIGNvbnN0IHN0cnVjdCBjYW1zc19zdWJkZXZfcmVzb3VyY2VzIHZmZV9yZXNfaGF3aVtdID0g ewo+ICsJLyogVkZFMCAtIFRGRSBGdWxsICovCj4gKwl7Cj4gKwkJLmNsb2NrID0geyAidmZlMF9m YXN0X2FoYiIsICJ2ZmUwIiwgImNwYXNfdmZlMCIsCj4gKwkJCSAgICJjYW1ub2NfcnRfYXhpIiwg ImNhbW5vY19ucnRfYXhpIiwgInFkc3NfZGVidWdfeG8iLAo+ICsJCQkgICAiY3Bhc19tbm9jX2hm IiwgImNwYXNfbW5vY19zZiIgfSwKPiArCQkuY2xvY2tfcmF0ZSA9IHsgeyAwIH0sCj4gKwkJCQl7 IDIzODIwMDAwMCwgMzk3MDAwMDAwLCA0NDAwMDAwMDAsIDQ4MDAwMDAwMCwKPiArCQkJCSAgNjMw MDAwMDAwLCA3NTAwMDAwMDAsIDgzMzAwMDAwMCB9LAo+ICsJCQkJeyAwIH0sCj4gKwkJCQl7IDE3 MTQyODU3MSwgMjQwMDAwMDAwLCAzMDAwMDAwMDAsIDQwMDAwMDAwMCwKPiArCQkJCSAgNDgwMDAw MDAwLCA2MDAwMDAwMDAgfSwKCltTZXZlcml0eTogTWVkaXVtXQpEbyB0aGUgY2Ftbm9jX3J0X2F4 aSBmcmVxdWVuY2llcyBpbiB2ZmVfcmVzX2hhd2kgKFZGRTAgdGhyb3VnaCBWRkU0KSBtYXRjaAp0 aGUgSGF3aSBDQU1DQyBjbG9jayBkcml2ZXI/CgpJbiBkcml2ZXJzL2Nsay9xY29tL2NhbWNjLWhh d2kuYywgZnRibF9jYW1fY2NfY2Ftbm9jX3J0X2F4aV9jbGtfc3JjIGRlZmluZXMKdGhlIHN1cHBv cnRlZCByYXRlcyBvbiBIYXdpIGFzIDE5LjIgTUh6LCAxMjAgTUh6LCAxNjAgTUh6LCAyNDAgTUh6 LCAzMjAgTUh6LAphbmQgYSBtYXhpbXVtIG9mIDQ4MCBNSHo6Cgpkcml2ZXJzL2Nsay9xY29tL2Nh bWNjLWhhd2kuYzoKc3RhdGljIGNvbnN0IHN0cnVjdCBmcmVxX3RibCBmdGJsX2NhbV9jY19jYW1u b2NfcnRfYXhpX2Nsa19zcmNbXSA9IHsKCUYoMTkyMDAwMDAsIFBfQklfVENYTywgMSwgMCwgMCks CglGKDEyMDAwMDAwMCwgUF9DQU1fQ0NfUExMNl9PVVRfRVZFTiwgNCwgMCwgMCksCglGKDE2MDAw MDAwMCwgUF9DQU1fQ0NfUExMNl9PVVRfRVZFTiwgMywgMCwgMCksCglGKDI0MDAwMDAwMCwgUF9D QU1fQ0NfUExMNl9PVVRfRVZFTiwgMiwgMCwgMCksCglGKDMyMDAwMDAwMCwgUF9DQU1fQ0NfUExM Nl9PVVRfRVZFTiwgMS41LCAwLCAwKSwKCUYoNDgwMDAwMDAwLCBQX0NBTV9DQ19QTEw2X09VVF9F VkVOLCAxLCAwLCAwKSwKCXsgfQp9OwoKV2hlbiB2ZmVfc2V0X2Nsb2NrX3JhdGVzKCkgc2VsZWN0 cyA2MDAgTUh6IGZvciBhIG1pbl9yYXRlIGJldHdlZW4gNDgwIE1IegphbmQgNjAwIE1IeiwgY2xr X3JvdW5kX3JhdGUoKSBjbGFtcHMgdGhlIHJhdGUgZG93biB0byA0ODAgTUh6LCBjYXVzaW5nIGEK c3Vic2VxdWVudCB2ZmVfY2hlY2tfY2xvY2tfcmF0ZXMoKSBjYWxsIG9uIHRoZSBzYW1lIFZGRSB0 byBmYWlsIHdpdGggLUVCVVNZCmJlY2F1c2UgY2xrX2dldF9yYXRlKCkgaXMgYmVsb3cgbWluX3Jh dGUuCgpbIC4uLiBdCgo+IEBAIC02MDMwLDYgKzYyNDIsMjEgQEAgc3RhdGljIGNvbnN0IHN0cnVj dCBjYW1zc19yZXNvdXJjZXMgc204NjUwX3Jlc291cmNlcyA9IHsKPiAgCS52ZmVfbnVtID0gQVJS QVlfU0laRSh2ZmVfcmVzX3NtODY1MCksCj4gIH07Cj4gIAo+ICtzdGF0aWMgY29uc3Qgc3RydWN0 IGNhbXNzX3Jlc291cmNlcyBoYXdpX3Jlc291cmNlcyA9IHsKPiArCS52ZXJzaW9uID0gQ0FNU1Nf SEFXSSwKPiArCS5wZF9uYW1lID0gInRvcCIsCj4gKwkucG1fY2xrcyA9IHsgImNwYXNfZmFzdF9h aGIiLCAiY3Bhc19haGIiLCAiZ2NjX2F4aV9oZiIgfSwKPiArCS50cGdfcmVzID0gdHBnX3Jlc184 Nzc1cCwKPiArCS5jc2lkX3JlcyA9IGNzaWRfcmVzX2hhd2ksCj4gKwkudmZlX3JlcyA9IHZmZV9y ZXNfaGF3aSwKPiArCS5pY2NfcmVzID0gaWNjX3Jlc19oYXdpLAo+ICsJLmljY19wYXRoX251bSA9 IEFSUkFZX1NJWkUoaWNjX3Jlc19oYXdpKSwKPiArCS5jc2lwaHlfbnVtID0gNiwKPiArCS50cGdf bnVtID0gQVJSQVlfU0laRSh0cGdfcmVzXzg3NzVwKSwKPiArCS5jc2lkX251bSA9IEFSUkFZX1NJ WkUoY3NpZF9yZXNfaGF3aSksCj4gKwkudmZlX251bSA9IEFSUkFZX1NJWkUodmZlX3Jlc19oYXdp KSwKPiArfTsKCltTZXZlcml0eTogTG93XQpEb2VzIHRoZSBjb21taXQgbWVzc2FnZSBtYXRjaCBo YXdpX3Jlc291cmNlcz8KClRoZSBjaGFuZ2Vsb2cgc3RhdGVzIHRoYXQgdGhlIENTSVBIWSByZXNv dXJjZSB0YWJsZSBpcyByZXVzZWQgZnJvbSBLYWFuYXBhbGksCnRoZSBUUEcgdGFibGUgaXMgcmV1 c2VkIGZyb20gWDFFODAxMDAsIGFuZCB0aGUgY29tbW9uIENQQVMgY2xvY2tzIGFyZSBtYW5hZ2Vk CmFzIFBNIGNsb2NrcyByYXRoZXIgdGhhbiBwZXItVkZFIGNsb2Nrcy4gIEhvd2V2ZXIsIGhhd2lf cmVzb3VyY2VzIHNldHMKLnRwZ19yZXMgdG8gdHBnX3Jlc184Nzc1cCAobm90IHRwZ19yZXNfeDFl ODAxMDApLCBoYXMgbm8gLmNzaXBoeV9yZXMgdGFibGUsCmFuZCB2ZmVfcmVzX2hhd2kgc3RpbGwg bGlzdHMgdGhlIHNoYXJlZCBjcGFzX21ub2NfaGYgYW5kIGNwYXNfbW5vY19zZiBjbG9ja3MKaW4g ZXZlcnkgVkZFIGVudHJ5IHJhdGhlciB0aGFuIGluIC5wbV9jbGtzLgoKLS0gClNhc2hpa28gQUkg cmV2aWV3IMK3IGh0dHBzOi8vc2FzaGlrby5kZXYvIy9wYXRjaHNldC8yMDI2MTEwNi1oYXdpLW1h aWxpLWNhbXNzLXY0LTAtZDUyOGM3YTc5N2I0QG9zcy5xdWFsY29tbS5jb20/cGFydD02CgotLSAK bGludXgtcGh5IG1haWxpbmcgbGlzdApsaW51eC1waHlAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRw czovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1waHkK