From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 072A9C021B2 for ; Thu, 20 Feb 2025 16:05:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type: Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-ID:Date :Subject:Cc:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=I6bguq6qpVlMqUSZtWfQmgGW97HG/Gksgq8JkfafFAw=; b=LsaMKRm1hxVLo3EplDubLnlnRt t2RXv0jaKrEJcB83pnHgr1QxIrQ3ln2ybStcgp0fpSxxggYMTQGS+iNfqTE3C5NaLYbR9If8vx+N8 A0gtEgV+GNuNWID03EsPOwOjeCQy+DNNehlD89Cn3GI0sDRq2oVT07D9yVpwsymlcCYY6uRqmgePk K65WOL8AcT3GhlwFslFztu+/uemlZQG7ZC2+TYDCBF1uGv2CcStsYdTFBpePtt5Cq3o8LpUgft5y1 MzQVYqPvziXQUJBxWYLie5ltVodPRhmYxpPkoLF0Swe+23iM6pfEcKTYb+4tuV/dVonIQ6zUcPa4M vJGmvt9A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tl93S-00000001kZ1-2Ney; Thu, 20 Feb 2025 16:05:38 +0000 Received: from mail-wr1-x42d.google.com ([2a00:1450:4864:20::42d]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tl90s-00000001jo9-14JL; Thu, 20 Feb 2025 16:03:01 +0000 Received: by mail-wr1-x42d.google.com with SMTP id ffacd0b85a97d-388cae9eb9fso571032f8f.3; Thu, 20 Feb 2025 08:02:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740067376; x=1740672176; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=I6bguq6qpVlMqUSZtWfQmgGW97HG/Gksgq8JkfafFAw=; b=kK+Eohf3MOPHixOsSR6/c9hX5ZwsdrcGQ3w1tQXdJOwcYGvTWSkEVJo+Y6KD2DIRLz bn1O8cgn5NR6H4hjV68M2wEVr6pc+rNblqy4uHzslkU2s60KGRxotkmG+f0ZbSPksYeu ffChP40/cJko07BUL2WZBJUqymowahI7N/REk87Mte8xs1JviBFwLM5tCt3knEIFQdco TyUGtMd3uUkFaPfC1yjgzwNGEZ4KaYWSygPHCxfG3jjPZonqpMpRQY/pXIkSdVvh5xtb 5ziVPDgGUFIGFqI5RRpJr0B0Wfg5RwIa3O2AYDwEhurBeDoNnxbPFHik9lktWUR9P12a Q2dA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740067376; x=1740672176; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=I6bguq6qpVlMqUSZtWfQmgGW97HG/Gksgq8JkfafFAw=; b=b2BbXYgHs6bC+oRoCalkLp78s9zDh87mTx0KZDxOtqMHL7XZVr4NxNwFcGynsEMBuZ /q+PgGTFptCalvfkWYlY7Ekfc45MS3tkSQFLY0pENafCDcbijN2+e28M3Pst8CElpPTE Gp9qanHvW1TOxUxeLH8OrCPPQr00ePVTt3r5hgONF1s/iO/fW1aatvUZjXhcsyQID8IB xZctm1QbnwKa44zT2aDFcO08Dsq309qEHDYhrnx1Vhn8HzdL2OqJKNCjZd0RXzRcpWbf byFbH4LwU+oLSS+b3mUJuI6BrCGLeLssTR4z84Up91njVFA0GnhvTirqEbHDKrDmDcTf MzIg== X-Forwarded-Encrypted: i=1; AJvYcCVVKzUAzkBAEDTC252jua29e2qTUa3fjK2rRz0KjyFk1j1xBcap3IbHxIBY+nZUO40dOBHTrsSa3lTqTAQ3/Hil@lists.infradead.org, AJvYcCWv99CtFXI9GN7DwUPXRPGseg8Mb7jGWuwTWKa4JEHRUGD9lEUOh5Eezj+UpmAmMiduh3rxi8eZe8qr@lists.infradead.org, AJvYcCXaqUUZNmpzRIkAiSx7zwWXRlQlqFEBBasuYQAmLw/WDPt+Wb9oilb4pckPrGruTLys+IsnaTDBF8fgS+M=@lists.infradead.org X-Gm-Message-State: AOJu0Yzy0mu80n8O+g/nqnkvJd+yqoDzInIdhpHerHw9e4rSY1QVbRMj rSJRtMt/ZFoEeraKeAyAo4GkDIRBKyPk2bJillfsRCkv84YgBEnE X-Gm-Gg: ASbGnctIJaCYjnrGmo9Rmq5obeD2YXhbZefR/CaopUBJzepElbClpOuwuL7o5LwoLKE g9pOmGwqiQGK7m8JsbYtkFuQ2Y5dsxeyWOR1pUiuRbIpUSE3vKHN/x6OtRlXiqdb3aJsLwDnhG9 F+5nUnFOcHXya9pPAzsEcPFxdtF7JE+klNp8d3DWw/TOdcwfpIU+Znc2l/pRZeIBptbU2UU8f2Q 9Nup9jPxEwZ5idLKhviyjnFx6KplBWIR9tzTtjjV6pe0vuPTKkchcAvw91QkAb48HmV1tNvEaA2 BMZLjJlLUyx0ewDp95pP0LYairJe2s1RWD5mtNBwVatxBp7hm6mxHAsXv984XjhnfTA= X-Google-Smtp-Source: AGHT+IFaSQMhNqktmGECobEqwU6OE3XbGvTjrJbpApSBbFFxt7vAWy1C/f+ZaE7jio6splvGI0mHpQ== X-Received: by 2002:a5d:64ed:0:b0:38f:2a84:7542 with SMTP id ffacd0b85a97d-38f33f5234emr20594763f8f.28.1740067375670; Thu, 20 Feb 2025 08:02:55 -0800 (PST) Received: from jernej-laptop.localnet (86-58-6-171.dynamic.telemach.net. [86.58.6.171]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-43993847f39sm83376845e9.14.2025.02.20.08.02.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Feb 2025 08:02:55 -0800 (PST) From: Jernej =?UTF-8?B?xaBrcmFiZWM=?= To: =?UTF-8?B?QW5kcsOhcyBTemVtesWR?= Cc: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen-Yu Tsai , Samuel Holland , Linus Walleij , Philipp Zabel , Maxime Ripard , Vinod Koul , Kishon Vijay Abraham I , Ulf Hansson , Paul Walmsley , Palmer Dabbelt , Albert Ou , Uwe =?UTF-8?B?S2xlaW5lLUvDtm5pZw==?= , Florian Fainelli , linux-clk@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-gpio@vger.kernel.org, linux-pm@vger.kernel.org, linux-riscv@lists.infradead.org Subject: Re: [PATCH v2 04/10] clk: sunxi-ng: add CCU drivers for V853 Date: Thu, 20 Feb 2025 17:02:53 +0100 Message-ID: <1858640.8hzESeGDPO@jernej-laptop> In-Reply-To: <25D5F3C6-47BB-44B1-9FE3-12B6B8F5F901@gmail.com> References: <20250205125225.1152849-1-szemzo.andras@gmail.com> <3596612.V25eIC5XRa@jernej-laptop> <25D5F3C6-47BB-44B1-9FE3-12B6B8F5F901@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250220_080258_319522_23BC7615 X-CRM114-Status: GOOD ( 32.82 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Dne =C4=8Detrtek, 20. februar 2025 ob 10:28:43 Srednjeevropski standardni = =C4=8Das je Andr=C3=A1s Szemz=C5=91 napisal(a): > Hi, >=20 > Thanks for your review! >=20 > > On 19 Feb 2025, at 21:21, Jernej =C5=A0krabec wrote: > >=20 > > Dne sreda, 5. februar 2025 ob 13:52:19 Srednjeevropski standardni =C4= =8Das je Andras Szemzo napisal(a): > >> V853 has similar gates/resets like existing Allwinner SOCs. Add suppor= t for it's CCU and PRCM CCU. > >>=20 > >> Signed-off-by: Andras Szemzo > >> --- > >> drivers/clk/sunxi-ng/Kconfig | 10 + > >> drivers/clk/sunxi-ng/Makefile | 4 + > >> drivers/clk/sunxi-ng/ccu-sun8i-v853-r.c | 120 +++ > >> drivers/clk/sunxi-ng/ccu-sun8i-v853-r.h | 14 + > >> drivers/clk/sunxi-ng/ccu-sun8i-v853.c | 1145 +++++++++++++++++++++++ > >> drivers/clk/sunxi-ng/ccu-sun8i-v853.h | 14 + > >> 6 files changed, 1307 insertions(+) > >> create mode 100644 drivers/clk/sunxi-ng/ccu-sun8i-v853-r.c > >> create mode 100644 drivers/clk/sunxi-ng/ccu-sun8i-v853-r.h > >> create mode 100644 drivers/clk/sunxi-ng/ccu-sun8i-v853.c > >> create mode 100644 drivers/clk/sunxi-ng/ccu-sun8i-v853.h > >>=20 > >> diff --git a/drivers/clk/sunxi-ng/Kconfig b/drivers/clk/sunxi-ng/Kconf= ig > >> index b547198a2c65..e257373177e0 100644 > >> --- a/drivers/clk/sunxi-ng/Kconfig > >> +++ b/drivers/clk/sunxi-ng/Kconfig > >> @@ -12,6 +12,16 @@ config SUNIV_F1C100S_CCU > >> default y > >> depends on MACH_SUNIV || COMPILE_TEST > >>=20 > >> +config SUN8I_V853_CCU > >> + tristate "Support for the Allwinner V853/V851s/V851SE CCU" > >> + default MACH_SUN8I > >> + depends on MACH_SUN8I || COMPILE_TEST > >> + > >> +config SUN8I_V853_R_CCU > >> + tristate "Support for the Allwinner V853/V851s/V851SE PRCM CCU" > >> + default MACH_SUN8I > >> + depends on MACH_SUN8I || COMPILE_TEST > >=20 > > Generally, this are two patches, one for each driver. > >=20 > >> + > >> config SUN20I_D1_CCU > >> tristate "Support for the Allwinner D1/R528/T113 CCU" > >> default y > >> diff --git a/drivers/clk/sunxi-ng/Makefile b/drivers/clk/sunxi-ng/Make= file > >> index 6b3ae2b620db..b87928462e15 100644 > >> --- a/drivers/clk/sunxi-ng/Makefile > >> +++ b/drivers/clk/sunxi-ng/Makefile > >> @@ -25,6 +25,8 @@ sunxi-ccu-y +=3D ccu_mp.o > >>=20 > >> # SoC support > >> obj-$(CONFIG_SUNIV_F1C100S_CCU) +=3D suniv-f1c100s-ccu.o > >> +obj-$(CONFIG_SUN8I_V853_CCU) +=3D sun8i-v853-ccu.o > >> +obj-$(CONFIG_SUN8I_V853_R_CCU) +=3D sun8i-v853-r-ccu.o > >=20 > > Put it to other sun8i drivers. > >=20 > >> obj-$(CONFIG_SUN20I_D1_CCU) +=3D sun20i-d1-ccu.o > >> obj-$(CONFIG_SUN20I_D1_R_CCU) +=3D sun20i-d1-r-ccu.o > >> obj-$(CONFIG_SUN50I_A64_CCU) +=3D sun50i-a64-ccu.o > >> @@ -50,6 +52,8 @@ obj-$(CONFIG_SUN9I_A80_CCU) +=3D sun9i-a80-de-ccu.o > >> obj-$(CONFIG_SUN9I_A80_CCU) +=3D sun9i-a80-usb-ccu.o > >>=20 > >> suniv-f1c100s-ccu-y +=3D ccu-suniv-f1c100s.o > >> +sun8i-v853-ccu-y +=3D ccu-sun8i-v853.o > >> +sun8i-v853-r-ccu-y +=3D ccu-sun8i-v853-r.o > >=20 > > Ditto. > >=20 >=20 > ok >=20 > >> sun20i-d1-ccu-y +=3D ccu-sun20i-d1.o > >> sun20i-d1-r-ccu-y +=3D ccu-sun20i-d1-r.o > >> sun50i-a64-ccu-y +=3D ccu-sun50i-a64.o > >> diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v853-r.c b/drivers/clk/sun= xi-ng/ccu-sun8i-v853-r.c > >> new file mode 100644 > >> index 000000000000..bd60e00cda7f > >> --- /dev/null > >> +++ b/drivers/clk/sunxi-ng/ccu-sun8i-v853-r.c > >> @@ -0,0 +1,120 @@ > >> +// SPDX-License-Identifier: GPL-2.0 > >> +/* > >> + * Copyright (C) 2025 Andras Szemzo > >> + * > >> + * Based on ccu-sun20i-d1-r.c by Samuel Holland. > >> + */ > >> + > >> +#include > >> +#include > >> +#include > >> + > >> +#include "ccu_common.h" > >> +#include "ccu_reset.h" > >> + > >> +#include "ccu_gate.h" > >> +#include "ccu_mp.h" > >> + > >> +#include "ccu-sun8i-v853-r.h" > >> + > >> +static const struct clk_parent_data r_ahb_apb0_parents[] =3D { > >> + { .fw_name =3D "hosc" }, > >> + { .fw_name =3D "losc" }, > >> + { .fw_name =3D "iosc" }, > >> + { .fw_name =3D "pll-periph" }, > >> + { .fw_name =3D "pll-audio" } > >> +}; > >> + > >> +static SUNXI_CCU_MP_DATA_WITH_MUX(r_ahb_clk, "r-ahb", > >> + r_ahb_apb0_parents, 0x000, > >> + 0, 5, /* M */ > >> + 8, 2, /* P */ > >> + 24, 3, /* mux */ > >> + 0); > >> +static const struct clk_hw *r_ahb_hw =3D &r_ahb_clk.common.hw; > >> + > >> +static SUNXI_CCU_MP_DATA_WITH_MUX(r_apb0_clk, "r-apb0", > >> + r_ahb_apb0_parents, 0x00c, > >> + 0, 5, /* M */ > >> + 8, 2, /* P */ > >> + 24, 3, /* mux */ > >> + 0); > >> +static const struct clk_hw *r_apb0_hw =3D &r_apb0_clk.common.hw; > >=20 > > Where can I look for above clocks? There are not described in BSP drive= r. > >=20 >=20 > As the original BSP=E2=80=99s PRCM driver has an unacceptable licence, I = had to rewrite this driver. This IP block > isn=E2=80=99t documented in the V853 manual, so as Andre suggested, I use= d the A523 manual, and the D1/T113 > PRCM driver. Than I peek/poke the registers to check if it=E2=80=99s vali= d or not.=20 >=20 > awboot> read32 0x701000c > 0x0701000c: 0x0f00031f > awboot> read32 0x7010000 > 0x07010000: 0x00000000 > awboot> write32 0x7010000 0xffffffff > awboot> read32 0x7010000 > 0x07010000: 0x0700031f >=20 > They are there, I=E2=80=99m not sure about it=E2=80=99s usage. Ok, so they exist and format is ok too. Only question is if parents are cor= rect. I checked ccu-sun8iw20-r.c from one BSP and it has similar clocks. However, it's missing pll-audio and pll-periph is pre-divided by 3, which is same as= on A523. So my suggestion is to remove pll-audio and adjust pll-periph to have predivider. >=20 >=20 > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_r_twd_clk, "bus-r-twd", &r_apb0_hw,=20 > >> + 0x12c, BIT(0), 0); > >> +static SUNXI_CCU_GATE_HWS(bus_r_ppu_clk, "bus-r-ppu", &r_apb0_hw, > >> + 0x1ac, BIT(0), 0); > >> +static SUNXI_CCU_GATE_HWS(bus_r_rtc_clk, "bus-r-rtc", &r_ahb_hw, > >> + 0x20c, BIT(0), 0); > >> +static SUNXI_CCU_GATE_HWS(bus_r_cpucfg_clk, "bus-r-cpucfg", &r_apb0_h= w, > >> + 0x22c, BIT(0), 0); > >> + > >> +static struct ccu_common *sun8i_v853_r_ccu_clks[] =3D { > >> + &r_ahb_clk.common, > >> + &r_apb0_clk.common, > >> + &bus_r_twd_clk.common, > >> + &bus_r_ppu_clk.common, > >> + &bus_r_rtc_clk.common, > >> + &bus_r_cpucfg_clk.common, > >> +}; > >> + > >> +static struct clk_hw_onecell_data sun8i_v853_r_hw_clks =3D { > >> + .num =3D CLK_NUMBER, > >> + .hws =3D { > >> + [CLK_R_AHB] =3D &r_ahb_clk.common.hw, > >> + [CLK_R_APB0] =3D &r_apb0_clk.common.hw, > >> + [CLK_BUS_R_TWD] =3D &bus_r_twd_clk.common.hw, > >> + [CLK_BUS_R_PPU] =3D &bus_r_ppu_clk.common.hw, > >> + [CLK_BUS_R_RTC] =3D &bus_r_rtc_clk.common.hw, > >> + [CLK_BUS_R_CPUCFG] =3D &bus_r_cpucfg_clk.common.hw, > >> + }, > >> +}; > >> + > >> +static const struct ccu_reset_map sun8i_v853_r_ccu_resets[] =3D { > >> + [RST_BUS_R_TWD] =3D { 0x12c, BIT(16) }, > >=20 > > Where did you get that? BSP driver that I checked doesn't mentions it. > >=20 >=20 > yes, just double checked and this bit is not valid, sorry, I=E2=80=99ll r= emove it. >=20 > >> + [RST_BUS_R_PPU] =3D { 0x1ac, BIT(16) }, > >> + [RST_BUS_R_RTC] =3D { 0x20c, BIT(16) }, > >> + [RST_BUS_R_CPUCFG] =3D { 0x22c, BIT(16) }, > >> +}; > >> + > >> +static const struct sunxi_ccu_desc sun8i_v853_r_ccu_desc =3D { > >> + .ccu_clks =3D sun8i_v853_r_ccu_clks, > >> + .num_ccu_clks =3D ARRAY_SIZE(sun8i_v853_r_ccu_clks), > >> + > >> + .hw_clks =3D &sun8i_v853_r_hw_clks, > >> + > >> + .resets =3D sun8i_v853_r_ccu_resets, > >> + .num_resets =3D ARRAY_SIZE(sun8i_v853_r_ccu_resets), > >> +}; > >> + > >> +static int sun8i_v853_r_ccu_probe(struct platform_device *pdev) > >> +{ > >> + void __iomem *reg; > >> + > >> + reg =3D devm_platform_ioremap_resource(pdev, 0); > >> + if (IS_ERR(reg)) > >> + return PTR_ERR(reg); > >> + > >> + return devm_sunxi_ccu_probe(&pdev->dev, reg, &sun8i_v853_r_ccu_desc); > >> +} > >> + > >> +static const struct of_device_id sun8i_v853_r_ccu_ids[] =3D { > >> + { .compatible =3D "allwinner,sun8i-v853-r-ccu" }, > >> + { } > >> +}; > >> +MODULE_DEVICE_TABLE(of, sun8i_v853_r_ccu_ids); > >> + > >> +static struct platform_driver sun8i_v853_r_ccu_driver =3D { > >> + .probe =3D sun8i_v853_r_ccu_probe, > >> + .driver =3D { > >> + .name =3D "sun8i-v853-r-ccu", > >> + .suppress_bind_attrs =3D true, > >> + .of_match_table =3D sun8i_v853_r_ccu_ids, > >> + }, > >> +}; > >> +module_platform_driver(sun8i_v853_r_ccu_driver); > >> + > >> +MODULE_IMPORT_NS("SUNXI_CCU"); > >> +MODULE_DESCRIPTION("Support for the Allwinner V853 PRCM CCU"); > >> +MODULE_LICENSE("GPL"); > >> diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v853-r.h b/drivers/clk/sun= xi-ng/ccu-sun8i-v853-r.h > >> new file mode 100644 > >> index 000000000000..2c6cc7b6f251 > >> --- /dev/null > >> +++ b/drivers/clk/sunxi-ng/ccu-sun8i-v853-r.h > >> @@ -0,0 +1,14 @@ > >> +/* SPDX-License-Identifier: GPL-2.0 */ > >> +/* > >> + * Copyright (C) 2025 Andras Szemzo > >> + */ > >> + > >> +#ifndef _CCU_SUN8I_V853_R_H > >> +#define _CCU_SUN8I_V853_R_H > >> + > >> +#include > >> +#include > >> + > >> +#define CLK_NUMBER (CLK_BUS_R_CPUCFG + 1) > >> + > >> +#endif > >> diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v853.c b/drivers/clk/sunxi= =2Dng/ccu-sun8i-v853.c > >> new file mode 100644 > >> index 000000000000..4b32f3a913cf > >> --- /dev/null > >> +++ b/drivers/clk/sunxi-ng/ccu-sun8i-v853.c > >> @@ -0,0 +1,1145 @@ > >> +// SPDX-License-Identifier: GPL-2.0 > >> +/* > >> + * Copyright (C) 2025 Andras Szemzo > >> + * > >> + * Based on ccu-sun20i-d1.c by Samuel Holland. > >> + */ > >> + > >> +#include > >> +#include > >> +#include > >> +#include > >> + > >> +#include "../clk.h" > >> + > >> +#include "ccu_common.h" > >> +#include "ccu_reset.h" > >> + > >> +#include "ccu_div.h" > >> +#include "ccu_gate.h" > >> +#include "ccu_mp.h" > >> +#include "ccu_mult.h" > >> +#include "ccu_nk.h" > >> +#include "ccu_nkm.h" > >> +#include "ccu_nkmp.h" > >> +#include "ccu_nm.h" > >> + > >> +#include "ccu-sun8i-v853.h" > >> + > >> +static const struct clk_parent_data osc24M[] =3D { > >> + { .fw_name =3D "hosc" } > >> +}; > >> + > >> +/* > >> + * For the CPU PLL, the output divider is described as "only for test= ing" > >> + * in the user manual. So it's not modelled and forced to 0. > >> + */ > >> +#define SUN8I_V853_PLL_CPU_REG 0x000 > >> + > >> +static struct ccu_mult pll_cpu_clk =3D { > >> + .enable =3D BIT(27), > >> + .lock =3D BIT(28), > >> + .mult =3D _SUNXI_CCU_MULT_MIN(8, 8, 11), > >> + .common =3D { > >> + .reg =3D 0x000, > >> + .hw.init =3D CLK_HW_INIT_PARENTS_DATA("pll-cpu", osc24M, > >> + &ccu_mult_ops, > >> + CLK_SET_RATE_GATE), > >> + }, > >> +}; > >> + > >> +/* Some PLLs are input * N / div1 / P. Model them as NKMP with no K */ > >> +#define SUN8I_V853_PLL_DDR_REG 0x010 > >> +static struct ccu_nkmp pll_ddr_clk =3D { > >> + .enable =3D BIT(27), > >> + .lock =3D BIT(28), > >> + .n =3D _SUNXI_CCU_MULT_MIN(8, 8, 11), > >> + .m =3D _SUNXI_CCU_DIV(1, 1), /* input divider */ > >> + .p =3D _SUNXI_CCU_DIV(0, 1), /* output divider */ > >> + .common =3D { > >> + .reg =3D 0x010, > >> + .hw.init =3D CLK_HW_INIT_PARENTS_DATA("pll-ddr", osc24M, > >> + &ccu_nkmp_ops, > >> + CLK_SET_RATE_GATE), > >> + }, > >> +}; > >> + > >> +#define SUN8I_V853_PLL_PERIPH_REG 0x020 > >> +static struct ccu_nm pll_periph_4x_clk =3D { > >> + .enable =3D BIT(27), > >> + .lock =3D BIT(28), > >> + .n =3D _SUNXI_CCU_MULT_MIN(8, 8, 11), > >> + .m =3D _SUNXI_CCU_DIV(1, 1), /* input divider */ > >> + .common =3D { > >> + .reg =3D 0x020, > >> + .hw.init =3D CLK_HW_INIT_PARENTS_DATA("pll-periph-4x", osc24M, > >> + &ccu_nm_ops, > >> + CLK_SET_RATE_GATE), > >> + }, > >> +}; > >> + > >> +static const struct clk_hw *pll_periph_4x_hws[] =3D { > >> + &pll_periph_4x_clk.common.hw > >> +}; > >> + > >> +static SUNXI_CCU_M_HWS(pll_periph_2x_clk, "pll-periph-2x", pll_periph= _4x_hws, > >> + 0x020, 16, 3, 0); > >> + > >> +static SUNXI_CCU_M_HWS(pll_periph_800M_clk, "pll-periph-800M", pll_pe= riph_4x_hws, > >> + 0x020, 20, 3, 0); > >> + > >> +static SUNXI_CCU_M_HWS(pll_periph_480M_clk, "pll-periph-480M", pll_pe= riph_4x_hws, > >> + 0x020, 2, 3, 0); > >> + > >> +static CLK_FIXED_FACTOR_HW(pll_periph_600M_clk, "pll-periph-600M", > >> + &pll_periph_2x_clk.common.hw, 2, 1, 0); > >> + > >> +static CLK_FIXED_FACTOR_HW(pll_periph_400M_clk, "pll-periph-400M", > >> + &pll_periph_2x_clk.common.hw, 3, 1, 0); > >> + > >> +static CLK_FIXED_FACTOR_HW(pll_periph_300M_clk, "pll-periph-300M", > >> + &pll_periph_600M_clk.hw, 2, 1, 0); > >> + > >> +static CLK_FIXED_FACTOR_HW(pll_periph_200M_clk, "pll-periph-200M", > >> + &pll_periph_400M_clk.hw, 2, 1, 0); > >> + > >> +static CLK_FIXED_FACTOR_HW(pll_periph_160M_clk, "pll-periph-160M", > >> + &pll_periph_480M_clk.common.hw, 3, 1, 0); > >> + > >> +static CLK_FIXED_FACTOR_HW(pll_periph_150M_clk, "pll-periph-150M", > >> + &pll_periph_300M_clk.hw, 2, 1, 0); > >> + > >> +/* > >> + * For Video PLLs, the output divider is described as "only for testi= ng" > >> + * in the user manual. > >> + */ > >> +#define SUN8I_V853_PLL_VIDEO_REG 0x040 > >> +static struct ccu_nkmp pll_video_4x_clk =3D { > >> + .enable =3D BIT(27), > >> + .lock =3D BIT(28), > >> + .n =3D _SUNXI_CCU_MULT_MIN(8, 8, 11), > >> + .p =3D _SUNXI_CCU_DIV(1, 1), /* input divider */ > >> + .common =3D { > >> + .reg =3D 0x040, > >> + .hw.init =3D CLK_HW_INIT_PARENTS_DATA("pll-video-4x", osc24M, > >> + &ccu_nkmp_ops, > >> + CLK_SET_RATE_GATE), > >> + }, > >> +}; > >> + > >> +static const struct clk_hw *pll_video_4x_hws[] =3D { > >> + &pll_video_4x_clk.common.hw > >> +}; > >> +static CLK_FIXED_FACTOR_HWS(pll_video_2x_clk, "pll-video-2x", > >> + pll_video_4x_hws, 2, 1, CLK_SET_RATE_PARENT); > >> +static CLK_FIXED_FACTOR_HWS(pll_video_1x_clk, "pll-video-1x", > >> + pll_video_4x_hws, 4, 1, CLK_SET_RATE_PARENT); > >> + > >> + > >> +/* > >> + * For CSI PLLs, the output divider is described as "only for testing" > >> + * in the user manual. > >> + */ > >> +#define SUN8I_V853_PLL_CSI_REG 0x048 > >> +static struct ccu_nkmp pll_csi_4x_clk =3D { > >> + .enable =3D BIT(27), > >> + .lock =3D BIT(28), > >> + .n =3D _SUNXI_CCU_MULT_MIN(8, 8, 11), > >> + .p =3D _SUNXI_CCU_DIV(1, 1), /* input divider */ > >> + .common =3D { > >> + .reg =3D 0x048, > >> + .hw.init =3D CLK_HW_INIT_PARENTS_DATA("pll-csi-4x", osc24M, > >> + &ccu_nkmp_ops, > >> + CLK_SET_RATE_GATE), > >> + }, > >> +}; > >> + > >> +static CLK_FIXED_FACTOR_HW(pll_csi_clk, "pll-csi", > >> + &pll_csi_4x_clk.common.hw, 4, 1, CLK_SET_RATE_PARENT); > >> + > >> + > >> +#define SUN8I_V853_PLL_AUDIO_REG 0x078 > >> +static struct ccu_sdm_setting pll_audio_div5_sdm_table[] =3D { > >> + { .rate =3D 196608000, .pattern =3D 0xc001eb85, .m =3D 5, .n =3D 40 = }, /* 24.576 */ > >> + { .rate =3D 67737600, .pattern =3D 0xc001288d, .m =3D 8, .n =3D 22 }= , /* 22.5792 */ > >> +}; > >> + > >> +static struct ccu_nm pll_audio_div5_clk =3D { > >> + .enable =3D BIT(27), > >> + .lock =3D BIT(28), > >> + .n =3D _SUNXI_CCU_MULT(8, 8), > >> + .m =3D _SUNXI_CCU_DIV(20, 3), > >> + .sdm =3D _SUNXI_CCU_SDM(pll_audio_div5_sdm_table, > >> + BIT(24), 0x0178, BIT(31)), > >> + .common =3D { > >> + .reg =3D 0x0078, > >> + .features =3D CCU_FEATURE_SIGMA_DELTA_MOD, > >> + .hw.init =3D CLK_HW_INIT_PARENTS_DATA("pll-audio-div5", osc24= M, > >> + &ccu_nm_ops, > >> + CLK_SET_RATE_UNGATE), > >> + }, > >> +}; > >> + > >> +static const struct clk_hw *pll_audio_div5_hws[] =3D { > >> + &pll_audio_div5_clk.common.hw > >> +}; > >> + > >> +static SUNXI_CCU_M_HWS(pll_audio_1x_clk, "pll-audio-1x", pll_audio_di= v5_hws, > >> + 0xe00, 0, 5, CLK_SET_RATE_PARENT); > >> + > >> +/* pll-audio-div2 and pll-audio-4x not used, because pll-audio-1x can= cover=20 > >> + * 22.5792M and 24.576M=20 > >> + */ > >> +static SUNXI_CCU_M(pll_audio_div2_clk, "pll-audio-div2", "pll-audio", > >> + 0x078, 16, 3, 0); > >> +static SUNXI_CCU_M(pll_audio_4x_clk, "pll-audio-4x", "pll-audio-div2", > >> + 0xe00, 5, 5, 0); > >> + > >> +/* > >> + * For the NPU PLL, the output divider is described as "only for test= ing" > >> + * in the user manual. > >> + */ > >> +#define SUN8I_V853_PLL_NPU_REG 0x080 > >> +static struct ccu_nkmp pll_npu_4x_clk =3D { > >> + .enable =3D BIT(27), > >> + .lock =3D BIT(28), > >> + .n =3D _SUNXI_CCU_MULT_MIN(8, 8, 11), > >> + .p =3D _SUNXI_CCU_DIV(1, 1), /* input divider */ > >> + .common =3D { > >> + .reg =3D 0x080, > >> + .hw.init =3D CLK_HW_INIT_PARENTS_DATA("pll-npu-4x", osc24M, > >> + &ccu_nkmp_ops, > >> + CLK_SET_RATE_UNGATE), > >> + }, > >> +}; > >> + > >> +/* > >> + * The CPU gate is not modelled - it is in a separate register (0x504) > >> + * and has a special key field. The clock must not be gated anyway by > >> + * the kernel. > >> + */ > >> +static const struct clk_parent_data cpu_parents[] =3D { > >> + { .fw_name =3D "hosc" }, > >> + { .fw_name =3D "losc" }, > >> + { .fw_name =3D "iosc" }, > >> + { .hw =3D &pll_cpu_clk.common.hw }, > >> + { .hw =3D &pll_periph_600M_clk.hw }, > >> + { .hw =3D &pll_periph_800M_clk.common.hw }, > >> +}; > >> + > >> +/* > >> + * There is a P factor (PLL_OUT_EXT_DIVP[17:16]) in this register, bu= t it is not modeled. > >> + * The manual states that it should be used only, when the output clo= ck is less than 288 MHz. > >> + */ > >> +static SUNXI_CCU_MUX_DATA(cpu_clk, "cpu", cpu_parents, > >> + 0x500, 24, 3, CLK_SET_RATE_PARENT | CLK_IS_CRITICAL); > >> + > >> +static const struct clk_hw *cpu_hws[] =3D { &cpu_clk.common.hw }; > >> + > >> +static SUNXI_CCU_M_HWS(cpu_axi_clk, "cpu-axi", cpu_hws, > >> + 0x500, 0, 2, 0); > >> +static SUNXI_CCU_M_HWS(cpu_apb_clk, "cpu-apb", cpu_hws, > >> + 0x500, 8, 2, 0); > >> + > >> +static const struct clk_parent_data ahb_parents[] =3D { > >> + { .fw_name =3D "hosc" }, > >> + { .fw_name =3D "losc" }, > >> + { .fw_name =3D "iosc" }, > >> + { .hw =3D &pll_periph_600M_clk.hw }, > >> +}; > >> +static SUNXI_CCU_MP_DATA_WITH_MUX(ahb_clk, "ahb", ahb_parents, 0x510, > >> + 0, 5, /* M */ > >> + 8, 2, /* P */ > >> + 24, 2, /* mux */ > >> + 0); > >> + > >> +static SUNXI_CCU_MP_DATA_WITH_MUX(apb0_clk, "apb0", ahb_parents, 0x52= 0, > >> + 0, 5, /* M */ > >> + 8, 2, /* P */ > >> + 24, 2, /* mux */ > >> + 0); > >> + > >> +static SUNXI_CCU_MP_DATA_WITH_MUX(apb1_clk, "apb1", ahb_parents, 0x52= 4, > >> + 0, 5, /* M */ > >> + 8, 2, /* P */ > >> + 24, 2, /* mux */ > >> + 0); > >> + > >> +static const struct clk_hw *ahb_hws[] =3D { &ahb_clk.common.hw }; > >> +static const struct clk_hw *apb0_hws[] =3D { &apb0_clk.common.hw }; > >> +static const struct clk_hw *apb1_hws[] =3D { &apb1_clk.common.hw }; > >> + > >> + > >> +static const struct clk_hw *de_g2d_parents[] =3D { > >> + &pll_periph_300M_clk.hw, > >> + &pll_video_1x_clk.hw, > >> +}; > >> +static SUNXI_CCU_M_HW_WITH_MUX_GATE(de_clk, "de", de_g2d_parents, 0x6= 00, > >> + 0, 5, /* M */ > >> + 24, 1, /* mux */ > >> + BIT(31), /* gate */ > >> + CLK_SET_RATE_PARENT); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_de_clk, "bus-de", ahb_hws, > >> + 0x60c, BIT(0), 0); > >> + > >> +static SUNXI_CCU_M_HW_WITH_MUX_GATE(g2d_clk, "g2d", de_g2d_parents, 0= x630, > >> + 0, 5, /* M */ > >> + 24, 1, /* mux */ > >> + BIT(31), /* gate */ > >> + CLK_SET_RATE_PARENT); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_g2d_clk, "bus-g2d", ahb_hws, > >> + 0x63c, BIT(0), 0); > >> + > >> + > >> +static const struct clk_parent_data ce_parents[] =3D { > >> + { .fw_name =3D "hosc" }, > >=20 > > Where this come from? V853 manual v1.1 doesn't have it. >=20 > There is a sun8iw21 ccu driver [1], where hosc is the first parent: >=20 > [1]: > https://github.com/YuzukiHD/TinyVision/blob/main/kernel/bsp/drivers/clk/s= unxi-ng/ccu-sun8iw21.c#L262 >=20 > I don=E2=80=99t know if the manual or if this driver is the correct. It's ok. >=20 > >=20 > >> + { .hw =3D &pll_periph_400M_clk.hw, }, > >> + { .hw =3D &pll_periph_300M_clk.hw, } > >> +}; > >> +static SUNXI_CCU_M_DATA_WITH_MUX_GATE(ce_clk, "ce", ce_parents, 0x680, > >> + 0, 4, /* M */ > >> + 24, 3, /* mux */ > >> + BIT(31), /* gate */ > >> + CLK_SET_RATE_PARENT); > >=20 > > Set rate parent flag doesn't make sense on constant parents. >=20 > yes >=20 > >=20 > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_ce_clk, "bus-ce", ahb_hws, > >> + 0x68c, BIT(0) | BIT(1), 0); > >> + > >> +static const struct clk_hw *ve_parents[] =3D { > >> + &pll_periph_300M_clk.hw, > >> + &pll_periph_400M_clk.hw, > >> + &pll_periph_480M_clk.common.hw, > >> + &pll_npu_4x_clk.common.hw, > >> + &pll_video_4x_clk.common.hw, > >> + &pll_csi_4x_clk.common.hw, > >> +}; > >> +static SUNXI_CCU_M_HW_WITH_MUX_GATE(ve_clk, "ve", ve_parents, 0x690, > >> + 0, 5, /* M */ > >> + 24, 3, /* mux */ > >> + BIT(31), /* gate */ > >> + 0); > >=20 > > CLK_SET_RATE_PARENT flag? Cedrus driver set working clock at the beginn= ing. > >=20 >=20 > ok >=20 > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_ve_clk, "bus-ve", ahb_hws, > >> + 0x69c, BIT(0), 0); > >> + > >> + > >> +static const struct clk_hw *npu_parents[] =3D { > >> + &pll_periph_480M_clk.common.hw, > >> + &pll_periph_600M_clk.hw, > >> + &pll_periph_800M_clk.common.hw, > >> + &pll_npu_4x_clk.common.hw, > >> +}; > >> +static SUNXI_CCU_M_HW_WITH_MUX_GATE(npu_clk, "npu", npu_parents, 0x6e= 0, > >> + 0, 5, /* M */ > >> + 24, 3, /* mux */ > >> + BIT(31), /* gate */ > >> + 0); > >=20 > > I think CLK_SET_RATE_PARENT would also be beneficial here. >=20 > I tried to mimic how the BSP setup the NPU clocks (as I think, not sure),= in the dts I setup it like: >=20 > npu: npu@3050000 { > compatible =3D "vivante,gc"; > reg =3D <0x03050000 0x1000>; > interrupts =3D ; > interrupt-names =3D "npu"; > clocks =3D <&ccu CLK_BUS_NPU>, <&ccu CLK_NPU>; > clock-names =3D "bus", "core"; > assigned-clocks =3D <&ccu CLK_PLL_NPU_4X>, <&ccu = CLK_NPU>; > assigned-clock-parents =3D <&dcxo>, <&ccu CLK_PLL= _NPU_4X>; > assigned-clock-rates =3D <1392000000>, <34800000= 0>; > resets =3D <&ccu RST_BUS_NPU>; > iommus =3D <&iommu 6>; > power-domains =3D <&ppu PD_NPU>; > }; >=20 > With these settings (after adding a reset support to the etnaviv driver) = at least I'm able to dump some registers via debugfs. > Do you think I should add the CLK_SET_RATE_PARENT flag? Yes, because those assigned clock properties are not really how things shou= ld be done. Best regards, Jernej >=20 > >=20 > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_npu_clk, "bus-npu", ahb_hws, > >> + 0x6ec, BIT(0), 0); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_dma_clk, "bus-dma", ahb_hws, > >> + 0x70c, BIT(0), 0); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_msgbox0_clk, "bus-msgbox0", ahb_hws, > >> + 0x71c, BIT(0), 0); > >> +static SUNXI_CCU_GATE_HWS(bus_msgbox1_clk, "bus-msgbox1", ahb_hws, > >> + 0x71c, BIT(1), 0); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_spinlock_clk, "bus-spinlock", ahb_hws, > >> + 0x72c, BIT(0), 0); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_hstimer_clk, "bus-hstimer", ahb_hws, > >> + 0x73c, BIT(0), 0); > >> + > >> +static SUNXI_CCU_GATE_DATA(avs_clk, "avs", osc24M, > >> + 0x740, BIT(31), 0); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_dbg_clk, "bus-dbg", ahb_hws, > >> + 0x78c, BIT(0), 0); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_pwm_clk, "bus-pwm", apb0_hws, > >> + 0x7ac, BIT(0), 0); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_iommu_clk, "bus-iommu", ahb_hws, > >> + 0x7bc, BIT(0), 0); > >> + > >> +static const struct clk_hw *dram_parents[] =3D { > >> + &pll_ddr_clk.common.hw, > >> + &pll_periph_2x_clk.common.hw, > >> + &pll_periph_800M_clk.common.hw, > >> +}; > >> +static SUNXI_CCU_MP_HW_WITH_MUX_GATE(dram_clk, "dram", dram_parents, = 0x800, > >> + 0, 5, /* M */ > >> + 8, 2, /* P */ > >> + 24, 3, /* mux */ > >> + BIT(31), CLK_IS_CRITICAL); > >=20 > > This clock needs update field to be set to actually apply configuration= =2E So > > same comment as on A523 clock version, this needs new flag to be introd= uced > > for such case. > >=20 >=20 > ok >=20 > >> + > >> +static CLK_FIXED_FACTOR_HW(mbus_clk, "mbus", > >> + &dram_clk.common.hw, 4, 1, 0); > >> + > >> +static const struct clk_hw *mbus_hws[] =3D { &mbus_clk.hw }; > >> + > >> +static SUNXI_CCU_GATE_HWS(mbus_dma_clk, "mbus-dma", mbus_hws, > >> + 0x804, BIT(0), 0); > >> +static SUNXI_CCU_GATE_HWS(mbus_ve_clk, "mbus-ve", mbus_hws, > >> + 0x804, BIT(1), 0); > >> +static SUNXI_CCU_GATE_HWS(mbus_ce_clk, "mbus-ce", mbus_hws, > >> + 0x804, BIT(2), 0); > >> +static SUNXI_CCU_GATE_HWS(mbus_csi_clk, "mbus-csi", mbus_hws, > >> + 0x804, BIT(8), 0); > >> +static SUNXI_CCU_GATE_HWS(mbus_isp_clk, "mbus-isp", mbus_hws, > >> + 0x804, BIT(9), 0); > >> +static SUNXI_CCU_GATE_HWS(mbus_g2d_clk, "mbus-g2d", mbus_hws, > >> + 0x804, BIT(10), 0); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_dram_clk, "bus-dram", ahb_hws, > >> + 0x80c, BIT(0), CLK_IS_CRITICAL); > >> + > >> + > >> +static const struct clk_parent_data mmc0_mmc1_parents[] =3D { > >> + { .fw_name =3D "hosc" }, > >> + { .hw =3D &pll_periph_400M_clk.hw, }, > >> + { .hw =3D &pll_periph_300M_clk.hw, }, > >> +}; > >=20 > > Just mmc_parents. >=20 > ok >=20 > >=20 > >> +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(mmc0_clk, "mmc0", mmc0_mmc1_pa= rents, 0x830, > >> + 0, 4, /* M */ > >> + 8, 2, /* P */ > >> + 24, 3, /* mux */ > >> + BIT(31), /* gate */ > >> + 0); > >> + > >> +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(mmc1_clk, "mmc1", mmc0_mmc1_pa= rents, 0x834, > >> + 0, 4, /* M */ > >> + 8, 2, /* P */ > >> + 24, 3, /* mux */ > >> + BIT(31), /* gate */ > >> + 0); > >> + > >> +static const struct clk_parent_data mmc2_parents[] =3D { > >> + { .fw_name =3D "hosc" }, > >> + { .hw =3D &pll_periph_600M_clk.hw, }, > >> + { .hw =3D &pll_periph_400M_clk.hw, }, > >> +}; > >> +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(mmc2_clk, "mmc2", mmc2_parents= , 0x838, > >> + 0, 4, /* M */ > >> + 8, 2, /* P */ > >> + 24, 3, /* mux */ > >> + BIT(31), /* gate */ > >> + 0); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_mmc0_clk, "bus-mmc0", ahb_hws, > >> + 0x84c, BIT(0), 0); > >> +static SUNXI_CCU_GATE_HWS(bus_mmc1_clk, "bus-mmc1", ahb_hws, > >> + 0x84c, BIT(1), 0); > >> +static SUNXI_CCU_GATE_HWS(bus_mmc2_clk, "bus-mmc2", ahb_hws, > >> + 0x84c, BIT(2), 0); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_uart0_clk, "bus-uart0", apb1_hws, > >> + 0x90c, BIT(0), 0); > >> +static SUNXI_CCU_GATE_HWS(bus_uart1_clk, "bus-uart1", apb1_hws, > >> + 0x90c, BIT(1), 0); > >> +static SUNXI_CCU_GATE_HWS(bus_uart2_clk, "bus-uart2", apb1_hws, > >> + 0x90c, BIT(2), 0); > >> +static SUNXI_CCU_GATE_HWS(bus_uart3_clk, "bus-uart3", apb1_hws, > >> + 0x90c, BIT(3), 0); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_i2c0_clk, "bus-i2c0", apb1_hws, > >> + 0x91c, BIT(0), 0); > >> +static SUNXI_CCU_GATE_HWS(bus_i2c1_clk, "bus-i2c1", apb1_hws, > >> + 0x91c, BIT(1), 0); > >> +static SUNXI_CCU_GATE_HWS(bus_i2c2_clk, "bus-i2c2", apb1_hws, > >> + 0x91c, BIT(2), 0); > >> +static SUNXI_CCU_GATE_HWS(bus_i2c3_clk, "bus-i2c3", apb1_hws, > >> + 0x91c, BIT(3), 0); > >> +static SUNXI_CCU_GATE_HWS(bus_i2c4_clk, "bus-i2c4", apb1_hws, > >> + 0x91c, BIT(4), 0); > >> + > >> +static const struct clk_parent_data spi_parents[] =3D { > >> + { .fw_name =3D "hosc" }, > >> + { .hw =3D &pll_periph_300M_clk.hw, }, > >> + { .hw =3D &pll_periph_200M_clk.hw, }, > >> +}; > >> + > >> +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(spi0_clk, "spi0", spi_parents,= 0x940, > >> + 0, 4, /* M */ > >> + 8, 2, /* P */ > >> + 24, 3, /* mux */ > >> + BIT(31), /* gate */ > >> + 0); > >> + > >> +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(spi1_clk, "spi1", spi_parents,= 0x944, > >> + 0, 4, /* M */ > >> + 8, 2, /* P */ > >> + 24, 3, /* mux */ > >> + BIT(31), /* gate */ > >> + 0); > >> + > >> +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(spi2_clk, "spi2", spi_parents,= 0x948, > >> + 0, 4, /* M */ > >> + 8, 2, /* P */ > >> + 24, 3, /* mux */ > >> + BIT(31), /* gate */ > >> + 0); > >> + > >> +static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(spi3_clk, "spi3", spi_parents,= 0x94c, > >> + 0, 4, /* M */ > >> + 8, 2, /* P */ > >> + 24, 3, /* mux */ > >> + BIT(31), /* gate */ > >> + 0); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_spi0_clk, "bus-spi0", ahb_hws, > >> + 0x96c, BIT(0), 0); > >> +static SUNXI_CCU_GATE_HWS(bus_spi1_clk, "bus-spi1", ahb_hws, > >> + 0x96c, BIT(1), 0); > >> +static SUNXI_CCU_GATE_HWS(bus_spi2_clk, "bus-spi2", ahb_hws, > >> + 0x96c, BIT(2), 0); > >> +static SUNXI_CCU_GATE_HWS(bus_spi3_clk, "bus-spi3", ahb_hws, > >> + 0x96c, BIT(3), 0); > >> + > >> + > >> +static const struct clk_parent_data spif_parents[] =3D { > >> + { .fw_name =3D "hosc" }, > >> + { .hw =3D &pll_periph_400M_clk.hw, }, > >> + { .hw =3D &pll_periph_300M_clk.hw, }, > >> +}; > >> + > >> +static SUNXI_CCU_M_DATA_WITH_MUX_GATE(spif_clk, "spif", spif_parents,= 0x0950, > >> + 0, 4, /* M */ > >> + 24, 3, /* mux */ > >> + BIT(31), /* gate */ > >> + CLK_SET_RATE_PARENT); > >=20 > > This is MP clock, P being at 9:8. >=20 > yes, the BSP driver [1] model it with only M, I=E2=80=99ll update it to M= P. >=20 > >=20 > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_spif_clk, "bus-spif", ahb_hws, > >> + 0x096c, BIT(4), 0); > >> + > >> + > >> +static const struct clk_hw *pll_periph_150M_hws[] =3D { &pll_periph_1= 50M_clk.hw }; > >> +static SUNXI_CCU_GATE_HWS_WITH_PREDIV(emac_25M_clk, "emac-25M", pll_p= eriph_150M_hws, > >> + 0x970, BIT(31) | BIT(30), 6, 0); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_emac_clk, "bus-emac", ahb_hws, > >> + 0x97c, BIT(0), 0); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_gpadc_clk, "bus-gpadc", apb0_hws, > >> + 0x9ec, BIT(0), 0); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_ths_clk, "bus-ths", ahb_hws, > >> + 0x9fc, BIT(0), 0); > >> + > >> + > >> +static const struct clk_hw *audio_parents[] =3D { > >> + &pll_audio_1x_clk.common.hw, > >> + &pll_audio_4x_clk.common.hw, > >> +}; > >> + > >> +static SUNXI_CCU_M_HW_WITH_MUX_GATE(i2s0_clk, "i2s0", audio_parents, = 0xa10, > >> + 0, 4, /* M */ > >> + 24, 1, /* mux */ > >> + BIT(31), /* gate */ > >> + CLK_SET_RATE_PARENT); > >> + > >> +static SUNXI_CCU_M_HW_WITH_MUX_GATE(i2s1_clk, "i2s1", audio_parents, = 0xa14, > >> + 0, 4, /* M */ > >> + 24, 1, /* mux */ > >> + BIT(31), /* gate */ > >> + CLK_SET_RATE_PARENT); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_i2s0_clk, "bus-i2s0", ahb_hws, > >> + 0xa20, BIT(0), 0); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_i2s1_clk, "bus-i2s1", ahb_hws, > >> + 0xa20, BIT(1), 0); > >> + > >> +static SUNXI_CCU_M_HW_WITH_MUX_GATE(dmic_clk, "dmic", audio_parents, = 0xa40, > >> + 0, 4, /* M */ > >> + 24, 1, /* mux */ > >> + BIT(31), /* gate */ > >> + CLK_SET_RATE_PARENT); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_dmic_clk, "bus-dmic", ahb_hws, > >> + 0xa4c, BIT(0), 0); > >> + > >> +static SUNXI_CCU_M_HW_WITH_MUX_GATE(audio_codec_dac_clk, "audio-codec= =2Ddac",=20 > >> + audio_parents, 0xa50, > >> + 0, 4, /* M */ > >> + 24, 1, /* mux */ > >> + BIT(31), /* gate */ > >> + CLK_SET_RATE_PARENT); > >> + > >> +static SUNXI_CCU_M_HW_WITH_MUX_GATE(audio_codec_adc_clk, "audio-codec= =2Dadc",=20 > >> + audio_parents, 0xa54, > >> + 0, 4, /* M */ > >> + 24, 1, /* mux */ > >> + BIT(31), /* gate */ > >> + CLK_SET_RATE_PARENT); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_audio_codec_clk, "bus-audio-codec", apb= 0_hws, > >> + 0xa5c, BIT(0), 0); > >> + > >> +/* > >> + * There are OHCI 12M clock source selection bits for the USB 2.0 por= t. > >> + * We will force them to 0 (12M divided from 48M). > >> + */ > >> +static CLK_FIXED_FACTOR_FW_NAME(osc12M_clk, "osc12M", "hosc", 2, 1, 0= ); > >> + > >> +#define SUN8I_V853_USB_CLK_REG 0xa70 > >> + > >> +static SUNXI_CCU_GATE(usb_ohci_clk, "usb", "osc12M", 0x0a70, BIT(31),= 0); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_ohci_clk, "bus-ohci", ahb_hws, 0xa8c, B= IT(0), 0); > >> +static SUNXI_CCU_GATE_HWS(bus_ehci_clk, "bus-ehci", ahb_hws, 0xa8c, B= IT(4), 0); > >> +static SUNXI_CCU_GATE_HWS(bus_otg_clk, "bus-otg", ahb_hws, 0xa8c, BIT= (8), 0); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_dpss_top_clk, "bus-dpss-top", ahb_hws, > >> + 0xabc, BIT(0), 0); > >> + > >> + > >> +static const struct clk_parent_data mipi_dsi_parents[] =3D { > >> + { .fw_name =3D "hosc" }, > >> + { .hw =3D &pll_periph_200M_clk.hw }, > >> + { .hw =3D &pll_periph_150M_clk.hw }, > >> +}; > >> +static SUNXI_CCU_M_DATA_WITH_MUX_GATE(mipi_dsi_clk, "mipi-dsi", mipi_= dsi_parents,=20 > >> + 0xb24, > >> + 0, 4, /* M */ > >> + 24, 3, /* mux */ > >> + BIT(31), /* gate */ > >> + CLK_SET_RATE_PARENT); > >=20 > > CLK_SET_RATE_PARENT doesn't do anything for constant clocks. > >=20 >=20 > ok >=20 > > Best regards, > > Jernej > >=20 > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_mipi_dsi_clk, "bus-mipi-dsi", ahb_hws, > >> + 0xb4c, BIT(0), 0); > >> + > >> + > >> +static const struct clk_hw *tcon_lcd_parents[] =3D { > >> + &pll_video_4x_clk.common.hw, > >> + &pll_periph_2x_clk.common.hw, > >> + &pll_csi_4x_clk.common.hw, > >> +}; > >> +static SUNXI_CCU_MP_HW_WITH_MUX_GATE(tcon_lcd_clk, "tcon-lcd", tcon_l= cd_parents,=20 > >> + 0xb60, > >> + 0, 4, /* M */ > >> + 8, 2, /* P */ > >> + 24, 3, /* mux */ > >> + BIT(31), /* gate */ > >> + CLK_SET_RATE_PARENT); > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_tcon_lcd_clk, "bus-tcon-lcd", ahb_hws, > >> + 0xb7c, BIT(0), 0); > >> + > >> + > >> +static const struct clk_hw *csi_top_parents[] =3D { > >> + &pll_periph_300M_clk.hw, > >> + &pll_periph_400M_clk.hw, > >> + &pll_video_4x_clk.common.hw, > >> + &pll_csi_4x_clk.common.hw, > >> +}; > >> +static SUNXI_CCU_M_HW_WITH_MUX_GATE(csi_top_clk, "csi-top", csi_top_p= arents, 0xc04, > >> + 0, 5, /* M */ > >> + 24, 3, /* mux */ > >> + BIT(31), /* gate */ > >> + 0); > >> + > >> + > >> +static const struct clk_parent_data csi_mclk_parents[] =3D { > >> + { .fw_name =3D "hosc" }, > >> + { .hw =3D &pll_csi_4x_clk.common.hw }, > >> + { .hw =3D &pll_video_4x_clk.common.hw }, > >> + { .hw =3D &pll_periph_2x_clk.common.hw }, > >> +}; > >> +static SUNXI_CCU_M_DATA_WITH_MUX_GATE(csi_mclk0_clk, "csi-mclk0", csi= _mclk_parents,=20 > >> + 0xc08, > >> + 0, 5, /* M */ > >> + 24, 3, /* mux */ > >> + BIT(31), /* gate */ > >> + 0); > >> + > >> +static SUNXI_CCU_M_DATA_WITH_MUX_GATE(csi_mclk1_clk, "csi-mclk1", csi= _mclk_parents,=20 > >> + 0xc0c, > >> + 0, 5, /* M */ > >> + 24, 3, /* mux */ > >> + BIT(31), /* gate */ > >> + 0); > >> + > >> +static SUNXI_CCU_M_DATA_WITH_MUX_GATE(csi_mclk2_clk, "csi-mclk2", csi= _mclk_parents,=20 > >> + 0xc10, > >> + 0, 5, /* M */ > >> + 24, 3, /* mux */ > >> + BIT(31), /* gate */ > >> + 0); > >=20 > > All CSI mclks should be MP type. > >=20 >=20 > Again, these are from the BSP, I=E2=80=99ll update them. >=20 > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_csi_clk, "bus-csi", ahb_hws, > >> + 0xc2c, BIT(0), 0); > >> + > >> + > >> +static SUNXI_CCU_GATE_HWS(bus_wiegand_clk, "bus-wiegand", ahb_hws, > >> + 0xc7c, BIT(0), 0); > >> + > >> + > >> +static const struct clk_parent_data riscv_parents[] =3D { > >> + { .fw_name =3D "hosc" }, > >> + { .fw_name =3D "losc" }, > >> + { .fw_name =3D "iosc" }, > >> + { .hw =3D &pll_periph_600M_clk.hw }, > >> + { .hw =3D &pll_periph_480M_clk.common.hw }, > >> + { .hw =3D &pll_cpu_clk.common.hw }, > >> +}; > >> +static SUNXI_CCU_M_DATA_WITH_MUX(riscv_clk, "riscv-cpu", riscv_parent= s, 0xd00, > >> + 0, 5, /* M */ > >> + 24, 3, /* mux */ > >> + CLK_SET_RATE_PARENT); > >> + > >> +/* The riscv-axi clk must be divided by at least 2. */ > >> +static struct clk_div_table riscv_axi_table[] =3D { > >> + { .val =3D 1, .div =3D 2 }, > >> + { .val =3D 2, .div =3D 3 }, > >> + { .val =3D 3, .div =3D 4 }, > >> + { /* Sentinel */ } > >> +}; > >> +static SUNXI_CCU_DIV_TABLE_HW(riscv_axi_clk, "riscv-axi", &riscv_clk.= common.hw, > >> + 0xd00, 8, 2, riscv_axi_table, 0); > >> + > >> +static SUNXI_CCU_GATE_HWS_WITH_KEY(riscv_core_gate, "riscv-core-gate"= , ahb_hws, > >> + 0xd04, BIT(0), 0); > >> + > >> +static SUNXI_CCU_GATE_HWS(riscv_cfg_gate, "riscv-cfg-gate", ahb_hws, > >> + 0xd0c, BIT(0), 0); > >> + > >> + > >> +static const struct clk_hw *pll_periph_160M_hws[] =3D { > >> + &pll_periph_160M_clk.hw, > >> +}; > >> + > >> +static SUNXI_CCU_GATE_DATA(fanout_24M_clk, "fanout-24M", osc24M, > >> + 0xf30, BIT(0), 0); > >> +static SUNXI_CCU_GATE_DATA_WITH_PREDIV(fanout_12M_clk, "fanout-12M", = osc24M, > >> + 0xf30, BIT(1), 2, 0); > >> +static SUNXI_CCU_GATE_HWS_WITH_PREDIV(fanout_16M_clk, "fanout-16M", p= ll_periph_160M_hws, > >> + 0xf30, BIT(2), 10, 0); > >> +static SUNXI_CCU_GATE_HWS_WITH_PREDIV(fanout_25M_clk, "fanout-25M", p= ll_periph_150M_hws, > >> + 0xf30, BIT(3), 6, 0); > >> + > >> + > >> +/* This clock has a second divider that is not modelled and forced to= 0. */ > >> +#define SUN8I_V853_FANOUT_27M_REG 0xf34 > >> +static const struct clk_hw *fanout_27M_parents[] =3D { > >> + &pll_video_1x_clk.hw, > >> + &pll_csi_clk.hw, > >> + &pll_periph_300M_clk.hw, > >> +}; > >> +static SUNXI_CCU_M_HW_WITH_MUX_GATE(fanout_27M_clk, "fanout-27M",=20 > >> + fanout_27M_parents, 0xf34, > >> + 0, 5, /* M */ > >> + 24, 2, /* mux */ > >> + BIT(31), /* gate */ > >> + 0); > >> +static SUNXI_CCU_M_HWS_WITH_GATE(fanout_pclk_clk, "fanout-pclk", apb0= _hws, 0xf38, > >> + 0, 5, /* M */ > >> + BIT(31), /* gate */ > >> + 0); > >> + > >> +static const struct clk_parent_data fanout_parents[] =3D { > >> + { .fw_name =3D "losc" }, > >> + { .hw =3D &fanout_12M_clk.common.hw }, > >> + { .hw =3D &fanout_16M_clk.common.hw }, > >> + { .hw =3D &fanout_24M_clk.common.hw }, > >> + { .hw =3D &fanout_25M_clk.common.hw }, > >> + { .hw =3D &fanout_27M_clk.common.hw }, > >> + { .hw =3D &fanout_pclk_clk.common.hw }, > >> +}; > >> + > >> +static SUNXI_CCU_MUX_DATA_WITH_GATE(fanout0_clk, "fanout0", fanout_pa= rents, 0xf3c, > >> + 0, 3, /* mux */ > >> + BIT(21), /* gate */ > >> + 0); > >> +static SUNXI_CCU_MUX_DATA_WITH_GATE(fanout1_clk, "fanout1", fanout_pa= rents, 0xf3c, > >> + 3, 3, /* mux */ > >> + BIT(22), /* gate */ > >> + 0); > >> +static SUNXI_CCU_MUX_DATA_WITH_GATE(fanout2_clk, "fanout2", fanout_pa= rents, 0xf3c, > >> + 6, 3, /* mux */ > >> + BIT(23), /* gate */ > >> + 0); > >> + > >> + > >> +static struct ccu_common *sun8i_v853_ccu_clks[] =3D { > >> + &pll_cpu_clk.common, > >> + &pll_ddr_clk.common, > >> + &pll_periph_4x_clk.common, > >> + &pll_periph_2x_clk.common, > >> + &pll_periph_800M_clk.common, > >> + &pll_periph_480M_clk.common, > >> + &pll_video_4x_clk.common, > >> + &pll_csi_4x_clk.common, > >> + &pll_audio_div2_clk.common, > >> + &pll_audio_div5_clk.common, > >> + &pll_audio_4x_clk.common, > >> + &pll_audio_1x_clk.common, > >> + &pll_npu_4x_clk.common, > >> + &cpu_clk.common, > >> + &cpu_axi_clk.common, > >> + &cpu_apb_clk.common, > >> + &ahb_clk.common, > >> + &apb0_clk.common, > >> + &apb1_clk.common, > >> + &de_clk.common, > >> + &bus_de_clk.common, > >> + &g2d_clk.common, > >> + &bus_g2d_clk.common, > >> + &ce_clk.common, > >> + &bus_ce_clk.common, > >> + &ve_clk.common, > >> + &bus_ve_clk.common, > >> + &npu_clk.common, > >> + &bus_npu_clk.common, > >> + &bus_dma_clk.common, > >> + &bus_msgbox0_clk.common, > >> + &bus_msgbox1_clk.common, > >> + &bus_spinlock_clk.common, > >> + &bus_hstimer_clk.common, > >> + &avs_clk.common, > >> + &bus_dbg_clk.common, > >> + &bus_pwm_clk.common, > >> + &bus_iommu_clk.common, > >> + &dram_clk.common, > >> + &mbus_dma_clk.common, > >> + &mbus_ve_clk.common, > >> + &mbus_ce_clk.common, > >> + &mbus_csi_clk.common, > >> + &mbus_isp_clk.common, > >> + &mbus_g2d_clk.common, > >> + &bus_dram_clk.common, > >> + &mmc0_clk.common, > >> + &mmc1_clk.common, > >> + &mmc2_clk.common, > >> + &bus_mmc0_clk.common, > >> + &bus_mmc1_clk.common, > >> + &bus_mmc2_clk.common, > >> + &bus_uart0_clk.common, > >> + &bus_uart1_clk.common, > >> + &bus_uart2_clk.common, > >> + &bus_uart3_clk.common, > >> + &bus_i2c0_clk.common, > >> + &bus_i2c1_clk.common, > >> + &bus_i2c2_clk.common, > >> + &bus_i2c3_clk.common, > >> + &bus_i2c4_clk.common, > >> + &spi0_clk.common, > >> + &spi1_clk.common, > >> + &spi2_clk.common, > >> + &spi3_clk.common, > >> + &bus_spi0_clk.common, > >> + &bus_spi1_clk.common, > >> + &bus_spi2_clk.common, > >> + &bus_spi3_clk.common, > >> + &spif_clk.common, > >> + &bus_spif_clk.common, > >> + &emac_25M_clk.common, > >> + &bus_emac_clk.common, > >> + &bus_gpadc_clk.common, > >> + &bus_ths_clk.common, > >> + &usb_ohci_clk.common, > >> + &bus_ohci_clk.common, > >> + &bus_ehci_clk.common, > >> + &bus_otg_clk.common, > >> + &i2s0_clk.common, > >> + &i2s1_clk.common, > >> + &bus_i2s0_clk.common, > >> + &bus_i2s1_clk.common, > >> + &dmic_clk.common, > >> + &bus_dmic_clk.common, > >> + &audio_codec_dac_clk.common, > >> + &audio_codec_adc_clk.common, > >> + &bus_audio_codec_clk.common, > >> + &bus_dpss_top_clk.common, > >> + &mipi_dsi_clk.common, > >> + &bus_mipi_dsi_clk.common, > >> + &tcon_lcd_clk.common, > >> + &bus_tcon_lcd_clk.common, > >> + &csi_top_clk.common, > >> + &csi_mclk0_clk.common, > >> + &csi_mclk1_clk.common, > >> + &csi_mclk2_clk.common, > >> + &bus_csi_clk.common, > >> + &bus_wiegand_clk.common, > >> + &riscv_clk.common, > >> + &riscv_axi_clk.common, > >> + &riscv_core_gate.common, > >> + &riscv_cfg_gate.common, > >> + &fanout_24M_clk.common, > >> + &fanout_12M_clk.common, > >> + &fanout_16M_clk.common, > >> + &fanout_25M_clk.common, > >> + &fanout_27M_clk.common, > >> + &fanout_pclk_clk.common, > >> + &fanout0_clk.common, > >> + &fanout1_clk.common, > >> + &fanout2_clk.common, > >> +}; > >> + > >> +static struct clk_hw_onecell_data sun8i_v853_hw_clks =3D { > >> + .num =3D CLK_NUMBER, > >> + .hws =3D { > >> + [CLK_OSC12M] =3D &osc12M_clk.hw, > >> + [CLK_PLL_CPU] =3D &pll_cpu_clk.common.hw, > >> + [CLK_PLL_DDR] =3D &pll_ddr_clk.common.hw, > >> + [CLK_PLL_PERIPH_4X] =3D &pll_periph_4x_clk.common.hw, > >> + [CLK_PLL_PERIPH_2X] =3D &pll_periph_2x_clk.common.hw, > >> + [CLK_PLL_PERIPH_800M] =3D &pll_periph_800M_clk.common.hw, > >> + [CLK_PLL_PERIPH_480M] =3D &pll_periph_480M_clk.common.hw, > >> + [CLK_PLL_PERIPH_600M] =3D &pll_periph_600M_clk.hw, > >> + [CLK_PLL_PERIPH_400M] =3D &pll_periph_400M_clk.hw, > >> + [CLK_PLL_PERIPH_300M] =3D &pll_periph_300M_clk.hw, > >> + [CLK_PLL_PERIPH_200M] =3D &pll_periph_200M_clk.hw, > >> + [CLK_PLL_PERIPH_160M] =3D &pll_periph_160M_clk.hw, > >> + [CLK_PLL_PERIPH_150M] =3D &pll_periph_150M_clk.hw, > >> + [CLK_PLL_VIDEO_4X] =3D &pll_video_4x_clk.common.hw, > >> + [CLK_PLL_VIDEO_2X] =3D &pll_video_2x_clk.hw, > >> + [CLK_PLL_VIDEO_1X] =3D &pll_video_1x_clk.hw, > >> + [CLK_PLL_CSI_4X] =3D &pll_csi_4x_clk.common.hw, > >> + [CLK_PLL_AUDIO_DIV2] =3D &pll_audio_div2_clk.common.hw, > >> + [CLK_PLL_AUDIO_DIV5] =3D &pll_audio_div5_clk.common.hw, > >> + [CLK_PLL_AUDIO_4X] =3D &pll_audio_4x_clk.common.hw, > >> + [CLK_PLL_AUDIO_1X] =3D &pll_audio_1x_clk.common.hw, > >> + [CLK_PLL_NPU_4X] =3D &pll_npu_4x_clk.common.hw, > >> + [CLK_CPU] =3D &cpu_clk.common.hw, > >> + [CLK_CPU_AXI] =3D &cpu_axi_clk.common.hw, > >> + [CLK_CPU_APB] =3D &cpu_apb_clk.common.hw, > >> + [CLK_AHB] =3D &ahb_clk.common.hw, > >> + [CLK_APB0] =3D &apb0_clk.common.hw, > >> + [CLK_APB1] =3D &apb1_clk.common.hw, > >> + [CLK_MBUS] =3D &mbus_clk.hw, > >> + [CLK_DE] =3D &de_clk.common.hw, > >> + [CLK_BUS_DE] =3D &bus_de_clk.common.hw, > >> + [CLK_G2D] =3D &g2d_clk.common.hw, > >> + [CLK_BUS_G2D] =3D &bus_g2d_clk.common.hw, > >> + [CLK_CE] =3D &ce_clk.common.hw, > >> + [CLK_BUS_CE] =3D &bus_ce_clk.common.hw, > >> + [CLK_VE] =3D &ve_clk.common.hw, > >> + [CLK_BUS_VE] =3D &bus_ve_clk.common.hw, > >> + [CLK_NPU] =3D &npu_clk.common.hw, > >> + [CLK_BUS_NPU] =3D &bus_npu_clk.common.hw, > >> + [CLK_BUS_DMA] =3D &bus_dma_clk.common.hw, > >> + [CLK_BUS_MSGBOX0] =3D &bus_msgbox0_clk.common.hw, > >> + [CLK_BUS_MSGBOX1] =3D &bus_msgbox1_clk.common.hw, > >> + [CLK_BUS_SPINLOCK] =3D &bus_spinlock_clk.common.hw, > >> + [CLK_BUS_HSTIMER] =3D &bus_hstimer_clk.common.hw, > >> + [CLK_AVS] =3D &avs_clk.common.hw, > >> + [CLK_BUS_DBG] =3D &bus_dbg_clk.common.hw, > >> + [CLK_BUS_PWM] =3D &bus_pwm_clk.common.hw, > >> + [CLK_BUS_IOMMU] =3D &bus_iommu_clk.common.hw, > >> + [CLK_DRAM] =3D &dram_clk.common.hw, > >> + [CLK_MBUS_DMA] =3D &mbus_dma_clk.common.hw, > >> + [CLK_MBUS_VE] =3D &mbus_ve_clk.common.hw, > >> + [CLK_MBUS_CE] =3D &mbus_ce_clk.common.hw, > >> + [CLK_MBUS_CSI] =3D &mbus_csi_clk.common.hw, > >> + [CLK_MBUS_ISP] =3D &mbus_isp_clk.common.hw, > >> + [CLK_MBUS_G2D] =3D &mbus_g2d_clk.common.hw, > >> + [CLK_BUS_DRAM] =3D &bus_dram_clk.common.hw, > >> + [CLK_MMC0] =3D &mmc0_clk.common.hw, > >> + [CLK_MMC1] =3D &mmc1_clk.common.hw, > >> + [CLK_MMC2] =3D &mmc2_clk.common.hw, > >> + [CLK_BUS_MMC0] =3D &bus_mmc0_clk.common.hw, > >> + [CLK_BUS_MMC1] =3D &bus_mmc1_clk.common.hw, > >> + [CLK_BUS_MMC2] =3D &bus_mmc2_clk.common.hw, > >> + [CLK_BUS_UART0] =3D &bus_uart0_clk.common.hw, > >> + [CLK_BUS_UART1] =3D &bus_uart1_clk.common.hw, > >> + [CLK_BUS_UART2] =3D &bus_uart2_clk.common.hw, > >> + [CLK_BUS_UART3] =3D &bus_uart3_clk.common.hw, > >> + [CLK_BUS_I2C0] =3D &bus_i2c0_clk.common.hw, > >> + [CLK_BUS_I2C1] =3D &bus_i2c1_clk.common.hw, > >> + [CLK_BUS_I2C2] =3D &bus_i2c2_clk.common.hw, > >> + [CLK_BUS_I2C3] =3D &bus_i2c3_clk.common.hw, > >> + [CLK_BUS_I2C4] =3D &bus_i2c4_clk.common.hw, > >> + [CLK_SPI0] =3D &spi0_clk.common.hw, > >> + [CLK_SPI1] =3D &spi1_clk.common.hw, > >> + [CLK_SPI2] =3D &spi2_clk.common.hw, > >> + [CLK_SPI3] =3D &spi3_clk.common.hw, > >> + [CLK_BUS_SPI0] =3D &bus_spi0_clk.common.hw, > >> + [CLK_BUS_SPI1] =3D &bus_spi1_clk.common.hw, > >> + [CLK_BUS_SPI2] =3D &bus_spi2_clk.common.hw, > >> + [CLK_BUS_SPI3] =3D &bus_spi3_clk.common.hw, > >> + [CLK_SPIF] =3D &spif_clk.common.hw, > >> + [CLK_BUS_SPIF] =3D &bus_spif_clk.common.hw, > >> + [CLK_EMAC_25M] =3D &emac_25M_clk.common.hw, > >> + [CLK_BUS_EMAC] =3D &bus_emac_clk.common.hw, > >> + [CLK_BUS_GPADC] =3D &bus_gpadc_clk.common.hw, > >> + [CLK_BUS_THS] =3D &bus_ths_clk.common.hw, > >> + [CLK_I2S0] =3D &i2s0_clk.common.hw, > >> + [CLK_I2S1] =3D &i2s1_clk.common.hw, > >> + [CLK_BUS_I2S0] =3D &bus_i2s0_clk.common.hw, > >> + [CLK_BUS_I2S1] =3D &bus_i2s1_clk.common.hw, > >> + [CLK_DMIC] =3D &dmic_clk.common.hw, > >> + [CLK_BUS_DMIC] =3D &bus_dmic_clk.common.hw, > >> + [CLK_AUDIO_CODEC_DAC] =3D &audio_codec_dac_clk.common.hw, > >> + [CLK_AUDIO_CODEC_ADC] =3D &audio_codec_adc_clk.common.hw, > >> + [CLK_BUS_AUDIO_CODEC] =3D &bus_audio_codec_clk.common.hw, > >> + [CLK_USB_OHCI] =3D &usb_ohci_clk.common.hw, > >> + [CLK_BUS_OHCI] =3D &bus_ohci_clk.common.hw, > >> + [CLK_BUS_EHCI] =3D &bus_ehci_clk.common.hw, > >> + [CLK_BUS_OTG] =3D &bus_otg_clk.common.hw, > >> + [CLK_BUS_DPSS_TOP] =3D &bus_dpss_top_clk.common.hw, > >> + [CLK_MIPI_DSI] =3D &mipi_dsi_clk.common.hw, > >> + [CLK_BUS_MIPI_DSI] =3D &bus_mipi_dsi_clk.common.hw, > >> + [CLK_TCON_LCD] =3D &tcon_lcd_clk.common.hw, > >> + [CLK_BUS_TCON_LCD] =3D &bus_tcon_lcd_clk.common.hw, > >> + [CLK_CSI_TOP] =3D &csi_top_clk.common.hw, > >> + [CLK_CSI_MCLK0] =3D &csi_mclk0_clk.common.hw, > >> + [CLK_CSI_MCLK1] =3D &csi_mclk1_clk.common.hw, > >> + [CLK_CSI_MCLK2] =3D &csi_mclk2_clk.common.hw, > >> + [CLK_BUS_CSI] =3D &bus_csi_clk.common.hw, > >> + [CLK_BUS_WIEGAND] =3D &bus_wiegand_clk.common.hw, > >> + [CLK_RISCV] =3D &riscv_clk.common.hw, > >> + [CLK_RISCV_AXI] =3D &riscv_axi_clk.common.hw, > >> + [CLK_RISCV_CORE_GATE] =3D &riscv_core_gate.common.hw, > >> + [CLK_RISCV_CFG_GATE] =3D &riscv_cfg_gate.common.hw, > >> + [CLK_FANOUT_24M] =3D &fanout_24M_clk.common.hw, > >> + [CLK_FANOUT_16M] =3D &fanout_16M_clk.common.hw, > >> + [CLK_FANOUT_12M] =3D &fanout_12M_clk.common.hw, > >> + [CLK_FANOUT_25M] =3D &fanout_25M_clk.common.hw, > >> + [CLK_FANOUT_27M] =3D &fanout_27M_clk.common.hw, > >> + [CLK_FANOUT_PCLK] =3D &fanout_pclk_clk.common.hw, > >> + [CLK_FANOUT0] =3D &fanout0_clk.common.hw, > >> + [CLK_FANOUT1] =3D &fanout1_clk.common.hw, > >> + [CLK_FANOUT2] =3D &fanout2_clk.common.hw, > >> + }, > >> +}; > >> + > >> +static struct ccu_reset_map sun8i_v853_ccu_resets[] =3D { > >> + [RST_MBUS] =3D { 0x540, BIT(30) }, > >> + [RST_BUS_DE] =3D { 0x60c, BIT(16) }, > >> + [RST_BUS_G2D] =3D { 0x63c, BIT(16) }, > >> + [RST_BUS_CE] =3D { 0x68c, BIT(16) | BIT(17)}, > >> + [RST_BUS_VE] =3D { 0x69c, BIT(16) }, > >> + [RST_BUS_NPU] =3D { 0x6ec, BIT(16) }, > >> + [RST_BUS_DMA] =3D { 0x70c, BIT(16) }, > >> + [RST_BUS_MSGBOX0] =3D { 0x71c, BIT(16) }, > >> + [RST_BUS_MSGBOX1] =3D { 0x71c, BIT(17) }, > >> + [RST_BUS_SPINLOCK] =3D { 0x72c, BIT(16) }, > >> + [RST_BUS_HSTIMER] =3D { 0x73c, BIT(16) }, > >> + [RST_BUS_DBG] =3D { 0x78c, BIT(16) }, > >> + [RST_BUS_PWM] =3D { 0x7ac, BIT(16) }, > >> + [RST_BUS_DRAM] =3D { 0x80c, BIT(16) }, > >> + [RST_BUS_MMC0] =3D { 0x84c, BIT(16) }, > >> + [RST_BUS_MMC1] =3D { 0x84c, BIT(17) }, > >> + [RST_BUS_MMC2] =3D { 0x84c, BIT(18) }, > >> + [RST_BUS_UART0] =3D { 0x90c, BIT(16) }, > >> + [RST_BUS_UART1] =3D { 0x90c, BIT(17) }, > >> + [RST_BUS_UART2] =3D { 0x90c, BIT(18) }, > >> + [RST_BUS_UART3] =3D { 0x90c, BIT(19) }, > >> + [RST_BUS_I2C0] =3D { 0x91c, BIT(16) }, > >> + [RST_BUS_I2C1] =3D { 0x91c, BIT(17) }, > >> + [RST_BUS_I2C2] =3D { 0x91c, BIT(18) }, > >> + [RST_BUS_I2C3] =3D { 0x91c, BIT(19) }, > >> + [RST_BUS_I2C4] =3D { 0x91c, BIT(20) }, > >> + [RST_BUS_SPI0] =3D { 0x96c, BIT(16) }, > >> + [RST_BUS_SPI1] =3D { 0x96c, BIT(17) }, > >> + [RST_BUS_SPI2] =3D { 0x96c, BIT(18) }, > >> + [RST_BUS_SPI3] =3D { 0x96c, BIT(19) }, > >> + [RST_BUS_SPIF] =3D { 0x96c, BIT(20) }, > >> + [RST_BUS_EMAC] =3D { 0x97c, BIT(16) }, > >> + [RST_BUS_GPADC] =3D { 0x9ec, BIT(16) }, > >> + [RST_BUS_THS] =3D { 0x9fc, BIT(16) }, > >> + [RST_BUS_I2S0] =3D { 0xa20, BIT(16) }, > >> + [RST_BUS_I2S1] =3D { 0xa20, BIT(17) }, > >> + [RST_BUS_DMIC] =3D { 0xa4c, BIT(16) }, > >> + [RST_BUS_AUDIO_CODEC] =3D { 0xa5c, BIT(16) }, > >> + [RST_USB_PHY] =3D { 0xa70, BIT(30) }, > >> + [RST_BUS_OHCI] =3D { 0xa8c, BIT(16) }, > >> + [RST_BUS_EHCI] =3D { 0xa8c, BIT(20) }, > >> + [RST_BUS_OTG] =3D { 0xa8c, BIT(24) }, > >> + [RST_BUS_DPSS_TOP] =3D { 0xabc, BIT(16) }, > >> + [RST_BUS_MIPI_DSI] =3D { 0xb4c, BIT(16) }, > >> + [RST_BUS_TCON_LCD] =3D { 0xb7c, BIT(16) }, > >> + [RST_BUS_CSI] =3D { 0xc2c, BIT(16) }, > >> + [RST_BUS_WIEGAND] =3D { 0xc7c, BIT(16) }, > >> + [RST_RISCV_SYS_APB] =3D { 0xd04, BIT(2), CCU_FEATURE_KEY_FIELD }, > >> + [RST_RISCV_SOFT] =3D { 0xd04, BIT(1), CCU_FEATURE_KEY_FIELD }, > >> + [RST_RISCV_CFG] =3D { 0xd0c, BIT(16) } > >> +}; > >> + > >> +static const struct sunxi_ccu_desc sun8i_v853_ccu_desc =3D { > >> + .ccu_clks =3D sun8i_v853_ccu_clks, > >> + .num_ccu_clks =3D ARRAY_SIZE(sun8i_v853_ccu_clks), > >> + > >> + .hw_clks =3D &sun8i_v853_hw_clks, > >> + > >> + .resets =3D sun8i_v853_ccu_resets, > >> + .num_resets =3D ARRAY_SIZE(sun8i_v853_ccu_resets), > >> +}; > >> + > >> +static const u32 pll_regs[] =3D { > >> + SUN8I_V853_PLL_CPU_REG, > >> + SUN8I_V853_PLL_DDR_REG, > >> + SUN8I_V853_PLL_PERIPH_REG, > >> + SUN8I_V853_PLL_VIDEO_REG, > >> + SUN8I_V853_PLL_CSI_REG, > >> + SUN8I_V853_PLL_AUDIO_REG, > >> + SUN8I_V853_PLL_NPU_REG, > >> +}; > >> + > >> +static int sun8i_v853_ccu_probe(struct platform_device *pdev) > >> +{ > >> + void __iomem *reg; > >> + u32 val; > >> + int i, ret; > >> + > >> + reg =3D devm_platform_ioremap_resource(pdev, 0); > >> + if (IS_ERR(reg)) > >> + return PTR_ERR(reg); > >> + > >> + /* Enable the enable, LDO, and lock bits on all PLLs. */ > >> + for (i =3D 0; i < ARRAY_SIZE(pll_regs); i++) { > >> + val =3D readl(reg + pll_regs[i]); > >> + val |=3D BIT(31) | BIT(30) | BIT(29); > >> + writel(val, reg + pll_regs[i]); > >> + } > >> + > >> + /* Force PLL_CPU factor M to 0. */ > >> + val =3D readl(reg + SUN8I_V853_PLL_CPU_REG); > >> + val &=3D ~GENMASK(1, 0); > >> + writel(val, reg + SUN8I_V853_PLL_CPU_REG); > >> + > >> + /* > >> + * Force OHCI 12M clock source to 00 (12MHz divided from 48MHz) > >> + * > >> + * This clock mux is still mysterious, and the code just enforces > >> + * it to have a valid clock parent. > >> + */ > >> + val =3D readl(reg + SUN8I_V853_USB_CLK_REG); > >> + val &=3D ~GENMASK(25, 24); > >> + writel(val, reg + SUN8I_V853_USB_CLK_REG); > >> + > >> + /* Force fanout-27M factor N to 0. */ > >> + val =3D readl(reg + SUN8I_V853_FANOUT_27M_REG); > >> + val &=3D ~GENMASK(9, 8); > >> + writel(val, reg + SUN8I_V853_FANOUT_27M_REG); > >> + > >> + ret =3D devm_sunxi_ccu_probe(&pdev->dev, reg, &sun8i_v853_ccu_desc); > >> + if (ret) > >> + return ret; > >> + > >> + return 0; > >> +} > >> + > >> +static const struct of_device_id sun8i_v853_ccu_ids[] =3D { > >> + { .compatible =3D "allwinner,sun8i-v853-ccu" }, > >> + { } > >> +}; > >> + > >> +static struct platform_driver sun8i_v853_ccu_driver =3D { > >> + .probe =3D sun8i_v853_ccu_probe, > >> + .driver =3D { > >> + .name =3D "sun8i-v853-ccu", > >> + .suppress_bind_attrs =3D true, > >> + .of_match_table =3D sun8i_v853_ccu_ids, > >> + }, > >> +}; > >> +module_platform_driver(sun8i_v853_ccu_driver); > >> + > >> +MODULE_IMPORT_NS("SUNXI_CCU"); > >> +MODULE_DESCRIPTION("Support for the Allwinner V853 CCU"); > >> +MODULE_LICENSE("GPL"); > >> diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v853.h b/drivers/clk/sunxi= =2Dng/ccu-sun8i-v853.h > >> new file mode 100644 > >> index 000000000000..f1b2a4d0bcd3 > >> --- /dev/null > >> +++ b/drivers/clk/sunxi-ng/ccu-sun8i-v853.h > >> @@ -0,0 +1,14 @@ > >> +/* SPDX-License-Identifier: GPL-2.0 */ > >> +/* > >> + * Copyright (C) 2024 Andras Szemzo > >> + */ > >> + > >> +#ifndef _CCU_SUN8I_V853_H_ > >> +#define _CCU_SUN8I_V853_H_ > >> + > >> +#include > >> +#include > >> + > >> +#define CLK_NUMBER (CLK_FANOUT2 + 1) > >> + > >> +#endif > >>=20 > >=20 > >=20 > >=20 > >=20 >=20 >=20 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 5C39FC021B1 for ; Thu, 20 Feb 2025 16:05:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=DqhaRAI2MW2Y9C6aIpilwBf3KAiR6FH3Wo2XHq5qKvw=; b=iAz6wgKjBWMfhF F21EnZN1AhalmlJNrMmfGzQBj6DbVavmPi7vDrqOCDCeJo9GFb+pC75qUcu3Hd1OdQhFSj3QF72EI UhsbeT0RgC/EDUx/CCrEA8sYdwywmW90SHi5UL4xDJZrCusB1Vm5PidtwozvJoM0cJoRSj3IHd9Aa P2DD1OFQxJZ+W47uK5PPzg1PBsHAyJDmEFBUNEQhxBZPk2TVE9YLx0OqF3RBgydAgHrbXM7Dq+a5o KW98JrK6nXjM4CtxncZU+N6urWTss8I2kjs70D9N5MEmfZltBv88Pjz70V6v2FUWbHSqoidBQ+7P7 xMCpbS3yCatk8HnxqlZA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tl93T-00000001kZP-0Qfk; Thu, 20 Feb 2025 16:05:39 +0000 Received: from mail-wr1-x42d.google.com ([2a00:1450:4864:20::42d]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tl90s-00000001jo9-14JL; Thu, 20 Feb 2025 16:03:01 +0000 Received: by mail-wr1-x42d.google.com with SMTP id ffacd0b85a97d-388cae9eb9fso571032f8f.3; Thu, 20 Feb 2025 08:02:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740067376; x=1740672176; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=I6bguq6qpVlMqUSZtWfQmgGW97HG/Gksgq8JkfafFAw=; b=kK+Eohf3MOPHixOsSR6/c9hX5ZwsdrcGQ3w1tQXdJOwcYGvTWSkEVJo+Y6KD2DIRLz bn1O8cgn5NR6H4hjV68M2wEVr6pc+rNblqy4uHzslkU2s60KGRxotkmG+f0ZbSPksYeu ffChP40/cJko07BUL2WZBJUqymowahI7N/REk87Mte8xs1JviBFwLM5tCt3knEIFQdco TyUGtMd3uUkFaPfC1yjgzwNGEZ4KaYWSygPHCxfG3jjPZonqpMpRQY/pXIkSdVvh5xtb 5ziVPDgGUFIGFqI5RRpJr0B0Wfg5RwIa3O2AYDwEhurBeDoNnxbPFHik9lktWUR9P12a Q2dA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740067376; x=1740672176; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=I6bguq6qpVlMqUSZtWfQmgGW97HG/Gksgq8JkfafFAw=; b=b2BbXYgHs6bC+oRoCalkLp78s9zDh87mTx0KZDxOtqMHL7XZVr4NxNwFcGynsEMBuZ /q+PgGTFptCalvfkWYlY7Ekfc45MS3tkSQFLY0pENafCDcbijN2+e28M3Pst8CElpPTE Gp9qanHvW1TOxUxeLH8OrCPPQr00ePVTt3r5hgONF1s/iO/fW1aatvUZjXhcsyQID8IB xZctm1QbnwKa44zT2aDFcO08Dsq309qEHDYhrnx1Vhn8HzdL2OqJKNCjZd0RXzRcpWbf byFbH4LwU+oLSS+b3mUJuI6BrCGLeLssTR4z84Up91njVFA0GnhvTirqEbHDKrDmDcTf MzIg== X-Forwarded-Encrypted: i=1; AJvYcCVVKzUAzkBAEDTC252jua29e2qTUa3fjK2rRz0KjyFk1j1xBcap3IbHxIBY+nZUO40dOBHTrsSa3lTqTAQ3/Hil@lists.infradead.org, AJvYcCWv99CtFXI9GN7DwUPXRPGseg8Mb7jGWuwTWKa4JEHRUGD9lEUOh5Eezj+UpmAmMiduh3rxi8eZe8qr@lists.infradead.org, AJvYcCXaqUUZNmpzRIkAiSx7zwWXRlQlqFEBBasuYQAmLw/WDPt+Wb9oilb4pckPrGruTLys+IsnaTDBF8fgS+M=@lists.infradead.org X-Gm-Message-State: AOJu0Yzy0mu80n8O+g/nqnkvJd+yqoDzInIdhpHerHw9e4rSY1QVbRMj rSJRtMt/ZFoEeraKeAyAo4GkDIRBKyPk2bJillfsRCkv84YgBEnE X-Gm-Gg: ASbGnctIJaCYjnrGmo9Rmq5obeD2YXhbZefR/CaopUBJzepElbClpOuwuL7o5LwoLKE g9pOmGwqiQGK7m8JsbYtkFuQ2Y5dsxeyWOR1pUiuRbIpUSE3vKHN/x6OtRlXiqdb3aJsLwDnhG9 F+5nUnFOcHXya9pPAzsEcPFxdtF7JE+klNp8d3DWw/TOdcwfpIU+Znc2l/pRZeIBptbU2UU8f2Q 9Nup9jPxEwZ5idLKhviyjnFx6KplBWIR9tzTtjjV6pe0vuPTKkchcAvw91QkAb48HmV1tNvEaA2 BMZLjJlLUyx0ewDp95pP0LYairJe2s1RWD5mtNBwVatxBp7hm6mxHAsXv984XjhnfTA= X-Google-Smtp-Source: AGHT+IFaSQMhNqktmGECobEqwU6OE3XbGvTjrJbpApSBbFFxt7vAWy1C/f+ZaE7jio6splvGI0mHpQ== X-Received: by 2002:a5d:64ed:0:b0:38f:2a84:7542 with SMTP id ffacd0b85a97d-38f33f5234emr20594763f8f.28.1740067375670; Thu, 20 Feb 2025 08:02:55 -0800 (PST) Received: from jernej-laptop.localnet (86-58-6-171.dynamic.telemach.net. [86.58.6.171]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-43993847f39sm83376845e9.14.2025.02.20.08.02.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Feb 2025 08:02:55 -0800 (PST) From: Jernej =?UTF-8?B?xaBrcmFiZWM=?= To: =?UTF-8?B?QW5kcsOhcyBTemVtesWR?= Cc: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen-Yu Tsai , Samuel Holland , Linus Walleij , Philipp Zabel , Maxime Ripard , Vinod Koul , Kishon Vijay Abraham I , Ulf Hansson , Paul Walmsley , Palmer Dabbelt , Albert Ou , Uwe =?UTF-8?B?S2xlaW5lLUvDtm5pZw==?= , Florian Fainelli , linux-clk@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-gpio@vger.kernel.org, linux-pm@vger.kernel.org, linux-riscv@lists.infradead.org Subject: Re: [PATCH v2 04/10] clk: sunxi-ng: add CCU drivers for V853 Date: Thu, 20 Feb 2025 17:02:53 +0100 Message-ID: <1858640.8hzESeGDPO@jernej-laptop> In-Reply-To: <25D5F3C6-47BB-44B1-9FE3-12B6B8F5F901@gmail.com> References: <20250205125225.1152849-1-szemzo.andras@gmail.com> <3596612.V25eIC5XRa@jernej-laptop> <25D5F3C6-47BB-44B1-9FE3-12B6B8F5F901@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250220_080258_319522_23BC7615 X-CRM114-Status: GOOD ( 32.82 ) X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org RG5lIMSNZXRydGVrLCAyMC4gZmVicnVhciAyMDI1IG9iIDEwOjI4OjQzIFNyZWRuamVldnJvcHNr aSBzdGFuZGFyZG5pIMSNYXMgamUgQW5kcsOhcyBTemVtesWRIG5hcGlzYWwoYSk6Cj4gSGksCj4g Cj4gVGhhbmtzIGZvciB5b3VyIHJldmlldyEKPiAKPiA+IE9uIDE5IEZlYiAyMDI1LCBhdCAyMToy MSwgSmVybmVqIMWga3JhYmVjIDxqZXJuZWouc2tyYWJlY0BnbWFpbC5jb20+IHdyb3RlOgo+ID4g Cj4gPiBEbmUgc3JlZGEsIDUuIGZlYnJ1YXIgMjAyNSBvYiAxMzo1MjoxOSBTcmVkbmplZXZyb3Bz a2kgc3RhbmRhcmRuaSDEjWFzIGplIEFuZHJhcyBTemVtem8gbmFwaXNhbChhKToKPiA+PiBWODUz IGhhcyBzaW1pbGFyIGdhdGVzL3Jlc2V0cyBsaWtlIGV4aXN0aW5nIEFsbHdpbm5lciBTT0NzLiBB ZGQgc3VwcG9ydCBmb3IgaXQncyBDQ1UgYW5kIFBSQ00gQ0NVLgo+ID4+IAo+ID4+IFNpZ25lZC1v ZmYtYnk6IEFuZHJhcyBTemVtem8gPHN6ZW16by5hbmRyYXNAZ21haWwuY29tPgo+ID4+IC0tLQo+ ID4+IGRyaXZlcnMvY2xrL3N1bnhpLW5nL0tjb25maWcgICAgICAgICAgICB8ICAgMTAgKwo+ID4+ IGRyaXZlcnMvY2xrL3N1bnhpLW5nL01ha2VmaWxlICAgICAgICAgICB8ICAgIDQgKwo+ID4+IGRy aXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS12ODUzLXIuYyB8ICAxMjAgKysrCj4gPj4gZHJp dmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMtci5oIHwgICAxNCArCj4gPj4gZHJpdmVy cy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMuYyAgIHwgMTE0NSArKysrKysrKysrKysrKysr KysrKysrKwo+ID4+IGRyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS12ODUzLmggICB8ICAg MTQgKwo+ID4+IDYgZmlsZXMgY2hhbmdlZCwgMTMwNyBpbnNlcnRpb25zKCspCj4gPj4gY3JlYXRl IG1vZGUgMTAwNjQ0IGRyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS12ODUzLXIuYwo+ID4+ IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktdjg1My1y LmgKPiA+PiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhp LXY4NTMuYwo+ID4+IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Ut c3VuOGktdjg1My5oCj4gPj4gCj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpLW5n L0tjb25maWcgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9LY29uZmlnCj4gPj4gaW5kZXggYjU0NzE5 OGEyYzY1Li5lMjU3MzczMTc3ZTAgMTAwNjQ0Cj4gPj4gLS0tIGEvZHJpdmVycy9jbGsvc3VueGkt bmcvS2NvbmZpZwo+ID4+ICsrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL0tjb25maWcKPiA+PiBA QCAtMTIsNiArMTIsMTYgQEAgY29uZmlnIFNVTklWX0YxQzEwMFNfQ0NVCj4gPj4gZGVmYXVsdCB5 Cj4gPj4gZGVwZW5kcyBvbiBNQUNIX1NVTklWIHx8IENPTVBJTEVfVEVTVAo+ID4+IAo+ID4+ICtj b25maWcgU1VOOElfVjg1M19DQ1UKPiA+PiArIHRyaXN0YXRlICJTdXBwb3J0IGZvciB0aGUgQWxs d2lubmVyIFY4NTMvVjg1MXMvVjg1MVNFIENDVSIKPiA+PiArIGRlZmF1bHQgTUFDSF9TVU44SQo+ ID4+ICsgZGVwZW5kcyBvbiBNQUNIX1NVTjhJIHx8IENPTVBJTEVfVEVTVAo+ID4+ICsKPiA+PiAr Y29uZmlnIFNVTjhJX1Y4NTNfUl9DQ1UKPiA+PiArIHRyaXN0YXRlICJTdXBwb3J0IGZvciB0aGUg QWxsd2lubmVyIFY4NTMvVjg1MXMvVjg1MVNFIFBSQ00gQ0NVIgo+ID4+ICsgZGVmYXVsdCBNQUNI X1NVTjhJCj4gPj4gKyBkZXBlbmRzIG9uIE1BQ0hfU1VOOEkgfHwgQ09NUElMRV9URVNUCj4gPiAK PiA+IEdlbmVyYWxseSwgdGhpcyBhcmUgdHdvIHBhdGNoZXMsIG9uZSBmb3IgZWFjaCBkcml2ZXIu Cj4gPiAKPiA+PiArCj4gPj4gY29uZmlnIFNVTjIwSV9EMV9DQ1UKPiA+PiB0cmlzdGF0ZSAiU3Vw cG9ydCBmb3IgdGhlIEFsbHdpbm5lciBEMS9SNTI4L1QxMTMgQ0NVIgo+ID4+IGRlZmF1bHQgeQo+ ID4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9NYWtlZmlsZSBiL2RyaXZlcnMv Y2xrL3N1bnhpLW5nL01ha2VmaWxlCj4gPj4gaW5kZXggNmIzYWUyYjYyMGRiLi5iODc5Mjg0NjJl MTUgMTAwNjQ0Cj4gPj4gLS0tIGEvZHJpdmVycy9jbGsvc3VueGktbmcvTWFrZWZpbGUKPiA+PiAr KysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9NYWtlZmlsZQo+ID4+IEBAIC0yNSw2ICsyNSw4IEBA IHN1bnhpLWNjdS15ICs9IGNjdV9tcC5vCj4gPj4gCj4gPj4gIyBTb0Mgc3VwcG9ydAo+ID4+IG9i ai0kKENPTkZJR19TVU5JVl9GMUMxMDBTX0NDVSkgKz0gc3VuaXYtZjFjMTAwcy1jY3Uubwo+ID4+ ICtvYmotJChDT05GSUdfU1VOOElfVjg1M19DQ1UpICs9IHN1bjhpLXY4NTMtY2N1Lm8KPiA+PiAr b2JqLSQoQ09ORklHX1NVTjhJX1Y4NTNfUl9DQ1UpICs9IHN1bjhpLXY4NTMtci1jY3Uubwo+ID4g Cj4gPiBQdXQgaXQgdG8gb3RoZXIgc3VuOGkgZHJpdmVycy4KPiA+IAo+ID4+IG9iai0kKENPTkZJ R19TVU4yMElfRDFfQ0NVKSArPSBzdW4yMGktZDEtY2N1Lm8KPiA+PiBvYmotJChDT05GSUdfU1VO MjBJX0QxX1JfQ0NVKSArPSBzdW4yMGktZDEtci1jY3Uubwo+ID4+IG9iai0kKENPTkZJR19TVU41 MElfQTY0X0NDVSkgKz0gc3VuNTBpLWE2NC1jY3Uubwo+ID4+IEBAIC01MCw2ICs1Miw4IEBAIG9i ai0kKENPTkZJR19TVU45SV9BODBfQ0NVKSArPSBzdW45aS1hODAtZGUtY2N1Lm8KPiA+PiBvYmot JChDT05GSUdfU1VOOUlfQTgwX0NDVSkgKz0gc3VuOWktYTgwLXVzYi1jY3Uubwo+ID4+IAo+ID4+ IHN1bml2LWYxYzEwMHMtY2N1LXkgKz0gY2N1LXN1bml2LWYxYzEwMHMubwo+ID4+ICtzdW44aS12 ODUzLWNjdS15ICs9IGNjdS1zdW44aS12ODUzLm8KPiA+PiArc3VuOGktdjg1My1yLWNjdS15ICs9 IGNjdS1zdW44aS12ODUzLXIubwo+ID4gCj4gPiBEaXR0by4KPiA+IAo+IAo+IG9rCj4gCj4gPj4g c3VuMjBpLWQxLWNjdS15ICs9IGNjdS1zdW4yMGktZDEubwo+ID4+IHN1bjIwaS1kMS1yLWNjdS15 ICs9IGNjdS1zdW4yMGktZDEtci5vCj4gPj4gc3VuNTBpLWE2NC1jY3UteSArPSBjY3Utc3VuNTBp LWE2NC5vCj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS12 ODUzLXIuYyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS12ODUzLXIuYwo+ID4+IG5l dyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPj4gaW5kZXggMDAwMDAwMDAwMDAwLi5iZDYwZTAwY2RhN2YK PiA+PiAtLS0gL2Rldi9udWxsCj4gPj4gKysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1 bjhpLXY4NTMtci5jCj4gPj4gQEAgLTAsMCArMSwxMjAgQEAKPiA+PiArLy8gU1BEWC1MaWNlbnNl LUlkZW50aWZpZXI6IEdQTC0yLjAKPiA+PiArLyoKPiA+PiArICogQ29weXJpZ2h0IChDKSAyMDI1 IEFuZHJhcyBTemVtem8gPHN6ZW16by5hbmRyYXNAZ21haWwuY29tPgo+ID4+ICsgKgo+ID4+ICsg KiBCYXNlZCBvbiBjY3Utc3VuMjBpLWQxLXIuYyBieSBTYW11ZWwgSG9sbGFuZC4KPiA+PiArICov Cj4gPj4gKwo+ID4+ICsjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+Cj4gPj4gKyNpbmNs dWRlIDxsaW51eC9tb2R1bGUuaD4KPiA+PiArI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2Rldmlj ZS5oPgo+ID4+ICsKPiA+PiArI2luY2x1ZGUgImNjdV9jb21tb24uaCIKPiA+PiArI2luY2x1ZGUg ImNjdV9yZXNldC5oIgo+ID4+ICsKPiA+PiArI2luY2x1ZGUgImNjdV9nYXRlLmgiCj4gPj4gKyNp bmNsdWRlICJjY3VfbXAuaCIKPiA+PiArCj4gPj4gKyNpbmNsdWRlICJjY3Utc3VuOGktdjg1My1y LmgiCj4gPj4gKwo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19wYXJlbnRfZGF0YSByX2Fo Yl9hcGIwX3BhcmVudHNbXSA9IHsKPiA+PiArIHsgLmZ3X25hbWUgPSAiaG9zYyIgfSwKPiA+PiAr IHsgLmZ3X25hbWUgPSAibG9zYyIgfSwKPiA+PiArIHsgLmZ3X25hbWUgPSAiaW9zYyIgfSwKPiA+ PiArIHsgLmZ3X25hbWUgPSAicGxsLXBlcmlwaCIgfSwKPiA+PiArIHsgLmZ3X25hbWUgPSAicGxs LWF1ZGlvIiB9Cj4gPj4gK307Cj4gPj4gKwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX01QX0RBVEFf V0lUSF9NVVgocl9haGJfY2xrLCAici1haGIiLAo+ID4+ICsgIHJfYWhiX2FwYjBfcGFyZW50cywg MHgwMDAsCj4gPj4gKyAgMCwgNSwgLyogTSAqLwo+ID4+ICsgIDgsIDIsIC8qIFAgKi8KPiA+PiAr ICAyNCwgMywgLyogbXV4ICovCj4gPj4gKyAgMCk7Cj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg Y2xrX2h3ICpyX2FoYl9odyA9ICZyX2FoYl9jbGsuY29tbW9uLmh3Owo+ID4+ICsKPiA+PiArc3Rh dGljIFNVTlhJX0NDVV9NUF9EQVRBX1dJVEhfTVVYKHJfYXBiMF9jbGssICJyLWFwYjAiLAo+ID4+ ICsgIHJfYWhiX2FwYjBfcGFyZW50cywgMHgwMGMsCj4gPj4gKyAgMCwgNSwgLyogTSAqLwo+ID4+ ICsgIDgsIDIsIC8qIFAgKi8KPiA+PiArICAyNCwgMywgLyogbXV4ICovCj4gPj4gKyAgMCk7Cj4g Pj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2h3ICpyX2FwYjBfaHcgPSAmcl9hcGIwX2Nsay5j b21tb24uaHc7Cj4gPiAKPiA+IFdoZXJlIGNhbiBJIGxvb2sgZm9yIGFib3ZlIGNsb2Nrcz8gVGhl cmUgYXJlIG5vdCBkZXNjcmliZWQgaW4gQlNQIGRyaXZlci4KPiA+IAo+IAo+IEFzIHRoZSBvcmln aW5hbCBCU1DigJlzIFBSQ00gZHJpdmVyIGhhcyBhbiB1bmFjY2VwdGFibGUgbGljZW5jZSwgSSBo YWQgdG8gcmV3cml0ZSB0aGlzIGRyaXZlci4gIFRoaXMgSVAgYmxvY2sKPiBpc27igJl0IGRvY3Vt ZW50ZWQgaW4gdGhlIFY4NTMgbWFudWFsLCBzbyBhcyBBbmRyZSBzdWdnZXN0ZWQsIEkgdXNlZCB0 aGUgQTUyMyBtYW51YWwsIGFuZCB0aGUgRDEvVDExMwo+IFBSQ00gZHJpdmVyLiBUaGFuIEkgcGVl ay9wb2tlIHRoZSByZWdpc3RlcnMgdG8gY2hlY2sgaWYgaXTigJlzIHZhbGlkIG9yIG5vdC4gCj4g Cj4gYXdib290PiByZWFkMzIgMHg3MDEwMDBjCj4gMHgwNzAxMDAwYzogMHgwZjAwMDMxZgo+IGF3 Ym9vdD4gcmVhZDMyIDB4NzAxMDAwMAo+IDB4MDcwMTAwMDA6IDB4MDAwMDAwMDAKPiBhd2Jvb3Q+ IHdyaXRlMzIgMHg3MDEwMDAwIDB4ZmZmZmZmZmYKPiBhd2Jvb3Q+IHJlYWQzMiAweDcwMTAwMDAK PiAweDA3MDEwMDAwOiAweDA3MDAwMzFmCj4gCj4gVGhleSBhcmUgdGhlcmUsIEnigJltIG5vdCBz dXJlIGFib3V0IGl04oCZcyB1c2FnZS4KCk9rLCBzbyB0aGV5IGV4aXN0IGFuZCBmb3JtYXQgaXMg b2sgdG9vLiBPbmx5IHF1ZXN0aW9uIGlzIGlmIHBhcmVudHMgYXJlIGNvcnJlY3QuCkkgY2hlY2tl ZCBjY3Utc3VuOGl3MjAtci5jIGZyb20gb25lIEJTUCBhbmQgaXQgaGFzIHNpbWlsYXIgY2xvY2tz LiBIb3dldmVyLAppdCdzIG1pc3NpbmcgcGxsLWF1ZGlvIGFuZCBwbGwtcGVyaXBoIGlzIHByZS1k aXZpZGVkIGJ5IDMsIHdoaWNoIGlzIHNhbWUgYXMgb24KQTUyMy4KClNvIG15IHN1Z2dlc3Rpb24g aXMgdG8gcmVtb3ZlIHBsbC1hdWRpbyBhbmQgYWRqdXN0IHBsbC1wZXJpcGggdG8gaGF2ZQpwcmVk aXZpZGVyLgoKPiAKPiAKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVz X3JfdHdkX2NsaywgImJ1cy1yLXR3ZCIsICZyX2FwYjBfaHcsIAo+ID4+ICsgIDB4MTJjLCBCSVQo MCksIDApOwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19yX3BwdV9jbGssICJi dXMtci1wcHUiLCAmcl9hcGIwX2h3LAo+ID4+ICsgIDB4MWFjLCBCSVQoMCksIDApOwo+ID4+ICtz dGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19yX3J0Y19jbGssICJidXMtci1ydGMiLCAmcl9h aGJfaHcsCj4gPj4gKyAgMHgyMGMsIEJJVCgwKSwgMCk7Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1Vf R0FURV9IV1MoYnVzX3JfY3B1Y2ZnX2NsaywgImJ1cy1yLWNwdWNmZyIsICZyX2FwYjBfaHcsCj4g Pj4gKyAgMHgyMmMsIEJJVCgwKSwgMCk7Cj4gPj4gKwo+ID4+ICtzdGF0aWMgc3RydWN0IGNjdV9j b21tb24gKnN1bjhpX3Y4NTNfcl9jY3VfY2xrc1tdID0gewo+ID4+ICsgJnJfYWhiX2Nsay5jb21t b24sCj4gPj4gKyAmcl9hcGIwX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX3JfdHdkX2Nsay5jb21t b24sCj4gPj4gKyAmYnVzX3JfcHB1X2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX3JfcnRjX2Nsay5j b21tb24sCj4gPj4gKyAmYnVzX3JfY3B1Y2ZnX2Nsay5jb21tb24sCj4gPj4gK307Cj4gPj4gKwo+ ID4+ICtzdGF0aWMgc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgc3VuOGlfdjg1M19yX2h3X2Ns a3MgPSB7Cj4gPj4gKyAubnVtID0gQ0xLX05VTUJFUiwKPiA+PiArIC5od3MgPSB7Cj4gPj4gKyBb Q0xLX1JfQUhCXSA9ICZyX2FoYl9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19SX0FQQjBdID0g JnJfYXBiMF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfUl9UV0RdID0gJmJ1c19yX3R3 ZF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfUl9QUFVdID0gJmJ1c19yX3BwdV9jbGsu Y29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfUl9SVENdID0gJmJ1c19yX3J0Y19jbGsuY29tbW9u Lmh3LAo+ID4+ICsgW0NMS19CVVNfUl9DUFVDRkddID0gJmJ1c19yX2NwdWNmZ19jbGsuY29tbW9u Lmh3LAo+ID4+ICsgfSwKPiA+PiArfTsKPiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg Y2N1X3Jlc2V0X21hcCBzdW44aV92ODUzX3JfY2N1X3Jlc2V0c1tdID0gewo+ID4+ICsgW1JTVF9C VVNfUl9UV0RdID0geyAweDEyYywgQklUKDE2KSB9LAo+ID4gCj4gPiBXaGVyZSBkaWQgeW91IGdl dCB0aGF0PyBCU1AgZHJpdmVyIHRoYXQgSSBjaGVja2VkIGRvZXNuJ3QgbWVudGlvbnMgaXQuCj4g PiAKPiAKPiB5ZXMsIGp1c3QgZG91YmxlIGNoZWNrZWQgYW5kIHRoaXMgYml0IGlzIG5vdCB2YWxp ZCwgc29ycnksIEnigJlsbCByZW1vdmUgaXQuCj4gCj4gPj4gKyBbUlNUX0JVU19SX1BQVV0gPSB7 IDB4MWFjLCBCSVQoMTYpIH0sCj4gPj4gKyBbUlNUX0JVU19SX1JUQ10gPSB7IDB4MjBjLCBCSVQo MTYpIH0sCj4gPj4gKyBbUlNUX0JVU19SX0NQVUNGR10gPSB7IDB4MjJjLCBCSVQoMTYpIH0sCj4g Pj4gK307Cj4gPj4gKwo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHN1bnhpX2NjdV9kZXNjIHN1 bjhpX3Y4NTNfcl9jY3VfZGVzYyA9IHsKPiA+PiArIC5jY3VfY2xrcyA9IHN1bjhpX3Y4NTNfcl9j Y3VfY2xrcywKPiA+PiArIC5udW1fY2N1X2Nsa3MgPSBBUlJBWV9TSVpFKHN1bjhpX3Y4NTNfcl9j Y3VfY2xrcyksCj4gPj4gKwo+ID4+ICsgLmh3X2Nsa3MgPSAmc3VuOGlfdjg1M19yX2h3X2Nsa3Ms Cj4gPj4gKwo+ID4+ICsgLnJlc2V0cyA9IHN1bjhpX3Y4NTNfcl9jY3VfcmVzZXRzLAo+ID4+ICsg Lm51bV9yZXNldHMgPSBBUlJBWV9TSVpFKHN1bjhpX3Y4NTNfcl9jY3VfcmVzZXRzKSwKPiA+PiAr fTsKPiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgc3VuOGlfdjg1M19yX2NjdV9wcm9iZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ID4+ICt7Cj4gPj4gKyB2b2lkIF9faW9tZW0gKnJlZzsK PiA+PiArCj4gPj4gKyByZWcgPSBkZXZtX3BsYXRmb3JtX2lvcmVtYXBfcmVzb3VyY2UocGRldiwg MCk7Cj4gPj4gKyBpZiAoSVNfRVJSKHJlZykpCj4gPj4gKyByZXR1cm4gUFRSX0VSUihyZWcpOwo+ ID4+ICsKPiA+PiArIHJldHVybiBkZXZtX3N1bnhpX2NjdV9wcm9iZSgmcGRldi0+ZGV2LCByZWcs ICZzdW44aV92ODUzX3JfY2N1X2Rlc2MpOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgY29u c3Qgc3RydWN0IG9mX2RldmljZV9pZCBzdW44aV92ODUzX3JfY2N1X2lkc1tdID0gewo+ID4+ICsg eyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuOGktdjg1My1yLWNjdSIgfSwKPiA+PiArIHsg fQo+ID4+ICt9Owo+ID4+ICtNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzdW44aV92ODUzX3JfY2N1 X2lkcyk7Cj4gPj4gKwo+ID4+ICtzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzdW44aV92 ODUzX3JfY2N1X2RyaXZlciA9IHsKPiA+PiArIC5wcm9iZSA9IHN1bjhpX3Y4NTNfcl9jY3VfcHJv YmUsCj4gPj4gKyAuZHJpdmVyID0gewo+ID4+ICsgLm5hbWUgPSAic3VuOGktdjg1My1yLWNjdSIs Cj4gPj4gKyAuc3VwcHJlc3NfYmluZF9hdHRycyA9IHRydWUsCj4gPj4gKyAub2ZfbWF0Y2hfdGFi bGUgPSBzdW44aV92ODUzX3JfY2N1X2lkcywKPiA+PiArIH0sCj4gPj4gK307Cj4gPj4gK21vZHVs ZV9wbGF0Zm9ybV9kcml2ZXIoc3VuOGlfdjg1M19yX2NjdV9kcml2ZXIpOwo+ID4+ICsKPiA+PiAr TU9EVUxFX0lNUE9SVF9OUygiU1VOWElfQ0NVIik7Cj4gPj4gK01PRFVMRV9ERVNDUklQVElPTigi U3VwcG9ydCBmb3IgdGhlIEFsbHdpbm5lciBWODUzIFBSQ00gQ0NVIik7Cj4gPj4gK01PRFVMRV9M SUNFTlNFKCJHUEwiKTsKPiA+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1 LXN1bjhpLXY4NTMtci5oIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMtci5o Cj4gPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+PiBpbmRleCAwMDAwMDAwMDAwMDAuLjJjNmNj N2I2ZjI1MQo+ID4+IC0tLSAvZGV2L251bGwKPiA+PiArKysgYi9kcml2ZXJzL2Nsay9zdW54aS1u Zy9jY3Utc3VuOGktdjg1My1yLmgKPiA+PiBAQCAtMCwwICsxLDE0IEBACj4gPj4gKy8qIFNQRFgt TGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCj4gPj4gKy8qCj4gPj4gKyAqIENvcHlyaWdo dCAoQykgMjAyNSBBbmRyYXMgU3plbXpvIDxzemVtem8uYW5kcmFzQGdtYWlsLmNvbT4KPiA+PiAr ICovCj4gPj4gKwo+ID4+ICsjaWZuZGVmIF9DQ1VfU1VOOElfVjg1M19SX0gKPiA+PiArI2RlZmlu ZSBfQ0NVX1NVTjhJX1Y4NTNfUl9ICj4gPj4gKwo+ID4+ICsjaW5jbHVkZSA8ZHQtYmluZGluZ3Mv Y2xvY2svYWxsd2lubmVyLHN1bjhpLXY4NTMtci1jY3UuaD4KPiA+PiArI2luY2x1ZGUgPGR0LWJp bmRpbmdzL3Jlc2V0L2FsbHdpbm5lcixzdW44aS12ODUzLXItY2N1Lmg+Cj4gPj4gKwo+ID4+ICsj ZGVmaW5lIENMS19OVU1CRVIgKENMS19CVVNfUl9DUFVDRkcgKyAxKQo+ID4+ICsKPiA+PiArI2Vu ZGlmCj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS12ODUz LmMgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktdjg1My5jCj4gPj4gbmV3IGZpbGUg bW9kZSAxMDA2NDQKPiA+PiBpbmRleCAwMDAwMDAwMDAwMDAuLjRiMzJmM2E5MTNjZgo+ID4+IC0t LSAvZGV2L251bGwKPiA+PiArKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktdjg1 My5jCj4gPj4gQEAgLTAsMCArMSwxMTQ1IEBACj4gPj4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlm aWVyOiBHUEwtMi4wCj4gPj4gKy8qCj4gPj4gKyAqIENvcHlyaWdodCAoQykgMjAyNSBBbmRyYXMg U3plbXpvIDxzemVtem8uYW5kcmFzQGdtYWlsLmNvbT4KPiA+PiArICoKPiA+PiArICogQmFzZWQg b24gY2N1LXN1bjIwaS1kMS5jIGJ5IFNhbXVlbCBIb2xsYW5kLgo+ID4+ICsgKi8KPiA+PiArCj4g Pj4gKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KPiA+PiArI2luY2x1ZGUgPGxpbnV4 L2lvLmg+Cj4gPj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiA+PiArI2luY2x1ZGUgPGxp bnV4L3BsYXRmb3JtX2RldmljZS5oPgo+ID4+ICsKPiA+PiArI2luY2x1ZGUgIi4uL2Nsay5oIgo+ ID4+ICsKPiA+PiArI2luY2x1ZGUgImNjdV9jb21tb24uaCIKPiA+PiArI2luY2x1ZGUgImNjdV9y ZXNldC5oIgo+ID4+ICsKPiA+PiArI2luY2x1ZGUgImNjdV9kaXYuaCIKPiA+PiArI2luY2x1ZGUg ImNjdV9nYXRlLmgiCj4gPj4gKyNpbmNsdWRlICJjY3VfbXAuaCIKPiA+PiArI2luY2x1ZGUgImNj dV9tdWx0LmgiCj4gPj4gKyNpbmNsdWRlICJjY3VfbmsuaCIKPiA+PiArI2luY2x1ZGUgImNjdV9u a20uaCIKPiA+PiArI2luY2x1ZGUgImNjdV9ua21wLmgiCj4gPj4gKyNpbmNsdWRlICJjY3Vfbm0u aCIKPiA+PiArCj4gPj4gKyNpbmNsdWRlICJjY3Utc3VuOGktdjg1My5oIgo+ID4+ICsKPiA+PiAr c3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfcGFyZW50X2RhdGEgb3NjMjRNW10gPSB7Cj4gPj4gKyB7 IC5md19uYW1lID0gImhvc2MiIH0KPiA+PiArfTsKPiA+PiArCj4gPj4gKy8qCj4gPj4gKyAqIEZv ciB0aGUgQ1BVIFBMTCwgdGhlIG91dHB1dCBkaXZpZGVyIGlzIGRlc2NyaWJlZCBhcyAib25seSBm b3IgdGVzdGluZyIKPiA+PiArICogaW4gdGhlIHVzZXIgbWFudWFsLiBTbyBpdCdzIG5vdCBtb2Rl bGxlZCBhbmQgZm9yY2VkIHRvIDAuCj4gPj4gKyAqLwo+ID4+ICsjZGVmaW5lIFNVTjhJX1Y4NTNf UExMX0NQVV9SRUcgMHgwMDAKPiA+PiArCj4gPj4gK3N0YXRpYyBzdHJ1Y3QgY2N1X211bHQgcGxs X2NwdV9jbGsgPSB7Cj4gPj4gKyAuZW5hYmxlID0gQklUKDI3KSwKPiA+PiArIC5sb2NrID0gQklU KDI4KSwKPiA+PiArIC5tdWx0ID0gX1NVTlhJX0NDVV9NVUxUX01JTig4LCA4LCAxMSksCj4gPj4g KyAuY29tbW9uID0gewo+ID4+ICsgLnJlZyA9IDB4MDAwLAo+ID4+ICsgLmh3LmluaXQgPSBDTEtf SFdfSU5JVF9QQVJFTlRTX0RBVEEoInBsbC1jcHUiLCBvc2MyNE0sCj4gPj4gKyAgICZjY3VfbXVs dF9vcHMsCj4gPj4gKyAgIENMS19TRVRfUkFURV9HQVRFKSwKPiA+PiArIH0sCj4gPj4gK307Cj4g Pj4gKwo+ID4+ICsvKiBTb21lIFBMTHMgYXJlIGlucHV0ICogTiAvIGRpdjEgLyBQLiBNb2RlbCB0 aGVtIGFzIE5LTVAgd2l0aCBubyBLICovCj4gPj4gKyNkZWZpbmUgU1VOOElfVjg1M19QTExfRERS X1JFRyAweDAxMAo+ID4+ICtzdGF0aWMgc3RydWN0IGNjdV9ua21wIHBsbF9kZHJfY2xrID0gewo+ ID4+ICsgLmVuYWJsZSA9IEJJVCgyNyksCj4gPj4gKyAubG9jayA9IEJJVCgyOCksCj4gPj4gKyAu biA9IF9TVU5YSV9DQ1VfTVVMVF9NSU4oOCwgOCwgMTEpLAo+ID4+ICsgLm0gPSBfU1VOWElfQ0NV X0RJVigxLCAxKSwgLyogaW5wdXQgZGl2aWRlciAqLwo+ID4+ICsgLnAgPSBfU1VOWElfQ0NVX0RJ VigwLCAxKSwgLyogb3V0cHV0IGRpdmlkZXIgKi8KPiA+PiArIC5jb21tb24gPSB7Cj4gPj4gKyAu cmVnID0gMHgwMTAsCj4gPj4gKyAuaHcuaW5pdCA9IENMS19IV19JTklUX1BBUkVOVFNfREFUQSgi cGxsLWRkciIsIG9zYzI0TSwKPiA+PiArICAgJmNjdV9ua21wX29wcywKPiA+PiArICAgQ0xLX1NF VF9SQVRFX0dBVEUpLAo+ID4+ICsgfSwKPiA+PiArfTsKPiA+PiArCj4gPj4gKyNkZWZpbmUgU1VO OElfVjg1M19QTExfUEVSSVBIX1JFRyAweDAyMAo+ID4+ICtzdGF0aWMgc3RydWN0IGNjdV9ubSBw bGxfcGVyaXBoXzR4X2NsayA9IHsKPiA+PiArIC5lbmFibGUgPSBCSVQoMjcpLAo+ID4+ICsgLmxv Y2sgPSBCSVQoMjgpLAo+ID4+ICsgLm4gPSBfU1VOWElfQ0NVX01VTFRfTUlOKDgsIDgsIDExKSwK PiA+PiArIC5tID0gX1NVTlhJX0NDVV9ESVYoMSwgMSksIC8qIGlucHV0IGRpdmlkZXIgKi8KPiA+ PiArIC5jb21tb24gPSB7Cj4gPj4gKyAucmVnID0gMHgwMjAsCj4gPj4gKyAuaHcuaW5pdCA9IENM S19IV19JTklUX1BBUkVOVFNfREFUQSgicGxsLXBlcmlwaC00eCIsIG9zYzI0TSwKPiA+PiArICAg JmNjdV9ubV9vcHMsCj4gPj4gKyAgIENMS19TRVRfUkFURV9HQVRFKSwKPiA+PiArIH0sCj4gPj4g K307Cj4gPj4gKwo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19odyAqcGxsX3BlcmlwaF80 eF9od3NbXSA9IHsKPiA+PiArICZwbGxfcGVyaXBoXzR4X2Nsay5jb21tb24uaHcKPiA+PiArfTsK PiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9IV1MocGxsX3BlcmlwaF8yeF9jbGssICJw bGwtcGVyaXBoLTJ4IiwgcGxsX3BlcmlwaF80eF9od3MsCj4gPj4gKyAgICAgICAweDAyMCwgMTYs IDMsIDApOwo+ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NX0hXUyhwbGxfcGVyaXBoXzgw ME1fY2xrLCAicGxsLXBlcmlwaC04MDBNIiwgcGxsX3BlcmlwaF80eF9od3MsCj4gPj4gKyAgICAg ICAweDAyMCwgMjAsIDMsIDApOwo+ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NX0hXUyhw bGxfcGVyaXBoXzQ4ME1fY2xrLCAicGxsLXBlcmlwaC00ODBNIiwgcGxsX3BlcmlwaF80eF9od3Ms Cj4gPj4gKyAgICAgICAweDAyMCwgMiwgMywgMCk7Cj4gPj4gKwo+ID4+ICtzdGF0aWMgQ0xLX0ZJ WEVEX0ZBQ1RPUl9IVyhwbGxfcGVyaXBoXzYwME1fY2xrLCAicGxsLXBlcmlwaC02MDBNIiwKPiA+ PiArICAgJnBsbF9wZXJpcGhfMnhfY2xrLmNvbW1vbi5odywgMiwgMSwgMCk7Cj4gPj4gKwo+ID4+ ICtzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUl9IVyhwbGxfcGVyaXBoXzQwME1fY2xrLCAicGxsLXBl cmlwaC00MDBNIiwKPiA+PiArICAgJnBsbF9wZXJpcGhfMnhfY2xrLmNvbW1vbi5odywgMywgMSwg MCk7Cj4gPj4gKwo+ID4+ICtzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUl9IVyhwbGxfcGVyaXBoXzMw ME1fY2xrLCAicGxsLXBlcmlwaC0zMDBNIiwKPiA+PiArICAgJnBsbF9wZXJpcGhfNjAwTV9jbGsu aHcsIDIsIDEsIDApOwo+ID4+ICsKPiA+PiArc3RhdGljIENMS19GSVhFRF9GQUNUT1JfSFcocGxs X3BlcmlwaF8yMDBNX2NsaywgInBsbC1wZXJpcGgtMjAwTSIsCj4gPj4gKyAgICZwbGxfcGVyaXBo XzQwME1fY2xrLmh3LCAyLCAxLCAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBDTEtfRklYRURfRkFD VE9SX0hXKHBsbF9wZXJpcGhfMTYwTV9jbGssICJwbGwtcGVyaXBoLTE2ME0iLAo+ID4+ICsgICAm cGxsX3BlcmlwaF80ODBNX2Nsay5jb21tb24uaHcsIDMsIDEsIDApOwo+ID4+ICsKPiA+PiArc3Rh dGljIENMS19GSVhFRF9GQUNUT1JfSFcocGxsX3BlcmlwaF8xNTBNX2NsaywgInBsbC1wZXJpcGgt MTUwTSIsCj4gPj4gKyAgICZwbGxfcGVyaXBoXzMwME1fY2xrLmh3LCAyLCAxLCAwKTsKPiA+PiAr Cj4gPj4gKy8qCj4gPj4gKyAqIEZvciBWaWRlbyBQTExzLCB0aGUgb3V0cHV0IGRpdmlkZXIgaXMg ZGVzY3JpYmVkIGFzICJvbmx5IGZvciB0ZXN0aW5nIgo+ID4+ICsgKiBpbiB0aGUgdXNlciBtYW51 YWwuCj4gPj4gKyAqLwo+ID4+ICsjZGVmaW5lIFNVTjhJX1Y4NTNfUExMX1ZJREVPX1JFRyAweDA0 MAo+ID4+ICtzdGF0aWMgc3RydWN0IGNjdV9ua21wIHBsbF92aWRlb180eF9jbGsgPSB7Cj4gPj4g KyAuZW5hYmxlID0gQklUKDI3KSwKPiA+PiArIC5sb2NrID0gQklUKDI4KSwKPiA+PiArIC5uID0g X1NVTlhJX0NDVV9NVUxUX01JTig4LCA4LCAxMSksCj4gPj4gKyAucCA9IF9TVU5YSV9DQ1VfRElW KDEsIDEpLCAvKiBpbnB1dCBkaXZpZGVyICovCj4gPj4gKyAuY29tbW9uID0gewo+ID4+ICsgLnJl ZyA9IDB4MDQwLAo+ID4+ICsgLmh3LmluaXQgPSBDTEtfSFdfSU5JVF9QQVJFTlRTX0RBVEEoInBs bC12aWRlby00eCIsIG9zYzI0TSwKPiA+PiArICAgJmNjdV9ua21wX29wcywKPiA+PiArICAgQ0xL X1NFVF9SQVRFX0dBVEUpLAo+ID4+ICsgfSwKPiA+PiArfTsKPiA+PiArCj4gPj4gK3N0YXRpYyBj b25zdCBzdHJ1Y3QgY2xrX2h3ICpwbGxfdmlkZW9fNHhfaHdzW10gPSB7Cj4gPj4gKyAmcGxsX3Zp ZGVvXzR4X2Nsay5jb21tb24uaHcKPiA+PiArfTsKPiA+PiArc3RhdGljIENMS19GSVhFRF9GQUNU T1JfSFdTKHBsbF92aWRlb18yeF9jbGssICJwbGwtdmlkZW8tMngiLAo+ID4+ICsgICAgcGxsX3Zp ZGVvXzR4X2h3cywgMiwgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7Cj4gPj4gK3N0YXRpYyBDTEtf RklYRURfRkFDVE9SX0hXUyhwbGxfdmlkZW9fMXhfY2xrLCAicGxsLXZpZGVvLTF4IiwKPiA+PiAr ICAgIHBsbF92aWRlb180eF9od3MsIDQsIDEsIENMS19TRVRfUkFURV9QQVJFTlQpOwo+ID4+ICsK PiA+PiArCj4gPj4gKy8qCj4gPj4gKyAqIEZvciBDU0kgUExMcywgdGhlIG91dHB1dCBkaXZpZGVy IGlzIGRlc2NyaWJlZCBhcyAib25seSBmb3IgdGVzdGluZyIKPiA+PiArICogaW4gdGhlIHVzZXIg bWFudWFsLgo+ID4+ICsgKi8KPiA+PiArI2RlZmluZSBTVU44SV9WODUzX1BMTF9DU0lfUkVHIDB4 MDQ4Cj4gPj4gK3N0YXRpYyBzdHJ1Y3QgY2N1X25rbXAgcGxsX2NzaV80eF9jbGsgPSB7Cj4gPj4g KyAuZW5hYmxlID0gQklUKDI3KSwKPiA+PiArIC5sb2NrID0gQklUKDI4KSwKPiA+PiArIC5uID0g X1NVTlhJX0NDVV9NVUxUX01JTig4LCA4LCAxMSksCj4gPj4gKyAucCA9IF9TVU5YSV9DQ1VfRElW KDEsIDEpLCAvKiBpbnB1dCBkaXZpZGVyICovCj4gPj4gKyAuY29tbW9uID0gewo+ID4+ICsgLnJl ZyA9IDB4MDQ4LAo+ID4+ICsgLmh3LmluaXQgPSBDTEtfSFdfSU5JVF9QQVJFTlRTX0RBVEEoInBs bC1jc2ktNHgiLCBvc2MyNE0sCj4gPj4gKyAgICZjY3VfbmttcF9vcHMsCj4gPj4gKyAgIENMS19T RVRfUkFURV9HQVRFKSwKPiA+PiArIH0sCj4gPj4gK307Cj4gPj4gKwo+ID4+ICtzdGF0aWMgQ0xL X0ZJWEVEX0ZBQ1RPUl9IVyhwbGxfY3NpX2NsaywgInBsbC1jc2kiLAo+ID4+ICsgICAmcGxsX2Nz aV80eF9jbGsuY29tbW9uLmh3LCA0LCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKPiA+PiArCj4g Pj4gKwo+ID4+ICsjZGVmaW5lIFNVTjhJX1Y4NTNfUExMX0FVRElPX1JFRyAweDA3OAo+ID4+ICtz dGF0aWMgc3RydWN0IGNjdV9zZG1fc2V0dGluZyBwbGxfYXVkaW9fZGl2NV9zZG1fdGFibGVbXSA9 IHsKPiA+PiArIHsgLnJhdGUgPSAxOTY2MDgwMDAsIC5wYXR0ZXJuID0gMHhjMDAxZWI4NSwgLm0g PSA1LCAubiA9IDQwIH0sIC8qIDI0LjU3NiAqLwo+ID4+ICsgeyAucmF0ZSA9IDY3NzM3NjAwLCAu cGF0dGVybiA9IDB4YzAwMTI4OGQsIC5tID0gOCwgLm4gPSAyMiB9LCAvKiAyMi41NzkyICovCj4g Pj4gK307Cj4gPj4gKwo+ID4+ICtzdGF0aWMgc3RydWN0IGNjdV9ubSBwbGxfYXVkaW9fZGl2NV9j bGsgPSB7Cj4gPj4gKyAuZW5hYmxlID0gQklUKDI3KSwKPiA+PiArIC5sb2NrICAgICAgICAgICA9 IEJJVCgyOCksCj4gPj4gKyAubiAgICAgICAgICAgICAgPSBfU1VOWElfQ0NVX01VTFQoOCwgOCks Cj4gPj4gKyAubSAgICAgICAgICAgICAgPSBfU1VOWElfQ0NVX0RJVigyMCwgMyksCj4gPj4gKyAu c2RtICAgICAgICAgICAgPSBfU1VOWElfQ0NVX1NETShwbGxfYXVkaW9fZGl2NV9zZG1fdGFibGUs Cj4gPj4gKyAgICBCSVQoMjQpLCAweDAxNzgsIEJJVCgzMSkpLAo+ID4+ICsgLmNvbW1vbiAgICAg ICAgID0gewo+ID4+ICsgLnJlZyAgICAgICAgICAgID0gMHgwMDc4LAo+ID4+ICsgLmZlYXR1cmVz ICAgICAgID0gQ0NVX0ZFQVRVUkVfU0lHTUFfREVMVEFfTU9ELAo+ID4+ICsgLmh3LmluaXQgICAg ICAgID0gQ0xLX0hXX0lOSVRfUEFSRU5UU19EQVRBKCJwbGwtYXVkaW8tZGl2NSIsIG9zYzI0TSwK PiA+PiArICAgJmNjdV9ubV9vcHMsCj4gPj4gKyAgIENMS19TRVRfUkFURV9VTkdBVEUpLAo+ID4+ ICsgfSwKPiA+PiArfTsKPiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2h3ICpw bGxfYXVkaW9fZGl2NV9od3NbXSA9IHsKPiA+PiArICZwbGxfYXVkaW9fZGl2NV9jbGsuY29tbW9u Lmh3Cj4gPj4gK307Cj4gPj4gKwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX01fSFdTKHBsbF9hdWRp b18xeF9jbGssICJwbGwtYXVkaW8tMXgiLCBwbGxfYXVkaW9fZGl2NV9od3MsCj4gPj4gKyAgICAg ICAweGUwMCwgMCwgNSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7Cj4gPj4gKwo+ID4+ICsvKiBwbGwt YXVkaW8tZGl2MiBhbmQgcGxsLWF1ZGlvLTR4IG5vdCB1c2VkLCBiZWNhdXNlIHBsbC1hdWRpby0x eCBjYW4gY292ZXIgCj4gPj4gKyAqIDIyLjU3OTJNIGFuZCAyNC41NzZNIAo+ID4+ICsgKi8KPiA+ PiArc3RhdGljIFNVTlhJX0NDVV9NKHBsbF9hdWRpb19kaXYyX2NsaywgInBsbC1hdWRpby1kaXYy IiwgInBsbC1hdWRpbyIsCj4gPj4gKyAgIDB4MDc4LCAxNiwgMywgMCk7Cj4gPj4gK3N0YXRpYyBT VU5YSV9DQ1VfTShwbGxfYXVkaW9fNHhfY2xrLCAicGxsLWF1ZGlvLTR4IiwgInBsbC1hdWRpby1k aXYyIiwKPiA+PiArICAgMHhlMDAsIDUsIDUsIDApOwo+ID4+ICsKPiA+PiArLyoKPiA+PiArICog Rm9yIHRoZSBOUFUgUExMLCB0aGUgb3V0cHV0IGRpdmlkZXIgaXMgZGVzY3JpYmVkIGFzICJvbmx5 IGZvciB0ZXN0aW5nIgo+ID4+ICsgKiBpbiB0aGUgdXNlciBtYW51YWwuCj4gPj4gKyAqLwo+ID4+ ICsjZGVmaW5lIFNVTjhJX1Y4NTNfUExMX05QVV9SRUcgMHgwODAKPiA+PiArc3RhdGljIHN0cnVj dCBjY3VfbmttcCBwbGxfbnB1XzR4X2NsayA9IHsKPiA+PiArIC5lbmFibGUgPSBCSVQoMjcpLAo+ ID4+ICsgLmxvY2sgPSBCSVQoMjgpLAo+ID4+ICsgLm4gPSBfU1VOWElfQ0NVX01VTFRfTUlOKDgs IDgsIDExKSwKPiA+PiArIC5wID0gX1NVTlhJX0NDVV9ESVYoMSwgMSksIC8qIGlucHV0IGRpdmlk ZXIgKi8KPiA+PiArIC5jb21tb24gPSB7Cj4gPj4gKyAucmVnID0gMHgwODAsCj4gPj4gKyAuaHcu aW5pdCA9IENMS19IV19JTklUX1BBUkVOVFNfREFUQSgicGxsLW5wdS00eCIsIG9zYzI0TSwKPiA+ PiArICAgJmNjdV9ua21wX29wcywKPiA+PiArICAgQ0xLX1NFVF9SQVRFX1VOR0FURSksCj4gPj4g KyB9LAo+ID4+ICt9Owo+ID4+ICsKPiA+PiArLyoKPiA+PiArICogVGhlIENQVSBnYXRlIGlzIG5v dCBtb2RlbGxlZCAtIGl0IGlzIGluIGEgc2VwYXJhdGUgcmVnaXN0ZXIgKDB4NTA0KQo+ID4+ICsg KiBhbmQgaGFzIGEgc3BlY2lhbCBrZXkgZmllbGQuIFRoZSBjbG9jayBtdXN0IG5vdCBiZSBnYXRl ZCBhbnl3YXkgYnkKPiA+PiArICogdGhlIGtlcm5lbC4KPiA+PiArICovCj4gPj4gK3N0YXRpYyBj b25zdCBzdHJ1Y3QgY2xrX3BhcmVudF9kYXRhIGNwdV9wYXJlbnRzW10gPSB7Cj4gPj4gKyB7IC5m d19uYW1lID0gImhvc2MiIH0sCj4gPj4gKyB7IC5md19uYW1lID0gImxvc2MiIH0sCj4gPj4gKyB7 IC5md19uYW1lID0gImlvc2MiIH0sCj4gPj4gKyB7IC5odyA9ICZwbGxfY3B1X2Nsay5jb21tb24u aHcgfSwKPiA+PiArIHsgLmh3ID0gJnBsbF9wZXJpcGhfNjAwTV9jbGsuaHcgfSwKPiA+PiArIHsg Lmh3ID0gJnBsbF9wZXJpcGhfODAwTV9jbGsuY29tbW9uLmh3IH0sCj4gPj4gK307Cj4gPj4gKwo+ ID4+ICsvKgo+ID4+ICsgKiBUaGVyZSBpcyBhIFAgZmFjdG9yIChQTExfT1VUX0VYVF9ESVZQWzE3 OjE2XSkgaW4gdGhpcyByZWdpc3RlciwgYnV0IGl0IGlzIG5vdCBtb2RlbGVkLgo+ID4+ICsgKiBU aGUgbWFudWFsIHN0YXRlcyB0aGF0IGl0IHNob3VsZCBiZSB1c2VkIG9ubHksIHdoZW4gdGhlIG91 dHB1dCBjbG9jayBpcyBsZXNzIHRoYW4gMjg4IE1Iei4KPiA+PiArICovCj4gPj4gK3N0YXRpYyBT VU5YSV9DQ1VfTVVYX0RBVEEoY3B1X2NsaywgImNwdSIsIGNwdV9wYXJlbnRzLAo+ID4+ICsgIDB4 NTAwLCAyNCwgMywgQ0xLX1NFVF9SQVRFX1BBUkVOVCB8IENMS19JU19DUklUSUNBTCk7Cj4gPj4g Kwo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19odyAqY3B1X2h3c1tdID0geyAmY3B1X2Ns ay5jb21tb24uaHcgfTsKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9IV1MoY3B1X2F4 aV9jbGssICJjcHUtYXhpIiwgY3B1X2h3cywKPiA+PiArICAgICAgIDB4NTAwLCAwLCAyLCAwKTsK PiA+PiArc3RhdGljIFNVTlhJX0NDVV9NX0hXUyhjcHVfYXBiX2NsaywgImNwdS1hcGIiLCBjcHVf aHdzLAo+ID4+ICsgICAgICAgMHg1MDAsIDgsIDIsIDApOwo+ID4+ICsKPiA+PiArc3RhdGljIGNv bnN0IHN0cnVjdCBjbGtfcGFyZW50X2RhdGEgYWhiX3BhcmVudHNbXSA9IHsKPiA+PiArIHsgLmZ3 X25hbWUgPSAiaG9zYyIgfSwKPiA+PiArIHsgLmZ3X25hbWUgPSAibG9zYyIgfSwKPiA+PiArIHsg LmZ3X25hbWUgPSAiaW9zYyIgfSwKPiA+PiArIHsgLmh3ID0gJnBsbF9wZXJpcGhfNjAwTV9jbGsu aHcgfSwKPiA+PiArfTsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NUF9EQVRBX1dJVEhfTVVYKGFo Yl9jbGssICJhaGIiLCBhaGJfcGFyZW50cywgMHg1MTAsCj4gPj4gKyAgMCwgNSwgLyogTSAqLwo+ ID4+ICsgIDgsIDIsIC8qIFAgKi8KPiA+PiArICAyNCwgMiwgLyogbXV4ICovCj4gPj4gKyAgMCk7 Cj4gPj4gKwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX01QX0RBVEFfV0lUSF9NVVgoYXBiMF9jbGss ICJhcGIwIiwgYWhiX3BhcmVudHMsIDB4NTIwLAo+ID4+ICsgIDAsIDUsIC8qIE0gKi8KPiA+PiAr ICA4LCAyLCAvKiBQICovCj4gPj4gKyAgMjQsIDIsIC8qIG11eCAqLwo+ID4+ICsgIDApOwo+ID4+ ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NUF9EQVRBX1dJVEhfTVVYKGFwYjFfY2xrLCAiYXBi MSIsIGFoYl9wYXJlbnRzLCAweDUyNCwKPiA+PiArICAwLCA1LCAvKiBNICovCj4gPj4gKyAgOCwg MiwgLyogUCAqLwo+ID4+ICsgIDI0LCAyLCAvKiBtdXggKi8KPiA+PiArICAwKTsKPiA+PiArCj4g Pj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2h3ICphaGJfaHdzW10gPSB7ICZhaGJfY2xrLmNv bW1vbi5odyB9Owo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19odyAqYXBiMF9od3NbXSA9 IHsgJmFwYjBfY2xrLmNvbW1vbi5odyB9Owo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19o dyAqYXBiMV9od3NbXSA9IHsgJmFwYjFfY2xrLmNvbW1vbi5odyB9Owo+ID4+ICsKPiA+PiArCj4g Pj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2h3ICpkZV9nMmRfcGFyZW50c1tdID0gewo+ID4+ ICsgJnBsbF9wZXJpcGhfMzAwTV9jbGsuaHcsCj4gPj4gKyAmcGxsX3ZpZGVvXzF4X2Nsay5odywK PiA+PiArfTsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NX0hXX1dJVEhfTVVYX0dBVEUoZGVfY2xr LCAiZGUiLCBkZV9nMmRfcGFyZW50cywgMHg2MDAsCj4gPj4gKyAgICAwLCA1LCAvKiBNICovCj4g Pj4gKyAgICAyNCwgMSwgLyogbXV4ICovCj4gPj4gKyAgICBCSVQoMzEpLCAvKiBnYXRlICovCj4g Pj4gKyAgICBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9D Q1VfR0FURV9IV1MoYnVzX2RlX2NsaywgImJ1cy1kZSIsIGFoYl9od3MsCj4gPj4gKyAgMHg2MGMs IEJJVCgwKSwgMCk7Cj4gPj4gKwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX01fSFdfV0lUSF9NVVhf R0FURShnMmRfY2xrLCAiZzJkIiwgZGVfZzJkX3BhcmVudHMsIDB4NjMwLAo+ID4+ICsgICAgMCwg NSwgLyogTSAqLwo+ID4+ICsgICAgMjQsIDEsIC8qIG11eCAqLwo+ID4+ICsgICAgQklUKDMxKSwg LyogZ2F0ZSAqLwo+ID4+ICsgICAgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7Cj4gPj4gKwo+ID4+ICtz dGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19nMmRfY2xrLCAiYnVzLWcyZCIsIGFoYl9od3Ms Cj4gPj4gKyAgMHg2M2MsIEJJVCgwKSwgMCk7Cj4gPj4gKwo+ID4+ICsKPiA+PiArc3RhdGljIGNv bnN0IHN0cnVjdCBjbGtfcGFyZW50X2RhdGEgY2VfcGFyZW50c1tdID0gewo+ID4+ICsgeyAuZndf bmFtZSA9ICJob3NjIiB9LAo+ID4gCj4gPiBXaGVyZSB0aGlzIGNvbWUgZnJvbT8gVjg1MyBtYW51 YWwgdjEuMSBkb2Vzbid0IGhhdmUgaXQuCj4gCj4gVGhlcmUgaXMgYSBzdW44aXcyMSBjY3UgZHJp dmVyIFsxXSwgd2hlcmUgaG9zYyBpcyB0aGUgZmlyc3QgcGFyZW50Ogo+IAo+IFsxXToKPiBodHRw czovL2dpdGh1Yi5jb20vWXV6dWtpSEQvVGlueVZpc2lvbi9ibG9iL21haW4va2VybmVsL2JzcC9k cml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGl3MjEuYyNMMjYyCj4gCj4gSSBkb27igJl0IGtu b3cgaWYgdGhlIG1hbnVhbCBvciBpZiB0aGlzIGRyaXZlciBpcyB0aGUgY29ycmVjdC4KCkl0J3Mg b2suCgo+IAo+ID4gCj4gPj4gKyB7IC5odyA9ICZwbGxfcGVyaXBoXzQwME1fY2xrLmh3LCB9LAo+ ID4+ICsgeyAuaHcgPSAmcGxsX3BlcmlwaF8zMDBNX2Nsay5odywgfQo+ID4+ICt9Owo+ID4+ICtz dGF0aWMgU1VOWElfQ0NVX01fREFUQV9XSVRIX01VWF9HQVRFKGNlX2NsaywgImNlIiwgY2VfcGFy ZW50cywgMHg2ODAsCj4gPj4gKyAgICAgIDAsIDQsIC8qIE0gKi8KPiA+PiArICAgICAgMjQsIDMs IC8qIG11eCAqLwo+ID4+ICsgICAgICBCSVQoMzEpLCAvKiBnYXRlICovCj4gPj4gKyAgICAgIENM S19TRVRfUkFURV9QQVJFTlQpOwo+ID4gCj4gPiBTZXQgcmF0ZSBwYXJlbnQgZmxhZyBkb2Vzbid0 IG1ha2Ugc2Vuc2Ugb24gY29uc3RhbnQgcGFyZW50cy4KPiAKPiB5ZXMKPiAKPiA+IAo+ID4+ICsK PiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfY2VfY2xrLCAiYnVzLWNlIiwgYWhi X2h3cywKPiA+PiArICAweDY4YywgQklUKDApIHwgQklUKDEpLCAwKTsKPiA+PiArCj4gPj4gK3N0 YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2h3ICp2ZV9wYXJlbnRzW10gPSB7Cj4gPj4gKyAmcGxsX3Bl cmlwaF8zMDBNX2Nsay5odywKPiA+PiArICZwbGxfcGVyaXBoXzQwME1fY2xrLmh3LAo+ID4+ICsg JnBsbF9wZXJpcGhfNDgwTV9jbGsuY29tbW9uLmh3LAo+ID4+ICsgJnBsbF9ucHVfNHhfY2xrLmNv bW1vbi5odywKPiA+PiArICZwbGxfdmlkZW9fNHhfY2xrLmNvbW1vbi5odywKPiA+PiArICZwbGxf Y3NpXzR4X2Nsay5jb21tb24uaHcsCj4gPj4gK307Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9I V19XSVRIX01VWF9HQVRFKHZlX2NsaywgInZlIiwgdmVfcGFyZW50cywgMHg2OTAsCj4gPj4gKyAg ICAwLCA1LCAvKiBNICovCj4gPj4gKyAgICAyNCwgMywgLyogbXV4ICovCj4gPj4gKyAgICBCSVQo MzEpLCAvKiBnYXRlICovCj4gPj4gKyAgICAwKTsKPiA+IAo+ID4gQ0xLX1NFVF9SQVRFX1BBUkVO VCBmbGFnPyBDZWRydXMgZHJpdmVyIHNldCB3b3JraW5nIGNsb2NrIGF0IHRoZSBiZWdpbm5pbmcu Cj4gPiAKPiAKPiBvawo+IAo+ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhi dXNfdmVfY2xrLCAiYnVzLXZlIiwgYWhiX2h3cywKPiA+PiArICAweDY5YywgQklUKDApLCAwKTsK PiA+PiArCj4gPj4gKwo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19odyAqbnB1X3BhcmVu dHNbXSA9IHsKPiA+PiArICZwbGxfcGVyaXBoXzQ4ME1fY2xrLmNvbW1vbi5odywKPiA+PiArICZw bGxfcGVyaXBoXzYwME1fY2xrLmh3LAo+ID4+ICsgJnBsbF9wZXJpcGhfODAwTV9jbGsuY29tbW9u Lmh3LAo+ID4+ICsgJnBsbF9ucHVfNHhfY2xrLmNvbW1vbi5odywKPiA+PiArfTsKPiA+PiArc3Rh dGljIFNVTlhJX0NDVV9NX0hXX1dJVEhfTVVYX0dBVEUobnB1X2NsaywgIm5wdSIsIG5wdV9wYXJl bnRzLCAweDZlMCwKPiA+PiArICAgIDAsIDUsIC8qIE0gKi8KPiA+PiArICAgIDI0LCAzLCAvKiBt dXggKi8KPiA+PiArICAgIEJJVCgzMSksIC8qIGdhdGUgKi8KPiA+PiArICAgIDApOwo+ID4gCj4g PiBJIHRoaW5rIENMS19TRVRfUkFURV9QQVJFTlQgd291bGQgYWxzbyBiZSBiZW5lZmljaWFsIGhl cmUuCj4gCj4gSSB0cmllZCB0byBtaW1pYyBob3cgdGhlIEJTUCBzZXR1cCB0aGUgTlBVIGNsb2Nr cyAoYXMgSSB0aGluaywgbm90IHN1cmUpLCBpbiB0aGUgZHRzIEkgc2V0dXAgaXQgbGlrZToKPiAK PiAgICAgICAgICAgICAgICAgbnB1OiBucHVAMzA1MDAwMCB7Cj4gICAgICAgICAgICAgICAgICAg ICAgICAgY29tcGF0aWJsZSA9ICJ2aXZhbnRlLGdjIjsKPiAgICAgICAgICAgICAgICAgICAgICAg ICByZWcgPSA8MHgwMzA1MDAwMCAweDEwMDA+Owo+ICAgICAgICAgICAgICAgICAgICAgICAgIGlu dGVycnVwdHMgPSA8R0lDX1NQSSA2NSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKPiAgICAgICAgICAg ICAgICAgICAgICAgICBpbnRlcnJ1cHQtbmFtZXMgPSAibnB1IjsKPiAgICAgICAgICAgICAgICAg ICAgICAgICBjbG9ja3MgPSA8JmNjdSBDTEtfQlVTX05QVT4sIDwmY2N1IENMS19OUFU+Owo+ICAg ICAgICAgICAgICAgICAgICAgICAgIGNsb2NrLW5hbWVzID0gImJ1cyIsICJjb3JlIjsKPiAgICAg ICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZC1jbG9ja3MgPSA8JmNjdSBDTEtfUExMX05QVV80 WD4sIDwmY2N1IENMS19OUFU+Owo+ICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkLWNs b2NrLXBhcmVudHMgPSA8JmRjeG8+LCA8JmNjdSBDTEtfUExMX05QVV80WD47Cj4gICAgICAgICAg ICAgICAgICAgICAgICAgYXNzaWduZWQtY2xvY2stcmF0ZXMgPSAgPDEzOTIwMDAwMDA+LCA8MzQ4 MDAwMDAwPjsKPiAgICAgICAgICAgICAgICAgICAgICAgICByZXNldHMgPSA8JmNjdSBSU1RfQlVT X05QVT47Cj4gICAgICAgICAgICAgICAgICAgICAgICAgaW9tbXVzID0gPCZpb21tdSA2PjsKPiAg ICAgICAgICAgICAgICAgICAgICAgICBwb3dlci1kb21haW5zID0gPCZwcHUgUERfTlBVPjsKPiAg ICAgICAgICAgICAgICAgfTsKPiAKPiBXaXRoIHRoZXNlIHNldHRpbmdzIChhZnRlciBhZGRpbmcg YSByZXNldCBzdXBwb3J0IHRvIHRoZSBldG5hdml2IGRyaXZlcikgYXQgbGVhc3QgSSdtIGFibGUg dG8gZHVtcCBzb21lIHJlZ2lzdGVycyB2aWEgZGVidWdmcy4KPiBEbyB5b3UgdGhpbmsgSSBzaG91 bGQgYWRkIHRoZSBDTEtfU0VUX1JBVEVfUEFSRU5UIGZsYWc/CgpZZXMsIGJlY2F1c2UgdGhvc2Ug YXNzaWduZWQgY2xvY2sgcHJvcGVydGllcyBhcmUgbm90IHJlYWxseSBob3cgdGhpbmdzIHNob3Vs ZApiZSBkb25lLgoKQmVzdCByZWdhcmRzLApKZXJuZWoKCj4gCj4gPiAKPiA+PiArCj4gPj4gK3N0 YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX25wdV9jbGssICJidXMtbnB1IiwgYWhiX2h3cywK PiA+PiArICAweDZlYywgQklUKDApLCAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1Vf R0FURV9IV1MoYnVzX2RtYV9jbGssICJidXMtZG1hIiwgYWhiX2h3cywKPiA+PiArICAweDcwYywg QklUKDApLCAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX21z Z2JveDBfY2xrLCAiYnVzLW1zZ2JveDAiLCBhaGJfaHdzLAo+ID4+ICsgIDB4NzFjLCBCSVQoMCks IDApOwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19tc2dib3gxX2NsaywgImJ1 cy1tc2dib3gxIiwgYWhiX2h3cywKPiA+PiArICAweDcxYywgQklUKDEpLCAwKTsKPiA+PiArCj4g Pj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX3NwaW5sb2NrX2NsaywgImJ1cy1zcGlu bG9jayIsIGFoYl9od3MsCj4gPj4gKyAgMHg3MmMsIEJJVCgwKSwgMCk7Cj4gPj4gKwo+ID4+ICtz dGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19oc3RpbWVyX2NsaywgImJ1cy1oc3RpbWVyIiwg YWhiX2h3cywKPiA+PiArICAweDczYywgQklUKDApLCAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBT VU5YSV9DQ1VfR0FURV9EQVRBKGF2c19jbGssICJhdnMiLCBvc2MyNE0sCj4gPj4gKyAgIDB4NzQw LCBCSVQoMzEpLCAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVz X2RiZ19jbGssICJidXMtZGJnIiwgYWhiX2h3cywKPiA+PiArICAweDc4YywgQklUKDApLCAwKTsK PiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX3B3bV9jbGssICJidXMt cHdtIiwgYXBiMF9od3MsCj4gPj4gKyAgMHg3YWMsIEJJVCgwKSwgMCk7Cj4gPj4gKwo+ID4+ICtz dGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19pb21tdV9jbGssICJidXMtaW9tbXUiLCBhaGJf aHdzLAo+ID4+ICsgIDB4N2JjLCBCSVQoMCksIDApOwo+ID4+ICsKPiA+PiArc3RhdGljIGNvbnN0 IHN0cnVjdCBjbGtfaHcgKmRyYW1fcGFyZW50c1tdID0gewo+ID4+ICsgJnBsbF9kZHJfY2xrLmNv bW1vbi5odywKPiA+PiArICZwbGxfcGVyaXBoXzJ4X2Nsay5jb21tb24uaHcsCj4gPj4gKyAmcGxs X3BlcmlwaF84MDBNX2Nsay5jb21tb24uaHcsCj4gPj4gK307Cj4gPj4gK3N0YXRpYyBTVU5YSV9D Q1VfTVBfSFdfV0lUSF9NVVhfR0FURShkcmFtX2NsaywgImRyYW0iLCBkcmFtX3BhcmVudHMsIDB4 ODAwLAo+ID4+ICsgICAgIDAsIDUsIC8qIE0gKi8KPiA+PiArICAgICA4LCAyLCAvKiBQICovCj4g Pj4gKyAgICAgMjQsIDMsIC8qIG11eCAqLwo+ID4+ICsgICAgIEJJVCgzMSksIENMS19JU19DUklU SUNBTCk7Cj4gPiAKPiA+IFRoaXMgY2xvY2sgbmVlZHMgdXBkYXRlIGZpZWxkIHRvIGJlIHNldCB0 byBhY3R1YWxseSBhcHBseSBjb25maWd1cmF0aW9uLiBTbwo+ID4gc2FtZSBjb21tZW50IGFzIG9u IEE1MjMgY2xvY2sgdmVyc2lvbiwgdGhpcyBuZWVkcyBuZXcgZmxhZyB0byBiZSBpbnRyb2R1Y2Vk Cj4gPiBmb3Igc3VjaCBjYXNlLgo+ID4gCj4gCj4gb2sKPiAKPiA+PiArCj4gPj4gK3N0YXRpYyBD TEtfRklYRURfRkFDVE9SX0hXKG1idXNfY2xrLCAibWJ1cyIsCj4gPj4gKyAgICZkcmFtX2Nsay5j b21tb24uaHcsIDQsIDEsIDApOwo+ID4+ICsKPiA+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtf aHcgKm1idXNfaHdzW10gPSB7ICZtYnVzX2Nsay5odyB9Owo+ID4+ICsKPiA+PiArc3RhdGljIFNV TlhJX0NDVV9HQVRFX0hXUyhtYnVzX2RtYV9jbGssICJtYnVzLWRtYSIsIG1idXNfaHdzLAo+ID4+ ICsgIDB4ODA0LCBCSVQoMCksIDApOwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKG1i dXNfdmVfY2xrLCAibWJ1cy12ZSIsIG1idXNfaHdzLAo+ID4+ICsgIDB4ODA0LCBCSVQoMSksIDAp Owo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKG1idXNfY2VfY2xrLCAibWJ1cy1jZSIs IG1idXNfaHdzLAo+ID4+ICsgIDB4ODA0LCBCSVQoMiksIDApOwo+ID4+ICtzdGF0aWMgU1VOWElf Q0NVX0dBVEVfSFdTKG1idXNfY3NpX2NsaywgIm1idXMtY3NpIiwgbWJ1c19od3MsCj4gPj4gKyAg MHg4MDQsIEJJVCg4KSwgMCk7Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MobWJ1c19p c3BfY2xrLCAibWJ1cy1pc3AiLCBtYnVzX2h3cywKPiA+PiArICAweDgwNCwgQklUKDkpLCAwKTsK PiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhtYnVzX2cyZF9jbGssICJtYnVzLWcyZCIs IG1idXNfaHdzLAo+ID4+ICsgIDB4ODA0LCBCSVQoMTApLCAwKTsKPiA+PiArCj4gPj4gK3N0YXRp YyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2RyYW1fY2xrLCAiYnVzLWRyYW0iLCBhaGJfaHdzLAo+ ID4+ICsgIDB4ODBjLCBCSVQoMCksIENMS19JU19DUklUSUNBTCk7Cj4gPj4gKwo+ID4+ICsKPiA+ PiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfcGFyZW50X2RhdGEgbW1jMF9tbWMxX3BhcmVudHNb XSA9IHsKPiA+PiArIHsgLmZ3X25hbWUgPSAiaG9zYyIgfSwKPiA+PiArIHsgLmh3ID0gJnBsbF9w ZXJpcGhfNDAwTV9jbGsuaHcsIH0sCj4gPj4gKyB7IC5odyA9ICZwbGxfcGVyaXBoXzMwME1fY2xr Lmh3LCB9LAo+ID4+ICt9Owo+ID4gCj4gPiBKdXN0IG1tY19wYXJlbnRzLgo+IAo+IG9rCj4gCj4g PiAKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NUF9EQVRBX1dJVEhfTVVYX0dBVEUobW1jMF9jbGss ICJtbWMwIiwgbW1jMF9tbWMxX3BhcmVudHMsIDB4ODMwLAo+ID4+ICsgICAgICAgMCwgNCwgLyog TSAqLwo+ID4+ICsgICAgICAgOCwgMiwgLyogUCAqLwo+ID4+ICsgICAgICAgMjQsIDMsIC8qIG11 eCAqLwo+ID4+ICsgICAgICAgQklUKDMxKSwgLyogZ2F0ZSAqLwo+ID4+ICsgICAgICAgMCk7Cj4g Pj4gKwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX01QX0RBVEFfV0lUSF9NVVhfR0FURShtbWMxX2Ns aywgIm1tYzEiLCBtbWMwX21tYzFfcGFyZW50cywgMHg4MzQsCj4gPj4gKyAgICAgICAwLCA0LCAv KiBNICovCj4gPj4gKyAgICAgICA4LCAyLCAvKiBQICovCj4gPj4gKyAgICAgICAyNCwgMywgLyog bXV4ICovCj4gPj4gKyAgICAgICBCSVQoMzEpLCAvKiBnYXRlICovCj4gPj4gKyAgICAgICAwKTsK PiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX3BhcmVudF9kYXRhIG1tYzJfcGFy ZW50c1tdID0gewo+ID4+ICsgeyAuZndfbmFtZSA9ICJob3NjIiB9LAo+ID4+ICsgeyAuaHcgPSAm cGxsX3BlcmlwaF82MDBNX2Nsay5odywgfSwKPiA+PiArIHsgLmh3ID0gJnBsbF9wZXJpcGhfNDAw TV9jbGsuaHcsIH0sCj4gPj4gK307Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVBfREFUQV9XSVRI X01VWF9HQVRFKG1tYzJfY2xrLCAibW1jMiIsIG1tYzJfcGFyZW50cywgMHg4MzgsCj4gPj4gKyAg ICAgICAwLCA0LCAvKiBNICovCj4gPj4gKyAgICAgICA4LCAyLCAvKiBQICovCj4gPj4gKyAgICAg ICAyNCwgMywgLyogbXV4ICovCj4gPj4gKyAgICAgICBCSVQoMzEpLCAvKiBnYXRlICovCj4gPj4g KyAgICAgICAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX21t YzBfY2xrLCAiYnVzLW1tYzAiLCBhaGJfaHdzLAo+ID4+ICsgIDB4ODRjLCBCSVQoMCksIDApOwo+ ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19tbWMxX2NsaywgImJ1cy1tbWMxIiwg YWhiX2h3cywKPiA+PiArICAweDg0YywgQklUKDEpLCAwKTsKPiA+PiArc3RhdGljIFNVTlhJX0ND VV9HQVRFX0hXUyhidXNfbW1jMl9jbGssICJidXMtbW1jMiIsIGFoYl9od3MsCj4gPj4gKyAgMHg4 NGMsIEJJVCgyKSwgMCk7Cj4gPj4gKwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1 c191YXJ0MF9jbGssICJidXMtdWFydDAiLCBhcGIxX2h3cywKPiA+PiArICAweDkwYywgQklUKDAp LCAwKTsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfdWFydDFfY2xrLCAiYnVz LXVhcnQxIiwgYXBiMV9od3MsCj4gPj4gKyAgMHg5MGMsIEJJVCgxKSwgMCk7Cj4gPj4gK3N0YXRp YyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX3VhcnQyX2NsaywgImJ1cy11YXJ0MiIsIGFwYjFfaHdz LAo+ID4+ICsgIDB4OTBjLCBCSVQoMiksIDApOwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVf SFdTKGJ1c191YXJ0M19jbGssICJidXMtdWFydDMiLCBhcGIxX2h3cywKPiA+PiArICAweDkwYywg QklUKDMpLCAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2ky YzBfY2xrLCAiYnVzLWkyYzAiLCBhcGIxX2h3cywKPiA+PiArICAweDkxYywgQklUKDApLCAwKTsK PiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfaTJjMV9jbGssICJidXMtaTJjMSIs IGFwYjFfaHdzLAo+ID4+ICsgIDB4OTFjLCBCSVQoMSksIDApOwo+ID4+ICtzdGF0aWMgU1VOWElf Q0NVX0dBVEVfSFdTKGJ1c19pMmMyX2NsaywgImJ1cy1pMmMyIiwgYXBiMV9od3MsCj4gPj4gKyAg MHg5MWMsIEJJVCgyKSwgMCk7Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2ky YzNfY2xrLCAiYnVzLWkyYzMiLCBhcGIxX2h3cywKPiA+PiArICAweDkxYywgQklUKDMpLCAwKTsK PiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfaTJjNF9jbGssICJidXMtaTJjNCIs IGFwYjFfaHdzLAo+ID4+ICsgIDB4OTFjLCBCSVQoNCksIDApOwo+ID4+ICsKPiA+PiArc3RhdGlj IGNvbnN0IHN0cnVjdCBjbGtfcGFyZW50X2RhdGEgc3BpX3BhcmVudHNbXSA9IHsKPiA+PiArIHsg LmZ3X25hbWUgPSAiaG9zYyIgfSwKPiA+PiArIHsgLmh3ID0gJnBsbF9wZXJpcGhfMzAwTV9jbGsu aHcsIH0sCj4gPj4gKyB7IC5odyA9ICZwbGxfcGVyaXBoXzIwME1fY2xrLmh3LCB9LAo+ID4+ICt9 Owo+ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NUF9EQVRBX1dJVEhfTVVYX0dBVEUoc3Bp MF9jbGssICJzcGkwIiwgc3BpX3BhcmVudHMsIDB4OTQwLAo+ID4+ICsgICAgICAgMCwgNCwgLyog TSAqLwo+ID4+ICsgICAgICAgOCwgMiwgLyogUCAqLwo+ID4+ICsgICAgICAgMjQsIDMsIC8qIG11 eCAqLwo+ID4+ICsgICAgICAgQklUKDMxKSwgLyogZ2F0ZSAqLwo+ID4+ICsgICAgICAgMCk7Cj4g Pj4gKwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX01QX0RBVEFfV0lUSF9NVVhfR0FURShzcGkxX2Ns aywgInNwaTEiLCBzcGlfcGFyZW50cywgMHg5NDQsCj4gPj4gKyAgICAgICAwLCA0LCAvKiBNICov Cj4gPj4gKyAgICAgICA4LCAyLCAvKiBQICovCj4gPj4gKyAgICAgICAyNCwgMywgLyogbXV4ICov Cj4gPj4gKyAgICAgICBCSVQoMzEpLCAvKiBnYXRlICovCj4gPj4gKyAgICAgICAwKTsKPiA+PiAr Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVBfREFUQV9XSVRIX01VWF9HQVRFKHNwaTJfY2xrLCAi c3BpMiIsIHNwaV9wYXJlbnRzLCAweDk0OCwKPiA+PiArICAgICAgIDAsIDQsIC8qIE0gKi8KPiA+ PiArICAgICAgIDgsIDIsIC8qIFAgKi8KPiA+PiArICAgICAgIDI0LCAzLCAvKiBtdXggKi8KPiA+ PiArICAgICAgIEJJVCgzMSksIC8qIGdhdGUgKi8KPiA+PiArICAgICAgIDApOwo+ID4+ICsKPiA+ PiArc3RhdGljIFNVTlhJX0NDVV9NUF9EQVRBX1dJVEhfTVVYX0dBVEUoc3BpM19jbGssICJzcGkz Iiwgc3BpX3BhcmVudHMsIDB4OTRjLAo+ID4+ICsgICAgICAgMCwgNCwgLyogTSAqLwo+ID4+ICsg ICAgICAgOCwgMiwgLyogUCAqLwo+ID4+ICsgICAgICAgMjQsIDMsIC8qIG11eCAqLwo+ID4+ICsg ICAgICAgQklUKDMxKSwgLyogZ2F0ZSAqLwo+ID4+ICsgICAgICAgMCk7Cj4gPj4gKwo+ID4+ICtz dGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19zcGkwX2NsaywgImJ1cy1zcGkwIiwgYWhiX2h3 cywKPiA+PiArICAweDk2YywgQklUKDApLCAwKTsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRF X0hXUyhidXNfc3BpMV9jbGssICJidXMtc3BpMSIsIGFoYl9od3MsCj4gPj4gKyAgMHg5NmMsIEJJ VCgxKSwgMCk7Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX3NwaTJfY2xrLCAi YnVzLXNwaTIiLCBhaGJfaHdzLAo+ID4+ICsgIDB4OTZjLCBCSVQoMiksIDApOwo+ID4+ICtzdGF0 aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19zcGkzX2NsaywgImJ1cy1zcGkzIiwgYWhiX2h3cywK PiA+PiArICAweDk2YywgQklUKDMpLCAwKTsKPiA+PiArCj4gPj4gKwo+ID4+ICtzdGF0aWMgY29u c3Qgc3RydWN0IGNsa19wYXJlbnRfZGF0YSBzcGlmX3BhcmVudHNbXSA9IHsKPiA+PiArIHsgLmZ3 X25hbWUgPSAiaG9zYyIgfSwKPiA+PiArIHsgLmh3ID0gJnBsbF9wZXJpcGhfNDAwTV9jbGsuaHcs IH0sCj4gPj4gKyB7IC5odyA9ICZwbGxfcGVyaXBoXzMwME1fY2xrLmh3LCB9LAo+ID4+ICt9Owo+ ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NX0RBVEFfV0lUSF9NVVhfR0FURShzcGlmX2Ns aywgInNwaWYiLCBzcGlmX3BhcmVudHMsIDB4MDk1MCwKPiA+PiArICAgICAgMCwgNCwgLyogTSAq Lwo+ID4+ICsgICAgICAyNCwgMywgLyogbXV4ICovCj4gPj4gKyAgICAgIEJJVCgzMSksIC8qIGdh dGUgKi8KPiA+PiArICAgICAgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7Cj4gPiAKPiA+IFRoaXMgaXMg TVAgY2xvY2ssIFAgYmVpbmcgYXQgOTo4Lgo+IAo+IHllcywgdGhlIEJTUCBkcml2ZXIgWzFdIG1v ZGVsIGl0IHdpdGggb25seSBNLCBJ4oCZbGwgdXBkYXRlIGl0IHRvIE1QLgo+IAo+ID4gCj4gPj4g Kwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19zcGlmX2NsaywgImJ1cy1zcGlm IiwgYWhiX2h3cywKPiA+PiArICAweDA5NmMsIEJJVCg0KSwgMCk7Cj4gPj4gKwo+ID4+ICsKPiA+ PiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfaHcgKnBsbF9wZXJpcGhfMTUwTV9od3NbXSA9IHsg JnBsbF9wZXJpcGhfMTUwTV9jbGsuaHcgfTsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hX U19XSVRIX1BSRURJVihlbWFjXzI1TV9jbGssICJlbWFjLTI1TSIsIHBsbF9wZXJpcGhfMTUwTV9o d3MsCj4gPj4gKyAgICAgIDB4OTcwLCBCSVQoMzEpIHwgQklUKDMwKSwgNiwgMCk7Cj4gPj4gKwo+ ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19lbWFjX2NsaywgImJ1cy1lbWFjIiwg YWhiX2h3cywKPiA+PiArICAweDk3YywgQklUKDApLCAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBT VU5YSV9DQ1VfR0FURV9IV1MoYnVzX2dwYWRjX2NsaywgImJ1cy1ncGFkYyIsIGFwYjBfaHdzLAo+ ID4+ICsgIDB4OWVjLCBCSVQoMCksIDApOwo+ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9H QVRFX0hXUyhidXNfdGhzX2NsaywgImJ1cy10aHMiLCBhaGJfaHdzLAo+ID4+ICsgIDB4OWZjLCBC SVQoMCksIDApOwo+ID4+ICsKPiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2h3 ICphdWRpb19wYXJlbnRzW10gPSB7Cj4gPj4gKyAmcGxsX2F1ZGlvXzF4X2Nsay5jb21tb24uaHcs Cj4gPj4gKyAmcGxsX2F1ZGlvXzR4X2Nsay5jb21tb24uaHcsCj4gPj4gK307Cj4gPj4gKwo+ID4+ ICtzdGF0aWMgU1VOWElfQ0NVX01fSFdfV0lUSF9NVVhfR0FURShpMnMwX2NsaywgImkyczAiLCBh dWRpb19wYXJlbnRzLCAweGExMCwKPiA+PiArICAgIDAsIDQsIC8qIE0gKi8KPiA+PiArICAgIDI0 LCAxLCAvKiBtdXggKi8KPiA+PiArICAgIEJJVCgzMSksIC8qIGdhdGUgKi8KPiA+PiArICAgIENM S19TRVRfUkFURV9QQVJFTlQpOwo+ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NX0hXX1dJ VEhfTVVYX0dBVEUoaTJzMV9jbGssICJpMnMxIiwgYXVkaW9fcGFyZW50cywgMHhhMTQsCj4gPj4g KyAgICAwLCA0LCAvKiBNICovCj4gPj4gKyAgICAyNCwgMSwgLyogbXV4ICovCj4gPj4gKyAgICBC SVQoMzEpLCAvKiBnYXRlICovCj4gPj4gKyAgICBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKPiA+PiAr Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2kyczBfY2xrLCAiYnVzLWkyczAi LCBhaGJfaHdzLAo+ID4+ICsgIDB4YTIwLCBCSVQoMCksIDApOwo+ID4+ICsKPiA+PiArc3RhdGlj IFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfaTJzMV9jbGssICJidXMtaTJzMSIsIGFoYl9od3MsCj4g Pj4gKyAgMHhhMjAsIEJJVCgxKSwgMCk7Cj4gPj4gKwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX01f SFdfV0lUSF9NVVhfR0FURShkbWljX2NsaywgImRtaWMiLCBhdWRpb19wYXJlbnRzLCAweGE0MCwK PiA+PiArICAgIDAsIDQsIC8qIE0gKi8KPiA+PiArICAgIDI0LCAxLCAvKiBtdXggKi8KPiA+PiAr ICAgIEJJVCgzMSksIC8qIGdhdGUgKi8KPiA+PiArICAgIENMS19TRVRfUkFURV9QQVJFTlQpOwo+ ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfZG1pY19jbGssICJidXMt ZG1pYyIsIGFoYl9od3MsCj4gPj4gKyAgMHhhNGMsIEJJVCgwKSwgMCk7Cj4gPj4gKwo+ID4+ICtz dGF0aWMgU1VOWElfQ0NVX01fSFdfV0lUSF9NVVhfR0FURShhdWRpb19jb2RlY19kYWNfY2xrLCAi YXVkaW8tY29kZWMtZGFjIiwgCj4gPj4gKyAgICBhdWRpb19wYXJlbnRzLCAweGE1MCwKPiA+PiAr ICAgIDAsIDQsIC8qIE0gKi8KPiA+PiArICAgIDI0LCAxLCAvKiBtdXggKi8KPiA+PiArICAgIEJJ VCgzMSksIC8qIGdhdGUgKi8KPiA+PiArICAgIENMS19TRVRfUkFURV9QQVJFTlQpOwo+ID4+ICsK PiA+PiArc3RhdGljIFNVTlhJX0NDVV9NX0hXX1dJVEhfTVVYX0dBVEUoYXVkaW9fY29kZWNfYWRj X2NsaywgImF1ZGlvLWNvZGVjLWFkYyIsIAo+ID4+ICsgICAgYXVkaW9fcGFyZW50cywgMHhhNTQs Cj4gPj4gKyAgICAwLCA0LCAvKiBNICovCj4gPj4gKyAgICAyNCwgMSwgLyogbXV4ICovCj4gPj4g KyAgICBCSVQoMzEpLCAvKiBnYXRlICovCj4gPj4gKyAgICBDTEtfU0VUX1JBVEVfUEFSRU5UKTsK PiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2F1ZGlvX2NvZGVjX2Ns aywgImJ1cy1hdWRpby1jb2RlYyIsIGFwYjBfaHdzLAo+ID4+ICsgIDB4YTVjLCBCSVQoMCksIDAp Owo+ID4+ICsKPiA+PiArLyoKPiA+PiArICogVGhlcmUgYXJlIE9IQ0kgMTJNIGNsb2NrIHNvdXJj ZSBzZWxlY3Rpb24gYml0cyBmb3IgdGhlIFVTQiAyLjAgcG9ydC4KPiA+PiArICogV2Ugd2lsbCBm b3JjZSB0aGVtIHRvIDAgKDEyTSBkaXZpZGVkIGZyb20gNDhNKS4KPiA+PiArICovCj4gPj4gK3N0 YXRpYyBDTEtfRklYRURfRkFDVE9SX0ZXX05BTUUob3NjMTJNX2NsaywgIm9zYzEyTSIsICJob3Nj IiwgMiwgMSwgMCk7Cj4gPj4gKwo+ID4+ICsjZGVmaW5lIFNVTjhJX1Y4NTNfVVNCX0NMS19SRUcg MHhhNzAKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURSh1c2Jfb2hjaV9jbGssICJ1 c2IiLCAib3NjMTJNIiwgMHgwYTcwLCBCSVQoMzEpLCAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBT VU5YSV9DQ1VfR0FURV9IV1MoYnVzX29oY2lfY2xrLCAiYnVzLW9oY2kiLCBhaGJfaHdzLCAweGE4 YywgQklUKDApLCAwKTsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfZWhjaV9j bGssICJidXMtZWhjaSIsIGFoYl9od3MsIDB4YThjLCBCSVQoNCksIDApOwo+ID4+ICtzdGF0aWMg U1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19vdGdfY2xrLCAiYnVzLW90ZyIsIGFoYl9od3MsIDB4YThj LCBCSVQoOCksIDApOwo+ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNf ZHBzc190b3BfY2xrLCAiYnVzLWRwc3MtdG9wIiwgYWhiX2h3cywKPiA+PiArICAweGFiYywgQklU KDApLCAwKTsKPiA+PiArCj4gPj4gKwo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19wYXJl bnRfZGF0YSBtaXBpX2RzaV9wYXJlbnRzW10gPSB7Cj4gPj4gKyB7IC5md19uYW1lID0gImhvc2Mi IH0sCj4gPj4gKyB7IC5odyA9ICZwbGxfcGVyaXBoXzIwME1fY2xrLmh3IH0sCj4gPj4gKyB7IC5o dyA9ICZwbGxfcGVyaXBoXzE1ME1fY2xrLmh3IH0sCj4gPj4gK307Cj4gPj4gK3N0YXRpYyBTVU5Y SV9DQ1VfTV9EQVRBX1dJVEhfTVVYX0dBVEUobWlwaV9kc2lfY2xrLCAibWlwaS1kc2kiLCBtaXBp X2RzaV9wYXJlbnRzLCAKPiA+PiArICAgICAgMHhiMjQsCj4gPj4gKyAgICAgIDAsIDQsIC8qIE0g Ki8KPiA+PiArICAgICAgMjQsIDMsIC8qIG11eCAqLwo+ID4+ICsgICAgICBCSVQoMzEpLCAvKiBn YXRlICovCj4gPj4gKyAgICAgIENMS19TRVRfUkFURV9QQVJFTlQpOwo+ID4gCj4gPiBDTEtfU0VU X1JBVEVfUEFSRU5UIGRvZXNuJ3QgZG8gYW55dGhpbmcgZm9yIGNvbnN0YW50IGNsb2Nrcy4KPiA+ IAo+IAo+IG9rCj4gCj4gPiBCZXN0IHJlZ2FyZHMsCj4gPiBKZXJuZWoKPiA+IAo+ID4+ICsKPiA+ PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfbWlwaV9kc2lfY2xrLCAiYnVzLW1pcGkt ZHNpIiwgYWhiX2h3cywKPiA+PiArICAweGI0YywgQklUKDApLCAwKTsKPiA+PiArCj4gPj4gKwo+ ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19odyAqdGNvbl9sY2RfcGFyZW50c1tdID0gewo+ ID4+ICsgJnBsbF92aWRlb180eF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgJnBsbF9wZXJpcGhfMnhf Y2xrLmNvbW1vbi5odywKPiA+PiArICZwbGxfY3NpXzR4X2Nsay5jb21tb24uaHcsCj4gPj4gK307 Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVBfSFdfV0lUSF9NVVhfR0FURSh0Y29uX2xjZF9jbGss ICJ0Y29uLWxjZCIsIHRjb25fbGNkX3BhcmVudHMsIAo+ID4+ICsgICAgIDB4YjYwLAo+ID4+ICsg ICAgIDAsIDQsIC8qIE0gKi8KPiA+PiArICAgICA4LCAyLCAvKiBQICovCj4gPj4gKyAgICAgMjQs IDMsIC8qIG11eCAqLwo+ID4+ICsgICAgIEJJVCgzMSksIC8qIGdhdGUgKi8KPiA+PiArICAgICBD TEtfU0VUX1JBVEVfUEFSRU5UKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9I V1MoYnVzX3Rjb25fbGNkX2NsaywgImJ1cy10Y29uLWxjZCIsIGFoYl9od3MsCj4gPj4gKyAgMHhi N2MsIEJJVCgwKSwgMCk7Cj4gPj4gKwo+ID4+ICsKPiA+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBj bGtfaHcgKmNzaV90b3BfcGFyZW50c1tdID0gewo+ID4+ICsgJnBsbF9wZXJpcGhfMzAwTV9jbGsu aHcsCj4gPj4gKyAmcGxsX3BlcmlwaF80MDBNX2Nsay5odywKPiA+PiArICZwbGxfdmlkZW9fNHhf Y2xrLmNvbW1vbi5odywKPiA+PiArICZwbGxfY3NpXzR4X2Nsay5jb21tb24uaHcsCj4gPj4gK307 Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9IV19XSVRIX01VWF9HQVRFKGNzaV90b3BfY2xrLCAi Y3NpLXRvcCIsIGNzaV90b3BfcGFyZW50cywgMHhjMDQsCj4gPj4gKyAgICAwLCA1LCAvKiBNICov Cj4gPj4gKyAgICAyNCwgMywgLyogbXV4ICovCj4gPj4gKyAgICBCSVQoMzEpLCAvKiBnYXRlICov Cj4gPj4gKyAgICAwKTsKPiA+PiArCj4gPj4gKwo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNs a19wYXJlbnRfZGF0YSBjc2lfbWNsa19wYXJlbnRzW10gPSB7Cj4gPj4gKyB7IC5md19uYW1lID0g Imhvc2MiIH0sCj4gPj4gKyB7IC5odyA9ICZwbGxfY3NpXzR4X2Nsay5jb21tb24uaHcgfSwKPiA+ PiArIHsgLmh3ID0gJnBsbF92aWRlb180eF9jbGsuY29tbW9uLmh3IH0sCj4gPj4gKyB7IC5odyA9 ICZwbGxfcGVyaXBoXzJ4X2Nsay5jb21tb24uaHcgfSwKPiA+PiArfTsKPiA+PiArc3RhdGljIFNV TlhJX0NDVV9NX0RBVEFfV0lUSF9NVVhfR0FURShjc2lfbWNsazBfY2xrLCAiY3NpLW1jbGswIiwg Y3NpX21jbGtfcGFyZW50cywgCj4gPj4gKyAgICAgIDB4YzA4LAo+ID4+ICsgICAgICAwLCA1LCAv KiBNICovCj4gPj4gKyAgICAgIDI0LCAzLCAvKiBtdXggKi8KPiA+PiArICAgICAgQklUKDMxKSwg LyogZ2F0ZSAqLwo+ID4+ICsgICAgICAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1Vf TV9EQVRBX1dJVEhfTVVYX0dBVEUoY3NpX21jbGsxX2NsaywgImNzaS1tY2xrMSIsIGNzaV9tY2xr X3BhcmVudHMsIAo+ID4+ICsgICAgICAweGMwYywKPiA+PiArICAgICAgMCwgNSwgLyogTSAqLwo+ ID4+ICsgICAgICAyNCwgMywgLyogbXV4ICovCj4gPj4gKyAgICAgIEJJVCgzMSksIC8qIGdhdGUg Ki8KPiA+PiArICAgICAgMCk7Cj4gPj4gKwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX01fREFUQV9X SVRIX01VWF9HQVRFKGNzaV9tY2xrMl9jbGssICJjc2ktbWNsazIiLCBjc2lfbWNsa19wYXJlbnRz LCAKPiA+PiArICAgICAgMHhjMTAsCj4gPj4gKyAgICAgIDAsIDUsIC8qIE0gKi8KPiA+PiArICAg ICAgMjQsIDMsIC8qIG11eCAqLwo+ID4+ICsgICAgICBCSVQoMzEpLCAvKiBnYXRlICovCj4gPj4g KyAgICAgIDApOwo+ID4gCj4gPiBBbGwgQ1NJIG1jbGtzIHNob3VsZCBiZSBNUCB0eXBlLgo+ID4g Cj4gCj4gQWdhaW4sIHRoZXNlIGFyZSBmcm9tIHRoZSBCU1AsIEnigJlsbCB1cGRhdGUgdGhlbS4K PiAKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2NzaV9jbGssICJi dXMtY3NpIiwgYWhiX2h3cywKPiA+PiArICAweGMyYywgQklUKDApLCAwKTsKPiA+PiArCj4gPj4g Kwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c193aWVnYW5kX2NsaywgImJ1cy13 aWVnYW5kIiwgYWhiX2h3cywKPiA+PiArICAweGM3YywgQklUKDApLCAwKTsKPiA+PiArCj4gPj4g Kwo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19wYXJlbnRfZGF0YSByaXNjdl9wYXJlbnRz W10gPSB7Cj4gPj4gKyB7IC5md19uYW1lID0gImhvc2MiIH0sCj4gPj4gKyB7IC5md19uYW1lID0g Imxvc2MiIH0sCj4gPj4gKyB7IC5md19uYW1lID0gImlvc2MiIH0sCj4gPj4gKyB7IC5odyA9ICZw bGxfcGVyaXBoXzYwME1fY2xrLmh3IH0sCj4gPj4gKyB7IC5odyA9ICZwbGxfcGVyaXBoXzQ4ME1f Y2xrLmNvbW1vbi5odyB9LAo+ID4+ICsgeyAuaHcgPSAmcGxsX2NwdV9jbGsuY29tbW9uLmh3IH0s Cj4gPj4gK307Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9EQVRBX1dJVEhfTVVYKHJpc2N2X2Ns aywgInJpc2N2LWNwdSIsIHJpc2N2X3BhcmVudHMsIDB4ZDAwLAo+ID4+ICsgMCwgNSwgLyogTSAq Lwo+ID4+ICsgMjQsIDMsIC8qIG11eCAqLwo+ID4+ICsgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7Cj4g Pj4gKwo+ID4+ICsvKiBUaGUgcmlzY3YtYXhpIGNsayBtdXN0IGJlIGRpdmlkZWQgYnkgYXQgbGVh c3QgMi4gKi8KPiA+PiArc3RhdGljIHN0cnVjdCBjbGtfZGl2X3RhYmxlIHJpc2N2X2F4aV90YWJs ZVtdID0gewo+ID4+ICsgeyAudmFsID0gMSwgLmRpdiA9IDIgfSwKPiA+PiArIHsgLnZhbCA9IDIs IC5kaXYgPSAzIH0sCj4gPj4gKyB7IC52YWwgPSAzLCAuZGl2ID0gNCB9LAo+ID4+ICsgeyAvKiBT ZW50aW5lbCAqLyB9Cj4gPj4gK307Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfRElWX1RBQkxFX0hX KHJpc2N2X2F4aV9jbGssICJyaXNjdi1heGkiLCAmcmlzY3ZfY2xrLmNvbW1vbi5odywKPiA+PiAr ICAgICAgMHhkMDAsIDgsIDIsIHJpc2N2X2F4aV90YWJsZSwgMCk7Cj4gPj4gKwo+ID4+ICtzdGF0 aWMgU1VOWElfQ0NVX0dBVEVfSFdTX1dJVEhfS0VZKHJpc2N2X2NvcmVfZ2F0ZSwgInJpc2N2LWNv cmUtZ2F0ZSIsIGFoYl9od3MsCj4gPj4gKyAgIDB4ZDA0LCBCSVQoMCksIDApOwo+ID4+ICsKPiA+ PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhyaXNjdl9jZmdfZ2F0ZSwgInJpc2N2LWNmZy1n YXRlIiwgYWhiX2h3cywKPiA+PiArICAweGQwYywgQklUKDApLCAwKTsKPiA+PiArCj4gPj4gKwo+ ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19odyAqcGxsX3BlcmlwaF8xNjBNX2h3c1tdID0g ewo+ID4+ICsgJnBsbF9wZXJpcGhfMTYwTV9jbGsuaHcsCj4gPj4gK307Cj4gPj4gKwo+ID4+ICtz dGF0aWMgU1VOWElfQ0NVX0dBVEVfREFUQShmYW5vdXRfMjRNX2NsaywgImZhbm91dC0yNE0iLCBv c2MyNE0sCj4gPj4gKyAgIDB4ZjMwLCBCSVQoMCksIDApOwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NV X0dBVEVfREFUQV9XSVRIX1BSRURJVihmYW5vdXRfMTJNX2NsaywgImZhbm91dC0xMk0iLCBvc2My NE0sCj4gPj4gKyAgICAgICAweGYzMCwgQklUKDEpLCAyLCAwKTsKPiA+PiArc3RhdGljIFNVTlhJ X0NDVV9HQVRFX0hXU19XSVRIX1BSRURJVihmYW5vdXRfMTZNX2NsaywgImZhbm91dC0xNk0iLCBw bGxfcGVyaXBoXzE2ME1faHdzLAo+ID4+ICsgICAgICAweGYzMCwgQklUKDIpLCAxMCwgMCk7Cj4g Pj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1NfV0lUSF9QUkVESVYoZmFub3V0XzI1TV9jbGss ICJmYW5vdXQtMjVNIiwgcGxsX3BlcmlwaF8xNTBNX2h3cywKPiA+PiArICAgICAgMHhmMzAsIEJJ VCgzKSwgNiwgMCk7Cj4gPj4gKwo+ID4+ICsKPiA+PiArLyogVGhpcyBjbG9jayBoYXMgYSBzZWNv bmQgZGl2aWRlciB0aGF0IGlzIG5vdCBtb2RlbGxlZCBhbmQgZm9yY2VkIHRvIDAuICovCj4gPj4g KyNkZWZpbmUgU1VOOElfVjg1M19GQU5PVVRfMjdNX1JFRyAweGYzNAo+ID4+ICtzdGF0aWMgY29u c3Qgc3RydWN0IGNsa19odyAqZmFub3V0XzI3TV9wYXJlbnRzW10gPSB7Cj4gPj4gKyAmcGxsX3Zp ZGVvXzF4X2Nsay5odywKPiA+PiArICZwbGxfY3NpX2Nsay5odywKPiA+PiArICZwbGxfcGVyaXBo XzMwME1fY2xrLmh3LAo+ID4+ICt9Owo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX01fSFdfV0lUSF9N VVhfR0FURShmYW5vdXRfMjdNX2NsaywgImZhbm91dC0yN00iLCAKPiA+PiArICAgIGZhbm91dF8y N01fcGFyZW50cywgMHhmMzQsCj4gPj4gKyAgICAwLCA1LCAvKiBNICovCj4gPj4gKyAgICAyNCwg MiwgLyogbXV4ICovCj4gPj4gKyAgICBCSVQoMzEpLCAvKiBnYXRlICovCj4gPj4gKyAgICAwKTsK PiA+PiArc3RhdGljIFNVTlhJX0NDVV9NX0hXU19XSVRIX0dBVEUoZmFub3V0X3BjbGtfY2xrLCAi ZmFub3V0LXBjbGsiLCBhcGIwX2h3cywgMHhmMzgsCj4gPj4gKyAwLCA1LCAvKiBNICovCj4gPj4g KyBCSVQoMzEpLCAvKiBnYXRlICovCj4gPj4gKyAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBjb25z dCBzdHJ1Y3QgY2xrX3BhcmVudF9kYXRhIGZhbm91dF9wYXJlbnRzW10gPSB7Cj4gPj4gKyB7IC5m d19uYW1lID0gImxvc2MiIH0sCj4gPj4gKyB7IC5odyA9ICZmYW5vdXRfMTJNX2Nsay5jb21tb24u aHcgfSwKPiA+PiArIHsgLmh3ID0gJmZhbm91dF8xNk1fY2xrLmNvbW1vbi5odyB9LAo+ID4+ICsg eyAuaHcgPSAmZmFub3V0XzI0TV9jbGsuY29tbW9uLmh3IH0sCj4gPj4gKyB7IC5odyA9ICZmYW5v dXRfMjVNX2Nsay5jb21tb24uaHcgfSwKPiA+PiArIHsgLmh3ID0gJmZhbm91dF8yN01fY2xrLmNv bW1vbi5odyB9LAo+ID4+ICsgeyAuaHcgPSAmZmFub3V0X3BjbGtfY2xrLmNvbW1vbi5odyB9LAo+ ID4+ICt9Owo+ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NVVhfREFUQV9XSVRIX0dBVEUo ZmFub3V0MF9jbGssICJmYW5vdXQwIiwgZmFub3V0X3BhcmVudHMsIDB4ZjNjLAo+ID4+ICsgICAg MCwgMywgLyogbXV4ICovCj4gPj4gKyAgICBCSVQoMjEpLCAvKiBnYXRlICovCj4gPj4gKyAgICAw KTsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NVVhfREFUQV9XSVRIX0dBVEUoZmFub3V0MV9jbGss ICJmYW5vdXQxIiwgZmFub3V0X3BhcmVudHMsIDB4ZjNjLAo+ID4+ICsgICAgMywgMywgLyogbXV4 ICovCj4gPj4gKyAgICBCSVQoMjIpLCAvKiBnYXRlICovCj4gPj4gKyAgICAwKTsKPiA+PiArc3Rh dGljIFNVTlhJX0NDVV9NVVhfREFUQV9XSVRIX0dBVEUoZmFub3V0Ml9jbGssICJmYW5vdXQyIiwg ZmFub3V0X3BhcmVudHMsIDB4ZjNjLAo+ID4+ICsgICAgNiwgMywgLyogbXV4ICovCj4gPj4gKyAg ICBCSVQoMjMpLCAvKiBnYXRlICovCj4gPj4gKyAgICAwKTsKPiA+PiArCj4gPj4gKwo+ID4+ICtz dGF0aWMgc3RydWN0IGNjdV9jb21tb24gKnN1bjhpX3Y4NTNfY2N1X2Nsa3NbXSA9IHsKPiA+PiAr ICZwbGxfY3B1X2Nsay5jb21tb24sCj4gPj4gKyAmcGxsX2Rkcl9jbGsuY29tbW9uLAo+ID4+ICsg JnBsbF9wZXJpcGhfNHhfY2xrLmNvbW1vbiwKPiA+PiArICZwbGxfcGVyaXBoXzJ4X2Nsay5jb21t b24sCj4gPj4gKyAmcGxsX3BlcmlwaF84MDBNX2Nsay5jb21tb24sCj4gPj4gKyAmcGxsX3Blcmlw aF80ODBNX2Nsay5jb21tb24sCj4gPj4gKyAmcGxsX3ZpZGVvXzR4X2Nsay5jb21tb24sCj4gPj4g KyAmcGxsX2NzaV80eF9jbGsuY29tbW9uLAo+ID4+ICsgJnBsbF9hdWRpb19kaXYyX2Nsay5jb21t b24sCj4gPj4gKyAmcGxsX2F1ZGlvX2RpdjVfY2xrLmNvbW1vbiwKPiA+PiArICZwbGxfYXVkaW9f NHhfY2xrLmNvbW1vbiwKPiA+PiArICZwbGxfYXVkaW9fMXhfY2xrLmNvbW1vbiwKPiA+PiArICZw bGxfbnB1XzR4X2Nsay5jb21tb24sCj4gPj4gKyAmY3B1X2Nsay5jb21tb24sCj4gPj4gKyAmY3B1 X2F4aV9jbGsuY29tbW9uLAo+ID4+ICsgJmNwdV9hcGJfY2xrLmNvbW1vbiwKPiA+PiArICZhaGJf Y2xrLmNvbW1vbiwKPiA+PiArICZhcGIwX2Nsay5jb21tb24sCj4gPj4gKyAmYXBiMV9jbGsuY29t bW9uLAo+ID4+ICsgJmRlX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX2RlX2Nsay5jb21tb24sCj4g Pj4gKyAmZzJkX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX2cyZF9jbGsuY29tbW9uLAo+ID4+ICsg JmNlX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX2NlX2Nsay5jb21tb24sCj4gPj4gKyAmdmVfY2xr LmNvbW1vbiwKPiA+PiArICZidXNfdmVfY2xrLmNvbW1vbiwKPiA+PiArICZucHVfY2xrLmNvbW1v biwKPiA+PiArICZidXNfbnB1X2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX2RtYV9jbGsuY29tbW9u LAo+ID4+ICsgJmJ1c19tc2dib3gwX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX21zZ2JveDFfY2xr LmNvbW1vbiwKPiA+PiArICZidXNfc3BpbmxvY2tfY2xrLmNvbW1vbiwKPiA+PiArICZidXNfaHN0 aW1lcl9jbGsuY29tbW9uLAo+ID4+ICsgJmF2c19jbGsuY29tbW9uLAo+ID4+ICsgJmJ1c19kYmdf Y2xrLmNvbW1vbiwKPiA+PiArICZidXNfcHdtX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX2lvbW11 X2Nsay5jb21tb24sCj4gPj4gKyAmZHJhbV9jbGsuY29tbW9uLAo+ID4+ICsgJm1idXNfZG1hX2Ns ay5jb21tb24sCj4gPj4gKyAmbWJ1c192ZV9jbGsuY29tbW9uLAo+ID4+ICsgJm1idXNfY2VfY2xr LmNvbW1vbiwKPiA+PiArICZtYnVzX2NzaV9jbGsuY29tbW9uLAo+ID4+ICsgJm1idXNfaXNwX2Ns ay5jb21tb24sCj4gPj4gKyAmbWJ1c19nMmRfY2xrLmNvbW1vbiwKPiA+PiArICZidXNfZHJhbV9j bGsuY29tbW9uLAo+ID4+ICsgJm1tYzBfY2xrLmNvbW1vbiwKPiA+PiArICZtbWMxX2Nsay5jb21t b24sCj4gPj4gKyAmbW1jMl9jbGsuY29tbW9uLAo+ID4+ICsgJmJ1c19tbWMwX2Nsay5jb21tb24s Cj4gPj4gKyAmYnVzX21tYzFfY2xrLmNvbW1vbiwKPiA+PiArICZidXNfbW1jMl9jbGsuY29tbW9u LAo+ID4+ICsgJmJ1c191YXJ0MF9jbGsuY29tbW9uLAo+ID4+ICsgJmJ1c191YXJ0MV9jbGsuY29t bW9uLAo+ID4+ICsgJmJ1c191YXJ0Ml9jbGsuY29tbW9uLAo+ID4+ICsgJmJ1c191YXJ0M19jbGsu Y29tbW9uLAo+ID4+ICsgJmJ1c19pMmMwX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX2kyYzFfY2xr LmNvbW1vbiwKPiA+PiArICZidXNfaTJjMl9jbGsuY29tbW9uLAo+ID4+ICsgJmJ1c19pMmMzX2Ns ay5jb21tb24sCj4gPj4gKyAmYnVzX2kyYzRfY2xrLmNvbW1vbiwKPiA+PiArICZzcGkwX2Nsay5j b21tb24sCj4gPj4gKyAmc3BpMV9jbGsuY29tbW9uLAo+ID4+ICsgJnNwaTJfY2xrLmNvbW1vbiwK PiA+PiArICZzcGkzX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX3NwaTBfY2xrLmNvbW1vbiwKPiA+ PiArICZidXNfc3BpMV9jbGsuY29tbW9uLAo+ID4+ICsgJmJ1c19zcGkyX2Nsay5jb21tb24sCj4g Pj4gKyAmYnVzX3NwaTNfY2xrLmNvbW1vbiwKPiA+PiArICZzcGlmX2Nsay5jb21tb24sCj4gPj4g KyAmYnVzX3NwaWZfY2xrLmNvbW1vbiwKPiA+PiArICZlbWFjXzI1TV9jbGsuY29tbW9uLAo+ID4+ ICsgJmJ1c19lbWFjX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX2dwYWRjX2Nsay5jb21tb24sCj4g Pj4gKyAmYnVzX3Roc19jbGsuY29tbW9uLAo+ID4+ICsgJnVzYl9vaGNpX2Nsay5jb21tb24sCj4g Pj4gKyAmYnVzX29oY2lfY2xrLmNvbW1vbiwKPiA+PiArICZidXNfZWhjaV9jbGsuY29tbW9uLAo+ ID4+ICsgJmJ1c19vdGdfY2xrLmNvbW1vbiwKPiA+PiArICZpMnMwX2Nsay5jb21tb24sCj4gPj4g KyAmaTJzMV9jbGsuY29tbW9uLAo+ID4+ICsgJmJ1c19pMnMwX2Nsay5jb21tb24sCj4gPj4gKyAm YnVzX2kyczFfY2xrLmNvbW1vbiwKPiA+PiArICZkbWljX2Nsay5jb21tb24sCj4gPj4gKyAmYnVz X2RtaWNfY2xrLmNvbW1vbiwKPiA+PiArICZhdWRpb19jb2RlY19kYWNfY2xrLmNvbW1vbiwKPiA+ PiArICZhdWRpb19jb2RlY19hZGNfY2xrLmNvbW1vbiwKPiA+PiArICZidXNfYXVkaW9fY29kZWNf Y2xrLmNvbW1vbiwKPiA+PiArICZidXNfZHBzc190b3BfY2xrLmNvbW1vbiwKPiA+PiArICZtaXBp X2RzaV9jbGsuY29tbW9uLAo+ID4+ICsgJmJ1c19taXBpX2RzaV9jbGsuY29tbW9uLAo+ID4+ICsg JnRjb25fbGNkX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX3Rjb25fbGNkX2Nsay5jb21tb24sCj4g Pj4gKyAmY3NpX3RvcF9jbGsuY29tbW9uLAo+ID4+ICsgJmNzaV9tY2xrMF9jbGsuY29tbW9uLAo+ ID4+ICsgJmNzaV9tY2xrMV9jbGsuY29tbW9uLAo+ID4+ICsgJmNzaV9tY2xrMl9jbGsuY29tbW9u LAo+ID4+ICsgJmJ1c19jc2lfY2xrLmNvbW1vbiwKPiA+PiArICZidXNfd2llZ2FuZF9jbGsuY29t bW9uLAo+ID4+ICsgJnJpc2N2X2Nsay5jb21tb24sCj4gPj4gKyAmcmlzY3ZfYXhpX2Nsay5jb21t b24sCj4gPj4gKyAmcmlzY3ZfY29yZV9nYXRlLmNvbW1vbiwKPiA+PiArICZyaXNjdl9jZmdfZ2F0 ZS5jb21tb24sCj4gPj4gKyAmZmFub3V0XzI0TV9jbGsuY29tbW9uLAo+ID4+ICsgJmZhbm91dF8x Mk1fY2xrLmNvbW1vbiwKPiA+PiArICZmYW5vdXRfMTZNX2Nsay5jb21tb24sCj4gPj4gKyAmZmFu b3V0XzI1TV9jbGsuY29tbW9uLAo+ID4+ICsgJmZhbm91dF8yN01fY2xrLmNvbW1vbiwKPiA+PiAr ICZmYW5vdXRfcGNsa19jbGsuY29tbW9uLAo+ID4+ICsgJmZhbm91dDBfY2xrLmNvbW1vbiwKPiA+ PiArICZmYW5vdXQxX2Nsay5jb21tb24sCj4gPj4gKyAmZmFub3V0Ml9jbGsuY29tbW9uLAo+ID4+ ICt9Owo+ID4+ICsKPiA+PiArc3RhdGljIHN0cnVjdCBjbGtfaHdfb25lY2VsbF9kYXRhIHN1bjhp X3Y4NTNfaHdfY2xrcyA9IHsKPiA+PiArIC5udW0gPSBDTEtfTlVNQkVSLAo+ID4+ICsgLmh3cyA9 IHsKPiA+PiArIFtDTEtfT1NDMTJNXSAgICAgICAgICAgID0gJm9zYzEyTV9jbGsuaHcsCj4gPj4g KyBbQ0xLX1BMTF9DUFVdID0gJnBsbF9jcHVfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfUExM X0REUl0gPSAmcGxsX2Rkcl9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19QTExfUEVSSVBIXzRY XSA9ICZwbGxfcGVyaXBoXzR4X2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX1BMTF9QRVJJUEhf MlhdID0gJnBsbF9wZXJpcGhfMnhfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfUExMX1BFUklQ SF84MDBNXSA9ICZwbGxfcGVyaXBoXzgwME1fY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfUExM X1BFUklQSF80ODBNXSA9ICZwbGxfcGVyaXBoXzQ4ME1fY2xrLmNvbW1vbi5odywKPiA+PiArIFtD TEtfUExMX1BFUklQSF82MDBNXSA9ICZwbGxfcGVyaXBoXzYwME1fY2xrLmh3LAo+ID4+ICsgW0NM S19QTExfUEVSSVBIXzQwME1dID0gJnBsbF9wZXJpcGhfNDAwTV9jbGsuaHcsCj4gPj4gKyBbQ0xL X1BMTF9QRVJJUEhfMzAwTV0gPSAmcGxsX3BlcmlwaF8zMDBNX2Nsay5odywKPiA+PiArIFtDTEtf UExMX1BFUklQSF8yMDBNXSA9ICZwbGxfcGVyaXBoXzIwME1fY2xrLmh3LAo+ID4+ICsgW0NMS19Q TExfUEVSSVBIXzE2ME1dID0gJnBsbF9wZXJpcGhfMTYwTV9jbGsuaHcsCj4gPj4gKyBbQ0xLX1BM TF9QRVJJUEhfMTUwTV0gPSAmcGxsX3BlcmlwaF8xNTBNX2Nsay5odywKPiA+PiArIFtDTEtfUExM X1ZJREVPXzRYXSA9ICZwbGxfdmlkZW9fNHhfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfUExM X1ZJREVPXzJYXSA9ICZwbGxfdmlkZW9fMnhfY2xrLmh3LAo+ID4+ICsgW0NMS19QTExfVklERU9f MVhdID0gJnBsbF92aWRlb18xeF9jbGsuaHcsCj4gPj4gKyBbQ0xLX1BMTF9DU0lfNFhdID0gJnBs bF9jc2lfNHhfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfUExMX0FVRElPX0RJVjJdID0gJnBs bF9hdWRpb19kaXYyX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX1BMTF9BVURJT19ESVY1XSA9 ICZwbGxfYXVkaW9fZGl2NV9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19QTExfQVVESU9fNFhd ID0gJnBsbF9hdWRpb180eF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19QTExfQVVESU9fMVhd ID0gJnBsbF9hdWRpb18xeF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19QTExfTlBVXzRYXSA9 ICZwbGxfbnB1XzR4X2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0NQVV0gPSAmY3B1X2Nsay5j b21tb24uaHcsCj4gPj4gKyBbQ0xLX0NQVV9BWEldID0gJmNwdV9heGlfY2xrLmNvbW1vbi5odywK PiA+PiArIFtDTEtfQ1BVX0FQQl0gPSAmY3B1X2FwYl9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NM S19BSEJdID0gJmFoYl9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19BUEIwXSA9ICZhcGIwX2Ns ay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0FQQjFdID0gJmFwYjFfY2xrLmNvbW1vbi5odywKPiA+ PiArIFtDTEtfTUJVU10gPSAmbWJ1c19jbGsuaHcsCj4gPj4gKyBbQ0xLX0RFXSA9ICZkZV9jbGsu Y29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfREVdID0gJmJ1c19kZV9jbGsuY29tbW9uLmh3LAo+ ID4+ICsgW0NMS19HMkRdID0gJmcyZF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfRzJE XSA9ICZidXNfZzJkX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0NFXSA9ICZjZV9jbGsuY29t bW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfQ0VdID0gJmJ1c19jZV9jbGsuY29tbW9uLmh3LAo+ID4+ ICsgW0NMS19WRV0gPSAmdmVfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfQlVTX1ZFXSA9ICZi dXNfdmVfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfTlBVXSA9ICZucHVfY2xrLmNvbW1vbi5o dywKPiA+PiArIFtDTEtfQlVTX05QVV0gPSAmYnVzX25wdV9jbGsuY29tbW9uLmh3LAo+ID4+ICsg W0NMS19CVVNfRE1BXSA9ICZidXNfZG1hX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0JVU19N U0dCT1gwXSA9ICZidXNfbXNnYm94MF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfTVNH Qk9YMV0gPSAmYnVzX21zZ2JveDFfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfQlVTX1NQSU5M T0NLXSA9ICZidXNfc3BpbmxvY2tfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfQlVTX0hTVElN RVJdID0gJmJ1c19oc3RpbWVyX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0FWU10gPSAmYXZz X2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0JVU19EQkddID0gJmJ1c19kYmdfY2xrLmNvbW1v bi5odywKPiA+PiArIFtDTEtfQlVTX1BXTV0gPSAmYnVzX3B3bV9jbGsuY29tbW9uLmh3LAo+ID4+ ICsgW0NMS19CVVNfSU9NTVVdID0gJmJ1c19pb21tdV9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NM S19EUkFNXSA9ICZkcmFtX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX01CVVNfRE1BXSA9ICZt YnVzX2RtYV9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19NQlVTX1ZFXSA9ICZtYnVzX3ZlX2Ns ay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX01CVVNfQ0VdID0gJm1idXNfY2VfY2xrLmNvbW1vbi5o dywKPiA+PiArIFtDTEtfTUJVU19DU0ldID0gJm1idXNfY3NpX2Nsay5jb21tb24uaHcsCj4gPj4g KyBbQ0xLX01CVVNfSVNQXSA9ICZtYnVzX2lzcF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19N QlVTX0cyRF0gPSAmbWJ1c19nMmRfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfQlVTX0RSQU1d ID0gJmJ1c19kcmFtX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX01NQzBdID0gJm1tYzBfY2xr LmNvbW1vbi5odywKPiA+PiArIFtDTEtfTU1DMV0gPSAmbW1jMV9jbGsuY29tbW9uLmh3LAo+ID4+ ICsgW0NMS19NTUMyXSA9ICZtbWMyX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0JVU19NTUMw XSA9ICZidXNfbW1jMF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfTU1DMV0gPSAmYnVz X21tYzFfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfQlVTX01NQzJdID0gJmJ1c19tbWMyX2Ns ay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0JVU19VQVJUMF0gPSAmYnVzX3VhcnQwX2Nsay5jb21t b24uaHcsCj4gPj4gKyBbQ0xLX0JVU19VQVJUMV0gPSAmYnVzX3VhcnQxX2Nsay5jb21tb24uaHcs Cj4gPj4gKyBbQ0xLX0JVU19VQVJUMl0gPSAmYnVzX3VhcnQyX2Nsay5jb21tb24uaHcsCj4gPj4g KyBbQ0xLX0JVU19VQVJUM10gPSAmYnVzX3VhcnQzX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xL X0JVU19JMkMwXSA9ICZidXNfaTJjMF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfSTJD MV0gPSAmYnVzX2kyYzFfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfQlVTX0kyQzJdID0gJmJ1 c19pMmMyX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0JVU19JMkMzXSA9ICZidXNfaTJjM19j bGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfSTJDNF0gPSAmYnVzX2kyYzRfY2xrLmNvbW1v bi5odywKPiA+PiArIFtDTEtfU1BJMF0gPSAmc3BpMF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NM S19TUEkxXSA9ICZzcGkxX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX1NQSTJdID0gJnNwaTJf Y2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfU1BJM10gPSAmc3BpM19jbGsuY29tbW9uLmh3LAo+ ID4+ICsgW0NMS19CVVNfU1BJMF0gPSAmYnVzX3NwaTBfY2xrLmNvbW1vbi5odywKPiA+PiArIFtD TEtfQlVTX1NQSTFdID0gJmJ1c19zcGkxX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0JVU19T UEkyXSA9ICZidXNfc3BpMl9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfU1BJM10gPSAm YnVzX3NwaTNfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfU1BJRl0gPSAmc3BpZl9jbGsuY29t bW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfU1BJRl0gPSAmYnVzX3NwaWZfY2xrLmNvbW1vbi5odywK PiA+PiArIFtDTEtfRU1BQ18yNU1dID0gJmVtYWNfMjVNX2Nsay5jb21tb24uaHcsCj4gPj4gKyBb Q0xLX0JVU19FTUFDXSA9ICZidXNfZW1hY19jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNf R1BBRENdID0gJmJ1c19ncGFkY19jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfVEhTXSA9 ICZidXNfdGhzX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0kyUzBdID0gJmkyczBfY2xrLmNv bW1vbi5odywKPiA+PiArIFtDTEtfSTJTMV0gPSAmaTJzMV9jbGsuY29tbW9uLmh3LAo+ID4+ICsg W0NMS19CVVNfSTJTMF0gPSAmYnVzX2kyczBfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfQlVT X0kyUzFdID0gJmJ1c19pMnMxX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0RNSUNdID0gJmRt aWNfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfQlVTX0RNSUNdID0gJmJ1c19kbWljX2Nsay5j b21tb24uaHcsCj4gPj4gKyBbQ0xLX0FVRElPX0NPREVDX0RBQ10gPSAmYXVkaW9fY29kZWNfZGFj X2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0FVRElPX0NPREVDX0FEQ10gPSAmYXVkaW9fY29k ZWNfYWRjX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0JVU19BVURJT19DT0RFQ10gPSAmYnVz X2F1ZGlvX2NvZGVjX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX1VTQl9PSENJXSA9ICZ1c2Jf b2hjaV9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfT0hDSV0gPSAmYnVzX29oY2lfY2xr LmNvbW1vbi5odywKPiA+PiArIFtDTEtfQlVTX0VIQ0ldID0gJmJ1c19laGNpX2Nsay5jb21tb24u aHcsCj4gPj4gKyBbQ0xLX0JVU19PVEddID0gJmJ1c19vdGdfY2xrLmNvbW1vbi5odywKPiA+PiAr IFtDTEtfQlVTX0RQU1NfVE9QXSA9ICZidXNfZHBzc190b3BfY2xrLmNvbW1vbi5odywKPiA+PiAr IFtDTEtfTUlQSV9EU0ldID0gJm1pcGlfZHNpX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0JV U19NSVBJX0RTSV0gPSAmYnVzX21pcGlfZHNpX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX1RD T05fTENEXSA9ICZ0Y29uX2xjZF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfVENPTl9M Q0RdID0gJmJ1c190Y29uX2xjZF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19DU0lfVE9QXSA9 ICZjc2lfdG9wX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0NTSV9NQ0xLMF0gPSAmY3NpX21j bGswX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0NTSV9NQ0xLMV0gPSAmY3NpX21jbGsxX2Ns ay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0NTSV9NQ0xLMl0gPSAmY3NpX21jbGsyX2Nsay5jb21t b24uaHcsCj4gPj4gKyBbQ0xLX0JVU19DU0ldID0gJmJ1c19jc2lfY2xrLmNvbW1vbi5odywKPiA+ PiArIFtDTEtfQlVTX1dJRUdBTkRdID0gJmJ1c193aWVnYW5kX2Nsay5jb21tb24uaHcsCj4gPj4g KyBbQ0xLX1JJU0NWXSA9ICZyaXNjdl9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19SSVNDVl9B WEldID0gJnJpc2N2X2F4aV9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19SSVNDVl9DT1JFX0dB VEVdICAgPSAmcmlzY3ZfY29yZV9nYXRlLmNvbW1vbi5odywKPiA+PiArIFtDTEtfUklTQ1ZfQ0ZH X0dBVEVdICAgID0gJnJpc2N2X2NmZ19nYXRlLmNvbW1vbi5odywKPiA+PiArIFtDTEtfRkFOT1VU XzI0TV0gPSAmZmFub3V0XzI0TV9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19GQU5PVVRfMTZN XSA9ICZmYW5vdXRfMTZNX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0ZBTk9VVF8xMk1dID0g JmZhbm91dF8xMk1fY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfRkFOT1VUXzI1TV0gPSAmZmFu b3V0XzI1TV9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19GQU5PVVRfMjdNXSA9ICZmYW5vdXRf MjdNX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0ZBTk9VVF9QQ0xLXSA9ICZmYW5vdXRfcGNs a19jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19GQU5PVVQwXSA9ICZmYW5vdXQwX2Nsay5jb21t b24uaHcsCj4gPj4gKyBbQ0xLX0ZBTk9VVDFdID0gJmZhbm91dDFfY2xrLmNvbW1vbi5odywKPiA+ PiArIFtDTEtfRkFOT1VUMl0gPSAmZmFub3V0Ml9jbGsuY29tbW9uLmh3LAo+ID4+ICsgfSwKPiA+ PiArfTsKPiA+PiArCj4gPj4gK3N0YXRpYyBzdHJ1Y3QgY2N1X3Jlc2V0X21hcCBzdW44aV92ODUz X2NjdV9yZXNldHNbXSA9IHsKPiA+PiArIFtSU1RfTUJVU10gPSB7IDB4NTQwLCBCSVQoMzApIH0s Cj4gPj4gKyBbUlNUX0JVU19ERV0gPSB7IDB4NjBjLCBCSVQoMTYpIH0sCj4gPj4gKyBbUlNUX0JV U19HMkRdID0geyAweDYzYywgQklUKDE2KSB9LAo+ID4+ICsgW1JTVF9CVVNfQ0VdID0geyAweDY4 YywgQklUKDE2KSB8IEJJVCgxNyl9LAo+ID4+ICsgW1JTVF9CVVNfVkVdID0geyAweDY5YywgQklU KDE2KSB9LAo+ID4+ICsgW1JTVF9CVVNfTlBVXSA9IHsgMHg2ZWMsIEJJVCgxNikgfSwKPiA+PiAr IFtSU1RfQlVTX0RNQV0gPSB7IDB4NzBjLCBCSVQoMTYpIH0sCj4gPj4gKyBbUlNUX0JVU19NU0dC T1gwXSA9IHsgMHg3MWMsIEJJVCgxNikgfSwKPiA+PiArIFtSU1RfQlVTX01TR0JPWDFdID0geyAw eDcxYywgQklUKDE3KSB9LAo+ID4+ICsgW1JTVF9CVVNfU1BJTkxPQ0tdID0geyAweDcyYywgQklU KDE2KSB9LAo+ID4+ICsgW1JTVF9CVVNfSFNUSU1FUl0gPSB7IDB4NzNjLCBCSVQoMTYpIH0sCj4g Pj4gKyBbUlNUX0JVU19EQkddID0geyAweDc4YywgQklUKDE2KSB9LAo+ID4+ICsgW1JTVF9CVVNf UFdNXSA9IHsgMHg3YWMsIEJJVCgxNikgfSwKPiA+PiArIFtSU1RfQlVTX0RSQU1dID0geyAweDgw YywgQklUKDE2KSB9LAo+ID4+ICsgW1JTVF9CVVNfTU1DMF0gPSB7IDB4ODRjLCBCSVQoMTYpIH0s Cj4gPj4gKyBbUlNUX0JVU19NTUMxXSA9IHsgMHg4NGMsIEJJVCgxNykgfSwKPiA+PiArIFtSU1Rf QlVTX01NQzJdID0geyAweDg0YywgQklUKDE4KSB9LAo+ID4+ICsgW1JTVF9CVVNfVUFSVDBdID0g eyAweDkwYywgQklUKDE2KSB9LAo+ID4+ICsgW1JTVF9CVVNfVUFSVDFdID0geyAweDkwYywgQklU KDE3KSB9LAo+ID4+ICsgW1JTVF9CVVNfVUFSVDJdID0geyAweDkwYywgQklUKDE4KSB9LAo+ID4+ ICsgW1JTVF9CVVNfVUFSVDNdID0geyAweDkwYywgQklUKDE5KSB9LAo+ID4+ICsgW1JTVF9CVVNf STJDMF0gPSB7IDB4OTFjLCBCSVQoMTYpIH0sCj4gPj4gKyBbUlNUX0JVU19JMkMxXSA9IHsgMHg5 MWMsIEJJVCgxNykgfSwKPiA+PiArIFtSU1RfQlVTX0kyQzJdID0geyAweDkxYywgQklUKDE4KSB9 LAo+ID4+ICsgW1JTVF9CVVNfSTJDM10gPSB7IDB4OTFjLCBCSVQoMTkpIH0sCj4gPj4gKyBbUlNU X0JVU19JMkM0XSA9IHsgMHg5MWMsIEJJVCgyMCkgfSwKPiA+PiArIFtSU1RfQlVTX1NQSTBdID0g eyAweDk2YywgQklUKDE2KSB9LAo+ID4+ICsgW1JTVF9CVVNfU1BJMV0gPSB7IDB4OTZjLCBCSVQo MTcpIH0sCj4gPj4gKyBbUlNUX0JVU19TUEkyXSA9IHsgMHg5NmMsIEJJVCgxOCkgfSwKPiA+PiAr IFtSU1RfQlVTX1NQSTNdID0geyAweDk2YywgQklUKDE5KSB9LAo+ID4+ICsgW1JTVF9CVVNfU1BJ Rl0gPSB7IDB4OTZjLCBCSVQoMjApIH0sCj4gPj4gKyBbUlNUX0JVU19FTUFDXSA9IHsgMHg5N2Ms IEJJVCgxNikgfSwKPiA+PiArIFtSU1RfQlVTX0dQQURDXSA9IHsgMHg5ZWMsIEJJVCgxNikgfSwK PiA+PiArIFtSU1RfQlVTX1RIU10gPSB7IDB4OWZjLCBCSVQoMTYpIH0sCj4gPj4gKyBbUlNUX0JV U19JMlMwXSA9IHsgMHhhMjAsIEJJVCgxNikgfSwKPiA+PiArIFtSU1RfQlVTX0kyUzFdID0geyAw eGEyMCwgQklUKDE3KSB9LAo+ID4+ICsgW1JTVF9CVVNfRE1JQ10gPSB7IDB4YTRjLCBCSVQoMTYp IH0sCj4gPj4gKyBbUlNUX0JVU19BVURJT19DT0RFQ10gPSB7IDB4YTVjLCBCSVQoMTYpIH0sCj4g Pj4gKyBbUlNUX1VTQl9QSFldID0geyAweGE3MCwgQklUKDMwKSB9LAo+ID4+ICsgW1JTVF9CVVNf T0hDSV0gPSB7IDB4YThjLCBCSVQoMTYpIH0sCj4gPj4gKyBbUlNUX0JVU19FSENJXSA9IHsgMHhh OGMsIEJJVCgyMCkgfSwKPiA+PiArIFtSU1RfQlVTX09UR10gPSB7IDB4YThjLCBCSVQoMjQpIH0s Cj4gPj4gKyBbUlNUX0JVU19EUFNTX1RPUF0gPSB7IDB4YWJjLCBCSVQoMTYpIH0sCj4gPj4gKyBb UlNUX0JVU19NSVBJX0RTSV0gPSB7IDB4YjRjLCBCSVQoMTYpIH0sCj4gPj4gKyBbUlNUX0JVU19U Q09OX0xDRF0gPSB7IDB4YjdjLCBCSVQoMTYpIH0sCj4gPj4gKyBbUlNUX0JVU19DU0ldID0geyAw eGMyYywgQklUKDE2KSB9LAo+ID4+ICsgW1JTVF9CVVNfV0lFR0FORF0gPSB7IDB4YzdjLCBCSVQo MTYpIH0sCj4gPj4gKyBbUlNUX1JJU0NWX1NZU19BUEJdID0geyAweGQwNCwgQklUKDIpLCBDQ1Vf RkVBVFVSRV9LRVlfRklFTEQgfSwKPiA+PiArIFtSU1RfUklTQ1ZfU09GVF0gPSB7IDB4ZDA0LCBC SVQoMSksIENDVV9GRUFUVVJFX0tFWV9GSUVMRCB9LAo+ID4+ICsgW1JTVF9SSVNDVl9DRkddID0g eyAweGQwYywgQklUKDE2KSB9Cj4gPj4gK307Cj4gPj4gKwo+ID4+ICtzdGF0aWMgY29uc3Qgc3Ry dWN0IHN1bnhpX2NjdV9kZXNjIHN1bjhpX3Y4NTNfY2N1X2Rlc2MgPSB7Cj4gPj4gKyAuY2N1X2Ns a3MgPSBzdW44aV92ODUzX2NjdV9jbGtzLAo+ID4+ICsgLm51bV9jY3VfY2xrcyA9IEFSUkFZX1NJ WkUoc3VuOGlfdjg1M19jY3VfY2xrcyksCj4gPj4gKwo+ID4+ICsgLmh3X2Nsa3MgPSAmc3VuOGlf djg1M19od19jbGtzLAo+ID4+ICsKPiA+PiArIC5yZXNldHMgPSBzdW44aV92ODUzX2NjdV9yZXNl dHMsCj4gPj4gKyAubnVtX3Jlc2V0cyA9IEFSUkFZX1NJWkUoc3VuOGlfdjg1M19jY3VfcmVzZXRz KSwKPiA+PiArfTsKPiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCB1MzIgcGxsX3JlZ3NbXSA9IHsK PiA+PiArIFNVTjhJX1Y4NTNfUExMX0NQVV9SRUcsCj4gPj4gKyBTVU44SV9WODUzX1BMTF9ERFJf UkVHLAo+ID4+ICsgU1VOOElfVjg1M19QTExfUEVSSVBIX1JFRywKPiA+PiArIFNVTjhJX1Y4NTNf UExMX1ZJREVPX1JFRywKPiA+PiArIFNVTjhJX1Y4NTNfUExMX0NTSV9SRUcsCj4gPj4gKyBTVU44 SV9WODUzX1BMTF9BVURJT19SRUcsCj4gPj4gKyBTVU44SV9WODUzX1BMTF9OUFVfUkVHLAo+ID4+ ICt9Owo+ID4+ICsKPiA+PiArc3RhdGljIGludCBzdW44aV92ODUzX2NjdV9wcm9iZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ID4+ICt7Cj4gPj4gKyB2b2lkIF9faW9tZW0gKnJlZzsK PiA+PiArIHUzMiB2YWw7Cj4gPj4gKyBpbnQgaSwgcmV0Owo+ID4+ICsKPiA+PiArIHJlZyA9IGRl dm1fcGxhdGZvcm1faW9yZW1hcF9yZXNvdXJjZShwZGV2LCAwKTsKPiA+PiArIGlmIChJU19FUlIo cmVnKSkKPiA+PiArIHJldHVybiBQVFJfRVJSKHJlZyk7Cj4gPj4gKwo+ID4+ICsgLyogRW5hYmxl IHRoZSBlbmFibGUsIExETywgYW5kIGxvY2sgYml0cyBvbiBhbGwgUExMcy4gKi8KPiA+PiArIGZv ciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBsbF9yZWdzKTsgaSsrKSB7Cj4gPj4gKyB2YWwgPSBy ZWFkbChyZWcgKyBwbGxfcmVnc1tpXSk7Cj4gPj4gKyB2YWwgfD0gQklUKDMxKSB8IEJJVCgzMCkg fCBCSVQoMjkpOwo+ID4+ICsgd3JpdGVsKHZhbCwgcmVnICsgcGxsX3JlZ3NbaV0pOwo+ID4+ICsg fQo+ID4+ICsKPiA+PiArIC8qIEZvcmNlIFBMTF9DUFUgZmFjdG9yIE0gdG8gMC4gKi8KPiA+PiAr IHZhbCA9IHJlYWRsKHJlZyArIFNVTjhJX1Y4NTNfUExMX0NQVV9SRUcpOwo+ID4+ICsgdmFsICY9 IH5HRU5NQVNLKDEsIDApOwo+ID4+ICsgd3JpdGVsKHZhbCwgcmVnICsgU1VOOElfVjg1M19QTExf Q1BVX1JFRyk7Cj4gPj4gKwo+ID4+ICsgLyoKPiA+PiArICogRm9yY2UgT0hDSSAxMk0gY2xvY2sg c291cmNlIHRvIDAwICgxMk1IeiBkaXZpZGVkIGZyb20gNDhNSHopCj4gPj4gKyAqCj4gPj4gKyAq IFRoaXMgY2xvY2sgbXV4IGlzIHN0aWxsIG15c3RlcmlvdXMsIGFuZCB0aGUgY29kZSBqdXN0IGVu Zm9yY2VzCj4gPj4gKyAqIGl0IHRvIGhhdmUgYSB2YWxpZCBjbG9jayBwYXJlbnQuCj4gPj4gKyAq Lwo+ID4+ICsgdmFsID0gcmVhZGwocmVnICsgU1VOOElfVjg1M19VU0JfQ0xLX1JFRyk7Cj4gPj4g KyB2YWwgJj0gfkdFTk1BU0soMjUsIDI0KTsKPiA+PiArIHdyaXRlbCh2YWwsIHJlZyArIFNVTjhJ X1Y4NTNfVVNCX0NMS19SRUcpOwo+ID4+ICsKPiA+PiArIC8qIEZvcmNlIGZhbm91dC0yN00gZmFj dG9yIE4gdG8gMC4gKi8KPiA+PiArIHZhbCA9IHJlYWRsKHJlZyArIFNVTjhJX1Y4NTNfRkFOT1VU XzI3TV9SRUcpOwo+ID4+ICsgdmFsICY9IH5HRU5NQVNLKDksIDgpOwo+ID4+ICsgd3JpdGVsKHZh bCwgcmVnICsgU1VOOElfVjg1M19GQU5PVVRfMjdNX1JFRyk7Cj4gPj4gKwo+ID4+ICsgcmV0ID0g ZGV2bV9zdW54aV9jY3VfcHJvYmUoJnBkZXYtPmRldiwgcmVnLCAmc3VuOGlfdjg1M19jY3VfZGVz Yyk7Cj4gPj4gKyBpZiAocmV0KQo+ID4+ICsgcmV0dXJuIHJldDsKPiA+PiArCj4gPj4gKyByZXR1 cm4gMDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2Vf aWQgc3VuOGlfdjg1M19jY3VfaWRzW10gPSB7Cj4gPj4gKyB7IC5jb21wYXRpYmxlID0gImFsbHdp bm5lcixzdW44aS12ODUzLWNjdSIgfSwKPiA+PiArIHsgfQo+ID4+ICt9Owo+ID4+ICsKPiA+PiAr c3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3VuOGlfdjg1M19jY3VfZHJpdmVyID0gewo+ ID4+ICsgLnByb2JlID0gc3VuOGlfdjg1M19jY3VfcHJvYmUsCj4gPj4gKyAuZHJpdmVyID0gewo+ ID4+ICsgLm5hbWUgPSAic3VuOGktdjg1My1jY3UiLAo+ID4+ICsgLnN1cHByZXNzX2JpbmRfYXR0 cnMgPSB0cnVlLAo+ID4+ICsgLm9mX21hdGNoX3RhYmxlID0gc3VuOGlfdjg1M19jY3VfaWRzLAo+ ID4+ICsgfSwKPiA+PiArfTsKPiA+PiArbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzdW44aV92ODUz X2NjdV9kcml2ZXIpOwo+ID4+ICsKPiA+PiArTU9EVUxFX0lNUE9SVF9OUygiU1VOWElfQ0NVIik7 Cj4gPj4gK01PRFVMRV9ERVNDUklQVElPTigiU3VwcG9ydCBmb3IgdGhlIEFsbHdpbm5lciBWODUz IENDVSIpOwo+ID4+ICtNT0RVTEVfTElDRU5TRSgiR1BMIik7Cj4gPj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS12ODUzLmggYi9kcml2ZXJzL2Nsay9zdW54aS1u Zy9jY3Utc3VuOGktdjg1My5oCj4gPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+PiBpbmRleCAw MDAwMDAwMDAwMDAuLmYxYjJhNGQwYmNkMwo+ID4+IC0tLSAvZGV2L251bGwKPiA+PiArKysgYi9k cml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktdjg1My5oCj4gPj4gQEAgLTAsMCArMSwxNCBA QAo+ID4+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLwo+ID4+ICsvKgo+ ID4+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMjQgQW5kcmFzIFN6ZW16byA8c3plbXpvLmFuZHJhc0Bn bWFpbC5jb20+Cj4gPj4gKyAqLwo+ID4+ICsKPiA+PiArI2lmbmRlZiBfQ0NVX1NVTjhJX1Y4NTNf SF8KPiA+PiArI2RlZmluZSBfQ0NVX1NVTjhJX1Y4NTNfSF8KPiA+PiArCj4gPj4gKyNpbmNsdWRl IDxkdC1iaW5kaW5ncy9jbG9jay9hbGx3aW5uZXIsc3VuOGktdjg1My1jY3UuaD4KPiA+PiArI2lu Y2x1ZGUgPGR0LWJpbmRpbmdzL3Jlc2V0L2FsbHdpbm5lcixzdW44aS12ODUzLWNjdS5oPgo+ID4+ ICsKPiA+PiArI2RlZmluZSBDTEtfTlVNQkVSIChDTEtfRkFOT1VUMiArIDEpCj4gPj4gKwo+ID4+ ICsjZW5kaWYKPiA+PiAKPiA+IAo+ID4gCj4gPiAKPiA+IAo+IAo+IAoKCgoKCi0tIApsaW51eC1w aHkgbWFpbGluZyBsaXN0CmxpbnV4LXBoeUBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHBzOi8vbGlz dHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXBoeQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 00500C021B2 for ; Thu, 20 Feb 2025 16:05:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=68m2RblDNgPOEgICF1AAS+wZ9f9EZaofLwtAEYV/jAw=; b=O6IwtfK6jh24lm pFBocoMyPZszvWmnK7+ETJXTpHJnHzH0QfzM9oiXbCRst75QaAnMxfB+m4kn0M0VavtMrP/q1t0Ko 6GYmDG5QkF/U27sB89w19fnvSSFQej84OEMIukU1PLiz764VZtsLJWSViy0Xn7whZCP4KpU266W0A v6U5k4yYqDYOzjPxWymXnamWLL0Rzfj5naXfIIlXH4mmsyZeWcBciYBTH60cF/YWcJx+HM7RI+Lpb YUjJOFD37oWf+c+uqCrtFQR1vAHMu1R1v4GNcFJNBZ9J+4nCTSCbkohO4UXDsqh3KLfMTniuXHp9w +JezDQ3/TEdNKR+gHoOA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tl93T-00000001kZe-1o0O; Thu, 20 Feb 2025 16:05:39 +0000 Received: from mail-wr1-x42d.google.com ([2a00:1450:4864:20::42d]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tl90s-00000001jo9-14JL; Thu, 20 Feb 2025 16:03:01 +0000 Received: by mail-wr1-x42d.google.com with SMTP id ffacd0b85a97d-388cae9eb9fso571032f8f.3; Thu, 20 Feb 2025 08:02:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740067376; x=1740672176; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=I6bguq6qpVlMqUSZtWfQmgGW97HG/Gksgq8JkfafFAw=; b=kK+Eohf3MOPHixOsSR6/c9hX5ZwsdrcGQ3w1tQXdJOwcYGvTWSkEVJo+Y6KD2DIRLz bn1O8cgn5NR6H4hjV68M2wEVr6pc+rNblqy4uHzslkU2s60KGRxotkmG+f0ZbSPksYeu ffChP40/cJko07BUL2WZBJUqymowahI7N/REk87Mte8xs1JviBFwLM5tCt3knEIFQdco TyUGtMd3uUkFaPfC1yjgzwNGEZ4KaYWSygPHCxfG3jjPZonqpMpRQY/pXIkSdVvh5xtb 5ziVPDgGUFIGFqI5RRpJr0B0Wfg5RwIa3O2AYDwEhurBeDoNnxbPFHik9lktWUR9P12a Q2dA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740067376; x=1740672176; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=I6bguq6qpVlMqUSZtWfQmgGW97HG/Gksgq8JkfafFAw=; b=b2BbXYgHs6bC+oRoCalkLp78s9zDh87mTx0KZDxOtqMHL7XZVr4NxNwFcGynsEMBuZ /q+PgGTFptCalvfkWYlY7Ekfc45MS3tkSQFLY0pENafCDcbijN2+e28M3Pst8CElpPTE Gp9qanHvW1TOxUxeLH8OrCPPQr00ePVTt3r5hgONF1s/iO/fW1aatvUZjXhcsyQID8IB xZctm1QbnwKa44zT2aDFcO08Dsq309qEHDYhrnx1Vhn8HzdL2OqJKNCjZd0RXzRcpWbf byFbH4LwU+oLSS+b3mUJuI6BrCGLeLssTR4z84Up91njVFA0GnhvTirqEbHDKrDmDcTf MzIg== X-Forwarded-Encrypted: i=1; AJvYcCVVKzUAzkBAEDTC252jua29e2qTUa3fjK2rRz0KjyFk1j1xBcap3IbHxIBY+nZUO40dOBHTrsSa3lTqTAQ3/Hil@lists.infradead.org, AJvYcCWv99CtFXI9GN7DwUPXRPGseg8Mb7jGWuwTWKa4JEHRUGD9lEUOh5Eezj+UpmAmMiduh3rxi8eZe8qr@lists.infradead.org, AJvYcCXaqUUZNmpzRIkAiSx7zwWXRlQlqFEBBasuYQAmLw/WDPt+Wb9oilb4pckPrGruTLys+IsnaTDBF8fgS+M=@lists.infradead.org X-Gm-Message-State: AOJu0Yzy0mu80n8O+g/nqnkvJd+yqoDzInIdhpHerHw9e4rSY1QVbRMj rSJRtMt/ZFoEeraKeAyAo4GkDIRBKyPk2bJillfsRCkv84YgBEnE X-Gm-Gg: ASbGnctIJaCYjnrGmo9Rmq5obeD2YXhbZefR/CaopUBJzepElbClpOuwuL7o5LwoLKE g9pOmGwqiQGK7m8JsbYtkFuQ2Y5dsxeyWOR1pUiuRbIpUSE3vKHN/x6OtRlXiqdb3aJsLwDnhG9 F+5nUnFOcHXya9pPAzsEcPFxdtF7JE+klNp8d3DWw/TOdcwfpIU+Znc2l/pRZeIBptbU2UU8f2Q 9Nup9jPxEwZ5idLKhviyjnFx6KplBWIR9tzTtjjV6pe0vuPTKkchcAvw91QkAb48HmV1tNvEaA2 BMZLjJlLUyx0ewDp95pP0LYairJe2s1RWD5mtNBwVatxBp7hm6mxHAsXv984XjhnfTA= X-Google-Smtp-Source: AGHT+IFaSQMhNqktmGECobEqwU6OE3XbGvTjrJbpApSBbFFxt7vAWy1C/f+ZaE7jio6splvGI0mHpQ== X-Received: by 2002:a5d:64ed:0:b0:38f:2a84:7542 with SMTP id ffacd0b85a97d-38f33f5234emr20594763f8f.28.1740067375670; Thu, 20 Feb 2025 08:02:55 -0800 (PST) Received: from jernej-laptop.localnet (86-58-6-171.dynamic.telemach.net. [86.58.6.171]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-43993847f39sm83376845e9.14.2025.02.20.08.02.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Feb 2025 08:02:55 -0800 (PST) From: Jernej =?UTF-8?B?xaBrcmFiZWM=?= To: =?UTF-8?B?QW5kcsOhcyBTemVtesWR?= Cc: Michael Turquette , Stephen Boyd , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen-Yu Tsai , Samuel Holland , Linus Walleij , Philipp Zabel , Maxime Ripard , Vinod Koul , Kishon Vijay Abraham I , Ulf Hansson , Paul Walmsley , Palmer Dabbelt , Albert Ou , Uwe =?UTF-8?B?S2xlaW5lLUvDtm5pZw==?= , Florian Fainelli , linux-clk@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-gpio@vger.kernel.org, linux-pm@vger.kernel.org, linux-riscv@lists.infradead.org Subject: Re: [PATCH v2 04/10] clk: sunxi-ng: add CCU drivers for V853 Date: Thu, 20 Feb 2025 17:02:53 +0100 Message-ID: <1858640.8hzESeGDPO@jernej-laptop> In-Reply-To: <25D5F3C6-47BB-44B1-9FE3-12B6B8F5F901@gmail.com> References: <20250205125225.1152849-1-szemzo.andras@gmail.com> <3596612.V25eIC5XRa@jernej-laptop> <25D5F3C6-47BB-44B1-9FE3-12B6B8F5F901@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250220_080258_319522_23BC7615 X-CRM114-Status: GOOD ( 32.82 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org RG5lIMSNZXRydGVrLCAyMC4gZmVicnVhciAyMDI1IG9iIDEwOjI4OjQzIFNyZWRuamVldnJvcHNr aSBzdGFuZGFyZG5pIMSNYXMgamUgQW5kcsOhcyBTemVtesWRIG5hcGlzYWwoYSk6Cj4gSGksCj4g Cj4gVGhhbmtzIGZvciB5b3VyIHJldmlldyEKPiAKPiA+IE9uIDE5IEZlYiAyMDI1LCBhdCAyMToy MSwgSmVybmVqIMWga3JhYmVjIDxqZXJuZWouc2tyYWJlY0BnbWFpbC5jb20+IHdyb3RlOgo+ID4g Cj4gPiBEbmUgc3JlZGEsIDUuIGZlYnJ1YXIgMjAyNSBvYiAxMzo1MjoxOSBTcmVkbmplZXZyb3Bz a2kgc3RhbmRhcmRuaSDEjWFzIGplIEFuZHJhcyBTemVtem8gbmFwaXNhbChhKToKPiA+PiBWODUz IGhhcyBzaW1pbGFyIGdhdGVzL3Jlc2V0cyBsaWtlIGV4aXN0aW5nIEFsbHdpbm5lciBTT0NzLiBB ZGQgc3VwcG9ydCBmb3IgaXQncyBDQ1UgYW5kIFBSQ00gQ0NVLgo+ID4+IAo+ID4+IFNpZ25lZC1v ZmYtYnk6IEFuZHJhcyBTemVtem8gPHN6ZW16by5hbmRyYXNAZ21haWwuY29tPgo+ID4+IC0tLQo+ ID4+IGRyaXZlcnMvY2xrL3N1bnhpLW5nL0tjb25maWcgICAgICAgICAgICB8ICAgMTAgKwo+ID4+ IGRyaXZlcnMvY2xrL3N1bnhpLW5nL01ha2VmaWxlICAgICAgICAgICB8ICAgIDQgKwo+ID4+IGRy aXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS12ODUzLXIuYyB8ICAxMjAgKysrCj4gPj4gZHJp dmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMtci5oIHwgICAxNCArCj4gPj4gZHJpdmVy cy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMuYyAgIHwgMTE0NSArKysrKysrKysrKysrKysr KysrKysrKwo+ID4+IGRyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS12ODUzLmggICB8ICAg MTQgKwo+ID4+IDYgZmlsZXMgY2hhbmdlZCwgMTMwNyBpbnNlcnRpb25zKCspCj4gPj4gY3JlYXRl IG1vZGUgMTAwNjQ0IGRyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS12ODUzLXIuYwo+ID4+ IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktdjg1My1y LmgKPiA+PiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhp LXY4NTMuYwo+ID4+IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Ut c3VuOGktdjg1My5oCj4gPj4gCj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpLW5n L0tjb25maWcgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9LY29uZmlnCj4gPj4gaW5kZXggYjU0NzE5 OGEyYzY1Li5lMjU3MzczMTc3ZTAgMTAwNjQ0Cj4gPj4gLS0tIGEvZHJpdmVycy9jbGsvc3VueGkt bmcvS2NvbmZpZwo+ID4+ICsrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL0tjb25maWcKPiA+PiBA QCAtMTIsNiArMTIsMTYgQEAgY29uZmlnIFNVTklWX0YxQzEwMFNfQ0NVCj4gPj4gZGVmYXVsdCB5 Cj4gPj4gZGVwZW5kcyBvbiBNQUNIX1NVTklWIHx8IENPTVBJTEVfVEVTVAo+ID4+IAo+ID4+ICtj b25maWcgU1VOOElfVjg1M19DQ1UKPiA+PiArIHRyaXN0YXRlICJTdXBwb3J0IGZvciB0aGUgQWxs d2lubmVyIFY4NTMvVjg1MXMvVjg1MVNFIENDVSIKPiA+PiArIGRlZmF1bHQgTUFDSF9TVU44SQo+ ID4+ICsgZGVwZW5kcyBvbiBNQUNIX1NVTjhJIHx8IENPTVBJTEVfVEVTVAo+ID4+ICsKPiA+PiAr Y29uZmlnIFNVTjhJX1Y4NTNfUl9DQ1UKPiA+PiArIHRyaXN0YXRlICJTdXBwb3J0IGZvciB0aGUg QWxsd2lubmVyIFY4NTMvVjg1MXMvVjg1MVNFIFBSQ00gQ0NVIgo+ID4+ICsgZGVmYXVsdCBNQUNI X1NVTjhJCj4gPj4gKyBkZXBlbmRzIG9uIE1BQ0hfU1VOOEkgfHwgQ09NUElMRV9URVNUCj4gPiAK PiA+IEdlbmVyYWxseSwgdGhpcyBhcmUgdHdvIHBhdGNoZXMsIG9uZSBmb3IgZWFjaCBkcml2ZXIu Cj4gPiAKPiA+PiArCj4gPj4gY29uZmlnIFNVTjIwSV9EMV9DQ1UKPiA+PiB0cmlzdGF0ZSAiU3Vw cG9ydCBmb3IgdGhlIEFsbHdpbm5lciBEMS9SNTI4L1QxMTMgQ0NVIgo+ID4+IGRlZmF1bHQgeQo+ ID4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9NYWtlZmlsZSBiL2RyaXZlcnMv Y2xrL3N1bnhpLW5nL01ha2VmaWxlCj4gPj4gaW5kZXggNmIzYWUyYjYyMGRiLi5iODc5Mjg0NjJl MTUgMTAwNjQ0Cj4gPj4gLS0tIGEvZHJpdmVycy9jbGsvc3VueGktbmcvTWFrZWZpbGUKPiA+PiAr KysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9NYWtlZmlsZQo+ID4+IEBAIC0yNSw2ICsyNSw4IEBA IHN1bnhpLWNjdS15ICs9IGNjdV9tcC5vCj4gPj4gCj4gPj4gIyBTb0Mgc3VwcG9ydAo+ID4+IG9i ai0kKENPTkZJR19TVU5JVl9GMUMxMDBTX0NDVSkgKz0gc3VuaXYtZjFjMTAwcy1jY3Uubwo+ID4+ ICtvYmotJChDT05GSUdfU1VOOElfVjg1M19DQ1UpICs9IHN1bjhpLXY4NTMtY2N1Lm8KPiA+PiAr b2JqLSQoQ09ORklHX1NVTjhJX1Y4NTNfUl9DQ1UpICs9IHN1bjhpLXY4NTMtci1jY3Uubwo+ID4g Cj4gPiBQdXQgaXQgdG8gb3RoZXIgc3VuOGkgZHJpdmVycy4KPiA+IAo+ID4+IG9iai0kKENPTkZJ R19TVU4yMElfRDFfQ0NVKSArPSBzdW4yMGktZDEtY2N1Lm8KPiA+PiBvYmotJChDT05GSUdfU1VO MjBJX0QxX1JfQ0NVKSArPSBzdW4yMGktZDEtci1jY3Uubwo+ID4+IG9iai0kKENPTkZJR19TVU41 MElfQTY0X0NDVSkgKz0gc3VuNTBpLWE2NC1jY3Uubwo+ID4+IEBAIC01MCw2ICs1Miw4IEBAIG9i ai0kKENPTkZJR19TVU45SV9BODBfQ0NVKSArPSBzdW45aS1hODAtZGUtY2N1Lm8KPiA+PiBvYmot JChDT05GSUdfU1VOOUlfQTgwX0NDVSkgKz0gc3VuOWktYTgwLXVzYi1jY3Uubwo+ID4+IAo+ID4+ IHN1bml2LWYxYzEwMHMtY2N1LXkgKz0gY2N1LXN1bml2LWYxYzEwMHMubwo+ID4+ICtzdW44aS12 ODUzLWNjdS15ICs9IGNjdS1zdW44aS12ODUzLm8KPiA+PiArc3VuOGktdjg1My1yLWNjdS15ICs9 IGNjdS1zdW44aS12ODUzLXIubwo+ID4gCj4gPiBEaXR0by4KPiA+IAo+IAo+IG9rCj4gCj4gPj4g c3VuMjBpLWQxLWNjdS15ICs9IGNjdS1zdW4yMGktZDEubwo+ID4+IHN1bjIwaS1kMS1yLWNjdS15 ICs9IGNjdS1zdW4yMGktZDEtci5vCj4gPj4gc3VuNTBpLWE2NC1jY3UteSArPSBjY3Utc3VuNTBp LWE2NC5vCj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS12 ODUzLXIuYyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS12ODUzLXIuYwo+ID4+IG5l dyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPj4gaW5kZXggMDAwMDAwMDAwMDAwLi5iZDYwZTAwY2RhN2YK PiA+PiAtLS0gL2Rldi9udWxsCj4gPj4gKysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1 bjhpLXY4NTMtci5jCj4gPj4gQEAgLTAsMCArMSwxMjAgQEAKPiA+PiArLy8gU1BEWC1MaWNlbnNl LUlkZW50aWZpZXI6IEdQTC0yLjAKPiA+PiArLyoKPiA+PiArICogQ29weXJpZ2h0IChDKSAyMDI1 IEFuZHJhcyBTemVtem8gPHN6ZW16by5hbmRyYXNAZ21haWwuY29tPgo+ID4+ICsgKgo+ID4+ICsg KiBCYXNlZCBvbiBjY3Utc3VuMjBpLWQxLXIuYyBieSBTYW11ZWwgSG9sbGFuZC4KPiA+PiArICov Cj4gPj4gKwo+ID4+ICsjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+Cj4gPj4gKyNpbmNs dWRlIDxsaW51eC9tb2R1bGUuaD4KPiA+PiArI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2Rldmlj ZS5oPgo+ID4+ICsKPiA+PiArI2luY2x1ZGUgImNjdV9jb21tb24uaCIKPiA+PiArI2luY2x1ZGUg ImNjdV9yZXNldC5oIgo+ID4+ICsKPiA+PiArI2luY2x1ZGUgImNjdV9nYXRlLmgiCj4gPj4gKyNp bmNsdWRlICJjY3VfbXAuaCIKPiA+PiArCj4gPj4gKyNpbmNsdWRlICJjY3Utc3VuOGktdjg1My1y LmgiCj4gPj4gKwo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19wYXJlbnRfZGF0YSByX2Fo Yl9hcGIwX3BhcmVudHNbXSA9IHsKPiA+PiArIHsgLmZ3X25hbWUgPSAiaG9zYyIgfSwKPiA+PiAr IHsgLmZ3X25hbWUgPSAibG9zYyIgfSwKPiA+PiArIHsgLmZ3X25hbWUgPSAiaW9zYyIgfSwKPiA+ PiArIHsgLmZ3X25hbWUgPSAicGxsLXBlcmlwaCIgfSwKPiA+PiArIHsgLmZ3X25hbWUgPSAicGxs LWF1ZGlvIiB9Cj4gPj4gK307Cj4gPj4gKwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX01QX0RBVEFf V0lUSF9NVVgocl9haGJfY2xrLCAici1haGIiLAo+ID4+ICsgIHJfYWhiX2FwYjBfcGFyZW50cywg MHgwMDAsCj4gPj4gKyAgMCwgNSwgLyogTSAqLwo+ID4+ICsgIDgsIDIsIC8qIFAgKi8KPiA+PiAr ICAyNCwgMywgLyogbXV4ICovCj4gPj4gKyAgMCk7Cj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg Y2xrX2h3ICpyX2FoYl9odyA9ICZyX2FoYl9jbGsuY29tbW9uLmh3Owo+ID4+ICsKPiA+PiArc3Rh dGljIFNVTlhJX0NDVV9NUF9EQVRBX1dJVEhfTVVYKHJfYXBiMF9jbGssICJyLWFwYjAiLAo+ID4+ ICsgIHJfYWhiX2FwYjBfcGFyZW50cywgMHgwMGMsCj4gPj4gKyAgMCwgNSwgLyogTSAqLwo+ID4+ ICsgIDgsIDIsIC8qIFAgKi8KPiA+PiArICAyNCwgMywgLyogbXV4ICovCj4gPj4gKyAgMCk7Cj4g Pj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2h3ICpyX2FwYjBfaHcgPSAmcl9hcGIwX2Nsay5j b21tb24uaHc7Cj4gPiAKPiA+IFdoZXJlIGNhbiBJIGxvb2sgZm9yIGFib3ZlIGNsb2Nrcz8gVGhl cmUgYXJlIG5vdCBkZXNjcmliZWQgaW4gQlNQIGRyaXZlci4KPiA+IAo+IAo+IEFzIHRoZSBvcmln aW5hbCBCU1DigJlzIFBSQ00gZHJpdmVyIGhhcyBhbiB1bmFjY2VwdGFibGUgbGljZW5jZSwgSSBo YWQgdG8gcmV3cml0ZSB0aGlzIGRyaXZlci4gIFRoaXMgSVAgYmxvY2sKPiBpc27igJl0IGRvY3Vt ZW50ZWQgaW4gdGhlIFY4NTMgbWFudWFsLCBzbyBhcyBBbmRyZSBzdWdnZXN0ZWQsIEkgdXNlZCB0 aGUgQTUyMyBtYW51YWwsIGFuZCB0aGUgRDEvVDExMwo+IFBSQ00gZHJpdmVyLiBUaGFuIEkgcGVl ay9wb2tlIHRoZSByZWdpc3RlcnMgdG8gY2hlY2sgaWYgaXTigJlzIHZhbGlkIG9yIG5vdC4gCj4g Cj4gYXdib290PiByZWFkMzIgMHg3MDEwMDBjCj4gMHgwNzAxMDAwYzogMHgwZjAwMDMxZgo+IGF3 Ym9vdD4gcmVhZDMyIDB4NzAxMDAwMAo+IDB4MDcwMTAwMDA6IDB4MDAwMDAwMDAKPiBhd2Jvb3Q+ IHdyaXRlMzIgMHg3MDEwMDAwIDB4ZmZmZmZmZmYKPiBhd2Jvb3Q+IHJlYWQzMiAweDcwMTAwMDAK PiAweDA3MDEwMDAwOiAweDA3MDAwMzFmCj4gCj4gVGhleSBhcmUgdGhlcmUsIEnigJltIG5vdCBz dXJlIGFib3V0IGl04oCZcyB1c2FnZS4KCk9rLCBzbyB0aGV5IGV4aXN0IGFuZCBmb3JtYXQgaXMg b2sgdG9vLiBPbmx5IHF1ZXN0aW9uIGlzIGlmIHBhcmVudHMgYXJlIGNvcnJlY3QuCkkgY2hlY2tl ZCBjY3Utc3VuOGl3MjAtci5jIGZyb20gb25lIEJTUCBhbmQgaXQgaGFzIHNpbWlsYXIgY2xvY2tz LiBIb3dldmVyLAppdCdzIG1pc3NpbmcgcGxsLWF1ZGlvIGFuZCBwbGwtcGVyaXBoIGlzIHByZS1k aXZpZGVkIGJ5IDMsIHdoaWNoIGlzIHNhbWUgYXMgb24KQTUyMy4KClNvIG15IHN1Z2dlc3Rpb24g aXMgdG8gcmVtb3ZlIHBsbC1hdWRpbyBhbmQgYWRqdXN0IHBsbC1wZXJpcGggdG8gaGF2ZQpwcmVk aXZpZGVyLgoKPiAKPiAKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVz X3JfdHdkX2NsaywgImJ1cy1yLXR3ZCIsICZyX2FwYjBfaHcsIAo+ID4+ICsgIDB4MTJjLCBCSVQo MCksIDApOwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19yX3BwdV9jbGssICJi dXMtci1wcHUiLCAmcl9hcGIwX2h3LAo+ID4+ICsgIDB4MWFjLCBCSVQoMCksIDApOwo+ID4+ICtz dGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19yX3J0Y19jbGssICJidXMtci1ydGMiLCAmcl9h aGJfaHcsCj4gPj4gKyAgMHgyMGMsIEJJVCgwKSwgMCk7Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1Vf R0FURV9IV1MoYnVzX3JfY3B1Y2ZnX2NsaywgImJ1cy1yLWNwdWNmZyIsICZyX2FwYjBfaHcsCj4g Pj4gKyAgMHgyMmMsIEJJVCgwKSwgMCk7Cj4gPj4gKwo+ID4+ICtzdGF0aWMgc3RydWN0IGNjdV9j b21tb24gKnN1bjhpX3Y4NTNfcl9jY3VfY2xrc1tdID0gewo+ID4+ICsgJnJfYWhiX2Nsay5jb21t b24sCj4gPj4gKyAmcl9hcGIwX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX3JfdHdkX2Nsay5jb21t b24sCj4gPj4gKyAmYnVzX3JfcHB1X2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX3JfcnRjX2Nsay5j b21tb24sCj4gPj4gKyAmYnVzX3JfY3B1Y2ZnX2Nsay5jb21tb24sCj4gPj4gK307Cj4gPj4gKwo+ ID4+ICtzdGF0aWMgc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgc3VuOGlfdjg1M19yX2h3X2Ns a3MgPSB7Cj4gPj4gKyAubnVtID0gQ0xLX05VTUJFUiwKPiA+PiArIC5od3MgPSB7Cj4gPj4gKyBb Q0xLX1JfQUhCXSA9ICZyX2FoYl9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19SX0FQQjBdID0g JnJfYXBiMF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfUl9UV0RdID0gJmJ1c19yX3R3 ZF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfUl9QUFVdID0gJmJ1c19yX3BwdV9jbGsu Y29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfUl9SVENdID0gJmJ1c19yX3J0Y19jbGsuY29tbW9u Lmh3LAo+ID4+ICsgW0NMS19CVVNfUl9DUFVDRkddID0gJmJ1c19yX2NwdWNmZ19jbGsuY29tbW9u Lmh3LAo+ID4+ICsgfSwKPiA+PiArfTsKPiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg Y2N1X3Jlc2V0X21hcCBzdW44aV92ODUzX3JfY2N1X3Jlc2V0c1tdID0gewo+ID4+ICsgW1JTVF9C VVNfUl9UV0RdID0geyAweDEyYywgQklUKDE2KSB9LAo+ID4gCj4gPiBXaGVyZSBkaWQgeW91IGdl dCB0aGF0PyBCU1AgZHJpdmVyIHRoYXQgSSBjaGVja2VkIGRvZXNuJ3QgbWVudGlvbnMgaXQuCj4g PiAKPiAKPiB5ZXMsIGp1c3QgZG91YmxlIGNoZWNrZWQgYW5kIHRoaXMgYml0IGlzIG5vdCB2YWxp ZCwgc29ycnksIEnigJlsbCByZW1vdmUgaXQuCj4gCj4gPj4gKyBbUlNUX0JVU19SX1BQVV0gPSB7 IDB4MWFjLCBCSVQoMTYpIH0sCj4gPj4gKyBbUlNUX0JVU19SX1JUQ10gPSB7IDB4MjBjLCBCSVQo MTYpIH0sCj4gPj4gKyBbUlNUX0JVU19SX0NQVUNGR10gPSB7IDB4MjJjLCBCSVQoMTYpIH0sCj4g Pj4gK307Cj4gPj4gKwo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHN1bnhpX2NjdV9kZXNjIHN1 bjhpX3Y4NTNfcl9jY3VfZGVzYyA9IHsKPiA+PiArIC5jY3VfY2xrcyA9IHN1bjhpX3Y4NTNfcl9j Y3VfY2xrcywKPiA+PiArIC5udW1fY2N1X2Nsa3MgPSBBUlJBWV9TSVpFKHN1bjhpX3Y4NTNfcl9j Y3VfY2xrcyksCj4gPj4gKwo+ID4+ICsgLmh3X2Nsa3MgPSAmc3VuOGlfdjg1M19yX2h3X2Nsa3Ms Cj4gPj4gKwo+ID4+ICsgLnJlc2V0cyA9IHN1bjhpX3Y4NTNfcl9jY3VfcmVzZXRzLAo+ID4+ICsg Lm51bV9yZXNldHMgPSBBUlJBWV9TSVpFKHN1bjhpX3Y4NTNfcl9jY3VfcmVzZXRzKSwKPiA+PiAr fTsKPiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgc3VuOGlfdjg1M19yX2NjdV9wcm9iZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ID4+ICt7Cj4gPj4gKyB2b2lkIF9faW9tZW0gKnJlZzsK PiA+PiArCj4gPj4gKyByZWcgPSBkZXZtX3BsYXRmb3JtX2lvcmVtYXBfcmVzb3VyY2UocGRldiwg MCk7Cj4gPj4gKyBpZiAoSVNfRVJSKHJlZykpCj4gPj4gKyByZXR1cm4gUFRSX0VSUihyZWcpOwo+ ID4+ICsKPiA+PiArIHJldHVybiBkZXZtX3N1bnhpX2NjdV9wcm9iZSgmcGRldi0+ZGV2LCByZWcs ICZzdW44aV92ODUzX3JfY2N1X2Rlc2MpOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgY29u c3Qgc3RydWN0IG9mX2RldmljZV9pZCBzdW44aV92ODUzX3JfY2N1X2lkc1tdID0gewo+ID4+ICsg eyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuOGktdjg1My1yLWNjdSIgfSwKPiA+PiArIHsg fQo+ID4+ICt9Owo+ID4+ICtNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzdW44aV92ODUzX3JfY2N1 X2lkcyk7Cj4gPj4gKwo+ID4+ICtzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzdW44aV92 ODUzX3JfY2N1X2RyaXZlciA9IHsKPiA+PiArIC5wcm9iZSA9IHN1bjhpX3Y4NTNfcl9jY3VfcHJv YmUsCj4gPj4gKyAuZHJpdmVyID0gewo+ID4+ICsgLm5hbWUgPSAic3VuOGktdjg1My1yLWNjdSIs Cj4gPj4gKyAuc3VwcHJlc3NfYmluZF9hdHRycyA9IHRydWUsCj4gPj4gKyAub2ZfbWF0Y2hfdGFi bGUgPSBzdW44aV92ODUzX3JfY2N1X2lkcywKPiA+PiArIH0sCj4gPj4gK307Cj4gPj4gK21vZHVs ZV9wbGF0Zm9ybV9kcml2ZXIoc3VuOGlfdjg1M19yX2NjdV9kcml2ZXIpOwo+ID4+ICsKPiA+PiAr TU9EVUxFX0lNUE9SVF9OUygiU1VOWElfQ0NVIik7Cj4gPj4gK01PRFVMRV9ERVNDUklQVElPTigi U3VwcG9ydCBmb3IgdGhlIEFsbHdpbm5lciBWODUzIFBSQ00gQ0NVIik7Cj4gPj4gK01PRFVMRV9M SUNFTlNFKCJHUEwiKTsKPiA+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1 LXN1bjhpLXY4NTMtci5oIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLXY4NTMtci5o Cj4gPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+PiBpbmRleCAwMDAwMDAwMDAwMDAuLjJjNmNj N2I2ZjI1MQo+ID4+IC0tLSAvZGV2L251bGwKPiA+PiArKysgYi9kcml2ZXJzL2Nsay9zdW54aS1u Zy9jY3Utc3VuOGktdjg1My1yLmgKPiA+PiBAQCAtMCwwICsxLDE0IEBACj4gPj4gKy8qIFNQRFgt TGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCj4gPj4gKy8qCj4gPj4gKyAqIENvcHlyaWdo dCAoQykgMjAyNSBBbmRyYXMgU3plbXpvIDxzemVtem8uYW5kcmFzQGdtYWlsLmNvbT4KPiA+PiAr ICovCj4gPj4gKwo+ID4+ICsjaWZuZGVmIF9DQ1VfU1VOOElfVjg1M19SX0gKPiA+PiArI2RlZmlu ZSBfQ0NVX1NVTjhJX1Y4NTNfUl9ICj4gPj4gKwo+ID4+ICsjaW5jbHVkZSA8ZHQtYmluZGluZ3Mv Y2xvY2svYWxsd2lubmVyLHN1bjhpLXY4NTMtci1jY3UuaD4KPiA+PiArI2luY2x1ZGUgPGR0LWJp bmRpbmdzL3Jlc2V0L2FsbHdpbm5lcixzdW44aS12ODUzLXItY2N1Lmg+Cj4gPj4gKwo+ID4+ICsj ZGVmaW5lIENMS19OVU1CRVIgKENMS19CVVNfUl9DUFVDRkcgKyAxKQo+ID4+ICsKPiA+PiArI2Vu ZGlmCj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS12ODUz LmMgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktdjg1My5jCj4gPj4gbmV3IGZpbGUg bW9kZSAxMDA2NDQKPiA+PiBpbmRleCAwMDAwMDAwMDAwMDAuLjRiMzJmM2E5MTNjZgo+ID4+IC0t LSAvZGV2L251bGwKPiA+PiArKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktdjg1 My5jCj4gPj4gQEAgLTAsMCArMSwxMTQ1IEBACj4gPj4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlm aWVyOiBHUEwtMi4wCj4gPj4gKy8qCj4gPj4gKyAqIENvcHlyaWdodCAoQykgMjAyNSBBbmRyYXMg U3plbXpvIDxzemVtem8uYW5kcmFzQGdtYWlsLmNvbT4KPiA+PiArICoKPiA+PiArICogQmFzZWQg b24gY2N1LXN1bjIwaS1kMS5jIGJ5IFNhbXVlbCBIb2xsYW5kLgo+ID4+ICsgKi8KPiA+PiArCj4g Pj4gKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KPiA+PiArI2luY2x1ZGUgPGxpbnV4 L2lvLmg+Cj4gPj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiA+PiArI2luY2x1ZGUgPGxp bnV4L3BsYXRmb3JtX2RldmljZS5oPgo+ID4+ICsKPiA+PiArI2luY2x1ZGUgIi4uL2Nsay5oIgo+ ID4+ICsKPiA+PiArI2luY2x1ZGUgImNjdV9jb21tb24uaCIKPiA+PiArI2luY2x1ZGUgImNjdV9y ZXNldC5oIgo+ID4+ICsKPiA+PiArI2luY2x1ZGUgImNjdV9kaXYuaCIKPiA+PiArI2luY2x1ZGUg ImNjdV9nYXRlLmgiCj4gPj4gKyNpbmNsdWRlICJjY3VfbXAuaCIKPiA+PiArI2luY2x1ZGUgImNj dV9tdWx0LmgiCj4gPj4gKyNpbmNsdWRlICJjY3VfbmsuaCIKPiA+PiArI2luY2x1ZGUgImNjdV9u a20uaCIKPiA+PiArI2luY2x1ZGUgImNjdV9ua21wLmgiCj4gPj4gKyNpbmNsdWRlICJjY3Vfbm0u aCIKPiA+PiArCj4gPj4gKyNpbmNsdWRlICJjY3Utc3VuOGktdjg1My5oIgo+ID4+ICsKPiA+PiAr c3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfcGFyZW50X2RhdGEgb3NjMjRNW10gPSB7Cj4gPj4gKyB7 IC5md19uYW1lID0gImhvc2MiIH0KPiA+PiArfTsKPiA+PiArCj4gPj4gKy8qCj4gPj4gKyAqIEZv ciB0aGUgQ1BVIFBMTCwgdGhlIG91dHB1dCBkaXZpZGVyIGlzIGRlc2NyaWJlZCBhcyAib25seSBm b3IgdGVzdGluZyIKPiA+PiArICogaW4gdGhlIHVzZXIgbWFudWFsLiBTbyBpdCdzIG5vdCBtb2Rl bGxlZCBhbmQgZm9yY2VkIHRvIDAuCj4gPj4gKyAqLwo+ID4+ICsjZGVmaW5lIFNVTjhJX1Y4NTNf UExMX0NQVV9SRUcgMHgwMDAKPiA+PiArCj4gPj4gK3N0YXRpYyBzdHJ1Y3QgY2N1X211bHQgcGxs X2NwdV9jbGsgPSB7Cj4gPj4gKyAuZW5hYmxlID0gQklUKDI3KSwKPiA+PiArIC5sb2NrID0gQklU KDI4KSwKPiA+PiArIC5tdWx0ID0gX1NVTlhJX0NDVV9NVUxUX01JTig4LCA4LCAxMSksCj4gPj4g KyAuY29tbW9uID0gewo+ID4+ICsgLnJlZyA9IDB4MDAwLAo+ID4+ICsgLmh3LmluaXQgPSBDTEtf SFdfSU5JVF9QQVJFTlRTX0RBVEEoInBsbC1jcHUiLCBvc2MyNE0sCj4gPj4gKyAgICZjY3VfbXVs dF9vcHMsCj4gPj4gKyAgIENMS19TRVRfUkFURV9HQVRFKSwKPiA+PiArIH0sCj4gPj4gK307Cj4g Pj4gKwo+ID4+ICsvKiBTb21lIFBMTHMgYXJlIGlucHV0ICogTiAvIGRpdjEgLyBQLiBNb2RlbCB0 aGVtIGFzIE5LTVAgd2l0aCBubyBLICovCj4gPj4gKyNkZWZpbmUgU1VOOElfVjg1M19QTExfRERS X1JFRyAweDAxMAo+ID4+ICtzdGF0aWMgc3RydWN0IGNjdV9ua21wIHBsbF9kZHJfY2xrID0gewo+ ID4+ICsgLmVuYWJsZSA9IEJJVCgyNyksCj4gPj4gKyAubG9jayA9IEJJVCgyOCksCj4gPj4gKyAu biA9IF9TVU5YSV9DQ1VfTVVMVF9NSU4oOCwgOCwgMTEpLAo+ID4+ICsgLm0gPSBfU1VOWElfQ0NV X0RJVigxLCAxKSwgLyogaW5wdXQgZGl2aWRlciAqLwo+ID4+ICsgLnAgPSBfU1VOWElfQ0NVX0RJ VigwLCAxKSwgLyogb3V0cHV0IGRpdmlkZXIgKi8KPiA+PiArIC5jb21tb24gPSB7Cj4gPj4gKyAu cmVnID0gMHgwMTAsCj4gPj4gKyAuaHcuaW5pdCA9IENMS19IV19JTklUX1BBUkVOVFNfREFUQSgi cGxsLWRkciIsIG9zYzI0TSwKPiA+PiArICAgJmNjdV9ua21wX29wcywKPiA+PiArICAgQ0xLX1NF VF9SQVRFX0dBVEUpLAo+ID4+ICsgfSwKPiA+PiArfTsKPiA+PiArCj4gPj4gKyNkZWZpbmUgU1VO OElfVjg1M19QTExfUEVSSVBIX1JFRyAweDAyMAo+ID4+ICtzdGF0aWMgc3RydWN0IGNjdV9ubSBw bGxfcGVyaXBoXzR4X2NsayA9IHsKPiA+PiArIC5lbmFibGUgPSBCSVQoMjcpLAo+ID4+ICsgLmxv Y2sgPSBCSVQoMjgpLAo+ID4+ICsgLm4gPSBfU1VOWElfQ0NVX01VTFRfTUlOKDgsIDgsIDExKSwK PiA+PiArIC5tID0gX1NVTlhJX0NDVV9ESVYoMSwgMSksIC8qIGlucHV0IGRpdmlkZXIgKi8KPiA+ PiArIC5jb21tb24gPSB7Cj4gPj4gKyAucmVnID0gMHgwMjAsCj4gPj4gKyAuaHcuaW5pdCA9IENM S19IV19JTklUX1BBUkVOVFNfREFUQSgicGxsLXBlcmlwaC00eCIsIG9zYzI0TSwKPiA+PiArICAg JmNjdV9ubV9vcHMsCj4gPj4gKyAgIENMS19TRVRfUkFURV9HQVRFKSwKPiA+PiArIH0sCj4gPj4g K307Cj4gPj4gKwo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19odyAqcGxsX3BlcmlwaF80 eF9od3NbXSA9IHsKPiA+PiArICZwbGxfcGVyaXBoXzR4X2Nsay5jb21tb24uaHcKPiA+PiArfTsK PiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9IV1MocGxsX3BlcmlwaF8yeF9jbGssICJw bGwtcGVyaXBoLTJ4IiwgcGxsX3BlcmlwaF80eF9od3MsCj4gPj4gKyAgICAgICAweDAyMCwgMTYs IDMsIDApOwo+ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NX0hXUyhwbGxfcGVyaXBoXzgw ME1fY2xrLCAicGxsLXBlcmlwaC04MDBNIiwgcGxsX3BlcmlwaF80eF9od3MsCj4gPj4gKyAgICAg ICAweDAyMCwgMjAsIDMsIDApOwo+ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NX0hXUyhw bGxfcGVyaXBoXzQ4ME1fY2xrLCAicGxsLXBlcmlwaC00ODBNIiwgcGxsX3BlcmlwaF80eF9od3Ms Cj4gPj4gKyAgICAgICAweDAyMCwgMiwgMywgMCk7Cj4gPj4gKwo+ID4+ICtzdGF0aWMgQ0xLX0ZJ WEVEX0ZBQ1RPUl9IVyhwbGxfcGVyaXBoXzYwME1fY2xrLCAicGxsLXBlcmlwaC02MDBNIiwKPiA+ PiArICAgJnBsbF9wZXJpcGhfMnhfY2xrLmNvbW1vbi5odywgMiwgMSwgMCk7Cj4gPj4gKwo+ID4+ ICtzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUl9IVyhwbGxfcGVyaXBoXzQwME1fY2xrLCAicGxsLXBl cmlwaC00MDBNIiwKPiA+PiArICAgJnBsbF9wZXJpcGhfMnhfY2xrLmNvbW1vbi5odywgMywgMSwg MCk7Cj4gPj4gKwo+ID4+ICtzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUl9IVyhwbGxfcGVyaXBoXzMw ME1fY2xrLCAicGxsLXBlcmlwaC0zMDBNIiwKPiA+PiArICAgJnBsbF9wZXJpcGhfNjAwTV9jbGsu aHcsIDIsIDEsIDApOwo+ID4+ICsKPiA+PiArc3RhdGljIENMS19GSVhFRF9GQUNUT1JfSFcocGxs X3BlcmlwaF8yMDBNX2NsaywgInBsbC1wZXJpcGgtMjAwTSIsCj4gPj4gKyAgICZwbGxfcGVyaXBo XzQwME1fY2xrLmh3LCAyLCAxLCAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBDTEtfRklYRURfRkFD VE9SX0hXKHBsbF9wZXJpcGhfMTYwTV9jbGssICJwbGwtcGVyaXBoLTE2ME0iLAo+ID4+ICsgICAm cGxsX3BlcmlwaF80ODBNX2Nsay5jb21tb24uaHcsIDMsIDEsIDApOwo+ID4+ICsKPiA+PiArc3Rh dGljIENMS19GSVhFRF9GQUNUT1JfSFcocGxsX3BlcmlwaF8xNTBNX2NsaywgInBsbC1wZXJpcGgt MTUwTSIsCj4gPj4gKyAgICZwbGxfcGVyaXBoXzMwME1fY2xrLmh3LCAyLCAxLCAwKTsKPiA+PiAr Cj4gPj4gKy8qCj4gPj4gKyAqIEZvciBWaWRlbyBQTExzLCB0aGUgb3V0cHV0IGRpdmlkZXIgaXMg ZGVzY3JpYmVkIGFzICJvbmx5IGZvciB0ZXN0aW5nIgo+ID4+ICsgKiBpbiB0aGUgdXNlciBtYW51 YWwuCj4gPj4gKyAqLwo+ID4+ICsjZGVmaW5lIFNVTjhJX1Y4NTNfUExMX1ZJREVPX1JFRyAweDA0 MAo+ID4+ICtzdGF0aWMgc3RydWN0IGNjdV9ua21wIHBsbF92aWRlb180eF9jbGsgPSB7Cj4gPj4g KyAuZW5hYmxlID0gQklUKDI3KSwKPiA+PiArIC5sb2NrID0gQklUKDI4KSwKPiA+PiArIC5uID0g X1NVTlhJX0NDVV9NVUxUX01JTig4LCA4LCAxMSksCj4gPj4gKyAucCA9IF9TVU5YSV9DQ1VfRElW KDEsIDEpLCAvKiBpbnB1dCBkaXZpZGVyICovCj4gPj4gKyAuY29tbW9uID0gewo+ID4+ICsgLnJl ZyA9IDB4MDQwLAo+ID4+ICsgLmh3LmluaXQgPSBDTEtfSFdfSU5JVF9QQVJFTlRTX0RBVEEoInBs bC12aWRlby00eCIsIG9zYzI0TSwKPiA+PiArICAgJmNjdV9ua21wX29wcywKPiA+PiArICAgQ0xL X1NFVF9SQVRFX0dBVEUpLAo+ID4+ICsgfSwKPiA+PiArfTsKPiA+PiArCj4gPj4gK3N0YXRpYyBj b25zdCBzdHJ1Y3QgY2xrX2h3ICpwbGxfdmlkZW9fNHhfaHdzW10gPSB7Cj4gPj4gKyAmcGxsX3Zp ZGVvXzR4X2Nsay5jb21tb24uaHcKPiA+PiArfTsKPiA+PiArc3RhdGljIENMS19GSVhFRF9GQUNU T1JfSFdTKHBsbF92aWRlb18yeF9jbGssICJwbGwtdmlkZW8tMngiLAo+ID4+ICsgICAgcGxsX3Zp ZGVvXzR4X2h3cywgMiwgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7Cj4gPj4gK3N0YXRpYyBDTEtf RklYRURfRkFDVE9SX0hXUyhwbGxfdmlkZW9fMXhfY2xrLCAicGxsLXZpZGVvLTF4IiwKPiA+PiAr ICAgIHBsbF92aWRlb180eF9od3MsIDQsIDEsIENMS19TRVRfUkFURV9QQVJFTlQpOwo+ID4+ICsK PiA+PiArCj4gPj4gKy8qCj4gPj4gKyAqIEZvciBDU0kgUExMcywgdGhlIG91dHB1dCBkaXZpZGVy IGlzIGRlc2NyaWJlZCBhcyAib25seSBmb3IgdGVzdGluZyIKPiA+PiArICogaW4gdGhlIHVzZXIg bWFudWFsLgo+ID4+ICsgKi8KPiA+PiArI2RlZmluZSBTVU44SV9WODUzX1BMTF9DU0lfUkVHIDB4 MDQ4Cj4gPj4gK3N0YXRpYyBzdHJ1Y3QgY2N1X25rbXAgcGxsX2NzaV80eF9jbGsgPSB7Cj4gPj4g KyAuZW5hYmxlID0gQklUKDI3KSwKPiA+PiArIC5sb2NrID0gQklUKDI4KSwKPiA+PiArIC5uID0g X1NVTlhJX0NDVV9NVUxUX01JTig4LCA4LCAxMSksCj4gPj4gKyAucCA9IF9TVU5YSV9DQ1VfRElW KDEsIDEpLCAvKiBpbnB1dCBkaXZpZGVyICovCj4gPj4gKyAuY29tbW9uID0gewo+ID4+ICsgLnJl ZyA9IDB4MDQ4LAo+ID4+ICsgLmh3LmluaXQgPSBDTEtfSFdfSU5JVF9QQVJFTlRTX0RBVEEoInBs bC1jc2ktNHgiLCBvc2MyNE0sCj4gPj4gKyAgICZjY3VfbmttcF9vcHMsCj4gPj4gKyAgIENMS19T RVRfUkFURV9HQVRFKSwKPiA+PiArIH0sCj4gPj4gK307Cj4gPj4gKwo+ID4+ICtzdGF0aWMgQ0xL X0ZJWEVEX0ZBQ1RPUl9IVyhwbGxfY3NpX2NsaywgInBsbC1jc2kiLAo+ID4+ICsgICAmcGxsX2Nz aV80eF9jbGsuY29tbW9uLmh3LCA0LCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKPiA+PiArCj4g Pj4gKwo+ID4+ICsjZGVmaW5lIFNVTjhJX1Y4NTNfUExMX0FVRElPX1JFRyAweDA3OAo+ID4+ICtz dGF0aWMgc3RydWN0IGNjdV9zZG1fc2V0dGluZyBwbGxfYXVkaW9fZGl2NV9zZG1fdGFibGVbXSA9 IHsKPiA+PiArIHsgLnJhdGUgPSAxOTY2MDgwMDAsIC5wYXR0ZXJuID0gMHhjMDAxZWI4NSwgLm0g PSA1LCAubiA9IDQwIH0sIC8qIDI0LjU3NiAqLwo+ID4+ICsgeyAucmF0ZSA9IDY3NzM3NjAwLCAu cGF0dGVybiA9IDB4YzAwMTI4OGQsIC5tID0gOCwgLm4gPSAyMiB9LCAvKiAyMi41NzkyICovCj4g Pj4gK307Cj4gPj4gKwo+ID4+ICtzdGF0aWMgc3RydWN0IGNjdV9ubSBwbGxfYXVkaW9fZGl2NV9j bGsgPSB7Cj4gPj4gKyAuZW5hYmxlID0gQklUKDI3KSwKPiA+PiArIC5sb2NrICAgICAgICAgICA9 IEJJVCgyOCksCj4gPj4gKyAubiAgICAgICAgICAgICAgPSBfU1VOWElfQ0NVX01VTFQoOCwgOCks Cj4gPj4gKyAubSAgICAgICAgICAgICAgPSBfU1VOWElfQ0NVX0RJVigyMCwgMyksCj4gPj4gKyAu c2RtICAgICAgICAgICAgPSBfU1VOWElfQ0NVX1NETShwbGxfYXVkaW9fZGl2NV9zZG1fdGFibGUs Cj4gPj4gKyAgICBCSVQoMjQpLCAweDAxNzgsIEJJVCgzMSkpLAo+ID4+ICsgLmNvbW1vbiAgICAg ICAgID0gewo+ID4+ICsgLnJlZyAgICAgICAgICAgID0gMHgwMDc4LAo+ID4+ICsgLmZlYXR1cmVz ICAgICAgID0gQ0NVX0ZFQVRVUkVfU0lHTUFfREVMVEFfTU9ELAo+ID4+ICsgLmh3LmluaXQgICAg ICAgID0gQ0xLX0hXX0lOSVRfUEFSRU5UU19EQVRBKCJwbGwtYXVkaW8tZGl2NSIsIG9zYzI0TSwK PiA+PiArICAgJmNjdV9ubV9vcHMsCj4gPj4gKyAgIENMS19TRVRfUkFURV9VTkdBVEUpLAo+ID4+ ICsgfSwKPiA+PiArfTsKPiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2h3ICpw bGxfYXVkaW9fZGl2NV9od3NbXSA9IHsKPiA+PiArICZwbGxfYXVkaW9fZGl2NV9jbGsuY29tbW9u Lmh3Cj4gPj4gK307Cj4gPj4gKwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX01fSFdTKHBsbF9hdWRp b18xeF9jbGssICJwbGwtYXVkaW8tMXgiLCBwbGxfYXVkaW9fZGl2NV9od3MsCj4gPj4gKyAgICAg ICAweGUwMCwgMCwgNSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7Cj4gPj4gKwo+ID4+ICsvKiBwbGwt YXVkaW8tZGl2MiBhbmQgcGxsLWF1ZGlvLTR4IG5vdCB1c2VkLCBiZWNhdXNlIHBsbC1hdWRpby0x eCBjYW4gY292ZXIgCj4gPj4gKyAqIDIyLjU3OTJNIGFuZCAyNC41NzZNIAo+ID4+ICsgKi8KPiA+ PiArc3RhdGljIFNVTlhJX0NDVV9NKHBsbF9hdWRpb19kaXYyX2NsaywgInBsbC1hdWRpby1kaXYy IiwgInBsbC1hdWRpbyIsCj4gPj4gKyAgIDB4MDc4LCAxNiwgMywgMCk7Cj4gPj4gK3N0YXRpYyBT VU5YSV9DQ1VfTShwbGxfYXVkaW9fNHhfY2xrLCAicGxsLWF1ZGlvLTR4IiwgInBsbC1hdWRpby1k aXYyIiwKPiA+PiArICAgMHhlMDAsIDUsIDUsIDApOwo+ID4+ICsKPiA+PiArLyoKPiA+PiArICog Rm9yIHRoZSBOUFUgUExMLCB0aGUgb3V0cHV0IGRpdmlkZXIgaXMgZGVzY3JpYmVkIGFzICJvbmx5 IGZvciB0ZXN0aW5nIgo+ID4+ICsgKiBpbiB0aGUgdXNlciBtYW51YWwuCj4gPj4gKyAqLwo+ID4+ ICsjZGVmaW5lIFNVTjhJX1Y4NTNfUExMX05QVV9SRUcgMHgwODAKPiA+PiArc3RhdGljIHN0cnVj dCBjY3VfbmttcCBwbGxfbnB1XzR4X2NsayA9IHsKPiA+PiArIC5lbmFibGUgPSBCSVQoMjcpLAo+ ID4+ICsgLmxvY2sgPSBCSVQoMjgpLAo+ID4+ICsgLm4gPSBfU1VOWElfQ0NVX01VTFRfTUlOKDgs IDgsIDExKSwKPiA+PiArIC5wID0gX1NVTlhJX0NDVV9ESVYoMSwgMSksIC8qIGlucHV0IGRpdmlk ZXIgKi8KPiA+PiArIC5jb21tb24gPSB7Cj4gPj4gKyAucmVnID0gMHgwODAsCj4gPj4gKyAuaHcu aW5pdCA9IENMS19IV19JTklUX1BBUkVOVFNfREFUQSgicGxsLW5wdS00eCIsIG9zYzI0TSwKPiA+ PiArICAgJmNjdV9ua21wX29wcywKPiA+PiArICAgQ0xLX1NFVF9SQVRFX1VOR0FURSksCj4gPj4g KyB9LAo+ID4+ICt9Owo+ID4+ICsKPiA+PiArLyoKPiA+PiArICogVGhlIENQVSBnYXRlIGlzIG5v dCBtb2RlbGxlZCAtIGl0IGlzIGluIGEgc2VwYXJhdGUgcmVnaXN0ZXIgKDB4NTA0KQo+ID4+ICsg KiBhbmQgaGFzIGEgc3BlY2lhbCBrZXkgZmllbGQuIFRoZSBjbG9jayBtdXN0IG5vdCBiZSBnYXRl ZCBhbnl3YXkgYnkKPiA+PiArICogdGhlIGtlcm5lbC4KPiA+PiArICovCj4gPj4gK3N0YXRpYyBj b25zdCBzdHJ1Y3QgY2xrX3BhcmVudF9kYXRhIGNwdV9wYXJlbnRzW10gPSB7Cj4gPj4gKyB7IC5m d19uYW1lID0gImhvc2MiIH0sCj4gPj4gKyB7IC5md19uYW1lID0gImxvc2MiIH0sCj4gPj4gKyB7 IC5md19uYW1lID0gImlvc2MiIH0sCj4gPj4gKyB7IC5odyA9ICZwbGxfY3B1X2Nsay5jb21tb24u aHcgfSwKPiA+PiArIHsgLmh3ID0gJnBsbF9wZXJpcGhfNjAwTV9jbGsuaHcgfSwKPiA+PiArIHsg Lmh3ID0gJnBsbF9wZXJpcGhfODAwTV9jbGsuY29tbW9uLmh3IH0sCj4gPj4gK307Cj4gPj4gKwo+ ID4+ICsvKgo+ID4+ICsgKiBUaGVyZSBpcyBhIFAgZmFjdG9yIChQTExfT1VUX0VYVF9ESVZQWzE3 OjE2XSkgaW4gdGhpcyByZWdpc3RlciwgYnV0IGl0IGlzIG5vdCBtb2RlbGVkLgo+ID4+ICsgKiBU aGUgbWFudWFsIHN0YXRlcyB0aGF0IGl0IHNob3VsZCBiZSB1c2VkIG9ubHksIHdoZW4gdGhlIG91 dHB1dCBjbG9jayBpcyBsZXNzIHRoYW4gMjg4IE1Iei4KPiA+PiArICovCj4gPj4gK3N0YXRpYyBT VU5YSV9DQ1VfTVVYX0RBVEEoY3B1X2NsaywgImNwdSIsIGNwdV9wYXJlbnRzLAo+ID4+ICsgIDB4 NTAwLCAyNCwgMywgQ0xLX1NFVF9SQVRFX1BBUkVOVCB8IENMS19JU19DUklUSUNBTCk7Cj4gPj4g Kwo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19odyAqY3B1X2h3c1tdID0geyAmY3B1X2Ns ay5jb21tb24uaHcgfTsKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9IV1MoY3B1X2F4 aV9jbGssICJjcHUtYXhpIiwgY3B1X2h3cywKPiA+PiArICAgICAgIDB4NTAwLCAwLCAyLCAwKTsK PiA+PiArc3RhdGljIFNVTlhJX0NDVV9NX0hXUyhjcHVfYXBiX2NsaywgImNwdS1hcGIiLCBjcHVf aHdzLAo+ID4+ICsgICAgICAgMHg1MDAsIDgsIDIsIDApOwo+ID4+ICsKPiA+PiArc3RhdGljIGNv bnN0IHN0cnVjdCBjbGtfcGFyZW50X2RhdGEgYWhiX3BhcmVudHNbXSA9IHsKPiA+PiArIHsgLmZ3 X25hbWUgPSAiaG9zYyIgfSwKPiA+PiArIHsgLmZ3X25hbWUgPSAibG9zYyIgfSwKPiA+PiArIHsg LmZ3X25hbWUgPSAiaW9zYyIgfSwKPiA+PiArIHsgLmh3ID0gJnBsbF9wZXJpcGhfNjAwTV9jbGsu aHcgfSwKPiA+PiArfTsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NUF9EQVRBX1dJVEhfTVVYKGFo Yl9jbGssICJhaGIiLCBhaGJfcGFyZW50cywgMHg1MTAsCj4gPj4gKyAgMCwgNSwgLyogTSAqLwo+ ID4+ICsgIDgsIDIsIC8qIFAgKi8KPiA+PiArICAyNCwgMiwgLyogbXV4ICovCj4gPj4gKyAgMCk7 Cj4gPj4gKwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX01QX0RBVEFfV0lUSF9NVVgoYXBiMF9jbGss ICJhcGIwIiwgYWhiX3BhcmVudHMsIDB4NTIwLAo+ID4+ICsgIDAsIDUsIC8qIE0gKi8KPiA+PiAr ICA4LCAyLCAvKiBQICovCj4gPj4gKyAgMjQsIDIsIC8qIG11eCAqLwo+ID4+ICsgIDApOwo+ID4+ ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NUF9EQVRBX1dJVEhfTVVYKGFwYjFfY2xrLCAiYXBi MSIsIGFoYl9wYXJlbnRzLCAweDUyNCwKPiA+PiArICAwLCA1LCAvKiBNICovCj4gPj4gKyAgOCwg MiwgLyogUCAqLwo+ID4+ICsgIDI0LCAyLCAvKiBtdXggKi8KPiA+PiArICAwKTsKPiA+PiArCj4g Pj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2h3ICphaGJfaHdzW10gPSB7ICZhaGJfY2xrLmNv bW1vbi5odyB9Owo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19odyAqYXBiMF9od3NbXSA9 IHsgJmFwYjBfY2xrLmNvbW1vbi5odyB9Owo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19o dyAqYXBiMV9od3NbXSA9IHsgJmFwYjFfY2xrLmNvbW1vbi5odyB9Owo+ID4+ICsKPiA+PiArCj4g Pj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2h3ICpkZV9nMmRfcGFyZW50c1tdID0gewo+ID4+ ICsgJnBsbF9wZXJpcGhfMzAwTV9jbGsuaHcsCj4gPj4gKyAmcGxsX3ZpZGVvXzF4X2Nsay5odywK PiA+PiArfTsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NX0hXX1dJVEhfTVVYX0dBVEUoZGVfY2xr LCAiZGUiLCBkZV9nMmRfcGFyZW50cywgMHg2MDAsCj4gPj4gKyAgICAwLCA1LCAvKiBNICovCj4g Pj4gKyAgICAyNCwgMSwgLyogbXV4ICovCj4gPj4gKyAgICBCSVQoMzEpLCAvKiBnYXRlICovCj4g Pj4gKyAgICBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9D Q1VfR0FURV9IV1MoYnVzX2RlX2NsaywgImJ1cy1kZSIsIGFoYl9od3MsCj4gPj4gKyAgMHg2MGMs IEJJVCgwKSwgMCk7Cj4gPj4gKwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX01fSFdfV0lUSF9NVVhf R0FURShnMmRfY2xrLCAiZzJkIiwgZGVfZzJkX3BhcmVudHMsIDB4NjMwLAo+ID4+ICsgICAgMCwg NSwgLyogTSAqLwo+ID4+ICsgICAgMjQsIDEsIC8qIG11eCAqLwo+ID4+ICsgICAgQklUKDMxKSwg LyogZ2F0ZSAqLwo+ID4+ICsgICAgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7Cj4gPj4gKwo+ID4+ICtz dGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19nMmRfY2xrLCAiYnVzLWcyZCIsIGFoYl9od3Ms Cj4gPj4gKyAgMHg2M2MsIEJJVCgwKSwgMCk7Cj4gPj4gKwo+ID4+ICsKPiA+PiArc3RhdGljIGNv bnN0IHN0cnVjdCBjbGtfcGFyZW50X2RhdGEgY2VfcGFyZW50c1tdID0gewo+ID4+ICsgeyAuZndf bmFtZSA9ICJob3NjIiB9LAo+ID4gCj4gPiBXaGVyZSB0aGlzIGNvbWUgZnJvbT8gVjg1MyBtYW51 YWwgdjEuMSBkb2Vzbid0IGhhdmUgaXQuCj4gCj4gVGhlcmUgaXMgYSBzdW44aXcyMSBjY3UgZHJp dmVyIFsxXSwgd2hlcmUgaG9zYyBpcyB0aGUgZmlyc3QgcGFyZW50Ogo+IAo+IFsxXToKPiBodHRw czovL2dpdGh1Yi5jb20vWXV6dWtpSEQvVGlueVZpc2lvbi9ibG9iL21haW4va2VybmVsL2JzcC9k cml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGl3MjEuYyNMMjYyCj4gCj4gSSBkb27igJl0IGtu b3cgaWYgdGhlIG1hbnVhbCBvciBpZiB0aGlzIGRyaXZlciBpcyB0aGUgY29ycmVjdC4KCkl0J3Mg b2suCgo+IAo+ID4gCj4gPj4gKyB7IC5odyA9ICZwbGxfcGVyaXBoXzQwME1fY2xrLmh3LCB9LAo+ ID4+ICsgeyAuaHcgPSAmcGxsX3BlcmlwaF8zMDBNX2Nsay5odywgfQo+ID4+ICt9Owo+ID4+ICtz dGF0aWMgU1VOWElfQ0NVX01fREFUQV9XSVRIX01VWF9HQVRFKGNlX2NsaywgImNlIiwgY2VfcGFy ZW50cywgMHg2ODAsCj4gPj4gKyAgICAgIDAsIDQsIC8qIE0gKi8KPiA+PiArICAgICAgMjQsIDMs IC8qIG11eCAqLwo+ID4+ICsgICAgICBCSVQoMzEpLCAvKiBnYXRlICovCj4gPj4gKyAgICAgIENM S19TRVRfUkFURV9QQVJFTlQpOwo+ID4gCj4gPiBTZXQgcmF0ZSBwYXJlbnQgZmxhZyBkb2Vzbid0 IG1ha2Ugc2Vuc2Ugb24gY29uc3RhbnQgcGFyZW50cy4KPiAKPiB5ZXMKPiAKPiA+IAo+ID4+ICsK PiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfY2VfY2xrLCAiYnVzLWNlIiwgYWhi X2h3cywKPiA+PiArICAweDY4YywgQklUKDApIHwgQklUKDEpLCAwKTsKPiA+PiArCj4gPj4gK3N0 YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2h3ICp2ZV9wYXJlbnRzW10gPSB7Cj4gPj4gKyAmcGxsX3Bl cmlwaF8zMDBNX2Nsay5odywKPiA+PiArICZwbGxfcGVyaXBoXzQwME1fY2xrLmh3LAo+ID4+ICsg JnBsbF9wZXJpcGhfNDgwTV9jbGsuY29tbW9uLmh3LAo+ID4+ICsgJnBsbF9ucHVfNHhfY2xrLmNv bW1vbi5odywKPiA+PiArICZwbGxfdmlkZW9fNHhfY2xrLmNvbW1vbi5odywKPiA+PiArICZwbGxf Y3NpXzR4X2Nsay5jb21tb24uaHcsCj4gPj4gK307Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9I V19XSVRIX01VWF9HQVRFKHZlX2NsaywgInZlIiwgdmVfcGFyZW50cywgMHg2OTAsCj4gPj4gKyAg ICAwLCA1LCAvKiBNICovCj4gPj4gKyAgICAyNCwgMywgLyogbXV4ICovCj4gPj4gKyAgICBCSVQo MzEpLCAvKiBnYXRlICovCj4gPj4gKyAgICAwKTsKPiA+IAo+ID4gQ0xLX1NFVF9SQVRFX1BBUkVO VCBmbGFnPyBDZWRydXMgZHJpdmVyIHNldCB3b3JraW5nIGNsb2NrIGF0IHRoZSBiZWdpbm5pbmcu Cj4gPiAKPiAKPiBvawo+IAo+ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhi dXNfdmVfY2xrLCAiYnVzLXZlIiwgYWhiX2h3cywKPiA+PiArICAweDY5YywgQklUKDApLCAwKTsK PiA+PiArCj4gPj4gKwo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19odyAqbnB1X3BhcmVu dHNbXSA9IHsKPiA+PiArICZwbGxfcGVyaXBoXzQ4ME1fY2xrLmNvbW1vbi5odywKPiA+PiArICZw bGxfcGVyaXBoXzYwME1fY2xrLmh3LAo+ID4+ICsgJnBsbF9wZXJpcGhfODAwTV9jbGsuY29tbW9u Lmh3LAo+ID4+ICsgJnBsbF9ucHVfNHhfY2xrLmNvbW1vbi5odywKPiA+PiArfTsKPiA+PiArc3Rh dGljIFNVTlhJX0NDVV9NX0hXX1dJVEhfTVVYX0dBVEUobnB1X2NsaywgIm5wdSIsIG5wdV9wYXJl bnRzLCAweDZlMCwKPiA+PiArICAgIDAsIDUsIC8qIE0gKi8KPiA+PiArICAgIDI0LCAzLCAvKiBt dXggKi8KPiA+PiArICAgIEJJVCgzMSksIC8qIGdhdGUgKi8KPiA+PiArICAgIDApOwo+ID4gCj4g PiBJIHRoaW5rIENMS19TRVRfUkFURV9QQVJFTlQgd291bGQgYWxzbyBiZSBiZW5lZmljaWFsIGhl cmUuCj4gCj4gSSB0cmllZCB0byBtaW1pYyBob3cgdGhlIEJTUCBzZXR1cCB0aGUgTlBVIGNsb2Nr cyAoYXMgSSB0aGluaywgbm90IHN1cmUpLCBpbiB0aGUgZHRzIEkgc2V0dXAgaXQgbGlrZToKPiAK PiAgICAgICAgICAgICAgICAgbnB1OiBucHVAMzA1MDAwMCB7Cj4gICAgICAgICAgICAgICAgICAg ICAgICAgY29tcGF0aWJsZSA9ICJ2aXZhbnRlLGdjIjsKPiAgICAgICAgICAgICAgICAgICAgICAg ICByZWcgPSA8MHgwMzA1MDAwMCAweDEwMDA+Owo+ICAgICAgICAgICAgICAgICAgICAgICAgIGlu dGVycnVwdHMgPSA8R0lDX1NQSSA2NSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKPiAgICAgICAgICAg ICAgICAgICAgICAgICBpbnRlcnJ1cHQtbmFtZXMgPSAibnB1IjsKPiAgICAgICAgICAgICAgICAg ICAgICAgICBjbG9ja3MgPSA8JmNjdSBDTEtfQlVTX05QVT4sIDwmY2N1IENMS19OUFU+Owo+ICAg ICAgICAgICAgICAgICAgICAgICAgIGNsb2NrLW5hbWVzID0gImJ1cyIsICJjb3JlIjsKPiAgICAg ICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZC1jbG9ja3MgPSA8JmNjdSBDTEtfUExMX05QVV80 WD4sIDwmY2N1IENMS19OUFU+Owo+ICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkLWNs b2NrLXBhcmVudHMgPSA8JmRjeG8+LCA8JmNjdSBDTEtfUExMX05QVV80WD47Cj4gICAgICAgICAg ICAgICAgICAgICAgICAgYXNzaWduZWQtY2xvY2stcmF0ZXMgPSAgPDEzOTIwMDAwMDA+LCA8MzQ4 MDAwMDAwPjsKPiAgICAgICAgICAgICAgICAgICAgICAgICByZXNldHMgPSA8JmNjdSBSU1RfQlVT X05QVT47Cj4gICAgICAgICAgICAgICAgICAgICAgICAgaW9tbXVzID0gPCZpb21tdSA2PjsKPiAg ICAgICAgICAgICAgICAgICAgICAgICBwb3dlci1kb21haW5zID0gPCZwcHUgUERfTlBVPjsKPiAg ICAgICAgICAgICAgICAgfTsKPiAKPiBXaXRoIHRoZXNlIHNldHRpbmdzIChhZnRlciBhZGRpbmcg YSByZXNldCBzdXBwb3J0IHRvIHRoZSBldG5hdml2IGRyaXZlcikgYXQgbGVhc3QgSSdtIGFibGUg dG8gZHVtcCBzb21lIHJlZ2lzdGVycyB2aWEgZGVidWdmcy4KPiBEbyB5b3UgdGhpbmsgSSBzaG91 bGQgYWRkIHRoZSBDTEtfU0VUX1JBVEVfUEFSRU5UIGZsYWc/CgpZZXMsIGJlY2F1c2UgdGhvc2Ug YXNzaWduZWQgY2xvY2sgcHJvcGVydGllcyBhcmUgbm90IHJlYWxseSBob3cgdGhpbmdzIHNob3Vs ZApiZSBkb25lLgoKQmVzdCByZWdhcmRzLApKZXJuZWoKCj4gCj4gPiAKPiA+PiArCj4gPj4gK3N0 YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX25wdV9jbGssICJidXMtbnB1IiwgYWhiX2h3cywK PiA+PiArICAweDZlYywgQklUKDApLCAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1Vf R0FURV9IV1MoYnVzX2RtYV9jbGssICJidXMtZG1hIiwgYWhiX2h3cywKPiA+PiArICAweDcwYywg QklUKDApLCAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX21z Z2JveDBfY2xrLCAiYnVzLW1zZ2JveDAiLCBhaGJfaHdzLAo+ID4+ICsgIDB4NzFjLCBCSVQoMCks IDApOwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19tc2dib3gxX2NsaywgImJ1 cy1tc2dib3gxIiwgYWhiX2h3cywKPiA+PiArICAweDcxYywgQklUKDEpLCAwKTsKPiA+PiArCj4g Pj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX3NwaW5sb2NrX2NsaywgImJ1cy1zcGlu bG9jayIsIGFoYl9od3MsCj4gPj4gKyAgMHg3MmMsIEJJVCgwKSwgMCk7Cj4gPj4gKwo+ID4+ICtz dGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19oc3RpbWVyX2NsaywgImJ1cy1oc3RpbWVyIiwg YWhiX2h3cywKPiA+PiArICAweDczYywgQklUKDApLCAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBT VU5YSV9DQ1VfR0FURV9EQVRBKGF2c19jbGssICJhdnMiLCBvc2MyNE0sCj4gPj4gKyAgIDB4NzQw LCBCSVQoMzEpLCAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVz X2RiZ19jbGssICJidXMtZGJnIiwgYWhiX2h3cywKPiA+PiArICAweDc4YywgQklUKDApLCAwKTsK PiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX3B3bV9jbGssICJidXMt cHdtIiwgYXBiMF9od3MsCj4gPj4gKyAgMHg3YWMsIEJJVCgwKSwgMCk7Cj4gPj4gKwo+ID4+ICtz dGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19pb21tdV9jbGssICJidXMtaW9tbXUiLCBhaGJf aHdzLAo+ID4+ICsgIDB4N2JjLCBCSVQoMCksIDApOwo+ID4+ICsKPiA+PiArc3RhdGljIGNvbnN0 IHN0cnVjdCBjbGtfaHcgKmRyYW1fcGFyZW50c1tdID0gewo+ID4+ICsgJnBsbF9kZHJfY2xrLmNv bW1vbi5odywKPiA+PiArICZwbGxfcGVyaXBoXzJ4X2Nsay5jb21tb24uaHcsCj4gPj4gKyAmcGxs X3BlcmlwaF84MDBNX2Nsay5jb21tb24uaHcsCj4gPj4gK307Cj4gPj4gK3N0YXRpYyBTVU5YSV9D Q1VfTVBfSFdfV0lUSF9NVVhfR0FURShkcmFtX2NsaywgImRyYW0iLCBkcmFtX3BhcmVudHMsIDB4 ODAwLAo+ID4+ICsgICAgIDAsIDUsIC8qIE0gKi8KPiA+PiArICAgICA4LCAyLCAvKiBQICovCj4g Pj4gKyAgICAgMjQsIDMsIC8qIG11eCAqLwo+ID4+ICsgICAgIEJJVCgzMSksIENMS19JU19DUklU SUNBTCk7Cj4gPiAKPiA+IFRoaXMgY2xvY2sgbmVlZHMgdXBkYXRlIGZpZWxkIHRvIGJlIHNldCB0 byBhY3R1YWxseSBhcHBseSBjb25maWd1cmF0aW9uLiBTbwo+ID4gc2FtZSBjb21tZW50IGFzIG9u IEE1MjMgY2xvY2sgdmVyc2lvbiwgdGhpcyBuZWVkcyBuZXcgZmxhZyB0byBiZSBpbnRyb2R1Y2Vk Cj4gPiBmb3Igc3VjaCBjYXNlLgo+ID4gCj4gCj4gb2sKPiAKPiA+PiArCj4gPj4gK3N0YXRpYyBD TEtfRklYRURfRkFDVE9SX0hXKG1idXNfY2xrLCAibWJ1cyIsCj4gPj4gKyAgICZkcmFtX2Nsay5j b21tb24uaHcsIDQsIDEsIDApOwo+ID4+ICsKPiA+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtf aHcgKm1idXNfaHdzW10gPSB7ICZtYnVzX2Nsay5odyB9Owo+ID4+ICsKPiA+PiArc3RhdGljIFNV TlhJX0NDVV9HQVRFX0hXUyhtYnVzX2RtYV9jbGssICJtYnVzLWRtYSIsIG1idXNfaHdzLAo+ID4+ ICsgIDB4ODA0LCBCSVQoMCksIDApOwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKG1i dXNfdmVfY2xrLCAibWJ1cy12ZSIsIG1idXNfaHdzLAo+ID4+ICsgIDB4ODA0LCBCSVQoMSksIDAp Owo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKG1idXNfY2VfY2xrLCAibWJ1cy1jZSIs IG1idXNfaHdzLAo+ID4+ICsgIDB4ODA0LCBCSVQoMiksIDApOwo+ID4+ICtzdGF0aWMgU1VOWElf Q0NVX0dBVEVfSFdTKG1idXNfY3NpX2NsaywgIm1idXMtY3NpIiwgbWJ1c19od3MsCj4gPj4gKyAg MHg4MDQsIEJJVCg4KSwgMCk7Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MobWJ1c19p c3BfY2xrLCAibWJ1cy1pc3AiLCBtYnVzX2h3cywKPiA+PiArICAweDgwNCwgQklUKDkpLCAwKTsK PiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhtYnVzX2cyZF9jbGssICJtYnVzLWcyZCIs IG1idXNfaHdzLAo+ID4+ICsgIDB4ODA0LCBCSVQoMTApLCAwKTsKPiA+PiArCj4gPj4gK3N0YXRp YyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2RyYW1fY2xrLCAiYnVzLWRyYW0iLCBhaGJfaHdzLAo+ ID4+ICsgIDB4ODBjLCBCSVQoMCksIENMS19JU19DUklUSUNBTCk7Cj4gPj4gKwo+ID4+ICsKPiA+ PiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfcGFyZW50X2RhdGEgbW1jMF9tbWMxX3BhcmVudHNb XSA9IHsKPiA+PiArIHsgLmZ3X25hbWUgPSAiaG9zYyIgfSwKPiA+PiArIHsgLmh3ID0gJnBsbF9w ZXJpcGhfNDAwTV9jbGsuaHcsIH0sCj4gPj4gKyB7IC5odyA9ICZwbGxfcGVyaXBoXzMwME1fY2xr Lmh3LCB9LAo+ID4+ICt9Owo+ID4gCj4gPiBKdXN0IG1tY19wYXJlbnRzLgo+IAo+IG9rCj4gCj4g PiAKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NUF9EQVRBX1dJVEhfTVVYX0dBVEUobW1jMF9jbGss ICJtbWMwIiwgbW1jMF9tbWMxX3BhcmVudHMsIDB4ODMwLAo+ID4+ICsgICAgICAgMCwgNCwgLyog TSAqLwo+ID4+ICsgICAgICAgOCwgMiwgLyogUCAqLwo+ID4+ICsgICAgICAgMjQsIDMsIC8qIG11 eCAqLwo+ID4+ICsgICAgICAgQklUKDMxKSwgLyogZ2F0ZSAqLwo+ID4+ICsgICAgICAgMCk7Cj4g Pj4gKwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX01QX0RBVEFfV0lUSF9NVVhfR0FURShtbWMxX2Ns aywgIm1tYzEiLCBtbWMwX21tYzFfcGFyZW50cywgMHg4MzQsCj4gPj4gKyAgICAgICAwLCA0LCAv KiBNICovCj4gPj4gKyAgICAgICA4LCAyLCAvKiBQICovCj4gPj4gKyAgICAgICAyNCwgMywgLyog bXV4ICovCj4gPj4gKyAgICAgICBCSVQoMzEpLCAvKiBnYXRlICovCj4gPj4gKyAgICAgICAwKTsK PiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX3BhcmVudF9kYXRhIG1tYzJfcGFy ZW50c1tdID0gewo+ID4+ICsgeyAuZndfbmFtZSA9ICJob3NjIiB9LAo+ID4+ICsgeyAuaHcgPSAm cGxsX3BlcmlwaF82MDBNX2Nsay5odywgfSwKPiA+PiArIHsgLmh3ID0gJnBsbF9wZXJpcGhfNDAw TV9jbGsuaHcsIH0sCj4gPj4gK307Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVBfREFUQV9XSVRI X01VWF9HQVRFKG1tYzJfY2xrLCAibW1jMiIsIG1tYzJfcGFyZW50cywgMHg4MzgsCj4gPj4gKyAg ICAgICAwLCA0LCAvKiBNICovCj4gPj4gKyAgICAgICA4LCAyLCAvKiBQICovCj4gPj4gKyAgICAg ICAyNCwgMywgLyogbXV4ICovCj4gPj4gKyAgICAgICBCSVQoMzEpLCAvKiBnYXRlICovCj4gPj4g KyAgICAgICAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX21t YzBfY2xrLCAiYnVzLW1tYzAiLCBhaGJfaHdzLAo+ID4+ICsgIDB4ODRjLCBCSVQoMCksIDApOwo+ ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19tbWMxX2NsaywgImJ1cy1tbWMxIiwg YWhiX2h3cywKPiA+PiArICAweDg0YywgQklUKDEpLCAwKTsKPiA+PiArc3RhdGljIFNVTlhJX0ND VV9HQVRFX0hXUyhidXNfbW1jMl9jbGssICJidXMtbW1jMiIsIGFoYl9od3MsCj4gPj4gKyAgMHg4 NGMsIEJJVCgyKSwgMCk7Cj4gPj4gKwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1 c191YXJ0MF9jbGssICJidXMtdWFydDAiLCBhcGIxX2h3cywKPiA+PiArICAweDkwYywgQklUKDAp LCAwKTsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfdWFydDFfY2xrLCAiYnVz LXVhcnQxIiwgYXBiMV9od3MsCj4gPj4gKyAgMHg5MGMsIEJJVCgxKSwgMCk7Cj4gPj4gK3N0YXRp YyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX3VhcnQyX2NsaywgImJ1cy11YXJ0MiIsIGFwYjFfaHdz LAo+ID4+ICsgIDB4OTBjLCBCSVQoMiksIDApOwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVf SFdTKGJ1c191YXJ0M19jbGssICJidXMtdWFydDMiLCBhcGIxX2h3cywKPiA+PiArICAweDkwYywg QklUKDMpLCAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2ky YzBfY2xrLCAiYnVzLWkyYzAiLCBhcGIxX2h3cywKPiA+PiArICAweDkxYywgQklUKDApLCAwKTsK PiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfaTJjMV9jbGssICJidXMtaTJjMSIs IGFwYjFfaHdzLAo+ID4+ICsgIDB4OTFjLCBCSVQoMSksIDApOwo+ID4+ICtzdGF0aWMgU1VOWElf Q0NVX0dBVEVfSFdTKGJ1c19pMmMyX2NsaywgImJ1cy1pMmMyIiwgYXBiMV9od3MsCj4gPj4gKyAg MHg5MWMsIEJJVCgyKSwgMCk7Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2ky YzNfY2xrLCAiYnVzLWkyYzMiLCBhcGIxX2h3cywKPiA+PiArICAweDkxYywgQklUKDMpLCAwKTsK PiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfaTJjNF9jbGssICJidXMtaTJjNCIs IGFwYjFfaHdzLAo+ID4+ICsgIDB4OTFjLCBCSVQoNCksIDApOwo+ID4+ICsKPiA+PiArc3RhdGlj IGNvbnN0IHN0cnVjdCBjbGtfcGFyZW50X2RhdGEgc3BpX3BhcmVudHNbXSA9IHsKPiA+PiArIHsg LmZ3X25hbWUgPSAiaG9zYyIgfSwKPiA+PiArIHsgLmh3ID0gJnBsbF9wZXJpcGhfMzAwTV9jbGsu aHcsIH0sCj4gPj4gKyB7IC5odyA9ICZwbGxfcGVyaXBoXzIwME1fY2xrLmh3LCB9LAo+ID4+ICt9 Owo+ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NUF9EQVRBX1dJVEhfTVVYX0dBVEUoc3Bp MF9jbGssICJzcGkwIiwgc3BpX3BhcmVudHMsIDB4OTQwLAo+ID4+ICsgICAgICAgMCwgNCwgLyog TSAqLwo+ID4+ICsgICAgICAgOCwgMiwgLyogUCAqLwo+ID4+ICsgICAgICAgMjQsIDMsIC8qIG11 eCAqLwo+ID4+ICsgICAgICAgQklUKDMxKSwgLyogZ2F0ZSAqLwo+ID4+ICsgICAgICAgMCk7Cj4g Pj4gKwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX01QX0RBVEFfV0lUSF9NVVhfR0FURShzcGkxX2Ns aywgInNwaTEiLCBzcGlfcGFyZW50cywgMHg5NDQsCj4gPj4gKyAgICAgICAwLCA0LCAvKiBNICov Cj4gPj4gKyAgICAgICA4LCAyLCAvKiBQICovCj4gPj4gKyAgICAgICAyNCwgMywgLyogbXV4ICov Cj4gPj4gKyAgICAgICBCSVQoMzEpLCAvKiBnYXRlICovCj4gPj4gKyAgICAgICAwKTsKPiA+PiAr Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVBfREFUQV9XSVRIX01VWF9HQVRFKHNwaTJfY2xrLCAi c3BpMiIsIHNwaV9wYXJlbnRzLCAweDk0OCwKPiA+PiArICAgICAgIDAsIDQsIC8qIE0gKi8KPiA+ PiArICAgICAgIDgsIDIsIC8qIFAgKi8KPiA+PiArICAgICAgIDI0LCAzLCAvKiBtdXggKi8KPiA+ PiArICAgICAgIEJJVCgzMSksIC8qIGdhdGUgKi8KPiA+PiArICAgICAgIDApOwo+ID4+ICsKPiA+ PiArc3RhdGljIFNVTlhJX0NDVV9NUF9EQVRBX1dJVEhfTVVYX0dBVEUoc3BpM19jbGssICJzcGkz Iiwgc3BpX3BhcmVudHMsIDB4OTRjLAo+ID4+ICsgICAgICAgMCwgNCwgLyogTSAqLwo+ID4+ICsg ICAgICAgOCwgMiwgLyogUCAqLwo+ID4+ICsgICAgICAgMjQsIDMsIC8qIG11eCAqLwo+ID4+ICsg ICAgICAgQklUKDMxKSwgLyogZ2F0ZSAqLwo+ID4+ICsgICAgICAgMCk7Cj4gPj4gKwo+ID4+ICtz dGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19zcGkwX2NsaywgImJ1cy1zcGkwIiwgYWhiX2h3 cywKPiA+PiArICAweDk2YywgQklUKDApLCAwKTsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRF X0hXUyhidXNfc3BpMV9jbGssICJidXMtc3BpMSIsIGFoYl9od3MsCj4gPj4gKyAgMHg5NmMsIEJJ VCgxKSwgMCk7Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX3NwaTJfY2xrLCAi YnVzLXNwaTIiLCBhaGJfaHdzLAo+ID4+ICsgIDB4OTZjLCBCSVQoMiksIDApOwo+ID4+ICtzdGF0 aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19zcGkzX2NsaywgImJ1cy1zcGkzIiwgYWhiX2h3cywK PiA+PiArICAweDk2YywgQklUKDMpLCAwKTsKPiA+PiArCj4gPj4gKwo+ID4+ICtzdGF0aWMgY29u c3Qgc3RydWN0IGNsa19wYXJlbnRfZGF0YSBzcGlmX3BhcmVudHNbXSA9IHsKPiA+PiArIHsgLmZ3 X25hbWUgPSAiaG9zYyIgfSwKPiA+PiArIHsgLmh3ID0gJnBsbF9wZXJpcGhfNDAwTV9jbGsuaHcs IH0sCj4gPj4gKyB7IC5odyA9ICZwbGxfcGVyaXBoXzMwME1fY2xrLmh3LCB9LAo+ID4+ICt9Owo+ ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NX0RBVEFfV0lUSF9NVVhfR0FURShzcGlmX2Ns aywgInNwaWYiLCBzcGlmX3BhcmVudHMsIDB4MDk1MCwKPiA+PiArICAgICAgMCwgNCwgLyogTSAq Lwo+ID4+ICsgICAgICAyNCwgMywgLyogbXV4ICovCj4gPj4gKyAgICAgIEJJVCgzMSksIC8qIGdh dGUgKi8KPiA+PiArICAgICAgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7Cj4gPiAKPiA+IFRoaXMgaXMg TVAgY2xvY2ssIFAgYmVpbmcgYXQgOTo4Lgo+IAo+IHllcywgdGhlIEJTUCBkcml2ZXIgWzFdIG1v ZGVsIGl0IHdpdGggb25seSBNLCBJ4oCZbGwgdXBkYXRlIGl0IHRvIE1QLgo+IAo+ID4gCj4gPj4g Kwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19zcGlmX2NsaywgImJ1cy1zcGlm IiwgYWhiX2h3cywKPiA+PiArICAweDA5NmMsIEJJVCg0KSwgMCk7Cj4gPj4gKwo+ID4+ICsKPiA+ PiArc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfaHcgKnBsbF9wZXJpcGhfMTUwTV9od3NbXSA9IHsg JnBsbF9wZXJpcGhfMTUwTV9jbGsuaHcgfTsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hX U19XSVRIX1BSRURJVihlbWFjXzI1TV9jbGssICJlbWFjLTI1TSIsIHBsbF9wZXJpcGhfMTUwTV9o d3MsCj4gPj4gKyAgICAgIDB4OTcwLCBCSVQoMzEpIHwgQklUKDMwKSwgNiwgMCk7Cj4gPj4gKwo+ ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19lbWFjX2NsaywgImJ1cy1lbWFjIiwg YWhiX2h3cywKPiA+PiArICAweDk3YywgQklUKDApLCAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBT VU5YSV9DQ1VfR0FURV9IV1MoYnVzX2dwYWRjX2NsaywgImJ1cy1ncGFkYyIsIGFwYjBfaHdzLAo+ ID4+ICsgIDB4OWVjLCBCSVQoMCksIDApOwo+ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9H QVRFX0hXUyhidXNfdGhzX2NsaywgImJ1cy10aHMiLCBhaGJfaHdzLAo+ID4+ICsgIDB4OWZjLCBC SVQoMCksIDApOwo+ID4+ICsKPiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2h3 ICphdWRpb19wYXJlbnRzW10gPSB7Cj4gPj4gKyAmcGxsX2F1ZGlvXzF4X2Nsay5jb21tb24uaHcs Cj4gPj4gKyAmcGxsX2F1ZGlvXzR4X2Nsay5jb21tb24uaHcsCj4gPj4gK307Cj4gPj4gKwo+ID4+ ICtzdGF0aWMgU1VOWElfQ0NVX01fSFdfV0lUSF9NVVhfR0FURShpMnMwX2NsaywgImkyczAiLCBh dWRpb19wYXJlbnRzLCAweGExMCwKPiA+PiArICAgIDAsIDQsIC8qIE0gKi8KPiA+PiArICAgIDI0 LCAxLCAvKiBtdXggKi8KPiA+PiArICAgIEJJVCgzMSksIC8qIGdhdGUgKi8KPiA+PiArICAgIENM S19TRVRfUkFURV9QQVJFTlQpOwo+ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NX0hXX1dJ VEhfTVVYX0dBVEUoaTJzMV9jbGssICJpMnMxIiwgYXVkaW9fcGFyZW50cywgMHhhMTQsCj4gPj4g KyAgICAwLCA0LCAvKiBNICovCj4gPj4gKyAgICAyNCwgMSwgLyogbXV4ICovCj4gPj4gKyAgICBC SVQoMzEpLCAvKiBnYXRlICovCj4gPj4gKyAgICBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKPiA+PiAr Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2kyczBfY2xrLCAiYnVzLWkyczAi LCBhaGJfaHdzLAo+ID4+ICsgIDB4YTIwLCBCSVQoMCksIDApOwo+ID4+ICsKPiA+PiArc3RhdGlj IFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfaTJzMV9jbGssICJidXMtaTJzMSIsIGFoYl9od3MsCj4g Pj4gKyAgMHhhMjAsIEJJVCgxKSwgMCk7Cj4gPj4gKwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX01f SFdfV0lUSF9NVVhfR0FURShkbWljX2NsaywgImRtaWMiLCBhdWRpb19wYXJlbnRzLCAweGE0MCwK PiA+PiArICAgIDAsIDQsIC8qIE0gKi8KPiA+PiArICAgIDI0LCAxLCAvKiBtdXggKi8KPiA+PiAr ICAgIEJJVCgzMSksIC8qIGdhdGUgKi8KPiA+PiArICAgIENMS19TRVRfUkFURV9QQVJFTlQpOwo+ ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfZG1pY19jbGssICJidXMt ZG1pYyIsIGFoYl9od3MsCj4gPj4gKyAgMHhhNGMsIEJJVCgwKSwgMCk7Cj4gPj4gKwo+ID4+ICtz dGF0aWMgU1VOWElfQ0NVX01fSFdfV0lUSF9NVVhfR0FURShhdWRpb19jb2RlY19kYWNfY2xrLCAi YXVkaW8tY29kZWMtZGFjIiwgCj4gPj4gKyAgICBhdWRpb19wYXJlbnRzLCAweGE1MCwKPiA+PiAr ICAgIDAsIDQsIC8qIE0gKi8KPiA+PiArICAgIDI0LCAxLCAvKiBtdXggKi8KPiA+PiArICAgIEJJ VCgzMSksIC8qIGdhdGUgKi8KPiA+PiArICAgIENMS19TRVRfUkFURV9QQVJFTlQpOwo+ID4+ICsK PiA+PiArc3RhdGljIFNVTlhJX0NDVV9NX0hXX1dJVEhfTVVYX0dBVEUoYXVkaW9fY29kZWNfYWRj X2NsaywgImF1ZGlvLWNvZGVjLWFkYyIsIAo+ID4+ICsgICAgYXVkaW9fcGFyZW50cywgMHhhNTQs Cj4gPj4gKyAgICAwLCA0LCAvKiBNICovCj4gPj4gKyAgICAyNCwgMSwgLyogbXV4ICovCj4gPj4g KyAgICBCSVQoMzEpLCAvKiBnYXRlICovCj4gPj4gKyAgICBDTEtfU0VUX1JBVEVfUEFSRU5UKTsK PiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2F1ZGlvX2NvZGVjX2Ns aywgImJ1cy1hdWRpby1jb2RlYyIsIGFwYjBfaHdzLAo+ID4+ICsgIDB4YTVjLCBCSVQoMCksIDAp Owo+ID4+ICsKPiA+PiArLyoKPiA+PiArICogVGhlcmUgYXJlIE9IQ0kgMTJNIGNsb2NrIHNvdXJj ZSBzZWxlY3Rpb24gYml0cyBmb3IgdGhlIFVTQiAyLjAgcG9ydC4KPiA+PiArICogV2Ugd2lsbCBm b3JjZSB0aGVtIHRvIDAgKDEyTSBkaXZpZGVkIGZyb20gNDhNKS4KPiA+PiArICovCj4gPj4gK3N0 YXRpYyBDTEtfRklYRURfRkFDVE9SX0ZXX05BTUUob3NjMTJNX2NsaywgIm9zYzEyTSIsICJob3Nj IiwgMiwgMSwgMCk7Cj4gPj4gKwo+ID4+ICsjZGVmaW5lIFNVTjhJX1Y4NTNfVVNCX0NMS19SRUcg MHhhNzAKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURSh1c2Jfb2hjaV9jbGssICJ1 c2IiLCAib3NjMTJNIiwgMHgwYTcwLCBCSVQoMzEpLCAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBT VU5YSV9DQ1VfR0FURV9IV1MoYnVzX29oY2lfY2xrLCAiYnVzLW9oY2kiLCBhaGJfaHdzLCAweGE4 YywgQklUKDApLCAwKTsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfZWhjaV9j bGssICJidXMtZWhjaSIsIGFoYl9od3MsIDB4YThjLCBCSVQoNCksIDApOwo+ID4+ICtzdGF0aWMg U1VOWElfQ0NVX0dBVEVfSFdTKGJ1c19vdGdfY2xrLCAiYnVzLW90ZyIsIGFoYl9od3MsIDB4YThj LCBCSVQoOCksIDApOwo+ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNf ZHBzc190b3BfY2xrLCAiYnVzLWRwc3MtdG9wIiwgYWhiX2h3cywKPiA+PiArICAweGFiYywgQklU KDApLCAwKTsKPiA+PiArCj4gPj4gKwo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19wYXJl bnRfZGF0YSBtaXBpX2RzaV9wYXJlbnRzW10gPSB7Cj4gPj4gKyB7IC5md19uYW1lID0gImhvc2Mi IH0sCj4gPj4gKyB7IC5odyA9ICZwbGxfcGVyaXBoXzIwME1fY2xrLmh3IH0sCj4gPj4gKyB7IC5o dyA9ICZwbGxfcGVyaXBoXzE1ME1fY2xrLmh3IH0sCj4gPj4gK307Cj4gPj4gK3N0YXRpYyBTVU5Y SV9DQ1VfTV9EQVRBX1dJVEhfTVVYX0dBVEUobWlwaV9kc2lfY2xrLCAibWlwaS1kc2kiLCBtaXBp X2RzaV9wYXJlbnRzLCAKPiA+PiArICAgICAgMHhiMjQsCj4gPj4gKyAgICAgIDAsIDQsIC8qIE0g Ki8KPiA+PiArICAgICAgMjQsIDMsIC8qIG11eCAqLwo+ID4+ICsgICAgICBCSVQoMzEpLCAvKiBn YXRlICovCj4gPj4gKyAgICAgIENMS19TRVRfUkFURV9QQVJFTlQpOwo+ID4gCj4gPiBDTEtfU0VU X1JBVEVfUEFSRU5UIGRvZXNuJ3QgZG8gYW55dGhpbmcgZm9yIGNvbnN0YW50IGNsb2Nrcy4KPiA+ IAo+IAo+IG9rCj4gCj4gPiBCZXN0IHJlZ2FyZHMsCj4gPiBKZXJuZWoKPiA+IAo+ID4+ICsKPiA+ PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhidXNfbWlwaV9kc2lfY2xrLCAiYnVzLW1pcGkt ZHNpIiwgYWhiX2h3cywKPiA+PiArICAweGI0YywgQklUKDApLCAwKTsKPiA+PiArCj4gPj4gKwo+ ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19odyAqdGNvbl9sY2RfcGFyZW50c1tdID0gewo+ ID4+ICsgJnBsbF92aWRlb180eF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgJnBsbF9wZXJpcGhfMnhf Y2xrLmNvbW1vbi5odywKPiA+PiArICZwbGxfY3NpXzR4X2Nsay5jb21tb24uaHcsCj4gPj4gK307 Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVBfSFdfV0lUSF9NVVhfR0FURSh0Y29uX2xjZF9jbGss ICJ0Y29uLWxjZCIsIHRjb25fbGNkX3BhcmVudHMsIAo+ID4+ICsgICAgIDB4YjYwLAo+ID4+ICsg ICAgIDAsIDQsIC8qIE0gKi8KPiA+PiArICAgICA4LCAyLCAvKiBQICovCj4gPj4gKyAgICAgMjQs IDMsIC8qIG11eCAqLwo+ID4+ICsgICAgIEJJVCgzMSksIC8qIGdhdGUgKi8KPiA+PiArICAgICBD TEtfU0VUX1JBVEVfUEFSRU5UKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9I V1MoYnVzX3Rjb25fbGNkX2NsaywgImJ1cy10Y29uLWxjZCIsIGFoYl9od3MsCj4gPj4gKyAgMHhi N2MsIEJJVCgwKSwgMCk7Cj4gPj4gKwo+ID4+ICsKPiA+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBj bGtfaHcgKmNzaV90b3BfcGFyZW50c1tdID0gewo+ID4+ICsgJnBsbF9wZXJpcGhfMzAwTV9jbGsu aHcsCj4gPj4gKyAmcGxsX3BlcmlwaF80MDBNX2Nsay5odywKPiA+PiArICZwbGxfdmlkZW9fNHhf Y2xrLmNvbW1vbi5odywKPiA+PiArICZwbGxfY3NpXzR4X2Nsay5jb21tb24uaHcsCj4gPj4gK307 Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9IV19XSVRIX01VWF9HQVRFKGNzaV90b3BfY2xrLCAi Y3NpLXRvcCIsIGNzaV90b3BfcGFyZW50cywgMHhjMDQsCj4gPj4gKyAgICAwLCA1LCAvKiBNICov Cj4gPj4gKyAgICAyNCwgMywgLyogbXV4ICovCj4gPj4gKyAgICBCSVQoMzEpLCAvKiBnYXRlICov Cj4gPj4gKyAgICAwKTsKPiA+PiArCj4gPj4gKwo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNs a19wYXJlbnRfZGF0YSBjc2lfbWNsa19wYXJlbnRzW10gPSB7Cj4gPj4gKyB7IC5md19uYW1lID0g Imhvc2MiIH0sCj4gPj4gKyB7IC5odyA9ICZwbGxfY3NpXzR4X2Nsay5jb21tb24uaHcgfSwKPiA+ PiArIHsgLmh3ID0gJnBsbF92aWRlb180eF9jbGsuY29tbW9uLmh3IH0sCj4gPj4gKyB7IC5odyA9 ICZwbGxfcGVyaXBoXzJ4X2Nsay5jb21tb24uaHcgfSwKPiA+PiArfTsKPiA+PiArc3RhdGljIFNV TlhJX0NDVV9NX0RBVEFfV0lUSF9NVVhfR0FURShjc2lfbWNsazBfY2xrLCAiY3NpLW1jbGswIiwg Y3NpX21jbGtfcGFyZW50cywgCj4gPj4gKyAgICAgIDB4YzA4LAo+ID4+ICsgICAgICAwLCA1LCAv KiBNICovCj4gPj4gKyAgICAgIDI0LCAzLCAvKiBtdXggKi8KPiA+PiArICAgICAgQklUKDMxKSwg LyogZ2F0ZSAqLwo+ID4+ICsgICAgICAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1Vf TV9EQVRBX1dJVEhfTVVYX0dBVEUoY3NpX21jbGsxX2NsaywgImNzaS1tY2xrMSIsIGNzaV9tY2xr X3BhcmVudHMsIAo+ID4+ICsgICAgICAweGMwYywKPiA+PiArICAgICAgMCwgNSwgLyogTSAqLwo+ ID4+ICsgICAgICAyNCwgMywgLyogbXV4ICovCj4gPj4gKyAgICAgIEJJVCgzMSksIC8qIGdhdGUg Ki8KPiA+PiArICAgICAgMCk7Cj4gPj4gKwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX01fREFUQV9X SVRIX01VWF9HQVRFKGNzaV9tY2xrMl9jbGssICJjc2ktbWNsazIiLCBjc2lfbWNsa19wYXJlbnRz LCAKPiA+PiArICAgICAgMHhjMTAsCj4gPj4gKyAgICAgIDAsIDUsIC8qIE0gKi8KPiA+PiArICAg ICAgMjQsIDMsIC8qIG11eCAqLwo+ID4+ICsgICAgICBCSVQoMzEpLCAvKiBnYXRlICovCj4gPj4g KyAgICAgIDApOwo+ID4gCj4gPiBBbGwgQ1NJIG1jbGtzIHNob3VsZCBiZSBNUCB0eXBlLgo+ID4g Cj4gCj4gQWdhaW4sIHRoZXNlIGFyZSBmcm9tIHRoZSBCU1AsIEnigJlsbCB1cGRhdGUgdGhlbS4K PiAKPiA+PiArCj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1MoYnVzX2NzaV9jbGssICJi dXMtY3NpIiwgYWhiX2h3cywKPiA+PiArICAweGMyYywgQklUKDApLCAwKTsKPiA+PiArCj4gPj4g Kwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEVfSFdTKGJ1c193aWVnYW5kX2NsaywgImJ1cy13 aWVnYW5kIiwgYWhiX2h3cywKPiA+PiArICAweGM3YywgQklUKDApLCAwKTsKPiA+PiArCj4gPj4g Kwo+ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19wYXJlbnRfZGF0YSByaXNjdl9wYXJlbnRz W10gPSB7Cj4gPj4gKyB7IC5md19uYW1lID0gImhvc2MiIH0sCj4gPj4gKyB7IC5md19uYW1lID0g Imxvc2MiIH0sCj4gPj4gKyB7IC5md19uYW1lID0gImlvc2MiIH0sCj4gPj4gKyB7IC5odyA9ICZw bGxfcGVyaXBoXzYwME1fY2xrLmh3IH0sCj4gPj4gKyB7IC5odyA9ICZwbGxfcGVyaXBoXzQ4ME1f Y2xrLmNvbW1vbi5odyB9LAo+ID4+ICsgeyAuaHcgPSAmcGxsX2NwdV9jbGsuY29tbW9uLmh3IH0s Cj4gPj4gK307Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfTV9EQVRBX1dJVEhfTVVYKHJpc2N2X2Ns aywgInJpc2N2LWNwdSIsIHJpc2N2X3BhcmVudHMsIDB4ZDAwLAo+ID4+ICsgMCwgNSwgLyogTSAq Lwo+ID4+ICsgMjQsIDMsIC8qIG11eCAqLwo+ID4+ICsgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7Cj4g Pj4gKwo+ID4+ICsvKiBUaGUgcmlzY3YtYXhpIGNsayBtdXN0IGJlIGRpdmlkZWQgYnkgYXQgbGVh c3QgMi4gKi8KPiA+PiArc3RhdGljIHN0cnVjdCBjbGtfZGl2X3RhYmxlIHJpc2N2X2F4aV90YWJs ZVtdID0gewo+ID4+ICsgeyAudmFsID0gMSwgLmRpdiA9IDIgfSwKPiA+PiArIHsgLnZhbCA9IDIs IC5kaXYgPSAzIH0sCj4gPj4gKyB7IC52YWwgPSAzLCAuZGl2ID0gNCB9LAo+ID4+ICsgeyAvKiBT ZW50aW5lbCAqLyB9Cj4gPj4gK307Cj4gPj4gK3N0YXRpYyBTVU5YSV9DQ1VfRElWX1RBQkxFX0hX KHJpc2N2X2F4aV9jbGssICJyaXNjdi1heGkiLCAmcmlzY3ZfY2xrLmNvbW1vbi5odywKPiA+PiAr ICAgICAgMHhkMDAsIDgsIDIsIHJpc2N2X2F4aV90YWJsZSwgMCk7Cj4gPj4gKwo+ID4+ICtzdGF0 aWMgU1VOWElfQ0NVX0dBVEVfSFdTX1dJVEhfS0VZKHJpc2N2X2NvcmVfZ2F0ZSwgInJpc2N2LWNv cmUtZ2F0ZSIsIGFoYl9od3MsCj4gPj4gKyAgIDB4ZDA0LCBCSVQoMCksIDApOwo+ID4+ICsKPiA+ PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFX0hXUyhyaXNjdl9jZmdfZ2F0ZSwgInJpc2N2LWNmZy1n YXRlIiwgYWhiX2h3cywKPiA+PiArICAweGQwYywgQklUKDApLCAwKTsKPiA+PiArCj4gPj4gKwo+ ID4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19odyAqcGxsX3BlcmlwaF8xNjBNX2h3c1tdID0g ewo+ID4+ICsgJnBsbF9wZXJpcGhfMTYwTV9jbGsuaHcsCj4gPj4gK307Cj4gPj4gKwo+ID4+ICtz dGF0aWMgU1VOWElfQ0NVX0dBVEVfREFUQShmYW5vdXRfMjRNX2NsaywgImZhbm91dC0yNE0iLCBv c2MyNE0sCj4gPj4gKyAgIDB4ZjMwLCBCSVQoMCksIDApOwo+ID4+ICtzdGF0aWMgU1VOWElfQ0NV X0dBVEVfREFUQV9XSVRIX1BSRURJVihmYW5vdXRfMTJNX2NsaywgImZhbm91dC0xMk0iLCBvc2My NE0sCj4gPj4gKyAgICAgICAweGYzMCwgQklUKDEpLCAyLCAwKTsKPiA+PiArc3RhdGljIFNVTlhJ X0NDVV9HQVRFX0hXU19XSVRIX1BSRURJVihmYW5vdXRfMTZNX2NsaywgImZhbm91dC0xNk0iLCBw bGxfcGVyaXBoXzE2ME1faHdzLAo+ID4+ICsgICAgICAweGYzMCwgQklUKDIpLCAxMCwgMCk7Cj4g Pj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURV9IV1NfV0lUSF9QUkVESVYoZmFub3V0XzI1TV9jbGss ICJmYW5vdXQtMjVNIiwgcGxsX3BlcmlwaF8xNTBNX2h3cywKPiA+PiArICAgICAgMHhmMzAsIEJJ VCgzKSwgNiwgMCk7Cj4gPj4gKwo+ID4+ICsKPiA+PiArLyogVGhpcyBjbG9jayBoYXMgYSBzZWNv bmQgZGl2aWRlciB0aGF0IGlzIG5vdCBtb2RlbGxlZCBhbmQgZm9yY2VkIHRvIDAuICovCj4gPj4g KyNkZWZpbmUgU1VOOElfVjg1M19GQU5PVVRfMjdNX1JFRyAweGYzNAo+ID4+ICtzdGF0aWMgY29u c3Qgc3RydWN0IGNsa19odyAqZmFub3V0XzI3TV9wYXJlbnRzW10gPSB7Cj4gPj4gKyAmcGxsX3Zp ZGVvXzF4X2Nsay5odywKPiA+PiArICZwbGxfY3NpX2Nsay5odywKPiA+PiArICZwbGxfcGVyaXBo XzMwME1fY2xrLmh3LAo+ID4+ICt9Owo+ID4+ICtzdGF0aWMgU1VOWElfQ0NVX01fSFdfV0lUSF9N VVhfR0FURShmYW5vdXRfMjdNX2NsaywgImZhbm91dC0yN00iLCAKPiA+PiArICAgIGZhbm91dF8y N01fcGFyZW50cywgMHhmMzQsCj4gPj4gKyAgICAwLCA1LCAvKiBNICovCj4gPj4gKyAgICAyNCwg MiwgLyogbXV4ICovCj4gPj4gKyAgICBCSVQoMzEpLCAvKiBnYXRlICovCj4gPj4gKyAgICAwKTsK PiA+PiArc3RhdGljIFNVTlhJX0NDVV9NX0hXU19XSVRIX0dBVEUoZmFub3V0X3BjbGtfY2xrLCAi ZmFub3V0LXBjbGsiLCBhcGIwX2h3cywgMHhmMzgsCj4gPj4gKyAwLCA1LCAvKiBNICovCj4gPj4g KyBCSVQoMzEpLCAvKiBnYXRlICovCj4gPj4gKyAwKTsKPiA+PiArCj4gPj4gK3N0YXRpYyBjb25z dCBzdHJ1Y3QgY2xrX3BhcmVudF9kYXRhIGZhbm91dF9wYXJlbnRzW10gPSB7Cj4gPj4gKyB7IC5m d19uYW1lID0gImxvc2MiIH0sCj4gPj4gKyB7IC5odyA9ICZmYW5vdXRfMTJNX2Nsay5jb21tb24u aHcgfSwKPiA+PiArIHsgLmh3ID0gJmZhbm91dF8xNk1fY2xrLmNvbW1vbi5odyB9LAo+ID4+ICsg eyAuaHcgPSAmZmFub3V0XzI0TV9jbGsuY29tbW9uLmh3IH0sCj4gPj4gKyB7IC5odyA9ICZmYW5v dXRfMjVNX2Nsay5jb21tb24uaHcgfSwKPiA+PiArIHsgLmh3ID0gJmZhbm91dF8yN01fY2xrLmNv bW1vbi5odyB9LAo+ID4+ICsgeyAuaHcgPSAmZmFub3V0X3BjbGtfY2xrLmNvbW1vbi5odyB9LAo+ ID4+ICt9Owo+ID4+ICsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NVVhfREFUQV9XSVRIX0dBVEUo ZmFub3V0MF9jbGssICJmYW5vdXQwIiwgZmFub3V0X3BhcmVudHMsIDB4ZjNjLAo+ID4+ICsgICAg MCwgMywgLyogbXV4ICovCj4gPj4gKyAgICBCSVQoMjEpLCAvKiBnYXRlICovCj4gPj4gKyAgICAw KTsKPiA+PiArc3RhdGljIFNVTlhJX0NDVV9NVVhfREFUQV9XSVRIX0dBVEUoZmFub3V0MV9jbGss ICJmYW5vdXQxIiwgZmFub3V0X3BhcmVudHMsIDB4ZjNjLAo+ID4+ICsgICAgMywgMywgLyogbXV4 ICovCj4gPj4gKyAgICBCSVQoMjIpLCAvKiBnYXRlICovCj4gPj4gKyAgICAwKTsKPiA+PiArc3Rh dGljIFNVTlhJX0NDVV9NVVhfREFUQV9XSVRIX0dBVEUoZmFub3V0Ml9jbGssICJmYW5vdXQyIiwg ZmFub3V0X3BhcmVudHMsIDB4ZjNjLAo+ID4+ICsgICAgNiwgMywgLyogbXV4ICovCj4gPj4gKyAg ICBCSVQoMjMpLCAvKiBnYXRlICovCj4gPj4gKyAgICAwKTsKPiA+PiArCj4gPj4gKwo+ID4+ICtz dGF0aWMgc3RydWN0IGNjdV9jb21tb24gKnN1bjhpX3Y4NTNfY2N1X2Nsa3NbXSA9IHsKPiA+PiAr ICZwbGxfY3B1X2Nsay5jb21tb24sCj4gPj4gKyAmcGxsX2Rkcl9jbGsuY29tbW9uLAo+ID4+ICsg JnBsbF9wZXJpcGhfNHhfY2xrLmNvbW1vbiwKPiA+PiArICZwbGxfcGVyaXBoXzJ4X2Nsay5jb21t b24sCj4gPj4gKyAmcGxsX3BlcmlwaF84MDBNX2Nsay5jb21tb24sCj4gPj4gKyAmcGxsX3Blcmlw aF80ODBNX2Nsay5jb21tb24sCj4gPj4gKyAmcGxsX3ZpZGVvXzR4X2Nsay5jb21tb24sCj4gPj4g KyAmcGxsX2NzaV80eF9jbGsuY29tbW9uLAo+ID4+ICsgJnBsbF9hdWRpb19kaXYyX2Nsay5jb21t b24sCj4gPj4gKyAmcGxsX2F1ZGlvX2RpdjVfY2xrLmNvbW1vbiwKPiA+PiArICZwbGxfYXVkaW9f NHhfY2xrLmNvbW1vbiwKPiA+PiArICZwbGxfYXVkaW9fMXhfY2xrLmNvbW1vbiwKPiA+PiArICZw bGxfbnB1XzR4X2Nsay5jb21tb24sCj4gPj4gKyAmY3B1X2Nsay5jb21tb24sCj4gPj4gKyAmY3B1 X2F4aV9jbGsuY29tbW9uLAo+ID4+ICsgJmNwdV9hcGJfY2xrLmNvbW1vbiwKPiA+PiArICZhaGJf Y2xrLmNvbW1vbiwKPiA+PiArICZhcGIwX2Nsay5jb21tb24sCj4gPj4gKyAmYXBiMV9jbGsuY29t bW9uLAo+ID4+ICsgJmRlX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX2RlX2Nsay5jb21tb24sCj4g Pj4gKyAmZzJkX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX2cyZF9jbGsuY29tbW9uLAo+ID4+ICsg JmNlX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX2NlX2Nsay5jb21tb24sCj4gPj4gKyAmdmVfY2xr LmNvbW1vbiwKPiA+PiArICZidXNfdmVfY2xrLmNvbW1vbiwKPiA+PiArICZucHVfY2xrLmNvbW1v biwKPiA+PiArICZidXNfbnB1X2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX2RtYV9jbGsuY29tbW9u LAo+ID4+ICsgJmJ1c19tc2dib3gwX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX21zZ2JveDFfY2xr LmNvbW1vbiwKPiA+PiArICZidXNfc3BpbmxvY2tfY2xrLmNvbW1vbiwKPiA+PiArICZidXNfaHN0 aW1lcl9jbGsuY29tbW9uLAo+ID4+ICsgJmF2c19jbGsuY29tbW9uLAo+ID4+ICsgJmJ1c19kYmdf Y2xrLmNvbW1vbiwKPiA+PiArICZidXNfcHdtX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX2lvbW11 X2Nsay5jb21tb24sCj4gPj4gKyAmZHJhbV9jbGsuY29tbW9uLAo+ID4+ICsgJm1idXNfZG1hX2Ns ay5jb21tb24sCj4gPj4gKyAmbWJ1c192ZV9jbGsuY29tbW9uLAo+ID4+ICsgJm1idXNfY2VfY2xr LmNvbW1vbiwKPiA+PiArICZtYnVzX2NzaV9jbGsuY29tbW9uLAo+ID4+ICsgJm1idXNfaXNwX2Ns ay5jb21tb24sCj4gPj4gKyAmbWJ1c19nMmRfY2xrLmNvbW1vbiwKPiA+PiArICZidXNfZHJhbV9j bGsuY29tbW9uLAo+ID4+ICsgJm1tYzBfY2xrLmNvbW1vbiwKPiA+PiArICZtbWMxX2Nsay5jb21t b24sCj4gPj4gKyAmbW1jMl9jbGsuY29tbW9uLAo+ID4+ICsgJmJ1c19tbWMwX2Nsay5jb21tb24s Cj4gPj4gKyAmYnVzX21tYzFfY2xrLmNvbW1vbiwKPiA+PiArICZidXNfbW1jMl9jbGsuY29tbW9u LAo+ID4+ICsgJmJ1c191YXJ0MF9jbGsuY29tbW9uLAo+ID4+ICsgJmJ1c191YXJ0MV9jbGsuY29t bW9uLAo+ID4+ICsgJmJ1c191YXJ0Ml9jbGsuY29tbW9uLAo+ID4+ICsgJmJ1c191YXJ0M19jbGsu Y29tbW9uLAo+ID4+ICsgJmJ1c19pMmMwX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX2kyYzFfY2xr LmNvbW1vbiwKPiA+PiArICZidXNfaTJjMl9jbGsuY29tbW9uLAo+ID4+ICsgJmJ1c19pMmMzX2Ns ay5jb21tb24sCj4gPj4gKyAmYnVzX2kyYzRfY2xrLmNvbW1vbiwKPiA+PiArICZzcGkwX2Nsay5j b21tb24sCj4gPj4gKyAmc3BpMV9jbGsuY29tbW9uLAo+ID4+ICsgJnNwaTJfY2xrLmNvbW1vbiwK PiA+PiArICZzcGkzX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX3NwaTBfY2xrLmNvbW1vbiwKPiA+ PiArICZidXNfc3BpMV9jbGsuY29tbW9uLAo+ID4+ICsgJmJ1c19zcGkyX2Nsay5jb21tb24sCj4g Pj4gKyAmYnVzX3NwaTNfY2xrLmNvbW1vbiwKPiA+PiArICZzcGlmX2Nsay5jb21tb24sCj4gPj4g KyAmYnVzX3NwaWZfY2xrLmNvbW1vbiwKPiA+PiArICZlbWFjXzI1TV9jbGsuY29tbW9uLAo+ID4+ ICsgJmJ1c19lbWFjX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX2dwYWRjX2Nsay5jb21tb24sCj4g Pj4gKyAmYnVzX3Roc19jbGsuY29tbW9uLAo+ID4+ICsgJnVzYl9vaGNpX2Nsay5jb21tb24sCj4g Pj4gKyAmYnVzX29oY2lfY2xrLmNvbW1vbiwKPiA+PiArICZidXNfZWhjaV9jbGsuY29tbW9uLAo+ ID4+ICsgJmJ1c19vdGdfY2xrLmNvbW1vbiwKPiA+PiArICZpMnMwX2Nsay5jb21tb24sCj4gPj4g KyAmaTJzMV9jbGsuY29tbW9uLAo+ID4+ICsgJmJ1c19pMnMwX2Nsay5jb21tb24sCj4gPj4gKyAm YnVzX2kyczFfY2xrLmNvbW1vbiwKPiA+PiArICZkbWljX2Nsay5jb21tb24sCj4gPj4gKyAmYnVz X2RtaWNfY2xrLmNvbW1vbiwKPiA+PiArICZhdWRpb19jb2RlY19kYWNfY2xrLmNvbW1vbiwKPiA+ PiArICZhdWRpb19jb2RlY19hZGNfY2xrLmNvbW1vbiwKPiA+PiArICZidXNfYXVkaW9fY29kZWNf Y2xrLmNvbW1vbiwKPiA+PiArICZidXNfZHBzc190b3BfY2xrLmNvbW1vbiwKPiA+PiArICZtaXBp X2RzaV9jbGsuY29tbW9uLAo+ID4+ICsgJmJ1c19taXBpX2RzaV9jbGsuY29tbW9uLAo+ID4+ICsg JnRjb25fbGNkX2Nsay5jb21tb24sCj4gPj4gKyAmYnVzX3Rjb25fbGNkX2Nsay5jb21tb24sCj4g Pj4gKyAmY3NpX3RvcF9jbGsuY29tbW9uLAo+ID4+ICsgJmNzaV9tY2xrMF9jbGsuY29tbW9uLAo+ ID4+ICsgJmNzaV9tY2xrMV9jbGsuY29tbW9uLAo+ID4+ICsgJmNzaV9tY2xrMl9jbGsuY29tbW9u LAo+ID4+ICsgJmJ1c19jc2lfY2xrLmNvbW1vbiwKPiA+PiArICZidXNfd2llZ2FuZF9jbGsuY29t bW9uLAo+ID4+ICsgJnJpc2N2X2Nsay5jb21tb24sCj4gPj4gKyAmcmlzY3ZfYXhpX2Nsay5jb21t b24sCj4gPj4gKyAmcmlzY3ZfY29yZV9nYXRlLmNvbW1vbiwKPiA+PiArICZyaXNjdl9jZmdfZ2F0 ZS5jb21tb24sCj4gPj4gKyAmZmFub3V0XzI0TV9jbGsuY29tbW9uLAo+ID4+ICsgJmZhbm91dF8x Mk1fY2xrLmNvbW1vbiwKPiA+PiArICZmYW5vdXRfMTZNX2Nsay5jb21tb24sCj4gPj4gKyAmZmFu b3V0XzI1TV9jbGsuY29tbW9uLAo+ID4+ICsgJmZhbm91dF8yN01fY2xrLmNvbW1vbiwKPiA+PiAr ICZmYW5vdXRfcGNsa19jbGsuY29tbW9uLAo+ID4+ICsgJmZhbm91dDBfY2xrLmNvbW1vbiwKPiA+ PiArICZmYW5vdXQxX2Nsay5jb21tb24sCj4gPj4gKyAmZmFub3V0Ml9jbGsuY29tbW9uLAo+ID4+ ICt9Owo+ID4+ICsKPiA+PiArc3RhdGljIHN0cnVjdCBjbGtfaHdfb25lY2VsbF9kYXRhIHN1bjhp X3Y4NTNfaHdfY2xrcyA9IHsKPiA+PiArIC5udW0gPSBDTEtfTlVNQkVSLAo+ID4+ICsgLmh3cyA9 IHsKPiA+PiArIFtDTEtfT1NDMTJNXSAgICAgICAgICAgID0gJm9zYzEyTV9jbGsuaHcsCj4gPj4g KyBbQ0xLX1BMTF9DUFVdID0gJnBsbF9jcHVfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfUExM X0REUl0gPSAmcGxsX2Rkcl9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19QTExfUEVSSVBIXzRY XSA9ICZwbGxfcGVyaXBoXzR4X2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX1BMTF9QRVJJUEhf MlhdID0gJnBsbF9wZXJpcGhfMnhfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfUExMX1BFUklQ SF84MDBNXSA9ICZwbGxfcGVyaXBoXzgwME1fY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfUExM X1BFUklQSF80ODBNXSA9ICZwbGxfcGVyaXBoXzQ4ME1fY2xrLmNvbW1vbi5odywKPiA+PiArIFtD TEtfUExMX1BFUklQSF82MDBNXSA9ICZwbGxfcGVyaXBoXzYwME1fY2xrLmh3LAo+ID4+ICsgW0NM S19QTExfUEVSSVBIXzQwME1dID0gJnBsbF9wZXJpcGhfNDAwTV9jbGsuaHcsCj4gPj4gKyBbQ0xL X1BMTF9QRVJJUEhfMzAwTV0gPSAmcGxsX3BlcmlwaF8zMDBNX2Nsay5odywKPiA+PiArIFtDTEtf UExMX1BFUklQSF8yMDBNXSA9ICZwbGxfcGVyaXBoXzIwME1fY2xrLmh3LAo+ID4+ICsgW0NMS19Q TExfUEVSSVBIXzE2ME1dID0gJnBsbF9wZXJpcGhfMTYwTV9jbGsuaHcsCj4gPj4gKyBbQ0xLX1BM TF9QRVJJUEhfMTUwTV0gPSAmcGxsX3BlcmlwaF8xNTBNX2Nsay5odywKPiA+PiArIFtDTEtfUExM X1ZJREVPXzRYXSA9ICZwbGxfdmlkZW9fNHhfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfUExM X1ZJREVPXzJYXSA9ICZwbGxfdmlkZW9fMnhfY2xrLmh3LAo+ID4+ICsgW0NMS19QTExfVklERU9f MVhdID0gJnBsbF92aWRlb18xeF9jbGsuaHcsCj4gPj4gKyBbQ0xLX1BMTF9DU0lfNFhdID0gJnBs bF9jc2lfNHhfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfUExMX0FVRElPX0RJVjJdID0gJnBs bF9hdWRpb19kaXYyX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX1BMTF9BVURJT19ESVY1XSA9 ICZwbGxfYXVkaW9fZGl2NV9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19QTExfQVVESU9fNFhd ID0gJnBsbF9hdWRpb180eF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19QTExfQVVESU9fMVhd ID0gJnBsbF9hdWRpb18xeF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19QTExfTlBVXzRYXSA9 ICZwbGxfbnB1XzR4X2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0NQVV0gPSAmY3B1X2Nsay5j b21tb24uaHcsCj4gPj4gKyBbQ0xLX0NQVV9BWEldID0gJmNwdV9heGlfY2xrLmNvbW1vbi5odywK PiA+PiArIFtDTEtfQ1BVX0FQQl0gPSAmY3B1X2FwYl9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NM S19BSEJdID0gJmFoYl9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19BUEIwXSA9ICZhcGIwX2Ns ay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0FQQjFdID0gJmFwYjFfY2xrLmNvbW1vbi5odywKPiA+ PiArIFtDTEtfTUJVU10gPSAmbWJ1c19jbGsuaHcsCj4gPj4gKyBbQ0xLX0RFXSA9ICZkZV9jbGsu Y29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfREVdID0gJmJ1c19kZV9jbGsuY29tbW9uLmh3LAo+ ID4+ICsgW0NMS19HMkRdID0gJmcyZF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfRzJE XSA9ICZidXNfZzJkX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0NFXSA9ICZjZV9jbGsuY29t bW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfQ0VdID0gJmJ1c19jZV9jbGsuY29tbW9uLmh3LAo+ID4+ ICsgW0NMS19WRV0gPSAmdmVfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfQlVTX1ZFXSA9ICZi dXNfdmVfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfTlBVXSA9ICZucHVfY2xrLmNvbW1vbi5o dywKPiA+PiArIFtDTEtfQlVTX05QVV0gPSAmYnVzX25wdV9jbGsuY29tbW9uLmh3LAo+ID4+ICsg W0NMS19CVVNfRE1BXSA9ICZidXNfZG1hX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0JVU19N U0dCT1gwXSA9ICZidXNfbXNnYm94MF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfTVNH Qk9YMV0gPSAmYnVzX21zZ2JveDFfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfQlVTX1NQSU5M T0NLXSA9ICZidXNfc3BpbmxvY2tfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfQlVTX0hTVElN RVJdID0gJmJ1c19oc3RpbWVyX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0FWU10gPSAmYXZz X2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0JVU19EQkddID0gJmJ1c19kYmdfY2xrLmNvbW1v bi5odywKPiA+PiArIFtDTEtfQlVTX1BXTV0gPSAmYnVzX3B3bV9jbGsuY29tbW9uLmh3LAo+ID4+ ICsgW0NMS19CVVNfSU9NTVVdID0gJmJ1c19pb21tdV9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NM S19EUkFNXSA9ICZkcmFtX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX01CVVNfRE1BXSA9ICZt YnVzX2RtYV9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19NQlVTX1ZFXSA9ICZtYnVzX3ZlX2Ns ay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX01CVVNfQ0VdID0gJm1idXNfY2VfY2xrLmNvbW1vbi5o dywKPiA+PiArIFtDTEtfTUJVU19DU0ldID0gJm1idXNfY3NpX2Nsay5jb21tb24uaHcsCj4gPj4g KyBbQ0xLX01CVVNfSVNQXSA9ICZtYnVzX2lzcF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19N QlVTX0cyRF0gPSAmbWJ1c19nMmRfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfQlVTX0RSQU1d ID0gJmJ1c19kcmFtX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX01NQzBdID0gJm1tYzBfY2xr LmNvbW1vbi5odywKPiA+PiArIFtDTEtfTU1DMV0gPSAmbW1jMV9jbGsuY29tbW9uLmh3LAo+ID4+ ICsgW0NMS19NTUMyXSA9ICZtbWMyX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0JVU19NTUMw XSA9ICZidXNfbW1jMF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfTU1DMV0gPSAmYnVz X21tYzFfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfQlVTX01NQzJdID0gJmJ1c19tbWMyX2Ns ay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0JVU19VQVJUMF0gPSAmYnVzX3VhcnQwX2Nsay5jb21t b24uaHcsCj4gPj4gKyBbQ0xLX0JVU19VQVJUMV0gPSAmYnVzX3VhcnQxX2Nsay5jb21tb24uaHcs Cj4gPj4gKyBbQ0xLX0JVU19VQVJUMl0gPSAmYnVzX3VhcnQyX2Nsay5jb21tb24uaHcsCj4gPj4g KyBbQ0xLX0JVU19VQVJUM10gPSAmYnVzX3VhcnQzX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xL X0JVU19JMkMwXSA9ICZidXNfaTJjMF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfSTJD MV0gPSAmYnVzX2kyYzFfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfQlVTX0kyQzJdID0gJmJ1 c19pMmMyX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0JVU19JMkMzXSA9ICZidXNfaTJjM19j bGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfSTJDNF0gPSAmYnVzX2kyYzRfY2xrLmNvbW1v bi5odywKPiA+PiArIFtDTEtfU1BJMF0gPSAmc3BpMF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NM S19TUEkxXSA9ICZzcGkxX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX1NQSTJdID0gJnNwaTJf Y2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfU1BJM10gPSAmc3BpM19jbGsuY29tbW9uLmh3LAo+ ID4+ICsgW0NMS19CVVNfU1BJMF0gPSAmYnVzX3NwaTBfY2xrLmNvbW1vbi5odywKPiA+PiArIFtD TEtfQlVTX1NQSTFdID0gJmJ1c19zcGkxX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0JVU19T UEkyXSA9ICZidXNfc3BpMl9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfU1BJM10gPSAm YnVzX3NwaTNfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfU1BJRl0gPSAmc3BpZl9jbGsuY29t bW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfU1BJRl0gPSAmYnVzX3NwaWZfY2xrLmNvbW1vbi5odywK PiA+PiArIFtDTEtfRU1BQ18yNU1dID0gJmVtYWNfMjVNX2Nsay5jb21tb24uaHcsCj4gPj4gKyBb Q0xLX0JVU19FTUFDXSA9ICZidXNfZW1hY19jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNf R1BBRENdID0gJmJ1c19ncGFkY19jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfVEhTXSA9 ICZidXNfdGhzX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0kyUzBdID0gJmkyczBfY2xrLmNv bW1vbi5odywKPiA+PiArIFtDTEtfSTJTMV0gPSAmaTJzMV9jbGsuY29tbW9uLmh3LAo+ID4+ICsg W0NMS19CVVNfSTJTMF0gPSAmYnVzX2kyczBfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfQlVT X0kyUzFdID0gJmJ1c19pMnMxX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0RNSUNdID0gJmRt aWNfY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfQlVTX0RNSUNdID0gJmJ1c19kbWljX2Nsay5j b21tb24uaHcsCj4gPj4gKyBbQ0xLX0FVRElPX0NPREVDX0RBQ10gPSAmYXVkaW9fY29kZWNfZGFj X2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0FVRElPX0NPREVDX0FEQ10gPSAmYXVkaW9fY29k ZWNfYWRjX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0JVU19BVURJT19DT0RFQ10gPSAmYnVz X2F1ZGlvX2NvZGVjX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX1VTQl9PSENJXSA9ICZ1c2Jf b2hjaV9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfT0hDSV0gPSAmYnVzX29oY2lfY2xr LmNvbW1vbi5odywKPiA+PiArIFtDTEtfQlVTX0VIQ0ldID0gJmJ1c19laGNpX2Nsay5jb21tb24u aHcsCj4gPj4gKyBbQ0xLX0JVU19PVEddID0gJmJ1c19vdGdfY2xrLmNvbW1vbi5odywKPiA+PiAr IFtDTEtfQlVTX0RQU1NfVE9QXSA9ICZidXNfZHBzc190b3BfY2xrLmNvbW1vbi5odywKPiA+PiAr IFtDTEtfTUlQSV9EU0ldID0gJm1pcGlfZHNpX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0JV U19NSVBJX0RTSV0gPSAmYnVzX21pcGlfZHNpX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX1RD T05fTENEXSA9ICZ0Y29uX2xjZF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19CVVNfVENPTl9M Q0RdID0gJmJ1c190Y29uX2xjZF9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19DU0lfVE9QXSA9 ICZjc2lfdG9wX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0NTSV9NQ0xLMF0gPSAmY3NpX21j bGswX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0NTSV9NQ0xLMV0gPSAmY3NpX21jbGsxX2Ns ay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0NTSV9NQ0xLMl0gPSAmY3NpX21jbGsyX2Nsay5jb21t b24uaHcsCj4gPj4gKyBbQ0xLX0JVU19DU0ldID0gJmJ1c19jc2lfY2xrLmNvbW1vbi5odywKPiA+ PiArIFtDTEtfQlVTX1dJRUdBTkRdID0gJmJ1c193aWVnYW5kX2Nsay5jb21tb24uaHcsCj4gPj4g KyBbQ0xLX1JJU0NWXSA9ICZyaXNjdl9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19SSVNDVl9B WEldID0gJnJpc2N2X2F4aV9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19SSVNDVl9DT1JFX0dB VEVdICAgPSAmcmlzY3ZfY29yZV9nYXRlLmNvbW1vbi5odywKPiA+PiArIFtDTEtfUklTQ1ZfQ0ZH X0dBVEVdICAgID0gJnJpc2N2X2NmZ19nYXRlLmNvbW1vbi5odywKPiA+PiArIFtDTEtfRkFOT1VU XzI0TV0gPSAmZmFub3V0XzI0TV9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19GQU5PVVRfMTZN XSA9ICZmYW5vdXRfMTZNX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0ZBTk9VVF8xMk1dID0g JmZhbm91dF8xMk1fY2xrLmNvbW1vbi5odywKPiA+PiArIFtDTEtfRkFOT1VUXzI1TV0gPSAmZmFu b3V0XzI1TV9jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19GQU5PVVRfMjdNXSA9ICZmYW5vdXRf MjdNX2Nsay5jb21tb24uaHcsCj4gPj4gKyBbQ0xLX0ZBTk9VVF9QQ0xLXSA9ICZmYW5vdXRfcGNs a19jbGsuY29tbW9uLmh3LAo+ID4+ICsgW0NMS19GQU5PVVQwXSA9ICZmYW5vdXQwX2Nsay5jb21t b24uaHcsCj4gPj4gKyBbQ0xLX0ZBTk9VVDFdID0gJmZhbm91dDFfY2xrLmNvbW1vbi5odywKPiA+ PiArIFtDTEtfRkFOT1VUMl0gPSAmZmFub3V0Ml9jbGsuY29tbW9uLmh3LAo+ID4+ICsgfSwKPiA+ PiArfTsKPiA+PiArCj4gPj4gK3N0YXRpYyBzdHJ1Y3QgY2N1X3Jlc2V0X21hcCBzdW44aV92ODUz X2NjdV9yZXNldHNbXSA9IHsKPiA+PiArIFtSU1RfTUJVU10gPSB7IDB4NTQwLCBCSVQoMzApIH0s Cj4gPj4gKyBbUlNUX0JVU19ERV0gPSB7IDB4NjBjLCBCSVQoMTYpIH0sCj4gPj4gKyBbUlNUX0JV U19HMkRdID0geyAweDYzYywgQklUKDE2KSB9LAo+ID4+ICsgW1JTVF9CVVNfQ0VdID0geyAweDY4 YywgQklUKDE2KSB8IEJJVCgxNyl9LAo+ID4+ICsgW1JTVF9CVVNfVkVdID0geyAweDY5YywgQklU KDE2KSB9LAo+ID4+ICsgW1JTVF9CVVNfTlBVXSA9IHsgMHg2ZWMsIEJJVCgxNikgfSwKPiA+PiAr IFtSU1RfQlVTX0RNQV0gPSB7IDB4NzBjLCBCSVQoMTYpIH0sCj4gPj4gKyBbUlNUX0JVU19NU0dC T1gwXSA9IHsgMHg3MWMsIEJJVCgxNikgfSwKPiA+PiArIFtSU1RfQlVTX01TR0JPWDFdID0geyAw eDcxYywgQklUKDE3KSB9LAo+ID4+ICsgW1JTVF9CVVNfU1BJTkxPQ0tdID0geyAweDcyYywgQklU KDE2KSB9LAo+ID4+ICsgW1JTVF9CVVNfSFNUSU1FUl0gPSB7IDB4NzNjLCBCSVQoMTYpIH0sCj4g Pj4gKyBbUlNUX0JVU19EQkddID0geyAweDc4YywgQklUKDE2KSB9LAo+ID4+ICsgW1JTVF9CVVNf UFdNXSA9IHsgMHg3YWMsIEJJVCgxNikgfSwKPiA+PiArIFtSU1RfQlVTX0RSQU1dID0geyAweDgw YywgQklUKDE2KSB9LAo+ID4+ICsgW1JTVF9CVVNfTU1DMF0gPSB7IDB4ODRjLCBCSVQoMTYpIH0s Cj4gPj4gKyBbUlNUX0JVU19NTUMxXSA9IHsgMHg4NGMsIEJJVCgxNykgfSwKPiA+PiArIFtSU1Rf QlVTX01NQzJdID0geyAweDg0YywgQklUKDE4KSB9LAo+ID4+ICsgW1JTVF9CVVNfVUFSVDBdID0g eyAweDkwYywgQklUKDE2KSB9LAo+ID4+ICsgW1JTVF9CVVNfVUFSVDFdID0geyAweDkwYywgQklU KDE3KSB9LAo+ID4+ICsgW1JTVF9CVVNfVUFSVDJdID0geyAweDkwYywgQklUKDE4KSB9LAo+ID4+ ICsgW1JTVF9CVVNfVUFSVDNdID0geyAweDkwYywgQklUKDE5KSB9LAo+ID4+ICsgW1JTVF9CVVNf STJDMF0gPSB7IDB4OTFjLCBCSVQoMTYpIH0sCj4gPj4gKyBbUlNUX0JVU19JMkMxXSA9IHsgMHg5 MWMsIEJJVCgxNykgfSwKPiA+PiArIFtSU1RfQlVTX0kyQzJdID0geyAweDkxYywgQklUKDE4KSB9 LAo+ID4+ICsgW1JTVF9CVVNfSTJDM10gPSB7IDB4OTFjLCBCSVQoMTkpIH0sCj4gPj4gKyBbUlNU X0JVU19JMkM0XSA9IHsgMHg5MWMsIEJJVCgyMCkgfSwKPiA+PiArIFtSU1RfQlVTX1NQSTBdID0g eyAweDk2YywgQklUKDE2KSB9LAo+ID4+ICsgW1JTVF9CVVNfU1BJMV0gPSB7IDB4OTZjLCBCSVQo MTcpIH0sCj4gPj4gKyBbUlNUX0JVU19TUEkyXSA9IHsgMHg5NmMsIEJJVCgxOCkgfSwKPiA+PiAr IFtSU1RfQlVTX1NQSTNdID0geyAweDk2YywgQklUKDE5KSB9LAo+ID4+ICsgW1JTVF9CVVNfU1BJ Rl0gPSB7IDB4OTZjLCBCSVQoMjApIH0sCj4gPj4gKyBbUlNUX0JVU19FTUFDXSA9IHsgMHg5N2Ms IEJJVCgxNikgfSwKPiA+PiArIFtSU1RfQlVTX0dQQURDXSA9IHsgMHg5ZWMsIEJJVCgxNikgfSwK PiA+PiArIFtSU1RfQlVTX1RIU10gPSB7IDB4OWZjLCBCSVQoMTYpIH0sCj4gPj4gKyBbUlNUX0JV U19JMlMwXSA9IHsgMHhhMjAsIEJJVCgxNikgfSwKPiA+PiArIFtSU1RfQlVTX0kyUzFdID0geyAw eGEyMCwgQklUKDE3KSB9LAo+ID4+ICsgW1JTVF9CVVNfRE1JQ10gPSB7IDB4YTRjLCBCSVQoMTYp IH0sCj4gPj4gKyBbUlNUX0JVU19BVURJT19DT0RFQ10gPSB7IDB4YTVjLCBCSVQoMTYpIH0sCj4g Pj4gKyBbUlNUX1VTQl9QSFldID0geyAweGE3MCwgQklUKDMwKSB9LAo+ID4+ICsgW1JTVF9CVVNf T0hDSV0gPSB7IDB4YThjLCBCSVQoMTYpIH0sCj4gPj4gKyBbUlNUX0JVU19FSENJXSA9IHsgMHhh OGMsIEJJVCgyMCkgfSwKPiA+PiArIFtSU1RfQlVTX09UR10gPSB7IDB4YThjLCBCSVQoMjQpIH0s Cj4gPj4gKyBbUlNUX0JVU19EUFNTX1RPUF0gPSB7IDB4YWJjLCBCSVQoMTYpIH0sCj4gPj4gKyBb UlNUX0JVU19NSVBJX0RTSV0gPSB7IDB4YjRjLCBCSVQoMTYpIH0sCj4gPj4gKyBbUlNUX0JVU19U Q09OX0xDRF0gPSB7IDB4YjdjLCBCSVQoMTYpIH0sCj4gPj4gKyBbUlNUX0JVU19DU0ldID0geyAw eGMyYywgQklUKDE2KSB9LAo+ID4+ICsgW1JTVF9CVVNfV0lFR0FORF0gPSB7IDB4YzdjLCBCSVQo MTYpIH0sCj4gPj4gKyBbUlNUX1JJU0NWX1NZU19BUEJdID0geyAweGQwNCwgQklUKDIpLCBDQ1Vf RkVBVFVSRV9LRVlfRklFTEQgfSwKPiA+PiArIFtSU1RfUklTQ1ZfU09GVF0gPSB7IDB4ZDA0LCBC SVQoMSksIENDVV9GRUFUVVJFX0tFWV9GSUVMRCB9LAo+ID4+ICsgW1JTVF9SSVNDVl9DRkddID0g eyAweGQwYywgQklUKDE2KSB9Cj4gPj4gK307Cj4gPj4gKwo+ID4+ICtzdGF0aWMgY29uc3Qgc3Ry dWN0IHN1bnhpX2NjdV9kZXNjIHN1bjhpX3Y4NTNfY2N1X2Rlc2MgPSB7Cj4gPj4gKyAuY2N1X2Ns a3MgPSBzdW44aV92ODUzX2NjdV9jbGtzLAo+ID4+ICsgLm51bV9jY3VfY2xrcyA9IEFSUkFZX1NJ WkUoc3VuOGlfdjg1M19jY3VfY2xrcyksCj4gPj4gKwo+ID4+ICsgLmh3X2Nsa3MgPSAmc3VuOGlf djg1M19od19jbGtzLAo+ID4+ICsKPiA+PiArIC5yZXNldHMgPSBzdW44aV92ODUzX2NjdV9yZXNl dHMsCj4gPj4gKyAubnVtX3Jlc2V0cyA9IEFSUkFZX1NJWkUoc3VuOGlfdjg1M19jY3VfcmVzZXRz KSwKPiA+PiArfTsKPiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCB1MzIgcGxsX3JlZ3NbXSA9IHsK PiA+PiArIFNVTjhJX1Y4NTNfUExMX0NQVV9SRUcsCj4gPj4gKyBTVU44SV9WODUzX1BMTF9ERFJf UkVHLAo+ID4+ICsgU1VOOElfVjg1M19QTExfUEVSSVBIX1JFRywKPiA+PiArIFNVTjhJX1Y4NTNf UExMX1ZJREVPX1JFRywKPiA+PiArIFNVTjhJX1Y4NTNfUExMX0NTSV9SRUcsCj4gPj4gKyBTVU44 SV9WODUzX1BMTF9BVURJT19SRUcsCj4gPj4gKyBTVU44SV9WODUzX1BMTF9OUFVfUkVHLAo+ID4+ ICt9Owo+ID4+ICsKPiA+PiArc3RhdGljIGludCBzdW44aV92ODUzX2NjdV9wcm9iZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ID4+ICt7Cj4gPj4gKyB2b2lkIF9faW9tZW0gKnJlZzsK PiA+PiArIHUzMiB2YWw7Cj4gPj4gKyBpbnQgaSwgcmV0Owo+ID4+ICsKPiA+PiArIHJlZyA9IGRl dm1fcGxhdGZvcm1faW9yZW1hcF9yZXNvdXJjZShwZGV2LCAwKTsKPiA+PiArIGlmIChJU19FUlIo cmVnKSkKPiA+PiArIHJldHVybiBQVFJfRVJSKHJlZyk7Cj4gPj4gKwo+ID4+ICsgLyogRW5hYmxl IHRoZSBlbmFibGUsIExETywgYW5kIGxvY2sgYml0cyBvbiBhbGwgUExMcy4gKi8KPiA+PiArIGZv ciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBsbF9yZWdzKTsgaSsrKSB7Cj4gPj4gKyB2YWwgPSBy ZWFkbChyZWcgKyBwbGxfcmVnc1tpXSk7Cj4gPj4gKyB2YWwgfD0gQklUKDMxKSB8IEJJVCgzMCkg fCBCSVQoMjkpOwo+ID4+ICsgd3JpdGVsKHZhbCwgcmVnICsgcGxsX3JlZ3NbaV0pOwo+ID4+ICsg fQo+ID4+ICsKPiA+PiArIC8qIEZvcmNlIFBMTF9DUFUgZmFjdG9yIE0gdG8gMC4gKi8KPiA+PiAr IHZhbCA9IHJlYWRsKHJlZyArIFNVTjhJX1Y4NTNfUExMX0NQVV9SRUcpOwo+ID4+ICsgdmFsICY9 IH5HRU5NQVNLKDEsIDApOwo+ID4+ICsgd3JpdGVsKHZhbCwgcmVnICsgU1VOOElfVjg1M19QTExf Q1BVX1JFRyk7Cj4gPj4gKwo+ID4+ICsgLyoKPiA+PiArICogRm9yY2UgT0hDSSAxMk0gY2xvY2sg c291cmNlIHRvIDAwICgxMk1IeiBkaXZpZGVkIGZyb20gNDhNSHopCj4gPj4gKyAqCj4gPj4gKyAq IFRoaXMgY2xvY2sgbXV4IGlzIHN0aWxsIG15c3RlcmlvdXMsIGFuZCB0aGUgY29kZSBqdXN0IGVu Zm9yY2VzCj4gPj4gKyAqIGl0IHRvIGhhdmUgYSB2YWxpZCBjbG9jayBwYXJlbnQuCj4gPj4gKyAq Lwo+ID4+ICsgdmFsID0gcmVhZGwocmVnICsgU1VOOElfVjg1M19VU0JfQ0xLX1JFRyk7Cj4gPj4g KyB2YWwgJj0gfkdFTk1BU0soMjUsIDI0KTsKPiA+PiArIHdyaXRlbCh2YWwsIHJlZyArIFNVTjhJ X1Y4NTNfVVNCX0NMS19SRUcpOwo+ID4+ICsKPiA+PiArIC8qIEZvcmNlIGZhbm91dC0yN00gZmFj dG9yIE4gdG8gMC4gKi8KPiA+PiArIHZhbCA9IHJlYWRsKHJlZyArIFNVTjhJX1Y4NTNfRkFOT1VU XzI3TV9SRUcpOwo+ID4+ICsgdmFsICY9IH5HRU5NQVNLKDksIDgpOwo+ID4+ICsgd3JpdGVsKHZh bCwgcmVnICsgU1VOOElfVjg1M19GQU5PVVRfMjdNX1JFRyk7Cj4gPj4gKwo+ID4+ICsgcmV0ID0g ZGV2bV9zdW54aV9jY3VfcHJvYmUoJnBkZXYtPmRldiwgcmVnLCAmc3VuOGlfdjg1M19jY3VfZGVz Yyk7Cj4gPj4gKyBpZiAocmV0KQo+ID4+ICsgcmV0dXJuIHJldDsKPiA+PiArCj4gPj4gKyByZXR1 cm4gMDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2Vf aWQgc3VuOGlfdjg1M19jY3VfaWRzW10gPSB7Cj4gPj4gKyB7IC5jb21wYXRpYmxlID0gImFsbHdp bm5lcixzdW44aS12ODUzLWNjdSIgfSwKPiA+PiArIHsgfQo+ID4+ICt9Owo+ID4+ICsKPiA+PiAr c3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3VuOGlfdjg1M19jY3VfZHJpdmVyID0gewo+ ID4+ICsgLnByb2JlID0gc3VuOGlfdjg1M19jY3VfcHJvYmUsCj4gPj4gKyAuZHJpdmVyID0gewo+ ID4+ICsgLm5hbWUgPSAic3VuOGktdjg1My1jY3UiLAo+ID4+ICsgLnN1cHByZXNzX2JpbmRfYXR0 cnMgPSB0cnVlLAo+ID4+ICsgLm9mX21hdGNoX3RhYmxlID0gc3VuOGlfdjg1M19jY3VfaWRzLAo+ ID4+ICsgfSwKPiA+PiArfTsKPiA+PiArbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzdW44aV92ODUz X2NjdV9kcml2ZXIpOwo+ID4+ICsKPiA+PiArTU9EVUxFX0lNUE9SVF9OUygiU1VOWElfQ0NVIik7 Cj4gPj4gK01PRFVMRV9ERVNDUklQVElPTigiU3VwcG9ydCBmb3IgdGhlIEFsbHdpbm5lciBWODUz IENDVSIpOwo+ID4+ICtNT0RVTEVfTElDRU5TRSgiR1BMIik7Cj4gPj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS12ODUzLmggYi9kcml2ZXJzL2Nsay9zdW54aS1u Zy9jY3Utc3VuOGktdjg1My5oCj4gPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+PiBpbmRleCAw MDAwMDAwMDAwMDAuLmYxYjJhNGQwYmNkMwo+ID4+IC0tLSAvZGV2L251bGwKPiA+PiArKysgYi9k cml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktdjg1My5oCj4gPj4gQEAgLTAsMCArMSwxNCBA QAo+ID4+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLwo+ID4+ICsvKgo+ ID4+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMjQgQW5kcmFzIFN6ZW16byA8c3plbXpvLmFuZHJhc0Bn bWFpbC5jb20+Cj4gPj4gKyAqLwo+ID4+ICsKPiA+PiArI2lmbmRlZiBfQ0NVX1NVTjhJX1Y4NTNf SF8KPiA+PiArI2RlZmluZSBfQ0NVX1NVTjhJX1Y4NTNfSF8KPiA+PiArCj4gPj4gKyNpbmNsdWRl IDxkdC1iaW5kaW5ncy9jbG9jay9hbGx3aW5uZXIsc3VuOGktdjg1My1jY3UuaD4KPiA+PiArI2lu Y2x1ZGUgPGR0LWJpbmRpbmdzL3Jlc2V0L2FsbHdpbm5lcixzdW44aS12ODUzLWNjdS5oPgo+ID4+ ICsKPiA+PiArI2RlZmluZSBDTEtfTlVNQkVSIChDTEtfRkFOT1VUMiArIDEpCj4gPj4gKwo+ID4+ ICsjZW5kaWYKPiA+PiAKPiA+IAo+ID4gCj4gPiAKPiA+IAo+IAo+IAoKCgoKCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LXJpc2N2IG1haWxpbmcg bGlzdApsaW51eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRl YWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcmlzY3YK