From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6663E1079F for ; Mon, 21 Nov 2022 23:28:41 +0000 (UTC) Received: from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 2029E88F; Tue, 22 Nov 2022 00:28:39 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1669073319; bh=cC/yGsnh62r1C2zY2rHk7jtuYsCdE0HihBu80S+TNYo=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=GQOVC55C0LaaBonmfDi9LL1cWsAJib2JACPijg/hs8EPF+/IhBUdQfXUhsK2H+PXr MjynuEHJAbbwVAlMv3JY9EzKMU9n6g/EskLRrTCvHiWF7seuO84B/SaKK7eGhIsllC nHZoJXsel30pBxVhCw3eBikMha/j23/N86zy0Pi0= Date: Tue, 22 Nov 2022 01:28:23 +0200 From: Laurent Pinchart To: Umang Jain Cc: linux-media@vger.kernel.org, kernel-list@raspberrypi.com, linux-kernel@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-staging@lists.linux.dev, Broadcom internal kernel review list , Dave Stevenson , Florian Fainelli , Naushir Patuck , David Plowman , Kieran Bingham Subject: Re: [PATCH 08/14] uapi: bcm2835-isp: Add bcm2835-isp uapi header file Message-ID: References: <20221121214722.22563-1-umang.jain@ideasonboard.com> <20221121214722.22563-9-umang.jain@ideasonboard.com> Precedence: bulk X-Mailing-List: linux-staging@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20221121214722.22563-9-umang.jain@ideasonboard.com> Hi Umang and Dave, Thank you for the patch. On Tue, Nov 22, 2022 at 03:17:16AM +0530, Umang Jain wrote: > From: Dave Stevenson > > This file defines the userland interface to the bcm2835-isp driver > that will follow in a separate commit. > > Signed-off-by: Naushir Patuck > Signed-off-by: Dave Stevenson > Signed-off-by: Umang Jain > --- > include/uapi/linux/bcm2835-isp.h | 320 +++++++++++++++++++++++++++++ > include/uapi/linux/v4l2-controls.h | 6 + > 2 files changed, 326 insertions(+) > create mode 100644 include/uapi/linux/bcm2835-isp.h > > diff --git a/include/uapi/linux/bcm2835-isp.h b/include/uapi/linux/bcm2835-isp.h > new file mode 100644 > index 000000000000..cf8c0437f159 > --- /dev/null > +++ b/include/uapi/linux/bcm2835-isp.h > @@ -0,0 +1,320 @@ > +/* SPDX-License-Identifier: ((GPL-2.0+ WITH Linux-syscall-note) OR BSD-3-Clause) */ > +/* > + * bcm2835-isp.h > + * > + * BCM2835 ISP driver - user space header file. > + * > + * Copyright © 2019-2020 Raspberry Pi (Trading) Ltd. > + * > + * Author: Naushir Patuck (naush@raspberrypi.com) > + * > + */ > + > +#ifndef __BCM2835_ISP_H_ > +#define __BCM2835_ISP_H_ > + > +#include > + > +#define V4L2_CID_USER_BCM2835_ISP_CC_MATRIX \ > + (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0001) > +#define V4L2_CID_USER_BCM2835_ISP_LENS_SHADING \ > + (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0002) > +#define V4L2_CID_USER_BCM2835_ISP_BLACK_LEVEL \ > + (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0003) > +#define V4L2_CID_USER_BCM2835_ISP_GEQ \ > + (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0004) > +#define V4L2_CID_USER_BCM2835_ISP_GAMMA \ > + (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0005) > +#define V4L2_CID_USER_BCM2835_ISP_DENOISE \ > + (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0006) > +#define V4L2_CID_USER_BCM2835_ISP_SHARPEN \ > + (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0007) > +#define V4L2_CID_USER_BCM2835_ISP_DPC \ > + (V4L2_CID_USER_BCM2835_ISP_BASE + 0x0008) > + > +/* > + * All structs below are directly mapped onto the equivalent structs in > + * drivers/staging/vc04_services/vchiq-mmal/mmal-parameters.h > + * for convenience. > + */ > + > +/** > + * struct bcm2835_isp_rational - Rational value type. > + * > + * @num: Numerator. > + * @den: Denominator. > + */ > +struct bcm2835_isp_rational { > + __s32 num; > + __u32 den; > +}; > + > +/** > + * struct bcm2835_isp_ccm - Colour correction matrix. > + * > + * @ccm: 3x3 correction matrix coefficients. > + * @offsets: 1x3 correction offsets. > + */ > +struct bcm2835_isp_ccm { > + struct bcm2835_isp_rational ccm[3][3]; > + __s32 offsets[3]; > +}; > + > +/** > + * struct bcm2835_isp_custom_ccm - Custom CCM applied with the > + * V4L2_CID_USER_BCM2835_ISP_CC_MATRIX ctrl. > + * > + * @enabled: Enable custom CCM. > + * @ccm: Custom CCM coefficients and offsets. > + */ > +struct bcm2835_isp_custom_ccm { > + __u32 enabled; > + struct bcm2835_isp_ccm ccm; > +}; > + > +/** > + * enum bcm2835_isp_gain_format - format of the gains in the lens shading > + * tables used with the > + * V4L2_CID_USER_BCM2835_ISP_LENS_SHADING ctrl. > + * > + * @GAIN_FORMAT_U0P8_1: Gains are u0.8 format, starting at 1.0 > + * @GAIN_FORMAT_U1P7_0: Gains are u1.7 format, starting at 0.0 > + * @GAIN_FORMAT_U1P7_1: Gains are u1.7 format, starting at 1.0 > + * @GAIN_FORMAT_U2P6_0: Gains are u2.6 format, starting at 0.0 > + * @GAIN_FORMAT_U2P6_1: Gains are u2.6 format, starting at 1.0 > + * @GAIN_FORMAT_U3P5_0: Gains are u3.5 format, starting at 0.0 > + * @GAIN_FORMAT_U3P5_1: Gains are u3.5 format, starting at 1.0 > + * @GAIN_FORMAT_U4P10: Gains are u4.10 format, starting at 0.0 > + */ > +enum bcm2835_isp_gain_format { > + GAIN_FORMAT_U0P8_1 = 0, > + GAIN_FORMAT_U1P7_0 = 1, > + GAIN_FORMAT_U1P7_1 = 2, > + GAIN_FORMAT_U2P6_0 = 3, > + GAIN_FORMAT_U2P6_1 = 4, > + GAIN_FORMAT_U3P5_0 = 5, > + GAIN_FORMAT_U3P5_1 = 6, > + GAIN_FORMAT_U4P10 = 7, > +}; > + > +/** > + * struct bcm2835_isp_lens_shading - Lens shading tables supplied with the > + * V4L2_CID_USER_BCM2835_ISP_LENS_SHADING > + * ctrl. > + * > + * @enabled: Enable lens shading. > + * @grid_cell_size: Size of grid cells in samples (16, 32, 64, 128 or 256). > + * @grid_width: Width of lens shading tables in grid cells. > + * @grid_stride: Row to row distance (in grid cells) between grid cells > + * in the same horizontal location. > + * @grid_height: Height of lens shading tables in grid cells. > + * @dmabuf: dmabuf file handle containing the table. > + * @ref_transform: Reference transform - unsupported, please pass zero. > + * @corner_sampled: Whether the gains are sampled at the corner points > + * of the grid cells or in the cell centres. > + * @gain_format: Format of the gains (see enum &bcm2835_isp_gain_format). > + */ > +struct bcm2835_isp_lens_shading { > + __u32 enabled; > + __u32 grid_cell_size; > + __u32 grid_width; > + __u32 grid_stride; > + __u32 grid_height; > + __s32 dmabuf; > + __u32 ref_transform; > + __u32 corner_sampled; > + __u32 gain_format; > +}; > + > +/** > + * struct bcm2835_isp_black_level - Sensor black level set with the > + * V4L2_CID_USER_BCM2835_ISP_BLACK_LEVEL ctrl. > + * > + * @enabled: Enable black level. > + * @black_level_r: Black level for red channel. > + * @black_level_g: Black level for green channels. > + * @black_level_b: Black level for blue channel. > + */ > +struct bcm2835_isp_black_level { > + __u32 enabled; > + __u16 black_level_r; > + __u16 black_level_g; > + __u16 black_level_b; > + __u8 padding[2]; /* Unused */ > +}; > + > +/** > + * struct bcm2835_isp_geq - Green equalisation parameters set with the > + * V4L2_CID_USER_BCM2835_ISP_GEQ ctrl. > + * > + * @enabled: Enable green equalisation. > + * @offset: Fixed offset of the green equalisation threshold. > + * @slope: Slope of the green equalisation threshold. > + */ > +struct bcm2835_isp_geq { > + __u32 enabled; > + __u32 offset; > + struct bcm2835_isp_rational slope; > +}; > + > +#define BCM2835_NUM_GAMMA_PTS 33 > + > +/** > + * struct bcm2835_isp_gamma - Gamma parameters set with the > + * V4L2_CID_USER_BCM2835_ISP_GAMMA ctrl. > + * > + * @enabled: Enable gamma adjustment. > + * @X: X values of the points defining the gamma curve. > + * Values should be scaled to 16 bits. > + * @Y: Y values of the points defining the gamma curve. > + * Values should be scaled to 16 bits. > + */ > +struct bcm2835_isp_gamma { > + __u32 enabled; > + __u16 x[BCM2835_NUM_GAMMA_PTS]; > + __u16 y[BCM2835_NUM_GAMMA_PTS]; > +}; > + > +/** > + * struct bcm2835_isp_denoise - Denoise parameters set with the > + * V4L2_CID_USER_BCM2835_ISP_DENOISE ctrl. > + * > + * @enabled: Enable denoise. > + * @constant: Fixed offset of the noise threshold. > + * @slope: Slope of the noise threshold. > + * @strength: Denoise strength between 0.0 (off) and 1.0 (maximum). > + */ > +struct bcm2835_isp_denoise { > + __u32 enabled; > + __u32 constant; > + struct bcm2835_isp_rational slope; > + struct bcm2835_isp_rational strength; > +}; > + > +/** > + * struct bcm2835_isp_sharpen - Sharpen parameters set with the > + * V4L2_CID_USER_BCM2835_ISP_SHARPEN ctrl. > + * > + * @enabled: Enable sharpening. > + * @threshold: Threshold at which to start sharpening pixels. > + * @strength: Strength with which pixel sharpening increases. > + * @limit: Limit to the amount of sharpening applied. > + */ > +struct bcm2835_isp_sharpen { > + __u32 enabled; > + struct bcm2835_isp_rational threshold; > + struct bcm2835_isp_rational strength; > + struct bcm2835_isp_rational limit; > +}; > + > +/** > + * enum bcm2835_isp_dpc_mode - defective pixel correction (DPC) strength. > + * > + * @DPC_MODE_OFF: No DPC. > + * @DPC_MODE_NORMAL: Normal DPC. > + * @DPC_MODE_STRONG: Strong DPC. > + */ > +enum bcm2835_isp_dpc_mode { > + DPC_MODE_OFF = 0, > + DPC_MODE_NORMAL = 1, > + DPC_MODE_STRONG = 2, > +}; > + > +/** > + * struct bcm2835_isp_dpc - Defective pixel correction (DPC) parameters set > + * with the V4L2_CID_USER_BCM2835_ISP_DPC ctrl. > + * > + * @enabled: Enable DPC. > + * @strength: DPC strength (see enum &bcm2835_isp_dpc_mode). > + */ > +struct bcm2835_isp_dpc { > + __u32 enabled; > + __u32 strength; > +}; > + > +/* > + * ISP statistics structures. > + * > + * The bcm2835_isp_stats structure is generated at the output of the > + * statistics node. Note that this does not directly map onto the statistics > + * output of the ISP HW. Instead, the MMAL firmware code maps the HW statistics > + * to the bcm2835_isp_stats structure. > + */ > +#define DEFAULT_AWB_REGIONS_X 16 > +#define DEFAULT_AWB_REGIONS_Y 12 > + > +#define NUM_HISTOGRAMS 2 > +#define NUM_HISTOGRAM_BINS 128 > +#define AWB_REGIONS (DEFAULT_AWB_REGIONS_X * DEFAULT_AWB_REGIONS_Y) > +#define FLOATING_REGIONS 16 > +#define AGC_REGIONS 16 > +#define FOCUS_REGIONS 12 > + > +/** > + * struct bcm2835_isp_stats_hist - Histogram statistics > + * > + * @r_hist: Red channel histogram. > + * @g_hist: Combined green channel histogram. > + * @b_hist: Blue channel histogram. > + */ > +struct bcm2835_isp_stats_hist { > + __u32 r_hist[NUM_HISTOGRAM_BINS]; > + __u32 g_hist[NUM_HISTOGRAM_BINS]; > + __u32 b_hist[NUM_HISTOGRAM_BINS]; > +}; > + > +/** > + * struct bcm2835_isp_stats_region - Region sums. > + * > + * @counted: The number of 2x2 bayer tiles accumulated. > + * @notcounted: The number of 2x2 bayer tiles not accumulated. > + * @r_sum: Total sum of counted pixels in the red channel for a region. > + * @g_sum: Total sum of counted pixels in the green channel for a region. > + * @b_sum: Total sum of counted pixels in the blue channel for a region. > + */ > +struct bcm2835_isp_stats_region { > + __u32 counted; > + __u32 notcounted; > + __u64 r_sum; > + __u64 g_sum; > + __u64 b_sum; > +}; > + > +/** > + * struct bcm2835_isp_stats_focus - Focus statistics. > + * > + * @contrast_val: Focus measure - accumulated output of the focus filter. > + * In the first dimension, index [0] counts pixels below a > + * preset threshold, and index [1] counts pixels above the > + * threshold. In the second dimension, index [0] uses the > + * first predefined filter, and index [1] uses the second > + * predefined filter. > + * @contrast_val_num: The number of counted pixels in the above accumulation. > + */ > +struct bcm2835_isp_stats_focus { > + __u64 contrast_val[2][2]; > + __u32 contrast_val_num[2][2]; > +}; > + > +/** > + * struct bcm2835_isp_stats - ISP statistics. > + * > + * @version: Version of the bcm2835_isp_stats structure. > + * @size: Size of the bcm2835_isp_stats structure. > + * @hist: Histogram statistics for the entire image. > + * @awb_stats: Statistics for the regions defined for AWB calculations. > + * @floating_stats: Statistics for arbitrarily placed (floating) regions. > + * @agc_stats: Statistics for the regions defined for AGC calculations. > + * @focus_stats: Focus filter statistics for the focus regions. > + */ > +struct bcm2835_isp_stats { > + __u32 version; > + __u32 size; > + struct bcm2835_isp_stats_hist hist[NUM_HISTOGRAMS]; > + struct bcm2835_isp_stats_region awb_stats[AWB_REGIONS]; > + struct bcm2835_isp_stats_region floating_stats[FLOATING_REGIONS]; > + struct bcm2835_isp_stats_region agc_stats[AGC_REGIONS]; > + struct bcm2835_isp_stats_focus focus_stats[FOCUS_REGIONS]; > +}; > + > +#endif /* __BCM2835_ISP_H_ */ > diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h > index b5e7d082b8ad..31606d42ec58 100644 > --- a/include/uapi/linux/v4l2-controls.h > +++ b/include/uapi/linux/v4l2-controls.h > @@ -217,6 +217,7 @@ enum v4l2_colorfx { > * The base for Allegro driver controls. > * We reserve 16 controls for this driver. > */ > + Unrelated change. > #define V4L2_CID_USER_ALLEGRO_BASE (V4L2_CID_USER_BASE + 0x1170) > > /* > @@ -231,6 +232,11 @@ enum v4l2_colorfx { > */ > #define V4L2_CID_USER_DW100_BASE (V4L2_CID_USER_BASE + 0x1190) > > +/* The base for the bcm2835-isp driver controls. /* * The base for the bcm2835-isp driver controls. > + * We reserve 16 controls for this driver. > + */ > +#define V4L2_CID_USER_BCM2835_ISP_BASE (V4L2_CID_USER_BASE + 0x11a0) This will be interesting to handle in libcamera, as it breaks the ABI with the downstream driver. > + > /* MPEG-class control IDs */ > /* The MPEG controls are applicable to all codec controls > * and the 'MPEG' part of the define is historical */ -- Regards, Laurent Pinchart 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 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E7A37C4332F for ; Mon, 21 Nov 2022 23:29:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=xAwk9us74OPKfSwyrc1xvfFKhZjgJCUGii3XZRlX/ds=; b=YzTaKl8db8pMmI /i6Im6Y/B1XSSuWhFM8TEvoJzd6Zy8+tHuU4DXbosL7q45tXamcj8lMLvETOORSkeDIcAYolPnPtD 3J/9+a+Ke4VnepxBMf3KUB1PVAMoP8/F9dzCShoUKjmvVjBkHtSl5Ogc0IUkcHHRWG/EEN1Da/Se1 9JtIGJIte8CD4IiJG4nYMgP3HYMo21Epi4lHNQJjlYROSYNmojgnw2bjMf+4WSlARurwZaH0uP5UB gnHZBIYHrCvdo3p+p01VmiqGmiLIbOuWMn5xXTmZ+9m4hkx6vSljaRnYaDAVXoExvxa/yz1irzSv4 cwocLPEf6ZJCAlrcpgvg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oxGDU-001BF8-Mx; Mon, 21 Nov 2022 23:28:44 +0000 Received: from perceval.ideasonboard.com ([213.167.242.64]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oxGDQ-001BEH-Rs; Mon, 21 Nov 2022 23:28:43 +0000 Received: from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 2029E88F; Tue, 22 Nov 2022 00:28:39 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1669073319; bh=cC/yGsnh62r1C2zY2rHk7jtuYsCdE0HihBu80S+TNYo=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=GQOVC55C0LaaBonmfDi9LL1cWsAJib2JACPijg/hs8EPF+/IhBUdQfXUhsK2H+PXr MjynuEHJAbbwVAlMv3JY9EzKMU9n6g/EskLRrTCvHiWF7seuO84B/SaKK7eGhIsllC nHZoJXsel30pBxVhCw3eBikMha/j23/N86zy0Pi0= Date: Tue, 22 Nov 2022 01:28:23 +0200 From: Laurent Pinchart To: Umang Jain Cc: linux-media@vger.kernel.org, kernel-list@raspberrypi.com, linux-kernel@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-staging@lists.linux.dev, Broadcom internal kernel review list , Dave Stevenson , Florian Fainelli , Naushir Patuck , David Plowman , Kieran Bingham Subject: Re: [PATCH 08/14] uapi: bcm2835-isp: Add bcm2835-isp uapi header file Message-ID: References: <20221121214722.22563-1-umang.jain@ideasonboard.com> <20221121214722.22563-9-umang.jain@ideasonboard.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20221121214722.22563-9-umang.jain@ideasonboard.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221121_152841_227460_02C2C44D X-CRM114-Status: GOOD ( 28.91 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgVW1hbmcgYW5kIERhdmUsCgpUaGFuayB5b3UgZm9yIHRoZSBwYXRjaC4KCk9uIFR1ZSwgTm92 IDIyLCAyMDIyIGF0IDAzOjE3OjE2QU0gKzA1MzAsIFVtYW5nIEphaW4gd3JvdGU6Cj4gRnJvbTog RGF2ZSBTdGV2ZW5zb24gPGRhdmUuc3RldmVuc29uQHJhc3BiZXJyeXBpLmNvbT4KPiAKPiBUaGlz IGZpbGUgZGVmaW5lcyB0aGUgdXNlcmxhbmQgaW50ZXJmYWNlIHRvIHRoZSBiY20yODM1LWlzcCBk cml2ZXIKPiB0aGF0IHdpbGwgZm9sbG93IGluIGEgc2VwYXJhdGUgY29tbWl0Lgo+IAo+IFNpZ25l ZC1vZmYtYnk6IE5hdXNoaXIgUGF0dWNrIDxuYXVzaEByYXNwYmVycnlwaS5jb20+Cj4gU2lnbmVk LW9mZi1ieTogRGF2ZSBTdGV2ZW5zb24gPGRhdmUuc3RldmVuc29uQHJhc3BiZXJyeXBpLmNvbT4K PiBTaWduZWQtb2ZmLWJ5OiBVbWFuZyBKYWluIDx1bWFuZy5qYWluQGlkZWFzb25ib2FyZC5jb20+ Cj4gLS0tCj4gIGluY2x1ZGUvdWFwaS9saW51eC9iY20yODM1LWlzcC5oICAgfCAzMjAgKysrKysr KysrKysrKysrKysrKysrKysrKysrKysKPiAgaW5jbHVkZS91YXBpL2xpbnV4L3Y0bDItY29udHJv bHMuaCB8ICAgNiArCj4gIDIgZmlsZXMgY2hhbmdlZCwgMzI2IGluc2VydGlvbnMoKykKPiAgY3Jl YXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvdWFwaS9saW51eC9iY20yODM1LWlzcC5oCj4gCj4gZGlm ZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9iY20yODM1LWlzcC5oIGIvaW5jbHVkZS91YXBp L2xpbnV4L2JjbTI4MzUtaXNwLmgKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAw MDAwMDAwMC4uY2Y4YzA0MzdmMTU5Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2luY2x1ZGUvdWFw aS9saW51eC9iY20yODM1LWlzcC5oCj4gQEAgLTAsMCArMSwzMjAgQEAKPiArLyogU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6ICgoR1BMLTIuMCsgV0lUSCBMaW51eC1zeXNjYWxsLW5vdGUpIE9SIEJT RC0zLUNsYXVzZSkgKi8KPiArLyoKPiArICogYmNtMjgzNS1pc3AuaAo+ICsgKgo+ICsgKiBCQ00y ODM1IElTUCBkcml2ZXIgLSB1c2VyIHNwYWNlIGhlYWRlciBmaWxlLgo+ICsgKgo+ICsgKiBDb3B5 cmlnaHQgwqkgMjAxOS0yMDIwIFJhc3BiZXJyeSBQaSAoVHJhZGluZykgTHRkLgo+ICsgKgo+ICsg KiBBdXRob3I6IE5hdXNoaXIgUGF0dWNrIChuYXVzaEByYXNwYmVycnlwaS5jb20pCj4gKyAqCj4g KyAqLwo+ICsKPiArI2lmbmRlZiBfX0JDTTI4MzVfSVNQX0hfCj4gKyNkZWZpbmUgX19CQ00yODM1 X0lTUF9IXwo+ICsKPiArI2luY2x1ZGUgPGxpbnV4L3Y0bDItY29udHJvbHMuaD4KPiArCj4gKyNk ZWZpbmUgVjRMMl9DSURfVVNFUl9CQ00yODM1X0lTUF9DQ19NQVRSSVgJXAo+ICsJCQkJKFY0TDJf Q0lEX1VTRVJfQkNNMjgzNV9JU1BfQkFTRSArIDB4MDAwMSkKPiArI2RlZmluZSBWNEwyX0NJRF9V U0VSX0JDTTI4MzVfSVNQX0xFTlNfU0hBRElORwlcCj4gKwkJCQkoVjRMMl9DSURfVVNFUl9CQ00y ODM1X0lTUF9CQVNFICsgMHgwMDAyKQo+ICsjZGVmaW5lIFY0TDJfQ0lEX1VTRVJfQkNNMjgzNV9J U1BfQkxBQ0tfTEVWRUwJXAo+ICsJCQkJKFY0TDJfQ0lEX1VTRVJfQkNNMjgzNV9JU1BfQkFTRSAr IDB4MDAwMykKPiArI2RlZmluZSBWNEwyX0NJRF9VU0VSX0JDTTI4MzVfSVNQX0dFUQkJXAo+ICsJ CQkJKFY0TDJfQ0lEX1VTRVJfQkNNMjgzNV9JU1BfQkFTRSArIDB4MDAwNCkKPiArI2RlZmluZSBW NEwyX0NJRF9VU0VSX0JDTTI4MzVfSVNQX0dBTU1BCQlcCj4gKwkJCQkoVjRMMl9DSURfVVNFUl9C Q00yODM1X0lTUF9CQVNFICsgMHgwMDA1KQo+ICsjZGVmaW5lIFY0TDJfQ0lEX1VTRVJfQkNNMjgz NV9JU1BfREVOT0lTRQlcCj4gKwkJCQkoVjRMMl9DSURfVVNFUl9CQ00yODM1X0lTUF9CQVNFICsg MHgwMDA2KQo+ICsjZGVmaW5lIFY0TDJfQ0lEX1VTRVJfQkNNMjgzNV9JU1BfU0hBUlBFTglcCj4g KwkJCQkoVjRMMl9DSURfVVNFUl9CQ00yODM1X0lTUF9CQVNFICsgMHgwMDA3KQo+ICsjZGVmaW5l IFY0TDJfQ0lEX1VTRVJfQkNNMjgzNV9JU1BfRFBDCQlcCj4gKwkJCQkoVjRMMl9DSURfVVNFUl9C Q00yODM1X0lTUF9CQVNFICsgMHgwMDA4KQo+ICsKPiArLyoKPiArICogQWxsIHN0cnVjdHMgYmVs b3cgYXJlIGRpcmVjdGx5IG1hcHBlZCBvbnRvIHRoZSBlcXVpdmFsZW50IHN0cnVjdHMgaW4KPiAr ICogZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvdmNoaXEtbW1hbC9tbWFsLXBhcmFtZXRl cnMuaAo+ICsgKiBmb3IgY29udmVuaWVuY2UuCj4gKyAqLwo+ICsKPiArLyoqCj4gKyAqIHN0cnVj dCBiY20yODM1X2lzcF9yYXRpb25hbCAtIFJhdGlvbmFsIHZhbHVlIHR5cGUuCj4gKyAqCj4gKyAq IEBudW06CU51bWVyYXRvci4KPiArICogQGRlbjoJRGVub21pbmF0b3IuCj4gKyAqLwo+ICtzdHJ1 Y3QgYmNtMjgzNV9pc3BfcmF0aW9uYWwgewo+ICsJX19zMzIgbnVtOwo+ICsJX191MzIgZGVuOwo+ ICt9Owo+ICsKPiArLyoqCj4gKyAqIHN0cnVjdCBiY20yODM1X2lzcF9jY20gLSBDb2xvdXIgY29y cmVjdGlvbiBtYXRyaXguCj4gKyAqCj4gKyAqIEBjY206CTN4MyBjb3JyZWN0aW9uIG1hdHJpeCBj b2VmZmljaWVudHMuCj4gKyAqIEBvZmZzZXRzOgkxeDMgY29ycmVjdGlvbiBvZmZzZXRzLgo+ICsg Ki8KPiArc3RydWN0IGJjbTI4MzVfaXNwX2NjbSB7Cj4gKwlzdHJ1Y3QgYmNtMjgzNV9pc3BfcmF0 aW9uYWwgY2NtWzNdWzNdOwo+ICsJX19zMzIgb2Zmc2V0c1szXTsKPiArfTsKPiArCj4gKy8qKgo+ ICsgKiBzdHJ1Y3QgYmNtMjgzNV9pc3BfY3VzdG9tX2NjbSAtIEN1c3RvbSBDQ00gYXBwbGllZCB3 aXRoIHRoZQo+ICsgKgkJCQkgICBWNEwyX0NJRF9VU0VSX0JDTTI4MzVfSVNQX0NDX01BVFJJWCBj dHJsLgo+ICsgKgo+ICsgKiBAZW5hYmxlZDoJRW5hYmxlIGN1c3RvbSBDQ00uCj4gKyAqIEBjY206 CUN1c3RvbSBDQ00gY29lZmZpY2llbnRzIGFuZCBvZmZzZXRzLgo+ICsgKi8KPiArc3RydWN0IGJj bTI4MzVfaXNwX2N1c3RvbV9jY20gewo+ICsJX191MzIgZW5hYmxlZDsKPiArCXN0cnVjdCBiY20y ODM1X2lzcF9jY20gY2NtOwo+ICt9Owo+ICsKPiArLyoqCj4gKyAqIGVudW0gYmNtMjgzNV9pc3Bf Z2Fpbl9mb3JtYXQgLSBmb3JtYXQgb2YgdGhlIGdhaW5zIGluIHRoZSBsZW5zIHNoYWRpbmcKPiAr ICoJCQkJICB0YWJsZXMgdXNlZCB3aXRoIHRoZQo+ICsgKgkJCQkgIFY0TDJfQ0lEX1VTRVJfQkNN MjgzNV9JU1BfTEVOU19TSEFESU5HIGN0cmwuCj4gKyAqCj4gKyAqIEBHQUlOX0ZPUk1BVF9VMFA4 XzE6CQlHYWlucyBhcmUgdTAuOCBmb3JtYXQsIHN0YXJ0aW5nIGF0IDEuMAo+ICsgKiBAR0FJTl9G T1JNQVRfVTFQN18wOgkJR2FpbnMgYXJlIHUxLjcgZm9ybWF0LCBzdGFydGluZyBhdCAwLjAKPiAr ICogQEdBSU5fRk9STUFUX1UxUDdfMToJCUdhaW5zIGFyZSB1MS43IGZvcm1hdCwgc3RhcnRpbmcg YXQgMS4wCj4gKyAqIEBHQUlOX0ZPUk1BVF9VMlA2XzA6CQlHYWlucyBhcmUgdTIuNiBmb3JtYXQs IHN0YXJ0aW5nIGF0IDAuMAo+ICsgKiBAR0FJTl9GT1JNQVRfVTJQNl8xOgkJR2FpbnMgYXJlIHUy LjYgZm9ybWF0LCBzdGFydGluZyBhdCAxLjAKPiArICogQEdBSU5fRk9STUFUX1UzUDVfMDoJCUdh aW5zIGFyZSB1My41IGZvcm1hdCwgc3RhcnRpbmcgYXQgMC4wCj4gKyAqIEBHQUlOX0ZPUk1BVF9V M1A1XzE6CQlHYWlucyBhcmUgdTMuNSBmb3JtYXQsIHN0YXJ0aW5nIGF0IDEuMAo+ICsgKiBAR0FJ Tl9GT1JNQVRfVTRQMTA6CQlHYWlucyBhcmUgdTQuMTAgZm9ybWF0LCBzdGFydGluZyBhdCAwLjAK PiArICovCj4gK2VudW0gYmNtMjgzNV9pc3BfZ2Fpbl9mb3JtYXQgewo+ICsJR0FJTl9GT1JNQVRf VTBQOF8xID0gMCwKPiArCUdBSU5fRk9STUFUX1UxUDdfMCA9IDEsCj4gKwlHQUlOX0ZPUk1BVF9V MVA3XzEgPSAyLAo+ICsJR0FJTl9GT1JNQVRfVTJQNl8wID0gMywKPiArCUdBSU5fRk9STUFUX1Uy UDZfMSA9IDQsCj4gKwlHQUlOX0ZPUk1BVF9VM1A1XzAgPSA1LAo+ICsJR0FJTl9GT1JNQVRfVTNQ NV8xID0gNiwKPiArCUdBSU5fRk9STUFUX1U0UDEwICA9IDcsCj4gK307Cj4gKwo+ICsvKioKPiAr ICogc3RydWN0IGJjbTI4MzVfaXNwX2xlbnNfc2hhZGluZyAtIExlbnMgc2hhZGluZyB0YWJsZXMg c3VwcGxpZWQgd2l0aCB0aGUKPiArICoJCQkJICAgICBWNEwyX0NJRF9VU0VSX0JDTTI4MzVfSVNQ X0xFTlNfU0hBRElORwo+ICsgKgkJCQkgICAgIGN0cmwuCj4gKyAqCj4gKyAqIEBlbmFibGVkOgkJ RW5hYmxlIGxlbnMgc2hhZGluZy4KPiArICogQGdyaWRfY2VsbF9zaXplOglTaXplIG9mIGdyaWQg Y2VsbHMgaW4gc2FtcGxlcyAoMTYsIDMyLCA2NCwgMTI4IG9yIDI1NikuCj4gKyAqIEBncmlkX3dp ZHRoOgkJV2lkdGggb2YgbGVucyBzaGFkaW5nIHRhYmxlcyBpbiBncmlkIGNlbGxzLgo+ICsgKiBA Z3JpZF9zdHJpZGU6CVJvdyB0byByb3cgZGlzdGFuY2UgKGluIGdyaWQgY2VsbHMpIGJldHdlZW4g Z3JpZCBjZWxscwo+ICsgKgkJCWluIHRoZSBzYW1lIGhvcml6b250YWwgbG9jYXRpb24uCj4gKyAq IEBncmlkX2hlaWdodDoJSGVpZ2h0IG9mIGxlbnMgc2hhZGluZyB0YWJsZXMgaW4gZ3JpZCBjZWxs cy4KPiArICogQGRtYWJ1ZjoJCWRtYWJ1ZiBmaWxlIGhhbmRsZSBjb250YWluaW5nIHRoZSB0YWJs ZS4KPiArICogQHJlZl90cmFuc2Zvcm06CVJlZmVyZW5jZSB0cmFuc2Zvcm0gLSB1bnN1cHBvcnRl ZCwgcGxlYXNlIHBhc3MgemVyby4KPiArICogQGNvcm5lcl9zYW1wbGVkOglXaGV0aGVyIHRoZSBn YWlucyBhcmUgc2FtcGxlZCBhdCB0aGUgY29ybmVyIHBvaW50cwo+ICsgKgkJCW9mIHRoZSBncmlk IGNlbGxzIG9yIGluIHRoZSBjZWxsIGNlbnRyZXMuCj4gKyAqIEBnYWluX2Zvcm1hdDoJRm9ybWF0 IG9mIHRoZSBnYWlucyAoc2VlIGVudW0gJmJjbTI4MzVfaXNwX2dhaW5fZm9ybWF0KS4KPiArICov Cj4gK3N0cnVjdCBiY20yODM1X2lzcF9sZW5zX3NoYWRpbmcgewo+ICsJX191MzIgZW5hYmxlZDsK PiArCV9fdTMyIGdyaWRfY2VsbF9zaXplOwo+ICsJX191MzIgZ3JpZF93aWR0aDsKPiArCV9fdTMy IGdyaWRfc3RyaWRlOwo+ICsJX191MzIgZ3JpZF9oZWlnaHQ7Cj4gKwlfX3MzMiBkbWFidWY7Cj4g KwlfX3UzMiByZWZfdHJhbnNmb3JtOwo+ICsJX191MzIgY29ybmVyX3NhbXBsZWQ7Cj4gKwlfX3Uz MiBnYWluX2Zvcm1hdDsKPiArfTsKPiArCj4gKy8qKgo+ICsgKiBzdHJ1Y3QgYmNtMjgzNV9pc3Bf YmxhY2tfbGV2ZWwgLSBTZW5zb3IgYmxhY2sgbGV2ZWwgc2V0IHdpdGggdGhlCj4gKyAqCQkJCSAg ICBWNEwyX0NJRF9VU0VSX0JDTTI4MzVfSVNQX0JMQUNLX0xFVkVMIGN0cmwuCj4gKyAqCj4gKyAq IEBlbmFibGVkOgkJRW5hYmxlIGJsYWNrIGxldmVsLgo+ICsgKiBAYmxhY2tfbGV2ZWxfcjoJQmxh Y2sgbGV2ZWwgZm9yIHJlZCBjaGFubmVsLgo+ICsgKiBAYmxhY2tfbGV2ZWxfZzoJQmxhY2sgbGV2 ZWwgZm9yIGdyZWVuIGNoYW5uZWxzLgo+ICsgKiBAYmxhY2tfbGV2ZWxfYjoJQmxhY2sgbGV2ZWwg Zm9yIGJsdWUgY2hhbm5lbC4KPiArICovCj4gK3N0cnVjdCBiY20yODM1X2lzcF9ibGFja19sZXZl bCB7Cj4gKwlfX3UzMiBlbmFibGVkOwo+ICsJX191MTYgYmxhY2tfbGV2ZWxfcjsKPiArCV9fdTE2 IGJsYWNrX2xldmVsX2c7Cj4gKwlfX3UxNiBibGFja19sZXZlbF9iOwo+ICsJX191OCBwYWRkaW5n WzJdOyAvKiBVbnVzZWQgKi8KPiArfTsKPiArCj4gKy8qKgo+ICsgKiBzdHJ1Y3QgYmNtMjgzNV9p c3BfZ2VxIC0gR3JlZW4gZXF1YWxpc2F0aW9uIHBhcmFtZXRlcnMgc2V0IHdpdGggdGhlCj4gKyAq CQkJICAgIFY0TDJfQ0lEX1VTRVJfQkNNMjgzNV9JU1BfR0VRIGN0cmwuCj4gKyAqCj4gKyAqIEBl bmFibGVkOglFbmFibGUgZ3JlZW4gZXF1YWxpc2F0aW9uLgo+ICsgKiBAb2Zmc2V0OglGaXhlZCBv ZmZzZXQgb2YgdGhlIGdyZWVuIGVxdWFsaXNhdGlvbiB0aHJlc2hvbGQuCj4gKyAqIEBzbG9wZToJ U2xvcGUgb2YgdGhlIGdyZWVuIGVxdWFsaXNhdGlvbiB0aHJlc2hvbGQuCj4gKyAqLwo+ICtzdHJ1 Y3QgYmNtMjgzNV9pc3BfZ2VxIHsKPiArCV9fdTMyIGVuYWJsZWQ7Cj4gKwlfX3UzMiBvZmZzZXQ7 Cj4gKwlzdHJ1Y3QgYmNtMjgzNV9pc3BfcmF0aW9uYWwgc2xvcGU7Cj4gK307Cj4gKwo+ICsjZGVm aW5lIEJDTTI4MzVfTlVNX0dBTU1BX1BUUyAzMwo+ICsKPiArLyoqCj4gKyAqIHN0cnVjdCBiY20y ODM1X2lzcF9nYW1tYSAtIEdhbW1hIHBhcmFtZXRlcnMgc2V0IHdpdGggdGhlCj4gKyAqCQkJICAg ICAgVjRMMl9DSURfVVNFUl9CQ00yODM1X0lTUF9HQU1NQSBjdHJsLgo+ICsgKgo+ICsgKiBAZW5h YmxlZDoJRW5hYmxlIGdhbW1hIGFkanVzdG1lbnQuCj4gKyAqIEBYOgkJWCB2YWx1ZXMgb2YgdGhl IHBvaW50cyBkZWZpbmluZyB0aGUgZ2FtbWEgY3VydmUuCj4gKyAqCQlWYWx1ZXMgc2hvdWxkIGJl IHNjYWxlZCB0byAxNiBiaXRzLgo+ICsgKiBAWToJCVkgdmFsdWVzIG9mIHRoZSBwb2ludHMgZGVm aW5pbmcgdGhlIGdhbW1hIGN1cnZlLgo+ICsgKgkJVmFsdWVzIHNob3VsZCBiZSBzY2FsZWQgdG8g MTYgYml0cy4KPiArICovCj4gK3N0cnVjdCBiY20yODM1X2lzcF9nYW1tYSB7Cj4gKwlfX3UzMiBl bmFibGVkOwo+ICsJX191MTYgeFtCQ00yODM1X05VTV9HQU1NQV9QVFNdOwo+ICsJX191MTYgeVtC Q00yODM1X05VTV9HQU1NQV9QVFNdOwo+ICt9Owo+ICsKPiArLyoqCj4gKyAqIHN0cnVjdCBiY20y ODM1X2lzcF9kZW5vaXNlIC0gRGVub2lzZSBwYXJhbWV0ZXJzIHNldCB3aXRoIHRoZQo+ICsgKgkJ CQlWNEwyX0NJRF9VU0VSX0JDTTI4MzVfSVNQX0RFTk9JU0UgY3RybC4KPiArICoKPiArICogQGVu YWJsZWQ6CUVuYWJsZSBkZW5vaXNlLgo+ICsgKiBAY29uc3RhbnQ6CUZpeGVkIG9mZnNldCBvZiB0 aGUgbm9pc2UgdGhyZXNob2xkLgo+ICsgKiBAc2xvcGU6CVNsb3BlIG9mIHRoZSBub2lzZSB0aHJl c2hvbGQuCj4gKyAqIEBzdHJlbmd0aDoJRGVub2lzZSBzdHJlbmd0aCBiZXR3ZWVuIDAuMCAob2Zm KSBhbmQgMS4wIChtYXhpbXVtKS4KPiArICovCj4gK3N0cnVjdCBiY20yODM1X2lzcF9kZW5vaXNl IHsKPiArCV9fdTMyIGVuYWJsZWQ7Cj4gKwlfX3UzMiBjb25zdGFudDsKPiArCXN0cnVjdCBiY20y ODM1X2lzcF9yYXRpb25hbCBzbG9wZTsKPiArCXN0cnVjdCBiY20yODM1X2lzcF9yYXRpb25hbCBz dHJlbmd0aDsKPiArfTsKPiArCj4gKy8qKgo+ICsgKiBzdHJ1Y3QgYmNtMjgzNV9pc3Bfc2hhcnBl biAtIFNoYXJwZW4gcGFyYW1ldGVycyBzZXQgd2l0aCB0aGUKPiArICoJCQkJVjRMMl9DSURfVVNF Ul9CQ00yODM1X0lTUF9TSEFSUEVOIGN0cmwuCj4gKyAqCj4gKyAqIEBlbmFibGVkOglFbmFibGUg c2hhcnBlbmluZy4KPiArICogQHRocmVzaG9sZDoJVGhyZXNob2xkIGF0IHdoaWNoIHRvIHN0YXJ0 IHNoYXJwZW5pbmcgcGl4ZWxzLgo+ICsgKiBAc3RyZW5ndGg6CVN0cmVuZ3RoIHdpdGggd2hpY2gg cGl4ZWwgc2hhcnBlbmluZyBpbmNyZWFzZXMuCj4gKyAqIEBsaW1pdDoJTGltaXQgdG8gdGhlIGFt b3VudCBvZiBzaGFycGVuaW5nIGFwcGxpZWQuCj4gKyAqLwo+ICtzdHJ1Y3QgYmNtMjgzNV9pc3Bf c2hhcnBlbiB7Cj4gKwlfX3UzMiBlbmFibGVkOwo+ICsJc3RydWN0IGJjbTI4MzVfaXNwX3JhdGlv bmFsIHRocmVzaG9sZDsKPiArCXN0cnVjdCBiY20yODM1X2lzcF9yYXRpb25hbCBzdHJlbmd0aDsK PiArCXN0cnVjdCBiY20yODM1X2lzcF9yYXRpb25hbCBsaW1pdDsKPiArfTsKPiArCj4gKy8qKgo+ ICsgKiBlbnVtIGJjbTI4MzVfaXNwX2RwY19tb2RlIC0gZGVmZWN0aXZlIHBpeGVsIGNvcnJlY3Rp b24gKERQQykgc3RyZW5ndGguCj4gKyAqCj4gKyAqIEBEUENfTU9ERV9PRkY6CQlObyBEUEMuCj4g KyAqIEBEUENfTU9ERV9OT1JNQUw6CQlOb3JtYWwgRFBDLgo+ICsgKiBARFBDX01PREVfU1RST05H OgkJU3Ryb25nIERQQy4KPiArICovCj4gK2VudW0gYmNtMjgzNV9pc3BfZHBjX21vZGUgewo+ICsJ RFBDX01PREVfT0ZGID0gMCwKPiArCURQQ19NT0RFX05PUk1BTCA9IDEsCj4gKwlEUENfTU9ERV9T VFJPTkcgPSAyLAo+ICt9Owo+ICsKPiArLyoqCj4gKyAqIHN0cnVjdCBiY20yODM1X2lzcF9kcGMg LSBEZWZlY3RpdmUgcGl4ZWwgY29ycmVjdGlvbiAoRFBDKSBwYXJhbWV0ZXJzIHNldAo+ICsgKgkJ CSAgICB3aXRoIHRoZSBWNEwyX0NJRF9VU0VSX0JDTTI4MzVfSVNQX0RQQyBjdHJsLgo+ICsgKgo+ ICsgKiBAZW5hYmxlZDoJRW5hYmxlIERQQy4KPiArICogQHN0cmVuZ3RoOglEUEMgc3RyZW5ndGgg KHNlZSBlbnVtICZiY20yODM1X2lzcF9kcGNfbW9kZSkuCj4gKyAqLwo+ICtzdHJ1Y3QgYmNtMjgz NV9pc3BfZHBjIHsKPiArCV9fdTMyIGVuYWJsZWQ7Cj4gKwlfX3UzMiBzdHJlbmd0aDsKPiArfTsK PiArCj4gKy8qCj4gKyAqIElTUCBzdGF0aXN0aWNzIHN0cnVjdHVyZXMuCj4gKyAqCj4gKyAqIFRo ZSBiY20yODM1X2lzcF9zdGF0cyBzdHJ1Y3R1cmUgaXMgZ2VuZXJhdGVkIGF0IHRoZSBvdXRwdXQg b2YgdGhlCj4gKyAqIHN0YXRpc3RpY3Mgbm9kZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGRp cmVjdGx5IG1hcCBvbnRvIHRoZSBzdGF0aXN0aWNzCj4gKyAqIG91dHB1dCBvZiB0aGUgSVNQIEhX LiAgSW5zdGVhZCwgdGhlIE1NQUwgZmlybXdhcmUgY29kZSBtYXBzIHRoZSBIVyBzdGF0aXN0aWNz Cj4gKyAqIHRvIHRoZSBiY20yODM1X2lzcF9zdGF0cyBzdHJ1Y3R1cmUuCj4gKyAqLwo+ICsjZGVm aW5lIERFRkFVTFRfQVdCX1JFR0lPTlNfWCAxNgo+ICsjZGVmaW5lIERFRkFVTFRfQVdCX1JFR0lP TlNfWSAxMgo+ICsKPiArI2RlZmluZSBOVU1fSElTVE9HUkFNUyAyCj4gKyNkZWZpbmUgTlVNX0hJ U1RPR1JBTV9CSU5TIDEyOAo+ICsjZGVmaW5lIEFXQl9SRUdJT05TIChERUZBVUxUX0FXQl9SRUdJ T05TX1ggKiBERUZBVUxUX0FXQl9SRUdJT05TX1kpCj4gKyNkZWZpbmUgRkxPQVRJTkdfUkVHSU9O UyAxNgo+ICsjZGVmaW5lIEFHQ19SRUdJT05TIDE2Cj4gKyNkZWZpbmUgRk9DVVNfUkVHSU9OUyAx Mgo+ICsKPiArLyoqCj4gKyAqIHN0cnVjdCBiY20yODM1X2lzcF9zdGF0c19oaXN0IC0gSGlzdG9n cmFtIHN0YXRpc3RpY3MKPiArICoKPiArICogQHJfaGlzdDoJUmVkIGNoYW5uZWwgaGlzdG9ncmFt Lgo+ICsgKiBAZ19oaXN0OglDb21iaW5lZCBncmVlbiBjaGFubmVsIGhpc3RvZ3JhbS4KPiArICog QGJfaGlzdDoJQmx1ZSBjaGFubmVsIGhpc3RvZ3JhbS4KPiArICovCj4gK3N0cnVjdCBiY20yODM1 X2lzcF9zdGF0c19oaXN0IHsKPiArCV9fdTMyIHJfaGlzdFtOVU1fSElTVE9HUkFNX0JJTlNdOwo+ ICsJX191MzIgZ19oaXN0W05VTV9ISVNUT0dSQU1fQklOU107Cj4gKwlfX3UzMiBiX2hpc3RbTlVN X0hJU1RPR1JBTV9CSU5TXTsKPiArfTsKPiArCj4gKy8qKgo+ICsgKiBzdHJ1Y3QgYmNtMjgzNV9p c3Bfc3RhdHNfcmVnaW9uIC0gUmVnaW9uIHN1bXMuCj4gKyAqCj4gKyAqIEBjb3VudGVkOglUaGUg bnVtYmVyIG9mIDJ4MiBiYXllciB0aWxlcyBhY2N1bXVsYXRlZC4KPiArICogQG5vdGNvdW50ZWQ6 CVRoZSBudW1iZXIgb2YgMngyIGJheWVyIHRpbGVzIG5vdCBhY2N1bXVsYXRlZC4KPiArICogQHJf c3VtOglUb3RhbCBzdW0gb2YgY291bnRlZCBwaXhlbHMgaW4gdGhlIHJlZCBjaGFubmVsIGZvciBh IHJlZ2lvbi4KPiArICogQGdfc3VtOglUb3RhbCBzdW0gb2YgY291bnRlZCBwaXhlbHMgaW4gdGhl IGdyZWVuIGNoYW5uZWwgZm9yIGEgcmVnaW9uLgo+ICsgKiBAYl9zdW06CVRvdGFsIHN1bSBvZiBj b3VudGVkIHBpeGVscyBpbiB0aGUgYmx1ZSBjaGFubmVsIGZvciBhIHJlZ2lvbi4KPiArICovCj4g K3N0cnVjdCBiY20yODM1X2lzcF9zdGF0c19yZWdpb24gewo+ICsJX191MzIgY291bnRlZDsKPiAr CV9fdTMyIG5vdGNvdW50ZWQ7Cj4gKwlfX3U2NCByX3N1bTsKPiArCV9fdTY0IGdfc3VtOwo+ICsJ X191NjQgYl9zdW07Cj4gK307Cj4gKwo+ICsvKioKPiArICogc3RydWN0IGJjbTI4MzVfaXNwX3N0 YXRzX2ZvY3VzIC0gRm9jdXMgc3RhdGlzdGljcy4KPiArICoKPiArICogQGNvbnRyYXN0X3ZhbDoJ Rm9jdXMgbWVhc3VyZSAtIGFjY3VtdWxhdGVkIG91dHB1dCBvZiB0aGUgZm9jdXMgZmlsdGVyLgo+ ICsgKgkJCUluIHRoZSBmaXJzdCBkaW1lbnNpb24sIGluZGV4IFswXSBjb3VudHMgcGl4ZWxzIGJl bG93IGEKPiArICoJCQlwcmVzZXQgdGhyZXNob2xkLCBhbmQgaW5kZXggWzFdIGNvdW50cyBwaXhl bHMgYWJvdmUgdGhlCj4gKyAqCQkJdGhyZXNob2xkLiAgSW4gdGhlIHNlY29uZCBkaW1lbnNpb24s IGluZGV4IFswXSB1c2VzIHRoZQo+ICsgKgkJCWZpcnN0IHByZWRlZmluZWQgZmlsdGVyLCBhbmQg aW5kZXggWzFdIHVzZXMgdGhlIHNlY29uZAo+ICsgKgkJCXByZWRlZmluZWQgZmlsdGVyLgo+ICsg KiBAY29udHJhc3RfdmFsX251bToJVGhlIG51bWJlciBvZiBjb3VudGVkIHBpeGVscyBpbiB0aGUg YWJvdmUgYWNjdW11bGF0aW9uLgo+ICsgKi8KPiArc3RydWN0IGJjbTI4MzVfaXNwX3N0YXRzX2Zv Y3VzIHsKPiArCV9fdTY0IGNvbnRyYXN0X3ZhbFsyXVsyXTsKPiArCV9fdTMyIGNvbnRyYXN0X3Zh bF9udW1bMl1bMl07Cj4gK307Cj4gKwo+ICsvKioKPiArICogc3RydWN0IGJjbTI4MzVfaXNwX3N0 YXRzIC0gSVNQIHN0YXRpc3RpY3MuCj4gKyAqCj4gKyAqIEB2ZXJzaW9uOgkJVmVyc2lvbiBvZiB0 aGUgYmNtMjgzNV9pc3Bfc3RhdHMgc3RydWN0dXJlLgo+ICsgKiBAc2l6ZToJCVNpemUgb2YgdGhl IGJjbTI4MzVfaXNwX3N0YXRzIHN0cnVjdHVyZS4KPiArICogQGhpc3Q6CQlIaXN0b2dyYW0gc3Rh dGlzdGljcyBmb3IgdGhlIGVudGlyZSBpbWFnZS4KPiArICogQGF3Yl9zdGF0czoJCVN0YXRpc3Rp Y3MgZm9yIHRoZSByZWdpb25zIGRlZmluZWQgZm9yIEFXQiBjYWxjdWxhdGlvbnMuCj4gKyAqIEBm bG9hdGluZ19zdGF0czoJU3RhdGlzdGljcyBmb3IgYXJiaXRyYXJpbHkgcGxhY2VkIChmbG9hdGlu ZykgcmVnaW9ucy4KPiArICogQGFnY19zdGF0czoJCVN0YXRpc3RpY3MgZm9yIHRoZSByZWdpb25z IGRlZmluZWQgZm9yIEFHQyBjYWxjdWxhdGlvbnMuCj4gKyAqIEBmb2N1c19zdGF0czoJRm9jdXMg ZmlsdGVyIHN0YXRpc3RpY3MgZm9yIHRoZSBmb2N1cyByZWdpb25zLgo+ICsgKi8KPiArc3RydWN0 IGJjbTI4MzVfaXNwX3N0YXRzIHsKPiArCV9fdTMyIHZlcnNpb247Cj4gKwlfX3UzMiBzaXplOwo+ ICsJc3RydWN0IGJjbTI4MzVfaXNwX3N0YXRzX2hpc3QgaGlzdFtOVU1fSElTVE9HUkFNU107Cj4g KwlzdHJ1Y3QgYmNtMjgzNV9pc3Bfc3RhdHNfcmVnaW9uIGF3Yl9zdGF0c1tBV0JfUkVHSU9OU107 Cj4gKwlzdHJ1Y3QgYmNtMjgzNV9pc3Bfc3RhdHNfcmVnaW9uIGZsb2F0aW5nX3N0YXRzW0ZMT0FU SU5HX1JFR0lPTlNdOwo+ICsJc3RydWN0IGJjbTI4MzVfaXNwX3N0YXRzX3JlZ2lvbiBhZ2Nfc3Rh dHNbQUdDX1JFR0lPTlNdOwo+ICsJc3RydWN0IGJjbTI4MzVfaXNwX3N0YXRzX2ZvY3VzIGZvY3Vz X3N0YXRzW0ZPQ1VTX1JFR0lPTlNdOwo+ICt9Owo+ICsKPiArI2VuZGlmIC8qIF9fQkNNMjgzNV9J U1BfSF8gKi8KPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3Y0bDItY29udHJvbHMu aCBiL2luY2x1ZGUvdWFwaS9saW51eC92NGwyLWNvbnRyb2xzLmgKPiBpbmRleCBiNWU3ZDA4MmI4 YWQuLjMxNjA2ZDQyZWM1OCAxMDA2NDQKPiAtLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvdjRsMi1j b250cm9scy5oCj4gKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3Y0bDItY29udHJvbHMuaAo+IEBA IC0yMTcsNiArMjE3LDcgQEAgZW51bSB2NGwyX2NvbG9yZnggewo+ICAgKiBUaGUgYmFzZSBmb3Ig QWxsZWdybyBkcml2ZXIgY29udHJvbHMuCj4gICAqIFdlIHJlc2VydmUgMTYgY29udHJvbHMgZm9y IHRoaXMgZHJpdmVyLgo+ICAgKi8KPiArCgpVbnJlbGF0ZWQgY2hhbmdlLgoKPiAgI2RlZmluZSBW NEwyX0NJRF9VU0VSX0FMTEVHUk9fQkFTRQkJKFY0TDJfQ0lEX1VTRVJfQkFTRSArIDB4MTE3MCkK PiAgCj4gIC8qCj4gQEAgLTIzMSw2ICsyMzIsMTEgQEAgZW51bSB2NGwyX2NvbG9yZnggewo+ICAg Ki8KPiAgI2RlZmluZSBWNEwyX0NJRF9VU0VSX0RXMTAwX0JBU0UJCShWNEwyX0NJRF9VU0VSX0JB U0UgKyAweDExOTApCj4gIAo+ICsvKiBUaGUgYmFzZSBmb3IgdGhlIGJjbTI4MzUtaXNwIGRyaXZl ciBjb250cm9scy4KCi8qCiAqIFRoZSBiYXNlIGZvciB0aGUgYmNtMjgzNS1pc3AgZHJpdmVyIGNv bnRyb2xzLgoKPiArICogV2UgcmVzZXJ2ZSAxNiBjb250cm9scyBmb3IgdGhpcyBkcml2ZXIuCj4g KyAqLwo+ICsjZGVmaW5lIFY0TDJfQ0lEX1VTRVJfQkNNMjgzNV9JU1BfQkFTRQkJKFY0TDJfQ0lE X1VTRVJfQkFTRSArIDB4MTFhMCkKClRoaXMgd2lsbCBiZSBpbnRlcmVzdGluZyB0byBoYW5kbGUg aW4gbGliY2FtZXJhLCBhcyBpdCBicmVha3MgdGhlIEFCSQp3aXRoIHRoZSBkb3duc3RyZWFtIGRy aXZlci4KCj4gKwo+ICAvKiBNUEVHLWNsYXNzIGNvbnRyb2wgSURzICovCj4gIC8qIFRoZSBNUEVH IGNvbnRyb2xzIGFyZSBhcHBsaWNhYmxlIHRvIGFsbCBjb2RlYyBjb250cm9scwo+ICAgKiBhbmQg dGhlICdNUEVHJyBwYXJ0IG9mIHRoZSBkZWZpbmUgaXMgaGlzdG9yaWNhbCAqLwoKLS0gClJlZ2Fy ZHMsCgpMYXVyZW50IFBpbmNoYXJ0CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2Vy bmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1h bi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==