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 X-Spam-Level: X-Spam-Status: No, score=-10.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3543EC2D0C4 for ; Tue, 10 Dec 2019 21:33:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 08D9E2464B for ; Tue, 10 Dec 2019 21:33:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1576013599; bh=LBS17/9OocU4+KcWh4j4E05YvgO5fkf8tH6AOnJN0sA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=MwwTiqjIiwKR75IYg8LY005f1pJhVgeZR9e6693F5XUyv7Neqf3szTYtxg/iNs30J mh4acMB8dJ+OtkjvFp1vVhhKfdCkuwiKTnRlOYzcxQkVAy5/JQUlGPVIl/sSArLd2G KQdSTGMvgplZgK/YHINdF43aJqfyuZtnEvfLp3bg= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728499AbfLJVdR (ORCPT ); Tue, 10 Dec 2019 16:33:17 -0500 Received: from mail.kernel.org ([198.145.29.99]:37218 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728348AbfLJVdJ (ORCPT ); Tue, 10 Dec 2019 16:33:09 -0500 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 99D13207FF; Tue, 10 Dec 2019 21:33:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1576013588; bh=LBS17/9OocU4+KcWh4j4E05YvgO5fkf8tH6AOnJN0sA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kdaFhWem2i2zlkycAPk+Ji+ZFZ5nJs4qwTRGLDQqypT+9vMuu1LpHDI7STncvRX6R Ws45bXDzlRjXQ4xGpduCD3ZwnbsSpCqxRIg5HCICaWnLXMxv8tksgoGMcKWWpOXHW9 plg8ElWU8yZWkmulUk4Bmg9DXPi1AI7D8j6aZH3k= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Rodrigo Siqueira , Keith Packard , Maarten Lankhorst , =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= , Chris Wilson , Daniel Vetter , Pekka Paalanen , Sasha Levin , dri-devel@lists.freedesktop.org Subject: [PATCH AUTOSEL 4.19 039/177] drm/drm_vblank: Change EINVAL by the correct errno Date: Tue, 10 Dec 2019 16:30:03 -0500 Message-Id: <20191210213221.11921-39-sashal@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191210213221.11921-1-sashal@kernel.org> References: <20191210213221.11921-1-sashal@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Rodrigo Siqueira [ Upstream commit aed6105b28b10613f16c0bfe97525fe5a23338df ] For historical reasons, the function drm_wait_vblank_ioctl always return -EINVAL if something gets wrong. This scenario limits the flexibility for the userspace to make detailed verification of any problem and take some action. In particular, the validation of “if (!dev->irq_enabled)” in the drm_wait_vblank_ioctl is responsible for checking if the driver support vblank or not. If the driver does not support VBlank, the function drm_wait_vblank_ioctl returns EINVAL, which does not represent the real issue; this patch changes this behavior by return EOPNOTSUPP. Additionally, drm_crtc_get_sequence_ioctl and drm_crtc_queue_sequence_ioctl, also returns EINVAL if vblank is not supported; this patch also changes the return value to EOPNOTSUPP in these functions. Lastly, these functions are invoked by libdrm, which is used by many compositors; because of this, it is important to check if this change breaks any compositor. In this sense, the following projects were examined: * Drm-hwcomposer * Kwin * Sway * Wlroots * Wayland * Weston * Mutter * Xorg (67 different drivers) For each repository the verification happened in three steps: * Update the main branch * Look for any occurrence of "drmCrtcQueueSequence", "drmCrtcGetSequence", and "drmWaitVBlank" with the command git grep -n "STRING". * Look in the git history of the project with the command git log -S None of the above projects validate the use of EINVAL when using drmWaitVBlank(), which make safe, at least for these projects, to change the return values. On the other hand, mesa and xserver project uses drmCrtcQueueSequence() and drmCrtcGetSequence(); this change is harmless for both projects. Change since V5 (Pekka Paalanen): - Check if the change also affects Mutter Change since V4 (Daniel): - Also return EOPNOTSUPP in drm_crtc_[get|queue]_sequence_ioctl Change since V3: - Return EINVAL for _DRM_VBLANK_SIGNAL (Daniel) Change since V2: Daniel Vetter and Chris Wilson - Replace ENOTTY by EOPNOTSUPP - Return EINVAL if the parameters are wrong Cc: Keith Packard Cc: Maarten Lankhorst Cc: Ville Syrjälä Cc: Chris Wilson Cc: Daniel Vetter Cc: Pekka Paalanen Signed-off-by: Rodrigo Siqueira Reviewed-by: Daniel Vetter Acked-by: Pekka Paalanen Link: https://patchwork.freedesktop.org/patch/msgid/20191002140516.adeyj3htylimmlmg@smtp.gmail.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/drm_vblank.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c index d1859bcc7ccbc..33a72a84361ef 100644 --- a/drivers/gpu/drm/drm_vblank.c +++ b/drivers/gpu/drm/drm_vblank.c @@ -1572,7 +1572,7 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data, unsigned int flags, pipe, high_pipe; if (!dev->irq_enabled) - return -EINVAL; + return -EOPNOTSUPP; if (vblwait->request.type & _DRM_VBLANK_SIGNAL) return -EINVAL; @@ -1813,7 +1813,7 @@ int drm_crtc_get_sequence_ioctl(struct drm_device *dev, void *data, return -EINVAL; if (!dev->irq_enabled) - return -EINVAL; + return -EOPNOTSUPP; crtc = drm_crtc_find(dev, file_priv, get_seq->crtc_id); if (!crtc) @@ -1871,7 +1871,7 @@ int drm_crtc_queue_sequence_ioctl(struct drm_device *dev, void *data, return -EINVAL; if (!dev->irq_enabled) - return -EINVAL; + return -EOPNOTSUPP; crtc = drm_crtc_find(dev, file_priv, queue_seq->crtc_id); if (!crtc) -- 2.20.1 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 X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AAABDC43603 for ; Tue, 10 Dec 2019 21:33:10 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 79C7F2073B for ; Tue, 10 Dec 2019 21:33:10 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="kdaFhWem" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 79C7F2073B Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id F2B0F6E995; Tue, 10 Dec 2019 21:33:09 +0000 (UTC) Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by gabe.freedesktop.org (Postfix) with ESMTPS id CE6A26E995 for ; Tue, 10 Dec 2019 21:33:08 +0000 (UTC) Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 99D13207FF; Tue, 10 Dec 2019 21:33:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1576013588; bh=LBS17/9OocU4+KcWh4j4E05YvgO5fkf8tH6AOnJN0sA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kdaFhWem2i2zlkycAPk+Ji+ZFZ5nJs4qwTRGLDQqypT+9vMuu1LpHDI7STncvRX6R Ws45bXDzlRjXQ4xGpduCD3ZwnbsSpCqxRIg5HCICaWnLXMxv8tksgoGMcKWWpOXHW9 plg8ElWU8yZWkmulUk4Bmg9DXPi1AI7D8j6aZH3k= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH AUTOSEL 4.19 039/177] drm/drm_vblank: Change EINVAL by the correct errno Date: Tue, 10 Dec 2019 16:30:03 -0500 Message-Id: <20191210213221.11921-39-sashal@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191210213221.11921-1-sashal@kernel.org> References: <20191210213221.11921-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Sasha Levin , Keith Packard , Pekka Paalanen , Rodrigo Siqueira , dri-devel@lists.freedesktop.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" RnJvbTogUm9kcmlnbyBTaXF1ZWlyYSA8cm9kcmlnb3NpcXVlaXJhbWVsb0BnbWFpbC5jb20+Cgpb IFVwc3RyZWFtIGNvbW1pdCBhZWQ2MTA1YjI4YjEwNjEzZjE2YzBiZmU5NzUyNWZlNWEyMzMzOGRm IF0KCkZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHRoZSBmdW5jdGlvbiBkcm1fd2FpdF92Ymxhbmtf aW9jdGwgYWx3YXlzIHJldHVybgotRUlOVkFMIGlmIHNvbWV0aGluZyBnZXRzIHdyb25nLiBUaGlz IHNjZW5hcmlvIGxpbWl0cyB0aGUgZmxleGliaWxpdHkKZm9yIHRoZSB1c2Vyc3BhY2UgdG8gbWFr ZSBkZXRhaWxlZCB2ZXJpZmljYXRpb24gb2YgYW55IHByb2JsZW0gYW5kIHRha2UKc29tZSBhY3Rp b24uIEluIHBhcnRpY3VsYXIsIHRoZSB2YWxpZGF0aW9uIG9mIOKAnGlmICghZGV2LT5pcnFfZW5h YmxlZCnigJ0KaW4gdGhlIGRybV93YWl0X3ZibGFua19pb2N0bCBpcyByZXNwb25zaWJsZSBmb3Ig Y2hlY2tpbmcgaWYgdGhlIGRyaXZlcgpzdXBwb3J0IHZibGFuayBvciBub3QuIElmIHRoZSBkcml2 ZXIgZG9lcyBub3Qgc3VwcG9ydCBWQmxhbmssIHRoZQpmdW5jdGlvbiBkcm1fd2FpdF92Ymxhbmtf aW9jdGwgcmV0dXJucyBFSU5WQUwsIHdoaWNoIGRvZXMgbm90IHJlcHJlc2VudAp0aGUgcmVhbCBp c3N1ZTsgdGhpcyBwYXRjaCBjaGFuZ2VzIHRoaXMgYmVoYXZpb3IgYnkgcmV0dXJuIEVPUE5PVFNV UFAuCkFkZGl0aW9uYWxseSwgZHJtX2NydGNfZ2V0X3NlcXVlbmNlX2lvY3RsIGFuZApkcm1fY3J0 Y19xdWV1ZV9zZXF1ZW5jZV9pb2N0bCwgYWxzbyByZXR1cm5zIEVJTlZBTCBpZiB2YmxhbmsgaXMg bm90CnN1cHBvcnRlZDsgdGhpcyBwYXRjaCBhbHNvIGNoYW5nZXMgdGhlIHJldHVybiB2YWx1ZSB0 byBFT1BOT1RTVVBQIGluCnRoZXNlIGZ1bmN0aW9ucy4gTGFzdGx5LCB0aGVzZSBmdW5jdGlvbnMg YXJlIGludm9rZWQgYnkgbGliZHJtLCB3aGljaCBpcwp1c2VkIGJ5IG1hbnkgY29tcG9zaXRvcnM7 IGJlY2F1c2Ugb2YgdGhpcywgaXQgaXMgaW1wb3J0YW50IHRvIGNoZWNrIGlmCnRoaXMgY2hhbmdl IGJyZWFrcyBhbnkgY29tcG9zaXRvci4gSW4gdGhpcyBzZW5zZSwgdGhlIGZvbGxvd2luZyBwcm9q ZWN0cwp3ZXJlIGV4YW1pbmVkOgoKKiBEcm0taHdjb21wb3NlcgoqIEt3aW4KKiBTd2F5CiogV2xy b290cwoqIFdheWxhbmQKKiBXZXN0b24KKiBNdXR0ZXIKKiBYb3JnICg2NyBkaWZmZXJlbnQgZHJp dmVycykKCkZvciBlYWNoIHJlcG9zaXRvcnkgdGhlIHZlcmlmaWNhdGlvbiBoYXBwZW5lZCBpbiB0 aHJlZSBzdGVwczoKCiogVXBkYXRlIHRoZSBtYWluIGJyYW5jaAoqIExvb2sgZm9yIGFueSBvY2N1 cnJlbmNlIG9mICJkcm1DcnRjUXVldWVTZXF1ZW5jZSIsCiAgImRybUNydGNHZXRTZXF1ZW5jZSIs IGFuZCAiZHJtV2FpdFZCbGFuayIgd2l0aCB0aGUgY29tbWFuZCBnaXQgZ3JlcCAtbgogICJTVFJJ TkciLgoqIExvb2sgaW4gdGhlIGdpdCBoaXN0b3J5IG9mIHRoZSBwcm9qZWN0IHdpdGggdGhlIGNv bW1hbmQKZ2l0IGxvZyAtUzxTVFJJTkc+CgpOb25lIG9mIHRoZSBhYm92ZSBwcm9qZWN0cyB2YWxp ZGF0ZSB0aGUgdXNlIG9mIEVJTlZBTCB3aGVuIHVzaW5nCmRybVdhaXRWQmxhbmsoKSwgd2hpY2gg bWFrZSBzYWZlLCBhdCBsZWFzdCBmb3IgdGhlc2UgcHJvamVjdHMsIHRvIGNoYW5nZQp0aGUgcmV0 dXJuIHZhbHVlcy4gT24gdGhlIG90aGVyIGhhbmQsIG1lc2EgYW5kIHhzZXJ2ZXIgcHJvamVjdCB1 c2VzCmRybUNydGNRdWV1ZVNlcXVlbmNlKCkgYW5kIGRybUNydGNHZXRTZXF1ZW5jZSgpOyB0aGlz IGNoYW5nZSBpcyBoYXJtbGVzcwpmb3IgYm90aCBwcm9qZWN0cy4KCkNoYW5nZSBzaW5jZSBWNSAo UGVra2EgUGFhbGFuZW4pOgogLSBDaGVjayBpZiB0aGUgY2hhbmdlIGFsc28gYWZmZWN0cyBNdXR0 ZXIKCkNoYW5nZSBzaW5jZSBWNCAoRGFuaWVsKToKIC0gQWxzbyByZXR1cm4gRU9QTk9UU1VQUCBp biBkcm1fY3J0Y19bZ2V0fHF1ZXVlXV9zZXF1ZW5jZV9pb2N0bAoKQ2hhbmdlIHNpbmNlIFYzOgog LSBSZXR1cm4gRUlOVkFMIGZvciBfRFJNX1ZCTEFOS19TSUdOQUwgKERhbmllbCkKCkNoYW5nZSBz aW5jZSBWMjoKIERhbmllbCBWZXR0ZXIgYW5kIENocmlzIFdpbHNvbgogLSBSZXBsYWNlIEVOT1RU WSBieSBFT1BOT1RTVVBQCiAtIFJldHVybiBFSU5WQUwgaWYgdGhlIHBhcmFtZXRlcnMgYXJlIHdy b25nCgpDYzogS2VpdGggUGFja2FyZCA8a2VpdGhwQGtlaXRocC5jb20+CkNjOiBNYWFydGVuIExh bmtob3JzdCA8bWFhcnRlbi5sYW5raG9yc3RAbGludXguaW50ZWwuY29tPgpDYzogVmlsbGUgU3ly asOkbMOkIDx2aWxsZS5zeXJqYWxhQGxpbnV4LmludGVsLmNvbT4KQ2M6IENocmlzIFdpbHNvbiA8 Y2hyaXNAY2hyaXMtd2lsc29uLmNvLnVrPgpDYzogRGFuaWVsIFZldHRlciA8ZGFuaWVsQGZmd2xs LmNoPgpDYzogUGVra2EgUGFhbGFuZW4gPHBla2thLnBhYWxhbmVuQGNvbGxhYm9yYS5jb20+ClNp Z25lZC1vZmYtYnk6IFJvZHJpZ28gU2lxdWVpcmEgPHJvZHJpZ29zaXF1ZWlyYW1lbG9AZ21haWwu Y29tPgpSZXZpZXdlZC1ieTogRGFuaWVsIFZldHRlciA8ZGFuaWVsQGZmd2xsLmNoPgpBY2tlZC1i eTogUGVra2EgUGFhbGFuZW4gPHBla2thLnBhYWxhbmVuQGNvbGxhYm9yYS5jb20+Ckxpbms6IGh0 dHBzOi8vcGF0Y2h3b3JrLmZyZWVkZXNrdG9wLm9yZy9wYXRjaC9tc2dpZC8yMDE5MTAwMjE0MDUx Ni5hZGV5ajNodHlsaW1tbG1nQHNtdHAuZ21haWwuY29tClNpZ25lZC1vZmYtYnk6IFNhc2hhIExl dmluIDxzYXNoYWxAa2VybmVsLm9yZz4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vZHJtX3ZibGFuay5j IHwgNiArKystLS0KIDEgZmlsZSBjaGFuZ2VkLCAzIGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25z KC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV92YmxhbmsuYyBiL2RyaXZlcnMv Z3B1L2RybS9kcm1fdmJsYW5rLmMKaW5kZXggZDE4NTliY2M3Y2NiYy4uMzNhNzJhODQzNjFlZiAx MDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV92YmxhbmsuYworKysgYi9kcml2ZXJzL2dw dS9kcm0vZHJtX3ZibGFuay5jCkBAIC0xNTcyLDcgKzE1NzIsNyBAQCBpbnQgZHJtX3dhaXRfdmJs YW5rX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJdW5zaWduZWQg aW50IGZsYWdzLCBwaXBlLCBoaWdoX3BpcGU7CiAKIAlpZiAoIWRldi0+aXJxX2VuYWJsZWQpCi0J CXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlpZiAodmJsd2FpdC0+ cmVxdWVzdC50eXBlICYgX0RSTV9WQkxBTktfU0lHTkFMKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAg LTE4MTMsNyArMTgxMyw3IEBAIGludCBkcm1fY3J0Y19nZXRfc2VxdWVuY2VfaW9jdGwoc3RydWN0 IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAo IWRldi0+aXJxX2VuYWJsZWQpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gLUVPUE5PVFNV UFA7CiAKIAljcnRjID0gZHJtX2NydGNfZmluZChkZXYsIGZpbGVfcHJpdiwgZ2V0X3NlcS0+Y3J0 Y19pZCk7CiAJaWYgKCFjcnRjKQpAQCAtMTg3MSw3ICsxODcxLDcgQEAgaW50IGRybV9jcnRjX3F1 ZXVlX3NlcXVlbmNlX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJ CXJldHVybiAtRUlOVkFMOwogCiAJaWYgKCFkZXYtPmlycV9lbmFibGVkKQotCQlyZXR1cm4gLUVJ TlZBTDsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJY3J0YyA9IGRybV9jcnRjX2ZpbmQoZGV2 LCBmaWxlX3ByaXYsIHF1ZXVlX3NlcS0+Y3J0Y19pZCk7CiAJaWYgKCFjcnRjKQotLSAKMi4yMC4x CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2 ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9s aXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK