From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 64612C43381 for ; Fri, 22 Mar 2019 08:22:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0FF7B218D3 for ; Fri, 22 Mar 2019 08:22:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727645AbfCVIWR (ORCPT ); Fri, 22 Mar 2019 04:22:17 -0400 Received: from lb3-smtp-cloud7.xs4all.net ([194.109.24.31]:47246 "EHLO lb3-smtp-cloud7.xs4all.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727535AbfCVIWQ (ORCPT ); Fri, 22 Mar 2019 04:22:16 -0400 Received: from [IPv6:2001:983:e9a7:1:a03d:2e6d:2ff:f561] ([IPv6:2001:983:e9a7:1:a03d:2e6d:2ff:f561]) by smtp-cloud7.xs4all.net with ESMTPA id 7FRHhsQ52LMwI7FRIhnv0O; Fri, 22 Mar 2019 09:22:10 +0100 Subject: Re: [Xen-devel][PATCH v6 1/1] cameraif: add ABI for para-virtual camera To: Oleksandr Andrushchenko , xen-devel@lists.xenproject.org, konrad.wilk@oracle.com, jgross@suse.com, boris.ostrovsky@oracle.com, mchehab@kernel.org, linux-media@vger.kernel.org, sakari.ailus@linux.intel.com, koji.matsuoka.xm@renesas.com Cc: Oleksandr Andrushchenko References: <20190322073742.14639-1-andr2000@gmail.com> <20190322073742.14639-2-andr2000@gmail.com> From: Hans Verkuil Message-ID: Date: Fri, 22 Mar 2019 09:22:07 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.5.1 MIME-Version: 1.0 In-Reply-To: <20190322073742.14639-2-andr2000@gmail.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit X-CMAE-Envelope: MS4wfBeZpLUHeJw49SkxUhzWjXJLNCTHRCH4rLGypF7Y23DtQg+SjMterc9RYLKiOkjo3boMO+i4aMwOXNPL6yQQtZ1n4KCQDTNbi2x898fASBdGSfn0PL8W TzMcinACpAsO1eymau+SJXaJ9Vu9hLNMMuPRm2LTkmM7uMhKN/7K8LJWYItfpeUcH5yJslWhD0mtwvr1CzbH+0OctxoGQAdrvU2GXjDQ9zFRB1KljcJnwehH qTIVZCnpEVQfFat/w+yhqSLF5km5aO7gVbLKQlBkuzIJ7Q491Hnsx+lBmsoO5UDF0m8wvGZBzgrrmyWNPv6cMGrFLHtBBNz1oPQikSj6vmmzDGrNv91wZcPB 6yLA/eQGvfYyl0mTy+xrG2LaoKs5E3qASMkCkFPRc9A5Fr6lujHf+mJWpbY3hiiWe+A9OBOXB6m8oT/FZjOTuTpGNUnJPxGGqVZbVi2fmMt3nIS/SwQGSLTa Dg2CYnYqVde38b0KdLej4Ohd5ShXmoO/Jtc0MBITvVpGrdwzoSZtWMwPXX03v6qCBkblJaRWIEdKb4urE68WnTFuaKreVKibq991F804s8ZT+WUOxg9VCOOn Z5D0m+gJmlJSD/HEy4z663El Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org On 3/22/19 8:37 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 > > Signed-off-by: Oleksandr Andrushchenko Looks good! Reviewed-by: Hans Verkuil Thank you for all your work on this. Regards, Hans > --- > xen/include/public/io/cameraif.h | 1374 ++++++++++++++++++++++++++++++ > 1 file changed, 1374 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..acbcbf3bd411 > --- /dev/null > +++ b/xen/include/public/io/cameraif.h > @@ -0,0 +1,1374 @@ > +/****************************************************************************** > + * 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-2019 EPAM Systems Inc. > + * > + * Author: Oleksandr Andrushchenko > + */ > + > +#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" > + * > + *--------------------------------- 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/max-buffers = "3" > + * /local/domain/1/device/vcamera/0/controls = "contrast,hue" > + * /local/domain/1/device/vcamera/0/formats/YUYV/640x480/frame-rates = "30/1,15/1" > + * /local/domain/1/device/vcamera/0/formats/YUYV/1920x1080/frame-rates = "15/2" > + * /local/domain/1/device/vcamera/0/formats/BGRA/640x480/frame-rates = "15/1,15/2" > + * /local/domain/1/device/vcamera/0/formats/BGRA/1200x720/frame-rates = "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/max-buffers = "8" > + * /local/domain/1/device/vcamera/1/controls = "brightness,saturation,hue" > + * /local/domain/1/device/vcamera/1/formats/YUYV/640x480/frame-rates = "30/1,15/2" > + * /local/domain/1/device/vcamera/1/formats/YUYV/1920x1080/frame-rates = "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 > + * 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. > + * > + * max-buffers > + * Values: > + * > + * Maximum number of camera buffers this frontend may use. > + * > + * 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 the > + * corresponding FOURCC string label. The next level of > + * the directory under represents supported resolutions. > + * If the format represents a big-endian variant of a little > + * endian format, then the "-BE" suffix must be added. E.g. 'AR15' vs > + * 'AR15-BE'. > + * If FOURCC string label has spaces then those are only allowed to > + * be at the end of the label and must be trimmed, for example > + * 'Y16' and 'Y16-BE' will be trimmed. > + * > + * 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. > + * > + * 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. > + * > + *------------------- 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_CONFIG_SET 0x00 > +#define XENCAMERA_OP_CONFIG_GET 0x01 > +#define XENCAMERA_OP_CONFIG_VALIDATE 0x02 > +#define XENCAMERA_OP_FRAME_RATE_SET 0x03 > +#define XENCAMERA_OP_BUF_GET_LAYOUT 0x04 > +#define XENCAMERA_OP_BUF_REQUEST 0x05 > +#define XENCAMERA_OP_BUF_CREATE 0x06 > +#define XENCAMERA_OP_BUF_DESTROY 0x07 > +#define XENCAMERA_OP_BUF_QUEUE 0x08 > +#define XENCAMERA_OP_BUF_DEQUEUE 0x09 > +#define XENCAMERA_OP_CTRL_ENUM 0x0a > +#define XENCAMERA_OP_CTRL_SET 0x0b > +#define XENCAMERA_OP_CTRL_GET 0x0c > +#define XENCAMERA_OP_STREAM_START 0x0d > +#define XENCAMERA_OP_STREAM_STOP 0x0e > + > +#define XENCAMERA_CTRL_BRIGHTNESS 0 > +#define XENCAMERA_CTRL_CONTRAST 1 > +#define XENCAMERA_CTRL_SATURATION 2 > +#define XENCAMERA_CTRL_HUE 3 > + > +/* Number of supported controls. */ > +#define XENCAMERA_MAX_CTRL 4 > + > +/* Control is read-only. */ > +#define XENCAMERA_CTRL_FLG_RO (1 << 0) > +/* Control is write-only. */ > +#define XENCAMERA_CTRL_FLG_WO (1 << 1) > +/* Control's value is volatile. */ > +#define XENCAMERA_CTRL_FLG_VOLATILE (1 << 2) > + > +/* Supported color spaces. */ > +#define XENCAMERA_COLORSPACE_DEFAULT 0 > +#define XENCAMERA_COLORSPACE_SMPTE170M 1 > +#define XENCAMERA_COLORSPACE_REC709 2 > +#define XENCAMERA_COLORSPACE_SRGB 3 > +#define XENCAMERA_COLORSPACE_OPRGB 4 > +#define XENCAMERA_COLORSPACE_BT2020 5 > +#define XENCAMERA_COLORSPACE_DCI_P3 6 > + > +/* Color space transfer function. */ > +#define XENCAMERA_XFER_FUNC_DEFAULT 0 > +#define XENCAMERA_XFER_FUNC_709 1 > +#define XENCAMERA_XFER_FUNC_SRGB 2 > +#define XENCAMERA_XFER_FUNC_OPRGB 3 > +#define XENCAMERA_XFER_FUNC_NONE 4 > +#define XENCAMERA_XFER_FUNC_DCI_P3 5 > +#define XENCAMERA_XFER_FUNC_SMPTE2084 6 > + > +/* Color space Y’CbCr encoding. */ > +#define XENCAMERA_YCBCR_ENC_IGNORE 0 > +#define XENCAMERA_YCBCR_ENC_601 1 > +#define XENCAMERA_YCBCR_ENC_709 2 > +#define XENCAMERA_YCBCR_ENC_XV601 3 > +#define XENCAMERA_YCBCR_ENC_XV709 4 > +#define XENCAMERA_YCBCR_ENC_BT2020 5 > +#define XENCAMERA_YCBCR_ENC_BT2020_CONST_LUM 6 > + > +/* Quantization range. */ > +#define XENCAMERA_QUANTIZATION_DEFAULT 0 > +#define XENCAMERA_QUANTIZATION_FULL_RANGE 1 > +#define XENCAMERA_QUANTIZATION_LIM_RANGE 2 > + > +/* > + ****************************************************************************** > + * EVENT CODES > + ****************************************************************************** > + */ > +#define XENCAMERA_EVT_FRAME_AVAIL 0x00 > +#define XENCAMERA_EVT_CTRL_CHANGE 0x01 > + > +/* > + ****************************************************************************** > + * XENSTORE FIELD AND PATH NAME STRINGS, HELPERS > + ****************************************************************************** > + */ > +#define XENCAMERA_DRIVER_NAME "vcamera" > + > +#define XENCAMERA_LIST_SEPARATOR "," > +#define XENCAMERA_RESOLUTION_SEPARATOR "x" > +#define XENCAMERA_FRACTION_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_MAX_BUFFERS "max-buffers" > +#define XENCAMERA_FIELD_CONTROLS "controls" > +#define XENCAMERA_FIELD_FORMATS "formats" > +#define XENCAMERA_FIELD_FRAME_RATES "frame-rates" > +#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" > + > +#define XENCAMERA_FOURCC_BIGENDIAN_STR "-BE" > + > +/* 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. > + * - all FOURCC mappings used for configuration and messaging are > + * Linux V4L2 ones: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/videodev2.h > + * with the following exceptions: > + * - characters are allowed in [0x20; 0x7f] range > + * - when used for XenStore configuration entries the following > + * are not allowed: > + * - '/', '\', ' ' (space), '<', '>', ':', '"', '|', '?', '*' > + * - if trailing spaces are part of the FOURCC code then those must be > + * trimmed > + * > + * > + ****************************************************************************** > + * 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_CONFIG_SET.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 to set/validate the configuration - request to set the > + * configuration/mode of the camera (XENCAMERA_OP_CONFIG_SET) or to > + * check if the configuration is valid and can be used > + * (XENCAMERA_OP_CONFIG_VALIDATE): > + * 0 1 2 3 octet > + * +----------------+----------------+----------------+----------------+ > + * | id | _OP_CONFIG_XXX | reserved | 4 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 8 > + * +----------------+----------------+----------------+----------------+ > + * | pixel format | 12 > + * +----------------+----------------+----------------+----------------+ > + * | width | 16 > + * +----------------+----------------+----------------+----------------+ > + * | height | 20 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 24 > + * +----------------+----------------+----------------+----------------+ > + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 64 > + * +----------------+----------------+----------------+----------------+ > + * > + * pixel_format - uint32_t, pixel format to be used, FOURCC code. > + * width - uint32_t, width in pixels. > + * height - uint32_t, height in pixels. > + * > + * See response format for this request. > + * > + * Notes: > + * - the only difference between XENCAMERA_OP_CONFIG_VALIDATE and > + * XENCAMERA_OP_CONFIG_SET is that the former doesn't actually change > + * camera configuration, but queries if the configuration is valid. > + * This can be used while stream is active and/or buffers allocated. > + * - 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_CONFIG_SET requests before > + * sending XENCAMERA_OP_STREAM_START request to update or tune the > + * final stream configuration. > + * - configuration cannot be changed during active streaming, e.g. > + * after XENCAMERA_OP_STREAM_START and before XENCAMERA_OP_STREAM_STOP > + * requests. > + */ > +struct xencamera_config_req { > + uint32_t pixel_format; > + uint32_t width; > + uint32_t height; > +}; > + > +/* > + * Request current configuration of the camera: > + * 0 1 2 3 octet > + * +----------------+----------------+----------------+----------------+ > + * | id | _OP_CONFIG_GET | reserved | 4 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 8 > + * +----------------+----------------+----------------+----------------+ > + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 64 > + * +----------------+----------------+----------------+----------------+ > + * > + * See response format for this request. > + * > + * > + * Request to set the frame rate of the stream: > + * 0 1 2 3 octet > + * +----------------+----------------+----------------+----------------+ > + * | id | _FRAME_RATE_SET| reserved | 4 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 8 > + * +----------------+----------------+----------------+----------------+ > + * | frame_rate_numer | 12 > + * +----------------+----------------+----------------+----------------+ > + * | frame_rate_denom | 16 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 20 > + * +----------------+----------------+----------------+----------------+ > + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 64 > + * +----------------+----------------+----------------+----------------+ > + * > + * frame_rate_numer - uint32_t, numerator of the frame rate. > + * frame_rate_denom - uint32_t, denominator of the frame rate. > + * > + * Notes: > + * - to query the current (actual) frame rate use XENCAMERA_OP_CONFIG_GET > + * request. > + * - this request can be used with camera buffers allocated, but stream > + * stopped, e.g. frontend is allowed to stop the stream with > + * XENCAMERA_OP_STREAM_STOP, hold the buffers allocated (e.g. keep the > + * configuration set with XENCAMERA_OP_CONFIG_SET), change the > + * frame rate of the stream and (re)start the stream again with > + * XENCAMERA_OP_STREAM_START. > + * - frame rate cannot be changed during active streaming, e.g. > + * after XENCAMERA_OP_STREAM_START and before XENCAMERA_OP_STREAM_STOP > + * commands. > + */ > +struct xencamera_frame_rate_req { > + uint32_t frame_rate_numer; > + uint32_t frame_rate_denom; > +}; > + > +/* > + * Request camera buffer's layout: > + * 0 1 2 3 octet > + * +----------------+----------------+----------------+----------------+ > + * | id | _BUF_GET_LAYOUT| reserved | 4 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 8 > + * +----------------+----------------+----------------+----------------+ > + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 64 > + * +----------------+----------------+----------------+----------------+ > + * > + * See response format for this request. > + * > + * > + * Request number of buffers to be used: > + * 0 1 2 3 octet > + * +----------------+----------------+----------------+----------------+ > + * | id | _OP_BUF_REQUEST| reserved | 4 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 8 > + * +----------------+----------------+----------------+----------------+ > + * | num_bufs | reserved | 12 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 16 > + * +----------------+----------------+----------------+----------------+ > + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 64 > + * +----------------+----------------+----------------+----------------+ > + * > + * num_bufs - uint8_t, desired number of buffers to be used. > + * > + * If num_bufs is not zero then the backend validates the requested number of > + * buffers and responds with the number of buffers allowed for this frontend. > + * Frontend is responsible for checking 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 is allowed to send multiple XENCAMERA_OP_BUF_REQUEST requests > + * before sending XENCAMERA_OP_STREAM_START request to update or tune the > + * final configuration. > + * Frontend is not allowed to change the camera configuration after this call > + * with a non-zero value of num_bufs. If camera reconfiguration is required > + * then this request must be sent with num_bufs set to zero and any created > + * buffers must be destroyed first. > + * Frontend is not allowed to change the number of buffers after the > + * streaming has started. > + * > + * If num_bufs is 0 and streaming has not started yet, then the backend will > + * free all previously allocated buffers (if any). > + * Trying to call this if streaming is in progress will result in an error. > + * > + * If camera reconfiguration is required then the streaming must be stopped > + * and this request must be sent with num_bufs set to zero and any > + * created buffers must be destroyed. > + * > + * Please note, that the number of buffers in this request must not exceed > + * the value configured in XenStore.max-buffers. > + * > + * See response format for this request. > + */ > +struct xencamera_buf_request { > + uint8_t num_bufs; > +}; > + > +/* > + * Request camera buffer creation: > + * 0 1 2 3 octet > + * +----------------+----------------+----------------+----------------+ > + * | id | _OP_BUF_CREATE | reserved | 4 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 8 > + * +----------------+----------------+----------------+----------------+ > + * | index | reserved | 12 > + * +----------------+----------------+----------------+----------------+ > + * | plane_offset[0] | 16 > + * +----------------+----------------+----------------+----------------+ > + * | plane_offset[1] | 20 > + * +----------------+----------------+----------------+----------------+ > + * | plane_offset[2] | 24 > + * +----------------+----------------+----------------+----------------+ > + * | plane_offset[3] | 28 > + * +----------------+----------------+----------------+----------------+ > + * | gref_directory | 32 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 36 > + * +----------------+----------------+----------------+----------------+ > + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| > + * +----------------+----------------+----------------+----------------+ > + * | 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 in the range > + * from 0 to the num_bufs field returned in response for > + * XENCAMERA_OP_BUF_REQUEST request > + * plane_offset - array of uint32_t, offset of the corresponding plane > + * in octets from the buffer start. Number of offsets returned is > + * equal to the value returned in XENCAMERA_OP_BUF_GET_LAYOUT.num_planes. > + * 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_BUF_GET_LAYOUT.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). > + * > + * 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]; > + uint32_t plane_offset[XENCAMERA_MAX_PLANE]; > + 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_BUF_REQUEST.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. > + * > + * > + * Request queueing of the buffer for backend use: > + * 0 1 2 3 octet > + * +----------------+----------------+----------------+----------------+ > + * | id | _OP_BUF_QUEUE | reserved | 4 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 8 > + * +----------------+----------------+----------------+----------------+ > + * | index | reserved | 12 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 16 > + * +----------------+----------------+----------------+----------------+ > + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 64 > + * +----------------+----------------+----------------+----------------+ > + * > + * Notes: > + * - frontends must not access the buffer content after this request until > + * response to XENCAMERA_OP_BUF_DEQUEUE has been received. > + * - buffers must be queued to the backend before destroying them with > + * XENCAMERA_OP_BUF_DESTROY. > + * > + * index - uint8_t, index of the buffer to be queued. > + * > + * > + * Request dequeueing of the buffer for frontend use: > + * 0 1 2 3 octet > + * +----------------+----------------+----------------+----------------+ > + * | id |_OP_BUF_DEQUEUE | reserved | 4 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 8 > + * +----------------+----------------+----------------+----------------+ > + * | index | reserved | 12 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 16 > + * +----------------+----------------+----------------+----------------+ > + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 64 > + * +----------------+----------------+----------------+----------------+ > + * > + * Notes: > + * - frontend is allowed to access the buffer content after the corresponding > + * response to this request. > + * > + * index - uint8_t, index of the buffer to be queued. > + * > + * > + * Request camera control details: > + * 0 1 2 3 octet > + * +----------------+----------------+----------------+----------------+ > + * | id | _OP_CTRL_ENUM | reserved | 4 > + * +----------------+----------------+----------------+----------------+ > + * | index | reserved | 8 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 12 > + * +----------------+----------------+----------------+----------------+ > + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 64 > + * +----------------+----------------+----------------+----------------+ > + * > + * See response format for this request. > + * > + * index - uint8_t, index of the control to be queried. > + */ > +struct xencamera_index { > + uint8_t index; > +}; > + > +/* > + * Request camera control change: > + * 0 1 2 3 octet > + * +----------------+----------------+----------------+----------------+ > + * | id | _OP_SET_CTRL | reserved | 4 > + * +----------------+----------------+----------------+----------------+ > + * | type | reserved | 8 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 12 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 16 > + * +----------------+----------------+----------------+----------------+ > + * | value low 32-bit | 20 > + * +----------------+----------------+----------------+----------------+ > + * | value high 32-bit | 24 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 28 > + * +----------------+----------------+----------------+----------------+ > + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 64 > + * +----------------+----------------+----------------+----------------+ > + * > + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. > + * value - int64_t, new value of the control. > + */ > +struct xencamera_ctrl_value { > + uint8_t type; > + uint8_t reserved[7]; > + int64_t value; > +}; > + > +/* > + * Request camera control state: > + * 0 1 2 3 octet > + * +----------------+----------------+----------------+----------------+ > + * | id | _OP_GET_CTRL | reserved | 4 > + * +----------------+----------------+----------------+----------------+ > + * | type | reserved | 8 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 12 > + * +----------------+----------------+----------------+----------------+ > + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 64 > + * +----------------+----------------+----------------+----------------+ > + * > + * See response format for this request. > + * > + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. > + */ > +struct xencamera_get_ctrl_req { > + uint8_t type; > +}; > + > +/* > + * 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 > + * +----------------+----------------+----------------+----------------+ > + * > + * > + *---------------------------------- 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. > + * > + * > + * Configuration response - response for XENCAMERA_OP_CONFIG_SET, > + * XENCAMERA_OP_CONFIG_GET and XENCAMERA_OP_CONFIG_VALIDATE requests: > + * 0 1 2 3 octet > + * +----------------+----------------+----------------+----------------+ > + * | id | _OP_CONFIG_XXX | reserved | 4 > + * +----------------+----------------+----------------+----------------+ > + * | status | 8 > + * +----------------+----------------+----------------+----------------+ > + * | pixel format | 12 > + * +----------------+----------------+----------------+----------------+ > + * | width | 16 > + * +----------------+----------------+----------------+----------------+ > + * | height | 20 > + * +----------------+----------------+----------------+----------------+ > + * | colorspace | 24 > + * +----------------+----------------+----------------+----------------+ > + * | xfer_func | 28 > + * +----------------+----------------+----------------+----------------+ > + * | ycbcr_enc | 32 > + * +----------------+----------------+----------------+----------------+ > + * | quantization | 36 > + * +----------------+----------------+----------------+----------------+ > + * | displ_asp_ratio_numer | 40 > + * +----------------+----------------+----------------+----------------+ > + * | displ_asp_ratio_denom | 44 > + * +----------------+----------------+----------------+----------------+ > + * | frame_rate_numer | 48 > + * +----------------+----------------+----------------+----------------+ > + * | frame_rate_denom | 52 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 56 > + * +----------------+----------------+----------------+----------------+ > + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 64 > + * +----------------+----------------+----------------+----------------+ > + * > + * Meaning of the corresponding values in this response is the same as for > + * XENCAMERA_OP_CONFIG_SET and XENCAMERA_OP_FRAME_RATE_SET requests. > + * > + * colorspace - uint32_t, this supplements pixel_format parameter, > + * one of the XENCAMERA_COLORSPACE_XXX. > + * xfer_func - uint32_t, this supplements colorspace parameter, > + * one of the XENCAMERA_XFER_FUNC_XXX. > + * ycbcr_enc - uint32_t, this supplements colorspace parameter, > + * one of the XENCAMERA_YCBCR_ENC_XXX. Please note, that ycbcr_enc is only > + * valid for YCbCr pixelformats and should be ignored otherwise. > + * quantization - uint32_t, this supplements colorspace parameter, > + * one of the XENCAMERA_QUANTIZATION_XXX. > + * displ_asp_ratio_numer - uint32_t, numerator of the display aspect ratio. > + * displ_asp_ratio_denom - uint32_t, denominator of the display aspect ratio. > + */ > +struct xencamera_config_resp { > + uint32_t pixel_format; > + uint32_t width; > + uint32_t height; > + uint32_t colorspace; > + uint32_t xfer_func; > + uint32_t ycbcr_enc; > + uint32_t quantization; > + uint32_t displ_asp_ratio_numer; > + uint32_t displ_asp_ratio_denom; > + uint32_t frame_rate_numer; > + uint32_t frame_rate_denom; > +}; > + > +/* > + * Request buffer response - response for XENCAMERA_OP_BUF_GET_LAYOUT > + * request: > + * 0 1 2 3 octet > + * +----------------+----------------+----------------+----------------+ > + * | id |_BUF_GET_LAYOUT | reserved | 4 > + * +----------------+----------------+----------------+----------------+ > + * | status | 8 > + * +----------------+----------------+----------------+----------------+ > + * | num_planes | reserved | 12 > + * +----------------+----------------+----------------+----------------+ > + * | size | 16 > + * +----------------+----------------+----------------+----------------+ > + * | plane_size[0] | 20 > + * +----------------+----------------+----------------+----------------+ > + * | plane_size[1] | 24 > + * +----------------+----------------+----------------+----------------+ > + * | plane_size[2] | 28 > + * +----------------+----------------+----------------+----------------+ > + * | plane_size[3] | 32 > + * +----------------+----------------+----------------+----------------+ > + * | plane_stride[0] | 36 > + * +----------------+----------------+----------------+----------------+ > + * | plane_stride[1] | 40 > + * +----------------+----------------+----------------+----------------+ > + * | plane_stride[2] | 44 > + * +----------------+----------------+----------------+----------------+ > + * | plane_stride[3] | 48 > + * +----------------+----------------+----------------+----------------+ > + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 64 > + * +----------------+----------------+----------------+----------------+ > + * > + * num_planes - uint8_t, number of planes of the buffer. > + * size - uint32_t, overall size of the buffer including sizes of the > + * individual planes and padding if applicable. > + * 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. > + * > + * Note! The sizes and strides in this response apply to all buffers created > + * with XENCAMERA_OP_BUF_CREATE command, but individual buffers may have > + * different plane offsets, see XENCAMERA_OP_BUF_REQUEST.plane_offset. > + */ > +struct xencamera_buf_get_layout_resp { > + uint8_t num_planes; > + uint8_t reserved[3]; > + uint32_t size; > + uint32_t plane_size[XENCAMERA_MAX_PLANE]; > + uint32_t plane_stride[XENCAMERA_MAX_PLANE]; > +}; > + > +/* > + * Request buffer response - response for XENCAMERA_OP_BUF_REQUEST > + * request: > + * 0 1 2 3 octet > + * +----------------+----------------+----------------+----------------+ > + * | id |_OP_BUF_REQUEST | reserved | 4 > + * +----------------+----------------+----------------+----------------+ > + * | status | 8 > + * +----------------+----------------+----------------+----------------+ > + * | num_buffers | reserved | 12 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 16 > + * +----------------+----------------+----------------+----------------+ > + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 64 > + * +----------------+----------------+----------------+----------------+ > + * > + * num_buffers - uint8_t, number of buffers to be used. > + * > + * > + * Control enumerate response - response for XENCAMERA_OP_CTRL_ENUM: > + * 0 1 2 3 octet > + * +----------------+----------------+----------------+----------------+ > + * | id | _OP_CTRL_ENUM | reserved | 4 > + * +----------------+----------------+----------------+----------------+ > + * | status | 8 > + * +----------------+----------------+----------------+----------------+ > + * | index | type | reserved | 12 > + * +----------------+----------------+----------------+----------------+ > + * | flags | 16 > + * +----------------+----------------+----------------+----------------+ > + * | min low 32-bits | 20 > + * +----------------+----------------+----------------+----------------+ > + * | min high 32-bits | 24 > + * +----------------+----------------+----------------+----------------+ > + * | max low 32-bits | 28 > + * +----------------+----------------+----------------+----------------+ > + * | max high 32-bits | 32 > + * +----------------+----------------+----------------+----------------+ > + * | step low 32-bits | 36 > + * +----------------+----------------+----------------+----------------+ > + * | step high 32-bits | 40 > + * +----------------+----------------+----------------+----------------+ > + * | def_val low 32-bits | 44 > + * +----------------+----------------+----------------+----------------+ > + * | def_val high 32-bits | 48 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 52 > + * +----------------+----------------+----------------+----------------+ > + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| > + * +----------------+----------------+----------------+----------------+ > + * | 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. > + * flags - uint32_t, flags of the control, one of the XENCAMERA_CTRL_FLG_XXX. > + * min - int64_t, minimum value of the control. > + * max - int64_t, maximum value of the control. > + * step - int64_t, minimum size in which control value can be changed. > + * def_val - int64_t, default value of the control. > + */ > +struct xencamera_ctrl_enum_resp { > + uint8_t index; > + uint8_t type; > + uint8_t reserved[2]; > + uint32_t flags; > + int64_t min; > + int64_t max; > + int64_t step; > + int64_t def_val; > +}; > + > +/* > + * Get control response - response for XENCAMERA_OP_CTRL_GET: > + * 0 1 2 3 octet > + * +----------------+----------------+----------------+----------------+ > + * | id | _OP_CTRL_GET | reserved | 4 > + * +----------------+----------------+----------------+----------------+ > + * | status | 8 > + * +----------------+----------------+----------------+----------------+ > + * | type | reserved | 12 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 16 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 20 > + * +----------------+----------------+----------------+----------------+ > + * | value low 32-bit | 24 > + * +----------------+----------------+----------------+----------------+ > + * | value high 32-bit | 28 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 32 > + * +----------------+----------------+----------------+----------------+ > + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 64 > + * +----------------+----------------+----------------+----------------+ > + * > + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. > + * value - int64_t, new value of the control. > + */ > + > +/* > + *----------------------------------- 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 > + * +----------------+----------------+----------------+----------------+ > + * | seq_num | 20 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 24 > + * +----------------+----------------+----------------+----------------+ > + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 64 > + * +----------------+----------------+----------------+----------------+ > + * > + * index - uint8_t, index of the buffer that contains new captured frame, > + * see XENCAMERA_OP_BUF_CREATE description on the range > + * used_sz - uint32_t, number of octets this frame has. This can be less > + * than the XENCAMERA_OP_BUF_REQUEST.size (response) for compressed formats. > + * seq_num - uint32_t, sequential number of the frame. Must be > + * monotonically increasing. If skips are detected in seq_num then that > + * means that the frames in-between were dropped. Note however that not > + * all video capture hardware is capable of detecting dropped frames. > + * In that case there will be no skips in the sequence counter. > + */ > +struct xencamera_frame_avail_evt { > + uint8_t index; > + uint8_t reserved[3]; > + uint32_t used_sz; > + uint32_t seq_num; > +}; > + > +/* > + * Control change event- event from back to front when camera control > + * has changed: > + * 0 1 2 3 octet > + * +----------------+----------------+----------------+----------------+ > + * | id |_EVT_CTRL_CHANGE| reserved | 4 > + * +----------------+----------------+----------------+----------------+ > + * | type | reserved | 8 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 12 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 16 > + * +----------------+----------------+----------------+----------------+ > + * | value low 32-bit | 20 > + * +----------------+----------------+----------------+----------------+ > + * | value high 32-bit | 24 > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 28 > + * +----------------+----------------+----------------+----------------+ > + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| > + * +----------------+----------------+----------------+----------------+ > + * | reserved | 64 > + * +----------------+----------------+----------------+----------------+ > + * > + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. > + * value - int64_t, new value of the control. > + * > + * Notes: > + * - this event is not sent for write-only controls > + * - this event is not sent to the originator of the control change > + * - this event is not sent when frontend first connects, e.g. initial > + * control state must be explicitly queried > + */ > + > +struct xencamera_req { > + uint16_t id; > + uint8_t operation; > + uint8_t reserved[5]; > + union { > + struct xencamera_config_req config; > + struct xencamera_frame_rate_req frame_rate; > + struct xencamera_buf_request buf_request; > + struct xencamera_buf_create_req buf_create; > + struct xencamera_index index; > + struct xencamera_ctrl_value ctrl_value; > + struct xencamera_get_ctrl_req get_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_resp config; > + struct xencamera_buf_get_layout_resp buf_layout; > + struct xencamera_buf_request buf_request; > + struct xencamera_ctrl_enum_resp ctrl_enum; > + struct xencamera_ctrl_value ctrl_value; > + 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; > + struct xencamera_ctrl_value ctrl_value; > + 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: > + */ > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hans Verkuil Subject: Re: [PATCH v6 1/1] cameraif: add ABI for para-virtual camera Date: Fri, 22 Mar 2019 09:22:07 +0100 Message-ID: References: <20190322073742.14639-1-andr2000@gmail.com> <20190322073742.14639-2-andr2000@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1h7FRS-0007C0-O1 for xen-devel@lists.xenproject.org; Fri, 22 Mar 2019 08:22:18 +0000 In-Reply-To: <20190322073742.14639-2-andr2000@gmail.com> Content-Language: en-US List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: Oleksandr Andrushchenko , xen-devel@lists.xenproject.org, konrad.wilk@oracle.com, jgross@suse.com, boris.ostrovsky@oracle.com, mchehab@kernel.org, linux-media@vger.kernel.org, sakari.ailus@linux.intel.com, koji.matsuoka.xm@renesas.com Cc: Oleksandr Andrushchenko List-Id: xen-devel@lists.xenproject.org T24gMy8yMi8xOSA4OjM3IEFNLCBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbyB3cm90ZToKPiBGcm9t OiBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbyA8b2xla3NhbmRyX2FuZHJ1c2hjaGVua29AZXBhbS5j b20+Cj4gCj4gVGhpcyBpcyB0aGUgQUJJIGZvciB0aGUgdHdvIGhhbHZlcyBvZiBhIHBhcmEtdmly dHVhbGl6ZWQKPiBjYW1lcmEgZHJpdmVyIHdoaWNoIGV4dGVuZHMgWGVuJ3MgcmVhY2ggbXVsdGlt ZWRpYSBjYXBhYmlsaXRpZXMgZXZlbgo+IGZhcnRoZXIgZW5hYmxpbmcgaXQgZm9yIHZpZGVvIGNv bmZlcmVuY2luZywgSW4tVmVoaWNsZSBJbmZvdGFpbm1lbnQsCj4gaGlnaCBkZWZpbml0aW9uIG1h cHMgZXRjLgo+IAo+IFRoZSBpbml0aWFsIGdvYWwgaXMgdG8gc3VwcG9ydCBtb3N0IG5lZWRlZCBm dW5jdGlvbmFsaXR5IHdpdGggdGhlCj4gZmluYWwgaWRlYSB0byBtYWtlIGl0IHBvc3NpYmxlIHRv IGV4dGVuZCB0aGUgcHJvdG9jb2wgaWYgbmVlZCBiZToKPiAKPiAxLiBQcm92aWRlIG1lYW5zIGZv ciBiYXNlIHZpcnR1YWwgZGV2aWNlIGNvbmZpZ3VyYXRpb246Cj4gIC0gcGl4ZWwgZm9ybWF0cwo+ ICAtIHJlc29sdXRpb25zCj4gIC0gZnJhbWUgcmF0ZXMKPiAyLiBTdXBwb3J0IGJhc2ljIGNhbWVy YSBjb250cm9sczoKPiAgLSBjb250cmFzdAo+ICAtIGJyaWdodG5lc3MKPiAgLSBodWUKPiAgLSBz YXR1cmF0aW9uCj4gMy4gU3VwcG9ydCBzdHJlYW1pbmcgY29udHJvbAo+IAo+IFNpZ25lZC1vZmYt Ynk6IE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIDxvbGVrc2FuZHJfYW5kcnVzaGNoZW5rb0BlcGFt LmNvbT4KCkxvb2tzIGdvb2QhCgpSZXZpZXdlZC1ieTogSGFucyBWZXJrdWlsIDxodmVya3VpbC1j aXNjb0B4czRhbGwubmw+CgpUaGFuayB5b3UgZm9yIGFsbCB5b3VyIHdvcmsgb24gdGhpcy4KClJl Z2FyZHMsCgoJSGFucwoKPiAtLS0KPiAgeGVuL2luY2x1ZGUvcHVibGljL2lvL2NhbWVyYWlmLmgg fCAxMzc0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ICAxIGZpbGUgY2hhbmdlZCwg MTM3NCBpbnNlcnRpb25zKCspCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCB4ZW4vaW5jbHVkZS9wdWJs aWMvaW8vY2FtZXJhaWYuaAo+IAo+IGRpZmYgLS1naXQgYS94ZW4vaW5jbHVkZS9wdWJsaWMvaW8v Y2FtZXJhaWYuaCBiL3hlbi9pbmNsdWRlL3B1YmxpYy9pby9jYW1lcmFpZi5oCj4gbmV3IGZpbGUg bW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLmFjYmNiZjNiZDQxMQo+IC0tLSAvZGV2 L251bGwKPiArKysgYi94ZW4vaW5jbHVkZS9wdWJsaWMvaW8vY2FtZXJhaWYuaAo+IEBAIC0wLDAg KzEsMTM3NCBAQAo+ICsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCj4gKyAqIGNhbWVyYWlmLmgKPiAr ICoKPiArICogVW5pZmllZCBjYW1lcmEgZGV2aWNlIEkvTyBpbnRlcmZhY2UgZm9yIFhlbiBndWVz dCBPU2VzLgo+ICsgKgo+ICsgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9m IGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cj4gKyAqIG9mIHRoaXMgc29m dHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIp LCB0bwo+ICsgKiBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNs dWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZQo+ICsgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBt b2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKPiAr ICogc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8g d2hvbSB0aGUgU29mdHdhcmUgaXMKPiArICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRv IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiArICoKPiArICogVGhlIGFib3ZlIGNvcHlyaWdo dCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4K PiArICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUu Cj4gKyAqCj4gKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdB UlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gKyAqIElNUExJRUQsIElOQ0xVRElORyBC VVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+ICsg KiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJ TiBOTyBFVkVOVCBTSEFMTCBUSEUKPiArICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBC RSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+ICsgKiBMSUFCSUxJVFks IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJ U0lORwo+ICsgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FS RSBPUiBUSEUgVVNFIE9SIE9USEVSCj4gKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KPiAr ICoKPiArICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMTkgRVBBTSBTeXN0ZW1zIEluYy4KPiArICoK PiArICogQXV0aG9yOiBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbyA8b2xla3NhbmRyX2FuZHJ1c2hj aGVua29AZXBhbS5jb20+Cj4gKyAqLwo+ICsKPiArI2lmbmRlZiBfX1hFTl9QVUJMSUNfSU9fQ0FN RVJBSUZfSF9fCj4gKyNkZWZpbmUgX19YRU5fUFVCTElDX0lPX0NBTUVSQUlGX0hfXwo+ICsKPiAr I2luY2x1ZGUgInJpbmcuaCIKPiArI2luY2x1ZGUgIi4uL2dyYW50X3RhYmxlLmgiCj4gKwo+ICsv Kgo+ICsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqCj4gKyAqICAgICAgICAgICAgICAgICAgICAgICAg ICAgUHJvdG9jb2wgdmVyc2lvbgo+ICsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCj4gKyAqLwo+ICsj ZGVmaW5lIFhFTkNBTUVSQV9QUk9UT0NPTF9WRVJTSU9OICAgICAiMSIKPiArCj4gKy8qCj4gKyAq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioKPiArICogICAgICAgICAgICAgICAgICBGZWF0dXJlIGFuZCBQ YXJhbWV0ZXIgTmVnb3RpYXRpb24KPiArICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgo+ICsgKgo+ICsg KiBGcm9udC0+YmFjayBub3RpZmljYXRpb25zOiB3aGVuIGVucXVldWluZyBhIG5ldyByZXF1ZXN0 LCBzZW5kaW5nIGEKPiArICogbm90aWZpY2F0aW9uIGNhbiBiZSBtYWRlIGNvbmRpdGlvbmFsIG9u IHhlbmNhbWVyYV9yZXEgKGkuZS4sIHRoZSBnZW5lcmljCj4gKyAqIGhvbGQtb2ZmIG1lY2hhbmlz bSBwcm92aWRlZCBieSB0aGUgcmluZyBtYWNyb3MpLiBCYWNrZW5kcyBtdXN0IHNldAo+ICsgKiB4 ZW5jYW1lcmFfcmVxIGFwcHJvcHJpYXRlbHkgKGUuZy4sIHVzaW5nIFJJTkdfRklOQUxfQ0hFQ0tf Rk9SX1JFUVVFU1RTKCkpLgo+ICsgKgo+ICsgKiBCYWNrLT5mcm9udCBub3RpZmljYXRpb25zOiB3 aGVuIGVucXVldWluZyBhIG5ldyByZXNwb25zZSwgc2VuZGluZyBhCj4gKyAqIG5vdGlmaWNhdGlv biBjYW4gYmUgbWFkZSBjb25kaXRpb25hbCBvbiB4ZW5jYW1lcmFfcmVzcCAoaS5lLiwgdGhlIGdl bmVyaWMKPiArICogaG9sZC1vZmYgbWVjaGFuaXNtIHByb3ZpZGVkIGJ5IHRoZSByaW5nIG1hY3Jv cykuIEZyb250ZW5kcyBtdXN0IHNldAo+ICsgKiB4ZW5jYW1lcmFfcmVzcCBhcHByb3ByaWF0ZWx5 IChlLmcuLCB1c2luZyBSSU5HX0ZJTkFMX0NIRUNLX0ZPUl9SRVNQT05TRVMoKSkuCj4gKyAqCj4g KyAqIFRoZSB0d28gaGFsdmVzIG9mIGEgcGFyYS12aXJ0dWFsIGNhbWVyYSBkcml2ZXIgdXRpbGl6 ZSBub2RlcyB3aXRoaW4KPiArICogWGVuU3RvcmUgdG8gY29tbXVuaWNhdGUgY2FwYWJpbGl0aWVz IGFuZCB0byBuZWdvdGlhdGUgb3BlcmF0aW5nIHBhcmFtZXRlcnMuCj4gKyAqIFRoaXMgc2VjdGlv biBlbnVtZXJhdGVzIHRoZXNlIG5vZGVzIHdoaWNoIHJlc2lkZSBpbiB0aGUgcmVzcGVjdGl2ZSBm cm9udCBhbmQKPiArICogYmFja2VuZCBwb3J0aW9ucyBvZiBYZW5TdG9yZSwgZm9sbG93aW5nIHRo ZSBYZW5CdXMgY29udmVudGlvbi4KPiArICoKPiArICogQWxsIGRhdGEgaW4gWGVuU3RvcmUgaXMg c3RvcmVkIGFzIHN0cmluZ3MuIE5vZGVzIHNwZWNpZnlpbmcgbnVtZXJpYwo+ICsgKiB2YWx1ZXMg YXJlIGVuY29kZWQgaW4gZGVjaW1hbC4gSW50ZWdlciB2YWx1ZSByYW5nZXMgbGlzdGVkIGJlbG93 IGFyZQo+ICsgKiBleHByZXNzZWQgYXMgZml4ZWQgc2l6ZWQgaW50ZWdlciB0eXBlcyBjYXBhYmxl IG9mIHN0b3JpbmcgdGhlIGNvbnZlcnNpb24KPiArICogb2YgYSBwcm9wZXJseSBmb3JtYXR0ZWQg bm9kZSBzdHJpbmcsIHdpdGhvdXQgbG9zcyBvZiBpbmZvcm1hdGlvbi4KPiArICoKPiArICoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKgo+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGUgY29u ZmlndXJhdGlvbgo+ICsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCj4gKyAqCj4gKyAqIFRoaXMgaXMg YW4gZXhhbXBsZSBvZiBiYWNrZW5kIGFuZCBmcm9udGVuZCBjb25maWd1cmF0aW9uOgo+ICsgKgo+ ICsgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCYWNrZW5kIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gKyAqCj4gKyAqIC9sb2NhbC9kb21haW4vMC9iYWNr ZW5kL3ZjYW1lcmEvMS8wL2Zyb250ZW5kLWlkID0gIjEiCj4gKyAqIC9sb2NhbC9kb21haW4vMC9i YWNrZW5kL3ZjYW1lcmEvMS8wL2Zyb250ZW5kID0gIi9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNh bWVyYS8wIgo+ICsgKiAvbG9jYWwvZG9tYWluLzAvYmFja2VuZC92Y2FtZXJhLzEvMC9zdGF0ZSA9 ICI0Igo+ICsgKiAvbG9jYWwvZG9tYWluLzAvYmFja2VuZC92Y2FtZXJhLzEvMC92ZXJzaW9ucyA9 ICIxLDIiCj4gKyAqCj4gKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZyb250 ZW5kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiArICoKPiArICogL2xvY2Fs L2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvYmFja2VuZC1pZCA9ICIwIgo+ICsgKiAvbG9jYWwv ZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC9iYWNrZW5kID0gIi9sb2NhbC9kb21haW4vMC9iYWNr ZW5kL3ZjYW1lcmEvMSIKPiArICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvc3Rh dGUgPSAiNCIKPiArICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvdmVyc2lvbiA9 ICIxIgo+ICsgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC9iZS1hbGxvYyA9ICIx Igo+ICsgKgo+ICsgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRGV2aWNlIDAgY29uZmln dXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gKyAqCj4gKyAqIC9sb2NhbC9kb21h aW4vMS9kZXZpY2UvdmNhbWVyYS8wL21heC1idWZmZXJzID0gIjMiCj4gKyAqIC9sb2NhbC9kb21h aW4vMS9kZXZpY2UvdmNhbWVyYS8wL2NvbnRyb2xzID0gImNvbnRyYXN0LGh1ZSIKPiArICogL2xv Y2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvZm9ybWF0cy9ZVVlWLzY0MHg0ODAvZnJhbWUt cmF0ZXMgPSAiMzAvMSwxNS8xIgo+ICsgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEv MC9mb3JtYXRzL1lVWVYvMTkyMHgxMDgwL2ZyYW1lLXJhdGVzID0gIjE1LzIiCj4gKyAqIC9sb2Nh bC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8wL2Zvcm1hdHMvQkdSQS82NDB4NDgwL2ZyYW1lLXJh dGVzID0gIjE1LzEsMTUvMiIKPiArICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAv Zm9ybWF0cy9CR1JBLzEyMDB4NzIwL2ZyYW1lLXJhdGVzID0gIjE1LzIiCj4gKyAqIC9sb2NhbC9k b21haW4vMS9kZXZpY2UvdmNhbWVyYS8wL3VuaXF1ZS1pZCA9ICIwIgo+ICsgKiAvbG9jYWwvZG9t YWluLzEvZGV2aWNlL3ZjYW1lcmEvMC9yZXEtcmluZy1yZWYgPSAiMjgzMiIKPiArICogL2xvY2Fs L2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvcmVxLWV2ZW50LWNoYW5uZWwgPSAiMTUiCj4gKyAq IC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8wL2V2dC1yaW5nLXJlZiA9ICIzODciCj4g KyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8wL2V2dC1ldmVudC1jaGFubmVsID0g IjE2Igo+ICsgKgo+ICsgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRGV2aWNlIDEgY29u ZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gKyAqCj4gKyAqIC9sb2NhbC9k b21haW4vMS9kZXZpY2UvdmNhbWVyYS8xL21heC1idWZmZXJzID0gIjgiCj4gKyAqIC9sb2NhbC9k b21haW4vMS9kZXZpY2UvdmNhbWVyYS8xL2NvbnRyb2xzID0gImJyaWdodG5lc3Msc2F0dXJhdGlv bixodWUiCj4gKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8xL2Zvcm1hdHMvWVVZ Vi82NDB4NDgwL2ZyYW1lLXJhdGVzID0gIjMwLzEsMTUvMiIKPiArICogL2xvY2FsL2RvbWFpbi8x L2RldmljZS92Y2FtZXJhLzEvZm9ybWF0cy9ZVVlWLzE5MjB4MTA4MC9mcmFtZS1yYXRlcyA9ICIx NS8yIgo+ICsgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMS91bmlxdWUtaWQgPSAi MSIKPiArICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzEvcmVxLXJpbmctcmVmID0g IjI4MzMiCj4gKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8xL3JlcS1ldmVudC1j aGFubmVsID0gIjE3Igo+ICsgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMS9ldnQt cmluZy1yZWYgPSAiMzg4Igo+ICsgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMS9l dnQtZXZlbnQtY2hhbm5lbCA9ICIxOCIKPiArICoKPiArICoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgo+ ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWNrZW5kIFhlbkJ1cyBOb2Rlcwo+ICsg KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqCj4gKyAqCj4gKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0gUHJvdG9jb2wgdmVyc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiAr ICoKPiArICogdmVyc2lvbnMKPiArICogICAgICBWYWx1ZXM6ICAgICAgICAgPHN0cmluZz4KPiAr ICoKPiArICogICAgICBMaXN0IG9mIFhFTkNBTUVSQV9MSVNUX1NFUEFSQVRPUiBzZXBhcmF0ZWQg cHJvdG9jb2wgdmVyc2lvbnMgc3VwcG9ydGVkCj4gKyAqICAgICAgYnkgdGhlIGJhY2tlbmQuIEZv ciBleGFtcGxlICIxLDIsMyIuCj4gKyAqCj4gKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKPiArICog ICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJvbnRlbmQgWGVuQnVzIE5vZGVzCj4gKyAqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioKPiArICoKPiArICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLSBBZGRyZXNzaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICsgKgo+ ICsgKiBkb20taWQKPiArICogICAgICBWYWx1ZXM6ICAgICAgICAgPHVpbnQxNl90Pgo+ICsgKgo+ ICsgKiAgICAgIERvbWFpbiBpZGVudGlmaWVyLgo+ICsgKgo+ICsgKiBkZXYtaWQKPiArICogICAg ICBWYWx1ZXM6ICAgICAgICAgPHVpbnQxNl90Pgo+ICsgKgo+ICsgKiAgICAgIERldmljZSBpZGVu dGlmaWVyLgo+ICsgKgo+ICsgKiAgICAgIC9sb2NhbC9kb21haW4vPGRvbS1pZD4vZGV2aWNlL3Zj YW1lcmEvPGRldi1pZD4vLi4uCj4gKyAqCj4gKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0gUHJvdG9jb2wgdmVyc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiArICoK PiArICogdmVyc2lvbgo+ICsgKiAgICAgIFZhbHVlczogICAgICAgICA8c3RyaW5nPgo+ICsgKgo+ ICsgKiAgICAgIFByb3RvY29sIHZlcnNpb24sIGNob3NlbiBhbW9uZyB0aGUgb25lcyBzdXBwb3J0 ZWQgYnkgdGhlIGJhY2tlbmQuCj4gKyAqCj4gKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBC YWNrZW5kIGJ1ZmZlciBhbGxvY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiArICoK PiArICogYmUtYWxsb2MKPiArICogICAgICBWYWx1ZXM6ICAgICAgICAgIjAiLCAiMSIKPiArICoK PiArICogICAgICBJZiB2YWx1ZSBpcyBzZXQgdG8gIjEiLCB0aGVuIGJhY2tlbmQgd2lsbCBiZSB0 aGUgYnVmZmVyCj4gKyAqICAgICAgcHJvdmlkZXIvYWxsb2NhdG9yIGZvciB0aGlzIGRvbWFpbiBk dXJpbmcgWEVOQ0FNRVJBX09QX0JVRl9DUkVBVEUKPiArICogICAgICBvcGVyYXRpb24uCj4gKyAq ICAgICAgSWYgdmFsdWUgaXMgbm90ICIxIiBvciBvbWl0dGVkIGZyb250ZW5kIG11c3QgYWxsb2Nh dGUgYnVmZmVycyBpdHNlbGYuCj4gKyAqCj4gKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLSBDYW1lcmEgc2V0dGluZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiArICoK PiArICogdW5pcXVlLWlkCj4gKyAqICAgICAgVmFsdWVzOiAgICAgICAgIDxzdHJpbmc+Cj4gKyAq Cj4gKyAqICAgICAgQWZ0ZXIgZGV2aWNlIGluc3RhbmNlIGluaXRpYWxpemF0aW9uIGVhY2ggY2Ft ZXJhIGlzIGFzc2lnbmVkIGEKPiArICogICAgICB1bmlxdWUgSUQsIHNvIGl0IGNhbiBiZSBpZGVu dGlmaWVkIGJ5IHRoZSBiYWNrZW5kIGJ5IHRoaXMgSUQuCj4gKyAqICAgICAgVGhpcyBjYW4gYmUg VVVJRCBvciBzdWNoLgo+ICsgKgo+ICsgKiBtYXgtYnVmZmVycwo+ICsgKiAgICAgIFZhbHVlczog ICAgICAgICA8dWludDhfdD4KPiArICoKPiArICogICAgICBNYXhpbXVtIG51bWJlciBvZiBjYW1l cmEgYnVmZmVycyB0aGlzIGZyb250ZW5kIG1heSB1c2UuCj4gKyAqCj4gKyAqIGNvbnRyb2xzCj4g KyAqICAgICAgVmFsdWVzOiAgICAgICAgIDxsaXN0IG9mIHN0cmluZz4KPiArICoKPiArICogICAg ICBMaXN0IG9mIHN1cHBvcnRlZCBjYW1lcmEgY29udHJvbHMgc2VwYXJhdGVkIGJ5IFhFTkNBTUVS QV9MSVNUX1NFUEFSQVRPUi4KPiArICogICAgICBDYW1lcmEgY29udHJvbHMgYXJlIGV4cHJlc3Nl ZCBhcyBhIGxpc3Qgb2Ygc3RyaW5nIHZhbHVlcyB3L28gYW55Cj4gKyAqICAgICAgb3JkZXJpbmcg cmVxdWlyZW1lbnQuCj4gKyAqCj4gKyAqIGZvcm1hdHMKPiArICogICAgICBWYWx1ZXM6ICAgICAg ICAgPGZvcm1hdCwgY2hhcls3XT4KPiArICoKPiArICogICAgICBGb3JtYXRzIGFyZSBvcmdhbml6 ZWQgYXMgYSBzZXQgb2YgZGlyZWN0b3JpZXMgb25lIHBlciBlYWNoCj4gKyAqICAgICAgc3VwcG9y dGVkIHBpeGVsIGZvcm1hdC4gVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBpcyB0aGUKPiArICog ICAgICBjb3JyZXNwb25kaW5nIEZPVVJDQyBzdHJpbmcgbGFiZWwuIFRoZSBuZXh0IGxldmVsIG9m Cj4gKyAqICAgICAgdGhlIGRpcmVjdG9yeSB1bmRlciA8Zm9ybWF0cz4gcmVwcmVzZW50cyBzdXBw b3J0ZWQgcmVzb2x1dGlvbnMuCj4gKyAqICAgICAgSWYgdGhlIGZvcm1hdCByZXByZXNlbnRzIGEg YmlnLWVuZGlhbiB2YXJpYW50IG9mIGEgbGl0dGxlCj4gKyAqICAgICAgZW5kaWFuIGZvcm1hdCwg dGhlbiB0aGUgIi1CRSIgc3VmZml4IG11c3QgYmUgYWRkZWQuIEUuZy4gJ0FSMTUnIHZzCj4gKyAq ICAgICAgJ0FSMTUtQkUnLgo+ICsgKiAgICAgIElmIEZPVVJDQyBzdHJpbmcgbGFiZWwgaGFzIHNw YWNlcyB0aGVuIHRob3NlIGFyZSBvbmx5IGFsbG93ZWQgdG8KPiArICogICAgICBiZSBhdCB0aGUg ZW5kIG9mIHRoZSBsYWJlbCBhbmQgbXVzdCBiZSB0cmltbWVkLCBmb3IgZXhhbXBsZQo+ICsgKiAg ICAgICdZMTYnIGFuZCAnWTE2LUJFJyB3aWxsIGJlIHRyaW1tZWQuCj4gKyAqCj4gKyAqIHJlc29s dXRpb24KPiArICogICAgICBWYWx1ZXM6ICAgICAgICAgPHdpZHRoLCB1aW50MzJfdD54PGhlaWdo dCwgdWludDMyX3Q+Cj4gKyAqCj4gKyAqICAgICAgUmVzb2x1dGlvbnMgYXJlIG9yZ2FuaXplZCBh cyBhIHNldCBvZiBkaXJlY3RvcmllcyBvbmUgcGVyIGVhY2gKPiArICogICAgICBzdXBwb3J0ZWQg cmVzb2x1dGlvbiB1bmRlciBjb3JyZXNwb25kaW5nIDxmb3JtYXRzPiBkaXJlY3RvcnkuCj4gKyAq ICAgICAgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBpcyB0aGUgc3VwcG9ydGVkIHdpZHRoIGFu ZCBoZWlnaHQKPiArICogICAgICBvZiB0aGUgY2FtZXJhIHJlc29sdXRpb24gaW4gcGl4ZWxzLgo+ ICsgKgo+ICsgKiBmcmFtZS1yYXRlcwo+ICsgKiAgICAgIFZhbHVlczogICAgICAgICA8bnVtZXJh dG9yLCB1aW50MzJfdD4vPGRlbm9taW5hdG9yLCB1aW50MzJfdD4KPiArICoKPiArICogICAgICBM aXN0IG9mIFhFTkNBTUVSQV9GUkFNRV9SQVRFX1NFUEFSQVRPUiBzZXBhcmF0ZWQgc3VwcG9ydGVk IGZyYW1lIHJhdGVzCj4gKyAqICAgICAgb2YgdGhlIGNhbWVyYSBleHByZXNzZWQgYXMgbnVtZXJh dG9yIGFuZCBkZW5vbWluYXRvciBvZiB0aGUKPiArICogICAgICBjb3JyZXNwb25kaW5nIGZyYW1l IHJhdGUuCj4gKyAqCj4gKyAqLS0tLS0tLS0tLS0tLS0tLS0tLSBDYW1lcmEgUmVxdWVzdCBUcmFu c3BvcnQgUGFyYW1ldGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiArICoKPiArICogVGhpcyBj b21tdW5pY2F0aW9uIHBhdGggaXMgdXNlZCB0byBkZWxpdmVyIHJlcXVlc3RzIGZyb20gZnJvbnRl bmQgdG8gYmFja2VuZAo+ICsgKiBhbmQgZ2V0IHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlcyBm cm9tIGJhY2tlbmQgdG8gZnJvbnRlbmQsCj4gKyAqIHNldCB1cCBwZXIgdmlydHVhbCBjYW1lcmEg ZGV2aWNlLgo+ICsgKgo+ICsgKiByZXEtZXZlbnQtY2hhbm5lbAo+ICsgKiAgICAgIFZhbHVlczog ICAgICAgICA8dWludDMyX3Q+Cj4gKyAqCj4gKyAqICAgICAgVGhlIGlkZW50aWZpZXIgb2YgdGhl IFhlbiBjYW1lcmEncyBjb250cm9sIGV2ZW50IGNoYW5uZWwKPiArICogICAgICB1c2VkIHRvIHNp Z25hbCBhY3Rpdml0eSBpbiB0aGUgcmluZyBidWZmZXIuCj4gKyAqCj4gKyAqIHJlcS1yaW5nLXJl Zgo+ICsgKiAgICAgIFZhbHVlczogICAgICAgICA8dWludDMyX3Q+Cj4gKyAqCj4gKyAqICAgICAg VGhlIFhlbiBncmFudCByZWZlcmVuY2UgZ3JhbnRpbmcgcGVybWlzc2lvbiBmb3IgdGhlIGJhY2tl bmQgdG8gbWFwCj4gKyAqICAgICAgYSBzb2xlIHBhZ2Ugb2YgY2FtZXJhJ3MgY29udHJvbCByaW5n IGJ1ZmZlci4KPiArICoKPiArICotLS0tLS0tLS0tLS0tLS0tLS0tLSBDYW1lcmEgRXZlbnQgVHJh bnNwb3J0IFBhcmFtZXRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICsgKgo+ICsgKiBUaGlz IGNvbW11bmljYXRpb24gcGF0aCBpcyB1c2VkIHRvIGRlbGl2ZXIgYXN5bmNocm9ub3VzIGV2ZW50 cyBmcm9tIGJhY2tlbmQKPiArICogdG8gZnJvbnRlbmQsIHNldCB1cCBwZXIgdmlydHVhbCBjYW1l cmEgZGV2aWNlLgo+ICsgKgo+ICsgKiBldnQtZXZlbnQtY2hhbm5lbAo+ICsgKiAgICAgIFZhbHVl czogICAgICAgICA8dWludDMyX3Q+Cj4gKyAqCj4gKyAqICAgICAgVGhlIGlkZW50aWZpZXIgb2Yg dGhlIFhlbiBjYW1lcmEncyBldmVudCBjaGFubmVsCj4gKyAqICAgICAgdXNlZCB0byBzaWduYWwg YWN0aXZpdHkgaW4gdGhlIHJpbmcgYnVmZmVyLgo+ICsgKgo+ICsgKiBldnQtcmluZy1yZWYKPiAr ICogICAgICBWYWx1ZXM6ICAgICAgICAgPHVpbnQzMl90Pgo+ICsgKgo+ICsgKiAgICAgIFRoZSBY ZW4gZ3JhbnQgcmVmZXJlbmNlIGdyYW50aW5nIHBlcm1pc3Npb24gZm9yIHRoZSBiYWNrZW5kIHRv IG1hcAo+ICsgKiAgICAgIGEgc29sZSBwYWdlIG9mIGNhbWVyYSdzIGV2ZW50IHJpbmcgYnVmZmVy Lgo+ICsgKi8KPiArCj4gKy8qCj4gKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKPiArICogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgU1RBVEUgRElBR1JBTVMKPiArICoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKgo+ICsgKgo+ICsgKiBUb29sIHN0YWNrIGNyZWF0ZXMgZnJvbnQgYW5kIGJhY2sgc3Rh dGUgbm9kZXMgd2l0aCBpbml0aWFsIHN0YXRlCj4gKyAqIFhlbmJ1c1N0YXRlSW5pdGlhbGlzaW5n Lgo+ICsgKiBUb29sIHN0YWNrIGNyZWF0ZXMgYW5kIHNldHMgdXAgZnJvbnRlbmQgY2FtZXJhIGNv bmZpZ3VyYXRpb24KPiArICogbm9kZXMgcGVyIGRvbWFpbi4KPiArICoKPiArICotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBOb3JtYWwgZmxvdyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQo+ICsgKgo+ICsgKiBGcm9udCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgQmFjawo+ICsgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gICAgPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo+ICsgKiBYZW5idXNTdGF0ZUluaXRpYWxp c2luZyAgICAgICAgICAgICAgWGVuYnVzU3RhdGVJbml0aWFsaXNpbmcKPiArICogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIFF1ZXJ5IGJhY2tlbmQgZGV2aWNlIGlkZW50 aWZpY2F0aW9uCj4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBk YXRhLgo+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gT3BlbiBh bmQgdmFsaWRhdGUgYmFja2VuZCBkZXZpY2UuCj4gKyAqICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfAo+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwKPiArICogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBWCj4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBYZW5idXNTdGF0ZUluaXRXYWl0Cj4gKyAqCj4gKyAqIG8gUXVlcnkgZnJvbnRlbmQg Y29uZmlndXJhdGlvbgo+ICsgKiBvIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplCj4gKyAqICAgZXZl bnQgY2hhbm5lbHMgcGVyIGNvbmZpZ3VyZWQKPiArICogICBjYW1lcmEuCj4gKyAqIG8gUHVibGlz aCB0cmFuc3BvcnQgcGFyYW1ldGVycwo+ICsgKiAgIHRoYXQgd2lsbCBiZSBpbiBlZmZlY3QgZHVy aW5nCj4gKyAqICAgdGhpcyBjb25uZWN0aW9uLgo+ICsgKiAgICAgICAgICAgICAgfAo+ICsgKiAg ICAgICAgICAgICAgfAo+ICsgKiAgICAgICAgICAgICAgVgo+ICsgKiBYZW5idXNTdGF0ZUluaXRp YWxpc2VkCj4gKyAqCj4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg byBRdWVyeSBmcm9udGVuZCB0cmFuc3BvcnQgcGFyYW1ldGVycy4KPiArICogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBvIENvbm5lY3QgdG8gdGhlIGV2ZW50IGNoYW5uZWxz Lgo+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwK PiArICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cj4g KyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVgo+ICsg KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWGVuYnVzU3RhdGVDb25uZWN0 ZWQKPiArICoKPiArICogIG8gQ3JlYXRlIGFuZCBpbml0aWFsaXplIE9TCj4gKyAqICAgIHZpcnR1 YWwgY2FtZXJhIGFzIHBlcgo+ICsgKiAgICBjb25maWd1cmF0aW9uLgo+ICsgKiAgICAgICAgICAg ICAgfAo+ICsgKiAgICAgICAgICAgICAgfAo+ICsgKiAgICAgICAgICAgICAgVgo+ICsgKiBYZW5i dXNTdGF0ZUNvbm5lY3RlZAo+ICsgKgo+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgWGVuYnVzU3RhdGVVbmtub3duCj4gKyAqICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBYZW5idXNTdGF0ZUNsb3NlZAo+ICsgKiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgWGVuYnVzU3RhdGVDbG9zaW5nCj4gKyAqIG8gUmVtb3ZlIHZpcnR1 YWwgY2FtZXJhIGRldmljZQo+ICsgKiBvIFJlbW92ZSBldmVudCBjaGFubmVscwo+ICsgKiAgICAg ICAgICAgICAgfAo+ICsgKiAgICAgICAgICAgICAgfAo+ICsgKiAgICAgICAgICAgICAgVgo+ICsg KiBYZW5idXNTdGF0ZUNsb3NlZAo+ICsgKgo+ICsgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0gUmVjb3ZlcnkgZmxvdyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gKyAq Cj4gKyAqIEluIGNhc2Ugb2YgZnJvbnRlbmQgdW5yZWNvdmVyYWJsZSBlcnJvcnMgYmFja2VuZCBo YW5kbGVzIHRoYXQgYXMKPiArICogaWYgZnJvbnRlbmQgZ29lcyBpbnRvIHRoZSBYZW5idXNTdGF0 ZUNsb3NlZCBzdGF0ZS4KPiArICoKPiArICogSW4gY2FzZSBvZiBiYWNrZW5kIHVucmVjb3ZlcmFi bGUgZXJyb3JzIGZyb250ZW5kIHRyaWVzIHJlbW92aW5nCj4gKyAqIHRoZSB2aXJ0dWFsaXplZCBk ZXZpY2UuIElmIHRoaXMgaXMgcG9zc2libGUgYXQgdGhlIG1vbWVudCBvZiBlcnJvciwKPiArICog dGhlbiBmcm9udGVuZCBnb2VzIGludG8gdGhlIFhlbmJ1c1N0YXRlSW5pdGlhbGlzaW5nIHN0YXRl IGFuZCBpcyByZWFkeSBmb3IKPiArICogbmV3IGNvbm5lY3Rpb24gd2l0aCBiYWNrZW5kLiBJZiB0 aGUgdmlydHVhbGl6ZWQgZGV2aWNlIGlzIHN0aWxsIGluIHVzZSBhbmQKPiArICogY2Fubm90IGJl IHJlbW92ZWQsIHRoZW4gZnJvbnRlbmQgZ29lcyBpbnRvIHRoZSBYZW5idXNTdGF0ZVJlY29uZmln dXJpbmcgc3RhdGUKPiArICogdW50aWwgZWl0aGVyIHRoZSB2aXJ0dWFsaXplZCBkZXZpY2UgaXMg cmVtb3ZlZCBvciBiYWNrZW5kIGluaXRpYXRlcyBhIG5ldwo+ICsgKiBjb25uZWN0aW9uLiBPbiB0 aGUgdmlydHVhbGl6ZWQgZGV2aWNlIHJlbW92YWwgZnJvbnRlbmQgZ29lcyBpbnRvIHRoZQo+ICsg KiBYZW5idXNTdGF0ZUluaXRpYWxpc2luZyBzdGF0ZS4KPiArICoKPiArICogTm90ZSBvbiBYZW5i dXNTdGF0ZVJlY29uZmlndXJpbmcgc3RhdGUgb2YgdGhlIGZyb250ZW5kOiBpZiBiYWNrZW5kIGhh cwo+ICsgKiB1bnJlY292ZXJhYmxlIGVycm9ycyB0aGVuIGZyb250ZW5kIGNhbm5vdCBzZW5kIHJl cXVlc3RzIHRvIHRoZSBiYWNrZW5kCj4gKyAqIGFuZCB0aHVzIGNhbm5vdCBwcm92aWRlIGZ1bmN0 aW9uYWxpdHkgb2YgdGhlIHZpcnR1YWxpemVkIGRldmljZSBhbnltb3JlLgo+ICsgKiBBZnRlciBi YWNrZW5kIGlzIGJhY2sgdG8gbm9ybWFsIHRoZSB2aXJ0dWFsaXplZCBkZXZpY2UgbWF5IHN0aWxs IGhvbGQgc29tZQo+ICsgKiBzdGF0ZTogY29uZmlndXJhdGlvbiBpbiB1c2UsIGFsbG9jYXRlZCBi dWZmZXJzLCBjbGllbnQgYXBwbGljYXRpb24gc3RhdGUgZXRjLgo+ICsgKiBJbiBtb3N0IGNhc2Vz LCB0aGlzIHdpbGwgcmVxdWlyZSBmcm9udGVuZCB0byBpbXBsZW1lbnQgY29tcGxleCByZWNvdmVy eQo+ICsgKiByZWNvbm5lY3QgbG9naWMuIEluc3RlYWQsIGJ5IGdvaW5nIGludG8gWGVuYnVzU3Rh dGVSZWNvbmZpZ3VyaW5nIHN0YXRlLAo+ICsgKiBmcm9udGVuZCB3aWxsIG1ha2Ugc3VyZSBubyBu ZXcgY2xpZW50cyBvZiB0aGUgdmlydHVhbGl6ZWQgZGV2aWNlIGFyZQo+ICsgKiBhY2NlcHRlZCwg YWxsb3cgZXhpc3RpbmcgY2xpZW50KHMpIHRvIGV4aXQgZ3JhY2VmdWxseSBieSBzaWduYWxpbmcg ZXJyb3IKPiArICogc3RhdGUgZXRjLgo+ICsgKiBPbmNlIGFsbCB0aGUgY2xpZW50cyBhcmUgZ29u ZSBmcm9udGVuZCBjYW4gcmVpbml0aWFsaXplIHRoZSB2aXJ0dWFsaXplZAo+ICsgKiBkZXZpY2Ug YW5kIGdldCBpbnRvIFhlbmJ1c1N0YXRlSW5pdGlhbGlzaW5nIHN0YXRlIGFnYWluIHNpZ25hbGlu ZyB0aGUKPiArICogYmFja2VuZCB0aGF0IGEgbmV3IGNvbm5lY3Rpb24gY2FuIGJlIG1hZGUuCj4g KyAqCj4gKyAqIFRoZXJlIGFyZSBtdWx0aXBsZSBjb25kaXRpb25zIHBvc3NpYmxlIHVuZGVyIHdo aWNoIGZyb250ZW5kIHdpbGwgZ28gZnJvbQo+ICsgKiBYZW5idXNTdGF0ZVJlY29uZmlndXJpbmcg aW50byBYZW5idXNTdGF0ZUluaXRpYWxpc2luZywgc29tZSBvZiB0aGVtIGFyZSBPUwo+ICsgKiBz cGVjaWZpYy4gRm9yIGV4YW1wbGU6Cj4gKyAqIDEuIFRoZSB1bmRlcmx5aW5nIE9TIGZyYW1ld29y ayBtYXkgcHJvdmlkZSBjYWxsYmFja3MgdG8gc2lnbmFsIHRoYXQgdGhlIGxhc3QKPiArICogICAg Y2xpZW50IG9mIHRoZSB2aXJ0dWFsaXplZCBkZXZpY2UgaGFzIGdvbmUgYW5kIHRoZSBkZXZpY2Ug Y2FuIGJlIHJlbW92ZWQKPiArICogMi4gRnJvbnRlbmQgY2FuIHNjaGVkdWxlIGEgZGVmZXJyZWQg d29yayAodGltZXIvdGFza2xldC93b3JrcXVldWUpCj4gKyAqICAgIHRvIHBlcmlvZGljYWxseSBj aGVjayBpZiB0aGlzIGlzIHRoZSByaWdodCB0aW1lIHRvIHJlLXRyeSByZW1vdmFsIG9mCj4gKyAq ICAgIHRoZSB2aXJ0dWFsaXplZCBkZXZpY2UuCj4gKyAqIDMuIEJ5IGFueSBvdGhlciBtZWFucy4K PiArICoKPiArICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgo+ICsgKiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgUkVRVUVTVCBDT0RFUwo+ICsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCj4gKyAqLwo+ ICsjZGVmaW5lIFhFTkNBTUVSQV9PUF9DT05GSUdfU0VUICAgICAgICAweDAwCj4gKyNkZWZpbmUg WEVOQ0FNRVJBX09QX0NPTkZJR19HRVQgICAgICAgIDB4MDEKPiArI2RlZmluZSBYRU5DQU1FUkFf T1BfQ09ORklHX1ZBTElEQVRFICAgMHgwMgo+ICsjZGVmaW5lIFhFTkNBTUVSQV9PUF9GUkFNRV9S QVRFX1NFVCAgICAweDAzCj4gKyNkZWZpbmUgWEVOQ0FNRVJBX09QX0JVRl9HRVRfTEFZT1VUICAg IDB4MDQKPiArI2RlZmluZSBYRU5DQU1FUkFfT1BfQlVGX1JFUVVFU1QgICAgICAgMHgwNQo+ICsj ZGVmaW5lIFhFTkNBTUVSQV9PUF9CVUZfQ1JFQVRFICAgICAgICAweDA2Cj4gKyNkZWZpbmUgWEVO Q0FNRVJBX09QX0JVRl9ERVNUUk9ZICAgICAgIDB4MDcKPiArI2RlZmluZSBYRU5DQU1FUkFfT1Bf QlVGX1FVRVVFICAgICAgICAgMHgwOAo+ICsjZGVmaW5lIFhFTkNBTUVSQV9PUF9CVUZfREVRVUVV RSAgICAgICAweDA5Cj4gKyNkZWZpbmUgWEVOQ0FNRVJBX09QX0NUUkxfRU5VTSAgICAgICAgIDB4 MGEKPiArI2RlZmluZSBYRU5DQU1FUkFfT1BfQ1RSTF9TRVQgICAgICAgICAgMHgwYgo+ICsjZGVm aW5lIFhFTkNBTUVSQV9PUF9DVFJMX0dFVCAgICAgICAgICAweDBjCj4gKyNkZWZpbmUgWEVOQ0FN RVJBX09QX1NUUkVBTV9TVEFSVCAgICAgIDB4MGQKPiArI2RlZmluZSBYRU5DQU1FUkFfT1BfU1RS RUFNX1NUT1AgICAgICAgMHgwZQo+ICsKPiArI2RlZmluZSBYRU5DQU1FUkFfQ1RSTF9CUklHSFRO RVNTICAgICAgMAo+ICsjZGVmaW5lIFhFTkNBTUVSQV9DVFJMX0NPTlRSQVNUICAgICAgICAxCj4g KyNkZWZpbmUgWEVOQ0FNRVJBX0NUUkxfU0FUVVJBVElPTiAgICAgIDIKPiArI2RlZmluZSBYRU5D QU1FUkFfQ1RSTF9IVUUgICAgICAgICAgICAgMwo+ICsKPiArLyogTnVtYmVyIG9mIHN1cHBvcnRl ZCBjb250cm9scy4gKi8KPiArI2RlZmluZSBYRU5DQU1FUkFfTUFYX0NUUkwgICAgICAgICAgICAg NAo+ICsKPiArLyogQ29udHJvbCBpcyByZWFkLW9ubHkuICovCj4gKyNkZWZpbmUgWEVOQ0FNRVJB X0NUUkxfRkxHX1JPICAgICAgICAgICgxIDw8IDApCj4gKy8qIENvbnRyb2wgaXMgd3JpdGUtb25s eS4gKi8KPiArI2RlZmluZSBYRU5DQU1FUkFfQ1RSTF9GTEdfV08gICAgICAgICAgKDEgPDwgMSkK PiArLyogQ29udHJvbCdzIHZhbHVlIGlzIHZvbGF0aWxlLiAqLwo+ICsjZGVmaW5lIFhFTkNBTUVS QV9DVFJMX0ZMR19WT0xBVElMRSAgICAoMSA8PCAyKQo+ICsKPiArLyogU3VwcG9ydGVkIGNvbG9y IHNwYWNlcy4gKi8KPiArI2RlZmluZSBYRU5DQU1FUkFfQ09MT1JTUEFDRV9ERUZBVUxUICAgMAo+ ICsjZGVmaW5lIFhFTkNBTUVSQV9DT0xPUlNQQUNFX1NNUFRFMTcwTSAxCj4gKyNkZWZpbmUgWEVO Q0FNRVJBX0NPTE9SU1BBQ0VfUkVDNzA5ICAgIDIKPiArI2RlZmluZSBYRU5DQU1FUkFfQ09MT1JT UEFDRV9TUkdCICAgICAgMwo+ICsjZGVmaW5lIFhFTkNBTUVSQV9DT0xPUlNQQUNFX09QUkdCICAg ICA0Cj4gKyNkZWZpbmUgWEVOQ0FNRVJBX0NPTE9SU1BBQ0VfQlQyMDIwICAgIDUKPiArI2RlZmlu ZSBYRU5DQU1FUkFfQ09MT1JTUEFDRV9EQ0lfUDMgICAgNgo+ICsKPiArLyogQ29sb3Igc3BhY2Ug dHJhbnNmZXIgZnVuY3Rpb24uICovCj4gKyNkZWZpbmUgWEVOQ0FNRVJBX1hGRVJfRlVOQ19ERUZB VUxUICAgIDAKPiArI2RlZmluZSBYRU5DQU1FUkFfWEZFUl9GVU5DXzcwOSAgICAgICAgMQo+ICsj ZGVmaW5lIFhFTkNBTUVSQV9YRkVSX0ZVTkNfU1JHQiAgICAgICAyCj4gKyNkZWZpbmUgWEVOQ0FN RVJBX1hGRVJfRlVOQ19PUFJHQiAgICAgIDMKPiArI2RlZmluZSBYRU5DQU1FUkFfWEZFUl9GVU5D X05PTkUgICAgICAgNAo+ICsjZGVmaW5lIFhFTkNBTUVSQV9YRkVSX0ZVTkNfRENJX1AzICAgICA1 Cj4gKyNkZWZpbmUgWEVOQ0FNRVJBX1hGRVJfRlVOQ19TTVBURTIwODQgIDYKPiArCj4gKy8qIENv bG9yIHNwYWNlIFnigJlDYkNyIGVuY29kaW5nLiAqLwo+ICsjZGVmaW5lIFhFTkNBTUVSQV9ZQ0JD Ul9FTkNfSUdOT1JFICAgICAgICAgICAwCj4gKyNkZWZpbmUgWEVOQ0FNRVJBX1lDQkNSX0VOQ182 MDEgICAgICAgICAgICAgIDEKPiArI2RlZmluZSBYRU5DQU1FUkFfWUNCQ1JfRU5DXzcwOSAgICAg ICAgICAgICAgMgo+ICsjZGVmaW5lIFhFTkNBTUVSQV9ZQ0JDUl9FTkNfWFY2MDEgICAgICAgICAg ICAzCj4gKyNkZWZpbmUgWEVOQ0FNRVJBX1lDQkNSX0VOQ19YVjcwOSAgICAgICAgICAgIDQKPiAr I2RlZmluZSBYRU5DQU1FUkFfWUNCQ1JfRU5DX0JUMjAyMCAgICAgICAgICAgNQo+ICsjZGVmaW5l IFhFTkNBTUVSQV9ZQ0JDUl9FTkNfQlQyMDIwX0NPTlNUX0xVTSA2Cj4gKwo+ICsvKiBRdWFudGl6 YXRpb24gcmFuZ2UuICovCj4gKyNkZWZpbmUgWEVOQ0FNRVJBX1FVQU5USVpBVElPTl9ERUZBVUxU ICAgICAgIDAKPiArI2RlZmluZSBYRU5DQU1FUkFfUVVBTlRJWkFUSU9OX0ZVTExfUkFOR0UgICAg MQo+ICsjZGVmaW5lIFhFTkNBTUVSQV9RVUFOVElaQVRJT05fTElNX1JBTkdFICAgICAyCj4gKwo+ ICsvKgo+ICsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCj4gKyAqICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgRVZFTlQgQ09ERVMKPiArICoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgo+ICsgKi8K PiArI2RlZmluZSBYRU5DQU1FUkFfRVZUX0ZSQU1FX0FWQUlMICAgICAgMHgwMAo+ICsjZGVmaW5l IFhFTkNBTUVSQV9FVlRfQ1RSTF9DSEFOR0UgICAgICAweDAxCj4gKwo+ICsvKgo+ICsgKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqCj4gKyAqICAgICAgICAgICAgICAgWEVOU1RPUkUgRklFTEQgQU5EIFBB VEggTkFNRSBTVFJJTkdTLCBIRUxQRVJTCj4gKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKPiArICov Cj4gKyNkZWZpbmUgWEVOQ0FNRVJBX0RSSVZFUl9OQU1FICAgICAgICAgICJ2Y2FtZXJhIgo+ICsK PiArI2RlZmluZSBYRU5DQU1FUkFfTElTVF9TRVBBUkFUT1IgICAgICAgIiwiCj4gKyNkZWZpbmUg WEVOQ0FNRVJBX1JFU09MVVRJT05fU0VQQVJBVE9SICJ4Igo+ICsjZGVmaW5lIFhFTkNBTUVSQV9G UkFDVElPTl9TRVBBUkFUT1IgICAiLyIKPiArCj4gKyNkZWZpbmUgWEVOQ0FNRVJBX0ZJRUxEX0JF X1ZFUlNJT05TICAgICJ2ZXJzaW9ucyIKPiArI2RlZmluZSBYRU5DQU1FUkFfRklFTERfRkVfVkVS U0lPTiAgICAgInZlcnNpb24iCj4gKyNkZWZpbmUgWEVOQ0FNRVJBX0ZJRUxEX1JFUV9SSU5HX1JF RiAgICJyZXEtcmluZy1yZWYiCj4gKyNkZWZpbmUgWEVOQ0FNRVJBX0ZJRUxEX1JFUV9DSEFOTkVM ICAgICJyZXEtZXZlbnQtY2hhbm5lbCIKPiArI2RlZmluZSBYRU5DQU1FUkFfRklFTERfRVZUX1JJ TkdfUkVGICAgImV2dC1yaW5nLXJlZiIKPiArI2RlZmluZSBYRU5DQU1FUkFfRklFTERfRVZUX0NI QU5ORUwgICAgImV2dC1ldmVudC1jaGFubmVsIgo+ICsjZGVmaW5lIFhFTkNBTUVSQV9GSUVMRF9N QVhfQlVGRkVSUyAgICAibWF4LWJ1ZmZlcnMiCj4gKyNkZWZpbmUgWEVOQ0FNRVJBX0ZJRUxEX0NP TlRST0xTICAgICAgICJjb250cm9scyIKPiArI2RlZmluZSBYRU5DQU1FUkFfRklFTERfRk9STUFU UyAgICAgICAgImZvcm1hdHMiCj4gKyNkZWZpbmUgWEVOQ0FNRVJBX0ZJRUxEX0ZSQU1FX1JBVEVT ICAgICJmcmFtZS1yYXRlcyIKPiArI2RlZmluZSBYRU5DQU1FUkFfRklFTERfQkVfQUxMT0MgICAg ICAgImJlLWFsbG9jIgo+ICsjZGVmaW5lIFhFTkNBTUVSQV9GSUVMRF9VTklRVUVfSUQgICAgICAi dW5pcXVlLWlkIgo+ICsKPiArI2RlZmluZSBYRU5DQU1FUkFfQ1RSTF9CUklHSFRORVNTX1NUUiAg ImJyaWdodG5lc3MiCj4gKyNkZWZpbmUgWEVOQ0FNRVJBX0NUUkxfQ09OVFJBU1RfU1RSICAgICJj b250cmFzdCIKPiArI2RlZmluZSBYRU5DQU1FUkFfQ1RSTF9TQVRVUkFUSU9OX1NUUiAgInNhdHVy YXRpb24iCj4gKyNkZWZpbmUgWEVOQ0FNRVJBX0NUUkxfSFVFX1NUUiAgICAgICAgICJodWUiCj4g Kwo+ICsjZGVmaW5lIFhFTkNBTUVSQV9GT1VSQ0NfQklHRU5ESUFOX1NUUiAiLUJFIgo+ICsKPiAr LyogTWF4aW11bSBudW1iZXIgb2YgYnVmZmVyIHBsYW5lcyBzdXBwb3J0ZWQuICovCj4gKyNkZWZp bmUgWEVOQ0FNRVJBX01BWF9QTEFORSAgICAgICAgICAgIDQKPiArCj4gKy8qCj4gKyAqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioKPiArICogICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRVUyBSRVRV Uk4gQ09ERVMKPiArICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgo+ICsgKgo+ICsgKiBTdGF0dXMgcmV0 dXJuIGNvZGUgaXMgemVybyBvbiBzdWNjZXNzIGFuZCAtWEVOX0VYWCBvbiBmYWlsdXJlLgo+ICsg Kgo+ICsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqCj4gKyAqICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgQXNzdW1wdGlvbnMKPiArICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgo+ICsgKgo+ICsgKiAt IHVzYWdlIG9mIGdyYW50IHJlZmVyZW5jZSAwIGFzIGludmFsaWQgZ3JhbnQgcmVmZXJlbmNlOgo+ ICsgKiAgIGdyYW50IHJlZmVyZW5jZSAwIGlzIHZhbGlkLCBidXQgbmV2ZXIgZXhwb3NlZCB0byBh IFBWIGRyaXZlciwKPiArICogICBiZWNhdXNlIG9mIHRoZSBmYWN0IGl0IGlzIGFscmVhZHkgaW4g dXNlL3Jlc2VydmVkIGJ5IHRoZSBQViBjb25zb2xlLgo+ICsgKiAtIGFsbCByZWZlcmVuY2VzIGlu IHRoaXMgZG9jdW1lbnQgdG8gcGFnZSBzaXplcyBtdXN0IGJlIHRyZWF0ZWQKPiArICogICBhcyBw YWdlcyBvZiBzaXplIFhFTl9QQUdFX1NJWkUgdW5sZXNzIG90aGVyd2lzZSBub3RlZC4KPiArICog LSBhbGwgRk9VUkNDIG1hcHBpbmdzIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24gYW5kIG1lc3NhZ2lu ZyBhcmUKPiArICogICBMaW51eCBWNEwyIG9uZXM6IGh0dHBzOi8vZ2l0Lmtlcm5lbC5vcmcvcHVi L3NjbS9saW51eC9rZXJuZWwvZ2l0L3RvcnZhbGRzL2xpbnV4LmdpdC90cmVlL2luY2x1ZGUvdWFw aS9saW51eC92aWRlb2RldjIuaAo+ICsgKiAgIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb25z Ogo+ICsgKiAgICAgLSBjaGFyYWN0ZXJzIGFyZSBhbGxvd2VkIGluIFsweDIwOyAweDdmXSByYW5n ZQo+ICsgKiAgICAgLSB3aGVuIHVzZWQgZm9yIFhlblN0b3JlIGNvbmZpZ3VyYXRpb24gZW50cmll cyB0aGUgZm9sbG93aW5nCj4gKyAqICAgICAgIGFyZSBub3QgYWxsb3dlZDoKPiArICogICAgICAg LSAnLycsICdcJywgJyAnIChzcGFjZSksICc8JywgJz4nLCAnOicsICciJywgJ3wnLCAnPycsICcq Jwo+ICsgKiAgICAgICAtIGlmIHRyYWlsaW5nIHNwYWNlcyBhcmUgcGFydCBvZiB0aGUgRk9VUkND IGNvZGUgdGhlbiB0aG9zZSBtdXN0IGJlCj4gKyAqICAgICAgICAgdHJpbW1lZAo+ICsgKgo+ICsg Kgo+ICsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqCj4gKyAqICAgICAgIERlc2NyaXB0aW9uIG9mIHRo ZSBwcm90b2NvbCBiZXR3ZWVuIGZyb250ZW5kIGFuZCBiYWNrZW5kIGRyaXZlcgo+ICsgKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqCj4gKyAqCj4gKyAqIFRoZSB0d28gaGFsdmVzIG9mIGEgUGFyYS12aXJ0 dWFsIGNhbWVyYSBkcml2ZXIgY29tbXVuaWNhdGUgd2l0aAo+ICsgKiBlYWNoIG90aGVyIHVzaW5n IHNoYXJlZCBwYWdlcyBhbmQgZXZlbnQgY2hhbm5lbHMuCj4gKyAqIFNoYXJlZCBwYWdlIGNvbnRh aW5zIGEgcmluZyB3aXRoIHJlcXVlc3QvcmVzcG9uc2UgcGFja2V0cy4KPiArICoKPiArICogQWxs IHJlc2VydmVkIGZpZWxkcyBpbiB0aGUgc3RydWN0dXJlcyBiZWxvdyBtdXN0IGJlIDAuCj4gKyAq Cj4gKyAqIEZvciBhbGwgcmVxdWVzdC9yZXNwb25zZS9ldmVudCBwYWNrZXRzOgo+ICsgKiAgIC0g ZnJhbWUgcmF0ZSBwYXJhbWV0ZXIgaXMgcmVwcmVzZW50ZWQgYXMgYSBwYWlyIG9mIDQgb2N0ZXQg bG9uZwo+ICsgKiAgICAgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvcjoKPiArICogICAgICAgLSBm cmFtZV9yYXRlX251bWVyIC0gdWludDMyX3QsIG51bWVyYXRvciBvZiB0aGUgZnJhbWUgcmF0ZQo+ ICsgKiAgICAgICAtIGZyYW1lX3JhdGVfZGVub20gLSB1aW50MzJfdCwgZGVub21pbmF0b3Igb2Yg dGhlIGZyYW1lIHJhdGUKPiArICogICAgIFRoZSBjb3JyZXNwb25kaW5nIGZyYW1lIHJhdGUgKEh6 KSBpcyBjYWxjdWxhdGVkIGFzOgo+ICsgKiAgICAgICBmcmFtZV9yYXRlID0gZnJhbWVfcmF0ZV9u dW1lciAvIGZyYW1lX3JhdGVfZGVub20KPiArICogICAtIGJ1ZmZlciBpbmRleCBpcyBhIHplcm8g YmFzZWQgaW5kZXggb2YgdGhlIGJ1ZmZlci4gTXVzdCBiZSBsZXNzIHRoYW4KPiArICogICAgIHRo ZSB2YWx1ZSBvZiBYRU5DQU1FUkFfT1BfQ09ORklHX1NFVC5udW1fYnVmcyByZXNwb25zZToKPiAr ICogICAgICAgLSBpbmRleCAtIHVpbnQ4X3QsIGluZGV4IG9mIHRoZSBidWZmZXIuCj4gKyAqCj4g KyAqCj4gKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZXF1ZXN0cyAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiArICoKPiArICogQWxsIHJlcXVlc3QgcGFj a2V0cyBoYXZlIHRoZSBzYW1lIGxlbmd0aCAoNjQgb2N0ZXRzKS4KPiArICogQWxsIHJlcXVlc3Qg cGFja2V0cyBoYXZlIGNvbW1vbiBoZWFkZXI6Cj4gKyAqICAgICAgICAgMCAgICAgICAgICAgICAg ICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKPiArICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAgICAgICB8ICAg IG9wZXJhdGlvbiAgIHwgICByZXNlcnZlZCAgICAgfCA0Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsg KiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgOAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogICBpZCAtIHVpbnQxNl90 LCBwcml2YXRlIGd1ZXN0IHZhbHVlLCBlY2hvZWQgaW4gcmVzcG9uc2UuCj4gKyAqICAgb3BlcmF0 aW9uIC0gdWludDhfdCwgb3BlcmF0aW9uIGNvZGUsIFhFTkNBTUVSQV9PUF9YWFguCj4gKyAqCj4g KyAqCj4gKyAqIFJlcXVlc3QgdG8gc2V0L3ZhbGlkYXRlIHRoZSBjb25maWd1cmF0aW9uIC0gcmVx dWVzdCB0byBzZXQgdGhlCj4gKyAqIGNvbmZpZ3VyYXRpb24vbW9kZSBvZiB0aGUgY2FtZXJhIChY RU5DQU1FUkFfT1BfQ09ORklHX1NFVCkgb3IgdG8KPiArICogY2hlY2sgaWYgdGhlIGNvbmZpZ3Vy YXRpb24gaXMgdmFsaWQgYW5kIGNhbiBiZSB1c2VkCj4gKyAqIChYRU5DQU1FUkFfT1BfQ09ORklH X1ZBTElEQVRFKToKPiArICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAg ICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAo+ICsgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiAr ICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHwgX09QX0NPTkZJR19YWFggfCAg IHJlc2VydmVkICAgICB8IDQKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4 Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBp eGVsIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTIKPiArICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAxNgo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8IDIwCj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjQKPiArICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCj4gKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICog fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8IDY0Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKgo+ICsgKiBwaXhlbF9mb3Jt YXQgLSB1aW50MzJfdCwgcGl4ZWwgZm9ybWF0IHRvIGJlIHVzZWQsIEZPVVJDQyBjb2RlLgo+ICsg KiB3aWR0aCAtIHVpbnQzMl90LCB3aWR0aCBpbiBwaXhlbHMuCj4gKyAqIGhlaWdodCAtIHVpbnQz Ml90LCBoZWlnaHQgaW4gcGl4ZWxzLgo+ICsgKgo+ICsgKiBTZWUgcmVzcG9uc2UgZm9ybWF0IGZv ciB0aGlzIHJlcXVlc3QuCj4gKyAqCj4gKyAqIE5vdGVzOgo+ICsgKiAgLSB0aGUgb25seSBkaWZm ZXJlbmNlIGJldHdlZW4gWEVOQ0FNRVJBX09QX0NPTkZJR19WQUxJREFURSBhbmQKPiArICogICAg WEVOQ0FNRVJBX09QX0NPTkZJR19TRVQgaXMgdGhhdCB0aGUgZm9ybWVyIGRvZXNuJ3QgYWN0dWFs bHkgY2hhbmdlCj4gKyAqICAgIGNhbWVyYSBjb25maWd1cmF0aW9uLCBidXQgcXVlcmllcyBpZiB0 aGUgY29uZmlndXJhdGlvbiBpcyB2YWxpZC4KPiArICogICAgVGhpcyBjYW4gYmUgdXNlZCB3aGls ZSBzdHJlYW0gaXMgYWN0aXZlIGFuZC9vciBidWZmZXJzIGFsbG9jYXRlZC4KPiArICogIC0gZnJv bnRlbmQgbXVzdCBjaGVjayB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZSBpbiBvcmRlciB0byBz ZWUKPiArICogICAgaWYgdGhlIHZhbHVlcyByZXBvcnRlZCBiYWNrIGJ5IHRoZSBiYWNrZW5kIGRv IG1hdGNoIHRoZSBkZXNpcmVkIG9uZXMKPiArICogICAgYW5kIGNhbiBiZSBhY2NlcHRlZC4KPiAr ICogIC0gZnJvbnRlbmQgbWF5IHNlbmQgbXVsdGlwbGUgWEVOQ0FNRVJBX09QX0NPTkZJR19TRVQg cmVxdWVzdHMgYmVmb3JlCj4gKyAqICAgIHNlbmRpbmcgWEVOQ0FNRVJBX09QX1NUUkVBTV9TVEFS VCByZXF1ZXN0IHRvIHVwZGF0ZSBvciB0dW5lIHRoZQo+ICsgKiAgICBmaW5hbCBzdHJlYW0gY29u ZmlndXJhdGlvbi4KPiArICogIC0gY29uZmlndXJhdGlvbiBjYW5ub3QgYmUgY2hhbmdlZCBkdXJp bmcgYWN0aXZlIHN0cmVhbWluZywgZS5nLgo+ICsgKiAgICBhZnRlciBYRU5DQU1FUkFfT1BfU1RS RUFNX1NUQVJUIGFuZCBiZWZvcmUgWEVOQ0FNRVJBX09QX1NUUkVBTV9TVE9QCj4gKyAqICAgIHJl cXVlc3RzLgo+ICsgKi8KPiArc3RydWN0IHhlbmNhbWVyYV9jb25maWdfcmVxIHsKPiArICAgIHVp bnQzMl90IHBpeGVsX2Zvcm1hdDsKPiArICAgIHVpbnQzMl90IHdpZHRoOwo+ICsgICAgdWludDMy X3QgaGVpZ2h0Owo+ICt9Owo+ICsKPiArLyoKPiArICogUmVxdWVzdCBjdXJyZW50IGNvbmZpZ3Vy YXRpb24gb2YgdGhlIGNhbWVyYToKPiArICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAg ICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAo+ICsgKiArLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSsKPiArICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHwgX09QX0NPTkZJ R19HRVQgfCAgIHJlc2VydmVkICAgICB8IDQKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCA4Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKPiArICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICoK PiArICogU2VlIHJlc3BvbnNlIGZvcm1hdCBmb3IgdGhpcyByZXF1ZXN0Lgo+ICsgKgo+ICsgKgo+ ICsgKiBSZXF1ZXN0IHRvIHNldCB0aGUgZnJhbWUgcmF0ZSBvZiB0aGUgc3RyZWFtOgo+ICsgKiAg ICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAg IDMgICAgICAgIG9jdGV0Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAg aWQgICAgICAgICAgICAgICAgfCBfRlJBTUVfUkFURV9TRVR8ICAgcmVzZXJ2ZWQgICAgIHwgNAo+ ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVz ZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgKPiArICogKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r Cj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX3JhdGVfbnVtZXIgICAgICAg ICAgICAgICAgICAgICAgICAgfCAxMgo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAg ICAgICAgICAgICAgICAgICAgZnJhbWVfcmF0ZV9kZW5vbSAgICAgICAgICAgICAgICAgICAgICAg ICB8IDE2Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjAKPiArICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCj4gKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB8IDY0Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKgo+ICsgKiBmcmFtZV9yYXRlX251 bWVyIC0gdWludDMyX3QsIG51bWVyYXRvciBvZiB0aGUgZnJhbWUgcmF0ZS4KPiArICogZnJhbWVf cmF0ZV9kZW5vbSAtIHVpbnQzMl90LCBkZW5vbWluYXRvciBvZiB0aGUgZnJhbWUgcmF0ZS4KPiAr ICoKPiArICogTm90ZXM6Cj4gKyAqICAtIHRvIHF1ZXJ5IHRoZSBjdXJyZW50IChhY3R1YWwpIGZy YW1lIHJhdGUgdXNlIFhFTkNBTUVSQV9PUF9DT05GSUdfR0VUCj4gKyAqICAgIHJlcXVlc3QuCj4g KyAqICAtIHRoaXMgcmVxdWVzdCBjYW4gYmUgdXNlZCB3aXRoIGNhbWVyYSBidWZmZXJzIGFsbG9j YXRlZCwgYnV0IHN0cmVhbQo+ICsgKiAgICBzdG9wcGVkLCBlLmcuIGZyb250ZW5kIGlzIGFsbG93 ZWQgdG8gc3RvcCB0aGUgc3RyZWFtIHdpdGgKPiArICogICAgWEVOQ0FNRVJBX09QX1NUUkVBTV9T VE9QLCBob2xkIHRoZSBidWZmZXJzIGFsbG9jYXRlZCAoZS5nLiBrZWVwIHRoZQo+ICsgKiAgICBj b25maWd1cmF0aW9uIHNldCB3aXRoIFhFTkNBTUVSQV9PUF9DT05GSUdfU0VUKSwgY2hhbmdlIHRo ZQo+ICsgKiAgICBmcmFtZSByYXRlIG9mIHRoZSBzdHJlYW0gYW5kIChyZSlzdGFydCB0aGUgc3Ry ZWFtIGFnYWluIHdpdGgKPiArICogICAgWEVOQ0FNRVJBX09QX1NUUkVBTV9TVEFSVC4KPiArICog IC0gZnJhbWUgcmF0ZSBjYW5ub3QgYmUgY2hhbmdlZCBkdXJpbmcgYWN0aXZlIHN0cmVhbWluZywg ZS5nLgo+ICsgKiAgICBhZnRlciBYRU5DQU1FUkFfT1BfU1RSRUFNX1NUQVJUIGFuZCBiZWZvcmUg WEVOQ0FNRVJBX09QX1NUUkVBTV9TVE9QCj4gKyAqICAgIGNvbW1hbmRzLgo+ICsgKi8KPiArc3Ry dWN0IHhlbmNhbWVyYV9mcmFtZV9yYXRlX3JlcSB7Cj4gKyAgICB1aW50MzJfdCBmcmFtZV9yYXRl X251bWVyOwo+ICsgICAgdWludDMyX3QgZnJhbWVfcmF0ZV9kZW5vbTsKPiArfTsKPiArCj4gKy8q Cj4gKyAqIFJlcXVlc3QgY2FtZXJhIGJ1ZmZlcidzIGxheW91dDoKPiArICogICAgICAgICAwICAg ICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBv Y3RldAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAg ICAgICAgIHwgX0JVRl9HRVRfTEFZT1VUfCAgIHJlc2VydmVkICAgICB8IDQKPiArICogKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCA4Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8L1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL3wKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAo+ICsgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKPiArICoKPiArICogU2VlIHJlc3BvbnNlIGZvcm1hdCBmb3IgdGhpcyByZXF1 ZXN0Lgo+ICsgKgo+ICsgKgo+ICsgKiBSZXF1ZXN0IG51bWJlciBvZiBidWZmZXJzIHRvIGJlIHVz ZWQ6Cj4gKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAg ICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAg ICAgICAgICAgICBpZCAgICAgICAgICAgICAgICB8IF9PUF9CVUZfUkVRVUVTVHwgICByZXNlcnZl ZCAgICAgfCA0Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAo+ICsgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKPiArICogfCAgICBudW1fYnVmcyAgICB8ICAgICAgICAgICAgICAgICAgICAg cmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICB8IDEyCj4gKyAqICstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsg KiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgMTYKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAo+ ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVz ZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDY0Cj4gKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Kwo+ICsgKgo+ICsgKiBudW1fYnVmcyAtIHVpbnQ4X3QsIGRlc2lyZWQgbnVtYmVyIG9mIGJ1ZmZl cnMgdG8gYmUgdXNlZC4KPiArICoKPiArICogSWYgbnVtX2J1ZnMgaXMgbm90IHplcm8gdGhlbiB0 aGUgYmFja2VuZCB2YWxpZGF0ZXMgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YKPiArICogYnVmZmVy cyBhbmQgcmVzcG9uZHMgd2l0aCB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb3dlZCBmb3IgdGhp cyBmcm9udGVuZC4KPiArICogRnJvbnRlbmQgaXMgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIHRo ZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlIGluIG9yZGVyIHRvCj4gKyAqIHNlZSBpZiB0aGUgdmFs dWVzIHJlcG9ydGVkIGJhY2sgYnkgdGhlIGJhY2tlbmQgZG8gbWF0Y2ggdGhlIGRlc2lyZWQgb25l cwo+ICsgKiBhbmQgY2FuIGJlIGFjY2VwdGVkLgo+ICsgKiBGcm9udGVuZCBpcyBhbGxvd2VkIHRv IHNlbmQgbXVsdGlwbGUgWEVOQ0FNRVJBX09QX0JVRl9SRVFVRVNUIHJlcXVlc3RzCj4gKyAqIGJl Zm9yZSBzZW5kaW5nIFhFTkNBTUVSQV9PUF9TVFJFQU1fU1RBUlQgcmVxdWVzdCB0byB1cGRhdGUg b3IgdHVuZSB0aGUKPiArICogZmluYWwgY29uZmlndXJhdGlvbi4KPiArICogRnJvbnRlbmQgaXMg bm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoZSBjYW1lcmEgY29uZmlndXJhdGlvbiBhZnRlciB0aGlz IGNhbGwKPiArICogd2l0aCBhIG5vbi16ZXJvIHZhbHVlIG9mIG51bV9idWZzLiBJZiBjYW1lcmEg cmVjb25maWd1cmF0aW9uIGlzIHJlcXVpcmVkCj4gKyAqIHRoZW4gdGhpcyByZXF1ZXN0IG11c3Qg YmUgc2VudCB3aXRoIG51bV9idWZzIHNldCB0byB6ZXJvIGFuZCBhbnkgY3JlYXRlZAo+ICsgKiBi dWZmZXJzIG11c3QgYmUgZGVzdHJveWVkIGZpcnN0Lgo+ICsgKiBGcm9udGVuZCBpcyBub3QgYWxs b3dlZCB0byBjaGFuZ2UgdGhlIG51bWJlciBvZiBidWZmZXJzIGFmdGVyIHRoZQo+ICsgKiBzdHJl YW1pbmcgaGFzIHN0YXJ0ZWQuCj4gKyAqCj4gKyAqIElmIG51bV9idWZzIGlzIDAgYW5kIHN0cmVh bWluZyBoYXMgbm90IHN0YXJ0ZWQgeWV0LCB0aGVuIHRoZSBiYWNrZW5kIHdpbGwKPiArICogZnJl ZSBhbGwgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnVmZmVycyAoaWYgYW55KS4KPiArICogVHJ5aW5n IHRvIGNhbGwgdGhpcyBpZiBzdHJlYW1pbmcgaXMgaW4gcHJvZ3Jlc3Mgd2lsbCByZXN1bHQgaW4g YW4gZXJyb3IuCj4gKyAqCj4gKyAqIElmIGNhbWVyYSByZWNvbmZpZ3VyYXRpb24gaXMgcmVxdWly ZWQgdGhlbiB0aGUgc3RyZWFtaW5nIG11c3QgYmUgc3RvcHBlZAo+ICsgKiBhbmQgdGhpcyByZXF1 ZXN0IG11c3QgYmUgc2VudCB3aXRoIG51bV9idWZzIHNldCB0byB6ZXJvIGFuZCBhbnkKPiArICog Y3JlYXRlZCBidWZmZXJzIG11c3QgYmUgZGVzdHJveWVkLgo+ICsgKgo+ICsgKiBQbGVhc2Ugbm90 ZSwgdGhhdCB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgaW4gdGhpcyByZXF1ZXN0IG11c3Qgbm90IGV4 Y2VlZAo+ICsgKiB0aGUgdmFsdWUgY29uZmlndXJlZCBpbiBYZW5TdG9yZS5tYXgtYnVmZmVycy4K PiArICoKPiArICogU2VlIHJlc3BvbnNlIGZvcm1hdCBmb3IgdGhpcyByZXF1ZXN0Lgo+ICsgKi8K PiArc3RydWN0IHhlbmNhbWVyYV9idWZfcmVxdWVzdCB7Cj4gKyAgICB1aW50OF90IG51bV9idWZz Owo+ICt9Owo+ICsKPiArLyoKPiArICogUmVxdWVzdCBjYW1lcmEgYnVmZmVyIGNyZWF0aW9uOgo+ ICsgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAg ICAgICAgIDMgICAgICAgIG9jdGV0Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAg ICAgICAgaWQgICAgICAgICAgICAgICAgfCBfT1BfQlVGX0NSRUFURSB8ICAgcmVzZXJ2ZWQgICAg IHwgNAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgKPiArICogKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rCj4gKyAqIHwgICAgICBpbmRleCAgICAgfCAgICAgICAgICAgICAgICAgICAgIHJlc2Vy dmVkICAgICAgICAgICAgICAgICAgICAgfCAxMgo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAg ICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lX29mZnNldFswXSAgICAgICAgICAgICAgICAg ICAgICAgICB8IDE2Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAg ICAgICAgICAgcGxhbmVfb2Zmc2V0WzFdICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjAKPiAr ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV9v ZmZzZXRbMl0gICAgICAgICAgICAgICAgICAgICAgICAgfCAyNAo+ICsgKiArLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsK PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lX29mZnNldFszXSAgICAgICAg ICAgICAgICAgICAgICAgICB8IDI4Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAg ICAgICAgICAgICAgICAgICAgZ3JlZl9kaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAg IHwgMzIKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzNgo+ICsgKiArLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSsKPiArICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgNjQKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqCj4gKyAqIEFuIGF0dGVtcHQgdG8g Y3JlYXRlIG11bHRpcGxlIGJ1ZmZlcnMgd2l0aCB0aGUgc2FtZSBpbmRleCBpcyBhbiBlcnJvci4K PiArICogaW5kZXggY2FuIGJlIHJlLXVzZWQgYWZ0ZXIgZGVzdHJveWluZyB0aGUgY29ycmVzcG9u ZGluZyBjYW1lcmEgYnVmZmVyLgo+ICsgKgo+ICsgKiBpbmRleCAtIHVpbnQ4X3QsIGluZGV4IG9m IHRoZSBidWZmZXIgdG8gYmUgY3JlYXRlZCBpbiB0aGUgcmFuZ2UKPiArICogICBmcm9tIDAgdG8g dGhlIG51bV9idWZzIGZpZWxkIHJldHVybmVkIGluIHJlc3BvbnNlIGZvcgo+ICsgKiAgIFhFTkNB TUVSQV9PUF9CVUZfUkVRVUVTVCByZXF1ZXN0Cj4gKyAqIHBsYW5lX29mZnNldCAtIGFycmF5IG9m IHVpbnQzMl90LCBvZmZzZXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGxhbmUKPiArICogICBpbiBv Y3RldHMgZnJvbSB0aGUgYnVmZmVyIHN0YXJ0LiBOdW1iZXIgb2Ygb2Zmc2V0cyByZXR1cm5lZCBp cwo+ICsgKiAgIGVxdWFsIHRvIHRoZSB2YWx1ZSByZXR1cm5lZCBpbiBYRU5DQU1FUkFfT1BfQlVG X0dFVF9MQVlPVVQubnVtX3BsYW5lcy4KPiArICogZ3JlZl9kaXJlY3RvcnkgLSBncmFudF9yZWZf dCwgYSByZWZlcmVuY2UgdG8gdGhlIGZpcnN0IHNoYXJlZCBwYWdlCj4gKyAqICAgZGVzY3JpYmlu ZyBzaGFyZWQgYnVmZmVyIHJlZmVyZW5jZXMuIFRoZSBzaXplIG9mIHRoZSBidWZmZXIgaXMgZXF1 YWwgdG8KPiArICogICBYRU5DQU1FUkFfT1BfQlVGX0dFVF9MQVlPVVQuc2l6ZSByZXNwb25zZS4g QXQgbGVhc3Qgb25lIHBhZ2UgZXhpc3RzLiBJZgo+ICsgKiAgIHNoYXJlZCBidWZmZXIgc2l6ZSBl eGNlZWRzIHdoYXQgY2FuIGJlIGFkZHJlc3NlZCBieSB0aGlzIHNpbmdsZSBwYWdlLAo+ICsgKiAg IHRoZW4gcmVmZXJlbmNlIHRvIHRoZSBuZXh0IHNoYXJlZCBwYWdlIG11c3QgYmUgc3VwcGxpZWQg KHNlZQo+ICsgKiAgIGdyZWZfZGlyX25leHRfcGFnZSBiZWxvdykuCj4gKyAqCj4gKyAqIElmIFhF TkNBTUVSQV9GSUVMRF9CRV9BTExPQyBjb25maWd1cmF0aW9uIGVudHJ5IGlzIHNldCwgdGhlbiBi YWNrZW5kIHdpbGwKPiArICogYWxsb2NhdGUgdGhlIGJ1ZmZlciB3aXRoIHRoZSBwYXJhbWV0ZXJz IHByb3ZpZGVkIGluIHRoaXMgcmVxdWVzdCBhbmQgcGFnZQo+ICsgKiBkaXJlY3RvcnkgaXMgaGFu ZGxlZCBhcyBmb2xsb3dzOgo+ICsgKiAgIEZyb250ZW5kIG9uIHJlcXVlc3Q6Cj4gKyAqICAgICAt IGFsbG9jYXRlcyBwYWdlcyBmb3IgdGhlIGRpcmVjdG9yeSAoZ3JlZl9kaXJlY3RvcnksCj4gKyAq ICAgICAgIGdyZWZfZGlyX25leHRfcGFnZShzKQo+ICsgKiAgICAgLSBncmFudHMgcGVybWlzc2lv bnMgZm9yIHRoZSBwYWdlcyBvZiB0aGUgZGlyZWN0b3J5IHRvIHRoZSBiYWNrZW5kCj4gKyAqICAg ICAtIHNldHMgZ3JlZl9kaXJfbmV4dF9wYWdlIGZpZWxkcwo+ICsgKiAgIEJhY2tlbmQgb24gcmVz cG9uc2U6Cj4gKyAqICAgICAtIGdyYW50cyBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhZ2VzIG9mIHRo ZSBidWZmZXIgYWxsb2NhdGVkIHRvCj4gKyAqICAgICAgIHRoZSBmcm9udGVuZAo+ICsgKiAgICAg LSBmaWxscyBpbiBwYWdlIGRpcmVjdG9yeSB3aXRoIGdyYW50IHJlZmVyZW5jZXMKPiArICogICAg ICAgKGdyZWZbXSBpbiBzdHJ1Y3QgeGVuY2FtZXJhX3BhZ2VfZGlyZWN0b3J5KQo+ICsgKi8KPiAr c3RydWN0IHhlbmNhbWVyYV9idWZfY3JlYXRlX3JlcSB7Cj4gKyAgICB1aW50OF90IGluZGV4Owo+ ICsgICAgdWludDhfdCByZXNlcnZlZFszXTsKPiArICAgIHVpbnQzMl90IHBsYW5lX29mZnNldFtY RU5DQU1FUkFfTUFYX1BMQU5FXTsKPiArICAgIGdyYW50X3JlZl90IGdyZWZfZGlyZWN0b3J5Owo+ ICt9Owo+ICsKPiArLyoKPiArICogU2hhcmVkIHBhZ2UgZm9yIFhFTkNBTUVSQV9PUF9CVUZfQ1JF QVRFIGJ1ZmZlciBkZXNjcmlwdG9yIChncmVmX2RpcmVjdG9yeSBpbgo+ICsgKiB0aGUgcmVxdWVz dCkgZW1wbG95cyBhIGxpc3Qgb2YgcGFnZXMsIGRlc2NyaWJpbmcgYWxsIHBhZ2VzIG9mIHRoZSBz aGFyZWQKPiArICogZGF0YSBidWZmZXI6Cj4gKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAx ICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKPiArICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICBncmVmX2Rpcl9uZXh0X3Bh Z2UgICAgICAgICAgICAgICAgICAgICAgICAgfCA0Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZlswXSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgOAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98Cj4gKyAq ICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZltp XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaSo0KzgKPiArICogKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r Cj4gKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvfAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgZ3JlZltOIC0gMV0gICAgICAgICAgICAgICAgICAgICAgICAgICB8 IE4qNCs4Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKgo+ICsgKiBncmVmX2Rpcl9uZXh0X3BhZ2Ug LSBncmFudF9yZWZfdCwgcmVmZXJlbmNlIHRvIHRoZSBuZXh0IHBhZ2UgZGVzY3JpYmluZwo+ICsg KiAgIHBhZ2UgZGlyZWN0b3J5LiBNdXN0IGJlIDAgaWYgdGhlcmUgYXJlIG5vIG1vcmUgcGFnZXMg aW4gdGhlIGxpc3QuCj4gKyAqIGdyZWZbaV0gLSBncmFudF9yZWZfdCwgcmVmZXJlbmNlIHRvIGEg c2hhcmVkIHBhZ2Ugb2YgdGhlIGJ1ZmZlcgo+ICsgKiAgIGFsbG9jYXRlZCBhdCBYRU5DQU1FUkFf T1BfQlVGX0NSRUFURS4KPiArICoKPiArICogTnVtYmVyIG9mIGdyYW50X3JlZl90IGVudHJpZXMg aW4gdGhlIHdob2xlIHBhZ2UgZGlyZWN0b3J5IGlzIG5vdAo+ICsgKiBwYXNzZWQsIGJ1dCBpbnN0 ZWFkIGNhbiBiZSBjYWxjdWxhdGVkIGFzOgo+ICsgKiAgIG51bV9ncmVmc190b3RhbCA9IChYRU5D QU1FUkFfT1BfQlVGX1JFUVVFU1Quc2l6ZSArIFhFTl9QQUdFX1NJWkUgLSAxKSAvCj4gKyAqICAg ICAgIFhFTl9QQUdFX1NJWkUKPiArICovCj4gK3N0cnVjdCB4ZW5jYW1lcmFfcGFnZV9kaXJlY3Rv cnkgewo+ICsgICAgZ3JhbnRfcmVmX3QgZ3JlZl9kaXJfbmV4dF9wYWdlOwo+ICsgICAgZ3JhbnRf cmVmX3QgZ3JlZlsxXTsgLyogVmFyaWFibGUgbGVuZ3RoICovCj4gK307Cj4gKwo+ICsvKgo+ICsg KiBSZXF1ZXN0IGJ1ZmZlciBkZXN0cnVjdGlvbiAtIGRlc3Ryb3kgYSBwcmV2aW91c2x5IGFsbG9j YXRlZCBjYW1lcmEgYnVmZmVyOgo+ICsgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAg ICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0Cj4gKyAqICstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgfCBfT1BfQlVGX0RF U1RST1l8ICAgcmVzZXJ2ZWQgICAgIHwgNAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8IDgKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICBpbmRleCAgICAgfCAgICAg ICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgfCAxMgo+ICsgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE2Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsg KiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL3wKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAo+ ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKPiArICoKPiArICogaW5kZXggLSB1aW50OF90LCBpbmRleCBvZiB0 aGUgYnVmZmVyIHRvIGJlIGRlc3Ryb3llZC4KPiArICoKPiArICoKPiArICogUmVxdWVzdCBxdWV1 ZWluZyBvZiB0aGUgYnVmZmVyIGZvciBiYWNrZW5kIHVzZToKPiArICogICAgICAgICAwICAgICAg ICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3Rl dAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAg ICAgIHwgX09QX0JVRl9RVUVVRSAgfCAgIHJlc2VydmVkICAgICB8IDQKPiArICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCA4Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAg aW5kZXggICAgIHwgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAg ICAgIHwgMTIKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgo+ICsgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKPiArICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgNjQKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqCj4gKyAqIE5vdGVzOgo+ICsg KiAgLSBmcm9udGVuZHMgbXVzdCBub3QgYWNjZXNzIHRoZSBidWZmZXIgY29udGVudCBhZnRlciB0 aGlzIHJlcXVlc3QgdW50aWwKPiArICogICAgcmVzcG9uc2UgdG8gWEVOQ0FNRVJBX09QX0JVRl9E RVFVRVVFIGhhcyBiZWVuIHJlY2VpdmVkLgo+ICsgKiAgLSBidWZmZXJzIG11c3QgYmUgcXVldWVk IHRvIHRoZSBiYWNrZW5kIGJlZm9yZSBkZXN0cm95aW5nIHRoZW0gd2l0aAo+ICsgKiAgICBYRU5D QU1FUkFfT1BfQlVGX0RFU1RST1kuCj4gKyAqCj4gKyAqIGluZGV4IC0gdWludDhfdCwgaW5kZXgg b2YgdGhlIGJ1ZmZlciB0byBiZSBxdWV1ZWQuCj4gKyAqCj4gKyAqCj4gKyAqIFJlcXVlc3QgZGVx dWV1ZWluZyBvZiB0aGUgYnVmZmVyIGZvciBmcm9udGVuZCB1c2U6Cj4gKyAqICAgICAgICAgMCAg ICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAg b2N0ZXQKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAg ICAgICAgICB8X09QX0JVRl9ERVFVRVVFIHwgICByZXNlcnZlZCAgICAgfCA0Cj4gKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAg ICAgIGluZGV4ICAgICB8ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAg ICAgICAgICB8IDEyCj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTYKPiAr ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAo+ICsgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiAr ICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8IDY0Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKgo+ICsgKiBOb3RlczoK PiArICogIC0gZnJvbnRlbmQgaXMgYWxsb3dlZCB0byBhY2Nlc3MgdGhlIGJ1ZmZlciBjb250ZW50 IGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nCj4gKyAqICAgIHJlc3BvbnNlIHRvIHRoaXMgcmVxdWVz dC4KPiArICoKPiArICogaW5kZXggLSB1aW50OF90LCBpbmRleCBvZiB0aGUgYnVmZmVyIHRvIGJl IHF1ZXVlZC4KPiArICoKPiArICoKPiArICogUmVxdWVzdCBjYW1lcmEgY29udHJvbCBkZXRhaWxz Ogo+ICsgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAg ICAgICAgICAgIDMgICAgICAgIG9jdGV0Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAg ICAgICAgICAgaWQgICAgICAgICAgICAgICAgfCBfT1BfQ1RSTF9FTlVNICB8ICAgcmVzZXJ2ZWQg ICAgIHwgNAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgIGluZGV4ICAgICB8ICAgICAg ICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICB8IDgKPiArICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMgo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICog fC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC98Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjQKPiAr ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCj4gKyAqCj4gKyAqIFNlZSByZXNwb25zZSBmb3JtYXQgZm9yIHRoaXMg cmVxdWVzdC4KPiArICoKPiArICogaW5kZXggLSB1aW50OF90LCBpbmRleCBvZiB0aGUgY29udHJv bCB0byBiZSBxdWVyaWVkLgo+ICsgKi8KPiArc3RydWN0IHhlbmNhbWVyYV9pbmRleCB7Cj4gKyAg ICB1aW50OF90IGluZGV4Owo+ICt9Owo+ICsKPiArLyoKPiArICogUmVxdWVzdCBjYW1lcmEgY29u dHJvbCBjaGFuZ2U6Cj4gKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAg ICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKPiArICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4g KyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAgICAgICB8ICBfT1BfU0VUX0NUUkwgIHwg ICByZXNlcnZlZCAgICAgfCA0Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgIHR5cGUg ICAgIHwgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgIHwg OAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg cmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEyCj4gKyAqICstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgMTYKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAg ICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxvdyAzMi1iaXQgICAgICAgICAgICAgICAgICAg ICAgICAgfCAyMAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAgICAg ICAgICAgdmFsdWUgaGlnaCAzMi1iaXQgICAgICAgICAgICAgICAgICAgICAgICB8IDI0Cj4gKyAq ICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZl ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjgKPiArICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4g KyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvfAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDY0 Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKgo+ICsgKiB0eXBlIC0gdWludDhfdCwgdHlwZSBvZiB0 aGUgY29udHJvbCwgb25lIG9mIHRoZSBYRU5DQU1FUkFfQ1RSTF9YWFguCj4gKyAqIHZhbHVlIC0g aW50NjRfdCwgbmV3IHZhbHVlIG9mIHRoZSBjb250cm9sLgo+ICsgKi8KPiArc3RydWN0IHhlbmNh bWVyYV9jdHJsX3ZhbHVlIHsKPiArICAgIHVpbnQ4X3QgdHlwZTsKPiArICAgIHVpbnQ4X3QgcmVz ZXJ2ZWRbN107Cj4gKyAgICBpbnQ2NF90IHZhbHVlOwo+ICt9Owo+ICsKPiArLyoKPiArICogUmVx dWVzdCBjYW1lcmEgY29udHJvbCBzdGF0ZToKPiArICogICAgICAgICAwICAgICAgICAgICAgICAg IDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAo+ICsgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHwgIF9P UF9HRVRfQ1RSTCAgfCAgIHJlc2VydmVkICAgICB8IDQKPiArICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAq IHwgICAgICAgdHlwZSAgICAgfCAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAg ICAgICAgICAgICAgfCA4Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTIK PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAo+ICsgKiArLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsK PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8IDY0Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKgo+ICsgKiBTZWUg cmVzcG9uc2UgZm9ybWF0IGZvciB0aGlzIHJlcXVlc3QuCj4gKyAqCj4gKyAqIHR5cGUgLSB1aW50 OF90LCB0eXBlIG9mIHRoZSBjb250cm9sLCBvbmUgb2YgdGhlIFhFTkNBTUVSQV9DVFJMX1hYWC4K PiArICovCj4gK3N0cnVjdCB4ZW5jYW1lcmFfZ2V0X2N0cmxfcmVxIHsKPiArICAgIHVpbnQ4X3Qg dHlwZTsKPiArfTsKPiArCj4gKy8qCj4gKyAqIFJlcXVlc3QgY2FtZXJhIGNhcHR1cmUgc3RyZWFt IHN0YXJ0Ogo+ICsgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAg MiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8 ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgfF9PUF9TVFJFQU1fU1RBUlR8ICAgcmVz ZXJ2ZWQgICAgIHwgNAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgKPiAr ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAo+ICsgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiAr ICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8IDY0Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKgo+ICsgKgo+ICsgKiBS ZXF1ZXN0IGNhbWVyYSBjYXB0dXJlIHN0cmVhbSBzdG9wOgo+ICsgKiAgICAgICAgIDAgICAgICAg ICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0 Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAg ICAgfF9PUF9TVFJFQU1fU1RPUCB8ICAgcmVzZXJ2ZWQgICAgIHwgNAo+ICsgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKPiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8IDgKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvfAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDY0Cj4gKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKwo+ICsgKgo+ICsgKgo+ICsgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0gUmVzcG9uc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gKyAqCj4gKyAq IEFsbCByZXNwb25zZSBwYWNrZXRzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoICg2NCBvY3RldHMpLgo+ ICsgKgo+ICsgKiBBbGwgcmVzcG9uc2UgcGFja2V0cyBoYXZlIGNvbW1vbiBoZWFkZXI6Cj4gKyAq ICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAg ICAgMyAgICAgICAgb2N0ZXQKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAg ICBpZCAgICAgICAgICAgICAgICB8ICAgIG9wZXJhdGlvbiAgIHwgICAgcmVzZXJ2ZWQgICAgfCA0 Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAo+ICsgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKPiArICoKPiArICogaWQgLSB1aW50MTZfdCwgY29waWVkIGZyb20gdGhlIHJlcXVlc3QuCj4g KyAqIG9wZXJhdGlvbiAtIHVpbnQ4X3QsIFhFTkNBTUVSQV9PUF8qIC0gY29waWVkIGZyb20gcmVx dWVzdC4KPiArICogc3RhdHVzIC0gaW50MzJfdCwgcmVzcG9uc2Ugc3RhdHVzLCB6ZXJvIG9uIHN1 Y2Nlc3MgYW5kIC1YRU5fRVhYIG9uIGZhaWx1cmUuCj4gKyAqCj4gKyAqCj4gKyAqIENvbmZpZ3Vy YXRpb24gcmVzcG9uc2UgLSByZXNwb25zZSBmb3IgWEVOQ0FNRVJBX09QX0NPTkZJR19TRVQsCj4g KyAqIFhFTkNBTUVSQV9PUF9DT05GSUdfR0VUIGFuZCBYRU5DQU1FUkFfT1BfQ09ORklHX1ZBTElE QVRFIHJlcXVlc3RzOgo+ICsgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAg ICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0Cj4gKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ ICsgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgfCBfT1BfQ09ORklHX1hYWCB8 ICAgIHJlc2VydmVkICAgIHwgNAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 IDgKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAg cGl4ZWwgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMgo+ICsgKiArLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8IDE2Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgMjAKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGNvbG9yc3BhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNAo+ICsg KiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGZlcl9m dW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDI4Cj4gKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Y2Jjcl9lbmMgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgMzIKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAzNgo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAgICAgICAgZGlz cGxfYXNwX3JhdGlvX251bWVyICAgICAgICAgICAgICAgICAgICAgICB8IDQwCj4gKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICBkaXNwbF9hc3BfcmF0aW9fZGVu b20gICAgICAgICAgICAgICAgICAgICAgIHwgNDQKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwg ICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX3JhdGVfbnVtZXIgICAgICAgICAgICAgICAg ICAgICAgICAgfCA0OAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAg ICAgICAgICAgZnJhbWVfcmF0ZV9kZW5vbSAgICAgICAgICAgICAgICAgICAgICAgICB8IDUyCj4g KyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNl cnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNTYKPiArICogKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r Cj4gKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvfAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 IDY0Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKgo+ICsgKiBNZWFuaW5nIG9mIHRoZSBjb3JyZXNw b25kaW5nIHZhbHVlcyBpbiB0aGlzIHJlc3BvbnNlIGlzIHRoZSBzYW1lIGFzIGZvcgo+ICsgKiBY RU5DQU1FUkFfT1BfQ09ORklHX1NFVCBhbmQgWEVOQ0FNRVJBX09QX0ZSQU1FX1JBVEVfU0VUIHJl cXVlc3RzLgo+ICsgKgo+ICsgKiBjb2xvcnNwYWNlIC0gdWludDMyX3QsIHRoaXMgc3VwcGxlbWVu dHMgcGl4ZWxfZm9ybWF0IHBhcmFtZXRlciwKPiArICogICBvbmUgb2YgdGhlIFhFTkNBTUVSQV9D T0xPUlNQQUNFX1hYWC4KPiArICogeGZlcl9mdW5jIC0gdWludDMyX3QsIHRoaXMgc3VwcGxlbWVu dHMgY29sb3JzcGFjZSBwYXJhbWV0ZXIsCj4gKyAqICAgb25lIG9mIHRoZSBYRU5DQU1FUkFfWEZF Ul9GVU5DX1hYWC4KPiArICogeWNiY3JfZW5jIC0gdWludDMyX3QsIHRoaXMgc3VwcGxlbWVudHMg Y29sb3JzcGFjZSBwYXJhbWV0ZXIsCj4gKyAqICAgb25lIG9mIHRoZSBYRU5DQU1FUkFfWUNCQ1Jf RU5DX1hYWC4gUGxlYXNlIG5vdGUsIHRoYXQgeWNiY3JfZW5jIGlzIG9ubHkKPiArICogICB2YWxp ZCBmb3IgWUNiQ3IgcGl4ZWxmb3JtYXRzIGFuZCBzaG91bGQgYmUgaWdub3JlZCBvdGhlcndpc2Uu Cj4gKyAqIHF1YW50aXphdGlvbiAtIHVpbnQzMl90LCB0aGlzIHN1cHBsZW1lbnRzIGNvbG9yc3Bh Y2UgcGFyYW1ldGVyLAo+ICsgKiAgIG9uZSBvZiB0aGUgWEVOQ0FNRVJBX1FVQU5USVpBVElPTl9Y WFguCj4gKyAqIGRpc3BsX2FzcF9yYXRpb19udW1lciAtIHVpbnQzMl90LCBudW1lcmF0b3Igb2Yg dGhlIGRpc3BsYXkgYXNwZWN0IHJhdGlvLgo+ICsgKiBkaXNwbF9hc3BfcmF0aW9fZGVub20gLSB1 aW50MzJfdCwgZGVub21pbmF0b3Igb2YgdGhlIGRpc3BsYXkgYXNwZWN0IHJhdGlvLgo+ICsgKi8K PiArc3RydWN0IHhlbmNhbWVyYV9jb25maWdfcmVzcCB7Cj4gKyAgICB1aW50MzJfdCBwaXhlbF9m b3JtYXQ7Cj4gKyAgICB1aW50MzJfdCB3aWR0aDsKPiArICAgIHVpbnQzMl90IGhlaWdodDsKPiAr ICAgIHVpbnQzMl90IGNvbG9yc3BhY2U7Cj4gKyAgICB1aW50MzJfdCB4ZmVyX2Z1bmM7Cj4gKyAg ICB1aW50MzJfdCB5Y2Jjcl9lbmM7Cj4gKyAgICB1aW50MzJfdCBxdWFudGl6YXRpb247Cj4gKyAg ICB1aW50MzJfdCBkaXNwbF9hc3BfcmF0aW9fbnVtZXI7Cj4gKyAgICB1aW50MzJfdCBkaXNwbF9h c3BfcmF0aW9fZGVub207Cj4gKyAgICB1aW50MzJfdCBmcmFtZV9yYXRlX251bWVyOwo+ICsgICAg dWludDMyX3QgZnJhbWVfcmF0ZV9kZW5vbTsKPiArfTsKPiArCj4gKy8qCj4gKyAqIFJlcXVlc3Qg YnVmZmVyIHJlc3BvbnNlIC0gcmVzcG9uc2UgZm9yIFhFTkNBTUVSQV9PUF9CVUZfR0VUX0xBWU9V VAo+ICsgKiByZXF1ZXN0Ogo+ICsgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAg ICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0Cj4gKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Kwo+ICsgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgfF9CVUZfR0VUX0xBWU9V VCB8ICAgIHJlc2VydmVkICAgIHwgNAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8IDgKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICBudW1fcGxhbmVzICAgfCAgICAgICAg ICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgfCAxMgo+ICsgKiArLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE2Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8 ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfc2l6ZVswXSAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgMjAKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAgICAg ICAgICAgICAgICBwbGFuZV9zaXplWzFdICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNAo+ ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5l X3NpemVbMl0gICAgICAgICAgICAgICAgICAgICAgICAgICB8IDI4Cj4gKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Kwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfc2l6ZVszXSAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgMzIKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAg ICAgICAgICAgICAgICAgICAgIHBsYW5lX3N0cmlkZVswXSAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAzNgo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAgICAgICAg ICAgcGxhbmVfc3RyaWRlWzFdICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQwCj4gKyAqICst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV9zdHJpZGVb Ml0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgNDQKPiArICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAq IHwgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lX3N0cmlkZVszXSAgICAgICAgICAgICAg ICAgICAgICAgICAgfCA0OAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98Cj4g KyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNl cnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjQKPiArICogKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r Cj4gKyAqCj4gKyAqIG51bV9wbGFuZXMgLSB1aW50OF90LCBudW1iZXIgb2YgcGxhbmVzIG9mIHRo ZSBidWZmZXIuCj4gKyAqIHNpemUgLSB1aW50MzJfdCwgb3ZlcmFsbCBzaXplIG9mIHRoZSBidWZm ZXIgaW5jbHVkaW5nIHNpemVzIG9mIHRoZQo+ICsgKiAgIGluZGl2aWR1YWwgcGxhbmVzIGFuZCBw YWRkaW5nIGlmIGFwcGxpY2FibGUuCj4gKyAqIHBsYW5lX3NpemUgLSBhcnJheSBvZiB1aW50MzJf dCwgc2l6ZSBpbiBvY3RldHMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGxhbmUKPiArICogICBpbmNs dWRpbmcgcGFkZGluZy4KPiArICogcGxhbmVfc3RyaWRlIC0gYXJyYXkgb2YgdWludDMyX3QsIHNp emUgaW4gb2N0ZXRzIG9jY3VwaWVkIGJ5IHRoZQo+ICsgKiAgIGNvcnJlc3BvbmRpbmcgc2luZ2xl IGltYWdlIGxpbmUgaW5jbHVkaW5nIHBhZGRpbmcgaWYgYXBwbGljYWJsZS4KPiArICoKPiArICog Tm90ZSEgVGhlIHNpemVzIGFuZCBzdHJpZGVzIGluIHRoaXMgcmVzcG9uc2UgYXBwbHkgdG8gYWxs IGJ1ZmZlcnMgY3JlYXRlZAo+ICsgKiB3aXRoIFhFTkNBTUVSQV9PUF9CVUZfQ1JFQVRFIGNvbW1h bmQsIGJ1dCBpbmRpdmlkdWFsIGJ1ZmZlcnMgbWF5IGhhdmUKPiArICogZGlmZmVyZW50IHBsYW5l IG9mZnNldHMsIHNlZSBYRU5DQU1FUkFfT1BfQlVGX1JFUVVFU1QucGxhbmVfb2Zmc2V0Lgo+ICsg Ki8KPiArc3RydWN0IHhlbmNhbWVyYV9idWZfZ2V0X2xheW91dF9yZXNwIHsKPiArICAgIHVpbnQ4 X3QgbnVtX3BsYW5lczsKPiArICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbM107Cj4gKyAgICB1aW50MzJf dCBzaXplOwo+ICsgICAgdWludDMyX3QgcGxhbmVfc2l6ZVtYRU5DQU1FUkFfTUFYX1BMQU5FXTsK PiArICAgIHVpbnQzMl90IHBsYW5lX3N0cmlkZVtYRU5DQU1FUkFfTUFYX1BMQU5FXTsKPiArfTsK PiArCj4gKy8qCj4gKyAqIFJlcXVlc3QgYnVmZmVyIHJlc3BvbnNlIC0gcmVzcG9uc2UgZm9yIFhF TkNBTUVSQV9PUF9CVUZfUkVRVUVTVAo+ICsgKiByZXF1ZXN0Ogo+ICsgKiAgICAgICAgIDAgICAg ICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9j dGV0Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAg ICAgICAgfF9PUF9CVUZfUkVRVUVTVCB8ICAgIHJlc2VydmVkICAgIHwgNAo+ICsgKiArLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8IDgKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICBu dW1fYnVmZmVycyAgfCAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAg ICAgICAgfCAxMgo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE2Cj4gKyAq ICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKwo+ICsgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKPiArICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAq IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCA2NAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICoKPiArICogbnVtX2J1ZmZl cnMgLSB1aW50OF90LCBudW1iZXIgb2YgYnVmZmVycyB0byBiZSB1c2VkLgo+ICsgKgo+ICsgKgo+ ICsgKiBDb250cm9sIGVudW1lcmF0ZSByZXNwb25zZSAtIHJlc3BvbnNlIGZvciBYRU5DQU1FUkFf T1BfQ1RSTF9FTlVNOgo+ICsgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAg ICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0Cj4gKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ ICsgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgfCBfT1BfQ1RSTF9FTlVNICB8 ICAgIHJlc2VydmVkICAgIHwgNAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 IDgKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgIGluZGV4ICAgICAgfCAgICAgIHR5cGUg ICAgICB8ICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgfCAxMgo+ICsgKiArLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8IDE2Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAg ICAgICAgICAgICAgICAgICAgICAgICBtaW4gbG93IDMyLWJpdHMgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgMjAKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAgICAgICAg ICAgICAgIG1pbiBoaWdoIDMyLWJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNAo+ICsg KiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4IGxvdyAz Mi1iaXRzICAgICAgICAgICAgICAgICAgICAgICAgICB8IDI4Cj4gKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggaGlnaCAzMi1iaXRzICAgICAgICAg ICAgICAgICAgICAgICAgIHwgMzIKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAg ICAgICAgICAgICAgICAgc3RlcCBsb3cgMzItYml0cyAgICAgICAgICAgICAgICAgICAgICAgICAg fCAzNgo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICBz dGVwIGhpZ2ggMzItYml0cyAgICAgICAgICAgICAgICAgICAgICAgICB8IDQwCj4gKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgZGVmX3ZhbCBsb3cgMzItYml0 cyAgICAgICAgICAgICAgICAgICAgICAgIHwgNDQKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwg ICAgICAgICAgICAgICAgICAgICAgICBkZWZfdmFsIGhpZ2ggMzItYml0cyAgICAgICAgICAgICAg ICAgICAgICAgfCA0OAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDUyCj4g KyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKPiArICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4g KyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCA2NAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICoKPiArICogaW5kZXgg LSB1aW50OF90LCBpbmRleCBvZiB0aGUgY2FtZXJhIGNvbnRyb2wgaW4gcmVzcG9uc2UuCj4gKyAq IHR5cGUgLSB1aW50OF90LCB0eXBlIG9mIHRoZSBjb250cm9sLCBvbmUgb2YgdGhlIFhFTkNBTUVS QV9DVFJMX1hYWC4KPiArICogZmxhZ3MgLSB1aW50MzJfdCwgZmxhZ3Mgb2YgdGhlIGNvbnRyb2ws IG9uZSBvZiB0aGUgWEVOQ0FNRVJBX0NUUkxfRkxHX1hYWC4KPiArICogbWluIC0gaW50NjRfdCwg bWluaW11bSB2YWx1ZSBvZiB0aGUgY29udHJvbC4KPiArICogbWF4IC0gaW50NjRfdCwgbWF4aW11 bSB2YWx1ZSBvZiB0aGUgY29udHJvbC4KPiArICogc3RlcCAtIGludDY0X3QsIG1pbmltdW0gc2l6 ZSBpbiB3aGljaCBjb250cm9sIHZhbHVlIGNhbiBiZSBjaGFuZ2VkLgo+ICsgKiBkZWZfdmFsIC0g aW50NjRfdCwgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29udHJvbC4KPiArICovCj4gK3N0cnVjdCB4 ZW5jYW1lcmFfY3RybF9lbnVtX3Jlc3Agewo+ICsgICAgdWludDhfdCBpbmRleDsKPiArICAgIHVp bnQ4X3QgdHlwZTsKPiArICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbMl07Cj4gKyAgICB1aW50MzJfdCBm bGFnczsKPiArICAgIGludDY0X3QgbWluOwo+ICsgICAgaW50NjRfdCBtYXg7Cj4gKyAgICBpbnQ2 NF90IHN0ZXA7Cj4gKyAgICBpbnQ2NF90IGRlZl92YWw7Cj4gK307Cj4gKwo+ICsvKgo+ICsgKiBH ZXQgY29udHJvbCByZXNwb25zZSAtIHJlc3BvbnNlIGZvciBYRU5DQU1FUkFfT1BfQ1RSTF9HRVQ6 Cj4gKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAg ICAgICAgICAgMyAgICAgICAgb2N0ZXQKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAg ICAgICAgICBpZCAgICAgICAgICAgICAgICB8IF9PUF9DVFJMX0dFVCAgIHwgICAgcmVzZXJ2ZWQg ICAgfCA0Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAo+ICsgKiArLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSsKPiArICogfCAgICAgICB0eXBlICAgICB8ICAgICAgICAgICAgICAgICAgICAgcmVz ZXJ2ZWQgICAgICAgICAgICAgICAgICAgICB8IDEyCj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgMTYKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMAo+ ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUg bG93IDMyLWJpdCAgICAgICAgICAgICAgICAgICAgICAgICB8IDI0Cj4gKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Kwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBoaWdoIDMyLWJpdCAgICAg ICAgICAgICAgICAgICAgICAgIHwgMjgKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAzMgo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98Cj4gKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjQKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqCj4g KyAqIHR5cGUgLSB1aW50OF90LCB0eXBlIG9mIHRoZSBjb250cm9sLCBvbmUgb2YgdGhlIFhFTkNB TUVSQV9DVFJMX1hYWC4KPiArICogdmFsdWUgLSBpbnQ2NF90LCBuZXcgdmFsdWUgb2YgdGhlIGNv bnRyb2wuCj4gKyAqLwo+ICsKPiArLyoKPiArICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLSBFdmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICsgKgo+ ICsgKiBFdmVudHMgYXJlIHNlbnQgdmlhIGEgc2hhcmVkIHBhZ2UgYWxsb2NhdGVkIGJ5IHRoZSBm cm9udCBhbmQgcHJvcGFnYXRlZCBieQo+ICsgKiAgIGV2dC1ldmVudC1jaGFubmVsL2V2dC1yaW5n LXJlZiBYZW5TdG9yZSBlbnRyaWVzLgo+ICsgKgo+ICsgKiBBbGwgZXZlbnQgcGFja2V0cyBoYXZl IHRoZSBzYW1lIGxlbmd0aCAoNjQgb2N0ZXRzKS4KPiArICogQWxsIGV2ZW50IHBhY2tldHMgaGF2 ZSBjb21tb24gaGVhZGVyOgo+ICsgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAg ICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0Cj4gKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Kwo+ICsgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgfCAgICAgIHR5cGUgICAg ICB8ICAgcmVzZXJ2ZWQgICAgIHwgNAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8IDgKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqCj4gKyAqIGlkIC0gdWludDE2X3QsIGV2ZW50 IGlkLCBtYXkgYmUgdXNlZCBieSBmcm9udC4KPiArICogdHlwZSAtIHVpbnQ4X3QsIHR5cGUgb2Yg dGhlIGV2ZW50Lgo+ICsgKgo+ICsgKgo+ICsgKiBGcmFtZSBjYXB0dXJlZCBldmVudCAtIGV2ZW50 IGZyb20gYmFjayB0byBmcm9udCB3aGVuIGEgbmV3IGNhcHR1cmVkCj4gKyAqIGZyYW1lIGlzIGF2 YWlsYWJsZToKPiArICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAg IDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICog fCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHxfRVZUX0ZSQU1FX0FWQUlMfCAgIHJl c2VydmVkICAgICB8IDQKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4Cj4g KyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgaW5kZXggICAgIHwgICAgICAgICAgICAgICAg ICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgIHwgMTIKPiArICogKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r Cj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkX3N6ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAxNgo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHNlcV9udW0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8IDIwCj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjQKPiArICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCj4gKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB8IDY0Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKgo+ICsgKiBpbmRleCAtIHVpbnQ4 X3QsIGluZGV4IG9mIHRoZSBidWZmZXIgdGhhdCBjb250YWlucyBuZXcgY2FwdHVyZWQgZnJhbWUs Cj4gKyAqICAgc2VlIFhFTkNBTUVSQV9PUF9CVUZfQ1JFQVRFIGRlc2NyaXB0aW9uIG9uIHRoZSBy YW5nZQo+ICsgKiB1c2VkX3N6IC0gdWludDMyX3QsIG51bWJlciBvZiBvY3RldHMgdGhpcyBmcmFt ZSBoYXMuIFRoaXMgY2FuIGJlIGxlc3MKPiArICogdGhhbiB0aGUgWEVOQ0FNRVJBX09QX0JVRl9S RVFVRVNULnNpemUgKHJlc3BvbnNlKSBmb3IgY29tcHJlc3NlZCBmb3JtYXRzLgo+ICsgKiBzZXFf bnVtIC0gdWludDMyX3QsIHNlcXVlbnRpYWwgbnVtYmVyIG9mIHRoZSBmcmFtZS4gTXVzdCBiZQo+ ICsgKiAgIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy4gSWYgc2tpcHMgYXJlIGRldGVjdGVkIGlu IHNlcV9udW0gdGhlbiB0aGF0Cj4gKyAqICAgbWVhbnMgdGhhdCB0aGUgZnJhbWVzIGluLWJldHdl ZW4gd2VyZSBkcm9wcGVkLiBOb3RlIGhvd2V2ZXIgdGhhdCBub3QKPiArICogICBhbGwgdmlkZW8g Y2FwdHVyZSBoYXJkd2FyZSBpcyBjYXBhYmxlIG9mIGRldGVjdGluZyBkcm9wcGVkIGZyYW1lcy4K PiArICogICBJbiB0aGF0IGNhc2UgdGhlcmUgd2lsbCBiZSBubyBza2lwcyBpbiB0aGUgc2VxdWVu Y2UgY291bnRlci4KPiArICovCj4gK3N0cnVjdCB4ZW5jYW1lcmFfZnJhbWVfYXZhaWxfZXZ0IHsK PiArICAgIHVpbnQ4X3QgaW5kZXg7Cj4gKyAgICB1aW50OF90IHJlc2VydmVkWzNdOwo+ICsgICAg dWludDMyX3QgdXNlZF9zejsKPiArICAgIHVpbnQzMl90IHNlcV9udW07Cj4gK307Cj4gKwo+ICsv Kgo+ICsgKiBDb250cm9sIGNoYW5nZSBldmVudC0gZXZlbnQgZnJvbSBiYWNrIHRvIGZyb250IHdo ZW4gY2FtZXJhIGNvbnRyb2wKPiArICogaGFzIGNoYW5nZWQ6Cj4gKyAqICAgICAgICAgMCAgICAg ICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0 ZXQKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAg ICAgICB8X0VWVF9DVFJMX0NIQU5HRXwgICByZXNlcnZlZCAgICAgfCA0Cj4gKyAqICstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKwo+ICsgKiB8ICAgICAgIHR5cGUgICAgIHwgICAgICAgICAgICAgICAgICAgICByZXNlcnZl ZCAgICAgICAgICAgICAgICAgICAgIHwgOAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiArICogfCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8IDEyCj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTYKPiArICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxvdyAz Mi1iaXQgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMAo+ICsgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPiAr ICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaGlnaCAzMi1iaXQgICAgICAgICAg ICAgICAgICAgICAgICB8IDI0Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiB8ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg MjgKPiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAo+ICsgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKPiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8IDY0Cj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ICsgKgo+ICsgKiB0 eXBlIC0gdWludDhfdCwgdHlwZSBvZiB0aGUgY29udHJvbCwgb25lIG9mIHRoZSBYRU5DQU1FUkFf Q1RSTF9YWFguCj4gKyAqIHZhbHVlIC0gaW50NjRfdCwgbmV3IHZhbHVlIG9mIHRoZSBjb250cm9s Lgo+ICsgKgo+ICsgKiBOb3RlczoKPiArICogIC0gdGhpcyBldmVudCBpcyBub3Qgc2VudCBmb3Ig d3JpdGUtb25seSBjb250cm9scwo+ICsgKiAgLSB0aGlzIGV2ZW50IGlzIG5vdCBzZW50IHRvIHRo ZSBvcmlnaW5hdG9yIG9mIHRoZSBjb250cm9sIGNoYW5nZQo+ICsgKiAgLSB0aGlzIGV2ZW50IGlz IG5vdCBzZW50IHdoZW4gZnJvbnRlbmQgZmlyc3QgY29ubmVjdHMsIGUuZy4gaW5pdGlhbAo+ICsg KiAgICBjb250cm9sIHN0YXRlIG11c3QgYmUgZXhwbGljaXRseSBxdWVyaWVkCj4gKyAqLwo+ICsK PiArc3RydWN0IHhlbmNhbWVyYV9yZXEgewo+ICsgICAgdWludDE2X3QgaWQ7Cj4gKyAgICB1aW50 OF90IG9wZXJhdGlvbjsKPiArICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbNV07Cj4gKyAgICB1bmlvbiB7 Cj4gKyAgICAgICAgc3RydWN0IHhlbmNhbWVyYV9jb25maWdfcmVxIGNvbmZpZzsKPiArICAgICAg ICBzdHJ1Y3QgeGVuY2FtZXJhX2ZyYW1lX3JhdGVfcmVxIGZyYW1lX3JhdGU7Cj4gKyAgICAgICAg c3RydWN0IHhlbmNhbWVyYV9idWZfcmVxdWVzdCBidWZfcmVxdWVzdDsKPiArICAgICAgICBzdHJ1 Y3QgeGVuY2FtZXJhX2J1Zl9jcmVhdGVfcmVxIGJ1Zl9jcmVhdGU7Cj4gKyAgICAgICAgc3RydWN0 IHhlbmNhbWVyYV9pbmRleCBpbmRleDsKPiArICAgICAgICBzdHJ1Y3QgeGVuY2FtZXJhX2N0cmxf dmFsdWUgY3RybF92YWx1ZTsKPiArICAgICAgICBzdHJ1Y3QgeGVuY2FtZXJhX2dldF9jdHJsX3Jl cSBnZXRfY3RybDsKPiArICAgICAgICB1aW50OF90IHJlc2VydmVkWzU2XTsKPiArICAgIH0gcmVx Owo+ICt9Owo+ICsKPiArc3RydWN0IHhlbmNhbWVyYV9yZXNwIHsKPiArICAgIHVpbnQxNl90IGlk Owo+ICsgICAgdWludDhfdCBvcGVyYXRpb247Cj4gKyAgICB1aW50OF90IHJlc2VydmVkOwo+ICsg ICAgaW50MzJfdCBzdGF0dXM7Cj4gKyAgICB1bmlvbiB7Cj4gKyAgICAgICAgc3RydWN0IHhlbmNh bWVyYV9jb25maWdfcmVzcCBjb25maWc7Cj4gKyAgICAgICAgc3RydWN0IHhlbmNhbWVyYV9idWZf Z2V0X2xheW91dF9yZXNwIGJ1Zl9sYXlvdXQ7Cj4gKyAgICAgICAgc3RydWN0IHhlbmNhbWVyYV9i dWZfcmVxdWVzdCBidWZfcmVxdWVzdDsKPiArICAgICAgICBzdHJ1Y3QgeGVuY2FtZXJhX2N0cmxf ZW51bV9yZXNwIGN0cmxfZW51bTsKPiArICAgICAgICBzdHJ1Y3QgeGVuY2FtZXJhX2N0cmxfdmFs dWUgY3RybF92YWx1ZTsKPiArICAgICAgICB1aW50OF90IHJlc2VydmVkMVs1Nl07Cj4gKyAgICB9 IHJlc3A7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgeGVuY2FtZXJhX2V2dCB7Cj4gKyAgICB1aW50MTZf dCBpZDsKPiArICAgIHVpbnQ4X3QgdHlwZTsKPiArICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbNV07Cj4g KyAgICB1bmlvbiB7Cj4gKyAgICAgICAgc3RydWN0IHhlbmNhbWVyYV9mcmFtZV9hdmFpbF9ldnQg ZnJhbWVfYXZhaWw7Cj4gKyAgICAgICAgc3RydWN0IHhlbmNhbWVyYV9jdHJsX3ZhbHVlIGN0cmxf dmFsdWU7Cj4gKyAgICAgICAgdWludDhfdCByZXNlcnZlZFs1Nl07Cj4gKyAgICB9IGV2dDsKPiAr fTsKPiArCj4gK0RFRklORV9SSU5HX1RZUEVTKHhlbl9jYW1lcmFpZiwgc3RydWN0IHhlbmNhbWVy YV9yZXEsIHN0cnVjdCB4ZW5jYW1lcmFfcmVzcCk7Cj4gKwo+ICsvKgo+ICsgKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqCj4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgQmFjayB0byBmcm9udCBldmVu dHMgZGVsaXZlcnkKPiArICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgo+ICsgKiBJbiBvcmRlciB0byBk ZWxpdmVyIGFzeW5jaHJvbm91cyBldmVudHMgZnJvbSBiYWNrIHRvIGZyb250IGEgc2hhcmVkIHBh Z2UgaXMKPiArICogYWxsb2NhdGVkIGJ5IGZyb250IGFuZCBpdHMgZ3JhbnRlZCByZWZlcmVuY2Ug cHJvcGFnYXRlZCB0byBiYWNrIHZpYQo+ICsgKiBYZW5TdG9yZSBlbnRyaWVzIChldnQtcmluZy1y ZWYvZXZ0LWV2ZW50LWNoYW5uZWwpLgo+ICsgKiBUaGlzIHBhZ2UgaGFzIGEgY29tbW9uIGhlYWRl ciB1c2VkIGJ5IGJvdGggZnJvbnQgYW5kIGJhY2sgdG8gc3luY2hyb25pemUKPiArICogYWNjZXNz IGFuZCBjb250cm9sIGV2ZW50J3MgcmluZyBidWZmZXIsIHdoaWxlIGJhY2sgYmVpbmcgYSBwcm9k dWNlciBvZiB0aGUKPiArICogZXZlbnRzIGFuZCBmcm9udCBiZWluZyBhIGNvbnN1bWVyLiBUaGUg cmVzdCBvZiB0aGUgcGFnZSBhZnRlciB0aGUgaGVhZGVyCj4gKyAqIGlzIHVzZWQgZm9yIGV2ZW50 IHBhY2tldHMuCj4gKyAqCj4gKyAqIFVwb24gcmVjZXB0aW9uIG9mIGFuIGV2ZW50KHMpIGZyb250 IG1heSBjb25maXJtIGl0cyByZWNlcHRpb24KPiArICogZm9yIGVpdGhlciBlYWNoIGV2ZW50LCBn cm91cCBvZiBldmVudHMgb3Igbm9uZS4KPiArICovCj4gKwo+ICtzdHJ1Y3QgeGVuY2FtZXJhX2V2 ZW50X3BhZ2Ugewo+ICsgICAgdWludDMyX3QgaW5fY29uczsKPiArICAgIHVpbnQzMl90IGluX3By b2Q7Cj4gKyAgICB1aW50OF90IHJlc2VydmVkWzU2XTsKPiArfTsKPiArCj4gKyNkZWZpbmUgWEVO Q0FNRVJBX0VWRU5UX1BBR0VfU0laRSA0MDk2Cj4gKyNkZWZpbmUgWEVOQ0FNRVJBX0lOX1JJTkdf T0ZGUyAoc2l6ZW9mKHN0cnVjdCB4ZW5jYW1lcmFfZXZlbnRfcGFnZSkpCj4gKyNkZWZpbmUgWEVO Q0FNRVJBX0lOX1JJTkdfU0laRSAoWEVOQ0FNRVJBX0VWRU5UX1BBR0VfU0laRSAtIFhFTkNBTUVS QV9JTl9SSU5HX09GRlMpCj4gKyNkZWZpbmUgWEVOQ0FNRVJBX0lOX1JJTkdfTEVOIChYRU5DQU1F UkFfSU5fUklOR19TSVpFIC8gc2l6ZW9mKHN0cnVjdCB4ZW5jYW1lcmFfZXZ0KSkKPiArI2RlZmlu ZSBYRU5DQU1FUkFfSU5fUklORyhwYWdlKSBcCj4gKyAgICAoKHN0cnVjdCB4ZW5jYW1lcmFfZXZ0 ICopKChjaGFyICopKHBhZ2UpICsgWEVOQ0FNRVJBX0lOX1JJTkdfT0ZGUykpCj4gKyNkZWZpbmUg WEVOQ0FNRVJBX0lOX1JJTkdfUkVGKHBhZ2UsIGlkeCkgXAo+ICsgICAgKFhFTkNBTUVSQV9JTl9S SU5HKChwYWdlKSlbKGlkeCkgJSBYRU5DQU1FUkFfSU5fUklOR19MRU5dKQo+ICsKPiArI2VuZGlm IC8qIF9fWEVOX1BVQkxJQ19JT19DQU1FUkFJRl9IX18gKi8KPiArCj4gKy8qCj4gKyAqIExvY2Fs IHZhcmlhYmxlczoKPiArICogbW9kZTogQwo+ICsgKiBjLWZpbGUtc3R5bGU6ICJCU0QiCj4gKyAq IGMtYmFzaWMtb2Zmc2V0OiA0Cj4gKyAqIHRhYi13aWR0aDogNAo+ICsgKiBpbmRlbnQtdGFicy1t b2RlOiBuaWwKPiArICogRW5kOgo+ICsgKi8KPiAKCgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBs aXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwczovL2xpc3RzLnhlbnByb2plY3Qub3JnL21haWxtYW4v bGlzdGluZm8veGVuLWRldmVs