From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail-lj1-f181.google.com ([209.85.208.181]:42597 "EHLO mail-lj1-f181.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727639AbeIJNRk (ORCPT ); Mon, 10 Sep 2018 09:17:40 -0400 Received: by mail-lj1-f181.google.com with SMTP id f1-v6so17096888ljc.9 for ; Mon, 10 Sep 2018 01:24:43 -0700 (PDT) Subject: Re: [Xen-devel][PATCH 1/1] cameraif: add ABI for para-virtual camera To: Hans Verkuil , 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> From: Oleksandr Andrushchenko Message-ID: <51f97715-454a-0242-b381-29944d77d5b5@gmail.com> Date: Mon, 10 Sep 2018 11:24:40 +0300 MIME-Version: 1.0 In-Reply-To: <7134b3ad-9fcf-0139-41b3-67a3dbc8224d@xs4all.nl> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US Sender: linux-media-owner@vger.kernel.org List-ID: On 09/10/2018 10:53 AM, Hans Verkuil wrote: > Hi Oleksandr, > > On 09/10/2018 09:16 AM, Oleksandr Andrushchenko wrote: >> Hi, Hans! >> >> On 09/09/2018 01:31 PM, Hans Verkuil wrote: >>> Hi Oleksandr, >>> >>> Sorry for the delay in reviewing, I missed this patch until you pinged me, and >>> I was very busy after that as well. >> I do appreciate you spending time on this! >>> On 07/31/2018 11:31 AM, Oleksandr Andrushchenko wrote: >>>> From: Oleksandr Andrushchenko >>>> >>>> This is the ABI for the two halves of a para-virtualized >>>> camera driver which extends Xen's reach multimedia capabilities even >>>> farther enabling it for video conferencing, In-Vehicle Infotainment, >>>> high definition maps etc. >>>> >>>> The initial goal is to support most needed functionality with the >>>> final idea to make it possible to extend the protocol if need be: >>>> >>>> 1. Provide means for base virtual device configuration: >>>> - pixel formats >>>> - resolutions >>>> - frame rates >>>> 2. Support basic camera controls: >>>> - contrast >>>> - brightness >>>> - hue >>>> - saturation >>>> 3. Support streaming control >>>> 4. Support zero-copying use-cases >>>> >>>> Signed-off-by: Oleksandr Andrushchenko >>>> --- >>>> xen/include/public/io/cameraif.h | 981 +++++++++++++++++++++++++++++++ >>>> 1 file changed, 981 insertions(+) >>>> create mode 100644 xen/include/public/io/cameraif.h >>>> >>>> diff --git a/xen/include/public/io/cameraif.h b/xen/include/public/io/cameraif.h >>>> new file mode 100644 >>>> index 000000000000..bdc6a1262fcf >>>> --- /dev/null >>>> +++ b/xen/include/public/io/cameraif.h >>>> @@ -0,0 +1,981 @@ >>>> +/****************************************************************************** >>>> + * cameraif.h >>>> + * >>>> + * Unified camera device I/O interface for Xen guest OSes. >>>> + * >>>> + * Permission is hereby granted, free of charge, to any person obtaining a copy >>>> + * of this software and associated documentation files (the "Software"), to >>>> + * deal in the Software without restriction, including without limitation the >>>> + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or >>>> + * sell copies of the Software, and to permit persons to whom the Software is >>>> + * furnished to do so, subject to the following conditions: >>>> + * >>>> + * The above copyright notice and this permission notice shall be included in >>>> + * all copies or substantial portions of the Software. >>>> + * >>>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR >>>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, >>>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE >>>> + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER >>>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING >>>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER >>>> + * DEALINGS IN THE SOFTWARE. >>>> + * >>>> + * Copyright (C) 2018 EPAM Systems Inc. >>>> + * >>>> + * Author: Oleksandr Andrushchenko >>>> + */ >>> Use SPDX tag instead of copying the license text. >> This is yet a Xen header which belongs to Xen project and >> all the rest of the protocols have the same license header. >> If Xen community decides to use SPDX then I'll definitely follow. > Ah, yes, I was reviewing this as a kernel header, I hadn't realized > that this isn't a kernel header. Since it isn't a kernel header, you > can disregard my comments about style and naming conventions, since > you have your own. > >> Konrad, do you think this is the right time for such a move? >>>> + >>>> +#ifndef __XEN_PUBLIC_IO_CAMERAIF_H__ >>>> +#define __XEN_PUBLIC_IO_CAMERAIF_H__ >>>> + >>>> +#include "ring.h" >>>> +#include "../grant_table.h" >>>> + >>>> +/* >>>> + ****************************************************************************** >>>> + * Protocol version >>>> + ****************************************************************************** >>>> + */ >>>> +#define XENCAMERA_PROTOCOL_VERSION "1" >>>> + >>>> +/* >>>> + ****************************************************************************** >>>> + * Feature and Parameter Negotiation >>>> + ****************************************************************************** >>>> + * >>>> + * Front->back notifications: when enqueuing a new request, sending a >>>> + * notification can be made conditional on xencamera_req (i.e., the generic >>>> + * hold-off mechanism provided by the ring macros). Backends must set >>>> + * xencamera_req appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()). >>>> + * >>>> + * Back->front notifications: when enqueuing a new response, sending a >>>> + * notification can be made conditional on xencamera_resp (i.e., the generic >>>> + * hold-off mechanism provided by the ring macros). Frontends must set >>>> + * xencamera_resp appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()). >>>> + * >>>> + * The two halves of a para-virtual camera driver utilize nodes within >>>> + * XenStore to communicate capabilities and to negotiate operating parameters. >>>> + * This section enumerates these nodes which reside in the respective front and >>>> + * backend portions of XenStore, following the XenBus convention. >>>> + * >>>> + * All data in XenStore is stored as strings. Nodes specifying numeric >>>> + * values are encoded in decimal. Integer value ranges listed below are >>>> + * expressed as fixed sized integer types capable of storing the conversion >>>> + * of a properly formatted node string, without loss of information. >>>> + * >>>> + ****************************************************************************** >>>> + * Example configuration >>>> + ****************************************************************************** >>>> + * >>>> + * This is an example of backend and frontend configuration: >>>> + * >>>> + *--------------------------------- Backend ----------------------------------- >>>> + * >>>> + * /local/domain/0/backend/vcamera/1/0/frontend-id = "1" >>>> + * /local/domain/0/backend/vcamera/1/0/frontend = "/local/domain/1/device/vcamera/0" >>>> + * /local/domain/0/backend/vcamera/1/0/state = "4" >>>> + * /local/domain/0/backend/vcamera/1/0/versions = "1,2" >>> Why vcamera instead of just camera? If 'v' stands for 'video', then that seems >>> superfluous to me. >> 'v' stands for 'virtual'. I am following Xen convention used >> for all other virtual device protocols here. >>>> + * >>>> + *--------------------------------- Frontend ---------------------------------- >>>> + * >>>> + * /local/domain/1/device/vcamera/0/backend-id = "0" >>>> + * /local/domain/1/device/vcamera/0/backend = "/local/domain/0/backend/vcamera/1" >>>> + * /local/domain/1/device/vcamera/0/state = "4" >>>> + * /local/domain/1/device/vcamera/0/version = "1" >>>> + * /local/domain/1/device/vcamera/0/be-alloc = "1" >>>> + * >>>> + *---------------------------- Device 0 configuration ------------------------- >>>> + * >>>> + * /local/domain/1/device/vcamera/0/controls = "contrast,hue" >>>> + * /local/domain/1/device/vcamera/0/formats/YUYV/640x480 = "30/1,15/1,15/2" >>>> + * /local/domain/1/device/vcamera/0/formats/YUYV/1920x1080 = "15/2" >>>> + * /local/domain/1/device/vcamera/0/formats/BGRA/640x480 = "15/1,15/2" >>>> + * /local/domain/1/device/vcamera/0/formats/BGRA/1200x720 = "15/2" >>>> + * /local/domain/1/device/vcamera/0/unique-id = "0" >>>> + * /local/domain/1/device/vcamera/0/req-ring-ref = "2832" >>>> + * /local/domain/1/device/vcamera/0/req-event-channel = "15" >>>> + * /local/domain/1/device/vcamera/0/evt-ring-ref = "387" >>>> + * /local/domain/1/device/vcamera/0/evt-event-channel = "16" >>>> + * >>>> + *---------------------------- Device 1 configuration ------------------------- >>>> + * >>>> + * /local/domain/1/device/vcamera/1/controls = "brightness,saturation,hue" >>>> + * /local/domain/1/device/vcamera/1/formats/YUYV/640x480 = "30/1,15/1,15/2" >>>> + * /local/domain/1/device/vcamera/1/formats/YUYV/1920x1080 = "15/2" >>>> + * /local/domain/1/device/vcamera/1/unique-id = "1" >>>> + * /local/domain/1/device/vcamera/1/req-ring-ref = "2833" >>>> + * /local/domain/1/device/vcamera/1/req-event-channel = "17" >>>> + * /local/domain/1/device/vcamera/1/evt-ring-ref = "388" >>>> + * /local/domain/1/device/vcamera/1/evt-event-channel = "18" >>>> + * >>>> + ****************************************************************************** >>>> + * Backend XenBus Nodes >>>> + ****************************************************************************** >>>> + * >>>> + *----------------------------- Protocol version ------------------------------ >>>> + * >>>> + * versions >>>> + * Values: >>>> + * >>>> + * List of XENCAMERA_LIST_SEPARATOR separated protocol versions supported >>>> + * by the backend. For example "1,2,3". >>>> + * >>>> + ****************************************************************************** >>>> + * Frontend XenBus Nodes >>>> + ****************************************************************************** >>>> + * >>>> + *-------------------------------- Addressing --------------------------------- >>>> + * >>>> + * dom-id >>>> + * Values: >>>> + * >>>> + * Domain identifier. >>>> + * >>>> + * dev-id >>>> + * Values: >>>> + * >>>> + * Device identifier. >>>> + * >>>> + * /local/domain//device/vcamera//... >>>> + * >>>> + *----------------------------- Protocol version ------------------------------ >>>> + * >>>> + * version >>>> + * Values: >>>> + * >>>> + * Protocol version, chosen among the ones supported by the backend. >>>> + * >>>> + *------------------------- Backend buffer allocation ------------------------- >>>> + * >>>> + * be-alloc >>> I thought that 'be' referred to 'big-endian', but apparently not. Perhaps it >>> is better to just write 'backend-alloc'. >> Well, 'be' and 'fe' are commonly used in Xen for backend >> and frontend, so I'll probably stick to that convention for now. >>>> + * Values: "0", "1" >>>> + * >>>> + * If value is set to "1", then backend will be the buffer >>>> + * provider/allocator for this domain during XENCAMERA_OP_BUF_CREATE >>>> + * operation. >>>> + * If value is not "1" or omitted frontend must allocate buffers itself. >>>> + * >>>> + *------------------------------- Camera settings ----------------------------- >>>> + * >>>> + * unique-id >>>> + * Values: >>>> + * >>>> + * After device instance initialization each camera is assigned a >>>> + * unique ID, so it can be identified by the backend by this ID. >>>> + * This can be UUID or such. >>>> + * >>>> + * controls >>>> + * Values: >>>> + * >>>> + * List of supported camera controls separated by XENCAMERA_LIST_SEPARATOR. >>>> + * Camera controls are expressed as a list of string values w/o any >>>> + * ordering requirement. >>>> + * >>>> + * formats >>>> + * Values: >>>> + * >>>> + * Formats are organized as a set of directories one per each >>>> + * supported pixel format. The name of the directory is an upper case >>>> + * string of the corresponding FOURCC string label. The next level of >>>> + * the directory under represents supported resolutions. >>> Lower-case characters are also use in pixelformats, so I'd just keep this as-is. >> Ok, no problem - will remove the 'upper case' from the definition >>> In addition it is common to set bit 31 of the fourcc to 1 if the format is >>> big-endian (see v4l2_fourcc_be macro). When v4l utilities print this format we >>> add a -BE suffix, so V4L2_PIX_FMT_ARGB555X becomes "AR15-BE". You might want to >>> keep that convention. >> I'll think about it, thank you >>>> + * >>>> + * resolution >>>> + * Values: x >>>> + * >>>> + * Resolutions are organized as a set of directories one per each >>>> + * supported resolution under corresponding directory. >>>> + * The name of the directory is the supported width and height >>>> + * of the camera resolution in pixels. >>> What if you are dealing with an HDMI input? Not unreasonable for media >>> systems. There can be a lot of resolutions/framerates, and the resolution >>> can change on the fly, or of course disappear. >> Well, this is a part of the system configuration done >> before we actually run the VMs, e.g. at system design >> and configuration time. Most of the time you do know which >> resolutions, frame rates etc. you want to assign and these >> settings remain static for the whole lifetime of that VM. >> If you are designing a system which needs these resolutions >> to change at run-time then this can be done: >> 1. Backend changes the state of the frontend to XenbusStateClosed state >> 2. Xen (xl/libxl) or backend change the configuration in XenStore >> 3. Backend re-initializes the frontend which reads new configuration >>> What is also missing here is a way to report pixel aspect ratio: PAL and >>> NTSC-based video material doesn't have square pixels. >> Hm, indeed, thank you. I'll put this as a fraction under >> the corresponding 'resolution': >> >> Now: >> /local/domain/2/device/vcamera/0/formats/YUYV/640x480 = "30/1,15/1,15/2" >> /local/domain/2/device/vcamera/0/formats/YUYV/1280x1024 = "015/2" >> >> Will change to: >> /local/domain/2/device/vcamera/0/formats/YUYV/640x480/framerates/ = >> "30/1,15/1,15/2" >> /local/domain/2/device/vcamera/0/formats/YUYV/640x480/aspectratio = "1/1" > You need to be more precise: aspectratio can refer to the display aspect > ratio or the pixel aspect ratio, and you can calculate one from the other. > > So this is either pixelaspectratio or displayaspectratio. > > Even though V4L2 provides a pixelaspectratio, I would recommend that you > choose to export it as a displayaspectratio. It's easier for applications > to handle. ok, then "display-aspect-ratio" > > Please note that in the case of DVD/BluRay source material the same > resolution can have different display aspect ratios: e.g. PAL can be > 4:3 or 16:9, depending on whether it is widescreen or not. > ok >> /local/domain/2/device/vcamera/0/formats/YUYV/1280x1024/framerates = "015/2" >> /local/domain/2/device/vcamera/0/formats/YUYV/1280x1024/aspectratio = >> "59/58" >> >>> It's important to decide whether or not you want to support video sources >>> like that (HDMI, Composite/S-Video inputs, USB ports where users can connect >>> or disconnect webcams) or if you stick to fixed camera pipelines. >> I believe that this is all hidden from the frontend by the >> backend, so I se nothing we have to put in the protocol >> with this respect. >>> The big difference is that you don't control what someone can connect as >>> external sources, so you will have to be a lot more careful and robust. >>> >>> 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? But anyways, I can add #define XENCAMERA_EVT_CFG_CHANGE       0x01 in the protocol, so we can address this use-case > >>>> + * >>>> + * frame-rates >>>> + * Values: / >>>> + * >>>> + * List of XENCAMERA_FRAME_RATE_SEPARATOR separated supported frame rates >>>> + * of the camera expressed as numerator and denominator of the >>>> + * corresponding frame rate. >>>> + * >>>> + * The format of the directory tree with resolutions and frame rates >>>> + * must be structured in the following format: >>>> + * >>>> + * .../vcamera//// >>>> + * >>>> + * where >>>> + * i - i-th supported pixel format >>>> + * j - j-th supported resolution for i-th pixel format >>>> + * k - k-th supported frame rate for i-th pixel format and j-th >>>> + * resolution> + * >>>> + *------------------- Camera Request Transport Parameters --------------------- >>>> + * >>>> + * This communication path is used to deliver requests from frontend to backend >>>> + * and get the corresponding responses from backend to frontend, >>>> + * set up per virtual camera device. >>>> + * >>>> + * req-event-channel >>>> + * Values: >>>> + * >>>> + * The identifier of the Xen camera's control event channel >>>> + * used to signal activity in the ring buffer. >>>> + * >>>> + * req-ring-ref >>>> + * Values: >>>> + * >>>> + * The Xen grant reference granting permission for the backend to map >>>> + * a sole page of camera's control ring buffer. >>>> + * >>>> + *-------------------- Camera Event Transport Parameters ---------------------- >>>> + * >>>> + * This communication path is used to deliver asynchronous events from backend >>>> + * to frontend, set up per virtual camera device. >>>> + * >>>> + * evt-event-channel >>>> + * Values: >>>> + * >>>> + * The identifier of the Xen camera's event channel >>>> + * used to signal activity in the ring buffer. >>>> + * >>>> + * evt-ring-ref >>>> + * Values: >>>> + * >>>> + * The Xen grant reference granting permission for the backend to map >>>> + * a sole page of camera's event ring buffer. >>>> + */ >>>> + >>>> +/* >>>> + ****************************************************************************** >>>> + * STATE DIAGRAMS >>>> + ****************************************************************************** >>>> + * >>>> + * Tool stack creates front and back state nodes with initial state >>>> + * XenbusStateInitialising. >>>> + * Tool stack creates and sets up frontend camera configuration >>>> + * nodes per domain. >>>> + * >>>> + *-------------------------------- Normal flow -------------------------------- >>>> + * >>>> + * Front Back >>>> + * ================================= ===================================== >>>> + * XenbusStateInitialising XenbusStateInitialising >>>> + * o Query backend device identification >>>> + * data. >>>> + * o Open and validate backend device. >>>> + * | >>>> + * | >>>> + * V >>>> + * XenbusStateInitWait >>>> + * >>>> + * o Query frontend configuration >>>> + * o Allocate and initialize >>>> + * event channels per configured >>>> + * camera. >>>> + * o Publish transport parameters >>>> + * that will be in effect during >>>> + * this connection. >>>> + * | >>>> + * | >>>> + * V >>>> + * XenbusStateInitialised >>>> + * >>>> + * o Query frontend transport parameters. >>>> + * o Connect to the event channels. >>>> + * | >>>> + * | >>>> + * V >>>> + * XenbusStateConnected >>>> + * >>>> + * o Create and initialize OS >>>> + * virtual camera as per >>>> + * configuration. >>>> + * | >>>> + * | >>>> + * V >>>> + * XenbusStateConnected >>>> + * >>>> + * XenbusStateUnknown >>>> + * XenbusStateClosed >>>> + * XenbusStateClosing >>>> + * o Remove virtual camera device >>>> + * o Remove event channels >>>> + * | >>>> + * | >>>> + * V >>>> + * XenbusStateClosed >>>> + * >>>> + *------------------------------- Recovery flow ------------------------------- >>>> + * >>>> + * In case of frontend unrecoverable errors backend handles that as >>>> + * if frontend goes into the XenbusStateClosed state. >>>> + * >>>> + * In case of backend unrecoverable errors frontend tries removing >>>> + * the virtualized device. If this is possible at the moment of error, >>>> + * then frontend goes into the XenbusStateInitialising state and is ready for >>>> + * new connection with backend. If the virtualized device is still in use and >>>> + * cannot be removed, then frontend goes into the XenbusStateReconfiguring state >>>> + * until either the virtualized device is removed or backend initiates a new >>>> + * connection. On the virtualized device removal frontend goes into the >>>> + * XenbusStateInitialising state. >>>> + * >>>> + * Note on XenbusStateReconfiguring state of the frontend: if backend has >>>> + * unrecoverable errors then frontend cannot send requests to the backend >>>> + * and thus cannot provide functionality of the virtualized device anymore. >>>> + * After backend is back to normal the virtualized device may still hold some >>>> + * state: configuration in use, allocated buffers, client application state etc. >>>> + * In most cases, this will require frontend to implement complex recovery >>>> + * reconnect logic. Instead, by going into XenbusStateReconfiguring state, >>>> + * frontend will make sure no new clients of the virtualized device are >>>> + * accepted, allow existing client(s) to exit gracefully by signaling error >>>> + * state etc. >>>> + * Once all the clients are gone frontend can reinitialize the virtualized >>>> + * device and get into XenbusStateInitialising state again signaling the >>>> + * backend that a new connection can be made. >>>> + * >>>> + * There are multiple conditions possible under which frontend will go from >>>> + * XenbusStateReconfiguring into XenbusStateInitialising, some of them are OS >>>> + * specific. For example: >>>> + * 1. The underlying OS framework may provide callbacks to signal that the last >>>> + * client of the virtualized device has gone and the device can be removed >>>> + * 2. Frontend can schedule a deferred work (timer/tasklet/workqueue) >>>> + * to periodically check if this is the right time to re-try removal of >>>> + * the virtualized device. >>>> + * 3. By any other means. >>>> + * >>>> + ****************************************************************************** >>>> + * REQUEST CODES >>>> + ****************************************************************************** >>>> + */ >>>> +#define XENCAMERA_OP_SET_CONFIG 0x00 >>>> +#define XENCAMERA_OP_GET_BUF_DETAILS 0x01 >>>> +#define XENCAMERA_OP_BUF_CREATE 0x02 >>>> +#define XENCAMERA_OP_BUF_DESTROY 0x03 >>>> +#define XENCAMERA_OP_STREAM_START 0x04 >>>> +#define XENCAMERA_OP_STREAM_STOP 0x05 >>>> +#define XENCAMERA_OP_GET_CTRL_DETAILS 0x06 >>>> +#define XENCAMERA_OP_SET_CTRL 0x07 >> I am thinking about extending the command set a bit as it already >> has some flaws, e.g. there is no way for a VM to tell the backend >> that the buffer is not in use anymore and can be given back >> to the real HW driver, e.g. queue/dequeue in V4L2 terms: >> >> #define XENCAMERA_OP_SET_FORMAT 0x00 >> - will be used to set format: pixel format, resolution >> >> #define XENCAMERA_OP_SET_FRAME_RATE 0x01 >> - used to set the frame rate >> >> #define XENCAMERA_OP_BUF_REQUEST 0x02 >> - asks backend to allocate the given number of buffers, >> backend replies with real number of those to be used >> >> #define XENCAMERA_OP_BUF_CREATE 0x03 >> - create a shared buffer >> >> #define XENCAMERA_OP_BUF_DESTROY 0x04 >> - destroy a shared buffer >> >> #define XENCAMERA_OP_BUF_QUEUE 0x05 >> - VM tells the backend that it has access to the shared buffer >> and the buffer cannot be sent back to real HW driver >> >> #define XENCAMERA_OP_BUF_DEQUEUE 0x06 >> - VM tells the backend that the shared buffer is not in use and >> can be sent to real HW driver > This is the wrong way around: QUEUE would queue the shared buffer to > the backend for use with the real HW driver, DEQUEUE would dequeue it > for use in the VM. Indeed, thank you for spotting this > >> #define XENCAMERA_OP_CTRL_ENUM 0x07 >> - get i-th control ranges and settings >> >> #define XENCAMERA_OP_CTRL_GET 0x08 >> - get control value >> >> #define XENCAMERA_OP_CTRL_SET 0x09 >> - set control value >> >> #define XENCAMERA_OP_STREAM_START 0x0a >> - start streaming >> >> #define XENCAMERA_OP_STREAM_STOP 0x0b >> - stop ctreaming >> >> >>>> + >>>> +#define XENCAMERA_CTRL_BRIGHTNESS 0x00 >>>> +#define XENCAMERA_CTRL_CONTRAST 0x01 >>>> +#define XENCAMERA_CTRL_SATURATION 0x02 >>>> +#define XENCAMERA_CTRL_HUE 0x03 >>>> + >>>> +/* >>>> + ****************************************************************************** >>>> + * EVENT CODES >>>> + ****************************************************************************** >>>> + */ >>>> +#define XENCAMERA_EVT_FRAME_AVAIL 0x00 >>>> + >>>> +/* >>>> + ****************************************************************************** >>>> + * XENSTORE FIELD AND PATH NAME STRINGS, HELPERS >>>> + ****************************************************************************** >>>> + */ >>>> +#define XENCAMERA_DRIVER_NAME "vcamera" >>> Ah, that's where vcamera comes from. How about calling this xen-camera or >>> virt-camera? With a preference for xen-camera, since that's what you use for the >>> defines as well. >>> >>> Or perhaps pv-camera? >>> >>> Is this driver going to be xen-specific, or more a general approach that everyone >>> can use? Obviously, the latter would be preferable. >> As I have already replied to the cover letter with explanations: >> 'v' stands for 'virtual' and there is a convention to name the >> Xen virtual devices starting with 'v': vif, vkbd etc. > Yeah, ignore my comment. > >>> BTW, I am not sure if you are aware of this, but the V4L2 API also has support for >>> radio and RDS hardware. Contact me if this is of interest to Xen to support this as >>> well given the automotive use-case. >> Yes, thank you, but at this stage we are targeting camera only. >> Radio can be another topic if time allows ;) And most probably >> it will be a dedicated 'vradio' protocol then... >>>> + >>>> +#define XENCAMERA_LIST_SEPARATOR "," >>>> +#define XENCAMERA_RESOLUTION_SEPARATOR "x" >>>> +#define XENCAMERA_FRAME_RATE_SEPARATOR "/" >>>> + >>>> +#define XENCAMERA_FIELD_BE_VERSIONS "versions" >>>> +#define XENCAMERA_FIELD_FE_VERSION "version" >>>> +#define XENCAMERA_FIELD_REQ_RING_REF "req-ring-ref" >>>> +#define XENCAMERA_FIELD_REQ_CHANNEL "req-event-channel" >>>> +#define XENCAMERA_FIELD_EVT_RING_REF "evt-ring-ref" >>>> +#define XENCAMERA_FIELD_EVT_CHANNEL "evt-event-channel" >>>> +#define XENCAMERA_FIELD_CONTROLS "controls" >>>> +#define XENCAMERA_FIELD_FORMATS "formats" >>>> +#define XENCAMERA_FIELD_BE_ALLOC "be-alloc" >>>> +#define XENCAMERA_FIELD_UNIQUE_ID "unique-id" >>>> + >>>> +#define XENCAMERA_CTRL_BRIGHTNESS_STR "brightness" >>>> +#define XENCAMERA_CTRL_CONTRAST_STR "contrast" >>>> +#define XENCAMERA_CTRL_SATURATION_STR "saturation" >>>> +#define XENCAMERA_CTRL_HUE_STR "hue" >>>> + >>>> +/* Maximum number of buffer planes supported. */ >>>> +#define XENCAMERA_MAX_PLANE 4 >>>> + >>>> +/* >>>> + ****************************************************************************** >>>> + * STATUS RETURN CODES >>>> + ****************************************************************************** >>>> + * >>>> + * Status return code is zero on success and -XEN_EXX on failure. >>>> + * >>>> + ****************************************************************************** >>>> + * Assumptions >>>> + ****************************************************************************** >>>> + * >>>> + * - usage of grant reference 0 as invalid grant reference: >>>> + * grant reference 0 is valid, but never exposed to a PV driver, >>>> + * because of the fact it is already in use/reserved by the PV console. >>>> + * - all references in this document to page sizes must be treated >>>> + * as pages of size XEN_PAGE_SIZE unless otherwise noted. >>>> + * >>>> + ****************************************************************************** >>>> + * Description of the protocol between frontend and backend driver >>>> + ****************************************************************************** >>>> + * >>>> + * The two halves of a Para-virtual camera driver communicate with >>>> + * each other using shared pages and event channels. >>>> + * Shared page contains a ring with request/response packets. >>>> + * >>>> + * All reserved fields in the structures below must be 0. >>>> + * >>>> + * For all request/response/event packets: >>>> + * - frame rate parameter is represented as a pair of 4 octet long >>>> + * numerator and denominator: >>>> + * - frame_rate_numer - uint32_t, numerator of the frame rate >>>> + * - frame_rate_denom - uint32_t, denominator of the frame rate >>>> + * The corresponding frame rate (Hz) is calculated as: >>>> + * frame_rate = frame_rate_numer / frame_rate_denom >>>> + * - buffer index is a zero based index of the buffer. Must be less than >>>> + * the value of XENCAMERA_OP_SET_CONFIG.num_bufs response: >>>> + * - index - uint8_t, index of the buffer. >>>> + * >>>> + * >>>> + *---------------------------------- Requests --------------------------------- >>>> + * >>>> + * All request packets have the same length (64 octets). >>>> + * All request packets have common header: >>>> + * 0 1 2 3 octet >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | id | operation | reserved | 4 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 8 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * id - uint16_t, private guest value, echoed in response. >>>> + * operation - uint8_t, operation code, XENCAMERA_OP_XXX. >>>> + * >>>> + * >>>> + * Request configuration set/reset - request to set or reset. >>>> + * the configuration/mode of the camera: >>>> + * 0 1 2 3 octet >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | id | _OP_SET_CONFIG | reserved | 4 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 8 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | pixel format | 12 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | width | 16 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | height | 20 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | frame_rate_numer | 24 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | frame_rate_denom | 28 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | num_bufs | reserved | 32 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 36 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 64 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * >>>> + * Pass all zeros to reset, otherwise command is treated as configuration set. >>>> + * >>>> + * pixel_format - uint32_t, pixel format to be used, FOURCC code. >>>> + * width - uint32_t, width in pixels. >>>> + * height - uint32_t, height in pixels. >>>> + * frame_rate_numer - uint32_t, numerator of the frame rate. >>>> + * frame_rate_denom - uint32_t, denominator of the frame rate. >>> If you have to support HDMI/SDTV inputs as well, then you also need to know >>> the interlaced format, unless you have no plans to support that. >>> >>>> + * num_bufs - uint8_t, desired number of buffers to be used. >>> Huh? What has that to do with the format? Why would you need this here? >> Well, the operation name is 'set_config', not 'set_format', >> so I thought we can have such a cumulative command assembling >> all the parameters of the configuration. But now I am looking at >> turning this single 'set_config' command to 3 different commands, >> which is more practical and aligned with V4L2 in particular (please >> see above in the command set): >> 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? > >>>> + * >>>> + * 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. 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 >>>> + * >>>> + * If XENCAMERA_FIELD_BE_ALLOC configuration entry is set, then backend will >>>> + * allocate the buffer with the parameters provided in this request and page >>>> + * directory is handled as follows: >>>> + * Frontend on request: >>>> + * - allocates pages for the directory (gref_directory, >>>> + * gref_dir_next_page(s) >>>> + * - grants permissions for the pages of the directory to the backend >>>> + * - sets gref_dir_next_page fields >>>> + * Backend on response: >>>> + * - grants permissions for the pages of the buffer allocated to >>>> + * the frontend >>>> + * - fills in page directory with grant references >>>> + * (gref[] in struct xencamera_page_directory) >>>> + */ >>>> +struct xencamera_buf_create_req { >>>> + uint8_t index; >>>> + uint8_t reserved[3]; >>>> + grant_ref_t gref_directory; >>>> +}; >>>> + >>>> +/* >>>> + * Shared page for XENCAMERA_OP_BUF_CREATE buffer descriptor (gref_directory in >>>> + * the request) employs a list of pages, describing all pages of the shared >>>> + * data buffer: >>>> + * 0 1 2 3 octet >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | gref_dir_next_page | 4 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | gref[0] | 8 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | gref[i] | i*4+8 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | gref[N - 1] | N*4+8 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * >>>> + * gref_dir_next_page - grant_ref_t, reference to the next page describing >>>> + * page directory. Must be 0 if there are no more pages in the list. >>>> + * gref[i] - grant_ref_t, reference to a shared page of the buffer >>>> + * allocated at XENCAMERA_OP_BUF_CREATE. >>>> + * >>>> + * Number of grant_ref_t entries in the whole page directory is not >>>> + * passed, but instead can be calculated as: >>>> + * num_grefs_total = (XENCAMERA_OP_GET_BUF_DETAILS.size + XEN_PAGE_SIZE - 1) / >>>> + * XEN_PAGE_SIZE >>>> + */ >>>> +struct xencamera_page_directory { >>>> + grant_ref_t gref_dir_next_page; >>>> + grant_ref_t gref[1]; /* Variable length */ >>>> +}; >>>> + >>>> +/* >>>> + * Request buffer destruction - destroy a previously allocated camera buffer: >>>> + * 0 1 2 3 octet >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | id | _OP_BUF_DESTROY| reserved | 4 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 8 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | index | reserved | 12 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 16 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 64 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * >>>> + * index - uint8_t, index of the buffer to be destroyed. >>>> + */ >>> There is no V4L2 ioctl to destroy specific buffers. You can only destroy all >>> of them. >> This is not specifically related to V4L2, but can be issued >> in response to backend's state change etc. >> So, we have a pair of commands to create and destroy buffers. >> Even more, frontend can be a some-os-based-driver, not V4L2 >> based. Or even a user-space application if your will. >>>> + >>>> +struct xencamera_buf_destroy_req { >>>> + uint8_t index; >>>> +}; >>>> + >>>> +/* >>>> + * Request camera capture stream start: >>>> + * 0 1 2 3 octet >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | id |_OP_STREAM_START| reserved | 4 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 8 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 64 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * >>>> + * >>>> + * Request camera capture stream stop: >>>> + * 0 1 2 3 octet >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | id |_OP_STREAM_STOP | reserved | 4 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 8 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 64 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * >>>> + * >>>> + * Request camera control details: >>>> + * 0 1 2 3 octet >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | id |GET_CTRL_DETAILS| reserved | 4 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | index | reserved | 12 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 16 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 64 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * >>>> + * See response format for this request. >>>> + * >>>> + * index - uint8_t, index of the control to be queried. >>>> + */ >>>> +struct xencamera_get_ctrl_details_req { >>>> + uint8_t index; >>>> +}; >>>> + >>>> +/* >>>> + * >>>> + * Request camera control change: >>>> + * 0 1 2 3 octet >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | id | _OP_SET_CTRL | reserved | 4 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | index | reserved | 12 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | value | 16 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 20 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 64 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * >>>> + * See response format for this request. >>>> + * >>>> + * index - uint8_t, index of the control. >>>> + * value - int32_t, new value of the control. >>> I would recommend using a int64_t as the control value. >> Good point, thank you >>> Note that there are also controls with a payload (e.g. string controls). >> Could you please give me an example of such a control? >> Do you think such controls can be of use in a VM? >> Can we avoid such controls if we target a simple virtual >> camera device? If this is for radio use-case, then we'll >> have such support in 'vradio' protocol if need be > Right now all string controls are related to RDS receivers/transmitters. If you > ever decide on a vradio protocol, then you need these (Programme Service name > and Radio Text info). And there is an array of Alternate Frequencies, also RDS > specific. > > There are some array controls in V4L2, those are used to control motion detection > for surveillance cameras. And 'compound controls' (think of this as C structs) are > appearing for HW codecs. > > I don't think any of these are likely to appear for cameras, at least not in a > way that is relevant for Xen. ok >>> If there is ever interest in adding radio/RDS support, then that will become >>> an issue. >> You mean something like station names, ads etc? > Yup. > >>>> + */ >>>> +struct xencamera_set_ctrl_req { >>>> + uint8_t index; >>>> + uint8_t reserved[3]; >>>> + int32_t value; >>>> +}; >>>> + >>>> +/* >>>> + *---------------------------------- Responses -------------------------------- >>>> + * >>>> + * All response packets have the same length (64 octets). >>>> + * >>>> + * All response packets have common header: >>>> + * 0 1 2 3 octet >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | id | operation | reserved | 4 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | status | 8 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * >>>> + * id - uint16_t, copied from the request. >>>> + * operation - uint8_t, XENCAMERA_OP_* - copied from request. >>>> + * status - int32_t, response status, zero on success and -XEN_EXX on failure. >>>> + * >>>> + * >>>> + * Set configuration response - response for XENCAMERA_OP_SET_CONFIG: >>>> + * 0 1 2 3 octet >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | id | _OP_SET_CONFIG | reserved | 4 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | status | 8 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | pixel format | 12 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | width | 16 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | height | 20 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | frame_rate_numer | 24 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | frame_rate_denom | 28 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | num_bufs | reserved | 32 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 36 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 64 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * >>>> + * Meaning of the corresponding values in this response is the same as for >>>> + * XENCAMERA_OP_SET_CONFIG request. >>>> + * >>>> + * >>>> + * Request buffer details response - response for XENCAMERA_OP_GET_BUF_DETAILS >>>> + * request: >>>> + * 0 1 2 3 octet >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | id |_GET_BUF_DETAILS| reserved | 4 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | status | 8 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | size | 12 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | num_planes | reserved | 16 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | plane_offset[0] | 20 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | plane_offset[1] | 24 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | plane_offset[2] | 28 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | plane_offset[3] | 32 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | plane_size[0] | 36 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | plane_size[1] | 40 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | plane_size[2] | 44 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | plane_size[3] | 48 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | plane_stride[0] | plane_stride[1] | 52 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | plane_stride[2] | plane_stride[3] | 56 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 60 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 64 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * >>>> + * size - uint32_t, overall size of the buffer including sizes of the >>>> + * individual planes and padding if applicable. >>>> + * num_planes - uint8_t, number of planes for this buffer. >>>> + * plane_offset - array of uint32_t, offset of the corresponding plane >>>> + * in octets from the buffer start. >>>> + * plane_size - array of uint32_t, size in octets of the corresponding plane >>>> + * including padding. >>>> + * plane_stride - array of uint32_t, size in octets occupied by the >>>> + * corresponding single image line including padding if applicable. >>> Nice! >> Thank you >>>> + */ >>>> +struct xencamera_buf_details_resp { >>>> + uint32_t size; >>>> + uint8_t num_planes; >>>> + uint8_t reserved[3]; >>>> + uint32_t plane_offset[XENCAMERA_MAX_PLANE]; >>>> + uint32_t plane_size[XENCAMERA_MAX_PLANE]; >>>> + uint16_t plane_stride[XENCAMERA_MAX_PLANE]; >>>> +}; >>>> + >>>> +/* >>>> + * Get control details response - response for XENCAMERA_OP_GET_CTRL_DETAILS: >>>> + * 0 1 2 3 octet >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | id |GET_CTRL_DETAILS| reserved | 4 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | status | 8 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | index | type | reserved | 12 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | min | 16 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | max | 20 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | step | 24 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | def_val | 28 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 36 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 64 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * >>>> + * index - uint8_t, index of the camera control in response. >>>> + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. >>>> + * min - int32_t, minimum value of the control. >>>> + * max - int32_t, maximum value of the control. >>>> + * step - int32_t, minimum size in which control value can be changed. >>>> + * def_val - int32_t, default value of the control. >>> I'd go with 64 bit values for min/max/step/def_val. >> Sure, good idea, thank you >>> I would also add a flags field. Some controls are read-only, write-only >>> or volatile, things userspace needs to know. >> Then I'll also add numerical constants for such >>> If you want to support menu controls, then you need a way to get the menu >>> names as well (VIDIOC_QUERYMENU). >>> >>> None of this is needed for this initial use-case, but you need to think >>> about this up-front. >> Yes, thank you >>>> + */ >>>> +struct xencamera_get_ctrl_details_resp { >>>> + uint8_t index; >>>> + uint8_t type; >>>> + uint8_t reserved[2]; >>>> + int32_t min; >>>> + int32_t max; >>>> + int32_t step; >>>> + int32_t def_val; >>>> +}; >>>> + >>>> +/* >>>> + *----------------------------------- Events ---------------------------------- >>>> + * >>>> + * Events are sent via a shared page allocated by the front and propagated by >>>> + * evt-event-channel/evt-ring-ref XenStore entries. >>>> + * >>>> + * All event packets have the same length (64 octets). >>>> + * All event packets have common header: >>>> + * 0 1 2 3 octet >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | id | type | reserved | 4 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 8 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * >>>> + * id - uint16_t, event id, may be used by front. >>>> + * type - uint8_t, type of the event. >>>> + * >>>> + * >>>> + * Frame captured event - event from back to front when a new captured >>>> + * frame is available: >>>> + * 0 1 2 3 octet >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | id |_EVT_FRAME_AVAIL| reserved | 4 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 8 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | index | reserved | 12 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | used_sz | 16 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 20 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * | reserved | 64 >>>> + * +----------------+----------------+----------------+----------------+ >>>> + * >>>> + * index - uint8_t, index of the buffer that contains new captured frame. >>>> + * used_sz - uint32_t, number of octets this frame has. This can be less >>>> + * than the XENCAMERA_OP_GET_BUF_DETAILS.size for compressed formats. >>>> + */ >>>> +struct xencamera_frame_avail_evt { >>>> + uint8_t index; >>>> + uint8_t reserved[3]; >>>> + uint32_t used_sz; >>>> +}; >>>> + >>>> +struct xencamera_req { >>>> + uint16_t id; >>>> + uint8_t operation; >>>> + uint8_t reserved[5]; >>>> + union { >>>> + struct xencamera_config config; >>>> + struct xencamera_buf_create_req buf_create; >>>> + struct xencamera_buf_destroy_req buf_destroy; >>>> + struct xencamera_set_ctrl_req set_ctrl; >>>> + uint8_t reserved[56]; >>>> + } req; >>>> +}; >>>> + >>>> +struct xencamera_resp { >>>> + uint16_t id; >>>> + uint8_t operation; >>>> + uint8_t reserved; >>>> + int32_t status; >>>> + union { >>>> + struct xencamera_config config; >>>> + struct xencamera_buf_details_resp buf_details; >>>> + struct xencamera_get_ctrl_details_resp ctrl_details; >>>> + uint8_t reserved1[56]; >>>> + } resp; >>>> +}; >>>> + >>>> +struct xencamera_evt { >>>> + uint16_t id; >>>> + uint8_t type; >>>> + uint8_t reserved[5]; >>>> + union { >>>> + struct xencamera_frame_avail_evt frame_avail; >>>> + uint8_t reserved[56]; >>>> + } evt; >>>> +}; >>>> + >>>> +DEFINE_RING_TYPES(xen_cameraif, struct xencamera_req, struct xencamera_resp); >>>> + >>>> +/* >>>> + ****************************************************************************** >>>> + * Back to front events delivery >>>> + ****************************************************************************** >>>> + * In order to deliver asynchronous events from back to front a shared page is >>>> + * allocated by front and its granted reference propagated to back via >>>> + * XenStore entries (evt-ring-ref/evt-event-channel). >>>> + * This page has a common header used by both front and back to synchronize >>>> + * access and control event's ring buffer, while back being a producer of the >>>> + * events and front being a consumer. The rest of the page after the header >>>> + * is used for event packets. >>>> + * >>>> + * Upon reception of an event(s) front may confirm its reception >>>> + * for either each event, group of events or none. >>>> + */ >>>> + >>>> +struct xencamera_event_page { >>>> + uint32_t in_cons; >>>> + uint32_t in_prod; >>>> + uint8_t reserved[56]; >>>> +}; >>>> + >>>> +#define XENCAMERA_EVENT_PAGE_SIZE 4096 >>>> +#define XENCAMERA_IN_RING_OFFS (sizeof(struct xencamera_event_page)) >>>> +#define XENCAMERA_IN_RING_SIZE (XENCAMERA_EVENT_PAGE_SIZE - XENCAMERA_IN_RING_OFFS) >>>> +#define XENCAMERA_IN_RING_LEN (XENCAMERA_IN_RING_SIZE / sizeof(struct xencamera_evt)) >>>> +#define XENCAMERA_IN_RING(page) \ >>>> + ((struct xencamera_evt *)((char *)(page) + XENCAMERA_IN_RING_OFFS)) >>>> +#define XENCAMERA_IN_RING_REF(page, idx) \ >>>> + (XENCAMERA_IN_RING((page))[(idx) % XENCAMERA_IN_RING_LEN]) >>>> + >>>> +#endif /* __XEN_PUBLIC_IO_CAMERAIF_H__ */ >>>> + >>>> +/* >>>> + * Local variables: >>>> + * mode: C >>>> + * c-file-style: "BSD" >>>> + * c-basic-offset: 4 >>>> + * tab-width: 4 >>>> + * indent-tabs-mode: nil >>>> + * End: >>>> + */ >>>> >>> I think the most important decision to make here is whether or not you want to support >>> hotpluggable sources like HDMI. And an additional complication with that is HDCP. >>> While V4L2 doesn't have an API for HDCP at the moment, Cisco is working on this and >>> a patch series adding this is expected later this year/early next year. It might not >>> be an issue in practice if these are all closed systems, but nevertheless, it is >>> something to think about. >> Yes, thank you for raising these questions, it is worth thinking >> about such use-cases. >>> Regards, >>> >>> Hans >> Thank you so much for the comments, >> Oleksandr >> > Regards, > > Hans Thank you, Oleksandr From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: Re: [PATCH 1/1] cameraif: add ABI for para-virtual camera Date: Mon, 10 Sep 2018 11:24:40 +0300 Message-ID: <51f97715-454a-0242-b381-29944d77d5b5@gmail.com> 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> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1fzHV2-0000F8-QS for xen-devel@lists.xenproject.org; Mon, 10 Sep 2018 08:24:49 +0000 Received: by mail-lj1-x22c.google.com with SMTP id p10-v6so17134674ljg.2 for ; Mon, 10 Sep 2018 01:24:44 -0700 (PDT) In-Reply-To: <7134b3ad-9fcf-0139-41b3-67a3dbc8224d@xs4all.nl> Content-Language: en-US List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: Hans Verkuil , 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 T24gMDkvMTAvMjAxOCAxMDo1MyBBTSwgSGFucyBWZXJrdWlsIHdyb3RlOgo+IEhpIE9sZWtzYW5k ciwKPgo+IE9uIDA5LzEwLzIwMTggMDk6MTYgQU0sIE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIHdy b3RlOgo+PiBIaSwgSGFucyEKPj4KPj4gT24gMDkvMDkvMjAxOCAwMTozMSBQTSwgSGFucyBWZXJr dWlsIHdyb3RlOgo+Pj4gSGkgT2xla3NhbmRyLAo+Pj4KPj4+IFNvcnJ5IGZvciB0aGUgZGVsYXkg aW4gcmV2aWV3aW5nLCBJIG1pc3NlZCB0aGlzIHBhdGNoIHVudGlsIHlvdSBwaW5nZWQgbWUsIGFu ZAo+Pj4gSSB3YXMgdmVyeSBidXN5IGFmdGVyIHRoYXQgYXMgd2VsbC4KPj4gSSBkbyBhcHByZWNp YXRlIHlvdSBzcGVuZGluZyB0aW1lIG9uIHRoaXMhCj4+PiBPbiAwNy8zMS8yMDE4IDExOjMxIEFN LCBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbyB3cm90ZToKPj4+PiBGcm9tOiBPbGVrc2FuZHIgQW5k cnVzaGNoZW5rbyA8b2xla3NhbmRyX2FuZHJ1c2hjaGVua29AZXBhbS5jb20+Cj4+Pj4KPj4+PiBU aGlzIGlzIHRoZSBBQkkgZm9yIHRoZSB0d28gaGFsdmVzIG9mIGEgcGFyYS12aXJ0dWFsaXplZAo+ Pj4+IGNhbWVyYSBkcml2ZXIgd2hpY2ggZXh0ZW5kcyBYZW4ncyByZWFjaCBtdWx0aW1lZGlhIGNh cGFiaWxpdGllcyBldmVuCj4+Pj4gZmFydGhlciBlbmFibGluZyBpdCBmb3IgdmlkZW8gY29uZmVy ZW5jaW5nLCBJbi1WZWhpY2xlIEluZm90YWlubWVudCwKPj4+PiBoaWdoIGRlZmluaXRpb24gbWFw cyBldGMuCj4+Pj4KPj4+PiBUaGUgaW5pdGlhbCBnb2FsIGlzIHRvIHN1cHBvcnQgbW9zdCBuZWVk ZWQgZnVuY3Rpb25hbGl0eSB3aXRoIHRoZQo+Pj4+IGZpbmFsIGlkZWEgdG8gbWFrZSBpdCBwb3Nz aWJsZSB0byBleHRlbmQgdGhlIHByb3RvY29sIGlmIG5lZWQgYmU6Cj4+Pj4KPj4+PiAxLiBQcm92 aWRlIG1lYW5zIGZvciBiYXNlIHZpcnR1YWwgZGV2aWNlIGNvbmZpZ3VyYXRpb246Cj4+Pj4gICAg LSBwaXhlbCBmb3JtYXRzCj4+Pj4gICAgLSByZXNvbHV0aW9ucwo+Pj4+ICAgIC0gZnJhbWUgcmF0 ZXMKPj4+PiAyLiBTdXBwb3J0IGJhc2ljIGNhbWVyYSBjb250cm9sczoKPj4+PiAgICAtIGNvbnRy YXN0Cj4+Pj4gICAgLSBicmlnaHRuZXNzCj4+Pj4gICAgLSBodWUKPj4+PiAgICAtIHNhdHVyYXRp b24KPj4+PiAzLiBTdXBwb3J0IHN0cmVhbWluZyBjb250cm9sCj4+Pj4gNC4gU3VwcG9ydCB6ZXJv LWNvcHlpbmcgdXNlLWNhc2VzCj4+Pj4KPj4+PiBTaWduZWQtb2ZmLWJ5OiBPbGVrc2FuZHIgQW5k cnVzaGNoZW5rbyA8b2xla3NhbmRyX2FuZHJ1c2hjaGVua29AZXBhbS5jb20+Cj4+Pj4gLS0tCj4+ Pj4gICAgeGVuL2luY2x1ZGUvcHVibGljL2lvL2NhbWVyYWlmLmggfCA5ODEgKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKwo+Pj4+ICAgIDEgZmlsZSBjaGFuZ2VkLCA5ODEgaW5zZXJ0aW9u cygrKQo+Pj4+ICAgIGNyZWF0ZSBtb2RlIDEwMDY0NCB4ZW4vaW5jbHVkZS9wdWJsaWMvaW8vY2Ft ZXJhaWYuaAo+Pj4+Cj4+Pj4gZGlmZiAtLWdpdCBhL3hlbi9pbmNsdWRlL3B1YmxpYy9pby9jYW1l cmFpZi5oIGIveGVuL2luY2x1ZGUvcHVibGljL2lvL2NhbWVyYWlmLmgKPj4+PiBuZXcgZmlsZSBt b2RlIDEwMDY0NAo+Pj4+IGluZGV4IDAwMDAwMDAwMDAwMC4uYmRjNmExMjYyZmNmCj4+Pj4gLS0t IC9kZXYvbnVsbAo+Pj4+ICsrKyBiL3hlbi9pbmNsdWRlL3B1YmxpYy9pby9jYW1lcmFpZi5oCj4+ Pj4gQEAgLTAsMCArMSw5ODEgQEAKPj4+PiArLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgo+Pj4+ICsg KiBjYW1lcmFpZi5oCj4+Pj4gKyAqCj4+Pj4gKyAqIFVuaWZpZWQgY2FtZXJhIGRldmljZSBJL08g aW50ZXJmYWNlIGZvciBYZW4gZ3Vlc3QgT1Nlcy4KPj4+PiArICoKPj4+PiArICogUGVybWlzc2lv biBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWlu aW5nIGEgY29weQo+Pj4+ICsgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3Vt ZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KPj4+PiArICogZGVhbCBpbiB0aGUg U29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlv biB0aGUKPj4+PiArICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlz aCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCj4+Pj4gKyAqIHNlbGwgY29waWVzIG9m IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJl IGlzCj4+Pj4gKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5n IGNvbmRpdGlvbnM6Cj4+Pj4gKyAqCj4+Pj4gKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNl IGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4+Pj4gKyAq IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+Pj4+ ICsgKgo+Pj4+ICsgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBX QVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+Pj4+ICsgKiBJTVBMSUVELCBJTkNMVURJ TkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwK Pj4+PiArICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdF TUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4+Pj4gKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hU IEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPj4+PiAr ICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBP VEhFUldJU0UsIEFSSVNJTkcKPj4+PiArICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04g V0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgo+Pj4+ICsgKiBERUFMSU5HUyBJ TiBUSEUgU09GVFdBUkUuCj4+Pj4gKyAqCj4+Pj4gKyAqIENvcHlyaWdodCAoQykgMjAxOCBFUEFN IFN5c3RlbXMgSW5jLgo+Pj4+ICsgKgo+Pj4+ICsgKiBBdXRob3I6IE9sZWtzYW5kciBBbmRydXNo Y2hlbmtvIDxvbGVrc2FuZHJfYW5kcnVzaGNoZW5rb0BlcGFtLmNvbT4KPj4+PiArICovCj4+PiBV c2UgU1BEWCB0YWcgaW5zdGVhZCBvZiBjb3B5aW5nIHRoZSBsaWNlbnNlIHRleHQuCj4+IFRoaXMg aXMgeWV0IGEgWGVuIGhlYWRlciB3aGljaCBiZWxvbmdzIHRvIFhlbiBwcm9qZWN0IGFuZAo+PiBh bGwgdGhlIHJlc3Qgb2YgdGhlIHByb3RvY29scyBoYXZlIHRoZSBzYW1lIGxpY2Vuc2UgaGVhZGVy Lgo+PiBJZiBYZW4gY29tbXVuaXR5IGRlY2lkZXMgdG8gdXNlIFNQRFggdGhlbiBJJ2xsIGRlZmlu aXRlbHkgZm9sbG93Lgo+IEFoLCB5ZXMsIEkgd2FzIHJldmlld2luZyB0aGlzIGFzIGEga2VybmVs IGhlYWRlciwgSSBoYWRuJ3QgcmVhbGl6ZWQKPiB0aGF0IHRoaXMgaXNuJ3QgYSBrZXJuZWwgaGVh ZGVyLiBTaW5jZSBpdCBpc24ndCBhIGtlcm5lbCBoZWFkZXIsIHlvdQo+IGNhbiBkaXNyZWdhcmQg bXkgY29tbWVudHMgYWJvdXQgc3R5bGUgYW5kIG5hbWluZyBjb252ZW50aW9ucywgc2luY2UKPiB5 b3UgaGF2ZSB5b3VyIG93bi4KPgo+PiBLb25yYWQsIGRvIHlvdSB0aGluayB0aGlzIGlzIHRoZSBy aWdodCB0aW1lIGZvciBzdWNoIGEgbW92ZT8KPj4+PiArCj4+Pj4gKyNpZm5kZWYgX19YRU5fUFVC TElDX0lPX0NBTUVSQUlGX0hfXwo+Pj4+ICsjZGVmaW5lIF9fWEVOX1BVQkxJQ19JT19DQU1FUkFJ Rl9IX18KPj4+PiArCj4+Pj4gKyNpbmNsdWRlICJyaW5nLmgiCj4+Pj4gKyNpbmNsdWRlICIuLi9n cmFudF90YWJsZS5oIgo+Pj4+ICsKPj4+PiArLyoKPj4+PiArICoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Kgo+Pj4+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sIHZlcnNpb24KPj4+ PiArICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKgo+Pj4+ICsgKi8KPj4+PiArI2RlZmluZSBYRU5DQU1F UkFfUFJPVE9DT0xfVkVSU0lPTiAgICAgIjEiCj4+Pj4gKwo+Pj4+ICsvKgo+Pj4+ICsgKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqCj4+Pj4gKyAqICAgICAgICAgICAgICAgICAgRmVhdHVyZSBhbmQgUGFy YW1ldGVyIE5lZ290aWF0aW9uCj4+Pj4gKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKPj4+PiArICoK Pj4+PiArICogRnJvbnQtPmJhY2sgbm90aWZpY2F0aW9uczogd2hlbiBlbnF1ZXVpbmcgYSBuZXcg cmVxdWVzdCwgc2VuZGluZyBhCj4+Pj4gKyAqIG5vdGlmaWNhdGlvbiBjYW4gYmUgbWFkZSBjb25k aXRpb25hbCBvbiB4ZW5jYW1lcmFfcmVxIChpLmUuLCB0aGUgZ2VuZXJpYwo+Pj4+ICsgKiBob2xk LW9mZiBtZWNoYW5pc20gcHJvdmlkZWQgYnkgdGhlIHJpbmcgbWFjcm9zKS4gQmFja2VuZHMgbXVz dCBzZXQKPj4+PiArICogeGVuY2FtZXJhX3JlcSBhcHByb3ByaWF0ZWx5IChlLmcuLCB1c2luZyBS SU5HX0ZJTkFMX0NIRUNLX0ZPUl9SRVFVRVNUUygpKS4KPj4+PiArICoKPj4+PiArICogQmFjay0+ ZnJvbnQgbm90aWZpY2F0aW9uczogd2hlbiBlbnF1ZXVpbmcgYSBuZXcgcmVzcG9uc2UsIHNlbmRp bmcgYQo+Pj4+ICsgKiBub3RpZmljYXRpb24gY2FuIGJlIG1hZGUgY29uZGl0aW9uYWwgb24geGVu Y2FtZXJhX3Jlc3AgKGkuZS4sIHRoZSBnZW5lcmljCj4+Pj4gKyAqIGhvbGQtb2ZmIG1lY2hhbmlz bSBwcm92aWRlZCBieSB0aGUgcmluZyBtYWNyb3MpLiBGcm9udGVuZHMgbXVzdCBzZXQKPj4+PiAr ICogeGVuY2FtZXJhX3Jlc3AgYXBwcm9wcmlhdGVseSAoZS5nLiwgdXNpbmcgUklOR19GSU5BTF9D SEVDS19GT1JfUkVTUE9OU0VTKCkpLgo+Pj4+ICsgKgo+Pj4+ICsgKiBUaGUgdHdvIGhhbHZlcyBv ZiBhIHBhcmEtdmlydHVhbCBjYW1lcmEgZHJpdmVyIHV0aWxpemUgbm9kZXMgd2l0aGluCj4+Pj4g KyAqIFhlblN0b3JlIHRvIGNvbW11bmljYXRlIGNhcGFiaWxpdGllcyBhbmQgdG8gbmVnb3RpYXRl IG9wZXJhdGluZyBwYXJhbWV0ZXJzLgo+Pj4+ICsgKiBUaGlzIHNlY3Rpb24gZW51bWVyYXRlcyB0 aGVzZSBub2RlcyB3aGljaCByZXNpZGUgaW4gdGhlIHJlc3BlY3RpdmUgZnJvbnQgYW5kCj4+Pj4g KyAqIGJhY2tlbmQgcG9ydGlvbnMgb2YgWGVuU3RvcmUsIGZvbGxvd2luZyB0aGUgWGVuQnVzIGNv bnZlbnRpb24uCj4+Pj4gKyAqCj4+Pj4gKyAqIEFsbCBkYXRhIGluIFhlblN0b3JlIGlzIHN0b3Jl ZCBhcyBzdHJpbmdzLiBOb2RlcyBzcGVjaWZ5aW5nIG51bWVyaWMKPj4+PiArICogdmFsdWVzIGFy ZSBlbmNvZGVkIGluIGRlY2ltYWwuIEludGVnZXIgdmFsdWUgcmFuZ2VzIGxpc3RlZCBiZWxvdyBh cmUKPj4+PiArICogZXhwcmVzc2VkIGFzIGZpeGVkIHNpemVkIGludGVnZXIgdHlwZXMgY2FwYWJs ZSBvZiBzdG9yaW5nIHRoZSBjb252ZXJzaW9uCj4+Pj4gKyAqIG9mIGEgcHJvcGVybHkgZm9ybWF0 dGVkIG5vZGUgc3RyaW5nLCB3aXRob3V0IGxvc3Mgb2YgaW5mb3JtYXRpb24uCj4+Pj4gKyAqCj4+ Pj4gKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioKPj4+PiArICogICAgICAgICAgICAgICAgICAgICAg ICBFeGFtcGxlIGNvbmZpZ3VyYXRpb24KPj4+PiArICoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgo+Pj4+ ICsgKgo+Pj4+ICsgKiBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYmFja2VuZCBhbmQgZnJvbnRlbmQg Y29uZmlndXJhdGlvbjoKPj4+PiArICoKPj4+PiArICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0gQmFja2VuZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+Pj4+ ICsgKgo+Pj4+ICsgKiAvbG9jYWwvZG9tYWluLzAvYmFja2VuZC92Y2FtZXJhLzEvMC9mcm9udGVu ZC1pZCA9ICIxIgo+Pj4+ICsgKiAvbG9jYWwvZG9tYWluLzAvYmFja2VuZC92Y2FtZXJhLzEvMC9m cm9udGVuZCA9ICIvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMCIKPj4+PiArICogL2xv Y2FsL2RvbWFpbi8wL2JhY2tlbmQvdmNhbWVyYS8xLzAvc3RhdGUgPSAiNCIKPj4+PiArICogL2xv Y2FsL2RvbWFpbi8wL2JhY2tlbmQvdmNhbWVyYS8xLzAvdmVyc2lvbnMgPSAiMSwyIgo+Pj4gV2h5 IHZjYW1lcmEgaW5zdGVhZCBvZiBqdXN0IGNhbWVyYT8gSWYgJ3YnIHN0YW5kcyBmb3IgJ3ZpZGVv JywgdGhlbiB0aGF0IHNlZW1zCj4+PiBzdXBlcmZsdW91cyB0byBtZS4KPj4gJ3YnIHN0YW5kcyBm b3IgJ3ZpcnR1YWwnLiBJIGFtIGZvbGxvd2luZyBYZW4gY29udmVudGlvbiB1c2VkCj4+IGZvciBh bGwgb3RoZXIgdmlydHVhbCBkZXZpY2UgcHJvdG9jb2xzIGhlcmUuCj4+Pj4gKyAqCj4+Pj4gKyAq LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZyb250ZW5kIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KPj4+PiArICoKPj4+PiArICogL2xvY2FsL2RvbWFpbi8xL2Rl dmljZS92Y2FtZXJhLzAvYmFja2VuZC1pZCA9ICIwIgo+Pj4+ICsgKiAvbG9jYWwvZG9tYWluLzEv ZGV2aWNlL3ZjYW1lcmEvMC9iYWNrZW5kID0gIi9sb2NhbC9kb21haW4vMC9iYWNrZW5kL3ZjYW1l cmEvMSIKPj4+PiArICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvc3RhdGUgPSAi NCIKPj4+PiArICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvdmVyc2lvbiA9ICIx Igo+Pj4+ICsgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC9iZS1hbGxvYyA9ICIx Igo+Pj4+ICsgKgo+Pj4+ICsgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRGV2aWNlIDAg Y29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4+Pj4gKyAqCj4+Pj4gKyAq IC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8wL2NvbnRyb2xzID0gImNvbnRyYXN0LGh1 ZSIKPj4+PiArICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvZm9ybWF0cy9ZVVlW LzY0MHg0ODAgPSAiMzAvMSwxNS8xLDE1LzIiCj4+Pj4gKyAqIC9sb2NhbC9kb21haW4vMS9kZXZp Y2UvdmNhbWVyYS8wL2Zvcm1hdHMvWVVZVi8xOTIweDEwODAgPSAiMTUvMiIKPj4+PiArICogL2xv Y2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvZm9ybWF0cy9CR1JBLzY0MHg0ODAgPSAiMTUv MSwxNS8yIgo+Pj4+ICsgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC9mb3JtYXRz L0JHUkEvMTIwMHg3MjAgPSAiMTUvMiIKPj4+PiArICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92 Y2FtZXJhLzAvdW5pcXVlLWlkID0gIjAiCj4+Pj4gKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2Uv dmNhbWVyYS8wL3JlcS1yaW5nLXJlZiA9ICIyODMyIgo+Pj4+ICsgKiAvbG9jYWwvZG9tYWluLzEv ZGV2aWNlL3ZjYW1lcmEvMC9yZXEtZXZlbnQtY2hhbm5lbCA9ICIxNSIKPj4+PiArICogL2xvY2Fs L2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvZXZ0LXJpbmctcmVmID0gIjM4NyIKPj4+PiArICog L2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvZXZ0LWV2ZW50LWNoYW5uZWwgPSAiMTYi Cj4+Pj4gKyAqCj4+Pj4gKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEZXZpY2UgMSBj b25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPj4+PiArICoKPj4+PiArICog L2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzEvY29udHJvbHMgPSAiYnJpZ2h0bmVzcyxz YXR1cmF0aW9uLGh1ZSIKPj4+PiArICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzEv Zm9ybWF0cy9ZVVlWLzY0MHg0ODAgPSAiMzAvMSwxNS8xLDE1LzIiCj4+Pj4gKyAqIC9sb2NhbC9k b21haW4vMS9kZXZpY2UvdmNhbWVyYS8xL2Zvcm1hdHMvWVVZVi8xOTIweDEwODAgPSAiMTUvMiIK Pj4+PiArICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzEvdW5pcXVlLWlkID0gIjEi Cj4+Pj4gKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8xL3JlcS1yaW5nLXJlZiA9 ICIyODMzIgo+Pj4+ICsgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMS9yZXEtZXZl bnQtY2hhbm5lbCA9ICIxNyIKPj4+PiArICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJh LzEvZXZ0LXJpbmctcmVmID0gIjM4OCIKPj4+PiArICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92 Y2FtZXJhLzEvZXZ0LWV2ZW50LWNoYW5uZWwgPSAiMTgiCj4+Pj4gKyAqCj4+Pj4gKyAqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioKPj4+PiArICogICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFja2Vu ZCBYZW5CdXMgTm9kZXMKPj4+PiArICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgo+Pj4+ICsgKgo+Pj4+ ICsgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RvY29sIHZlcnNpb24gLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4+Pj4gKyAqCj4+Pj4gKyAqIHZlcnNpb25zCj4+Pj4g KyAqICAgICAgVmFsdWVzOiAgICAgICAgIDxzdHJpbmc+Cj4+Pj4gKyAqCj4+Pj4gKyAqICAgICAg TGlzdCBvZiBYRU5DQU1FUkFfTElTVF9TRVBBUkFUT1Igc2VwYXJhdGVkIHByb3RvY29sIHZlcnNp b25zIHN1cHBvcnRlZAo+Pj4+ICsgKiAgICAgIGJ5IHRoZSBiYWNrZW5kLiBGb3IgZXhhbXBsZSAi MSwyLDMiLgo+Pj4+ICsgKgo+Pj4+ICsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCj4+Pj4gKyAqICAg ICAgICAgICAgICAgICAgICAgICAgICAgIEZyb250ZW5kIFhlbkJ1cyBOb2Rlcwo+Pj4+ICsgKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqCj4+Pj4gKyAqCj4+Pj4gKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0gQWRkcmVzc2luZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K Pj4+PiArICoKPj4+PiArICogZG9tLWlkCj4+Pj4gKyAqICAgICAgVmFsdWVzOiAgICAgICAgIDx1 aW50MTZfdD4KPj4+PiArICoKPj4+PiArICogICAgICBEb21haW4gaWRlbnRpZmllci4KPj4+PiAr ICoKPj4+PiArICogZGV2LWlkCj4+Pj4gKyAqICAgICAgVmFsdWVzOiAgICAgICAgIDx1aW50MTZf dD4KPj4+PiArICoKPj4+PiArICogICAgICBEZXZpY2UgaWRlbnRpZmllci4KPj4+PiArICoKPj4+ PiArICogICAgICAvbG9jYWwvZG9tYWluLzxkb20taWQ+L2RldmljZS92Y2FtZXJhLzxkZXYtaWQ+ Ly4uLgo+Pj4+ICsgKgo+Pj4+ICsgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3Rv Y29sIHZlcnNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4+Pj4gKyAqCj4+Pj4g KyAqIHZlcnNpb24KPj4+PiArICogICAgICBWYWx1ZXM6ICAgICAgICAgPHN0cmluZz4KPj4+PiAr ICoKPj4+PiArICogICAgICBQcm90b2NvbCB2ZXJzaW9uLCBjaG9zZW4gYW1vbmcgdGhlIG9uZXMg c3VwcG9ydGVkIGJ5IHRoZSBiYWNrZW5kLgo+Pj4+ICsgKgo+Pj4+ICsgKi0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0gQmFja2VuZCBidWZmZXIgYWxsb2NhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCj4+Pj4gKyAqCj4+Pj4gKyAqIGJlLWFsbG9jCj4+PiBJIHRob3VnaHQgdGhhdCAnYmUn IHJlZmVycmVkIHRvICdiaWctZW5kaWFuJywgYnV0IGFwcGFyZW50bHkgbm90LiBQZXJoYXBzIGl0 Cj4+PiBpcyBiZXR0ZXIgdG8ganVzdCB3cml0ZSAnYmFja2VuZC1hbGxvYycuCj4+IFdlbGwsICdi ZScgYW5kICdmZScgYXJlIGNvbW1vbmx5IHVzZWQgaW4gWGVuIGZvciBiYWNrZW5kCj4+IGFuZCBm cm9udGVuZCwgc28gSSdsbCBwcm9iYWJseSBzdGljayB0byB0aGF0IGNvbnZlbnRpb24gZm9yIG5v dy4KPj4+PiArICogICAgICBWYWx1ZXM6ICAgICAgICAgIjAiLCAiMSIKPj4+PiArICoKPj4+PiAr ICogICAgICBJZiB2YWx1ZSBpcyBzZXQgdG8gIjEiLCB0aGVuIGJhY2tlbmQgd2lsbCBiZSB0aGUg YnVmZmVyCj4+Pj4gKyAqICAgICAgcHJvdmlkZXIvYWxsb2NhdG9yIGZvciB0aGlzIGRvbWFpbiBk dXJpbmcgWEVOQ0FNRVJBX09QX0JVRl9DUkVBVEUKPj4+PiArICogICAgICBvcGVyYXRpb24uCj4+ Pj4gKyAqICAgICAgSWYgdmFsdWUgaXMgbm90ICIxIiBvciBvbWl0dGVkIGZyb250ZW5kIG11c3Qg YWxsb2NhdGUgYnVmZmVycyBpdHNlbGYuCj4+Pj4gKyAqCj4+Pj4gKyAqLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLSBDYW1lcmEgc2V0dGluZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KPj4+PiArICoKPj4+PiArICogdW5pcXVlLWlkCj4+Pj4gKyAqICAgICAgVmFsdWVzOiAg ICAgICAgIDxzdHJpbmc+Cj4+Pj4gKyAqCj4+Pj4gKyAqICAgICAgQWZ0ZXIgZGV2aWNlIGluc3Rh bmNlIGluaXRpYWxpemF0aW9uIGVhY2ggY2FtZXJhIGlzIGFzc2lnbmVkIGEKPj4+PiArICogICAg ICB1bmlxdWUgSUQsIHNvIGl0IGNhbiBiZSBpZGVudGlmaWVkIGJ5IHRoZSBiYWNrZW5kIGJ5IHRo aXMgSUQuCj4+Pj4gKyAqICAgICAgVGhpcyBjYW4gYmUgVVVJRCBvciBzdWNoLgo+Pj4+ICsgKgo+ Pj4+ICsgKiBjb250cm9scwo+Pj4+ICsgKiAgICAgIFZhbHVlczogICAgICAgICA8bGlzdCBvZiBz dHJpbmc+Cj4+Pj4gKyAqCj4+Pj4gKyAqICAgICAgTGlzdCBvZiBzdXBwb3J0ZWQgY2FtZXJhIGNv bnRyb2xzIHNlcGFyYXRlZCBieSBYRU5DQU1FUkFfTElTVF9TRVBBUkFUT1IuCj4+Pj4gKyAqICAg ICAgQ2FtZXJhIGNvbnRyb2xzIGFyZSBleHByZXNzZWQgYXMgYSBsaXN0IG9mIHN0cmluZyB2YWx1 ZXMgdy9vIGFueQo+Pj4+ICsgKiAgICAgIG9yZGVyaW5nIHJlcXVpcmVtZW50Lgo+Pj4+ICsgKgo+ Pj4+ICsgKiBmb3JtYXRzCj4+Pj4gKyAqICAgICAgVmFsdWVzOiAgICAgICAgIDxmb3JtYXQsIGNo YXJbNF0+Cj4+Pj4gKyAqCj4+Pj4gKyAqICAgICAgRm9ybWF0cyBhcmUgb3JnYW5pemVkIGFzIGEg c2V0IG9mIGRpcmVjdG9yaWVzIG9uZSBwZXIgZWFjaAo+Pj4+ICsgKiAgICAgIHN1cHBvcnRlZCBw aXhlbCBmb3JtYXQuIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgaXMgYW4gdXBwZXIgY2FzZQo+ Pj4+ICsgKiAgICAgIHN0cmluZyBvZiB0aGUgY29ycmVzcG9uZGluZyBGT1VSQ0Mgc3RyaW5nIGxh YmVsLiBUaGUgbmV4dCBsZXZlbCBvZgo+Pj4+ICsgKiAgICAgIHRoZSBkaXJlY3RvcnkgdW5kZXIg PGZvcm1hdHM+IHJlcHJlc2VudHMgc3VwcG9ydGVkIHJlc29sdXRpb25zLgo+Pj4gTG93ZXItY2Fz ZSBjaGFyYWN0ZXJzIGFyZSBhbHNvIHVzZSBpbiBwaXhlbGZvcm1hdHMsIHNvIEknZCBqdXN0IGtl ZXAgdGhpcyBhcy1pcy4KPj4gT2ssIG5vIHByb2JsZW0gLSB3aWxsIHJlbW92ZSB0aGUgJ3VwcGVy IGNhc2UnIGZyb20gdGhlIGRlZmluaXRpb24KPj4+IEluIGFkZGl0aW9uIGl0IGlzIGNvbW1vbiB0 byBzZXQgYml0IDMxIG9mIHRoZSBmb3VyY2MgdG8gMSBpZiB0aGUgZm9ybWF0IGlzCj4+PiBiaWct ZW5kaWFuIChzZWUgdjRsMl9mb3VyY2NfYmUgbWFjcm8pLiBXaGVuIHY0bCB1dGlsaXRpZXMgcHJp bnQgdGhpcyBmb3JtYXQgd2UKPj4+IGFkZCBhIC1CRSBzdWZmaXgsIHNvIFY0TDJfUElYX0ZNVF9B UkdCNTU1WCBiZWNvbWVzICJBUjE1LUJFIi4gWW91IG1pZ2h0IHdhbnQgdG8KPj4+IGtlZXAgdGhh dCBjb252ZW50aW9uLgo+PiBJJ2xsIHRoaW5rIGFib3V0IGl0LCB0aGFuayB5b3UKPj4+PiArICoK Pj4+PiArICogcmVzb2x1dGlvbgo+Pj4+ICsgKiAgICAgIFZhbHVlczogICAgICAgICA8d2lkdGgs IHVpbnQzMl90Png8aGVpZ2h0LCB1aW50MzJfdD4KPj4+PiArICoKPj4+PiArICogICAgICBSZXNv bHV0aW9ucyBhcmUgb3JnYW5pemVkIGFzIGEgc2V0IG9mIGRpcmVjdG9yaWVzIG9uZSBwZXIgZWFj aAo+Pj4+ICsgKiAgICAgIHN1cHBvcnRlZCByZXNvbHV0aW9uIHVuZGVyIGNvcnJlc3BvbmRpbmcg PGZvcm1hdHM+IGRpcmVjdG9yeS4KPj4+PiArICogICAgICBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0 b3J5IGlzIHRoZSBzdXBwb3J0ZWQgd2lkdGggYW5kIGhlaWdodAo+Pj4+ICsgKiAgICAgIG9mIHRo ZSBjYW1lcmEgcmVzb2x1dGlvbiBpbiBwaXhlbHMuCj4+PiBXaGF0IGlmIHlvdSBhcmUgZGVhbGlu ZyB3aXRoIGFuIEhETUkgaW5wdXQ/IE5vdCB1bnJlYXNvbmFibGUgZm9yIG1lZGlhCj4+PiBzeXN0 ZW1zLiBUaGVyZSBjYW4gYmUgYSBsb3Qgb2YgcmVzb2x1dGlvbnMvZnJhbWVyYXRlcywgYW5kIHRo ZSByZXNvbHV0aW9uCj4+PiBjYW4gY2hhbmdlIG9uIHRoZSBmbHksIG9yIG9mIGNvdXJzZSBkaXNh cHBlYXIuCj4+IFdlbGwsIHRoaXMgaXMgYSBwYXJ0IG9mIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlv biBkb25lCj4+IGJlZm9yZSB3ZSBhY3R1YWxseSBydW4gdGhlIFZNcywgZS5nLiBhdCBzeXN0ZW0g ZGVzaWduCj4+IGFuZCBjb25maWd1cmF0aW9uIHRpbWUuIE1vc3Qgb2YgdGhlIHRpbWUgeW91IGRv IGtub3cgd2hpY2gKPj4gcmVzb2x1dGlvbnMsIGZyYW1lIHJhdGVzIGV0Yy4geW91IHdhbnQgdG8g YXNzaWduIGFuZCB0aGVzZQo+PiBzZXR0aW5ncyByZW1haW4gc3RhdGljIGZvciB0aGUgd2hvbGUg bGlmZXRpbWUgb2YgdGhhdCBWTS4KPj4gSWYgeW91IGFyZSBkZXNpZ25pbmcgYSBzeXN0ZW0gd2hp Y2ggbmVlZHMgdGhlc2UgcmVzb2x1dGlvbnMKPj4gdG8gY2hhbmdlIGF0IHJ1bi10aW1lIHRoZW4g dGhpcyBjYW4gYmUgZG9uZToKPj4gMS4gQmFja2VuZCBjaGFuZ2VzIHRoZSBzdGF0ZSBvZiB0aGUg ZnJvbnRlbmQgdG8gWGVuYnVzU3RhdGVDbG9zZWQgc3RhdGUKPj4gMi4gWGVuICh4bC9saWJ4bCkg b3IgYmFja2VuZCBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gaW4gWGVuU3RvcmUKPj4gMy4gQmFj a2VuZCByZS1pbml0aWFsaXplcyB0aGUgZnJvbnRlbmQgd2hpY2ggcmVhZHMgbmV3IGNvbmZpZ3Vy YXRpb24KPj4+IFdoYXQgaXMgYWxzbyBtaXNzaW5nIGhlcmUgaXMgYSB3YXkgdG8gcmVwb3J0IHBp eGVsIGFzcGVjdCByYXRpbzogUEFMIGFuZAo+Pj4gTlRTQy1iYXNlZCB2aWRlbyBtYXRlcmlhbCBk b2Vzbid0IGhhdmUgc3F1YXJlIHBpeGVscy4KPj4gSG0sIGluZGVlZCwgdGhhbmsgeW91LiBJJ2xs IHB1dCB0aGlzIGFzIGEgZnJhY3Rpb24gdW5kZXIKPj4gdGhlIGNvcnJlc3BvbmRpbmcgJ3Jlc29s dXRpb24nOgo+Pgo+PiBOb3c6Cj4+IC9sb2NhbC9kb21haW4vMi9kZXZpY2UvdmNhbWVyYS8wL2Zv cm1hdHMvWVVZVi82NDB4NDgwID0gIjMwLzEsMTUvMSwxNS8yIgo+PiAvbG9jYWwvZG9tYWluLzIv ZGV2aWNlL3ZjYW1lcmEvMC9mb3JtYXRzL1lVWVYvMTI4MHgxMDI0ID0gIjAxNS8yIgo+Pgo+PiBX aWxsIGNoYW5nZSB0bzoKPj4gL2xvY2FsL2RvbWFpbi8yL2RldmljZS92Y2FtZXJhLzAvZm9ybWF0 cy9ZVVlWLzY0MHg0ODAvZnJhbWVyYXRlcy8gPQo+PiAiMzAvMSwxNS8xLDE1LzIiCj4+IC9sb2Nh bC9kb21haW4vMi9kZXZpY2UvdmNhbWVyYS8wL2Zvcm1hdHMvWVVZVi82NDB4NDgwL2FzcGVjdHJh dGlvID0gIjEvMSIKPiBZb3UgbmVlZCB0byBiZSBtb3JlIHByZWNpc2U6IGFzcGVjdHJhdGlvIGNh biByZWZlciB0byB0aGUgZGlzcGxheSBhc3BlY3QKPiByYXRpbyBvciB0aGUgcGl4ZWwgYXNwZWN0 IHJhdGlvLCBhbmQgeW91IGNhbiBjYWxjdWxhdGUgb25lIGZyb20gdGhlIG90aGVyLgo+Cj4gU28g dGhpcyBpcyBlaXRoZXIgcGl4ZWxhc3BlY3RyYXRpbyBvciBkaXNwbGF5YXNwZWN0cmF0aW8uCj4K PiBFdmVuIHRob3VnaCBWNEwyIHByb3ZpZGVzIGEgcGl4ZWxhc3BlY3RyYXRpbywgSSB3b3VsZCBy ZWNvbW1lbmQgdGhhdCB5b3UKPiBjaG9vc2UgdG8gZXhwb3J0IGl0IGFzIGEgZGlzcGxheWFzcGVj dHJhdGlvLiBJdCdzIGVhc2llciBmb3IgYXBwbGljYXRpb25zCj4gdG8gaGFuZGxlLgpvaywgdGhl biAiZGlzcGxheS1hc3BlY3QtcmF0aW8iCj4KPiBQbGVhc2Ugbm90ZSB0aGF0IGluIHRoZSBjYXNl IG9mIERWRC9CbHVSYXkgc291cmNlIG1hdGVyaWFsIHRoZSBzYW1lCj4gcmVzb2x1dGlvbiBjYW4g aGF2ZSBkaWZmZXJlbnQgZGlzcGxheSBhc3BlY3QgcmF0aW9zOiBlLmcuIFBBTCBjYW4gYmUKPiA0 OjMgb3IgMTY6OSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgaXQgaXMgd2lkZXNjcmVlbiBvciBub3Qu Cj4Kb2sKPj4gL2xvY2FsL2RvbWFpbi8yL2RldmljZS92Y2FtZXJhLzAvZm9ybWF0cy9ZVVlWLzEy ODB4MTAyNC9mcmFtZXJhdGVzID0gIjAxNS8yIgo+PiAvbG9jYWwvZG9tYWluLzIvZGV2aWNlL3Zj YW1lcmEvMC9mb3JtYXRzL1lVWVYvMTI4MHgxMDI0L2FzcGVjdHJhdGlvID0KPj4gIjU5LzU4Igo+ Pgo+Pj4gSXQncyBpbXBvcnRhbnQgdG8gZGVjaWRlIHdoZXRoZXIgb3Igbm90IHlvdSB3YW50IHRv IHN1cHBvcnQgdmlkZW8gc291cmNlcwo+Pj4gbGlrZSB0aGF0IChIRE1JLCBDb21wb3NpdGUvUy1W aWRlbyBpbnB1dHMsIFVTQiBwb3J0cyB3aGVyZSB1c2VycyBjYW4gY29ubmVjdAo+Pj4gb3IgZGlz Y29ubmVjdCB3ZWJjYW1zKSBvciBpZiB5b3Ugc3RpY2sgdG8gZml4ZWQgY2FtZXJhIHBpcGVsaW5l cy4KPj4gSSBiZWxpZXZlIHRoYXQgdGhpcyBpcyBhbGwgaGlkZGVuIGZyb20gdGhlIGZyb250ZW5k IGJ5IHRoZQo+PiBiYWNrZW5kLCBzbyBJIHNlIG5vdGhpbmcgd2UgaGF2ZSB0byBwdXQgaW4gdGhl IHByb3RvY29sCj4+IHdpdGggdGhpcyByZXNwZWN0Lgo+Pj4gVGhlIGJpZyBkaWZmZXJlbmNlIGlz IHRoYXQgeW91IGRvbid0IGNvbnRyb2wgd2hhdCBzb21lb25lIGNhbiBjb25uZWN0IGFzCj4+PiBl eHRlcm5hbCBzb3VyY2VzLCBzbyB5b3Ugd2lsbCBoYXZlIHRvIGJlIGEgbG90IG1vcmUgY2FyZWZ1 bCBhbmQgcm9idXN0Lgo+Pj4KPj4+IEkgc3VzcGVjdCB0aGF0IHlvdSBsaWtlbHkgd2lsbCB3YW50 IHRvIHN1cHBvcnQgc3VjaCBzb3VyY2VzIGV2ZW50dWFsbHksIHNvCj4+PiBpdCBwYXlzIHRvIGRl c2lnbiB0aGlzIHdpdGggdGhhdCBpbiBtaW5kLgo+PiBBZ2FpbiwgSSB0aGluayB0aGF0IHRoaXMg aXMgdGhlIGJhY2tlbmQgdG8gaGlkZSB0aGVzZQo+PiB1c2UtY2FzZXMgZnJvbSB0aGUgZnJvbnRl bmQuCj4gSSdtIG5vdCBzdXJlIHlvdSBjYW46IHNheSB5b3UgYXJlIHBsYXlpbmcgYSBibHVyYXkg Y29ubmVjdGVkIHRvIHRoZSBzeXN0ZW0KPiB3aXRoIEhETUksIHRoZW4gaWYgdGhlcmUgaXMgYSBy ZXNvbHV0aW9uIGNoYW5nZSwgd2hhdCBkbyB5b3UgZG8/IFlvdSBjYW4gdGVhcgo+IGV2ZXJ5dGhp bmcgZG93biBhbmQgYnVpbGQgaXQgdXAgYWdhaW4sIG9yIHlvdSBjYW4ganVzdCB0ZWxsIGZyb250 ZW5kcyB0aGF0Cj4gc29tZXRoaW5nIGNoYW5nZWQgYW5kIHRoYXQgdGhleSBoYXZlIHRvIGxvb2sg YXQgdGhlIG5ldyB2Y2FtZXJhIGNvbmZpZ3VyYXRpb24uCj4KPiBUaGUgbGF0dGVyIHNlZW1zIHRv IGJlIG1vcmUgc2Vuc2libGUgdG8gbWUuIEl0IGlzIHJlYWxseSBub3QgbXVjaCB0aGF0IHlvdQo+ IG5lZWQgdG8gZG86IGFsbCB5b3UgcmVhbGx5IG5lZWQgaXMgYW4gZXZlbnQgc2lnbmFsbGluZyB0 aGF0IHNvbWV0aGluZyBjaGFuZ2VkLgo+IEluIFY0TDIgdGhhdCdzIHRoZSBWNEwyX0VWRU5UX1NP VVJDRV9DSEFOR0UuCndlbGwsIHRoaXMgY29tcGxpY2F0ZXMgdGhpbmdzIGEgbG90IGFzIEknbGwg aGF2ZSB0bwpyZS1hbGxvY2F0ZSBidWZmZXJzIC0gcmlnaHQ/CkJ1dCBhbnl3YXlzLCBJIGNhbiBh ZGQKI2RlZmluZSBYRU5DQU1FUkFfRVZUX0NGR19DSEFOR0XCoMKgwqDCoMKgwqAgMHgwMQppbiB0 aGUgcHJvdG9jb2wsIHNvIHdlIGNhbiBhZGRyZXNzIHRoaXMgdXNlLWNhc2UKPgo+Pj4+ICsgKgo+ Pj4+ICsgKiBmcmFtZS1yYXRlcwo+Pj4+ICsgKiAgICAgIFZhbHVlczogICAgICAgICA8bnVtZXJh dG9yLCB1aW50MzJfdD4vPGRlbm9taW5hdG9yLCB1aW50MzJfdD4KPj4+PiArICoKPj4+PiArICog ICAgICBMaXN0IG9mIFhFTkNBTUVSQV9GUkFNRV9SQVRFX1NFUEFSQVRPUiBzZXBhcmF0ZWQgc3Vw cG9ydGVkIGZyYW1lIHJhdGVzCj4+Pj4gKyAqICAgICAgb2YgdGhlIGNhbWVyYSBleHByZXNzZWQg YXMgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciBvZiB0aGUKPj4+PiArICogICAgICBjb3JyZXNw b25kaW5nIGZyYW1lIHJhdGUuCj4+Pj4gKyAqCj4+Pj4gKyAqIFRoZSBmb3JtYXQgb2YgdGhlIDxm b3JtYXRzPiBkaXJlY3RvcnkgdHJlZSB3aXRoIHJlc29sdXRpb25zIGFuZCBmcmFtZSByYXRlcwo+ Pj4+ICsgKiBtdXN0IGJlIHN0cnVjdHVyZWQgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6Cj4+Pj4g KyAqCj4+Pj4gKyAqIC4uLi92Y2FtZXJhLzxkZXYtaWQ+Lzxmb3JtYXRbaV0+LzxyZXNvbHV0aW9u W2pdPi88ZnJhbWUtcmF0ZXNba10+Cj4+Pj4gKyAqCj4+Pj4gKyAqIHdoZXJlCj4+Pj4gKyAqICBp IC0gaS10aCBzdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0Cj4+Pj4gKyAqICBqIC0gai10aCBzdXBwb3J0 ZWQgcmVzb2x1dGlvbiBmb3IgaS10aCBwaXhlbCBmb3JtYXQKPj4+PiArICogIGsgLSBrLXRoIHN1 cHBvcnRlZCBmcmFtZSByYXRlIGZvciBpLXRoIHBpeGVsIGZvcm1hdCBhbmQgai10aAo+Pj4+ICsg KiAgICAgIHJlc29sdXRpb24+ICsgKgo+Pj4+ICsgKi0tLS0tLS0tLS0tLS0tLS0tLS0gQ2FtZXJh IFJlcXVlc3QgVHJhbnNwb3J0IFBhcmFtZXRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4+Pj4g KyAqCj4+Pj4gKyAqIFRoaXMgY29tbXVuaWNhdGlvbiBwYXRoIGlzIHVzZWQgdG8gZGVsaXZlciBy ZXF1ZXN0cyBmcm9tIGZyb250ZW5kIHRvIGJhY2tlbmQKPj4+PiArICogYW5kIGdldCB0aGUgY29y cmVzcG9uZGluZyByZXNwb25zZXMgZnJvbSBiYWNrZW5kIHRvIGZyb250ZW5kLAo+Pj4+ICsgKiBz ZXQgdXAgcGVyIHZpcnR1YWwgY2FtZXJhIGRldmljZS4KPj4+PiArICoKPj4+PiArICogcmVxLWV2 ZW50LWNoYW5uZWwKPj4+PiArICogICAgICBWYWx1ZXM6ICAgICAgICAgPHVpbnQzMl90Pgo+Pj4+ ICsgKgo+Pj4+ICsgKiAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBYZW4gY2FtZXJhJ3MgY29u dHJvbCBldmVudCBjaGFubmVsCj4+Pj4gKyAqICAgICAgdXNlZCB0byBzaWduYWwgYWN0aXZpdHkg aW4gdGhlIHJpbmcgYnVmZmVyLgo+Pj4+ICsgKgo+Pj4+ICsgKiByZXEtcmluZy1yZWYKPj4+PiAr ICogICAgICBWYWx1ZXM6ICAgICAgICAgPHVpbnQzMl90Pgo+Pj4+ICsgKgo+Pj4+ICsgKiAgICAg IFRoZSBYZW4gZ3JhbnQgcmVmZXJlbmNlIGdyYW50aW5nIHBlcm1pc3Npb24gZm9yIHRoZSBiYWNr ZW5kIHRvIG1hcAo+Pj4+ICsgKiAgICAgIGEgc29sZSBwYWdlIG9mIGNhbWVyYSdzIGNvbnRyb2wg cmluZyBidWZmZXIuCj4+Pj4gKyAqCj4+Pj4gKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2FtZXJh IEV2ZW50IFRyYW5zcG9ydCBQYXJhbWV0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPj4+PiAr ICoKPj4+PiArICogVGhpcyBjb21tdW5pY2F0aW9uIHBhdGggaXMgdXNlZCB0byBkZWxpdmVyIGFz eW5jaHJvbm91cyBldmVudHMgZnJvbSBiYWNrZW5kCj4+Pj4gKyAqIHRvIGZyb250ZW5kLCBzZXQg dXAgcGVyIHZpcnR1YWwgY2FtZXJhIGRldmljZS4KPj4+PiArICoKPj4+PiArICogZXZ0LWV2ZW50 LWNoYW5uZWwKPj4+PiArICogICAgICBWYWx1ZXM6ICAgICAgICAgPHVpbnQzMl90Pgo+Pj4+ICsg Kgo+Pj4+ICsgKiAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBYZW4gY2FtZXJhJ3MgZXZlbnQg Y2hhbm5lbAo+Pj4+ICsgKiAgICAgIHVzZWQgdG8gc2lnbmFsIGFjdGl2aXR5IGluIHRoZSByaW5n IGJ1ZmZlci4KPj4+PiArICoKPj4+PiArICogZXZ0LXJpbmctcmVmCj4+Pj4gKyAqICAgICAgVmFs dWVzOiAgICAgICAgIDx1aW50MzJfdD4KPj4+PiArICoKPj4+PiArICogICAgICBUaGUgWGVuIGdy YW50IHJlZmVyZW5jZSBncmFudGluZyBwZXJtaXNzaW9uIGZvciB0aGUgYmFja2VuZCB0byBtYXAK Pj4+PiArICogICAgICBhIHNvbGUgcGFnZSBvZiBjYW1lcmEncyBldmVudCByaW5nIGJ1ZmZlci4K Pj4+PiArICovCj4+Pj4gKwo+Pj4+ICsvKgo+Pj4+ICsgKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCj4+ Pj4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRFIERJQUdSQU1TCj4+Pj4g KyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioKPj4+PiArICoKPj4+PiArICogVG9vbCBzdGFjayBjcmVh dGVzIGZyb250IGFuZCBiYWNrIHN0YXRlIG5vZGVzIHdpdGggaW5pdGlhbCBzdGF0ZQo+Pj4+ICsg KiBYZW5idXNTdGF0ZUluaXRpYWxpc2luZy4KPj4+PiArICogVG9vbCBzdGFjayBjcmVhdGVzIGFu ZCBzZXRzIHVwIGZyb250ZW5kIGNhbWVyYSBjb25maWd1cmF0aW9uCj4+Pj4gKyAqIG5vZGVzIHBl ciBkb21haW4uCj4+Pj4gKyAqCj4+Pj4gKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0gTm9ybWFsIGZsb3cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPj4+PiArICoK Pj4+PiArICogRnJvbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhY2sKPj4+PiAr ICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAgID09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KPj4+PiArICogWGVuYnVzU3RhdGVJbml0aWFsaXNpbmcgICAg ICAgICAgICAgIFhlbmJ1c1N0YXRlSW5pdGlhbGlzaW5nCj4+Pj4gKyAqICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgbyBRdWVyeSBiYWNrZW5kIGRldmljZSBpZGVudGlmaWNh dGlvbgo+Pj4+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0 YS4KPj4+PiArICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIE9wZW4g YW5kIHZhbGlkYXRlIGJhY2tlbmQgZGV2aWNlLgo+Pj4+ICsgKiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKPj4+PiArICogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cj4+Pj4gKyAqICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVgo+Pj4+ICsgKiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgWGVuYnVzU3RhdGVJbml0V2FpdAo+Pj4+ICsgKgo+Pj4+ICsg KiBvIFF1ZXJ5IGZyb250ZW5kIGNvbmZpZ3VyYXRpb24KPj4+PiArICogbyBBbGxvY2F0ZSBhbmQg aW5pdGlhbGl6ZQo+Pj4+ICsgKiAgIGV2ZW50IGNoYW5uZWxzIHBlciBjb25maWd1cmVkCj4+Pj4g KyAqICAgY2FtZXJhLgo+Pj4+ICsgKiBvIFB1Ymxpc2ggdHJhbnNwb3J0IHBhcmFtZXRlcnMKPj4+ PiArICogICB0aGF0IHdpbGwgYmUgaW4gZWZmZWN0IGR1cmluZwo+Pj4+ICsgKiAgIHRoaXMgY29u bmVjdGlvbi4KPj4+PiArICogICAgICAgICAgICAgIHwKPj4+PiArICogICAgICAgICAgICAgIHwK Pj4+PiArICogICAgICAgICAgICAgIFYKPj4+PiArICogWGVuYnVzU3RhdGVJbml0aWFsaXNlZAo+ Pj4+ICsgKgo+Pj4+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8g UXVlcnkgZnJvbnRlbmQgdHJhbnNwb3J0IHBhcmFtZXRlcnMuCj4+Pj4gKyAqICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBDb25uZWN0IHRvIHRoZSBldmVudCBjaGFubmVs cy4KPj4+PiArICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8Cj4+Pj4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfAo+Pj4+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFYKPj4+PiArICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhlbmJ1 c1N0YXRlQ29ubmVjdGVkCj4+Pj4gKyAqCj4+Pj4gKyAqICBvIENyZWF0ZSBhbmQgaW5pdGlhbGl6 ZSBPUwo+Pj4+ICsgKiAgICB2aXJ0dWFsIGNhbWVyYSBhcyBwZXIKPj4+PiArICogICAgY29uZmln dXJhdGlvbi4KPj4+PiArICogICAgICAgICAgICAgIHwKPj4+PiArICogICAgICAgICAgICAgIHwK Pj4+PiArICogICAgICAgICAgICAgIFYKPj4+PiArICogWGVuYnVzU3RhdGVDb25uZWN0ZWQKPj4+ PiArICoKPj4+PiArICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhlbmJ1 c1N0YXRlVW5rbm93bgo+Pj4+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgWGVuYnVzU3RhdGVDbG9zZWQKPj4+PiArICogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFhlbmJ1c1N0YXRlQ2xvc2luZwo+Pj4+ICsgKiBvIFJlbW92ZSB2aXJ0dWFsIGNh bWVyYSBkZXZpY2UKPj4+PiArICogbyBSZW1vdmUgZXZlbnQgY2hhbm5lbHMKPj4+PiArICogICAg ICAgICAgICAgIHwKPj4+PiArICogICAgICAgICAgICAgIHwKPj4+PiArICogICAgICAgICAgICAg IFYKPj4+PiArICogWGVuYnVzU3RhdGVDbG9zZWQKPj4+PiArICoKPj4+PiArICotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlY292ZXJ5IGZsb3cgLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQo+Pj4+ICsgKgo+Pj4+ICsgKiBJbiBjYXNlIG9mIGZyb250ZW5kIHVucmVjb3Zl cmFibGUgZXJyb3JzIGJhY2tlbmQgaGFuZGxlcyB0aGF0IGFzCj4+Pj4gKyAqIGlmIGZyb250ZW5k IGdvZXMgaW50byB0aGUgWGVuYnVzU3RhdGVDbG9zZWQgc3RhdGUuCj4+Pj4gKyAqCj4+Pj4gKyAq IEluIGNhc2Ugb2YgYmFja2VuZCB1bnJlY292ZXJhYmxlIGVycm9ycyBmcm9udGVuZCB0cmllcyBy ZW1vdmluZwo+Pj4+ICsgKiB0aGUgdmlydHVhbGl6ZWQgZGV2aWNlLiBJZiB0aGlzIGlzIHBvc3Np YmxlIGF0IHRoZSBtb21lbnQgb2YgZXJyb3IsCj4+Pj4gKyAqIHRoZW4gZnJvbnRlbmQgZ29lcyBp bnRvIHRoZSBYZW5idXNTdGF0ZUluaXRpYWxpc2luZyBzdGF0ZSBhbmQgaXMgcmVhZHkgZm9yCj4+ Pj4gKyAqIG5ldyBjb25uZWN0aW9uIHdpdGggYmFja2VuZC4gSWYgdGhlIHZpcnR1YWxpemVkIGRl dmljZSBpcyBzdGlsbCBpbiB1c2UgYW5kCj4+Pj4gKyAqIGNhbm5vdCBiZSByZW1vdmVkLCB0aGVu IGZyb250ZW5kIGdvZXMgaW50byB0aGUgWGVuYnVzU3RhdGVSZWNvbmZpZ3VyaW5nIHN0YXRlCj4+ Pj4gKyAqIHVudGlsIGVpdGhlciB0aGUgdmlydHVhbGl6ZWQgZGV2aWNlIGlzIHJlbW92ZWQgb3Ig YmFja2VuZCBpbml0aWF0ZXMgYSBuZXcKPj4+PiArICogY29ubmVjdGlvbi4gT24gdGhlIHZpcnR1 YWxpemVkIGRldmljZSByZW1vdmFsIGZyb250ZW5kIGdvZXMgaW50byB0aGUKPj4+PiArICogWGVu YnVzU3RhdGVJbml0aWFsaXNpbmcgc3RhdGUuCj4+Pj4gKyAqCj4+Pj4gKyAqIE5vdGUgb24gWGVu YnVzU3RhdGVSZWNvbmZpZ3VyaW5nIHN0YXRlIG9mIHRoZSBmcm9udGVuZDogaWYgYmFja2VuZCBo YXMKPj4+PiArICogdW5yZWNvdmVyYWJsZSBlcnJvcnMgdGhlbiBmcm9udGVuZCBjYW5ub3Qgc2Vu ZCByZXF1ZXN0cyB0byB0aGUgYmFja2VuZAo+Pj4+ICsgKiBhbmQgdGh1cyBjYW5ub3QgcHJvdmlk ZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSB2aXJ0dWFsaXplZCBkZXZpY2UgYW55bW9yZS4KPj4+PiAr ICogQWZ0ZXIgYmFja2VuZCBpcyBiYWNrIHRvIG5vcm1hbCB0aGUgdmlydHVhbGl6ZWQgZGV2aWNl IG1heSBzdGlsbCBob2xkIHNvbWUKPj4+PiArICogc3RhdGU6IGNvbmZpZ3VyYXRpb24gaW4gdXNl LCBhbGxvY2F0ZWQgYnVmZmVycywgY2xpZW50IGFwcGxpY2F0aW9uIHN0YXRlIGV0Yy4KPj4+PiAr ICogSW4gbW9zdCBjYXNlcywgdGhpcyB3aWxsIHJlcXVpcmUgZnJvbnRlbmQgdG8gaW1wbGVtZW50 IGNvbXBsZXggcmVjb3ZlcnkKPj4+PiArICogcmVjb25uZWN0IGxvZ2ljLiBJbnN0ZWFkLCBieSBn b2luZyBpbnRvIFhlbmJ1c1N0YXRlUmVjb25maWd1cmluZyBzdGF0ZSwKPj4+PiArICogZnJvbnRl bmQgd2lsbCBtYWtlIHN1cmUgbm8gbmV3IGNsaWVudHMgb2YgdGhlIHZpcnR1YWxpemVkIGRldmlj ZSBhcmUKPj4+PiArICogYWNjZXB0ZWQsIGFsbG93IGV4aXN0aW5nIGNsaWVudChzKSB0byBleGl0 IGdyYWNlZnVsbHkgYnkgc2lnbmFsaW5nIGVycm9yCj4+Pj4gKyAqIHN0YXRlIGV0Yy4KPj4+PiAr ICogT25jZSBhbGwgdGhlIGNsaWVudHMgYXJlIGdvbmUgZnJvbnRlbmQgY2FuIHJlaW5pdGlhbGl6 ZSB0aGUgdmlydHVhbGl6ZWQKPj4+PiArICogZGV2aWNlIGFuZCBnZXQgaW50byBYZW5idXNTdGF0 ZUluaXRpYWxpc2luZyBzdGF0ZSBhZ2FpbiBzaWduYWxpbmcgdGhlCj4+Pj4gKyAqIGJhY2tlbmQg dGhhdCBhIG5ldyBjb25uZWN0aW9uIGNhbiBiZSBtYWRlLgo+Pj4+ICsgKgo+Pj4+ICsgKiBUaGVy ZSBhcmUgbXVsdGlwbGUgY29uZGl0aW9ucyBwb3NzaWJsZSB1bmRlciB3aGljaCBmcm9udGVuZCB3 aWxsIGdvIGZyb20KPj4+PiArICogWGVuYnVzU3RhdGVSZWNvbmZpZ3VyaW5nIGludG8gWGVuYnVz U3RhdGVJbml0aWFsaXNpbmcsIHNvbWUgb2YgdGhlbSBhcmUgT1MKPj4+PiArICogc3BlY2lmaWMu IEZvciBleGFtcGxlOgo+Pj4+ICsgKiAxLiBUaGUgdW5kZXJseWluZyBPUyBmcmFtZXdvcmsgbWF5 IHByb3ZpZGUgY2FsbGJhY2tzIHRvIHNpZ25hbCB0aGF0IHRoZSBsYXN0Cj4+Pj4gKyAqICAgIGNs aWVudCBvZiB0aGUgdmlydHVhbGl6ZWQgZGV2aWNlIGhhcyBnb25lIGFuZCB0aGUgZGV2aWNlIGNh biBiZSByZW1vdmVkCj4+Pj4gKyAqIDIuIEZyb250ZW5kIGNhbiBzY2hlZHVsZSBhIGRlZmVycmVk IHdvcmsgKHRpbWVyL3Rhc2tsZXQvd29ya3F1ZXVlKQo+Pj4+ICsgKiAgICB0byBwZXJpb2RpY2Fs bHkgY2hlY2sgaWYgdGhpcyBpcyB0aGUgcmlnaHQgdGltZSB0byByZS10cnkgcmVtb3ZhbCBvZgo+ Pj4+ICsgKiAgICB0aGUgdmlydHVhbGl6ZWQgZGV2aWNlLgo+Pj4+ICsgKiAzLiBCeSBhbnkgb3Ro ZXIgbWVhbnMuCj4+Pj4gKyAqCj4+Pj4gKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKPj4+PiArICog ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUVVFU1QgQ09ERVMKPj4+PiArICoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKgo+Pj4+ICsgKi8KPj4+PiArI2RlZmluZSBYRU5DQU1FUkFfT1BfU0VUX0NP TkZJRyAgICAgICAgMHgwMAo+Pj4+ICsjZGVmaW5lIFhFTkNBTUVSQV9PUF9HRVRfQlVGX0RFVEFJ TFMgICAweDAxCj4+Pj4gKyNkZWZpbmUgWEVOQ0FNRVJBX09QX0JVRl9DUkVBVEUgICAgICAgIDB4 MDIKPj4+PiArI2RlZmluZSBYRU5DQU1FUkFfT1BfQlVGX0RFU1RST1kgICAgICAgMHgwMwo+Pj4+ ICsjZGVmaW5lIFhFTkNBTUVSQV9PUF9TVFJFQU1fU1RBUlQgICAgICAweDA0Cj4+Pj4gKyNkZWZp bmUgWEVOQ0FNRVJBX09QX1NUUkVBTV9TVE9QICAgICAgIDB4MDUKPj4+PiArI2RlZmluZSBYRU5D QU1FUkFfT1BfR0VUX0NUUkxfREVUQUlMUyAgMHgwNgo+Pj4+ICsjZGVmaW5lIFhFTkNBTUVSQV9P UF9TRVRfQ1RSTCAgICAgICAgICAweDA3Cj4+IEkgYW0gdGhpbmtpbmcgYWJvdXQgZXh0ZW5kaW5n IHRoZSBjb21tYW5kIHNldCBhIGJpdCBhcyBpdCBhbHJlYWR5Cj4+IGhhcyBzb21lIGZsYXdzLCBl LmcuIHRoZXJlIGlzIG5vIHdheSBmb3IgYSBWTSB0byB0ZWxsIHRoZSBiYWNrZW5kCj4+IHRoYXQg dGhlIGJ1ZmZlciBpcyBub3QgaW4gdXNlIGFueW1vcmUgYW5kIGNhbiBiZSBnaXZlbiBiYWNrCj4+ IHRvIHRoZSByZWFsIEhXIGRyaXZlciwgZS5nLiBxdWV1ZS9kZXF1ZXVlIGluIFY0TDIgdGVybXM6 Cj4+Cj4+ICNkZWZpbmUgWEVOQ0FNRVJBX09QX1NFVF9GT1JNQVQgICAgICAgIDB4MDAKPj4gLSB3 aWxsIGJlIHVzZWQgdG8gc2V0IGZvcm1hdDogcGl4ZWwgZm9ybWF0LCByZXNvbHV0aW9uCj4+Cj4+ ICNkZWZpbmUgWEVOQ0FNRVJBX09QX1NFVF9GUkFNRV9SQVRFICAgIDB4MDEKPj4gLSB1c2VkIHRv IHNldCB0aGUgZnJhbWUgcmF0ZQo+Pgo+PiAjZGVmaW5lIFhFTkNBTUVSQV9PUF9CVUZfUkVRVUVT VCAgICAgICAweDAyCj4+IC0gYXNrcyBiYWNrZW5kIHRvIGFsbG9jYXRlIHRoZSBnaXZlbiBudW1i ZXIgb2YgYnVmZmVycywKPj4gYmFja2VuZCByZXBsaWVzIHdpdGggcmVhbCBudW1iZXIgb2YgdGhv c2UgdG8gYmUgdXNlZAo+Pgo+PiAjZGVmaW5lIFhFTkNBTUVSQV9PUF9CVUZfQ1JFQVRFICAgICAg ICAweDAzCj4+IC0gY3JlYXRlIGEgc2hhcmVkIGJ1ZmZlcgo+Pgo+PiAjZGVmaW5lIFhFTkNBTUVS QV9PUF9CVUZfREVTVFJPWSAgICAgICAweDA0Cj4+IC0gZGVzdHJveSBhIHNoYXJlZCBidWZmZXIK Pj4KPj4gI2RlZmluZSBYRU5DQU1FUkFfT1BfQlVGX1FVRVVFICAgICAgICAgMHgwNQo+PiAtIFZN IHRlbGxzIHRoZSBiYWNrZW5kIHRoYXQgaXQgaGFzIGFjY2VzcyB0byB0aGUgc2hhcmVkIGJ1ZmZl cgo+PiBhbmQgdGhlIGJ1ZmZlciBjYW5ub3QgYmUgc2VudCBiYWNrIHRvIHJlYWwgSFcgZHJpdmVy Cj4+Cj4+ICNkZWZpbmUgWEVOQ0FNRVJBX09QX0JVRl9ERVFVRVVFICAgICAgIDB4MDYKPj4gLSBW TSB0ZWxscyB0aGUgYmFja2VuZCB0aGF0IHRoZSBzaGFyZWQgYnVmZmVyIGlzIG5vdCBpbiB1c2Ug YW5kCj4+IGNhbiBiZSBzZW50IHRvIHJlYWwgSFcgZHJpdmVyCj4gVGhpcyBpcyB0aGUgd3Jvbmcg d2F5IGFyb3VuZDogUVVFVUUgd291bGQgcXVldWUgdGhlIHNoYXJlZCBidWZmZXIgdG8KPiB0aGUg YmFja2VuZCBmb3IgdXNlIHdpdGggdGhlIHJlYWwgSFcgZHJpdmVyLCBERVFVRVVFIHdvdWxkIGRl cXVldWUgaXQKPiBmb3IgdXNlIGluIHRoZSBWTS4KSW5kZWVkLCB0aGFuayB5b3UgZm9yIHNwb3R0 aW5nIHRoaXMKPgo+PiAjZGVmaW5lIFhFTkNBTUVSQV9PUF9DVFJMX0VOVU0gICAgICAgICAweDA3 Cj4+IC0gZ2V0IGktdGggY29udHJvbCByYW5nZXMgYW5kIHNldHRpbmdzCj4+Cj4+ICNkZWZpbmUg WEVOQ0FNRVJBX09QX0NUUkxfR0VUICAgICAgICAgIDB4MDgKPj4gLSBnZXQgY29udHJvbCB2YWx1 ZQo+Pgo+PiAjZGVmaW5lIFhFTkNBTUVSQV9PUF9DVFJMX1NFVCAgICAgICAgICAweDA5Cj4+IC0g c2V0IGNvbnRyb2wgdmFsdWUKPj4KPj4gI2RlZmluZSBYRU5DQU1FUkFfT1BfU1RSRUFNX1NUQVJU ICAgICAgMHgwYQo+PiAtIHN0YXJ0IHN0cmVhbWluZwo+Pgo+PiAjZGVmaW5lIFhFTkNBTUVSQV9P UF9TVFJFQU1fU1RPUCAgICAgICAweDBiCj4+IC0gc3RvcCBjdHJlYW1pbmcKPj4KPj4KPj4+PiAr Cj4+Pj4gKyNkZWZpbmUgWEVOQ0FNRVJBX0NUUkxfQlJJR0hUTkVTUyAgICAgIDB4MDAKPj4+PiAr I2RlZmluZSBYRU5DQU1FUkFfQ1RSTF9DT05UUkFTVCAgICAgICAgMHgwMQo+Pj4+ICsjZGVmaW5l IFhFTkNBTUVSQV9DVFJMX1NBVFVSQVRJT04gICAgICAweDAyCj4+Pj4gKyNkZWZpbmUgWEVOQ0FN RVJBX0NUUkxfSFVFICAgICAgICAgICAgIDB4MDMKPj4+PiArCj4+Pj4gKy8qCj4+Pj4gKyAqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioKPj4+PiArICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBFVkVOVCBDT0RFUwo+Pj4+ICsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCj4+Pj4gKyAqLwo+Pj4+ ICsjZGVmaW5lIFhFTkNBTUVSQV9FVlRfRlJBTUVfQVZBSUwgICAgICAweDAwCj4+Pj4gKwo+Pj4+ ICsvKgo+Pj4+ICsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCj4+Pj4gKyAqICAgICAgICAgICAgICAg WEVOU1RPUkUgRklFTEQgQU5EIFBBVEggTkFNRSBTVFJJTkdTLCBIRUxQRVJTCj4+Pj4gKyAqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioKPj4+PiArICovCj4+Pj4gKyNkZWZpbmUgWEVOQ0FNRVJBX0RSSVZF Ul9OQU1FICAgICAgICAgICJ2Y2FtZXJhIgo+Pj4gQWgsIHRoYXQncyB3aGVyZSB2Y2FtZXJhIGNv bWVzIGZyb20uIEhvdyBhYm91dCBjYWxsaW5nIHRoaXMgeGVuLWNhbWVyYSBvcgo+Pj4gdmlydC1j YW1lcmE/IFdpdGggYSBwcmVmZXJlbmNlIGZvciB4ZW4tY2FtZXJhLCBzaW5jZSB0aGF0J3Mgd2hh dCB5b3UgdXNlIGZvciB0aGUKPj4+IGRlZmluZXMgYXMgd2VsbC4KPj4+Cj4+PiBPciBwZXJoYXBz IHB2LWNhbWVyYT8KPj4+Cj4+PiBJcyB0aGlzIGRyaXZlciBnb2luZyB0byBiZSB4ZW4tc3BlY2lm aWMsIG9yIG1vcmUgYSBnZW5lcmFsIGFwcHJvYWNoIHRoYXQgZXZlcnlvbmUKPj4+IGNhbiB1c2U/ IE9idmlvdXNseSwgdGhlIGxhdHRlciB3b3VsZCBiZSBwcmVmZXJhYmxlLgo+PiBBcyBJIGhhdmUg YWxyZWFkeSByZXBsaWVkIHRvIHRoZSBjb3ZlciBsZXR0ZXIgd2l0aCBleHBsYW5hdGlvbnM6Cj4+ ICd2JyBzdGFuZHMgZm9yICd2aXJ0dWFsJyBhbmQgdGhlcmUgaXMgYSBjb252ZW50aW9uIHRvIG5h bWUgdGhlCj4+IFhlbiB2aXJ0dWFsIGRldmljZXMgc3RhcnRpbmcgd2l0aCAndic6IHZpZiwgdmti ZCBldGMuCj4gWWVhaCwgaWdub3JlIG15IGNvbW1lbnQuCj4KPj4+IEJUVywgSSBhbSBub3Qgc3Vy ZSBpZiB5b3UgYXJlIGF3YXJlIG9mIHRoaXMsIGJ1dCB0aGUgVjRMMiBBUEkgYWxzbyBoYXMgc3Vw cG9ydCBmb3IKPj4+IHJhZGlvIGFuZCBSRFMgaGFyZHdhcmUuIENvbnRhY3QgbWUgaWYgdGhpcyBp cyBvZiBpbnRlcmVzdCB0byBYZW4gdG8gc3VwcG9ydCB0aGlzIGFzCj4+PiB3ZWxsIGdpdmVuIHRo ZSBhdXRvbW90aXZlIHVzZS1jYXNlLgo+PiBZZXMsIHRoYW5rIHlvdSwgYnV0IGF0IHRoaXMgc3Rh Z2Ugd2UgYXJlIHRhcmdldGluZyBjYW1lcmEgb25seS4KPj4gUmFkaW8gY2FuIGJlIGFub3RoZXIg dG9waWMgaWYgdGltZSBhbGxvd3MgOykgQW5kIG1vc3QgcHJvYmFibHkKPj4gaXQgd2lsbCBiZSBh IGRlZGljYXRlZCAndnJhZGlvJyBwcm90b2NvbCB0aGVuLi4uCj4+Pj4gKwo+Pj4+ICsjZGVmaW5l IFhFTkNBTUVSQV9MSVNUX1NFUEFSQVRPUiAgICAgICAiLCIKPj4+PiArI2RlZmluZSBYRU5DQU1F UkFfUkVTT0xVVElPTl9TRVBBUkFUT1IgIngiCj4+Pj4gKyNkZWZpbmUgWEVOQ0FNRVJBX0ZSQU1F X1JBVEVfU0VQQVJBVE9SICIvIgo+Pj4+ICsKPj4+PiArI2RlZmluZSBYRU5DQU1FUkFfRklFTERf QkVfVkVSU0lPTlMgICAgInZlcnNpb25zIgo+Pj4+ICsjZGVmaW5lIFhFTkNBTUVSQV9GSUVMRF9G RV9WRVJTSU9OICAgICAidmVyc2lvbiIKPj4+PiArI2RlZmluZSBYRU5DQU1FUkFfRklFTERfUkVR X1JJTkdfUkVGICAgInJlcS1yaW5nLXJlZiIKPj4+PiArI2RlZmluZSBYRU5DQU1FUkFfRklFTERf UkVRX0NIQU5ORUwgICAgInJlcS1ldmVudC1jaGFubmVsIgo+Pj4+ICsjZGVmaW5lIFhFTkNBTUVS QV9GSUVMRF9FVlRfUklOR19SRUYgICAiZXZ0LXJpbmctcmVmIgo+Pj4+ICsjZGVmaW5lIFhFTkNB TUVSQV9GSUVMRF9FVlRfQ0hBTk5FTCAgICAiZXZ0LWV2ZW50LWNoYW5uZWwiCj4+Pj4gKyNkZWZp bmUgWEVOQ0FNRVJBX0ZJRUxEX0NPTlRST0xTICAgICAgICJjb250cm9scyIKPj4+PiArI2RlZmlu ZSBYRU5DQU1FUkFfRklFTERfRk9STUFUUyAgICAgICAgImZvcm1hdHMiCj4+Pj4gKyNkZWZpbmUg WEVOQ0FNRVJBX0ZJRUxEX0JFX0FMTE9DICAgICAgICJiZS1hbGxvYyIKPj4+PiArI2RlZmluZSBY RU5DQU1FUkFfRklFTERfVU5JUVVFX0lEICAgICAgInVuaXF1ZS1pZCIKPj4+PiArCj4+Pj4gKyNk ZWZpbmUgWEVOQ0FNRVJBX0NUUkxfQlJJR0hUTkVTU19TVFIgICJicmlnaHRuZXNzIgo+Pj4+ICsj ZGVmaW5lIFhFTkNBTUVSQV9DVFJMX0NPTlRSQVNUX1NUUiAgICAiY29udHJhc3QiCj4+Pj4gKyNk ZWZpbmUgWEVOQ0FNRVJBX0NUUkxfU0FUVVJBVElPTl9TVFIgICJzYXR1cmF0aW9uIgo+Pj4+ICsj ZGVmaW5lIFhFTkNBTUVSQV9DVFJMX0hVRV9TVFIgICAgICAgICAiaHVlIgo+Pj4+ICsKPj4+PiAr LyogTWF4aW11bSBudW1iZXIgb2YgYnVmZmVyIHBsYW5lcyBzdXBwb3J0ZWQuICovCj4+Pj4gKyNk ZWZpbmUgWEVOQ0FNRVJBX01BWF9QTEFORSAgICAgICAgICAgIDQKPj4+PiArCj4+Pj4gKy8qCj4+ Pj4gKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioKPj4+PiArICogICAgICAgICAgICAgICAgICAgICAg ICAgIFNUQVRVUyBSRVRVUk4gQ09ERVMKPj4+PiArICoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgo+Pj4+ ICsgKgo+Pj4+ICsgKiBTdGF0dXMgcmV0dXJuIGNvZGUgaXMgemVybyBvbiBzdWNjZXNzIGFuZCAt WEVOX0VYWCBvbiBmYWlsdXJlLgo+Pj4+ICsgKgo+Pj4+ICsgKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Cj4+Pj4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzdW1wdGlvbnMKPj4+PiAr ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKgo+Pj4+ICsgKgo+Pj4+ICsgKiAtIHVzYWdlIG9mIGdyYW50 IHJlZmVyZW5jZSAwIGFzIGludmFsaWQgZ3JhbnQgcmVmZXJlbmNlOgo+Pj4+ICsgKiAgIGdyYW50 IHJlZmVyZW5jZSAwIGlzIHZhbGlkLCBidXQgbmV2ZXIgZXhwb3NlZCB0byBhIFBWIGRyaXZlciwK Pj4+PiArICogICBiZWNhdXNlIG9mIHRoZSBmYWN0IGl0IGlzIGFscmVhZHkgaW4gdXNlL3Jlc2Vy dmVkIGJ5IHRoZSBQViBjb25zb2xlLgo+Pj4+ICsgKiAtIGFsbCByZWZlcmVuY2VzIGluIHRoaXMg ZG9jdW1lbnQgdG8gcGFnZSBzaXplcyBtdXN0IGJlIHRyZWF0ZWQKPj4+PiArICogICBhcyBwYWdl cyBvZiBzaXplIFhFTl9QQUdFX1NJWkUgdW5sZXNzIG90aGVyd2lzZSBub3RlZC4KPj4+PiArICoK Pj4+PiArICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKgo+Pj4+ICsgKiAgICAgICBEZXNjcmlwdGlvbiBv ZiB0aGUgcHJvdG9jb2wgYmV0d2VlbiBmcm9udGVuZCBhbmQgYmFja2VuZCBkcml2ZXIKPj4+PiAr ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKgo+Pj4+ICsgKgo+Pj4+ICsgKiBUaGUgdHdvIGhhbHZlcyBv ZiBhIFBhcmEtdmlydHVhbCBjYW1lcmEgZHJpdmVyIGNvbW11bmljYXRlIHdpdGgKPj4+PiArICog ZWFjaCBvdGhlciB1c2luZyBzaGFyZWQgcGFnZXMgYW5kIGV2ZW50IGNoYW5uZWxzLgo+Pj4+ICsg KiBTaGFyZWQgcGFnZSBjb250YWlucyBhIHJpbmcgd2l0aCByZXF1ZXN0L3Jlc3BvbnNlIHBhY2tl dHMuCj4+Pj4gKyAqCj4+Pj4gKyAqIEFsbCByZXNlcnZlZCBmaWVsZHMgaW4gdGhlIHN0cnVjdHVy ZXMgYmVsb3cgbXVzdCBiZSAwLgo+Pj4+ICsgKgo+Pj4+ICsgKiBGb3IgYWxsIHJlcXVlc3QvcmVz cG9uc2UvZXZlbnQgcGFja2V0czoKPj4+PiArICogICAtIGZyYW1lIHJhdGUgcGFyYW1ldGVyIGlz IHJlcHJlc2VudGVkIGFzIGEgcGFpciBvZiA0IG9jdGV0IGxvbmcKPj4+PiArICogICAgIG51bWVy YXRvciBhbmQgZGVub21pbmF0b3I6Cj4+Pj4gKyAqICAgICAgIC0gZnJhbWVfcmF0ZV9udW1lciAt IHVpbnQzMl90LCBudW1lcmF0b3Igb2YgdGhlIGZyYW1lIHJhdGUKPj4+PiArICogICAgICAgLSBm cmFtZV9yYXRlX2Rlbm9tIC0gdWludDMyX3QsIGRlbm9taW5hdG9yIG9mIHRoZSBmcmFtZSByYXRl Cj4+Pj4gKyAqICAgICBUaGUgY29ycmVzcG9uZGluZyBmcmFtZSByYXRlIChIeikgaXMgY2FsY3Vs YXRlZCBhczoKPj4+PiArICogICAgICAgZnJhbWVfcmF0ZSA9IGZyYW1lX3JhdGVfbnVtZXIgLyBm cmFtZV9yYXRlX2Rlbm9tCj4+Pj4gKyAqICAgLSBidWZmZXIgaW5kZXggaXMgYSB6ZXJvIGJhc2Vk IGluZGV4IG9mIHRoZSBidWZmZXIuIE11c3QgYmUgbGVzcyB0aGFuCj4+Pj4gKyAqICAgICB0aGUg dmFsdWUgb2YgWEVOQ0FNRVJBX09QX1NFVF9DT05GSUcubnVtX2J1ZnMgcmVzcG9uc2U6Cj4+Pj4g KyAqICAgICAgIC0gaW5kZXggLSB1aW50OF90LCBpbmRleCBvZiB0aGUgYnVmZmVyLgo+Pj4+ICsg Kgo+Pj4+ICsgKgo+Pj4+ICsgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVx dWVzdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4+Pj4gKyAqCj4+Pj4gKyAq IEFsbCByZXF1ZXN0IHBhY2tldHMgaGF2ZSB0aGUgc2FtZSBsZW5ndGggKDY0IG9jdGV0cykuCj4+ Pj4gKyAqIEFsbCByZXF1ZXN0IHBhY2tldHMgaGF2ZSBjb21tb24gaGVhZGVyOgo+Pj4+ICsgKiAg ICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAg IDMgICAgICAgIG9jdGV0Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8ICAgICAgICAg ICAgICAgaWQgICAgICAgICAgICAgICAgfCAgICBvcGVyYXRpb24gICB8ICAgcmVzZXJ2ZWQgICAg IHwgNAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgKPj4+PiAr ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqICAgaWQgLSB1aW50MTZfdCwgcHJpdmF0ZSBndWVzdCB2 YWx1ZSwgZWNob2VkIGluIHJlc3BvbnNlLgo+Pj4+ICsgKiAgIG9wZXJhdGlvbiAtIHVpbnQ4X3Qs IG9wZXJhdGlvbiBjb2RlLCBYRU5DQU1FUkFfT1BfWFhYLgo+Pj4+ICsgKgo+Pj4+ICsgKgo+Pj4+ ICsgKiBSZXF1ZXN0IGNvbmZpZ3VyYXRpb24gc2V0L3Jlc2V0IC0gcmVxdWVzdCB0byBzZXQgb3Ig cmVzZXQuCj4+Pj4gKyAqIHRoZSBjb25maWd1cmF0aW9uL21vZGUgb2YgdGhlIGNhbWVyYToKPj4+ PiArICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAg ICAgICAgICAzICAgICAgICBvY3RldAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAg ICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHwgX09QX1NFVF9DT05GSUcgfCAgIHJlc2Vy dmVkICAgICB8IDQKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4 Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHBpeGVsIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTIKPj4+PiArICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lk dGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgo+Pj4+ICsgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKPj4+PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8IDIwCj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsg KiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9yYXRlX251bWVyICAgICAgICAgICAg ICAgICAgICAgICAgIHwgMjQKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAg ICAgICAgICAgICAgICAgICAgIGZyYW1lX3JhdGVfZGVub20gICAgICAgICAgICAgICAgICAgICAg ICAgfCAyOAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAgICBudW1fYnVmcyAgICB8 ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICB8IDMyCj4+ Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzYKPj4+PiArICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCj4+Pj4gKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+ PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8IDY0Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKgo+Pj4+ ICsgKiBQYXNzIGFsbCB6ZXJvcyB0byByZXNldCwgb3RoZXJ3aXNlIGNvbW1hbmQgaXMgdHJlYXRl ZCBhcyBjb25maWd1cmF0aW9uIHNldC4KPj4+PiArICoKPj4+PiArICogcGl4ZWxfZm9ybWF0IC0g dWludDMyX3QsIHBpeGVsIGZvcm1hdCB0byBiZSB1c2VkLCBGT1VSQ0MgY29kZS4KPj4+PiArICog d2lkdGggLSB1aW50MzJfdCwgd2lkdGggaW4gcGl4ZWxzLgo+Pj4+ICsgKiBoZWlnaHQgLSB1aW50 MzJfdCwgaGVpZ2h0IGluIHBpeGVscy4KPj4+PiArICogZnJhbWVfcmF0ZV9udW1lciAtIHVpbnQz Ml90LCBudW1lcmF0b3Igb2YgdGhlIGZyYW1lIHJhdGUuCj4+Pj4gKyAqIGZyYW1lX3JhdGVfZGVu b20gLSB1aW50MzJfdCwgZGVub21pbmF0b3Igb2YgdGhlIGZyYW1lIHJhdGUuCj4+PiBJZiB5b3Ug aGF2ZSB0byBzdXBwb3J0IEhETUkvU0RUViBpbnB1dHMgYXMgd2VsbCwgdGhlbiB5b3UgYWxzbyBu ZWVkIHRvIGtub3cKPj4+IHRoZSBpbnRlcmxhY2VkIGZvcm1hdCwgdW5sZXNzIHlvdSBoYXZlIG5v IHBsYW5zIHRvIHN1cHBvcnQgdGhhdC4KPj4+Cj4+Pj4gKyAqIG51bV9idWZzIC0gdWludDhfdCwg ZGVzaXJlZCBudW1iZXIgb2YgYnVmZmVycyB0byBiZSB1c2VkLgo+Pj4gSHVoPyBXaGF0IGhhcyB0 aGF0IHRvIGRvIHdpdGggdGhlIGZvcm1hdD8gV2h5IHdvdWxkIHlvdSBuZWVkIHRoaXMgaGVyZT8K Pj4gV2VsbCwgdGhlIG9wZXJhdGlvbiBuYW1lIGlzICdzZXRfY29uZmlnJywgbm90ICdzZXRfZm9y bWF0JywKPj4gc28gSSB0aG91Z2h0IHdlIGNhbiBoYXZlIHN1Y2ggYSBjdW11bGF0aXZlIGNvbW1h bmQgYXNzZW1ibGluZwo+PiBhbGwgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGNvbmZpZ3VyYXRpb24u IEJ1dCBub3cgSSBhbSBsb29raW5nIGF0Cj4+IHR1cm5pbmcgdGhpcyBzaW5nbGUgJ3NldF9jb25m aWcnIGNvbW1hbmQgdG8gMyBkaWZmZXJlbnQgY29tbWFuZHMsCj4+IHdoaWNoIGlzIG1vcmUgcHJh Y3RpY2FsIGFuZCBhbGlnbmVkIHdpdGggVjRMMiBpbiBwYXJ0aWN1bGFyIChwbGVhc2UKPj4gc2Vl IGFib3ZlIGluIHRoZSBjb21tYW5kIHNldCk6Cj4+IDEuIHNldCBmb3JtYXQgY29tbWFuZDoKPj4g ICAgKiBwaXhlbF9mb3JtYXQgLSB1aW50MzJfdCwgcGl4ZWwgZm9ybWF0IHRvIGJlIHVzZWQsIEZP VVJDQyBjb2RlLgo+PiAgICAqIHdpZHRoIC0gdWludDMyX3QsIHdpZHRoIGluIHBpeGVscy4KPj4g ICAgKiBoZWlnaHQgLSB1aW50MzJfdCwgaGVpZ2h0IGluIHBpeGVscy4KPj4KPj4gMi4gU2V0IGZy YW1lIHJhdGUgY29tbWFuZDoKPj4gICAgKyAqIGZyYW1lX3JhdGVfbnVtZXIgLSB1aW50MzJfdCwg bnVtZXJhdG9yIG9mIHRoZSBmcmFtZSByYXRlLgo+PiAgICArICogZnJhbWVfcmF0ZV9kZW5vbSAt IHVpbnQzMl90LCBkZW5vbWluYXRvciBvZiB0aGUgZnJhbWUgcmF0ZS4KPj4KPj4gMy4gU2V0L3Jl cXVlc3QgbnVtIGJ1ZnM6Cj4+ICAgICogbnVtX2J1ZnMgLSB1aW50OF90LCBkZXNpcmVkIG51bWJl ciBvZiBidWZmZXJzIHRvIGJlIHVzZWQuCj4gSSBsaWtlIHRoaXMgbXVjaCBiZXR0ZXIuIDErMiBj b3VsZCBiZSBjb21iaW5lZCwgYnV0IDMgc2hvdWxkIGRlZmluaXRlbHkgcmVtYWluCj4gc2VwYXJh dGUuCm9rLCB0aGVuIDErMiBjb21iaW5lZCArIDMgc2VwYXJhdGUuCkRvIHlvdSB0aGluayB3ZSBj YW4gc3RpbGwgbmFtZSAxKzIgYXMgInNldF9mb3JtYXQiIG9yICJzZXRfY29uZmlnIgp3aWxsIGZp dCBiZXR0ZXI/Cj4KPj4+PiArICoKPj4+PiArICogU2VlIHJlc3BvbnNlIGZvcm1hdCBmb3IgdGhp cyByZXF1ZXN0Lgo+Pj4+ICsgKgo+Pj4+ICsgKiBOb3RlczoKPj4+PiArICogIC0gZnJvbnRlbmQg bXVzdCBjaGVjayB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZSBpbiBvcmRlciB0byBzZWUKPj4+ PiArICogICAgaWYgdGhlIHZhbHVlcyByZXBvcnRlZCBiYWNrIGJ5IHRoZSBiYWNrZW5kIGRvIG1h dGNoIHRoZSBkZXNpcmVkIG9uZXMKPj4+PiArICogICAgYW5kIGNhbiBiZSBhY2NlcHRlZC4KPj4+ PiArICogIC0gZnJvbnRlbmQgbWF5IHNlbmQgbXVsdGlwbGUgWEVOQ0FNRVJBX09QX1NFVF9DT05G SUcgcmVxdWVzdHMgYmVmb3JlCj4+Pj4gKyAqICAgIHNlbmRpbmcgWEVOQ0FNRVJBX09QX1NUUkVB TV9TVEFSVCByZXF1ZXN0IHRvIHVwZGF0ZSBvciB0dW5lIHRoZQo+Pj4+ICsgKiAgICBjb25maWd1 cmF0aW9uLgo+Pj4+ICsgKi8KPj4+PiArc3RydWN0IHhlbmNhbWVyYV9jb25maWcgewo+Pj4+ICsg ICAgdWludDMyX3QgcGl4ZWxfZm9ybWF0Owo+Pj4+ICsgICAgdWludDMyX3Qgd2lkdGg7Cj4+Pj4g KyAgICB1aW50MzJfdCBoZWlnaHQ7Cj4+Pj4gKyAgICB1aW50MzJfdCBmcmFtZV9yYXRlX25vbTsK Pj4+PiArICAgIHVpbnQzMl90IGZyYW1lX3JhdGVfZGVub207Cj4+Pj4gKyAgICB1aW50OF90IG51 bV9idWZzOwo+Pj4+ICt9Owo+Pj4+ICsKPj4+PiArLyoKPj4+PiArICogUmVxdWVzdCBidWZmZXIg ZGV0YWlscyAtIHJlcXVlc3QgY2FtZXJhIGJ1ZmZlcidzIG1lbW9yeSBsYXlvdXQuCj4+Pj4gKyAq IGRldGFpbGVkIGRlc2NyaXB0aW9uOgo+Pj4+ICsgKiAgICAgICAgIDAgICAgICAgICAgICAgICAg MSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0Cj4+Pj4gKyAq ICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAg fF9HRVRfQlVGX0RFVEFJTFN8ICAgcmVzZXJ2ZWQgICAgIHwgNAo+Pj4+ICsgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKPj4+PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8IDgKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAq IHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvfAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 IDY0Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKgo+Pj4+ICsgKiBTZWUgcmVzcG9uc2Ug Zm9ybWF0IGZvciB0aGlzIHJlcXVlc3QuCj4+Pj4gKyAqCj4+Pj4gKyAqCj4+Pj4gKyAqIFJlcXVl c3QgY2FtZXJhIGJ1ZmZlciBjcmVhdGlvbjoKPj4+PiArICogICAgICAgICAwICAgICAgICAgICAg ICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAo+Pj4+ ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAg ICAgIHwgX09QX0JVRl9DUkVBVEUgfCAgIHJlc2VydmVkICAgICB8IDQKPj4+PiArICogKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ ICsgKiB8ICAgICAgaW5kZXggICAgIHwgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAg ICAgICAgICAgICAgICAgIHwgMTIKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAg ICAgICAgICAgICAgICAgICAgICAgICBncmVmX2RpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAxNgo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIw Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKPj4+PiArICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVk ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsK Pj4+PiArICoKPj4+PiArICogQW4gYXR0ZW1wdCB0byBjcmVhdGUgbXVsdGlwbGUgYnVmZmVycyB3 aXRoIHRoZSBzYW1lIGluZGV4IGlzIGFuIGVycm9yLgo+Pj4+ICsgKiBpbmRleCBjYW4gYmUgcmUt dXNlZCBhZnRlciBkZXN0cm95aW5nIHRoZSBjb3JyZXNwb25kaW5nIGNhbWVyYSBidWZmZXIuCj4+ Pj4gKyAqCj4+Pj4gKyAqIGluZGV4IC0gdWludDhfdCwgaW5kZXggb2YgdGhlIGJ1ZmZlciB0byBi ZSBjcmVhdGVkLgo+Pj4+ICsgKiBncmVmX2RpcmVjdG9yeSAtIGdyYW50X3JlZl90LCBhIHJlZmVy ZW5jZSB0byB0aGUgZmlyc3Qgc2hhcmVkIHBhZ2UKPj4+PiArICogICBkZXNjcmliaW5nIHNoYXJl ZCBidWZmZXIgcmVmZXJlbmNlcy4gVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBpcyBlcXVhbCB0bwo+ Pj4+ICsgKiAgIFhFTkNBTUVSQV9PUF9HRVRfQlVGX0RFVEFJTFMuc2l6ZSByZXNwb25zZS4gQXQg bGVhc3Qgb25lIHBhZ2UgZXhpc3RzLiBJZgo+Pj4+ICsgKiAgIHNoYXJlZCBidWZmZXIgc2l6ZSBl eGNlZWRzIHdoYXQgY2FuIGJlIGFkZHJlc3NlZCBieSB0aGlzIHNpbmdsZSBwYWdlLAo+Pj4+ICsg KiAgIHRoZW4gcmVmZXJlbmNlIHRvIHRoZSBuZXh0IHNoYXJlZCBwYWdlIG11c3QgYmUgc3VwcGxp ZWQgKHNlZQo+Pj4+ICsgKiAgIGdyZWZfZGlyX25leHRfcGFnZSBiZWxvdykuCj4+PiBJdCBtaWdo dCBiZSBiZXR0ZXIgdG8gYWxsb2NhdGUgYWxsIGJ1ZmZlcnMgaW4gb25lIGdvLCBpLmUuIHdoYXQg VklESU9DX1JFUUJVRlMKPj4+IGRvZXMuCj4+IFdlbGwsIEkgc3RpbGwgdGhpbmsgaXQgaXMgYmV0 dGVyIHRvIGhhdmUgYSBwZXIgYnVmZmVyIGludGVyZmFjZQo+PiBpbiB0aGUgcHJvdG9jb2wgYXMg aXQgaXMgZG9uZSBmb3Igb3RoZXIgWGVuIHZpcnR1YWwgZGV2aWNlcy4KPj4gU28sIEknbGwga2Vl cCB0aGlzIGFzIGlzIGZvciBub3c6IFZJRElPQ19SRVFCVUZTIGNhbiBzdGlsbCBkbwo+PiB3aGF0 IGl0IGRvZXMgaW50ZXJuYWxseSBpbiB0aGUgZnJvbnRlbmQgZHJpdmVyCj4gSSBtYXkgaGF2ZSBt aXN1bmRlcnN0b29kIHRoZSBvcmlnaW5hbCBBUEkuIFRoZSBuZXdseSBwcm9wb3NlZCBYRU5DQU1F UkFfT1BfQlVGX1JFUVVFU1QKPiBtYXBzIHRvIFJFUUJVRlMsIHJpZ2h0PyBBbmQgdGhlbiBCVUZf Q1JFQVRFL0RFU1RST1kganVzdCBzZXQgdXAgdGhlIHNoYXJlZCBidWZmZXIKPiBtYXBwaW5ncyBm b3IgdGhlIGJ1ZmZlcnMgY3JlYXRlZCBieSBSRVFCVUZTLiBJZiB0aGF0J3MgdGhlIHNlcXVlbmNl LCB0aGVuIGl0IG1ha2VzCj4gc2Vuc2UuIEknbSBub3Qgc3VyZSBhYm91dCB0aGUgbmFtaW5nLgo+ Cj4gWW91IG1pZ2h0IHdhbnQgdG8gbWFrZSBpdCBjbGVhciB0aGF0IFhFTkNBTUVSQV9PUF9CVUZf UkVRVUVTVCBhbGxvY2F0ZXMgdGhlIGJ1ZmZlcnMKPiBvbiB0aGUgYmFja2VuZCwgYW5kIHNvIGNh biBmYWlsLiBBbHNvLCB0aGUgYWN0dWFsIG51bWJlciBvZiBhbGxvY2F0ZWQgYnVmZmVycyBpbgo+ IGNhc2Ugb2Ygc3VjY2VzcyBjYW4gYmUgbW9yZSBvciBsZXNzIHRoYW4gd2hhdCB3YXMgcmVxdWVz dGVkLgpUaGUgYnVmZmVycyBjYW4gYmUgYWxsb2NhdGVkIGFuZCBzaGFyZWQgYnkgZWl0aGVyIGJh Y2tlbmQgb3IgZnJvbnRlbmQ6IHNlZQoiYmUtYWxsb2MiIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHRl bGxpbmcgd2hpY2ggZG9tYWluIChWTSkgc2hhcmVzCnRoZSBYZW4gZ3JhbnQgcmVmZXJlbmNlcyB0 byB0aGUgcGFnZXMgb2YgdGhlIGJ1ZmZlcjogZWl0aGVyIGZyb250ZW5kCm9yIGJhY2tlbmQuCgpT bywgSSB3YXMgbW9yZSB0aGlua2luZyB0aGF0IGluIGNhc2Ugb2YgVjRMMiBiYXNlZCBmcm9udGVu ZCBkcml2ZXI6CjEuIEZyb250ZW5kIHNlcnZlcyBSRVFCVUZTIGlvY3RsIGFuZCBhc2tzIHRoZSBi YWNrZW5kIHdpdGggClhFTkNBTUVSQV9PUF9CVUZfUkVRVUVTVAppZiBpdCBjYW4gaGFuZGxlIHRo YXQgbWFueSBidWZmZXJzIGFuZCBnZXRzIG51bWJlciBvZiBidWZmZXJzIHRvIGJlIHVzZWQKYW5k IGJ1ZmZlciBzdHJ1Y3R1cmUgKG51bWJlciBvZiBwbGFuZXMsIHNpemVzLCBvZmZzZXRzIGV0Yy4p IGFzIHRoZSByZXBseQp0byB0aGF0IHJlcXVlc3QKMi4gRnJvbnRlbmQgY3JlYXRlcyBuIGJ1ZmZl cnMgd2l0aCBYRU5DQU1FUkFfT1BfQlVGX0NSRUFURQozLiBGcm9udGVuZCByZXR1cm5zIGZyb20g UkVRQlVGUyBpb2N0bCB3aXRoIGFjdHVhbCBudW1iZXIgb2YgYnVmZmVycwphbGxvY2F0ZWQKPj4+ PiArICoKPj4+PiArICogSWYgWEVOQ0FNRVJBX0ZJRUxEX0JFX0FMTE9DIGNvbmZpZ3VyYXRpb24g ZW50cnkgaXMgc2V0LCB0aGVuIGJhY2tlbmQgd2lsbAo+Pj4+ICsgKiBhbGxvY2F0ZSB0aGUgYnVm ZmVyIHdpdGggdGhlIHBhcmFtZXRlcnMgcHJvdmlkZWQgaW4gdGhpcyByZXF1ZXN0IGFuZCBwYWdl Cj4+Pj4gKyAqIGRpcmVjdG9yeSBpcyBoYW5kbGVkIGFzIGZvbGxvd3M6Cj4+Pj4gKyAqICAgRnJv bnRlbmQgb24gcmVxdWVzdDoKPj4+PiArICogICAgIC0gYWxsb2NhdGVzIHBhZ2VzIGZvciB0aGUg ZGlyZWN0b3J5IChncmVmX2RpcmVjdG9yeSwKPj4+PiArICogICAgICAgZ3JlZl9kaXJfbmV4dF9w YWdlKHMpCj4+Pj4gKyAqICAgICAtIGdyYW50cyBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhZ2VzIG9m IHRoZSBkaXJlY3RvcnkgdG8gdGhlIGJhY2tlbmQKPj4+PiArICogICAgIC0gc2V0cyBncmVmX2Rp cl9uZXh0X3BhZ2UgZmllbGRzCj4+Pj4gKyAqICAgQmFja2VuZCBvbiByZXNwb25zZToKPj4+PiAr ICogICAgIC0gZ3JhbnRzIHBlcm1pc3Npb25zIGZvciB0aGUgcGFnZXMgb2YgdGhlIGJ1ZmZlciBh bGxvY2F0ZWQgdG8KPj4+PiArICogICAgICAgdGhlIGZyb250ZW5kCj4+Pj4gKyAqICAgICAtIGZp bGxzIGluIHBhZ2UgZGlyZWN0b3J5IHdpdGggZ3JhbnQgcmVmZXJlbmNlcwo+Pj4+ICsgKiAgICAg ICAoZ3JlZltdIGluIHN0cnVjdCB4ZW5jYW1lcmFfcGFnZV9kaXJlY3RvcnkpCj4+Pj4gKyAqLwo+ Pj4+ICtzdHJ1Y3QgeGVuY2FtZXJhX2J1Zl9jcmVhdGVfcmVxIHsKPj4+PiArICAgIHVpbnQ4X3Qg aW5kZXg7Cj4+Pj4gKyAgICB1aW50OF90IHJlc2VydmVkWzNdOwo+Pj4+ICsgICAgZ3JhbnRfcmVm X3QgZ3JlZl9kaXJlY3Rvcnk7Cj4+Pj4gK307Cj4+Pj4gKwo+Pj4+ICsvKgo+Pj4+ICsgKiBTaGFy ZWQgcGFnZSBmb3IgWEVOQ0FNRVJBX09QX0JVRl9DUkVBVEUgYnVmZmVyIGRlc2NyaXB0b3IgKGdy ZWZfZGlyZWN0b3J5IGluCj4+Pj4gKyAqIHRoZSByZXF1ZXN0KSBlbXBsb3lzIGEgbGlzdCBvZiBw YWdlcywgZGVzY3JpYmluZyBhbGwgcGFnZXMgb2YgdGhlIHNoYXJlZAo+Pj4+ICsgKiBkYXRhIGJ1 ZmZlcjoKPj4+PiArICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAg IDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+ PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgIGdyZWZfZGlyX25leHRfcGFnZSAgICAgICAg ICAgICAgICAgICAgICAgICB8IDQKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBncmVmWzBdICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCA4Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8L1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKPj4+ PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBncmVmW2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpKjQrOAo+Pj4+ICsgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKPj4+PiArICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ Pj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVmW04gLSAxXSAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgTio0KzgKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAq Cj4+Pj4gKyAqIGdyZWZfZGlyX25leHRfcGFnZSAtIGdyYW50X3JlZl90LCByZWZlcmVuY2UgdG8g dGhlIG5leHQgcGFnZSBkZXNjcmliaW5nCj4+Pj4gKyAqICAgcGFnZSBkaXJlY3RvcnkuIE11c3Qg YmUgMCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBwYWdlcyBpbiB0aGUgbGlzdC4KPj4+PiArICogZ3Jl ZltpXSAtIGdyYW50X3JlZl90LCByZWZlcmVuY2UgdG8gYSBzaGFyZWQgcGFnZSBvZiB0aGUgYnVm ZmVyCj4+Pj4gKyAqICAgYWxsb2NhdGVkIGF0IFhFTkNBTUVSQV9PUF9CVUZfQ1JFQVRFLgo+Pj4+ ICsgKgo+Pj4+ICsgKiBOdW1iZXIgb2YgZ3JhbnRfcmVmX3QgZW50cmllcyBpbiB0aGUgd2hvbGUg cGFnZSBkaXJlY3RvcnkgaXMgbm90Cj4+Pj4gKyAqIHBhc3NlZCwgYnV0IGluc3RlYWQgY2FuIGJl IGNhbGN1bGF0ZWQgYXM6Cj4+Pj4gKyAqICAgbnVtX2dyZWZzX3RvdGFsID0gKFhFTkNBTUVSQV9P UF9HRVRfQlVGX0RFVEFJTFMuc2l6ZSArIFhFTl9QQUdFX1NJWkUgLSAxKSAvCj4+Pj4gKyAqICAg ICAgIFhFTl9QQUdFX1NJWkUKPj4+PiArICovCj4+Pj4gK3N0cnVjdCB4ZW5jYW1lcmFfcGFnZV9k aXJlY3Rvcnkgewo+Pj4+ICsgICAgZ3JhbnRfcmVmX3QgZ3JlZl9kaXJfbmV4dF9wYWdlOwo+Pj4+ ICsgICAgZ3JhbnRfcmVmX3QgZ3JlZlsxXTsgLyogVmFyaWFibGUgbGVuZ3RoICovCj4+Pj4gK307 Cj4+Pj4gKwo+Pj4+ICsvKgo+Pj4+ICsgKiBSZXF1ZXN0IGJ1ZmZlciBkZXN0cnVjdGlvbiAtIGRl c3Ryb3kgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCBjYW1lcmEgYnVmZmVyOgo+Pj4+ICsgKiAgICAg ICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMg ICAgICAgIG9jdGV0Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8ICAgICAgICAgICAg ICAgaWQgICAgICAgICAgICAgICAgfCBfT1BfQlVGX0RFU1RST1l8ICAgcmVzZXJ2ZWQgICAgIHwg NAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgKPj4+PiArICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICBpbmRleCAgICAgfCAgICAgICAgICAgICAgICAg ICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgfCAxMgo+Pj4+ICsgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKPj4+PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8IDE2Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsg KiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL3wKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCA2NAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICoKPj4+PiArICogaW5kZXggLSB1aW50 OF90LCBpbmRleCBvZiB0aGUgYnVmZmVyIHRvIGJlIGRlc3Ryb3llZC4KPj4+PiArICovCj4+PiBU aGVyZSBpcyBubyBWNEwyIGlvY3RsIHRvIGRlc3Ryb3kgc3BlY2lmaWMgYnVmZmVycy4gWW91IGNh biBvbmx5IGRlc3Ryb3kgYWxsCj4+PiBvZiB0aGVtLgo+PiBUaGlzIGlzIG5vdCBzcGVjaWZpY2Fs bHkgcmVsYXRlZCB0byBWNEwyLCBidXQgY2FuIGJlIGlzc3VlZAo+PiBpbiByZXNwb25zZSB0byBi YWNrZW5kJ3Mgc3RhdGUgY2hhbmdlIGV0Yy4KPj4gU28sIHdlIGhhdmUgYSBwYWlyIG9mIGNvbW1h bmRzIHRvIGNyZWF0ZSBhbmQgZGVzdHJveSBidWZmZXJzLgo+PiBFdmVuIG1vcmUsIGZyb250ZW5k IGNhbiBiZSBhIHNvbWUtb3MtYmFzZWQtZHJpdmVyLCBub3QgVjRMMgo+PiBiYXNlZC4gT3IgZXZl biBhIHVzZXItc3BhY2UgYXBwbGljYXRpb24gaWYgeW91ciB3aWxsLgo+Pj4+ICsKPj4+PiArc3Ry dWN0IHhlbmNhbWVyYV9idWZfZGVzdHJveV9yZXEgewo+Pj4+ICsgICAgdWludDhfdCBpbmRleDsK Pj4+PiArfTsKPj4+PiArCj4+Pj4gKy8qCj4+Pj4gKyAqIFJlcXVlc3QgY2FtZXJhIGNhcHR1cmUg c3RyZWFtIHN0YXJ0Ogo+Pj4+ICsgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAg ICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0Cj4+Pj4gKyAqICstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKwo+Pj4+ICsgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgfF9PUF9TVFJF QU1fU1RBUlR8ICAgcmVzZXJ2ZWQgICAgIHwgNAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiAr ICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8IDgKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvfAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDY0Cj4+Pj4g KyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKgo+Pj4+ICsgKgo+Pj4+ICsgKiBSZXF1ZXN0IGNhbWVy YSBjYXB0dXJlIHN0cmVhbSBzdG9wOgo+Pj4+ICsgKiAgICAgICAgIDAgICAgICAgICAgICAgICAg MSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0Cj4+Pj4gKyAq ICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAg fF9PUF9TVFJFQU1fU1RPUCB8ICAgcmVzZXJ2ZWQgICAgIHwgNAo+Pj4+ICsgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKPj4+PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8IDgKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAq IHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvfAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 IDY0Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKgo+Pj4+ICsgKgo+Pj4+ICsgKiBSZXF1 ZXN0IGNhbWVyYSBjb250cm9sIGRldGFpbHM6Cj4+Pj4gKyAqICAgICAgICAgMCAgICAgICAgICAg ICAgICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKPj4+ PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAg ICAgICB8R0VUX0NUUkxfREVUQUlMU3wgICByZXNlcnZlZCAgICAgfCA0Cj4+Pj4gKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKwo+Pj4+ICsgKiB8ICAgICAgaW5kZXggICAgIHwgICAgICAgICAgICAgICAgICAgICBy ZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgIHwgMTIKPj4+PiArICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ Pj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAxNgo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC98Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjQK Pj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqCj4+Pj4gKyAqIFNlZSByZXNwb25zZSBmb3Jt YXQgZm9yIHRoaXMgcmVxdWVzdC4KPj4+PiArICoKPj4+PiArICogaW5kZXggLSB1aW50OF90LCBp bmRleCBvZiB0aGUgY29udHJvbCB0byBiZSBxdWVyaWVkLgo+Pj4+ICsgKi8KPj4+PiArc3RydWN0 IHhlbmNhbWVyYV9nZXRfY3RybF9kZXRhaWxzX3JlcSB7Cj4+Pj4gKyAgICB1aW50OF90IGluZGV4 Owo+Pj4+ICt9Owo+Pj4+ICsKPj4+PiArLyoKPj4+PiArICoKPj4+PiArICogUmVxdWVzdCBjYW1l cmEgY29udHJvbCBjaGFuZ2U6Cj4+Pj4gKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAg ICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKPj4+PiArICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAgICAgICB8ICBf T1BfU0VUX0NUUkwgIHwgICByZXNlcnZlZCAgICAgfCA0Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ Pj4+ICsgKiB8ICAgICAgaW5kZXggICAgIHwgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAg ICAgICAgICAgICAgICAgICAgIHwgMTIKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAxNgo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 IDIwCj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKPj4+PiArICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2Vy dmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAo+Pj4+ICsgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKPj4+PiArICoKPj4+PiArICogU2VlIHJlc3BvbnNlIGZvcm1hdCBmb3IgdGhpcyByZXF1ZXN0 Lgo+Pj4+ICsgKgo+Pj4+ICsgKiBpbmRleCAtIHVpbnQ4X3QsIGluZGV4IG9mIHRoZSBjb250cm9s Lgo+Pj4+ICsgKiB2YWx1ZSAtIGludDMyX3QsIG5ldyB2YWx1ZSBvZiB0aGUgY29udHJvbC4KPj4+ IEkgd291bGQgcmVjb21tZW5kIHVzaW5nIGEgaW50NjRfdCBhcyB0aGUgY29udHJvbCB2YWx1ZS4K Pj4gR29vZCBwb2ludCwgdGhhbmsgeW91Cj4+PiBOb3RlIHRoYXQgdGhlcmUgYXJlIGFsc28gY29u dHJvbHMgd2l0aCBhIHBheWxvYWQgKGUuZy4gc3RyaW5nIGNvbnRyb2xzKS4KPj4gQ291bGQgeW91 IHBsZWFzZSBnaXZlIG1lIGFuIGV4YW1wbGUgb2Ygc3VjaCBhIGNvbnRyb2w/Cj4+IERvIHlvdSB0 aGluayBzdWNoIGNvbnRyb2xzIGNhbiBiZSBvZiB1c2UgaW4gYSBWTT8KPj4gQ2FuIHdlIGF2b2lk IHN1Y2ggY29udHJvbHMgaWYgd2UgdGFyZ2V0IGEgc2ltcGxlIHZpcnR1YWwKPj4gY2FtZXJhIGRl dmljZT8gSWYgdGhpcyBpcyBmb3IgcmFkaW8gdXNlLWNhc2UsIHRoZW4gd2UnbGwKPj4gaGF2ZSBz dWNoIHN1cHBvcnQgaW4gJ3ZyYWRpbycgcHJvdG9jb2wgaWYgbmVlZCBiZQo+IFJpZ2h0IG5vdyBh bGwgc3RyaW5nIGNvbnRyb2xzIGFyZSByZWxhdGVkIHRvIFJEUyByZWNlaXZlcnMvdHJhbnNtaXR0 ZXJzLiBJZiB5b3UKPiBldmVyIGRlY2lkZSBvbiBhIHZyYWRpbyBwcm90b2NvbCwgdGhlbiB5b3Ug bmVlZCB0aGVzZSAoUHJvZ3JhbW1lIFNlcnZpY2UgbmFtZQo+IGFuZCBSYWRpbyBUZXh0IGluZm8p LiBBbmQgdGhlcmUgaXMgYW4gYXJyYXkgb2YgQWx0ZXJuYXRlIEZyZXF1ZW5jaWVzLCBhbHNvIFJE Uwo+IHNwZWNpZmljLgo+Cj4gVGhlcmUgYXJlIHNvbWUgYXJyYXkgY29udHJvbHMgaW4gVjRMMiwg dGhvc2UgYXJlIHVzZWQgdG8gY29udHJvbCBtb3Rpb24gZGV0ZWN0aW9uCj4gZm9yIHN1cnZlaWxs YW5jZSBjYW1lcmFzLiBBbmQgJ2NvbXBvdW5kIGNvbnRyb2xzJyAodGhpbmsgb2YgdGhpcyBhcyBD IHN0cnVjdHMpIGFyZQo+IGFwcGVhcmluZyBmb3IgSFcgY29kZWNzLgo+Cj4gSSBkb24ndCB0aGlu ayBhbnkgb2YgdGhlc2UgYXJlIGxpa2VseSB0byBhcHBlYXIgZm9yIGNhbWVyYXMsIGF0IGxlYXN0 IG5vdCBpbiBhCj4gd2F5IHRoYXQgaXMgcmVsZXZhbnQgZm9yIFhlbi4Kb2sKPj4+IElmIHRoZXJl IGlzIGV2ZXIgaW50ZXJlc3QgaW4gYWRkaW5nIHJhZGlvL1JEUyBzdXBwb3J0LCB0aGVuIHRoYXQg d2lsbCBiZWNvbWUKPj4+IGFuIGlzc3VlLgo+PiBZb3UgbWVhbiBzb21ldGhpbmcgbGlrZSBzdGF0 aW9uIG5hbWVzLCBhZHMgZXRjPwo+IFl1cC4KPgo+Pj4+ICsgKi8KPj4+PiArc3RydWN0IHhlbmNh bWVyYV9zZXRfY3RybF9yZXEgewo+Pj4+ICsgICAgdWludDhfdCBpbmRleDsKPj4+PiArICAgIHVp bnQ4X3QgcmVzZXJ2ZWRbM107Cj4+Pj4gKyAgICBpbnQzMl90IHZhbHVlOwo+Pj4+ICt9Owo+Pj4+ ICsKPj4+PiArLyoKPj4+PiArICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJl c3BvbnNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+Pj4+ICsgKgo+Pj4+ICsg KiBBbGwgcmVzcG9uc2UgcGFja2V0cyBoYXZlIHRoZSBzYW1lIGxlbmd0aCAoNjQgb2N0ZXRzKS4K Pj4+PiArICoKPj4+PiArICogQWxsIHJlc3BvbnNlIHBhY2tldHMgaGF2ZSBjb21tb24gaGVhZGVy Ogo+Pj4+ICsgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAg ICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsg KiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgfCAgICBvcGVyYXRpb24gICB8ICAg IHJlc2VydmVkICAgIHwgNAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8IDgKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqCj4+Pj4gKyAqIGlkIC0gdWludDE2 X3QsIGNvcGllZCBmcm9tIHRoZSByZXF1ZXN0Lgo+Pj4+ICsgKiBvcGVyYXRpb24gLSB1aW50OF90 LCBYRU5DQU1FUkFfT1BfKiAtIGNvcGllZCBmcm9tIHJlcXVlc3QuCj4+Pj4gKyAqIHN0YXR1cyAt IGludDMyX3QsIHJlc3BvbnNlIHN0YXR1cywgemVybyBvbiBzdWNjZXNzIGFuZCAtWEVOX0VYWCBv biBmYWlsdXJlLgo+Pj4+ICsgKgo+Pj4+ICsgKgo+Pj4+ICsgKiBTZXQgY29uZmlndXJhdGlvbiBy ZXNwb25zZSAtIHJlc3BvbnNlIGZvciBYRU5DQU1FUkFfT1BfU0VUX0NPTkZJRzoKPj4+PiArICog ICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAg ICAzICAgICAgICBvY3RldAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAgICAgICAg ICAgICAgIGlkICAgICAgICAgICAgICAgIHwgX09QX1NFVF9DT05GSUcgfCAgICByZXNlcnZlZCAg ICB8IDQKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4Cj4+Pj4g KyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBp eGVsIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTIKPj4+PiArICogKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+ PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8IDIwCj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8ICAg ICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9yYXRlX251bWVyICAgICAgICAgICAgICAgICAg ICAgICAgIHwgMjQKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAgICAg ICAgICAgICAgICAgIGZyYW1lX3JhdGVfZGVub20gICAgICAgICAgICAgICAgICAgICAgICAgfCAy OAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAgICBudW1fYnVmcyAgICB8ICAgICAg ICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICB8IDMyCj4+Pj4gKyAq ICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVz ZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzYKPj4+PiArICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCj4+Pj4gKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICog fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8IDY0Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKgo+Pj4+ICsgKiBN ZWFuaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBpbiB0aGlzIHJlc3BvbnNlIGlzIHRo ZSBzYW1lIGFzIGZvcgo+Pj4+ICsgKiBYRU5DQU1FUkFfT1BfU0VUX0NPTkZJRyByZXF1ZXN0Lgo+ Pj4+ICsgKgo+Pj4+ICsgKgo+Pj4+ICsgKiBSZXF1ZXN0IGJ1ZmZlciBkZXRhaWxzIHJlc3BvbnNl IC0gcmVzcG9uc2UgZm9yIFhFTkNBTUVSQV9PUF9HRVRfQlVGX0RFVEFJTFMKPj4+PiArICogcmVx dWVzdDoKPj4+PiArICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAg IDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+ PiArICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHxfR0VUX0JVRl9ERVRBSUxT fCAgICByZXNlcnZlZCAgICB8IDQKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCA4Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTIK Pj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICBudW1fcGxhbmVzICAgfCAgICAgICAg ICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgfCAxNgo+Pj4+ICsgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKPj4+PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfb2Zm c2V0WzBdICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIwCj4+Pj4gKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Kwo+Pj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV9vZmZzZXRbMV0gICAg ICAgICAgICAgICAgICAgICAgICAgIHwgMjQKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAq IHwgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lX29mZnNldFsyXSAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAyOAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAgICAgICAg ICAgICAgICAgICAgICAgICAgcGxhbmVfb2Zmc2V0WzNdICAgICAgICAgICAgICAgICAgICAgICAg ICB8IDMyCj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8ICAgICAgICAgICAgICAgICAg ICAgICAgICAgcGxhbmVfc2l6ZVswXSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzYKPj4+ PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBw bGFuZV9zaXplWzFdICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA0MAo+Pj4+ICsgKiArLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSsKPj4+PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lX3NpemVb Ml0gICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQ0Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ Pj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfc2l6ZVszXSAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgNDgKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwg ICAgICAgICBwbGFuZV9zdHJpZGVbMF0gICAgICAgICB8ICAgICAgICAgcGxhbmVfc3RyaWRlWzFd ICAgICAgICAgfCA1Mgo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAgICAgICAgIHBs YW5lX3N0cmlkZVsyXSAgICAgICAgIHwgICAgICAgICBwbGFuZV9zdHJpZGVbM10gICAgICAgICB8 IDU2Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjAKPj4+PiAr ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBy ZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAo+Pj4+ICsgKiArLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSsKPj4+PiArICoKPj4+PiArICogc2l6ZSAtIHVpbnQzMl90LCBvdmVyYWxsIHNpemUgb2Yg dGhlIGJ1ZmZlciBpbmNsdWRpbmcgc2l6ZXMgb2YgdGhlCj4+Pj4gKyAqICAgaW5kaXZpZHVhbCBw bGFuZXMgYW5kIHBhZGRpbmcgaWYgYXBwbGljYWJsZS4KPj4+PiArICogbnVtX3BsYW5lcyAtIHVp bnQ4X3QsIG51bWJlciBvZiBwbGFuZXMgZm9yIHRoaXMgYnVmZmVyLgo+Pj4+ICsgKiBwbGFuZV9v ZmZzZXQgLSBhcnJheSBvZiB1aW50MzJfdCwgb2Zmc2V0IG9mIHRoZSBjb3JyZXNwb25kaW5nIHBs YW5lCj4+Pj4gKyAqICAgaW4gb2N0ZXRzIGZyb20gdGhlIGJ1ZmZlciBzdGFydC4KPj4+PiArICog cGxhbmVfc2l6ZSAtIGFycmF5IG9mIHVpbnQzMl90LCBzaXplIGluIG9jdGV0cyBvZiB0aGUgY29y cmVzcG9uZGluZyBwbGFuZQo+Pj4+ICsgKiAgIGluY2x1ZGluZyBwYWRkaW5nLgo+Pj4+ICsgKiBw bGFuZV9zdHJpZGUgLSBhcnJheSBvZiB1aW50MzJfdCwgc2l6ZSBpbiBvY3RldHMgb2NjdXBpZWQg YnkgdGhlCj4+Pj4gKyAqICAgY29ycmVzcG9uZGluZyBzaW5nbGUgaW1hZ2UgbGluZSBpbmNsdWRp bmcgcGFkZGluZyBpZiBhcHBsaWNhYmxlLgo+Pj4gTmljZSEKPj4gVGhhbmsgeW91Cj4+Pj4gKyAq Lwo+Pj4+ICtzdHJ1Y3QgeGVuY2FtZXJhX2J1Zl9kZXRhaWxzX3Jlc3Agewo+Pj4+ICsgICAgdWlu dDMyX3Qgc2l6ZTsKPj4+PiArICAgIHVpbnQ4X3QgbnVtX3BsYW5lczsKPj4+PiArICAgIHVpbnQ4 X3QgcmVzZXJ2ZWRbM107Cj4+Pj4gKyAgICB1aW50MzJfdCBwbGFuZV9vZmZzZXRbWEVOQ0FNRVJB X01BWF9QTEFORV07Cj4+Pj4gKyAgICB1aW50MzJfdCBwbGFuZV9zaXplW1hFTkNBTUVSQV9NQVhf UExBTkVdOwo+Pj4+ICsgICAgdWludDE2X3QgcGxhbmVfc3RyaWRlW1hFTkNBTUVSQV9NQVhfUExB TkVdOwo+Pj4+ICt9Owo+Pj4+ICsKPj4+PiArLyoKPj4+PiArICogR2V0IGNvbnRyb2wgZGV0YWls cyByZXNwb25zZSAtIHJlc3BvbnNlIGZvciBYRU5DQU1FUkFfT1BfR0VUX0NUUkxfREVUQUlMUzoK Pj4+PiArICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAg ICAgICAgICAgICAzICAgICAgICBvY3RldAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICog fCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHxHRVRfQ1RSTF9ERVRBSUxTfCAgICBy ZXNlcnZlZCAgICB8IDQKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCA4Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8ICAgICBpbmRleCAgICAgIHwgICAg ICB0eXBlICAgICAgfCAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgIHwgMTIKPj4+PiAr ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IG1pbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgo+Pj4+ICsgKiArLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSsKPj4+PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIwCj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgMjQKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZfdmFsICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAyOAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDM2 Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKPj4+PiArICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZl ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsK Pj4+PiArICoKPj4+PiArICogaW5kZXggLSB1aW50OF90LCBpbmRleCBvZiB0aGUgY2FtZXJhIGNv bnRyb2wgaW4gcmVzcG9uc2UuCj4+Pj4gKyAqIHR5cGUgLSB1aW50OF90LCB0eXBlIG9mIHRoZSBj b250cm9sLCBvbmUgb2YgdGhlIFhFTkNBTUVSQV9DVFJMX1hYWC4KPj4+PiArICogbWluIC0gaW50 MzJfdCwgbWluaW11bSB2YWx1ZSBvZiB0aGUgY29udHJvbC4KPj4+PiArICogbWF4IC0gaW50MzJf dCwgbWF4aW11bSB2YWx1ZSBvZiB0aGUgY29udHJvbC4KPj4+PiArICogc3RlcCAtIGludDMyX3Qs IG1pbmltdW0gc2l6ZSBpbiB3aGljaCBjb250cm9sIHZhbHVlIGNhbiBiZSBjaGFuZ2VkLgo+Pj4+ ICsgKiBkZWZfdmFsIC0gaW50MzJfdCwgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29udHJvbC4KPj4+ IEknZCBnbyB3aXRoIDY0IGJpdCB2YWx1ZXMgZm9yIG1pbi9tYXgvc3RlcC9kZWZfdmFsLgo+PiBT dXJlLCBnb29kIGlkZWEsIHRoYW5rIHlvdQo+Pj4gSSB3b3VsZCBhbHNvIGFkZCBhIGZsYWdzIGZp ZWxkLiBTb21lIGNvbnRyb2xzIGFyZSByZWFkLW9ubHksIHdyaXRlLW9ubHkKPj4+IG9yIHZvbGF0 aWxlLCB0aGluZ3MgdXNlcnNwYWNlIG5lZWRzIHRvIGtub3cuCj4+IFRoZW4gSSdsbCBhbHNvIGFk ZCBudW1lcmljYWwgY29uc3RhbnRzIGZvciBzdWNoCj4+PiBJZiB5b3Ugd2FudCB0byBzdXBwb3J0 IG1lbnUgY29udHJvbHMsIHRoZW4geW91IG5lZWQgYSB3YXkgdG8gZ2V0IHRoZSBtZW51Cj4+PiBu YW1lcyBhcyB3ZWxsIChWSURJT0NfUVVFUllNRU5VKS4KPj4+Cj4+PiBOb25lIG9mIHRoaXMgaXMg bmVlZGVkIGZvciB0aGlzIGluaXRpYWwgdXNlLWNhc2UsIGJ1dCB5b3UgbmVlZCB0byB0aGluawo+ Pj4gYWJvdXQgdGhpcyB1cC1mcm9udC4KPj4gWWVzLCB0aGFuayB5b3UKPj4+PiArICovCj4+Pj4g K3N0cnVjdCB4ZW5jYW1lcmFfZ2V0X2N0cmxfZGV0YWlsc19yZXNwIHsKPj4+PiArICAgIHVpbnQ4 X3QgaW5kZXg7Cj4+Pj4gKyAgICB1aW50OF90IHR5cGU7Cj4+Pj4gKyAgICB1aW50OF90IHJlc2Vy dmVkWzJdOwo+Pj4+ICsgICAgaW50MzJfdCBtaW47Cj4+Pj4gKyAgICBpbnQzMl90IG1heDsKPj4+ PiArICAgIGludDMyX3Qgc3RlcDsKPj4+PiArICAgIGludDMyX3QgZGVmX3ZhbDsKPj4+PiArfTsK Pj4+PiArCj4+Pj4gKy8qCj4+Pj4gKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0gRXZlbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPj4+PiArICoKPj4+ PiArICogRXZlbnRzIGFyZSBzZW50IHZpYSBhIHNoYXJlZCBwYWdlIGFsbG9jYXRlZCBieSB0aGUg ZnJvbnQgYW5kIHByb3BhZ2F0ZWQgYnkKPj4+PiArICogICBldnQtZXZlbnQtY2hhbm5lbC9ldnQt cmluZy1yZWYgWGVuU3RvcmUgZW50cmllcy4KPj4+PiArICoKPj4+PiArICogQWxsIGV2ZW50IHBh Y2tldHMgaGF2ZSB0aGUgc2FtZSBsZW5ndGggKDY0IG9jdGV0cykuCj4+Pj4gKyAqIEFsbCBldmVu dCBwYWNrZXRzIGhhdmUgY29tbW9uIGhlYWRlcjoKPj4+PiArICogICAgICAgICAwICAgICAgICAg ICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAo+ Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAg ICAgICAgIHwgICAgICB0eXBlICAgICAgfCAgIHJlc2VydmVkICAgICB8IDQKPj4+PiArICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZl ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ Pj4+ICsgKgo+Pj4+ICsgKiBpZCAtIHVpbnQxNl90LCBldmVudCBpZCwgbWF5IGJlIHVzZWQgYnkg ZnJvbnQuCj4+Pj4gKyAqIHR5cGUgLSB1aW50OF90LCB0eXBlIG9mIHRoZSBldmVudC4KPj4+PiAr ICoKPj4+PiArICoKPj4+PiArICogRnJhbWUgY2FwdHVyZWQgZXZlbnQgLSBldmVudCBmcm9tIGJh Y2sgdG8gZnJvbnQgd2hlbiBhIG5ldyBjYXB0dXJlZAo+Pj4+ICsgKiBmcmFtZSBpcyBhdmFpbGFi bGU6Cj4+Pj4gKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAy ICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4g KyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAgICAgICB8X0VWVF9GUkFNRV9BVkFJTHwg ICByZXNlcnZlZCAgICAgfCA0Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgOAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+PiArICogfCAgICAgIGluZGV4ICAgICB8 ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICB8IDEyCj4+ Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgdXNlZF9zeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTYKPj4+PiArICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCj4+Pj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZl ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMAo+Pj4+ICsgKiArLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsK Pj4+PiArICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC98Cj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+ICsgKiB8ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgNjQKPj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4gKyAqCj4+Pj4gKyAqIGluZGV4 IC0gdWludDhfdCwgaW5kZXggb2YgdGhlIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIG5ldyBjYXB0dXJl ZCBmcmFtZS4KPj4+PiArICogdXNlZF9zeiAtIHVpbnQzMl90LCBudW1iZXIgb2Ygb2N0ZXRzIHRo aXMgZnJhbWUgaGFzLiBUaGlzIGNhbiBiZSBsZXNzCj4+Pj4gKyAqIHRoYW4gdGhlIFhFTkNBTUVS QV9PUF9HRVRfQlVGX0RFVEFJTFMuc2l6ZSBmb3IgY29tcHJlc3NlZCBmb3JtYXRzLgo+Pj4+ICsg Ki8KPj4+PiArc3RydWN0IHhlbmNhbWVyYV9mcmFtZV9hdmFpbF9ldnQgewo+Pj4+ICsgICAgdWlu dDhfdCBpbmRleDsKPj4+PiArICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbM107Cj4+Pj4gKyAgICB1aW50 MzJfdCB1c2VkX3N6Owo+Pj4+ICt9Owo+Pj4+ICsKPj4+PiArc3RydWN0IHhlbmNhbWVyYV9yZXEg ewo+Pj4+ICsgICAgdWludDE2X3QgaWQ7Cj4+Pj4gKyAgICB1aW50OF90IG9wZXJhdGlvbjsKPj4+ PiArICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbNV07Cj4+Pj4gKyAgICB1bmlvbiB7Cj4+Pj4gKyAgICAg ICAgc3RydWN0IHhlbmNhbWVyYV9jb25maWcgY29uZmlnOwo+Pj4+ICsgICAgICAgIHN0cnVjdCB4 ZW5jYW1lcmFfYnVmX2NyZWF0ZV9yZXEgYnVmX2NyZWF0ZTsKPj4+PiArCXN0cnVjdCB4ZW5jYW1l cmFfYnVmX2Rlc3Ryb3lfcmVxIGJ1Zl9kZXN0cm95Owo+Pj4+ICsJc3RydWN0IHhlbmNhbWVyYV9z ZXRfY3RybF9yZXEgc2V0X2N0cmw7Cj4+Pj4gKyAgICAgICAgdWludDhfdCByZXNlcnZlZFs1Nl07 Cj4+Pj4gKyAgICB9IHJlcTsKPj4+PiArfTsKPj4+PiArCj4+Pj4gK3N0cnVjdCB4ZW5jYW1lcmFf cmVzcCB7Cj4+Pj4gKyAgICB1aW50MTZfdCBpZDsKPj4+PiArICAgIHVpbnQ4X3Qgb3BlcmF0aW9u Owo+Pj4+ICsgICAgdWludDhfdCByZXNlcnZlZDsKPj4+PiArICAgIGludDMyX3Qgc3RhdHVzOwo+ Pj4+ICsgICAgdW5pb24gewo+Pj4+ICsgICAgICAgIHN0cnVjdCB4ZW5jYW1lcmFfY29uZmlnIGNv bmZpZzsKPj4+PiArICAgICAgICBzdHJ1Y3QgeGVuY2FtZXJhX2J1Zl9kZXRhaWxzX3Jlc3AgYnVm X2RldGFpbHM7Cj4+Pj4gKwlzdHJ1Y3QgeGVuY2FtZXJhX2dldF9jdHJsX2RldGFpbHNfcmVzcCBj dHJsX2RldGFpbHM7Cj4+Pj4gKyAgICAgICAgdWludDhfdCByZXNlcnZlZDFbNTZdOwo+Pj4+ICsg ICAgfSByZXNwOwo+Pj4+ICt9Owo+Pj4+ICsKPj4+PiArc3RydWN0IHhlbmNhbWVyYV9ldnQgewo+ Pj4+ICsgICAgdWludDE2X3QgaWQ7Cj4+Pj4gKyAgICB1aW50OF90IHR5cGU7Cj4+Pj4gKyAgICB1 aW50OF90IHJlc2VydmVkWzVdOwo+Pj4+ICsgICAgdW5pb24gewo+Pj4+ICsgICAgICAgIHN0cnVj dCB4ZW5jYW1lcmFfZnJhbWVfYXZhaWxfZXZ0IGZyYW1lX2F2YWlsOwo+Pj4+ICsgICAgICAgIHVp bnQ4X3QgcmVzZXJ2ZWRbNTZdOwo+Pj4+ICsgICAgfSBldnQ7Cj4+Pj4gK307Cj4+Pj4gKwo+Pj4+ ICtERUZJTkVfUklOR19UWVBFUyh4ZW5fY2FtZXJhaWYsIHN0cnVjdCB4ZW5jYW1lcmFfcmVxLCBz dHJ1Y3QgeGVuY2FtZXJhX3Jlc3ApOwo+Pj4+ICsKPj4+PiArLyoKPj4+PiArICoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKgo+Pj4+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgIEJhY2sgdG8gZnJvbnQg ZXZlbnRzIGRlbGl2ZXJ5Cj4+Pj4gKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKPj4+PiArICogSW4g b3JkZXIgdG8gZGVsaXZlciBhc3luY2hyb25vdXMgZXZlbnRzIGZyb20gYmFjayB0byBmcm9udCBh IHNoYXJlZCBwYWdlIGlzCj4+Pj4gKyAqIGFsbG9jYXRlZCBieSBmcm9udCBhbmQgaXRzIGdyYW50 ZWQgcmVmZXJlbmNlIHByb3BhZ2F0ZWQgdG8gYmFjayB2aWEKPj4+PiArICogWGVuU3RvcmUgZW50 cmllcyAoZXZ0LXJpbmctcmVmL2V2dC1ldmVudC1jaGFubmVsKS4KPj4+PiArICogVGhpcyBwYWdl IGhhcyBhIGNvbW1vbiBoZWFkZXIgdXNlZCBieSBib3RoIGZyb250IGFuZCBiYWNrIHRvIHN5bmNo cm9uaXplCj4+Pj4gKyAqIGFjY2VzcyBhbmQgY29udHJvbCBldmVudCdzIHJpbmcgYnVmZmVyLCB3 aGlsZSBiYWNrIGJlaW5nIGEgcHJvZHVjZXIgb2YgdGhlCj4+Pj4gKyAqIGV2ZW50cyBhbmQgZnJv bnQgYmVpbmcgYSBjb25zdW1lci4gVGhlIHJlc3Qgb2YgdGhlIHBhZ2UgYWZ0ZXIgdGhlIGhlYWRl cgo+Pj4+ICsgKiBpcyB1c2VkIGZvciBldmVudCBwYWNrZXRzLgo+Pj4+ICsgKgo+Pj4+ICsgKiBV cG9uIHJlY2VwdGlvbiBvZiBhbiBldmVudChzKSBmcm9udCBtYXkgY29uZmlybSBpdHMgcmVjZXB0 aW9uCj4+Pj4gKyAqIGZvciBlaXRoZXIgZWFjaCBldmVudCwgZ3JvdXAgb2YgZXZlbnRzIG9yIG5v bmUuCj4+Pj4gKyAqLwo+Pj4+ICsKPj4+PiArc3RydWN0IHhlbmNhbWVyYV9ldmVudF9wYWdlIHsK Pj4+PiArICAgIHVpbnQzMl90IGluX2NvbnM7Cj4+Pj4gKyAgICB1aW50MzJfdCBpbl9wcm9kOwo+ Pj4+ICsgICAgdWludDhfdCByZXNlcnZlZFs1Nl07Cj4+Pj4gK307Cj4+Pj4gKwo+Pj4+ICsjZGVm aW5lIFhFTkNBTUVSQV9FVkVOVF9QQUdFX1NJWkUgNDA5Ngo+Pj4+ICsjZGVmaW5lIFhFTkNBTUVS QV9JTl9SSU5HX09GRlMgKHNpemVvZihzdHJ1Y3QgeGVuY2FtZXJhX2V2ZW50X3BhZ2UpKQo+Pj4+ ICsjZGVmaW5lIFhFTkNBTUVSQV9JTl9SSU5HX1NJWkUgKFhFTkNBTUVSQV9FVkVOVF9QQUdFX1NJ WkUgLSBYRU5DQU1FUkFfSU5fUklOR19PRkZTKQo+Pj4+ICsjZGVmaW5lIFhFTkNBTUVSQV9JTl9S SU5HX0xFTiAoWEVOQ0FNRVJBX0lOX1JJTkdfU0laRSAvIHNpemVvZihzdHJ1Y3QgeGVuY2FtZXJh X2V2dCkpCj4+Pj4gKyNkZWZpbmUgWEVOQ0FNRVJBX0lOX1JJTkcocGFnZSkgXAo+Pj4+ICsJKChz dHJ1Y3QgeGVuY2FtZXJhX2V2dCAqKSgoY2hhciAqKShwYWdlKSArIFhFTkNBTUVSQV9JTl9SSU5H X09GRlMpKQo+Pj4+ICsjZGVmaW5lIFhFTkNBTUVSQV9JTl9SSU5HX1JFRihwYWdlLCBpZHgpIFwK Pj4+PiArCShYRU5DQU1FUkFfSU5fUklORygocGFnZSkpWyhpZHgpICUgWEVOQ0FNRVJBX0lOX1JJ TkdfTEVOXSkKPj4+PiArCj4+Pj4gKyNlbmRpZiAvKiBfX1hFTl9QVUJMSUNfSU9fQ0FNRVJBSUZf SF9fICovCj4+Pj4gKwo+Pj4+ICsvKgo+Pj4+ICsgKiBMb2NhbCB2YXJpYWJsZXM6Cj4+Pj4gKyAq IG1vZGU6IEMKPj4+PiArICogYy1maWxlLXN0eWxlOiAiQlNEIgo+Pj4+ICsgKiBjLWJhc2ljLW9m ZnNldDogNAo+Pj4+ICsgKiB0YWItd2lkdGg6IDQKPj4+PiArICogaW5kZW50LXRhYnMtbW9kZTog bmlsCj4+Pj4gKyAqIEVuZDoKPj4+PiArICovCj4+Pj4KPj4+IEkgdGhpbmsgdGhlIG1vc3QgaW1w b3J0YW50IGRlY2lzaW9uIHRvIG1ha2UgaGVyZSBpcyB3aGV0aGVyIG9yIG5vdCB5b3Ugd2FudCB0 byBzdXBwb3J0Cj4+PiBob3RwbHVnZ2FibGUgc291cmNlcyBsaWtlIEhETUkuIEFuZCBhbiBhZGRp dGlvbmFsIGNvbXBsaWNhdGlvbiB3aXRoIHRoYXQgaXMgSERDUC4KPj4+IFdoaWxlIFY0TDIgZG9l c24ndCBoYXZlIGFuIEFQSSBmb3IgSERDUCBhdCB0aGUgbW9tZW50LCBDaXNjbyBpcyB3b3JraW5n IG9uIHRoaXMgYW5kCj4+PiBhIHBhdGNoIHNlcmllcyBhZGRpbmcgdGhpcyBpcyBleHBlY3RlZCBs YXRlciB0aGlzIHllYXIvZWFybHkgbmV4dCB5ZWFyLiBJdCBtaWdodCBub3QKPj4+IGJlIGFuIGlz c3VlIGluIHByYWN0aWNlIGlmIHRoZXNlIGFyZSBhbGwgY2xvc2VkIHN5c3RlbXMsIGJ1dCBuZXZl cnRoZWxlc3MsIGl0IGlzCj4+PiBzb21ldGhpbmcgdG8gdGhpbmsgYWJvdXQuCj4+IFllcywgdGhh bmsgeW91IGZvciByYWlzaW5nIHRoZXNlIHF1ZXN0aW9ucywgaXQgaXMgd29ydGggdGhpbmtpbmcK Pj4gYWJvdXQgc3VjaCB1c2UtY2FzZXMuCj4+PiBSZWdhcmRzLAo+Pj4KPj4+IAlIYW5zCj4+IFRo YW5rIHlvdSBzbyBtdWNoIGZvciB0aGUgY29tbWVudHMsCj4+IE9sZWtzYW5kcgo+Pgo+IFJlZ2Fy ZHMsCj4KPiAJSGFucwpUaGFuayB5b3UsCk9sZWtzYW5kcgoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4tZGV2 ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKaHR0cHM6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9tYWls bWFuL2xpc3RpbmZvL3hlbi1kZXZlbA==