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=-11.2 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_2 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 E2505C433E2 for ; Tue, 8 Sep 2020 09:08:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B2B0B21741 for ; Tue, 8 Sep 2020 09:08:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728562AbgIHJIu convert rfc822-to-8bit (ORCPT ); Tue, 8 Sep 2020 05:08:50 -0400 Received: from lhrrgout.huawei.com ([185.176.76.210]:2780 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728490AbgIHJIt (ORCPT ); Tue, 8 Sep 2020 05:08:49 -0400 Received: from lhreml710-chm.china.huawei.com (unknown [172.18.7.106]) by Forcepoint Email with ESMTP id 98026CC5F8DCFCC28E86; Tue, 8 Sep 2020 10:08:47 +0100 (IST) Received: from localhost (10.52.124.38) by lhreml710-chm.china.huawei.com (10.201.108.61) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.1.1913.5; Tue, 8 Sep 2020 10:08:46 +0100 Date: Tue, 8 Sep 2020 10:07:12 +0100 From: Jonathan Cameron To: Gene Chen CC: Jonathan Cameron , Matthias Brugger , , , , , , , , "Gene Chen" , , , , Subject: Re: [PATCH v3 1/2] iio: adc: mt6360: Add ADC driver for MT6360 Message-ID: <20200908100712.00007a7b@Huawei.com> In-Reply-To: References: <1598259985-12517-1-git-send-email-gene.chen.richtek@gmail.com> <1598259985-12517-2-git-send-email-gene.chen.richtek@gmail.com> <20200829181157.1b653a88@archlinux> Organization: Huawei Technologies Research and Development (UK) Ltd. X-Mailer: Claws Mail 3.17.4 (GTK+ 2.24.32; i686-w64-mingw32) MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8BIT X-Originating-IP: [10.52.124.38] X-ClientProxiedBy: lhreml709-chm.china.huawei.com (10.201.108.58) To lhreml710-chm.china.huawei.com (10.201.108.61) X-CFilter-Loop: Reflected Sender: linux-iio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org On Tue, 8 Sep 2020 14:17:42 +0800 Gene Chen wrote: > Jonathan Cameron 於 2020年8月30日 週日 上午1:12寫道: > > > > On Mon, 24 Aug 2020 17:06:24 +0800 > > Gene Chen wrote: > > > > > From: Gene Chen > > > > > > Add MT6360 ADC driver include Charger Current, Voltage, and > > > Temperature. > > > > > > Signed-off-by: Gene Chen > > Hi Gene, > > > > A few comments inline. The big one centres on why we can't > > expose the channels as _raw, _offset and _scale? > > > > I think i have 3 reason for use real value, > ADC is used to get real value rather than raw data which is not meaningful. > And I can decide which formula needs apply according to different condition. > Also the junction temperature channel _scale is floating point 1.05 > which is not easy to express. See below. > > > Thanks, > > > > Jonathan > > > > > --- > > > drivers/iio/adc/Kconfig | 11 ++ > > > drivers/iio/adc/Makefile | 1 + > > > drivers/iio/adc/mt6360-adc.c | 366 +++++++++++++++++++++++++++++++++++++++++++ > > > 3 files changed, 378 insertions(+) > > > create mode 100644 drivers/iio/adc/mt6360-adc.c > > > > > > diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig > > > index 66d9cc0..07dcea7 100644 > > > --- a/drivers/iio/adc/Kconfig > > > +++ b/drivers/iio/adc/Kconfig > > > @@ -703,6 +703,17 @@ config MCP3911 > > > This driver can also be built as a module. If so, the module will be > > > called mcp3911. > > > > > > +config MEDIATEK_MT6360_ADC > > > + tristate "Mediatek MT6360 ADC Part" > > > + depends on MFD_MT6360 > > > + select IIO_BUFFER > > > + select IIO_TRIGGERED_BUFFER > > > + help > > > + Say Y here to enable MT6360 ADC Part. > > > + Integrated for System Monitoring include > > > + Charger and Battery Current, Voltage and > > > + Temperature > > > + > > > config MEDIATEK_MT6577_AUXADC > > > tristate "MediaTek AUXADC driver" > > > depends on ARCH_MEDIATEK || COMPILE_TEST > > > diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile > > > index 90f94ad..5fca90a 100644 > > > --- a/drivers/iio/adc/Makefile > > > +++ b/drivers/iio/adc/Makefile > > > @@ -65,6 +65,7 @@ obj-$(CONFIG_MAX9611) += max9611.o > > > obj-$(CONFIG_MCP320X) += mcp320x.o > > > obj-$(CONFIG_MCP3422) += mcp3422.o > > > obj-$(CONFIG_MCP3911) += mcp3911.o > > > +obj-$(CONFIG_MEDIATEK_MT6360_ADC) += mt6360-adc.o > > > obj-$(CONFIG_MEDIATEK_MT6577_AUXADC) += mt6577_auxadc.o > > > obj-$(CONFIG_MEN_Z188_ADC) += men_z188_adc.o > > > obj-$(CONFIG_MESON_SARADC) += meson_saradc.o > > > diff --git a/drivers/iio/adc/mt6360-adc.c b/drivers/iio/adc/mt6360-adc.c > > > new file mode 100644 > > > index 0000000..5eed812 > > > --- /dev/null > > > +++ b/drivers/iio/adc/mt6360-adc.c > > > @@ -0,0 +1,366 @@ > > > +// SPDX-License-Identifier: GPL-2.0 > > > +/* > > > + * Copyright (c) 2020 MediaTek Inc. > > > + * > > > + * Author: Gene Chen > > > + */ > > > + > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > + > > > +#define MT6360_REG_PMUCHGCTRL3 0x313 > > > +#define MT6360_REG_PMUADCCFG 0x356 > > > +#define MT6360_REG_PMUADCRPT1 0x35A > > > + > > > +/* PMUCHGCTRL3 0x313 */ > > > +#define MT6360_AICR_MASK 0xFC > > > +#define MT6360_AICR_SHFT 2 > > > +#define MT6360_AICR_400MA 0x6 > > > +/* PMUADCCFG 0x356 */ > > > +#define MT6360_ADCEN_MASK 0x8000 > > > +/* PMUADCRPT1 0x35A */ > > > +#define MT6360_PREFERCH_MASK 0xF0 > > > +#define MT6360_PREFERCH_SHFT 4 > > > +#define MT6360_RPTCH_MASK 0x0F > > > + > > > +enum { > > > + MT6360_CHAN_USBID = 0, > > > + MT6360_CHAN_VBUSDIV5, > > > + MT6360_CHAN_VBUSDIV2, > > > + MT6360_CHAN_VSYS, > > > + MT6360_CHAN_VBAT, > > > + MT6360_CHAN_IBUS, > > > + MT6360_CHAN_IBAT, > > > + MT6360_CHAN_CHG_VDDP, > > > + MT6360_CHAN_TEMP_JC, > > > + MT6360_CHAN_VREF_TS, > > > + MT6360_CHAN_TS, > > > + MT6360_CHAN_MAX, > > > +}; > > > + > > > +struct mt6360_adc_data { > > > + struct device *dev; > > > + struct regmap *regmap; > > > + struct completion adc_complete; > > > + struct mutex adc_lock; > > > + ktime_t last_off_timestamps[MT6360_CHAN_MAX]; > > > + int irq; > > > +}; > > > + > > > +static inline int mt6360_adc_val_converter(int val, int multiplier, int offset, int divisor) > > > +{ > > > + return ((val * multiplier) + offset) / divisor; > > > > Why could we not report these values to userspace or consumer drivers and let > > them deal with the conversion if they actually needed it? > > Mapping this to > > > > (val + new_offset) * multiplier would be a little messy, but not too bad. > > > > The advantage would be that we would then be providing the data needed > > to get real units for values read from the buffers without having to > > do all the maths in kernel (without access to floating point). > > > > > > As above, if I use formula "(val + new_offset) * multiplier", > the junction temperature channel multiplier will be floating point > 1.05, i don't know how to express. As Andy mentioned, we do this all over the place. IIO_VAL_INT_PLUS_MICRO The key is that we want to push the burden of doing this maths to the user not the source. Often what is actually of interest is whether a temperature passed a threshold. In that case, you can transform the threshold into the units of the ADC (so the reverse directly to you would do with processed data) and only have to do the maths once per change of the threshold instead of for every sample. There are helper functions to do the maths for you, should you actually need SI units. > > > > +} > > > + > > > +static int mt6360_adc_convert_processed_val(struct mt6360_adc_data *info, int chan_idx, int *val) > > > +{ > > > + unsigned int regval = 0; > > > + const struct converter { > > > + int multiplier; > > > + int offset; > > > + int divisor; > > > + } adc_converter[MT6360_CHAN_MAX] = { > > > + { 1250, 0, 1}, /* USBID */ > > > + { 6250, 0, 1}, /* VBUSDIV5 */ > > > + { 2500, 0, 1}, /* VBUSDIV2 */ > > > + { 1250, 0, 1}, /* VSYS */ > > > + { 1250, 0, 1}, /* VBAT */ > > > + { 2500, 0, 1}, /* IBUS */ > > > + { 2500, 0, 1}, /* IBAT */ > > > + { 1250, 0, 1}, /* CHG_VDDP */ > > > + { 105, -8000, 100}, /* TEMP_JC */ > > > + { 1250, 0, 1}, /* VREF_TS */ > > > + { 1250, 0, 1}, /* TS */ > > > + }, sp_ibus_adc_converter = { 1900, 0, 1 }, *sel_converter; > > > + int ret; > > > + > > > + sel_converter = adc_converter + chan_idx; > > > + if (chan_idx == MT6360_CHAN_IBUS) { > > > + /* ibus chan will be affected by aicr config */ > > > + /* if aicr < 400, apply the special ibus converter */ > > > + ret = regmap_read(info->regmap, MT6360_REG_PMUCHGCTRL3, ®val); > > > + if (ret) > > > + return ret; > > > + > > > + regval = (regval & MT6360_AICR_MASK) >> MT6360_AICR_SHFT; > > > + if (regval < MT6360_AICR_400MA) > > > + sel_converter = &sp_ibus_adc_converter; > > > + } > > > + > > > + *val = mt6360_adc_val_converter(*val, sel_converter->multiplier, sel_converter->offset, > > > + sel_converter->divisor); > > > + > > > + return 0; > > > +} > > > + > > > +static int mt6360_adc_read_processed(struct mt6360_adc_data *mad, int channel, int *val) > > > +{ > > > + u16 adc_enable; > > > + u8 rpt[3]; > > > + ktime_t start_t, predict_end_t; > > > + long timeout; > > > + int value, ret; > > > + > > > + mutex_lock(&mad->adc_lock); > > > + > > > + /* select preferred channel that we want */ > > > + ret = regmap_update_bits(mad->regmap, MT6360_REG_PMUADCRPT1, MT6360_PREFERCH_MASK, > > > + channel << MT6360_PREFERCH_SHFT); > > > + if (ret) > > > + goto out_adc; > > > + > > > + /* enable adc channel we want and adc_en */ > > > + adc_enable = MT6360_ADCEN_MASK | BIT(channel); > > > + adc_enable = cpu_to_be16(adc_enable); > > > > Use a local be16 to store that. It will make it a little clearer > > that we are doing something 'unusual' here. Perhaps a comment on > > why this odd code exists would also help? > > > > ACK > > > > + ret = regmap_raw_write(mad->regmap, MT6360_REG_PMUADCCFG, (void *)&adc_enable, sizeof(u16)); > > > + if (ret) > > > + goto out_adc; > > > + > > > + start_t = ktime_get(); > > > + predict_end_t = ktime_add_ms(mad->last_off_timestamps[channel], 50); > > > + > > > + if (ktime_after(start_t, predict_end_t)) > > > + predict_end_t = ktime_add_ms(start_t, 25); > > > + else > > > + predict_end_t = ktime_add_ms(start_t, 75); > > > + > > > + enable_irq(mad->irq); > > > +adc_retry: > > > + reinit_completion(&mad->adc_complete); > > > + > > > + /* wait for conversion to complete */ > > > + timeout = wait_for_completion_timeout(&mad->adc_complete, msecs_to_jiffies(200)); > > > + if (timeout == 0) { > > > + ret = -ETIMEDOUT; > > > + goto out_adc_conv; > > > + } else if (timeout < 0) { > > > + ret = -EINTR; > > > + goto out_adc_conv; > > > + } > > > + > > > + ret = regmap_raw_read(mad->regmap, MT6360_REG_PMUADCRPT1, rpt, sizeof(rpt)); > > > + if (ret) > > > + goto out_adc_conv; > > > + > > > + /* check the current reported channel */ > > > + if ((rpt[0] & MT6360_RPTCH_MASK) != channel) { > > > + dev_dbg(mad->dev, "not wanted channel report [%02x]\n", rpt[0]); > > > > This and the one below feel like error messages rather than debug ones. > > > > We have two function "battery zero current voltage(ZCV)" and "TypeC > OTP" will auto run ADC at background. > ZCV_EN will run VBAT_ADC when TA plug in, TypeC OTP will run TS_ADC > when TypeC attach. > We need to check report channel for ADC report data match is our desire channel. So there is firmware messing with it underneath? Oh goody. Add a comment explaining this. > > > > + goto adc_retry; > > > + } > > > + > > > + if (!ktime_after(ktime_get(), predict_end_t)) { > > > + dev_dbg(mad->dev, "time is not after one adc_conv_t\n"); > > > > Does this actually happen? If feels like we are being a bit over protective > > here. I'd definitely like to see a comment saying why this protection > > might be needed. > > > > When ADC_EN and MT6360_CHANx_EN is enable, the channel x will keep > running again and again > I supposed to get immediate data which is generated after I start it. Just to check my understanding. This is an edge triggered interrupt and it triggers every time a new sample is taken. Those samples are taken on a fixed frequency irrespective of whether we have read the previous one? > > When I disable ADC_CHANx_EN, the H/W logical ADC is still running. > If I run the same ADC immediately, I may get the old result about this channel. > MT6360 ADC typical conversation time is about 25ms. > So We need ignore which irq trigger below 25ms. Normal trick for this sort of case is to just not use the interrupt. Just read after 25+delta msecs and you are guaranteed to get the right answer. > > > > + goto adc_retry; > > > + } > > > + > > > + value = (rpt[1] << 8) | rpt[2]; > > > + > > > + ret = mt6360_adc_convert_processed_val(mad, channel, &value); > > > + if (ret) > > > + goto out_adc_conv; > > > + > > > + *val = value; > > > + ret = IIO_VAL_INT; > > > + > > > +out_adc_conv: > > > + disable_irq(mad->irq); > > > + adc_enable = MT6360_ADCEN_MASK; > > > + adc_enable = cpu_to_be16(adc_enable); > > > + regmap_raw_write(mad->regmap, MT6360_REG_PMUADCCFG, (void *)&adc_enable, sizeof(u16)); > > > + mad->last_off_timestamps[channel] = ktime_get(); > > > + /* set prefer channel to 0xf */ > > > + regmap_update_bits(mad->regmap, MT6360_REG_PMUADCRPT1, MT6360_PREFERCH_MASK, > > > + 0xF << MT6360_PREFERCH_SHFT); > > > +out_adc: > > > + mutex_unlock(&mad->adc_lock); > > > + > > > + return ret; > > > +} > > > + > > > +static int mt6360_adc_read_raw(struct iio_dev *iio_dev, const struct iio_chan_spec *chan, > > > + int *val, int *val2, long mask) > > > +{ > > > + struct mt6360_adc_data *mad = iio_priv(iio_dev); > > > + > > > + if (mask == IIO_CHAN_INFO_PROCESSED) > > > + return mt6360_adc_read_processed(mad, chan->channel, val); > > > + > > > + return -EINVAL; > > > +} > > > + > > > +static const struct iio_info mt6360_adc_iio_info = { > > > + .read_raw = mt6360_adc_read_raw, > > > +}; > > > + > > > +#define MT6360_ADC_CHAN(_idx, _type) { \ > > > + .type = _type, \ > > > + .channel = MT6360_CHAN_##_idx, \ > > > + .scan_index = MT6360_CHAN_##_idx, \ > > > + .extend_name = #_idx, \ > > > + .datasheet_name = #_idx, \ > > > + .scan_type = { \ > > > + .sign = 's', \ > > > + .realbits = 32, \ > > > + .storagebits = 32, \ > > > + .endianness = IIO_CPU, \ > > > + }, \ > > > + .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), \ > > > + .indexed = 1, \ > > > +} > > > + > > > +static const struct iio_chan_spec mt6360_adc_channels[] = { > > > + MT6360_ADC_CHAN(USBID, IIO_VOLTAGE), > > > + MT6360_ADC_CHAN(VBUSDIV5, IIO_VOLTAGE), > > > + MT6360_ADC_CHAN(VBUSDIV2, IIO_VOLTAGE), > > > + MT6360_ADC_CHAN(VSYS, IIO_VOLTAGE), > > > + MT6360_ADC_CHAN(VBAT, IIO_VOLTAGE), > > > + MT6360_ADC_CHAN(IBUS, IIO_CURRENT), > > > + MT6360_ADC_CHAN(IBAT, IIO_CURRENT), > > > + MT6360_ADC_CHAN(CHG_VDDP, IIO_VOLTAGE), > > > + MT6360_ADC_CHAN(TEMP_JC, IIO_TEMP), > > > + MT6360_ADC_CHAN(VREF_TS, IIO_VOLTAGE), > > > + MT6360_ADC_CHAN(TS, IIO_VOLTAGE), > > > + IIO_CHAN_SOFT_TIMESTAMP(MT6360_CHAN_MAX), > > > +}; > > > + > > > +static irqreturn_t mt6360_pmu_adc_donei_handler(int irq, void *data) > > > +{ > > > + struct mt6360_adc_data *mad = iio_priv(data); > > > + > > > + complete(&mad->adc_complete); > > > + return IRQ_HANDLED; > > > +} > > > + > > ... > > > > > + > > > +static int mt6360_adc_probe(struct platform_device *pdev) > > > +{ > > > + struct mt6360_adc_data *mad; > > > + struct iio_dev *indio_dev; > > > + int ret; > > > + > > > + indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*mad)); > > > + if (!indio_dev) > > > + return -ENOMEM; > > > + > > > + mad = iio_priv(indio_dev); > > > + mad->dev = &pdev->dev; > > > + init_completion(&mad->adc_complete); > > > + mutex_init(&mad->adc_lock); > > > + > > > + mad->regmap = dev_get_regmap(pdev->dev.parent, NULL); > > > + if (!mad->regmap) { > > > + dev_err(&pdev->dev, "Failed to get parent regmap\n"); > > > + return -ENODEV; > > > + } > > > + > > > + ret = mt6360_adc_reset(mad); > > > + if (ret < 0) { > > > + dev_err(&pdev->dev, "Failed to reset adc\n"); > > > + return ret; > > > + } > > > + > > > + mad->irq = platform_get_irq_byname(pdev, "adc_donei"); > > > + if (mad->irq < 0) { > > > + dev_err(&pdev->dev, "Failed to get adc_done irq\n"); > > > + return mad->irq; > > > + } > > > + > > > + irq_set_status_flags(mad->irq, IRQ_NOAUTOEN); > > > > As we are going to have a v5 anyway to clean up that endian warning, > > please could you add a comment to explain the need for IRQ_NOAUTOEN? > > > > Same as above "Enable ADC will run again and again until clear > ADC__CHANx_EN bit" > So After I get the ADC result, I disable irq in order to handle only > oneshot data. As mentioned a above I suspect you may be better off just not using the interrupt at all. > > > > + ret = devm_request_threaded_irq(&pdev->dev, mad->irq, NULL, mt6360_pmu_adc_donei_handler, 0, > > > + "adc_donei", indio_dev); > > > + if (ret) { > > > + dev_err(&pdev->dev, "Failed to register adc_done irq\n"); > > > + return ret; > > > + } > > > + > > > + indio_dev->name = dev_name(&pdev->dev); > > > + indio_dev->dev.parent = &pdev->dev; > > > + indio_dev->info = &mt6360_adc_iio_info; > > > + indio_dev->modes = INDIO_DIRECT_MODE; > > > + indio_dev->channels = mt6360_adc_channels; > > > + indio_dev->num_channels = ARRAY_SIZE(mt6360_adc_channels); > > > + > > > + ret = devm_iio_triggered_buffer_setup(&pdev->dev, indio_dev, NULL, > > > + mt6360_adc_trigger_handler, NULL); > > > + if (ret) { > > > + dev_err(&pdev->dev, "Failed to allocate iio trigger buffer\n"); > > > + return ret; > > > + } > > > + > > > + ret = devm_iio_device_register(&pdev->dev, indio_dev); > > > + if (ret) { > > > + dev_err(&pdev->dev, "Failed to register iio device\n"); > > > + return ret; > > > + } > > > + > > > + return 0; > > > +} > > ... 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=-11.3 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_2 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 CC70AC433E2 for ; Tue, 8 Sep 2020 09:09:07 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6AB702166E for ; Tue, 8 Sep 2020 09:09:07 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="nIiQ5Jvt" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6AB702166E Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=Huawei.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-ID: Subject: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=mJ6uzr2y/8eRhr0Y2Cy4TIHh/6/fRATPqUV3FawGnw0=; b=nIiQ5JvtJIo17JFzDWhX7wiwJ +RNAak6e6UzampPCghyCp0hdk+q2hYlEUIRDh8iE5zr8lpy30mDp1kBzjzjG43L5IkYuAXNSDNHhW elbJiKZlKZQmUuXOjAnaIB4m8Hs+xrxrxfbDSwKL/SchsMQeIpQMXsdoiA+v7thgRZ60msCPZbOkz Zhb2nzgBB3QmYiDSiS2ftBaLANFMMaQcdyWnUWX4QtfKW3hlF9MW4yXGbIX6Gjl7PkWzesWJeslK/ n5GWEPjAtkjsMx6pGgEz+NuCsGF5wE0BsCwvrNxU2sywv06ta2StlO0O2pCF7mtrRRWBcbS73iDPP QLwvnaNgQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kFZcY-0005WI-7u; Tue, 08 Sep 2020 09:08:58 +0000 Received: from lhrrgout.huawei.com ([185.176.76.210] helo=huawei.com) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kFZcQ-0005U0-Vn; Tue, 08 Sep 2020 09:08:53 +0000 Received: from lhreml710-chm.china.huawei.com (unknown [172.18.7.106]) by Forcepoint Email with ESMTP id 98026CC5F8DCFCC28E86; Tue, 8 Sep 2020 10:08:47 +0100 (IST) Received: from localhost (10.52.124.38) by lhreml710-chm.china.huawei.com (10.201.108.61) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.1.1913.5; Tue, 8 Sep 2020 10:08:46 +0100 Date: Tue, 8 Sep 2020 10:07:12 +0100 From: Jonathan Cameron To: Gene Chen Subject: Re: [PATCH v3 1/2] iio: adc: mt6360: Add ADC driver for MT6360 Message-ID: <20200908100712.00007a7b@Huawei.com> In-Reply-To: References: <1598259985-12517-1-git-send-email-gene.chen.richtek@gmail.com> <1598259985-12517-2-git-send-email-gene.chen.richtek@gmail.com> <20200829181157.1b653a88@archlinux> Organization: Huawei Technologies Research and Development (UK) Ltd. X-Mailer: Claws Mail 3.17.4 (GTK+ 2.24.32; i686-w64-mingw32) MIME-Version: 1.0 X-Originating-IP: [10.52.124.38] X-ClientProxiedBy: lhreml709-chm.china.huawei.com (10.201.108.58) To lhreml710-chm.china.huawei.com (10.201.108.61) X-CFilter-Loop: Reflected X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200908_050851_845349_80152551 X-CRM114-Status: GOOD ( 45.63 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gene Chen , lars@metafoo.de, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, cy_huang@richtek.com, benjamin.chao@mediatek.com, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, pmeerw@pmeerw.net, knaack.h@gmx.de, Matthias Brugger , Wilma.Wu@mediatek.com, Jonathan Cameron , shufan_lee@richtek.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org T24gVHVlLCA4IFNlcCAyMDIwIDE0OjE3OjQyICswODAwCkdlbmUgQ2hlbiA8Z2VuZS5jaGVuLnJp Y2h0ZWtAZ21haWwuY29tPiB3cm90ZToKCj4gSm9uYXRoYW4gQ2FtZXJvbiA8amljMjNAa2VybmVs Lm9yZz4g5pa8IDIwMjDlubQ45pyIMzDml6Ug6YCx5pelIOS4iuWNiDE6MTLlr6vpgZPvvJoKPiA+ Cj4gPiBPbiBNb24sIDI0IEF1ZyAyMDIwIDE3OjA2OjI0ICswODAwCj4gPiBHZW5lIENoZW4gPGdl bmUuY2hlbi5yaWNodGVrQGdtYWlsLmNvbT4gd3JvdGU6Cj4gPiAgCj4gPiA+IEZyb206IEdlbmUg Q2hlbiA8Z2VuZV9jaGVuQHJpY2h0ZWsuY29tPgo+ID4gPgo+ID4gPiBBZGQgTVQ2MzYwIEFEQyBk cml2ZXIgaW5jbHVkZSBDaGFyZ2VyIEN1cnJlbnQsIFZvbHRhZ2UsIGFuZAo+ID4gPiBUZW1wZXJh dHVyZS4KPiA+ID4KPiA+ID4gU2lnbmVkLW9mZi1ieTogR2VuZSBDaGVuIDxnZW5lX2NoZW5Acmlj aHRlay5jb20+ICAKPiA+IEhpIEdlbmUsCj4gPgo+ID4gQSBmZXcgY29tbWVudHMgaW5saW5lLiAg VGhlIGJpZyBvbmUgY2VudHJlcyBvbiB3aHkgd2UgY2FuJ3QKPiA+IGV4cG9zZSB0aGUgY2hhbm5l bHMgYXMgX3JhdywgX29mZnNldCBhbmQgX3NjYWxlPwo+ID4gIAo+IAo+IEkgdGhpbmsgaSBoYXZl IDMgcmVhc29uIGZvciB1c2UgcmVhbCB2YWx1ZSwKPiBBREMgaXMgdXNlZCB0byBnZXQgcmVhbCB2 YWx1ZSByYXRoZXIgdGhhbiByYXcgZGF0YSB3aGljaCBpcyBub3QgbWVhbmluZ2Z1bC4KPiBBbmQg SSBjYW4gZGVjaWRlIHdoaWNoIGZvcm11bGEgbmVlZHMgYXBwbHkgYWNjb3JkaW5nIHRvIGRpZmZl cmVudCBjb25kaXRpb24uCj4gQWxzbyB0aGUganVuY3Rpb24gdGVtcGVyYXR1cmUgY2hhbm5lbCBf c2NhbGUgaXMgZmxvYXRpbmcgcG9pbnQgMS4wNQo+IHdoaWNoIGlzIG5vdCBlYXN5IHRvIGV4cHJl c3MuCgpTZWUgYmVsb3cuCgo+IAo+ID4gVGhhbmtzLAo+ID4KPiA+IEpvbmF0aGFuCj4gPiAgCj4g PiA+IC0tLQo+ID4gPiAgZHJpdmVycy9paW8vYWRjL0tjb25maWcgICAgICB8ICAxMSArKwo+ID4g PiAgZHJpdmVycy9paW8vYWRjL01ha2VmaWxlICAgICB8ICAgMSArCj4gPiA+ICBkcml2ZXJzL2lp by9hZGMvbXQ2MzYwLWFkYy5jIHwgMzY2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysKPiA+ID4gIDMgZmlsZXMgY2hhbmdlZCwgMzc4IGluc2VydGlvbnMoKykKPiA+ ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2lpby9hZGMvbXQ2MzYwLWFkYy5jCj4gPiA+ Cj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvS2NvbmZpZyBiL2RyaXZlcnMvaWlv L2FkYy9LY29uZmlnCj4gPiA+IGluZGV4IDY2ZDljYzAuLjA3ZGNlYTcgMTAwNjQ0Cj4gPiA+IC0t LSBhL2RyaXZlcnMvaWlvL2FkYy9LY29uZmlnCj4gPiA+ICsrKyBiL2RyaXZlcnMvaWlvL2FkYy9L Y29uZmlnCj4gPiA+IEBAIC03MDMsNiArNzAzLDE3IEBAIGNvbmZpZyBNQ1AzOTExCj4gPiA+ICAg ICAgICAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0 aGUgbW9kdWxlIHdpbGwgYmUKPiA+ID4gICAgICAgICBjYWxsZWQgbWNwMzkxMS4KPiA+ID4KPiA+ ID4gK2NvbmZpZyBNRURJQVRFS19NVDYzNjBfQURDCj4gPiA+ICsgICAgIHRyaXN0YXRlICJNZWRp YXRlayBNVDYzNjAgQURDIFBhcnQiCj4gPiA+ICsgICAgIGRlcGVuZHMgb24gTUZEX01UNjM2MAo+ ID4gPiArICAgICBzZWxlY3QgSUlPX0JVRkZFUgo+ID4gPiArICAgICBzZWxlY3QgSUlPX1RSSUdH RVJFRF9CVUZGRVIKPiA+ID4gKyAgICAgaGVscAo+ID4gPiArICAgICAgIFNheSBZIGhlcmUgdG8g ZW5hYmxlIE1UNjM2MCBBREMgUGFydC4KPiA+ID4gKyAgICAgICBJbnRlZ3JhdGVkIGZvciBTeXN0 ZW0gTW9uaXRvcmluZyBpbmNsdWRlCj4gPiA+ICsgICAgICAgQ2hhcmdlciBhbmQgQmF0dGVyeSBD dXJyZW50LCBWb2x0YWdlIGFuZAo+ID4gPiArICAgICAgIFRlbXBlcmF0dXJlCj4gPiA+ICsKPiA+ ID4gIGNvbmZpZyBNRURJQVRFS19NVDY1NzdfQVVYQURDCj4gPiA+ICAgICAgIHRyaXN0YXRlICJN ZWRpYVRlayBBVVhBREMgZHJpdmVyIgo+ID4gPiAgICAgICBkZXBlbmRzIG9uIEFSQ0hfTUVESUFU RUsgfHwgQ09NUElMRV9URVNUCj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvTWFr ZWZpbGUgYi9kcml2ZXJzL2lpby9hZGMvTWFrZWZpbGUKPiA+ID4gaW5kZXggOTBmOTRhZC4uNWZj YTkwYSAxMDA2NDQKPiA+ID4gLS0tIGEvZHJpdmVycy9paW8vYWRjL01ha2VmaWxlCj4gPiA+ICsr KyBiL2RyaXZlcnMvaWlvL2FkYy9NYWtlZmlsZQo+ID4gPiBAQCAtNjUsNiArNjUsNyBAQCBvYmot JChDT05GSUdfTUFYOTYxMSkgKz0gbWF4OTYxMS5vCj4gPiA+ICBvYmotJChDT05GSUdfTUNQMzIw WCkgKz0gbWNwMzIweC5vCj4gPiA+ICBvYmotJChDT05GSUdfTUNQMzQyMikgKz0gbWNwMzQyMi5v Cj4gPiA+ICBvYmotJChDT05GSUdfTUNQMzkxMSkgKz0gbWNwMzkxMS5vCj4gPiA+ICtvYmotJChD T05GSUdfTUVESUFURUtfTVQ2MzYwX0FEQykgKz0gbXQ2MzYwLWFkYy5vCj4gPiA+ICBvYmotJChD T05GSUdfTUVESUFURUtfTVQ2NTc3X0FVWEFEQykgKz0gbXQ2NTc3X2F1eGFkYy5vCj4gPiA+ICBv YmotJChDT05GSUdfTUVOX1oxODhfQURDKSArPSBtZW5fejE4OF9hZGMubwo+ID4gPiAgb2JqLSQo Q09ORklHX01FU09OX1NBUkFEQykgKz0gbWVzb25fc2FyYWRjLm8KPiA+ID4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvaWlvL2FkYy9tdDYzNjAtYWRjLmMgYi9kcml2ZXJzL2lpby9hZGMvbXQ2MzYwLWFk Yy5jCj4gPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiA+IGluZGV4IDAwMDAwMDAuLjVlZWQ4 MTIKPiA+ID4gLS0tIC9kZXYvbnVsbAo+ID4gPiArKysgYi9kcml2ZXJzL2lpby9hZGMvbXQ2MzYw LWFkYy5jCj4gPiA+IEBAIC0wLDAgKzEsMzY2IEBACj4gPiA+ICsvLyBTUERYLUxpY2Vuc2UtSWRl bnRpZmllcjogR1BMLTIuMAo+ID4gPiArLyoKPiA+ID4gKyAqIENvcHlyaWdodCAoYykgMjAyMCBN ZWRpYVRlayBJbmMuCj4gPiA+ICsgKgo+ID4gPiArICogQXV0aG9yOiBHZW5lIENoZW4gPGdlbmVf Y2hlbkByaWNodGVrLmNvbT4KPiA+ID4gKyAqLwo+ID4gPiArCj4gPiA+ICsjaW5jbHVkZSA8bGlu dXgvY29tcGxldGlvbi5oPgo+ID4gPiArI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+ID4g PiArI2luY2x1ZGUgPGxpbnV4L2lpby9idWZmZXIuaD4KPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9p aW8vaWlvLmg+Cj4gPiA+ICsjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJfY29uc3VtZXIuaD4K PiA+ID4gKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcmVkX2J1ZmZlci5oPgo+ID4gPiArI2lu Y2x1ZGUgPGxpbnV4L2lycS5oPgo+ID4gPiArI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+ID4g PiArI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+Cj4gPiA+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxl Lmg+Cj4gPiA+ICsjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KPiA+ID4gKyNpbmNsdWRlIDxsaW51 eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KPiA+ ID4gKwo+ID4gPiArI2RlZmluZSBNVDYzNjBfUkVHX1BNVUNIR0NUUkwzICAgICAgIDB4MzEzCj4g PiA+ICsjZGVmaW5lIE1UNjM2MF9SRUdfUE1VQURDQ0ZHIDB4MzU2Cj4gPiA+ICsjZGVmaW5lIE1U NjM2MF9SRUdfUE1VQURDUlBUMSAgICAgICAgMHgzNUEKPiA+ID4gKwo+ID4gPiArLyogUE1VQ0hH Q1RSTDMgMHgzMTMgKi8KPiA+ID4gKyNkZWZpbmUgTVQ2MzYwX0FJQ1JfTUFTSyAgICAgMHhGQwo+ ID4gPiArI2RlZmluZSBNVDYzNjBfQUlDUl9TSEZUICAgICAyCj4gPiA+ICsjZGVmaW5lIE1UNjM2 MF9BSUNSXzQwME1BICAgIDB4Ngo+ID4gPiArLyogUE1VQURDQ0ZHIDB4MzU2ICovCj4gPiA+ICsj ZGVmaW5lIE1UNjM2MF9BRENFTl9NQVNLICAgIDB4ODAwMAo+ID4gPiArLyogUE1VQURDUlBUMSAw eDM1QSAqLwo+ID4gPiArI2RlZmluZSBNVDYzNjBfUFJFRkVSQ0hfTUFTSyAweEYwCj4gPiA+ICsj ZGVmaW5lIE1UNjM2MF9QUkVGRVJDSF9TSEZUIDQKPiA+ID4gKyNkZWZpbmUgTVQ2MzYwX1JQVENI X01BU0sgICAgMHgwRgo+ID4gPiArCj4gPiA+ICtlbnVtIHsKPiA+ID4gKyAgICAgTVQ2MzYwX0NI QU5fVVNCSUQgPSAwLAo+ID4gPiArICAgICBNVDYzNjBfQ0hBTl9WQlVTRElWNSwKPiA+ID4gKyAg ICAgTVQ2MzYwX0NIQU5fVkJVU0RJVjIsCj4gPiA+ICsgICAgIE1UNjM2MF9DSEFOX1ZTWVMsCj4g PiA+ICsgICAgIE1UNjM2MF9DSEFOX1ZCQVQsCj4gPiA+ICsgICAgIE1UNjM2MF9DSEFOX0lCVVMs Cj4gPiA+ICsgICAgIE1UNjM2MF9DSEFOX0lCQVQsCj4gPiA+ICsgICAgIE1UNjM2MF9DSEFOX0NI R19WRERQLAo+ID4gPiArICAgICBNVDYzNjBfQ0hBTl9URU1QX0pDLAo+ID4gPiArICAgICBNVDYz NjBfQ0hBTl9WUkVGX1RTLAo+ID4gPiArICAgICBNVDYzNjBfQ0hBTl9UUywKPiA+ID4gKyAgICAg TVQ2MzYwX0NIQU5fTUFYLAo+ID4gPiArfTsKPiA+ID4gKwo+ID4gPiArc3RydWN0IG10NjM2MF9h ZGNfZGF0YSB7Cj4gPiA+ICsgICAgIHN0cnVjdCBkZXZpY2UgKmRldjsKPiA+ID4gKyAgICAgc3Ry dWN0IHJlZ21hcCAqcmVnbWFwOwo+ID4gPiArICAgICBzdHJ1Y3QgY29tcGxldGlvbiBhZGNfY29t cGxldGU7Cj4gPiA+ICsgICAgIHN0cnVjdCBtdXRleCBhZGNfbG9jazsKPiA+ID4gKyAgICAga3Rp bWVfdCBsYXN0X29mZl90aW1lc3RhbXBzW01UNjM2MF9DSEFOX01BWF07Cj4gPiA+ICsgICAgIGlu dCBpcnE7Cj4gPiA+ICt9Owo+ID4gPiArCj4gPiA+ICtzdGF0aWMgaW5saW5lIGludCBtdDYzNjBf YWRjX3ZhbF9jb252ZXJ0ZXIoaW50IHZhbCwgaW50IG11bHRpcGxpZXIsIGludCBvZmZzZXQsIGlu dCBkaXZpc29yKQo+ID4gPiArewo+ID4gPiArICAgICByZXR1cm4gKCh2YWwgKiBtdWx0aXBsaWVy KSArIG9mZnNldCkgLyBkaXZpc29yOyAgCj4gPgo+ID4gV2h5IGNvdWxkIHdlIG5vdCByZXBvcnQg dGhlc2UgdmFsdWVzIHRvIHVzZXJzcGFjZSBvciBjb25zdW1lciBkcml2ZXJzIGFuZCBsZXQKPiA+ IHRoZW0gZGVhbCB3aXRoIHRoZSBjb252ZXJzaW9uIGlmIHRoZXkgYWN0dWFsbHkgbmVlZGVkIGl0 Pwo+ID4gTWFwcGluZyB0aGlzIHRvCj4gPgo+ID4gKHZhbCArIG5ld19vZmZzZXQpICogbXVsdGlw bGllciB3b3VsZCBiZSBhIGxpdHRsZSBtZXNzeSwgYnV0IG5vdCB0b28gYmFkLgo+ID4KPiA+IFRo ZSBhZHZhbnRhZ2Ugd291bGQgYmUgdGhhdCB3ZSB3b3VsZCB0aGVuIGJlIHByb3ZpZGluZyB0aGUg ZGF0YSBuZWVkZWQKPiA+IHRvIGdldCByZWFsIHVuaXRzIGZvciB2YWx1ZXMgcmVhZCBmcm9tIHRo ZSBidWZmZXJzIHdpdGhvdXQgaGF2aW5nIHRvCj4gPiBkbyBhbGwgdGhlIG1hdGhzIGluIGtlcm5l bCAod2l0aG91dCBhY2Nlc3MgdG8gZmxvYXRpbmcgcG9pbnQpLgo+ID4KPiA+ICAKPiAKPiBBcyBh Ym92ZSwgaWYgSSB1c2UgZm9ybXVsYSAiKHZhbCArIG5ld19vZmZzZXQpICogbXVsdGlwbGllciIs Cj4gdGhlIGp1bmN0aW9uIHRlbXBlcmF0dXJlIGNoYW5uZWwgbXVsdGlwbGllciB3aWxsIGJlIGZs b2F0aW5nIHBvaW50Cj4gMS4wNSwgaSBkb24ndCBrbm93IGhvdyB0byBleHByZXNzLgoKQXMgQW5k eSBtZW50aW9uZWQsIHdlIGRvIHRoaXMgYWxsIG92ZXIgdGhlIHBsYWNlLgpJSU9fVkFMX0lOVF9Q TFVTX01JQ1JPCgpUaGUga2V5IGlzIHRoYXQgd2Ugd2FudCB0byBwdXNoIHRoZSBidXJkZW4gb2Yg ZG9pbmcgdGhpcyBtYXRocyB0byB0aGUgdXNlcgpub3QgdGhlIHNvdXJjZS4KCk9mdGVuIHdoYXQg aXMgYWN0dWFsbHkgb2YgaW50ZXJlc3QgaXMgd2hldGhlciBhIHRlbXBlcmF0dXJlIHBhc3NlZCBh IHRocmVzaG9sZC4KSW4gdGhhdCBjYXNlLCB5b3UgY2FuIHRyYW5zZm9ybSB0aGUgdGhyZXNob2xk IGludG8gdGhlIHVuaXRzIG9mIHRoZSBBREMgKHNvIHRoZQpyZXZlcnNlIGRpcmVjdGx5IHRvIHlv dSB3b3VsZCBkbyB3aXRoIHByb2Nlc3NlZCBkYXRhKSBhbmQgb25seSBoYXZlIHRvIGRvIHRoZQpt YXRocyBvbmNlIHBlciBjaGFuZ2Ugb2YgdGhlIHRocmVzaG9sZCBpbnN0ZWFkIG9mIGZvciBldmVy eSBzYW1wbGUuCgpUaGVyZSBhcmUgaGVscGVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgbWF0aHMgZm9y IHlvdSwgc2hvdWxkIHlvdSBhY3R1YWxseQpuZWVkIFNJIHVuaXRzLgoKPiAKPiA+ID4gK30KPiA+ ID4gKwo+ID4gPiArc3RhdGljIGludCBtdDYzNjBfYWRjX2NvbnZlcnRfcHJvY2Vzc2VkX3ZhbChz dHJ1Y3QgbXQ2MzYwX2FkY19kYXRhICppbmZvLCBpbnQgY2hhbl9pZHgsIGludCAqdmFsKQo+ID4g PiArewo+ID4gPiArICAgICB1bnNpZ25lZCBpbnQgcmVndmFsID0gMDsKPiA+ID4gKyAgICAgY29u c3Qgc3RydWN0IGNvbnZlcnRlciB7Cj4gPiA+ICsgICAgICAgICAgICAgaW50IG11bHRpcGxpZXI7 Cj4gPiA+ICsgICAgICAgICAgICAgaW50IG9mZnNldDsKPiA+ID4gKyAgICAgICAgICAgICBpbnQg ZGl2aXNvcjsKPiA+ID4gKyAgICAgfSBhZGNfY29udmVydGVyW01UNjM2MF9DSEFOX01BWF0gPSB7 Cj4gPiA+ICsgICAgICAgICAgICAgeyAxMjUwLCAwLCAxfSwgLyogVVNCSUQgKi8KPiA+ID4gKyAg ICAgICAgICAgICB7IDYyNTAsIDAsIDF9LCAvKiBWQlVTRElWNSAqLwo+ID4gPiArICAgICAgICAg ICAgIHsgMjUwMCwgMCwgMX0sIC8qIFZCVVNESVYyICovCj4gPiA+ICsgICAgICAgICAgICAgeyAx MjUwLCAwLCAxfSwgLyogVlNZUyAqLwo+ID4gPiArICAgICAgICAgICAgIHsgMTI1MCwgMCwgMX0s IC8qIFZCQVQgKi8KPiA+ID4gKyAgICAgICAgICAgICB7IDI1MDAsIDAsIDF9LCAvKiBJQlVTICov Cj4gPiA+ICsgICAgICAgICAgICAgeyAyNTAwLCAwLCAxfSwgLyogSUJBVCAqLwo+ID4gPiArICAg ICAgICAgICAgIHsgMTI1MCwgMCwgMX0sIC8qIENIR19WRERQICovCj4gPiA+ICsgICAgICAgICAg ICAgeyAxMDUsIC04MDAwLCAxMDB9LCAvKiBURU1QX0pDICovCj4gPiA+ICsgICAgICAgICAgICAg eyAxMjUwLCAwLCAxfSwgLyogVlJFRl9UUyAqLwo+ID4gPiArICAgICAgICAgICAgIHsgMTI1MCwg MCwgMX0sIC8qIFRTICovCj4gPiA+ICsgICAgIH0sIHNwX2lidXNfYWRjX2NvbnZlcnRlciA9IHsg MTkwMCwgMCwgMSB9LCAqc2VsX2NvbnZlcnRlcjsKPiA+ID4gKyAgICAgaW50IHJldDsKPiA+ID4g Kwo+ID4gPiArICAgICBzZWxfY29udmVydGVyID0gYWRjX2NvbnZlcnRlciArIGNoYW5faWR4Owo+ ID4gPiArICAgICBpZiAoY2hhbl9pZHggPT0gTVQ2MzYwX0NIQU5fSUJVUykgewo+ID4gPiArICAg ICAgICAgICAgIC8qIGlidXMgY2hhbiB3aWxsIGJlIGFmZmVjdGVkIGJ5IGFpY3IgY29uZmlnICov Cj4gPiA+ICsgICAgICAgICAgICAgLyogaWYgYWljciA8IDQwMCwgYXBwbHkgdGhlIHNwZWNpYWwg aWJ1cyBjb252ZXJ0ZXIgKi8KPiA+ID4gKyAgICAgICAgICAgICByZXQgPSByZWdtYXBfcmVhZChp bmZvLT5yZWdtYXAsIE1UNjM2MF9SRUdfUE1VQ0hHQ1RSTDMsICZyZWd2YWwpOwo+ID4gPiArICAg ICAgICAgICAgIGlmIChyZXQpCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0 Owo+ID4gPiArCj4gPiA+ICsgICAgICAgICAgICAgcmVndmFsID0gKHJlZ3ZhbCAmIE1UNjM2MF9B SUNSX01BU0spID4+IE1UNjM2MF9BSUNSX1NIRlQ7Cj4gPiA+ICsgICAgICAgICAgICAgaWYgKHJl Z3ZhbCA8IE1UNjM2MF9BSUNSXzQwME1BKQo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgc2Vs X2NvbnZlcnRlciA9ICZzcF9pYnVzX2FkY19jb252ZXJ0ZXI7Cj4gPiA+ICsgICAgIH0KPiA+ID4g Kwo+ID4gPiArICAgICAqdmFsID0gbXQ2MzYwX2FkY192YWxfY29udmVydGVyKCp2YWwsIHNlbF9j b252ZXJ0ZXItPm11bHRpcGxpZXIsIHNlbF9jb252ZXJ0ZXItPm9mZnNldCwKPiA+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxfY29udmVydGVyLT5kaXZpc29yKTsK PiA+ID4gKwo+ID4gPiArICAgICByZXR1cm4gMDsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiArc3Rh dGljIGludCBtdDYzNjBfYWRjX3JlYWRfcHJvY2Vzc2VkKHN0cnVjdCBtdDYzNjBfYWRjX2RhdGEg Km1hZCwgaW50IGNoYW5uZWwsIGludCAqdmFsKQo+ID4gPiArewo+ID4gPiArICAgICB1MTYgYWRj X2VuYWJsZTsKPiA+ID4gKyAgICAgdTggcnB0WzNdOwo+ID4gPiArICAgICBrdGltZV90IHN0YXJ0 X3QsIHByZWRpY3RfZW5kX3Q7Cj4gPiA+ICsgICAgIGxvbmcgdGltZW91dDsKPiA+ID4gKyAgICAg aW50IHZhbHVlLCByZXQ7Cj4gPiA+ICsKPiA+ID4gKyAgICAgbXV0ZXhfbG9jaygmbWFkLT5hZGNf bG9jayk7Cj4gPiA+ICsKPiA+ID4gKyAgICAgLyogc2VsZWN0IHByZWZlcnJlZCBjaGFubmVsIHRo YXQgd2Ugd2FudCAqLwo+ID4gPiArICAgICByZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMobWFkLT5y ZWdtYXAsIE1UNjM2MF9SRUdfUE1VQURDUlBUMSwgTVQ2MzYwX1BSRUZFUkNIX01BU0ssCj4gPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIDw8IE1UNjM2MF9QUkVGRVJD SF9TSEZUKTsKPiA+ID4gKyAgICAgaWYgKHJldCkKPiA+ID4gKyAgICAgICAgICAgICBnb3RvIG91 dF9hZGM7Cj4gPiA+ICsKPiA+ID4gKyAgICAgLyogZW5hYmxlIGFkYyBjaGFubmVsIHdlIHdhbnQg YW5kIGFkY19lbiAqLwo+ID4gPiArICAgICBhZGNfZW5hYmxlID0gTVQ2MzYwX0FEQ0VOX01BU0sg fCBCSVQoY2hhbm5lbCk7Cj4gPiA+ICsgICAgIGFkY19lbmFibGUgPSBjcHVfdG9fYmUxNihhZGNf ZW5hYmxlKTsgIAo+ID4KPiA+IFVzZSBhIGxvY2FsIGJlMTYgdG8gc3RvcmUgdGhhdC4gSXQgd2ls bCBtYWtlIGl0IGEgbGl0dGxlIGNsZWFyZXIKPiA+IHRoYXQgd2UgYXJlIGRvaW5nIHNvbWV0aGlu ZyAndW51c3VhbCcgaGVyZS4gIFBlcmhhcHMgYSBjb21tZW50IG9uCj4gPiB3aHkgdGhpcyBvZGQg Y29kZSBleGlzdHMgd291bGQgYWxzbyBoZWxwPwo+ID4gIAo+IAo+IEFDSwo+IAo+ID4gPiArICAg ICByZXQgPSByZWdtYXBfcmF3X3dyaXRlKG1hZC0+cmVnbWFwLCBNVDYzNjBfUkVHX1BNVUFEQ0NG RywgKHZvaWQgKikmYWRjX2VuYWJsZSwgc2l6ZW9mKHUxNikpOwo+ID4gPiArICAgICBpZiAocmV0 KQo+ID4gPiArICAgICAgICAgICAgIGdvdG8gb3V0X2FkYzsKPiA+ID4gKwo+ID4gPiArICAgICBz dGFydF90ID0ga3RpbWVfZ2V0KCk7Cj4gPiA+ICsgICAgIHByZWRpY3RfZW5kX3QgPSBrdGltZV9h ZGRfbXMobWFkLT5sYXN0X29mZl90aW1lc3RhbXBzW2NoYW5uZWxdLCA1MCk7Cj4gPiA+ICsKPiA+ ID4gKyAgICAgaWYgKGt0aW1lX2FmdGVyKHN0YXJ0X3QsIHByZWRpY3RfZW5kX3QpKQo+ID4gPiAr ICAgICAgICAgICAgIHByZWRpY3RfZW5kX3QgPSBrdGltZV9hZGRfbXMoc3RhcnRfdCwgMjUpOwo+ ID4gPiArICAgICBlbHNlCj4gPiA+ICsgICAgICAgICAgICAgcHJlZGljdF9lbmRfdCA9IGt0aW1l X2FkZF9tcyhzdGFydF90LCA3NSk7Cj4gPiA+ICsKPiA+ID4gKyAgICAgZW5hYmxlX2lycShtYWQt PmlycSk7Cj4gPiA+ICthZGNfcmV0cnk6Cj4gPiA+ICsgICAgIHJlaW5pdF9jb21wbGV0aW9uKCZt YWQtPmFkY19jb21wbGV0ZSk7Cj4gPiA+ICsKPiA+ID4gKyAgICAgLyogd2FpdCBmb3IgY29udmVy c2lvbiB0byBjb21wbGV0ZSAqLwo+ID4gPiArICAgICB0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxl dGlvbl90aW1lb3V0KCZtYWQtPmFkY19jb21wbGV0ZSwgbXNlY3NfdG9famlmZmllcygyMDApKTsK PiA+ID4gKyAgICAgaWYgKHRpbWVvdXQgPT0gMCkgewo+ID4gPiArICAgICAgICAgICAgIHJldCA9 IC1FVElNRURPVVQ7Cj4gPiA+ICsgICAgICAgICAgICAgZ290byBvdXRfYWRjX2NvbnY7Cj4gPiA+ ICsgICAgIH0gZWxzZSBpZiAodGltZW91dCA8IDApIHsKPiA+ID4gKyAgICAgICAgICAgICByZXQg PSAtRUlOVFI7Cj4gPiA+ICsgICAgICAgICAgICAgZ290byBvdXRfYWRjX2NvbnY7Cj4gPiA+ICsg ICAgIH0KPiA+ID4gKwo+ID4gPiArICAgICByZXQgPSByZWdtYXBfcmF3X3JlYWQobWFkLT5yZWdt YXAsIE1UNjM2MF9SRUdfUE1VQURDUlBUMSwgcnB0LCBzaXplb2YocnB0KSk7Cj4gPiA+ICsgICAg IGlmIChyZXQpCj4gPiA+ICsgICAgICAgICAgICAgZ290byBvdXRfYWRjX2NvbnY7Cj4gPiA+ICsK PiA+ID4gKyAgICAgLyogY2hlY2sgdGhlIGN1cnJlbnQgcmVwb3J0ZWQgY2hhbm5lbCAqLwo+ID4g PiArICAgICBpZiAoKHJwdFswXSAmIE1UNjM2MF9SUFRDSF9NQVNLKSAhPSBjaGFubmVsKSB7Cj4g PiA+ICsgICAgICAgICAgICAgZGV2X2RiZyhtYWQtPmRldiwgIm5vdCB3YW50ZWQgY2hhbm5lbCBy ZXBvcnQgWyUwMnhdXG4iLCBycHRbMF0pOyAgCj4gPgo+ID4gVGhpcyBhbmQgdGhlIG9uZSBiZWxv dyBmZWVsIGxpa2UgZXJyb3IgbWVzc2FnZXMgcmF0aGVyIHRoYW4gZGVidWcgb25lcy4KPiA+ICAK PiAKPiBXZSBoYXZlIHR3byBmdW5jdGlvbiAiYmF0dGVyeSB6ZXJvIGN1cnJlbnQgdm9sdGFnZSha Q1YpIiBhbmQgIlR5cGVDCj4gT1RQIiB3aWxsIGF1dG8gcnVuIEFEQyBhdCBiYWNrZ3JvdW5kLgo+ IFpDVl9FTiB3aWxsIHJ1biBWQkFUX0FEQyB3aGVuIFRBIHBsdWcgaW4sIFR5cGVDIE9UUCB3aWxs IHJ1biBUU19BREMKPiB3aGVuIFR5cGVDIGF0dGFjaC4KPiBXZSBuZWVkIHRvIGNoZWNrIHJlcG9y dCBjaGFubmVsIGZvciBBREMgcmVwb3J0IGRhdGEgbWF0Y2ggaXMgb3VyIGRlc2lyZSBjaGFubmVs LgoKU28gdGhlcmUgaXMgZmlybXdhcmUgbWVzc2luZyB3aXRoIGl0IHVuZGVybmVhdGg/ICBPaCBn b29keS4KQWRkIGEgY29tbWVudCBleHBsYWluaW5nIHRoaXMuCgo+IAo+ID4gPiArICAgICAgICAg ICAgIGdvdG8gYWRjX3JldHJ5Owo+ID4gPiArICAgICB9Cj4gPiA+ICsKPiA+ID4gKyAgICAgaWYg KCFrdGltZV9hZnRlcihrdGltZV9nZXQoKSwgcHJlZGljdF9lbmRfdCkpIHsKPiA+ID4gKyAgICAg ICAgICAgICBkZXZfZGJnKG1hZC0+ZGV2LCAidGltZSBpcyBub3QgYWZ0ZXIgb25lIGFkY19jb252 X3RcbiIpOyAgCj4gPgo+ID4gRG9lcyB0aGlzIGFjdHVhbGx5IGhhcHBlbj8gSWYgZmVlbHMgbGlr ZSB3ZSBhcmUgYmVpbmcgYSBiaXQgb3ZlciBwcm90ZWN0aXZlCj4gPiBoZXJlLiAgSSdkIGRlZmlu aXRlbHkgbGlrZSB0byBzZWUgYSBjb21tZW50IHNheWluZyB3aHkgdGhpcyBwcm90ZWN0aW9uCj4g PiBtaWdodCBiZSBuZWVkZWQuCj4gPiAgCj4gCj4gV2hlbiBBRENfRU4gYW5kIE1UNjM2MF9DSEFO eF9FTiBpcyBlbmFibGUsIHRoZSBjaGFubmVsIHggd2lsbCBrZWVwCj4gcnVubmluZyBhZ2FpbiBh bmQgYWdhaW4KPiBJIHN1cHBvc2VkIHRvIGdldCBpbW1lZGlhdGUgZGF0YSB3aGljaCBpcyBnZW5l cmF0ZWQgYWZ0ZXIgSSBzdGFydCBpdC4KCkp1c3QgdG8gY2hlY2sgbXkgdW5kZXJzdGFuZGluZy4K ClRoaXMgaXMgYW4gZWRnZSB0cmlnZ2VyZWQgaW50ZXJydXB0IGFuZCBpdCB0cmlnZ2VycyBldmVy eSB0aW1lIGEgbmV3IHNhbXBsZQppcyB0YWtlbi4gIFRob3NlIHNhbXBsZXMgYXJlIHRha2VuIG9u IGEgZml4ZWQgZnJlcXVlbmN5IGlycmVzcGVjdGl2ZSBvZiB3aGV0aGVyCndlIGhhdmUgcmVhZCB0 aGUgcHJldmlvdXMgb25lPwoKPiAKPiBXaGVuIEkgZGlzYWJsZSBBRENfQ0hBTnhfRU4sIHRoZSBI L1cgbG9naWNhbCBBREMgaXMgc3RpbGwgcnVubmluZy4KPiBJZiBJIHJ1biB0aGUgc2FtZSBBREMg aW1tZWRpYXRlbHksIEkgbWF5IGdldCB0aGUgb2xkIHJlc3VsdCBhYm91dCB0aGlzIGNoYW5uZWwu Cj4gTVQ2MzYwIEFEQyB0eXBpY2FsIGNvbnZlcnNhdGlvbiB0aW1lIGlzIGFib3V0IDI1bXMuCj4g U28gV2UgbmVlZCBpZ25vcmUgd2hpY2ggaXJxIHRyaWdnZXIgYmVsb3cgMjVtcy4KCk5vcm1hbCB0 cmljayBmb3IgdGhpcyBzb3J0IG9mIGNhc2UgaXMgdG8ganVzdCBub3QgdXNlIHRoZSBpbnRlcnJ1 cHQuCkp1c3QgcmVhZCBhZnRlciAyNStkZWx0YSBtc2VjcyBhbmQgeW91IGFyZSBndWFyYW50ZWVk IHRvIGdldCB0aGUgcmlnaHQgYW5zd2VyLgoKCj4gCj4gPiA+ICsgICAgICAgICAgICAgZ290byBh ZGNfcmV0cnk7Cj4gPiA+ICsgICAgIH0KPiA+ID4gKwo+ID4gPiArICAgICB2YWx1ZSA9IChycHRb MV0gPDwgOCkgfCBycHRbMl07Cj4gPiA+ICsKPiA+ID4gKyAgICAgcmV0ID0gbXQ2MzYwX2FkY19j b252ZXJ0X3Byb2Nlc3NlZF92YWwobWFkLCBjaGFubmVsLCAmdmFsdWUpOwo+ID4gPiArICAgICBp ZiAocmV0KQo+ID4gPiArICAgICAgICAgICAgIGdvdG8gb3V0X2FkY19jb252Owo+ID4gPiArCj4g PiA+ICsgICAgICp2YWwgPSB2YWx1ZTsKPiA+ID4gKyAgICAgcmV0ID0gSUlPX1ZBTF9JTlQ7Cj4g PiA+ICsKPiA+ID4gK291dF9hZGNfY29udjoKPiA+ID4gKyAgICAgZGlzYWJsZV9pcnEobWFkLT5p cnEpOwo+ID4gPiArICAgICBhZGNfZW5hYmxlID0gTVQ2MzYwX0FEQ0VOX01BU0s7Cj4gPiA+ICsg ICAgIGFkY19lbmFibGUgPSBjcHVfdG9fYmUxNihhZGNfZW5hYmxlKTsKPiA+ID4gKyAgICAgcmVn bWFwX3Jhd193cml0ZShtYWQtPnJlZ21hcCwgTVQ2MzYwX1JFR19QTVVBRENDRkcsICh2b2lkICop JmFkY19lbmFibGUsIHNpemVvZih1MTYpKTsKPiA+ID4gKyAgICAgbWFkLT5sYXN0X29mZl90aW1l c3RhbXBzW2NoYW5uZWxdID0ga3RpbWVfZ2V0KCk7Cj4gPiA+ICsgICAgIC8qIHNldCBwcmVmZXIg Y2hhbm5lbCB0byAweGYgKi8KPiA+ID4gKyAgICAgcmVnbWFwX3VwZGF0ZV9iaXRzKG1hZC0+cmVn bWFwLCBNVDYzNjBfUkVHX1BNVUFEQ1JQVDEsIE1UNjM2MF9QUkVGRVJDSF9NQVNLLAo+ID4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgMHhGIDw8IE1UNjM2MF9QUkVGRVJDSF9TSEZUKTsKPiA+ ID4gK291dF9hZGM6Cj4gPiA+ICsgICAgIG11dGV4X3VubG9jaygmbWFkLT5hZGNfbG9jayk7Cj4g PiA+ICsKPiA+ID4gKyAgICAgcmV0dXJuIHJldDsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiArc3Rh dGljIGludCBtdDYzNjBfYWRjX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppaW9fZGV2LCBjb25z dCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbiwKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICBpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIG1hc2spCj4gPiA+ICt7Cj4gPiA+ICsg ICAgIHN0cnVjdCBtdDYzNjBfYWRjX2RhdGEgKm1hZCA9IGlpb19wcml2KGlpb19kZXYpOwo+ID4g PiArCj4gPiA+ICsgICAgIGlmIChtYXNrID09IElJT19DSEFOX0lORk9fUFJPQ0VTU0VEKQo+ID4g PiArICAgICAgICAgICAgIHJldHVybiBtdDYzNjBfYWRjX3JlYWRfcHJvY2Vzc2VkKG1hZCwgY2hh bi0+Y2hhbm5lbCwgdmFsKTsKPiA+ID4gKwo+ID4gPiArICAgICByZXR1cm4gLUVJTlZBTDsKPiA+ ID4gK30KPiA+ID4gKwo+ID4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBtdDYzNjBf YWRjX2lpb19pbmZvID0gewo+ID4gPiArICAgICAucmVhZF9yYXcgPSBtdDYzNjBfYWRjX3JlYWRf cmF3LAo+ID4gPiArfTsKPiA+ID4gKwo+ID4gPiArI2RlZmluZSBNVDYzNjBfQURDX0NIQU4oX2lk eCwgX3R5cGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gPiArICAgICAu dHlwZSA9IF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK PiA+ID4gKyAgICAgLmNoYW5uZWwgPSBNVDYzNjBfQ0hBTl8jI19pZHgsICAgICAgICAgICAgICAg ICAgICAgICAgICBcCj4gPiA+ICsgICAgIC5zY2FuX2luZGV4ID0gTVQ2MzYwX0NIQU5fIyNfaWR4 LCAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gPiArICAgICAuZXh0ZW5kX25hbWUgPSAjX2lk eCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ID4gKyAgICAgLmRhdGFz aGVldF9uYW1lID0gI19pZHgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiA+ ICsgICAgIC5zY2FuX3R5cGUgPSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAo+ID4gPiArICAgICAgICAgICAgIC5zaWduID0gJ3MnLCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFwKPiA+ID4gKyAgICAgICAgICAgICAucmVhbGJpdHMgPSAzMiwg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiA+ICsgICAgICAgICAgICAgLnN0 b3JhZ2ViaXRzID0gMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gPiArICAg ICAgICAgICAgIC5lbmRpYW5uZXNzID0gSUlPX0NQVSwgICAgICAgICAgICAgICAgICAgICAgICAg IFwKPiA+ID4gKyAgICAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCj4gPiA+ICsgICAgIC5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlP X0NIQU5fSU5GT19QUk9DRVNTRUQpLCAgICAgXAo+ID4gPiArICAgICAuaW5kZXhlZCA9IDEsICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ID4gK30KPiA+ID4g Kwo+ID4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIG10NjM2MF9hZGNfY2hh bm5lbHNbXSA9IHsKPiA+ID4gKyAgICAgTVQ2MzYwX0FEQ19DSEFOKFVTQklELCBJSU9fVk9MVEFH RSksCj4gPiA+ICsgICAgIE1UNjM2MF9BRENfQ0hBTihWQlVTRElWNSwgSUlPX1ZPTFRBR0UpLAo+ ID4gPiArICAgICBNVDYzNjBfQURDX0NIQU4oVkJVU0RJVjIsIElJT19WT0xUQUdFKSwKPiA+ID4g KyAgICAgTVQ2MzYwX0FEQ19DSEFOKFZTWVMsIElJT19WT0xUQUdFKSwKPiA+ID4gKyAgICAgTVQ2 MzYwX0FEQ19DSEFOKFZCQVQsIElJT19WT0xUQUdFKSwKPiA+ID4gKyAgICAgTVQ2MzYwX0FEQ19D SEFOKElCVVMsIElJT19DVVJSRU5UKSwKPiA+ID4gKyAgICAgTVQ2MzYwX0FEQ19DSEFOKElCQVQs IElJT19DVVJSRU5UKSwKPiA+ID4gKyAgICAgTVQ2MzYwX0FEQ19DSEFOKENIR19WRERQLCBJSU9f Vk9MVEFHRSksCj4gPiA+ICsgICAgIE1UNjM2MF9BRENfQ0hBTihURU1QX0pDLCBJSU9fVEVNUCks Cj4gPiA+ICsgICAgIE1UNjM2MF9BRENfQ0hBTihWUkVGX1RTLCBJSU9fVk9MVEFHRSksCj4gPiA+ ICsgICAgIE1UNjM2MF9BRENfQ0hBTihUUywgSUlPX1ZPTFRBR0UpLAo+ID4gPiArICAgICBJSU9f Q0hBTl9TT0ZUX1RJTUVTVEFNUChNVDYzNjBfQ0hBTl9NQVgpLAo+ID4gPiArfTsKPiA+ID4gKwo+ ID4gPiArc3RhdGljIGlycXJldHVybl90IG10NjM2MF9wbXVfYWRjX2RvbmVpX2hhbmRsZXIoaW50 IGlycSwgdm9pZCAqZGF0YSkKPiA+ID4gK3sKPiA+ID4gKyAgICAgc3RydWN0IG10NjM2MF9hZGNf ZGF0YSAqbWFkID0gaWlvX3ByaXYoZGF0YSk7Cj4gPiA+ICsKPiA+ID4gKyAgICAgY29tcGxldGUo Jm1hZC0+YWRjX2NvbXBsZXRlKTsKPiA+ID4gKyAgICAgcmV0dXJuIElSUV9IQU5ETEVEOwo+ID4g PiArfQo+ID4gPiArICAKPiA+IC4uLgo+ID4gIAo+ID4gPiArCj4gPiA+ICtzdGF0aWMgaW50IG10 NjM2MF9hZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+ID4gK3sKPiA+ ID4gKyAgICAgc3RydWN0IG10NjM2MF9hZGNfZGF0YSAqbWFkOwo+ID4gPiArICAgICBzdHJ1Y3Qg aWlvX2RldiAqaW5kaW9fZGV2Owo+ID4gPiArICAgICBpbnQgcmV0Owo+ID4gPiArCj4gPiA+ICsg ICAgIGluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yo Km1hZCkpOwo+ID4gPiArICAgICBpZiAoIWluZGlvX2RldikKPiA+ID4gKyAgICAgICAgICAgICBy ZXR1cm4gLUVOT01FTTsKPiA+ID4gKwo+ID4gPiArICAgICBtYWQgPSBpaW9fcHJpdihpbmRpb19k ZXYpOwo+ID4gPiArICAgICBtYWQtPmRldiA9ICZwZGV2LT5kZXY7Cj4gPiA+ICsgICAgIGluaXRf Y29tcGxldGlvbigmbWFkLT5hZGNfY29tcGxldGUpOwo+ID4gPiArICAgICBtdXRleF9pbml0KCZt YWQtPmFkY19sb2NrKTsKPiA+ID4gKwo+ID4gPiArICAgICBtYWQtPnJlZ21hcCA9IGRldl9nZXRf cmVnbWFwKHBkZXYtPmRldi5wYXJlbnQsIE5VTEwpOwo+ID4gPiArICAgICBpZiAoIW1hZC0+cmVn bWFwKSB7Cj4gPiA+ICsgICAgICAgICAgICAgZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRv IGdldCBwYXJlbnQgcmVnbWFwXG4iKTsKPiA+ID4gKyAgICAgICAgICAgICByZXR1cm4gLUVOT0RF VjsKPiA+ID4gKyAgICAgfQo+ID4gPiArCj4gPiA+ICsgICAgIHJldCA9IG10NjM2MF9hZGNfcmVz ZXQobWFkKTsKPiA+ID4gKyAgICAgaWYgKHJldCA8IDApIHsKPiA+ID4gKyAgICAgICAgICAgICBk ZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVzZXQgYWRjXG4iKTsKPiA+ID4gKyAgICAg ICAgICAgICByZXR1cm4gcmV0Owo+ID4gPiArICAgICB9Cj4gPiA+ICsKPiA+ID4gKyAgICAgbWFk LT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAiYWRjX2RvbmVpIik7Cj4gPiA+ ICsgICAgIGlmIChtYWQtPmlycSA8IDApIHsKPiA+ID4gKyAgICAgICAgICAgICBkZXZfZXJyKCZw ZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGFkY19kb25lIGlycVxuIik7Cj4gPiA+ICsgICAgICAg ICAgICAgcmV0dXJuIG1hZC0+aXJxOwo+ID4gPiArICAgICB9Cj4gPiA+ICsKPiA+ID4gKyAgICAg aXJxX3NldF9zdGF0dXNfZmxhZ3MobWFkLT5pcnEsIElSUV9OT0FVVE9FTik7ICAKPiA+Cj4gPiBB cyB3ZSBhcmUgZ29pbmcgdG8gaGF2ZSBhIHY1IGFueXdheSB0byBjbGVhbiB1cCB0aGF0IGVuZGlh biB3YXJuaW5nLAo+ID4gcGxlYXNlIGNvdWxkIHlvdSBhZGQgYSBjb21tZW50IHRvIGV4cGxhaW4g dGhlIG5lZWQgZm9yIElSUV9OT0FVVE9FTj8KPiA+ICAKPiAKPiBTYW1lIGFzIGFib3ZlICJFbmFi bGUgQURDIHdpbGwgcnVuIGFnYWluIGFuZCBhZ2FpbiB1bnRpbCBjbGVhcgo+IEFEQ19fQ0hBTnhf RU4gYml0Igo+IFNvIEFmdGVyIEkgZ2V0IHRoZSBBREMgcmVzdWx0LCBJIGRpc2FibGUgaXJxIGlu IG9yZGVyIHRvIGhhbmRsZSBvbmx5Cj4gb25lc2hvdCBkYXRhLgoKQXMgbWVudGlvbmVkIGEgYWJv dmUgSSBzdXNwZWN0IHlvdSBtYXkgYmUgYmV0dGVyIG9mZiBqdXN0IG5vdCB1c2luZwp0aGUgaW50 ZXJydXB0IGF0IGFsbC4KCj4gCj4gPiA+ICsgICAgIHJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRl ZF9pcnEoJnBkZXYtPmRldiwgbWFkLT5pcnEsIE5VTEwsIG10NjM2MF9wbXVfYWRjX2RvbmVpX2hh bmRsZXIsIDAsCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFk Y19kb25laSIsIGluZGlvX2Rldik7Cj4gPiA+ICsgICAgIGlmIChyZXQpIHsKPiA+ID4gKyAgICAg ICAgICAgICBkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgYWRjX2RvbmUg aXJxXG4iKTsKPiA+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gPiArICAgICB9Cj4g PiA+ICsKPiA+ID4gKyAgICAgaW5kaW9fZGV2LT5uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7 Cj4gPiA+ICsgICAgIGluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7Cj4gPiA+ICsg ICAgIGluZGlvX2Rldi0+aW5mbyA9ICZtdDYzNjBfYWRjX2lpb19pbmZvOwo+ID4gPiArICAgICBp bmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7Cj4gPiA+ICsgICAgIGluZGlvX2Rl di0+Y2hhbm5lbHMgPSBtdDYzNjBfYWRjX2NoYW5uZWxzOwo+ID4gPiArICAgICBpbmRpb19kZXYt Pm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUobXQ2MzYwX2FkY19jaGFubmVscyk7Cj4gPiA+ICsK PiA+ID4gKyAgICAgcmV0ID0gZGV2bV9paW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cCgmcGRldi0+ ZGV2LCBpbmRpb19kZXYsIE5VTEwsCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgbXQ2MzYwX2FkY190cmlnZ2VyX2hhbmRsZXIsIE5VTEwpOwo+ID4gPiAr ICAgICBpZiAocmV0KSB7Cj4gPiA+ICsgICAgICAgICAgICAgZGV2X2VycigmcGRldi0+ZGV2LCAi RmFpbGVkIHRvIGFsbG9jYXRlIGlpbyB0cmlnZ2VyIGJ1ZmZlclxuIik7Cj4gPiA+ICsgICAgICAg ICAgICAgcmV0dXJuIHJldDsKPiA+ID4gKyAgICAgfQo+ID4gPiArCj4gPiA+ICsgICAgIHJldCA9 IGRldm1faWlvX2RldmljZV9yZWdpc3RlcigmcGRldi0+ZGV2LCBpbmRpb19kZXYpOwo+ID4gPiAr ICAgICBpZiAocmV0KSB7Cj4gPiA+ICsgICAgICAgICAgICAgZGV2X2VycigmcGRldi0+ZGV2LCAi RmFpbGVkIHRvIHJlZ2lzdGVyIGlpbyBkZXZpY2VcbiIpOwo+ID4gPiArICAgICAgICAgICAgIHJl dHVybiByZXQ7Cj4gPiA+ICsgICAgIH0KPiA+ID4gKwo+ID4gPiArICAgICByZXR1cm4gMDsKPiA+ ID4gK30gIAo+ID4gLi4uICAKCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KTGludXgtbWVkaWF0ZWsgbWFpbGluZyBsaXN0CkxpbnV4LW1lZGlhdGVrQGxp c3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0 aW5mby9saW51eC1tZWRpYXRlawo= 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=-11.3 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_2 autolearn=unavailable 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 2BE58C43461 for ; Tue, 8 Sep 2020 09:10:21 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id BCBE22166E for ; Tue, 8 Sep 2020 09:10:20 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="mQEWQX57" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BCBE22166E Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=Huawei.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-ID: Subject: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=kHlYl4mbRcF76nbbiuofJGvnSgYge/MxqFA1i7FxCh8=; b=mQEWQX57Wy7ny/2GtTJWA6WDW YR5DbP3wdbHoEDwUWC3bo95xjYxX4qKl/aDD95heNQJnyvJ3yn36Z5Mvwxx6H8T3p5qyMURCzpj5Y xq1xjbTubUp5opbCx3P7jsnweami94go9c8ObCKKHQcy2IoeSFc7IQJL+PeZH4U0fWXHZpklpQpWQ T/afRRSqswbi5dwQ6WMfHxJHjwoSdZe5rucdm2U/oaVEZN00DOtzoqUJCGrR35DL9jAQydiUzy22M 2jVtAx8DFp8NOJUyyr0tQ8LqP5pCT+lOmqHeyz4kk6KPuJ0aC4WZRysVTF8h9LAnrRPHfRga/rrUO Hfg3CT9pQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kFZcV-0005VO-GR; Tue, 08 Sep 2020 09:08:55 +0000 Received: from lhrrgout.huawei.com ([185.176.76.210] helo=huawei.com) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kFZcQ-0005U0-Vn; Tue, 08 Sep 2020 09:08:53 +0000 Received: from lhreml710-chm.china.huawei.com (unknown [172.18.7.106]) by Forcepoint Email with ESMTP id 98026CC5F8DCFCC28E86; Tue, 8 Sep 2020 10:08:47 +0100 (IST) Received: from localhost (10.52.124.38) by lhreml710-chm.china.huawei.com (10.201.108.61) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.1.1913.5; Tue, 8 Sep 2020 10:08:46 +0100 Date: Tue, 8 Sep 2020 10:07:12 +0100 From: Jonathan Cameron To: Gene Chen Subject: Re: [PATCH v3 1/2] iio: adc: mt6360: Add ADC driver for MT6360 Message-ID: <20200908100712.00007a7b@Huawei.com> In-Reply-To: References: <1598259985-12517-1-git-send-email-gene.chen.richtek@gmail.com> <1598259985-12517-2-git-send-email-gene.chen.richtek@gmail.com> <20200829181157.1b653a88@archlinux> Organization: Huawei Technologies Research and Development (UK) Ltd. X-Mailer: Claws Mail 3.17.4 (GTK+ 2.24.32; i686-w64-mingw32) MIME-Version: 1.0 X-Originating-IP: [10.52.124.38] X-ClientProxiedBy: lhreml709-chm.china.huawei.com (10.201.108.58) To lhreml710-chm.china.huawei.com (10.201.108.61) X-CFilter-Loop: Reflected X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200908_050851_845349_80152551 X-CRM114-Status: GOOD ( 45.63 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gene Chen , lars@metafoo.de, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, cy_huang@richtek.com, benjamin.chao@mediatek.com, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, pmeerw@pmeerw.net, knaack.h@gmx.de, Matthias Brugger , Wilma.Wu@mediatek.com, Jonathan Cameron , shufan_lee@richtek.com 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 T24gVHVlLCA4IFNlcCAyMDIwIDE0OjE3OjQyICswODAwCkdlbmUgQ2hlbiA8Z2VuZS5jaGVuLnJp Y2h0ZWtAZ21haWwuY29tPiB3cm90ZToKCj4gSm9uYXRoYW4gQ2FtZXJvbiA8amljMjNAa2VybmVs Lm9yZz4g5pa8IDIwMjDlubQ45pyIMzDml6Ug6YCx5pelIOS4iuWNiDE6MTLlr6vpgZPvvJoKPiA+ Cj4gPiBPbiBNb24sIDI0IEF1ZyAyMDIwIDE3OjA2OjI0ICswODAwCj4gPiBHZW5lIENoZW4gPGdl bmUuY2hlbi5yaWNodGVrQGdtYWlsLmNvbT4gd3JvdGU6Cj4gPiAgCj4gPiA+IEZyb206IEdlbmUg Q2hlbiA8Z2VuZV9jaGVuQHJpY2h0ZWsuY29tPgo+ID4gPgo+ID4gPiBBZGQgTVQ2MzYwIEFEQyBk cml2ZXIgaW5jbHVkZSBDaGFyZ2VyIEN1cnJlbnQsIFZvbHRhZ2UsIGFuZAo+ID4gPiBUZW1wZXJh dHVyZS4KPiA+ID4KPiA+ID4gU2lnbmVkLW9mZi1ieTogR2VuZSBDaGVuIDxnZW5lX2NoZW5Acmlj aHRlay5jb20+ICAKPiA+IEhpIEdlbmUsCj4gPgo+ID4gQSBmZXcgY29tbWVudHMgaW5saW5lLiAg VGhlIGJpZyBvbmUgY2VudHJlcyBvbiB3aHkgd2UgY2FuJ3QKPiA+IGV4cG9zZSB0aGUgY2hhbm5l bHMgYXMgX3JhdywgX29mZnNldCBhbmQgX3NjYWxlPwo+ID4gIAo+IAo+IEkgdGhpbmsgaSBoYXZl IDMgcmVhc29uIGZvciB1c2UgcmVhbCB2YWx1ZSwKPiBBREMgaXMgdXNlZCB0byBnZXQgcmVhbCB2 YWx1ZSByYXRoZXIgdGhhbiByYXcgZGF0YSB3aGljaCBpcyBub3QgbWVhbmluZ2Z1bC4KPiBBbmQg SSBjYW4gZGVjaWRlIHdoaWNoIGZvcm11bGEgbmVlZHMgYXBwbHkgYWNjb3JkaW5nIHRvIGRpZmZl cmVudCBjb25kaXRpb24uCj4gQWxzbyB0aGUganVuY3Rpb24gdGVtcGVyYXR1cmUgY2hhbm5lbCBf c2NhbGUgaXMgZmxvYXRpbmcgcG9pbnQgMS4wNQo+IHdoaWNoIGlzIG5vdCBlYXN5IHRvIGV4cHJl c3MuCgpTZWUgYmVsb3cuCgo+IAo+ID4gVGhhbmtzLAo+ID4KPiA+IEpvbmF0aGFuCj4gPiAgCj4g PiA+IC0tLQo+ID4gPiAgZHJpdmVycy9paW8vYWRjL0tjb25maWcgICAgICB8ICAxMSArKwo+ID4g PiAgZHJpdmVycy9paW8vYWRjL01ha2VmaWxlICAgICB8ICAgMSArCj4gPiA+ICBkcml2ZXJzL2lp by9hZGMvbXQ2MzYwLWFkYy5jIHwgMzY2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysKPiA+ID4gIDMgZmlsZXMgY2hhbmdlZCwgMzc4IGluc2VydGlvbnMoKykKPiA+ ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2lpby9hZGMvbXQ2MzYwLWFkYy5jCj4gPiA+ Cj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvS2NvbmZpZyBiL2RyaXZlcnMvaWlv L2FkYy9LY29uZmlnCj4gPiA+IGluZGV4IDY2ZDljYzAuLjA3ZGNlYTcgMTAwNjQ0Cj4gPiA+IC0t LSBhL2RyaXZlcnMvaWlvL2FkYy9LY29uZmlnCj4gPiA+ICsrKyBiL2RyaXZlcnMvaWlvL2FkYy9L Y29uZmlnCj4gPiA+IEBAIC03MDMsNiArNzAzLDE3IEBAIGNvbmZpZyBNQ1AzOTExCj4gPiA+ICAg ICAgICAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0 aGUgbW9kdWxlIHdpbGwgYmUKPiA+ID4gICAgICAgICBjYWxsZWQgbWNwMzkxMS4KPiA+ID4KPiA+ ID4gK2NvbmZpZyBNRURJQVRFS19NVDYzNjBfQURDCj4gPiA+ICsgICAgIHRyaXN0YXRlICJNZWRp YXRlayBNVDYzNjAgQURDIFBhcnQiCj4gPiA+ICsgICAgIGRlcGVuZHMgb24gTUZEX01UNjM2MAo+ ID4gPiArICAgICBzZWxlY3QgSUlPX0JVRkZFUgo+ID4gPiArICAgICBzZWxlY3QgSUlPX1RSSUdH RVJFRF9CVUZGRVIKPiA+ID4gKyAgICAgaGVscAo+ID4gPiArICAgICAgIFNheSBZIGhlcmUgdG8g ZW5hYmxlIE1UNjM2MCBBREMgUGFydC4KPiA+ID4gKyAgICAgICBJbnRlZ3JhdGVkIGZvciBTeXN0 ZW0gTW9uaXRvcmluZyBpbmNsdWRlCj4gPiA+ICsgICAgICAgQ2hhcmdlciBhbmQgQmF0dGVyeSBD dXJyZW50LCBWb2x0YWdlIGFuZAo+ID4gPiArICAgICAgIFRlbXBlcmF0dXJlCj4gPiA+ICsKPiA+ ID4gIGNvbmZpZyBNRURJQVRFS19NVDY1NzdfQVVYQURDCj4gPiA+ICAgICAgIHRyaXN0YXRlICJN ZWRpYVRlayBBVVhBREMgZHJpdmVyIgo+ID4gPiAgICAgICBkZXBlbmRzIG9uIEFSQ0hfTUVESUFU RUsgfHwgQ09NUElMRV9URVNUCj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvTWFr ZWZpbGUgYi9kcml2ZXJzL2lpby9hZGMvTWFrZWZpbGUKPiA+ID4gaW5kZXggOTBmOTRhZC4uNWZj YTkwYSAxMDA2NDQKPiA+ID4gLS0tIGEvZHJpdmVycy9paW8vYWRjL01ha2VmaWxlCj4gPiA+ICsr KyBiL2RyaXZlcnMvaWlvL2FkYy9NYWtlZmlsZQo+ID4gPiBAQCAtNjUsNiArNjUsNyBAQCBvYmot JChDT05GSUdfTUFYOTYxMSkgKz0gbWF4OTYxMS5vCj4gPiA+ICBvYmotJChDT05GSUdfTUNQMzIw WCkgKz0gbWNwMzIweC5vCj4gPiA+ICBvYmotJChDT05GSUdfTUNQMzQyMikgKz0gbWNwMzQyMi5v Cj4gPiA+ICBvYmotJChDT05GSUdfTUNQMzkxMSkgKz0gbWNwMzkxMS5vCj4gPiA+ICtvYmotJChD T05GSUdfTUVESUFURUtfTVQ2MzYwX0FEQykgKz0gbXQ2MzYwLWFkYy5vCj4gPiA+ICBvYmotJChD T05GSUdfTUVESUFURUtfTVQ2NTc3X0FVWEFEQykgKz0gbXQ2NTc3X2F1eGFkYy5vCj4gPiA+ICBv YmotJChDT05GSUdfTUVOX1oxODhfQURDKSArPSBtZW5fejE4OF9hZGMubwo+ID4gPiAgb2JqLSQo Q09ORklHX01FU09OX1NBUkFEQykgKz0gbWVzb25fc2FyYWRjLm8KPiA+ID4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvaWlvL2FkYy9tdDYzNjAtYWRjLmMgYi9kcml2ZXJzL2lpby9hZGMvbXQ2MzYwLWFk Yy5jCj4gPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiA+IGluZGV4IDAwMDAwMDAuLjVlZWQ4 MTIKPiA+ID4gLS0tIC9kZXYvbnVsbAo+ID4gPiArKysgYi9kcml2ZXJzL2lpby9hZGMvbXQ2MzYw LWFkYy5jCj4gPiA+IEBAIC0wLDAgKzEsMzY2IEBACj4gPiA+ICsvLyBTUERYLUxpY2Vuc2UtSWRl bnRpZmllcjogR1BMLTIuMAo+ID4gPiArLyoKPiA+ID4gKyAqIENvcHlyaWdodCAoYykgMjAyMCBN ZWRpYVRlayBJbmMuCj4gPiA+ICsgKgo+ID4gPiArICogQXV0aG9yOiBHZW5lIENoZW4gPGdlbmVf Y2hlbkByaWNodGVrLmNvbT4KPiA+ID4gKyAqLwo+ID4gPiArCj4gPiA+ICsjaW5jbHVkZSA8bGlu dXgvY29tcGxldGlvbi5oPgo+ID4gPiArI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+ID4g PiArI2luY2x1ZGUgPGxpbnV4L2lpby9idWZmZXIuaD4KPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9p aW8vaWlvLmg+Cj4gPiA+ICsjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJfY29uc3VtZXIuaD4K PiA+ID4gKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcmVkX2J1ZmZlci5oPgo+ID4gPiArI2lu Y2x1ZGUgPGxpbnV4L2lycS5oPgo+ID4gPiArI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+ID4g PiArI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+Cj4gPiA+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxl Lmg+Cj4gPiA+ICsjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KPiA+ID4gKyNpbmNsdWRlIDxsaW51 eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KPiA+ ID4gKwo+ID4gPiArI2RlZmluZSBNVDYzNjBfUkVHX1BNVUNIR0NUUkwzICAgICAgIDB4MzEzCj4g PiA+ICsjZGVmaW5lIE1UNjM2MF9SRUdfUE1VQURDQ0ZHIDB4MzU2Cj4gPiA+ICsjZGVmaW5lIE1U NjM2MF9SRUdfUE1VQURDUlBUMSAgICAgICAgMHgzNUEKPiA+ID4gKwo+ID4gPiArLyogUE1VQ0hH Q1RSTDMgMHgzMTMgKi8KPiA+ID4gKyNkZWZpbmUgTVQ2MzYwX0FJQ1JfTUFTSyAgICAgMHhGQwo+ ID4gPiArI2RlZmluZSBNVDYzNjBfQUlDUl9TSEZUICAgICAyCj4gPiA+ICsjZGVmaW5lIE1UNjM2 MF9BSUNSXzQwME1BICAgIDB4Ngo+ID4gPiArLyogUE1VQURDQ0ZHIDB4MzU2ICovCj4gPiA+ICsj ZGVmaW5lIE1UNjM2MF9BRENFTl9NQVNLICAgIDB4ODAwMAo+ID4gPiArLyogUE1VQURDUlBUMSAw eDM1QSAqLwo+ID4gPiArI2RlZmluZSBNVDYzNjBfUFJFRkVSQ0hfTUFTSyAweEYwCj4gPiA+ICsj ZGVmaW5lIE1UNjM2MF9QUkVGRVJDSF9TSEZUIDQKPiA+ID4gKyNkZWZpbmUgTVQ2MzYwX1JQVENI X01BU0sgICAgMHgwRgo+ID4gPiArCj4gPiA+ICtlbnVtIHsKPiA+ID4gKyAgICAgTVQ2MzYwX0NI QU5fVVNCSUQgPSAwLAo+ID4gPiArICAgICBNVDYzNjBfQ0hBTl9WQlVTRElWNSwKPiA+ID4gKyAg ICAgTVQ2MzYwX0NIQU5fVkJVU0RJVjIsCj4gPiA+ICsgICAgIE1UNjM2MF9DSEFOX1ZTWVMsCj4g PiA+ICsgICAgIE1UNjM2MF9DSEFOX1ZCQVQsCj4gPiA+ICsgICAgIE1UNjM2MF9DSEFOX0lCVVMs Cj4gPiA+ICsgICAgIE1UNjM2MF9DSEFOX0lCQVQsCj4gPiA+ICsgICAgIE1UNjM2MF9DSEFOX0NI R19WRERQLAo+ID4gPiArICAgICBNVDYzNjBfQ0hBTl9URU1QX0pDLAo+ID4gPiArICAgICBNVDYz NjBfQ0hBTl9WUkVGX1RTLAo+ID4gPiArICAgICBNVDYzNjBfQ0hBTl9UUywKPiA+ID4gKyAgICAg TVQ2MzYwX0NIQU5fTUFYLAo+ID4gPiArfTsKPiA+ID4gKwo+ID4gPiArc3RydWN0IG10NjM2MF9h ZGNfZGF0YSB7Cj4gPiA+ICsgICAgIHN0cnVjdCBkZXZpY2UgKmRldjsKPiA+ID4gKyAgICAgc3Ry dWN0IHJlZ21hcCAqcmVnbWFwOwo+ID4gPiArICAgICBzdHJ1Y3QgY29tcGxldGlvbiBhZGNfY29t cGxldGU7Cj4gPiA+ICsgICAgIHN0cnVjdCBtdXRleCBhZGNfbG9jazsKPiA+ID4gKyAgICAga3Rp bWVfdCBsYXN0X29mZl90aW1lc3RhbXBzW01UNjM2MF9DSEFOX01BWF07Cj4gPiA+ICsgICAgIGlu dCBpcnE7Cj4gPiA+ICt9Owo+ID4gPiArCj4gPiA+ICtzdGF0aWMgaW5saW5lIGludCBtdDYzNjBf YWRjX3ZhbF9jb252ZXJ0ZXIoaW50IHZhbCwgaW50IG11bHRpcGxpZXIsIGludCBvZmZzZXQsIGlu dCBkaXZpc29yKQo+ID4gPiArewo+ID4gPiArICAgICByZXR1cm4gKCh2YWwgKiBtdWx0aXBsaWVy KSArIG9mZnNldCkgLyBkaXZpc29yOyAgCj4gPgo+ID4gV2h5IGNvdWxkIHdlIG5vdCByZXBvcnQg dGhlc2UgdmFsdWVzIHRvIHVzZXJzcGFjZSBvciBjb25zdW1lciBkcml2ZXJzIGFuZCBsZXQKPiA+ IHRoZW0gZGVhbCB3aXRoIHRoZSBjb252ZXJzaW9uIGlmIHRoZXkgYWN0dWFsbHkgbmVlZGVkIGl0 Pwo+ID4gTWFwcGluZyB0aGlzIHRvCj4gPgo+ID4gKHZhbCArIG5ld19vZmZzZXQpICogbXVsdGlw bGllciB3b3VsZCBiZSBhIGxpdHRsZSBtZXNzeSwgYnV0IG5vdCB0b28gYmFkLgo+ID4KPiA+IFRo ZSBhZHZhbnRhZ2Ugd291bGQgYmUgdGhhdCB3ZSB3b3VsZCB0aGVuIGJlIHByb3ZpZGluZyB0aGUg ZGF0YSBuZWVkZWQKPiA+IHRvIGdldCByZWFsIHVuaXRzIGZvciB2YWx1ZXMgcmVhZCBmcm9tIHRo ZSBidWZmZXJzIHdpdGhvdXQgaGF2aW5nIHRvCj4gPiBkbyBhbGwgdGhlIG1hdGhzIGluIGtlcm5l bCAod2l0aG91dCBhY2Nlc3MgdG8gZmxvYXRpbmcgcG9pbnQpLgo+ID4KPiA+ICAKPiAKPiBBcyBh Ym92ZSwgaWYgSSB1c2UgZm9ybXVsYSAiKHZhbCArIG5ld19vZmZzZXQpICogbXVsdGlwbGllciIs Cj4gdGhlIGp1bmN0aW9uIHRlbXBlcmF0dXJlIGNoYW5uZWwgbXVsdGlwbGllciB3aWxsIGJlIGZs b2F0aW5nIHBvaW50Cj4gMS4wNSwgaSBkb24ndCBrbm93IGhvdyB0byBleHByZXNzLgoKQXMgQW5k eSBtZW50aW9uZWQsIHdlIGRvIHRoaXMgYWxsIG92ZXIgdGhlIHBsYWNlLgpJSU9fVkFMX0lOVF9Q TFVTX01JQ1JPCgpUaGUga2V5IGlzIHRoYXQgd2Ugd2FudCB0byBwdXNoIHRoZSBidXJkZW4gb2Yg ZG9pbmcgdGhpcyBtYXRocyB0byB0aGUgdXNlcgpub3QgdGhlIHNvdXJjZS4KCk9mdGVuIHdoYXQg aXMgYWN0dWFsbHkgb2YgaW50ZXJlc3QgaXMgd2hldGhlciBhIHRlbXBlcmF0dXJlIHBhc3NlZCBh IHRocmVzaG9sZC4KSW4gdGhhdCBjYXNlLCB5b3UgY2FuIHRyYW5zZm9ybSB0aGUgdGhyZXNob2xk IGludG8gdGhlIHVuaXRzIG9mIHRoZSBBREMgKHNvIHRoZQpyZXZlcnNlIGRpcmVjdGx5IHRvIHlv dSB3b3VsZCBkbyB3aXRoIHByb2Nlc3NlZCBkYXRhKSBhbmQgb25seSBoYXZlIHRvIGRvIHRoZQpt YXRocyBvbmNlIHBlciBjaGFuZ2Ugb2YgdGhlIHRocmVzaG9sZCBpbnN0ZWFkIG9mIGZvciBldmVy eSBzYW1wbGUuCgpUaGVyZSBhcmUgaGVscGVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgbWF0aHMgZm9y IHlvdSwgc2hvdWxkIHlvdSBhY3R1YWxseQpuZWVkIFNJIHVuaXRzLgoKPiAKPiA+ID4gK30KPiA+ ID4gKwo+ID4gPiArc3RhdGljIGludCBtdDYzNjBfYWRjX2NvbnZlcnRfcHJvY2Vzc2VkX3ZhbChz dHJ1Y3QgbXQ2MzYwX2FkY19kYXRhICppbmZvLCBpbnQgY2hhbl9pZHgsIGludCAqdmFsKQo+ID4g PiArewo+ID4gPiArICAgICB1bnNpZ25lZCBpbnQgcmVndmFsID0gMDsKPiA+ID4gKyAgICAgY29u c3Qgc3RydWN0IGNvbnZlcnRlciB7Cj4gPiA+ICsgICAgICAgICAgICAgaW50IG11bHRpcGxpZXI7 Cj4gPiA+ICsgICAgICAgICAgICAgaW50IG9mZnNldDsKPiA+ID4gKyAgICAgICAgICAgICBpbnQg ZGl2aXNvcjsKPiA+ID4gKyAgICAgfSBhZGNfY29udmVydGVyW01UNjM2MF9DSEFOX01BWF0gPSB7 Cj4gPiA+ICsgICAgICAgICAgICAgeyAxMjUwLCAwLCAxfSwgLyogVVNCSUQgKi8KPiA+ID4gKyAg ICAgICAgICAgICB7IDYyNTAsIDAsIDF9LCAvKiBWQlVTRElWNSAqLwo+ID4gPiArICAgICAgICAg ICAgIHsgMjUwMCwgMCwgMX0sIC8qIFZCVVNESVYyICovCj4gPiA+ICsgICAgICAgICAgICAgeyAx MjUwLCAwLCAxfSwgLyogVlNZUyAqLwo+ID4gPiArICAgICAgICAgICAgIHsgMTI1MCwgMCwgMX0s IC8qIFZCQVQgKi8KPiA+ID4gKyAgICAgICAgICAgICB7IDI1MDAsIDAsIDF9LCAvKiBJQlVTICov Cj4gPiA+ICsgICAgICAgICAgICAgeyAyNTAwLCAwLCAxfSwgLyogSUJBVCAqLwo+ID4gPiArICAg ICAgICAgICAgIHsgMTI1MCwgMCwgMX0sIC8qIENIR19WRERQICovCj4gPiA+ICsgICAgICAgICAg ICAgeyAxMDUsIC04MDAwLCAxMDB9LCAvKiBURU1QX0pDICovCj4gPiA+ICsgICAgICAgICAgICAg eyAxMjUwLCAwLCAxfSwgLyogVlJFRl9UUyAqLwo+ID4gPiArICAgICAgICAgICAgIHsgMTI1MCwg MCwgMX0sIC8qIFRTICovCj4gPiA+ICsgICAgIH0sIHNwX2lidXNfYWRjX2NvbnZlcnRlciA9IHsg MTkwMCwgMCwgMSB9LCAqc2VsX2NvbnZlcnRlcjsKPiA+ID4gKyAgICAgaW50IHJldDsKPiA+ID4g Kwo+ID4gPiArICAgICBzZWxfY29udmVydGVyID0gYWRjX2NvbnZlcnRlciArIGNoYW5faWR4Owo+ ID4gPiArICAgICBpZiAoY2hhbl9pZHggPT0gTVQ2MzYwX0NIQU5fSUJVUykgewo+ID4gPiArICAg ICAgICAgICAgIC8qIGlidXMgY2hhbiB3aWxsIGJlIGFmZmVjdGVkIGJ5IGFpY3IgY29uZmlnICov Cj4gPiA+ICsgICAgICAgICAgICAgLyogaWYgYWljciA8IDQwMCwgYXBwbHkgdGhlIHNwZWNpYWwg aWJ1cyBjb252ZXJ0ZXIgKi8KPiA+ID4gKyAgICAgICAgICAgICByZXQgPSByZWdtYXBfcmVhZChp bmZvLT5yZWdtYXAsIE1UNjM2MF9SRUdfUE1VQ0hHQ1RSTDMsICZyZWd2YWwpOwo+ID4gPiArICAg ICAgICAgICAgIGlmIChyZXQpCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0 Owo+ID4gPiArCj4gPiA+ICsgICAgICAgICAgICAgcmVndmFsID0gKHJlZ3ZhbCAmIE1UNjM2MF9B SUNSX01BU0spID4+IE1UNjM2MF9BSUNSX1NIRlQ7Cj4gPiA+ICsgICAgICAgICAgICAgaWYgKHJl Z3ZhbCA8IE1UNjM2MF9BSUNSXzQwME1BKQo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgc2Vs X2NvbnZlcnRlciA9ICZzcF9pYnVzX2FkY19jb252ZXJ0ZXI7Cj4gPiA+ICsgICAgIH0KPiA+ID4g Kwo+ID4gPiArICAgICAqdmFsID0gbXQ2MzYwX2FkY192YWxfY29udmVydGVyKCp2YWwsIHNlbF9j b252ZXJ0ZXItPm11bHRpcGxpZXIsIHNlbF9jb252ZXJ0ZXItPm9mZnNldCwKPiA+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxfY29udmVydGVyLT5kaXZpc29yKTsK PiA+ID4gKwo+ID4gPiArICAgICByZXR1cm4gMDsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiArc3Rh dGljIGludCBtdDYzNjBfYWRjX3JlYWRfcHJvY2Vzc2VkKHN0cnVjdCBtdDYzNjBfYWRjX2RhdGEg Km1hZCwgaW50IGNoYW5uZWwsIGludCAqdmFsKQo+ID4gPiArewo+ID4gPiArICAgICB1MTYgYWRj X2VuYWJsZTsKPiA+ID4gKyAgICAgdTggcnB0WzNdOwo+ID4gPiArICAgICBrdGltZV90IHN0YXJ0 X3QsIHByZWRpY3RfZW5kX3Q7Cj4gPiA+ICsgICAgIGxvbmcgdGltZW91dDsKPiA+ID4gKyAgICAg aW50IHZhbHVlLCByZXQ7Cj4gPiA+ICsKPiA+ID4gKyAgICAgbXV0ZXhfbG9jaygmbWFkLT5hZGNf bG9jayk7Cj4gPiA+ICsKPiA+ID4gKyAgICAgLyogc2VsZWN0IHByZWZlcnJlZCBjaGFubmVsIHRo YXQgd2Ugd2FudCAqLwo+ID4gPiArICAgICByZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMobWFkLT5y ZWdtYXAsIE1UNjM2MF9SRUdfUE1VQURDUlBUMSwgTVQ2MzYwX1BSRUZFUkNIX01BU0ssCj4gPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIDw8IE1UNjM2MF9QUkVGRVJD SF9TSEZUKTsKPiA+ID4gKyAgICAgaWYgKHJldCkKPiA+ID4gKyAgICAgICAgICAgICBnb3RvIG91 dF9hZGM7Cj4gPiA+ICsKPiA+ID4gKyAgICAgLyogZW5hYmxlIGFkYyBjaGFubmVsIHdlIHdhbnQg YW5kIGFkY19lbiAqLwo+ID4gPiArICAgICBhZGNfZW5hYmxlID0gTVQ2MzYwX0FEQ0VOX01BU0sg fCBCSVQoY2hhbm5lbCk7Cj4gPiA+ICsgICAgIGFkY19lbmFibGUgPSBjcHVfdG9fYmUxNihhZGNf ZW5hYmxlKTsgIAo+ID4KPiA+IFVzZSBhIGxvY2FsIGJlMTYgdG8gc3RvcmUgdGhhdC4gSXQgd2ls bCBtYWtlIGl0IGEgbGl0dGxlIGNsZWFyZXIKPiA+IHRoYXQgd2UgYXJlIGRvaW5nIHNvbWV0aGlu ZyAndW51c3VhbCcgaGVyZS4gIFBlcmhhcHMgYSBjb21tZW50IG9uCj4gPiB3aHkgdGhpcyBvZGQg Y29kZSBleGlzdHMgd291bGQgYWxzbyBoZWxwPwo+ID4gIAo+IAo+IEFDSwo+IAo+ID4gPiArICAg ICByZXQgPSByZWdtYXBfcmF3X3dyaXRlKG1hZC0+cmVnbWFwLCBNVDYzNjBfUkVHX1BNVUFEQ0NG RywgKHZvaWQgKikmYWRjX2VuYWJsZSwgc2l6ZW9mKHUxNikpOwo+ID4gPiArICAgICBpZiAocmV0 KQo+ID4gPiArICAgICAgICAgICAgIGdvdG8gb3V0X2FkYzsKPiA+ID4gKwo+ID4gPiArICAgICBz dGFydF90ID0ga3RpbWVfZ2V0KCk7Cj4gPiA+ICsgICAgIHByZWRpY3RfZW5kX3QgPSBrdGltZV9h ZGRfbXMobWFkLT5sYXN0X29mZl90aW1lc3RhbXBzW2NoYW5uZWxdLCA1MCk7Cj4gPiA+ICsKPiA+ ID4gKyAgICAgaWYgKGt0aW1lX2FmdGVyKHN0YXJ0X3QsIHByZWRpY3RfZW5kX3QpKQo+ID4gPiAr ICAgICAgICAgICAgIHByZWRpY3RfZW5kX3QgPSBrdGltZV9hZGRfbXMoc3RhcnRfdCwgMjUpOwo+ ID4gPiArICAgICBlbHNlCj4gPiA+ICsgICAgICAgICAgICAgcHJlZGljdF9lbmRfdCA9IGt0aW1l X2FkZF9tcyhzdGFydF90LCA3NSk7Cj4gPiA+ICsKPiA+ID4gKyAgICAgZW5hYmxlX2lycShtYWQt PmlycSk7Cj4gPiA+ICthZGNfcmV0cnk6Cj4gPiA+ICsgICAgIHJlaW5pdF9jb21wbGV0aW9uKCZt YWQtPmFkY19jb21wbGV0ZSk7Cj4gPiA+ICsKPiA+ID4gKyAgICAgLyogd2FpdCBmb3IgY29udmVy c2lvbiB0byBjb21wbGV0ZSAqLwo+ID4gPiArICAgICB0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxl dGlvbl90aW1lb3V0KCZtYWQtPmFkY19jb21wbGV0ZSwgbXNlY3NfdG9famlmZmllcygyMDApKTsK PiA+ID4gKyAgICAgaWYgKHRpbWVvdXQgPT0gMCkgewo+ID4gPiArICAgICAgICAgICAgIHJldCA9 IC1FVElNRURPVVQ7Cj4gPiA+ICsgICAgICAgICAgICAgZ290byBvdXRfYWRjX2NvbnY7Cj4gPiA+ ICsgICAgIH0gZWxzZSBpZiAodGltZW91dCA8IDApIHsKPiA+ID4gKyAgICAgICAgICAgICByZXQg PSAtRUlOVFI7Cj4gPiA+ICsgICAgICAgICAgICAgZ290byBvdXRfYWRjX2NvbnY7Cj4gPiA+ICsg ICAgIH0KPiA+ID4gKwo+ID4gPiArICAgICByZXQgPSByZWdtYXBfcmF3X3JlYWQobWFkLT5yZWdt YXAsIE1UNjM2MF9SRUdfUE1VQURDUlBUMSwgcnB0LCBzaXplb2YocnB0KSk7Cj4gPiA+ICsgICAg IGlmIChyZXQpCj4gPiA+ICsgICAgICAgICAgICAgZ290byBvdXRfYWRjX2NvbnY7Cj4gPiA+ICsK PiA+ID4gKyAgICAgLyogY2hlY2sgdGhlIGN1cnJlbnQgcmVwb3J0ZWQgY2hhbm5lbCAqLwo+ID4g PiArICAgICBpZiAoKHJwdFswXSAmIE1UNjM2MF9SUFRDSF9NQVNLKSAhPSBjaGFubmVsKSB7Cj4g PiA+ICsgICAgICAgICAgICAgZGV2X2RiZyhtYWQtPmRldiwgIm5vdCB3YW50ZWQgY2hhbm5lbCBy ZXBvcnQgWyUwMnhdXG4iLCBycHRbMF0pOyAgCj4gPgo+ID4gVGhpcyBhbmQgdGhlIG9uZSBiZWxv dyBmZWVsIGxpa2UgZXJyb3IgbWVzc2FnZXMgcmF0aGVyIHRoYW4gZGVidWcgb25lcy4KPiA+ICAK PiAKPiBXZSBoYXZlIHR3byBmdW5jdGlvbiAiYmF0dGVyeSB6ZXJvIGN1cnJlbnQgdm9sdGFnZSha Q1YpIiBhbmQgIlR5cGVDCj4gT1RQIiB3aWxsIGF1dG8gcnVuIEFEQyBhdCBiYWNrZ3JvdW5kLgo+ IFpDVl9FTiB3aWxsIHJ1biBWQkFUX0FEQyB3aGVuIFRBIHBsdWcgaW4sIFR5cGVDIE9UUCB3aWxs IHJ1biBUU19BREMKPiB3aGVuIFR5cGVDIGF0dGFjaC4KPiBXZSBuZWVkIHRvIGNoZWNrIHJlcG9y dCBjaGFubmVsIGZvciBBREMgcmVwb3J0IGRhdGEgbWF0Y2ggaXMgb3VyIGRlc2lyZSBjaGFubmVs LgoKU28gdGhlcmUgaXMgZmlybXdhcmUgbWVzc2luZyB3aXRoIGl0IHVuZGVybmVhdGg/ICBPaCBn b29keS4KQWRkIGEgY29tbWVudCBleHBsYWluaW5nIHRoaXMuCgo+IAo+ID4gPiArICAgICAgICAg ICAgIGdvdG8gYWRjX3JldHJ5Owo+ID4gPiArICAgICB9Cj4gPiA+ICsKPiA+ID4gKyAgICAgaWYg KCFrdGltZV9hZnRlcihrdGltZV9nZXQoKSwgcHJlZGljdF9lbmRfdCkpIHsKPiA+ID4gKyAgICAg ICAgICAgICBkZXZfZGJnKG1hZC0+ZGV2LCAidGltZSBpcyBub3QgYWZ0ZXIgb25lIGFkY19jb252 X3RcbiIpOyAgCj4gPgo+ID4gRG9lcyB0aGlzIGFjdHVhbGx5IGhhcHBlbj8gSWYgZmVlbHMgbGlr ZSB3ZSBhcmUgYmVpbmcgYSBiaXQgb3ZlciBwcm90ZWN0aXZlCj4gPiBoZXJlLiAgSSdkIGRlZmlu aXRlbHkgbGlrZSB0byBzZWUgYSBjb21tZW50IHNheWluZyB3aHkgdGhpcyBwcm90ZWN0aW9uCj4g PiBtaWdodCBiZSBuZWVkZWQuCj4gPiAgCj4gCj4gV2hlbiBBRENfRU4gYW5kIE1UNjM2MF9DSEFO eF9FTiBpcyBlbmFibGUsIHRoZSBjaGFubmVsIHggd2lsbCBrZWVwCj4gcnVubmluZyBhZ2FpbiBh bmQgYWdhaW4KPiBJIHN1cHBvc2VkIHRvIGdldCBpbW1lZGlhdGUgZGF0YSB3aGljaCBpcyBnZW5l cmF0ZWQgYWZ0ZXIgSSBzdGFydCBpdC4KCkp1c3QgdG8gY2hlY2sgbXkgdW5kZXJzdGFuZGluZy4K ClRoaXMgaXMgYW4gZWRnZSB0cmlnZ2VyZWQgaW50ZXJydXB0IGFuZCBpdCB0cmlnZ2VycyBldmVy eSB0aW1lIGEgbmV3IHNhbXBsZQppcyB0YWtlbi4gIFRob3NlIHNhbXBsZXMgYXJlIHRha2VuIG9u IGEgZml4ZWQgZnJlcXVlbmN5IGlycmVzcGVjdGl2ZSBvZiB3aGV0aGVyCndlIGhhdmUgcmVhZCB0 aGUgcHJldmlvdXMgb25lPwoKPiAKPiBXaGVuIEkgZGlzYWJsZSBBRENfQ0hBTnhfRU4sIHRoZSBI L1cgbG9naWNhbCBBREMgaXMgc3RpbGwgcnVubmluZy4KPiBJZiBJIHJ1biB0aGUgc2FtZSBBREMg aW1tZWRpYXRlbHksIEkgbWF5IGdldCB0aGUgb2xkIHJlc3VsdCBhYm91dCB0aGlzIGNoYW5uZWwu Cj4gTVQ2MzYwIEFEQyB0eXBpY2FsIGNvbnZlcnNhdGlvbiB0aW1lIGlzIGFib3V0IDI1bXMuCj4g U28gV2UgbmVlZCBpZ25vcmUgd2hpY2ggaXJxIHRyaWdnZXIgYmVsb3cgMjVtcy4KCk5vcm1hbCB0 cmljayBmb3IgdGhpcyBzb3J0IG9mIGNhc2UgaXMgdG8ganVzdCBub3QgdXNlIHRoZSBpbnRlcnJ1 cHQuCkp1c3QgcmVhZCBhZnRlciAyNStkZWx0YSBtc2VjcyBhbmQgeW91IGFyZSBndWFyYW50ZWVk IHRvIGdldCB0aGUgcmlnaHQgYW5zd2VyLgoKCj4gCj4gPiA+ICsgICAgICAgICAgICAgZ290byBh ZGNfcmV0cnk7Cj4gPiA+ICsgICAgIH0KPiA+ID4gKwo+ID4gPiArICAgICB2YWx1ZSA9IChycHRb MV0gPDwgOCkgfCBycHRbMl07Cj4gPiA+ICsKPiA+ID4gKyAgICAgcmV0ID0gbXQ2MzYwX2FkY19j b252ZXJ0X3Byb2Nlc3NlZF92YWwobWFkLCBjaGFubmVsLCAmdmFsdWUpOwo+ID4gPiArICAgICBp ZiAocmV0KQo+ID4gPiArICAgICAgICAgICAgIGdvdG8gb3V0X2FkY19jb252Owo+ID4gPiArCj4g PiA+ICsgICAgICp2YWwgPSB2YWx1ZTsKPiA+ID4gKyAgICAgcmV0ID0gSUlPX1ZBTF9JTlQ7Cj4g PiA+ICsKPiA+ID4gK291dF9hZGNfY29udjoKPiA+ID4gKyAgICAgZGlzYWJsZV9pcnEobWFkLT5p cnEpOwo+ID4gPiArICAgICBhZGNfZW5hYmxlID0gTVQ2MzYwX0FEQ0VOX01BU0s7Cj4gPiA+ICsg ICAgIGFkY19lbmFibGUgPSBjcHVfdG9fYmUxNihhZGNfZW5hYmxlKTsKPiA+ID4gKyAgICAgcmVn bWFwX3Jhd193cml0ZShtYWQtPnJlZ21hcCwgTVQ2MzYwX1JFR19QTVVBRENDRkcsICh2b2lkICop JmFkY19lbmFibGUsIHNpemVvZih1MTYpKTsKPiA+ID4gKyAgICAgbWFkLT5sYXN0X29mZl90aW1l c3RhbXBzW2NoYW5uZWxdID0ga3RpbWVfZ2V0KCk7Cj4gPiA+ICsgICAgIC8qIHNldCBwcmVmZXIg Y2hhbm5lbCB0byAweGYgKi8KPiA+ID4gKyAgICAgcmVnbWFwX3VwZGF0ZV9iaXRzKG1hZC0+cmVn bWFwLCBNVDYzNjBfUkVHX1BNVUFEQ1JQVDEsIE1UNjM2MF9QUkVGRVJDSF9NQVNLLAo+ID4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgMHhGIDw8IE1UNjM2MF9QUkVGRVJDSF9TSEZUKTsKPiA+ ID4gK291dF9hZGM6Cj4gPiA+ICsgICAgIG11dGV4X3VubG9jaygmbWFkLT5hZGNfbG9jayk7Cj4g PiA+ICsKPiA+ID4gKyAgICAgcmV0dXJuIHJldDsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiArc3Rh dGljIGludCBtdDYzNjBfYWRjX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppaW9fZGV2LCBjb25z dCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbiwKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICBpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIG1hc2spCj4gPiA+ICt7Cj4gPiA+ICsg ICAgIHN0cnVjdCBtdDYzNjBfYWRjX2RhdGEgKm1hZCA9IGlpb19wcml2KGlpb19kZXYpOwo+ID4g PiArCj4gPiA+ICsgICAgIGlmIChtYXNrID09IElJT19DSEFOX0lORk9fUFJPQ0VTU0VEKQo+ID4g PiArICAgICAgICAgICAgIHJldHVybiBtdDYzNjBfYWRjX3JlYWRfcHJvY2Vzc2VkKG1hZCwgY2hh bi0+Y2hhbm5lbCwgdmFsKTsKPiA+ID4gKwo+ID4gPiArICAgICByZXR1cm4gLUVJTlZBTDsKPiA+ ID4gK30KPiA+ID4gKwo+ID4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBtdDYzNjBf YWRjX2lpb19pbmZvID0gewo+ID4gPiArICAgICAucmVhZF9yYXcgPSBtdDYzNjBfYWRjX3JlYWRf cmF3LAo+ID4gPiArfTsKPiA+ID4gKwo+ID4gPiArI2RlZmluZSBNVDYzNjBfQURDX0NIQU4oX2lk eCwgX3R5cGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gPiArICAgICAu dHlwZSA9IF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK PiA+ID4gKyAgICAgLmNoYW5uZWwgPSBNVDYzNjBfQ0hBTl8jI19pZHgsICAgICAgICAgICAgICAg ICAgICAgICAgICBcCj4gPiA+ICsgICAgIC5zY2FuX2luZGV4ID0gTVQ2MzYwX0NIQU5fIyNfaWR4 LCAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gPiArICAgICAuZXh0ZW5kX25hbWUgPSAjX2lk eCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ID4gKyAgICAgLmRhdGFz aGVldF9uYW1lID0gI19pZHgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiA+ ICsgICAgIC5zY2FuX3R5cGUgPSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAo+ID4gPiArICAgICAgICAgICAgIC5zaWduID0gJ3MnLCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFwKPiA+ID4gKyAgICAgICAgICAgICAucmVhbGJpdHMgPSAzMiwg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiA+ICsgICAgICAgICAgICAgLnN0 b3JhZ2ViaXRzID0gMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gPiArICAg ICAgICAgICAgIC5lbmRpYW5uZXNzID0gSUlPX0NQVSwgICAgICAgICAgICAgICAgICAgICAgICAg IFwKPiA+ID4gKyAgICAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCj4gPiA+ICsgICAgIC5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlP X0NIQU5fSU5GT19QUk9DRVNTRUQpLCAgICAgXAo+ID4gPiArICAgICAuaW5kZXhlZCA9IDEsICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ID4gK30KPiA+ID4g Kwo+ID4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIG10NjM2MF9hZGNfY2hh bm5lbHNbXSA9IHsKPiA+ID4gKyAgICAgTVQ2MzYwX0FEQ19DSEFOKFVTQklELCBJSU9fVk9MVEFH RSksCj4gPiA+ICsgICAgIE1UNjM2MF9BRENfQ0hBTihWQlVTRElWNSwgSUlPX1ZPTFRBR0UpLAo+ ID4gPiArICAgICBNVDYzNjBfQURDX0NIQU4oVkJVU0RJVjIsIElJT19WT0xUQUdFKSwKPiA+ID4g KyAgICAgTVQ2MzYwX0FEQ19DSEFOKFZTWVMsIElJT19WT0xUQUdFKSwKPiA+ID4gKyAgICAgTVQ2 MzYwX0FEQ19DSEFOKFZCQVQsIElJT19WT0xUQUdFKSwKPiA+ID4gKyAgICAgTVQ2MzYwX0FEQ19D SEFOKElCVVMsIElJT19DVVJSRU5UKSwKPiA+ID4gKyAgICAgTVQ2MzYwX0FEQ19DSEFOKElCQVQs IElJT19DVVJSRU5UKSwKPiA+ID4gKyAgICAgTVQ2MzYwX0FEQ19DSEFOKENIR19WRERQLCBJSU9f Vk9MVEFHRSksCj4gPiA+ICsgICAgIE1UNjM2MF9BRENfQ0hBTihURU1QX0pDLCBJSU9fVEVNUCks Cj4gPiA+ICsgICAgIE1UNjM2MF9BRENfQ0hBTihWUkVGX1RTLCBJSU9fVk9MVEFHRSksCj4gPiA+ ICsgICAgIE1UNjM2MF9BRENfQ0hBTihUUywgSUlPX1ZPTFRBR0UpLAo+ID4gPiArICAgICBJSU9f Q0hBTl9TT0ZUX1RJTUVTVEFNUChNVDYzNjBfQ0hBTl9NQVgpLAo+ID4gPiArfTsKPiA+ID4gKwo+ ID4gPiArc3RhdGljIGlycXJldHVybl90IG10NjM2MF9wbXVfYWRjX2RvbmVpX2hhbmRsZXIoaW50 IGlycSwgdm9pZCAqZGF0YSkKPiA+ID4gK3sKPiA+ID4gKyAgICAgc3RydWN0IG10NjM2MF9hZGNf ZGF0YSAqbWFkID0gaWlvX3ByaXYoZGF0YSk7Cj4gPiA+ICsKPiA+ID4gKyAgICAgY29tcGxldGUo Jm1hZC0+YWRjX2NvbXBsZXRlKTsKPiA+ID4gKyAgICAgcmV0dXJuIElSUV9IQU5ETEVEOwo+ID4g PiArfQo+ID4gPiArICAKPiA+IC4uLgo+ID4gIAo+ID4gPiArCj4gPiA+ICtzdGF0aWMgaW50IG10 NjM2MF9hZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+ID4gK3sKPiA+ ID4gKyAgICAgc3RydWN0IG10NjM2MF9hZGNfZGF0YSAqbWFkOwo+ID4gPiArICAgICBzdHJ1Y3Qg aWlvX2RldiAqaW5kaW9fZGV2Owo+ID4gPiArICAgICBpbnQgcmV0Owo+ID4gPiArCj4gPiA+ICsg ICAgIGluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yo Km1hZCkpOwo+ID4gPiArICAgICBpZiAoIWluZGlvX2RldikKPiA+ID4gKyAgICAgICAgICAgICBy ZXR1cm4gLUVOT01FTTsKPiA+ID4gKwo+ID4gPiArICAgICBtYWQgPSBpaW9fcHJpdihpbmRpb19k ZXYpOwo+ID4gPiArICAgICBtYWQtPmRldiA9ICZwZGV2LT5kZXY7Cj4gPiA+ICsgICAgIGluaXRf Y29tcGxldGlvbigmbWFkLT5hZGNfY29tcGxldGUpOwo+ID4gPiArICAgICBtdXRleF9pbml0KCZt YWQtPmFkY19sb2NrKTsKPiA+ID4gKwo+ID4gPiArICAgICBtYWQtPnJlZ21hcCA9IGRldl9nZXRf cmVnbWFwKHBkZXYtPmRldi5wYXJlbnQsIE5VTEwpOwo+ID4gPiArICAgICBpZiAoIW1hZC0+cmVn bWFwKSB7Cj4gPiA+ICsgICAgICAgICAgICAgZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRv IGdldCBwYXJlbnQgcmVnbWFwXG4iKTsKPiA+ID4gKyAgICAgICAgICAgICByZXR1cm4gLUVOT0RF VjsKPiA+ID4gKyAgICAgfQo+ID4gPiArCj4gPiA+ICsgICAgIHJldCA9IG10NjM2MF9hZGNfcmVz ZXQobWFkKTsKPiA+ID4gKyAgICAgaWYgKHJldCA8IDApIHsKPiA+ID4gKyAgICAgICAgICAgICBk ZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVzZXQgYWRjXG4iKTsKPiA+ID4gKyAgICAg ICAgICAgICByZXR1cm4gcmV0Owo+ID4gPiArICAgICB9Cj4gPiA+ICsKPiA+ID4gKyAgICAgbWFk LT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAiYWRjX2RvbmVpIik7Cj4gPiA+ ICsgICAgIGlmIChtYWQtPmlycSA8IDApIHsKPiA+ID4gKyAgICAgICAgICAgICBkZXZfZXJyKCZw ZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGFkY19kb25lIGlycVxuIik7Cj4gPiA+ICsgICAgICAg ICAgICAgcmV0dXJuIG1hZC0+aXJxOwo+ID4gPiArICAgICB9Cj4gPiA+ICsKPiA+ID4gKyAgICAg aXJxX3NldF9zdGF0dXNfZmxhZ3MobWFkLT5pcnEsIElSUV9OT0FVVE9FTik7ICAKPiA+Cj4gPiBB cyB3ZSBhcmUgZ29pbmcgdG8gaGF2ZSBhIHY1IGFueXdheSB0byBjbGVhbiB1cCB0aGF0IGVuZGlh biB3YXJuaW5nLAo+ID4gcGxlYXNlIGNvdWxkIHlvdSBhZGQgYSBjb21tZW50IHRvIGV4cGxhaW4g dGhlIG5lZWQgZm9yIElSUV9OT0FVVE9FTj8KPiA+ICAKPiAKPiBTYW1lIGFzIGFib3ZlICJFbmFi bGUgQURDIHdpbGwgcnVuIGFnYWluIGFuZCBhZ2FpbiB1bnRpbCBjbGVhcgo+IEFEQ19fQ0hBTnhf RU4gYml0Igo+IFNvIEFmdGVyIEkgZ2V0IHRoZSBBREMgcmVzdWx0LCBJIGRpc2FibGUgaXJxIGlu IG9yZGVyIHRvIGhhbmRsZSBvbmx5Cj4gb25lc2hvdCBkYXRhLgoKQXMgbWVudGlvbmVkIGEgYWJv dmUgSSBzdXNwZWN0IHlvdSBtYXkgYmUgYmV0dGVyIG9mZiBqdXN0IG5vdCB1c2luZwp0aGUgaW50 ZXJydXB0IGF0IGFsbC4KCj4gCj4gPiA+ICsgICAgIHJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRl ZF9pcnEoJnBkZXYtPmRldiwgbWFkLT5pcnEsIE5VTEwsIG10NjM2MF9wbXVfYWRjX2RvbmVpX2hh bmRsZXIsIDAsCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFk Y19kb25laSIsIGluZGlvX2Rldik7Cj4gPiA+ICsgICAgIGlmIChyZXQpIHsKPiA+ID4gKyAgICAg ICAgICAgICBkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgYWRjX2RvbmUg aXJxXG4iKTsKPiA+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gPiArICAgICB9Cj4g PiA+ICsKPiA+ID4gKyAgICAgaW5kaW9fZGV2LT5uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7 Cj4gPiA+ICsgICAgIGluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7Cj4gPiA+ICsg ICAgIGluZGlvX2Rldi0+aW5mbyA9ICZtdDYzNjBfYWRjX2lpb19pbmZvOwo+ID4gPiArICAgICBp bmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7Cj4gPiA+ICsgICAgIGluZGlvX2Rl di0+Y2hhbm5lbHMgPSBtdDYzNjBfYWRjX2NoYW5uZWxzOwo+ID4gPiArICAgICBpbmRpb19kZXYt Pm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUobXQ2MzYwX2FkY19jaGFubmVscyk7Cj4gPiA+ICsK PiA+ID4gKyAgICAgcmV0ID0gZGV2bV9paW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cCgmcGRldi0+ ZGV2LCBpbmRpb19kZXYsIE5VTEwsCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgbXQ2MzYwX2FkY190cmlnZ2VyX2hhbmRsZXIsIE5VTEwpOwo+ID4gPiAr ICAgICBpZiAocmV0KSB7Cj4gPiA+ICsgICAgICAgICAgICAgZGV2X2VycigmcGRldi0+ZGV2LCAi RmFpbGVkIHRvIGFsbG9jYXRlIGlpbyB0cmlnZ2VyIGJ1ZmZlclxuIik7Cj4gPiA+ICsgICAgICAg ICAgICAgcmV0dXJuIHJldDsKPiA+ID4gKyAgICAgfQo+ID4gPiArCj4gPiA+ICsgICAgIHJldCA9 IGRldm1faWlvX2RldmljZV9yZWdpc3RlcigmcGRldi0+ZGV2LCBpbmRpb19kZXYpOwo+ID4gPiAr ICAgICBpZiAocmV0KSB7Cj4gPiA+ICsgICAgICAgICAgICAgZGV2X2VycigmcGRldi0+ZGV2LCAi RmFpbGVkIHRvIHJlZ2lzdGVyIGlpbyBkZXZpY2VcbiIpOwo+ID4gPiArICAgICAgICAgICAgIHJl dHVybiByZXQ7Cj4gPiA+ICsgICAgIH0KPiA+ID4gKwo+ID4gPiArICAgICByZXR1cm4gMDsKPiA+ ID4gK30gIAo+ID4gLi4uICAKCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5l bEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4v bGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=