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=-9.6 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 30150C5517A for ; Mon, 26 Oct 2020 06:45:31 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E31B122282 for ; Mon, 26 Oct 2020 06:45:30 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="jpP6BirE" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1770653AbgJZGpa (ORCPT ); Mon, 26 Oct 2020 02:45:30 -0400 Received: from mail-ot1-f65.google.com ([209.85.210.65]:35590 "EHLO mail-ot1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1420544AbgJZGp3 (ORCPT ); Mon, 26 Oct 2020 02:45:29 -0400 Received: by mail-ot1-f65.google.com with SMTP id n11so7101142ota.2; Sun, 25 Oct 2020 23:45:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=teElRtzazUJIA66EUGlw1atkA2G++mQK2BC4XLZcb4c=; b=jpP6BirEFeTpGu9RXU18fmAhbkJugB4WuBIqAselgTVsVn+Q18qzqQt1MsgId+ZCDZ I87hO8fToJHLNOoAjEAU9ZinEmxy3wU9MB1oXEl/0cE8iv2EZ+2tEuN1xH/D9wSX+7+E 1Y94nxPwTl1NkZuk7b/aCuEbupcaXcmDKRKEWRkLhwpPSJsN90eTBkQsgR0/HQNS3QB/ T5o/mAcTX8ZMIJYsm7y7FY0EB+YmvbaN2M2yCPLGUTzRenk8/2o9jXCxilyLaiwlnxis p8bSSeOswH+s5IhtBhWi6atyWAEQmILWHDeokmHqSVsZVTuDyBR97m6PABg8lj82QbP1 E5Ug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=teElRtzazUJIA66EUGlw1atkA2G++mQK2BC4XLZcb4c=; b=i6r58J1+Yc9NjhQ7m96fkNFgDPtUMxtbsZT32iUMKHBZ+9NwtnuI3sTDtCwu8JN2Iq tMQhXIZJsVZokcwylRXzs9KHYv/N5bhFqcdc2/S6eewg0VPvzE6TurDk/aq7If7vOpFd wgSBnS41vsFUH517xsHErzRZZbmBBvSmjMRY8bCftDQHKaipghaXQdJVSHXPkHnV40zi QVaL5OA5lQNQjSUe/2qlapvBalG2Dpf/BoSySgqV/1WeRa2DXFSbbbRosNP3IcDo2qhM MEL0o86pI3TQ/Cdks1glGyEUrB7MZ9gCI1mqt4lv3XESHZBhwju9609/f7JW67e+ezDl pWJg== X-Gm-Message-State: AOAM533JxsDHmRo/otAHfkDyb+bcRdgJCRTwGivt51qgy7qI6pfKmUzo 93W0qvK1b0OKotsqrGVjfT4/Oggkqz+PaX94ai8= X-Google-Smtp-Source: ABdhPJwFsXKG22rI6SzM+k/5kSPHIrBdMXZZFIgtax2lWQxwzN5Lt2ce9zWtF7wAM1Pc2csydDP6DQrWGJaUN0cdC5A= X-Received: by 2002:a9d:65c7:: with SMTP id z7mr13322991oth.327.1603694724787; Sun, 25 Oct 2020 23:45:24 -0700 (PDT) MIME-Version: 1.0 References: <1600859910-15855-1-git-send-email-gene.chen.richtek@gmail.com> <1600859910-15855-2-git-send-email-gene.chen.richtek@gmail.com> <20201016155227.GB9890@kozik-lap> In-Reply-To: <20201016155227.GB9890@kozik-lap> From: Gene Chen Date: Mon, 26 Oct 2020 14:45:12 +0800 Message-ID: Subject: Re: [PATCH 2/2] power: supply: mt6360_charger: add MT6360 charger support To: Krzysztof Kozlowski Cc: sre@kernel.org, Matthias Brugger , Rob Herring , linux-pm@vger.kernel.org, devicetree , linux-arm Mailing List , "moderated list:ARM/Mediatek SoC support" , Linux Kernel Mailing List , Gene Chen , cy_huang@richtek.com, shufan_lee@richtek.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Krzysztof Kozlowski =E6=96=BC 2020=E5=B9=B410=E6=9C=8816= =E6=97=A5 =E9=80=B1=E4=BA=94 =E4=B8=8B=E5=8D=8811:52=E5=AF=AB=E9=81=93=EF= =BC=9A > > On Wed, Sep 23, 2020 at 07:18:30PM +0800, Gene Chen wrote: > > From: Gene Chen > > > > Add basic support for the battery charger for MT6360 PMIC > > > > Signed-off-by: Gene Chen > > --- > > drivers/power/supply/Kconfig | 11 + > > drivers/power/supply/Makefile | 1 + > > drivers/power/supply/mt6360_charger.c | 1190 +++++++++++++++++++++++++= ++++++++ > > 3 files changed, 1202 insertions(+) > > create mode 100644 drivers/power/supply/mt6360_charger.c > > > > diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfi= g > > index faf2830..1beb6a4 100644 > > --- a/drivers/power/supply/Kconfig > > +++ b/drivers/power/supply/Kconfig > > @@ -562,6 +562,17 @@ config CHARGER_MP2629 > > Battery charger. This driver provides Battery charger power man= agement > > functions on the systems. > > > > +config CHARGER_MT6360 > > + tristate "Mediatek MT6360 Charger Driver" > > + depends on MFD_MT6360 > > || COMPILE_TEST > (and test if it really compiles) > > > + depends on REGULATOR > > + select EXTCON > > Drivers should in general not select other user-selectable symbols, so > this should be rather depends. > ACK, I remove extcon device register which may be register by usb driver. > > + help > > + Say Y here to enable MT6360 Charger Part. > > + support High-Accuracy Voltage/Current Regulation, > > "The device suppports ..." > ACK > > + Average Input Current Regulation, Battery Tempature Sensing, > > + Over-Temperature Protection, DPDM Detection for BC1.2 > > + > > config CHARGER_QCOM_SMBB > > tristate "Qualcomm Switch-Mode Battery Charger and Boost" > > depends on MFD_SPMI_PMIC || COMPILE_TEST > > diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makef= ile > > index b3c694a..9abecb9c 100644 > > --- a/drivers/power/supply/Makefile > > +++ b/drivers/power/supply/Makefile > > @@ -77,6 +77,7 @@ obj-$(CONFIG_CHARGER_MAX77693) +=3D max77693_cha= rger.o > > obj-$(CONFIG_CHARGER_MAX8997) +=3D max8997_charger.o > > obj-$(CONFIG_CHARGER_MAX8998) +=3D max8998_charger.o > > obj-$(CONFIG_CHARGER_MP2629) +=3D mp2629_charger.o > > +obj-$(CONFIG_CHARGER_MT6360) +=3D mt6360_charger.o > > obj-$(CONFIG_CHARGER_QCOM_SMBB) +=3D qcom_smbb.o > > obj-$(CONFIG_CHARGER_BQ2415X) +=3D bq2415x_charger.o > > obj-$(CONFIG_CHARGER_BQ24190) +=3D bq24190_charger.o > > diff --git a/drivers/power/supply/mt6360_charger.c b/drivers/power/supp= ly/mt6360_charger.c > > new file mode 100644 > > index 0000000..70e3fb6 > > --- /dev/null > > +++ b/drivers/power/supply/mt6360_charger.c > > @@ -0,0 +1,1190 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* > > + * Copyright (c) 2019 MediaTek Inc. > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#define MT6360_PMU_CHG_CTRL1 (0x11) > > Drop all the brackets. > ACK > > +#define MT6360_PMU_CHG_CTRL2 (0x12) > > +#define MT6360_PMU_CHG_CTRL3 (0x13) > > +#define MT6360_PMU_CHG_CTRL4 (0x14) > > +#define MT6360_PMU_CHG_CTRL5 (0x15) > > +#define MT6360_PMU_CHG_CTRL6 (0x16) > > +#define MT6360_PMU_CHG_CTRL7 (0x17) > > +#define MT6360_PMU_CHG_CTRL8 (0x18) > > +#define MT6360_PMU_CHG_CTRL9 (0x19) > > +#define MT6360_PMU_CHG_CTRL10 (0x1A) > > +#define MT6360_PMU_CHG_CTRL11 (0x1B) > > +#define MT6360_PMU_CHG_CTRL12 (0x1C) > > +#define MT6360_PMU_CHG_CTRL13 (0x1D) > > +#define MT6360_PMU_DEVICE_TYPE (0x22) > > +#define MT6360_PMU_USB_STATUS1 (0x27) > > +#define MT6360_PMU_CHG_CTRL17 (0x2B) > > +#define MT6360_PMU_CHG_CTRL18 (0x2C) > > +#define MT6360_PMU_CHG_STAT (0x4A) > > +#define MT6360_PMU_CHG_CTRL19 (0x61) > > +#define MT6360_PMU_FOD_STAT (0xE7) > > + > > +/* 0x11 */ > > Use name, not value in comment. > > > +#define MT6360_MASK_FSLP BIT(3) > > Here and below - reverse the naming so: > MT6360_FSLP_MASK > MT6360_FSLP_SHIFT > > Also don't duplicate the values, so: > #define MT6360_FSLP_MASK BIT(MT6360_FSLP_SHIFT) > at least where this is only BIT(). > ACK > > +#define MT6360_SHFT_FSLP (3) > > +#define MT6360_MASK_HIZ BIT(2) > > +#define MT6360_SHFT_HIZ (2) > > +#define MT6360_MASK_OPA_MODE BIT(0) > > +#define MT6360_SHFT_OPA_MODE (0) > > +/* 0x12 */ > > +#define MT6360_MASK_TE BIT(4) > > +#define MT6360_SHFT_TE (4) > > +#define MT6360_MASK_IINLMTSEL GENMASK(3, 2) > > +#define MT6360_SHFT_IINLMTSEL (2) > > +#define MT6360_MASK_CHG_EN BIT(0) > > +#define MT6360_SHFT_CHG_EN (0) > > +/* 0x13 */ > > +#define MT6360_MASK_IAICR GENMASK(7, 2) > > +#define MT6360_SHFT_IAICR (2) > > +#define MT6360_MASK_ILIM_EN BIT(0) > > +/* 0x14 */ > > +#define MT6360_MASK_VOREG GENMASK(7, 1) > > +#define MT6360_SHFT_VOREG (1) > > +/* 0x15 */ > > +#define MT6360_MASK_VOBST GENMASK(7, 2) > > +/* 0x16 */ > > +#define MT6360_MASK_VMIVR GENMASK(7, 1) > > +#define MT6360_SHFT_VMIVR (1) > > +/* 0x17 */ > > +#define MT6360_MASK_ICHG GENMASK(7, 2) > > +#define MT6360_SHFT_ICHG (2) > > +/* 0x18 */ > > +#define MT6360_MASK_IPREC GENMASK(3, 0) > > +#define MT6360_SHFT_IPREC (0) > > +/* 0x19 */ > > +#define MT6360_MASK_IEOC GENMASK(7, 4) > > +#define MT6360_SHFT_IEOC (4) > > +/* 0x1A */ > > +#define MT6360_MASK_LBP GENMASK(7, 4) > > +#define MT6360_SHFT_LBP (4) > > +#define MT6360_MASK_OTG_OC GENMASK(3, 0) > > +#define MT6360_SHFT_OTG_OC (0) > > +/* 0x1B */ > > +#define MT6360_MASK_SYSREG GENMASK(4, 2) > > +#define MT6360_SHFT_SYSREG (2) > > +#define MT6360_MASK_VREC GENMASK(2, 0) > > +#define MT6360_SHFT_VREC (0) > > +/* 0x1C */ > > +#define MT6360_MASK_WT_FC GENMASK(7, 5) > > +#define MT6360_SHFT_WT_FC (5) > > +/* 0x1D */ > > +#define MT6360_MASK_CHG_WDT_EN BIT(7) > > +#define MT6360_SHFT_CHG_WDT_EN (7) > > +#define MT6360_MASK_CHG_WDT GENMASK(5, 4) > > +#define MT6360_SHFT_CHG_WDT (4) > > +/* 0x22 */ > > +#define MT6360_MASK_USBCHGEN BIT(7) > > +#define MT6360_SHFT_USBCHGEN (7) > > +/* 0x27 */ > > +#define MT6360_MASK_USB_STATUS GENMASK(6, 4) > > +#define MT6360_SHFT_USB_STATUS (4) > > +/* 0x2C */ > > +#define MT6360_MASK_BAT_COMP GENMASK(5, 3) > > +#define MT6360_SHFT_BAT_COMP (3) > > +#define MT6360_MASK_VCLAMP GENMASK(2, 0) > > +#define MT6360_SHFT_VCLAMP (0) > > +/* 0x4A */ > > +#define MT6360_MASK_CHG_STAT GENMASK(7, 6) > > +#define MT6360_SHFT_CHG_STAT (6) > > +#define MT6360_MASK_VBAT_LVL BIT(5) > > +/* 0x61 */ > > +#define MT6360_MASK_VINOVP GENMASK(6, 5) > > +#define MT6360_SHFT_VINOVP (5) > > +/* 0xE7 */ > > +#define MT6360_MASK_CHRDET_EXT BIT(4) > > +#define MT6360_SHFT_CHRDET_EXT (4) > > + > > +/* uA */ > > +#define MT6360_ICHG_MIN 100000 > > +#define MT6360_ICHG_MAX 5000000 > > +#define MT6360_ICHG_STEP 100000 > > +/* uV */ > > +#define MT6360_VOREG_MIN 3900000 > > +#define MT6360_VOREG_MAX 4710000 > > +#define MT6360_VOREG_STEP 10000 > > +/* uA */ > > +#define MT6360_AICR_MIN 100000 > > +#define MT6360_AICR_MAX 3250000 > > +#define MT6360_AICR_STEP 50000 > > +/* uA */ > > +#define MT6360_IPREC_MIN 100000 > > +#define MT6360_IPREC_MAX 850000 > > +#define MT6360_IPREC_STEP 50000 > > +/* uA */ > > +#define MT6360_IEOC_MIN 100000 > > +#define MT6360_IEOC_MAX 850000 > > +#define MT6360_IEOC_STEP 50000 > > + > > +struct mt6360_chg_platform_data { > > + u32 vinovp; > > +}; > > + > > +struct mt6360_chg_info { > > + struct device *dev; > > + struct mt6360_chg_platform_data *pdata; > > + struct regmap *regmap; > > + struct extcon_dev *edev; > > + struct power_supply_desc psy_desc; > > + struct power_supply *psy; > > + struct regulator_desc otg_rdesc; > > This looks unused. > ACK, I will remove it. > > + struct regulator_dev *otg_rdev; > > + struct mutex chgdet_lock; > > + bool pwr_rdy; > > + bool bc12_en; > > + int psy_usb_type; > > + struct work_struct chrdet_work; > > +}; > > + > > +static struct mt6360_chg_platform_data def_platform_data =3D { > > + .vinovp =3D 6500000, > > +}; > > + > > +struct mt6360_irq_desc { > > + const char *name; > > + irq_handler_t irq_handler; > > +}; > > + > > +enum mt6360_iinlmtsel { > > + MT6360_IINLMTSEL_AICR_3250 =3D 0, > > + MT6360_IINLMTSEL_CHG_TYPE, > > + MT6360_IINLMTSEL_AICR, > > + MT6360_IINLMTSEL_LOWER_LEVEL, > > +}; > > + > > +enum mt6360_pmu_chg_type { > > + MT6360_CHG_TYPE_NOVBUS =3D 0, > > + MT6360_CHG_TYPE_UNDER_GOING, > > + MT6360_CHG_TYPE_SDP, > > + MT6360_CHG_TYPE_SDPNSTD, > > + MT6360_CHG_TYPE_DCP, > > + MT6360_CHG_TYPE_CDP, > > + MT6360_CHG_TYPE_MAX, > > +}; > > + > > +static enum power_supply_usb_type mt6360_charger_usb_types[] =3D { > > + POWER_SUPPLY_USB_TYPE_UNKNOWN, > > + POWER_SUPPLY_USB_TYPE_SDP, > > + POWER_SUPPLY_USB_TYPE_DCP, > > + POWER_SUPPLY_USB_TYPE_CDP, > > + POWER_SUPPLY_USB_TYPE_C, > > + POWER_SUPPLY_USB_TYPE_PD, > > + POWER_SUPPLY_USB_TYPE_PD_DRP, > > + POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID > > +}; > > + > > +static inline unsigned int mt6360_trans_reg_sel(u32 data, u32 min_val,= u32 step, > > + u32 max_sel) > > Drop all inlines. > ACK > > +{ > > + unsigned int target =3D 0; > > + > > + if (data >=3D min_val) > > + target =3D (data - min_val) / step; > > + if (target > max_sel) > > + target =3D max_sel; > > + return target; > > +} > > + > > +static inline int mt6360_get_chrdet_ext_stat(struct mt6360_chg_info *m= ci, > > + bool *pwr_rdy) > > +{ > > + int ret; > > + unsigned int regval; > > + > > + ret =3D regmap_read(mci->regmap, MT6360_PMU_FOD_STAT, ®val); > > + if (ret < 0) > > + return ret; > > + *pwr_rdy =3D (regval & MT6360_MASK_CHRDET_EXT) ? true : false; > > + return 0; > > +} > > + > > +static int mt6360_charger_get_online(struct mt6360_chg_info *mci, > > + union power_supply_propval *val) > > +{ > > + int ret; > > + bool pwr_rdy; > > + > > + ret =3D mt6360_get_chrdet_ext_stat(mci, &pwr_rdy); > > + if (ret < 0) > > + return ret; > > + val->intval =3D pwr_rdy ? true : false; > > + return 0; > > +} > > + > > +static int mt6360_charger_get_status(struct mt6360_chg_info *mci, > > + union power_supply_propval *val) > > +{ > > + int status, ret; > > + unsigned int regval; > > + bool pwr_rdy; > > + > > + ret =3D mt6360_get_chrdet_ext_stat(mci, &pwr_rdy); > > + if (ret < 0) > > + return ret; > > + if (!pwr_rdy) { > > + status =3D POWER_SUPPLY_STATUS_DISCHARGING; > > + goto out; > > + } > > + > > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_STAT, ®val); > > + if (ret < 0) > > + return ret; > > + regval &=3D MT6360_MASK_CHG_STAT; > > + regval >>=3D MT6360_SHFT_CHG_STAT; > > + switch (regval) { > > + case 0x0: > > + status =3D POWER_SUPPLY_STATUS_NOT_CHARGING; > > + break; > > + case 0x1: > > + status =3D POWER_SUPPLY_STATUS_CHARGING; > > + break; > > + case 0x2: > > + status =3D POWER_SUPPLY_STATUS_FULL; > > + break; > > + default: > > + ret =3D -EIO; > > + } > > +out: > > + if (!ret) > > + val->intval =3D status; > > + return ret; > > +} > > + > > +static int mt6360_charger_get_charge_type(struct mt6360_chg_info *mci, > > + union power_supply_propval *val= ) > > +{ > > + int type, ret; > > + unsigned int regval; > > + u8 chg_stat; > > + > > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_STAT, ®val); > > + if (ret < 0) > > + return ret; > > + chg_stat =3D (regval & MT6360_MASK_CHG_STAT) >> MT6360_SHFT_CHG_S= TAT; > > + switch (chg_stat) { > > + case 0x00: /* Not Charging */ > > + type =3D POWER_SUPPLY_CHARGE_TYPE_NONE; > > + break; > > + case 0x01: /* Charge in Progress */ > > + if (regval & MT6360_MASK_VBAT_LVL) > > + type =3D POWER_SUPPLY_CHARGE_TYPE_FAST; > > + else > > + type =3D POWER_SUPPLY_CHARGE_TYPE_TRICKLE; > > + break; > > + case 0x02: /* Charge Done */ > > + type =3D POWER_SUPPLY_CHARGE_TYPE_NONE; > > + break; > > + case 0x03: /* Charge Fault */ > > + type =3D POWER_SUPPLY_STATUS_UNKNOWN; > > + break; > > + default: > > + break; > > + } > > + val->intval =3D type; > > + return 0; > > +} > > + > > +static int mt6360_charger_get_ichg(struct mt6360_chg_info *mci, > > + union power_supply_propval *val) > > +{ > > + int ichg, ret; > > + unsigned int regval; > > + > > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL7, ®val); > > + if (ret < 0) > > + return ret; > > + regval =3D (regval & MT6360_MASK_ICHG) >> MT6360_SHFT_ICHG; > > + ichg =3D MT6360_ICHG_MIN + (regval * MT6360_ICHG_STEP); > > + if (ichg > MT6360_ICHG_MAX) > > + ichg =3D MT6360_ICHG_MAX; > > + val->intval =3D ichg; > > + return 0; > > +} > > + > > +static int mt6360_charger_get_max_ichg(struct mt6360_chg_info *mci, > > + union power_supply_propval *val) > > +{ > > + val->intval =3D MT6360_ICHG_MAX; > > + return 0; > > +} > > + > > +static int mt6360_charger_get_cv(struct mt6360_chg_info *mci, > > + union power_supply_propval *val) > > +{ > > + int cv, ret; > > + unsigned int regval; > > + > > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL4, ®val); > > + if (ret < 0) > > + return ret; > > + regval =3D (regval & MT6360_MASK_VOREG) >> MT6360_SHFT_VOREG; > > + cv =3D MT6360_VOREG_MIN + (regval * MT6360_VOREG_STEP); > > + if (cv > MT6360_VOREG_MAX) > > + cv =3D MT6360_VOREG_MAX; > > + val->intval =3D cv; > > + return 0; > > +} > > + > > +static int mt6360_charger_get_max_cv(struct mt6360_chg_info *mci, > > + union power_supply_propval *val) > > +{ > > + val->intval =3D MT6360_VOREG_MAX; > > + return 0; > > +} > > + > > +static int mt6360_charger_get_aicr(struct mt6360_chg_info *mci, > > + union power_supply_propval *val) > > +{ > > + int ret; > > + unsigned int regval; > > + > > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL3, ®val); > > + if (ret < 0) > > + return ret; > > + regval =3D (regval & MT6360_MASK_IAICR) >> MT6360_SHFT_IAICR; > > + val->intval =3D MT6360_AICR_MIN + (regval * MT6360_AICR_STEP); > > + return 0; > > +} > > + > > +static int mt6360_charger_get_iprechg(struct mt6360_chg_info *mci, > > + union power_supply_propval *val) > > +{ > > + int ret; > > + unsigned int regval; > > + > > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL8, ®val); > > + if (ret < 0) > > + return ret; > > + regval =3D (regval & MT6360_MASK_IPREC) >> MT6360_SHFT_IPREC; > > + val->intval =3D MT6360_IPREC_MIN + (regval * MT6360_IPREC_STEP); > > + return 0; > > +} > > + > > +static int mt6360_charger_get_ieoc(struct mt6360_chg_info *mci, > > + union power_supply_propval *val) > > +{ > > + int ret; > > + unsigned int regval; > > + > > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL9, ®val); > > + if (ret < 0) > > + return ret; > > + regval =3D (regval & MT6360_MASK_IEOC) >> MT6360_SHFT_IEOC; > > + val->intval =3D MT6360_IEOC_MIN + (regval * MT6360_IEOC_STEP); > > + return 0; > > +} > > + > > +static int mt6360_charger_set_online(struct mt6360_chg_info *mci, > > + const union power_supply_propval *va= l) > > +{ > > + u8 force_sleep =3D val->intval ? 0 : 1; > > + > > + return regmap_update_bits(mci->regmap, MT6360_PMU_CHG_CTRL1, > > + MT6360_MASK_FSLP, > > + force_sleep << MT6360_SHFT_FSLP); > > +} > > + > > +static int mt6360_charger_set_ichg(struct mt6360_chg_info *mci, > > + const union power_supply_propval *val) > > +{ > > + unsigned int regval; > > + > > + regval =3D mt6360_trans_reg_sel(val->intval, 100000, 100000, 0x31= ); > > + return regmap_update_bits(mci->regmap, MT6360_PMU_CHG_CTRL7, > > + MT6360_MASK_ICHG, regval << MT6360_SHFT= _ICHG); > > +} > > + > > +static int mt6360_charger_set_cv(struct mt6360_chg_info *mci, > > + const union power_supply_propval *val) > > +{ > > + unsigned int regval; > > + > > + regval =3D mt6360_trans_reg_sel(val->intval, 3900000, 10000, 0x51= ); > > + return regmap_update_bits(mci->regmap, > > + MT6360_PMU_CHG_CTRL4, > > + MT6360_MASK_VOREG, > > + regval << MT6360_SHFT_VOREG); > > +} > > + > > +static int mt6360_charger_set_aicr(struct mt6360_chg_info *mci, > > + const union power_supply_propval *val) > > +{ > > + unsigned int regval; > > + > > + regval =3D mt6360_trans_reg_sel(val->intval, 100000, 50000, 0x3F)= ; > > + return regmap_update_bits(mci->regmap, > > + MT6360_PMU_CHG_CTRL3, > > + MT6360_MASK_IAICR, > > + regval << MT6360_SHFT_IAICR); > > +} > > + > > +static int mt6360_charger_set_iprechg(struct mt6360_chg_info *mci, > > + const union power_supply_propval *v= al) > > +{ > > + unsigned int regval; > > + > > + regval =3D mt6360_trans_reg_sel(val->intval, 100000, 50000, 0x0F)= ; > > + return regmap_update_bits(mci->regmap, > > + MT6360_PMU_CHG_CTRL8, > > + MT6360_MASK_IPREC, > > + regval << MT6360_SHFT_IPREC); > > +} > > + > > +static int mt6360_charger_set_ieoc(struct mt6360_chg_info *mci, > > + const union power_supply_propval *val) > > +{ > > + unsigned int regval; > > + > > + regval =3D mt6360_trans_reg_sel(val->intval, 100000, 50000, 0x0F)= ; > > + return regmap_update_bits(mci->regmap, > > + MT6360_PMU_CHG_CTRL9, > > + MT6360_MASK_IEOC, > > + regval << MT6360_SHFT_IEOC); > > +} > > + > > +static int mt6360_charger_get_property(struct power_supply *psy, > > + enum power_supply_property psp, > > + union power_supply_propval *val) > > +{ > > + struct mt6360_chg_info *mci =3D power_supply_get_drvdata(psy); > > + int ret =3D 0; > > + > > + dev_dbg(mci->dev, "%s: prop =3D %d\n", __func__, psp); > > + switch (psp) { > > + case POWER_SUPPLY_PROP_ONLINE: > > + ret =3D mt6360_charger_get_online(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_STATUS: > > + ret =3D mt6360_charger_get_status(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_CHARGE_TYPE: > > + ret =3D mt6360_charger_get_charge_type(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: > > + ret =3D mt6360_charger_get_ichg(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX: > > + ret =3D mt6360_charger_get_max_ichg(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: > > + ret =3D mt6360_charger_get_cv(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX: > > + ret =3D mt6360_charger_get_max_cv(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: > > + ret =3D mt6360_charger_get_aicr(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_PRECHARGE_CURRENT: > > + ret =3D mt6360_charger_get_iprechg(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: > > + ret =3D mt6360_charger_get_ieoc(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_USB_TYPE: > > + val->intval =3D mci->psy_usb_type; > > + break; > > + default: > > + ret =3D -ENODATA; > > + } > > + return ret; > > +} > > + > > +static int mt6360_charger_set_property(struct power_supply *psy, > > + enum power_supply_property psp, > > + const union power_supply_propval *= val) > > +{ > > + struct mt6360_chg_info *mci =3D power_supply_get_drvdata(psy); > > + int ret; > > + > > + dev_dbg(mci->dev, "%s: prop =3D %d\n", __func__, psp); > > + switch (psp) { > > + case POWER_SUPPLY_PROP_ONLINE: > > + ret =3D mt6360_charger_set_online(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: > > + ret =3D mt6360_charger_set_ichg(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: > > + ret =3D mt6360_charger_set_cv(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: > > + ret =3D mt6360_charger_set_aicr(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_PRECHARGE_CURRENT: > > + ret =3D mt6360_charger_set_iprechg(mci, val); > > + break; > > + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: > > + ret =3D mt6360_charger_set_ieoc(mci, val); > > + break; > > + default: > > + ret =3D -EINVAL; > > + } > > + return ret; > > +} > > + > > +static int mt6360_charger_property_is_writeable(struct power_supply *p= sy, > > + enum power_supply_property= psp) > > +{ > > + switch (psp) { > > + case POWER_SUPPLY_PROP_ONLINE: > > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: > > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: > > + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: > > + case POWER_SUPPLY_PROP_PRECHARGE_CURRENT: > > + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: > > + return 1; > > + default: > > + return 0; > > + } > > +} > > + > > +static enum power_supply_property mt6360_charger_properties[] =3D { > > + POWER_SUPPLY_PROP_ONLINE, > > + POWER_SUPPLY_PROP_STATUS, > > + POWER_SUPPLY_PROP_CHARGE_TYPE, > > + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, > > + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX, > > + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, > > + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX, > > + POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, > > + POWER_SUPPLY_PROP_PRECHARGE_CURRENT, > > + POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT, > > + POWER_SUPPLY_PROP_USB_TYPE, > > +}; > > + > > +static char *mt6360_charger_supplied_to[] =3D { > > + "main-battery" > > +}; > > + > > +static const struct power_supply_desc mt6360_charger_desc =3D { > > + .type =3D POWER_SUPPLY_TYPE_USB, > > + .properties =3D mt6360_charger_properties, > > + .num_properties =3D ARRAY_SIZE(mt6360_charger_properties)= , > > + .get_property =3D mt6360_charger_get_property, > > + .set_property =3D mt6360_charger_set_property, > > + .property_is_writeable =3D mt6360_charger_property_is_writeable, > > + .usb_types =3D mt6360_charger_usb_types, > > + .num_usb_types =3D ARRAY_SIZE(mt6360_charger_usb_types), > > +}; > > + > > +static const struct regulator_ops mt6360_chg_otg_ops =3D { > > + .list_voltage =3D regulator_list_voltage_linear, > > + .enable =3D regulator_enable_regmap, > > + .disable =3D regulator_disable_regmap, > > + .is_enabled =3D regulator_is_enabled_regmap, > > + .set_voltage_sel =3D regulator_set_voltage_sel_regmap, > > + .get_voltage_sel =3D regulator_get_voltage_sel_regmap, > > +}; > > + > > +static const struct regulator_desc mt6360_otg_rdesc =3D { > > + .of_match =3D "usb-otg-vbus", > > + .name =3D "usb-otg-vbus", > > + .ops =3D &mt6360_chg_otg_ops, > > + .owner =3D THIS_MODULE, > > + .type =3D REGULATOR_VOLTAGE, > > + .min_uV =3D 4425000, > > + .uV_step =3D 25000, /* step 25mV */ > > + .n_voltages =3D 57, /* 4425mV to 5825mV */ > > + .vsel_reg =3D MT6360_PMU_CHG_CTRL5, > > + .vsel_mask =3D MT6360_MASK_VOBST, > > + .enable_reg =3D MT6360_PMU_CHG_CTRL1, > > + .enable_mask =3D MT6360_MASK_OPA_MODE, > > +}; > > + > > +static const unsigned int mt6360_extcon_cable[] =3D { > > + EXTCON_USB, > > + EXTCON_USB_HOST, > > + EXTCON_CHG_USB_SDP, > > + EXTCON_CHG_USB_DCP, > > + EXTCON_CHG_USB_CDP, > > + EXTCON_CHG_USB_SLOW, /* For NonStandard Charger */ > > + EXTCON_NONE, > > +}; > > + > > +static irqreturn_t mt6360_pmu_chg_treg_evt_handler(int irq, void *data= ) > > +{ > > + struct mt6360_chg_info *mci =3D data; > > + > > + dev_warn(mci->dev, "%s\n", __func__); > > + return IRQ_HANDLED; > > +} > > + > > +static irqreturn_t mt6360_pmu_pwr_rdy_evt_handler(int irq, void *data) > > +{ > > + struct mt6360_chg_info *mci =3D data; > > + > > + dev_dbg(mci->dev, "%s\n", __func__); > > + return IRQ_HANDLED; > > +} > > + > > +static irqreturn_t mt6360_pmu_chg_batsysuv_evt_handler(int irq, void *= data) > > +{ > > + struct mt6360_chg_info *mci =3D data; > > + > > + dev_warn(mci->dev, "%s\n", __func__); > > + return IRQ_HANDLED; > > +} > > + > > +static irqreturn_t mt6360_pmu_chg_vsysuv_evt_handler(int irq, void *da= ta) > > +{ > > + struct mt6360_chg_info *mci =3D data; > > + > > + dev_warn(mci->dev, "%s\n", __func__); > > + return IRQ_HANDLED; > > +} > > + > > +static irqreturn_t mt6360_pmu_chg_vsysov_evt_handler(int irq, void *da= ta) > > +{ > > + struct mt6360_chg_info *mci =3D data; > > + > > + dev_warn(mci->dev, "%s\n", __func__); > > + return IRQ_HANDLED; > > +} > > + > > +static irqreturn_t mt6360_pmu_chg_vbatov_evt_handler(int irq, void *da= ta) > > +{ > > + struct mt6360_chg_info *mci =3D data; > > + > > + dev_warn(mci->dev, "%s\n", __func__); > > + return IRQ_HANDLED; > > +} > > + > > +static irqreturn_t mt6360_pmu_chg_vbusov_evt_handler(int irq, void *da= ta) > > +{ > > + struct mt6360_chg_info *mci =3D data; > > + > > + dev_warn(mci->dev, "%s\n", __func__); > > + return IRQ_HANDLED; > > +} > > + > > +static irqreturn_t mt6360_pmu_chg_aiccmeasl_handler(int irq, void *dat= a) > > +{ > > + struct mt6360_chg_info *mci =3D data; > > + > > + dev_dbg(mci->dev, "%s\n", __func__); > > + return IRQ_HANDLED; > > +} > > + > > +static irqreturn_t mt6360_pmu_wdtmri_handler(int irq, void *data) > > +{ > > + struct mt6360_chg_info *mci =3D data; > > + > > + dev_dbg(mci->dev, "%s\n", __func__); > > + return IRQ_HANDLED; > > +} > > + > > +static irqreturn_t mt6360_pmu_chg_rechgi_handler(int irq, void *data) > > +{ > > + struct mt6360_chg_info *mci =3D data; > > + > > + dev_dbg(mci->dev, "%s\n", __func__); > > + return IRQ_HANDLED; > > +} > > + > > +static irqreturn_t mt6360_pmu_chg_termi_handler(int irq, void *data) > > +{ > > + struct mt6360_chg_info *mci =3D data; > > + > > + dev_dbg(mci->dev, "%s\n", __func__); > > + return IRQ_HANDLED; > > +} > > + > > +static irqreturn_t mt6360_pmu_chg_ieoci_handler(int irq, void *data) > > +{ > > + struct mt6360_chg_info *mci =3D data; > > + > > + dev_dbg(mci->dev, "%s\n", __func__); > > + return IRQ_HANDLED; > > +} > > + > > +static irqreturn_t mt6360_pmu_pumpx_donei_handler(int irq, void *data) > > +{ > > + struct mt6360_chg_info *mci =3D data; > > + > > + dev_dbg(mci->dev, "%s\n", __func__); > > All this is looks bogus. > ACK > > + return IRQ_HANDLED; > > +} > > + > > +static irqreturn_t mt6360_pmu_attach_i_handler(int irq, void *data) > > +{ > > + struct mt6360_chg_info *mci =3D data; > > + int ret, chg_type =3D EXTCON_NONE; > > + unsigned int usb_status; > > + int last_usb_type; > > + > > + dev_dbg(mci->dev, "%s\n", __func__); > > + mutex_lock(&mci->chgdet_lock); > > + if (!mci->bc12_en) { > > + dev_info(mci->dev, "%s: bc12 disabled, ignore irq\n", __f= unc__); > > + goto out; > > + } > > + last_usb_type =3D mci->psy_usb_type; > > + /* Plug in */ > > + ret =3D regmap_read(mci->regmap, MT6360_PMU_USB_STATUS1, &usb_sta= tus); > > + if (ret < 0) > > + goto out; > > + usb_status &=3D MT6360_MASK_USB_STATUS; > > + usb_status >>=3D MT6360_SHFT_USB_STATUS; > > + switch (usb_status) { > > + case MT6360_CHG_TYPE_UNDER_GOING: > > + dev_info(mci->dev, "%s: under going...\n", __func__); > > + goto out; > > + case MT6360_CHG_TYPE_SDP: > > + chg_type =3D EXTCON_CHG_USB_SDP; > > + mci->psy_usb_type =3D POWER_SUPPLY_USB_TYPE_SDP; > > + break; > > + case MT6360_CHG_TYPE_SDPNSTD: > > + chg_type =3D EXTCON_CHG_USB_SLOW; > > + mci->psy_usb_type =3D POWER_SUPPLY_USB_TYPE_SDP; > > + break; > > + case MT6360_CHG_TYPE_CDP: > > + chg_type =3D EXTCON_CHG_USB_CDP; > > + mci->psy_usb_type =3D POWER_SUPPLY_USB_TYPE_CDP; > > + break; > > + case MT6360_CHG_TYPE_DCP: > > + chg_type =3D EXTCON_CHG_USB_DCP; > > + mci->psy_usb_type =3D POWER_SUPPLY_USB_TYPE_DCP; > > + break; > > + default: > > + dev_warn(mci->dev, > > + "%s: disconnect or unknown status\n", __func__); > > + goto out; > > + } > > + > > + dev_info(mci->dev, "%s: chg_type =3D %d\n", __func__, chg_type); > > + if (chg_type =3D=3D EXTCON_CHG_USB_SDP || chg_type =3D=3D EXTCON_= CHG_USB_CDP) { > > + extcon_set_state_sync(mci->edev, EXTCON_USB_HOST, false); > > + extcon_set_state_sync(mci->edev, EXTCON_USB, true); > > + } > > + extcon_set_state_sync(mci->edev, chg_type, true); > > + if (last_usb_type !=3D mci->psy_usb_type) > > + power_supply_changed(mci->psy); > > +out: > > + mutex_unlock(&mci->chgdet_lock); > > + return IRQ_HANDLED; > > +} > > + > > +static void mt6360_handle_chrdet_ext_evt(struct mt6360_chg_info *mci) > > +{ > > + int i, ret; > > + bool pwr_rdy; > > + int last_usb_type; > > + > > + mutex_lock(&mci->chgdet_lock); > > + ret =3D mt6360_get_chrdet_ext_stat(mci, &pwr_rdy); > > + if (ret < 0) > > + goto out; > > + if (mci->pwr_rdy =3D=3D pwr_rdy) { > > + dev_info(mci->dev, > > + "%s: pwr_rdy is same(%d)\n", __func__, pwr_rdy); > > + goto out; > > + } > > + mci->pwr_rdy =3D pwr_rdy; > > + last_usb_type =3D mci->psy_usb_type; > > + dev_info(mci->dev, "%s: pwr_rdy =3D %d\n", __func__, pwr_rdy); > > + if (!pwr_rdy) { > > + for (i =3D 0; i < ARRAY_SIZE(mt6360_extcon_cable) - 1; i+= +) { > > + extcon_set_state_sync(mci->edev, > > + mt6360_extcon_cable[i], fal= se); > > + } > > + mci->psy_usb_type =3D POWER_SUPPLY_USB_TYPE_UNKNOWN; > > + if (last_usb_type !=3D mci->psy_usb_type) > > + power_supply_changed(mci->psy); > > + > > + } > > + ret =3D regmap_update_bits(mci->regmap, > > + MT6360_PMU_DEVICE_TYPE, > > + MT6360_MASK_USBCHGEN, > > + pwr_rdy ? MT6360_MASK_USBCHGEN : 0); > > + if (ret < 0) > > + goto out; > > + mci->bc12_en =3D pwr_rdy; > > +out: > > + mutex_unlock(&mci->chgdet_lock); > > +} > > + > > +static void mt6360_chrdet_work(struct work_struct *work) > > +{ > > + struct mt6360_chg_info *mci =3D (struct mt6360_chg_info *)contain= er_of( > > + work, struct mt6360_chg_info, chrdet= _work); > > + > > + dev_info(mci->dev, "%s\n", __func__); > > + mt6360_handle_chrdet_ext_evt(mci); > > +} > > + > > +static irqreturn_t mt6360_pmu_chrdet_ext_evt_handler(int irq, void *da= ta) > > +{ > > + struct mt6360_chg_info *mci =3D data; > > + > > + dev_info(mci->dev, "%s\n", __func__); > > + mt6360_handle_chrdet_ext_evt(mci); > > + return IRQ_HANDLED; > > +} > > + > > +static const struct mt6360_irq_desc mt6360_chg_irq_desc[] =3D { > > + { "chg_treg_evt", mt6360_pmu_chg_treg_evt_handler }, > > + { "pwr_rdy_evt", mt6360_pmu_pwr_rdy_evt_handler }, > > + { "chg_batsysuv_evt", mt6360_pmu_chg_batsysuv_evt_handler }, > > + { "chg_vsysuv_evt", mt6360_pmu_chg_vsysuv_evt_handler }, > > + { "chg_vsysov_evt", mt6360_pmu_chg_vsysov_evt_handler }, > > + { "chg_vbatov_evt", mt6360_pmu_chg_vbatov_evt_handler }, > > + { "chg_vbusov_evt", mt6360_pmu_chg_vbusov_evt_handler }, > > + { "chg_aiccmeasl", mt6360_pmu_chg_aiccmeasl_handler }, > > + { "wdtmri", mt6360_pmu_wdtmri_handler }, > > + { "chg_rechgi", mt6360_pmu_chg_rechgi_handler }, > > + { "chg_termi", mt6360_pmu_chg_termi_handler }, > > + { "chg_ieoci", mt6360_pmu_chg_ieoci_handler }, > > + { "pumpx_donei", mt6360_pmu_pumpx_donei_handler }, > > + { "attach_i", mt6360_pmu_attach_i_handler }, > > + { "chrdet_ext_evt", mt6360_pmu_chrdet_ext_evt_handler }, > > +}; > > + > > +static int mt6360_chg_irq_register(struct platform_device *pdev) > > +{ > > + const struct mt6360_irq_desc *irq_desc; > > + int i, irq, ret; > > + > > + for (i =3D 0; i < ARRAY_SIZE(mt6360_chg_irq_desc); i++) { > > + irq_desc =3D mt6360_chg_irq_desc + i; > > + if (unlikely(!irq_desc->name)) > > + continue; > > Can this happen? > No, I will remove it. > > + irq =3D platform_get_irq_byname(pdev, irq_desc->name); > > Interrupts were not described in the bindings. > I add resource when MFD driver add sub-device. Should I add something in dt-binding? ret =3D devm_mfd_add_devices(&client->dev, PLATFORM_DEVID_AUTO, mt6360_devs, ARRAY_SIZE(mt6360_devs), NULL, 0, regmap_irq_get_domain(ddata->irq_data)); static const struct resource mt6360_chg_resources[] =3D { DEFINE_RES_IRQ_NAMED(MT6360_CHG_TREG_EVT, "chg_treg_evt"), DEFINE_RES_IRQ_NAMED(MT6360_PWR_RDY_EVT, "pwr_rdy_evt"), DEFINE_RES_IRQ_NAMED(MT6360_CHG_BATSYSUV_EVT, "chg_batsysuv_evt"), DEFINE_RES_IRQ_NAMED(MT6360_CHG_VSYSUV_EVT, "chg_vsysuv_evt"), DEFINE_RES_IRQ_NAMED(MT6360_CHG_VSYSOV_EVT, "chg_vsysov_evt"), DEFINE_RES_IRQ_NAMED(MT6360_CHG_VBATOV_EVT, "chg_vbatov_evt"), DEFINE_RES_IRQ_NAMED(MT6360_CHG_VBUSOV_EVT, "chg_vbusov_evt"), DEFINE_RES_IRQ_NAMED(MT6360_CHG_AICCMEASL, "chg_aiccmeasl"), DEFINE_RES_IRQ_NAMED(MT6360_WDTMRI, "wdtmri"), DEFINE_RES_IRQ_NAMED(MT6360_CHG_RECHGI, "chg_rechgi"), DEFINE_RES_IRQ_NAMED(MT6360_CHG_TERMI, "chg_termi"), DEFINE_RES_IRQ_NAMED(MT6360_CHG_IEOCI, "chg_ieoci"), DEFINE_RES_IRQ_NAMED(MT6360_PUMPX_DONEI, "pumpx_donei"), DEFINE_RES_IRQ_NAMED(MT6360_ATTACH_I, "attach_i"), DEFINE_RES_IRQ_NAMED(MT6360_CHRDET_EXT_EVT, "chrdet_ext_evt"), > > + if (irq < 0) > > + continue; > > + ret =3D devm_request_threaded_irq(&pdev->dev, irq, NULL, > > + irq_desc->irq_handler, > > + IRQF_TRIGGER_FALLING, > > + irq_desc->name, > > + platform_get_drvdata(pdev= )); > > Why you use handler thread per each interrupt? This should be rather one > handler. Especially that most of your handlers do nothing. > I will remove serveral irqs which is do nothing, and only keep chrdet_ext for power ready and attachi for bc12 done. I add serveral resources in MFD device. Do you mean I use IRQF_SHARED to reduce irq? > > + if (ret < 0) { > > + dev_err(&pdev->dev, > > + "request %s irq fail\n", irq_desc->name); > > + return ret; > > + } > > + } > > + return 0; > > +} > > + > > +struct mt6360_field_info { > > + struct device_attribute dev_attr; > > + u8 reg; > > + u8 mask; > > + u8 shft; > > +}; > > + > > +static ssize_t mt6360_sysfs_show(struct device *dev, > > + struct device_attribute *attr, char *buf); > > +static ssize_t mt6360_sysfs_store(struct device *dev, > > + struct device_attribute *attr, const char *buf, size_t co= unt); > > + > > +#define MT6360_FIELD_RW(_name, _reg, _nbit) \ > > +{ \ > > + .dev_attr =3D __ATTR(_name, 0664, \ > > + mt6360_sysfs_show, mt6360_sysfs_store), \ > > + .reg =3D MT6360_PMU_##_reg, \ > > + .mask =3D MT6360_MASK_##_nbit, \ > > + .shft =3D MT6360_SHFT_##_nbit, \ > > +} > > + > > +#define MT6360_FIELD_RO(_name, _reg, _nbit) \ > > +{ \ > > + .dev_attr =3D __ATTR(_name, 0444, \ > > + mt6360_sysfs_show, NULL), \ > > + .reg =3D MT6360_PMU_##_reg, \ > > + .mask =3D MT6360_MASK_##_nbit, \ > > + .shft =3D MT6360_SHFT_##_nbit, \ > > +} > > + > > +static struct mt6360_field_info mt6360_field_tbl[] =3D { > > + MT6360_FIELD_RW(hiz, CHG_CTRL1, HIZ), > > + MT6360_FIELD_RW(vmivr, CHG_CTRL6, VMIVR), > > + MT6360_FIELD_RW(iaicr, CHG_CTRL3, IAICR), > > + MT6360_FIELD_RW(SYSREG, CHG_CTRL11, SYSREG), > > + MT6360_FIELD_RW(otg_oc, CHG_CTRL10, OTG_OC), > > + MT6360_FIELD_RW(ichg, CHG_CTRL17, ICHG), > > + MT6360_FIELD_RW(iprec, CHG_CTRL8, IPREC), > > + MT6360_FIELD_RW(ieoc, CHG_CTRL9, IEOC), > > + MT6360_FIELD_RW(voreg, CHG_CTRL4, VOREG), > > + MT6360_FIELD_RW(lbp, CHG_CTRL10, LBP), > > + MT6360_FIELD_RW(vrec, CHG_CTRL11, VREC), > > + MT6360_FIELD_RW(te, CHG_CTRL2, TE), > > + MT6360_FIELD_RW(chg_wdt_en, CHG_CTRL13, CHG_WDT_EN), > > + MT6360_FIELD_RW(chg_wdt, CHG_CTRL13, CHG_WDT), > > + MT6360_FIELD_RW(wt_fc, CHG_CTRL12, WT_FC), > > + MT6360_FIELD_RW(bat_comp, CHG_CTRL18, BAT_COMP), > > + MT6360_FIELD_RW(vclamp, CHG_CTRL18, VCLAMP), > > + MT6360_FIELD_RW(usbchgen, DEVICE_TYPE, USBCHGEN), > > + MT6360_FIELD_RW(chg_en, CHG_CTRL2, CHG_EN), > > + MT6360_FIELD_RO(chrdet_ext, FOD_STAT, CHRDET_EXT), > > +}; > > + > > +static struct attribute *mt6360_attrs[ARRAY_SIZE(mt6360_field_tbl) + 1= ]; > > + > > +static const struct attribute_group mt6360_attr_group =3D { > > + .attrs =3D mt6360_attrs, > > +}; > > + > > +static ssize_t mt6360_sysfs_show(struct device *dev, > > + struct device_attribute *attr, char *buf= ) > > +{ > > + struct mt6360_chg_info *mci =3D dev_get_drvdata(dev->parent); > > + struct mt6360_field_info *info =3D (void *)attr; > > + unsigned int regval; > > + int ret; > > + > > + ret =3D regmap_read(mci->regmap, info->reg, ®val); > > + if (ret < 0) > > + return ret; > > + regval =3D (regval & info->mask) >> info->shft; > > + return scnprintf(buf, PAGE_SIZE, "%02x\n", regval); > > +} > > + > > +static ssize_t mt6360_sysfs_store(struct device *dev, > > + struct device_attribute *attr, const char *buf, size_t= count) > > +{ > > + struct mt6360_chg_info *mci =3D dev_get_drvdata(dev->parent); > > + struct mt6360_field_info *info =3D (void *)attr; > > + int ret, tmp; > > + > > + if (kstrtoint(buf, 10, &tmp) < 0) { > > + dev_err(dev, "failed to parsing number\n"); > > + return -EINVAL; > > + } > > + ret =3D regmap_update_bits(mci->regmap, > > + info->reg, info->mask, tmp << info->shft= ); > > + if (ret < 0) > > + return ret; > > + return count; > > +} > > + > > +static int mt6360_sysfs_create_group(struct mt6360_chg_info *mci) > > +{ > > + int i, tb_size =3D ARRAY_SIZE(mt6360_field_tbl); > > + > > + for (i =3D 0; i < tb_size; i++) > > + mt6360_attrs[i] =3D &(mt6360_field_tbl[i].dev_attr.attr); > > + return devm_device_add_group(&mci->psy->dev, &mt6360_attr_group); > > +} > > + > > +static int mt6360_chg_init_setting(struct mt6360_chg_info *mci) > > +{ > > + int ret; > > + > > + /* Disable bc12 */ > > + ret =3D regmap_update_bits(mci->regmap, MT6360_PMU_DEVICE_TYPE, > > + MT6360_MASK_USBCHGEN, 0); > > + if (ret < 0) { > > + dev_err(mci->dev, "%s: disable bc12 fail\n", __func__); > > + goto out; > > + } > > + /* Set input current limit select by AICR */ > > + ret =3D regmap_update_bits(mci->regmap, MT6360_PMU_CHG_CTRL2, > > + MT6360_MASK_IINLMTSEL, > > + MT6360_IINLMTSEL_AICR << > > + MT6360_SHFT_IINLMTSEL); > > + if (ret < 0) { > > + dev_err(mci->dev, > > + "%s: switch iinlmtsel to aicr fail\n", __func__); > > + goto out; > > + } > > + usleep_range(5000, 6000); > > + /* Disable ilim */ > > + ret =3D regmap_update_bits(mci->regmap, MT6360_PMU_CHG_CTRL3, > > + MT6360_MASK_ILIM_EN, 0); > > + if (ret < 0) { > > + dev_err(mci->dev, > > + "%s: switch iinlmtsel to aicr fail\n", __func__); > > + goto out; > > + } > > + /* Enlarge OTG_OC to max 3A */ > > + ret =3D regmap_update_bits(mci->regmap, > > + MT6360_PMU_CHG_CTRL10, 0x07, 0x07); > > + if (ret < 0) { > > + dev_err(mci->dev, > > + "%s: faled config otg oc to maximum\n", __func__)= ; > > + } > > +out: > > + return ret; > > +} > > + > > +static u32 mt6360_vinovp_trans_to_sel(u32 val) > > +{ > > + u32 vinovp_tbl[] =3D { 5500000, 6500000, 11000000, 14500000 }; > > + int i; > > + > > + /* Select the smaller and equal supported value */ > > + for (i =3D 0; i < ARRAY_SIZE(vinovp_tbl)-1; i++) { > > + if (val < vinovp_tbl[i+1]) > > + break; > > + } > > + return i; > > +} > > + > > +static struct mt6360_chg_platform_data *mt6360_parse_pdata( > > + struct platform_device= *pdev) > > +{ > > + struct mt6360_chg_platform_data *pdata =3D dev_get_platdata(&pdev= ->dev); > > + struct device_node *np =3D pdev->dev.of_node; > > + int ret; > > + > > + pdata =3D devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); > > + if (!pdata) > > + return ERR_PTR(-ENOMEM); > > + memcpy(pdata, &def_platform_data, sizeof(*pdata)); > > Use kmemdup or something similar. > ACK > > + ret =3D of_property_read_u32(np, "vinovp", &pdata->vinovp); > > + if (ret) { > > + dev_err(&pdev->dev, "failed to parse vinovp in DT\n"); > > + return ERR_PTR(ret); > > + } > > + return pdata; > > +} > > + > > +static int mt6360_apply_pdata(struct platform_device *pdev) > > +{ > > + struct mt6360_chg_platform_data *pdata =3D dev_get_platdata(&pdev= ->dev); > > + struct mt6360_chg_info *mci =3D dev_get_drvdata(&pdev->dev); > > + int ret; > > + u32 sel; > > + > > + sel =3D mt6360_vinovp_trans_to_sel(pdata->vinovp); > > + ret =3D regmap_update_bits(mci->regmap, MT6360_PMU_CHG_CTRL19, > > + MT6360_MASK_VINOVP, sel << MT6360_SHFT_V= INOVP); > > + if (ret) > > + return ret; > > + return 0; > > +} > > + > > +static int mt6360_charger_probe(struct platform_device *pdev) > > +{ > > + struct mt6360_chg_platform_data *pdata =3D dev_get_platdata(&pdev= ->dev); > > + struct mt6360_chg_info *mci; > > + struct power_supply_config charger_cfg =3D {}; > > + struct regulator_config config =3D { }; > > + int ret; > > + > > + mci =3D devm_kzalloc(&pdev->dev, sizeof(*mci), GFP_KERNEL); > > + if (!mci) > > + return -ENOMEM; > > + > > + pdata =3D mt6360_parse_pdata(pdev); > > + if (IS_ERR_OR_NULL(pdata)) > > + return PTR_ERR(pdata); > > + > > + pdev->dev.platform_data =3D pdata; > > + > > + mci->dev =3D &pdev->dev; > > + mutex_init(&mci->chgdet_lock); > > + platform_set_drvdata(pdev, mci); > > + INIT_WORK(&mci->chrdet_work, &mt6360_chrdet_work); > > + > > + mci->regmap =3D dev_get_regmap(pdev->dev.parent, NULL); > > + if (!mci->regmap) { > > + dev_err(&pdev->dev, "Failed to get parent regmap\n"); > > + return -ENODEV; > > + } > > + > > + ret =3D mt6360_apply_pdata(pdev); > > + if (ret) { > > + dev_err(&pdev->dev, "Failed to apply pdata\n"); > > + return ret; > > + } > > + > > + mci->edev =3D devm_extcon_dev_allocate(&pdev->dev, mt6360_extcon_= cable); > > + if (IS_ERR(mci->edev)) { > > + dev_err(&pdev->dev, "Failed to allocate memory for extcon= \n"); > > + return -ENOMEM; > > + } > > + > > + ret =3D devm_extcon_dev_register(&pdev->dev, mci->edev); > > + if (ret) { > > + dev_err(&pdev->dev, "Failed to register extcon dev\n"); > > + return ret; > > + } > > + > > + memcpy(&mci->psy_desc, &mt6360_charger_desc, sizeof(mci->psy_desc= )); > > + mci->psy_desc.name =3D dev_name(&pdev->dev); > > + charger_cfg.drv_data =3D mci; > > + charger_cfg.of_node =3D pdev->dev.of_node; > > + charger_cfg.supplied_to =3D mt6360_charger_supplied_to; > > + charger_cfg.num_supplicants =3D ARRAY_SIZE(mt6360_charger_supplie= d_to); > > + mci->psy =3D devm_power_supply_register(&pdev->dev, > > + &mci->psy_desc, &charger_cf= g); > > + if (IS_ERR(mci->psy)) { > > + dev_err(&pdev->dev, "Failed to register power supply dev\= n"); > > + return PTR_ERR(mci->psy); > > + } > > + > > + ret =3D mt6360_chg_init_setting(mci); > > + if (ret) { > > + dev_err(&pdev->dev, "Failed to initial setting\n"); > > + return ret; > > + } > > + > > + schedule_work(&mci->chrdet_work); > > + > > + ret =3D mt6360_chg_irq_register(pdev); > > + if (ret) { > > + dev_err(&pdev->dev, "Failed to register irqs\n"); > > + return ret; > > + } > > + > > + config.dev =3D &pdev->dev; > > + config.regmap =3D mci->regmap; > > + mci->otg_rdev =3D devm_regulator_register(&pdev->dev, &mt6360_otg= _rdesc, > > + &config); > > + if (IS_ERR(mci->otg_rdev)) > > + return PTR_ERR(mci->otg_rdev); > > + > > + ret =3D mt6360_sysfs_create_group(mci); > > + if (ret) { > > + dev_err(&pdev->dev, > > + "%s: create sysfs attrs fail\n", __func__); > > + return ret; > > + } > > + > > + return 0; > > +} > > + > > +static const struct of_device_id __maybe_unused mt6360_charger_of_id[]= =3D { > > + { .compatible =3D "mediatek,mt6360-chg", }, > > + {}, > > +}; > > +MODULE_DEVICE_TABLE(of, mt6360_charger_of_id); > > + > > +static const struct platform_device_id mt6360_charger_id[] =3D { > > + { "mt6360-chg", 0 }, > > + {}, > > +}; > > +MODULE_DEVICE_TABLE(platform, mt6360_charger_id); > > + > > +static struct platform_driver mt6360_charger_driver =3D { > > + .driver =3D { > > + .name =3D "mt6360-chg", > > + .owner =3D THIS_MODULE, > > Not needed. You did not run coccinelle, right? > > > + .of_match_table =3D of_match_ptr(mt6360_charger_of_id), > > + }, > > + .probe =3D mt6360_charger_probe, > > + .id_table =3D mt6360_charger_id, > > +}; > > +module_platform_driver(mt6360_charger_driver); > > + > > +MODULE_AUTHOR("CY_Huang "); > > +MODULE_DESCRIPTION("MT6360 Charger Driver"); > > +MODULE_LICENSE("GPL"); > > +MODULE_VERSION("1.0.0"); > > Skip version. > > ACK > All these comments were after looking briefly - I did not perform a > thorough review. I am surprised that you combined regulator and charger > driver in one. It is doable but makes driver bigger and more difficult > to maintain. Consider splitting them. > MT6360 charger is switching charger, Can I keep regulator for boost OTG like bq24190? > Best regards, > Krzysztof 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=-9.5 required=3.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 344EEC2D0A3 for ; Mon, 26 Oct 2020 06:45:44 +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 A775522247 for ; Mon, 26 Oct 2020 06:45:43 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="c7Cr+Rw3"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="jpP6BirE" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A775522247 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.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:To:Subject:Message-ID:Date:From:In-Reply-To: References:MIME-Version:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=gssaq0Cdl1kTyyjWlnyzTZZnVk70pJmcoII4BCWNLdE=; b=c7Cr+Rw32vObbeOAvVUe/38ro W9auttM/S8JbeQgVDymDjVG0/dZSJX3x+izfK6f0Suko5Z7EnnMM8dm0N6fpIwuCjeI1gEFovZWNR Ub8liiFsssOOBvwTxgOFmSjuDrXuzqfbwNCQ77z92UMQdM7PgO5bIZ/HdPYGi30A4jAopgBWrhoys DvI5ljcXq3kYAdxGZY3TQrfQWIokOjtrbzxO3G45hfTDSG0wcECCeS7RmjPI1S/Ruszl9ndrQEc/c 5tcyqKrEW+i2PuzweFU+oYYe0XBO8qcHh95UUNNDulGQwwUlv/IQnTusfh0QCGGqohUOgYdOiT9DX BKAny3Ucw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kWwG5-0004mr-Eo; Mon, 26 Oct 2020 06:45:33 +0000 Received: from mail-ot1-x341.google.com ([2607:f8b0:4864:20::341]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kWwG0-0004m1-0X; Mon, 26 Oct 2020 06:45:29 +0000 Received: by mail-ot1-x341.google.com with SMTP id k68so7071869otk.10; Sun, 25 Oct 2020 23:45:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=teElRtzazUJIA66EUGlw1atkA2G++mQK2BC4XLZcb4c=; b=jpP6BirEFeTpGu9RXU18fmAhbkJugB4WuBIqAselgTVsVn+Q18qzqQt1MsgId+ZCDZ I87hO8fToJHLNOoAjEAU9ZinEmxy3wU9MB1oXEl/0cE8iv2EZ+2tEuN1xH/D9wSX+7+E 1Y94nxPwTl1NkZuk7b/aCuEbupcaXcmDKRKEWRkLhwpPSJsN90eTBkQsgR0/HQNS3QB/ T5o/mAcTX8ZMIJYsm7y7FY0EB+YmvbaN2M2yCPLGUTzRenk8/2o9jXCxilyLaiwlnxis p8bSSeOswH+s5IhtBhWi6atyWAEQmILWHDeokmHqSVsZVTuDyBR97m6PABg8lj82QbP1 E5Ug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=teElRtzazUJIA66EUGlw1atkA2G++mQK2BC4XLZcb4c=; b=tYzf3CwswB9dI0u1Q0ZEyPh6RUGuMfco94o/L2v8X7u28q1bZOsrAGxrfzLTWD/jaV YKJt6yHECoWwtiWycJbEEhk2U42xwMDcPd3wxwYAvPFSJvPGSdxPApwwDEtu8IqdHq0w yBLYbahN4HvWUmvYL18RTbYvIPlZHZ1CfOCzd5rwzI2UcjfEjF2/pZtpLVek6NM/yUtc S8JUf5ptQZzNlCC5tNnDUZJrjfE7jin7v+VplcYKbsJmFE6a/NxCKA6VnN5f+CY9CTeg /iTqz0eICnkW9pIoTq9dBDlWYA73+T3JaPhOCVnmg3kKHMBdysUddgSdLt2mXmo8Uqab PUtg== X-Gm-Message-State: AOAM533GUqcMGtorGUBX5inV+Pfi4RjOU8gHOzbP2kxcLuCo17xaeiYi bFJapp8JnLeodP9+OhHKWv903z12/eRfv4EYAlA= X-Google-Smtp-Source: ABdhPJwFsXKG22rI6SzM+k/5kSPHIrBdMXZZFIgtax2lWQxwzN5Lt2ce9zWtF7wAM1Pc2csydDP6DQrWGJaUN0cdC5A= X-Received: by 2002:a9d:65c7:: with SMTP id z7mr13322991oth.327.1603694724787; Sun, 25 Oct 2020 23:45:24 -0700 (PDT) MIME-Version: 1.0 References: <1600859910-15855-1-git-send-email-gene.chen.richtek@gmail.com> <1600859910-15855-2-git-send-email-gene.chen.richtek@gmail.com> <20201016155227.GB9890@kozik-lap> In-Reply-To: <20201016155227.GB9890@kozik-lap> From: Gene Chen Date: Mon, 26 Oct 2020 14:45:12 +0800 Message-ID: Subject: Re: [PATCH 2/2] power: supply: mt6360_charger: add MT6360 charger support To: Krzysztof Kozlowski X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201026_024528_218010_F4ABF040 X-CRM114-Status: GOOD ( 32.36 ) 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 , devicetree , linux-pm@vger.kernel.org, sre@kernel.org, Linux Kernel Mailing List , cy_huang@richtek.com, Rob Herring , "moderated list:ARM/Mediatek SoC support" , Matthias Brugger , linux-arm Mailing List , 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 S3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPiDmlrwgMjAyMOW5tDEw5pyIMTbm l6Ug6YCx5LqUIOS4i+WNiDExOjUy5a+r6YGT77yaCj4KPiBPbiBXZWQsIFNlcCAyMywgMjAyMCBh dCAwNzoxODozMFBNICswODAwLCBHZW5lIENoZW4gd3JvdGU6Cj4gPiBGcm9tOiBHZW5lIENoZW4g PGdlbmVfY2hlbkByaWNodGVrLmNvbT4KPiA+Cj4gPiBBZGQgYmFzaWMgc3VwcG9ydCBmb3IgdGhl IGJhdHRlcnkgY2hhcmdlciBmb3IgTVQ2MzYwIFBNSUMKPiA+Cj4gPiBTaWduZWQtb2ZmLWJ5OiBH ZW5lIENoZW4gPGdlbmVfY2hlbkByaWNodGVrLmNvbT4KPiA+IC0tLQo+ID4gIGRyaXZlcnMvcG93 ZXIvc3VwcGx5L0tjb25maWcgICAgICAgICAgfCAgIDExICsKPiA+ICBkcml2ZXJzL3Bvd2VyL3N1 cHBseS9NYWtlZmlsZSAgICAgICAgIHwgICAgMSArCj4gPiAgZHJpdmVycy9wb3dlci9zdXBwbHkv bXQ2MzYwX2NoYXJnZXIuYyB8IDExOTAgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr Cj4gPiAgMyBmaWxlcyBjaGFuZ2VkLCAxMjAyIGluc2VydGlvbnMoKykKPiA+ICBjcmVhdGUgbW9k ZSAxMDA2NDQgZHJpdmVycy9wb3dlci9zdXBwbHkvbXQ2MzYwX2NoYXJnZXIuYwo+ID4KPiA+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9LY29uZmlnIGIvZHJpdmVycy9wb3dlci9z dXBwbHkvS2NvbmZpZwo+ID4gaW5kZXggZmFmMjgzMC4uMWJlYjZhNCAxMDA2NDQKPiA+IC0tLSBh L2RyaXZlcnMvcG93ZXIvc3VwcGx5L0tjb25maWcKPiA+ICsrKyBiL2RyaXZlcnMvcG93ZXIvc3Vw cGx5L0tjb25maWcKPiA+IEBAIC01NjIsNiArNTYyLDE3IEBAIGNvbmZpZyBDSEFSR0VSX01QMjYy OQo+ID4gICAgICAgICBCYXR0ZXJ5IGNoYXJnZXIuIFRoaXMgZHJpdmVyIHByb3ZpZGVzIEJhdHRl cnkgY2hhcmdlciBwb3dlciBtYW5hZ2VtZW50Cj4gPiAgICAgICAgIGZ1bmN0aW9ucyBvbiB0aGUg c3lzdGVtcy4KPiA+Cj4gPiArY29uZmlnIENIQVJHRVJfTVQ2MzYwCj4gPiArICAgICB0cmlzdGF0 ZSAiTWVkaWF0ZWsgTVQ2MzYwIENoYXJnZXIgRHJpdmVyIgo+ID4gKyAgICAgZGVwZW5kcyBvbiBN RkRfTVQ2MzYwCj4KPiB8fCBDT01QSUxFX1RFU1QKPiAoYW5kIHRlc3QgaWYgaXQgcmVhbGx5IGNv bXBpbGVzKQo+Cj4gPiArICAgICBkZXBlbmRzIG9uIFJFR1VMQVRPUgo+ID4gKyAgICAgc2VsZWN0 IEVYVENPTgo+Cj4gRHJpdmVycyBzaG91bGQgaW4gZ2VuZXJhbCBub3Qgc2VsZWN0IG90aGVyIHVz ZXItc2VsZWN0YWJsZSBzeW1ib2xzLCBzbwo+IHRoaXMgc2hvdWxkIGJlIHJhdGhlciBkZXBlbmRz Lgo+CgpBQ0ssIEkgcmVtb3ZlIGV4dGNvbiBkZXZpY2UgcmVnaXN0ZXIgd2hpY2ggbWF5IGJlIHJl Z2lzdGVyIGJ5IHVzYiBkcml2ZXIuCgo+ID4gKyAgICAgaGVscAo+ID4gKyAgICAgICBTYXkgWSBo ZXJlIHRvIGVuYWJsZSBNVDYzNjAgQ2hhcmdlciBQYXJ0Lgo+ID4gKyAgICAgICBzdXBwb3J0IEhp Z2gtQWNjdXJhY3kgVm9sdGFnZS9DdXJyZW50IFJlZ3VsYXRpb24sCj4KPiAiVGhlIGRldmljZSBz dXBwcG9ydHMgLi4uIgo+CgpBQ0sKCj4gPiArICAgICAgIEF2ZXJhZ2UgSW5wdXQgQ3VycmVudCBS ZWd1bGF0aW9uLCBCYXR0ZXJ5IFRlbXBhdHVyZSBTZW5zaW5nLAo+ID4gKyAgICAgICBPdmVyLVRl bXBlcmF0dXJlIFByb3RlY3Rpb24sIERQRE0gRGV0ZWN0aW9uIGZvciBCQzEuMgo+ID4gKwo+ID4g IGNvbmZpZyBDSEFSR0VSX1FDT01fU01CQgo+ID4gICAgICAgdHJpc3RhdGUgIlF1YWxjb21tIFN3 aXRjaC1Nb2RlIEJhdHRlcnkgQ2hhcmdlciBhbmQgQm9vc3QiCj4gPiAgICAgICBkZXBlbmRzIG9u IE1GRF9TUE1JX1BNSUMgfHwgQ09NUElMRV9URVNUCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9w b3dlci9zdXBwbHkvTWFrZWZpbGUgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9NYWtlZmlsZQo+ID4g aW5kZXggYjNjNjk0YS4uOWFiZWNiOWMgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL3Bvd2VyL3N1 cHBseS9NYWtlZmlsZQo+ID4gKysrIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvTWFrZWZpbGUKPiA+ IEBAIC03Nyw2ICs3Nyw3IEBAIG9iai0kKENPTkZJR19DSEFSR0VSX01BWDc3NjkzKSAgICAgICs9 IG1heDc3NjkzX2NoYXJnZXIubwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VSX01BWDg5OTcpICAg ICAgICArPSBtYXg4OTk3X2NoYXJnZXIubwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VSX01BWDg5 OTgpICAgICAgICArPSBtYXg4OTk4X2NoYXJnZXIubwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VS X01QMjYyOSkgKz0gbXAyNjI5X2NoYXJnZXIubwo+ID4gK29iai0kKENPTkZJR19DSEFSR0VSX01U NjM2MCkgKz0gbXQ2MzYwX2NoYXJnZXIubwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VSX1FDT01f U01CQikgICAgICArPSBxY29tX3NtYmIubwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VSX0JRMjQx NVgpICAgICAgICArPSBicTI0MTV4X2NoYXJnZXIubwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VS X0JRMjQxOTApICAgICAgICArPSBicTI0MTkwX2NoYXJnZXIubwo+ID4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvcG93ZXIvc3VwcGx5L210NjM2MF9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBs eS9tdDYzNjBfY2hhcmdlci5jCj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gaW5kZXggMDAw MDAwMC4uNzBlM2ZiNgo+ID4gLS0tIC9kZXYvbnVsbAo+ID4gKysrIGIvZHJpdmVycy9wb3dlci9z dXBwbHkvbXQ2MzYwX2NoYXJnZXIuYwo+ID4gQEAgLTAsMCArMSwxMTkwIEBACj4gPiArLy8gU1BE WC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiA+ICsvKgo+ID4gKyAqIENvcHlyaWdodCAo YykgMjAxOSBNZWRpYVRlayBJbmMuCj4gPiArICovCj4gPiArCj4gPiArI2luY2x1ZGUgPGxpbnV4 L2luaXQuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gPiArI2luY2x1ZGUgPGxp bnV4L2tlcm5lbC5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KPiA+ICsjaW5jbHVk ZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L29mLmg+Cj4g PiArI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9leHRj b24tcHJvdmlkZXIuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+Cj4gPiAr I2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KPiA+ICsKPiA+ICsjZGVmaW5lIE1U NjM2MF9QTVVfQ0hHX0NUUkwxICAgICAgICAgICAgICAgICAoMHgxMSkKPgo+IERyb3AgYWxsIHRo ZSBicmFja2V0cy4KPgoKQUNLCgo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDIgICAg ICAgICAgICAgICAgICgweDEyKQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDMgICAg ICAgICAgICAgICAgICgweDEzKQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDQgICAg ICAgICAgICAgICAgICgweDE0KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDUgICAg ICAgICAgICAgICAgICgweDE1KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDYgICAg ICAgICAgICAgICAgICgweDE2KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDcgICAg ICAgICAgICAgICAgICgweDE3KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDggICAg ICAgICAgICAgICAgICgweDE4KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDkgICAg ICAgICAgICAgICAgICgweDE5KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDEwICAg ICAgICAgICAgICAgICAgICAgICAgKDB4MUEpCj4gPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19D VFJMMTEgICAgICAgICAgICAgICAgICAgICAgICAoMHgxQikKPiA+ICsjZGVmaW5lIE1UNjM2MF9Q TVVfQ0hHX0NUUkwxMiAgICAgICAgICAgICAgICAgICAgICAgICgweDFDKQo+ID4gKyNkZWZpbmUg TVQ2MzYwX1BNVV9DSEdfQ1RSTDEzICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUQpCj4gPiAr I2RlZmluZSBNVDYzNjBfUE1VX0RFVklDRV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAoMHgy MikKPiA+ICsjZGVmaW5lIE1UNjM2MF9QTVVfVVNCX1NUQVRVUzEgICAgICAgICAgICAgICAgICAg ICAgICgweDI3KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDE3ICAgICAgICAgICAg ICAgICAgICAgICAgKDB4MkIpCj4gPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19DVFJMMTggICAg ICAgICAgICAgICAgICAgICAgICAoMHgyQykKPiA+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX1NU QVQgICAgICAgICAgICAgICAgICAoMHg0QSkKPiA+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NU UkwxOSAgICAgICAgICAgICAgICAgICAgICAgICgweDYxKQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BN VV9GT0RfU1RBVCAgICAgICAgICAgICAgICAgICgweEU3KQo+ID4gKwo+ID4gKy8qIDB4MTEgKi8K Pgo+IFVzZSBuYW1lLCBub3QgdmFsdWUgaW4gY29tbWVudC4KPgo+ID4gKyNkZWZpbmUgTVQ2MzYw X01BU0tfRlNMUCAgICAgQklUKDMpCj4KPiBIZXJlIGFuZCBiZWxvdyAtIHJldmVyc2UgdGhlIG5h bWluZyBzbzoKPiBNVDYzNjBfRlNMUF9NQVNLCj4gTVQ2MzYwX0ZTTFBfU0hJRlQKPgo+IEFsc28g ZG9uJ3QgZHVwbGljYXRlIHRoZSB2YWx1ZXMsIHNvOgo+ICNkZWZpbmUgTVQ2MzYwX0ZTTFBfTUFT SyAgICAgICAgQklUKE1UNjM2MF9GU0xQX1NISUZUKQo+IGF0IGxlYXN0IHdoZXJlIHRoaXMgaXMg b25seSBCSVQoKS4KPgoKQUNLCgo+ID4gKyNkZWZpbmUgTVQ2MzYwX1NIRlRfRlNMUCAgICAgKDMp Cj4gPiArI2RlZmluZSBNVDYzNjBfTUFTS19ISVogICAgICAgICAgICAgIEJJVCgyKQo+ID4gKyNk ZWZpbmUgTVQ2MzYwX1NIRlRfSElaICAgICAgICAgICAgICAoMikKPiA+ICsjZGVmaW5lIE1UNjM2 MF9NQVNLX09QQV9NT0RFIEJJVCgwKQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1NIRlRfT1BBX01PREUg KDApCj4gPiArLyogMHgxMiAqLwo+ID4gKyNkZWZpbmUgTVQ2MzYwX01BU0tfVEUgICAgICAgICAg ICAgICBCSVQoNCkKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX1RFICAgICAgICAgICAgICAgKDQp Cj4gPiArI2RlZmluZSBNVDYzNjBfTUFTS19JSU5MTVRTRUwgICAgICAgIEdFTk1BU0soMywgMikK PiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX0lJTkxNVFNFTCAgICAgICAgKDIpCj4gPiArI2RlZmlu ZSBNVDYzNjBfTUFTS19DSEdfRU4gICBCSVQoMCkKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX0NI R19FTiAgICgwKQo+ID4gKy8qIDB4MTMgKi8KPiA+ICsjZGVmaW5lIE1UNjM2MF9NQVNLX0lBSUNS ICAgIEdFTk1BU0soNywgMikKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX0lBSUNSICAgICgyKQo+ ID4gKyNkZWZpbmUgTVQ2MzYwX01BU0tfSUxJTV9FTiAgQklUKDApCj4gPiArLyogMHgxNCAqLwo+ ID4gKyNkZWZpbmUgTVQ2MzYwX01BU0tfVk9SRUcgICAgR0VOTUFTSyg3LCAxKQo+ID4gKyNkZWZp bmUgTVQ2MzYwX1NIRlRfVk9SRUcgICAgKDEpCj4gPiArLyogMHgxNSAqLwo+ID4gKyNkZWZpbmUg TVQ2MzYwX01BU0tfVk9CU1QgICAgR0VOTUFTSyg3LCAyKQo+ID4gKy8qIDB4MTYgKi8KPiA+ICsj ZGVmaW5lIE1UNjM2MF9NQVNLX1ZNSVZSICAgIEdFTk1BU0soNywgMSkKPiA+ICsjZGVmaW5lIE1U NjM2MF9TSEZUX1ZNSVZSICAgICgxKQo+ID4gKy8qIDB4MTcgKi8KPiA+ICsjZGVmaW5lIE1UNjM2 MF9NQVNLX0lDSEcgICAgIEdFTk1BU0soNywgMikKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX0lD SEcgICAgICgyKQo+ID4gKy8qIDB4MTggKi8KPiA+ICsjZGVmaW5lIE1UNjM2MF9NQVNLX0lQUkVD ICAgIEdFTk1BU0soMywgMCkKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX0lQUkVDICAgICgwKQo+ ID4gKy8qIDB4MTkgKi8KPiA+ICsjZGVmaW5lIE1UNjM2MF9NQVNLX0lFT0MgICAgIEdFTk1BU0so NywgNCkKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX0lFT0MgICAgICg0KQo+ID4gKy8qIDB4MUEg Ki8KPiA+ICsjZGVmaW5lIE1UNjM2MF9NQVNLX0xCUCAgICAgICAgICAgICAgR0VOTUFTSyg3LCA0 KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1NIRlRfTEJQICAgICAgICAgICAgICAoNCkKPiA+ICsjZGVm aW5lIE1UNjM2MF9NQVNLX09UR19PQyAgIEdFTk1BU0soMywgMCkKPiA+ICsjZGVmaW5lIE1UNjM2 MF9TSEZUX09UR19PQyAgICgwKQo+ID4gKy8qIDB4MUIgKi8KPiA+ICsjZGVmaW5lIE1UNjM2MF9N QVNLX1NZU1JFRyAgIEdFTk1BU0soNCwgMikKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX1NZU1JF RyAgICgyKQo+ID4gKyNkZWZpbmUgTVQ2MzYwX01BU0tfVlJFQyAgICAgR0VOTUFTSygyLCAwKQo+ ID4gKyNkZWZpbmUgTVQ2MzYwX1NIRlRfVlJFQyAgICAgKDApCj4gPiArLyogMHgxQyAqLwo+ID4g KyNkZWZpbmUgTVQ2MzYwX01BU0tfV1RfRkMgICAgR0VOTUFTSyg3LCA1KQo+ID4gKyNkZWZpbmUg TVQ2MzYwX1NIRlRfV1RfRkMgICAgKDUpCj4gPiArLyogMHgxRCAqLwo+ID4gKyNkZWZpbmUgTVQ2 MzYwX01BU0tfQ0hHX1dEVF9FTiAgICAgICBCSVQoNykKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZU X0NIR19XRFRfRU4gICAgICAgKDcpCj4gPiArI2RlZmluZSBNVDYzNjBfTUFTS19DSEdfV0RUICBH RU5NQVNLKDUsIDQpCj4gPiArI2RlZmluZSBNVDYzNjBfU0hGVF9DSEdfV0RUICAoNCkKPiA+ICsv KiAweDIyICovCj4gPiArI2RlZmluZSBNVDYzNjBfTUFTS19VU0JDSEdFTiBCSVQoNykKPiA+ICsj ZGVmaW5lIE1UNjM2MF9TSEZUX1VTQkNIR0VOICg3KQo+ID4gKy8qIDB4MjcgKi8KPiA+ICsjZGVm aW5lIE1UNjM2MF9NQVNLX1VTQl9TVEFUVVMgICAgICAgR0VOTUFTSyg2LCA0KQo+ID4gKyNkZWZp bmUgTVQ2MzYwX1NIRlRfVVNCX1NUQVRVUyAgICAgICAoNCkKPiA+ICsvKiAweDJDICovCj4gPiAr I2RlZmluZSBNVDYzNjBfTUFTS19CQVRfQ09NUCBHRU5NQVNLKDUsIDMpCj4gPiArI2RlZmluZSBN VDYzNjBfU0hGVF9CQVRfQ09NUCAoMykKPiA+ICsjZGVmaW5lIE1UNjM2MF9NQVNLX1ZDTEFNUCAg IEdFTk1BU0soMiwgMCkKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX1ZDTEFNUCAgICgwKQo+ID4g Ky8qIDB4NEEgKi8KPiA+ICsjZGVmaW5lIE1UNjM2MF9NQVNLX0NIR19TVEFUIEdFTk1BU0soNywg NikKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX0NIR19TVEFUICg2KQo+ID4gKyNkZWZpbmUgTVQ2 MzYwX01BU0tfVkJBVF9MVkwgQklUKDUpCj4gPiArLyogMHg2MSAqLwo+ID4gKyNkZWZpbmUgTVQ2 MzYwX01BU0tfVklOT1ZQICAgR0VOTUFTSyg2LCA1KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1NIRlRf VklOT1ZQICAgKDUpCj4gPiArLyogMHhFNyAqLwo+ID4gKyNkZWZpbmUgTVQ2MzYwX01BU0tfQ0hS REVUX0VYVCAgICAgICBCSVQoNCkKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX0NIUkRFVF9FWFQg ICAgICAgKDQpCj4gPiArCj4gPiArLyogdUEgKi8KPiA+ICsjZGVmaW5lIE1UNjM2MF9JQ0hHX01J TiAgICAgICAgICAgICAgMTAwMDAwCj4gPiArI2RlZmluZSBNVDYzNjBfSUNIR19NQVggICAgICAg ICAgICAgIDUwMDAwMDAKPiA+ICsjZGVmaW5lIE1UNjM2MF9JQ0hHX1NURVAgICAgIDEwMDAwMAo+ ID4gKy8qIHVWICovCj4gPiArI2RlZmluZSBNVDYzNjBfVk9SRUdfTUlOICAgICAzOTAwMDAwCj4g PiArI2RlZmluZSBNVDYzNjBfVk9SRUdfTUFYICAgICA0NzEwMDAwCj4gPiArI2RlZmluZSBNVDYz NjBfVk9SRUdfU1RFUCAgICAxMDAwMAo+ID4gKy8qIHVBICovCj4gPiArI2RlZmluZSBNVDYzNjBf QUlDUl9NSU4gICAgICAgICAgICAgIDEwMDAwMAo+ID4gKyNkZWZpbmUgTVQ2MzYwX0FJQ1JfTUFY ICAgICAgICAgICAgICAzMjUwMDAwCj4gPiArI2RlZmluZSBNVDYzNjBfQUlDUl9TVEVQICAgICA1 MDAwMAo+ID4gKy8qIHVBICovCj4gPiArI2RlZmluZSBNVDYzNjBfSVBSRUNfTUlOICAgICAxMDAw MDAKPiA+ICsjZGVmaW5lIE1UNjM2MF9JUFJFQ19NQVggICAgIDg1MDAwMAo+ID4gKyNkZWZpbmUg TVQ2MzYwX0lQUkVDX1NURVAgICAgNTAwMDAKPiA+ICsvKiB1QSAqLwo+ID4gKyNkZWZpbmUgTVQ2 MzYwX0lFT0NfTUlOICAgICAgICAgICAgICAxMDAwMDAKPiA+ICsjZGVmaW5lIE1UNjM2MF9JRU9D X01BWCAgICAgICAgICAgICAgODUwMDAwCj4gPiArI2RlZmluZSBNVDYzNjBfSUVPQ19TVEVQICAg ICA1MDAwMAo+ID4gKwo+ID4gK3N0cnVjdCBtdDYzNjBfY2hnX3BsYXRmb3JtX2RhdGEgewo+ID4g KyAgICAgdTMyIHZpbm92cDsKPiA+ICt9Owo+ID4gKwo+ID4gK3N0cnVjdCBtdDYzNjBfY2hnX2lu Zm8gewo+ID4gKyAgICAgc3RydWN0IGRldmljZSAqZGV2Owo+ID4gKyAgICAgc3RydWN0IG10NjM2 MF9jaGdfcGxhdGZvcm1fZGF0YSAqcGRhdGE7Cj4gPiArICAgICBzdHJ1Y3QgcmVnbWFwICpyZWdt YXA7Cj4gPiArICAgICBzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldjsKPiA+ICsgICAgIHN0cnVjdCBw b3dlcl9zdXBwbHlfZGVzYyBwc3lfZGVzYzsKPiA+ICsgICAgIHN0cnVjdCBwb3dlcl9zdXBwbHkg KnBzeTsKPiA+ICsgICAgIHN0cnVjdCByZWd1bGF0b3JfZGVzYyBvdGdfcmRlc2M7Cj4KPiBUaGlz IGxvb2tzIHVudXNlZC4KPgoKQUNLLCBJIHdpbGwgcmVtb3ZlIGl0LgoKPiA+ICsgICAgIHN0cnVj dCByZWd1bGF0b3JfZGV2ICpvdGdfcmRldjsKPiA+ICsgICAgIHN0cnVjdCBtdXRleCBjaGdkZXRf bG9jazsKPiA+ICsgICAgIGJvb2wgcHdyX3JkeTsKPiA+ICsgICAgIGJvb2wgYmMxMl9lbjsKPiA+ ICsgICAgIGludCBwc3lfdXNiX3R5cGU7Cj4gPiArICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2hy ZGV0X3dvcms7Cj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IG10NjM2MF9jaGdfcGxh dGZvcm1fZGF0YSBkZWZfcGxhdGZvcm1fZGF0YSA9IHsKPiA+ICsgICAgIC52aW5vdnAgPSA2NTAw MDAwLAo+ID4gK307Cj4gPiArCj4gPiArc3RydWN0IG10NjM2MF9pcnFfZGVzYyB7Cj4gPiArICAg ICBjb25zdCBjaGFyICpuYW1lOwo+ID4gKyAgICAgaXJxX2hhbmRsZXJfdCBpcnFfaGFuZGxlcjsK PiA+ICt9Owo+ID4gKwo+ID4gK2VudW0gbXQ2MzYwX2lpbmxtdHNlbCB7Cj4gPiArICAgICBNVDYz NjBfSUlOTE1UU0VMX0FJQ1JfMzI1MCA9IDAsCj4gPiArICAgICBNVDYzNjBfSUlOTE1UU0VMX0NI R19UWVBFLAo+ID4gKyAgICAgTVQ2MzYwX0lJTkxNVFNFTF9BSUNSLAo+ID4gKyAgICAgTVQ2MzYw X0lJTkxNVFNFTF9MT1dFUl9MRVZFTCwKPiA+ICt9Owo+ID4gKwo+ID4gK2VudW0gbXQ2MzYwX3Bt dV9jaGdfdHlwZSB7Cj4gPiArICAgICBNVDYzNjBfQ0hHX1RZUEVfTk9WQlVTID0gMCwKPiA+ICsg ICAgIE1UNjM2MF9DSEdfVFlQRV9VTkRFUl9HT0lORywKPiA+ICsgICAgIE1UNjM2MF9DSEdfVFlQ RV9TRFAsCj4gPiArICAgICBNVDYzNjBfQ0hHX1RZUEVfU0RQTlNURCwKPiA+ICsgICAgIE1UNjM2 MF9DSEdfVFlQRV9EQ1AsCj4gPiArICAgICBNVDYzNjBfQ0hHX1RZUEVfQ0RQLAo+ID4gKyAgICAg TVQ2MzYwX0NIR19UWVBFX01BWCwKPiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRpYyBlbnVtIHBvd2Vy X3N1cHBseV91c2JfdHlwZSBtdDYzNjBfY2hhcmdlcl91c2JfdHlwZXNbXSA9IHsKPiA+ICsgICAg IFBPV0VSX1NVUFBMWV9VU0JfVFlQRV9VTktOT1dOLAo+ID4gKyAgICAgUE9XRVJfU1VQUExZX1VT Ql9UWVBFX1NEUCwKPiA+ICsgICAgIFBPV0VSX1NVUFBMWV9VU0JfVFlQRV9EQ1AsCj4gPiArICAg ICBQT1dFUl9TVVBQTFlfVVNCX1RZUEVfQ0RQLAo+ID4gKyAgICAgUE9XRVJfU1VQUExZX1VTQl9U WVBFX0MsCj4gPiArICAgICBQT1dFUl9TVVBQTFlfVVNCX1RZUEVfUEQsCj4gPiArICAgICBQT1dF Ul9TVVBQTFlfVVNCX1RZUEVfUERfRFJQLAo+ID4gKyAgICAgUE9XRVJfU1VQUExZX1VTQl9UWVBF X0FQUExFX0JSSUNLX0lECj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgaW5saW5lIHVuc2lnbmVk IGludCBtdDYzNjBfdHJhbnNfcmVnX3NlbCh1MzIgZGF0YSwgdTMyIG1pbl92YWwsIHUzMiBzdGVw LAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBt YXhfc2VsKQo+Cj4gRHJvcCBhbGwgaW5saW5lcy4KPgoKQUNLCgo+ID4gK3sKPiA+ICsgICAgIHVu c2lnbmVkIGludCB0YXJnZXQgPSAwOwo+ID4gKwo+ID4gKyAgICAgaWYgKGRhdGEgPj0gbWluX3Zh bCkKPiA+ICsgICAgICAgICAgICAgdGFyZ2V0ID0gKGRhdGEgLSBtaW5fdmFsKSAvIHN0ZXA7Cj4g PiArICAgICBpZiAodGFyZ2V0ID4gbWF4X3NlbCkKPiA+ICsgICAgICAgICAgICAgdGFyZ2V0ID0g bWF4X3NlbDsKPiA+ICsgICAgIHJldHVybiB0YXJnZXQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRp YyBpbmxpbmUgaW50IG10NjM2MF9nZXRfY2hyZGV0X2V4dF9zdGF0KHN0cnVjdCBtdDYzNjBfY2hn X2luZm8gKm1jaSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBib29sICpwd3JfcmR5KQo+ID4gK3sKPiA+ICsgICAgIGludCByZXQ7Cj4gPiArICAgICB1bnNp Z25lZCBpbnQgcmVndmFsOwo+ID4gKwo+ID4gKyAgICAgcmV0ID0gcmVnbWFwX3JlYWQobWNpLT5y ZWdtYXAsIE1UNjM2MF9QTVVfRk9EX1NUQVQsICZyZWd2YWwpOwo+ID4gKyAgICAgaWYgKHJldCA8 IDApCj4gPiArICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICAqcHdyX3JkeSA9IChy ZWd2YWwgJiBNVDYzNjBfTUFTS19DSFJERVRfRVhUKSA/IHRydWUgOiBmYWxzZTsKPiA+ICsgICAg IHJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX2dl dF9vbmxpbmUoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4g K3sKPiA+ICsgICAgIGludCByZXQ7Cj4gPiArICAgICBib29sIHB3cl9yZHk7Cj4gPiArCj4gPiAr ICAgICByZXQgPSBtdDYzNjBfZ2V0X2NocmRldF9leHRfc3RhdChtY2ksICZwd3JfcmR5KTsKPiA+ ICsgICAgIGlmIChyZXQgPCAwKQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKyAg ICAgdmFsLT5pbnR2YWwgPSBwd3JfcmR5ID8gdHJ1ZSA6IGZhbHNlOwo+ID4gKyAgICAgcmV0dXJu IDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X3N0YXR1 cyhzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2ksCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4g KyAgICAgaW50IHN0YXR1cywgcmV0Owo+ID4gKyAgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsKPiA+ ICsgICAgIGJvb2wgcHdyX3JkeTsKPiA+ICsKPiA+ICsgICAgIHJldCA9IG10NjM2MF9nZXRfY2hy ZGV0X2V4dF9zdGF0KG1jaSwgJnB3cl9yZHkpOwo+ID4gKyAgICAgaWYgKHJldCA8IDApCj4gPiAr ICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICBpZiAoIXB3cl9yZHkpIHsKPiA+ICsg ICAgICAgICAgICAgc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKPiA+ ICsgICAgICAgICAgICAgZ290byBvdXQ7Cj4gPiArICAgICB9Cj4gPiArCj4gPiArICAgICByZXQg PSByZWdtYXBfcmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9DSEdfU1RBVCwgJnJlZ3ZhbCk7 Cj4gPiArICAgICBpZiAocmV0IDwgMCkKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+ ICsgICAgIHJlZ3ZhbCAmPSBNVDYzNjBfTUFTS19DSEdfU1RBVDsKPiA+ICsgICAgIHJlZ3ZhbCA+ Pj0gTVQ2MzYwX1NIRlRfQ0hHX1NUQVQ7Cj4gPiArICAgICBzd2l0Y2ggKHJlZ3ZhbCkgewo+ID4g KyAgICAgY2FzZSAweDA6Cj4gPiArICAgICAgICAgICAgIHN0YXR1cyA9IFBPV0VSX1NVUFBMWV9T VEFUVVNfTk9UX0NIQVJHSU5HOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNh c2UgMHgxOgo+ID4gKyAgICAgICAgICAgICBzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NI QVJHSU5HOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgMHgyOgo+ID4g KyAgICAgICAgICAgICBzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7Cj4gPiArICAg ICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgZGVmYXVsdDoKPiA+ICsgICAgICAgICAgICAgcmV0 ID0gLUVJTzsKPiA+ICsgICAgIH0KPiA+ICtvdXQ6Cj4gPiArICAgICBpZiAoIXJldCkKPiA+ICsg ICAgICAgICAgICAgdmFsLT5pbnR2YWwgPSBzdGF0dXM7Cj4gPiArICAgICByZXR1cm4gcmV0Owo+ ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX2dldF9jaGFyZ2VfdHlw ZShzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2ksCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKPiA+ICt7 Cj4gPiArICAgICBpbnQgdHlwZSwgcmV0Owo+ID4gKyAgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsK PiA+ICsgICAgIHU4IGNoZ19zdGF0Owo+ID4gKwo+ID4gKyAgICAgcmV0ID0gcmVnbWFwX3JlYWQo bWNpLT5yZWdtYXAsIE1UNjM2MF9QTVVfQ0hHX1NUQVQsICZyZWd2YWwpOwo+ID4gKyAgICAgaWYg KHJldCA8IDApCj4gPiArICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICBjaGdfc3Rh dCA9IChyZWd2YWwgJiBNVDYzNjBfTUFTS19DSEdfU1RBVCkgPj4gTVQ2MzYwX1NIRlRfQ0hHX1NU QVQ7Cj4gPiArICAgICBzd2l0Y2ggKGNoZ19zdGF0KSB7Cj4gPiArICAgICBjYXNlIDB4MDA6IC8q IE5vdCBDaGFyZ2luZyAqLwo+ID4gKyAgICAgICAgICAgICB0eXBlID0gUE9XRVJfU1VQUExZX0NI QVJHRV9UWVBFX05PTkU7Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSAw eDAxOiAvKiBDaGFyZ2UgaW4gUHJvZ3Jlc3MgKi8KPiA+ICsgICAgICAgICAgICAgaWYgKHJlZ3Zh bCAmIE1UNjM2MF9NQVNLX1ZCQVRfTFZMKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHR5cGUg PSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfRkFTVDsKPiA+ICsgICAgICAgICAgICAgZWxzZQo+ ID4gKyAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVf VFJJQ0tMRTsKPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICBjYXNlIDB4MDI6IC8q IENoYXJnZSBEb25lICovCj4gPiArICAgICAgICAgICAgIHR5cGUgPSBQT1dFUl9TVVBQTFlfQ0hB UkdFX1RZUEVfTk9ORTsKPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICBjYXNlIDB4 MDM6IC8qIENoYXJnZSBGYXVsdCAqLwo+ID4gKyAgICAgICAgICAgICB0eXBlID0gUE9XRVJfU1VQ UExZX1NUQVRVU19VTktOT1dOOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGRl ZmF1bHQ6Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgfQo+ID4gKyAgICAgdmFs LT5pbnR2YWwgPSB0eXBlOwo+ID4gKyAgICAgcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0 YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X2ljaGcoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAq bWNpLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gcG93ZXJfc3Vw cGx5X3Byb3B2YWwgKnZhbCkKPiA+ICt7Cj4gPiArICAgICBpbnQgaWNoZywgcmV0Owo+ID4gKyAg ICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsKPiA+ICsKPiA+ICsgICAgIHJldCA9IHJlZ21hcF9yZWFk KG1jaS0+cmVnbWFwLCBNVDYzNjBfUE1VX0NIR19DVFJMNywgJnJlZ3ZhbCk7Cj4gPiArICAgICBp ZiAocmV0IDwgMCkKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+ICsgICAgIHJlZ3Zh bCA9IChyZWd2YWwgJiBNVDYzNjBfTUFTS19JQ0hHKSA+PiBNVDYzNjBfU0hGVF9JQ0hHOwo+ID4g KyAgICAgaWNoZyA9IE1UNjM2MF9JQ0hHX01JTiArIChyZWd2YWwgKiBNVDYzNjBfSUNIR19TVEVQ KTsKPiA+ICsgICAgIGlmIChpY2hnID4gTVQ2MzYwX0lDSEdfTUFYKQo+ID4gKyAgICAgICAgICAg ICBpY2hnID0gTVQ2MzYwX0lDSEdfTUFYOwo+ID4gKyAgICAgdmFsLT5pbnR2YWwgPSBpY2hnOwo+ ID4gKyAgICAgcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2No YXJnZXJfZ2V0X21heF9pY2hnKHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZh bCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIHZhbC0+aW50dmFsID0gTVQ2MzYwX0lDSEdfTUFYOwo+ ID4gKyAgICAgcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2No YXJnZXJfZ2V0X2N2KHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4g K3sKPiA+ICsgICAgIGludCBjdiwgcmV0Owo+ID4gKyAgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsK PiA+ICsKPiA+ICsgICAgIHJldCA9IHJlZ21hcF9yZWFkKG1jaS0+cmVnbWFwLCBNVDYzNjBfUE1V X0NIR19DVFJMNCwgJnJlZ3ZhbCk7Cj4gPiArICAgICBpZiAocmV0IDwgMCkKPiA+ICsgICAgICAg ICAgICAgcmV0dXJuIHJldDsKPiA+ICsgICAgIHJlZ3ZhbCA9IChyZWd2YWwgJiBNVDYzNjBfTUFT S19WT1JFRykgPj4gTVQ2MzYwX1NIRlRfVk9SRUc7Cj4gPiArICAgICBjdiA9IE1UNjM2MF9WT1JF R19NSU4gKyAocmVndmFsICogTVQ2MzYwX1ZPUkVHX1NURVApOwo+ID4gKyAgICAgaWYgKGN2ID4g TVQ2MzYwX1ZPUkVHX01BWCkKPiA+ICsgICAgICAgICAgICAgY3YgPSBNVDYzNjBfVk9SRUdfTUFY Owo+ID4gKyAgICAgdmFsLT5pbnR2YWwgPSBjdjsKPiA+ICsgICAgIHJldHVybiAwOwo+ID4gK30K PiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX2dldF9tYXhfY3Yoc3RydWN0IG10 NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIHZhbC0+ aW50dmFsID0gTVQ2MzYwX1ZPUkVHX01BWDsKPiA+ICsgICAgIHJldHVybiAwOwo+ID4gK30KPiA+ ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX2dldF9haWNyKHN0cnVjdCBtdDYzNjBf Y2hnX2luZm8gKm1jaSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9u IHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4gKyAgICAgaW50IHJldDsKPiA+ ICsgICAgIHVuc2lnbmVkIGludCByZWd2YWw7Cj4gPiArCj4gPiArICAgICByZXQgPSByZWdtYXBf cmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9DSEdfQ1RSTDMsICZyZWd2YWwpOwo+ID4gKyAg ICAgaWYgKHJldCA8IDApCj4gPiArICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICBy ZWd2YWwgPSAocmVndmFsICYgTVQ2MzYwX01BU0tfSUFJQ1IpID4+IE1UNjM2MF9TSEZUX0lBSUNS Owo+ID4gKyAgICAgdmFsLT5pbnR2YWwgPSBNVDYzNjBfQUlDUl9NSU4gKyAocmVndmFsICogTVQ2 MzYwX0FJQ1JfU1RFUCk7Cj4gPiArICAgICByZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArc3Rh dGljIGludCBtdDYzNjBfY2hhcmdlcl9nZXRfaXByZWNoZyhzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZv ICptY2ksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBwb3dl cl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIGludCByZXQ7Cj4gPiArICAg ICB1bnNpZ25lZCBpbnQgcmVndmFsOwo+ID4gKwo+ID4gKyAgICAgcmV0ID0gcmVnbWFwX3JlYWQo bWNpLT5yZWdtYXAsIE1UNjM2MF9QTVVfQ0hHX0NUUkw4LCAmcmVndmFsKTsKPiA+ICsgICAgIGlm IChyZXQgPCAwKQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKyAgICAgcmVndmFs ID0gKHJlZ3ZhbCAmIE1UNjM2MF9NQVNLX0lQUkVDKSA+PiBNVDYzNjBfU0hGVF9JUFJFQzsKPiA+ ICsgICAgIHZhbC0+aW50dmFsID0gTVQ2MzYwX0lQUkVDX01JTiArIChyZWd2YWwgKiBNVDYzNjBf SVBSRUNfU1RFUCk7Cj4gPiArICAgICByZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGlj IGludCBtdDYzNjBfY2hhcmdlcl9nZXRfaWVvYyhzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2ks Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlf cHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIGludCByZXQ7Cj4gPiArICAgICB1bnNpZ25l ZCBpbnQgcmVndmFsOwo+ID4gKwo+ID4gKyAgICAgcmV0ID0gcmVnbWFwX3JlYWQobWNpLT5yZWdt YXAsIE1UNjM2MF9QTVVfQ0hHX0NUUkw5LCAmcmVndmFsKTsKPiA+ICsgICAgIGlmIChyZXQgPCAw KQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKyAgICAgcmVndmFsID0gKHJlZ3Zh bCAmIE1UNjM2MF9NQVNLX0lFT0MpID4+IE1UNjM2MF9TSEZUX0lFT0M7Cj4gPiArICAgICB2YWwt PmludHZhbCA9IE1UNjM2MF9JRU9DX01JTiArIChyZWd2YWwgKiBNVDYzNjBfSUVPQ19TVEVQKTsK PiA+ICsgICAgIHJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9j aGFyZ2VyX3NldF9vbmxpbmUoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJv cHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIHU4IGZvcmNlX3NsZWVwID0gdmFsLT5pbnR2YWwg PyAwIDogMTsKPiA+ICsKPiA+ICsgICAgIHJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMobWNpLT5y ZWdtYXAsIE1UNjM2MF9QTVVfQ0hHX0NUUkwxLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBNVDYzNjBfTUFTS19GU0xQLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBmb3JjZV9zbGVlcCA8PCBNVDYzNjBfU0hGVF9GU0xQKTsKPiA+ICt9Cj4gPiArCj4gPiAr c3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9zZXRfaWNoZyhzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZv ICptY2ksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlvbiBw b3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIHVuc2lnbmVkIGludCBy ZWd2YWw7Cj4gPiArCj4gPiArICAgICByZWd2YWwgPSBtdDYzNjBfdHJhbnNfcmVnX3NlbCh2YWwt PmludHZhbCwgMTAwMDAwLCAxMDAwMDAsIDB4MzEpOwo+ID4gKyAgICAgcmV0dXJuIHJlZ21hcF91 cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9DSEdfQ1RSTDcsCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9NQVNLX0lDSEcsIHJlZ3ZhbCA8PCBNVDYz NjBfU0hGVF9JQ0hHKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdl cl9zZXRfY3Yoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4g PiArewo+ID4gKyAgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsKPiA+ICsKPiA+ICsgICAgIHJlZ3Zh bCA9IG10NjM2MF90cmFuc19yZWdfc2VsKHZhbC0+aW50dmFsLCAzOTAwMDAwLCAxMDAwMCwgMHg1 MSk7Cj4gPiArICAgICByZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKG1jaS0+cmVnbWFwLAo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfUE1VX0NIR19DVFJMNCwKPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX01BU0tfVk9SRUcsCj4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3ZhbCA8PCBNVDYzNjBfU0hGVF9WT1JF Ryk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfc2V0X2FpY3Io c3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgY29uc3QgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKPiA+ICt7Cj4g PiArICAgICB1bnNpZ25lZCBpbnQgcmVndmFsOwo+ID4gKwo+ID4gKyAgICAgcmVndmFsID0gbXQ2 MzYwX3RyYW5zX3JlZ19zZWwodmFsLT5pbnR2YWwsIDEwMDAwMCwgNTAwMDAsIDB4M0YpOwo+ID4g KyAgICAgcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwKPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX1BNVV9DSEdfQ1RSTDMsCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9NQVNLX0lBSUNSLAo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICByZWd2YWwgPDwgTVQ2MzYwX1NIRlRfSUFJQ1IpOwo+ID4g K30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX3NldF9pcHJlY2hnKHN0cnVj dCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4g KyAgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsKPiA+ICsKPiA+ICsgICAgIHJlZ3ZhbCA9IG10NjM2 MF90cmFuc19yZWdfc2VsKHZhbC0+aW50dmFsLCAxMDAwMDAsIDUwMDAwLCAweDBGKTsKPiA+ICsg ICAgIHJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMobWNpLT5yZWdtYXAsCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9QTVVfQ0hHX0NUUkw4LAo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfTUFTS19JUFJFQywKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcmVndmFsIDw8IE1UNjM2MF9TSEZUX0lQUkVDKTsKPiA+ICt9 Cj4gPiArCj4gPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9zZXRfaWVvYyhzdHJ1Y3QgbXQ2 MzYwX2NoZ19pbmZvICptY2ksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj b25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIHVu c2lnbmVkIGludCByZWd2YWw7Cj4gPiArCj4gPiArICAgICByZWd2YWwgPSBtdDYzNjBfdHJhbnNf cmVnX3NlbCh2YWwtPmludHZhbCwgMTAwMDAwLCA1MDAwMCwgMHgwRik7Cj4gPiArICAgICByZXR1 cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKG1jaS0+cmVnbWFwLAo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBNVDYzNjBfUE1VX0NIR19DVFJMOSwKPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgTVQ2MzYwX01BU0tfSUVPQywKPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcmVndmFsIDw8IE1UNjM2MF9TSEZUX0lFT0MpOwo+ID4gK30KPiA+ICsKPiA+ ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3Vw cGx5ICpwc3ksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBw b3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4gKyAg ICAgc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRh KHBzeSk7Cj4gPiArICAgICBpbnQgcmV0ID0gMDsKPiA+ICsKPiA+ICsgICAgIGRldl9kYmcobWNp LT5kZXYsICIlczogcHJvcCA9ICVkXG4iLCBfX2Z1bmNfXywgcHNwKTsKPiA+ICsgICAgIHN3aXRj aCAocHNwKSB7Cj4gPiArICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKPiA+ICsg ICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X29ubGluZShtY2ksIHZhbCk7Cj4g PiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9T VEFUVVM6Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX2dldF9zdGF0dXMo bWNpLCB2YWwpOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgUE9XRVJf U1VQUExZX1BST1BfQ0hBUkdFX1RZUEU6Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10NjM2MF9j aGFyZ2VyX2dldF9jaGFyZ2VfdHlwZShtY2ksIHZhbCk7Cj4gPiArICAgICAgICAgICAgIGJyZWFr Owo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVO VDoKPiA+ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X2ljaGcobWNpLCB2 YWwpOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZ X1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NVUlJFTlRfTUFYOgo+ID4gKyAgICAgICAgICAgICByZXQg PSBtdDYzNjBfY2hhcmdlcl9nZXRfbWF4X2ljaGcobWNpLCB2YWwpOwo+ID4gKyAgICAgICAgICAg ICBicmVhazsKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdF X1ZPTFRBR0U6Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX2dldF9jdiht Y2ksIHZhbCk7Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSBQT1dFUl9T VVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRV9NQVg6Cj4gPiArICAgICAgICAgICAg IHJldCA9IG10NjM2MF9jaGFyZ2VyX2dldF9tYXhfY3YobWNpLCB2YWwpOwo+ID4gKyAgICAgICAg ICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfSU5QVVRfQ1VSUkVO VF9MSU1JVDoKPiA+ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X2FpY3Io bWNpLCB2YWwpOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgUE9XRVJf U1VQUExZX1BST1BfUFJFQ0hBUkdFX0NVUlJFTlQ6Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10 NjM2MF9jaGFyZ2VyX2dldF9pcHJlY2hnKG1jaSwgdmFsKTsKPiA+ICsgICAgICAgICAgICAgYnJl YWs7Cj4gPiArICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9URVJNX0NVUlJFTlQ6 Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX2dldF9pZW9jKG1jaSwgdmFs KTsKPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICBjYXNlIFBPV0VSX1NVUFBMWV9Q Uk9QX1VTQl9UWVBFOgo+ID4gKyAgICAgICAgICAgICB2YWwtPmludHZhbCA9IG1jaS0+cHN5X3Vz Yl90eXBlOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGRlZmF1bHQ6Cj4gPiAr ICAgICAgICAgICAgIHJldCA9IC1FTk9EQVRBOwo+ID4gKyAgICAgfQo+ID4gKyAgICAgcmV0dXJu IHJldDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9zZXRfcHJv cGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAo+ID4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlvbiBwb3dlcl9zdXBwbHlf cHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1j aSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwo+ID4gKyAgICAgaW50IHJldDsKPiA+ ICsKPiA+ICsgICAgIGRldl9kYmcobWNpLT5kZXYsICIlczogcHJvcCA9ICVkXG4iLCBfX2Z1bmNf XywgcHNwKTsKPiA+ICsgICAgIHN3aXRjaCAocHNwKSB7Cj4gPiArICAgICBjYXNlIFBPV0VSX1NV UFBMWV9QUk9QX09OTElORToKPiA+ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJf c2V0X29ubGluZShtY2ksIHZhbCk7Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAg Y2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVDoKPiA+ICsgICAg ICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfc2V0X2ljaGcobWNpLCB2YWwpOwo+ID4gKyAg ICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RB TlRfQ0hBUkdFX1ZPTFRBR0U6Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2Vy X3NldF9jdihtY2ksIHZhbCk7Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2Fz ZSBQT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX0xJTUlUOgo+ID4gKyAgICAgICAgICAg ICByZXQgPSBtdDYzNjBfY2hhcmdlcl9zZXRfYWljcihtY2ksIHZhbCk7Cj4gPiArICAgICAgICAg ICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVDSEFSR0VfQ1VS UkVOVDoKPiA+ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfc2V0X2lwcmVjaGco bWNpLCB2YWwpOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgUE9XRVJf U1VQUExZX1BST1BfQ0hBUkdFX1RFUk1fQ1VSUkVOVDoKPiA+ICsgICAgICAgICAgICAgcmV0ID0g bXQ2MzYwX2NoYXJnZXJfc2V0X2llb2MobWNpLCB2YWwpOwo+ID4gKyAgICAgICAgICAgICBicmVh azsKPiA+ICsgICAgIGRlZmF1bHQ6Cj4gPiArICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7Cj4g PiArICAgICB9Cj4gPiArICAgICByZXR1cm4gcmV0Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMg aW50IG10NjM2MF9jaGFyZ2VyX3Byb3BlcnR5X2lzX3dyaXRlYWJsZShzdHJ1Y3QgcG93ZXJfc3Vw cGx5ICpwc3ksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3ApCj4gPiArewo+ID4gKyAgICAgc3dpdGNo IChwc3ApIHsKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgo+ID4gKyAg ICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVDoKPiA+ICsg ICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRBR0U6Cj4gPiAr ICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0lOUFVUX0NVUlJFTlRfTElNSVQ6Cj4gPiArICAg ICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRUNIQVJHRV9DVVJSRU5UOgo+ID4gKyAgICAgY2Fz ZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVEVSTV9DVVJSRU5UOgo+ID4gKyAgICAgICAgICAg ICByZXR1cm4gMTsKPiA+ICsgICAgIGRlZmF1bHQ6Cj4gPiArICAgICAgICAgICAgIHJldHVybiAw Owo+ID4gKyAgICAgfQo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlf cHJvcGVydHkgbXQ2MzYwX2NoYXJnZXJfcHJvcGVydGllc1tdID0gewo+ID4gKyAgICAgUE9XRVJf U1VQUExZX1BST1BfT05MSU5FLAo+ID4gKyAgICAgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAo+ ID4gKyAgICAgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RZUEUsCj4gPiArICAgICBQT1dFUl9T VVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVCwKPiA+ICsgICAgIFBPV0VSX1NVUFBM WV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UX01BWCwKPiA+ICsgICAgIFBPV0VSX1NVUFBM WV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9WT0xUQUdFLAo+ID4gKyAgICAgUE9XRVJfU1VQUExZX1BS T1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRBR0VfTUFYLAo+ID4gKyAgICAgUE9XRVJfU1VQUExZX1BS T1BfSU5QVVRfQ1VSUkVOVF9MSU1JVCwKPiA+ICsgICAgIFBPV0VSX1NVUFBMWV9QUk9QX1BSRUNI QVJHRV9DVVJSRU5ULAo+ID4gKyAgICAgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RFUk1fQ1VS UkVOVCwKPiA+ICsgICAgIFBPV0VSX1NVUFBMWV9QUk9QX1VTQl9UWVBFLAo+ID4gK307Cj4gPiAr Cj4gPiArc3RhdGljIGNoYXIgKm10NjM2MF9jaGFyZ2VyX3N1cHBsaWVkX3RvW10gPSB7Cj4gPiAr ICAgICAibWFpbi1iYXR0ZXJ5Igo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljIGNvbnN0IHN0cnVj dCBwb3dlcl9zdXBwbHlfZGVzYyBtdDYzNjBfY2hhcmdlcl9kZXNjID0gewo+ID4gKyAgICAgLnR5 cGUgICAgICAgICAgICAgICAgICAgPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0IsCj4gPiArICAgICAu cHJvcGVydGllcyAgICAgICAgICAgICA9IG10NjM2MF9jaGFyZ2VyX3Byb3BlcnRpZXMsCj4gPiAr ICAgICAubnVtX3Byb3BlcnRpZXMgICAgICAgICA9IEFSUkFZX1NJWkUobXQ2MzYwX2NoYXJnZXJf cHJvcGVydGllcyksCj4gPiArICAgICAuZ2V0X3Byb3BlcnR5ICAgICAgICAgICA9IG10NjM2MF9j aGFyZ2VyX2dldF9wcm9wZXJ0eSwKPiA+ICsgICAgIC5zZXRfcHJvcGVydHkgICAgICAgICAgID0g bXQ2MzYwX2NoYXJnZXJfc2V0X3Byb3BlcnR5LAo+ID4gKyAgICAgLnByb3BlcnR5X2lzX3dyaXRl YWJsZSAgPSBtdDYzNjBfY2hhcmdlcl9wcm9wZXJ0eV9pc193cml0ZWFibGUsCj4gPiArICAgICAu dXNiX3R5cGVzICAgICAgICAgICAgICA9IG10NjM2MF9jaGFyZ2VyX3VzYl90eXBlcywKPiA+ICsg ICAgIC5udW1fdXNiX3R5cGVzICAgICAgICAgID0gQVJSQVlfU0laRShtdDYzNjBfY2hhcmdlcl91 c2JfdHlwZXMpLAo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1bGF0 b3Jfb3BzIG10NjM2MF9jaGdfb3RnX29wcyA9IHsKPiA+ICsgICAgIC5saXN0X3ZvbHRhZ2UgPSBy ZWd1bGF0b3JfbGlzdF92b2x0YWdlX2xpbmVhciwKPiA+ICsgICAgIC5lbmFibGUgPSByZWd1bGF0 b3JfZW5hYmxlX3JlZ21hcCwKPiA+ICsgICAgIC5kaXNhYmxlID0gcmVndWxhdG9yX2Rpc2FibGVf cmVnbWFwLAo+ID4gKyAgICAgLmlzX2VuYWJsZWQgPSByZWd1bGF0b3JfaXNfZW5hYmxlZF9yZWdt YXAsCj4gPiArICAgICAuc2V0X3ZvbHRhZ2Vfc2VsID0gcmVndWxhdG9yX3NldF92b2x0YWdlX3Nl bF9yZWdtYXAsCj4gPiArICAgICAuZ2V0X3ZvbHRhZ2Vfc2VsID0gcmVndWxhdG9yX2dldF92b2x0 YWdlX3NlbF9yZWdtYXAsCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHJl Z3VsYXRvcl9kZXNjIG10NjM2MF9vdGdfcmRlc2MgPSB7Cj4gPiArICAgICAub2ZfbWF0Y2ggPSAi dXNiLW90Zy12YnVzIiwKPiA+ICsgICAgIC5uYW1lID0gInVzYi1vdGctdmJ1cyIsCj4gPiArICAg ICAub3BzID0gJm10NjM2MF9jaGdfb3RnX29wcywKPiA+ICsgICAgIC5vd25lciA9IFRISVNfTU9E VUxFLAo+ID4gKyAgICAgLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKPiA+ICsgICAgIC5taW5f dVYgPSA0NDI1MDAwLAo+ID4gKyAgICAgLnVWX3N0ZXAgPSAyNTAwMCwgLyogc3RlcCAgMjVtViAq Lwo+ID4gKyAgICAgLm5fdm9sdGFnZXMgPSA1NywgLyogNDQyNW1WIHRvIDU4MjVtViAqLwo+ID4g KyAgICAgLnZzZWxfcmVnID0gTVQ2MzYwX1BNVV9DSEdfQ1RSTDUsCj4gPiArICAgICAudnNlbF9t YXNrID0gTVQ2MzYwX01BU0tfVk9CU1QsCj4gPiArICAgICAuZW5hYmxlX3JlZyA9IE1UNjM2MF9Q TVVfQ0hHX0NUUkwxLAo+ID4gKyAgICAgLmVuYWJsZV9tYXNrID0gTVQ2MzYwX01BU0tfT1BBX01P REUsCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG10NjM2MF9l eHRjb25fY2FibGVbXSA9IHsKPiA+ICsgICAgIEVYVENPTl9VU0IsCj4gPiArICAgICBFWFRDT05f VVNCX0hPU1QsCj4gPiArICAgICBFWFRDT05fQ0hHX1VTQl9TRFAsCj4gPiArICAgICBFWFRDT05f Q0hHX1VTQl9EQ1AsCj4gPiArICAgICBFWFRDT05fQ0hHX1VTQl9DRFAsCj4gPiArICAgICBFWFRD T05fQ0hHX1VTQl9TTE9XLCAvKiBGb3IgTm9uU3RhbmRhcmQgQ2hhcmdlciAqLwo+ID4gKyAgICAg RVhUQ09OX05PTkUsCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgaXJxcmV0dXJuX3QgbXQ2MzYw X3BtdV9jaGdfdHJlZ19ldnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQo+ID4gK3sKPiA+ ICsgICAgIHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSA9IGRhdGE7Cj4gPiArCj4gPiArICAg ICBkZXZfd2FybihtY2ktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICByZXR1cm4g SVJRX0hBTkRMRUQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpcnFyZXR1cm5fdCBtdDYzNjBf cG11X3B3cl9yZHlfZXZ0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKPiA+ICt7Cj4gPiAr ICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBkYXRhOwo+ID4gKwo+ID4gKyAgICAg ZGV2X2RiZyhtY2ktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICByZXR1cm4gSVJR X0hBTkRMRUQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpcnFyZXR1cm5fdCBtdDYzNjBfcG11 X2NoZ19iYXRzeXN1dl9ldnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQo+ID4gK3sKPiA+ ICsgICAgIHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSA9IGRhdGE7Cj4gPiArCj4gPiArICAg ICBkZXZfd2FybihtY2ktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICByZXR1cm4g SVJRX0hBTkRMRUQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpcnFyZXR1cm5fdCBtdDYzNjBf cG11X2NoZ192c3lzdXZfZXZ0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKPiA+ICt7Cj4g PiArICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBkYXRhOwo+ID4gKwo+ID4gKyAg ICAgZGV2X3dhcm4obWNpLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwo+ID4gKyAgICAgcmV0dXJu IElSUV9IQU5ETEVEOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaXJxcmV0dXJuX3QgbXQ2MzYw X3BtdV9jaGdfdnN5c292X2V2dF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCj4gPiArewo+ ID4gKyAgICAgc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpID0gZGF0YTsKPiA+ICsKPiA+ICsg ICAgIGRldl93YXJuKG1jaS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKPiA+ICsgICAgIHJldHVy biBJUlFfSEFORExFRDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGlycXJldHVybl90IG10NjM2 MF9wbXVfY2hnX3ZiYXRvdl9ldnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQo+ID4gK3sK PiA+ICsgICAgIHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSA9IGRhdGE7Cj4gPiArCj4gPiAr ICAgICBkZXZfd2FybihtY2ktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICByZXR1 cm4gSVJRX0hBTkRMRUQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpcnFyZXR1cm5fdCBtdDYz NjBfcG11X2NoZ192YnVzb3ZfZXZ0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKPiA+ICt7 Cj4gPiArICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBkYXRhOwo+ID4gKwo+ID4g KyAgICAgZGV2X3dhcm4obWNpLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwo+ID4gKyAgICAgcmV0 dXJuIElSUV9IQU5ETEVEOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaXJxcmV0dXJuX3QgbXQ2 MzYwX3BtdV9jaGdfYWljY21lYXNsX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKPiA+ICt7 Cj4gPiArICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBkYXRhOwo+ID4gKwo+ID4g KyAgICAgZGV2X2RiZyhtY2ktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICByZXR1 cm4gSVJRX0hBTkRMRUQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpcnFyZXR1cm5fdCBtdDYz NjBfcG11X3dkdG1yaV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCj4gPiArewo+ID4gKyAg ICAgc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpID0gZGF0YTsKPiA+ICsKPiA+ICsgICAgIGRl dl9kYmcobWNpLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwo+ID4gKyAgICAgcmV0dXJuIElSUV9I QU5ETEVEOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaXJxcmV0dXJuX3QgbXQ2MzYwX3BtdV9j aGdfcmVjaGdpX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKPiA+ICt7Cj4gPiArICAgICBz dHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBkYXRhOwo+ID4gKwo+ID4gKyAgICAgZGV2X2Ri ZyhtY2ktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICByZXR1cm4gSVJRX0hBTkRM RUQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpcnFyZXR1cm5fdCBtdDYzNjBfcG11X2NoZ190 ZXJtaV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCj4gPiArewo+ID4gKyAgICAgc3RydWN0 IG10NjM2MF9jaGdfaW5mbyAqbWNpID0gZGF0YTsKPiA+ICsKPiA+ICsgICAgIGRldl9kYmcobWNp LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwo+ID4gKyAgICAgcmV0dXJuIElSUV9IQU5ETEVEOwo+ ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaXJxcmV0dXJuX3QgbXQ2MzYwX3BtdV9jaGdfaWVvY2lf aGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQo+ID4gK3sKPiA+ICsgICAgIHN0cnVjdCBtdDYz NjBfY2hnX2luZm8gKm1jaSA9IGRhdGE7Cj4gPiArCj4gPiArICAgICBkZXZfZGJnKG1jaS0+ZGV2 LCAiJXNcbiIsIF9fZnVuY19fKTsKPiA+ICsgICAgIHJldHVybiBJUlFfSEFORExFRDsKPiA+ICt9 Cj4gPiArCj4gPiArc3RhdGljIGlycXJldHVybl90IG10NjM2MF9wbXVfcHVtcHhfZG9uZWlfaGFu ZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQo+ID4gK3sKPiA+ICsgICAgIHN0cnVjdCBtdDYzNjBf Y2hnX2luZm8gKm1jaSA9IGRhdGE7Cj4gPiArCj4gPiArICAgICBkZXZfZGJnKG1jaS0+ZGV2LCAi JXNcbiIsIF9fZnVuY19fKTsKPgo+IEFsbCB0aGlzIGlzIGxvb2tzIGJvZ3VzLgo+CgpBQ0sKCj4g PiArICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpcnFy ZXR1cm5fdCBtdDYzNjBfcG11X2F0dGFjaF9pX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkK PiA+ICt7Cj4gPiArICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBkYXRhOwo+ID4g KyAgICAgaW50IHJldCwgY2hnX3R5cGUgPSBFWFRDT05fTk9ORTsKPiA+ICsgICAgIHVuc2lnbmVk IGludCB1c2Jfc3RhdHVzOwo+ID4gKyAgICAgaW50IGxhc3RfdXNiX3R5cGU7Cj4gPiArCj4gPiAr ICAgICBkZXZfZGJnKG1jaS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKPiA+ICsgICAgIG11dGV4 X2xvY2soJm1jaS0+Y2hnZGV0X2xvY2spOwo+ID4gKyAgICAgaWYgKCFtY2ktPmJjMTJfZW4pIHsK PiA+ICsgICAgICAgICAgICAgZGV2X2luZm8obWNpLT5kZXYsICIlczogYmMxMiBkaXNhYmxlZCwg aWdub3JlIGlycVxuIiwgX19mdW5jX18pOwo+ID4gKyAgICAgICAgICAgICBnb3RvIG91dDsKPiA+ ICsgICAgIH0KPiA+ICsgICAgIGxhc3RfdXNiX3R5cGUgPSBtY2ktPnBzeV91c2JfdHlwZTsKPiA+ ICsgICAgIC8qIFBsdWcgaW4gKi8KPiA+ICsgICAgIHJldCA9IHJlZ21hcF9yZWFkKG1jaS0+cmVn bWFwLCBNVDYzNjBfUE1VX1VTQl9TVEFUVVMxLCAmdXNiX3N0YXR1cyk7Cj4gPiArICAgICBpZiAo cmV0IDwgMCkKPiA+ICsgICAgICAgICAgICAgZ290byBvdXQ7Cj4gPiArICAgICB1c2Jfc3RhdHVz ICY9IE1UNjM2MF9NQVNLX1VTQl9TVEFUVVM7Cj4gPiArICAgICB1c2Jfc3RhdHVzID4+PSBNVDYz NjBfU0hGVF9VU0JfU1RBVFVTOwo+ID4gKyAgICAgc3dpdGNoICh1c2Jfc3RhdHVzKSB7Cj4gPiAr ICAgICBjYXNlIE1UNjM2MF9DSEdfVFlQRV9VTkRFUl9HT0lORzoKPiA+ICsgICAgICAgICAgICAg ZGV2X2luZm8obWNpLT5kZXYsICIlczogdW5kZXIgZ29pbmcuLi5cbiIsIF9fZnVuY19fKTsKPiA+ ICsgICAgICAgICAgICAgZ290byBvdXQ7Cj4gPiArICAgICBjYXNlIE1UNjM2MF9DSEdfVFlQRV9T RFA6Cj4gPiArICAgICAgICAgICAgIGNoZ190eXBlID0gRVhUQ09OX0NIR19VU0JfU0RQOwo+ID4g KyAgICAgICAgICAgICBtY2ktPnBzeV91c2JfdHlwZSA9IFBPV0VSX1NVUFBMWV9VU0JfVFlQRV9T RFA7Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSBNVDYzNjBfQ0hHX1RZ UEVfU0RQTlNURDoKPiA+ICsgICAgICAgICAgICAgY2hnX3R5cGUgPSBFWFRDT05fQ0hHX1VTQl9T TE9XOwo+ID4gKyAgICAgICAgICAgICBtY2ktPnBzeV91c2JfdHlwZSA9IFBPV0VSX1NVUFBMWV9V U0JfVFlQRV9TRFA7Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSBNVDYz NjBfQ0hHX1RZUEVfQ0RQOgo+ID4gKyAgICAgICAgICAgICBjaGdfdHlwZSA9IEVYVENPTl9DSEdf VVNCX0NEUDsKPiA+ICsgICAgICAgICAgICAgbWNpLT5wc3lfdXNiX3R5cGUgPSBQT1dFUl9TVVBQ TFlfVVNCX1RZUEVfQ0RQOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2Ug TVQ2MzYwX0NIR19UWVBFX0RDUDoKPiA+ICsgICAgICAgICAgICAgY2hnX3R5cGUgPSBFWFRDT05f Q0hHX1VTQl9EQ1A7Cj4gPiArICAgICAgICAgICAgIG1jaS0+cHN5X3VzYl90eXBlID0gUE9XRVJf U1VQUExZX1VTQl9UWVBFX0RDUDsKPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICBk ZWZhdWx0Ogo+ID4gKyAgICAgICAgICAgICBkZXZfd2FybihtY2ktPmRldiwKPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgIiVzOiBkaXNjb25uZWN0IG9yIHVua25vd24gc3RhdHVzXG4iLCBfX2Z1 bmNfXyk7Cj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0Owo+ID4gKyAgICAgfQo+ID4gKwo+ID4g KyAgICAgZGV2X2luZm8obWNpLT5kZXYsICIlczogY2hnX3R5cGUgPSAlZFxuIiwgX19mdW5jX18s IGNoZ190eXBlKTsKPiA+ICsgICAgIGlmIChjaGdfdHlwZSA9PSBFWFRDT05fQ0hHX1VTQl9TRFAg fHwgY2hnX3R5cGUgPT0gRVhUQ09OX0NIR19VU0JfQ0RQKSB7Cj4gPiArICAgICAgICAgICAgIGV4 dGNvbl9zZXRfc3RhdGVfc3luYyhtY2ktPmVkZXYsIEVYVENPTl9VU0JfSE9TVCwgZmFsc2UpOwo+ ID4gKyAgICAgICAgICAgICBleHRjb25fc2V0X3N0YXRlX3N5bmMobWNpLT5lZGV2LCBFWFRDT05f VVNCLCB0cnVlKTsKPiA+ICsgICAgIH0KPiA+ICsgICAgIGV4dGNvbl9zZXRfc3RhdGVfc3luYyht Y2ktPmVkZXYsIGNoZ190eXBlLCB0cnVlKTsKPiA+ICsgICAgIGlmIChsYXN0X3VzYl90eXBlICE9 IG1jaS0+cHN5X3VzYl90eXBlKQo+ID4gKyAgICAgICAgICAgICBwb3dlcl9zdXBwbHlfY2hhbmdl ZChtY2ktPnBzeSk7Cj4gPiArb3V0Ogo+ID4gKyAgICAgbXV0ZXhfdW5sb2NrKCZtY2ktPmNoZ2Rl dF9sb2NrKTsKPiA+ICsgICAgIHJldHVybiBJUlFfSEFORExFRDsKPiA+ICt9Cj4gPiArCj4gPiAr c3RhdGljIHZvaWQgbXQ2MzYwX2hhbmRsZV9jaHJkZXRfZXh0X2V2dChzdHJ1Y3QgbXQ2MzYwX2No Z19pbmZvICptY2kpCj4gPiArewo+ID4gKyAgICAgaW50IGksIHJldDsKPiA+ICsgICAgIGJvb2wg cHdyX3JkeTsKPiA+ICsgICAgIGludCBsYXN0X3VzYl90eXBlOwo+ID4gKwo+ID4gKyAgICAgbXV0 ZXhfbG9jaygmbWNpLT5jaGdkZXRfbG9jayk7Cj4gPiArICAgICByZXQgPSBtdDYzNjBfZ2V0X2No cmRldF9leHRfc3RhdChtY2ksICZwd3JfcmR5KTsKPiA+ICsgICAgIGlmIChyZXQgPCAwKQo+ID4g KyAgICAgICAgICAgICBnb3RvIG91dDsKPiA+ICsgICAgIGlmIChtY2ktPnB3cl9yZHkgPT0gcHdy X3JkeSkgewo+ID4gKyAgICAgICAgICAgICBkZXZfaW5mbyhtY2ktPmRldiwKPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgIiVzOiBwd3JfcmR5IGlzIHNhbWUoJWQpXG4iLCBfX2Z1bmNfXywgcHdy X3JkeSk7Cj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0Owo+ID4gKyAgICAgfQo+ID4gKyAgICAg bWNpLT5wd3JfcmR5ID0gcHdyX3JkeTsKPiA+ICsgICAgIGxhc3RfdXNiX3R5cGUgPSBtY2ktPnBz eV91c2JfdHlwZTsKPiA+ICsgICAgIGRldl9pbmZvKG1jaS0+ZGV2LCAiJXM6IHB3cl9yZHkgPSAl ZFxuIiwgX19mdW5jX18sIHB3cl9yZHkpOwo+ID4gKyAgICAgaWYgKCFwd3JfcmR5KSB7Cj4gPiAr ICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG10NjM2MF9leHRjb25fY2Fi bGUpIC0gMTsgaSsrKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgZXh0Y29uX3NldF9zdGF0 ZV9zeW5jKG1jaS0+ZWRldiwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgbXQ2MzYwX2V4dGNvbl9jYWJsZVtpXSwgZmFsc2UpOwo+ID4gKyAgICAgICAgICAg ICB9Cj4gPiArICAgICAgICAgICAgIG1jaS0+cHN5X3VzYl90eXBlID0gUE9XRVJfU1VQUExZX1VT Ql9UWVBFX1VOS05PV047Cj4gPiArICAgICAgICAgICAgIGlmIChsYXN0X3VzYl90eXBlICE9IG1j aS0+cHN5X3VzYl90eXBlKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHBvd2VyX3N1cHBseV9j aGFuZ2VkKG1jaS0+cHN5KTsKPiA+ICsKPiA+ICsgICAgIH0KPiA+ICsgICAgIHJldCA9IHJlZ21h cF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBNVDYzNjBfUE1VX0RFVklDRV9UWVBFLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIE1UNjM2MF9NQVNLX1VTQkNIR0VOLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHB3cl9yZHkgPyBNVDYzNjBfTUFTS19VU0JDSEdFTiA6IDApOwo+ID4gKyAgICAgaWYg KHJldCA8IDApCj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0Owo+ID4gKyAgICAgbWNpLT5iYzEy X2VuID0gcHdyX3JkeTsKPiA+ICtvdXQ6Cj4gPiArICAgICBtdXRleF91bmxvY2soJm1jaS0+Y2hn ZGV0X2xvY2spOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBtdDYzNjBfY2hyZGV0X3dv cmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ID4gK3sKPiA+ICsgICAgIHN0cnVjdCBtdDYz NjBfY2hnX2luZm8gKm1jaSA9IChzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICopY29udGFpbmVyX29m KAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLCBzdHJ1Y3QgbXQ2 MzYwX2NoZ19pbmZvLCBjaHJkZXRfd29yayk7Cj4gPiArCj4gPiArICAgICBkZXZfaW5mbyhtY2kt PmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICBtdDYzNjBfaGFuZGxlX2NocmRldF9l eHRfZXZ0KG1jaSk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpcnFyZXR1cm5fdCBtdDYzNjBf cG11X2NocmRldF9leHRfZXZ0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKPiA+ICt7Cj4g PiArICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBkYXRhOwo+ID4gKwo+ID4gKyAg ICAgZGV2X2luZm8obWNpLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwo+ID4gKyAgICAgbXQ2MzYw X2hhbmRsZV9jaHJkZXRfZXh0X2V2dChtY2kpOwo+ID4gKyAgICAgcmV0dXJuIElSUV9IQU5ETEVE Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG10NjM2MF9pcnFfZGVzYyBt dDYzNjBfY2hnX2lycV9kZXNjW10gPSB7Cj4gPiArICAgICB7ICJjaGdfdHJlZ19ldnQiLCBtdDYz NjBfcG11X2NoZ190cmVnX2V2dF9oYW5kbGVyIH0sCj4gPiArICAgICB7ICJwd3JfcmR5X2V2dCIs IG10NjM2MF9wbXVfcHdyX3JkeV9ldnRfaGFuZGxlciB9LAo+ID4gKyAgICAgeyAiY2hnX2JhdHN5 c3V2X2V2dCIsIG10NjM2MF9wbXVfY2hnX2JhdHN5c3V2X2V2dF9oYW5kbGVyIH0sCj4gPiArICAg ICB7ICJjaGdfdnN5c3V2X2V2dCIsIG10NjM2MF9wbXVfY2hnX3ZzeXN1dl9ldnRfaGFuZGxlciB9 LAo+ID4gKyAgICAgeyAiY2hnX3ZzeXNvdl9ldnQiLCBtdDYzNjBfcG11X2NoZ192c3lzb3ZfZXZ0 X2hhbmRsZXIgfSwKPiA+ICsgICAgIHsgImNoZ192YmF0b3ZfZXZ0IiwgbXQ2MzYwX3BtdV9jaGdf dmJhdG92X2V2dF9oYW5kbGVyIH0sCj4gPiArICAgICB7ICJjaGdfdmJ1c292X2V2dCIsIG10NjM2 MF9wbXVfY2hnX3ZidXNvdl9ldnRfaGFuZGxlciB9LAo+ID4gKyAgICAgeyAiY2hnX2FpY2NtZWFz bCIsIG10NjM2MF9wbXVfY2hnX2FpY2NtZWFzbF9oYW5kbGVyIH0sCj4gPiArICAgICB7ICJ3ZHRt cmkiLCBtdDYzNjBfcG11X3dkdG1yaV9oYW5kbGVyIH0sCj4gPiArICAgICB7ICJjaGdfcmVjaGdp IiwgbXQ2MzYwX3BtdV9jaGdfcmVjaGdpX2hhbmRsZXIgfSwKPiA+ICsgICAgIHsgImNoZ190ZXJt aSIsIG10NjM2MF9wbXVfY2hnX3Rlcm1pX2hhbmRsZXIgfSwKPiA+ICsgICAgIHsgImNoZ19pZW9j aSIsIG10NjM2MF9wbXVfY2hnX2llb2NpX2hhbmRsZXIgfSwKPiA+ICsgICAgIHsgInB1bXB4X2Rv bmVpIiwgbXQ2MzYwX3BtdV9wdW1weF9kb25laV9oYW5kbGVyIH0sCj4gPiArICAgICB7ICJhdHRh Y2hfaSIsIG10NjM2MF9wbXVfYXR0YWNoX2lfaGFuZGxlciB9LAo+ID4gKyAgICAgeyAiY2hyZGV0 X2V4dF9ldnQiLCBtdDYzNjBfcG11X2NocmRldF9leHRfZXZ0X2hhbmRsZXIgfSwKPiA+ICt9Owo+ ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoZ19pcnFfcmVnaXN0ZXIoc3RydWN0IHBsYXRm b3JtX2RldmljZSAqcGRldikKPiA+ICt7Cj4gPiArICAgICBjb25zdCBzdHJ1Y3QgbXQ2MzYwX2ly cV9kZXNjICppcnFfZGVzYzsKPiA+ICsgICAgIGludCBpLCBpcnEsIHJldDsKPiA+ICsKPiA+ICsg ICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG10NjM2MF9jaGdfaXJxX2Rlc2MpOyBpKysp IHsKPiA+ICsgICAgICAgICAgICAgaXJxX2Rlc2MgPSBtdDYzNjBfY2hnX2lycV9kZXNjICsgaTsK PiA+ICsgICAgICAgICAgICAgaWYgKHVubGlrZWx5KCFpcnFfZGVzYy0+bmFtZSkpCj4gPiArICAg ICAgICAgICAgICAgICAgICAgY29udGludWU7Cj4KPiBDYW4gdGhpcyBoYXBwZW4/Cj4KCk5vLCBJ IHdpbGwgcmVtb3ZlIGl0LgoKPiA+ICsgICAgICAgICAgICAgaXJxID0gcGxhdGZvcm1fZ2V0X2ly cV9ieW5hbWUocGRldiwgaXJxX2Rlc2MtPm5hbWUpOwo+Cj4gSW50ZXJydXB0cyB3ZXJlIG5vdCBk ZXNjcmliZWQgaW4gdGhlIGJpbmRpbmdzLgo+CgpJIGFkZCByZXNvdXJjZSB3aGVuIE1GRCBkcml2 ZXIgYWRkIHN1Yi1kZXZpY2UuIFNob3VsZCBJIGFkZCBzb21ldGhpbmcKaW4gZHQtYmluZGluZz8K CiAgICAgICByZXQgPSBkZXZtX21mZF9hZGRfZGV2aWNlcygmY2xpZW50LT5kZXYsIFBMQVRGT1JN X0RFVklEX0FVVE8sCm10NjM2MF9kZXZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIEFSUkFZX1NJWkUobXQ2MzYwX2RldnMpLCBOVUxMLCAwLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHJlZ21hcF9pcnFfZ2V0X2RvbWFpbihkZGF0YS0+aXJxX2RhdGEpKTsK CnN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgbXQ2MzYwX2NoZ19yZXNvdXJjZXNbXSA9IHsK ICAgICAgICBERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfQ0hHX1RSRUdfRVZULCAiY2hnX3Ry ZWdfZXZ0IiksCiAgICAgICAgREVGSU5FX1JFU19JUlFfTkFNRUQoTVQ2MzYwX1BXUl9SRFlfRVZU LCAicHdyX3JkeV9ldnQiKSwKICAgICAgICBERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfQ0hH X0JBVFNZU1VWX0VWVCwKImNoZ19iYXRzeXN1dl9ldnQiKSwKICAgICAgICBERUZJTkVfUkVTX0lS UV9OQU1FRChNVDYzNjBfQ0hHX1ZTWVNVVl9FVlQsICJjaGdfdnN5c3V2X2V2dCIpLAogICAgICAg IERFRklORV9SRVNfSVJRX05BTUVEKE1UNjM2MF9DSEdfVlNZU09WX0VWVCwgImNoZ192c3lzb3Zf ZXZ0IiksCiAgICAgICAgREVGSU5FX1JFU19JUlFfTkFNRUQoTVQ2MzYwX0NIR19WQkFUT1ZfRVZU LCAiY2hnX3ZiYXRvdl9ldnQiKSwKICAgICAgICBERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNjBf Q0hHX1ZCVVNPVl9FVlQsICJjaGdfdmJ1c292X2V2dCIpLAogICAgICAgIERFRklORV9SRVNfSVJR X05BTUVEKE1UNjM2MF9DSEdfQUlDQ01FQVNMLCAiY2hnX2FpY2NtZWFzbCIpLAogICAgICAgIERF RklORV9SRVNfSVJRX05BTUVEKE1UNjM2MF9XRFRNUkksICJ3ZHRtcmkiKSwKICAgICAgICBERUZJ TkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfQ0hHX1JFQ0hHSSwgImNoZ19yZWNoZ2kiKSwKICAgICAg ICBERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfQ0hHX1RFUk1JLCAiY2hnX3Rlcm1pIiksCiAg ICAgICAgREVGSU5FX1JFU19JUlFfTkFNRUQoTVQ2MzYwX0NIR19JRU9DSSwgImNoZ19pZW9jaSIp LAogICAgICAgIERFRklORV9SRVNfSVJRX05BTUVEKE1UNjM2MF9QVU1QWF9ET05FSSwgInB1bXB4 X2RvbmVpIiksCiAgICAgICAgREVGSU5FX1JFU19JUlFfTkFNRUQoTVQ2MzYwX0FUVEFDSF9JLCAi YXR0YWNoX2kiKSwKICAgICAgICBERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfQ0hSREVUX0VY VF9FVlQsICJjaHJkZXRfZXh0X2V2dCIpLAoKPiA+ICsgICAgICAgICAgICAgaWYgKGlycSA8IDAp Cj4gPiArICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cj4gPiArICAgICAgICAgICAgIHJl dCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJnBkZXYtPmRldiwgaXJxLCBOVUxMLAo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlycV9kZXNjLT5p cnFfaGFuZGxlciwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBJUlFGX1RSSUdHRVJfRkFMTElORywKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBpcnFfZGVzYy0+bmFtZSwKPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KSk7 Cj4KPiBXaHkgeW91IHVzZSBoYW5kbGVyIHRocmVhZCBwZXIgZWFjaCBpbnRlcnJ1cHQ/IFRoaXMg c2hvdWxkIGJlIHJhdGhlciBvbmUKPiBoYW5kbGVyLiBFc3BlY2lhbGx5IHRoYXQgbW9zdCBvZiB5 b3VyIGhhbmRsZXJzIGRvIG5vdGhpbmcuCj4KCkkgd2lsbCByZW1vdmUgc2VydmVyYWwgaXJxcyB3 aGljaCBpcyBkbyBub3RoaW5nLCBhbmQgb25seSBrZWVwCmNocmRldF9leHQgZm9yIHBvd2VyIHJl YWR5IGFuZCBhdHRhY2hpIGZvciBiYzEyIGRvbmUuCkkgYWRkIHNlcnZlcmFsIHJlc291cmNlcyBp biBNRkQgZGV2aWNlLgpEbyB5b3UgbWVhbiBJIHVzZSBJUlFGX1NIQVJFRCB0byByZWR1Y2UgaXJx PwoKPiA+ICsgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKPiA+ICsgICAgICAgICAgICAgICAg ICAgICBkZXZfZXJyKCZwZGV2LT5kZXYsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAicmVxdWVzdCAlcyBpcnEgZmFpbFxuIiwgaXJxX2Rlc2MtPm5hbWUpOwo+ID4gKyAgICAgICAg ICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICAgICAgICAgIH0KPiA+ICsgICAgIH0K PiA+ICsgICAgIHJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdHJ1Y3QgbXQ2MzYwX2ZpZWxk X2luZm8gewo+ID4gKyAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHI7Cj4gPiAr ICAgICB1OCByZWc7Cj4gPiArICAgICB1OCBtYXNrOwo+ID4gKyAgICAgdTggc2hmdDsKPiA+ICt9 Owo+ID4gKwo+ID4gK3N0YXRpYyBzc2l6ZV90IG10NjM2MF9zeXNmc19zaG93KHN0cnVjdCBkZXZp Y2UgKmRldiwKPiA+ICsgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIs IGNoYXIgKmJ1Zik7Cj4gPiArc3RhdGljIHNzaXplX3QgbXQ2MzYwX3N5c2ZzX3N0b3JlKHN0cnVj dCBkZXZpY2UgKmRldiwKPiA+ICsgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUg KmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKPiA+ICsKPiA+ICsjZGVmaW5l IE1UNjM2MF9GSUVMRF9SVyhfbmFtZSwgX3JlZywgX25iaXQpICAgICAgICAgICAgICAgICAgXAo+ ID4gK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCj4gPiArICAgICAuZGV2X2F0dHIgPSBfX0FUVFIoX25hbWUsIDA2NjQsICAgICAg ICAgICAgICAgICAgICAgICAgIFwKPiA+ICsgICAgICAgICAgICAgICAgICAgIG10NjM2MF9zeXNm c19zaG93LCBtdDYzNjBfc3lzZnNfc3RvcmUpLCAgXAo+ID4gKyAgICAgLnJlZyAgICA9IE1UNjM2 MF9QTVVfIyNfcmVnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArICAgICAubWFz ayAgID0gTVQ2MzYwX01BU0tfIyNfbmJpdCwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ ICsgICAgIC5zaGZ0ICAgPSBNVDYzNjBfU0hGVF8jI19uYml0LCAgICAgICAgICAgICAgICAgICAg ICAgICAgXAo+ID4gK30KPiA+ICsKPiA+ICsjZGVmaW5lIE1UNjM2MF9GSUVMRF9STyhfbmFtZSwg X3JlZywgX25iaXQpICAgICAgICAgICAgICAgICAgXAo+ID4gK3sgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArICAgICAuZGV2 X2F0dHIgPSBfX0FUVFIoX25hbWUsIDA0NDQsICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ ICsgICAgICAgICAgICAgICAgICAgICBtdDYzNjBfc3lzZnNfc2hvdywgTlVMTCksICAgICAgICAg ICAgICAgXAo+ID4gKyAgICAgLnJlZyAgICA9IE1UNjM2MF9QTVVfIyNfcmVnLCAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCj4gPiArICAgICAubWFzayAgID0gTVQ2MzYwX01BU0tfIyNfbmJp dCwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ICsgICAgIC5zaGZ0ICAgPSBNVDYzNjBf U0hGVF8jI19uYml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gK30KPiA+ICsKPiA+ ICtzdGF0aWMgc3RydWN0IG10NjM2MF9maWVsZF9pbmZvIG10NjM2MF9maWVsZF90YmxbXSA9IHsK PiA+ICsgICAgIE1UNjM2MF9GSUVMRF9SVyhoaXosICAgICAgICAgICAgQ0hHX0NUUkwxLCAgICAg IEhJWiksCj4gPiArICAgICBNVDYzNjBfRklFTERfUlcodm1pdnIsICAgICAgICAgIENIR19DVFJM NiwgICAgICBWTUlWUiksCj4gPiArICAgICBNVDYzNjBfRklFTERfUlcoaWFpY3IsICAgICAgICAg IENIR19DVFJMMywgICAgICBJQUlDUiksCj4gPiArICAgICBNVDYzNjBfRklFTERfUlcoU1lTUkVH LCAgICAgICAgIENIR19DVFJMMTEsICAgICBTWVNSRUcpLAo+ID4gKyAgICAgTVQ2MzYwX0ZJRUxE X1JXKG90Z19vYywgICAgICAgICBDSEdfQ1RSTDEwLCAgICAgT1RHX09DKSwKPiA+ICsgICAgIE1U NjM2MF9GSUVMRF9SVyhpY2hnLCAgICAgICAgICAgQ0hHX0NUUkwxNywgICAgIElDSEcpLAo+ID4g KyAgICAgTVQ2MzYwX0ZJRUxEX1JXKGlwcmVjLCAgICAgICAgICBDSEdfQ1RSTDgsICAgICAgSVBS RUMpLAo+ID4gKyAgICAgTVQ2MzYwX0ZJRUxEX1JXKGllb2MsICAgICAgICAgICBDSEdfQ1RSTDks ICAgICAgSUVPQyksCj4gPiArICAgICBNVDYzNjBfRklFTERfUlcodm9yZWcsICAgICAgICAgIENI R19DVFJMNCwgICAgICBWT1JFRyksCj4gPiArICAgICBNVDYzNjBfRklFTERfUlcobGJwLCAgICAg ICAgICAgIENIR19DVFJMMTAsICAgICBMQlApLAo+ID4gKyAgICAgTVQ2MzYwX0ZJRUxEX1JXKHZy ZWMsICAgICAgICAgICBDSEdfQ1RSTDExLCAgICAgVlJFQyksCj4gPiArICAgICBNVDYzNjBfRklF TERfUlcodGUsICAgICAgICAgICAgIENIR19DVFJMMiwgICAgICBURSksCj4gPiArICAgICBNVDYz NjBfRklFTERfUlcoY2hnX3dkdF9lbiwgICAgIENIR19DVFJMMTMsICAgICBDSEdfV0RUX0VOKSwK PiA+ICsgICAgIE1UNjM2MF9GSUVMRF9SVyhjaGdfd2R0LCAgICAgICAgQ0hHX0NUUkwxMywgICAg IENIR19XRFQpLAo+ID4gKyAgICAgTVQ2MzYwX0ZJRUxEX1JXKHd0X2ZjLCAgICAgICAgICBDSEdf Q1RSTDEyLCAgICAgV1RfRkMpLAo+ID4gKyAgICAgTVQ2MzYwX0ZJRUxEX1JXKGJhdF9jb21wLCAg ICAgICBDSEdfQ1RSTDE4LCAgICAgQkFUX0NPTVApLAo+ID4gKyAgICAgTVQ2MzYwX0ZJRUxEX1JX KHZjbGFtcCwgICAgICAgICBDSEdfQ1RSTDE4LCAgICAgVkNMQU1QKSwKPiA+ICsgICAgIE1UNjM2 MF9GSUVMRF9SVyh1c2JjaGdlbiwgICAgICAgREVWSUNFX1RZUEUsICAgIFVTQkNIR0VOKSwKPiA+ ICsgICAgIE1UNjM2MF9GSUVMRF9SVyhjaGdfZW4sICAgICAgICAgQ0hHX0NUUkwyLCAgICAgIENI R19FTiksCj4gPiArICAgICBNVDYzNjBfRklFTERfUk8oY2hyZGV0X2V4dCwgICAgIEZPRF9TVEFU LCAgICAgICBDSFJERVRfRVhUKSwKPiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRpYyBzdHJ1Y3QgYXR0 cmlidXRlICptdDYzNjBfYXR0cnNbQVJSQVlfU0laRShtdDYzNjBfZmllbGRfdGJsKSArIDFdOwo+ ID4gKwo+ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG10NjM2MF9hdHRy X2dyb3VwID0gewo+ID4gKyAgICAgLmF0dHJzID0gbXQ2MzYwX2F0dHJzLAo+ID4gK307Cj4gPiAr Cj4gPiArc3RhdGljIHNzaXplX3QgbXQ2MzYwX3N5c2ZzX3Nob3coc3RydWN0IGRldmljZSAqZGV2 LAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmli dXRlICphdHRyLCBjaGFyICpidWYpCj4gPiArewo+ID4gKyAgICAgc3RydWN0IG10NjM2MF9jaGdf aW5mbyAqbWNpID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKPiA+ICsgICAgIHN0cnVj dCBtdDYzNjBfZmllbGRfaW5mbyAqaW5mbyA9ICh2b2lkICopYXR0cjsKPiA+ICsgICAgIHVuc2ln bmVkIGludCByZWd2YWw7Cj4gPiArICAgICBpbnQgcmV0Owo+ID4gKwo+ID4gKyAgICAgcmV0ID0g cmVnbWFwX3JlYWQobWNpLT5yZWdtYXAsIGluZm8tPnJlZywgJnJlZ3ZhbCk7Cj4gPiArICAgICBp ZiAocmV0IDwgMCkKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+ICsgICAgIHJlZ3Zh bCA9IChyZWd2YWwgJiBpbmZvLT5tYXNrKSA+PiBpbmZvLT5zaGZ0Owo+ID4gKyAgICAgcmV0dXJu IHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiUwMnhcbiIsIHJlZ3ZhbCk7Cj4gPiArfQo+ID4g Kwo+ID4gK3N0YXRpYyBzc2l6ZV90IG10NjM2MF9zeXNmc19zdG9yZShzdHJ1Y3QgZGV2aWNlICpk ZXYsCj4gPiArICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBj b25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKPiA+ICt7Cj4gPiArICAgICBzdHJ1Y3QgbXQ2 MzYwX2NoZ19pbmZvICptY2kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOwo+ID4gKyAg ICAgc3RydWN0IG10NjM2MF9maWVsZF9pbmZvICppbmZvID0gKHZvaWQgKilhdHRyOwo+ID4gKyAg ICAgaW50IHJldCwgdG1wOwo+ID4gKwo+ID4gKyAgICAgaWYgKGtzdHJ0b2ludChidWYsIDEwLCAm dG1wKSA8IDApIHsKPiA+ICsgICAgICAgICAgICAgZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcGFy c2luZyBudW1iZXJcbiIpOwo+ID4gKyAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKPiA+ICsg ICAgIH0KPiA+ICsgICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwKPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5yZWcsIGluZm8tPm1hc2ssIHRt cCA8PCBpbmZvLT5zaGZ0KTsKPiA+ICsgICAgIGlmIChyZXQgPCAwKQo+ID4gKyAgICAgICAgICAg ICByZXR1cm4gcmV0Owo+ID4gKyAgICAgcmV0dXJuIGNvdW50Owo+ID4gK30KPiA+ICsKPiA+ICtz dGF0aWMgaW50IG10NjM2MF9zeXNmc19jcmVhdGVfZ3JvdXAoc3RydWN0IG10NjM2MF9jaGdfaW5m byAqbWNpKQo+ID4gK3sKPiA+ICsgICAgIGludCBpLCB0Yl9zaXplID0gQVJSQVlfU0laRShtdDYz NjBfZmllbGRfdGJsKTsKPiA+ICsKPiA+ICsgICAgIGZvciAoaSA9IDA7IGkgPCB0Yl9zaXplOyBp KyspCj4gPiArICAgICAgICAgICAgIG10NjM2MF9hdHRyc1tpXSA9ICYobXQ2MzYwX2ZpZWxkX3Ri bFtpXS5kZXZfYXR0ci5hdHRyKTsKPiA+ICsgICAgIHJldHVybiBkZXZtX2RldmljZV9hZGRfZ3Jv dXAoJm1jaS0+cHN5LT5kZXYsICZtdDYzNjBfYXR0cl9ncm91cCk7Cj4gPiArfQo+ID4gKwo+ID4g K3N0YXRpYyBpbnQgbXQ2MzYwX2NoZ19pbml0X3NldHRpbmcoc3RydWN0IG10NjM2MF9jaGdfaW5m byAqbWNpKQo+ID4gK3sKPiA+ICsgICAgIGludCByZXQ7Cj4gPiArCj4gPiArICAgICAvKiBEaXNh YmxlIGJjMTIgKi8KPiA+ICsgICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21h cCwgTVQ2MzYwX1BNVV9ERVZJQ0VfVFlQRSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBNVDYzNjBfTUFTS19VU0JDSEdFTiwgMCk7Cj4gPiArICAgICBpZiAocmV0IDwgMCkgewo+ ID4gKyAgICAgICAgICAgICBkZXZfZXJyKG1jaS0+ZGV2LCAiJXM6IGRpc2FibGUgYmMxMiBmYWls XG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0Owo+ID4gKyAgICAgfQo+ ID4gKyAgICAgLyogU2V0IGlucHV0IGN1cnJlbnQgbGltaXQgc2VsZWN0IGJ5IEFJQ1IgKi8KPiA+ ICsgICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9D SEdfQ1RSTDIsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX01BU0tf SUlOTE1UU0VMLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9JSU5M TVRTRUxfQUlDUiA8PAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBN VDYzNjBfU0hGVF9JSU5MTVRTRUwpOwo+ID4gKyAgICAgaWYgKHJldCA8IDApIHsKPiA+ICsgICAg ICAgICAgICAgZGV2X2VycihtY2ktPmRldiwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAiJXM6 IHN3aXRjaCBpaW5sbXRzZWwgdG8gYWljciBmYWlsXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICAg ICAgICAgIGdvdG8gb3V0Owo+ID4gKyAgICAgfQo+ID4gKyAgICAgdXNsZWVwX3JhbmdlKDUwMDAs IDYwMDApOwo+ID4gKyAgICAgLyogRGlzYWJsZSBpbGltICovCj4gPiArICAgICByZXQgPSByZWdt YXBfdXBkYXRlX2JpdHMobWNpLT5yZWdtYXAsIE1UNjM2MF9QTVVfQ0hHX0NUUkwzLAo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9NQVNLX0lMSU1fRU4sIDApOwo+ID4g KyAgICAgaWYgKHJldCA8IDApIHsKPiA+ICsgICAgICAgICAgICAgZGV2X2VycihtY2ktPmRldiwK PiA+ICsgICAgICAgICAgICAgICAgICAgICAiJXM6IHN3aXRjaCBpaW5sbXRzZWwgdG8gYWljciBm YWlsXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0Owo+ID4gKyAgICAg fQo+ID4gKyAgICAgLyogRW5sYXJnZSBPVEdfT0MgdG8gbWF4IDNBICovCj4gPiArICAgICByZXQg PSByZWdtYXBfdXBkYXRlX2JpdHMobWNpLT5yZWdtYXAsCj4gPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgTVQ2MzYwX1BNVV9DSEdfQ1RSTDEwLCAweDA3LCAweDA3KTsKPiA+ICsgICAg IGlmIChyZXQgPCAwKSB7Cj4gPiArICAgICAgICAgICAgIGRldl9lcnIobWNpLT5kZXYsCj4gPiAr ICAgICAgICAgICAgICAgICAgICAgIiVzOiBmYWxlZCBjb25maWcgb3RnIG9jIHRvIG1heGltdW1c biIsIF9fZnVuY19fKTsKPiA+ICsgICAgIH0KPiA+ICtvdXQ6Cj4gPiArICAgICByZXR1cm4gcmV0 Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdTMyIG10NjM2MF92aW5vdnBfdHJhbnNfdG9fc2Vs KHUzMiB2YWwpCj4gPiArewo+ID4gKyAgICAgdTMyIHZpbm92cF90YmxbXSA9IHsgNTUwMDAwMCwg NjUwMDAwMCwgMTEwMDAwMDAsIDE0NTAwMDAwIH07Cj4gPiArICAgICBpbnQgaTsKPiA+ICsKPiA+ ICsgICAgIC8qIFNlbGVjdCB0aGUgc21hbGxlciBhbmQgZXF1YWwgc3VwcG9ydGVkIHZhbHVlICov Cj4gPiArICAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2aW5vdnBfdGJsKS0xOyBpKysp IHsKPiA+ICsgICAgICAgICAgICAgaWYgKHZhbCA8IHZpbm92cF90YmxbaSsxXSkKPiA+ICsgICAg ICAgICAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIH0KPiA+ICsgICAgIHJldHVybiBpOwo+ ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IG10NjM2MF9jaGdfcGxhdGZvcm1fZGF0YSAq bXQ2MzYwX3BhcnNlX3BkYXRhKAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiArewo+ID4g KyAgICAgc3RydWN0IG10NjM2MF9jaGdfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3Bs YXRkYXRhKCZwZGV2LT5kZXYpOwo+ID4gKyAgICAgc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBk ZXYtPmRldi5vZl9ub2RlOwo+ID4gKyAgICAgaW50IHJldDsKPiA+ICsKPiA+ICsgICAgIHBkYXRh ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsK PiA+ICsgICAgIGlmICghcGRhdGEpCj4gPiArICAgICAgICAgICAgIHJldHVybiBFUlJfUFRSKC1F Tk9NRU0pOwo+ID4gKyAgICAgbWVtY3B5KHBkYXRhLCAmZGVmX3BsYXRmb3JtX2RhdGEsIHNpemVv ZigqcGRhdGEpKTsKPgo+IFVzZSBrbWVtZHVwIG9yIHNvbWV0aGluZyBzaW1pbGFyLgo+CgpBQ0sK Cj4gPiArICAgICByZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInZpbm92cCIsICZwZGF0 YS0+dmlub3ZwKTsKPiA+ICsgICAgIGlmIChyZXQpIHsKPiA+ICsgICAgICAgICAgICAgZGV2X2Vy cigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHBhcnNlIHZpbm92cCBpbiBEVFxuIik7Cj4gPiArICAg ICAgICAgICAgIHJldHVybiBFUlJfUFRSKHJldCk7Cj4gPiArICAgICB9Cj4gPiArICAgICByZXR1 cm4gcGRhdGE7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2FwcGx5X3BkYXRh KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiArewo+ID4gKyAgICAgc3RydWN0IG10 NjM2MF9jaGdfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5k ZXYpOwo+ID4gKyAgICAgc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpID0gZGV2X2dldF9kcnZk YXRhKCZwZGV2LT5kZXYpOwo+ID4gKyAgICAgaW50IHJldDsKPiA+ICsgICAgIHUzMiBzZWw7Cj4g PiArCj4gPiArICAgICBzZWwgPSBtdDYzNjBfdmlub3ZwX3RyYW5zX3RvX3NlbChwZGF0YS0+dmlu b3ZwKTsKPiA+ICsgICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwgTVQ2 MzYwX1BNVV9DSEdfQ1RSTDE5LAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1U NjM2MF9NQVNLX1ZJTk9WUCwgc2VsIDw8IE1UNjM2MF9TSEZUX1ZJTk9WUCk7Cj4gPiArICAgICBp ZiAocmV0KQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKyAgICAgcmV0dXJuIDA7 Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfcHJvYmUoc3RydWN0 IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+ICt7Cj4gPiArICAgICBzdHJ1Y3QgbXQ2MzYwX2No Z19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7Cj4g PiArICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2k7Cj4gPiArICAgICBzdHJ1Y3QgcG93 ZXJfc3VwcGx5X2NvbmZpZyBjaGFyZ2VyX2NmZyA9IHt9Owo+ID4gKyAgICAgc3RydWN0IHJlZ3Vs YXRvcl9jb25maWcgY29uZmlnID0geyB9Owo+ID4gKyAgICAgaW50IHJldDsKPiA+ICsKPiA+ICsg ICAgIG1jaSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKm1jaSksIEdGUF9LRVJO RUwpOwo+ID4gKyAgICAgaWYgKCFtY2kpCj4gPiArICAgICAgICAgICAgIHJldHVybiAtRU5PTUVN Owo+ID4gKwo+ID4gKyAgICAgcGRhdGEgPSBtdDYzNjBfcGFyc2VfcGRhdGEocGRldik7Cj4gPiAr ICAgICBpZiAoSVNfRVJSX09SX05VTEwocGRhdGEpKQo+ID4gKyAgICAgICAgICAgICByZXR1cm4g UFRSX0VSUihwZGF0YSk7Cj4gPiArCj4gPiArICAgICBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9 IHBkYXRhOwo+ID4gKwo+ID4gKyAgICAgbWNpLT5kZXYgPSAmcGRldi0+ZGV2Owo+ID4gKyAgICAg bXV0ZXhfaW5pdCgmbWNpLT5jaGdkZXRfbG9jayk7Cj4gPiArICAgICBwbGF0Zm9ybV9zZXRfZHJ2 ZGF0YShwZGV2LCBtY2kpOwo+ID4gKyAgICAgSU5JVF9XT1JLKCZtY2ktPmNocmRldF93b3JrLCAm bXQ2MzYwX2NocmRldF93b3JrKTsKPiA+ICsKPiA+ICsgICAgIG1jaS0+cmVnbWFwID0gZGV2X2dl dF9yZWdtYXAocGRldi0+ZGV2LnBhcmVudCwgTlVMTCk7Cj4gPiArICAgICBpZiAoIW1jaS0+cmVn bWFwKSB7Cj4gPiArICAgICAgICAgICAgIGRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBn ZXQgcGFyZW50IHJlZ21hcFxuIik7Cj4gPiArICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwo+ ID4gKyAgICAgfQo+ID4gKwo+ID4gKyAgICAgcmV0ID0gbXQ2MzYwX2FwcGx5X3BkYXRhKHBkZXYp Owo+ID4gKyAgICAgaWYgKHJldCkgewo+ID4gKyAgICAgICAgICAgICBkZXZfZXJyKCZwZGV2LT5k ZXYsICJGYWlsZWQgdG8gYXBwbHkgcGRhdGFcbiIpOwo+ID4gKyAgICAgICAgICAgICByZXR1cm4g cmV0Owo+ID4gKyAgICAgfQo+ID4gKwo+ID4gKyAgICAgbWNpLT5lZGV2ID0gZGV2bV9leHRjb25f ZGV2X2FsbG9jYXRlKCZwZGV2LT5kZXYsIG10NjM2MF9leHRjb25fY2FibGUpOwo+ID4gKyAgICAg aWYgKElTX0VSUihtY2ktPmVkZXYpKSB7Cj4gPiArICAgICAgICAgICAgIGRldl9lcnIoJnBkZXYt PmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGV4dGNvblxuIik7Cj4gPiArICAg ICAgICAgICAgIHJldHVybiAtRU5PTUVNOwo+ID4gKyAgICAgfQo+ID4gKwo+ID4gKyAgICAgcmV0 ID0gZGV2bV9leHRjb25fZGV2X3JlZ2lzdGVyKCZwZGV2LT5kZXYsIG1jaS0+ZWRldik7Cj4gPiAr ICAgICBpZiAocmV0KSB7Cj4gPiArICAgICAgICAgICAgIGRldl9lcnIoJnBkZXYtPmRldiwgIkZh aWxlZCB0byByZWdpc3RlciBleHRjb24gZGV2XG4iKTsKPiA+ICsgICAgICAgICAgICAgcmV0dXJu IHJldDsKPiA+ICsgICAgIH0KPiA+ICsKPiA+ICsgICAgIG1lbWNweSgmbWNpLT5wc3lfZGVzYywg Jm10NjM2MF9jaGFyZ2VyX2Rlc2MsIHNpemVvZihtY2ktPnBzeV9kZXNjKSk7Cj4gPiArICAgICBt Y2ktPnBzeV9kZXNjLm5hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKPiA+ICsgICAgIGNoYXJn ZXJfY2ZnLmRydl9kYXRhID0gbWNpOwo+ID4gKyAgICAgY2hhcmdlcl9jZmcub2Zfbm9kZSA9IHBk ZXYtPmRldi5vZl9ub2RlOwo+ID4gKyAgICAgY2hhcmdlcl9jZmcuc3VwcGxpZWRfdG8gPSBtdDYz NjBfY2hhcmdlcl9zdXBwbGllZF90bzsKPiA+ICsgICAgIGNoYXJnZXJfY2ZnLm51bV9zdXBwbGlj YW50cyA9IEFSUkFZX1NJWkUobXQ2MzYwX2NoYXJnZXJfc3VwcGxpZWRfdG8pOwo+ID4gKyAgICAg bWNpLT5wc3kgPSBkZXZtX3Bvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LAo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWNpLT5wc3lfZGVzYywg JmNoYXJnZXJfY2ZnKTsKPiA+ICsgICAgIGlmIChJU19FUlIobWNpLT5wc3kpKSB7Cj4gPiArICAg ICAgICAgICAgIGRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBwb3dlciBz dXBwbHkgZGV2XG4iKTsKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIFBUUl9FUlIobWNpLT5wc3kp Owo+ID4gKyAgICAgfQo+ID4gKwo+ID4gKyAgICAgcmV0ID0gbXQ2MzYwX2NoZ19pbml0X3NldHRp bmcobWNpKTsKPiA+ICsgICAgIGlmIChyZXQpIHsKPiA+ICsgICAgICAgICAgICAgZGV2X2Vycigm cGRldi0+ZGV2LCAiRmFpbGVkIHRvIGluaXRpYWwgc2V0dGluZ1xuIik7Cj4gPiArICAgICAgICAg ICAgIHJldHVybiByZXQ7Cj4gPiArICAgICB9Cj4gPiArCj4gPiArICAgICBzY2hlZHVsZV93b3Jr KCZtY2ktPmNocmRldF93b3JrKTsKPiA+ICsKPiA+ICsgICAgIHJldCA9IG10NjM2MF9jaGdfaXJx X3JlZ2lzdGVyKHBkZXYpOwo+ID4gKyAgICAgaWYgKHJldCkgewo+ID4gKyAgICAgICAgICAgICBk ZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgaXJxc1xuIik7Cj4gPiArICAg ICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICB9Cj4gPiArCj4gPiArICAgICBjb25maWcu ZGV2ID0gJnBkZXYtPmRldjsKPiA+ICsgICAgIGNvbmZpZy5yZWdtYXAgPSBtY2ktPnJlZ21hcDsK PiA+ICsgICAgIG1jaS0+b3RnX3JkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ ZGV2LCAmbXQ2MzYwX290Z19yZGVzYywKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAmY29uZmlnKTsKPiA+ICsgICAgIGlmIChJU19FUlIobWNpLT5vdGdf cmRldikpCj4gPiArICAgICAgICAgICAgIHJldHVybiBQVFJfRVJSKG1jaS0+b3RnX3JkZXYpOwo+ ID4gKwo+ID4gKyAgICAgcmV0ID0gbXQ2MzYwX3N5c2ZzX2NyZWF0ZV9ncm91cChtY2kpOwo+ID4g KyAgICAgaWYgKHJldCkgewo+ID4gKyAgICAgICAgICAgICBkZXZfZXJyKCZwZGV2LT5kZXYsCj4g PiArICAgICAgICAgICAgICAgICAgICAgIiVzOiBjcmVhdGUgc3lzZnMgYXR0cnMgZmFpbFxuIiwg X19mdW5jX18pOwo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKyAgICAgfQo+ID4g Kwo+ID4gKyAgICAgcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBjb25zdCBzdHJ1 Y3Qgb2ZfZGV2aWNlX2lkIF9fbWF5YmVfdW51c2VkIG10NjM2MF9jaGFyZ2VyX29mX2lkW10gPSB7 Cj4gPiArICAgICB7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10NjM2MC1jaGciLCB9LAo+ID4g KyAgICAge30sCj4gPiArfTsKPiA+ICtNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtdDYzNjBfY2hh cmdlcl9vZl9pZCk7Cj4gPiArCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZp Y2VfaWQgbXQ2MzYwX2NoYXJnZXJfaWRbXSA9IHsKPiA+ICsgICAgIHsgIm10NjM2MC1jaGciLCAw IH0sCj4gPiArICAgICB7fSwKPiA+ICt9Owo+ID4gK01PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZv cm0sIG10NjM2MF9jaGFyZ2VyX2lkKTsKPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IHBsYXRmb3Jt X2RyaXZlciBtdDYzNjBfY2hhcmdlcl9kcml2ZXIgPSB7Cj4gPiArICAgICAuZHJpdmVyID0gewo+ ID4gKyAgICAgICAgICAgICAubmFtZSA9ICJtdDYzNjAtY2hnIiwKPiA+ICsgICAgICAgICAgICAg Lm93bmVyID0gVEhJU19NT0RVTEUsCj4KPiBOb3QgbmVlZGVkLiBZb3UgZGlkIG5vdCBydW4gY29j Y2luZWxsZSwgcmlnaHQ/Cj4KPiA+ICsgICAgICAgICAgICAgLm9mX21hdGNoX3RhYmxlID0gb2Zf bWF0Y2hfcHRyKG10NjM2MF9jaGFyZ2VyX29mX2lkKSwKPiA+ICsgICAgIH0sCj4gPiArICAgICAu cHJvYmUgPSBtdDYzNjBfY2hhcmdlcl9wcm9iZSwKPiA+ICsgICAgIC5pZF90YWJsZSA9IG10NjM2 MF9jaGFyZ2VyX2lkLAo+ID4gK307Cj4gPiArbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtdDYzNjBf Y2hhcmdlcl9kcml2ZXIpOwo+ID4gKwo+ID4gK01PRFVMRV9BVVRIT1IoIkNZX0h1YW5nIDxjeV9o dWFuZ0ByaWNodGVrLmNvbT4iKTsKPiA+ICtNT0RVTEVfREVTQ1JJUFRJT04oIk1UNjM2MCBDaGFy Z2VyIERyaXZlciIpOwo+ID4gK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKPiA+ICtNT0RVTEVfVkVS U0lPTigiMS4wLjAiKTsKPgo+IFNraXAgdmVyc2lvbi4KPgo+CgpBQ0sKCj4gQWxsIHRoZXNlIGNv bW1lbnRzIHdlcmUgYWZ0ZXIgbG9va2luZyBicmllZmx5IC0gSSBkaWQgbm90IHBlcmZvcm0gYQo+ IHRob3JvdWdoIHJldmlldy4gIEkgYW0gc3VycHJpc2VkIHRoYXQgeW91IGNvbWJpbmVkIHJlZ3Vs YXRvciBhbmQgY2hhcmdlcgo+IGRyaXZlciBpbiBvbmUuIEl0IGlzIGRvYWJsZSBidXQgbWFrZXMg ZHJpdmVyIGJpZ2dlciBhbmQgbW9yZSBkaWZmaWN1bHQKPiB0byBtYWludGFpbi4gQ29uc2lkZXIg c3BsaXR0aW5nIHRoZW0uCj4KCk1UNjM2MCBjaGFyZ2VyIGlzIHN3aXRjaGluZyBjaGFyZ2VyLCBD YW4gSSBrZWVwIHJlZ3VsYXRvciBmb3IgYm9vc3QKT1RHIGxpa2UgYnEyNDE5MD8KCj4gQmVzdCBy ZWdhcmRzLAo+IEtyenlzenRvZgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f 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=-9.5 required=3.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 5EF15C2D0A3 for ; Mon, 26 Oct 2020 06:47:48 +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 BD5BE20658 for ; Mon, 26 Oct 2020 06:47:47 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="dgD/rXhB"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="jpP6BirE" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BD5BE20658 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.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:To:Subject:Message-ID:Date:From:In-Reply-To: References:MIME-Version:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=QiL6HakTAQlwlbqrr3hrRd4rGWpWbFNQBEjUr0AtOBo=; b=dgD/rXhBjnhxMqibiOtKNrIGS 9fv2XiBIjfDuR6Zgi6KS1ZtUNJ+GIt60w0Y083wB/ew0eNocTbr9Dj9tugaY9hicYMWjy73vt3UYt f0gK3ISy1YWKv1QeclKiRp8flarXbhFOHjk2S2bScwUfae4S5BHwxSANmBMBJozG0TYGEayFNlkn4 u5x2HBKC7tfWjASHMgVMxDy3HkoclK+B7EBbEzZCnH5hv0QICIvTpxMN1yur85IczBXADqoi+fUfv tdiNBmCamSMqHjzO+5iq+zUBAmaZys1+TP3VJGyG4Q4unTAEDhZlKpZTJzgF2CECnIRyIii4AGUwo uKBWMDCAg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kWwG4-0004mg-Bg; Mon, 26 Oct 2020 06:45:32 +0000 Received: from mail-ot1-x341.google.com ([2607:f8b0:4864:20::341]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kWwG0-0004m1-0X; Mon, 26 Oct 2020 06:45:29 +0000 Received: by mail-ot1-x341.google.com with SMTP id k68so7071869otk.10; Sun, 25 Oct 2020 23:45:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=teElRtzazUJIA66EUGlw1atkA2G++mQK2BC4XLZcb4c=; b=jpP6BirEFeTpGu9RXU18fmAhbkJugB4WuBIqAselgTVsVn+Q18qzqQt1MsgId+ZCDZ I87hO8fToJHLNOoAjEAU9ZinEmxy3wU9MB1oXEl/0cE8iv2EZ+2tEuN1xH/D9wSX+7+E 1Y94nxPwTl1NkZuk7b/aCuEbupcaXcmDKRKEWRkLhwpPSJsN90eTBkQsgR0/HQNS3QB/ T5o/mAcTX8ZMIJYsm7y7FY0EB+YmvbaN2M2yCPLGUTzRenk8/2o9jXCxilyLaiwlnxis p8bSSeOswH+s5IhtBhWi6atyWAEQmILWHDeokmHqSVsZVTuDyBR97m6PABg8lj82QbP1 E5Ug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=teElRtzazUJIA66EUGlw1atkA2G++mQK2BC4XLZcb4c=; b=tYzf3CwswB9dI0u1Q0ZEyPh6RUGuMfco94o/L2v8X7u28q1bZOsrAGxrfzLTWD/jaV YKJt6yHECoWwtiWycJbEEhk2U42xwMDcPd3wxwYAvPFSJvPGSdxPApwwDEtu8IqdHq0w yBLYbahN4HvWUmvYL18RTbYvIPlZHZ1CfOCzd5rwzI2UcjfEjF2/pZtpLVek6NM/yUtc S8JUf5ptQZzNlCC5tNnDUZJrjfE7jin7v+VplcYKbsJmFE6a/NxCKA6VnN5f+CY9CTeg /iTqz0eICnkW9pIoTq9dBDlWYA73+T3JaPhOCVnmg3kKHMBdysUddgSdLt2mXmo8Uqab PUtg== X-Gm-Message-State: AOAM533GUqcMGtorGUBX5inV+Pfi4RjOU8gHOzbP2kxcLuCo17xaeiYi bFJapp8JnLeodP9+OhHKWv903z12/eRfv4EYAlA= X-Google-Smtp-Source: ABdhPJwFsXKG22rI6SzM+k/5kSPHIrBdMXZZFIgtax2lWQxwzN5Lt2ce9zWtF7wAM1Pc2csydDP6DQrWGJaUN0cdC5A= X-Received: by 2002:a9d:65c7:: with SMTP id z7mr13322991oth.327.1603694724787; Sun, 25 Oct 2020 23:45:24 -0700 (PDT) MIME-Version: 1.0 References: <1600859910-15855-1-git-send-email-gene.chen.richtek@gmail.com> <1600859910-15855-2-git-send-email-gene.chen.richtek@gmail.com> <20201016155227.GB9890@kozik-lap> In-Reply-To: <20201016155227.GB9890@kozik-lap> From: Gene Chen Date: Mon, 26 Oct 2020 14:45:12 +0800 Message-ID: Subject: Re: [PATCH 2/2] power: supply: mt6360_charger: add MT6360 charger support To: Krzysztof Kozlowski X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201026_024528_218010_F4ABF040 X-CRM114-Status: GOOD ( 32.36 ) 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 , devicetree , linux-pm@vger.kernel.org, sre@kernel.org, Linux Kernel Mailing List , cy_huang@richtek.com, Rob Herring , "moderated list:ARM/Mediatek SoC support" , Matthias Brugger , linux-arm Mailing List , 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 S3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPiDmlrwgMjAyMOW5tDEw5pyIMTbm l6Ug6YCx5LqUIOS4i+WNiDExOjUy5a+r6YGT77yaCj4KPiBPbiBXZWQsIFNlcCAyMywgMjAyMCBh dCAwNzoxODozMFBNICswODAwLCBHZW5lIENoZW4gd3JvdGU6Cj4gPiBGcm9tOiBHZW5lIENoZW4g PGdlbmVfY2hlbkByaWNodGVrLmNvbT4KPiA+Cj4gPiBBZGQgYmFzaWMgc3VwcG9ydCBmb3IgdGhl IGJhdHRlcnkgY2hhcmdlciBmb3IgTVQ2MzYwIFBNSUMKPiA+Cj4gPiBTaWduZWQtb2ZmLWJ5OiBH ZW5lIENoZW4gPGdlbmVfY2hlbkByaWNodGVrLmNvbT4KPiA+IC0tLQo+ID4gIGRyaXZlcnMvcG93 ZXIvc3VwcGx5L0tjb25maWcgICAgICAgICAgfCAgIDExICsKPiA+ICBkcml2ZXJzL3Bvd2VyL3N1 cHBseS9NYWtlZmlsZSAgICAgICAgIHwgICAgMSArCj4gPiAgZHJpdmVycy9wb3dlci9zdXBwbHkv bXQ2MzYwX2NoYXJnZXIuYyB8IDExOTAgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr Cj4gPiAgMyBmaWxlcyBjaGFuZ2VkLCAxMjAyIGluc2VydGlvbnMoKykKPiA+ICBjcmVhdGUgbW9k ZSAxMDA2NDQgZHJpdmVycy9wb3dlci9zdXBwbHkvbXQ2MzYwX2NoYXJnZXIuYwo+ID4KPiA+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9LY29uZmlnIGIvZHJpdmVycy9wb3dlci9z dXBwbHkvS2NvbmZpZwo+ID4gaW5kZXggZmFmMjgzMC4uMWJlYjZhNCAxMDA2NDQKPiA+IC0tLSBh L2RyaXZlcnMvcG93ZXIvc3VwcGx5L0tjb25maWcKPiA+ICsrKyBiL2RyaXZlcnMvcG93ZXIvc3Vw cGx5L0tjb25maWcKPiA+IEBAIC01NjIsNiArNTYyLDE3IEBAIGNvbmZpZyBDSEFSR0VSX01QMjYy OQo+ID4gICAgICAgICBCYXR0ZXJ5IGNoYXJnZXIuIFRoaXMgZHJpdmVyIHByb3ZpZGVzIEJhdHRl cnkgY2hhcmdlciBwb3dlciBtYW5hZ2VtZW50Cj4gPiAgICAgICAgIGZ1bmN0aW9ucyBvbiB0aGUg c3lzdGVtcy4KPiA+Cj4gPiArY29uZmlnIENIQVJHRVJfTVQ2MzYwCj4gPiArICAgICB0cmlzdGF0 ZSAiTWVkaWF0ZWsgTVQ2MzYwIENoYXJnZXIgRHJpdmVyIgo+ID4gKyAgICAgZGVwZW5kcyBvbiBN RkRfTVQ2MzYwCj4KPiB8fCBDT01QSUxFX1RFU1QKPiAoYW5kIHRlc3QgaWYgaXQgcmVhbGx5IGNv bXBpbGVzKQo+Cj4gPiArICAgICBkZXBlbmRzIG9uIFJFR1VMQVRPUgo+ID4gKyAgICAgc2VsZWN0 IEVYVENPTgo+Cj4gRHJpdmVycyBzaG91bGQgaW4gZ2VuZXJhbCBub3Qgc2VsZWN0IG90aGVyIHVz ZXItc2VsZWN0YWJsZSBzeW1ib2xzLCBzbwo+IHRoaXMgc2hvdWxkIGJlIHJhdGhlciBkZXBlbmRz Lgo+CgpBQ0ssIEkgcmVtb3ZlIGV4dGNvbiBkZXZpY2UgcmVnaXN0ZXIgd2hpY2ggbWF5IGJlIHJl Z2lzdGVyIGJ5IHVzYiBkcml2ZXIuCgo+ID4gKyAgICAgaGVscAo+ID4gKyAgICAgICBTYXkgWSBo ZXJlIHRvIGVuYWJsZSBNVDYzNjAgQ2hhcmdlciBQYXJ0Lgo+ID4gKyAgICAgICBzdXBwb3J0IEhp Z2gtQWNjdXJhY3kgVm9sdGFnZS9DdXJyZW50IFJlZ3VsYXRpb24sCj4KPiAiVGhlIGRldmljZSBz dXBwcG9ydHMgLi4uIgo+CgpBQ0sKCj4gPiArICAgICAgIEF2ZXJhZ2UgSW5wdXQgQ3VycmVudCBS ZWd1bGF0aW9uLCBCYXR0ZXJ5IFRlbXBhdHVyZSBTZW5zaW5nLAo+ID4gKyAgICAgICBPdmVyLVRl bXBlcmF0dXJlIFByb3RlY3Rpb24sIERQRE0gRGV0ZWN0aW9uIGZvciBCQzEuMgo+ID4gKwo+ID4g IGNvbmZpZyBDSEFSR0VSX1FDT01fU01CQgo+ID4gICAgICAgdHJpc3RhdGUgIlF1YWxjb21tIFN3 aXRjaC1Nb2RlIEJhdHRlcnkgQ2hhcmdlciBhbmQgQm9vc3QiCj4gPiAgICAgICBkZXBlbmRzIG9u IE1GRF9TUE1JX1BNSUMgfHwgQ09NUElMRV9URVNUCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9w b3dlci9zdXBwbHkvTWFrZWZpbGUgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9NYWtlZmlsZQo+ID4g aW5kZXggYjNjNjk0YS4uOWFiZWNiOWMgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL3Bvd2VyL3N1 cHBseS9NYWtlZmlsZQo+ID4gKysrIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvTWFrZWZpbGUKPiA+ IEBAIC03Nyw2ICs3Nyw3IEBAIG9iai0kKENPTkZJR19DSEFSR0VSX01BWDc3NjkzKSAgICAgICs9 IG1heDc3NjkzX2NoYXJnZXIubwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VSX01BWDg5OTcpICAg ICAgICArPSBtYXg4OTk3X2NoYXJnZXIubwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VSX01BWDg5 OTgpICAgICAgICArPSBtYXg4OTk4X2NoYXJnZXIubwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VS X01QMjYyOSkgKz0gbXAyNjI5X2NoYXJnZXIubwo+ID4gK29iai0kKENPTkZJR19DSEFSR0VSX01U NjM2MCkgKz0gbXQ2MzYwX2NoYXJnZXIubwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VSX1FDT01f U01CQikgICAgICArPSBxY29tX3NtYmIubwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VSX0JRMjQx NVgpICAgICAgICArPSBicTI0MTV4X2NoYXJnZXIubwo+ID4gIG9iai0kKENPTkZJR19DSEFSR0VS X0JRMjQxOTApICAgICAgICArPSBicTI0MTkwX2NoYXJnZXIubwo+ID4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvcG93ZXIvc3VwcGx5L210NjM2MF9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBs eS9tdDYzNjBfY2hhcmdlci5jCj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gaW5kZXggMDAw MDAwMC4uNzBlM2ZiNgo+ID4gLS0tIC9kZXYvbnVsbAo+ID4gKysrIGIvZHJpdmVycy9wb3dlci9z dXBwbHkvbXQ2MzYwX2NoYXJnZXIuYwo+ID4gQEAgLTAsMCArMSwxMTkwIEBACj4gPiArLy8gU1BE WC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiA+ICsvKgo+ID4gKyAqIENvcHlyaWdodCAo YykgMjAxOSBNZWRpYVRlayBJbmMuCj4gPiArICovCj4gPiArCj4gPiArI2luY2x1ZGUgPGxpbnV4 L2luaXQuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gPiArI2luY2x1ZGUgPGxp bnV4L2tlcm5lbC5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KPiA+ICsjaW5jbHVk ZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L29mLmg+Cj4g PiArI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9leHRj b24tcHJvdmlkZXIuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+Cj4gPiAr I2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KPiA+ICsKPiA+ICsjZGVmaW5lIE1U NjM2MF9QTVVfQ0hHX0NUUkwxICAgICAgICAgICAgICAgICAoMHgxMSkKPgo+IERyb3AgYWxsIHRo ZSBicmFja2V0cy4KPgoKQUNLCgo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDIgICAg ICAgICAgICAgICAgICgweDEyKQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDMgICAg ICAgICAgICAgICAgICgweDEzKQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDQgICAg ICAgICAgICAgICAgICgweDE0KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDUgICAg ICAgICAgICAgICAgICgweDE1KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDYgICAg ICAgICAgICAgICAgICgweDE2KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDcgICAg ICAgICAgICAgICAgICgweDE3KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDggICAg ICAgICAgICAgICAgICgweDE4KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDkgICAg ICAgICAgICAgICAgICgweDE5KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDEwICAg ICAgICAgICAgICAgICAgICAgICAgKDB4MUEpCj4gPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19D VFJMMTEgICAgICAgICAgICAgICAgICAgICAgICAoMHgxQikKPiA+ICsjZGVmaW5lIE1UNjM2MF9Q TVVfQ0hHX0NUUkwxMiAgICAgICAgICAgICAgICAgICAgICAgICgweDFDKQo+ID4gKyNkZWZpbmUg TVQ2MzYwX1BNVV9DSEdfQ1RSTDEzICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUQpCj4gPiAr I2RlZmluZSBNVDYzNjBfUE1VX0RFVklDRV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAoMHgy MikKPiA+ICsjZGVmaW5lIE1UNjM2MF9QTVVfVVNCX1NUQVRVUzEgICAgICAgICAgICAgICAgICAg ICAgICgweDI3KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDE3ICAgICAgICAgICAg ICAgICAgICAgICAgKDB4MkIpCj4gPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19DVFJMMTggICAg ICAgICAgICAgICAgICAgICAgICAoMHgyQykKPiA+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX1NU QVQgICAgICAgICAgICAgICAgICAoMHg0QSkKPiA+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NU UkwxOSAgICAgICAgICAgICAgICAgICAgICAgICgweDYxKQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1BN VV9GT0RfU1RBVCAgICAgICAgICAgICAgICAgICgweEU3KQo+ID4gKwo+ID4gKy8qIDB4MTEgKi8K Pgo+IFVzZSBuYW1lLCBub3QgdmFsdWUgaW4gY29tbWVudC4KPgo+ID4gKyNkZWZpbmUgTVQ2MzYw X01BU0tfRlNMUCAgICAgQklUKDMpCj4KPiBIZXJlIGFuZCBiZWxvdyAtIHJldmVyc2UgdGhlIG5h bWluZyBzbzoKPiBNVDYzNjBfRlNMUF9NQVNLCj4gTVQ2MzYwX0ZTTFBfU0hJRlQKPgo+IEFsc28g ZG9uJ3QgZHVwbGljYXRlIHRoZSB2YWx1ZXMsIHNvOgo+ICNkZWZpbmUgTVQ2MzYwX0ZTTFBfTUFT SyAgICAgICAgQklUKE1UNjM2MF9GU0xQX1NISUZUKQo+IGF0IGxlYXN0IHdoZXJlIHRoaXMgaXMg b25seSBCSVQoKS4KPgoKQUNLCgo+ID4gKyNkZWZpbmUgTVQ2MzYwX1NIRlRfRlNMUCAgICAgKDMp Cj4gPiArI2RlZmluZSBNVDYzNjBfTUFTS19ISVogICAgICAgICAgICAgIEJJVCgyKQo+ID4gKyNk ZWZpbmUgTVQ2MzYwX1NIRlRfSElaICAgICAgICAgICAgICAoMikKPiA+ICsjZGVmaW5lIE1UNjM2 MF9NQVNLX09QQV9NT0RFIEJJVCgwKQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1NIRlRfT1BBX01PREUg KDApCj4gPiArLyogMHgxMiAqLwo+ID4gKyNkZWZpbmUgTVQ2MzYwX01BU0tfVEUgICAgICAgICAg ICAgICBCSVQoNCkKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX1RFICAgICAgICAgICAgICAgKDQp Cj4gPiArI2RlZmluZSBNVDYzNjBfTUFTS19JSU5MTVRTRUwgICAgICAgIEdFTk1BU0soMywgMikK PiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX0lJTkxNVFNFTCAgICAgICAgKDIpCj4gPiArI2RlZmlu ZSBNVDYzNjBfTUFTS19DSEdfRU4gICBCSVQoMCkKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX0NI R19FTiAgICgwKQo+ID4gKy8qIDB4MTMgKi8KPiA+ICsjZGVmaW5lIE1UNjM2MF9NQVNLX0lBSUNS ICAgIEdFTk1BU0soNywgMikKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX0lBSUNSICAgICgyKQo+ ID4gKyNkZWZpbmUgTVQ2MzYwX01BU0tfSUxJTV9FTiAgQklUKDApCj4gPiArLyogMHgxNCAqLwo+ ID4gKyNkZWZpbmUgTVQ2MzYwX01BU0tfVk9SRUcgICAgR0VOTUFTSyg3LCAxKQo+ID4gKyNkZWZp bmUgTVQ2MzYwX1NIRlRfVk9SRUcgICAgKDEpCj4gPiArLyogMHgxNSAqLwo+ID4gKyNkZWZpbmUg TVQ2MzYwX01BU0tfVk9CU1QgICAgR0VOTUFTSyg3LCAyKQo+ID4gKy8qIDB4MTYgKi8KPiA+ICsj ZGVmaW5lIE1UNjM2MF9NQVNLX1ZNSVZSICAgIEdFTk1BU0soNywgMSkKPiA+ICsjZGVmaW5lIE1U NjM2MF9TSEZUX1ZNSVZSICAgICgxKQo+ID4gKy8qIDB4MTcgKi8KPiA+ICsjZGVmaW5lIE1UNjM2 MF9NQVNLX0lDSEcgICAgIEdFTk1BU0soNywgMikKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX0lD SEcgICAgICgyKQo+ID4gKy8qIDB4MTggKi8KPiA+ICsjZGVmaW5lIE1UNjM2MF9NQVNLX0lQUkVD ICAgIEdFTk1BU0soMywgMCkKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX0lQUkVDICAgICgwKQo+ ID4gKy8qIDB4MTkgKi8KPiA+ICsjZGVmaW5lIE1UNjM2MF9NQVNLX0lFT0MgICAgIEdFTk1BU0so NywgNCkKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX0lFT0MgICAgICg0KQo+ID4gKy8qIDB4MUEg Ki8KPiA+ICsjZGVmaW5lIE1UNjM2MF9NQVNLX0xCUCAgICAgICAgICAgICAgR0VOTUFTSyg3LCA0 KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1NIRlRfTEJQICAgICAgICAgICAgICAoNCkKPiA+ICsjZGVm aW5lIE1UNjM2MF9NQVNLX09UR19PQyAgIEdFTk1BU0soMywgMCkKPiA+ICsjZGVmaW5lIE1UNjM2 MF9TSEZUX09UR19PQyAgICgwKQo+ID4gKy8qIDB4MUIgKi8KPiA+ICsjZGVmaW5lIE1UNjM2MF9N QVNLX1NZU1JFRyAgIEdFTk1BU0soNCwgMikKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX1NZU1JF RyAgICgyKQo+ID4gKyNkZWZpbmUgTVQ2MzYwX01BU0tfVlJFQyAgICAgR0VOTUFTSygyLCAwKQo+ ID4gKyNkZWZpbmUgTVQ2MzYwX1NIRlRfVlJFQyAgICAgKDApCj4gPiArLyogMHgxQyAqLwo+ID4g KyNkZWZpbmUgTVQ2MzYwX01BU0tfV1RfRkMgICAgR0VOTUFTSyg3LCA1KQo+ID4gKyNkZWZpbmUg TVQ2MzYwX1NIRlRfV1RfRkMgICAgKDUpCj4gPiArLyogMHgxRCAqLwo+ID4gKyNkZWZpbmUgTVQ2 MzYwX01BU0tfQ0hHX1dEVF9FTiAgICAgICBCSVQoNykKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZU X0NIR19XRFRfRU4gICAgICAgKDcpCj4gPiArI2RlZmluZSBNVDYzNjBfTUFTS19DSEdfV0RUICBH RU5NQVNLKDUsIDQpCj4gPiArI2RlZmluZSBNVDYzNjBfU0hGVF9DSEdfV0RUICAoNCkKPiA+ICsv KiAweDIyICovCj4gPiArI2RlZmluZSBNVDYzNjBfTUFTS19VU0JDSEdFTiBCSVQoNykKPiA+ICsj ZGVmaW5lIE1UNjM2MF9TSEZUX1VTQkNIR0VOICg3KQo+ID4gKy8qIDB4MjcgKi8KPiA+ICsjZGVm aW5lIE1UNjM2MF9NQVNLX1VTQl9TVEFUVVMgICAgICAgR0VOTUFTSyg2LCA0KQo+ID4gKyNkZWZp bmUgTVQ2MzYwX1NIRlRfVVNCX1NUQVRVUyAgICAgICAoNCkKPiA+ICsvKiAweDJDICovCj4gPiAr I2RlZmluZSBNVDYzNjBfTUFTS19CQVRfQ09NUCBHRU5NQVNLKDUsIDMpCj4gPiArI2RlZmluZSBN VDYzNjBfU0hGVF9CQVRfQ09NUCAoMykKPiA+ICsjZGVmaW5lIE1UNjM2MF9NQVNLX1ZDTEFNUCAg IEdFTk1BU0soMiwgMCkKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX1ZDTEFNUCAgICgwKQo+ID4g Ky8qIDB4NEEgKi8KPiA+ICsjZGVmaW5lIE1UNjM2MF9NQVNLX0NIR19TVEFUIEdFTk1BU0soNywg NikKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX0NIR19TVEFUICg2KQo+ID4gKyNkZWZpbmUgTVQ2 MzYwX01BU0tfVkJBVF9MVkwgQklUKDUpCj4gPiArLyogMHg2MSAqLwo+ID4gKyNkZWZpbmUgTVQ2 MzYwX01BU0tfVklOT1ZQICAgR0VOTUFTSyg2LCA1KQo+ID4gKyNkZWZpbmUgTVQ2MzYwX1NIRlRf VklOT1ZQICAgKDUpCj4gPiArLyogMHhFNyAqLwo+ID4gKyNkZWZpbmUgTVQ2MzYwX01BU0tfQ0hS REVUX0VYVCAgICAgICBCSVQoNCkKPiA+ICsjZGVmaW5lIE1UNjM2MF9TSEZUX0NIUkRFVF9FWFQg ICAgICAgKDQpCj4gPiArCj4gPiArLyogdUEgKi8KPiA+ICsjZGVmaW5lIE1UNjM2MF9JQ0hHX01J TiAgICAgICAgICAgICAgMTAwMDAwCj4gPiArI2RlZmluZSBNVDYzNjBfSUNIR19NQVggICAgICAg ICAgICAgIDUwMDAwMDAKPiA+ICsjZGVmaW5lIE1UNjM2MF9JQ0hHX1NURVAgICAgIDEwMDAwMAo+ ID4gKy8qIHVWICovCj4gPiArI2RlZmluZSBNVDYzNjBfVk9SRUdfTUlOICAgICAzOTAwMDAwCj4g PiArI2RlZmluZSBNVDYzNjBfVk9SRUdfTUFYICAgICA0NzEwMDAwCj4gPiArI2RlZmluZSBNVDYz NjBfVk9SRUdfU1RFUCAgICAxMDAwMAo+ID4gKy8qIHVBICovCj4gPiArI2RlZmluZSBNVDYzNjBf QUlDUl9NSU4gICAgICAgICAgICAgIDEwMDAwMAo+ID4gKyNkZWZpbmUgTVQ2MzYwX0FJQ1JfTUFY ICAgICAgICAgICAgICAzMjUwMDAwCj4gPiArI2RlZmluZSBNVDYzNjBfQUlDUl9TVEVQICAgICA1 MDAwMAo+ID4gKy8qIHVBICovCj4gPiArI2RlZmluZSBNVDYzNjBfSVBSRUNfTUlOICAgICAxMDAw MDAKPiA+ICsjZGVmaW5lIE1UNjM2MF9JUFJFQ19NQVggICAgIDg1MDAwMAo+ID4gKyNkZWZpbmUg TVQ2MzYwX0lQUkVDX1NURVAgICAgNTAwMDAKPiA+ICsvKiB1QSAqLwo+ID4gKyNkZWZpbmUgTVQ2 MzYwX0lFT0NfTUlOICAgICAgICAgICAgICAxMDAwMDAKPiA+ICsjZGVmaW5lIE1UNjM2MF9JRU9D X01BWCAgICAgICAgICAgICAgODUwMDAwCj4gPiArI2RlZmluZSBNVDYzNjBfSUVPQ19TVEVQICAg ICA1MDAwMAo+ID4gKwo+ID4gK3N0cnVjdCBtdDYzNjBfY2hnX3BsYXRmb3JtX2RhdGEgewo+ID4g KyAgICAgdTMyIHZpbm92cDsKPiA+ICt9Owo+ID4gKwo+ID4gK3N0cnVjdCBtdDYzNjBfY2hnX2lu Zm8gewo+ID4gKyAgICAgc3RydWN0IGRldmljZSAqZGV2Owo+ID4gKyAgICAgc3RydWN0IG10NjM2 MF9jaGdfcGxhdGZvcm1fZGF0YSAqcGRhdGE7Cj4gPiArICAgICBzdHJ1Y3QgcmVnbWFwICpyZWdt YXA7Cj4gPiArICAgICBzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldjsKPiA+ICsgICAgIHN0cnVjdCBw b3dlcl9zdXBwbHlfZGVzYyBwc3lfZGVzYzsKPiA+ICsgICAgIHN0cnVjdCBwb3dlcl9zdXBwbHkg KnBzeTsKPiA+ICsgICAgIHN0cnVjdCByZWd1bGF0b3JfZGVzYyBvdGdfcmRlc2M7Cj4KPiBUaGlz IGxvb2tzIHVudXNlZC4KPgoKQUNLLCBJIHdpbGwgcmVtb3ZlIGl0LgoKPiA+ICsgICAgIHN0cnVj dCByZWd1bGF0b3JfZGV2ICpvdGdfcmRldjsKPiA+ICsgICAgIHN0cnVjdCBtdXRleCBjaGdkZXRf bG9jazsKPiA+ICsgICAgIGJvb2wgcHdyX3JkeTsKPiA+ICsgICAgIGJvb2wgYmMxMl9lbjsKPiA+ ICsgICAgIGludCBwc3lfdXNiX3R5cGU7Cj4gPiArICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2hy ZGV0X3dvcms7Cj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IG10NjM2MF9jaGdfcGxh dGZvcm1fZGF0YSBkZWZfcGxhdGZvcm1fZGF0YSA9IHsKPiA+ICsgICAgIC52aW5vdnAgPSA2NTAw MDAwLAo+ID4gK307Cj4gPiArCj4gPiArc3RydWN0IG10NjM2MF9pcnFfZGVzYyB7Cj4gPiArICAg ICBjb25zdCBjaGFyICpuYW1lOwo+ID4gKyAgICAgaXJxX2hhbmRsZXJfdCBpcnFfaGFuZGxlcjsK PiA+ICt9Owo+ID4gKwo+ID4gK2VudW0gbXQ2MzYwX2lpbmxtdHNlbCB7Cj4gPiArICAgICBNVDYz NjBfSUlOTE1UU0VMX0FJQ1JfMzI1MCA9IDAsCj4gPiArICAgICBNVDYzNjBfSUlOTE1UU0VMX0NI R19UWVBFLAo+ID4gKyAgICAgTVQ2MzYwX0lJTkxNVFNFTF9BSUNSLAo+ID4gKyAgICAgTVQ2MzYw X0lJTkxNVFNFTF9MT1dFUl9MRVZFTCwKPiA+ICt9Owo+ID4gKwo+ID4gK2VudW0gbXQ2MzYwX3Bt dV9jaGdfdHlwZSB7Cj4gPiArICAgICBNVDYzNjBfQ0hHX1RZUEVfTk9WQlVTID0gMCwKPiA+ICsg ICAgIE1UNjM2MF9DSEdfVFlQRV9VTkRFUl9HT0lORywKPiA+ICsgICAgIE1UNjM2MF9DSEdfVFlQ RV9TRFAsCj4gPiArICAgICBNVDYzNjBfQ0hHX1RZUEVfU0RQTlNURCwKPiA+ICsgICAgIE1UNjM2 MF9DSEdfVFlQRV9EQ1AsCj4gPiArICAgICBNVDYzNjBfQ0hHX1RZUEVfQ0RQLAo+ID4gKyAgICAg TVQ2MzYwX0NIR19UWVBFX01BWCwKPiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRpYyBlbnVtIHBvd2Vy X3N1cHBseV91c2JfdHlwZSBtdDYzNjBfY2hhcmdlcl91c2JfdHlwZXNbXSA9IHsKPiA+ICsgICAg IFBPV0VSX1NVUFBMWV9VU0JfVFlQRV9VTktOT1dOLAo+ID4gKyAgICAgUE9XRVJfU1VQUExZX1VT Ql9UWVBFX1NEUCwKPiA+ICsgICAgIFBPV0VSX1NVUFBMWV9VU0JfVFlQRV9EQ1AsCj4gPiArICAg ICBQT1dFUl9TVVBQTFlfVVNCX1RZUEVfQ0RQLAo+ID4gKyAgICAgUE9XRVJfU1VQUExZX1VTQl9U WVBFX0MsCj4gPiArICAgICBQT1dFUl9TVVBQTFlfVVNCX1RZUEVfUEQsCj4gPiArICAgICBQT1dF Ul9TVVBQTFlfVVNCX1RZUEVfUERfRFJQLAo+ID4gKyAgICAgUE9XRVJfU1VQUExZX1VTQl9UWVBF X0FQUExFX0JSSUNLX0lECj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgaW5saW5lIHVuc2lnbmVk IGludCBtdDYzNjBfdHJhbnNfcmVnX3NlbCh1MzIgZGF0YSwgdTMyIG1pbl92YWwsIHUzMiBzdGVw LAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBt YXhfc2VsKQo+Cj4gRHJvcCBhbGwgaW5saW5lcy4KPgoKQUNLCgo+ID4gK3sKPiA+ICsgICAgIHVu c2lnbmVkIGludCB0YXJnZXQgPSAwOwo+ID4gKwo+ID4gKyAgICAgaWYgKGRhdGEgPj0gbWluX3Zh bCkKPiA+ICsgICAgICAgICAgICAgdGFyZ2V0ID0gKGRhdGEgLSBtaW5fdmFsKSAvIHN0ZXA7Cj4g PiArICAgICBpZiAodGFyZ2V0ID4gbWF4X3NlbCkKPiA+ICsgICAgICAgICAgICAgdGFyZ2V0ID0g bWF4X3NlbDsKPiA+ICsgICAgIHJldHVybiB0YXJnZXQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRp YyBpbmxpbmUgaW50IG10NjM2MF9nZXRfY2hyZGV0X2V4dF9zdGF0KHN0cnVjdCBtdDYzNjBfY2hn X2luZm8gKm1jaSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBib29sICpwd3JfcmR5KQo+ID4gK3sKPiA+ICsgICAgIGludCByZXQ7Cj4gPiArICAgICB1bnNp Z25lZCBpbnQgcmVndmFsOwo+ID4gKwo+ID4gKyAgICAgcmV0ID0gcmVnbWFwX3JlYWQobWNpLT5y ZWdtYXAsIE1UNjM2MF9QTVVfRk9EX1NUQVQsICZyZWd2YWwpOwo+ID4gKyAgICAgaWYgKHJldCA8 IDApCj4gPiArICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICAqcHdyX3JkeSA9IChy ZWd2YWwgJiBNVDYzNjBfTUFTS19DSFJERVRfRVhUKSA/IHRydWUgOiBmYWxzZTsKPiA+ICsgICAg IHJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX2dl dF9vbmxpbmUoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4g K3sKPiA+ICsgICAgIGludCByZXQ7Cj4gPiArICAgICBib29sIHB3cl9yZHk7Cj4gPiArCj4gPiAr ICAgICByZXQgPSBtdDYzNjBfZ2V0X2NocmRldF9leHRfc3RhdChtY2ksICZwd3JfcmR5KTsKPiA+ ICsgICAgIGlmIChyZXQgPCAwKQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKyAg ICAgdmFsLT5pbnR2YWwgPSBwd3JfcmR5ID8gdHJ1ZSA6IGZhbHNlOwo+ID4gKyAgICAgcmV0dXJu IDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X3N0YXR1 cyhzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2ksCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4g KyAgICAgaW50IHN0YXR1cywgcmV0Owo+ID4gKyAgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsKPiA+ ICsgICAgIGJvb2wgcHdyX3JkeTsKPiA+ICsKPiA+ICsgICAgIHJldCA9IG10NjM2MF9nZXRfY2hy ZGV0X2V4dF9zdGF0KG1jaSwgJnB3cl9yZHkpOwo+ID4gKyAgICAgaWYgKHJldCA8IDApCj4gPiAr ICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICBpZiAoIXB3cl9yZHkpIHsKPiA+ICsg ICAgICAgICAgICAgc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKPiA+ ICsgICAgICAgICAgICAgZ290byBvdXQ7Cj4gPiArICAgICB9Cj4gPiArCj4gPiArICAgICByZXQg PSByZWdtYXBfcmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9DSEdfU1RBVCwgJnJlZ3ZhbCk7 Cj4gPiArICAgICBpZiAocmV0IDwgMCkKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+ ICsgICAgIHJlZ3ZhbCAmPSBNVDYzNjBfTUFTS19DSEdfU1RBVDsKPiA+ICsgICAgIHJlZ3ZhbCA+ Pj0gTVQ2MzYwX1NIRlRfQ0hHX1NUQVQ7Cj4gPiArICAgICBzd2l0Y2ggKHJlZ3ZhbCkgewo+ID4g KyAgICAgY2FzZSAweDA6Cj4gPiArICAgICAgICAgICAgIHN0YXR1cyA9IFBPV0VSX1NVUFBMWV9T VEFUVVNfTk9UX0NIQVJHSU5HOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNh c2UgMHgxOgo+ID4gKyAgICAgICAgICAgICBzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NI QVJHSU5HOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgMHgyOgo+ID4g KyAgICAgICAgICAgICBzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7Cj4gPiArICAg ICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgZGVmYXVsdDoKPiA+ICsgICAgICAgICAgICAgcmV0 ID0gLUVJTzsKPiA+ICsgICAgIH0KPiA+ICtvdXQ6Cj4gPiArICAgICBpZiAoIXJldCkKPiA+ICsg ICAgICAgICAgICAgdmFsLT5pbnR2YWwgPSBzdGF0dXM7Cj4gPiArICAgICByZXR1cm4gcmV0Owo+ ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX2dldF9jaGFyZ2VfdHlw ZShzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2ksCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKPiA+ICt7 Cj4gPiArICAgICBpbnQgdHlwZSwgcmV0Owo+ID4gKyAgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsK PiA+ICsgICAgIHU4IGNoZ19zdGF0Owo+ID4gKwo+ID4gKyAgICAgcmV0ID0gcmVnbWFwX3JlYWQo bWNpLT5yZWdtYXAsIE1UNjM2MF9QTVVfQ0hHX1NUQVQsICZyZWd2YWwpOwo+ID4gKyAgICAgaWYg KHJldCA8IDApCj4gPiArICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICBjaGdfc3Rh dCA9IChyZWd2YWwgJiBNVDYzNjBfTUFTS19DSEdfU1RBVCkgPj4gTVQ2MzYwX1NIRlRfQ0hHX1NU QVQ7Cj4gPiArICAgICBzd2l0Y2ggKGNoZ19zdGF0KSB7Cj4gPiArICAgICBjYXNlIDB4MDA6IC8q IE5vdCBDaGFyZ2luZyAqLwo+ID4gKyAgICAgICAgICAgICB0eXBlID0gUE9XRVJfU1VQUExZX0NI QVJHRV9UWVBFX05PTkU7Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSAw eDAxOiAvKiBDaGFyZ2UgaW4gUHJvZ3Jlc3MgKi8KPiA+ICsgICAgICAgICAgICAgaWYgKHJlZ3Zh bCAmIE1UNjM2MF9NQVNLX1ZCQVRfTFZMKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHR5cGUg PSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfRkFTVDsKPiA+ICsgICAgICAgICAgICAgZWxzZQo+ ID4gKyAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVf VFJJQ0tMRTsKPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICBjYXNlIDB4MDI6IC8q IENoYXJnZSBEb25lICovCj4gPiArICAgICAgICAgICAgIHR5cGUgPSBQT1dFUl9TVVBQTFlfQ0hB UkdFX1RZUEVfTk9ORTsKPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICBjYXNlIDB4 MDM6IC8qIENoYXJnZSBGYXVsdCAqLwo+ID4gKyAgICAgICAgICAgICB0eXBlID0gUE9XRVJfU1VQ UExZX1NUQVRVU19VTktOT1dOOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGRl ZmF1bHQ6Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgfQo+ID4gKyAgICAgdmFs LT5pbnR2YWwgPSB0eXBlOwo+ID4gKyAgICAgcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0 YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X2ljaGcoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAq bWNpLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gcG93ZXJfc3Vw cGx5X3Byb3B2YWwgKnZhbCkKPiA+ICt7Cj4gPiArICAgICBpbnQgaWNoZywgcmV0Owo+ID4gKyAg ICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsKPiA+ICsKPiA+ICsgICAgIHJldCA9IHJlZ21hcF9yZWFk KG1jaS0+cmVnbWFwLCBNVDYzNjBfUE1VX0NIR19DVFJMNywgJnJlZ3ZhbCk7Cj4gPiArICAgICBp ZiAocmV0IDwgMCkKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+ICsgICAgIHJlZ3Zh bCA9IChyZWd2YWwgJiBNVDYzNjBfTUFTS19JQ0hHKSA+PiBNVDYzNjBfU0hGVF9JQ0hHOwo+ID4g KyAgICAgaWNoZyA9IE1UNjM2MF9JQ0hHX01JTiArIChyZWd2YWwgKiBNVDYzNjBfSUNIR19TVEVQ KTsKPiA+ICsgICAgIGlmIChpY2hnID4gTVQ2MzYwX0lDSEdfTUFYKQo+ID4gKyAgICAgICAgICAg ICBpY2hnID0gTVQ2MzYwX0lDSEdfTUFYOwo+ID4gKyAgICAgdmFsLT5pbnR2YWwgPSBpY2hnOwo+ ID4gKyAgICAgcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2No YXJnZXJfZ2V0X21heF9pY2hnKHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZh bCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIHZhbC0+aW50dmFsID0gTVQ2MzYwX0lDSEdfTUFYOwo+ ID4gKyAgICAgcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2No YXJnZXJfZ2V0X2N2KHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4g K3sKPiA+ICsgICAgIGludCBjdiwgcmV0Owo+ID4gKyAgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsK PiA+ICsKPiA+ICsgICAgIHJldCA9IHJlZ21hcF9yZWFkKG1jaS0+cmVnbWFwLCBNVDYzNjBfUE1V X0NIR19DVFJMNCwgJnJlZ3ZhbCk7Cj4gPiArICAgICBpZiAocmV0IDwgMCkKPiA+ICsgICAgICAg ICAgICAgcmV0dXJuIHJldDsKPiA+ICsgICAgIHJlZ3ZhbCA9IChyZWd2YWwgJiBNVDYzNjBfTUFT S19WT1JFRykgPj4gTVQ2MzYwX1NIRlRfVk9SRUc7Cj4gPiArICAgICBjdiA9IE1UNjM2MF9WT1JF R19NSU4gKyAocmVndmFsICogTVQ2MzYwX1ZPUkVHX1NURVApOwo+ID4gKyAgICAgaWYgKGN2ID4g TVQ2MzYwX1ZPUkVHX01BWCkKPiA+ICsgICAgICAgICAgICAgY3YgPSBNVDYzNjBfVk9SRUdfTUFY Owo+ID4gKyAgICAgdmFsLT5pbnR2YWwgPSBjdjsKPiA+ICsgICAgIHJldHVybiAwOwo+ID4gK30K PiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX2dldF9tYXhfY3Yoc3RydWN0IG10 NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIHZhbC0+ aW50dmFsID0gTVQ2MzYwX1ZPUkVHX01BWDsKPiA+ICsgICAgIHJldHVybiAwOwo+ID4gK30KPiA+ ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX2dldF9haWNyKHN0cnVjdCBtdDYzNjBf Y2hnX2luZm8gKm1jaSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9u IHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4gKyAgICAgaW50IHJldDsKPiA+ ICsgICAgIHVuc2lnbmVkIGludCByZWd2YWw7Cj4gPiArCj4gPiArICAgICByZXQgPSByZWdtYXBf cmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9DSEdfQ1RSTDMsICZyZWd2YWwpOwo+ID4gKyAg ICAgaWYgKHJldCA8IDApCj4gPiArICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICBy ZWd2YWwgPSAocmVndmFsICYgTVQ2MzYwX01BU0tfSUFJQ1IpID4+IE1UNjM2MF9TSEZUX0lBSUNS Owo+ID4gKyAgICAgdmFsLT5pbnR2YWwgPSBNVDYzNjBfQUlDUl9NSU4gKyAocmVndmFsICogTVQ2 MzYwX0FJQ1JfU1RFUCk7Cj4gPiArICAgICByZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArc3Rh dGljIGludCBtdDYzNjBfY2hhcmdlcl9nZXRfaXByZWNoZyhzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZv ICptY2ksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBwb3dl cl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIGludCByZXQ7Cj4gPiArICAg ICB1bnNpZ25lZCBpbnQgcmVndmFsOwo+ID4gKwo+ID4gKyAgICAgcmV0ID0gcmVnbWFwX3JlYWQo bWNpLT5yZWdtYXAsIE1UNjM2MF9QTVVfQ0hHX0NUUkw4LCAmcmVndmFsKTsKPiA+ICsgICAgIGlm IChyZXQgPCAwKQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKyAgICAgcmVndmFs ID0gKHJlZ3ZhbCAmIE1UNjM2MF9NQVNLX0lQUkVDKSA+PiBNVDYzNjBfU0hGVF9JUFJFQzsKPiA+ ICsgICAgIHZhbC0+aW50dmFsID0gTVQ2MzYwX0lQUkVDX01JTiArIChyZWd2YWwgKiBNVDYzNjBf SVBSRUNfU1RFUCk7Cj4gPiArICAgICByZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGlj IGludCBtdDYzNjBfY2hhcmdlcl9nZXRfaWVvYyhzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2ks Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlf cHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIGludCByZXQ7Cj4gPiArICAgICB1bnNpZ25l ZCBpbnQgcmVndmFsOwo+ID4gKwo+ID4gKyAgICAgcmV0ID0gcmVnbWFwX3JlYWQobWNpLT5yZWdt YXAsIE1UNjM2MF9QTVVfQ0hHX0NUUkw5LCAmcmVndmFsKTsKPiA+ICsgICAgIGlmIChyZXQgPCAw KQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKyAgICAgcmVndmFsID0gKHJlZ3Zh bCAmIE1UNjM2MF9NQVNLX0lFT0MpID4+IE1UNjM2MF9TSEZUX0lFT0M7Cj4gPiArICAgICB2YWwt PmludHZhbCA9IE1UNjM2MF9JRU9DX01JTiArIChyZWd2YWwgKiBNVDYzNjBfSUVPQ19TVEVQKTsK PiA+ICsgICAgIHJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9j aGFyZ2VyX3NldF9vbmxpbmUoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJv cHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIHU4IGZvcmNlX3NsZWVwID0gdmFsLT5pbnR2YWwg PyAwIDogMTsKPiA+ICsKPiA+ICsgICAgIHJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMobWNpLT5y ZWdtYXAsIE1UNjM2MF9QTVVfQ0hHX0NUUkwxLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBNVDYzNjBfTUFTS19GU0xQLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBmb3JjZV9zbGVlcCA8PCBNVDYzNjBfU0hGVF9GU0xQKTsKPiA+ICt9Cj4gPiArCj4gPiAr c3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9zZXRfaWNoZyhzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZv ICptY2ksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlvbiBw b3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIHVuc2lnbmVkIGludCBy ZWd2YWw7Cj4gPiArCj4gPiArICAgICByZWd2YWwgPSBtdDYzNjBfdHJhbnNfcmVnX3NlbCh2YWwt PmludHZhbCwgMTAwMDAwLCAxMDAwMDAsIDB4MzEpOwo+ID4gKyAgICAgcmV0dXJuIHJlZ21hcF91 cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9DSEdfQ1RSTDcsCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9NQVNLX0lDSEcsIHJlZ3ZhbCA8PCBNVDYz NjBfU0hGVF9JQ0hHKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdl cl9zZXRfY3Yoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4g PiArewo+ID4gKyAgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsKPiA+ICsKPiA+ICsgICAgIHJlZ3Zh bCA9IG10NjM2MF90cmFuc19yZWdfc2VsKHZhbC0+aW50dmFsLCAzOTAwMDAwLCAxMDAwMCwgMHg1 MSk7Cj4gPiArICAgICByZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKG1jaS0+cmVnbWFwLAo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfUE1VX0NIR19DVFJMNCwKPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX01BU0tfVk9SRUcsCj4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3ZhbCA8PCBNVDYzNjBfU0hGVF9WT1JF Ryk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfc2V0X2FpY3Io c3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgY29uc3QgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKPiA+ICt7Cj4g PiArICAgICB1bnNpZ25lZCBpbnQgcmVndmFsOwo+ID4gKwo+ID4gKyAgICAgcmVndmFsID0gbXQ2 MzYwX3RyYW5zX3JlZ19zZWwodmFsLT5pbnR2YWwsIDEwMDAwMCwgNTAwMDAsIDB4M0YpOwo+ID4g KyAgICAgcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwKPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX1BNVV9DSEdfQ1RSTDMsCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9NQVNLX0lBSUNSLAo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICByZWd2YWwgPDwgTVQ2MzYwX1NIRlRfSUFJQ1IpOwo+ID4g K30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX3NldF9pcHJlY2hnKHN0cnVj dCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4g KyAgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsKPiA+ICsKPiA+ICsgICAgIHJlZ3ZhbCA9IG10NjM2 MF90cmFuc19yZWdfc2VsKHZhbC0+aW50dmFsLCAxMDAwMDAsIDUwMDAwLCAweDBGKTsKPiA+ICsg ICAgIHJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMobWNpLT5yZWdtYXAsCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9QTVVfQ0hHX0NUUkw4LAo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfTUFTS19JUFJFQywKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcmVndmFsIDw8IE1UNjM2MF9TSEZUX0lQUkVDKTsKPiA+ICt9 Cj4gPiArCj4gPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9zZXRfaWVvYyhzdHJ1Y3QgbXQ2 MzYwX2NoZ19pbmZvICptY2ksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj b25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIHVu c2lnbmVkIGludCByZWd2YWw7Cj4gPiArCj4gPiArICAgICByZWd2YWwgPSBtdDYzNjBfdHJhbnNf cmVnX3NlbCh2YWwtPmludHZhbCwgMTAwMDAwLCA1MDAwMCwgMHgwRik7Cj4gPiArICAgICByZXR1 cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKG1jaS0+cmVnbWFwLAo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBNVDYzNjBfUE1VX0NIR19DVFJMOSwKPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgTVQ2MzYwX01BU0tfSUVPQywKPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcmVndmFsIDw8IE1UNjM2MF9TSEZUX0lFT0MpOwo+ID4gK30KPiA+ICsKPiA+ ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3Vw cGx5ICpwc3ksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBw b3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gPiArewo+ID4gKyAg ICAgc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRh KHBzeSk7Cj4gPiArICAgICBpbnQgcmV0ID0gMDsKPiA+ICsKPiA+ICsgICAgIGRldl9kYmcobWNp LT5kZXYsICIlczogcHJvcCA9ICVkXG4iLCBfX2Z1bmNfXywgcHNwKTsKPiA+ICsgICAgIHN3aXRj aCAocHNwKSB7Cj4gPiArICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKPiA+ICsg ICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X29ubGluZShtY2ksIHZhbCk7Cj4g PiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9T VEFUVVM6Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX2dldF9zdGF0dXMo bWNpLCB2YWwpOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgUE9XRVJf U1VQUExZX1BST1BfQ0hBUkdFX1RZUEU6Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10NjM2MF9j aGFyZ2VyX2dldF9jaGFyZ2VfdHlwZShtY2ksIHZhbCk7Cj4gPiArICAgICAgICAgICAgIGJyZWFr Owo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVO VDoKPiA+ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X2ljaGcobWNpLCB2 YWwpOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZ X1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NVUlJFTlRfTUFYOgo+ID4gKyAgICAgICAgICAgICByZXQg PSBtdDYzNjBfY2hhcmdlcl9nZXRfbWF4X2ljaGcobWNpLCB2YWwpOwo+ID4gKyAgICAgICAgICAg ICBicmVhazsKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdF X1ZPTFRBR0U6Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX2dldF9jdiht Y2ksIHZhbCk7Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSBQT1dFUl9T VVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRV9NQVg6Cj4gPiArICAgICAgICAgICAg IHJldCA9IG10NjM2MF9jaGFyZ2VyX2dldF9tYXhfY3YobWNpLCB2YWwpOwo+ID4gKyAgICAgICAg ICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfSU5QVVRfQ1VSUkVO VF9MSU1JVDoKPiA+ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X2FpY3Io bWNpLCB2YWwpOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgUE9XRVJf U1VQUExZX1BST1BfUFJFQ0hBUkdFX0NVUlJFTlQ6Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10 NjM2MF9jaGFyZ2VyX2dldF9pcHJlY2hnKG1jaSwgdmFsKTsKPiA+ICsgICAgICAgICAgICAgYnJl YWs7Cj4gPiArICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9URVJNX0NVUlJFTlQ6 Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX2dldF9pZW9jKG1jaSwgdmFs KTsKPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICBjYXNlIFBPV0VSX1NVUFBMWV9Q Uk9QX1VTQl9UWVBFOgo+ID4gKyAgICAgICAgICAgICB2YWwtPmludHZhbCA9IG1jaS0+cHN5X3Vz Yl90eXBlOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGRlZmF1bHQ6Cj4gPiAr ICAgICAgICAgICAgIHJldCA9IC1FTk9EQVRBOwo+ID4gKyAgICAgfQo+ID4gKyAgICAgcmV0dXJu IHJldDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9zZXRfcHJv cGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAo+ID4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlvbiBwb3dlcl9zdXBwbHlf cHJvcHZhbCAqdmFsKQo+ID4gK3sKPiA+ICsgICAgIHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1j aSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwo+ID4gKyAgICAgaW50IHJldDsKPiA+ ICsKPiA+ICsgICAgIGRldl9kYmcobWNpLT5kZXYsICIlczogcHJvcCA9ICVkXG4iLCBfX2Z1bmNf XywgcHNwKTsKPiA+ICsgICAgIHN3aXRjaCAocHNwKSB7Cj4gPiArICAgICBjYXNlIFBPV0VSX1NV UFBMWV9QUk9QX09OTElORToKPiA+ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJf c2V0X29ubGluZShtY2ksIHZhbCk7Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAg Y2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVDoKPiA+ICsgICAg ICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfc2V0X2ljaGcobWNpLCB2YWwpOwo+ID4gKyAg ICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RB TlRfQ0hBUkdFX1ZPTFRBR0U6Cj4gPiArICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2Vy X3NldF9jdihtY2ksIHZhbCk7Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2Fz ZSBQT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX0xJTUlUOgo+ID4gKyAgICAgICAgICAg ICByZXQgPSBtdDYzNjBfY2hhcmdlcl9zZXRfYWljcihtY2ksIHZhbCk7Cj4gPiArICAgICAgICAg ICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVDSEFSR0VfQ1VS UkVOVDoKPiA+ICsgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfc2V0X2lwcmVjaGco bWNpLCB2YWwpOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2UgUE9XRVJf U1VQUExZX1BST1BfQ0hBUkdFX1RFUk1fQ1VSUkVOVDoKPiA+ICsgICAgICAgICAgICAgcmV0ID0g bXQ2MzYwX2NoYXJnZXJfc2V0X2llb2MobWNpLCB2YWwpOwo+ID4gKyAgICAgICAgICAgICBicmVh azsKPiA+ICsgICAgIGRlZmF1bHQ6Cj4gPiArICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7Cj4g PiArICAgICB9Cj4gPiArICAgICByZXR1cm4gcmV0Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMg aW50IG10NjM2MF9jaGFyZ2VyX3Byb3BlcnR5X2lzX3dyaXRlYWJsZShzdHJ1Y3QgcG93ZXJfc3Vw cGx5ICpwc3ksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3ApCj4gPiArewo+ID4gKyAgICAgc3dpdGNo IChwc3ApIHsKPiA+ICsgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgo+ID4gKyAg ICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVDoKPiA+ICsg ICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRBR0U6Cj4gPiAr ICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0lOUFVUX0NVUlJFTlRfTElNSVQ6Cj4gPiArICAg ICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRUNIQVJHRV9DVVJSRU5UOgo+ID4gKyAgICAgY2Fz ZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVEVSTV9DVVJSRU5UOgo+ID4gKyAgICAgICAgICAg ICByZXR1cm4gMTsKPiA+ICsgICAgIGRlZmF1bHQ6Cj4gPiArICAgICAgICAgICAgIHJldHVybiAw Owo+ID4gKyAgICAgfQo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlf cHJvcGVydHkgbXQ2MzYwX2NoYXJnZXJfcHJvcGVydGllc1tdID0gewo+ID4gKyAgICAgUE9XRVJf U1VQUExZX1BST1BfT05MSU5FLAo+ID4gKyAgICAgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAo+ ID4gKyAgICAgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RZUEUsCj4gPiArICAgICBQT1dFUl9T VVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVCwKPiA+ICsgICAgIFBPV0VSX1NVUFBM WV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UX01BWCwKPiA+ICsgICAgIFBPV0VSX1NVUFBM WV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9WT0xUQUdFLAo+ID4gKyAgICAgUE9XRVJfU1VQUExZX1BS T1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRBR0VfTUFYLAo+ID4gKyAgICAgUE9XRVJfU1VQUExZX1BS T1BfSU5QVVRfQ1VSUkVOVF9MSU1JVCwKPiA+ICsgICAgIFBPV0VSX1NVUFBMWV9QUk9QX1BSRUNI QVJHRV9DVVJSRU5ULAo+ID4gKyAgICAgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RFUk1fQ1VS UkVOVCwKPiA+ICsgICAgIFBPV0VSX1NVUFBMWV9QUk9QX1VTQl9UWVBFLAo+ID4gK307Cj4gPiAr Cj4gPiArc3RhdGljIGNoYXIgKm10NjM2MF9jaGFyZ2VyX3N1cHBsaWVkX3RvW10gPSB7Cj4gPiAr ICAgICAibWFpbi1iYXR0ZXJ5Igo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljIGNvbnN0IHN0cnVj dCBwb3dlcl9zdXBwbHlfZGVzYyBtdDYzNjBfY2hhcmdlcl9kZXNjID0gewo+ID4gKyAgICAgLnR5 cGUgICAgICAgICAgICAgICAgICAgPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0IsCj4gPiArICAgICAu cHJvcGVydGllcyAgICAgICAgICAgICA9IG10NjM2MF9jaGFyZ2VyX3Byb3BlcnRpZXMsCj4gPiAr ICAgICAubnVtX3Byb3BlcnRpZXMgICAgICAgICA9IEFSUkFZX1NJWkUobXQ2MzYwX2NoYXJnZXJf cHJvcGVydGllcyksCj4gPiArICAgICAuZ2V0X3Byb3BlcnR5ICAgICAgICAgICA9IG10NjM2MF9j aGFyZ2VyX2dldF9wcm9wZXJ0eSwKPiA+ICsgICAgIC5zZXRfcHJvcGVydHkgICAgICAgICAgID0g bXQ2MzYwX2NoYXJnZXJfc2V0X3Byb3BlcnR5LAo+ID4gKyAgICAgLnByb3BlcnR5X2lzX3dyaXRl YWJsZSAgPSBtdDYzNjBfY2hhcmdlcl9wcm9wZXJ0eV9pc193cml0ZWFibGUsCj4gPiArICAgICAu dXNiX3R5cGVzICAgICAgICAgICAgICA9IG10NjM2MF9jaGFyZ2VyX3VzYl90eXBlcywKPiA+ICsg ICAgIC5udW1fdXNiX3R5cGVzICAgICAgICAgID0gQVJSQVlfU0laRShtdDYzNjBfY2hhcmdlcl91 c2JfdHlwZXMpLAo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1bGF0 b3Jfb3BzIG10NjM2MF9jaGdfb3RnX29wcyA9IHsKPiA+ICsgICAgIC5saXN0X3ZvbHRhZ2UgPSBy ZWd1bGF0b3JfbGlzdF92b2x0YWdlX2xpbmVhciwKPiA+ICsgICAgIC5lbmFibGUgPSByZWd1bGF0 b3JfZW5hYmxlX3JlZ21hcCwKPiA+ICsgICAgIC5kaXNhYmxlID0gcmVndWxhdG9yX2Rpc2FibGVf cmVnbWFwLAo+ID4gKyAgICAgLmlzX2VuYWJsZWQgPSByZWd1bGF0b3JfaXNfZW5hYmxlZF9yZWdt YXAsCj4gPiArICAgICAuc2V0X3ZvbHRhZ2Vfc2VsID0gcmVndWxhdG9yX3NldF92b2x0YWdlX3Nl bF9yZWdtYXAsCj4gPiArICAgICAuZ2V0X3ZvbHRhZ2Vfc2VsID0gcmVndWxhdG9yX2dldF92b2x0 YWdlX3NlbF9yZWdtYXAsCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHJl Z3VsYXRvcl9kZXNjIG10NjM2MF9vdGdfcmRlc2MgPSB7Cj4gPiArICAgICAub2ZfbWF0Y2ggPSAi dXNiLW90Zy12YnVzIiwKPiA+ICsgICAgIC5uYW1lID0gInVzYi1vdGctdmJ1cyIsCj4gPiArICAg ICAub3BzID0gJm10NjM2MF9jaGdfb3RnX29wcywKPiA+ICsgICAgIC5vd25lciA9IFRISVNfTU9E VUxFLAo+ID4gKyAgICAgLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKPiA+ICsgICAgIC5taW5f dVYgPSA0NDI1MDAwLAo+ID4gKyAgICAgLnVWX3N0ZXAgPSAyNTAwMCwgLyogc3RlcCAgMjVtViAq Lwo+ID4gKyAgICAgLm5fdm9sdGFnZXMgPSA1NywgLyogNDQyNW1WIHRvIDU4MjVtViAqLwo+ID4g KyAgICAgLnZzZWxfcmVnID0gTVQ2MzYwX1BNVV9DSEdfQ1RSTDUsCj4gPiArICAgICAudnNlbF9t YXNrID0gTVQ2MzYwX01BU0tfVk9CU1QsCj4gPiArICAgICAuZW5hYmxlX3JlZyA9IE1UNjM2MF9Q TVVfQ0hHX0NUUkwxLAo+ID4gKyAgICAgLmVuYWJsZV9tYXNrID0gTVQ2MzYwX01BU0tfT1BBX01P REUsCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG10NjM2MF9l eHRjb25fY2FibGVbXSA9IHsKPiA+ICsgICAgIEVYVENPTl9VU0IsCj4gPiArICAgICBFWFRDT05f VVNCX0hPU1QsCj4gPiArICAgICBFWFRDT05fQ0hHX1VTQl9TRFAsCj4gPiArICAgICBFWFRDT05f Q0hHX1VTQl9EQ1AsCj4gPiArICAgICBFWFRDT05fQ0hHX1VTQl9DRFAsCj4gPiArICAgICBFWFRD T05fQ0hHX1VTQl9TTE9XLCAvKiBGb3IgTm9uU3RhbmRhcmQgQ2hhcmdlciAqLwo+ID4gKyAgICAg RVhUQ09OX05PTkUsCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgaXJxcmV0dXJuX3QgbXQ2MzYw X3BtdV9jaGdfdHJlZ19ldnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQo+ID4gK3sKPiA+ ICsgICAgIHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSA9IGRhdGE7Cj4gPiArCj4gPiArICAg ICBkZXZfd2FybihtY2ktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICByZXR1cm4g SVJRX0hBTkRMRUQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpcnFyZXR1cm5fdCBtdDYzNjBf cG11X3B3cl9yZHlfZXZ0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKPiA+ICt7Cj4gPiAr ICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBkYXRhOwo+ID4gKwo+ID4gKyAgICAg ZGV2X2RiZyhtY2ktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICByZXR1cm4gSVJR X0hBTkRMRUQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpcnFyZXR1cm5fdCBtdDYzNjBfcG11 X2NoZ19iYXRzeXN1dl9ldnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQo+ID4gK3sKPiA+ ICsgICAgIHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSA9IGRhdGE7Cj4gPiArCj4gPiArICAg ICBkZXZfd2FybihtY2ktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICByZXR1cm4g SVJRX0hBTkRMRUQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpcnFyZXR1cm5fdCBtdDYzNjBf cG11X2NoZ192c3lzdXZfZXZ0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKPiA+ICt7Cj4g PiArICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBkYXRhOwo+ID4gKwo+ID4gKyAg ICAgZGV2X3dhcm4obWNpLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwo+ID4gKyAgICAgcmV0dXJu IElSUV9IQU5ETEVEOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaXJxcmV0dXJuX3QgbXQ2MzYw X3BtdV9jaGdfdnN5c292X2V2dF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCj4gPiArewo+ ID4gKyAgICAgc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpID0gZGF0YTsKPiA+ICsKPiA+ICsg ICAgIGRldl93YXJuKG1jaS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKPiA+ICsgICAgIHJldHVy biBJUlFfSEFORExFRDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGlycXJldHVybl90IG10NjM2 MF9wbXVfY2hnX3ZiYXRvdl9ldnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQo+ID4gK3sK PiA+ICsgICAgIHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSA9IGRhdGE7Cj4gPiArCj4gPiAr ICAgICBkZXZfd2FybihtY2ktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICByZXR1 cm4gSVJRX0hBTkRMRUQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpcnFyZXR1cm5fdCBtdDYz NjBfcG11X2NoZ192YnVzb3ZfZXZ0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKPiA+ICt7 Cj4gPiArICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBkYXRhOwo+ID4gKwo+ID4g KyAgICAgZGV2X3dhcm4obWNpLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwo+ID4gKyAgICAgcmV0 dXJuIElSUV9IQU5ETEVEOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaXJxcmV0dXJuX3QgbXQ2 MzYwX3BtdV9jaGdfYWljY21lYXNsX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKPiA+ICt7 Cj4gPiArICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBkYXRhOwo+ID4gKwo+ID4g KyAgICAgZGV2X2RiZyhtY2ktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICByZXR1 cm4gSVJRX0hBTkRMRUQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpcnFyZXR1cm5fdCBtdDYz NjBfcG11X3dkdG1yaV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCj4gPiArewo+ID4gKyAg ICAgc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpID0gZGF0YTsKPiA+ICsKPiA+ICsgICAgIGRl dl9kYmcobWNpLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwo+ID4gKyAgICAgcmV0dXJuIElSUV9I QU5ETEVEOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaXJxcmV0dXJuX3QgbXQ2MzYwX3BtdV9j aGdfcmVjaGdpX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKPiA+ICt7Cj4gPiArICAgICBz dHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBkYXRhOwo+ID4gKwo+ID4gKyAgICAgZGV2X2Ri ZyhtY2ktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICByZXR1cm4gSVJRX0hBTkRM RUQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpcnFyZXR1cm5fdCBtdDYzNjBfcG11X2NoZ190 ZXJtaV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCj4gPiArewo+ID4gKyAgICAgc3RydWN0 IG10NjM2MF9jaGdfaW5mbyAqbWNpID0gZGF0YTsKPiA+ICsKPiA+ICsgICAgIGRldl9kYmcobWNp LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwo+ID4gKyAgICAgcmV0dXJuIElSUV9IQU5ETEVEOwo+ ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaXJxcmV0dXJuX3QgbXQ2MzYwX3BtdV9jaGdfaWVvY2lf aGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQo+ID4gK3sKPiA+ICsgICAgIHN0cnVjdCBtdDYz NjBfY2hnX2luZm8gKm1jaSA9IGRhdGE7Cj4gPiArCj4gPiArICAgICBkZXZfZGJnKG1jaS0+ZGV2 LCAiJXNcbiIsIF9fZnVuY19fKTsKPiA+ICsgICAgIHJldHVybiBJUlFfSEFORExFRDsKPiA+ICt9 Cj4gPiArCj4gPiArc3RhdGljIGlycXJldHVybl90IG10NjM2MF9wbXVfcHVtcHhfZG9uZWlfaGFu ZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQo+ID4gK3sKPiA+ICsgICAgIHN0cnVjdCBtdDYzNjBf Y2hnX2luZm8gKm1jaSA9IGRhdGE7Cj4gPiArCj4gPiArICAgICBkZXZfZGJnKG1jaS0+ZGV2LCAi JXNcbiIsIF9fZnVuY19fKTsKPgo+IEFsbCB0aGlzIGlzIGxvb2tzIGJvZ3VzLgo+CgpBQ0sKCj4g PiArICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpcnFy ZXR1cm5fdCBtdDYzNjBfcG11X2F0dGFjaF9pX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkK PiA+ICt7Cj4gPiArICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBkYXRhOwo+ID4g KyAgICAgaW50IHJldCwgY2hnX3R5cGUgPSBFWFRDT05fTk9ORTsKPiA+ICsgICAgIHVuc2lnbmVk IGludCB1c2Jfc3RhdHVzOwo+ID4gKyAgICAgaW50IGxhc3RfdXNiX3R5cGU7Cj4gPiArCj4gPiAr ICAgICBkZXZfZGJnKG1jaS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKPiA+ICsgICAgIG11dGV4 X2xvY2soJm1jaS0+Y2hnZGV0X2xvY2spOwo+ID4gKyAgICAgaWYgKCFtY2ktPmJjMTJfZW4pIHsK PiA+ICsgICAgICAgICAgICAgZGV2X2luZm8obWNpLT5kZXYsICIlczogYmMxMiBkaXNhYmxlZCwg aWdub3JlIGlycVxuIiwgX19mdW5jX18pOwo+ID4gKyAgICAgICAgICAgICBnb3RvIG91dDsKPiA+ ICsgICAgIH0KPiA+ICsgICAgIGxhc3RfdXNiX3R5cGUgPSBtY2ktPnBzeV91c2JfdHlwZTsKPiA+ ICsgICAgIC8qIFBsdWcgaW4gKi8KPiA+ICsgICAgIHJldCA9IHJlZ21hcF9yZWFkKG1jaS0+cmVn bWFwLCBNVDYzNjBfUE1VX1VTQl9TVEFUVVMxLCAmdXNiX3N0YXR1cyk7Cj4gPiArICAgICBpZiAo cmV0IDwgMCkKPiA+ICsgICAgICAgICAgICAgZ290byBvdXQ7Cj4gPiArICAgICB1c2Jfc3RhdHVz ICY9IE1UNjM2MF9NQVNLX1VTQl9TVEFUVVM7Cj4gPiArICAgICB1c2Jfc3RhdHVzID4+PSBNVDYz NjBfU0hGVF9VU0JfU1RBVFVTOwo+ID4gKyAgICAgc3dpdGNoICh1c2Jfc3RhdHVzKSB7Cj4gPiAr ICAgICBjYXNlIE1UNjM2MF9DSEdfVFlQRV9VTkRFUl9HT0lORzoKPiA+ICsgICAgICAgICAgICAg ZGV2X2luZm8obWNpLT5kZXYsICIlczogdW5kZXIgZ29pbmcuLi5cbiIsIF9fZnVuY19fKTsKPiA+ ICsgICAgICAgICAgICAgZ290byBvdXQ7Cj4gPiArICAgICBjYXNlIE1UNjM2MF9DSEdfVFlQRV9T RFA6Cj4gPiArICAgICAgICAgICAgIGNoZ190eXBlID0gRVhUQ09OX0NIR19VU0JfU0RQOwo+ID4g KyAgICAgICAgICAgICBtY2ktPnBzeV91c2JfdHlwZSA9IFBPV0VSX1NVUFBMWV9VU0JfVFlQRV9T RFA7Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSBNVDYzNjBfQ0hHX1RZ UEVfU0RQTlNURDoKPiA+ICsgICAgICAgICAgICAgY2hnX3R5cGUgPSBFWFRDT05fQ0hHX1VTQl9T TE9XOwo+ID4gKyAgICAgICAgICAgICBtY2ktPnBzeV91c2JfdHlwZSA9IFBPV0VSX1NVUFBMWV9V U0JfVFlQRV9TRFA7Cj4gPiArICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgY2FzZSBNVDYz NjBfQ0hHX1RZUEVfQ0RQOgo+ID4gKyAgICAgICAgICAgICBjaGdfdHlwZSA9IEVYVENPTl9DSEdf VVNCX0NEUDsKPiA+ICsgICAgICAgICAgICAgbWNpLT5wc3lfdXNiX3R5cGUgPSBQT1dFUl9TVVBQ TFlfVVNCX1RZUEVfQ0RQOwo+ID4gKyAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIGNhc2Ug TVQ2MzYwX0NIR19UWVBFX0RDUDoKPiA+ICsgICAgICAgICAgICAgY2hnX3R5cGUgPSBFWFRDT05f Q0hHX1VTQl9EQ1A7Cj4gPiArICAgICAgICAgICAgIG1jaS0+cHN5X3VzYl90eXBlID0gUE9XRVJf U1VQUExZX1VTQl9UWVBFX0RDUDsKPiA+ICsgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAgICBk ZWZhdWx0Ogo+ID4gKyAgICAgICAgICAgICBkZXZfd2FybihtY2ktPmRldiwKPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgIiVzOiBkaXNjb25uZWN0IG9yIHVua25vd24gc3RhdHVzXG4iLCBfX2Z1 bmNfXyk7Cj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0Owo+ID4gKyAgICAgfQo+ID4gKwo+ID4g KyAgICAgZGV2X2luZm8obWNpLT5kZXYsICIlczogY2hnX3R5cGUgPSAlZFxuIiwgX19mdW5jX18s IGNoZ190eXBlKTsKPiA+ICsgICAgIGlmIChjaGdfdHlwZSA9PSBFWFRDT05fQ0hHX1VTQl9TRFAg fHwgY2hnX3R5cGUgPT0gRVhUQ09OX0NIR19VU0JfQ0RQKSB7Cj4gPiArICAgICAgICAgICAgIGV4 dGNvbl9zZXRfc3RhdGVfc3luYyhtY2ktPmVkZXYsIEVYVENPTl9VU0JfSE9TVCwgZmFsc2UpOwo+ ID4gKyAgICAgICAgICAgICBleHRjb25fc2V0X3N0YXRlX3N5bmMobWNpLT5lZGV2LCBFWFRDT05f VVNCLCB0cnVlKTsKPiA+ICsgICAgIH0KPiA+ICsgICAgIGV4dGNvbl9zZXRfc3RhdGVfc3luYyht Y2ktPmVkZXYsIGNoZ190eXBlLCB0cnVlKTsKPiA+ICsgICAgIGlmIChsYXN0X3VzYl90eXBlICE9 IG1jaS0+cHN5X3VzYl90eXBlKQo+ID4gKyAgICAgICAgICAgICBwb3dlcl9zdXBwbHlfY2hhbmdl ZChtY2ktPnBzeSk7Cj4gPiArb3V0Ogo+ID4gKyAgICAgbXV0ZXhfdW5sb2NrKCZtY2ktPmNoZ2Rl dF9sb2NrKTsKPiA+ICsgICAgIHJldHVybiBJUlFfSEFORExFRDsKPiA+ICt9Cj4gPiArCj4gPiAr c3RhdGljIHZvaWQgbXQ2MzYwX2hhbmRsZV9jaHJkZXRfZXh0X2V2dChzdHJ1Y3QgbXQ2MzYwX2No Z19pbmZvICptY2kpCj4gPiArewo+ID4gKyAgICAgaW50IGksIHJldDsKPiA+ICsgICAgIGJvb2wg cHdyX3JkeTsKPiA+ICsgICAgIGludCBsYXN0X3VzYl90eXBlOwo+ID4gKwo+ID4gKyAgICAgbXV0 ZXhfbG9jaygmbWNpLT5jaGdkZXRfbG9jayk7Cj4gPiArICAgICByZXQgPSBtdDYzNjBfZ2V0X2No cmRldF9leHRfc3RhdChtY2ksICZwd3JfcmR5KTsKPiA+ICsgICAgIGlmIChyZXQgPCAwKQo+ID4g KyAgICAgICAgICAgICBnb3RvIG91dDsKPiA+ICsgICAgIGlmIChtY2ktPnB3cl9yZHkgPT0gcHdy X3JkeSkgewo+ID4gKyAgICAgICAgICAgICBkZXZfaW5mbyhtY2ktPmRldiwKPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgIiVzOiBwd3JfcmR5IGlzIHNhbWUoJWQpXG4iLCBfX2Z1bmNfXywgcHdy X3JkeSk7Cj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0Owo+ID4gKyAgICAgfQo+ID4gKyAgICAg bWNpLT5wd3JfcmR5ID0gcHdyX3JkeTsKPiA+ICsgICAgIGxhc3RfdXNiX3R5cGUgPSBtY2ktPnBz eV91c2JfdHlwZTsKPiA+ICsgICAgIGRldl9pbmZvKG1jaS0+ZGV2LCAiJXM6IHB3cl9yZHkgPSAl ZFxuIiwgX19mdW5jX18sIHB3cl9yZHkpOwo+ID4gKyAgICAgaWYgKCFwd3JfcmR5KSB7Cj4gPiAr ICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG10NjM2MF9leHRjb25fY2Fi bGUpIC0gMTsgaSsrKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgZXh0Y29uX3NldF9zdGF0 ZV9zeW5jKG1jaS0+ZWRldiwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgbXQ2MzYwX2V4dGNvbl9jYWJsZVtpXSwgZmFsc2UpOwo+ID4gKyAgICAgICAgICAg ICB9Cj4gPiArICAgICAgICAgICAgIG1jaS0+cHN5X3VzYl90eXBlID0gUE9XRVJfU1VQUExZX1VT Ql9UWVBFX1VOS05PV047Cj4gPiArICAgICAgICAgICAgIGlmIChsYXN0X3VzYl90eXBlICE9IG1j aS0+cHN5X3VzYl90eXBlKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHBvd2VyX3N1cHBseV9j aGFuZ2VkKG1jaS0+cHN5KTsKPiA+ICsKPiA+ICsgICAgIH0KPiA+ICsgICAgIHJldCA9IHJlZ21h cF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBNVDYzNjBfUE1VX0RFVklDRV9UWVBFLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIE1UNjM2MF9NQVNLX1VTQkNIR0VOLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHB3cl9yZHkgPyBNVDYzNjBfTUFTS19VU0JDSEdFTiA6IDApOwo+ID4gKyAgICAgaWYg KHJldCA8IDApCj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0Owo+ID4gKyAgICAgbWNpLT5iYzEy X2VuID0gcHdyX3JkeTsKPiA+ICtvdXQ6Cj4gPiArICAgICBtdXRleF91bmxvY2soJm1jaS0+Y2hn ZGV0X2xvY2spOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBtdDYzNjBfY2hyZGV0X3dv cmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ID4gK3sKPiA+ICsgICAgIHN0cnVjdCBtdDYz NjBfY2hnX2luZm8gKm1jaSA9IChzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICopY29udGFpbmVyX29m KAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLCBzdHJ1Y3QgbXQ2 MzYwX2NoZ19pbmZvLCBjaHJkZXRfd29yayk7Cj4gPiArCj4gPiArICAgICBkZXZfaW5mbyhtY2kt PmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICBtdDYzNjBfaGFuZGxlX2NocmRldF9l eHRfZXZ0KG1jaSk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpcnFyZXR1cm5fdCBtdDYzNjBf cG11X2NocmRldF9leHRfZXZ0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKPiA+ICt7Cj4g PiArICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBkYXRhOwo+ID4gKwo+ID4gKyAg ICAgZGV2X2luZm8obWNpLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwo+ID4gKyAgICAgbXQ2MzYw X2hhbmRsZV9jaHJkZXRfZXh0X2V2dChtY2kpOwo+ID4gKyAgICAgcmV0dXJuIElSUV9IQU5ETEVE Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG10NjM2MF9pcnFfZGVzYyBt dDYzNjBfY2hnX2lycV9kZXNjW10gPSB7Cj4gPiArICAgICB7ICJjaGdfdHJlZ19ldnQiLCBtdDYz NjBfcG11X2NoZ190cmVnX2V2dF9oYW5kbGVyIH0sCj4gPiArICAgICB7ICJwd3JfcmR5X2V2dCIs IG10NjM2MF9wbXVfcHdyX3JkeV9ldnRfaGFuZGxlciB9LAo+ID4gKyAgICAgeyAiY2hnX2JhdHN5 c3V2X2V2dCIsIG10NjM2MF9wbXVfY2hnX2JhdHN5c3V2X2V2dF9oYW5kbGVyIH0sCj4gPiArICAg ICB7ICJjaGdfdnN5c3V2X2V2dCIsIG10NjM2MF9wbXVfY2hnX3ZzeXN1dl9ldnRfaGFuZGxlciB9 LAo+ID4gKyAgICAgeyAiY2hnX3ZzeXNvdl9ldnQiLCBtdDYzNjBfcG11X2NoZ192c3lzb3ZfZXZ0 X2hhbmRsZXIgfSwKPiA+ICsgICAgIHsgImNoZ192YmF0b3ZfZXZ0IiwgbXQ2MzYwX3BtdV9jaGdf dmJhdG92X2V2dF9oYW5kbGVyIH0sCj4gPiArICAgICB7ICJjaGdfdmJ1c292X2V2dCIsIG10NjM2 MF9wbXVfY2hnX3ZidXNvdl9ldnRfaGFuZGxlciB9LAo+ID4gKyAgICAgeyAiY2hnX2FpY2NtZWFz bCIsIG10NjM2MF9wbXVfY2hnX2FpY2NtZWFzbF9oYW5kbGVyIH0sCj4gPiArICAgICB7ICJ3ZHRt cmkiLCBtdDYzNjBfcG11X3dkdG1yaV9oYW5kbGVyIH0sCj4gPiArICAgICB7ICJjaGdfcmVjaGdp IiwgbXQ2MzYwX3BtdV9jaGdfcmVjaGdpX2hhbmRsZXIgfSwKPiA+ICsgICAgIHsgImNoZ190ZXJt aSIsIG10NjM2MF9wbXVfY2hnX3Rlcm1pX2hhbmRsZXIgfSwKPiA+ICsgICAgIHsgImNoZ19pZW9j aSIsIG10NjM2MF9wbXVfY2hnX2llb2NpX2hhbmRsZXIgfSwKPiA+ICsgICAgIHsgInB1bXB4X2Rv bmVpIiwgbXQ2MzYwX3BtdV9wdW1weF9kb25laV9oYW5kbGVyIH0sCj4gPiArICAgICB7ICJhdHRh Y2hfaSIsIG10NjM2MF9wbXVfYXR0YWNoX2lfaGFuZGxlciB9LAo+ID4gKyAgICAgeyAiY2hyZGV0 X2V4dF9ldnQiLCBtdDYzNjBfcG11X2NocmRldF9leHRfZXZ0X2hhbmRsZXIgfSwKPiA+ICt9Owo+ ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoZ19pcnFfcmVnaXN0ZXIoc3RydWN0IHBsYXRm b3JtX2RldmljZSAqcGRldikKPiA+ICt7Cj4gPiArICAgICBjb25zdCBzdHJ1Y3QgbXQ2MzYwX2ly cV9kZXNjICppcnFfZGVzYzsKPiA+ICsgICAgIGludCBpLCBpcnEsIHJldDsKPiA+ICsKPiA+ICsg ICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG10NjM2MF9jaGdfaXJxX2Rlc2MpOyBpKysp IHsKPiA+ICsgICAgICAgICAgICAgaXJxX2Rlc2MgPSBtdDYzNjBfY2hnX2lycV9kZXNjICsgaTsK PiA+ICsgICAgICAgICAgICAgaWYgKHVubGlrZWx5KCFpcnFfZGVzYy0+bmFtZSkpCj4gPiArICAg ICAgICAgICAgICAgICAgICAgY29udGludWU7Cj4KPiBDYW4gdGhpcyBoYXBwZW4/Cj4KCk5vLCBJ IHdpbGwgcmVtb3ZlIGl0LgoKPiA+ICsgICAgICAgICAgICAgaXJxID0gcGxhdGZvcm1fZ2V0X2ly cV9ieW5hbWUocGRldiwgaXJxX2Rlc2MtPm5hbWUpOwo+Cj4gSW50ZXJydXB0cyB3ZXJlIG5vdCBk ZXNjcmliZWQgaW4gdGhlIGJpbmRpbmdzLgo+CgpJIGFkZCByZXNvdXJjZSB3aGVuIE1GRCBkcml2 ZXIgYWRkIHN1Yi1kZXZpY2UuIFNob3VsZCBJIGFkZCBzb21ldGhpbmcKaW4gZHQtYmluZGluZz8K CiAgICAgICByZXQgPSBkZXZtX21mZF9hZGRfZGV2aWNlcygmY2xpZW50LT5kZXYsIFBMQVRGT1JN X0RFVklEX0FVVE8sCm10NjM2MF9kZXZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIEFSUkFZX1NJWkUobXQ2MzYwX2RldnMpLCBOVUxMLCAwLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHJlZ21hcF9pcnFfZ2V0X2RvbWFpbihkZGF0YS0+aXJxX2RhdGEpKTsK CnN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgbXQ2MzYwX2NoZ19yZXNvdXJjZXNbXSA9IHsK ICAgICAgICBERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfQ0hHX1RSRUdfRVZULCAiY2hnX3Ry ZWdfZXZ0IiksCiAgICAgICAgREVGSU5FX1JFU19JUlFfTkFNRUQoTVQ2MzYwX1BXUl9SRFlfRVZU LCAicHdyX3JkeV9ldnQiKSwKICAgICAgICBERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfQ0hH X0JBVFNZU1VWX0VWVCwKImNoZ19iYXRzeXN1dl9ldnQiKSwKICAgICAgICBERUZJTkVfUkVTX0lS UV9OQU1FRChNVDYzNjBfQ0hHX1ZTWVNVVl9FVlQsICJjaGdfdnN5c3V2X2V2dCIpLAogICAgICAg IERFRklORV9SRVNfSVJRX05BTUVEKE1UNjM2MF9DSEdfVlNZU09WX0VWVCwgImNoZ192c3lzb3Zf ZXZ0IiksCiAgICAgICAgREVGSU5FX1JFU19JUlFfTkFNRUQoTVQ2MzYwX0NIR19WQkFUT1ZfRVZU LCAiY2hnX3ZiYXRvdl9ldnQiKSwKICAgICAgICBERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNjBf Q0hHX1ZCVVNPVl9FVlQsICJjaGdfdmJ1c292X2V2dCIpLAogICAgICAgIERFRklORV9SRVNfSVJR X05BTUVEKE1UNjM2MF9DSEdfQUlDQ01FQVNMLCAiY2hnX2FpY2NtZWFzbCIpLAogICAgICAgIERF RklORV9SRVNfSVJRX05BTUVEKE1UNjM2MF9XRFRNUkksICJ3ZHRtcmkiKSwKICAgICAgICBERUZJ TkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfQ0hHX1JFQ0hHSSwgImNoZ19yZWNoZ2kiKSwKICAgICAg ICBERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfQ0hHX1RFUk1JLCAiY2hnX3Rlcm1pIiksCiAg ICAgICAgREVGSU5FX1JFU19JUlFfTkFNRUQoTVQ2MzYwX0NIR19JRU9DSSwgImNoZ19pZW9jaSIp LAogICAgICAgIERFRklORV9SRVNfSVJRX05BTUVEKE1UNjM2MF9QVU1QWF9ET05FSSwgInB1bXB4 X2RvbmVpIiksCiAgICAgICAgREVGSU5FX1JFU19JUlFfTkFNRUQoTVQ2MzYwX0FUVEFDSF9JLCAi YXR0YWNoX2kiKSwKICAgICAgICBERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfQ0hSREVUX0VY VF9FVlQsICJjaHJkZXRfZXh0X2V2dCIpLAoKPiA+ICsgICAgICAgICAgICAgaWYgKGlycSA8IDAp Cj4gPiArICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cj4gPiArICAgICAgICAgICAgIHJl dCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJnBkZXYtPmRldiwgaXJxLCBOVUxMLAo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlycV9kZXNjLT5p cnFfaGFuZGxlciwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBJUlFGX1RSSUdHRVJfRkFMTElORywKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBpcnFfZGVzYy0+bmFtZSwKPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KSk7 Cj4KPiBXaHkgeW91IHVzZSBoYW5kbGVyIHRocmVhZCBwZXIgZWFjaCBpbnRlcnJ1cHQ/IFRoaXMg c2hvdWxkIGJlIHJhdGhlciBvbmUKPiBoYW5kbGVyLiBFc3BlY2lhbGx5IHRoYXQgbW9zdCBvZiB5 b3VyIGhhbmRsZXJzIGRvIG5vdGhpbmcuCj4KCkkgd2lsbCByZW1vdmUgc2VydmVyYWwgaXJxcyB3 aGljaCBpcyBkbyBub3RoaW5nLCBhbmQgb25seSBrZWVwCmNocmRldF9leHQgZm9yIHBvd2VyIHJl YWR5IGFuZCBhdHRhY2hpIGZvciBiYzEyIGRvbmUuCkkgYWRkIHNlcnZlcmFsIHJlc291cmNlcyBp biBNRkQgZGV2aWNlLgpEbyB5b3UgbWVhbiBJIHVzZSBJUlFGX1NIQVJFRCB0byByZWR1Y2UgaXJx PwoKPiA+ICsgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKPiA+ICsgICAgICAgICAgICAgICAg ICAgICBkZXZfZXJyKCZwZGV2LT5kZXYsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAicmVxdWVzdCAlcyBpcnEgZmFpbFxuIiwgaXJxX2Rlc2MtPm5hbWUpOwo+ID4gKyAgICAgICAg ICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICAgICAgICAgIH0KPiA+ICsgICAgIH0K PiA+ICsgICAgIHJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdHJ1Y3QgbXQ2MzYwX2ZpZWxk X2luZm8gewo+ID4gKyAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHI7Cj4gPiAr ICAgICB1OCByZWc7Cj4gPiArICAgICB1OCBtYXNrOwo+ID4gKyAgICAgdTggc2hmdDsKPiA+ICt9 Owo+ID4gKwo+ID4gK3N0YXRpYyBzc2l6ZV90IG10NjM2MF9zeXNmc19zaG93KHN0cnVjdCBkZXZp Y2UgKmRldiwKPiA+ICsgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIs IGNoYXIgKmJ1Zik7Cj4gPiArc3RhdGljIHNzaXplX3QgbXQ2MzYwX3N5c2ZzX3N0b3JlKHN0cnVj dCBkZXZpY2UgKmRldiwKPiA+ICsgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUg KmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKPiA+ICsKPiA+ICsjZGVmaW5l IE1UNjM2MF9GSUVMRF9SVyhfbmFtZSwgX3JlZywgX25iaXQpICAgICAgICAgICAgICAgICAgXAo+ ID4gK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCj4gPiArICAgICAuZGV2X2F0dHIgPSBfX0FUVFIoX25hbWUsIDA2NjQsICAgICAg ICAgICAgICAgICAgICAgICAgIFwKPiA+ICsgICAgICAgICAgICAgICAgICAgIG10NjM2MF9zeXNm c19zaG93LCBtdDYzNjBfc3lzZnNfc3RvcmUpLCAgXAo+ID4gKyAgICAgLnJlZyAgICA9IE1UNjM2 MF9QTVVfIyNfcmVnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArICAgICAubWFz ayAgID0gTVQ2MzYwX01BU0tfIyNfbmJpdCwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ ICsgICAgIC5zaGZ0ICAgPSBNVDYzNjBfU0hGVF8jI19uYml0LCAgICAgICAgICAgICAgICAgICAg ICAgICAgXAo+ID4gK30KPiA+ICsKPiA+ICsjZGVmaW5lIE1UNjM2MF9GSUVMRF9STyhfbmFtZSwg X3JlZywgX25iaXQpICAgICAgICAgICAgICAgICAgXAo+ID4gK3sgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArICAgICAuZGV2 X2F0dHIgPSBfX0FUVFIoX25hbWUsIDA0NDQsICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ ICsgICAgICAgICAgICAgICAgICAgICBtdDYzNjBfc3lzZnNfc2hvdywgTlVMTCksICAgICAgICAg ICAgICAgXAo+ID4gKyAgICAgLnJlZyAgICA9IE1UNjM2MF9QTVVfIyNfcmVnLCAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCj4gPiArICAgICAubWFzayAgID0gTVQ2MzYwX01BU0tfIyNfbmJp dCwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ICsgICAgIC5zaGZ0ICAgPSBNVDYzNjBf U0hGVF8jI19uYml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gK30KPiA+ICsKPiA+ ICtzdGF0aWMgc3RydWN0IG10NjM2MF9maWVsZF9pbmZvIG10NjM2MF9maWVsZF90YmxbXSA9IHsK PiA+ICsgICAgIE1UNjM2MF9GSUVMRF9SVyhoaXosICAgICAgICAgICAgQ0hHX0NUUkwxLCAgICAg IEhJWiksCj4gPiArICAgICBNVDYzNjBfRklFTERfUlcodm1pdnIsICAgICAgICAgIENIR19DVFJM NiwgICAgICBWTUlWUiksCj4gPiArICAgICBNVDYzNjBfRklFTERfUlcoaWFpY3IsICAgICAgICAg IENIR19DVFJMMywgICAgICBJQUlDUiksCj4gPiArICAgICBNVDYzNjBfRklFTERfUlcoU1lTUkVH LCAgICAgICAgIENIR19DVFJMMTEsICAgICBTWVNSRUcpLAo+ID4gKyAgICAgTVQ2MzYwX0ZJRUxE X1JXKG90Z19vYywgICAgICAgICBDSEdfQ1RSTDEwLCAgICAgT1RHX09DKSwKPiA+ICsgICAgIE1U NjM2MF9GSUVMRF9SVyhpY2hnLCAgICAgICAgICAgQ0hHX0NUUkwxNywgICAgIElDSEcpLAo+ID4g KyAgICAgTVQ2MzYwX0ZJRUxEX1JXKGlwcmVjLCAgICAgICAgICBDSEdfQ1RSTDgsICAgICAgSVBS RUMpLAo+ID4gKyAgICAgTVQ2MzYwX0ZJRUxEX1JXKGllb2MsICAgICAgICAgICBDSEdfQ1RSTDks ICAgICAgSUVPQyksCj4gPiArICAgICBNVDYzNjBfRklFTERfUlcodm9yZWcsICAgICAgICAgIENI R19DVFJMNCwgICAgICBWT1JFRyksCj4gPiArICAgICBNVDYzNjBfRklFTERfUlcobGJwLCAgICAg ICAgICAgIENIR19DVFJMMTAsICAgICBMQlApLAo+ID4gKyAgICAgTVQ2MzYwX0ZJRUxEX1JXKHZy ZWMsICAgICAgICAgICBDSEdfQ1RSTDExLCAgICAgVlJFQyksCj4gPiArICAgICBNVDYzNjBfRklF TERfUlcodGUsICAgICAgICAgICAgIENIR19DVFJMMiwgICAgICBURSksCj4gPiArICAgICBNVDYz NjBfRklFTERfUlcoY2hnX3dkdF9lbiwgICAgIENIR19DVFJMMTMsICAgICBDSEdfV0RUX0VOKSwK PiA+ICsgICAgIE1UNjM2MF9GSUVMRF9SVyhjaGdfd2R0LCAgICAgICAgQ0hHX0NUUkwxMywgICAg IENIR19XRFQpLAo+ID4gKyAgICAgTVQ2MzYwX0ZJRUxEX1JXKHd0X2ZjLCAgICAgICAgICBDSEdf Q1RSTDEyLCAgICAgV1RfRkMpLAo+ID4gKyAgICAgTVQ2MzYwX0ZJRUxEX1JXKGJhdF9jb21wLCAg ICAgICBDSEdfQ1RSTDE4LCAgICAgQkFUX0NPTVApLAo+ID4gKyAgICAgTVQ2MzYwX0ZJRUxEX1JX KHZjbGFtcCwgICAgICAgICBDSEdfQ1RSTDE4LCAgICAgVkNMQU1QKSwKPiA+ICsgICAgIE1UNjM2 MF9GSUVMRF9SVyh1c2JjaGdlbiwgICAgICAgREVWSUNFX1RZUEUsICAgIFVTQkNIR0VOKSwKPiA+ ICsgICAgIE1UNjM2MF9GSUVMRF9SVyhjaGdfZW4sICAgICAgICAgQ0hHX0NUUkwyLCAgICAgIENI R19FTiksCj4gPiArICAgICBNVDYzNjBfRklFTERfUk8oY2hyZGV0X2V4dCwgICAgIEZPRF9TVEFU LCAgICAgICBDSFJERVRfRVhUKSwKPiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRpYyBzdHJ1Y3QgYXR0 cmlidXRlICptdDYzNjBfYXR0cnNbQVJSQVlfU0laRShtdDYzNjBfZmllbGRfdGJsKSArIDFdOwo+ ID4gKwo+ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG10NjM2MF9hdHRy X2dyb3VwID0gewo+ID4gKyAgICAgLmF0dHJzID0gbXQ2MzYwX2F0dHJzLAo+ID4gK307Cj4gPiAr Cj4gPiArc3RhdGljIHNzaXplX3QgbXQ2MzYwX3N5c2ZzX3Nob3coc3RydWN0IGRldmljZSAqZGV2 LAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmli dXRlICphdHRyLCBjaGFyICpidWYpCj4gPiArewo+ID4gKyAgICAgc3RydWN0IG10NjM2MF9jaGdf aW5mbyAqbWNpID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKPiA+ICsgICAgIHN0cnVj dCBtdDYzNjBfZmllbGRfaW5mbyAqaW5mbyA9ICh2b2lkICopYXR0cjsKPiA+ICsgICAgIHVuc2ln bmVkIGludCByZWd2YWw7Cj4gPiArICAgICBpbnQgcmV0Owo+ID4gKwo+ID4gKyAgICAgcmV0ID0g cmVnbWFwX3JlYWQobWNpLT5yZWdtYXAsIGluZm8tPnJlZywgJnJlZ3ZhbCk7Cj4gPiArICAgICBp ZiAocmV0IDwgMCkKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+ICsgICAgIHJlZ3Zh bCA9IChyZWd2YWwgJiBpbmZvLT5tYXNrKSA+PiBpbmZvLT5zaGZ0Owo+ID4gKyAgICAgcmV0dXJu IHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiUwMnhcbiIsIHJlZ3ZhbCk7Cj4gPiArfQo+ID4g Kwo+ID4gK3N0YXRpYyBzc2l6ZV90IG10NjM2MF9zeXNmc19zdG9yZShzdHJ1Y3QgZGV2aWNlICpk ZXYsCj4gPiArICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBj b25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKPiA+ICt7Cj4gPiArICAgICBzdHJ1Y3QgbXQ2 MzYwX2NoZ19pbmZvICptY2kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOwo+ID4gKyAg ICAgc3RydWN0IG10NjM2MF9maWVsZF9pbmZvICppbmZvID0gKHZvaWQgKilhdHRyOwo+ID4gKyAg ICAgaW50IHJldCwgdG1wOwo+ID4gKwo+ID4gKyAgICAgaWYgKGtzdHJ0b2ludChidWYsIDEwLCAm dG1wKSA8IDApIHsKPiA+ICsgICAgICAgICAgICAgZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcGFy c2luZyBudW1iZXJcbiIpOwo+ID4gKyAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKPiA+ICsg ICAgIH0KPiA+ICsgICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwKPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5yZWcsIGluZm8tPm1hc2ssIHRt cCA8PCBpbmZvLT5zaGZ0KTsKPiA+ICsgICAgIGlmIChyZXQgPCAwKQo+ID4gKyAgICAgICAgICAg ICByZXR1cm4gcmV0Owo+ID4gKyAgICAgcmV0dXJuIGNvdW50Owo+ID4gK30KPiA+ICsKPiA+ICtz dGF0aWMgaW50IG10NjM2MF9zeXNmc19jcmVhdGVfZ3JvdXAoc3RydWN0IG10NjM2MF9jaGdfaW5m byAqbWNpKQo+ID4gK3sKPiA+ICsgICAgIGludCBpLCB0Yl9zaXplID0gQVJSQVlfU0laRShtdDYz NjBfZmllbGRfdGJsKTsKPiA+ICsKPiA+ICsgICAgIGZvciAoaSA9IDA7IGkgPCB0Yl9zaXplOyBp KyspCj4gPiArICAgICAgICAgICAgIG10NjM2MF9hdHRyc1tpXSA9ICYobXQ2MzYwX2ZpZWxkX3Ri bFtpXS5kZXZfYXR0ci5hdHRyKTsKPiA+ICsgICAgIHJldHVybiBkZXZtX2RldmljZV9hZGRfZ3Jv dXAoJm1jaS0+cHN5LT5kZXYsICZtdDYzNjBfYXR0cl9ncm91cCk7Cj4gPiArfQo+ID4gKwo+ID4g K3N0YXRpYyBpbnQgbXQ2MzYwX2NoZ19pbml0X3NldHRpbmcoc3RydWN0IG10NjM2MF9jaGdfaW5m byAqbWNpKQo+ID4gK3sKPiA+ICsgICAgIGludCByZXQ7Cj4gPiArCj4gPiArICAgICAvKiBEaXNh YmxlIGJjMTIgKi8KPiA+ICsgICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21h cCwgTVQ2MzYwX1BNVV9ERVZJQ0VfVFlQRSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBNVDYzNjBfTUFTS19VU0JDSEdFTiwgMCk7Cj4gPiArICAgICBpZiAocmV0IDwgMCkgewo+ ID4gKyAgICAgICAgICAgICBkZXZfZXJyKG1jaS0+ZGV2LCAiJXM6IGRpc2FibGUgYmMxMiBmYWls XG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0Owo+ID4gKyAgICAgfQo+ ID4gKyAgICAgLyogU2V0IGlucHV0IGN1cnJlbnQgbGltaXQgc2VsZWN0IGJ5IEFJQ1IgKi8KPiA+ ICsgICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9D SEdfQ1RSTDIsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX01BU0tf SUlOTE1UU0VMLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9JSU5M TVRTRUxfQUlDUiA8PAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBN VDYzNjBfU0hGVF9JSU5MTVRTRUwpOwo+ID4gKyAgICAgaWYgKHJldCA8IDApIHsKPiA+ICsgICAg ICAgICAgICAgZGV2X2VycihtY2ktPmRldiwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAiJXM6 IHN3aXRjaCBpaW5sbXRzZWwgdG8gYWljciBmYWlsXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICAg ICAgICAgIGdvdG8gb3V0Owo+ID4gKyAgICAgfQo+ID4gKyAgICAgdXNsZWVwX3JhbmdlKDUwMDAs IDYwMDApOwo+ID4gKyAgICAgLyogRGlzYWJsZSBpbGltICovCj4gPiArICAgICByZXQgPSByZWdt YXBfdXBkYXRlX2JpdHMobWNpLT5yZWdtYXAsIE1UNjM2MF9QTVVfQ0hHX0NUUkwzLAo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9NQVNLX0lMSU1fRU4sIDApOwo+ID4g KyAgICAgaWYgKHJldCA8IDApIHsKPiA+ICsgICAgICAgICAgICAgZGV2X2VycihtY2ktPmRldiwK PiA+ICsgICAgICAgICAgICAgICAgICAgICAiJXM6IHN3aXRjaCBpaW5sbXRzZWwgdG8gYWljciBm YWlsXG4iLCBfX2Z1bmNfXyk7Cj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0Owo+ID4gKyAgICAg fQo+ID4gKyAgICAgLyogRW5sYXJnZSBPVEdfT0MgdG8gbWF4IDNBICovCj4gPiArICAgICByZXQg PSByZWdtYXBfdXBkYXRlX2JpdHMobWNpLT5yZWdtYXAsCj4gPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgTVQ2MzYwX1BNVV9DSEdfQ1RSTDEwLCAweDA3LCAweDA3KTsKPiA+ICsgICAg IGlmIChyZXQgPCAwKSB7Cj4gPiArICAgICAgICAgICAgIGRldl9lcnIobWNpLT5kZXYsCj4gPiAr ICAgICAgICAgICAgICAgICAgICAgIiVzOiBmYWxlZCBjb25maWcgb3RnIG9jIHRvIG1heGltdW1c biIsIF9fZnVuY19fKTsKPiA+ICsgICAgIH0KPiA+ICtvdXQ6Cj4gPiArICAgICByZXR1cm4gcmV0 Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdTMyIG10NjM2MF92aW5vdnBfdHJhbnNfdG9fc2Vs KHUzMiB2YWwpCj4gPiArewo+ID4gKyAgICAgdTMyIHZpbm92cF90YmxbXSA9IHsgNTUwMDAwMCwg NjUwMDAwMCwgMTEwMDAwMDAsIDE0NTAwMDAwIH07Cj4gPiArICAgICBpbnQgaTsKPiA+ICsKPiA+ ICsgICAgIC8qIFNlbGVjdCB0aGUgc21hbGxlciBhbmQgZXF1YWwgc3VwcG9ydGVkIHZhbHVlICov Cj4gPiArICAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2aW5vdnBfdGJsKS0xOyBpKysp IHsKPiA+ICsgICAgICAgICAgICAgaWYgKHZhbCA8IHZpbm92cF90YmxbaSsxXSkKPiA+ICsgICAg ICAgICAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAgIH0KPiA+ICsgICAgIHJldHVybiBpOwo+ ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IG10NjM2MF9jaGdfcGxhdGZvcm1fZGF0YSAq bXQ2MzYwX3BhcnNlX3BkYXRhKAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiArewo+ID4g KyAgICAgc3RydWN0IG10NjM2MF9jaGdfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3Bs YXRkYXRhKCZwZGV2LT5kZXYpOwo+ID4gKyAgICAgc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBk ZXYtPmRldi5vZl9ub2RlOwo+ID4gKyAgICAgaW50IHJldDsKPiA+ICsKPiA+ICsgICAgIHBkYXRh ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsK PiA+ICsgICAgIGlmICghcGRhdGEpCj4gPiArICAgICAgICAgICAgIHJldHVybiBFUlJfUFRSKC1F Tk9NRU0pOwo+ID4gKyAgICAgbWVtY3B5KHBkYXRhLCAmZGVmX3BsYXRmb3JtX2RhdGEsIHNpemVv ZigqcGRhdGEpKTsKPgo+IFVzZSBrbWVtZHVwIG9yIHNvbWV0aGluZyBzaW1pbGFyLgo+CgpBQ0sK Cj4gPiArICAgICByZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInZpbm92cCIsICZwZGF0 YS0+dmlub3ZwKTsKPiA+ICsgICAgIGlmIChyZXQpIHsKPiA+ICsgICAgICAgICAgICAgZGV2X2Vy cigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHBhcnNlIHZpbm92cCBpbiBEVFxuIik7Cj4gPiArICAg ICAgICAgICAgIHJldHVybiBFUlJfUFRSKHJldCk7Cj4gPiArICAgICB9Cj4gPiArICAgICByZXR1 cm4gcGRhdGE7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2FwcGx5X3BkYXRh KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiArewo+ID4gKyAgICAgc3RydWN0IG10 NjM2MF9jaGdfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5k ZXYpOwo+ID4gKyAgICAgc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpID0gZGV2X2dldF9kcnZk YXRhKCZwZGV2LT5kZXYpOwo+ID4gKyAgICAgaW50IHJldDsKPiA+ICsgICAgIHUzMiBzZWw7Cj4g PiArCj4gPiArICAgICBzZWwgPSBtdDYzNjBfdmlub3ZwX3RyYW5zX3RvX3NlbChwZGF0YS0+dmlu b3ZwKTsKPiA+ICsgICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwgTVQ2 MzYwX1BNVV9DSEdfQ1RSTDE5LAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1U NjM2MF9NQVNLX1ZJTk9WUCwgc2VsIDw8IE1UNjM2MF9TSEZUX1ZJTk9WUCk7Cj4gPiArICAgICBp ZiAocmV0KQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKyAgICAgcmV0dXJuIDA7 Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfcHJvYmUoc3RydWN0 IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+ICt7Cj4gPiArICAgICBzdHJ1Y3QgbXQ2MzYwX2No Z19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7Cj4g PiArICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2k7Cj4gPiArICAgICBzdHJ1Y3QgcG93 ZXJfc3VwcGx5X2NvbmZpZyBjaGFyZ2VyX2NmZyA9IHt9Owo+ID4gKyAgICAgc3RydWN0IHJlZ3Vs YXRvcl9jb25maWcgY29uZmlnID0geyB9Owo+ID4gKyAgICAgaW50IHJldDsKPiA+ICsKPiA+ICsg ICAgIG1jaSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKm1jaSksIEdGUF9LRVJO RUwpOwo+ID4gKyAgICAgaWYgKCFtY2kpCj4gPiArICAgICAgICAgICAgIHJldHVybiAtRU5PTUVN Owo+ID4gKwo+ID4gKyAgICAgcGRhdGEgPSBtdDYzNjBfcGFyc2VfcGRhdGEocGRldik7Cj4gPiAr ICAgICBpZiAoSVNfRVJSX09SX05VTEwocGRhdGEpKQo+ID4gKyAgICAgICAgICAgICByZXR1cm4g UFRSX0VSUihwZGF0YSk7Cj4gPiArCj4gPiArICAgICBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9 IHBkYXRhOwo+ID4gKwo+ID4gKyAgICAgbWNpLT5kZXYgPSAmcGRldi0+ZGV2Owo+ID4gKyAgICAg bXV0ZXhfaW5pdCgmbWNpLT5jaGdkZXRfbG9jayk7Cj4gPiArICAgICBwbGF0Zm9ybV9zZXRfZHJ2 ZGF0YShwZGV2LCBtY2kpOwo+ID4gKyAgICAgSU5JVF9XT1JLKCZtY2ktPmNocmRldF93b3JrLCAm bXQ2MzYwX2NocmRldF93b3JrKTsKPiA+ICsKPiA+ICsgICAgIG1jaS0+cmVnbWFwID0gZGV2X2dl dF9yZWdtYXAocGRldi0+ZGV2LnBhcmVudCwgTlVMTCk7Cj4gPiArICAgICBpZiAoIW1jaS0+cmVn bWFwKSB7Cj4gPiArICAgICAgICAgICAgIGRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBn ZXQgcGFyZW50IHJlZ21hcFxuIik7Cj4gPiArICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwo+ ID4gKyAgICAgfQo+ID4gKwo+ID4gKyAgICAgcmV0ID0gbXQ2MzYwX2FwcGx5X3BkYXRhKHBkZXYp Owo+ID4gKyAgICAgaWYgKHJldCkgewo+ID4gKyAgICAgICAgICAgICBkZXZfZXJyKCZwZGV2LT5k ZXYsICJGYWlsZWQgdG8gYXBwbHkgcGRhdGFcbiIpOwo+ID4gKyAgICAgICAgICAgICByZXR1cm4g cmV0Owo+ID4gKyAgICAgfQo+ID4gKwo+ID4gKyAgICAgbWNpLT5lZGV2ID0gZGV2bV9leHRjb25f ZGV2X2FsbG9jYXRlKCZwZGV2LT5kZXYsIG10NjM2MF9leHRjb25fY2FibGUpOwo+ID4gKyAgICAg aWYgKElTX0VSUihtY2ktPmVkZXYpKSB7Cj4gPiArICAgICAgICAgICAgIGRldl9lcnIoJnBkZXYt PmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGV4dGNvblxuIik7Cj4gPiArICAg ICAgICAgICAgIHJldHVybiAtRU5PTUVNOwo+ID4gKyAgICAgfQo+ID4gKwo+ID4gKyAgICAgcmV0 ID0gZGV2bV9leHRjb25fZGV2X3JlZ2lzdGVyKCZwZGV2LT5kZXYsIG1jaS0+ZWRldik7Cj4gPiAr ICAgICBpZiAocmV0KSB7Cj4gPiArICAgICAgICAgICAgIGRldl9lcnIoJnBkZXYtPmRldiwgIkZh aWxlZCB0byByZWdpc3RlciBleHRjb24gZGV2XG4iKTsKPiA+ICsgICAgICAgICAgICAgcmV0dXJu IHJldDsKPiA+ICsgICAgIH0KPiA+ICsKPiA+ICsgICAgIG1lbWNweSgmbWNpLT5wc3lfZGVzYywg Jm10NjM2MF9jaGFyZ2VyX2Rlc2MsIHNpemVvZihtY2ktPnBzeV9kZXNjKSk7Cj4gPiArICAgICBt Y2ktPnBzeV9kZXNjLm5hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKPiA+ICsgICAgIGNoYXJn ZXJfY2ZnLmRydl9kYXRhID0gbWNpOwo+ID4gKyAgICAgY2hhcmdlcl9jZmcub2Zfbm9kZSA9IHBk ZXYtPmRldi5vZl9ub2RlOwo+ID4gKyAgICAgY2hhcmdlcl9jZmcuc3VwcGxpZWRfdG8gPSBtdDYz NjBfY2hhcmdlcl9zdXBwbGllZF90bzsKPiA+ICsgICAgIGNoYXJnZXJfY2ZnLm51bV9zdXBwbGlj YW50cyA9IEFSUkFZX1NJWkUobXQ2MzYwX2NoYXJnZXJfc3VwcGxpZWRfdG8pOwo+ID4gKyAgICAg bWNpLT5wc3kgPSBkZXZtX3Bvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LAo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWNpLT5wc3lfZGVzYywg JmNoYXJnZXJfY2ZnKTsKPiA+ICsgICAgIGlmIChJU19FUlIobWNpLT5wc3kpKSB7Cj4gPiArICAg ICAgICAgICAgIGRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBwb3dlciBz dXBwbHkgZGV2XG4iKTsKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIFBUUl9FUlIobWNpLT5wc3kp Owo+ID4gKyAgICAgfQo+ID4gKwo+ID4gKyAgICAgcmV0ID0gbXQ2MzYwX2NoZ19pbml0X3NldHRp bmcobWNpKTsKPiA+ICsgICAgIGlmIChyZXQpIHsKPiA+ICsgICAgICAgICAgICAgZGV2X2Vycigm cGRldi0+ZGV2LCAiRmFpbGVkIHRvIGluaXRpYWwgc2V0dGluZ1xuIik7Cj4gPiArICAgICAgICAg ICAgIHJldHVybiByZXQ7Cj4gPiArICAgICB9Cj4gPiArCj4gPiArICAgICBzY2hlZHVsZV93b3Jr KCZtY2ktPmNocmRldF93b3JrKTsKPiA+ICsKPiA+ICsgICAgIHJldCA9IG10NjM2MF9jaGdfaXJx X3JlZ2lzdGVyKHBkZXYpOwo+ID4gKyAgICAgaWYgKHJldCkgewo+ID4gKyAgICAgICAgICAgICBk ZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgaXJxc1xuIik7Cj4gPiArICAg ICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICB9Cj4gPiArCj4gPiArICAgICBjb25maWcu ZGV2ID0gJnBkZXYtPmRldjsKPiA+ICsgICAgIGNvbmZpZy5yZWdtYXAgPSBtY2ktPnJlZ21hcDsK PiA+ICsgICAgIG1jaS0+b3RnX3JkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ ZGV2LCAmbXQ2MzYwX290Z19yZGVzYywKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAmY29uZmlnKTsKPiA+ICsgICAgIGlmIChJU19FUlIobWNpLT5vdGdf cmRldikpCj4gPiArICAgICAgICAgICAgIHJldHVybiBQVFJfRVJSKG1jaS0+b3RnX3JkZXYpOwo+ ID4gKwo+ID4gKyAgICAgcmV0ID0gbXQ2MzYwX3N5c2ZzX2NyZWF0ZV9ncm91cChtY2kpOwo+ID4g KyAgICAgaWYgKHJldCkgewo+ID4gKyAgICAgICAgICAgICBkZXZfZXJyKCZwZGV2LT5kZXYsCj4g PiArICAgICAgICAgICAgICAgICAgICAgIiVzOiBjcmVhdGUgc3lzZnMgYXR0cnMgZmFpbFxuIiwg X19mdW5jX18pOwo+ID4gKyAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKyAgICAgfQo+ID4g Kwo+ID4gKyAgICAgcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBjb25zdCBzdHJ1 Y3Qgb2ZfZGV2aWNlX2lkIF9fbWF5YmVfdW51c2VkIG10NjM2MF9jaGFyZ2VyX29mX2lkW10gPSB7 Cj4gPiArICAgICB7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10NjM2MC1jaGciLCB9LAo+ID4g KyAgICAge30sCj4gPiArfTsKPiA+ICtNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtdDYzNjBfY2hh cmdlcl9vZl9pZCk7Cj4gPiArCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZp Y2VfaWQgbXQ2MzYwX2NoYXJnZXJfaWRbXSA9IHsKPiA+ICsgICAgIHsgIm10NjM2MC1jaGciLCAw IH0sCj4gPiArICAgICB7fSwKPiA+ICt9Owo+ID4gK01PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZv cm0sIG10NjM2MF9jaGFyZ2VyX2lkKTsKPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IHBsYXRmb3Jt X2RyaXZlciBtdDYzNjBfY2hhcmdlcl9kcml2ZXIgPSB7Cj4gPiArICAgICAuZHJpdmVyID0gewo+ ID4gKyAgICAgICAgICAgICAubmFtZSA9ICJtdDYzNjAtY2hnIiwKPiA+ICsgICAgICAgICAgICAg Lm93bmVyID0gVEhJU19NT0RVTEUsCj4KPiBOb3QgbmVlZGVkLiBZb3UgZGlkIG5vdCBydW4gY29j Y2luZWxsZSwgcmlnaHQ/Cj4KPiA+ICsgICAgICAgICAgICAgLm9mX21hdGNoX3RhYmxlID0gb2Zf bWF0Y2hfcHRyKG10NjM2MF9jaGFyZ2VyX29mX2lkKSwKPiA+ICsgICAgIH0sCj4gPiArICAgICAu cHJvYmUgPSBtdDYzNjBfY2hhcmdlcl9wcm9iZSwKPiA+ICsgICAgIC5pZF90YWJsZSA9IG10NjM2 MF9jaGFyZ2VyX2lkLAo+ID4gK307Cj4gPiArbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtdDYzNjBf Y2hhcmdlcl9kcml2ZXIpOwo+ID4gKwo+ID4gK01PRFVMRV9BVVRIT1IoIkNZX0h1YW5nIDxjeV9o dWFuZ0ByaWNodGVrLmNvbT4iKTsKPiA+ICtNT0RVTEVfREVTQ1JJUFRJT04oIk1UNjM2MCBDaGFy Z2VyIERyaXZlciIpOwo+ID4gK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKPiA+ICtNT0RVTEVfVkVS U0lPTigiMS4wLjAiKTsKPgo+IFNraXAgdmVyc2lvbi4KPgo+CgpBQ0sKCj4gQWxsIHRoZXNlIGNv bW1lbnRzIHdlcmUgYWZ0ZXIgbG9va2luZyBicmllZmx5IC0gSSBkaWQgbm90IHBlcmZvcm0gYQo+ IHRob3JvdWdoIHJldmlldy4gIEkgYW0gc3VycHJpc2VkIHRoYXQgeW91IGNvbWJpbmVkIHJlZ3Vs YXRvciBhbmQgY2hhcmdlcgo+IGRyaXZlciBpbiBvbmUuIEl0IGlzIGRvYWJsZSBidXQgbWFrZXMg ZHJpdmVyIGJpZ2dlciBhbmQgbW9yZSBkaWZmaWN1bHQKPiB0byBtYWludGFpbi4gQ29uc2lkZXIg c3BsaXR0aW5nIHRoZW0uCj4KCk1UNjM2MCBjaGFyZ2VyIGlzIHN3aXRjaGluZyBjaGFyZ2VyLCBD YW4gSSBrZWVwIHJlZ3VsYXRvciBmb3IgYm9vc3QKT1RHIGxpa2UgYnEyNDE5MD8KCj4gQmVzdCBy ZWdhcmRzLAo+IEtyenlzenRvZgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5l bEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4v bGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=