From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753185AbeDXJDd (ORCPT ); Tue, 24 Apr 2018 05:03:33 -0400 Received: from mail-lf0-f50.google.com ([209.85.215.50]:36083 "EHLO mail-lf0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753084AbeDXJD2 (ORCPT ); Tue, 24 Apr 2018 05:03:28 -0400 X-Google-Smtp-Source: AB8JxZpDC6kMYyGwjRbFsUMkBFP8m5Q6GaVgB5A1ZEvboJ4YCBlc2Zn76BB2ZvDkeyyHhu1nCCnOoQ== Subject: Re: [Xen-devel] [PATCH 0/1] drm/xen-zcopy: Add Xen zero-copy helper DRM driver To: Juergen Gross , Boris Ostrovsky , Wei Liu Cc: =?UTF-8?Q?Roger_Pau_Monn=c3=a9?= , Artem Mygaiev , Dongwon Kim , konrad.wilk@oracle.com, airlied@linux.ie, "Oleksandr_Andrushchenko@epam.com" , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, "Potrola, MateuszX" , xen-devel@lists.xenproject.org, daniel.vetter@intel.com References: <5d8fec7f-956c-378f-be90-f45029385740@gmail.com> <20180416192905.GA18096@downor-Z87X-UD5H> <20180417075928.GT31310@phenom.ffwll.local> <20180417205744.GA15930@downor-Z87X-UD5H> <41487acb-a67a-8933-d0c3-702c19b0938e@gmail.com> <20180418073508.ptvntwedczpvl7bx@MacBook-Pro-de-Roger.local> <20180418101058.hyqk3gr3b2ibxswu@MacBook-Pro-de-Roger.local> <20180420071914.GG31310@phenom.ffwll.local> <76cdc65a-7bb1-9377-7bc5-6164e32f7b5d@gmail.com> <20180423115242.ywdwqblj2aseu3fr@citrix.com> <61105351-8896-072b-abf0-757c7f6c0edf@gmail.com> <30ddb005-96c8-f47c-2e23-4e0d354e5842@gmail.com> <6089d701-5221-75b4-38eb-b23bc5dc30cd@suse.com> From: Oleksandr Andrushchenko Message-ID: <85fc8f82-6d4d-9343-2737-85b7d7391168@gmail.com> Date: Tue, 24 Apr 2018 12:03:24 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 MIME-Version: 1.0 In-Reply-To: <6089d701-5221-75b4-38eb-b23bc5dc30cd@suse.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 04/24/2018 11:40 AM, Juergen Gross wrote: > On 24/04/18 10:07, Oleksandr Andrushchenko wrote: >> On 04/24/2018 10:51 AM, Juergen Gross wrote: >>> On 24/04/18 07:43, Oleksandr Andrushchenko wrote: >>>> On 04/24/2018 01:41 AM, Boris Ostrovsky wrote: >>>>> On 04/23/2018 08:10 AM, Oleksandr Andrushchenko wrote: >>>>>> On 04/23/2018 02:52 PM, Wei Liu wrote: >>>>>>> On Fri, Apr 20, 2018 at 02:25:20PM +0300, Oleksandr Andrushchenko >>>>>>> wrote: >>>>>>>>>>        the gntdev. >>>>>>>>>> >>>>>>>>>> I think this is generic enough that it could be implemented by a >>>>>>>>>> device not tied to Xen. AFAICT the hyper_dma guys also wanted >>>>>>>>>> something similar to this. >>>>>>>>> You can't just wrap random userspace memory into a dma-buf. We've >>>>>>>>> just had >>>>>>>>> this discussion with kvm/qemu folks, who proposed just that, and >>>>>>>>> after a >>>>>>>>> bit of discussion they'll now try to have a driver which just >>>>>>>>> wraps a >>>>>>>>> memfd into a dma-buf. >>>>>>>> So, we have to decide either we introduce a new driver >>>>>>>> (say, under drivers/xen/xen-dma-buf) or extend the existing >>>>>>>> gntdev/balloon to support dma-buf use-cases. >>>>>>>> >>>>>>>> Can anybody from Xen community express their preference here? >>>>>>>> >>>>>>> Oleksandr talked to me on IRC about this, he said a few IOCTLs >>>>>>> need to >>>>>>> be added to either existing drivers or a new driver. >>>>>>> >>>>>>> I went through this thread twice and skimmed through the relevant >>>>>>> documents, but I couldn't see any obvious pros and cons for either >>>>>>> approach. So I don't really have an opinion on this. >>>>>>> >>>>>>> But, assuming if implemented in existing drivers, those IOCTLs >>>>>>> need to >>>>>>> be added to different drivers, which means userspace program needs to >>>>>>> write more code and get more handles, it would be slightly better to >>>>>>> implement a new driver from that perspective. >>>>>> If gntdev/balloon extension is still considered: >>>>>> >>>>>> All the IOCTLs will be in gntdev driver (in current xen-zcopy >>>>>> terminology): >>>>>>    - DRM_ICOTL_XEN_ZCOPY_DUMB_FROM_REFS >>>>>>    - DRM_IOCTL_XEN_ZCOPY_DUMB_TO_REFS >>>>>>    - DRM_IOCTL_XEN_ZCOPY_DUMB_WAIT_FREE >>>>>> >>>>>> Balloon driver extension, which is needed for contiguous/DMA >>>>>> buffers, will be to provide new *kernel API*, no UAPI is needed. >>>>>> >>>>> So I am obviously a bit late to this thread, but why do you need to add >>>>> new ioctls to gntdev and balloon? Doesn't this driver manage to do what >>>>> you want without any extensions? >>>> 1. I only (may) need to add IOCTLs to gntdev >>>> 2. balloon driver needs to be extended, so it can allocate >>>> contiguous (DMA) memory, not IOCTLs/UAPI here, all lives >>>> in the kernel. >>>> 3. The reason I need to extend gnttab with new IOCTLs is to >>>> provide new functionality to create a dma-buf from grant references >>>> and to produce grant references for a dma-buf. This is what I have as >>>> UAPI >>>> description for xen-zcopy driver: >>>> >>>> 1. DRM_IOCTL_XEN_ZCOPY_DUMB_FROM_REFS >>>> This will create a DRM dumb buffer from grant references provided >>>> by the frontend. The intended usage is: >>>>    - Frontend >>>>      - creates a dumb/display buffer and allocates memory >>>>      - grants foreign access to the buffer pages >>>>      - passes granted references to the backend >>>>    - Backend >>>>      - issues DRM_XEN_ZCOPY_DUMB_FROM_REFS ioctl to map >>>>        granted references and create a dumb buffer >>>>      - requests handle to fd conversion via DRM_IOCTL_PRIME_HANDLE_TO_FD >>>>      - requests real HW driver/consumer to import the PRIME buffer with >>>>        DRM_IOCTL_PRIME_FD_TO_HANDLE >>>>      - uses handle returned by the real HW driver >>>>    - at the end: >>>>      o closes real HW driver's handle with DRM_IOCTL_GEM_CLOSE >>>>      o closes zero-copy driver's handle with DRM_IOCTL_GEM_CLOSE >>>>      o closes file descriptor of the exported buffer >>>> >>>> 2. DRM_IOCTL_XEN_ZCOPY_DUMB_TO_REFS >>>> This will grant references to a dumb/display buffer's memory provided by >>>> the >>>> backend. The intended usage is: >>>>    - Frontend >>>>      - requests backend to allocate dumb/display buffer and grant >>>> references >>>>        to its pages >>>>    - Backend >>>>      - requests real HW driver to create a dumb with >>>> DRM_IOCTL_MODE_CREATE_DUMB >>>>      - requests handle to fd conversion via DRM_IOCTL_PRIME_HANDLE_TO_FD >>>>      - requests zero-copy driver to import the PRIME buffer with >>>>        DRM_IOCTL_PRIME_FD_TO_HANDLE >>>>      - issues DRM_XEN_ZCOPY_DUMB_TO_REFS ioctl to >>>>        grant references to the buffer's memory. >>>>      - passes grant references to the frontend >>>>   - at the end: >>>>      - closes zero-copy driver's handle with DRM_IOCTL_GEM_CLOSE >>>>      - closes real HW driver's handle with DRM_IOCTL_GEM_CLOSE >>>>      - closes file descriptor of the imported buffer >>>> >>>> 3. DRM_XEN_ZCOPY_DUMB_WAIT_FREE >>>> This will block until the dumb buffer with the wait handle provided be >>>> freed: >>>> this is needed for synchronization between frontend and backend in case >>>> frontend provides grant references of the buffer via >>>> DRM_XEN_ZCOPY_DUMB_FROM_REFS IOCTL and which must be released before >>>> backend replies with XENDISPL_OP_DBUF_DESTROY response. >>>> wait_handle must be the same value returned while calling >>>> DRM_XEN_ZCOPY_DUMB_FROM_REFS IOCTL. >>>> >>>> So, as you can see the above functionality is not covered by the >>>> existing UAPI >>>> of the gntdev driver. >>>> Now, if we change dumb -> dma-buf and remove DRM code (which is only a >>>> wrapper >>>> here on top of dma-buf) we get new driver for dma-buf for Xen. >>>> >>>> This is why I have 2 options here: either create a dedicated driver for >>>> this >>>> (e.g. re-work xen-zcopy to be DRM independent and put it under >>>> drivers/xen/xen-dma-buf, for example) or extend the existing gntdev >>>> driver >>>> with the above UAPI + make changes to the balloon driver to provide >>>> kernel >>>> API for DMA buffer allocations. >>> Which user component would use the new ioctls? >> It is currently used by the display backend [1] and will >> probably be used by the hyper-dmabuf frontend/backend >> (Dongwon from Intel can provide more info on this). >>> I'm asking because I'm not very fond of adding more linux specific >>> functions to libgnttab which are not related to a specific Xen version, >>> but to a kernel version. >> Hm, I was not thinking about this UAPI to be added to libgnttab. >> It seems it can be used directly w/o wrappers in user-space > Would this program use libgnttab in parallel? In case of the display backend - yes, for shared rings, extracting grefs from displif protocol it uses gntdev via helper library [1] > If yes how would the two > usage paths be combined (same applies to the separate driver, btw)? The > gntdev driver manages resources per file descriptor and libgnttab is > hiding the file descriptor it is using for a connection. Ah, at the moment the UAPI was not used in parallel as there were 2 drivers for that: gntdev + xen-zcopy with different UAPIs. But now, if we extend gntdev with the new API then you are rigth: either libgnttab needs to be extended or that new part of the gntdev UAPI needs to be open-coded by the backend > Or would the > user program use only the new driver for communicating with the gntdev > driver? In this case it might be an option to extend the gntdev driver > to present a new device (e.g. "gntdmadev") for that purpose. No, it seems that libgnttab and this new driver's UAPI will be used in parallel >>> So doing this in a separate driver seems to be the better option in >>> this regard. >> Well, from maintenance POV it is easier for me to have it all in >> a separate driver as all dma-buf related functionality will >> reside at one place. This also means that no changes to existing >> drivers will be needed (if it is ok to have ballooning in/out >> code for DMA buffers (allocated with dma_alloc_xxx) not in the balloon >> driver) > I think in the end this really depends on how the complete solution > will look like. gntdev is a special wrapper for the gnttab driver. > In case the new dma-buf driver needs to use parts of gntdev I'd rather > have a new driver above gnttab ("gntuser"?) used by gntdev and dma-buf. The new driver doesn't use gntdev's existing API, but extends it, e.g. by adding new ways to export/import grefs for a dma-buf and manage dma-buf's kernel ops. Thus, gntdev, which already provides UAPI, seems to be a good candidate for such an extension > > Juergen [1] https://github.com/xen-troops/libxenbe From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: Re: [Xen-devel] [PATCH 0/1] drm/xen-zcopy: Add Xen zero-copy helper DRM driver Date: Tue, 24 Apr 2018 12:03:24 +0300 Message-ID: <85fc8f82-6d4d-9343-2737-85b7d7391168@gmail.com> References: <5d8fec7f-956c-378f-be90-f45029385740@gmail.com> <20180416192905.GA18096@downor-Z87X-UD5H> <20180417075928.GT31310@phenom.ffwll.local> <20180417205744.GA15930@downor-Z87X-UD5H> <41487acb-a67a-8933-d0c3-702c19b0938e@gmail.com> <20180418073508.ptvntwedczpvl7bx@MacBook-Pro-de-Roger.local> <20180418101058.hyqk3gr3b2ibxswu@MacBook-Pro-de-Roger.local> <20180420071914.GG31310@phenom.ffwll.local> <76cdc65a-7bb1-9377-7bc5-6164e32f7b5d@gmail.com> <20180423115242.ywdwqblj2aseu3fr@citrix.com> <61105351-8896-072b-abf0-757c7f6c0edf@gmail.com> <30ddb005-96c8-f47c-2e23-4e0d354e5842@gmail.com> <6089d701-5221-75b4-38eb-b23bc5dc30cd@suse.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mail-lf0-x236.google.com (mail-lf0-x236.google.com [IPv6:2a00:1450:4010:c07::236]) by gabe.freedesktop.org (Postfix) with ESMTPS id 58B486E391 for ; Tue, 24 Apr 2018 09:03:28 +0000 (UTC) Received: by mail-lf0-x236.google.com with SMTP id r125-v6so19126939lfe.2 for ; Tue, 24 Apr 2018 02:03:28 -0700 (PDT) In-Reply-To: <6089d701-5221-75b4-38eb-b23bc5dc30cd@suse.com> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Juergen Gross , Boris Ostrovsky , Wei Liu Cc: Artem Mygaiev , Dongwon Kim , "Oleksandr_Andrushchenko@epam.com" , airlied@linux.ie, konrad.wilk@oracle.com, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, "Potrola, MateuszX" , daniel.vetter@intel.com, xen-devel@lists.xenproject.org, =?UTF-8?Q?Roger_Pau_Monn=c3=a9?= List-Id: dri-devel@lists.freedesktop.org T24gMDQvMjQvMjAxOCAxMTo0MCBBTSwgSnVlcmdlbiBHcm9zcyB3cm90ZToKPiBPbiAyNC8wNC8x OCAxMDowNywgT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gd3JvdGU6Cj4+IE9uIDA0LzI0LzIwMTgg MTA6NTEgQU0sIEp1ZXJnZW4gR3Jvc3Mgd3JvdGU6Cj4+PiBPbiAyNC8wNC8xOCAwNzo0MywgT2xl a3NhbmRyIEFuZHJ1c2hjaGVua28gd3JvdGU6Cj4+Pj4gT24gMDQvMjQvMjAxOCAwMTo0MSBBTSwg Qm9yaXMgT3N0cm92c2t5IHdyb3RlOgo+Pj4+PiBPbiAwNC8yMy8yMDE4IDA4OjEwIEFNLCBPbGVr c2FuZHIgQW5kcnVzaGNoZW5rbyB3cm90ZToKPj4+Pj4+IE9uIDA0LzIzLzIwMTggMDI6NTIgUE0s IFdlaSBMaXUgd3JvdGU6Cj4+Pj4+Pj4gT24gRnJpLCBBcHIgMjAsIDIwMTggYXQgMDI6MjU6MjBQ TSArMDMwMCwgT2xla3NhbmRyIEFuZHJ1c2hjaGVua28KPj4+Pj4+PiB3cm90ZToKPj4+Pj4+Pj4+ PiAgwqDCoMKgwqDCoMKgIHRoZSBnbnRkZXYuCj4+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+PiBJIHRoaW5r IHRoaXMgaXMgZ2VuZXJpYyBlbm91Z2ggdGhhdCBpdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBieSBh Cj4+Pj4+Pj4+Pj4gZGV2aWNlIG5vdCB0aWVkIHRvIFhlbi4gQUZBSUNUIHRoZSBoeXBlcl9kbWEg Z3V5cyBhbHNvIHdhbnRlZAo+Pj4+Pj4+Pj4+IHNvbWV0aGluZyBzaW1pbGFyIHRvIHRoaXMuCj4+ Pj4+Pj4+PiBZb3UgY2FuJ3QganVzdCB3cmFwIHJhbmRvbSB1c2Vyc3BhY2UgbWVtb3J5IGludG8g YSBkbWEtYnVmLiBXZSd2ZQo+Pj4+Pj4+Pj4ganVzdCBoYWQKPj4+Pj4+Pj4+IHRoaXMgZGlzY3Vz c2lvbiB3aXRoIGt2bS9xZW11IGZvbGtzLCB3aG8gcHJvcG9zZWQganVzdCB0aGF0LCBhbmQKPj4+ Pj4+Pj4+IGFmdGVyIGEKPj4+Pj4+Pj4+IGJpdCBvZiBkaXNjdXNzaW9uIHRoZXknbGwgbm93IHRy eSB0byBoYXZlIGEgZHJpdmVyIHdoaWNoIGp1c3QKPj4+Pj4+Pj4+IHdyYXBzIGEKPj4+Pj4+Pj4+ IG1lbWZkIGludG8gYSBkbWEtYnVmLgo+Pj4+Pj4+PiBTbywgd2UgaGF2ZSB0byBkZWNpZGUgZWl0 aGVyIHdlIGludHJvZHVjZSBhIG5ldyBkcml2ZXIKPj4+Pj4+Pj4gKHNheSwgdW5kZXIgZHJpdmVy cy94ZW4veGVuLWRtYS1idWYpIG9yIGV4dGVuZCB0aGUgZXhpc3RpbmcKPj4+Pj4+Pj4gZ250ZGV2 L2JhbGxvb24gdG8gc3VwcG9ydCBkbWEtYnVmIHVzZS1jYXNlcy4KPj4+Pj4+Pj4KPj4+Pj4+Pj4g Q2FuIGFueWJvZHkgZnJvbSBYZW4gY29tbXVuaXR5IGV4cHJlc3MgdGhlaXIgcHJlZmVyZW5jZSBo ZXJlPwo+Pj4+Pj4+Pgo+Pj4+Pj4+IE9sZWtzYW5kciB0YWxrZWQgdG8gbWUgb24gSVJDIGFib3V0 IHRoaXMsIGhlIHNhaWQgYSBmZXcgSU9DVExzCj4+Pj4+Pj4gbmVlZCB0bwo+Pj4+Pj4+IGJlIGFk ZGVkIHRvIGVpdGhlciBleGlzdGluZyBkcml2ZXJzIG9yIGEgbmV3IGRyaXZlci4KPj4+Pj4+Pgo+ Pj4+Pj4+IEkgd2VudCB0aHJvdWdoIHRoaXMgdGhyZWFkIHR3aWNlIGFuZCBza2ltbWVkIHRocm91 Z2ggdGhlIHJlbGV2YW50Cj4+Pj4+Pj4gZG9jdW1lbnRzLCBidXQgSSBjb3VsZG4ndCBzZWUgYW55 IG9idmlvdXMgcHJvcyBhbmQgY29ucyBmb3IgZWl0aGVyCj4+Pj4+Pj4gYXBwcm9hY2guIFNvIEkg ZG9uJ3QgcmVhbGx5IGhhdmUgYW4gb3BpbmlvbiBvbiB0aGlzLgo+Pj4+Pj4+Cj4+Pj4+Pj4gQnV0 LCBhc3N1bWluZyBpZiBpbXBsZW1lbnRlZCBpbiBleGlzdGluZyBkcml2ZXJzLCB0aG9zZSBJT0NU THMKPj4+Pj4+PiBuZWVkIHRvCj4+Pj4+Pj4gYmUgYWRkZWQgdG8gZGlmZmVyZW50IGRyaXZlcnMs IHdoaWNoIG1lYW5zIHVzZXJzcGFjZSBwcm9ncmFtIG5lZWRzIHRvCj4+Pj4+Pj4gd3JpdGUgbW9y ZSBjb2RlIGFuZCBnZXQgbW9yZSBoYW5kbGVzLCBpdCB3b3VsZCBiZSBzbGlnaHRseSBiZXR0ZXIg dG8KPj4+Pj4+PiBpbXBsZW1lbnQgYSBuZXcgZHJpdmVyIGZyb20gdGhhdCBwZXJzcGVjdGl2ZS4K Pj4+Pj4+IElmIGdudGRldi9iYWxsb29uIGV4dGVuc2lvbiBpcyBzdGlsbCBjb25zaWRlcmVkOgo+ Pj4+Pj4KPj4+Pj4+IEFsbCB0aGUgSU9DVExzIHdpbGwgYmUgaW4gZ250ZGV2IGRyaXZlciAoaW4g Y3VycmVudCB4ZW4temNvcHkKPj4+Pj4+IHRlcm1pbm9sb2d5KToKPj4+Pj4+ICDCoMKgwqAtIERS TV9JQ09UTF9YRU5fWkNPUFlfRFVNQl9GUk9NX1JFRlMKPj4+Pj4+ICDCoMKgwqAtIERSTV9JT0NU TF9YRU5fWkNPUFlfRFVNQl9UT19SRUZTCj4+Pj4+PiAgwqDCoMKgLSBEUk1fSU9DVExfWEVOX1pD T1BZX0RVTUJfV0FJVF9GUkVFCj4+Pj4+Pgo+Pj4+Pj4gQmFsbG9vbiBkcml2ZXIgZXh0ZW5zaW9u LCB3aGljaCBpcyBuZWVkZWQgZm9yIGNvbnRpZ3VvdXMvRE1BCj4+Pj4+PiBidWZmZXJzLCB3aWxs IGJlIHRvIHByb3ZpZGUgbmV3ICprZXJuZWwgQVBJKiwgbm8gVUFQSSBpcyBuZWVkZWQuCj4+Pj4+ Pgo+Pj4+PiBTbyBJIGFtIG9idmlvdXNseSBhIGJpdCBsYXRlIHRvIHRoaXMgdGhyZWFkLCBidXQg d2h5IGRvIHlvdSBuZWVkIHRvIGFkZAo+Pj4+PiBuZXcgaW9jdGxzIHRvIGdudGRldiBhbmQgYmFs bG9vbj8gRG9lc24ndCB0aGlzIGRyaXZlciBtYW5hZ2UgdG8gZG8gd2hhdAo+Pj4+PiB5b3Ugd2Fu dCB3aXRob3V0IGFueSBleHRlbnNpb25zPwo+Pj4+IDEuIEkgb25seSAobWF5KSBuZWVkIHRvIGFk ZCBJT0NUTHMgdG8gZ250ZGV2Cj4+Pj4gMi4gYmFsbG9vbiBkcml2ZXIgbmVlZHMgdG8gYmUgZXh0 ZW5kZWQsIHNvIGl0IGNhbiBhbGxvY2F0ZQo+Pj4+IGNvbnRpZ3VvdXMgKERNQSkgbWVtb3J5LCBu b3QgSU9DVExzL1VBUEkgaGVyZSwgYWxsIGxpdmVzCj4+Pj4gaW4gdGhlIGtlcm5lbC4KPj4+PiAz LiBUaGUgcmVhc29uIEkgbmVlZCB0byBleHRlbmQgZ250dGFiIHdpdGggbmV3IElPQ1RMcyBpcyB0 bwo+Pj4+IHByb3ZpZGUgbmV3IGZ1bmN0aW9uYWxpdHkgdG8gY3JlYXRlIGEgZG1hLWJ1ZiBmcm9t IGdyYW50IHJlZmVyZW5jZXMKPj4+PiBhbmQgdG8gcHJvZHVjZSBncmFudCByZWZlcmVuY2VzIGZv ciBhIGRtYS1idWYuIFRoaXMgaXMgd2hhdCBJIGhhdmUgYXMKPj4+PiBVQVBJCj4+Pj4gZGVzY3Jp cHRpb24gZm9yIHhlbi16Y29weSBkcml2ZXI6Cj4+Pj4KPj4+PiAxLiBEUk1fSU9DVExfWEVOX1pD T1BZX0RVTUJfRlJPTV9SRUZTCj4+Pj4gVGhpcyB3aWxsIGNyZWF0ZSBhIERSTSBkdW1iIGJ1ZmZl ciBmcm9tIGdyYW50IHJlZmVyZW5jZXMgcHJvdmlkZWQKPj4+PiBieSB0aGUgZnJvbnRlbmQuIFRo ZSBpbnRlbmRlZCB1c2FnZSBpczoKPj4+PiAgwqDCoCAtIEZyb250ZW5kCj4+Pj4gIMKgwqDCoMKg IC0gY3JlYXRlcyBhIGR1bWIvZGlzcGxheSBidWZmZXIgYW5kIGFsbG9jYXRlcyBtZW1vcnkKPj4+ PiAgwqDCoMKgwqAgLSBncmFudHMgZm9yZWlnbiBhY2Nlc3MgdG8gdGhlIGJ1ZmZlciBwYWdlcwo+ Pj4+ICDCoMKgwqDCoCAtIHBhc3NlcyBncmFudGVkIHJlZmVyZW5jZXMgdG8gdGhlIGJhY2tlbmQK Pj4+PiAgwqDCoCAtIEJhY2tlbmQKPj4+PiAgwqDCoMKgwqAgLSBpc3N1ZXMgRFJNX1hFTl9aQ09Q WV9EVU1CX0ZST01fUkVGUyBpb2N0bCB0byBtYXAKPj4+PiAgwqDCoMKgwqDCoMKgIGdyYW50ZWQg cmVmZXJlbmNlcyBhbmQgY3JlYXRlIGEgZHVtYiBidWZmZXIKPj4+PiAgwqDCoMKgwqAgLSByZXF1 ZXN0cyBoYW5kbGUgdG8gZmQgY29udmVyc2lvbiB2aWEgRFJNX0lPQ1RMX1BSSU1FX0hBTkRMRV9U T19GRAo+Pj4+ICDCoMKgwqDCoCAtIHJlcXVlc3RzIHJlYWwgSFcgZHJpdmVyL2NvbnN1bWVyIHRv IGltcG9ydCB0aGUgUFJJTUUgYnVmZmVyIHdpdGgKPj4+PiAgwqDCoMKgwqDCoMKgIERSTV9JT0NU TF9QUklNRV9GRF9UT19IQU5ETEUKPj4+PiAgwqDCoMKgwqAgLSB1c2VzIGhhbmRsZSByZXR1cm5l ZCBieSB0aGUgcmVhbCBIVyBkcml2ZXIKPj4+PiAgwqDCoCAtIGF0IHRoZSBlbmQ6Cj4+Pj4gIMKg wqDCoMKgIG8gY2xvc2VzIHJlYWwgSFcgZHJpdmVyJ3MgaGFuZGxlIHdpdGggRFJNX0lPQ1RMX0dF TV9DTE9TRQo+Pj4+ICDCoMKgwqDCoCBvIGNsb3NlcyB6ZXJvLWNvcHkgZHJpdmVyJ3MgaGFuZGxl IHdpdGggRFJNX0lPQ1RMX0dFTV9DTE9TRQo+Pj4+ICDCoMKgwqDCoCBvIGNsb3NlcyBmaWxlIGRl c2NyaXB0b3Igb2YgdGhlIGV4cG9ydGVkIGJ1ZmZlcgo+Pj4+Cj4+Pj4gMi4gRFJNX0lPQ1RMX1hF Tl9aQ09QWV9EVU1CX1RPX1JFRlMKPj4+PiBUaGlzIHdpbGwgZ3JhbnQgcmVmZXJlbmNlcyB0byBh IGR1bWIvZGlzcGxheSBidWZmZXIncyBtZW1vcnkgcHJvdmlkZWQgYnkKPj4+PiB0aGUKPj4+PiBi YWNrZW5kLiBUaGUgaW50ZW5kZWQgdXNhZ2UgaXM6Cj4+Pj4gIMKgwqAgLSBGcm9udGVuZAo+Pj4+ ICDCoMKgwqDCoCAtIHJlcXVlc3RzIGJhY2tlbmQgdG8gYWxsb2NhdGUgZHVtYi9kaXNwbGF5IGJ1 ZmZlciBhbmQgZ3JhbnQKPj4+PiByZWZlcmVuY2VzCj4+Pj4gIMKgwqDCoMKgwqDCoCB0byBpdHMg cGFnZXMKPj4+PiAgwqDCoCAtIEJhY2tlbmQKPj4+PiAgwqDCoMKgwqAgLSByZXF1ZXN0cyByZWFs IEhXIGRyaXZlciB0byBjcmVhdGUgYSBkdW1iIHdpdGgKPj4+PiBEUk1fSU9DVExfTU9ERV9DUkVB VEVfRFVNQgo+Pj4+ICDCoMKgwqDCoCAtIHJlcXVlc3RzIGhhbmRsZSB0byBmZCBjb252ZXJzaW9u IHZpYSBEUk1fSU9DVExfUFJJTUVfSEFORExFX1RPX0ZECj4+Pj4gIMKgwqDCoMKgIC0gcmVxdWVz dHMgemVyby1jb3B5IGRyaXZlciB0byBpbXBvcnQgdGhlIFBSSU1FIGJ1ZmZlciB3aXRoCj4+Pj4g IMKgwqDCoMKgwqDCoCBEUk1fSU9DVExfUFJJTUVfRkRfVE9fSEFORExFCj4+Pj4gIMKgwqDCoMKg IC0gaXNzdWVzIERSTV9YRU5fWkNPUFlfRFVNQl9UT19SRUZTIGlvY3RsIHRvCj4+Pj4gIMKgwqDC oMKgwqDCoCBncmFudCByZWZlcmVuY2VzIHRvIHRoZSBidWZmZXIncyBtZW1vcnkuCj4+Pj4gIMKg wqDCoMKgIC0gcGFzc2VzIGdyYW50IHJlZmVyZW5jZXMgdG8gdGhlIGZyb250ZW5kCj4+Pj4gIMKg wqAtIGF0IHRoZSBlbmQ6Cj4+Pj4gIMKgwqDCoMKgIC0gY2xvc2VzIHplcm8tY29weSBkcml2ZXIn cyBoYW5kbGUgd2l0aCBEUk1fSU9DVExfR0VNX0NMT1NFCj4+Pj4gIMKgwqDCoMKgIC0gY2xvc2Vz IHJlYWwgSFcgZHJpdmVyJ3MgaGFuZGxlIHdpdGggRFJNX0lPQ1RMX0dFTV9DTE9TRQo+Pj4+ICDC oMKgwqDCoCAtIGNsb3NlcyBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGltcG9ydGVkIGJ1ZmZlcgo+ Pj4+Cj4+Pj4gMy4gRFJNX1hFTl9aQ09QWV9EVU1CX1dBSVRfRlJFRQo+Pj4+IFRoaXMgd2lsbCBi bG9jayB1bnRpbCB0aGUgZHVtYiBidWZmZXIgd2l0aCB0aGUgd2FpdCBoYW5kbGUgcHJvdmlkZWQg YmUKPj4+PiBmcmVlZDoKPj4+PiB0aGlzIGlzIG5lZWRlZCBmb3Igc3luY2hyb25pemF0aW9uIGJl dHdlZW4gZnJvbnRlbmQgYW5kIGJhY2tlbmQgaW4gY2FzZQo+Pj4+IGZyb250ZW5kIHByb3ZpZGVz IGdyYW50IHJlZmVyZW5jZXMgb2YgdGhlIGJ1ZmZlciB2aWEKPj4+PiBEUk1fWEVOX1pDT1BZX0RV TUJfRlJPTV9SRUZTIElPQ1RMIGFuZCB3aGljaCBtdXN0IGJlIHJlbGVhc2VkIGJlZm9yZQo+Pj4+ IGJhY2tlbmQgcmVwbGllcyB3aXRoIFhFTkRJU1BMX09QX0RCVUZfREVTVFJPWSByZXNwb25zZS4K Pj4+PiB3YWl0X2hhbmRsZSBtdXN0IGJlIHRoZSBzYW1lIHZhbHVlIHJldHVybmVkIHdoaWxlIGNh bGxpbmcKPj4+PiBEUk1fWEVOX1pDT1BZX0RVTUJfRlJPTV9SRUZTIElPQ1RMLgo+Pj4+Cj4+Pj4g U28sIGFzIHlvdSBjYW4gc2VlIHRoZSBhYm92ZSBmdW5jdGlvbmFsaXR5IGlzIG5vdCBjb3ZlcmVk IGJ5IHRoZQo+Pj4+IGV4aXN0aW5nIFVBUEkKPj4+PiBvZiB0aGUgZ250ZGV2IGRyaXZlci4KPj4+ PiBOb3csIGlmIHdlIGNoYW5nZSBkdW1iIC0+IGRtYS1idWYgYW5kIHJlbW92ZSBEUk0gY29kZSAo d2hpY2ggaXMgb25seSBhCj4+Pj4gd3JhcHBlcgo+Pj4+IGhlcmUgb24gdG9wIG9mIGRtYS1idWYp IHdlIGdldCBuZXcgZHJpdmVyIGZvciBkbWEtYnVmIGZvciBYZW4uCj4+Pj4KPj4+PiBUaGlzIGlz IHdoeSBJIGhhdmUgMiBvcHRpb25zIGhlcmU6IGVpdGhlciBjcmVhdGUgYSBkZWRpY2F0ZWQgZHJp dmVyIGZvcgo+Pj4+IHRoaXMKPj4+PiAoZS5nLiByZS13b3JrIHhlbi16Y29weSB0byBiZSBEUk0g aW5kZXBlbmRlbnQgYW5kIHB1dCBpdCB1bmRlcgo+Pj4+IGRyaXZlcnMveGVuL3hlbi1kbWEtYnVm LCBmb3IgZXhhbXBsZSkgb3IgZXh0ZW5kIHRoZSBleGlzdGluZyBnbnRkZXYKPj4+PiBkcml2ZXIK Pj4+PiB3aXRoIHRoZSBhYm92ZSBVQVBJICsgbWFrZSBjaGFuZ2VzIHRvIHRoZSBiYWxsb29uIGRy aXZlciB0byBwcm92aWRlCj4+Pj4ga2VybmVsCj4+Pj4gQVBJIGZvciBETUEgYnVmZmVyIGFsbG9j YXRpb25zLgo+Pj4gV2hpY2ggdXNlciBjb21wb25lbnQgd291bGQgdXNlIHRoZSBuZXcgaW9jdGxz Pwo+PiBJdCBpcyBjdXJyZW50bHkgdXNlZCBieSB0aGUgZGlzcGxheSBiYWNrZW5kIFsxXSBhbmQg d2lsbAo+PiBwcm9iYWJseSBiZSB1c2VkIGJ5IHRoZSBoeXBlci1kbWFidWYgZnJvbnRlbmQvYmFj a2VuZAo+PiAoRG9uZ3dvbiBmcm9tIEludGVsIGNhbiBwcm92aWRlIG1vcmUgaW5mbyBvbiB0aGlz KS4KPj4+IEknbSBhc2tpbmcgYmVjYXVzZSBJJ20gbm90IHZlcnkgZm9uZCBvZiBhZGRpbmcgbW9y ZSBsaW51eCBzcGVjaWZpYwo+Pj4gZnVuY3Rpb25zIHRvIGxpYmdudHRhYiB3aGljaCBhcmUgbm90 IHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBYZW4gdmVyc2lvbiwKPj4+IGJ1dCB0byBhIGtlcm5lbCB2 ZXJzaW9uLgo+PiBIbSwgSSB3YXMgbm90IHRoaW5raW5nIGFib3V0IHRoaXMgVUFQSSB0byBiZSBh ZGRlZCB0byBsaWJnbnR0YWIuCj4+IEl0IHNlZW1zIGl0IGNhbiBiZSB1c2VkIGRpcmVjdGx5IHcv byB3cmFwcGVycyBpbiB1c2VyLXNwYWNlCj4gV291bGQgdGhpcyBwcm9ncmFtIHVzZSBsaWJnbnR0 YWIgaW4gcGFyYWxsZWw/CkluIGNhc2Ugb2YgdGhlIGRpc3BsYXkgYmFja2VuZCAtIHllcywgZm9y IHNoYXJlZCByaW5ncywKZXh0cmFjdGluZyBncmVmcyBmcm9tIGRpc3BsaWYgcHJvdG9jb2wgaXQg dXNlcyBnbnRkZXYgdmlhCmhlbHBlciBsaWJyYXJ5IFsxXQo+ICAgSWYgeWVzIGhvdyB3b3VsZCB0 aGUgdHdvCj4gdXNhZ2UgcGF0aHMgYmUgY29tYmluZWQgKHNhbWUgYXBwbGllcyB0byB0aGUgc2Vw YXJhdGUgZHJpdmVyLCBidHcpPyBUaGUKPiBnbnRkZXYgZHJpdmVyIG1hbmFnZXMgcmVzb3VyY2Vz IHBlciBmaWxlIGRlc2NyaXB0b3IgYW5kIGxpYmdudHRhYiBpcwo+IGhpZGluZyB0aGUgZmlsZSBk ZXNjcmlwdG9yIGl0IGlzIHVzaW5nIGZvciBhIGNvbm5lY3Rpb24uCkFoLCBhdCB0aGUgbW9tZW50 IHRoZSBVQVBJIHdhcyBub3QgdXNlZCBpbiBwYXJhbGxlbCBhcyB0aGVyZSB3ZXJlCjIgZHJpdmVy cyBmb3IgdGhhdDogZ250ZGV2ICsgeGVuLXpjb3B5IHdpdGggZGlmZmVyZW50IFVBUElzLgpCdXQg bm93LCBpZiB3ZSBleHRlbmQgZ250ZGV2IHdpdGggdGhlIG5ldyBBUEkgdGhlbiB5b3UgYXJlIHJp Z3RoOgplaXRoZXIgbGliZ250dGFiIG5lZWRzIHRvIGJlIGV4dGVuZGVkIG9yIHRoYXQgbmV3IHBh cnQgb2YgdGhlCmdudGRldiBVQVBJIG5lZWRzIHRvIGJlIG9wZW4tY29kZWQgYnkgdGhlIGJhY2tl bmQKPiAgIE9yIHdvdWxkIHRoZQo+IHVzZXIgcHJvZ3JhbSB1c2Ugb25seSB0aGUgbmV3IGRyaXZl ciBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBnbnRkZXYKPiBkcml2ZXI/IEluIHRoaXMgY2Fz ZSBpdCBtaWdodCBiZSBhbiBvcHRpb24gdG8gZXh0ZW5kIHRoZSBnbnRkZXYgZHJpdmVyCj4gdG8g cHJlc2VudCBhIG5ldyBkZXZpY2UgKGUuZy4gImdudGRtYWRldiIpIGZvciB0aGF0IHB1cnBvc2Uu Ck5vLCBpdCBzZWVtcyB0aGF0IGxpYmdudHRhYiBhbmQgdGhpcyBuZXcgZHJpdmVyJ3MgVUFQSSB3 aWxsIGJlIHVzZWQKaW4gcGFyYWxsZWwKPj4+IFNvIGRvaW5nIHRoaXMgaW4gYSBzZXBhcmF0ZSBk cml2ZXIgc2VlbXMgdG8gYmUgdGhlIGJldHRlciBvcHRpb24gaW4KPj4+IHRoaXMgcmVnYXJkLgo+ PiBXZWxsLCBmcm9tIG1haW50ZW5hbmNlIFBPViBpdCBpcyBlYXNpZXIgZm9yIG1lIHRvIGhhdmUg aXQgYWxsIGluCj4+IGEgc2VwYXJhdGUgZHJpdmVyIGFzIGFsbCBkbWEtYnVmIHJlbGF0ZWQgZnVu Y3Rpb25hbGl0eSB3aWxsCj4+IHJlc2lkZSBhdCBvbmUgcGxhY2UuIFRoaXMgYWxzbyBtZWFucyB0 aGF0IG5vIGNoYW5nZXMgdG8gZXhpc3RpbmcKPj4gZHJpdmVycyB3aWxsIGJlIG5lZWRlZCAoaWYg aXQgaXMgb2sgdG8gaGF2ZSBiYWxsb29uaW5nIGluL291dAo+PiBjb2RlIGZvciBETUEgYnVmZmVy cyAoYWxsb2NhdGVkIHdpdGggZG1hX2FsbG9jX3h4eCkgbm90IGluIHRoZSBiYWxsb29uCj4+IGRy aXZlcikKPiBJIHRoaW5rIGluIHRoZSBlbmQgdGhpcyByZWFsbHkgZGVwZW5kcyBvbiBob3cgdGhl IGNvbXBsZXRlIHNvbHV0aW9uCj4gd2lsbCBsb29rIGxpa2UuIGdudGRldiBpcyBhIHNwZWNpYWwg d3JhcHBlciBmb3IgdGhlIGdudHRhYiBkcml2ZXIuCj4gSW4gY2FzZSB0aGUgbmV3IGRtYS1idWYg ZHJpdmVyIG5lZWRzIHRvIHVzZSBwYXJ0cyBvZiBnbnRkZXYgSSdkIHJhdGhlcgo+IGhhdmUgYSBu ZXcgZHJpdmVyIGFib3ZlIGdudHRhYiAoImdudHVzZXIiPykgdXNlZCBieSBnbnRkZXYgYW5kIGRt YS1idWYuClRoZSBuZXcgZHJpdmVyIGRvZXNuJ3QgdXNlIGdudGRldidzIGV4aXN0aW5nIEFQSSwg YnV0IGV4dGVuZHMgaXQsCmUuZy4gYnkgYWRkaW5nIG5ldyB3YXlzIHRvIGV4cG9ydC9pbXBvcnQg Z3JlZnMgZm9yIGEgZG1hLWJ1ZiBhbmQKbWFuYWdlIGRtYS1idWYncyBrZXJuZWwgb3BzLiBUaHVz LCBnbnRkZXYsIHdoaWNoIGFscmVhZHkgcHJvdmlkZXMKVUFQSSwgc2VlbXMgdG8gYmUgYSBnb29k IGNhbmRpZGF0ZSBmb3Igc3VjaCBhbiBleHRlbnNpb24KPgo+IEp1ZXJnZW4KWzFdIGh0dHBzOi8v Z2l0aHViLmNvbS94ZW4tdHJvb3BzL2xpYnhlbmJlCl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxp c3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFu L2xpc3RpbmZvL2RyaS1kZXZlbAo=