From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from lb1-smtp-cloud7.xs4all.net ([194.109.24.24]:34113 "EHLO lb1-smtp-cloud7.xs4all.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727059AbeIJN5y (ORCPT ); Mon, 10 Sep 2018 09:57:54 -0400 Subject: Re: [Xen-devel][PATCH 1/1] cameraif: add ABI for para-virtual camera To: Oleksandr Andrushchenko , xen-devel@lists.xenproject.org, konrad.wilk@oracle.com, jgross@suse.com, boris.ostrovsky@oracle.com, mchehab@kernel.org, linux-media@vger.kernel.org, sakari.ailus@linux.intel.com, koji.matsuoka.xm@renesas.com Cc: Oleksandr Andrushchenko References: <20180731093142.3828-1-andr2000@gmail.com> <20180731093142.3828-2-andr2000@gmail.com> <73b69e31-d36d-d89f-20d6-d59dbefe395e@xs4all.nl> <7134b3ad-9fcf-0139-41b3-67a3dbc8224d@xs4all.nl> <51f97715-454a-0242-b381-29944d77d5b5@gmail.com> From: Hans Verkuil Message-ID: <3c6bb5c8-eeb4-fd09-407a-5a77b29b56c3@xs4all.nl> Date: Mon, 10 Sep 2018 11:04:46 +0200 MIME-Version: 1.0 In-Reply-To: <51f97715-454a-0242-b381-29944d77d5b5@gmail.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-media-owner@vger.kernel.org List-ID: On 09/10/2018 10:24 AM, Oleksandr Andrushchenko wrote: > On 09/10/2018 10:53 AM, Hans Verkuil wrote: >> Hi Oleksandr, >> >> On 09/10/2018 09:16 AM, Oleksandr Andrushchenko wrote: >>>> I suspect that you likely will want to support such sources eventually, so >>>> it pays to design this with that in mind. >>> Again, I think that this is the backend to hide these >>> use-cases from the frontend. >> I'm not sure you can: say you are playing a bluray connected to the system >> with HDMI, then if there is a resolution change, what do you do? You can tear >> everything down and build it up again, or you can just tell frontends that >> something changed and that they have to look at the new vcamera configuration. >> >> The latter seems to be more sensible to me. It is really not much that you >> need to do: all you really need is an event signalling that something changed. >> In V4L2 that's the V4L2_EVENT_SOURCE_CHANGE. > well, this complicates things a lot as I'll have to > re-allocate buffers - right? Right. Different resolutions means different sized buffers and usually lots of changes throughout the whole video pipeline, which in this case can even go into multiple VMs. One additional thing to keep in mind for the future: V4L2_EVENT_SOURCE_CHANGE has a flags field that tells userspace what changed. Right now that is just the resolution, but in the future you can expect flags for cases where just the colorspace information changes, but not the resolution. Which reminds me of two important missing pieces of information in your protocol: 1) You need to communicate the colorspace data: - colorspace - xfer_func - ycbcr_enc/hsv_enc (unlikely you ever want to support HSV pixelformats, so I think you can ignore hsv_enc) - quantization See https://hverkuil.home.xs4all.nl/spec/uapi/v4l/pixfmt-v4l2.html#c.v4l2_pix_format and the links to the colorspace sections in the V4L2 spec for details). This information is part of the format, it is reported by the driver. 2) If you support interlaced formats and V4L2_FIELD_ALTERNATE (i.e. each buffer contains a single field), then you need to be able to tell userspace whether the dequeued buffer contains a top or bottom field. Also, what to do with dropped frames/fields: V4L2 has a sequence counter and timestamp that can help detecting that. You probably need something similar. > But anyways, I can add > #define XENCAMERA_EVT_CFG_CHANGE 0x01 > in the protocol, so we can address this use-case >> >>> 1. set format command: >>> * pixel_format - uint32_t, pixel format to be used, FOURCC code. >>> * width - uint32_t, width in pixels. >>> * height - uint32_t, height in pixels. >>> >>> 2. Set frame rate command: >>> + * frame_rate_numer - uint32_t, numerator of the frame rate. >>> + * frame_rate_denom - uint32_t, denominator of the frame rate. >>> >>> 3. Set/request num bufs: >>> * num_bufs - uint8_t, desired number of buffers to be used. >> I like this much better. 1+2 could be combined, but 3 should definitely remain >> separate. > ok, then 1+2 combined + 3 separate. > Do you think we can still name 1+2 as "set_format" or "set_config" > will fit better? set_format is closer to S_FMT as used in V4L2, so I have a slight preference for that, but it is really up to you. >> >>>>> + * >>>>> + * See response format for this request. >>>>> + * >>>>> + * Notes: >>>>> + * - frontend must check the corresponding response in order to see >>>>> + * if the values reported back by the backend do match the desired ones >>>>> + * and can be accepted. >>>>> + * - frontend may send multiple XENCAMERA_OP_SET_CONFIG requests before >>>>> + * sending XENCAMERA_OP_STREAM_START request to update or tune the >>>>> + * configuration. >>>>> + */ >>>>> +struct xencamera_config { >>>>> + uint32_t pixel_format; >>>>> + uint32_t width; >>>>> + uint32_t height; >>>>> + uint32_t frame_rate_nom; >>>>> + uint32_t frame_rate_denom; >>>>> + uint8_t num_bufs; >>>>> +}; >>>>> + >>>>> +/* >>>>> + * Request buffer details - request camera buffer's memory layout. >>>>> + * detailed description: >>>>> + * 0 1 2 3 octet >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * | id |_GET_BUF_DETAILS| reserved | 4 >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * | reserved | 8 >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * | reserved | 64 >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * >>>>> + * See response format for this request. >>>>> + * >>>>> + * >>>>> + * Request camera buffer creation: >>>>> + * 0 1 2 3 octet >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * | id | _OP_BUF_CREATE | reserved | 4 >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * | reserved | 8 >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * | index | reserved | 12 >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * | gref_directory | 16 >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * | reserved | 20 >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * | reserved | 64 >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * >>>>> + * An attempt to create multiple buffers with the same index is an error. >>>>> + * index can be re-used after destroying the corresponding camera buffer. >>>>> + * >>>>> + * index - uint8_t, index of the buffer to be created. >>>>> + * gref_directory - grant_ref_t, a reference to the first shared page >>>>> + * describing shared buffer references. The size of the buffer is equal to >>>>> + * XENCAMERA_OP_GET_BUF_DETAILS.size response. At least one page exists. If >>>>> + * shared buffer size exceeds what can be addressed by this single page, >>>>> + * then reference to the next shared page must be supplied (see >>>>> + * gref_dir_next_page below). >>>> It might be better to allocate all buffers in one go, i.e. what VIDIOC_REQBUFS >>>> does. >>> Well, I still think it is better to have a per buffer interface >>> in the protocol as it is done for other Xen virtual devices. >>> So, I'll keep this as is for now: VIDIOC_REQBUFS can still do >>> what it does internally in the frontend driver >> I may have misunderstood the original API. The newly proposed XENCAMERA_OP_BUF_REQUEST >> maps to REQBUFS, right? And then BUF_CREATE/DESTROY just set up the shared buffer >> mappings for the buffers created by REQBUFS. If that's the sequence, then it makes >> sense. I'm not sure about the naming. >> >> You might want to make it clear that XENCAMERA_OP_BUF_REQUEST allocates the buffers >> on the backend, and so can fail. Also, the actual number of allocated buffers in >> case of success can be more or less than what was requested. > The buffers can be allocated and shared by either backend or frontend: see > "be-alloc" configuration option telling which domain (VM) shares > the Xen grant references to the pages of the buffer: either frontend > or backend. If you want to do zero-copy video capture, then you need to know which device in your video pipeline (which now covers both actual hardware and multiple VMs) has the strictest memory layout requirements. Often the video HW requires contiguous physical memory for the buffers, which means you can't just give it a piece of non-contig memory allocated elsewhere. In practice you have two possible memory models you can use with V4L2 drivers: MMAP (i.e. allocated by the driver and the buffers can, if needed, be exported as dmabuf handles with VIDIOC_EXPBUF), or DMABUF where buffers are allocated elsewhere and imported to V4L2, which may fail if it doesn't match the HW requirements. > > So, I was more thinking that in case of V4L2 based frontend driver: > 1. Frontend serves REQBUFS ioctl and asks the backend with > XENCAMERA_OP_BUF_REQUEST > if it can handle that many buffers and gets number of buffers to be used > and buffer structure (number of planes, sizes, offsets etc.) as the reply > to that request > 2. Frontend creates n buffers with XENCAMERA_OP_BUF_CREATE > 3. Frontend returns from REQBUFS ioctl with actual number of buffers > allocated Regards, Hans From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hans Verkuil Subject: Re: [PATCH 1/1] cameraif: add ABI for para-virtual camera Date: Mon, 10 Sep 2018 11:04:46 +0200 Message-ID: <3c6bb5c8-eeb4-fd09-407a-5a77b29b56c3@xs4all.nl> References: <20180731093142.3828-1-andr2000@gmail.com> <20180731093142.3828-2-andr2000@gmail.com> <73b69e31-d36d-d89f-20d6-d59dbefe395e@xs4all.nl> <7134b3ad-9fcf-0139-41b3-67a3dbc8224d@xs4all.nl> <51f97715-454a-0242-b381-29944d77d5b5@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from all-amaz-eas1.inumbo.com ([34.197.232.57]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1fzI9H-0000Wf-I1 for xen-devel@lists.xenproject.org; Mon, 10 Sep 2018 09:06:23 +0000 In-Reply-To: <51f97715-454a-0242-b381-29944d77d5b5@gmail.com> Content-Language: en-US List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: Oleksandr Andrushchenko , xen-devel@lists.xenproject.org, konrad.wilk@oracle.com, jgross@suse.com, boris.ostrovsky@oracle.com, mchehab@kernel.org, linux-media@vger.kernel.org, sakari.ailus@linux.intel.com, koji.matsuoka.xm@renesas.com Cc: Oleksandr Andrushchenko List-Id: xen-devel@lists.xenproject.org T24gMDkvMTAvMjAxOCAxMDoyNCBBTSwgT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gd3JvdGU6Cj4g T24gMDkvMTAvMjAxOCAxMDo1MyBBTSwgSGFucyBWZXJrdWlsIHdyb3RlOgo+PiBIaSBPbGVrc2Fu ZHIsCj4+Cj4+IE9uIDA5LzEwLzIwMTggMDk6MTYgQU0sIE9sZWtzYW5kciBBbmRydXNoY2hlbmtv IHdyb3RlOgoKPHNuaXA+Cgo+Pj4+IEkgc3VzcGVjdCB0aGF0IHlvdSBsaWtlbHkgd2lsbCB3YW50 IHRvIHN1cHBvcnQgc3VjaCBzb3VyY2VzIGV2ZW50dWFsbHksIHNvCj4+Pj4gaXQgcGF5cyB0byBk ZXNpZ24gdGhpcyB3aXRoIHRoYXQgaW4gbWluZC4KPj4+IEFnYWluLCBJIHRoaW5rIHRoYXQgdGhp cyBpcyB0aGUgYmFja2VuZCB0byBoaWRlIHRoZXNlCj4+PiB1c2UtY2FzZXMgZnJvbSB0aGUgZnJv bnRlbmQuCj4+IEknbSBub3Qgc3VyZSB5b3UgY2FuOiBzYXkgeW91IGFyZSBwbGF5aW5nIGEgYmx1 cmF5IGNvbm5lY3RlZCB0byB0aGUgc3lzdGVtCj4+IHdpdGggSERNSSwgdGhlbiBpZiB0aGVyZSBp cyBhIHJlc29sdXRpb24gY2hhbmdlLCB3aGF0IGRvIHlvdSBkbz8gWW91IGNhbiB0ZWFyCj4+IGV2 ZXJ5dGhpbmcgZG93biBhbmQgYnVpbGQgaXQgdXAgYWdhaW4sIG9yIHlvdSBjYW4ganVzdCB0ZWxs IGZyb250ZW5kcyB0aGF0Cj4+IHNvbWV0aGluZyBjaGFuZ2VkIGFuZCB0aGF0IHRoZXkgaGF2ZSB0 byBsb29rIGF0IHRoZSBuZXcgdmNhbWVyYSBjb25maWd1cmF0aW9uLgo+Pgo+PiBUaGUgbGF0dGVy IHNlZW1zIHRvIGJlIG1vcmUgc2Vuc2libGUgdG8gbWUuIEl0IGlzIHJlYWxseSBub3QgbXVjaCB0 aGF0IHlvdQo+PiBuZWVkIHRvIGRvOiBhbGwgeW91IHJlYWxseSBuZWVkIGlzIGFuIGV2ZW50IHNp Z25hbGxpbmcgdGhhdCBzb21ldGhpbmcgY2hhbmdlZC4KPj4gSW4gVjRMMiB0aGF0J3MgdGhlIFY0 TDJfRVZFTlRfU09VUkNFX0NIQU5HRS4KPiB3ZWxsLCB0aGlzIGNvbXBsaWNhdGVzIHRoaW5ncyBh IGxvdCBhcyBJJ2xsIGhhdmUgdG8KPiByZS1hbGxvY2F0ZSBidWZmZXJzIC0gcmlnaHQ/CgpSaWdo dC4gRGlmZmVyZW50IHJlc29sdXRpb25zIG1lYW5zIGRpZmZlcmVudCBzaXplZCBidWZmZXJzIGFu ZCB1c3VhbGx5IGxvdHMgb2YKY2hhbmdlcyB0aHJvdWdob3V0IHRoZSB3aG9sZSB2aWRlbyBwaXBl bGluZSwgd2hpY2ggaW4gdGhpcyBjYXNlIGNhbiBldmVuCmdvIGludG8gbXVsdGlwbGUgVk1zLgoK T25lIGFkZGl0aW9uYWwgdGhpbmcgdG8ga2VlcCBpbiBtaW5kIGZvciB0aGUgZnV0dXJlOiBWNEwy X0VWRU5UX1NPVVJDRV9DSEFOR0UKaGFzIGEgZmxhZ3MgZmllbGQgdGhhdCB0ZWxscyB1c2Vyc3Bh Y2Ugd2hhdCBjaGFuZ2VkLiBSaWdodCBub3cgdGhhdCBpcyBqdXN0IHRoZQpyZXNvbHV0aW9uLCBi dXQgaW4gdGhlIGZ1dHVyZSB5b3UgY2FuIGV4cGVjdCBmbGFncyBmb3IgY2FzZXMgd2hlcmUganVz dCB0aGUKY29sb3JzcGFjZSBpbmZvcm1hdGlvbiBjaGFuZ2VzLCBidXQgbm90IHRoZSByZXNvbHV0 aW9uLgoKV2hpY2ggcmVtaW5kcyBtZSBvZiB0d28gaW1wb3J0YW50IG1pc3NpbmcgcGllY2VzIG9m IGluZm9ybWF0aW9uIGluIHlvdXIgcHJvdG9jb2w6CgoxKSBZb3UgbmVlZCB0byBjb21tdW5pY2F0 ZSB0aGUgY29sb3JzcGFjZSBkYXRhOgoKLSBjb2xvcnNwYWNlCi0geGZlcl9mdW5jCi0geWNiY3Jf ZW5jL2hzdl9lbmMgKHVubGlrZWx5IHlvdSBldmVyIHdhbnQgdG8gc3VwcG9ydCBIU1YgcGl4ZWxm b3JtYXRzLCBzbyBJCiAgdGhpbmsgeW91IGNhbiBpZ25vcmUgaHN2X2VuYykKLSBxdWFudGl6YXRp b24KClNlZSBodHRwczovL2h2ZXJrdWlsLmhvbWUueHM0YWxsLm5sL3NwZWMvdWFwaS92NGwvcGl4 Zm10LXY0bDIuaHRtbCNjLnY0bDJfcGl4X2Zvcm1hdAphbmQgdGhlIGxpbmtzIHRvIHRoZSBjb2xv cnNwYWNlIHNlY3Rpb25zIGluIHRoZSBWNEwyIHNwZWMgZm9yIGRldGFpbHMpLgoKVGhpcyBpbmZv cm1hdGlvbiBpcyBwYXJ0IG9mIHRoZSBmb3JtYXQsIGl0IGlzIHJlcG9ydGVkIGJ5IHRoZSBkcml2 ZXIuCgoyKSBJZiB5b3Ugc3VwcG9ydCBpbnRlcmxhY2VkIGZvcm1hdHMgYW5kIFY0TDJfRklFTERf QUxURVJOQVRFIChpLmUuCiAgIGVhY2ggYnVmZmVyIGNvbnRhaW5zIGEgc2luZ2xlIGZpZWxkKSwg dGhlbiB5b3UgbmVlZCB0byBiZSBhYmxlIHRvIHRlbGwKICAgdXNlcnNwYWNlIHdoZXRoZXIgdGhl IGRlcXVldWVkIGJ1ZmZlciBjb250YWlucyBhIHRvcCBvciBib3R0b20gZmllbGQuCgpBbHNvLCB3 aGF0IHRvIGRvIHdpdGggZHJvcHBlZCBmcmFtZXMvZmllbGRzOiBWNEwyIGhhcyBhIHNlcXVlbmNl IGNvdW50ZXIgYW5kCnRpbWVzdGFtcCB0aGF0IGNhbiBoZWxwIGRldGVjdGluZyB0aGF0LiBZb3Ug cHJvYmFibHkgbmVlZCBzb21ldGhpbmcgc2ltaWxhci4KCj4gQnV0IGFueXdheXMsIEkgY2FuIGFk ZAo+ICNkZWZpbmUgWEVOQ0FNRVJBX0VWVF9DRkdfQ0hBTkdFICAgICAgIDB4MDEKPiBpbiB0aGUg cHJvdG9jb2wsIHNvIHdlIGNhbiBhZGRyZXNzIHRoaXMgdXNlLWNhc2UKPj4KCjxzbmlwPgoKPj4+ IDEuIHNldCBmb3JtYXQgY29tbWFuZDoKPj4+ICAgICogcGl4ZWxfZm9ybWF0IC0gdWludDMyX3Qs IHBpeGVsIGZvcm1hdCB0byBiZSB1c2VkLCBGT1VSQ0MgY29kZS4KPj4+ICAgICogd2lkdGggLSB1 aW50MzJfdCwgd2lkdGggaW4gcGl4ZWxzLgo+Pj4gICAgKiBoZWlnaHQgLSB1aW50MzJfdCwgaGVp Z2h0IGluIHBpeGVscy4KPj4+Cj4+PiAyLiBTZXQgZnJhbWUgcmF0ZSBjb21tYW5kOgo+Pj4gICAg KyAqIGZyYW1lX3JhdGVfbnVtZXIgLSB1aW50MzJfdCwgbnVtZXJhdG9yIG9mIHRoZSBmcmFtZSBy YXRlLgo+Pj4gICAgKyAqIGZyYW1lX3JhdGVfZGVub20gLSB1aW50MzJfdCwgZGVub21pbmF0b3Ig b2YgdGhlIGZyYW1lIHJhdGUuCj4+Pgo+Pj4gMy4gU2V0L3JlcXVlc3QgbnVtIGJ1ZnM6Cj4+PiAg ICAqIG51bV9idWZzIC0gdWludDhfdCwgZGVzaXJlZCBudW1iZXIgb2YgYnVmZmVycyB0byBiZSB1 c2VkLgo+PiBJIGxpa2UgdGhpcyBtdWNoIGJldHRlci4gMSsyIGNvdWxkIGJlIGNvbWJpbmVkLCBi dXQgMyBzaG91bGQgZGVmaW5pdGVseSByZW1haW4KPj4gc2VwYXJhdGUuCj4gb2ssIHRoZW4gMSsy IGNvbWJpbmVkICsgMyBzZXBhcmF0ZS4KPiBEbyB5b3UgdGhpbmsgd2UgY2FuIHN0aWxsIG5hbWUg MSsyIGFzICJzZXRfZm9ybWF0IiBvciAic2V0X2NvbmZpZyIKPiB3aWxsIGZpdCBiZXR0ZXI/Cgpz ZXRfZm9ybWF0IGlzIGNsb3NlciB0byBTX0ZNVCBhcyB1c2VkIGluIFY0TDIsIHNvIEkgaGF2ZSBh IHNsaWdodCBwcmVmZXJlbmNlCmZvciB0aGF0LCBidXQgaXQgaXMgcmVhbGx5IHVwIHRvIHlvdS4K Cj4+Cj4+Pj4+ICsgKgo+Pj4+PiArICogU2VlIHJlc3BvbnNlIGZvcm1hdCBmb3IgdGhpcyByZXF1 ZXN0Lgo+Pj4+PiArICoKPj4+Pj4gKyAqIE5vdGVzOgo+Pj4+PiArICogIC0gZnJvbnRlbmQgbXVz dCBjaGVjayB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZSBpbiBvcmRlciB0byBzZWUKPj4+Pj4g KyAqICAgIGlmIHRoZSB2YWx1ZXMgcmVwb3J0ZWQgYmFjayBieSB0aGUgYmFja2VuZCBkbyBtYXRj aCB0aGUgZGVzaXJlZCBvbmVzCj4+Pj4+ICsgKiAgICBhbmQgY2FuIGJlIGFjY2VwdGVkLgo+Pj4+ PiArICogIC0gZnJvbnRlbmQgbWF5IHNlbmQgbXVsdGlwbGUgWEVOQ0FNRVJBX09QX1NFVF9DT05G SUcgcmVxdWVzdHMgYmVmb3JlCj4+Pj4+ICsgKiAgICBzZW5kaW5nIFhFTkNBTUVSQV9PUF9TVFJF QU1fU1RBUlQgcmVxdWVzdCB0byB1cGRhdGUgb3IgdHVuZSB0aGUKPj4+Pj4gKyAqICAgIGNvbmZp Z3VyYXRpb24uCj4+Pj4+ICsgKi8KPj4+Pj4gK3N0cnVjdCB4ZW5jYW1lcmFfY29uZmlnIHsKPj4+ Pj4gKyAgICB1aW50MzJfdCBwaXhlbF9mb3JtYXQ7Cj4+Pj4+ICsgICAgdWludDMyX3Qgd2lkdGg7 Cj4+Pj4+ICsgICAgdWludDMyX3QgaGVpZ2h0Owo+Pj4+PiArICAgIHVpbnQzMl90IGZyYW1lX3Jh dGVfbm9tOwo+Pj4+PiArICAgIHVpbnQzMl90IGZyYW1lX3JhdGVfZGVub207Cj4+Pj4+ICsgICAg dWludDhfdCBudW1fYnVmczsKPj4+Pj4gK307Cj4+Pj4+ICsKPj4+Pj4gKy8qCj4+Pj4+ICsgKiBS ZXF1ZXN0IGJ1ZmZlciBkZXRhaWxzIC0gcmVxdWVzdCBjYW1lcmEgYnVmZmVyJ3MgbWVtb3J5IGxh eW91dC4KPj4+Pj4gKyAqIGRldGFpbGVkIGRlc2NyaXB0aW9uOgo+Pj4+PiArICogICAgICAgICAw ICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAg ICBvY3RldAo+Pj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4+ICsgKiB8ICAgICAgICAgICAgICAg aWQgICAgICAgICAgICAgICAgfF9HRVRfQlVGX0RFVEFJTFN8ICAgcmVzZXJ2ZWQgICAgIHwgNAo+ Pj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAo+Pj4+PiArICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCj4+Pj4+ICsgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKPj4+Pj4gKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Kwo+Pj4+PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8IDY0Cj4+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+Pj4g KyAqCj4+Pj4+ICsgKiBTZWUgcmVzcG9uc2UgZm9ybWF0IGZvciB0aGlzIHJlcXVlc3QuCj4+Pj4+ ICsgKgo+Pj4+PiArICoKPj4+Pj4gKyAqIFJlcXVlc3QgY2FtZXJhIGJ1ZmZlciBjcmVhdGlvbjoK Pj4+Pj4gKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAg ICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKPj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+PiAr ICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHwgX09QX0JVRl9DUkVBVEUgfCAg IHJlc2VydmVkICAgICB8IDQKPj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+PiArICogfCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8IDgKPj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+PiArICogfCAgICAgIGluZGV4ICAg ICB8ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICB8IDEy Cj4+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+Pj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAg ICAgICBncmVmX2RpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgo+Pj4+PiAr ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCj4+Pj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBy ZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjAKPj4+Pj4gKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKwo+Pj4+PiArICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98Cj4+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+ Pj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCA2NAo+Pj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4+ICsgKgo+ Pj4+PiArICogQW4gYXR0ZW1wdCB0byBjcmVhdGUgbXVsdGlwbGUgYnVmZmVycyB3aXRoIHRoZSBz YW1lIGluZGV4IGlzIGFuIGVycm9yLgo+Pj4+PiArICogaW5kZXggY2FuIGJlIHJlLXVzZWQgYWZ0 ZXIgZGVzdHJveWluZyB0aGUgY29ycmVzcG9uZGluZyBjYW1lcmEgYnVmZmVyLgo+Pj4+PiArICoK Pj4+Pj4gKyAqIGluZGV4IC0gdWludDhfdCwgaW5kZXggb2YgdGhlIGJ1ZmZlciB0byBiZSBjcmVh dGVkLgo+Pj4+PiArICogZ3JlZl9kaXJlY3RvcnkgLSBncmFudF9yZWZfdCwgYSByZWZlcmVuY2Ug dG8gdGhlIGZpcnN0IHNoYXJlZCBwYWdlCj4+Pj4+ICsgKiAgIGRlc2NyaWJpbmcgc2hhcmVkIGJ1 ZmZlciByZWZlcmVuY2VzLiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGlzIGVxdWFsIHRvCj4+Pj4+ ICsgKiAgIFhFTkNBTUVSQV9PUF9HRVRfQlVGX0RFVEFJTFMuc2l6ZSByZXNwb25zZS4gQXQgbGVh c3Qgb25lIHBhZ2UgZXhpc3RzLiBJZgo+Pj4+PiArICogICBzaGFyZWQgYnVmZmVyIHNpemUgZXhj ZWVkcyB3aGF0IGNhbiBiZSBhZGRyZXNzZWQgYnkgdGhpcyBzaW5nbGUgcGFnZSwKPj4+Pj4gKyAq ICAgdGhlbiByZWZlcmVuY2UgdG8gdGhlIG5leHQgc2hhcmVkIHBhZ2UgbXVzdCBiZSBzdXBwbGll ZCAoc2VlCj4+Pj4+ICsgKiAgIGdyZWZfZGlyX25leHRfcGFnZSBiZWxvdykuCj4+Pj4gSXQgbWln aHQgYmUgYmV0dGVyIHRvIGFsbG9jYXRlIGFsbCBidWZmZXJzIGluIG9uZSBnbywgaS5lLiB3aGF0 IFZJRElPQ19SRVFCVUZTCj4+Pj4gZG9lcy4KPj4+IFdlbGwsIEkgc3RpbGwgdGhpbmsgaXQgaXMg YmV0dGVyIHRvIGhhdmUgYSBwZXIgYnVmZmVyIGludGVyZmFjZQo+Pj4gaW4gdGhlIHByb3RvY29s IGFzIGl0IGlzIGRvbmUgZm9yIG90aGVyIFhlbiB2aXJ0dWFsIGRldmljZXMuCj4+PiBTbywgSSds bCBrZWVwIHRoaXMgYXMgaXMgZm9yIG5vdzogVklESU9DX1JFUUJVRlMgY2FuIHN0aWxsIGRvCj4+ PiB3aGF0IGl0IGRvZXMgaW50ZXJuYWxseSBpbiB0aGUgZnJvbnRlbmQgZHJpdmVyCj4+IEkgbWF5 IGhhdmUgbWlzdW5kZXJzdG9vZCB0aGUgb3JpZ2luYWwgQVBJLiBUaGUgbmV3bHkgcHJvcG9zZWQg WEVOQ0FNRVJBX09QX0JVRl9SRVFVRVNUCj4+IG1hcHMgdG8gUkVRQlVGUywgcmlnaHQ/IEFuZCB0 aGVuIEJVRl9DUkVBVEUvREVTVFJPWSBqdXN0IHNldCB1cCB0aGUgc2hhcmVkIGJ1ZmZlcgo+PiBt YXBwaW5ncyBmb3IgdGhlIGJ1ZmZlcnMgY3JlYXRlZCBieSBSRVFCVUZTLiBJZiB0aGF0J3MgdGhl IHNlcXVlbmNlLCB0aGVuIGl0IG1ha2VzCj4+IHNlbnNlLiBJJ20gbm90IHN1cmUgYWJvdXQgdGhl IG5hbWluZy4KPj4KPj4gWW91IG1pZ2h0IHdhbnQgdG8gbWFrZSBpdCBjbGVhciB0aGF0IFhFTkNB TUVSQV9PUF9CVUZfUkVRVUVTVCBhbGxvY2F0ZXMgdGhlIGJ1ZmZlcnMKPj4gb24gdGhlIGJhY2tl bmQsIGFuZCBzbyBjYW4gZmFpbC4gQWxzbywgdGhlIGFjdHVhbCBudW1iZXIgb2YgYWxsb2NhdGVk IGJ1ZmZlcnMgaW4KPj4gY2FzZSBvZiBzdWNjZXNzIGNhbiBiZSBtb3JlIG9yIGxlc3MgdGhhbiB3 aGF0IHdhcyByZXF1ZXN0ZWQuCj4gVGhlIGJ1ZmZlcnMgY2FuIGJlIGFsbG9jYXRlZCBhbmQgc2hh cmVkIGJ5IGVpdGhlciBiYWNrZW5kIG9yIGZyb250ZW5kOiBzZWUKPiAiYmUtYWxsb2MiIGNvbmZp Z3VyYXRpb24gb3B0aW9uIHRlbGxpbmcgd2hpY2ggZG9tYWluIChWTSkgc2hhcmVzCj4gdGhlIFhl biBncmFudCByZWZlcmVuY2VzIHRvIHRoZSBwYWdlcyBvZiB0aGUgYnVmZmVyOiBlaXRoZXIgZnJv bnRlbmQKPiBvciBiYWNrZW5kLgoKSWYgeW91IHdhbnQgdG8gZG8gemVyby1jb3B5IHZpZGVvIGNh cHR1cmUsIHRoZW4geW91IG5lZWQgdG8ga25vdyB3aGljaApkZXZpY2UgaW4geW91ciB2aWRlbyBw aXBlbGluZSAod2hpY2ggbm93IGNvdmVycyBib3RoIGFjdHVhbCBoYXJkd2FyZSBhbmQKbXVsdGlw bGUgVk1zKSBoYXMgdGhlIHN0cmljdGVzdCBtZW1vcnkgbGF5b3V0IHJlcXVpcmVtZW50cy4gT2Z0 ZW4gdGhlCnZpZGVvIEhXIHJlcXVpcmVzIGNvbnRpZ3VvdXMgcGh5c2ljYWwgbWVtb3J5IGZvciB0 aGUgYnVmZmVycywgd2hpY2ggbWVhbnMKeW91IGNhbid0IGp1c3QgZ2l2ZSBpdCBhIHBpZWNlIG9m IG5vbi1jb250aWcgbWVtb3J5IGFsbG9jYXRlZCBlbHNld2hlcmUuCgpJbiBwcmFjdGljZSB5b3Ug aGF2ZSB0d28gcG9zc2libGUgbWVtb3J5IG1vZGVscyB5b3UgY2FuIHVzZSB3aXRoIFY0TDIgZHJp dmVyczoKTU1BUCAoaS5lLiBhbGxvY2F0ZWQgYnkgdGhlIGRyaXZlciBhbmQgdGhlIGJ1ZmZlcnMg Y2FuLCBpZiBuZWVkZWQsIGJlIGV4cG9ydGVkCmFzIGRtYWJ1ZiBoYW5kbGVzIHdpdGggVklESU9D X0VYUEJVRiksIG9yIERNQUJVRiB3aGVyZSBidWZmZXJzIGFyZSBhbGxvY2F0ZWQKZWxzZXdoZXJl IGFuZCBpbXBvcnRlZCB0byBWNEwyLCB3aGljaCBtYXkgZmFpbCBpZiBpdCBkb2Vzbid0IG1hdGNo IHRoZSBIVwpyZXF1aXJlbWVudHMuCgo+IAo+IFNvLCBJIHdhcyBtb3JlIHRoaW5raW5nIHRoYXQg aW4gY2FzZSBvZiBWNEwyIGJhc2VkIGZyb250ZW5kIGRyaXZlcjoKPiAxLiBGcm9udGVuZCBzZXJ2 ZXMgUkVRQlVGUyBpb2N0bCBhbmQgYXNrcyB0aGUgYmFja2VuZCB3aXRoIAo+IFhFTkNBTUVSQV9P UF9CVUZfUkVRVUVTVAo+IGlmIGl0IGNhbiBoYW5kbGUgdGhhdCBtYW55IGJ1ZmZlcnMgYW5kIGdl dHMgbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gYmUgdXNlZAo+IGFuZCBidWZmZXIgc3RydWN0dXJlIChu dW1iZXIgb2YgcGxhbmVzLCBzaXplcywgb2Zmc2V0cyBldGMuKSBhcyB0aGUgcmVwbHkKPiB0byB0 aGF0IHJlcXVlc3QKPiAyLiBGcm9udGVuZCBjcmVhdGVzIG4gYnVmZmVycyB3aXRoIFhFTkNBTUVS QV9PUF9CVUZfQ1JFQVRFCj4gMy4gRnJvbnRlbmQgcmV0dXJucyBmcm9tIFJFUUJVRlMgaW9jdGwg d2l0aCBhY3R1YWwgbnVtYmVyIG9mIGJ1ZmZlcnMKPiBhbGxvY2F0ZWQKClJlZ2FyZHMsCgoJSGFu cwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRl dmVsIG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKaHR0cHM6Ly9s aXN0cy54ZW5wcm9qZWN0Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL3hlbi1kZXZlbA==