From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751825AbeBUID4 (ORCPT ); Wed, 21 Feb 2018 03:03:56 -0500 Received: from mail-lf0-f68.google.com ([209.85.215.68]:45750 "EHLO mail-lf0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751717AbeBUIDx (ORCPT ); Wed, 21 Feb 2018 03:03:53 -0500 X-Google-Smtp-Source: AH8x226F5++OX+lCkXc+RGqyvKFnTmqreywuMNRhmZVI3mhjtK2OJMJu18Yo3gsOxs2mJIDLxndANw== From: Oleksandr Andrushchenko To: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, airlied@linux.ie, daniel.vetter@intel.com, seanpaul@chromium.org, gustavo@padovan.org, jgross@suse.com, boris.ostrovsky@oracle.com, konrad.wilk@oracle.com Cc: andr2000@gmail.com, Oleksandr Andrushchenko Subject: [PATCH 0/9] drm/xen-front: Add support for Xen PV display frontend Date: Wed, 21 Feb 2018 10:03:33 +0200 Message-Id: <1519200222-20623-1-git-send-email-andr2000@gmail.com> X-Mailer: git-send-email 2.7.4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Oleksandr Andrushchenko Hello! This patch series adds support for Xen [1] para-virtualized frontend display driver. It implements the protocol from include/xen/interface/io/displif.h [2]. Accompanying backend [3] is implemented as a user-space application and its helper library [4], capable of running as a Weston client or DRM master. Configuration of both backend and frontend is done via Xen guest domain configuration options [5]. ******************************************************************************* * Driver limitations ******************************************************************************* 1. Configuration options 1.1 (contiguous display buffers) and 2 (backend allocated buffers) below are not supported at the same time. 2. Only primary plane without additional properties is supported. 3. Only one video mode supported which resolution is configured via XenStore. 4. All CRTCs operate at fixed frequency of 60Hz. ******************************************************************************* * Driver modes of operation in terms of display buffers used ******************************************************************************* Depending on the requirements for the para-virtualized environment, namely requirements dictated by the accompanying DRM/(v)GPU drivers running in both host and guest environments, number of operating modes of para-virtualized display driver are supported: - display buffers can be allocated by either frontend driver or backend - display buffers can be allocated to be contiguous in memory or not Note! Frontend driver itself has no dependency on contiguous memory for its operation. ******************************************************************************* * 1. Buffers allocated by the frontend driver. ******************************************************************************* The below modes of operation are configured at compile-time via frontend driver's kernel configuration. 1.1. Front driver configured to use GEM CMA helpers This use-case is useful when used with accompanying DRM/vGPU driver in guest domain which was designed to only work with contiguous buffers, e.g. DRM driver based on GEM CMA helpers: such drivers can only import contiguous PRIME buffers, thus requiring frontend driver to provide such. In order to implement this mode of operation para-virtualized frontend driver can be configured to use GEM CMA helpers. 1.2. Front driver doesn't use GEM CMA If accompanying drivers can cope with non-contiguous memory then, to lower pressure on CMA subsystem of the kernel, driver can allocate buffers from system memory. Note! If used with accompanying DRM/(v)GPU drivers this mode of operation may require IOMMU support on the platform, so accompanying DRM/vGPU hardware can still reach display buffer memory while importing PRIME buffers from the frontend driver. ******************************************************************************* * 2. Buffers allocated by the backend ******************************************************************************* This mode of operation is run-time configured via guest domain configuration through XenStore entries. For systems which do not provide IOMMU support, but having specific requirements for display buffers it is possible to allocate such buffers at backend side and share those with the frontend. For example, if host domain is 1:1 mapped and has DRM/GPU hardware expecting physically contiguous memory, this allows implementing zero-copying use-cases. I would like to thank at least, but not at last the following people/communities who helped this driver to happen ;) 1. My team at EPAM for continuous support 2. Xen community for answering tons of questions on different modes of operation of the driver with respect to virtualized environment. 3. Rob Clark for "GEM allocation for para-virtualized DRM driver" [6] 4. Maarten Lankhorst for "Atomic driver and old remove FB behavior" [7] 5. Ville Syrjälä for "Questions on page flips and atomic modeset" [8] Thank you, Oleksandr Andrushchenko P.S. There are two dependencies for this driver limiting some of the use-cases which are on review now: 1. "drm/simple_kms_helper: Add {enable|disable}_vblank callback support" [9] 2. "drm/simple_kms_helper: Fix NULL pointer dereference with no active CRTC" [10] [1] https://wiki.xen.org/wiki/Paravirtualization_(PV)#PV_IO_Drivers [2] https://elixir.bootlin.com/linux/v4.16-rc2/source/include/xen/interface/io/displif.h [3] https://github.com/xen-troops/displ_be [4] https://github.com/xen-troops/libxenbe [5] https://xenbits.xen.org/gitweb/?p=xen.git;a=blob;f=docs/man/xl.cfg.pod.5.in;h=a699367779e2ae1212ff8f638eff0206ec1a1cc9;hb=refs/heads/master#l1257 [6] https://lists.freedesktop.org/archives/dri-devel/2017-March/136038.html [7] https://www.spinics.net/lists/dri-devel/msg164102.html [8] https://www.spinics.net/lists/dri-devel/msg164463.html [9] https://patchwork.freedesktop.org/series/38073/ [10] https://patchwork.freedesktop.org/series/38139/ Oleksandr Andrushchenko (9): drm/xen-front: Introduce Xen para-virtualized frontend driver drm/xen-front: Implement Xen bus state handling drm/xen-front: Read driver configuration from Xen store drm/xen-front: Implement Xen event channel handling drm/xen-front: Implement handling of shared display buffers drm/xen-front: Introduce DRM/KMS virtual display driver drm/xen-front: Implement KMS/connector handling drm/xen-front: Implement GEM operations drm/xen-front: Implement communication with backend drivers/gpu/drm/Kconfig | 2 + drivers/gpu/drm/Makefile | 1 + drivers/gpu/drm/xen/Kconfig | 30 ++ drivers/gpu/drm/xen/Makefile | 17 + drivers/gpu/drm/xen/xen_drm_front.c | 712 ++++++++++++++++++++++++++++ drivers/gpu/drm/xen/xen_drm_front.h | 154 ++++++ drivers/gpu/drm/xen/xen_drm_front_cfg.c | 84 ++++ drivers/gpu/drm/xen/xen_drm_front_cfg.h | 45 ++ drivers/gpu/drm/xen/xen_drm_front_conn.c | 125 +++++ drivers/gpu/drm/xen/xen_drm_front_conn.h | 35 ++ drivers/gpu/drm/xen/xen_drm_front_drv.c | 294 ++++++++++++ drivers/gpu/drm/xen/xen_drm_front_drv.h | 73 +++ drivers/gpu/drm/xen/xen_drm_front_evtchnl.c | 399 ++++++++++++++++ drivers/gpu/drm/xen/xen_drm_front_evtchnl.h | 89 ++++ drivers/gpu/drm/xen/xen_drm_front_gem.c | 360 ++++++++++++++ drivers/gpu/drm/xen/xen_drm_front_gem.h | 46 ++ drivers/gpu/drm/xen/xen_drm_front_gem_cma.c | 93 ++++ drivers/gpu/drm/xen/xen_drm_front_kms.c | 299 ++++++++++++ drivers/gpu/drm/xen/xen_drm_front_kms.h | 30 ++ drivers/gpu/drm/xen/xen_drm_front_shbuf.c | 430 +++++++++++++++++ drivers/gpu/drm/xen/xen_drm_front_shbuf.h | 80 ++++ 21 files changed, 3398 insertions(+) create mode 100644 drivers/gpu/drm/xen/Kconfig create mode 100644 drivers/gpu/drm/xen/Makefile create mode 100644 drivers/gpu/drm/xen/xen_drm_front.c create mode 100644 drivers/gpu/drm/xen/xen_drm_front.h create mode 100644 drivers/gpu/drm/xen/xen_drm_front_cfg.c create mode 100644 drivers/gpu/drm/xen/xen_drm_front_cfg.h create mode 100644 drivers/gpu/drm/xen/xen_drm_front_conn.c create mode 100644 drivers/gpu/drm/xen/xen_drm_front_conn.h create mode 100644 drivers/gpu/drm/xen/xen_drm_front_drv.c create mode 100644 drivers/gpu/drm/xen/xen_drm_front_drv.h create mode 100644 drivers/gpu/drm/xen/xen_drm_front_evtchnl.c create mode 100644 drivers/gpu/drm/xen/xen_drm_front_evtchnl.h create mode 100644 drivers/gpu/drm/xen/xen_drm_front_gem.c create mode 100644 drivers/gpu/drm/xen/xen_drm_front_gem.h create mode 100644 drivers/gpu/drm/xen/xen_drm_front_gem_cma.c create mode 100644 drivers/gpu/drm/xen/xen_drm_front_kms.c create mode 100644 drivers/gpu/drm/xen/xen_drm_front_kms.h create mode 100644 drivers/gpu/drm/xen/xen_drm_front_shbuf.c create mode 100644 drivers/gpu/drm/xen/xen_drm_front_shbuf.h -- 2.7.4 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: [PATCH 0/9] drm/xen-front: Add support for Xen PV display frontend Date: Wed, 21 Feb 2018 10:03:33 +0200 Message-ID: <1519200222-20623-1-git-send-email-andr2000@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-lf0-x243.google.com (mail-lf0-x243.google.com [IPv6:2a00:1450:4010:c07::243]) by gabe.freedesktop.org (Postfix) with ESMTPS id 2DCBC6E547 for ; Wed, 21 Feb 2018 08:03:53 +0000 (UTC) Received: by mail-lf0-x243.google.com with SMTP id y19so1079594lfd.4 for ; Wed, 21 Feb 2018 00:03:52 -0800 (PST) List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, airlied@linux.ie, daniel.vetter@intel.com, seanpaul@chromium.org, gustavo@padovan.org, jgross@suse.com, boris.ostrovsky@oracle.com, konrad.wilk@oracle.com Cc: andr2000@gmail.com, Oleksandr Andrushchenko List-Id: dri-devel@lists.freedesktop.org RnJvbTogT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gPG9sZWtzYW5kcl9hbmRydXNoY2hlbmtvQGVw YW0uY29tPgoKSGVsbG8hCgpUaGlzIHBhdGNoIHNlcmllcyBhZGRzIHN1cHBvcnQgZm9yIFhlbiBb MV0gcGFyYS12aXJ0dWFsaXplZApmcm9udGVuZCBkaXNwbGF5IGRyaXZlci4gSXQgaW1wbGVtZW50 cyB0aGUgcHJvdG9jb2wgZnJvbQppbmNsdWRlL3hlbi9pbnRlcmZhY2UvaW8vZGlzcGxpZi5oIFsy XS4KQWNjb21wYW55aW5nIGJhY2tlbmQgWzNdIGlzIGltcGxlbWVudGVkIGFzIGEgdXNlci1zcGFj ZSBhcHBsaWNhdGlvbgphbmQgaXRzIGhlbHBlciBsaWJyYXJ5IFs0XSwgY2FwYWJsZSBvZiBydW5u aW5nIGFzIGEgV2VzdG9uIGNsaWVudApvciBEUk0gbWFzdGVyLgpDb25maWd1cmF0aW9uIG9mIGJv dGggYmFja2VuZCBhbmQgZnJvbnRlbmQgaXMgZG9uZSB2aWEgClhlbiBndWVzdCBkb21haW4gY29u ZmlndXJhdGlvbiBvcHRpb25zIFs1XS4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBEcml2ZXIg bGltaXRhdGlvbnMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogMS4gQ29uZmlndXJhdGlvbiBvcHRp b25zIDEuMSAoY29udGlndW91cyBkaXNwbGF5IGJ1ZmZlcnMpIGFuZCAyIChiYWNrZW5kCiAgICBh bGxvY2F0ZWQgYnVmZmVycykgYmVsb3cgYXJlIG5vdCBzdXBwb3J0ZWQgYXQgdGhlIHNhbWUgdGlt ZS4KCiAyLiBPbmx5IHByaW1hcnkgcGxhbmUgd2l0aG91dCBhZGRpdGlvbmFsIHByb3BlcnRpZXMg aXMgc3VwcG9ydGVkLgoKIDMuIE9ubHkgb25lIHZpZGVvIG1vZGUgc3VwcG9ydGVkIHdoaWNoIHJl c29sdXRpb24gaXMgY29uZmlndXJlZCB2aWEgWGVuU3RvcmUuCgogNC4gQWxsIENSVENzIG9wZXJh dGUgYXQgZml4ZWQgZnJlcXVlbmN5IG9mIDYwSHouCgoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiog RHJpdmVyIG1vZGVzIG9mIG9wZXJhdGlvbiBpbiB0ZXJtcyBvZiBkaXNwbGF5IGJ1ZmZlcnMgdXNl ZAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqCiBEZXBlbmRpbmcgb24gdGhlIHJlcXVpcmVtZW50cyBm b3IgdGhlIHBhcmEtdmlydHVhbGl6ZWQgZW52aXJvbm1lbnQsIG5hbWVseQogcmVxdWlyZW1lbnRz IGRpY3RhdGVkIGJ5IHRoZSBhY2NvbXBhbnlpbmcgRFJNLyh2KUdQVSBkcml2ZXJzIHJ1bm5pbmcg aW4gYm90aAogaG9zdCBhbmQgZ3Vlc3QgZW52aXJvbm1lbnRzLCBudW1iZXIgb2Ygb3BlcmF0aW5n IG1vZGVzIG9mIHBhcmEtdmlydHVhbGl6ZWQKIGRpc3BsYXkgZHJpdmVyIGFyZSBzdXBwb3J0ZWQ6 CiAgLSBkaXNwbGF5IGJ1ZmZlcnMgY2FuIGJlIGFsbG9jYXRlZCBieSBlaXRoZXIgZnJvbnRlbmQg ZHJpdmVyIG9yIGJhY2tlbmQKICAtIGRpc3BsYXkgYnVmZmVycyBjYW4gYmUgYWxsb2NhdGVkIHRv IGJlIGNvbnRpZ3VvdXMgaW4gbWVtb3J5IG9yIG5vdAoKIE5vdGUhIEZyb250ZW5kIGRyaXZlciBp dHNlbGYgaGFzIG5vIGRlcGVuZGVuY3kgb24gY29udGlndW91cyBtZW1vcnkgZm9yCiAgICAgICBp dHMgb3BlcmF0aW9uLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIDEuIEJ1ZmZlcnMgYWxsb2Nh dGVkIGJ5IHRoZSBmcm9udGVuZCBkcml2ZXIuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBUaGUg YmVsb3cgbW9kZXMgb2Ygb3BlcmF0aW9uIGFyZSBjb25maWd1cmVkIGF0IGNvbXBpbGUtdGltZSB2 aWEKIGZyb250ZW5kIGRyaXZlcidzIGtlcm5lbCBjb25maWd1cmF0aW9uLgoKIDEuMS4gRnJvbnQg ZHJpdmVyIGNvbmZpZ3VyZWQgdG8gdXNlIEdFTSBDTUEgaGVscGVycwogICAgICBUaGlzIHVzZS1j YXNlIGlzIHVzZWZ1bCB3aGVuIHVzZWQgd2l0aCBhY2NvbXBhbnlpbmcgRFJNL3ZHUFUgZHJpdmVy IGluCiAgICAgIGd1ZXN0IGRvbWFpbiB3aGljaCB3YXMgZGVzaWduZWQgdG8gb25seSB3b3JrIHdp dGggY29udGlndW91cyBidWZmZXJzLAogICAgICBlLmcuIERSTSBkcml2ZXIgYmFzZWQgb24gR0VN IENNQSBoZWxwZXJzOiBzdWNoIGRyaXZlcnMgY2FuIG9ubHkgaW1wb3J0CiAgICAgIGNvbnRpZ3Vv dXMgUFJJTUUgYnVmZmVycywgdGh1cyByZXF1aXJpbmcgZnJvbnRlbmQgZHJpdmVyIHRvIHByb3Zp ZGUKICAgICAgc3VjaC4gSW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoaXMgbW9kZSBvZiBvcGVyYXRp b24gcGFyYS12aXJ0dWFsaXplZAogICAgICBmcm9udGVuZCBkcml2ZXIgY2FuIGJlIGNvbmZpZ3Vy ZWQgdG8gdXNlIEdFTSBDTUEgaGVscGVycy4KCiAxLjIuIEZyb250IGRyaXZlciBkb2Vzbid0IHVz ZSBHRU0gQ01BCiAgICAgIElmIGFjY29tcGFueWluZyBkcml2ZXJzIGNhbiBjb3BlIHdpdGggbm9u LWNvbnRpZ3VvdXMgbWVtb3J5IHRoZW4sIHRvCiAgICAgIGxvd2VyIHByZXNzdXJlIG9uIENNQSBz dWJzeXN0ZW0gb2YgdGhlIGtlcm5lbCwgZHJpdmVyIGNhbiBhbGxvY2F0ZQogICAgICBidWZmZXJz IGZyb20gc3lzdGVtIG1lbW9yeS4KCiBOb3RlISBJZiB1c2VkIHdpdGggYWNjb21wYW55aW5nIERS TS8odilHUFUgZHJpdmVycyB0aGlzIG1vZGUgb2Ygb3BlcmF0aW9uCiAgIG1heSByZXF1aXJlIElP TU1VIHN1cHBvcnQgb24gdGhlIHBsYXRmb3JtLCBzbyBhY2NvbXBhbnlpbmcgRFJNL3ZHUFUKICAg aGFyZHdhcmUgY2FuIHN0aWxsIHJlYWNoIGRpc3BsYXkgYnVmZmVyIG1lbW9yeSB3aGlsZSBpbXBv cnRpbmcgUFJJTUUKICAgYnVmZmVycyBmcm9tIHRoZSBmcm9udGVuZCBkcml2ZXIuCgoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqCiogMi4gQnVmZmVycyBhbGxvY2F0ZWQgYnkgdGhlIGJhY2tlbmQKKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKgoKIFRoaXMgbW9kZSBvZiBvcGVyYXRpb24gaXMgcnVuLXRpbWUg Y29uZmlndXJlZCB2aWEgZ3Vlc3QgZG9tYWluIGNvbmZpZ3VyYXRpb24KIHRocm91Z2ggWGVuU3Rv cmUgZW50cmllcy4KCiBGb3Igc3lzdGVtcyB3aGljaCBkbyBub3QgcHJvdmlkZSBJT01NVSBzdXBw b3J0LCBidXQgaGF2aW5nIHNwZWNpZmljCiByZXF1aXJlbWVudHMgZm9yIGRpc3BsYXkgYnVmZmVy cyBpdCBpcyBwb3NzaWJsZSB0byBhbGxvY2F0ZSBzdWNoIGJ1ZmZlcnMKIGF0IGJhY2tlbmQgc2lk ZSBhbmQgc2hhcmUgdGhvc2Ugd2l0aCB0aGUgZnJvbnRlbmQuCiBGb3IgZXhhbXBsZSwgaWYgaG9z dCBkb21haW4gaXMgMToxIG1hcHBlZCBhbmQgaGFzIERSTS9HUFUgaGFyZHdhcmUgZXhwZWN0aW5n CiBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5LCB0aGlzIGFsbG93cyBpbXBsZW1lbnRpbmcg emVyby1jb3B5aW5nCiB1c2UtY2FzZXMuCgoKSSB3b3VsZCBsaWtlIHRvIHRoYW5rIGF0IGxlYXN0 LCBidXQgbm90IGF0IGxhc3QgdGhlIGZvbGxvd2luZwpwZW9wbGUvY29tbXVuaXRpZXMgd2hvIGhl bHBlZCB0aGlzIGRyaXZlciB0byBoYXBwZW4gOykKCjEuIE15IHRlYW0gYXQgRVBBTSBmb3IgY29u dGludW91cyBzdXBwb3J0CjIuIFhlbiBjb21tdW5pdHkgZm9yIGFuc3dlcmluZyB0b25zIG9mIHF1 ZXN0aW9ucyBvbiBkaWZmZXJlbnQKbW9kZXMgb2Ygb3BlcmF0aW9uIG9mIHRoZSBkcml2ZXIgd2l0 aCByZXNwZWN0IHRvIHZpcnR1YWxpemVkCmVudmlyb25tZW50LgozLiBSb2IgQ2xhcmsgZm9yICJH RU0gYWxsb2NhdGlvbiBmb3IgcGFyYS12aXJ0dWFsaXplZCBEUk0gZHJpdmVyIiBbNl0KNC4gTWFh cnRlbiBMYW5raG9yc3QgZm9yICJBdG9taWMgZHJpdmVyIGFuZCBvbGQgcmVtb3ZlIEZCIGJlaGF2 aW9yIiBbN10KNS4gVmlsbGUgU3lyasOkbMOkIGZvciAiUXVlc3Rpb25zIG9uIHBhZ2UgZmxpcHMg YW5kIGF0b21pYyBtb2Rlc2V0IiBbOF0KClRoYW5rIHlvdSwKT2xla3NhbmRyIEFuZHJ1c2hjaGVu a28KClAuUy4gVGhlcmUgYXJlIHR3byBkZXBlbmRlbmNpZXMgZm9yIHRoaXMgZHJpdmVyIGxpbWl0 aW5nIHNvbWUgb2YgdGhlCnVzZS1jYXNlcyB3aGljaCBhcmUgb24gcmV2aWV3IG5vdzoKMS4gImRy bS9zaW1wbGVfa21zX2hlbHBlcjogQWRkIHtlbmFibGV8ZGlzYWJsZX1fdmJsYW5rIGNhbGxiYWNr IHN1cHBvcnQiIFs5XQoyLiAiZHJtL3NpbXBsZV9rbXNfaGVscGVyOiBGaXggTlVMTCBwb2ludGVy IGRlcmVmZXJlbmNlIHdpdGggbm8gYWN0aXZlIENSVEMiIFsxMF0KClsxXSBodHRwczovL3dpa2ku eGVuLm9yZy93aWtpL1BhcmF2aXJ0dWFsaXphdGlvbl8oUFYpI1BWX0lPX0RyaXZlcnMKWzJdIGh0 dHBzOi8vZWxpeGlyLmJvb3RsaW4uY29tL2xpbnV4L3Y0LjE2LXJjMi9zb3VyY2UvaW5jbHVkZS94 ZW4vaW50ZXJmYWNlL2lvL2Rpc3BsaWYuaApbM10gaHR0cHM6Ly9naXRodWIuY29tL3hlbi10cm9v cHMvZGlzcGxfYmUKWzRdIGh0dHBzOi8vZ2l0aHViLmNvbS94ZW4tdHJvb3BzL2xpYnhlbmJlCls1 XSBodHRwczovL3hlbmJpdHMueGVuLm9yZy9naXR3ZWIvP3A9eGVuLmdpdDthPWJsb2I7Zj1kb2Nz L21hbi94bC5jZmcucG9kLjUuaW47aD1hNjk5MzY3Nzc5ZTJhZTEyMTJmZjhmNjM4ZWZmMDIwNmVj MWExY2M5O2hiPXJlZnMvaGVhZHMvbWFzdGVyI2wxMjU3Cls2XSBodHRwczovL2xpc3RzLmZyZWVk ZXNrdG9wLm9yZy9hcmNoaXZlcy9kcmktZGV2ZWwvMjAxNy1NYXJjaC8xMzYwMzguaHRtbApbN10g aHR0cHM6Ly93d3cuc3Bpbmljcy5uZXQvbGlzdHMvZHJpLWRldmVsL21zZzE2NDEwMi5odG1sCls4 XSBodHRwczovL3d3dy5zcGluaWNzLm5ldC9saXN0cy9kcmktZGV2ZWwvbXNnMTY0NDYzLmh0bWwK WzldIGh0dHBzOi8vcGF0Y2h3b3JrLmZyZWVkZXNrdG9wLm9yZy9zZXJpZXMvMzgwNzMvClsxMF0g aHR0cHM6Ly9wYXRjaHdvcmsuZnJlZWRlc2t0b3Aub3JnL3Nlcmllcy8zODEzOS8KCk9sZWtzYW5k ciBBbmRydXNoY2hlbmtvICg5KToKICBkcm0veGVuLWZyb250OiBJbnRyb2R1Y2UgWGVuIHBhcmEt dmlydHVhbGl6ZWQgZnJvbnRlbmQgZHJpdmVyCiAgZHJtL3hlbi1mcm9udDogSW1wbGVtZW50IFhl biBidXMgc3RhdGUgaGFuZGxpbmcKICBkcm0veGVuLWZyb250OiBSZWFkIGRyaXZlciBjb25maWd1 cmF0aW9uIGZyb20gWGVuIHN0b3JlCiAgZHJtL3hlbi1mcm9udDogSW1wbGVtZW50IFhlbiBldmVu dCBjaGFubmVsIGhhbmRsaW5nCiAgZHJtL3hlbi1mcm9udDogSW1wbGVtZW50IGhhbmRsaW5nIG9m IHNoYXJlZCBkaXNwbGF5IGJ1ZmZlcnMKICBkcm0veGVuLWZyb250OiBJbnRyb2R1Y2UgRFJNL0tN UyB2aXJ0dWFsIGRpc3BsYXkgZHJpdmVyCiAgZHJtL3hlbi1mcm9udDogSW1wbGVtZW50IEtNUy9j b25uZWN0b3IgaGFuZGxpbmcKICBkcm0veGVuLWZyb250OiBJbXBsZW1lbnQgR0VNIG9wZXJhdGlv bnMKICBkcm0veGVuLWZyb250OiBJbXBsZW1lbnQgY29tbXVuaWNhdGlvbiB3aXRoIGJhY2tlbmQK CiBkcml2ZXJzL2dwdS9kcm0vS2NvbmZpZyAgICAgICAgICAgICAgICAgICAgIHwgICAyICsKIGRy aXZlcnMvZ3B1L2RybS9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgfCAgIDEgKwogZHJpdmVy cy9ncHUvZHJtL3hlbi9LY29uZmlnICAgICAgICAgICAgICAgICB8ICAzMCArKwogZHJpdmVycy9n cHUvZHJtL3hlbi9NYWtlZmlsZSAgICAgICAgICAgICAgICB8ICAxNyArCiBkcml2ZXJzL2dwdS9k cm0veGVuL3hlbl9kcm1fZnJvbnQuYyAgICAgICAgIHwgNzEyICsrKysrKysrKysrKysrKysrKysr KysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udC5oICAgICAgICAgfCAx NTQgKysrKysrCiBkcml2ZXJzL2dwdS9kcm0veGVuL3hlbl9kcm1fZnJvbnRfY2ZnLmMgICAgIHwg IDg0ICsrKysKIGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9jZmcuaCAgICAgfCAg NDUgKysKIGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9jb25uLmMgICAgfCAxMjUg KysrKysKIGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9jb25uLmggICAgfCAgMzUg KysKIGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9kcnYuYyAgICAgfCAyOTQgKysr KysrKysrKysrCiBkcml2ZXJzL2dwdS9kcm0veGVuL3hlbl9kcm1fZnJvbnRfZHJ2LmggICAgIHwg IDczICsrKwogZHJpdmVycy9ncHUvZHJtL3hlbi94ZW5fZHJtX2Zyb250X2V2dGNobmwuYyB8IDM5 OSArKysrKysrKysrKysrKysrCiBkcml2ZXJzL2dwdS9kcm0veGVuL3hlbl9kcm1fZnJvbnRfZXZ0 Y2hubC5oIHwgIDg5ICsrKysKIGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9nZW0u YyAgICAgfCAzNjAgKysrKysrKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9m cm9udF9nZW0uaCAgICAgfCAgNDYgKysKIGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9u dF9nZW1fY21hLmMgfCAgOTMgKysrKwogZHJpdmVycy9ncHUvZHJtL3hlbi94ZW5fZHJtX2Zyb250 X2ttcy5jICAgICB8IDI5OSArKysrKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2Ry bV9mcm9udF9rbXMuaCAgICAgfCAgMzAgKysKIGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9m cm9udF9zaGJ1Zi5jICAgfCA0MzAgKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS94 ZW4veGVuX2RybV9mcm9udF9zaGJ1Zi5oICAgfCAgODAgKysrKwogMjEgZmlsZXMgY2hhbmdlZCwg MzM5OCBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3hl bi9LY29uZmlnCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3hlbi9NYWtlZmls ZQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udC5j CiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3hlbi94ZW5fZHJtX2Zyb250LmgK IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0veGVuL3hlbl9kcm1fZnJvbnRfY2Zn LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0veGVuL3hlbl9kcm1fZnJvbnRf Y2ZnLmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0veGVuL3hlbl9kcm1fZnJv bnRfY29ubi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3hlbi94ZW5fZHJt X2Zyb250X2Nvbm4uaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS94ZW4veGVu X2RybV9mcm9udF9kcnYuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS94ZW4v eGVuX2RybV9mcm9udF9kcnYuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS94 ZW4veGVuX2RybV9mcm9udF9ldnRjaG5sLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dw dS9kcm0veGVuL3hlbl9kcm1fZnJvbnRfZXZ0Y2hubC5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJp dmVycy9ncHUvZHJtL3hlbi94ZW5fZHJtX2Zyb250X2dlbS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQg ZHJpdmVycy9ncHUvZHJtL3hlbi94ZW5fZHJtX2Zyb250X2dlbS5oCiBjcmVhdGUgbW9kZSAxMDA2 NDQgZHJpdmVycy9ncHUvZHJtL3hlbi94ZW5fZHJtX2Zyb250X2dlbV9jbWEuYwogY3JlYXRlIG1v ZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9rbXMuYwogY3JlYXRl IG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9rbXMuaAogY3Jl YXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udF9zaGJ1Zi5j CiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3hlbi94ZW5fZHJtX2Zyb250X3No YnVmLmgKCi0tIAoyLjcuNAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0 b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJp LWRldmVsCg==