From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on2083.outbound.protection.outlook.com [40.107.22.83]) by sourceware.org (Postfix) with ESMTPS id 9D7273858423 for ; Wed, 5 Jul 2023 16:41:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 9D7273858423 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=t3m9oJolKIUHIHRuhqmcyCbvQ4GPdXaCy2dDxBm7Nzw=; b=vo/SZEmOacrTzuYJSoBJ7ZyJJ3eolcZd731Pyr5eoqXdNOZ5RnAoWA4QcbMMCTf/UAJeInTFwP3BnHfYMsaG8Wj1/Ds4N9hCvFPlnPcL12HbQGJiTCLaZr/XdOivYf4OCfZX22G9tqt7g5L9h8D6cUH3eYD5cjh1N99J1o6G/fU= Received: from AM5PR0601CA0077.eurprd06.prod.outlook.com (2603:10a6:206::42) by AS2PR08MB10153.eurprd08.prod.outlook.com (2603:10a6:20b:64c::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6565.17; Wed, 5 Jul 2023 16:41:17 +0000 Received: from AM7EUR03FT050.eop-EUR03.prod.protection.outlook.com (2603:10a6:206:0:cafe::18) by AM5PR0601CA0077.outlook.office365.com (2603:10a6:206::42) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6565.18 via Frontend Transport; Wed, 5 Jul 2023 16:41:17 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; pr=C Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by AM7EUR03FT050.mail.protection.outlook.com (100.127.141.27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6565.24 via Frontend Transport; Wed, 5 Jul 2023 16:41:17 +0000 Received: ("Tessian outbound 7c913606c6e6:v142"); Wed, 05 Jul 2023 16:41:17 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 4da5b44faf969305 X-CR-MTA-TID: 64aa7808 Received: from c05f56644682.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id DAA7C1FA-9ADE-4F42-AA47-8EF4232EB2EA.1; Wed, 05 Jul 2023 16:41:06 +0000 Received: from EUR04-DB3-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id c05f56644682.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Wed, 05 Jul 2023 16:41:06 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=PjYAbWGupi5NCaxW7NzNwPwzstG/CL971VFUvmF4GxqRawpQkrxqRLctp+CM6HULsmzD9FZ1PLqcDCGnwlHgZfr+r8zF0OR0sxlEMoxm50CIDX4OguwAKsyCXMz7+kK+Z4jCEEkS0AyObGQJyFCZZ6QToi0uBy/s+LxnbozcelTk8ZimUk5oRv5fuNUZjQVHPenynZ17Um/qywFez70IY1mxEjWTXcV27yMQQkFDqZpgeSGaI1/o/mdUoXSrfh6w4a41CZQx0ZEJc2R0DgadOS2v6/DRESDE9xd9sFS/ADPk9qIA5v+EtO4rryAOYeUPZ/euD1ibKSW2BKFVztg4Tg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=t3m9oJolKIUHIHRuhqmcyCbvQ4GPdXaCy2dDxBm7Nzw=; b=ZBNLpsOO2kWQ0rVRGYzArBpXDyfBHaAgxVa0jR6IN1udOyuIA/0h7LvNy/PKQefKTNewB4QKp5gLQDKotPd7MSgge8DctVmGX3+6fQmhtFMnoKZE4EZeYUp0ISiWnmNmkVXxYePaK2Prj0Pg8wzCYuPUb43y8XlEq7IUOxUDLWH+V/zHCUCJlhu7Sp6sZqw6DGcF8QFAdKG/vQA0qtA6AgNXtNwyAQexw+BSYR8OoRlcU1DzVeVE2CEmcor6EB8ZaPkjhQFyB8yZ3GpYeP8xwXjhqrAHnHUcOOxjR9O675MUttnLmCY6JStdlOqxAeaYHQ/OkkYqvjNs+Kckxn79EQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=t3m9oJolKIUHIHRuhqmcyCbvQ4GPdXaCy2dDxBm7Nzw=; b=vo/SZEmOacrTzuYJSoBJ7ZyJJ3eolcZd731Pyr5eoqXdNOZ5RnAoWA4QcbMMCTf/UAJeInTFwP3BnHfYMsaG8Wj1/Ds4N9hCvFPlnPcL12HbQGJiTCLaZr/XdOivYf4OCfZX22G9tqt7g5L9h8D6cUH3eYD5cjh1N99J1o6G/fU= Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from DB9PR08MB6507.eurprd08.prod.outlook.com (2603:10a6:10:25a::6) by GV2PR08MB8488.eurprd08.prod.outlook.com (2603:10a6:150:b1::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6544.24; Wed, 5 Jul 2023 16:41:03 +0000 Received: from DB9PR08MB6507.eurprd08.prod.outlook.com ([fe80::2fd1:9380:86b1:467f]) by DB9PR08MB6507.eurprd08.prod.outlook.com ([fe80::2fd1:9380:86b1:467f%4]) with mapi id 15.20.6565.016; Wed, 5 Jul 2023 16:41:03 +0000 Content-Type: multipart/mixed; boundary="------------3LrfgnLK0nMae9dg2jrXjlSZ" Message-ID: <54e836be-6ad9-d3d5-e417-17bdf4c33f3f@arm.com> Date: Wed, 5 Jul 2023 17:41:01 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.11.0 From: Stamatis Markianos-Wright Subject: Re: [PATCH 2/2] arm: Add support for MVE Tail-Predicated Low Overhead Loops To: "Andre Vieira (lists)" , "gcc-patches@gcc.gnu.org" Cc: Kyrylo Tkachov , Richard Earnshaw , ramana.gcc@gmail.com, "nickc@redhat.com" References: Content-Language: en-US In-Reply-To: X-ClientProxiedBy: LNXP265CA0093.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:76::33) To DB9PR08MB6507.eurprd08.prod.outlook.com (2603:10a6:10:25a::6) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: DB9PR08MB6507:EE_|GV2PR08MB8488:EE_|AM7EUR03FT050:EE_|AS2PR08MB10153:EE_ X-MS-Office365-Filtering-Correlation-Id: 2d1626e6-e317-41c2-0f6a-08db7d76a783 X-LD-Processed: f34e5979-57d9-4aaa-ad4d-b122a662184d,ExtAddr x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: CtjS3J4NWgRgj5qLavWQXinXtvmEOi8k/60ymTbgFDbwm21wDQJKkJXlgleBnRVKX3tbJRKxcuNzde92F/qxnG1kjUBt+3OtfDzDrpy4xFCB7jl2BIO5GLaFaxzmvvQTF1ItSh3oKxD1FiBaNAnjwA5fxGq+l5G+gFuvfWTO5Meajo7zOU0alG0ej2h6Rsshq5GlwRtXlDJUAkxI5sO85slBr7jU0FRuhr9lA9wYH90gFOKYRBbP+0qPyP0lSci4x/lia0s/EC5vqwkJfVKVwTJXI3V9HbYiR+UU52X7rl8geFo8/0BejbDOb0qHVw8mwSxqq0KFqY9+M/uEiTay8Kd7KspM0dFJghg37I5AJe3GWq/svMpRBcNpoFrYvWwD9tlh08764p5ETs75K22VOkHITlCT5rrvdNuiCSR096H7QIvg5tsWi5bUJny2iD8+rA6Y3zzH9ZJ/W9jqduO1UHPUVOamVEss9RkexpBQP1eyjinuRcU/2PggmDqpqEDvf+/h1j06zj/1WzzbXX965UEYrWZoEH4TP9eyZGe1Da7fsJo5tD+NnIP9S6ZYskexSjaM3fdhWeHUgix1t2W6TSpalZFKNpZFIrhAvW4h+w0oWDw9Vi59IddhTE9r2PkL+2LHVONChn0daZg513xHiLozwlDJ1NcT+6N7N2zLKGAy6nOFVlscrwbWEsszCEDp X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DB9PR08MB6507.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230028)(4636009)(39860400002)(346002)(376002)(366004)(136003)(396003)(451199021)(26005)(6506007)(31686004)(478600001)(84970400001)(6512007)(86362001)(21480400003)(2616005)(31696002)(186003)(6486002)(66556008)(38100700002)(54906003)(66476007)(53546011)(4326008)(66946007)(110136005)(83380400001)(33964004)(316002)(8676002)(8936002)(30864003)(41300700001)(2906002)(235185007)(5660300002)(36756003)(45980500001)(43740500002);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV2PR08MB8488 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM7EUR03FT050.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 0d124930-634b-47cc-c3ac-08db7d769ef4 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: SYa9BHsf+qaH4Revd0sHZ+s41Bj8g2FMAoK+A8Kcu5zailQzcOaYb8Cjv6us2LcAo9t655y6R9YPMdp6aGUGFLsI34C+VolszDXEr2bgn0RATLgtZ3hPBaVQwlxShoHUvSSgqn6ZExRnh9EqxzR2U1CMiexjF+gsaYvVMWkj1YQ2OB41Od5F3egMMs+86cRUlo+PJrEBjaE5CeeRiVkaKlZzp/Vk7xoJNnQcI0Mkt9JaVL5kkWPFCSllDzQH4hb3fXeQ8hFZ6WgEkLd4ZjZz3c6ORgoaZIQCxY6EZBAn2rQmqlMG+2mhOoIIxyeMSaf+V0BNasuUsN625ph5uC3wtTXDzwadWUWz7ckX6/kD4RSy1r4ErK+9frBBDTnYVqQuSY6m51xwfCUo7TaOrv4h/HVhqhjuzsYMHcU/AXkdRoWV2t7+tpSK9Y+n1N7VyQP7VEyShG6Nyl9Re5PPgUxLAaF2Z+jaOb22JAOJ8M+9ifFNUZb4Di6O2JA5ratO9I4EOok+peus3jm6u7FvVBCpTODQmpLxTV2pmRbh/gm0KhKcapbC8FVCwho/5a7WlW1/gBoaoi0MvWamcMP9Qvl9RUinIQYeZklJSM+1rItxHvratHSbhGwMSK+upTcFpRVdPrvM0T+W5gpi/ei+a6C6VhCViwO3jAYPtF7niuaHAl1U3rMXd00xWRp368Vo/vZ9x5BxGx9G1ywEcBdHByUBxMviY1FHrkeh17VOK04I6E0vJVX32tOHqI1/llvljeWlLAGTni9r74oSNhUGGWdqi7xpMSWT7XQNLBziLzh3t1rk9hINAclDACGVqkUZEe0A X-Forefront-Antispam-Report: CIP:63.35.35.123;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:64aa7808-outbound-1.mta.getcheckrecipient.com;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;CAT:NONE;SFS:(13230028)(4636009)(376002)(346002)(136003)(396003)(39860400002)(451199021)(46966006)(36840700001)(40470700004)(33964004)(40460700003)(4326008)(70586007)(70206006)(6512007)(2616005)(21480400003)(356005)(82740400003)(81166007)(107886003)(31696002)(186003)(82310400005)(86362001)(26005)(6506007)(36860700001)(53546011)(47076005)(83380400001)(336012)(478600001)(30864003)(40480700001)(54906003)(110136005)(36756003)(235185007)(41300700001)(8936002)(8676002)(84970400001)(31686004)(2906002)(6486002)(5660300002)(316002)(43740500002);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Jul 2023 16:41:17.2273 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2d1626e6-e317-41c2-0f6a-08db7d76a783 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: AM7EUR03FT050.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS2PR08MB10153 X-Spam-Status: No, score=-11.0 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,FORGED_SPF_HELO,GIT_PATCH_0,KAM_DMARC_NONE,KAM_SHORT,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --------------3LrfgnLK0nMae9dg2jrXjlSZ Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 23/06/2023 17:25, Andre Vieira (lists) wrote: > +  /* In order to find out if the loop is of type A or B above look > for the > +     loop counter: it will either be incrementing by one per > iteration or > +     it will be decrementing by num_of_lanes.  We can find the loop > counter > +     in the condition at the end of the loop.  */ > +  rtx_insn *loop_cond = prev_nonnote_nondebug_insn_bb (BB_END (body)); > +  gcc_assert (cc_register (XEXP (PATTERN (loop_cond), 0), VOIDmode) > +          && GET_CODE (XEXP (PATTERN (loop_cond), 1)) == COMPARE); > > Not sure this should be an assert. If we do encounter a differently > formed loop, we should bail out of DLSTPing for now but we shouldn't ICE. Hmm, good point. A lot of these checks I actually did have in as asserts, so that then I could try and answer the question "does this ever happen in all currently known dlstp/letp-compatible codebases" and if they are still asserts it means that the answer was "No". I agree, though, for future safety it's best to make this a bail-out instead. Done > > > +  /* The loop latch has to be empty.  When compiling all the known > MVE LoLs in > +     user applications, none of those with incrementing counters had > any real > +     insns in the loop latch.  As such, this function has only been > tested with > +     an empty latch and may misbehave or ICE if we somehow get here > with an > +     increment in the latch, so, for sanity, error out early.  */ > +  rtx_insn *dec_insn = BB_END (body->loop_father->latch); > +  if (NONDEBUG_INSN_P (dec_insn)) > +    gcc_unreachable (); > > Similarly here I'd return false rather than gcc_unreachable (); Same as above Done > > > +  /* Find where both of those are modified in the loop body bb. */ > +  rtx condcount_reg_set = PATTERN (DF_REF_INSN > (df_bb_regno_only_def_find > +                         (body, REGNO (condcount)))); > Put = on newline, breaks it down nicer. Done > > +      counter_orig_set = XEXP (PATTERN > +                    (DF_REF_INSN > +                      (DF_REF_NEXT_REG > +                    (DF_REG_DEF_CHAIN > +                     (REGNO > +                       (XEXP (condcount_reg_set, 0)))))), 1); > > This makes me a bit nervous, can we be certain that the PATTERN of the > next insn that sets it is indeed a set. Heck can we even be sure > DF_REG_DEF_CHAIN returns a non-null, I can't imagine why not but maybe > there are some constructs it can't follow-up on? Might just be worth > checking these steps and bailing out. > Hmm, yes. The logic of it is: * So  condcount_reg_set is a set to a REG. Get that REGNO and fetch the DEF_CHAIN... * Then the "DF_REF_NEXT_REG" is the last df_ref in the chain that did a DEF to that REG * Then get the INSN from that (DF_REF_INSN) --- it should be a SET * Then get the PATTERN * Then XEXP (.., 1) on the PATTERN will get the rhs of the SET So the outcome is finding the previous value that was last set to that REGNO, regardless of it being in the same BB or not But indeed it is unsafe that way. Done some breakdown and some checking :) > > > +      /* When we find the vctp instruction: This may be followed by > +      a zero-extend insn to SImode.  If it is, then save the > +      zero-extended REG into vctp_vpr_generated.  If there is no > +      zero-extend, then store the raw output of the vctp. > +      For any VPT-predicated instructions we need to ensure that > +      the VPR they use is the same as the one given here and > +      they often consume the output of a subreg of the SImode > +      zero-extended VPR-reg.  As a result, comparing against the > +      output of the zero-extend is more likely to succeed. > +      This code also guarantees to us that the vctp comes before > +      any instructions that use the VPR within the loop, for the > +      dlstp/letp transform to succeed.  */ > > Wrong comment indent after first line. Done (but shifted this comment to a new location, because i split the logic searching for vctp_vpr_generated into a new function to be called separately from the FOR_BB_INSNS loop (this guarantees that we always have a value in `vctp_vpr_generated` when arm_mve_check_df_chain_back_for_implic_predic is called > > +  rtx_insn *vctp_insn = arm_mve_get_loop_vctp (body); > +  if (!vctp_insn || !arm_mve_loop_valid_for_dlstp (body)) > +    return GEN_INT (1); > > arm_mve_loop_valid_for_dlstp already calls arm_mve_get_loop_vctp, > maybe have 'arm_mve_loop_valid_for_dlstp' return vctp_insn or null to > determine success or failure, avoids looping through the BB again. > > For the same reason I'd also pass vctp_insn down to > 'arm_mve_check_df_chain_back_for_implic_predic'. Done > > +      if (GET_CODE (SET_SRC (single_set (next_use1))) == ZERO_EXTEND) > +        { > +          rtx_insn *next_use2 = NULL; > > Are we sure single_set can never return 0 here? Maybe worth an extra > check and bail out if it does? True... I could imagine the VPR being used in e.g. an `adds` instruction that is a PARALLEL SET to the output and to CC_REG: that would ICE here Added an additional check for this. > > +       /* If the insn pattern requires the use of the VPR value from the > +      vctp as an input parameter.  */ > s/an an input parameter./as an input parameter for predication./ Done > > +      /* None of registers USE-d by the instruction need can be the VPR > +         vctp_vpr_generated.  This blocks the optimisation if there any > +         instructions that use the optimised-out VPR value in any way > +         other than as a VPT block predicate.  */ > > Reword this slightly to be less complex: > This instruction USE-s the vctp_vpr_generated other than for > predication, this blocks the transformation as we are not allowed to > optimise the VPR value away. Done Note a couple of "extra" changes in this revision: * As we discussed offline: Using "lctp" after the loop, instead of the "mrs,orr,and,msr" series when the branch is too far for "letp" * Added "simple_loop_desc (body->loop_father)->noloop_assumptions = NULL_RTX" when the transform succeeds. This is as a safety to stop the middle-end from ever falling down that constant-number-of-terations logic (I never actually saw this happen, but it seemed reasonable to block this) * Split out "arm_mve_get_vctp_vec_form" into a new function: this just helps with the read-ability of "arm_attempt_dlstp_transform" I look forward to getting more comments :D Cheers, Stam > > Will continue reviewing next week :) > > On 15/06/2023 12:47, Stamatis Markianos-Wright via Gcc-patches wrote: >>      Hi all, >> >>      This is the 2/2 patch that contains the functional changes needed >>      for MVE Tail Predicated Low Overhead Loops.  See my previous email >>      for a general introduction of MVE LOLs. >> >>      This support is added through the already existing loop-doloop >>      mechanisms that are used for non-MVE dls/le looping. >> >>      Mid-end changes are: >> >>      1) Relax the loop-doloop mechanism in the mid-end to allow for >>         decrement numbers other that -1 and for `count` to be an >>         rtx containing a simple REG (which in this case will contain >>         the number of elements to be processed), rather >>         than an expression for calculating the number of iterations. >>      2) Added a new df utility function: `df_bb_regno_only_def_find` >> that >>         will return the DEF of a REG only if it is DEF-ed once within >> the >>         basic block. >> >>      And many things in the backend to implement the above optimisation: >> >>      3)  Implement the `arm_predict_doloop_p` target hook to instruct >> the >>          mid-end about Low Overhead Loops (MVE or not), as well as >>          `arm_loop_unroll_adjust` which will prevent unrolling of any >> loops >>          that are valid for becoming MVE Tail_Predicated Low Overhead >> Loops >>          (unrolling can transform a loop in ways that invalidate the >> dlstp/ >>          letp tranformation logic and the benefit of the dlstp/letp loop >>          would be considerably higher than that of unrolling) >>      4)  Appropriate changes to the define_expand of doloop_end, new >>          patterns for dlstp and letp, new iterators,  unspecs, etc. >>      5) `arm_mve_loop_valid_for_dlstp` and a number of checking >> functions: >>         * `arm_mve_dlstp_check_dec_counter` >>         * `arm_mve_dlstp_check_inc_counter` >>         * `arm_mve_check_reg_origin_is_num_elems` >>         * `arm_mve_check_df_chain_back_for_implic_predic` >>         * `arm_mve_check_df_chain_fwd_for_implic_predic_impact` >>         This all, in smoe way or another, are running checks on the loop >>         structure in order to determine if the loop is valid for >> dlstp/letp >>         transformation. >>      6) `arm_attempt_dlstp_transform`: (called from the define_expand of >>          doloop_end) this function re-checks for the loop's >> suitability for >>          dlstp/letp transformation and then implements it, if possible. >>      7) Various utility functions: >>         *`arm_mve_get_vctp_lanes` to map >>         from vctp unspecs to number of lanes, and >> `arm_get_required_vpr_reg` >>         to check an insn to see if it requires the VPR or not. >>         * `arm_mve_get_loop_vctp` >>         * `arm_mve_get_vctp_lanes` >>         * `arm_emit_mve_unpredicated_insn_to_seq` >>         * `arm_get_required_vpr_reg` >>         * `arm_get_required_vpr_reg_param` >>         * `arm_get_required_vpr_reg_ret_val` >>         * `arm_mve_vec_insn_is_predicated_with_this_predicate` >>         * `arm_mve_vec_insn_is_unpredicated_or_uses_other_predicate` >> >>      No regressions on arm-none-eabi with various targets and on >>      aarch64-none-elf. Thoughts on getting this into trunk? >> >>      Thank you, >>      Stam Markianos-Wright >> >>      gcc/ChangeLog: >> >>              * config/arm/arm-protos.h (arm_target_insn_ok_for_lob): >> Rename to... >>              (arm_target_bb_ok_for_lob): ...this >>              (arm_attempt_dlstp_transform): New. >>              * config/arm/arm.cc (TARGET_LOOP_UNROLL_ADJUST): New. >>              (TARGET_PREDICT_DOLOOP_P): New. >>              (arm_block_set_vect): >>              (arm_target_insn_ok_for_lob): Rename from >> arm_target_insn_ok_for_lob. >>              (arm_target_bb_ok_for_lob): New. >>              (arm_mve_get_vctp_lanes): New. >>              (arm_get_required_vpr_reg): New. >>              (arm_get_required_vpr_reg_param): New. >>              (arm_get_required_vpr_reg_ret_val): New. >>              (arm_mve_get_loop_vctp): New. >> (arm_mve_vec_insn_is_unpredicated_or_uses_other_predicate): New. >> (arm_mve_vec_insn_is_predicated_with_this_predicate): New. >>              (arm_mve_check_df_chain_back_for_implic_predic): New. >> (arm_mve_check_df_chain_fwd_for_implic_predic_impact): New. >>              (arm_mve_check_reg_origin_is_num_elems): New. >>              (arm_mve_dlstp_check_inc_counter): New. >>              (arm_mve_dlstp_check_dec_counter): New. >>              (arm_mve_loop_valid_for_dlstp): New. >>              (arm_predict_doloop_p): New. >>              (arm_loop_unroll_adjust): New. >>              (arm_emit_mve_unpredicated_insn_to_seq): New. >>              (arm_attempt_dlstp_transform): New. >>              * config/arm/iterators.md (DLSTP): New. >>              (mode1): Add DLSTP mappings. >>              * config/arm/mve.md (*predicated_doloop_end_internal): New. >>              (dlstp_insn): New. >>              * config/arm/thumb2.md (doloop_end): Update for MVE LOLs. >>              * config/arm/unspecs.md: New unspecs. >>              * df-core.cc (df_bb_regno_only_def_find): New. >>              * df.h (df_bb_regno_only_def_find): New. >>              * loop-doloop.cc (doloop_condition_get): Relax conditions. >>              (doloop_optimize): Add support for elementwise LoLs. >> >>      gcc/testsuite/ChangeLog: >> >>              * gcc.target/arm/lob.h: Update framework. >>              * gcc.target/arm/lob1.c: Likewise. >>              * gcc.target/arm/lob6.c: Likewise. >>              * gcc.target/arm/mve/dlstp-compile-asm.c: New test. >>              * gcc.target/arm/mve/dlstp-int16x8.c: New test. >>              * gcc.target/arm/mve/dlstp-int32x4.c: New test. >>              * gcc.target/arm/mve/dlstp-int64x2.c: New test. >>              * gcc.target/arm/mve/dlstp-int8x16.c: New test. >>              * gcc.target/arm/mve/dlstp-invalid-asm.c: New test. --------------3LrfgnLK0nMae9dg2jrXjlSZ Content-Type: text/plain; charset=UTF-8; name="diff.txt" Content-Disposition: attachment; filename="diff.txt" Content-Transfer-Encoding: base64 Y29tbWl0IGMxYzkyZDRkMDNmZWU0NDc0NDkwOGNmNzc0MjE5ZDIxNTQ2YzFmMTEKQXV0aG9yOiBT dGFtIE1hcmtpYW5vcy1XcmlnaHQgPHN0YW0ubWFya2lhbm9zLXdyaWdodEBhcm0uY29tPgpEYXRl OiAgIFR1ZSBPY3QgMTggMTc6NDI6NTYgMjAyMiArMDEwMAoKICAgIGFybTogQWRkIHN1cHBvcnQg Zm9yIE1WRSBUYWlsLVByZWRpY2F0ZWQgTG93IE92ZXJoZWFkIExvb3BzCiAgICAKICAgIFRoaXMg aXMgdGhlIDIvMiBwYXRjaCB0aGF0IGNvbnRhaW5zIHRoZSBmdW5jdGlvbmFsIGNoYW5nZXMgbmVl ZGVkCiAgICBmb3IgTVZFIFRhaWwgUHJlZGljYXRlZCBMb3cgT3ZlcmhlYWQgTG9vcHMuICBTZWUg bXkgcHJldmlvdXMgZW1haWwKICAgIGZvciBhIGdlbmVyYWwgaW50cm9kdWN0aW9uIG9mIE1WRSBM T0xzLgogICAgCiAgICBUaGlzIHN1cHBvcnQgaXMgYWRkZWQgdGhyb3VnaCB0aGUgYWxyZWFkeSBl eGlzdGluZyBsb29wLWRvbG9vcAogICAgbWVjaGFuaXNtcyB0aGF0IGFyZSB1c2VkIGZvciBub24t TVZFIGRscy9sZSBsb29waW5nLgogICAgCiAgICBNaWQtZW5kIGNoYW5nZXMgYXJlOgogICAgCiAg ICAxKSBSZWxheCB0aGUgbG9vcC1kb2xvb3AgbWVjaGFuaXNtIGluIHRoZSBtaWQtZW5kIHRvIGFs bG93IGZvcgogICAgICAgZGVjcmVtZW50IG51bWJlcnMgb3RoZXIgdGhhdCAtMSBhbmQgZm9yIGBj b3VudGAgdG8gYmUgYW4KICAgICAgIHJ0eCBjb250YWluaW5nIGEgc2ltcGxlIFJFRyAod2hpY2gg aW4gdGhpcyBjYXNlIHdpbGwgY29udGFpbgogICAgICAgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0 byBiZSBwcm9jZXNzZWQpLCByYXRoZXIKICAgICAgIHRoYW4gYW4gZXhwcmVzc2lvbiBmb3IgY2Fs Y3VsYXRpbmcgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zLgogICAgMikgQWRkZWQgYSBuZXcgZGYg dXRpbGl0eSBmdW5jdGlvbjogYGRmX2JiX3JlZ25vX29ubHlfZGVmX2ZpbmRgIHRoYXQKICAgICAg IHdpbGwgcmV0dXJuIHRoZSBERUYgb2YgYSBSRUcgaWYgaXQgaXMgREVGLWVkIG9ubHkgb25jZSB3 aXRoaW4gdGhlCiAgICAgICBiYXNpYyBibG9jay4KICAgIAogICAgQW5kIG1hbnkgdGhpbmdzIGlu IHRoZSBiYWNrZW5kIHRvIGltcGxlbWVudCB0aGUgYWJvdmUgb3B0aW1pc2F0aW9uOgogICAgCiAg ICAzKSAgSW1wbGVtZW50IHRoZSBgYXJtX3ByZWRpY3RfZG9sb29wX3BgIHRhcmdldCBob29rIHRv IGluc3RydWN0IHRoZQogICAgICAgIG1pZC1lbmQgYWJvdXQgTG93IE92ZXJoZWFkIExvb3BzIChN VkUgb3Igbm90KSwgYXMgd2VsbCBhcwogICAgICAgIGBhcm1fbG9vcF91bnJvbGxfYWRqdXN0YCB3 aGljaCB3aWxsIHByZXZlbnQgdW5yb2xsaW5nIG9mIGFueSBsb29wcwogICAgICAgIHRoYXQgYXJl IHZhbGlkIGZvciBiZWNvbWluZyBNVkUgVGFpbF9QcmVkaWNhdGVkIExvdyBPdmVyaGVhZCBMb29w cwogICAgICAgICh1bnJvbGxpbmcgY2FuIHRyYW5zZm9ybSBhIGxvb3AgaW4gd2F5cyB0aGF0IGlu dmFsaWRhdGUgdGhlIGRsc3RwLwogICAgICAgIGxldHAgdHJhbmZvcm1hdGlvbiBsb2dpYyBhbmQg dGhlIGJlbmVmaXQgb2YgdGhlIGRsc3RwL2xldHAgbG9vcAogICAgICAgIHdvdWxkIGJlIGNvbnNp ZGVyYWJseSBoaWdoZXIgdGhhbiB0aGF0IG9mIHVucm9sbGluZykKICAgIDQpICBBcHByb3ByaWF0 ZSBjaGFuZ2VzIHRvIHRoZSBkZWZpbmVfZXhwYW5kIG9mIGRvbG9vcF9lbmQsIG5ldwogICAgICAg IHBhdHRlcm5zIGZvciBkbHN0cCBhbmQgbGV0cCwgbmV3IGl0ZXJhdG9ycywgIHVuc3BlY3MsIGV0 Yy4KICAgIDUpIGBhcm1fbXZlX2xvb3BfdmFsaWRfZm9yX2Rsc3RwYCBhbmQgYSBudW1iZXIgb2Yg Y2hlY2tpbmcgZnVuY3Rpb25zOgogICAgICAgKiBgYXJtX212ZV9kbHN0cF9jaGVja19kZWNfY291 bnRlcmAKICAgICAgICogYGFybV9tdmVfZGxzdHBfY2hlY2tfaW5jX2NvdW50ZXJgCiAgICAgICAq IGBhcm1fbXZlX2NoZWNrX3JlZ19vcmlnaW5faXNfbnVtX2VsZW1zYAogICAgICAgKiBgYXJtX212 ZV9jaGVja19kZl9jaGFpbl9iYWNrX2Zvcl9pbXBsaWNfcHJlZGljYAogICAgICAgKiBgYXJtX212 ZV9jaGVja19kZl9jaGFpbl9md2RfZm9yX2ltcGxpY19wcmVkaWNfaW1wYWN0YAogICAgICAgVGhp cyBhbGwsIGluIHNtb2Ugd2F5IG9yIGFub3RoZXIsIGFyZSBydW5uaW5nIGNoZWNrcyBvbiB0aGUg bG9vcAogICAgICAgc3RydWN0dXJlIGluIG9yZGVyIHRvIGRldGVybWluZSBpZiB0aGUgbG9vcCBp cyB2YWxpZCBmb3IgZGxzdHAvbGV0cAogICAgICAgdHJhbnNmb3JtYXRpb24uCiAgICA2KSBgYXJt X2F0dGVtcHRfZGxzdHBfdHJhbnNmb3JtYDogKGNhbGxlZCBmcm9tIHRoZSBkZWZpbmVfZXhwYW5k IG9mCiAgICAgICAgZG9sb29wX2VuZCkgdGhpcyBmdW5jdGlvbiByZS1jaGVja3MgZm9yIHRoZSBs b29wJ3Mgc3VpdGFiaWxpdHkgZm9yCiAgICAgICAgZGxzdHAvbGV0cCB0cmFuc2Zvcm1hdGlvbiBh bmQgdGhlbiBpbXBsZW1lbnRzIGl0LCBpZiBwb3NzaWJsZS4KICAgIDcpIFZhcmlvdXMgdXRpbGl0 eSBmdW5jdGlvbnM6CiAgICAgICAqYGFybV9tdmVfZ2V0X3ZjdHBfbGFuZXNgIHRvIG1hcAogICAg ICAgZnJvbSB2Y3RwIHVuc3BlY3MgdG8gbnVtYmVyIG9mIGxhbmVzLCBhbmQgYGFybV9nZXRfcmVx dWlyZWRfdnByX3JlZ2AKICAgICAgIHRvIGNoZWNrIGFuIGluc24gdG8gc2VlIGlmIGl0IHJlcXVp cmVzIHRoZSBWUFIgb3Igbm90LgogICAgICAgKiBgYXJtX212ZV9nZXRfbG9vcF92Y3RwYAogICAg ICAgKiBgYXJtX212ZV9nZXRfdmN0cF9sYW5lc2AKICAgICAgICogYGFybV9lbWl0X212ZV91bnBy ZWRpY2F0ZWRfaW5zbl90b19zZXFgCiAgICAgICAqIGBhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWdg CiAgICAgICAqIGBhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWdfcGFyYW1gCiAgICAgICAqIGBhcm1f Z2V0X3JlcXVpcmVkX3Zwcl9yZWdfcmV0X3ZhbGAKICAgICAgICogYGFybV9tdmVfaXNfYWNyb3Nz X3ZlY3Rvcl9pbnNuYAogICAgICAgKiBgYXJtX2lzX212ZV9sb2FkX3N0b3JlX2luc25gCiAgICAg ICAqIGBhcm1fbXZlX3ZlY19pbnNuX2lzX3ByZWRpY2F0ZWRfd2l0aF90aGlzX3ByZWRpY2F0ZWAK ICAgICAgICogYGFybV9tdmVfdmVjX2luc25faXNfdW5wcmVkaWNhdGVkX29yX3VzZXNfb3RoZXJf cHJlZGljYXRlYAogICAgCiAgICBObyByZWdyZXNzaW9ucyBvbiBhcm0tbm9uZS1lYWJpIHdpdGgg dmFyaW91cyB0YXJnZXRzIGFuZCBvbgogICAgYWFyY2g2NC1ub25lLWVsZi4gVGhvdWdodHMgb24g Z2V0dGluZyB0aGlzIGludG8gdHJ1bms/CiAgICAKICAgIFRoYW5rIHlvdSwKICAgIFN0YW0gTWFy a2lhbm9zLVdyaWdodAogICAgCiAgICBnY2MvQ2hhbmdlTG9nOgogICAgCiAgICAgICAgICAgICog Y29uZmlnL2FybS9hcm0tcHJvdG9zLmggKGFybV90YXJnZXRfaW5zbl9va19mb3JfbG9iKTogUmVu YW1lIHRvLi4uCiAgICAgICAgICAgIChhcm1fdGFyZ2V0X2JiX29rX2Zvcl9sb2IpOiAuLi50aGlz CiAgICAgICAgICAgIChhcm1fYXR0ZW1wdF9kbHN0cF90cmFuc2Zvcm0pOiBOZXcuCiAgICAgICAg ICAgICogY29uZmlnL2FybS9hcm0uY2MgKFRBUkdFVF9MT09QX1VOUk9MTF9BREpVU1QpOiBOZXcu CiAgICAgICAgICAgIChUQVJHRVRfUFJFRElDVF9ET0xPT1BfUCk6IE5ldy4KICAgICAgICAgICAg KGFybV9ibG9ja19zZXRfdmVjdCk6CiAgICAgICAgICAgIChhcm1fdGFyZ2V0X2luc25fb2tfZm9y X2xvYik6IFJlbmFtZSBmcm9tIGFybV90YXJnZXRfaW5zbl9va19mb3JfbG9iLgogICAgICAgICAg ICAoYXJtX3RhcmdldF9iYl9va19mb3JfbG9iKTogTmV3LgogICAgICAgICAgICAoYXJtX212ZV9n ZXRfdmN0cF9sYW5lcyk6IE5ldy4KICAgICAgICAgICAgKGFybV9nZXRfcmVxdWlyZWRfdnByX3Jl Zyk6IE5ldy4KICAgICAgICAgICAgKGFybV9nZXRfcmVxdWlyZWRfdnByX3JlZ19wYXJhbSk6IE5l dy4KICAgICAgICAgICAgKGFybV9nZXRfcmVxdWlyZWRfdnByX3JlZ19yZXRfdmFsKTogTmV3Lgog ICAgICAgICAgICAoYXJtX212ZV9nZXRfbG9vcF92Y3RwKTogTmV3LgogICAgICAgICAgICAoYXJt X212ZV92ZWNfaW5zbl9pc191bnByZWRpY2F0ZWRfb3JfdXNlc19vdGhlcl9wcmVkaWNhdGUpOiBO ZXcuCiAgICAgICAgICAgIChhcm1fbXZlX3ZlY19pbnNuX2lzX3ByZWRpY2F0ZWRfd2l0aF90aGlz X3ByZWRpY2F0ZSk6IE5ldy4KICAgICAgICAgICAgKGFybV9tdmVfY2hlY2tfZGZfY2hhaW5fYmFj a19mb3JfaW1wbGljX3ByZWRpYyk6IE5ldy4KICAgICAgICAgICAgKGFybV9tdmVfY2hlY2tfZGZf Y2hhaW5fZndkX2Zvcl9pbXBsaWNfcHJlZGljX2ltcGFjdCk6IE5ldy4KICAgICAgICAgICAgKGFy bV9tdmVfY2hlY2tfcmVnX29yaWdpbl9pc19udW1fZWxlbXMpOiBOZXcuCiAgICAgICAgICAgIChh cm1fbXZlX2Rsc3RwX2NoZWNrX2luY19jb3VudGVyKTogTmV3LgogICAgICAgICAgICAoYXJtX212 ZV9kbHN0cF9jaGVja19kZWNfY291bnRlcik6IE5ldy4KICAgICAgICAgICAgKGFybV9tdmVfbG9v cF92YWxpZF9mb3JfZGxzdHApOiBOZXcuCiAgICAgICAgICAgIChhcm1fbXZlX2lzX2Fjcm9zc192 ZWN0b3JfaW5zbik6IE5ldy4KICAgICAgICAgICAgKGFybV9pc19tdmVfbG9hZF9zdG9yZV9pbnNu KTogTmV3LgogICAgICAgICAgICAoYXJtX3ByZWRpY3RfZG9sb29wX3ApOiBOZXcuCiAgICAgICAg ICAgIChhcm1fbG9vcF91bnJvbGxfYWRqdXN0KTogTmV3LgogICAgICAgICAgICAoYXJtX2VtaXRf bXZlX3VucHJlZGljYXRlZF9pbnNuX3RvX3NlcSk6IE5ldy4KICAgICAgICAgICAgKGFybV9hdHRl bXB0X2Rsc3RwX3RyYW5zZm9ybSk6IE5ldy4KICAgICAgICAgICAgKiBjb25maWcvYXJtL2l0ZXJh dG9ycy5tZCAoRExTVFApOiBOZXcuCiAgICAgICAgICAgIChtb2RlMSk6IEFkZCBETFNUUCBtYXBw aW5ncy4KICAgICAgICAgICAgKiBjb25maWcvYXJtL212ZS5tZCAoKnByZWRpY2F0ZWRfZG9sb29w X2VuZF9pbnRlcm5hbCk6IE5ldy4KICAgICAgICAgICAgKGRsc3RwPG1vZGUxPl9pbnNuKTogTmV3 LgogICAgICAgICAgICAqIGNvbmZpZy9hcm0vdGh1bWIyLm1kIChkb2xvb3BfZW5kKTogVXBkYXRl IGZvciBNVkUgTE9Mcy4KICAgICAgICAgICAgKiBjb25maWcvYXJtL3Vuc3BlY3MubWQ6IE5ldyB1 bnNwZWNzLgogICAgICAgICAgICAqIGRmLWNvcmUuY2MgKGRmX2JiX3JlZ25vX29ubHlfZGVmX2Zp bmQpOiBOZXcuCiAgICAgICAgICAgICogZGYuaCAoZGZfYmJfcmVnbm9fb25seV9kZWZfZmluZCk6 IE5ldy4KICAgICAgICAgICAgKiBsb29wLWRvbG9vcC5jYyAoZG9sb29wX2NvbmRpdGlvbl9nZXQp OiBSZWxheCBjb25kaXRpb25zLgogICAgICAgICAgICAoZG9sb29wX29wdGltaXplKTogQWRkIHN1 cHBvcnQgZm9yIGVsZW1lbnR3aXNlIExvTHMuCiAgICAKICAgIGdjYy90ZXN0c3VpdGUvQ2hhbmdl TG9nOgogICAgCiAgICAgICAgICAgICogZ2NjLnRhcmdldC9hcm0vbG9iLmg6IFVwZGF0ZSBmcmFt ZXdvcmsuCiAgICAgICAgICAgICogZ2NjLnRhcmdldC9hcm0vbG9iMS5jOiBMaWtld2lzZS4KICAg ICAgICAgICAgKiBnY2MudGFyZ2V0L2FybS9sb2I2LmM6IExpa2V3aXNlLgogICAgICAgICAgICAq IGdjYy50YXJnZXQvYXJtL212ZS9kbHN0cC1jb21waWxlLWFzbS5jOiBOZXcgdGVzdC4KICAgICAg ICAgICAgKiBnY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50MTZ4OC5jOiBOZXcgdGVzdC4KICAg ICAgICAgICAgKiBnY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50MzJ4NC5jOiBOZXcgdGVzdC4K ICAgICAgICAgICAgKiBnY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50NjR4Mi5jOiBOZXcgdGVz dC4KICAgICAgICAgICAgKiBnY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50OHgxNi5jOiBOZXcg dGVzdC4KICAgICAgICAgICAgKiBnY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW52YWxpZC1hc20u YzogTmV3IHRlc3QuCgpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9hcm0vYXJtLXByb3Rvcy5oIGIv Z2NjL2NvbmZpZy9hcm0vYXJtLXByb3Rvcy5oCmluZGV4IDdkNzNjNjZhMTVkLi42NzIyZGM0ZWQz MyAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9hcm0vYXJtLXByb3Rvcy5oCisrKyBiL2djYy9jb25m aWcvYXJtL2FybS1wcm90b3MuaApAQCAtNjQsOCArNjQsOCBAQCBleHRlcm4gdm9pZCBhcm1fZW1p dF9zcGVjdWxhdGlvbl9iYXJyaWVyX2Z1bmN0aW9uICh2b2lkKTsKIGV4dGVybiB2b2lkIGFybV9k ZWNvbXBvc2VfZGlfYmlub3AgKHJ0eCwgcnR4LCBydHggKiwgcnR4ICosIHJ0eCAqLCBydHggKik7 CiBleHRlcm4gYm9vbCBhcm1fcV9iaXRfYWNjZXNzICh2b2lkKTsKIGV4dGVybiBib29sIGFybV9n ZV9iaXRzX2FjY2VzcyAodm9pZCk7Ci1leHRlcm4gYm9vbCBhcm1fdGFyZ2V0X2luc25fb2tfZm9y X2xvYiAocnR4KTsKLQorZXh0ZXJuIGJvb2wgYXJtX3RhcmdldF9iYl9va19mb3JfbG9iIChiYXNp Y19ibG9jayk7CitleHRlcm4gcnR4IGFybV9hdHRlbXB0X2Rsc3RwX3RyYW5zZm9ybSAocnR4KTsK ICNpZmRlZiBSVFhfQ09ERQogZW51bSByZWdfY2xhc3MKIGFybV9tb2RlX2Jhc2VfcmVnX2NsYXNz IChtYWNoaW5lX21vZGUpOwpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9hcm0vYXJtLmNjIGIvZ2Nj L2NvbmZpZy9hcm0vYXJtLmNjCmluZGV4IDM4ZjA4MzlkZTFjLi5hNGU0YWJmZThmOSAxMDA2NDQK LS0tIGEvZ2NjL2NvbmZpZy9hcm0vYXJtLmNjCisrKyBiL2djYy9jb25maWcvYXJtL2FybS5jYwpA QCAtNjU5LDYgKzY1OSwxMiBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9zcGVjIGFy bV9hdHRyaWJ1dGVfdGFibGVbXSA9CiAjdW5kZWYgVEFSR0VUX0hBVkVfQ09ORElUSU9OQUxfRVhF Q1VUSU9OCiAjZGVmaW5lIFRBUkdFVF9IQVZFX0NPTkRJVElPTkFMX0VYRUNVVElPTiBhcm1faGF2 ZV9jb25kaXRpb25hbF9leGVjdXRpb24KIAorI3VuZGVmIFRBUkdFVF9MT09QX1VOUk9MTF9BREpV U1QKKyNkZWZpbmUgVEFSR0VUX0xPT1BfVU5ST0xMX0FESlVTVCBhcm1fbG9vcF91bnJvbGxfYWRq dXN0CisKKyN1bmRlZiBUQVJHRVRfUFJFRElDVF9ET0xPT1BfUAorI2RlZmluZSBUQVJHRVRfUFJF RElDVF9ET0xPT1BfUCBhcm1fcHJlZGljdF9kb2xvb3BfcAorCiAjdW5kZWYgVEFSR0VUX0xFR0lU SU1BVEVfQ09OU1RBTlRfUAogI2RlZmluZSBUQVJHRVRfTEVHSVRJTUFURV9DT05TVEFOVF9QIGFy bV9sZWdpdGltYXRlX2NvbnN0YW50X3AKIApAQCAtMzQ0MTYsMTkgKzM0NDIyLDk3MSBAQCBhcm1f aW52YWxpZF93aXRoaW5fZG9sb29wIChjb25zdCBydHhfaW5zbiAqaW5zbikKIH0KIAogYm9vbAot YXJtX3RhcmdldF9pbnNuX29rX2Zvcl9sb2IgKHJ0eCBpbnNuKQorYXJtX3RhcmdldF9iYl9va19m b3JfbG9iIChiYXNpY19ibG9jayBiYikKIHsKLSAgYmFzaWNfYmxvY2sgYmIgPSBCTE9DS19GT1Jf SU5TTiAoaW5zbik7CiAgIC8qIE1ha2Ugc3VyZSB0aGUgYmFzaWMgYmxvY2sgb2YgdGhlIHRhcmdl dCBpbnNuIGlzIGEgc2ltcGxlIGxhdGNoCiAgICAgIGhhdmluZyBhcyBzaW5nbGUgcHJlZGVjZXNz b3IgYW5kIHN1Y2Nlc3NvciB0aGUgYm9keSBvZiB0aGUgbG9vcAogICAgICBpdHNlbGYuICBPbmx5 IHNpbXBsZSBsb29wcyB3aXRoIGEgc2luZ2xlIGJhc2ljIGJsb2NrIGFzIGJvZHkgYXJlCiAgICAg IHN1cHBvcnRlZCBmb3IgJ2xvdyBvdmVyIGhlYWQgbG9vcCcgbWFraW5nIHN1cmUgdGhhdCBMRSB0 YXJnZXQgaXMKICAgICAgYWJvdmUgTEUgaXRzZWxmIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gICov Ci0KICAgcmV0dXJuIHNpbmdsZV9zdWNjX3AgKGJiKQotICAgICYmIHNpbmdsZV9wcmVkX3AgKGJi KQotICAgICYmIHNpbmdsZV9zdWNjX2VkZ2UgKGJiKS0+ZGVzdCA9PSBzaW5nbGVfcHJlZF9lZGdl IChiYiktPnNyYwotICAgICYmIGNvbnRhaW5zX25vX2FjdGl2ZV9pbnNuX3AgKGJiKTsKKwkgJiYg c2luZ2xlX3ByZWRfcCAoYmIpCisJICYmIHNpbmdsZV9zdWNjX2VkZ2UgKGJiKS0+ZGVzdCA9PSBz aW5nbGVfcHJlZF9lZGdlIChiYiktPnNyYzsKK30KKworLyogVXRpbGl0eSBmdWN0aW9uOiBHaXZl biBhIFZDVFAgb3IgYSBWQ1RQX00gaW5zbiwgcmV0dXJuIHRoZSBudW1iZXIgb2YgTVZFCisgICBs YW5lcyBiYXNlZCBvbiB0aGUgbWFjaGluZSBtb2RlIGJlaW5nIHVzZWQuICAqLworCitzdGF0aWMg aW50Cithcm1fbXZlX2dldF92Y3RwX2xhbmVzIChydHggeCkKK3sKKyAgaWYgKEdFVF9DT0RFICh4 KSA9PSBTRVQgJiYgR0VUX0NPREUgKFhFWFAgKHgsIDEpKSA9PSBVTlNQRUMKKyAgICAgICYmIChY SU5UIChYRVhQICh4LCAxKSwgMSkgPT0gVkNUUCB8fCBYSU5UIChYRVhQICh4LCAxKSwgMSkgPT0g VkNUUF9NKSkKKyAgICB7CisgICAgICBtYWNoaW5lX21vZGUgbW9kZSA9IEdFVF9NT0RFIChYRVhQ ICh4LCAxKSk7CisgICAgICByZXR1cm4gKFZFQ1RPUl9NT0RFX1AgKG1vZGUpICYmIFZBTElEX01W RV9QUkVEX01PREUgKG1vZGUpKQorCSAgICAgPyBHRVRfTU9ERV9OVU5JVFMgKG1vZGUpIDogMDsK KyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBDaGVjayBpZiBJTlNOIHJlcXVpcmVzIHRoZSB1 c2Ugb2YgdGhlIFZQUiByZWcsIGlmIGl0IGRvZXMsIHJldHVybiB0aGUKKyAgIHN1Yi1ydHggb2Yg dGhlIFZQUiByZWcuICBUaGUgVFlQRSBhcmd1bWVudCBjb250cm9scyB3aGV0aGVyCisgICB0aGlz IGZ1bmN0aW9uIHNob3VsZDoKKyAgICogRm9yIFRZUEUgPT0gMCwgY2hlY2sgYWxsIG9wZXJhbmRz LCBpbmNsdWRpbmcgdGhlIE9VVCBvcGVyYW5kcywKKyAgICAgYW5kIHJldHVybiB0aGUgZmlyc3Qg b2NjdXJyZW5jZSBvZiB0aGUgVlBSIHJlZy4KKyAgICogRm9yIFRZUEUgPT0gMSwgb25seSBjaGVj ayB0aGUgaW5wdXQgb3BlcmFuZHMuCisgICAqIEZvciBUWVBFID09IDIsIG9ubHkgY2hlY2sgdGhl IG91dHB1dCBvcGVyYW5kcy4KKyAgIChJTk9VVCBvcGVyYW5kcyBhcmUgY29uc2lkZXJlZCBib3Ro IGFzIGlucHV0IGFuZCBvdXRwdXQgb3BlcmFuZHMpCisqLworc3RhdGljIHJ0eAorYXJtX2dldF9y ZXF1aXJlZF92cHJfcmVnIChydHhfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50IHR5cGUgPSAwKQor eworICBnY2NfYXNzZXJ0ICh0eXBlIDwgMyk7CisgIGlmICghTk9OSlVNUF9JTlNOX1AgKGluc24p KQorICAgIHJldHVybiBOVUxMX1JUWDsKKworICBib29sIHJlcXVpcmVzX3ZwcjsKKyAgZXh0cmFj dF9jb25zdHJhaW5faW5zbiAoaW5zbik7CisgIGludCBuX29wZXJhbmRzID0gcmVjb2dfZGF0YS5u X29wZXJhbmRzOworICBpZiAocmVjb2dfZGF0YS5uX2FsdGVybmF0aXZlcyA9PSAwKQorICAgIHJl dHVybiBOVUxMX1JUWDsKKworICAvKiBGaWxsIGluIHJlY29nX29wX2FsdCB3aXRoIGluZm9ybWF0 aW9uIGFib3V0IHRoZSBjb25zdHJhaW50cyBvZgorICAgICB0aGlzIGluc24uICAqLworICBwcmVw cm9jZXNzX2NvbnN0cmFpbnRzIChpbnNuKTsKKworICBmb3IgKGludCBvcCA9IDA7IG9wIDwgbl9v cGVyYW5kczsgb3ArKykKKyAgICB7CisgICAgICByZXF1aXJlc192cHIgPSB0cnVlOworICAgICAg aWYgKHR5cGUgPT0gMSAmJiByZWNvZ19kYXRhLm9wZXJhbmRfdHlwZVtvcF0gPT0gT1BfT1VUKQor CWNvbnRpbnVlOworICAgICAgZWxzZSBpZiAodHlwZSA9PSAyICYmIHJlY29nX2RhdGEub3BlcmFu ZF90eXBlW29wXSA9PSBPUF9JTikKKwljb250aW51ZTsKKworICAgICAgLyogSXRlcmF0ZSB0aHJv dWdoIGFsdGVybmF0aXZlcyBvZiBvcGVyYW5kICJvcCIgaW4gcmVjb2dfb3BfYWx0IGFuZAorCSBp ZGVudGlmeSBpZiB0aGUgb3BlcmFuZCBpcyByZXF1aXJlZCB0byBiZSB0aGUgVlBSLiAgKi8KKyAg ICAgIGZvciAoaW50IGFsdCA9IDA7IGFsdCA8IHJlY29nX2RhdGEubl9hbHRlcm5hdGl2ZXM7IGFs dCsrKQorCXsKKwkgIGNvbnN0IG9wZXJhbmRfYWx0ZXJuYXRpdmUgKm9wX2FsdAorCSAgICAgID0g JnJlY29nX29wX2FsdFthbHQgKiBuX29wZXJhbmRzXTsKKwkgIC8qIEZldGNoIHRoZSByZWdfY2xh c3MgZm9yIGVhY2ggZW50cnkgYW5kIGNoZWNrIGl0IGFnYWluc3QgdGhlCisJICAgICBWUFJfUkVH IHJlZ19jbGFzcy4gICovCisJICBpZiAoYWx0ZXJuYXRpdmVfY2xhc3MgKG9wX2FsdCwgb3ApICE9 IFZQUl9SRUcpCisJICAgIHJlcXVpcmVzX3ZwciA9IGZhbHNlOworCX0KKyAgICAgIC8qIElmIGFs bCBhbHRlcm5hdGl2ZXMgb2YgdGhlIGluc24gcmVxdWlyZSB0aGUgVlBSIHJlZyBmb3IgdGhpcyBv cGVyYW5kLAorCSBpdCBtZWFucyB0aGF0IGVpdGhlciB0aGlzIGlzIFZQUi1nZW5lcmF0aW5nIGlu c3RydWN0aW9uLCBsaWtlIGEgdmN0cCwKKwkgdmNtcCwgZXRjLiwgb3IgaXQgaXMgYSBWUFQtcHJl ZGljYXRlZCBpbnNydWN0aW9uLiAgUmV0dXJuIHRoZSBzdWJydHgKKwkgb2YgdGhlIFZQUiByZWcg b3BlcmFuZC4gICovCisgICAgICBpZiAocmVxdWlyZXNfdnByKQorCXJldHVybiByZWNvZ19kYXRh Lm9wZXJhbmRbb3BdOworICAgIH0KKyAgcmV0dXJuIE5VTExfUlRYOworfQorCisvKiBXcmFwcGVy IGZ1bmN0aW9uIG9mIGFybV9nZXRfcmVxdWlyZWRfdnByX3JlZyB3aXRoIFRZUEUgPT0gMSwgc28g cmV0dXJuCisgICBzb21ldGhpbmcgb25seSBpZiB0aGUgVlBSIHJlZyBpcyBhbiBpbnB1dCBvcGVy YW5kIHRvIHRoZSBpbnNuLiAgKi8KKworc3RhdGljIHJ0eAorQUxXQVlTX0lOTElORQorYXJtX2dl dF9yZXF1aXJlZF92cHJfcmVnX3BhcmFtIChydHhfaW5zbiAqaW5zbikKK3sKKyAgcmV0dXJuIGFy bV9nZXRfcmVxdWlyZWRfdnByX3JlZyAoaW5zbiwgMSk7Cit9CisKKy8qIFdyYXBwZXIgZnVuY3Rp b24gb2YgYXJtX2dldF9yZXF1aXJlZF92cHJfcmVnIHdpdGggVFlQRSA9PSAyLCBzbyByZXR1cm4K KyAgIHNvbWV0aGluZyBvbmx5IGlmIHRoZSBWUFIgcmVnIGlzIHRoZSByZXR1cm4gdmFsdWUsIGFu IG91dHB1dCBvZiwgb3IgaXMKKyAgIGNsb2JiZXJlZCBieSB0aGUgaW5zbi4gICovCisKK3N0YXRp YyBydHgKK0FMV0FZU19JTkxJTkUKK2FybV9nZXRfcmVxdWlyZWRfdnByX3JlZ19yZXRfdmFsIChy dHhfaW5zbiAqaW5zbikKK3sKKyAgcmV0dXJuIGFybV9nZXRfcmVxdWlyZWRfdnByX3JlZyAoaW5z biwgMik7Cit9CisKKy8qIFNjYW4gdGhlIGJhc2ljIGJsb2NrIG9mIGEgbG9vcCBib2R5IGZvciBh IHZjdHAgaW5zdHJ1Y3Rpb24uICBJZiB0aGVyZSBpcworICAgYXQgbGVhc3QgdmN0cCBpbnN0cnVj dGlvbiwgcmV0dXJuIHRoZSBmaXJzdCBydHhfaW5zbiAqLiAgKi8KKworc3RhdGljIHJ0eF9pbnNu ICoKK2FybV9tdmVfZ2V0X2xvb3BfdmN0cCAoYmFzaWNfYmxvY2sgYmIpCit7CisgIHJ0eF9pbnNu ICppbnNuID0gQkJfSEVBRCAoYmIpOworCisgIC8qIE5vdyBzY2FuIHRocm91Z2ggYWxsIHRoZSBp bnN0cnVjdGlvbiBwYXR0ZXJucyBhbmQgcGljayBvdXQgdGhlIFZDVFAKKyAgICAgaW5zdHJ1Y3Rp b24uICBXZSByZXF1aXJlIGFybV9nZXRfcmVxdWlyZWRfdnByX3JlZ19wYXJhbSB0byBiZSBmYWxz ZQorICAgICB0byBtYWtlIHN1cmUgd2UgcGljayB1cCBhIFZDVFAsIHJhdGhlciB0aGFuIGEgVkNU UF9NLiAgKi8KKyAgRk9SX0JCX0lOU05TIChiYiwgaW5zbikKKyAgICBpZiAoTk9OREVCVUdfSU5T Tl9QIChpbnNuKSkKKyAgICAgIGlmIChhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWdfcmV0X3ZhbCAo aW5zbikKKwkgICYmIChhcm1fbXZlX2dldF92Y3RwX2xhbmVzIChQQVRURVJOIChpbnNuKSkgIT0g MCkKKwkgICYmICFhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWdfcGFyYW0gKGluc24pKQorCXJldHVy biBpbnNuOworICByZXR1cm4gTlVMTDsKK30KKworLyogUmV0dXJuIHRydWUgaWYgSU5TTiBpcyBh IE1WRSBpbnN0cnVjdGlvbiB0aGF0IGlzIFZQVC1wcmVkaWNhYmxlLCBidXQgaW4KKyAgIGl0cyB1 bnByZWRpY2F0ZWQgZm9ybSwgb3IgaWYgaXQgaXMgcHJlZGljYXRlZCwgYnV0IG9uIGEgcHJlZGlj YXRlIG90aGVyCisgICB0aGFuIFZQUl9SRUcuICAqLworCitzdGF0aWMgYm9vbAorYXJtX212ZV92 ZWNfaW5zbl9pc191bnByZWRpY2F0ZWRfb3JfdXNlc19vdGhlcl9wcmVkaWNhdGUgKHJ0eF9pbnNu ICppbnNuLAorCQkJCQkJCSAgcnR4IHZwcl9yZWcpCit7CisgIHJ0eCBpbnNuX3Zwcl9yZWdfb3Bl cmFuZDsKKyAgaWYgKE1WRV9WUFRfVU5QUkVESUNBVEVEX0lOU05fUCAoaW5zbikKKyAgICAgIHx8 IChNVkVfVlBUX1BSRURJQ0FURURfSU5TTl9QIChpbnNuKQorCSAgJiYgKGluc25fdnByX3JlZ19v cGVyYW5kID0gYXJtX2dldF9yZXF1aXJlZF92cHJfcmVnX3BhcmFtIChpbnNuKSkKKwkgICYmICFy dHhfZXF1YWxfcCAodnByX3JlZywgaW5zbl92cHJfcmVnX29wZXJhbmQpKSkKKyAgICByZXR1cm4g dHJ1ZTsKKyAgZWxzZQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wKK2FybV9t dmVfdmVjX2luc25faXNfcHJlZGljYXRlZF93aXRoX3RoaXNfcHJlZGljYXRlIChydHhfaW5zbiAq aW5zbiwKKwkJCQkJCSAgICBydHggdnByX3JlZykKK3sKKyAgcnR4IGluc25fdnByX3JlZ19vcGVy YW5kOworICBpZiAoTVZFX1ZQVF9QUkVESUNBVEVEX0lOU05fUCAoaW5zbikKKyAgICAgICYmIChp bnNuX3Zwcl9yZWdfb3BlcmFuZCA9IGFybV9nZXRfcmVxdWlyZWRfdnByX3JlZ19wYXJhbSAoaW5z bikpCisgICAgICAmJiBydHhfZXF1YWxfcCAodnByX3JlZywgaW5zbl92cHJfcmVnX29wZXJhbmQp KQorICAgIHJldHVybiB0cnVlOworICBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKiBV dGlsaXR5IGZ1bmN0aW9uIHRvIGlkZW50aWZ5IGlmIElOU04gaXMgYW4gTVZFIGluc3RydWN0aW9u IHRoYXQgcGVyZm9ybXMKKyAgIHNvbWUgYWNyb3NzLXZlY3RvciBvcGVyYXRpb24gKGFuZCBhcyBh IHJlc3VsdCBkb2VzIG5vdCBhbGlnbiB3aXRoIG5vcm1hbAorICAgbGFuZSBwcmVkaWNhdGlvbiBy dWxlcykuICBBbGwgc3VjaCBpbnN0cnVjdGlvbnMgZ2l2ZSBvbmUgb25seSBzY2FsYXIKKyAgIG91 dHB1dCwgZXhjZXB0IGZvciB2c2hsY3Egd2hpY2ggZ2l2ZXMgYSBQQVJBTExFTCBvZiB0d28gc2Nh bGFyIG91dHB1dHMKKyAgIChvbmUgcmVzdWx0IGFuZCBvbmUgY2Fycnkgb3V0cHV0KS4gICovCisK K3N0YXRpYyBib29sCithcm1faXNfbXZlX2Fjcm9zc192ZWN0b3JfaW5zbiAocnR4X2luc24qIGlu c24pCit7CisgIGRmX3JlZiBpbnNuX2RlZnMgPSBOVUxMOworICBpZiAoIU1WRV9WUFRfUFJFRElD QUJMRV9JTlNOX1AgKGluc24pKQorICAgIHJldHVybiBmYWxzZTsKKworICBib29sIGlzX2Fjcm9z c192ZWN0b3IgPSBmYWxzZTsKKyAgRk9SX0VBQ0hfSU5TTl9ERUYgKGluc25fZGVmcywgaW5zbikK KyAgICBpZiAoIVZBTElEX01WRV9NT0RFIChHRVRfTU9ERSAoREZfUkVGX1JFRyAoaW5zbl9kZWZz KSkpKQorICAgICAgaXNfYWNyb3NzX3ZlY3RvciA9IHRydWU7CisKKyAgcmV0dXJuIGlzX2Fjcm9z c192ZWN0b3I7Cit9CisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gaWRlbnRpZnkgaWYgSU5TTiBp cyBhbiBNVkUgbG9hZCBvciBzdG9yZSBpbnN0cnVjdGlvbi4KKyAgICogRm9yIFRZUEUgPT0gMCwg Y2hlY2sgYWxsIG9wZXJhbmRzLiAgSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwKKyAgICAg SU5TTiBpcyBhIGxvYWQgb3IgYSBzdG9yZSBpbnNuLgorICAgKiBGb3IgVFlQRSA9PSAxLCBvbmx5 IGNoZWNrIHRoZSBpbnB1dCBvcGVyYW5kcy4gIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zCisgICAg IHRydWUsIElOU04gaXMgYSBsb2FkIGluc24uCisgICAqIEZvciBUWVBFID09IDIsIG9ubHkgY2hl Y2sgdGhlIG91dHB1dCBvcGVyYW5kcy4gIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zCisgICAgIHRy dWUsIElOU04gaXMgYSBzdG9yZSBpbnNuLiAgKi8KKworc3RhdGljIGJvb2wKK2FybV9pc19tdmVf bG9hZF9zdG9yZV9pbnNuIChydHhfaW5zbiogaW5zbiwgaW50IHR5cGUgPSAwKQoreworICBpbnQg bl9vcGVyYW5kcyA9IHJlY29nX2RhdGEubl9vcGVyYW5kczsKKyAgZXh0cmFjdF9pbnNuIChpbnNu KTsKKworICBmb3IgKGludCBvcCA9IDA7IG9wIDwgbl9vcGVyYW5kczsgb3ArKykKKyAgICB7Cisg ICAgICBpZiAodHlwZSA9PSAxICYmIHJlY29nX2RhdGEub3BlcmFuZF90eXBlW29wXSA9PSBPUF9P VVQpCisJY29udGludWU7CisgICAgICBlbHNlIGlmICh0eXBlID09IDIgJiYgcmVjb2dfZGF0YS5v cGVyYW5kX3R5cGVbb3BdID09IE9QX0lOKQorCWNvbnRpbnVlOworICAgICAgaWYgKG12ZV9tZW1v cnlfb3BlcmFuZCAocmVjb2dfZGF0YS5vcGVyYW5kW29wXSwKKwkJCSAgICAgIEdFVF9NT0RFIChy ZWNvZ19kYXRhLm9wZXJhbmRbb3BdKSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIHJl dHVybiBmYWxzZTsKK30KKworLyogUmVjdXJzaXZlbHkgc2NhbiB0aHJvdWdoIHRoZSBERiBjaGFp biBiYWNrd2FyZHMgd2l0aGluIHRoZSBiYXNpYyBibG9jayBhbmQKKyAgIGRldGVybWluZSBpZiBh bnkgb2YgdGhlIFVTRXMgb2YgdGhlIG9yaWdpbmFsIGluc24gKG9yIHRoZSBVU0VzIG9mIHRoZSBp bnNucworICAgd2hlcmUgdGh5IHdlcmUgREVGLWVkLCBldGMuLCByZWN1cnNpdmVseSkgd2VyZSBh ZmZlY3RlZCBieSBpbXBsaWNpdCBWUFQKKyAgIHByZWRpY2F0aW9uIG9mIGFuIE1WRV9WUFRfVU5Q UkVESUNBVEVEX0lOU05fUCBpbiBhIGRsc3RwL2xldHAgbG9vcC4KKyAgIEhhdmluZyBzdWNoIGlt cGxpY2l0IHByZWRpY2F0aW9uIG9uIGFuIHVucHJlZGljYXRlZCBpbnNuIGlzbid0IGluIGl0c2Vs ZgorICAgYW4gZXJyb3IsIGJlY2F1c2UgdGhlIG91dHB1dCBvZiB0aGF0IGluc24gbWlnaHQgdGhl biBiZSB1c2VkIGluIGEgY29ycmVjdGx5CisgICBwcmVkaWNhdGVkIHN0b3JlIGluc24sIHdoZXJl IHRoZSBkaXNhYmxlZCBsYW5lcyB3aWxsIGJlIGlnbm9yZWQuICBUbyB2ZXJpZnkKKyAgIHRoaXMg d2UgbGF0ZXIgY2FsbCBhcm1fbXZlX2NoZWNrX2RmX2NoYWluX2Z3ZF9mb3JfaW1wbGljX3ByZWRp Y19pbXBhY3QsCisgICB3aGljaCB3aWxsIGNoZWNrIHRoZSBERiBjaGFpbnMgZm9yd2FyZCB0byBz ZWUgaWYgYW55IGltcGxpY2l0bHktcHJlZGljYXRlZAorICAgb3BlcmFuZCBnZXRzIHVzZWQgaW4g YW4gaW1wcm9wZXIgd2F5LiAgKi8KKworc3RhdGljIGJvb2wKK2FybV9tdmVfY2hlY2tfZGZfY2hh aW5fYmFja19mb3JfaW1wbGljX3ByZWRpYyAocnR4X2luc24gKmluc24sCisJCQkJCSAgICAgICBy dHggdmN0cF92cHJfZ2VuZXJhdGVkKQoreworICBiYXNpY19ibG9jayBib2R5ID0gQkxPQ0tfRk9S X0lOU04gKGluc24pOworICAvKiBUaGUgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaCBhbiBpbnN0 cnVjdGlvbiBpcyBhZmZlY3RlZCBieSAiaW1wbGljaXQKKyAgICAgcHJlZGljYXRpb24iIGFyZSBh cyBmb2xsb3dzOgorICAgICAgKiBJdCBpcyBhbiBVTlBSRURJQ0FURURfSU5TTl9QOgorCSogVGhh dCBsb2Fkcy9zdG9yZXMgZnJvbS90byBtZW1vcnkuCisJKiBXaGVyZSBhbnkgb25lIG9mIGl0cyBv cGVyYW5kcyBpcyBhbiBNVkUgdmVjdG9yIGZyb20gb3V0c2lkZSB0aGUKKwkgIGxvb3AgYm9keSBi Yi4KKyAgICAgT3I6CisgICAgICAqIEFueSBvZiBpdCdzIG9wZXJhbmRzLCByZWN1cnNpdmVseSBi YWNrd2FyZHMsIGFyZSBhZmZlY3RlZC4gICovCisgIGlmIChNVkVfVlBUX1VOUFJFRElDQVRFRF9J TlNOX1AgKGluc24pICYmIGFybV9pc19tdmVfbG9hZF9zdG9yZV9pbnNuIChpbnNuKSkKKyAgICBy ZXR1cm4gdHJ1ZTsKKworICBkZl9yZWYgaW5zbl91c2VzID0gTlVMTDsKKyAgRk9SX0VBQ0hfSU5T Tl9VU0UgKGluc25fdXNlcywgaW5zbikKKyAgeworICAgIC8qIElmIHRoZSBvcGVyYW5kIGlzIGlu IHRoZSBpbnB1dCByZWcgc2V0IHRvIHRoZSB0aGUgYmFzaWMgYmxvY2ssCisgICAgICAgKGkuZS4g aXQgaGFzIGNvbWUgZnJvbSBvdXRzaWRlIHRoZSBsb29wISksIGNvbnNpZGVyIGl0IHVuc2FmZSBp ZjoKKwkgKiBJdCdzIGJlaW5nIHVzZWQgaW4gYW4gdW5wcmVkaWNhdGVkIGluc24uCisJICogSXQg aXMgYSBwcmVkaWNhYmxlIE1WRSB2ZWN0b3IuICAqLworICAgIGlmIChNVkVfVlBUX1VOUFJFRElD QVRFRF9JTlNOX1AgKGluc24pCisJJiYgVkFMSURfTVZFX01PREUgKEdFVF9NT0RFIChERl9SRUZf UkVHIChpbnNuX3VzZXMpKSkKKwkmJiBSRUdOT19SRUdfU0VUX1AgKERGX0xSX0lOIChib2R5KSwg REZfUkVGX1JFR05PIChpbnNuX3VzZXMpKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLyog U2NhbiBiYWNrd2FyZHMgZnJvbSB0aGUgY3VycmVudCBJTlNOIHRocm91Z2ggdGhlIGluc3RydWN0 aW9uIGNoYWluCisgICAgICAgdW50aWwgdGhlIHN0YXJ0IG9mIHRoZSBiYXNpYyBibG9jay4gICov CisgICAgZm9yIChydHhfaW5zbiAqcHJldl9pbnNuID0gUFJFVl9JTlNOIChpbnNuKTsKKwkgcHJl dl9pbnNuICYmIHByZXZfaW5zbiAhPSBQUkVWX0lOU04gKEJCX0hFQUQgKGJvZHkpKTsKKwkgcHJl dl9pbnNuID0gUFJFVl9JTlNOIChwcmV2X2luc24pKQorICAgICAgeworCS8qIElmIGEgcHJldmlv dXMgaW5zbiBkZWZpbmVzIGEgcmVnaXN0ZXIgdGhhdCBJTlNOIHVzZXMsIHRoZW4gcmVjdXJzZQor CSAgIGluIG9yZGVyIHRvIGNoZWNrIHRoYXQgaW5zbidzIFVTRXMuCisJICAgSWYgYW55IG9mIHRo ZXNlIGluc25zIHJldHVybiB0cnVlIGFzIE1WRV9WUFRfVU5QUkVESUNBVEVEX0lOU05fUHMsCisJ ICAgdGhlbiB0aGUgd2hvbGUgY2hhaW4gaXMgYWZmZWN0ZWQgYnkgdGhlIGNoYW5nZSBpbiBiZWhh dmlvdXIgZnJvbQorCSAgIGJlaW5nIHBsYWNlZCBpbiBkbHN0cC9sZXRwIGxvb3AuICAqLworCWRm X3JlZiBwcmV2X2luc25fZGVmcyA9IE5VTEw7CisJRk9SX0VBQ0hfSU5TTl9ERUYgKHByZXZfaW5z bl9kZWZzLCBwcmV2X2luc24pCisJeworCSAgaWYgKERGX1JFRl9SRUdOTyAoaW5zbl91c2VzKSA9 PSBERl9SRUZfUkVHTk8gKHByZXZfaW5zbl9kZWZzKQorCSAgICAgICYmICFhcm1fbXZlX3ZlY19p bnNuX2lzX3ByZWRpY2F0ZWRfd2l0aF90aGlzX3ByZWRpY2F0ZQorCQkgICAoaW5zbiwgdmN0cF92 cHJfZ2VuZXJhdGVkKQorCSAgICAgICYmIGFybV9tdmVfY2hlY2tfZGZfY2hhaW5fYmFja19mb3Jf aW1wbGljX3ByZWRpYworCQkgIChwcmV2X2luc24sIHZjdHBfdnByX2dlbmVyYXRlZCkpCisJICAg IHJldHVybiB0cnVlOworCX0KKyAgICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8q IElmIHdlIGhhdmUgaWRlbnRpZmllZCB0aGF0IHRoZSBjdXJyZW50IERFRiB3aWxsIGJlIG1vZGlm aWVkCisgICBieSBzdWNoIGltcGxpY2l0IHByZWRpY2F0aW9uLCBzY2FuIHRocm91Z2ggYWxsIHRo ZQorICAgaW5zbnMgdGhhdCBVU0UgaXQgYW5kIGJhaWwgb3V0IGlmIGFueSBvbmUgaXMgb3V0c2lk ZSB0aGUKKyAgIGN1cnJlbnQgYmFzaWMgYmxvY2sgKGkuZS4gdGhlIHJlZyBpcyBsaXZlIGFmdGVy IHRoZSBsb29wKQorICAgb3IgaWYgYW55IGFyZSBzdG9yZSBpbnNucyB0aGF0IGFyZSB1bnByZWRp Y2F0ZWQgb3IgdXNpbmcgYQorICAgcHJlZGljYXRlIG90aGVyIHRoYW4gdGhlIGxvb3AgVlBSLiAg Ki8KKworc3RhdGljIGJvb2wKK2FybV9tdmVfY2hlY2tfZGZfY2hhaW5fZndkX2Zvcl9pbXBsaWNf cHJlZGljX2ltcGFjdCAocnR4X2luc24gKmluc24sCisJCQkJCQkgICAgIHJ0eCB2Y3RwX3Zwcl9n ZW5lcmF0ZWQpCit7CisKKyAgLyogSWYgdGhpcyBpbnNuIGlzIGluZGVlZCBhbiB1bnByZWRpY2F0 ZWQgc3RvcmUgdG8gbWVtb3J5LCBiYWlsIG91dC4gICovCisgIGlmIChhcm1fbXZlX3ZlY19pbnNu X2lzX3VucHJlZGljYXRlZF9vcl91c2VzX290aGVyX3ByZWRpY2F0ZQorCShpbnNuLCB2Y3RwX3Zw cl9nZW5lcmF0ZWQpCisgICAgICAmJiBhcm1faXNfbXZlX2xvYWRfc3RvcmVfaW5zbiAoaW5zbiwg MikpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogTmV4dCwgc2NhbiBmb3J3YXJkIHRvIHRoZSB2 YXJpb3VzIFVTRXMgb2YgdGhlIERFRnMgaW4gdGhpcyBpbnNuLiAgKi8KKyAgZGZfcmVmIGluc25f ZGVmID0gTlVMTDsKKyAgRk9SX0VBQ0hfSU5TTl9ERUYgKGluc25fZGVmLCBpbnNuKQorICAgIHsK KyAgICAgIGZvciAoZGZfcmVmIHVzZSA9IERGX1JFR19VU0VfQ0hBSU4gKERGX1JFRl9SRUdOTyAo aW5zbl9kZWYpKTsgdXNlOworCSAgIHVzZSA9IERGX1JFRl9ORVhUX1JFRyAodXNlKSkKKwl7CisJ ICBydHhfaW5zbiAqbmV4dF91c2VfaW5zbiA9IERGX1JFRl9JTlNOICh1c2UpOworCSAgaWYgKG5l eHRfdXNlX2luc24gIT0gaW5zbgorCSAgICAgICYmIE5PTkRFQlVHX0lOU05fUCAobmV4dF91c2Vf aW5zbikpCisJICAgIHsKKwkgICAgICAvKiBJZiB0aGUgVVNFIGlzIG91dHNpZGUgdGhlIGxvb3Ag Ym9keSBiYiwgb3IgaXQgaXMgaW5zaWRlLCBidXQKKwkJIGlzIGFuIGRpZmZlcmVudGx5LXByZWRp Y2F0ZWQgc3RvcmUgdG8gbWVtb3J5IG9yIGl0IGlzIGFueQorCQkgYWNyb3NzLXZlY3RvciBpbnN0 cnVjdGlvbi4gICovCisJICAgICAgaWYgKEJMT0NLX0ZPUl9JTlNOIChpbnNuKSAhPSBCTE9DS19G T1JfSU5TTiAobmV4dF91c2VfaW5zbikKKwkJICB8fCAoYXJtX212ZV92ZWNfaW5zbl9pc191bnBy ZWRpY2F0ZWRfb3JfdXNlc19vdGhlcl9wcmVkaWNhdGUKKwkJICAgICAgIChuZXh0X3VzZV9pbnNu LCB2Y3RwX3Zwcl9nZW5lcmF0ZWQpCisJCSAgICAgJiYgKGFybV9pc19tdmVfbG9hZF9zdG9yZV9p bnNuIChuZXh0X3VzZV9pbnNuLCAyKQorCQkJIHx8IGFybV9pc19tdmVfYWNyb3NzX3ZlY3Rvcl9p bnNuIChuZXh0X3VzZV9pbnNuKSkpKQorCQlyZXR1cm4gdHJ1ZTsKKwkgICAgfQorCX0KKyAgICB9 CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wKK2FybV9tdmVfY2hlY2tfcmVnX29y aWdpbl9pc19udW1fZWxlbXMgKGJhc2ljX2Jsb2NrIGJvZHksIHJ0eCByZWcsIHJ0eCB2Y3RwX3N0 ZXApCit7CisgIC8qIE9rLCB3ZSBub3cga25vdyB0aGUgbG9vcCBzdGFydHMgZnJvbSB6ZXJvIGFu ZCBpbmNyZW1lbnRzIGJ5IG9uZS4KKyAgICAgTm93IGp1c3Qgc2hvdyB0aGF0IHRoZSBtYXggdmFs dWUgb2YgdGhlIGNvdW50ZXIgY2FtZSBmcm9tIGFuCisgICAgIGFwcHJvcHJpYXRlIEFTSElGUlQg ZXhwciBvZiB0aGUgY29ycmVjdCBhbW91bnQuICAqLworICBiYXNpY19ibG9jayBwcmVfbG9vcF9i YiA9IGJvZHktPnByZXZfYmI7CisgIHdoaWxlIChwcmVfbG9vcF9iYiAmJiBCQl9FTkQgKHByZV9s b29wX2JiKQorCSAmJiAhZGZfYmJfcmVnbm9fb25seV9kZWZfZmluZCAocHJlX2xvb3BfYmIsIFJF R05PIChyZWcpKSkKKyAgICBwcmVfbG9vcF9iYiA9IHByZV9sb29wX2JiLT5wcmV2X2JiOworCisg IGRmX3JlZiBjb3VudGVyX21heF9sYXN0X2RlZiA9IGRmX2JiX3JlZ25vX29ubHlfZGVmX2ZpbmQg KHByZV9sb29wX2JiLCBSRUdOTyAocmVnKSk7CisgIHJ0eCBjb3VudGVyX21heF9sYXN0X3NldDsK KyAgaWYgKGNvdW50ZXJfbWF4X2xhc3RfZGVmKQorICAgIGNvdW50ZXJfbWF4X2xhc3Rfc2V0ID0g UEFUVEVSTiAoREZfUkVGX0lOU04gKGNvdW50ZXJfbWF4X2xhc3RfZGVmKSk7CisgIGVsc2UKKyAg ICByZXR1cm4gZmFsc2U7CisKKyAgLyogSWYgd2UgZW5jb3VudGVyIGEgc2ltcGxlIFNFVCBmcm9t IGEgUkVHLCBmb2xsb3cgaXQgdGhyb3VnaC4gICovCisgIGlmIChHRVRfQ09ERSAoY291bnRlcl9t YXhfbGFzdF9zZXQpID09IFNFVAorICAgICAgJiYgUkVHX1AgKFhFWFAgKGNvdW50ZXJfbWF4X2xh c3Rfc2V0LCAxKSkpCisgICAgcmV0dXJuIGFybV9tdmVfY2hlY2tfcmVnX29yaWdpbl9pc19udW1f ZWxlbXMKKwkgICAgIChwcmVfbG9vcF9iYiwgWEVYUCAoY291bnRlcl9tYXhfbGFzdF9zZXQsIDEp LCB2Y3RwX3N0ZXApOworCisgIGlmIChHRVRfQ09ERSAoWEVYUCAoY291bnRlcl9tYXhfbGFzdF9z ZXQsIDEpKSA9PSBBU0hJRlRSVAorICAgICAgJiYgQ09OU1RfSU5UX1AgKFhFWFAgKFhFWFAgKGNv dW50ZXJfbWF4X2xhc3Rfc2V0LCAxKSwgMSkpCisgICAgICAmJiAoKDEgPDwgSU5UVkFMIChYRVhQ IChYRVhQIChjb3VudGVyX21heF9sYXN0X3NldCwgMSksIDEpKSkKKwkgICA9PSBhYnMgKElOVFZB TCAodmN0cF9zdGVwKSkpKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30K KworLyogSWYgd2UgaGF2ZSBpZGVudGlmaWVkIHRoZSBsb29wIHRvIGhhdmUgYW4gaW5jcmVtZW50 aW5nIGNvdW50ZXIsIHdlIG5lZWQgdG8KKyAgIG1ha2Ugc3VyZSB0aGF0IGl0IGluY3JlbWVudHMg YnkgMSBhbmQgdGhhdCB0aGUgbG9vcCBpcyBzdHJ1Y3R1cmVkIGNvcnJlY3RseToKKyAgICAqIFRo ZSBjb3VudGVyIHN0YXJ0cyBmcm9tIDAKKyAgICAqIFRoZSBjb3VudGVyIHRlcm1pbmF0ZXMgYXQg KG51bV9vZl9lbGVtICsgbnVtX29mX2xhbmVzIC0gMSkgLyBudW1fb2ZfbGFuZXMKKyAgICAqIFRo ZSB2Y3RwIGluc24gdXNlcyBhIHJlZyB0aGF0IGRlY3JlbWVudHMgYXBwcm9wcmlhdGVseSBpbiBl YWNoIGl0ZXJhdGlvbi4KKyovCisKK3N0YXRpYyBydHhfaW5zbioKK2FybV9tdmVfZGxzdHBfY2hl Y2tfaW5jX2NvdW50ZXIgKGJhc2ljX2Jsb2NrIGJvZHksIHJ0eF9pbnNuKiB2Y3RwX2luc24sCisJ CQkJIHJ0eCBjb25kY29uc3QsIHJ0eCBjb25kY291bnQpCit7CisgIHJ0eCB2Y3RwX3JlZyA9IFhW RUNFWFAgKFhFWFAgKFBBVFRFUk4gKHZjdHBfaW5zbiksIDEpLCAwLCAwKTsKKyAgLyogVGhlIGxv b3AgbGF0Y2ggaGFzIHRvIGJlIGVtcHR5LiAgV2hlbiBjb21waWxpbmcgYWxsIHRoZSBrbm93biBN VkUgTG9McyBpbgorICAgICB1c2VyIGFwcGxpY2F0aW9ucywgbm9uZSBvZiB0aG9zZSB3aXRoIGlu Y3JlbWVudGluZyBjb3VudGVycyBoYWQgYW55IHJlYWwKKyAgICAgaW5zbnMgaW4gdGhlIGxvb3Ag bGF0Y2guICBBcyBzdWNoLCB0aGlzIGZ1bmN0aW9uIGhhcyBvbmx5IGJlZW4gdGVzdGVkIHdpdGgK KyAgICAgYW4gZW1wdHkgbGF0Y2ggYW5kIG1heSBtaXNiZWhhdmUgb3IgSUNFIGlmIHdlIHNvbWVo b3cgZ2V0IGhlcmUgd2l0aCBhbgorICAgICBpbmNyZW1lbnQgaW4gdGhlIGxhdGNoLCBzbywgZm9y IGNvcnJlY3RuZXNzLCBlcnJvciBvdXQgZWFybHkuICAqLworICBydHhfaW5zbiAqZGVjX2luc24g PSBCQl9FTkQgKGJvZHktPmxvb3BfZmF0aGVyLT5sYXRjaCk7CisgIGlmIChOT05ERUJVR19JTlNO X1AgKGRlY19pbnNuKSkKKyAgICByZXR1cm4gTlVMTDsKKworICBjbGFzcyBydHhfaXYgdmN0cF9y ZWdfaXY7CisgIC8qIEZvciBsb29wcyBvZiB0eXBlIEIpIHRoZSBsb29wIGNvdW50ZXIgaXMgaW5k ZXBlbmRlbnQgb2YgdGhlIGRlY3JlbWVudAorICAgICBvZiB0aGUgcmVnIHVzZWQgaW4gdGhlIHZj dHBfaW5zbi4gU28gcnVuIGl2IGFuYWx5c2lzIG9uIHRoYXQgcmVnLiAgVGhpcworICAgICBoYXMg dG8gc3VjY2VlZCBmb3Igc3VjaCBsb29wcyB0byBiZSBzdXBwb3J0ZWQuICAqLworICBpZiAoIWl2 X2FuYWx5emUgKHZjdHBfaW5zbiwgYXNfYTxzY2FsYXJfaW50X21vZGU+IChHRVRfTU9ERSAodmN0 cF9yZWcpKSwKKyAgICAgIHZjdHBfcmVnLCAmdmN0cF9yZWdfaXYpKQorICAgIHJldHVybiBOVUxM OworCisgIC8qIEZpbmQgd2hlcmUgYm90aCBvZiB0aG9zZSBhcmUgbW9kaWZpZWQgaW4gdGhlIGxv b3AgYm9keSBiYi4gICovCisgIHJ0eCBjb25kY291bnRfcmVnX3NldAorCT0gUEFUVEVSTiAoREZf UkVGX0lOU04gKGRmX2JiX3JlZ25vX29ubHlfZGVmX2ZpbmQKKwkJCQkgKGJvZHksIFJFR05PIChj b25kY291bnQpKSkpOworICBydHggdmN0cF9yZWdfc2V0ID0gUEFUVEVSTiAoREZfUkVGX0lOU04g KGRmX2JiX3JlZ25vX29ubHlfZGVmX2ZpbmQKKwkJCQkJICAgIChib2R5LCBSRUdOTyAodmN0cF9y ZWcpKSkpOworICBpZiAoIXZjdHBfcmVnX3NldCB8fCAhY29uZGNvdW50X3JlZ19zZXQpCisgICAg cmV0dXJuIE5VTEw7CisKKyAgaWYgKFJFR19QIChjb25kY291bnQpICYmIFJFR19QIChjb25kY29u c3QpKQorICAgIHsKKyAgICAgIC8qIEZpcnN0IHdlIG5lZWQgdG8gcHJvdmUgdGhhdCB0aGUgbG9v cCBpcyBnb2luZyAwLi5jb25kY29uc3Qgd2l0aCBhbgorCSBpbmMgb2YgMSBpbiBlYWNoIGl0ZXJh dGlvbi4gICovCisgICAgICBpZiAoR0VUX0NPREUgKFhFWFAgKGNvbmRjb3VudF9yZWdfc2V0LCAx KSkgPT0gUExVUworCSAgJiYgQ09OU1RfSU5UX1AgKFhFWFAgKFhFWFAgKGNvbmRjb3VudF9yZWdf c2V0LCAxKSwgMSkpCisJICAmJiBJTlRWQUwgKFhFWFAgKFhFWFAgKGNvbmRjb3VudF9yZWdfc2V0 LCAxKSwgMSkpID09IDEpCisJeworCSAgICBydHggY291bnRlcl9yZWcgPSBYRVhQIChjb25kY291 bnRfcmVnX3NldCwgMCk7CisJICAgIC8qIENoZWNrIHRoYXQgdGhlIGNvdW50ZXIgZGlkIGluZGVl ZCBzdGFydCBmcm9tIHplcm8uICAqLworCSAgICBkZl9yZWYgdGhpc19zZXQgPSBERl9SRUdfREVG X0NIQUlOIChSRUdOTyAoY291bnRlcl9yZWcpKTsKKwkgICAgaWYgKCF0aGlzX3NldCkKKwkgICAg ICByZXR1cm4gTlVMTDsKKwkgICAgZGZfcmVmIGxhc3Rfc2V0ID0gREZfUkVGX05FWFRfUkVHICh0 aGlzX3NldCk7CisJICAgIGlmICghbGFzdF9zZXQpCisJICAgICAgcmV0dXJuIE5VTEw7CisJICAg IHJ0eF9pbnNuKiBsYXN0X3NldF9pbnNuID0gREZfUkVGX0lOU04gKGxhc3Rfc2V0KTsKKwkgICAg aWYgKCFzaW5nbGVfc2V0IChsYXN0X3NldF9pbnNuKSkKKwkgICAgICByZXR1cm4gTlVMTDsKKwkg ICAgcnR4IGNvdW50ZXJfb3JpZ19zZXQ7CisJICAgIGNvdW50ZXJfb3JpZ19zZXQgPSBYRVhQIChQ QVRURVJOIChsYXN0X3NldF9pbnNuKSwgMSk7CisJICAgIGlmICghQ09OU1RfSU5UX1AgKGNvdW50 ZXJfb3JpZ19zZXQpCisJCXx8IChJTlRWQUwgKGNvdW50ZXJfb3JpZ19zZXQpICE9IDApKQorCSAg ICAgIHJldHVybiBOVUxMOworCSAgICAvKiBBbmQgZmluYWxseSBjaGVjayB0aGF0IHRoZSB0YXJn ZXQgdmFsdWUgb2YgdGhlIGNvdW50ZXIsCisJICAgICAgIGNvbmRjb25zdCBpcyBvZiB0aGUgY29y cmVjdCBzaGFwZS4gICovCisJICAgIGlmICghYXJtX212ZV9jaGVja19yZWdfb3JpZ2luX2lzX251 bV9lbGVtcyAoYm9keSwgY29uZGNvbnN0LAorCQkJCQkJCXZjdHBfcmVnX2l2LnN0ZXApKQorCSAg ICAgIHJldHVybiBOVUxMOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gTlVMTDsKKyAgICB9Cisg IGVsc2UKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBFeHRyYWN0IHRoZSBkZWNyZW1lbnRudW0g b2YgdGhlIHZjdHAgcmVnLiAgKi8KKyAgaW50IGRlY3JlbWVudG51bSA9IGFicyAoSU5UVkFMICh2 Y3RwX3JlZ19pdi5zdGVwKSk7CisgIC8qIEVuc3VyZSBpdCBtYXRjaGVzIHRoZSBudW1iZXIgb2Yg bGFuZXMgb2YgdGhlIHZjdHAgaW5zdHJ1Y3Rpb24uICAqLworICBpZiAoZGVjcmVtZW50bnVtICE9 IGFybV9tdmVfZ2V0X3ZjdHBfbGFuZXMgKFBBVFRFUk4gKHZjdHBfaW5zbikpKQorICAgIHJldHVy biBOVUxMOworCisgIC8qIEV2ZXJ5dGhpbmcgbG9va3MgdmFsaWQuICAqLworICByZXR1cm4gdmN0 cF9pbnNuOworfQorCitzdGF0aWMgcnR4X2luc24qCithcm1fbXZlX2Rsc3RwX2NoZWNrX2RlY19j b3VudGVyIChiYXNpY19ibG9jayBib2R5LCBydHhfaW5zbiogdmN0cF9pbnNuLAorCQkJCSBydHgg Y29uZGNvbnN0LCBydHggY29uZGNvdW50KQoreworICBydHggdmN0cF9yZWcgPSBYVkVDRVhQIChY RVhQIChQQVRURVJOICh2Y3RwX2luc24pLCAxKSwgMCwgMCk7CisgIGNsYXNzIHJ0eF9pdiB2Y3Rw X3JlZ19pdjsKKyAgaW50IGRlY3JlbWVudG51bTsKKyAgLyogRm9yIGRlY3JlbWVudGluZyBsb29w cyBvZiB0eXBlIEEpLCB0aGUgY291bnRlciBpcyB1c3VhbGx5IHByZXNlbnQgaW4gdGhlCisgICAg IGxvb3AgbGF0Y2guICBIZXJlIHdlIHNpbXBseSBuZWVkIHRvIHZlcmlmeSB0aGF0IHRoaXMgY291 bnRlciBpcyB0aGUgc2FtZQorICAgICByZWcgdGhhdCBpcyBhbHNvIHVzZWQgaW4gdGhlIHZjdHBf aW5zbiBhbmQgdGhhdCBpdCBpcyBub3Qgb3RoZXJ3aXNlCisgICAgIG1vZGlmaWVkLiAgKi8KKyAg cnR4X2luc24gKmRlY19pbnNuID0gQkJfRU5EIChib2R5LT5sb29wX2ZhdGhlci0+bGF0Y2gpOwor ICAvKiBJZiBub3QgaW4gdGhlIGxvb3AgbGF0Y2gsIHRyeSB0byBmaW5kIHRoZSBkZWNyZW1lbnQg aW4gdGhlIGxvb3AgYm9keS4gICovCisgIGlmICghTk9OREVCVUdfSU5TTl9QIChkZWNfaW5zbikp CisgIHsKKyAgICBkZl9yZWYgdGVtcCA9IGRmX2JiX3JlZ25vX29ubHlfZGVmX2ZpbmQgKGJvZHks IFJFR05PIChjb25kY291bnQpKTsKKyAgICAvKiBJZiB3ZSBoYXZlbid0IGJlZW4gYWJsZSB0byBm aW5kIHRoZSBkZWNyZW1lbnQsIGJhaWwgb3V0LiAgKi8KKyAgICBpZiAoIXRlbXApCisgICAgICBy ZXR1cm4gTlVMTDsKKyAgICBkZWNfaW5zbiA9IERGX1JFRl9JTlNOICh0ZW1wKTsKKyAgfQorCisg IC8qIE5leHQsIGVuc3VyZSB0aGF0IGl0IGlzIGEgUExVUyBvZiB0aGUgZm9ybToKKyAgICAgKHNl dCAocmVnIGEpIChwbHVzIChyZWcgYSkgKGNvbnN0X2ludCkpKQorICAgICB3aGVyZSAocmVnIGEp IGlzIHRoZSBzYW1lIGFzIGNvbmRjb3VudC4gICovCisgIGlmIChHRVRfQ09ERSAoWEVYUCAoUEFU VEVSTiAoZGVjX2luc24pLCAxKSkgPT0gUExVUworICAgICAgJiYgUkVHTk8gKFhFWFAgKFBBVFRF Uk4gKGRlY19pbnNuKSwgMCkpCisJICA9PSBSRUdOTyAoWEVYUCAoWEVYUCAoUEFUVEVSTiAoZGVj X2luc24pLCAxKSwgMCkpCisgICAgICAmJiBSRUdOTyAoWEVYUCAoUEFUVEVSTiAoZGVjX2luc24p LCAwKSkgPT0gUkVHTk8gKGNvbmRjb3VudCkpCisgICAgZGVjcmVtZW50bnVtID0gYWJzIChJTlRW QUwgKFhFWFAgKFhFWFAgKFBBVFRFUk4gKGRlY19pbnNuKSwgMSksIDEpKSk7CisgIGVsc2UKKyAg ICByZXR1cm4gTlVMTDsKKworICAvKiBPaywgc28gd2Ugbm93IGtub3cgdGhlIGxvb3AgZGVjcmVt ZW50LiAgSWYgaXQgaXMgYSAxLCB0aGVuIHdlIG5lZWQgdG8KKyAgICAgbG9vayBhdCB0aGUgbG9v cCB2Y3RwX3JlZyBhbmQgdmVyaWZ5IHRoYXQgaXQgYWxzbyBkZWNyZW1lbnRzIGNvcnJlY3RseS4K KyAgICAgVGhlbiwgd2UgbmVlZCB0byBlc3RhYmxpc2ggdGhhdCB0aGUgc3RhcnRpbmcgdmFsdWUg b2YgdGhlIGxvb3AgZGVjcmVtZW50CisgICAgIG9yaWdpbmF0ZXMgZnJvbSB0aGUgc3RhcnRpbmcg dmFsdWUgb2YgdGhlIHZjdHAgZGVjcmVtZW50LiAgKi8KKyAgaWYgKGRlY3JlbWVudG51bSA9PSAx KQorICAgIHsKKyAgICAgIGNsYXNzIHJ0eF9pdiB2Y3RwX3JlZ19pdjsKKyAgICAgIC8qIFRoZSBs b29wIGNvdW50ZXIgaXMgZm91bmQgdG8gYmUgaW5kZXBlbmRlbnQgb2YgdGhlIGRlY3JlbWVudAor CSBvZiB0aGUgcmVnIHVzZWQgaW4gdGhlIHZjdHBfaW5zbiwgYWdhaW4uICBFbnN1cmUgdGhhdCBJ ViBhbmFseXNpcworCSBzdWNjZWVkcyBhbmQgY2hlY2sgdGhlIHN0ZXAuICAqLworICAgICAgaWYg KCFpdl9hbmFseXplICh2Y3RwX2luc24sIGFzX2E8c2NhbGFyX2ludF9tb2RlPiAoR0VUX01PREUg KHZjdHBfcmVnKSksCisJCSAgICAgICB2Y3RwX3JlZywgJnZjdHBfcmVnX2l2KSkKKwlyZXR1cm4g TlVMTDsKKyAgICAgIC8qIEVuc3VyZSBpdCBtYXRjaGVzIHRoZSBudW1iZXIgb2YgbGFuZXMgb2Yg dGhlIHZjdHAgaW5zdHJ1Y3Rpb24uICAqLworICAgICAgaWYgKGFicyAoSU5UVkFMICh2Y3RwX3Jl Z19pdi5zdGVwKSkKKwkgICE9IGFybV9tdmVfZ2V0X3ZjdHBfbGFuZXMgKFBBVFRFUk4gKHZjdHBf aW5zbikpKQorCXJldHVybiBOVUxMOworICAgICAgaWYgKCFhcm1fbXZlX2NoZWNrX3JlZ19vcmln aW5faXNfbnVtX2VsZW1zIChib2R5LCBjb25kY291bnQsIHZjdHBfcmVnX2l2LnN0ZXApKQorCXJl dHVybiBOVUxMOworICAgIH0KKyAgLyogSWYgdGhlIGRlY3JlbWVudHMgYXJlIHRoZSBzYW1lLCB0 aGVuIHRoZSBzaXR1YXRpb24gaXMgc2ltcGxlOiBlaXRoZXIgdGhleQorICAgICBhcmUgYWxzbyB0 aGUgc2FtZSByZWcsIHdoaWNoIGlzIHNhZmUsIG9yIHRoZXkgYXJlIGRpZmZlcmVudCByZWdpc3Rl cnMsIGluCisgICAgIHdoaWNoIGNhc2UgbWFrc2Ugc3VyZSB0aGF0IHRoZXJlIGlzIGEgb25seSBz aW1wbGUgU0VUIGZyb20gb25lIHRvIHRoZQorICAgICBvdGhlciBpbnNpZGUgdGhlIGxvb3AuKi8K KyAgZWxzZSBpZiAoZGVjcmVtZW50bnVtID09IGFybV9tdmVfZ2V0X3ZjdHBfbGFuZXMgKFBBVFRF Uk4gKHZjdHBfaW5zbikpKQorICAgIHsKKyAgICAgIGlmIChSRUdOTyAoY29uZGNvdW50KSAhPSBS RUdOTyAodmN0cF9yZWcpKQorCXsKKwkgIC8qIEl0IHdhc24ndCB0aGUgc2FtZSByZWcsIGJ1dCBp dCBjb3VsZCBiZSBiZWhpbGQgYQorCSAgICAgKHNldCAodmN0cF9yZWcpIChjb25kY291bnQpKSwg c28gaW5zdGVhZCBmaW5kIHdoZXJlCisJICAgICB0aGUgVkNUUCBpbnNuIGlzIERFRidkIGluc2lk ZSB0aGUgbG9vcC4gICovCisJICBydHggdmN0cF9yZWdfc2V0ID0KKwkJUEFUVEVSTiAoREZfUkVG X0lOU04gKGRmX2JiX3JlZ25vX29ubHlfZGVmX2ZpbmQKKwkJCQkJKGJvZHksIFJFR05PICh2Y3Rw X3JlZykpKSk7CisJICAvKiBUaGlzIG11c3QganVzdCBiZSBhIHNpbXBsZSBTRVQgZnJvbSB0aGUg Y29uZGNvdW50LiAgKi8KKwkgIGlmIChHRVRfQ09ERSAodmN0cF9yZWdfc2V0KSAhPSBTRVQgfHwg IVJFR19QIChYRVhQICh2Y3RwX3JlZ19zZXQsIDEpKQorCSAgICAgIHx8IFJFR05PIChYRVhQICh2 Y3RwX3JlZ19zZXQsIDEpKSAhPSBSRUdOTyAoY29uZGNvdW50KSkKKwkgICAgcmV0dXJuIE5VTEw7 CisJfQorICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworCisgIC8qIFdlIG5vdyBvbmx5 IG5lZWQgdG8gZmluZCBvdXQgdGhhdCB0aGUgbG9vcCB0ZXJtaW5hdGVzIHdpdGggYSBMRQorICAg ICB6ZXJvIGNvbmRpdGlvbi4gIElmIGNvbmRjb25zdCBpcyBhIGNvbnN0X2ludCwgdGhlbiB0aGlz IGlzIGVhc3kuCisgICAgIElmIGl0cyBhIFJFRywgbG9vayBhdCB0aGUgbGFzdCBjb25kaXRpb24r anVtcCBpbiBhIGJiIGJlZm9yZQorICAgICB0aGUgbG9vcCwgYmVjYXVzZSB0aGF0IHVzdWFsbHkg d2lsbCBoYXZlIGEgYnJhbmNoIGp1bXBpbmcgb3ZlcgorICAgICB0aGUgbG9vcCBib2R5LiAgKi8K KyAgaWYgKENPTlNUX0lOVF9QIChjb25kY29uc3QpCisgICAgICAmJiAhKElOVFZBTCAoY29uZGNv bnN0KSA9PSAwICYmIEpVTVBfUCAoQkJfRU5EIChib2R5KSkKKwkgICAmJiBHRVRfQ09ERSAoWEVY UCAoUEFUVEVSTiAoQkJfRU5EIChib2R5KSksIDEpKSA9PSBJRl9USEVOX0VMU0UKKwkgICAmJiAo R0VUX0NPREUgKFhFWFAgKFhFWFAgKFBBVFRFUk4gKEJCX0VORCAoYm9keSkpLCAxKSwgMCkpID09 IE5FCisJICAgICAgIHx8R0VUX0NPREUgKFhFWFAgKFhFWFAgKFBBVFRFUk4gKEJCX0VORCAoYm9k eSkpLCAxKSwgMCkpID09IEdUKSkpCisgICAgcmV0dXJuIE5VTEw7CisgIGVsc2UgaWYgKFJFR19Q IChjb25kY29uc3QpKQorICAgIHsKKyAgICAgIGJhc2ljX2Jsb2NrIHByZV9sb29wX2JiID0gYm9k eTsKKyAgICAgIHdoaWxlIChwcmVfbG9vcF9iYi0+cHJldl9iYiAmJiBCQl9FTkQgKHByZV9sb29w X2JiLT5wcmV2X2JiKQorCSAgICAgJiYgIUpVTVBfUCAoQkJfRU5EIChwcmVfbG9vcF9iYi0+cHJl dl9iYikpKQorCXByZV9sb29wX2JiID0gcHJlX2xvb3BfYmItPnByZXZfYmI7CisgICAgICBpZiAo cHJlX2xvb3BfYmIgJiYgQkJfRU5EIChwcmVfbG9vcF9iYikpCisJcHJlX2xvb3BfYmIgPSBwcmVf bG9vcF9iYi0+cHJldl9iYjsKKyAgICAgIGVsc2UKKwlyZXR1cm4gTlVMTDsKKyAgICAgIHJ0eCBp bml0aWFsX2NvbXBhcmUgPSBOVUxMX1JUWDsKKyAgICAgIGlmICghKHByZXZfbm9ubm90ZV9ub25k ZWJ1Z19pbnNuX2JiIChCQl9FTkQgKHByZV9sb29wX2JiKSkKKwkgICAgJiYgSU5TTl9QIChwcmV2 X25vbm5vdGVfbm9uZGVidWdfaW5zbl9iYiAoQkJfRU5EIChwcmVfbG9vcF9iYikpKSkpCisJcmV0 dXJuIE5VTEw7CisgICAgICBlbHNlCisJaW5pdGlhbF9jb21wYXJlCisJICAgID0gUEFUVEVSTiAo cHJldl9ub25ub3RlX25vbmRlYnVnX2luc25fYmIgKEJCX0VORCAocHJlX2xvb3BfYmIpKSk7Cisg ICAgICBpZiAoIShpbml0aWFsX2NvbXBhcmUgJiYgR0VUX0NPREUgKGluaXRpYWxfY29tcGFyZSkg PT0gU0VUCisJICAgICYmIGNjX3JlZ2lzdGVyIChYRVhQIChpbml0aWFsX2NvbXBhcmUsIDApLCBW T0lEbW9kZSkKKwkgICAgJiYgR0VUX0NPREUgKFhFWFAgKGluaXRpYWxfY29tcGFyZSwgMSkpID09 IENPTVBBUkUKKwkgICAgJiYgQ09OU1RfSU5UX1AgKFhFWFAgKFhFWFAgKGluaXRpYWxfY29tcGFy ZSwgMSksIDEpKQorCSAgICAmJiBJTlRWQUwgKFhFWFAgKFhFWFAgKGluaXRpYWxfY29tcGFyZSwg MSksIDEpKSA9PSAwKSkKKwlyZXR1cm4gTlVMTDsKKworICAgICAgLyogVXN1YWxseSB0aGlzIGlz IGEgTEUgY29uZGl0aW9uLCBidXQgaXQgY2FuIGFsc28ganVzdCBiZSBhIEdUIG9yIGFuIEVRCisJ IGNvbmRpdGlvbiAoaWYgdGhlIHZhbHVlIGlzIHVuc2lnbmVkIG9yIHRoZSBjb21waWxlciBrbm93 cyBpdHMgbm90IG5lZ2F0aXZlKSAgKi8KKyAgICAgIHJ0eF9pbnNuICpsb29wX2p1bXBvdmVyID0g QkJfRU5EIChwcmVfbG9vcF9iYik7CisgICAgICBpZiAoIShKVU1QX1AgKGxvb3BfanVtcG92ZXIp CisJICAgICYmIEdFVF9DT0RFIChYRVhQIChQQVRURVJOIChsb29wX2p1bXBvdmVyKSwgMSkpID09 IElGX1RIRU5fRUxTRQorCSAgICAmJiAoR0VUX0NPREUgKFhFWFAgKFhFWFAgKFBBVFRFUk4gKGxv b3BfanVtcG92ZXIpLCAxKSwgMCkpID09IExFCisJCXx8IEdFVF9DT0RFIChYRVhQIChYRVhQIChQ QVRURVJOIChsb29wX2p1bXBvdmVyKSwgMSksIDApKSA9PSBHVAorCQl8fCBHRVRfQ09ERSAoWEVY UCAoWEVYUCAoUEFUVEVSTiAobG9vcF9qdW1wb3ZlciksIDEpLCAwKSkgPT0gRVEpKSkKKwlyZXR1 cm4gTlVMTDsKKyAgICB9CisKKyAgLyogRXZlcnl0aGluZyBsb29rcyB2YWxpZC4gICovCisgIHJl dHVybiB2Y3RwX2luc247Cit9CisKK3N0YXRpYyBydHhfaW5zbioKK2FybV9tdmVfbG9vcF92YWxp ZF9mb3JfZGxzdHAgKGJhc2ljX2Jsb2NrIGJvZHkpCit7CisgIC8qIERvbG9vcCBjYW4gb25seSBi ZSBkb25lICJlbGVtZW50d2lzZSIgd2l0aCBwcmVkaWNhdGVkIGRsc3RwL2xldHAgaWYgaXQKKyAg ICAgY29udGFpbnMgYSBWQ1RQIG9uIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcHJvY2Vzc2VkIGJ5 IHRoZSBsb29wLgorICAgICBGaW5kIHRoZSBWQ1RQIHByZWRpY2F0ZSBnZW5lcmF0aW9uIGluc2lk ZSB0aGUgbG9vcCBib2R5IEJCLiAgKi8KKyAgcnR4X2luc24gKnZjdHBfaW5zbiA9IGFybV9tdmVf Z2V0X2xvb3BfdmN0cCAoYm9keSk7CisgIGlmICghdmN0cF9pbnNuKQorICAgIHJldHVybiBOVUxM OworCisgIC8qIFRoZXJlIGFyZSBvbmx5IHR3byB0eXBlcyBvZiBsb29wcyB0aGF0IGNhbiBiZSB0 dXJuZWQgaW50byBkbHN0cC9sZXRwCisgICAgIGxvb3BzOgorICAgICAgQSkgTG9vcHMgb2YgdGhl IGZvcm06CisJICB3aGlsZSAobnVtX29mX2VsZW0gPiAwKQorCSAgICB7CisJICAgICAgcCA9IHZj dHA8c2l6ZT4gKG51bV9vZl9lbGVtKQorCSAgICAgIG4gLT0gbnVtX29mX2xhbmVzOworCSAgICB9 CisgICAgICBCKSBMb29wcyBvZiB0aGUgZm9ybToKKwkgIGludCBudW1fb2ZfaXRlcnMgPSAobnVt X29mX2VsZW0gKyBudW1fb2ZfbGFuZXMgLSAxKSAvIG51bV9vZl9sYW5lcworCSAgZm9yIChpID0g MDsgaSA8IG51bV9vZl9pdGVyczsgaSsrKQorCSAgICB7CisJICAgICAgcCA9IHZjdHA8c2l6ZT4g KG51bV9vZl9lbGVtKQorCSAgICAgIG4gLT0gbnVtX29mX2xhbmVzOworCSAgICB9CisKKyAgICBU aGVuLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgbG9vcCBhYm92ZSB3ZSBuZWVkIHdpbGwgbmVl ZCB0byBkbworICAgIGRpZmZlcmVudCBzZXRzIG9mIGNoZWNrcy4gICovCisgIGl2X2FuYWx5c2lz X2xvb3BfaW5pdCAoYm9keS0+bG9vcF9mYXRoZXIpOworCisgIC8qIEluIG9yZGVyIHRvIGZpbmQg b3V0IGlmIHRoZSBsb29wIGlzIG9mIHR5cGUgQSBvciBCIGFib3ZlIGxvb2sgZm9yIHRoZQorICAg ICBsb29wIGNvdW50ZXI6IGl0IHdpbGwgZWl0aGVyIGJlIGluY3JlbWVudGluZyBieSBvbmUgcGVy IGl0ZXJhdGlvbiBvcgorICAgICBpdCB3aWxsIGJlIGRlY3JlbWVudGluZyBieSBudW1fb2ZfbGFu ZXMuICBXZSBjYW4gZmluZCB0aGUgbG9vcCBjb3VudGVyCisgICAgIGluIHRoZSBjb25kaXRpb24g YXQgdGhlIGVuZCBvZiB0aGUgbG9vcC4gICovCisgIHJ0eF9pbnNuICpsb29wX2NvbmQgPSBwcmV2 X25vbm5vdGVfbm9uZGVidWdfaW5zbl9iYiAoQkJfRU5EIChib2R5KSk7CisgIGlmICghKGNjX3Jl Z2lzdGVyIChYRVhQIChQQVRURVJOIChsb29wX2NvbmQpLCAwKSwgVk9JRG1vZGUpCisJJiYgR0VU X0NPREUgKFhFWFAgKFBBVFRFUk4gKGxvb3BfY29uZCksIDEpKSA9PSBDT01QQVJFKSkKKyAgICBy ZXR1cm4gTlVMTDsKKworICAvKiBUaGUgb3BlcmFuZHMgaW4gdGhlIGNvbmRpdGlvbjogIFRyeSB0 byBpZGVudGlmeSB3aGljaCBvbmUgaXMgdGhlCisgICAgIGNvbnN0YW50IGFuZCB3aGljaCBpcyB0 aGUgY291bnRlciBhbmQgcnVuIElWIGFuYWx5c2lzIG9uIHRoZSBsYXR0ZXIuICAqLworICBydHgg Y29uZF9hcmdfMSA9IFhFWFAgKFhFWFAgKFBBVFRFUk4gKGxvb3BfY29uZCksIDEpLCAwKTsKKyAg cnR4IGNvbmRfYXJnXzIgPSBYRVhQIChYRVhQIChQQVRURVJOIChsb29wX2NvbmQpLCAxKSwgMSk7 CisKKyAgcnR4IGxvb3BfY29uZF9jb25zdGFudDsKKyAgcnR4IGxvb3BfY291bnRlcjsKKyAgY2xh c3MgcnR4X2l2IGNvbmRfY291bnRlcl9pdiwgY29uZF90ZW1wX2l2OworCisgIGlmIChDT05TVF9J TlRfUCAoY29uZF9hcmdfMSkpCisgICAgeworICAgICAgLyogY29uZF9hcmdfMSBpcyB0aGUgY29u c3RhbnQgYW5kIGNvbmRfYXJnXzIgaXMgdGhlIGNvdW50ZXIuICAqLworICAgICAgbG9vcF9jb25k X2NvbnN0YW50ID0gY29uZF9hcmdfMTsKKyAgICAgIGxvb3BfY291bnRlciA9IGNvbmRfYXJnXzI7 CisgICAgICBpdl9hbmFseXplIChsb29wX2NvbmQsIGFzX2E8c2NhbGFyX2ludF9tb2RlPiAoR0VU X01PREUgKGNvbmRfYXJnXzIpKSwKKwkJICBjb25kX2FyZ18yLCAmY29uZF9jb3VudGVyX2l2KTsK KyAgICB9CisgIGVsc2UgaWYgKENPTlNUX0lOVF9QIChjb25kX2FyZ18yKSkKKyAgICB7CisgICAg ICAvKiBjb25kX2FyZ18yIGlzIHRoZSBjb25zdGFudCBhbmQgY29uZF9hcmdfMSBpcyB0aGUgY291 bnRlci4gICovCisgICAgICBsb29wX2NvbmRfY29uc3RhbnQgPSBjb25kX2FyZ18yOworICAgICAg bG9vcF9jb3VudGVyID0gY29uZF9hcmdfMTsKKyAgICAgIGl2X2FuYWx5emUgKGxvb3BfY29uZCwg YXNfYTxzY2FsYXJfaW50X21vZGU+IChHRVRfTU9ERSAoY29uZF9hcmdfMSkpLAorCQkgIGNvbmRf YXJnXzEsICZjb25kX2NvdW50ZXJfaXYpOworICAgIH0KKyAgZWxzZSBpZiAoUkVHX1AgKGNvbmRf YXJnXzEpICYmIFJFR19QIChjb25kX2FyZ18yKSkKKyAgICB7CisgICAgICAvKiBJZiBib3RoIG9w ZXJhbmRzIHRvIHRoZSBjb21wYXJlIGFyZSBSRUdzLCB3ZSBjYW4gc2FmZWx5CisJIHJ1biBJViBh bmFseXNpcyBvbiBib3RoIGFuZCB0aGVuIGRldGVybWluZSB3aGljaCBpcyB0aGUKKwkgY29uc3Rh bnQgYnkgbG9va2luZyBhdCB0aGUgc3RlcC4KKwkgRmlyc3QgYXNzdW1lIGNvbmRfYXJnXzEgaXMg dGhlIGNvdW50ZXIuICAqLworICAgICAgbG9vcF9jb3VudGVyID0gY29uZF9hcmdfMTsKKyAgICAg IGxvb3BfY29uZF9jb25zdGFudCA9IGNvbmRfYXJnXzI7CisgICAgICBpdl9hbmFseXplIChsb29w X2NvbmQsIGFzX2E8c2NhbGFyX2ludF9tb2RlPiAoR0VUX01PREUgKGNvbmRfYXJnXzEpKSwKKwkJ ICBjb25kX2FyZ18xLCAmY29uZF9jb3VudGVyX2l2KTsKKyAgICAgIGl2X2FuYWx5emUgKGxvb3Bf Y29uZCwgYXNfYTxzY2FsYXJfaW50X21vZGU+IChHRVRfTU9ERSAoY29uZF9hcmdfMikpLAorCQkg IGNvbmRfYXJnXzIsICZjb25kX3RlbXBfaXYpOworCisgICAgICBpZiAoIUNPTlNUX0lOVF9QIChj b25kX2NvdW50ZXJfaXYuc3RlcCkgfHwgIUNPTlNUX0lOVF9QIChjb25kX3RlbXBfaXYuc3RlcCkp CisJcmV0dXJuIE5VTEw7CisgICAgICAvKiBMb29rIGF0IHRoZSBzdGVwcyBhbmQgc3dhcCBhcm91 bmQgdGhlIHJ0eCdzIGlmIG5lZWRlZC4gIEVycm9yIG91dCBpZgorCSBvbmUgb2YgdGhlbSBjYW5u b3QgYmUgaWRlbnRpZmllZCBhcyBjb25zdGFudC4gICovCisgICAgICBpZiAoSU5UVkFMIChjb25k X2NvdW50ZXJfaXYuc3RlcCkgIT0gMCAmJiBJTlRWQUwgKGNvbmRfdGVtcF9pdi5zdGVwKSAhPSAw KQorCXJldHVybiBOVUxMOworICAgICAgaWYgKElOVFZBTCAoY29uZF9jb3VudGVyX2l2LnN0ZXAp ID09IDAgJiYgSU5UVkFMIChjb25kX3RlbXBfaXYuc3RlcCkgIT0gMCkKKwl7CisJICBsb29wX2Nv dW50ZXIgPSBjb25kX2FyZ18yOworCSAgbG9vcF9jb25kX2NvbnN0YW50ID0gY29uZF9hcmdfMTsK KwkgIGNvbmRfY291bnRlcl9pdiA9IGNvbmRfdGVtcF9pdjsKKwl9CisgICAgfQorICBlbHNlCisg ICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCFSRUdfUCAobG9vcF9jb3VudGVyKSkKKyAgICByZXR1 cm4gTlVMTDsKKyAgaWYgKCEoUkVHX1AgKGxvb3BfY29uZF9jb25zdGFudCkgfHwgQ09OU1RfSU5U X1AgKGxvb3BfY29uZF9jb25zdGFudCkpKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIE5vdyB3 ZSBoYXZlIGV4dHJhY3RlZCB0aGUgSVYgc3RlcCBvZiB0aGUgbG9vcCBjb3VudGVyLCBjYWxsIHRo ZQorICAgICBhcHByb3ByaWF0ZSBjaGVja2luZyBmdW5jdGlvbi4gICovCisgIGlmIChJTlRWQUwg KGNvbmRfY291bnRlcl9pdi5zdGVwKSA+IDApCisgICAgcmV0dXJuIGFybV9tdmVfZGxzdHBfY2hl Y2tfaW5jX2NvdW50ZXIgKGJvZHksIHZjdHBfaW5zbiwKKwkJCQkJICAgIGxvb3BfY29uZF9jb25z dGFudCwgbG9vcF9jb3VudGVyKTsKKyAgZWxzZSBpZiAoSU5UVkFMIChjb25kX2NvdW50ZXJfaXYu c3RlcCkgPCAwKQorICAgIHJldHVybiBhcm1fbXZlX2Rsc3RwX2NoZWNrX2RlY19jb3VudGVyIChi b2R5LCB2Y3RwX2luc24sCisJCQkJCSAgICBsb29wX2NvbmRfY29uc3RhbnQsIGxvb3BfY291bnRl cik7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogUHJlZGljdCB3aGV0aGVyIHRo ZSBnaXZlbiBsb29wIGluIGdpbXBsZSB3aWxsIGJlIHRyYW5zZm9ybWVkIGluIHRoZSBSVEwKKyAg IGRvbG9vcF9vcHRpbWl6ZSBwYXNzLiAgKi8KKworc3RhdGljIGJvb2wKK2FybV9wcmVkaWN0X2Rv bG9vcF9wIChzdHJ1Y3QgbG9vcCAqbG9vcCkKK3sKKyAgZ2NjX2Fzc2VydCAobG9vcCk7CisgIC8q IE9uIGFybSwgdGFyZ2V0bS5jYW5fdXNlX2RvbG9vcF9wIGlzIGFjdHVhbGx5CisgICAgIGNhbl91 c2VfZG9sb29wX2lmX2lubmVybW9zdC4gIEVuc3VyZSB0aGUgbG9vcCBpcyBpbm5lcm1vc3QsCisg ICAgIGl0IGlzIHZhbGlkIGFuZCBhcyBwZXIgYXJtX3RhcmdldF9iYl9va19mb3JfbG9iIGFuZCB0 aGUKKyAgICAgY29ycmVjdCBhcmNoaXRlY3R1cmUgZmxhZ3MgYXJlIGVuYWJsZWQuICAqLworICBp ZiAoIShUQVJHRVRfMzJCSVQgJiYgVEFSR0VUX0hBVkVfTE9CICYmIG9wdGltaXplID4gMCkpCisg ICAgeworICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkK KwlmcHJpbnRmIChkdW1wX2ZpbGUsICJQcmVkaWN0IGRvbG9vcCBmYWlsdXJlIGR1ZSB0byIKKwkJ CSAgICAiIHRhcmdldCBhcmNoaXRlY3R1cmUgb3Igb3B0aW1pc2F0aW9uIGZsYWdzLlxuIik7Cisg ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICBlbHNlIGlmIChsb29wLT5pbm5lciAhPSBOVUxM KQorICAgIHsKKyAgICAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlM UykpCisJZnByaW50ZiAoZHVtcF9maWxlLCAiUHJlZGljdCBkb2xvb3AgZmFpbHVyZSBkdWUgdG8i CisJCQkgICAgIiBsb29wIG5lc3RpbmcuXG4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9 CisgIGVsc2UgaWYgKCFhcm1fdGFyZ2V0X2JiX29rX2Zvcl9sb2IgKGxvb3AtPmhlYWRlci0+bmV4 dF9iYikpCisgICAgeworICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9E RVRBSUxTKSkKKwlmcHJpbnRmIChkdW1wX2ZpbGUsICJQcmVkaWN0IGRvbG9vcCBmYWlsdXJlIGR1 ZSB0byIKKwkJCSAgICAiIGxvb3AgYmIgY29tcGxleGl0eS5cbiIpOworICAgICAgcmV0dXJuIGZh bHNlOworICAgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogSW1wbGVtZW50IHRhcmdldG0u bG9vcF91bnJvbGxfYWRqdXN0LiAgVXNlIHRoaXMgdG8gYmxvY2sgdW5yb2xsaW5nIG9mIGxvb3Bz CisgICB0aGF0IG1heSBsYXRlciBiZSB0dXJuZWQgaW50byBNVkUgVGFpbCBQcmVkaWNhdGVkIExv dyBPdmVyaGVhZCBMb29wcy4gIFRoZQorICAgcGVyZm9ybWFuY2UgYmVuZWZpdCBvZiBhbiBNVkUg TG9MIGlzIGxpa2VseSB0byBiZSBtdWNoIGhpZ2hlciB0aGFuIHRoYXQgb2YKKyAgIHRoZSB1bnJv bGxpbmcuICAqLworCit1bnNpZ25lZAorYXJtX2xvb3BfdW5yb2xsX2FkanVzdCAodW5zaWduZWQg bnVucm9sbCwgc3RydWN0IGxvb3AgKmxvb3ApCit7CisgIGlmIChUQVJHRVRfVEhVTUIyICYmIFRB UkdFVF9IQVZFX0xPQiAmJiBUQVJHRVRfSEFWRV9NVkUKKyAgICAgICYmIGFybV90YXJnZXRfYmJf b2tfZm9yX2xvYiAobG9vcC0+bGF0Y2gpCisgICAgICAmJiBhcm1fbXZlX2xvb3BfdmFsaWRfZm9y X2Rsc3RwIChsb29wLT5oZWFkZXIpKQorICAgIHJldHVybiAwOworICBlbHNlCisgICAgcmV0dXJu IG51bnJvbGw7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGhhZGxlIGVtaXR0aW5nIGEgVlBULXVucHJl ZGljYXRlZCB2ZXJzaW9uIG9mIGEgVlBULXByZWRpY2F0ZWQKKyAgIGluc24gdG8gYSBzZXF1ZW5j ZS4gICovCisKK3N0YXRpYyBib29sCithcm1fZW1pdF9tdmVfdW5wcmVkaWNhdGVkX2luc25fdG9f c2VxIChydHhfaW5zbiogaW5zbikKK3sKKyAgcnR4IGluc25fdnByX3JlZ19vcGVyYW5kID0gYXJt X2dldF9yZXF1aXJlZF92cHJfcmVnX3BhcmFtIChpbnNuKTsKKyAgaW50IG5ld19pY29kZSA9IGdl dF9hdHRyX212ZV91bnByZWRpY2F0ZWRfaW5zbiAoaW5zbik7CisgIGlmICghaW5fc2VxdWVuY2Vf cCAoKQorICAgICAgfHwgIU1WRV9WUFRfUFJFRElDQVRFRF9JTlNOX1AgKGluc24pCisgICAgICB8 fCAoIWluc25fdnByX3JlZ19vcGVyYW5kKQorICAgICAgfHwgKCFuZXdfaWNvZGUpKQorICAgIHJl dHVybiBmYWxzZTsKKworICBleHRyYWN0X2luc24gKGluc24pOworICBydHggYXJyWzhdOworICBp bnQgaiA9IDA7CisKKyAgLyogV2hlbiB0cmFuc2Zvcm1pbmcgYSBWUFQtcHJlZGljYXRlZCBpbnN0 cnVjdGlvbgorICAgICBpbnRvIGl0cyB1bnByZWRpY2F0ZWQgZXF1aXZhbGVudCB3ZSBuZWVkIHRv IGRyb3AKKyAgICAgdGhlIFZQUiBvcGVyYW5kIGFuZCB3ZSBtYXkgbmVlZCB0byBhbHNvIGRyb3Ag YQorICAgICBtZXJnZSAidnVuaW5pdCIgaW5wdXQgb3BlcmFuZCwgZGVwZW5kaW5nIG9uIHRoZQor ICAgICBpbnN0cnVjdGlvbiBwYXR0ZXJuLiAgSGVyZSBlbnN1cmUgdGhhdCB3ZSBoYXZlIGF0Cisg ICAgIG1vc3QgYSB0d28tb3BlcmFuZCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3bworICAgICBp bnN0cnVuY3Rpb25zLiAgKi8KKyAgaW50IG5fb3BlcmFuZHNfZGlmZgorICAgICAgPSByZWNvZ19k YXRhLm5fb3BlcmFuZHMgLSBpbnNuX2RhdGFbbmV3X2ljb2RlXS5uX29wZXJhbmRzOworICBpZiAo IShuX29wZXJhbmRzX2RpZmYgPiAwICYmIG5fb3BlcmFuZHNfZGlmZiA8PSAyKSkKKyAgICByZXR1 cm4gZmFsc2U7CisKKyAgLyogVGhlbiwgbG9vcCB0aHJvdWdoIHRoZSBvcGVyYW5kcyBvZiB0aGUg cHJlZGljYXRlZAorICAgICBpbnN0cnVjdGlvbiwgYW5kIHJldGFpbiB0aGUgb25lcyB0aGF0IG1h cCB0byB0aGUKKyAgICAgdW5wcmVkaWNhdGVkIGluc3RydWN0aW9uLiAgKi8KKyAgZm9yIChpbnQg aSA9IDA7IGkgPCByZWNvZ19kYXRhLm5fb3BlcmFuZHM7IGkrKykKKyAgICB7CisgICAgICAvKiBJ Z25vcmUgdGhlIFZQUiBhbmQsIGlmIG5lZWRlZCwgdGhlIHZ1bmluaXQKKwkgb3BlcmFuZC4gICov CisgICAgICBpZiAoaW5zbl92cHJfcmVnX29wZXJhbmQgPT0gcmVjb2dfZGF0YS5vcGVyYW5kW2ld CisJICB8fCAobl9vcGVyYW5kc19kaWZmID09IDIKKwkgICAgICAmJiAhc3RyY21wIChyZWNvZ19k YXRhLmNvbnN0cmFpbnRzW2ldLCAiMCIpKSkKKwljb250aW51ZTsKKyAgICAgIGVsc2UKKwl7CisJ ICBhcnJbal0gPSByZWNvZ19kYXRhLm9wZXJhbmRbaV07CisJICBqKys7CisJfQorICAgIH0KKwor ICAvKiBGaW5hbGx5LCBlbWl0IHRoZSB1cHJlZGljYXRlZCBpbnN0cnVjdGlvbi4gICovCisgIHN3 aXRjaCAoaikKKyAgICB7CisgICAgICBjYXNlIDE6CisJZW1pdF9pbnNuIChHRU5fRkNOIChuZXdf aWNvZGUpIChhcnJbMF0pKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMjoKKwllbWl0X2luc24gKEdF Tl9GQ04gKG5ld19pY29kZSkgKGFyclswXSwgYXJyWzFdKSk7CisJYnJlYWs7CisgICAgICBjYXNl IDM6CisJZW1pdF9pbnNuIChHRU5fRkNOIChuZXdfaWNvZGUpIChhcnJbMF0sIGFyclsxXSwgYXJy WzJdKSk7CisJYnJlYWs7CisgICAgICBjYXNlIDQ6CisJZW1pdF9pbnNuIChHRU5fRkNOIChuZXdf aWNvZGUpIChhcnJbMF0sIGFyclsxXSwgYXJyWzJdLAorCQkJCQlhcnJbM10pKTsKKwlicmVhazsK KyAgICAgIGNhc2UgNToKKwllbWl0X2luc24gKEdFTl9GQ04gKG5ld19pY29kZSkgKGFyclswXSwg YXJyWzFdLCBhcnJbMl0sIGFyclszXSwKKwkJCQkJYXJyWzRdKSk7CisJYnJlYWs7CisgICAgICBj YXNlIDY6CisJZW1pdF9pbnNuIChHRU5fRkNOIChuZXdfaWNvZGUpIChhcnJbMF0sIGFyclsxXSwg YXJyWzJdLCBhcnJbM10sCisJCQkJCWFycls0XSwgYXJyWzVdKSk7CisJYnJlYWs7CisgICAgICBj YXNlIDc6CisJZW1pdF9pbnNuIChHRU5fRkNOIChuZXdfaWNvZGUpIChhcnJbMF0sIGFyclsxXSwg YXJyWzJdLCBhcnJbM10sCisJCQkJCWFycls0XSwgYXJyWzVdLCBhcnJbNl0pKTsKKwlicmVhazsK KyAgICAgIGRlZmF1bHQ6CisJZ2NjX3VucmVhY2hhYmxlICgpOworICAgIH0KKyAgcmV0dXJuIHRy dWU7Cit9CisKKy8qIFdoZW4gYSB2Y3RwIGluc24gaXMgdXNlZCwgaXRzIG91dCBpcyBvZnRlbiBm b2xsb3dlZCBieQorICAgYSB6ZXJvLWV4dGVuZCBpbnNuIHRvIFNJbW9kZSwgd2hpY2ggaXMgdGhl biBTVUJSRUcnZCBpbnRvIGEKKyAgIHZlY3RvciBmb3JtIG9mIG1vZGUgVkFMSURfTVZFX1BSRURf TU9ERTogdGhpcyB2ZWN0b3IgZm9ybSBpcworICAgd2hhdCBpcyB0aGVuIHVzZWQgYXMgYW4gaW5w dXQgdG8gdGhlIGluc3RydWN0aW9ucyB3aXRoaW4gdGhlCisgICBsb29wLiAgSGVuY2UsIHN0b3Jl IHRoYXQgdmVjdG9yIGZvcm0gb2YgdGhlIFZQUiByZWcgaW50bworICAgdmN0cF92cHJfZ2VuZXJh dGVkLCBzbyB0aGF0IHdlIGNhbiBtYXRjaCBpdCB3aXRoIGluc3RydWN0aW9ucworICAgaW4gdGhl IGxvb3AgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIHByZWRpY2F0ZWQgb24gdGhpcyBzYW1lCisg ICBWUFIuICBJZiB0aGVyZSBpcyBubyB6ZXJvLWV4dGVuZCBhbmQgc3VicmVnIG9yIGl0IGlzIG90 aGVyd2lzZQorICAgaW52YWxpZCwgdGhlbiByZXR1cm4gTlVMTCB0byBjYW5jZWwgdGhlIGRsc3Rw IHRyYW5zZm9ybS4gICovCisKK3N0YXRpYyBydHgKK2FybV9tdmVfZ2V0X3ZjdHBfdmVjX2Zvcm0g KHJ0eF9pbnNuICppbnNuKQoreworICBydHggdmN0cF92cHJfZ2VuZXJhdGVkID0gTlVMTF9SVFg7 CisgIHJ0eF9pbnNuICpuZXh0X3VzZTEgPSBOVUxMOworICBkZl9yZWYgdXNlOworICBmb3IgKHVz ZQorCT0gREZfUkVHX1VTRV9DSEFJTgorCSAgIChERl9SRUZfUkVHTk8gKERGX0lOU05fSU5GT19E RUZTIChERl9JTlNOX0lORk9fR0VUIChpbnNuKSkpKTsKKyAgICAgICB1c2U7IHVzZSA9IERGX1JF Rl9ORVhUX1JFRyAodXNlKSkKKyAgICBpZiAoIW5leHRfdXNlMSAmJiBOT05ERUJVR19JTlNOX1Ag KERGX1JFRl9JTlNOICh1c2UpKSkKKyAgICAgIG5leHRfdXNlMSA9IERGX1JFRl9JTlNOICh1c2Up OworCisgIGlmIChzaW5nbGVfc2V0IChuZXh0X3VzZTEpCisgICAgICAmJiBHRVRfQ09ERSAoU0VU X1NSQyAoc2luZ2xlX3NldCAobmV4dF91c2UxKSkpID09IFpFUk9fRVhURU5EKQorICAgIHsKKyAg ICAgIHJ0eF9pbnNuICpuZXh0X3VzZTIgPSBOVUxMOworICAgICAgZm9yICh1c2UKKwkgICAgPSBE Rl9SRUdfVVNFX0NIQUlOCisJICAgICAgIChERl9SRUZfUkVHTk8KKwkJIChERl9JTlNOX0lORk9f REVGUyAoREZfSU5TTl9JTkZPX0dFVCAobmV4dF91c2UxKSkpKTsKKwkgICB1c2U7IHVzZSA9IERG X1JFRl9ORVhUX1JFRyAodXNlKSkKKwlpZiAoIW5leHRfdXNlMiAmJiBOT05ERUJVR19JTlNOX1Ag KERGX1JFRl9JTlNOICh1c2UpKSkKKwkgIG5leHRfdXNlMiA9IERGX1JFRl9JTlNOICh1c2UpOwor CisgICAgICBpZiAoc2luZ2xlX3NldCAobmV4dF91c2UyKQorCSAgJiYgR0VUX0NPREUgKFNFVF9T UkMgKHNpbmdsZV9zZXQgKG5leHRfdXNlMikpKSA9PSBTVUJSRUcpCisJdmN0cF92cHJfZ2VuZXJh dGVkID0gWEVYUCAoUEFUVEVSTiAobmV4dF91c2UyKSwgMCk7CisgICAgfQorCisgIGlmICghdmN0 cF92cHJfZ2VuZXJhdGVkIHx8ICFSRUdfUCAodmN0cF92cHJfZ2VuZXJhdGVkKQorICAgICAgfHwg IVZBTElEX01WRV9QUkVEX01PREUgKEdFVF9NT0RFICh2Y3RwX3Zwcl9nZW5lcmF0ZWQpKSkKKyAg ICByZXR1cm4gTlVMTF9SVFg7CisKKyAgcmV0dXJuIHZjdHBfdnByX2dlbmVyYXRlZDsKK30KKwor LyogQXR0ZW1wdCB0byB0cmFuc2Zvcm0gdGhlIGxvb3AgY29udGVudHMgb2YgbG9vcCBiYXNpYyBi bG9jayBmcm9tIFZQVAorICAgcHJlZGljYXRlZCBpbnNucyBpbnRvIHVucHJlZGljYXRlZCBpbnNu cyBmb3IgYSBkbHN0cC9sZXRwIGxvb3AuICAqLworCitydHgKK2FybV9hdHRlbXB0X2Rsc3RwX3Ry YW5zZm9ybSAocnR4IGxhYmVsKQoreworICBiYXNpY19ibG9jayBib2R5ID0gQkxPQ0tfRk9SX0lO U04gKGxhYmVsKS0+cHJldl9iYjsKKworICAvKiBFbnN1cmUgdGhhdCB0aGUgYmIgaXMgd2l0aGlu IGEgbG9vcCB0aGF0IGhhcyBhbGwgcmVxdWlyZWQgbWV0YWRhdGEuICAqLworICBpZiAoIWJvZHkt Pmxvb3BfZmF0aGVyIHx8ICFib2R5LT5sb29wX2ZhdGhlci0+aGVhZGVyCisgICAgICB8fCAhYm9k eS0+bG9vcF9mYXRoZXItPnNpbXBsZV9sb29wX2Rlc2MpCisgICAgcmV0dXJuIEdFTl9JTlQgKDEp OworCisgIHJ0eF9pbnNuICp2Y3RwX2luc24gPSBhcm1fbXZlX2xvb3BfdmFsaWRfZm9yX2Rsc3Rw IChib2R5KTsKKyAgaWYgKCF2Y3RwX2luc24pCisgICAgcmV0dXJuIEdFTl9JTlQgKDEpOworICBy dHggdmN0cF9yZWcgPSBYVkVDRVhQIChYRVhQIChQQVRURVJOICh2Y3RwX2luc24pLCAxKSwgMCwg MCk7CisKKyAgcnR4IHZjdHBfdnByX2dlbmVyYXRlZCA9IGFybV9tdmVfZ2V0X3ZjdHBfdmVjX2Zv cm0gKHZjdHBfaW5zbik7CisgIGlmICghdmN0cF92cHJfZ2VuZXJhdGVkKQorICAgIHJldHVybiBH RU5fSU5UICgxKTsKKworICAvKiBkZWNyZW1lbnR1bnVtIGlzIGFscmVhZHkga25vd24gdG8gYmUg dmFsaWQgYXQgdGhpcyBwb2ludC4gICovCisgIGludCBkZWNyZW1lbnRudW0gPSBhcm1fbXZlX2dl dF92Y3RwX2xhbmVzIChQQVRURVJOICh2Y3RwX2luc24pKTsKKworICBydHhfaW5zbiAqaW5zbiA9 IDA7CisgIHJ0eF9pbnNuICpjdXJfaW5zbiA9IDA7CisgIHJ0eF9pbnNuICpzZXE7CisKKyAgLyog U2NhbiB0aHJvdWdoIHRoZSBpbnNucyBpbiB0aGUgbG9vcCBiYiBhbmQgZW1pdCB0aGUgdHJhbnNm b3JtZWQgYmIKKyAgICAgaW5zbnMgdG8gYSBzZXF1ZW5jZS4gICovCisgIHN0YXJ0X3NlcXVlbmNl ICgpOworICBGT1JfQkJfSU5TTlMgKGJvZHksIGluc24pCisgICAgeworICAgICAgaWYgKEdFVF9D T0RFIChpbnNuKSA9PSBDT0RFX0xBQkVMIHx8IE5PVEVfSU5TTl9CQVNJQ19CTE9DS19QIChpbnNu KSkKKwljb250aW51ZTsKKyAgICAgIGVsc2UgaWYgKE5PVEVfUCAoaW5zbikpCisJZW1pdF9ub3Rl ICgoZW51bSBpbnNuX25vdGUpTk9URV9LSU5EIChpbnNuKSk7CisgICAgICBlbHNlIGlmIChERUJV R19JTlNOX1AgKGluc24pKQorCWVtaXRfZGVidWdfaW5zbiAoUEFUVEVSTiAoaW5zbikpOworICAg ICAgZWxzZSBpZiAoIUlOU05fUCAoaW5zbikpCisJeworCSAgZW5kX3NlcXVlbmNlICgpOworCSAg cmV0dXJuIEdFTl9JTlQgKDEpOworCX0KKyAgICAgIC8qIFdoZW4gd2UgZmluZCB0aGUgdmN0cCBp bnN0cnVjdGlvbjogY29udGludWUuICAqLworICAgICAgZWxzZSBpZiAoaW5zbiA9PSB2Y3RwX2lu c24pCisJY29udGludWU7CisgICAgICAgLyogSWYgdGhlIGluc24gcGF0dGVybiByZXF1aXJlcyB0 aGUgdXNlIG9mIHRoZSBWUFIgdmFsdWUgZnJvbSB0aGUKKwkgIHZjdHAgYXMgYW4gaW5wdXQgcGFy YW1ldGVyIGZvciBwcmVkaWNhdGlvbi4gICovCisgICAgICBlbHNlIGlmIChhcm1fbXZlX3ZlY19p bnNuX2lzX3ByZWRpY2F0ZWRfd2l0aF90aGlzX3ByZWRpY2F0ZQorCQkoaW5zbiwgdmN0cF92cHJf Z2VuZXJhdGVkKSkKKwl7CisJICBib29sIHN1Y2Nlc3MgPSBhcm1fZW1pdF9tdmVfdW5wcmVkaWNh dGVkX2luc25fdG9fc2VxIChpbnNuKTsKKwkgIGlmICghc3VjY2VzcykKKwkgICAgeworCSAgICAg IGVuZF9zZXF1ZW5jZSAoKTsKKwkgICAgICByZXR1cm4gR0VOX0lOVCAoMSk7CisJICAgIH0KKwl9 CisgICAgICAvKiBJZiB0aGUgaW5zbiBpc24ndCBWUFQgcHJlZGljYXRlZCBvbiB2Y3RwX3Zwcl9n ZW5lcmF0ZWQsIHdlIG5lZWQgdG8KKwkgbWFrZSBzdXJlIHRoYXQgaXQgaXMgc3RpbGwgdmFsaWQg d2l0aGluIHRoZSBkbHN0cC9sZXRwIGxvb3AuICAqLworICAgICAgZWxzZQorCXsKKwkgIC8qIElm IHRoaXMgaW5zdHJ1Y3Rpb24gVVNFLXMgdGhlIHZjdHBfdnByX2dlbmVyYXRlZCBvdGhlciB0aGFu IGZvcgorCSAgICAgcHJlZGljYXRpb24sIHRoaXMgYmxvY2tzIHRoZSB0cmFuc2Zvcm1hdGlvbiBh cyB3ZSBhcmUgbm90IGFsbG93ZWQKKwkgICAgIHRvIG9wdGltaXNlIHRoZSBWUFIgdmFsdWUgYXdh eS4gICovCisJICBkZl9yZWYgaW5zbl91c2VzID0gTlVMTDsKKwkgIEZPUl9FQUNIX0lOU05fVVNF IChpbnNuX3VzZXMsIGluc24pCisJICB7CisJICAgIGlmIChydHhfZXF1YWxfcCAodmN0cF92cHJf Z2VuZXJhdGVkLCBERl9SRUZfUkVHIChpbnNuX3VzZXMpKSkKKwkgICAgICB7CisJCWVuZF9zZXF1 ZW5jZSAoKTsKKwkJcmV0dXJuIEdFTl9JTlQgKDEpOworCSAgICAgIH0KKwkgIH0KKwkgIC8qIElm IHdpdGhpbiB0aGUgbG9vcCB3ZSBoYXZlIGFuIE1WRSB2ZWN0b3IgaW5zdHJ1Y3Rpb24gdGhhdCBp cworCSAgICAgdW5wcmVkaWNhdGVkLCB0aGUgZGxzdHAvbGV0cCBsb29waW5nIHdpbGwgYWRkIGlt cGxpY2l0CisJICAgICBwcmVkaWNhdGlvbiB0byBpdC4gIFRoaXMgd2lsbCByZXN1bHQgaW4gYSBj aGFuZ2UgaW4gYmVoYXZpb3VyCisJICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24sIHNvIHdlIG5lZWQg dG8gZmluZCBvdXQgaWYgYW55IGluc3RydWN0aW9ucworCSAgICAgdGhhdCBmZWVkIGludG8gdGhl IGN1cnJlbnQgaW5zdHJ1Y3Rpb24gd2VyZSBpbXBsaWNpdGx5CisJICAgICBwcmVkaWNhdGVkLiAg Ki8KKwkgIGlmIChhcm1fbXZlX2NoZWNrX2RmX2NoYWluX2JhY2tfZm9yX2ltcGxpY19wcmVkaWMK KwkJKGluc24sIHZjdHBfdnByX2dlbmVyYXRlZCkpCisJICAgIHsKKwkgICAgICBpZiAoYXJtX212 ZV9jaGVja19kZl9jaGFpbl9md2RfZm9yX2ltcGxpY19wcmVkaWNfaW1wYWN0CisJCSAgICAoaW5z biwgdmN0cF92cHJfZ2VuZXJhdGVkKSkKKwkJeworCQkgIGVuZF9zZXF1ZW5jZSAoKTsKKwkJICBy ZXR1cm4gR0VOX0lOVCAoMSk7CisJCX0KKwkgICAgfQorCSAgZW1pdF9pbnNuIChQQVRURVJOIChp bnNuKSk7CisJfQorICAgIH0KKyAgc2VxID0gZ2V0X2luc25zICgpOworICBlbmRfc2VxdWVuY2Ug KCk7CisKKyAgLyogUmUtd3JpdGUgdGhlIGVudGlyZSBCQiBjb250ZW50cyB3aXRoIHRoZSB0cmFu c2Zvcm1lZAorICAgICBzZXF1ZW5jZS4gICovCisgIEZPUl9CQl9JTlNOU19TQUZFIChib2R5LCBp bnNuLCBjdXJfaW5zbikKKyAgICBpZiAoIShHRVRfQ09ERSAoaW5zbikgPT0gQ09ERV9MQUJFTCB8 fCBOT1RFX0lOU05fQkFTSUNfQkxPQ0tfUCAoaW5zbikpKQorICAgICAgZGVsZXRlX2luc24gKGlu c24pOworICBmb3IgKGluc24gPSBzZXE7IE5FWFRfSU5TTiAoaW5zbik7IGluc24gPSBORVhUX0lO U04gKGluc24pKQorICAgIGlmIChOT1RFX1AgKGluc24pKQorICAgICAgZW1pdF9ub3RlX2FmdGVy ICgoZW51bSBpbnNuX25vdGUpTk9URV9LSU5EIChpbnNuKSwgQkJfRU5EIChib2R5KSk7CisgICAg ZWxzZSBpZiAoREVCVUdfSU5TTl9QIChpbnNuKSkKKyAgICAgIGVtaXRfZGVidWdfaW5zbl9hZnRl ciAoUEFUVEVSTiAoaW5zbiksIEJCX0VORCAoYm9keSkpOworICAgIGVsc2UKKyAgICAgIGVtaXRf aW5zbl9hZnRlciAoUEFUVEVSTiAoaW5zbiksIEJCX0VORCAoYm9keSkpOworCisgIGVtaXRfanVt cF9pbnNuX2FmdGVyIChQQVRURVJOIChpbnNuKSwgQkJfRU5EIChib2R5KSk7CisgIC8qIFRoZSB0 cmFuc2Zvcm1hdGlvbiBoYXMgc3VjY2VlZGVkLCBzbyBub3cgbW9kaWZ5IHRoZSAiY291bnQiCisg ICAgIChhLmsuYS4gbml0ZXJfZXhwcikgZm9yIHRoZSBtaWRkbGUtZW5kLiAgQWxzbyBzZXQgbm9s b29wX2Fzc3VtcHRpb25zCisgICAgIHRvIE5VTEwgdG8gc3RvcCB0aGUgbWlkZGxlLWVuZCBmcm9t IG1ha2luZyBhc3N1bXB0aW9ucyBhYm91dCB0aGUKKyAgICAgbnVtYmVyIG9mIGl0ZXJhdGlvbnMu ICAqLworICBzaW1wbGVfbG9vcF9kZXNjIChib2R5LT5sb29wX2ZhdGhlciktPm5pdGVyX2V4cHIg PSB2Y3RwX3JlZzsKKyAgc2ltcGxlX2xvb3BfZGVzYyAoYm9keS0+bG9vcF9mYXRoZXIpLT5ub2xv b3BfYXNzdW1wdGlvbnMgPSBOVUxMX1JUWDsKKyAgcmV0dXJuIEdFTl9JTlQgKGRlY3JlbWVudG51 bSk7CiB9CiAKICNpZiBDSEVDS0lOR19QCmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL2FybS9pdGVy YXRvcnMubWQgYi9nY2MvY29uZmlnL2FybS9pdGVyYXRvcnMubWQKaW5kZXggOWU3N2FmNTVkNjAu LjJkOWJlYTk1YjlhIDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2FybS9pdGVyYXRvcnMubWQKKysr IGIvZ2NjL2NvbmZpZy9hcm0vaXRlcmF0b3JzLm1kCkBAIC0yNTk4LDYgKzI1OTgsOSBAQAogKGRl ZmluZV9pbnRfYXR0ciBtcnJjIFsoVlVOU1BFQ19NUlJDICJtcnJjIikgKFZVTlNQRUNfTVJSQzIg Im1ycmMyIildKQogKGRlZmluZV9pbnRfYXR0ciBNUlJDIFsoVlVOU1BFQ19NUlJDICJNUlJDIikg KFZVTlNQRUNfTVJSQzIgIk1SUkMyIildKQogCisoZGVmaW5lX2ludF9hdHRyIG1vZGUxIFsoRExT VFA4ICI4IikgKERMU1RQMTYgIjE2IikgKERMU1RQMzIgIjMyIikKKwkJCShETFNUUDY0ICI2NCIp XSkKKwogKGRlZmluZV9pbnRfYXR0ciBvcHN1ZmZpeCBbKFVOU1BFQ19ET1RfUyAiczgiKQogCQkJ ICAgKFVOU1BFQ19ET1RfVSAidTgiKQogCQkJICAgKFVOU1BFQ19ET1RfVVMgInM4IikKQEAgLTI4 NDAsNiArMjg0Myw4IEBACiAoZGVmaW5lX2ludF9pdGVyYXRvciBWU0hMQ1FfTSBbVlNITENRX01f UyBWU0hMQ1FfTV9VXSkKIChkZWZpbmVfaW50X2l0ZXJhdG9yIFZRU0hMVVFfTV9OIFtWUVNITFVR X01fTl9TXSkKIChkZWZpbmVfaW50X2l0ZXJhdG9yIFZRU0hMVVFfTiBbVlFTSExVUV9OX1NdKQor KGRlZmluZV9pbnRfaXRlcmF0b3IgRExTVFAgW0RMU1RQOCBETFNUUDE2IERMU1RQMzIKKwkJCQkg ICBETFNUUDY0XSkKIAogOzsgRGVmaW5lIGl0ZXJhdG9ycyBmb3IgVkNNTEEgb3BlcmF0aW9ucwog KGRlZmluZV9pbnRfaXRlcmF0b3IgVkNNTEFfT1AgW1VOU1BFQ19WQ01MQQpkaWZmIC0tZ2l0IGEv Z2NjL2NvbmZpZy9hcm0vbXZlLm1kIGIvZ2NjL2NvbmZpZy9hcm0vbXZlLm1kCmluZGV4IGRkYWM2 Y2M1ZWUxLi5iYTZjMDFkMjkzOSAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9hcm0vbXZlLm1kCisr KyBiL2djYy9jb25maWcvYXJtL212ZS5tZApAQCAtNzE5NCwzICs3MTk0LDQwIEBACiAgICAgICB9 CiAgIH0KICkKKworOzsgT3JpZ2luYWxseSBleHBhbmRlZCBieSAncHJlZGljYXRlZF9kb2xvb3Bf ZW5kJy4KKzs7IEluIHRoZSByYXJlIHNpdHVhdGlvbiB3aGVyZSB0aGUgYnJhbmNoIGlzIHRvbyBm YXIsIHdlIGRvIGFsc28gbmVlZCB0bworOzsgcmV2ZXJ0IEZQU0NSLkxUUFNJWkUgYmFjayB0byAw eDEwMCBhZnRlciB0aGUgbGFzdCBpdGVyYXRpb24uCisoZGVmaW5lX2luc24gIipwcmVkaWNhdGVk X2RvbG9vcF9lbmRfaW50ZXJuYWwiCisgIFsoc2V0IChwYykKKwkoaWZfdGhlbl9lbHNlCisJICAg KGdlIChwbHVzOlNJIChyZWc6U0kgTFJfUkVHTlVNKQorCQkJKG1hdGNoX29wZXJhbmQ6U0kgMCAi Y29uc3RfaW50X29wZXJhbmQiICIiKSkKKwkJKGNvbnN0X2ludCAwKSkKKwkgKGxhYmVsX3JlZiAo bWF0Y2hfb3BlcmFuZCAxICIiICIiKSkKKwkgKHBjKSkpCisgICAoc2V0IChyZWc6U0kgTFJfUkVH TlVNKQorCShwbHVzOlNJIChyZWc6U0kgTFJfUkVHTlVNKSAobWF0Y2hfZHVwIDApKSkKKyAgIChj bG9iYmVyIChyZWc6Q0MgQ0NfUkVHTlVNKSldCisgICJUQVJHRVRfMzJCSVQgJiYgVEFSR0VUX0hB VkVfTE9CICYmIFRBUkdFVF9IQVZFX01WRSAmJiBUQVJHRVRfVEhVTUIyIgorICB7CisgICAgaWYg KGdldF9hdHRyX2xlbmd0aCAoaW5zbikgPT0gNCkKKyAgICAgIHJldHVybiAibGV0cFx0JXxsciwg JWwxIjsKKyAgICBlbHNlCisgICAgICByZXR1cm4gInN1YnNcdCV8bHIsICMlbjBcblx0Ymd0XHQl bDFcblx0bGN0cCI7CisgIH0KKyAgWyhzZXQgKGF0dHIgImxlbmd0aCIpCisJKGlmX3RoZW5fZWxz ZQorCSAgIChsdHUgKG1pbnVzIChwYykgKG1hdGNoX2R1cCAxKSkgKGNvbnN0X2ludCAxMDI0KSkK KwkgICAgKGNvbnN0X2ludCA0KQorCSAgICAoY29uc3RfaW50IDYpKSkKKyAgIChzZXRfYXR0ciAi dHlwZSIgImJyYW5jaCIpXSkKKworKGRlZmluZV9pbnNuICJkbHN0cDxtb2RlMT5faW5zbiIKKyAg WworICAgIChzZXQgKHJlZzpTSSBMUl9SRUdOVU0pCisJICh1bnNwZWM6U0kgWyhtYXRjaF9vcGVy YW5kOlNJIDAgInNfcmVnaXN0ZXJfb3BlcmFuZCIgInIiKV0KKwkgIERMU1RQKSkKKyAgXQorICAi VEFSR0VUXzMyQklUICYmIFRBUkdFVF9IQVZFX0xPQiAmJiBUQVJHRVRfSEFWRV9NVkUgJiYgVEFS R0VUX1RIVU1CMiIKKyAgImRsc3RwLjxtb2RlMT5cdCV8bHIsICUwIikKZGlmZiAtLWdpdCBhL2dj Yy9jb25maWcvYXJtL3RodW1iMi5tZCBiL2djYy9jb25maWcvYXJtL3RodW1iMi5tZAppbmRleCBl MWUwMTNiZWZhNy4uMjA5NGU5YzQ2NDEgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvYXJtL3RodW1i Mi5tZAorKysgYi9nY2MvY29uZmlnL2FybS90aHVtYjIubWQKQEAgLTE2MTMsNyArMTYxMyw3IEBA CiAgICAodXNlIChtYXRjaF9vcGVyYW5kIDEgIiIgIiIpKV0gICAgIDsgbGFiZWwKICAgIlRBUkdF VF8zMkJJVCIKICAgIgotIHsKK3sKICAgIC8qIEN1cnJlbnRseSBTTVMgcmVsaWVzIG9uIHRoZSBk by1sb29wIHBhdHRlcm4gdG8gcmVjb2duaXplIGxvb3BzCiAgICAgICB3aGVyZSAoMSkgdGhlIGNv bnRyb2wgcGFydCBjb25zaXN0cyBvZiBhbGwgaW5zbnMgZGVmaW5pbmcgYW5kL29yCiAgICAgICB1 c2luZyBhIGNlcnRhaW4gJ2NvdW50JyByZWdpc3RlciBhbmQgKDIpIHRoZSBsb29wIGNvdW50IGNh biBiZQpAQCAtMTYyMyw0MSArMTYyMyw2NyBAQAogCiAgICAgICBBbHNvIHVzZWQgdG8gaW1wbGVt ZW50IHRoZSBsb3cgb3ZlciBoZWFkIGxvb3BzIGZlYXR1cmUsIHdoaWNoIGlzIHBhcnQgb2YKICAg ICAgIHRoZSBBcm12OC4xLU0gTWFpbmxpbmUgTG93IE92ZXJoZWFkIEJyYW5jaCAoTE9CKSBleHRl bnNpb24uICAqLwotICAgaWYgKG9wdGltaXplID4gMCAmJiAoZmxhZ19tb2R1bG9fc2NoZWQgfHwg VEFSR0VUX0hBVkVfTE9CKSkKLSAgIHsKLSAgICAgcnR4IHMwOwotICAgICBydHggYmNvbXA7Ci0g ICAgIHJ0eCBsb2NfcmVmOwotICAgICBydHggY2NfcmVnOwotICAgICBydHggaW5zbjsKLSAgICAg cnR4IGNtcDsKLQotICAgICBpZiAoR0VUX01PREUgKG9wZXJhbmRzWzBdKSAhPSBTSW1vZGUpCi0g ICAgICAgRkFJTDsKLQotICAgICBzMCA9IG9wZXJhbmRzIFswXTsKLQotICAgICAvKiBMb3cgb3Zl ciBoZWFkIGxvb3AgaW5zdHJ1Y3Rpb25zIHJlcXVpcmUgdGhlIGZpcnN0IG9wZXJhbmQgdG8gYmUg TFIuICAqLwotICAgICBpZiAoVEFSR0VUX0hBVkVfTE9CICYmIGFybV90YXJnZXRfaW5zbl9va19m b3JfbG9iIChvcGVyYW5kcyBbMV0pKQotICAgICAgIHMwID0gZ2VuX3J0eF9SRUcgKFNJbW9kZSwg TFJfUkVHTlVNKTsKLQotICAgICBpZiAoVEFSR0VUX1RIVU1CMikKLSAgICAgICBpbnNuID0gZW1p dF9pbnNuIChnZW5fdGh1bWIyX2FkZHNpM19jb21wYXJlMCAoczAsIHMwLCBHRU5fSU5UICgtMSkp KTsKLSAgICAgZWxzZQotICAgICAgIGluc24gPSBlbWl0X2luc24gKGdlbl9hZGRzaTNfY29tcGFy ZTAgKHMwLCBzMCwgR0VOX0lOVCAoLTEpKSk7Ci0KLSAgICAgY21wID0gWFZFQ0VYUCAoUEFUVEVS TiAoaW5zbiksIDAsIDApOwotICAgICBjY19yZWcgPSBTRVRfREVTVCAoY21wKTsKLSAgICAgYmNv bXAgPSBnZW5fcnR4X05FIChWT0lEbW9kZSwgY2NfcmVnLCBjb25zdDBfcnR4KTsKLSAgICAgbG9j X3JlZiA9IGdlbl9ydHhfTEFCRUxfUkVGIChWT0lEbW9kZSwgb3BlcmFuZHMgWzFdKTsKLSAgICAg ZW1pdF9qdW1wX2luc24gKGdlbl9ydHhfU0VUIChwY19ydHgsCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgZ2VuX3J0eF9JRl9USEVOX0VMU0UgKFZPSURtb2RlLCBiY29tcCwKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9j X3JlZiwgcGNfcnR4KSkpOwotICAgICBET05FOwotICAgfQotIGVsc2UKLSAgIEZBSUw7Ci0gfSIp CisgIGlmIChvcHRpbWl6ZSA+IDAgJiYgKGZsYWdfbW9kdWxvX3NjaGVkIHx8IFRBUkdFVF9IQVZF X0xPQikpCisgICAgeworICAgICAgcnR4IHMwOworICAgICAgcnR4IGJjb21wOworICAgICAgcnR4 IGxvY19yZWY7CisgICAgICBydHggY2NfcmVnOworICAgICAgcnR4IGluc247CisgICAgICBydHgg Y21wOworICAgICAgcnR4IGRlY3JlbWVudF9udW07CisKKyAgICAgIGlmIChHRVRfTU9ERSAob3Bl cmFuZHNbMF0pICE9IFNJbW9kZSkKKwlGQUlMOworCisgICAgICBzMCA9IG9wZXJhbmRzWzBdOwor CisgICAgICAgaWYgKFRBUkdFVF9IQVZFX0xPQiAmJiBhcm1fdGFyZ2V0X2JiX29rX2Zvcl9sb2Ig KEJMT0NLX0ZPUl9JTlNOIChvcGVyYW5kc1sxXSkpKQorCXsKKwkgIHMwID0gZ2VuX3J0eF9SRUcg KFNJbW9kZSwgTFJfUkVHTlVNKTsKKworCSAgLyogSWYgd2UgaGF2ZSBhIGNvbXBhdGliZSBNVkUg dGFyZ2V0LCB0cnkgYW5kIGFuYWx5c2UgdGhlIGxvb3AKKwkgICAgIGNvbnRlbnRzIHRvIGRldGVy bWluZSBpZiB3ZSBjYW4gdXNlIHByZWRpY2F0ZWQgZGxzdHAvbGV0cAorCSAgICAgbG9vcGluZy4g ICovCisJICBpZiAoVEFSR0VUX0hBVkVfTVZFICYmIFRBUkdFVF9USFVNQjIKKwkgICAgICAmJiAo ZGVjcmVtZW50X251bSA9IGFybV9hdHRlbXB0X2Rsc3RwX3RyYW5zZm9ybSAob3BlcmFuZHNbMV0p KQorCSAgICAgICYmIChJTlRWQUwgKGRlY3JlbWVudF9udW0pICE9IDEpKQorCSAgICB7CisJICAg ICAgaW5zbiA9IGVtaXRfaW5zbgorCQkgICAgICAoZ2VuX3RodW1iMl9hZGRzaTNfY29tcGFyZTAK KwkJCSAgKHMwLCBzMCwgR0VOX0lOVCAoKC0xKSAqIChJTlRWQUwgKGRlY3JlbWVudF9udW0pKSkp KTsKKwkgICAgICBjbXAgPSBYVkVDRVhQIChQQVRURVJOIChpbnNuKSwgMCwgMCk7CisJICAgICAg Y2NfcmVnID0gU0VUX0RFU1QgKGNtcCk7CisJICAgICAgYmNvbXAgPSBnZW5fcnR4X0dFIChWT0lE bW9kZSwgY2NfcmVnLCBjb25zdDBfcnR4KTsKKwkgICAgICBsb2NfcmVmID0gZ2VuX3J0eF9MQUJF TF9SRUYgKFZPSURtb2RlLCBvcGVyYW5kc1sxXSk7CisJICAgICAgZW1pdF9qdW1wX2luc24gKGdl bl9ydHhfU0VUIChwY19ydHgsCisJCQkJICAgICAgIGdlbl9ydHhfSUZfVEhFTl9FTFNFIChWT0lE bW9kZSwgYmNvbXAsCisJCQkJCQkJICAgICBsb2NfcmVmLCBwY19ydHgpKSk7CisJICAgICAgRE9O RTsKKwkgICAgfQorCisJICAvKiBPdGhlcndpc2UsIHRyeSBzdGFuZGFyZCBkZWNyZW1lbnQtYnkt b25lIGRscy9sZSBsb29waW5nLiAgKi8KKwkgIGlmIChUQVJHRVRfVEhVTUIyKQorCSAgICBpbnNu ID0gZW1pdF9pbnNuIChnZW5fdGh1bWIyX2FkZHNpM19jb21wYXJlMCAoczAsIHMwLAorCQkJCQkJ CSAgR0VOX0lOVCAoLTEpKSk7CisJICBlbHNlCisJICAgIGluc24gPSBlbWl0X2luc24gKGdlbl9h ZGRzaTNfY29tcGFyZTAgKHMwLCBzMCwgR0VOX0lOVCAoLTEpKSk7CisKKwkgIGNtcCA9IFhWRUNF WFAgKFBBVFRFUk4gKGluc24pLCAwLCAwKTsKKwkgIGNjX3JlZyA9IFNFVF9ERVNUIChjbXApOwor CSAgYmNvbXAgPSBnZW5fcnR4X05FIChWT0lEbW9kZSwgY2NfcmVnLCBjb25zdDBfcnR4KTsKKwkg IGxvY19yZWYgPSBnZW5fcnR4X0xBQkVMX1JFRiAoVk9JRG1vZGUsIG9wZXJhbmRzWzFdKTsKKwkg IGVtaXRfanVtcF9pbnNuIChnZW5fcnR4X1NFVCAocGNfcnR4LAorCQkJCSAgICAgICBnZW5fcnR4 X0lGX1RIRU5fRUxTRSAoVk9JRG1vZGUsIGJjb21wLAorCQkJCQkJCSAgICAgbG9jX3JlZiwgcGNf cnR4KSkpOworCSAgRE9ORTsKKwl9CisgICAgICBlbHNlCisJRkFJTDsKKyAgICB9CisgIGVsc2UK KyAgICBGQUlMOworfSIpCiAKIChkZWZpbmVfaW5zbiAiKmNsZWFyX2Fwc3IiCiAgIFsodW5zcGVj X3ZvbGF0aWxlOlNJIFsoY29uc3RfaW50IDApXSBWVU5TUEVDX0NMUk1fQVBTUikKQEAgLTE3NTUs NyArMTc4MSwzNyBAQAogICB7CiAgICAgaWYgKFJFR05PIChvcGVyYW5kc1swXSkgPT0gTFJfUkVH TlVNKQogICAgICAgewotCWVtaXRfaW5zbiAoZ2VuX2Rsc19pbnNuIChvcGVyYW5kc1swXSkpOwor CS8qIFBpY2sgb3V0IHRoZSBudW1iZXIgYnkgd2hpY2ggd2UgYXJlIGRlY3JlbWVudGluZyB0aGUg bG9vcCBjb3VudGVyCisJICAgaW4gZXZlcnkgaXRlcmF0aW9uLiAgSWYgaXQncyA+IDEsIHRoZW4g dXNlIGRsc3RwLiAgKi8KKwlpbnQgY29uc3RfaW50X2RlY19udW0KKwkgICAgID0gYWJzIChJTlRW QUwgKFhFWFAgKFhFWFAgKFhWRUNFWFAgKFBBVFRFUk4gKG9wZXJhbmRzWzFdKSwgMCwgMSksCisJ CQkJICAxKSwKKwkJCSAgICAxKSkpOworCXN3aXRjaCAoY29uc3RfaW50X2RlY19udW0pCisJICB7 CisJICAgIGNhc2UgMTY6CisJICAgICAgZW1pdF9pbnNuIChnZW5fZGxzdHA4X2luc24gKG9wZXJh bmRzWzBdKSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSA4OgorCSAgICAgIGVtaXRfaW5z biAoZ2VuX2Rsc3RwMTZfaW5zbiAob3BlcmFuZHNbMF0pKTsKKwkgICAgICBicmVhazsKKworCSAg ICBjYXNlIDQ6CisJICAgICAgZW1pdF9pbnNuIChnZW5fZGxzdHAzMl9pbnNuIChvcGVyYW5kc1sw XSkpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgMjoKKwkgICAgICBlbWl0X2luc24gKGdl bl9kbHN0cDY0X2luc24gKG9wZXJhbmRzWzBdKSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2Fz ZSAxOgorCSAgICAgIGVtaXRfaW5zbiAoZ2VuX2Rsc19pbnNuIChvcGVyYW5kc1swXSkpOworCSAg ICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgZ2NjX3VucmVhY2hhYmxlICgpOwor CSAgfQogCURPTkU7CiAgICAgICB9CiAgICAgZWxzZQpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9h cm0vdW5zcGVjcy5tZCBiL2djYy9jb25maWcvYXJtL3Vuc3BlY3MubWQKaW5kZXggZGNjZGEyODM1 NzMuLmY3YzRmMmIxYjBlIDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2FybS91bnNwZWNzLm1kCisr KyBiL2djYy9jb25maWcvYXJtL3Vuc3BlY3MubWQKQEAgLTU4MSw2ICs1ODEsMTAgQEAKICAgVkFE RExWUV9VCiAgIFZDVFAKICAgVkNUUF9NCisgIERMU1RQOAorICBETFNUUDE2CisgIERMU1RQMzIK KyAgRExTVFA2NAogICBWUE5PVAogICBWQ1JFQVRFUV9GCiAgIFZDVlRRX05fVE9fRl9TCmRpZmYg LS1naXQgYS9nY2MvZGYtY29yZS5jYyBiL2djYy9kZi1jb3JlLmNjCmluZGV4IGQ0ODEyYjA0YTdj Li40ZmNjMTRiZjc5MCAxMDA2NDQKLS0tIGEvZ2NjL2RmLWNvcmUuY2MKKysrIGIvZ2NjL2RmLWNv cmUuY2MKQEAgLTE5NjQsNiArMTk2NCwyMSBAQCBkZl9iYl9yZWdub19sYXN0X2RlZl9maW5kIChi YXNpY19ibG9jayBiYiwgdW5zaWduZWQgaW50IHJlZ25vKQogICByZXR1cm4gTlVMTDsKIH0KIAor LyogUmV0dXJuIHRoZSBvbmUgYW5kIG9ubHkgZGVmIG9mIFJFR05PIHdpdGhpbiBCQi4gIElmIHRo ZXJlIGlzIG5vIGRlZiBvcgorICAgdGhlcmUgYXJlIG11bHRpcGxlIGRlZnMsIHJldHVybiBOVUxM LiAgKi8KKworZGZfcmVmCitkZl9iYl9yZWdub19vbmx5X2RlZl9maW5kIChiYXNpY19ibG9jayBi YiwgdW5zaWduZWQgaW50IHJlZ25vKQoreworICBkZl9yZWYgdGVtcCA9IGRmX2JiX3JlZ25vX2Zp cnN0X2RlZl9maW5kIChiYiwgcmVnbm8pOworICBpZiAoIXRlbXApCisgICAgcmV0dXJuIE5VTEw7 CisgIGVsc2UgaWYgKHRlbXAgPT0gZGZfYmJfcmVnbm9fbGFzdF9kZWZfZmluZCAoYmIsIHJlZ25v KSkKKyAgICByZXR1cm4gdGVtcDsKKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworfQorCiAvKiBG aW5kcyB0aGUgcmVmZXJlbmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRlZmluaXRpb24gb2YgUkVH IGluIElOU04uCiAgICBERiBpcyB0aGUgZGF0YWZsb3cgb2JqZWN0LiAgKi8KIApkaWZmIC0tZ2l0 IGEvZ2NjL2RmLmggYi9nY2MvZGYuaAppbmRleCA0MDI2NTdhNzA3Ni4uOTg2MjM2MzdmOWMgMTAw NjQ0Ci0tLSBhL2djYy9kZi5oCisrKyBiL2djYy9kZi5oCkBAIC05ODcsNiArOTg3LDcgQEAgZXh0 ZXJuIHZvaWQgZGZfY2hlY2tfY2ZnX2NsZWFuICh2b2lkKTsKICNlbmRpZgogZXh0ZXJuIGRmX3Jl ZiBkZl9iYl9yZWdub19maXJzdF9kZWZfZmluZCAoYmFzaWNfYmxvY2ssIHVuc2lnbmVkIGludCk7 CiBleHRlcm4gZGZfcmVmIGRmX2JiX3JlZ25vX2xhc3RfZGVmX2ZpbmQgKGJhc2ljX2Jsb2NrLCB1 bnNpZ25lZCBpbnQpOworZXh0ZXJuIGRmX3JlZiBkZl9iYl9yZWdub19vbmx5X2RlZl9maW5kIChi YXNpY19ibG9jaywgdW5zaWduZWQgaW50KTsKIGV4dGVybiBkZl9yZWYgZGZfZmluZF9kZWYgKHJ0 eF9pbnNuICosIHJ0eCk7CiBleHRlcm4gYm9vbCBkZl9yZWdfZGVmaW5lZCAocnR4X2luc24gKiwg cnR4KTsKIGV4dGVybiBkZl9yZWYgZGZfZmluZF91c2UgKHJ0eF9pbnNuICosIHJ0eCk7CmRpZmYg LS1naXQgYS9nY2MvbG9vcC1kb2xvb3AuY2MgYi9nY2MvbG9vcC1kb2xvb3AuY2MKaW5kZXggNGZl YjBhMjVhYjkuLmY2ZGJkMDUxNWRlIDEwMDY0NAotLS0gYS9nY2MvbG9vcC1kb2xvb3AuY2MKKysr IGIvZ2NjL2xvb3AtZG9sb29wLmNjCkBAIC04NSwyOSArODUsMjkgQEAgZG9sb29wX2NvbmRpdGlv bl9nZXQgKHJ0eF9pbnNuICpkb2xvb3BfcGF0KQogICAgICBmb3JtczoKIAogICAgICAxKSAgKHBh cmFsbGVsIFsoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAoY29uZGl0aW9uKQotCSAgCQkJICAgICAg ICAgICAgKGxhYmVsX3JlZiAobGFiZWwpKQotCQkJCSAgICAgICAgICAgIChwYykpKQotCSAgICAg ICAgICAgICAoc2V0IChyZWcpIChwbHVzIChyZWcpIChjb25zdF9pbnQgLTEpKSkKLQkgICAgICAg ICAgICAgKGFkZGl0aW9uYWwgY2xvYmJlcnMgYW5kIHVzZXMpXSkKKwkJCQkJICAgIChsYWJlbF9y ZWYgKGxhYmVsKSkKKwkJCQkJICAgIChwYykpKQorCQkgICAgIChzZXQgKHJlZykgKHBsdXMgKHJl ZykgKGNvbnN0X2ludCAtbikpKQorCQkgICAgIChhZGRpdGlvbmFsIGNsb2JiZXJzIGFuZCB1c2Vz KV0pCiAKICAgICAgVGhlIGJyYW5jaCBtdXN0IGJlIHRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgcGFy YWxsZWwgKGFsc28gcmVxdWlyZWQKICAgICAgYnkganVtcC5jYyksIGFuZCB0aGUgc2Vjb25kIGVu dHJ5IG9mIHRoZSBwYXJhbGxlbCBtdXN0IGJlIGEgc2V0IG9mCiAgICAgIHRoZSBsb29wIGNvdW50 ZXIgcmVnaXN0ZXIuICBTb21lIHRhcmdldHMgKElBLTY0KSB3cmFwIHRoZSBzZXQgb2YKICAgICAg dGhlIGxvb3AgY291bnRlciBpbiBhbiBpZl90aGVuX2Vsc2UgdG9vLgogCi0gICAgIDIpICAoc2V0 IChyZWcpIChwbHVzIChyZWcpIChjb25zdF9pbnQgLTEpKQotICAgICAgICAgKHNldCAocGMpIChp Zl90aGVuX2Vsc2UgKHJlZyAhPSAwKQotCSAgICAgICAgICAgICAgICAgICAgICAgICAobGFiZWxf cmVmIChsYWJlbCkpCi0JCQkgICAgICAgICAocGMpKSkuICAKKyAgICAgMikgIChzZXQgKHJlZykg KHBsdXMgKHJlZykgKGNvbnN0X2ludCAtbikpCisJIChzZXQgKHBjKSAoaWZfdGhlbl9lbHNlIChy ZWcgIT0gMCkKKwkJCQkgKGxhYmVsX3JlZiAobGFiZWwpKQorCQkJCSAocGMpKSkuCiAKICAgICAg U29tZSB0YXJnZXRzIChBUk0pIGRvIHRoZSBjb21wYXJpc29uIGJlZm9yZSB0aGUgYnJhbmNoLCBh cyBpbiB0aGUKICAgICAgZm9sbG93aW5nIGZvcm06CiAKLSAgICAgMykgKHBhcmFsbGVsIFsoc2V0 IChjYykgKGNvbXBhcmUgKChwbHVzIChyZWcpIChjb25zdF9pbnQgLTEpLCAwKSkpCi0gICAgICAg ICAgICAgICAgICAgKHNldCAocmVnKSAocGx1cyAocmVnKSAoY29uc3RfaW50IC0xKSkpXSkKLSAg ICAgICAgKHNldCAocGMpIChpZl90aGVuX2Vsc2UgKGNjID09IE5FKQotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAobGFiZWxfcmVmIChsYWJlbCkpCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIChwYykpKSAqLworICAgICAzKSAocGFyYWxsZWwgWyhzZXQgKGNjKSAoY29t cGFyZSAoKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtbiksIDApKSkKKwkJICAgKHNldCAocmVnKSAo cGx1cyAocmVnKSAoY29uc3RfaW50IC1uKSkpXSkKKwkoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAo Y2MgPT0gTkUpCisJCQkJKGxhYmVsX3JlZiAobGFiZWwpKQorCQkJCShwYykpKSAqLwogCiAgIHBh dHRlcm4gPSBQQVRURVJOIChkb2xvb3BfcGF0KTsKIApAQCAtMTQzLDcgKzE0Myw3IEBAIGRvbG9v cF9jb25kaXRpb25fZ2V0IChydHhfaW5zbiAqZG9sb29wX3BhdCkKIAkgICAgICB8fCBHRVRfQ09E RSAoY21wX2FyZzEpICE9IFBMVVMpCiAJICAgIHJldHVybiAwOwogCSAgcmVnX29yaWcgPSBYRVhQ IChjbXBfYXJnMSwgMCk7Ci0JICBpZiAoWEVYUCAoY21wX2FyZzEsIDEpICE9IEdFTl9JTlQgKC0x KSAKKwkgIGlmICghQ09OU1RfSU5UX1AgKFhFWFAgKGNtcF9hcmcxLCAxKSkKIAkgICAgICB8fCAh UkVHX1AgKHJlZ19vcmlnKSkKIAkgICAgcmV0dXJuIDA7CiAJICBjY19yZWcgPSBTRVRfREVTVCAo Y21wX29yaWcpOwpAQCAtMTU2LDcgKzE1Niw4IEBAIGRvbG9vcF9jb25kaXRpb25fZ2V0IChydHhf aW5zbiAqZG9sb29wX3BhdCkKIAl7CiAJICAvKiBXZSBleHBlY3QgdGhlIGNvbmRpdGlvbiB0byBi ZSBvZiB0aGUgZm9ybSAocmVnICE9IDApICAqLwogCSAgY29uZCA9IFhFWFAgKFNFVF9TUkMgKGNt cCksIDApOwotCSAgaWYgKEdFVF9DT0RFIChjb25kKSAhPSBORSB8fCBYRVhQIChjb25kLCAxKSAh PSBjb25zdDBfcnR4KQorCSAgaWYgKChHRVRfQ09ERSAoY29uZCkgIT0gTkUgJiYgR0VUX0NPREUg KGNvbmQpICE9IEdFKQorCSAgICAgIHx8IFhFWFAgKGNvbmQsIDEpICE9IGNvbnN0MF9ydHgpCiAJ ICAgIHJldHVybiAwOwogCX0KICAgICB9CkBAIC0xNzMsMTQgKzE3NCwxNCBAQCBkb2xvb3BfY29u ZGl0aW9uX2dldCAocnR4X2luc24gKmRvbG9vcF9wYXQpCiAgIGlmICghIFJFR19QIChyZWcpKQog ICAgIHJldHVybiAwOwogCi0gIC8qIENoZWNrIGlmIHNvbWV0aGluZyA9IChwbHVzIChyZWcpIChj b25zdF9pbnQgLTEpKS4KKyAgLyogQ2hlY2sgaWYgc29tZXRoaW5nID0gKHBsdXMgKHJlZykgKGNv bnN0X2ludCAtbikpLgogICAgICBPbiBJQS02NCwgdGhpcyBkZWNyZW1lbnQgaXMgd3JhcHBlZCBp biBhbiBpZl90aGVuX2Vsc2UuICAqLwogICBpbmNfc3JjID0gU0VUX1NSQyAoaW5jKTsKICAgaWYg KEdFVF9DT0RFIChpbmNfc3JjKSA9PSBJRl9USEVOX0VMU0UpCiAgICAgaW5jX3NyYyA9IFhFWFAg KGluY19zcmMsIDEpOwogICBpZiAoR0VUX0NPREUgKGluY19zcmMpICE9IFBMVVMKICAgICAgIHx8 IFhFWFAgKGluY19zcmMsIDApICE9IHJlZwotICAgICAgfHwgWEVYUCAoaW5jX3NyYywgMSkgIT0g Y29uc3RtMV9ydHgpCisgICAgICB8fCAhQ09OU1RfSU5UX1AgKFhFWFAgKGluY19zcmMsIDEpKSkK ICAgICByZXR1cm4gMDsKIAogICAvKiBDaGVjayBmb3IgKHNldCAocGMpIChpZl90aGVuX2Vsc2Ug KGNvbmRpdGlvbikKQEAgLTIxMSw0MiArMjEyLDQ5IEBAIGRvbG9vcF9jb25kaXRpb25fZ2V0IChy dHhfaW5zbiAqZG9sb29wX3BhdCkKICAgICAgIHx8IChHRVRfQ09ERSAoWEVYUCAoY29uZGl0aW9u LCAwKSkgPT0gUExVUwogCSAgJiYgWEVYUCAoWEVYUCAoY29uZGl0aW9uLCAwKSwgMCkgPT0gcmVn KSkKICAgIHsKLSAgICAgaWYgKEdFVF9DT0RFIChwYXR0ZXJuKSAhPSBQQVJBTExFTCkKICAgICAg LyogIEZvciB0aGUgc2Vjb25kIGZvcm0gd2UgZXhwZWN0OgogCi0gICAgICAgICAoc2V0IChyZWcp IChwbHVzIChyZWcpIChjb25zdF9pbnQgLTEpKQotICAgICAgICAgKHNldCAocGMpIChpZl90aGVu X2Vsc2UgKHJlZyAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhYmVs X3JlZiAobGFiZWwpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBjKSkpLgor CSAoc2V0IChyZWcpIChwbHVzIChyZWcpIChjb25zdF9pbnQgLW4pKQorCSAoc2V0IChwYykgKGlm X3RoZW5fZWxzZSAocmVnICE9IDApCisJCQkJIChsYWJlbF9yZWYgKGxhYmVsKSkKKwkJCQkgKHBj KSkpLgogCi0gICAgICAgICBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6CisJIElmIG4g PT0gMSwgdGhhdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6CiAKLSAgICAgICAgIChw YXJhbGxlbCBbKHNldCAocGMpIChpZl90aGVuX2Vsc2UgKHJlZyAhPSAxKQotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFiZWxfcmVmIChsYWJlbCkpCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYykpKQotICAgICAgICAg ICAgICAgICAgICAgKHNldCAocmVnKSAocGx1cyAocmVnKSAoY29uc3RfaW50IC0xKSkpCi0gICAg ICAgICAgICAgICAgICAgICAoYWRkaXRpb25hbCBjbG9iYmVycyBhbmQgdXNlcyldKQorCSAocGFy YWxsZWwgWyhzZXQgKHBjKSAoaWZfdGhlbl9lbHNlIChyZWcgIT0gMSkKKwkJCQkJICAgIChsYWJl bF9yZWYgKGxhYmVsKSkKKwkJCQkJICAgIChwYykpKQorCQkgICAgIChzZXQgKHJlZykgKHBsdXMg KHJlZykgKGNvbnN0X2ludCAtMSkpKQorCQkgICAgIChhZGRpdGlvbmFsIGNsb2JiZXJzIGFuZCB1 c2VzKV0pCiAKLSAgICAgICAgRm9yIHRoZSB0aGlyZCBmb3JtIHdlIGV4cGVjdDoKKwlGb3IgdGhl IHRoaXJkIGZvcm0gd2UgZXhwZWN0OgogCi0gICAgICAgIChwYXJhbGxlbCBbKHNldCAoY2MpIChj b21wYXJlICgocGx1cyAocmVnKSAoY29uc3RfaW50IC0xKSksIDApKQotICAgICAgICAgICAgICAg ICAgIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkpKV0pCi0gICAgICAgIChz ZXQgKHBjKSAoaWZfdGhlbl9lbHNlIChjYyA9PSBORSkKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKGxhYmVsX3JlZiAobGFiZWwpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAocGMpKSkgCisJKHBhcmFsbGVsIFsoc2V0IChjYykgKGNvbXBhcmUgKChwbHVzIChyZWcp IChjb25zdF9pbnQgLW4pKSwgMCkpCisJCSAgIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0 X2ludCAtbikpKV0pCisJKHNldCAocGMpIChpZl90aGVuX2Vsc2UgKGNjID09IE5FKQorCQkJCShs YWJlbF9yZWYgKGxhYmVsKSkKKwkJCQkocGMpKSkKIAotICAgICAgICB3aGljaCBpcyBlcXVpdmFs ZW50IHRvIHRoZSBmb2xsb3dpbmc6CisJV2hpY2ggYWxzbyBmb3IgbiA9PSAxIGlzIGVxdWl2YWxl bnQgdG8gdGhlIGZvbGxvd2luZzoKIAotICAgICAgICAocGFyYWxsZWwgWyhzZXQgKGNjKSAoY29t cGFyZSAocmVnLCAgMSkpCi0gICAgICAgICAgICAgICAgICAgKHNldCAocmVnKSAocGx1cyAocmVn KSAoY29uc3RfaW50IC0xKSkpCi0gICAgICAgICAgICAgICAgICAgKHNldCAocGMpIChpZl90aGVu X2Vsc2UgKE5FID09IGNjKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIChsYWJlbF9yZWYgKGxhYmVsKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAocGMpKSkpXSkKKwkocGFyYWxsZWwgWyhzZXQgKGNjKSAoY29tcGFyZSAocmVn LCAgMSkpCisJCSAgIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkpKQorCQkg ICAoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAoTkUgPT0gY2MpCisJCQkJCSAgIChsYWJlbF9yZWYg KGxhYmVsKSkKKwkJCQkJICAgKHBjKSkpKV0pCiAKLSAgICAgICAgU28gd2UgcmV0dXJuIHRoZSBz ZWNvbmQgZm9ybSBpbnN0ZWFkIGZvciB0aGUgdHdvIGNhc2VzLgorCVNvIHdlIHJldHVybiB0aGUg c2Vjb25kIGZvcm0gaW5zdGVhZCBmb3IgdGhlIHR3byBjYXNlcy4KIAorCUZvciB0aGUgImVsZW1l bnR3aXNlIiBmb3JtIHdoZXJlIHRoZSBkZWNyZW1lbnQgbnVtYmVyIGlzbid0IC0xLAorCXRoZSBm aW5hbCB2YWx1ZSBtYXkgYmUgZXhjZWVkZWQsIHNvIHVzZSBHRSBpbnN0ZWFkIG9mIE5FLgogICAg ICAqLwotICAgICAgICBjb25kaXRpb24gPSBnZW5fcnR4X2ZtdF9lZSAoTkUsIFZPSURtb2RlLCBp bmNfc3JjLCBjb25zdDFfcnR4KTsKKyAgICAgaWYgKEdFVF9DT0RFIChwYXR0ZXJuKSAhPSBQQVJB TExFTCkKKyAgICAgICB7CisJaWYgKElOVFZBTCAoWEVYUCAoaW5jX3NyYywgMSkpICE9IC0xKQor CSAgY29uZGl0aW9uID0gZ2VuX3J0eF9mbXRfZWUgKEdFLCBWT0lEbW9kZSwgaW5jX3NyYywgY29u c3QwX3J0eCk7CisJZWxzZQorCSAgY29uZGl0aW9uID0gZ2VuX3J0eF9mbXRfZWUgKE5FLCBWT0lE bW9kZSwgaW5jX3NyYywgY29uc3QxX3J0eCk7OworICAgICAgIH0KIAogICAgIHJldHVybiBjb25k aXRpb247CiAgICB9CkBAIC02ODUsMTcgKzY5Myw2IEBAIGRvbG9vcF9vcHRpbWl6ZSAoY2xhc3Mg bG9vcCAqbG9vcCkKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgbWF4X2Nvc3QKLSAg ICA9IENPU1RTX05fSU5TTlMgKHBhcmFtX21heF9pdGVyYXRpb25zX2NvbXB1dGF0aW9uX2Nvc3Qp OwotICBpZiAoc2V0X3NyY19jb3N0IChkZXNjLT5uaXRlcl9leHByLCBtb2RlLCBvcHRpbWl6ZV9s b29wX2Zvcl9zcGVlZF9wIChsb29wKSkKLSAgICAgID4gbWF4X2Nvc3QpCi0gICAgewotICAgICAg aWYgKGR1bXBfZmlsZSkKLQlmcHJpbnRmIChkdW1wX2ZpbGUsCi0JCSAiRG9sb29wOiBudW1iZXIg b2YgaXRlcmF0aW9ucyB0b28gY29zdGx5IHRvIGNvbXB1dGUuXG4iKTsKLSAgICAgIHJldHVybiBm YWxzZTsKLSAgICB9Ci0KICAgaWYgKGRlc2MtPmNvbnN0X2l0ZXIpCiAgICAgaXRlcmF0aW9ucyA9 IHdpZGVzdF9pbnQ6OmZyb20gKHJ0eF9tb2RlX3QgKGRlc2MtPm5pdGVyX2V4cHIsIG1vZGUpLAog CQkJCSAgIFVOU0lHTkVEKTsKQEAgLTcxNiwxMSArNzEzLDI0IEBAIGRvbG9vcF9vcHRpbWl6ZSAo Y2xhc3MgbG9vcCAqbG9vcCkKIAogICAvKiBHZW5lcmF0ZSBsb29waW5nIGluc24uICBJZiB0aGUg cGF0dGVybiBGQUlMcyB0aGVuIGdpdmUgdXAgdHJ5aW5nCiAgICAgIHRvIG1vZGlmeSB0aGUgbG9v cCBzaW5jZSB0aGVyZSBpcyBzb21lIGFzcGVjdCB0aGUgYmFjay1lbmQgZG9lcwotICAgICBub3Qg bGlrZS4gICovCi0gIGNvdW50ID0gY29weV9ydHggKGRlc2MtPm5pdGVyX2V4cHIpOworICAgICBu b3QgbGlrZS4gIElmIHRoaXMgc3VjY2VlZHMsIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgdGhlIGxv b3AKKyAgICAgZGVzYy0+bml0ZXJfZXhwciBoYXMgYmVlbiBhbHRlcmVkIGJ5IHRoZSBiYWNrZW5k LCBzbyBvbmx5IGV4dHJhY3QKKyAgICAgdGhhdCBkYXRhIGFmdGVyIHRoZSBnZW5fZG9sb29wX2Vu ZC4gICovCiAgIHN0YXJ0X2xhYmVsID0gYmxvY2tfbGFiZWwgKGRlc2MtPmluX2VkZ2UtPmRlc3Qp OwogICBkb2xvb3BfcmVnID0gZ2VuX3JlZ19ydHggKG1vZGUpOwogICBydHhfaW5zbiAqZG9sb29w X3NlcSA9IHRhcmdldG0uZ2VuX2RvbG9vcF9lbmQgKGRvbG9vcF9yZWcsIHN0YXJ0X2xhYmVsKTsK KyAgY291bnQgPSBjb3B5X3J0eCAoZGVzYy0+bml0ZXJfZXhwcik7CisKKyAgbWF4X2Nvc3QKKyAg ICA9IENPU1RTX05fSU5TTlMgKHBhcmFtX21heF9pdGVyYXRpb25zX2NvbXB1dGF0aW9uX2Nvc3Qp OworICBpZiAoc2V0X3NyY19jb3N0IChjb3VudCwgbW9kZSwgb3B0aW1pemVfbG9vcF9mb3Jfc3Bl ZWRfcCAobG9vcCkpCisgICAgICA+IG1heF9jb3N0KQorICAgIHsKKyAgICAgIGlmIChkdW1wX2Zp bGUpCisJZnByaW50ZiAoZHVtcF9maWxlLAorCQkgIkRvbG9vcDogbnVtYmVyIG9mIGl0ZXJhdGlv bnMgdG9vIGNvc3RseSB0byBjb21wdXRlLlxuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAg fQogCiAgIHdvcmRfbW9kZV9zaXplID0gR0VUX01PREVfUFJFQ0lTSU9OICh3b3JkX21vZGUpOwog ICB3b3JkX21vZGVfbWF4ID0gKEhPU1RfV0lERV9JTlRfMVUgPDwgKHdvcmRfbW9kZV9zaXplIC0g MSkgPDwgMSkgLSAxOwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9s b2IuaCBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbG9iLmgKaW5kZXggZmVhYWU3Y2M4 OTkuLjM5NDFmZTdhOGI2IDEwMDY0NAotLS0gYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJt L2xvYi5oCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbG9iLmgKQEAgLTEsMTUg KzEsMTMxIEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0KKyNpbmNsdWRlIDxzdGRpbnQuaD4KIC8q IENvbW1vbiBjb2RlIGZvciBsb2IgdGVzdHMuICAqLwogCiAjZGVmaW5lIE5PX0xPQiBhc20gdm9s YXRpbGUgKCJAIGNsb2JiZXIgbHIiIDogOiA6ICJsciIgKQogCi0jZGVmaW5lIE4gMTAwMDAKKyNk ZWZpbmUgTiAxMDAKKworc3RhdGljIHZvaWQKK3Jlc2V0X2RhdGEgKGludCAqYSwgaW50ICpiLCBp bnQgKmMsIGludCB4KQoreworICBtZW1zZXQgKGEsIC0xLCB4ICogc2l6ZW9mICgqYSkpOworICBt ZW1zZXQgKGIsIC0xLCB4ICogc2l6ZW9mICgqYikpOworICBtZW1zZXQgKGMsIDAsIHggKiBzaXpl b2YgKCpjKSk7Cit9CisKK3N0YXRpYyB2b2lkCityZXNldF9kYXRhOCAoaW50OF90ICphLCBpbnQ4 X3QgKmIsIGludDhfdCAqYywgaW50IHgpCit7CisgIG1lbXNldCAoYSwgLTEsIHggKiBzaXplb2Yg KCphKSk7CisgIG1lbXNldCAoYiwgLTEsIHggKiBzaXplb2YgKCpiKSk7CisgIG1lbXNldCAoYywg MCwgeCAqIHNpemVvZiAoKmMpKTsKK30KKworc3RhdGljIHZvaWQKK3Jlc2V0X2RhdGExNiAoaW50 MTZfdCAqYSwgaW50MTZfdCAqYiwgaW50MTZfdCAqYywgaW50IHgpCit7CisgIG1lbXNldCAoYSwg LTEsIHggKiBzaXplb2YgKCphKSk7CisgIG1lbXNldCAoYiwgLTEsIHggKiBzaXplb2YgKCpiKSk7 CisgIG1lbXNldCAoYywgMCwgeCAqIHNpemVvZiAoKmMpKTsKK30KKworc3RhdGljIHZvaWQKK3Jl c2V0X2RhdGEzMiAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50MzJfdCAqYywgaW50IHgpCit7 CisgIG1lbXNldCAoYSwgLTEsIHggKiBzaXplb2YgKCphKSk7CisgIG1lbXNldCAoYiwgLTEsIHgg KiBzaXplb2YgKCpiKSk7CisgIG1lbXNldCAoYywgMCwgeCAqIHNpemVvZiAoKmMpKTsKK30KKwor c3RhdGljIHZvaWQKK3Jlc2V0X2RhdGE2NCAoaW50NjRfdCAqYSwgaW50NjRfdCAqYywgaW50IHgp Cit7CisgIG1lbXNldCAoYSwgLTEsIHggKiBzaXplb2YgKCphKSk7CisgIG1lbXNldCAoYywgMCwg eCAqIHNpemVvZiAoKmMpKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3BsdXMgKGludCAqYSwg aW50ICpiLCBpbnQgKmMsIGludCB4KQoreworICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykK KyAgICB7CisgICAgICBOT19MT0I7CisgICAgICBpZiAoaSA8IHgpCisJeworCSAgaWYgKGNbaV0g IT0gKGFbaV0gKyBiW2ldKSkgYWJvcnQgKCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChj W2ldICE9IDApIGFib3J0ICgpOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19w bHVzOCAoaW50OF90ICphLCBpbnQ4X3QgKmIsIGludDhfdCAqYywgaW50IHgpCit7CisgIGZvciAo aW50IGkgPSAwOyBpIDwgTjsgaSsrKQorICAgIHsKKyAgICAgIE5PX0xPQjsKKyAgICAgIGlmIChp IDwgeCkKKwl7CisJICBpZiAoY1tpXSAhPSAoYVtpXSArIGJbaV0pKSBhYm9ydCAoKTsKKwl9Cisg ICAgICBlbHNlCisJeworCSAgaWYgKGNbaV0gIT0gMCkgYWJvcnQgKCk7CisJfQorICAgIH0KK30K Kworc3RhdGljIHZvaWQKK2NoZWNrX3BsdXMxNiAoaW50MTZfdCAqYSwgaW50MTZfdCAqYiwgaW50 MTZfdCAqYywgaW50IHgpCit7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKQorICAgIHsK KyAgICAgIE5PX0xPQjsKKyAgICAgIGlmIChpIDwgeCkKKwl7CisJICBpZiAoY1tpXSAhPSAoYVtp XSArIGJbaV0pKSBhYm9ydCAoKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKGNbaV0gIT0g MCkgYWJvcnQgKCk7CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3BsdXMzMiAo aW50MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50MzJfdCAqYywgaW50IHgpCit7CisgIGZvciAoaW50 IGkgPSAwOyBpIDwgTjsgaSsrKQorICAgIHsKKyAgICAgIE5PX0xPQjsKKyAgICAgIGlmIChpIDwg eCkKKwl7CisJICBpZiAoY1tpXSAhPSAoYVtpXSArIGJbaV0pKSBhYm9ydCAoKTsKKwl9CisgICAg ICBlbHNlCisJeworCSAgaWYgKGNbaV0gIT0gMCkgYWJvcnQgKCk7CisJfQorICAgIH0KK30KIAog c3RhdGljIHZvaWQKLXJlc2V0X2RhdGEgKGludCAqYSwgaW50ICpiLCBpbnQgKmMpCitjaGVja19t ZW1jcHk2NCAoaW50NjRfdCAqYSwgaW50NjRfdCAqYywgaW50IHgpCiB7Ci0gIG1lbXNldCAoYSwg LTEsIE4gKiBzaXplb2YgKCphKSk7Ci0gIG1lbXNldCAoYiwgLTEsIE4gKiBzaXplb2YgKCpiKSk7 Ci0gIG1lbXNldCAoYywgLTEsIE4gKiBzaXplb2YgKCpjKSk7CisgIGZvciAoaW50IGkgPSAwOyBp IDwgTjsgaSsrKQorICAgIHsKKyAgICAgIE5PX0xPQjsKKyAgICAgIGlmIChpIDwgeCkKKwl7CisJ ICBpZiAoY1tpXSAhPSBhW2ldKSBhYm9ydCAoKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYg KGNbaV0gIT0gMCkgYWJvcnQgKCk7CisJfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2djYy90ZXN0 c3VpdGUvZ2NjLnRhcmdldC9hcm0vbG9iMS5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2Fy bS9sb2IxLmMKaW5kZXggYmE1YzgyY2Q1NWMuLmM4Y2U2NTNhNWMzIDEwMDY0NAotLS0gYS9nY2Mv dGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL2xvYjEuYworKysgYi9nY2MvdGVzdHN1aXRlL2djYy50 YXJnZXQvYXJtL2xvYjEuYwpAQCAtNTQsMjkgKzU0LDE4IEBAIGxvb3AzIChpbnQgKmEsIGludCAq YiwgaW50ICpjKQogICAgIH0gd2hpbGUgKGkgPCBOKTsKIH0KIAotdm9pZAotY2hlY2sgKGludCAq YSwgaW50ICpiLCBpbnQgKmMpCi17Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKQotICAg IHsKLSAgICAgIE5PX0xPQjsKLSAgICAgIGlmIChjW2ldICE9IGFbaV0gKyBiW2ldKQotCWFib3J0 ICgpOwotICAgIH0KLX0KLQogaW50CiBtYWluICh2b2lkKQogewotICByZXNldF9kYXRhIChhLCBi LCBjKTsKKyAgcmVzZXRfZGF0YSAoYSwgYiwgYywgTik7CiAgIGxvb3AxIChhLCBiICxjKTsKLSAg Y2hlY2sgKGEsIGIgLGMpOwotICByZXNldF9kYXRhIChhLCBiLCBjKTsKKyAgY2hlY2tfcGx1cyAo YSwgYiwgYywgTik7CisgIHJlc2V0X2RhdGEgKGEsIGIsIGMsIE4pOwogICBsb29wMiAoYSwgYiAs Yyk7Ci0gIGNoZWNrIChhLCBiICxjKTsKLSAgcmVzZXRfZGF0YSAoYSwgYiwgYyk7CisgIGNoZWNr X3BsdXMgKGEsIGIsIGMsIE4pOworICByZXNldF9kYXRhIChhLCBiLCBjLCBOKTsKICAgbG9vcDMg KGEsIGIgLGMpOwotICBjaGVjayAoYSwgYiAsYyk7CisgIGNoZWNrX3BsdXMgKGEsIGIsIGMsIE4p OwogCiAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L2FybS9sb2I2LmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL2xvYjYuYwppbmRleCAx N2I2MTI0Mjk1ZS4uNGZlMTE2ZTJjMmIgMTAwNjQ0Ci0tLSBhL2djYy90ZXN0c3VpdGUvZ2NjLnRh cmdldC9hcm0vbG9iNi5jCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbG9iNi5j CkBAIC03OSwxNCArNzksMTQgQEAgY2hlY2sgKHZvaWQpCiBpbnQKIG1haW4gKHZvaWQpCiB7Ci0g IHJlc2V0X2RhdGEgKGExLCBiMSwgYzEpOwotICByZXNldF9kYXRhIChhMiwgYjIsIGMyKTsKKyAg cmVzZXRfZGF0YSAoYTEsIGIxLCBjMSwgTik7CisgIHJlc2V0X2RhdGEgKGEyLCBiMiwgYzIsIE4p OwogICBsb29wMSAoYTEsIGIxLCBjMSk7CiAgIHJlZjEgKGEyLCBiMiwgYzIpOwogICBjaGVjayAo KTsKIAotICByZXNldF9kYXRhIChhMSwgYjEsIGMxKTsKLSAgcmVzZXRfZGF0YSAoYTIsIGIyLCBj Mik7CisgIHJlc2V0X2RhdGEgKGExLCBiMSwgYzEsIE4pOworICByZXNldF9kYXRhIChhMiwgYjIs IGMyLCBOKTsKICAgbG9vcDIgKGExLCBiMSwgYzEpOwogICByZWYyIChhMiwgYjIsIGMyKTsKICAg Y2hlY2sgKCk7CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9k bHN0cC1jb21waWxlLWFzbS5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9tdmUvZGxz dHAtY29tcGlsZS1hc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4u ZjY2YzIwYTg4NGIKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQv YXJtL212ZS9kbHN0cC1jb21waWxlLWFzbS5jCkBAIC0wLDAgKzEsNTM3IEBACisvKiB7IGRnLWRv IGNvbXBpbGUgeyB0YXJnZXQgeyBhcm0qLSotKiB9IH0gfSAqLworLyogeyBkZy1yZXF1aXJlLWVm ZmVjdGl2ZS10YXJnZXQgYXJtX3Y4XzFtX212ZV9vayB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1P MyAtc2F2ZS10ZW1wcyIgfSAqLworLyogeyBkZy1hZGQtb3B0aW9ucyBhcm1fdjhfMW1fbXZlIH0g Ki8KKworI2luY2x1ZGUgPGFybV9tdmUuaD4KKworI2RlZmluZSBJTU0gNQorCisjZGVmaW5lIFRF U1RfQ09NUElMRV9JTl9ETFNUUF9URVJOQVJZKEJJVFMsIExBTkVTLCBMRFJTVFJZVFBFLCBUWVBF LCBTSUdOLCBOQU1FLCBQUkVEKQkJCQlcCit2b2lkIHRlc3RfIyNOQU1FIyNQUkVEIyNfIyNTSUdO IyNCSVRTIChUWVBFIyNCSVRTIyNfdCAqYSwgVFlQRSMjQklUUyMjX3QgKmIsICBUWVBFIyNCSVRT IyNfdCAqYywgaW50IG4pCVwKK3sJCQkJCQkJCQkJCVwKKyAgd2hpbGUgKG4gPiAwKQkJCQkJCQkJ CQlcCisgICAgewkJCQkJCQkJCQkJXAorICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwIyNCSVRT IyNxIChuKTsJCQkJCQlcCisgICAgICBUWVBFIyNCSVRTIyN4IyNMQU5FUyMjX3QgdmEgPSB2bGRy IyNMRFJTVFJZVFBFIyNxX3pfIyNTSUdOIyNCSVRTIChhLCBwKTsJCVwKKyAgICAgIFRZUEUjI0JJ VFMjI3gjI0xBTkVTIyNfdCB2YiA9IHZsZHIjI0xEUlNUUllUUEUjI3Ffel8jI1NJR04jI0JJVFMg KGIsIHApOwkJXAorICAgICAgVFlQRSMjQklUUyMjeCMjTEFORVMjI190IHZjID0gTkFNRSMjUFJF RCMjXyMjU0lHTiMjQklUUyAodmEsIHZiLCBwKTsJCVwKKyAgICAgIHZzdHIjI0xEUlNUUllUUEUj I3FfcF8jI1NJR04jI0JJVFMgKGMsIHZjLCBwKTsJCQkJCVwKKyAgICAgIGMgKz0gTEFORVM7CQkJ CQkJCQkJXAorICAgICAgYSArPSBMQU5FUzsJCQkJCQkJCQlcCisgICAgICBiICs9IExBTkVTOwkJ CQkJCQkJCVwKKyAgICAgIG4gLT0gTEFORVM7CQkJCQkJCQkJXAorICAgIH0JCQkJCQkJCQkJCVwK K30KKworI2RlZmluZSBURVNUX0NPTVBJTEVfSU5fRExTVFBfU0lHTkVEX1VOU0lHTkVEX1RFUk5B UlkoQklUUywgTEFORVMsIExEUlNUUllUUEUsIE5BTUUsIFBSRUQpCVwKK1RFU1RfQ09NUElMRV9J Tl9ETFNUUF9URVJOQVJZIChCSVRTLCBMQU5FUywgTERSU1RSWVRQRSwgaW50LCBzLCBOQU1FLCBQ UkVEKQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9URVJOQVJZIChCSVRTLCBMQU5FUywgTERS U1RSWVRQRSwgdWludCwgdSwgTkFNRSwgUFJFRCkKKworI2RlZmluZSBURVNUX0NPTVBJTEVfSU5f RExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWShOQU1FLCBQUkVEKQkJCVwKK1RF U1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVSTkFSWSAoOCwgMTYsIGIsIE5B TUUsIFBSRUQpCQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVS TkFSWSAoMTYsIDgsIGgsIE5BTUUsIFBSRUQpCQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9T SUdORURfVU5TSUdORURfVEVSTkFSWSAoMzIsIDQsIHcsIE5BTUUsIFBSRUQpCisKKworVEVTVF9D T01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUlkgKHZhZGRxLCBf eCkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZ ICh2bXVscSwgX3gpCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdO RURfVEVSTkFSWSAodnN1YnEsIF94KQorVEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lH TkVEX1VOU0lHTkVEX1RFUk5BUlkgKHZoYWRkcSwgX3gpCitURVNUX0NPTVBJTEVfSU5fRExTVFBf SU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWSAodm9ycnEsIF94KQorCisKKyNkZWZpbmUg VEVTVF9DT01QSUxFX0lOX0RMU1RQX1RFUk5BUllfTShCSVRTLCBMQU5FUywgTERSU1RSWVRQRSwg VFlQRSwgU0lHTiwgTkFNRSwgUFJFRCkJCQkJXAordm9pZCB0ZXN0XyMjTkFNRSMjUFJFRCMjXyMj U0lHTiMjQklUUyAoVFlQRSMjQklUUyMjeCMjTEFORVMjI190IF9faW5hY3RpdmUsIFRZUEUjI0JJ VFMjI190ICphLCBUWVBFIyNCSVRTIyNfdCAqYiwgIFRZUEUjI0JJVFMjI190ICpjLCBpbnQgbikJ XAorewkJCQkJCQkJCQkJXAorICB3aGlsZSAobiA+IDApCQkJCQkJCQkJCVwKKyAgICB7CQkJCQkJ CQkJCQlcCisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAjI0JJVFMjI3EgKG4pOwkJCQkJCVwK KyAgICAgIFRZUEUjI0JJVFMjI3gjI0xBTkVTIyNfdCB2YSA9IHZsZHIjI0xEUlNUUllUUEUjI3Ff el8jI1NJR04jI0JJVFMgKGEsIHApOwkJXAorICAgICAgVFlQRSMjQklUUyMjeCMjTEFORVMjI190 IHZiID0gdmxkciMjTERSU1RSWVRQRSMjcV96XyMjU0lHTiMjQklUUyAoYiwgcCk7CQlcCisgICAg ICBUWVBFIyNCSVRTIyN4IyNMQU5FUyMjX3QgdmMgPSBOQU1FIyNQUkVEIyNfIyNTSUdOIyNCSVRT IChfX2luYWN0aXZlLCB2YSwgdmIsIHApOwkJXAorICAgICAgdnN0ciMjTERSU1RSWVRQRSMjcV9w XyMjU0lHTiMjQklUUyAoYywgdmMsIHApOwkJCQkJXAorICAgICAgYyArPSBMQU5FUzsJCQkJCQkJ CQlcCisgICAgICBhICs9IExBTkVTOwkJCQkJCQkJCVwKKyAgICAgIGIgKz0gTEFORVM7CQkJCQkJ CQkJXAorICAgICAgbiAtPSBMQU5FUzsJCQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCQkJXAorfQor CisjZGVmaW5lIFRFU1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVSTkFSWV9N KEJJVFMsIExBTkVTLCBMRFJTVFJZVFBFLCBOQU1FLCBQUkVEKQlcCitURVNUX0NPTVBJTEVfSU5f RExTVFBfVEVSTkFSWV9NIChCSVRTLCBMQU5FUywgTERSU1RSWVRQRSwgaW50LCBzLCBOQU1FLCBQ UkVEKQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9URVJOQVJZX00gKEJJVFMsIExBTkVTLCBM RFJTVFJZVFBFLCB1aW50LCB1LCBOQU1FLCBQUkVEKQorCisjZGVmaW5lIFRFU1RfQ09NUElMRV9J Tl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX00oTkFNRSwgUFJFRCkJCQlc CitURVNUX0NPTVBJTEVfSU5fRExTVFBfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTSAoOCwgMTYs IGIsIE5BTUUsIFBSRUQpCQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURfVU5TSUdO RURfVEVSTkFSWV9NICgxNiwgOCwgaCwgTkFNRSwgUFJFRCkJCQkJXAorVEVTVF9DT01QSUxFX0lO X0RMU1RQX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX00gKDMyLCA0LCB3LCBOQU1FLCBQUkVEKQor CisKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZ X00gKHZhZGRxLCBfbSkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJ R05FRF9URVJOQVJZX00gKHZtdWxxLCBfbSkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRT X1NJR05FRF9VTlNJR05FRF9URVJOQVJZX00gKHZzdWJxLCBfbSkKK1RFU1RfQ09NUElMRV9JTl9E TFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX00gKHZoYWRkcSwgX20pCitURVNU X0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWV9NICh2b3Jy cSwgX20pCisKKyNkZWZpbmUgVEVTVF9DT01QSUxFX0lOX0RMU1RQX1RFUk5BUllfTihCSVRTLCBM QU5FUywgTERSU1RSWVRQRSwgVFlQRSwgU0lHTiwgTkFNRSwgUFJFRCkJXAordm9pZCB0ZXN0XyMj TkFNRSMjUFJFRCMjX25fIyNTSUdOIyNCSVRTIChUWVBFIyNCSVRTIyNfdCAqYSwgIFRZUEUjI0JJ VFMjI190ICpjLCBpbnQgbikJXAorewkJCQkJCQkJCQkJXAorICB3aGlsZSAobiA+IDApCQkJCQkJ CQkJCVwKKyAgICB7CQkJCQkJCQkJCQlcCisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAjI0JJ VFMjI3EgKG4pOwkJCQkJCVwKKyAgICAgIFRZUEUjI0JJVFMjI3gjI0xBTkVTIyNfdCB2YSA9IHZs ZHIjI0xEUlNUUllUUEUjI3Ffel8jI1NJR04jI0JJVFMgKGEsIHApOwkJXAorICAgICAgVFlQRSMj QklUUyMjeCMjTEFORVMjI190IHZjID0gTkFNRSMjUFJFRCMjX25fIyNTSUdOIyNCSVRTICh2YSwg SU1NLCBwKTsJCVwKKyAgICAgIHZzdHIjI0xEUlNUUllUUEUjI3FfcF8jI1NJR04jI0JJVFMgKGMs IHZjLCBwKTsJCQkJCVwKKyAgICAgIGMgKz0gTEFORVM7CQkJCQkJCQkJXAorICAgICAgYSArPSBM QU5FUzsJCQkJCQkJCQlcCisgICAgICBuIC09IExBTkVTOwkJCQkJCQkJCVwKKyAgICB9CQkJCQkJ CQkJCQlcCit9CisKKyNkZWZpbmUgVEVTVF9DT01QSUxFX0lOX0RMU1RQX1NJR05FRF9VTlNJR05F RF9URVJOQVJZX04oQklUUywgTEFORVMsIExEUlNUUllUUEUsIE5BTUUsIFBSRUQpCVwKK1RFU1Rf Q09NUElMRV9JTl9ETFNUUF9URVJOQVJZX04gKEJJVFMsIExBTkVTLCBMRFJTVFJZVFBFLCBpbnQs IHMsIE5BTUUsIFBSRUQpCQkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1RFUk5BUllfTiAoQklU UywgTEFORVMsIExEUlNUUllUUEUsIHVpbnQsIHUsIE5BTUUsIFBSRUQpCisKKyNkZWZpbmUgVEVT VF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTihOQU1F LCBQUkVEKQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVSTkFS WV9OICg4LCAxNiwgYiwgTkFNRSwgUFJFRCkJCQkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1NJ R05FRF9VTlNJR05FRF9URVJOQVJZX04gKDE2LCA4LCBoLCBOQU1FLCBQUkVEKQkJCQlcCitURVNU X0NPTVBJTEVfSU5fRExTVFBfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTiAoMzIsIDQsIHcsIE5B TUUsIFBSRUQpCisKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05F RF9URVJOQVJZX04gKHZhZGRxLCBfeCkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJ R05FRF9VTlNJR05FRF9URVJOQVJZX04gKHZtdWxxLCBfeCkKK1RFU1RfQ09NUElMRV9JTl9ETFNU UF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX04gKHZzdWJxLCBfeCkKK1RFU1RfQ09N UElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX04gKHZoYWRkcSwg X3gpCisKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJO QVJZX04gKHZicnNycSwgX3gpCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURf VU5TSUdORURfVEVSTkFSWV9OICh2c2hscSwgX3gpCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5U QklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWV9OICh2c2hycSwgX3gpCisKKyNkZWZpbmUgVEVT VF9DT01QSUxFX0lOX0RMU1RQX1RFUk5BUllfTV9OKEJJVFMsIExBTkVTLCBMRFJTVFJZVFBFLCBU WVBFLCBTSUdOLCBOQU1FLCBQUkVEKQlcCit2b2lkIHRlc3RfIyNOQU1FIyNQUkVEIyNfbl8jI1NJ R04jI0JJVFMgKFRZUEUjI0JJVFMjI3gjI0xBTkVTIyNfdCBfX2luYWN0aXZlLCBUWVBFIyNCSVRT IyNfdCAqYSwgIFRZUEUjI0JJVFMjI190ICpjLCBpbnQgbikJXAorewkJCQkJCQkJCQkJXAorICB3 aGlsZSAobiA+IDApCQkJCQkJCQkJCVwKKyAgICB7CQkJCQkJCQkJCQlcCisgICAgICBtdmVfcHJl ZDE2X3QgcCA9IHZjdHAjI0JJVFMjI3EgKG4pOwkJCQkJCVwKKyAgICAgIFRZUEUjI0JJVFMjI3gj I0xBTkVTIyNfdCB2YSA9IHZsZHIjI0xEUlNUUllUUEUjI3Ffel8jI1NJR04jI0JJVFMgKGEsIHAp OwkJXAorICAgICAgVFlQRSMjQklUUyMjeCMjTEFORVMjI190IHZjID0gTkFNRSMjUFJFRCMjX25f IyNTSUdOIyNCSVRTIChfX2luYWN0aXZlLCB2YSwgSU1NLCBwKTsJCVwKKyAgICAgIHZzdHIjI0xE UlNUUllUUEUjI3FfcF8jI1NJR04jI0JJVFMgKGMsIHZjLCBwKTsJCQkJCVwKKyAgICAgIGMgKz0g TEFORVM7CQkJCQkJCQkJXAorICAgICAgYSArPSBMQU5FUzsJCQkJCQkJCQlcCisgICAgICBuIC09 IExBTkVTOwkJCQkJCQkJCVwKKyAgICB9CQkJCQkJCQkJCQlcCit9CisKKyNkZWZpbmUgVEVTVF9D T01QSUxFX0lOX0RMU1RQX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX01fTihCSVRTLCBMQU5FUywg TERSU1RSWVRQRSwgTkFNRSwgUFJFRCkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1RFUk5BUllf TV9OIChCSVRTLCBMQU5FUywgTERSU1RSWVRQRSwgaW50LCBzLCBOQU1FLCBQUkVEKQkJCVwKK1RF U1RfQ09NUElMRV9JTl9ETFNUUF9URVJOQVJZX01fTiAoQklUUywgTEFORVMsIExEUlNUUllUUEUs IHVpbnQsIHUsIE5BTUUsIFBSRUQpCisKKyNkZWZpbmUgVEVTVF9DT01QSUxFX0lOX0RMU1RQX0lO VEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTV9OKE5BTUUsIFBSRUQpCQkJXAorVEVTVF9D T01QSUxFX0lOX0RMU1RQX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX01fTiAoOCwgMTYsIGIsIE5B TUUsIFBSRUQpCQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVS TkFSWV9NX04gKDE2LCA4LCBoLCBOQU1FLCBQUkVEKQkJCQlcCitURVNUX0NPTVBJTEVfSU5fRExT VFBfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTV9OICgzMiwgNCwgdywgTkFNRSwgUFJFRCkKKwor VEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTV9O ICh2YWRkcSwgX20pCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdO RURfVEVSTkFSWV9NX04gKHZtdWxxLCBfbSkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRT X1NJR05FRF9VTlNJR05FRF9URVJOQVJZX01fTiAodnN1YnEsIF9tKQorVEVTVF9DT01QSUxFX0lO X0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTV9OICh2aGFkZHEsIF9tKQor CitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWV9N X04gKHZicnNycSwgX20pCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5T SUdORURfVEVSTkFSWV9NX04gKHZzaGxxLCBfbSkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRC SVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX01fTiAodnNocnEsIF9tKQorCisvKiBOb3cgdGVz dCBzb21lIG1vcmUgY29uZmlndXJhdGlvbnMuICAqLworCisvKiBVc2luZyBhID49MSBjb25kaXRp b24uICAqLwordm9pZCB0ZXN0MSAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50MzJfdCAqYywg aW50IG4pCit7CisgIHdoaWxlIChuID49IDEpCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAg PSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7 CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRyd3Ffel9zMzIgKGIsIHApOworICAgICAgaW50MzJ4 NF90IHZjID0gdmFkZHFfeF9zMzIgKHZhLCB2YiwgcCk7CisgICAgICB2c3Ryd3FfcF9zMzIgKGMs IHZjLCBwKTsKKyAgICAgIGMrPTQ7CisgICAgICBhKz00OworICAgICAgYis9NDsKKyAgICAgIG4t PTQ7CisgICAgfQorfQorCisvKiBUZXN0IGEgZm9yIGxvb3AgZm9ybWF0IG9mIGRlY3JlbWVudGlu ZyB0byB6ZXJvICovCitpbnQzMl90IGFbXSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3fTsKK3Zv aWQgdGVzdDIgKGludDMyX3QgKmIsIGludCBudW1fZWxlbXMpCit7CisgICAgZm9yIChpbnQgaSA9 IG51bV9lbGVtczsgaSA+IDA7IGktPSA0KQorICAgIHsKKyAgICAgICAgbXZlX3ByZWQxNl90IHAg PSB2Y3RwMzJxIChpKTsKKyAgICAgICAgaW50MzJ4NF90IHZhID0gdmxkcndxX3pfczMyICgmKGFb aV0pLCBwKTsKKyAgICAgICAgdnN0cndxX3BfczMyIChiICsgaSwgdmEsIHApOworICAgIH0KK30K KworLyogSXRlcmF0aW9uIGNvdW50ZXIgY291bnRpbmcgdXAgdG8gbnVtX2l0ZXIuICAqLwordm9p ZCB0ZXN0MyAodWludDhfdCAqYSwgdWludDhfdCAqYiwgdWludDhfdCAqYywgaW50IG4pCit7Cisg ICAgaW50IG51bV9pdGVyID0gKG4gKyAxNSkvMTY7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBu dW1faXRlcjsgaSsrKQorICAgIHsKKyAgICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwOHEgKG4p OworICAgICAgICB1aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTggKGEsIHApOworICAgICAgICB1 aW50OHgxNl90IHZiID0gdmxkcmJxX3pfdTggKGIsIHApOworICAgICAgICB1aW50OHgxNl90IHZj ID0gdmFkZHFfeF91OCAodmEsIHZiLCBwKTsKKyAgICAgICAgdnN0cmJxX3BfdTggKGMsIHZjLCBw KTsKKyAgICAgICAgbi09MTY7CisgICAgfQorfQorCisvKiBVc2luZyBhbiB1bnByZWRpY2F0ZWQg YXJpdGhtZXRpYyBpbnN0cnVjdGlvbiB3aXRoaW4gdGhlIGxvb3AuICAqLwordm9pZCB0ZXN0NCAo dWludDhfdCAqYSwgdWludDhfdCAqYiwgdWludDhfdCAqYywgIHVpbnQ4X3QgKmQsIGludCBuKQor eworICAgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0 cDhxIChuKTsKKyAgICAgICAgdWludDh4MTZfdCB2YSA9IHZsZHJicV96X3U4IChhLCBwKTsKKyAg ICAgICAgdWludDh4MTZfdCB2YiA9IHZsZHJicV91OCAoYik7CisJLyogSXMgYWZmZWN0ZWQgYnkg aW1wbGljaXQgcHJlZGljYXRpb24sIGJlY2F1c2UgdmIgYWxzbworCWNhbWUgZnJvbSBhbiB1bnBy ZWRpY2F0ZWQgbG9hZCwgYnV0IHRoZXJlIGlzIG5vIGZ1bmN0aW9uYWwKKwlwcm9ibGVtLCBiZWNh dXNlIHRoZSByZXN1bHQgaXMgdXNlZCBpbiBhIHByZWRpY2F0ZWQgc3RvcmUuICAqLyAKKyAgICAg ICAgdWludDh4MTZfdCB2YyA9IHZhZGRxX3U4ICh2YSwgdmIpOworICAgICAgICB1aW50OHgxNl90 IHZkID0gdmFkZHFfeF91OCAodmEsIHZiLCBwKTsKKyAgICAgICAgdnN0cmJxX3BfdTggKGMsIHZj LCBwKTsKKyAgICAgICAgdnN0cmJxX3BfdTggKGQsIHZkLCBwKTsKKyAgICAgICAgbi09MTY7Cisg ICAgfQorfQorCisvKiBVc2luZyBhIGRpZmZlcmVudCBWUFIgdmFsdWUgZm9yIG9uZSBpbnN0cnVj dGlvbiBpbiB0aGUgbG9vcC4gICovCit2b2lkIHRlc3Q1IChpbnQzMl90ICphLCBpbnQzMl90ICpi LCBpbnQzMl90ICpjLCBpbnQgbiwgbXZlX3ByZWQxNl90IHAxKQoreworICB3aGlsZSAobiA+IDAp CisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMy eDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRy d3Ffel9zMzIgKGIsIHAxKTsKKyAgICAgIGludDMyeDRfdCB2YyA9IHZhZGRxX3hfczMyICh2YSwg dmIsIHApOworICAgICAgdnN0cndxX3BfczMyIChjLCB2YywgcCk7CisgICAgICBjICs9IDQ7Cisg ICAgICBhICs9IDQ7CisgICAgICBiICs9IDQ7CisgICAgICBuIC09IDQ7CisgICAgfQorfQorCisv KiBHZW5lcmF0aW5nIGFuZCB1c2luZyBhbm90aGVyIFZQUiB2YWx1ZSBpbiB0aGUgbG9vcCwgd2l0 aCBhIHZjdHAuCisgICBUaGUgZG9sb29wIGxvZ2ljIHdpbGwgYWx3YXlzIHRyeSB0byBkbyB0aGUg dHJhbnNmb3JtIG9uIHRoZSBmaXJzdAorICAgdmN0cCBpdCBlbmNvdW50ZXJzLCBzbyB0aGlzIGlz IHN0aWxsIGV4cGVjdGVkIHRvIHdvcmsuICAqLwordm9pZCB0ZXN0NiAoaW50MzJfdCAqYSwgaW50 MzJfdCAqYiwgaW50MzJfdCAqYywgaW50IG4sIGludCBnKQoreworICB3aGlsZSAobiA+IDApCisg ICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMyeDRf dCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7CisgICAgICBtdmVfcHJlZDE2X3QgcDEgPSB2Y3Rw MzJxIChnKTsKKyAgICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3cV96X3MzMiAoYiwgcDEpOworICAg ICAgaW50MzJ4NF90IHZjID0gdmFkZHFfeF9zMzIgKHZhLCB2YiwgcCk7CisgICAgICB2c3Ryd3Ff cF9zMzIgKGMsIHZjLCBwKTsKKyAgICAgIGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIg Kz0gNDsKKyAgICAgIG4gLT0gNDsKKyAgICB9Cit9CisKKy8qIEdlbmVyYXRpbmcgYW5kIHVzaW5n IGEgZGlmZmVyZW50IFZQUiB2YWx1ZSBpbiB0aGUgbG9vcCwgd2l0aCBhIHZjdHAsCisgICBidXQg dGhpcyB0aW1lIHRoZSBwMSB3aWxsIGFsc28gY2hhbmNlIGluIGV2ZXJ5IGxvb3AgKHN0aWxsIGZp bmUpICAqLwordm9pZCB0ZXN0NyAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50MzJfdCAqYywg aW50IG4sIGludCBnKQoreworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQx Nl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAo YSwgcCk7CisgICAgICBtdmVfcHJlZDE2X3QgcDEgPSB2Y3RwMzJxIChnKTsKKyAgICAgIGludDMy eDRfdCB2YiA9IHZsZHJ3cV96X3MzMiAoYiwgcDEpOworICAgICAgaW50MzJ4NF90IHZjID0gdmFk ZHFfeF9zMzIgKHZhLCB2YiwgcCk7CisgICAgICB2c3Ryd3FfcF9zMzIgKGMsIHZjLCBwKTsKKyAg ICAgIGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIgKz0gNDsKKyAgICAgIG4gLT0gNDsK KyAgICAgIGcrKzsKKyAgICB9Cit9CisKKy8qIEdlbmVyYXRpbmcgYW5kIHVzaW5nIGEgZGlmZmVy ZW50IFZQUiB2YWx1ZSBpbiB0aGUgbG9vcCwgd2l0aCBhIHZjdHBfbQorICAgdGhhdCBpcyBpbmRl cGVuZGVudCBvZiB0aGUgbG9vcCB2Y3RwIFZQUi4gICovCit2b2lkIHRlc3Q4IChpbnQzMl90ICph LCBpbnQzMl90ICpiLCBpbnQzMl90ICpjLCBpbnQgbiwgbXZlX3ByZWQxNl90IHAxKQoreworICB3 aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsK KyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7CisgICAgICBtdmVfcHJl ZDE2X3QgcDIgPSB2Y3RwMzJxX20gKG4sIHAxKTsKKyAgICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3 cV96X3MzMiAoYiwgcDEpOworICAgICAgaW50MzJ4NF90IHZjID0gdmFkZHFfeF9zMzIgKHZhLCB2 YiwgcDIpOworICAgICAgdnN0cndxX3BfczMyIChjLCB2YywgcCk7CisgICAgICBjICs9IDQ7Cisg ICAgICBhICs9IDQ7CisgICAgICBiICs9IDQ7CisgICAgICBuIC09IDQ7CisgICAgfQorfQorCisv KiBHZW5lcmF0aW5nIGFuZCB1c2luZyBhIGRpZmZlcmVudCBWUFIgdmFsdWUgaW4gdGhlIGxvb3As CisgICB3aXRoIGEgdmN0cF9tIHRoYXQgaXMgdGllZCB0byB0aGUgYmFzZSB2Y3RwIFZQUi4gIFRo aXMKKyAgIGlzIHN0aWxsIGZpbmUsIGJlY2F1c2UgdGhlIHZjdHBfbSB3aWxsIGJlIHRyYW5zZm9y bWVkCisgICBpbnRvIGEgdmN0cCBhbmQgYmUgaW1wbGljaXRseSBwcmVkaWNhdGVkLiAgKi8KK3Zv aWQgdGVzdDkgKGludDMyX3QgKmEsIGludDMyX3QgKmIsIGludDMyX3QgKmMsIGludCBuKQorewor ICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxIChu KTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7CisgICAgICBtdmVf cHJlZDE2X3QgcDEgPSB2Y3RwMzJxX20gKG4sIHApOworICAgICAgaW50MzJ4NF90IHZiID0gdmxk cndxX3pfczMyIChiLCBwMSk7CisgICAgICBpbnQzMng0X3QgdmMgPSB2YWRkcV94X3MzMiAodmEs IHZiLCBwMSk7CisgICAgICB2c3Ryd3FfcF9zMzIgKGMsIHZjLCBwKTsKKyAgICAgIGMgKz0gNDsK KyAgICAgIGEgKz0gNDsKKyAgICAgIGIgKz0gNDsKKyAgICAgIG4gLT0gNDsKKyAgICB9Cit9CisK Ky8qIEdlbmVyYXRpbmcgYW5kIHVzaW5nIGEgZGlmZmVyZW50IFZQUiB2YWx1ZSBpbiB0aGUgbG9v cCwgd2l0aCBhIHZjbXAuICAqLwordm9pZCB0ZXN0MTAgKGludDMyX3QgKmEsIGludDMyX3QgKmIs IGludDMyX3QgKmMsIGludCBuKQoreworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZl X3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96 X3MzMiAoYSwgcCk7CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRyd3Ffel9zMzIgKGIsIHApOwor ICAgICAgbXZlX3ByZWQxNl90IHAxID0gdmNtcGVxcV9zMzIgKHZhLCB2Yik7CisgICAgICBpbnQz Mng0X3QgdmMgPSB2YWRkcV94X3MzMiAodmEsIHZiLCBwMSk7CisgICAgICB2c3Ryd3FfcF9zMzIg KGMsIHZjLCBwKTsKKyAgICAgIGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIgKz0gNDsK KyAgICAgIG4gLT0gNDsKKyAgICB9Cit9CisKKy8qIEdlbmVyYXRpbmcgYW5kIHVzaW5nIGEgZGlm ZmVyZW50IFZQUiB2YWx1ZSBpbiB0aGUgbG9vcCwgd2l0aCBhIHZjbXBfbS4gICovCit2b2lkIHRl c3QxMSAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50MzJfdCAqYywgaW50IG4sIG12ZV9wcmVk MTZfdCBwMSkKK3sKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBw ID0gdmN0cDMycSAobik7CisgICAgICBpbnQzMng0X3QgdmEgPSB2bGRyd3Ffel9zMzIgKGEsIHAp OworICAgICAgaW50MzJ4NF90IHZiID0gdmxkcndxX3pfczMyIChiLCBwKTsKKyAgICAgIG12ZV9w cmVkMTZfdCBwMiA9IHZjbXBlcXFfbV9zMzIgKHZhLCB2YiwgcDEpOworICAgICAgaW50MzJ4NF90 IHZjID0gdmFkZHFfeF9zMzIgKHZhLCB2YiwgcDIpOworICAgICAgdnN0cndxX3BfczMyIChjLCB2 YywgcCk7CisgICAgICBjICs9IDQ7CisgICAgICBhICs9IDQ7CisgICAgICBiICs9IDQ7CisgICAg ICBuIC09IDQ7CisgICAgfQorfQorCisvKiBHZW5lcmF0aW5nIGFuZCB1c2luZyBhIGRpZmZlcmVu dCBWUFIgdmFsdWUgaW4gdGhlIGxvb3AsIHdpdGggYSB2Y21wX20gCisgICB0aGF0IGlzIHRpZWQg dG8gdGhlIGJhc2UgdmN0cCBWUFIgKHNhbWUgYXMgYWJvdmUsIHRoaXMgd2lsbCBiZSB0dXJuZWQK KyAgIGludG8gYSB2Y21wIGFuZCBiZSBpbXBsaWNpdGx5IHByZWRpY2F0ZWQpLiAgKi8KK3ZvaWQg dGVzdDEyIChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90ICpjLCBpbnQgbiwgbXZlX3By ZWQxNl90IHAxKQoreworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90 IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwg cCk7CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRyd3Ffel9zMzIgKGIsIHApOworICAgICAgbXZl X3ByZWQxNl90IHAyID0gdmNtcGVxcV9tX3MzMiAodmEsIHZiLCBwKTsKKyAgICAgIGludDMyeDRf dCB2YyA9IHZhZGRxX3hfczMyICh2YSwgdmIsIHAyKTsKKyAgICAgIHZzdHJ3cV9wX3MzMiAoYywg dmMsIHApOworICAgICAgYyArPSA0OworICAgICAgYSArPSA0OworICAgICAgYiArPSA0OworICAg ICAgbiAtPSA0OworICAgIH0KK30KKworLyogVXNpbmcgYW4gdW5wcmVkaWNhdGVkIG9wIHdpdGgg YSBzY2FsYXIgb3V0cHV0LCB3aGVyZSB0aGUgcmVzdWx0IGlzIHZhbGlkCisgICBvdXRzaWRlIHRo ZSBiYi4gIFRoaXMgaXMgdmFsaWQsIGJlY2F1c2UgYWxsIHRoZSBpbnB1dHMgdG8gdGhlIHVucHJl ZGljYXRlZAorICAgb3AgYXJlIGNvcnJlY3RseSBwcmVkaWNhdGVkLiAgKi8KK3VpbnQ4X3QgdGVz dDEzICh1aW50OF90ICphLCB1aW50OF90ICpiLCB1aW50OF90ICpjLCBpbnQgbiwgdWludDh4MTZf dCB2eCkKK3sKKyAgICB1aW50OF90IHN1bSA9IDA7CisgICAgd2hpbGUgKG4gPiAwKQorICAgIHsK KyAgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHA4cSAobik7CisgICAgICAgdWludDh4MTZfdCB2 YSA9IHZsZHJicV96X3U4IChhLCBwKTsKKyAgICAgICB1aW50OHgxNl90IHZiID0gdmxkcmJxX3pf dTggKGIsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmMgPSB2YWRkcV9tX3U4ICh2eCwgdmEsIHZi LCBwKTsKKyAgICAgICBzdW0gKz0gdmFkZHZxX3U4ICh2Yyk7CisgICAgICAgYSArPSAxNjsKKyAg ICAgICBiICs9IDE2OworICAgICAgIG4gLT0gMTY7CisgICAgfQorICAgIHJldHVybiBzdW07Cit9 CisKKy8qIFNhbWUgYXMgYWJvdmUsIGJ1dCB3aXRoIGFub3RoZXIgc2NhbGFyIG9wIGJldHdlZW4g dGhlIHVucHJlZGljYXRlZCBvcCBhbmQKKyAgIHRoZSBzY2FsYXIgb3Agb3V0c2lkZSB0aGUgbG9v cC4gICovCit1aW50OF90IHRlc3QxNCAodWludDhfdCAqYSwgdWludDhfdCAqYiwgdWludDhfdCAq YywgaW50IG4sIHVpbnQ4eDE2X3QgdngsIGludCBnKQoreworICAgIHVpbnQ4X3Qgc3VtID0gMDsK KyAgICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhx IChuKTsKKyAgICAgICB1aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTggKGEsIHApOworICAgICAg IHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFfel91OCAoYiwgcCk7CisgICAgICAgdWludDh4MTZfdCB2 YyA9IHZhZGRxX21fdTggKHZ4LCB2YSwgdmIsIHApOworICAgICAgIHN1bSArPSB2YWRkdnFfdTgg KHZjKTsKKyAgICAgICBzdW0gKz0gZzsKKyAgICAgICBhICs9IDE2OworICAgICAgIGIgKz0gMTY7 CisgICAgICAgbiAtPSAxNjsKKyAgICB9CisgICAgcmV0dXJuIHN1bTsKK30KKworLyogVXNpbmcg YW4gdW5wcmVkaWNhdGVkIHZjbXAgdG8gZ2VuZXJhdGUgYSBuZXcgcHJlZGljYXRlIHZhbHVlIGlu IHRoZQorICAgbG9vcCBhbmQgdGhlbiB1c2luZyBpdCBpbiBhIHByZWRpY2F0ZWQgc3RvcmUgaW5z bi4gICovCit2b2lkIHRlc3QxNSAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50MzJfdCAqYywg aW50IG4pCit7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9 IHZjdHAzMnEgKG4pOworICAgICAgaW50MzJ4NF90IHZhID0gdmxkcndxX3pfczMyIChhLCBwKTsK KyAgICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3cV9zMzIgKGIpOworICAgICAgaW50MzJ4NF90IHZj ID0gdmFkZHFfeF9zMzIgKHZhLCB2YiwgcCk7CisgICAgICBtdmVfcHJlZDE2X3QgcDEgPSB2Y21w ZXFxX3MzMiAodmEsIHZjKTsKKyAgICAgIHZzdHJ3cV9wX3MzMiAoYywgdmMsIHAxKTsKKyAgICAg IGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIgKz0gNDsKKyAgICAgIG4gLT0gNDsKKyAg ICB9Cit9CisKKy8qIFVzaW5nIGEgcHJlZGljYXRlZCB2Y21wIHRvIGdlbmVyYXRlIGEgbmV3IHBy ZWRpY2F0ZSB2YWx1ZSBpbiB0aGUKKyAgIGxvb3AgYW5kIHRoZW4gdXNpbmcgaXQgaW4gYSBwcmVk aWNhdGVkIHN0b3JlIGluc24uICAqLwordm9pZCB0ZXN0MTYgKGludDMyX3QgKmEsIGludDMyX3Qg KmIsIGludDMyX3QgKmMsIGludCBuKQoreworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAg bXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3 cV96X3MzMiAoYSwgcCk7CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRyd3Ffel9zMzIgKGIsIHAp OworICAgICAgaW50MzJ4NF90IHZjID0gdmFkZHFfczMyICh2YSwgdmIpOworICAgICAgbXZlX3By ZWQxNl90IHAxID0gdmNtcGVxcV9tX3MzMiAodmEsIHZjLCBwKTsKKyAgICAgIHZzdHJ3cV9wX3Mz MiAoYywgdmMsIHAxKTsKKyAgICAgIGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIgKz0g NDsKKyAgICAgIG4gLT0gNDsKKyAgICB9Cit9CisKKy8qIFVzaW5nIGFuIGFjcm9zcy12ZWN0b3Ig dW5wcmVkaWNhdGVkIGluc3RydWN0aW9uIGluIGEgdmFsaWQgd2F5LgorICAgVGhpcyB0ZXN0cyB0 aGF0ICJ2YyIgaGFzIGNvcnJlY3RseSBtYXNrZWQgdGhlIHJpc2t5ICJ2YiIuICAqLwordWludDE2 X3QgdGVzdDE3ICh1aW50MTZfdCAqYSwgdWludDE2X3QgKmIsICB1aW50MTZfdCAqYywgaW50IG4p Cit7CisgIHVpbnQxNng4X3QgdmIgPSB2bGRyaHFfdTE2IChiKTsKKyAgdWludDE2X3QgcmVzID0g MDsKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDE2 cSAobik7CisgICAgICB1aW50MTZ4OF90IHZhID0gdmxkcmhxX3pfdTE2IChhLCBwKTsKKyAgICAg IHVpbnQxNng4X3QgdmMgPSB2YWRkcV94X3UxNiAodmEsIHZiLCBwKTsKKyAgICAgIHJlcyA9IHZh ZGR2cV91MTYgKHZjKTsKKyAgICAgIGMgKz0gODsKKyAgICAgIGEgKz0gODsKKyAgICAgIGIgKz0g ODsKKyAgICAgIG4gLT0gODsKKyAgICB9CisgIHJldHVybiByZXM7Cit9CisKKy8qIFVzaW5nIGFu IGFjcm9zcy12ZWN0b3IgdW5wcmVkaWNhdGVkIGluc3RydWN0aW9uIHdpdGggYSBzY2FsYXIgZnJv bSBvdXRzaWRlIHRoZSBsb29wLiAgKi8KK3VpbnQxNl90IHRlc3QxOCAodWludDE2X3QgKmEsIHVp bnQxNl90ICpiLCAgdWludDE2X3QgKmMsIGludCBuKQoreworICB1aW50MTZ4OF90IHZiID0gdmxk cmhxX3UxNiAoYik7CisgIHVpbnQxNl90IHJlcyA9IDA7CisgIHdoaWxlIChuID4gMCkKKyAgICB7 CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAxNnEgKG4pOworICAgICAgdWludDE2eDhfdCB2 YSA9IHZsZHJocV96X3UxNiAoYSwgcCk7CisgICAgICB1aW50MTZ4OF90IHZjID0gdmFkZHFfeF91 MTYgKHZhLCB2YiwgcCk7CisgICAgICByZXMgPSB2YWRkdmFxX3UxNiAocmVzLCB2Yyk7CisgICAg ICBjICs9IDg7CisgICAgICBhICs9IDg7CisgICAgICBiICs9IDg7CisgICAgICBuIC09IDg7Cisg ICAgfQorICByZXR1cm4gcmVzOworfQorCisvKiBVc2luZyBhbiBhY3Jvc3MtdmVjdG9yIHByZWRp Y2F0ZWQgaW5zdHJ1Y3Rpb24gaW4gYSB2YWxpZCB3YXkuICAqLwordWludDE2X3QgIHRlc3QxOSAo dWludDE2X3QgKmEsIHVpbnQxNl90ICpiLCAgdWludDE2X3QgKmMsIGludCBuKQoreworICB1aW50 MTZfdCByZXMgPSAwOworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90 IHAgPSB2Y3RwMTZxIChuKTsKKyAgICAgIHVpbnQxNng4X3QgdmIgPSB2bGRyaHFfdTE2IChiKTsK KyAgICAgIHVpbnQxNng4X3QgdmEgPSB2bGRyaHFfel91MTYgKGEsIHApOworICAgICAgcmVzID0g dmFkZHZhcV9wX3UxNiAocmVzLCB2YiwgcCk7CisgICAgICBjICs9IDg7CisgICAgICBhICs9IDg7 CisgICAgICBiICs9IDg7CisgICAgICBuIC09IDg7CisgICAgfQorICByZXR1cm4gcmVzOworfQor CisvKiBVc2luZyBhbiBhY3Jvc3MtdmVjdG9yIHByZWRpY2F0ZWQgaW5zdHJ1Y3Rpb24gaW4gYSB2 YWxpZCB3YXkuICAqLwordWludDE2X3QgIHRlc3QyMCAodWludDE2X3QgKmEsIHVpbnQxNl90ICpi LCAgdWludDE2X3QgKmMsIGludCBuKQoreworICB1aW50MTZfdCByZXMgPSAwOworICB3aGlsZSAo biA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMTZxIChuKTsKKyAgICAg IHVpbnQxNng4X3QgdmIgPSB2bGRyaHFfdTE2IChiKTsKKyAgICAgIHVpbnQxNng4X3QgdmEgPSB2 bGRyaHFfel91MTYgKGEsIHApOworICAgICAgcmVzKys7CisgICAgICByZXMgPSB2YWRkdmFxX3Bf dTE2IChyZXMsIHZiLCBwKTsKKyAgICAgIGMgKz0gODsKKyAgICAgIGEgKz0gODsKKyAgICAgIGIg Kz0gODsKKyAgICAgIG4gLT0gODsKKyAgICB9CisgIHJldHVybiByZXM7Cit9CisKKy8qIFVzaW5n IHZzaGxxIGluIGEgdmFsaWQgd2F5LiAgKi8KK3VpbnQxNng4X3QgIHRlc3QyMSAodWludDE2X3Qg KmEsIHVpbnQxNl90ICpiLCAgdWludDE2X3QgKmMsIGludCBuKQoreworICB1aW50MTZ4OF90IHJl cyA9IHZkdXBxX25fdTE2ICgwKTsKKyAgdWludDMyX3QgY2FycnkgPSAwOworICB3aGlsZSAobiA+ IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMTZxIChuKTsKKyAgICAgIHVp bnQxNng4X3QgdmIgPSB2bGRyaHFfel91MTYgKGIsIHApOworICAgICAgcmVzID0gdnNobGNxX3Ux NiAodmIsICZjYXJyeSwgMSk7CisgICAgICByZXMgPSB2c2hsY3FfbV91MTYgKHJlcywgJmNhcnJ5 LCAzICwgcCk7CisgICAgICBjICs9IDg7CisgICAgICBhICs9IDg7CisgICAgICBiICs9IDg7Cisg ICAgICBuIC09IDg7CisgICAgfQorICByZXR1cm4gcmVzOworfQorCisvKiBUaGUgZmluYWwgbnVt YmVyIG9mIERMU1RQcyBjdXJyZW50bHkgaXMgY2FsY3VsYXRlZCBieSB0aGUgbnVtYmVyIG9mCisg IGBURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWS4q YCBtYWNyb3MgKiA2ICsgMTYuICAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRp bWVzIHtcdGRsc3RwfSAxNjUgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXIt dGltZXMge1x0bGV0cH0gMTY1IH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2Mu dGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50MTZ4OC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L2FybS9tdmUvZGxzdHAtaW50MTZ4OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwMDAwLi4wY2RmZmIzMTJiMwotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludDE2eDguYwpAQCAtMCwwICsxLDY4IEBACisvKiB7IGRn LWRvIHJ1biB7IHRhcmdldCB7IGFybSotKi0qIH0gfSB9ICovCisvKiB7IGRnLXJlcXVpcmUtZWZm ZWN0aXZlLXRhcmdldCBhcm1fdjhfMW1fbXZlX29rIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8y IC1zYXZlLXRlbXBzIiB9ICovCisvKiB7IGRnLWFkZC1vcHRpb25zIGFybV92OF8xbV9tdmUgfSAq LworCisjaW5jbHVkZSA8YXJtX212ZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8 c3RkbGliLmg+CisjaW5jbHVkZSAiLi4vbG9iLmgiCisKK3ZvaWQgIF9fYXR0cmlidXRlX18gKChu b2lubGluZSkpIHRlc3QgKGludDE2X3QgKmEsIGludDE2X3QgKmIsIGludDE2X3QgKmMsIGludCBu KQoreworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3Rw MTZxIChuKTsKKyAgICAgIGludDE2eDhfdCB2YSA9IHZsZHJocV96X3MxNiAoYSwgcCk7CisgICAg ICBpbnQxNng4X3QgdmIgPSB2bGRyaHFfel9zMTYgKGIsIHApOworICAgICAgaW50MTZ4OF90IHZj ID0gdmFkZHFfeF9zMTYgKHZhLCB2YiwgcCk7CisgICAgICB2c3RyaHFfcF9zMTYgKGMsIHZjLCBw KTsKKyAgICAgIGMrPTg7CisgICAgICBhKz04OworICAgICAgYis9ODsKKyAgICAgIG4tPTg7Cisg ICAgfQorfQorCitpbnQgbWFpbiAoKQoreworICBpbnQgaTsKKyAgaW50MTZfdCB0ZW1wMVtOXTsK KyAgaW50MTZfdCB0ZW1wMltOXTsKKyAgaW50MTZfdCB0ZW1wM1tOXTsKKyAgcmVzZXRfZGF0YTE2 ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAyLCB0ZW1wMywg MCk7CisgIGNoZWNrX3BsdXMxNiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgMCk7CisKKyAgcmVzZXRf ZGF0YTE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAyLCB0 ZW1wMywgMSk7CisgIGNoZWNrX3BsdXMxNiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgMSk7CisKKyAg cmVzZXRfZGF0YTE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRl bXAyLCB0ZW1wMywgNyk7CisgIGNoZWNrX3BsdXMxNiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgNyk7 CisKKyAgcmVzZXRfZGF0YTE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVt cDEsIHRlbXAyLCB0ZW1wMywgOCk7CisgIGNoZWNrX3BsdXMxNiAodGVtcDEsIHRlbXAyLCB0ZW1w MywgOCk7CisKKyAgcmVzZXRfZGF0YTE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCBOKTsKKyAgdGVz dCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgOSk7CisgIGNoZWNrX3BsdXMxNiAodGVtcDEsIHRlbXAy LCB0ZW1wMywgOSk7CisKKyAgcmVzZXRfZGF0YTE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCBOKTsK KyAgdGVzdCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgMTYpOworICBjaGVja19wbHVzMTYgKHRlbXAx LCB0ZW1wMiwgdGVtcDMsIDE2KTsKKworICByZXNldF9kYXRhMTYgKHRlbXAxLCB0ZW1wMiwgdGVt cDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxNyk7CisgIGNoZWNrX3BsdXMx NiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgMTcpOworCisgIHJlc2V0X2RhdGExNiAodGVtcDEsIHRl bXAyLCB0ZW1wMywgTik7Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1l cyB7XHRkbHN0cC4xNn0gMSB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10 aW1lcyB7XHRsZXRwfSAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5v dCAiXHR2Y3RwIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgIlx0 dnBzdCIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJwMCIgfSB9 ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1p bnQzMng0LmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1pbnQzMng0 LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjdmZjc4OWQ3NjUwCi0t LSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAt aW50MzJ4NC5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIHsgZGctZG8gcnVuIHsgdGFyZ2V0IHsgYXJt Ki0qLSogfSB9IH0gKi8KKy8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IGFybV92OF8x bV9tdmVfb2sgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLXNhdmUtdGVtcHMiIH0gKi8KKy8q IHsgZGctYWRkLW9wdGlvbnMgYXJtX3Y4XzFtX212ZSB9ICovCisKKyNpbmNsdWRlIDxhcm1fbXZl Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICIu Li9sb2IuaCIKKwordm9pZCAgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkgdGVzdCAoaW50MzJf dCAqYSwgaW50MzJfdCAqYiwgaW50MzJfdCAqYywgaW50IG4pCit7CisgIHdoaWxlIChuID4gMCkK KyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAzMnEgKG4pOworICAgICAgaW50MzJ4 NF90IHZhID0gdmxkcndxX3pfczMyIChhLCBwKTsKKyAgICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3 cV96X3MzMiAoYiwgcCk7CisgICAgICBpbnQzMng0X3QgdmMgPSB2YWRkcV94X3MzMiAodmEsIHZi LCBwKTsKKyAgICAgIHZzdHJ3cV9wX3MzMiAoYywgdmMsIHApOworICAgICAgYys9NDsKKyAgICAg IGErPTQ7CisgICAgICBiKz00OworICAgICAgbi09NDsKKyAgICB9Cit9CisKK2ludCBtYWluICgp Cit7CisgIGludCBpOworICBpbnQzMl90IHRlbXAxW05dOworICBpbnQzMl90IHRlbXAyW05dOwor ICBpbnQzMl90IHRlbXAzW05dOworICByZXNldF9kYXRhMzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMs IE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAwKTsKKyAgY2hlY2tfcGx1czMyICh0 ZW1wMSwgdGVtcDIsIHRlbXAzLCAwKTsKKworICByZXNldF9kYXRhMzIgKHRlbXAxLCB0ZW1wMiwg dGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxKTsKKyAgY2hlY2tfcGx1 czMyICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxKTsKKworICByZXNldF9kYXRhMzIgKHRlbXAxLCB0 ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAzKTsKKyAgY2hl Y2tfcGx1czMyICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAzKTsKKworICByZXNldF9kYXRhMzIgKHRl bXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA0KTsK KyAgY2hlY2tfcGx1czMyICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA0KTsKKworICByZXNldF9kYXRh MzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAz LCA1KTsKKyAgY2hlY2tfcGx1czMyICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA1KTsKKworICByZXNl dF9kYXRhMzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIs IHRlbXAzLCA4KTsKKyAgY2hlY2tfcGx1czMyICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA4KTsKKwor ICByZXNldF9kYXRhMzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwg dGVtcDIsIHRlbXAzLCA5KTsKKyAgY2hlY2tfcGx1czMyICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA5 KTsKKworICByZXNldF9kYXRhMzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworfQorCisvKiB7 IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMge1x0ZGxzdHAuMzJ9IDEgfSB9ICovCisv KiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMge1x0bGV0cH0gMSB9IH0gKi8KKy8q IHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgIlx0dmN0cCIgfSB9ICovCisvKiB7IGRn LWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJcdHZwc3QiIH0gfSAqLworLyogeyBkZy1maW5h bCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAicDAiIH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3Rz dWl0ZS9nY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50NjR4Mi5jIGIvZ2NjL3Rlc3RzdWl0ZS9n Y2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50NjR4Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwMDAwLi44MDY1YmQwMjQ2OQotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0 c3VpdGUvZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludDY0eDIuYwpAQCAtMCwwICsxLDY4IEBA CisvKiB7IGRnLWRvIHJ1biB7IHRhcmdldCB7IGFybSotKi0qIH0gfSB9ICovCisvKiB7IGRnLXJl cXVpcmUtZWZmZWN0aXZlLXRhcmdldCBhcm1fdjhfMW1fbXZlX29rIH0gKi8KKy8qIHsgZGctb3B0 aW9ucyAiLU8yIC1zYXZlLXRlbXBzIiB9ICovCisvKiB7IGRnLWFkZC1vcHRpb25zIGFybV92OF8x bV9tdmUgfSAqLworCisjaW5jbHVkZSA8YXJtX212ZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+Cisj aW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiLi4vbG9iLmgiCisKK3ZvaWQgIF9fYXR0cmli dXRlX18gKChub2lubGluZSkpIHRlc3QgKGludDY0X3QgKmEsIGludDY0X3QgKmMsIGludCBuKQor eworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwNjRx IChuKTsKKyAgICAgIGludDY0eDJfdCB2YSA9IHZsZHJkcV9nYXRoZXJfb2Zmc2V0X3pfczY0IChh LCB2Y3JlYXRlcV91NjQgKDAsIDgpLCBwKTsKKyAgICAgIHZzdHJkcV9zY2F0dGVyX29mZnNldF9w X3M2NCAoYywgdmNyZWF0ZXFfdTY0ICgwLCA4KSwgdmEsIHApOworICAgICAgYys9MjsKKyAgICAg IGErPTI7CisgICAgICBuLT0yOworICAgIH0KK30KKworaW50IG1haW4gKCkKK3sKKyAgaW50IGk7 CisgIGludDY0X3QgdGVtcDFbTl07CisgIGludDY0X3QgdGVtcDNbTl07CisgIHJlc2V0X2RhdGE2 NCAgKHRlbXAxLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMywgMCk7CisgIGNoZWNr X21lbWNweTY0ICh0ZW1wMSwgdGVtcDMsIDApOworCisgIHJlc2V0X2RhdGE2NCAgKHRlbXAxLCB0 ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMywgMSk7CisgIGNoZWNrX21lbWNweTY0ICh0 ZW1wMSwgdGVtcDMsIDEpOworCisgIHJlc2V0X2RhdGE2NCAgKHRlbXAxLCB0ZW1wMywgTik7Cisg IHRlc3QgKHRlbXAxLCB0ZW1wMywgMik7CisgIGNoZWNrX21lbWNweTY0ICh0ZW1wMSwgdGVtcDMs IDIpOworCisgIHJlc2V0X2RhdGE2NCAgKHRlbXAxLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAx LCB0ZW1wMywgMyk7CisgIGNoZWNrX21lbWNweTY0ICh0ZW1wMSwgdGVtcDMsIDMpOworCisgIHJl c2V0X2RhdGE2NCAgKHRlbXAxLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMywgNCk7 CisgIGNoZWNrX21lbWNweTY0ICh0ZW1wMSwgdGVtcDMsIDQpOworCisgIHJlc2V0X2RhdGE2NCAg KHRlbXAxLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMywgNSk7CisgIGNoZWNrX21l bWNweTY0ICh0ZW1wMSwgdGVtcDMsIDUpOworCisgIHJlc2V0X2RhdGE2NCAgKHRlbXAxLCB0ZW1w MywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMywgNik7CisgIGNoZWNrX21lbWNweTY0ICh0ZW1w MSwgdGVtcDMsIDYpOworCisgIHJlc2V0X2RhdGE2NCAgKHRlbXAxLCB0ZW1wMywgTik7CisgIHRl c3QgKHRlbXAxLCB0ZW1wMywgNyk7CisgIGNoZWNrX21lbWNweTY0ICh0ZW1wMSwgdGVtcDMsIDcp OworCisgIHJlc2V0X2RhdGE2NCAgKHRlbXAxLCB0ZW1wMywgTik7Cit9CisKKy8qIHsgZGctZmlu YWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7XHRkbHN0cC42NH0gMSB9IH0gKi8KKy8qIHsgZGct ZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7XHRsZXRwfSAxIH0gfSAqLworLyogeyBkZy1m aW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAiXHR2Y3RwIiB9IH0gKi8KKy8qIHsgZGctZmluYWwg eyBzY2FuLWFzc2VtYmxlci1ub3QgIlx0dnBzdCIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nh bi1hc3NlbWJsZXItbm90ICJwMCIgfSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2dj Yy50YXJnZXQvYXJtL212ZS9kbHN0cC1pbnQ4eDE2LmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJn ZXQvYXJtL212ZS9kbHN0cC1pbnQ4eDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAwMDAuLjU1Mjc4MTAwMWU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9n Y2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50OHgxNi5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIHsg ZGctZG8gcnVuIHsgdGFyZ2V0IHsgYXJtKi0qLSogfSB9IH0gKi8KKy8qIHsgZGctcmVxdWlyZS1l ZmZlY3RpdmUtdGFyZ2V0IGFybV92OF8xbV9tdmVfb2sgfSAqLworLyogeyBkZy1vcHRpb25zICIt TzIgLXNhdmUtdGVtcHMiIH0gKi8KKy8qIHsgZGctYWRkLW9wdGlvbnMgYXJtX3Y4XzFtX212ZSB9 ICovCisKKyNpbmNsdWRlIDxhcm1fbXZlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRl IDxzdGRsaWIuaD4KKyNpbmNsdWRlICIuLi9sb2IuaCIKKwordm9pZCAgX19hdHRyaWJ1dGVfXyAo KG5vaW5saW5lKSkgdGVzdCAoaW50OF90ICphLCBpbnQ4X3QgKmIsIGludDhfdCAqYywgaW50IG4p Cit7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHA4 cSAobik7CisgICAgICBpbnQ4eDE2X3QgdmEgPSB2bGRyYnFfel9zOCAoYSwgcCk7CisgICAgICBp bnQ4eDE2X3QgdmIgPSB2bGRyYnFfel9zOCAoYiwgcCk7CisgICAgICBpbnQ4eDE2X3QgdmMgPSB2 YWRkcV94X3M4ICh2YSwgdmIsIHApOworICAgICAgdnN0cmJxX3BfczggKGMsIHZjLCBwKTsKKyAg ICAgIGMrPTE2OworICAgICAgYSs9MTY7CisgICAgICBiKz0xNjsKKyAgICAgIG4tPTE2OworICAg IH0KK30KKworaW50IG1haW4gKCkKK3sKKyAgaW50IGk7CisgIGludDhfdCB0ZW1wMVtOXTsKKyAg aW50OF90IHRlbXAyW05dOworICBpbnQ4X3QgdGVtcDNbTl07CisgIHJlc2V0X2RhdGE4ICh0ZW1w MSwgdGVtcDIsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgMCk7Cisg IGNoZWNrX3BsdXM4ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAwKTsKKworICByZXNldF9kYXRhOCAo dGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDEp OworICBjaGVja19wbHVzOCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgMSk7CisKKyAgcmVzZXRfZGF0 YTggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAz LCAxNSk7CisgIGNoZWNrX3BsdXM4ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxNSk7CisKKyAgcmVz ZXRfZGF0YTggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIs IHRlbXAzLCAxNik7CisgIGNoZWNrX3BsdXM4ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxNik7CisK KyAgcmVzZXRfZGF0YTggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwg dGVtcDIsIHRlbXAzLCAxNyk7CisgIGNoZWNrX3BsdXM4ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAx Nyk7CisKKyAgcmVzZXRfZGF0YTggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0 ZW1wMSwgdGVtcDIsIHRlbXAzLCAzMik7CisgIGNoZWNrX3BsdXM4ICh0ZW1wMSwgdGVtcDIsIHRl bXAzLCAzMik7CisKKyAgcmVzZXRfZGF0YTggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0 ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAzMyk7CisgIGNoZWNrX3BsdXM4ICh0ZW1wMSwgdGVt cDIsIHRlbXAzLCAzMyk7CisKKyAgcmVzZXRfZGF0YTggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4p OworfQorCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMge1x0ZGxzdHAuOH0g MSB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7XHRsZXRwfSAx IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAiXHR2Y3RwIiB9IH0g Ki8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgIlx0dnBzdCIgfSB9ICovCisv KiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJwMCIgfSB9ICovCmRpZmYgLS1naXQg YS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1pbnZhbGlkLWFzbS5jIGIv Z2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW52YWxpZC1hc20uYwpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uZTk2MzIyMzYwZWMKLS0tIC9kZXYv bnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1pbnZhbGlk LWFzbS5jCkBAIC0wLDAgKzEsMjc4IEBACisvKiB7IGRnLWRvIGNvbXBpbGUgeyB0YXJnZXQgeyBh cm0qLSotKiB9IH0gfSAqLworLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgYXJtX3Y4 XzFtX212ZV9vayB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMyAtc2F2ZS10ZW1wcyIgfSAqLwor LyogeyBkZy1hZGQtb3B0aW9ucyBhcm1fdjhfMW1fbXZlIH0gKi8KKworI2luY2x1ZGUgPGFybV9t dmUuaD4KKworLyogVGVybWluYXRpbmcgb24gYSBub24temVybyBudW1iZXIgb2YgZWxlbWVudHMu ICAqLwordm9pZCB0ZXN0MCAodWludDhfdCAqYSwgdWludDhfdCAqYiwgdWludDhfdCAqYywgaW50 IG4pCit7CisgICAgd2hpbGUgKG4gPiAxKQorICAgIHsKKyAgICAgICBtdmVfcHJlZDE2X3QgcCA9 IHZjdHA4cSAobik7CisgICAgICAgdWludDh4MTZfdCB2YSA9IHZsZHJicV96X3U4IChhLCBwKTsK KyAgICAgICB1aW50OHgxNl90IHZiID0gdmxkcmJxX3pfdTggKGIsIHApOworICAgICAgIHVpbnQ4 eDE2X3QgdmMgPSB2YWRkcV94X3U4ICh2YSwgdmIsIHApOworICAgICAgIHZzdHJicV9wX3U4IChj LCB2YywgcCk7CisgICAgICAgbiAtPSAxNjsKKyAgICB9Cit9CisKKy8qIFRlcm1pbmF0aW5nIG9u IG4gPj0gMC4gICovCit2b2lkIHRlc3QxICh1aW50OF90ICphLCB1aW50OF90ICpiLCB1aW50OF90 ICpjLCBpbnQgbikKK3sKKyAgICB3aGlsZSAobiA+PSAwKQorICAgIHsKKyAgICAgICBtdmVfcHJl ZDE2X3QgcCA9IHZjdHA4cSAobik7CisgICAgICAgdWludDh4MTZfdCB2YSA9IHZsZHJicV96X3U4 IChhLCBwKTsKKyAgICAgICB1aW50OHgxNl90IHZiID0gdmxkcmJxX3pfdTggKGIsIHApOworICAg ICAgIHVpbnQ4eDE2X3QgdmMgPSB2YWRkcV94X3U4ICh2YSwgdmIsIHApOworICAgICAgIHZzdHJi cV9wX3U4IChjLCB2YywgcCk7CisgICAgICAgbiAtPSAxNjsKKyAgICB9Cit9CisKKy8qIFNpbWls YXIsIHRlcm1pbmF0aW5nIG9uIGEgbm9uLXplcm8gbnVtYmVyIG9mIGVsZW1lbnRzLCBidXQgaW4g YSBmb3IgbG9vcAorICAgZm9ybWF0LiAgKi8KK2ludDMyX3QgYVtdID0gezAsIDEsIDIsIDMsIDQs IDUsIDYsIDd9Owordm9pZCB0ZXN0MiAoaW50MzJfdCAqYiwgaW50IG51bV9lbGVtcykKK3sKKyAg ICBmb3IgKGludCBpID0gbnVtX2VsZW1zOyBpID49IDI7IGktPSA0KQorICAgIHsKKyAgICAgICBt dmVfcHJlZDE2X3QgcCA9IHZjdHAzMnEgKGkpOworICAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3 cV96X3MzMiAoJihhW2ldKSwgcCk7CisgICAgICAgdnN0cndxX3BfczMyIChiICsgaSwgdmEsIHAp OworICAgIH0KK30KKworLyogSXRlcmF0aW9uIGNvdW50ZXIgY291bnRpbmcgdXAgdG8gbnVtX2l0 ZXIsIHdpdGggYSBub24temVybyBzdGFydGluZyBudW0uICAqLwordm9pZCB0ZXN0MyAodWludDhf dCAqYSwgdWludDhfdCAqYiwgdWludDhfdCAqYywgaW50IG4pCit7CisgICAgaW50IG51bV9pdGVy ID0gKG4gKyAxNSkvMTY7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBudW1faXRlcjsgaSsrKQor ICAgIHsKKyAgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHA4cSAobik7CisgICAgICAgdWludDh4 MTZfdCB2YSA9IHZsZHJicV96X3U4IChhLCBwKTsKKyAgICAgICB1aW50OHgxNl90IHZiID0gdmxk cmJxX3pfdTggKGIsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmMgPSB2YWRkcV94X3U4ICh2YSwg dmIsIHApOworICAgICAgIHZzdHJicV9wX3U4IChjLCB2YywgcCk7CisgICAgICAgbiAtPSAxNjsK KyAgICB9Cit9CisKKy8qIEl0ZXJhdGlvbiBjb3VudGVyIGNvdW50aW5nIHVwIHRvIG51bV9pdGVy LCB3aXRoIGEgbGFyZ2VyIGluY3JlbWVudCAgKi8KK3ZvaWQgdGVzdDQgKHVpbnQ4X3QgKmEsIHVp bnQ4X3QgKmIsIHVpbnQ4X3QgKmMsIGludCBuKQoreworICAgIGludCBudW1faXRlciA9IChuICsg MTUpLzE2OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2l0ZXI7IGkrPTIpCisgICAgewor ICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAgICB1aW50OHgxNl90IHZh ID0gdmxkcmJxX3pfdTggKGEsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFfel91 OCAoYiwgcCk7CisgICAgICAgdWludDh4MTZfdCB2YyA9IHZhZGRxX3hfdTggKHZhLCB2YiwgcCk7 CisgICAgICAgdnN0cmJxX3BfdTggKGMsIHZjLCBwKTsKKyAgICAgICBuIC09IDE2OworICAgIH0K K30KKworLyogVXNpbmcgYW4gdW5wcmVkaWNhdGVkIHN0b3JlIGluc3RydWN0aW9uIHdpdGhpbiB0 aGUgbG9vcC4gICovCit2b2lkIHRlc3Q1ICh1aW50OF90ICphLCB1aW50OF90ICpiLCB1aW50OF90 ICpjLCAgdWludDhfdCAqZCwgaW50IG4pCit7CisgICAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAg ICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHA4cSAobik7CisgICAgICAgdWludDh4MTZfdCB2YSA9 IHZsZHJicV96X3U4IChhLCBwKTsKKyAgICAgICB1aW50OHgxNl90IHZiID0gdmxkcmJxX3pfdTgg KGIsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmMgPSB2YWRkcV91OCAodmEsIHZiKTsKKyAgICAg ICB1aW50OHgxNl90IHZkID0gdmFkZHFfeF91OCAodmEsIHZiLCBwKTsKKyAgICAgICB2c3RyYnFf dTggKGQsIHZkKTsKKyAgICAgICBuIC09IDE2OworICAgIH0KK30KKworLyogVXNpbmcgYW4gdW5w cmVkaWNhdGVkIHN0b3JlIG91dHNpZGUgdGhlIGxvb3AuICAqLwordm9pZCB0ZXN0NiAodWludDhf dCAqYSwgdWludDhfdCAqYiwgdWludDhfdCAqYywgaW50IG4sIHVpbnQ4eDE2X3QgdngpCit7Cisg ICAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHA4cSAo bik7CisgICAgICAgdWludDh4MTZfdCB2YSA9IHZsZHJicV96X3U4IChhLCBwKTsKKyAgICAgICB1 aW50OHgxNl90IHZiID0gdmxkcmJxX3pfdTggKGIsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmMg PSB2YWRkcV9tX3U4ICh2eCwgdmEsIHZiLCBwKTsKKyAgICAgICB2eCA9IHZhZGRxX3U4ICh2eCwg dmMpOworICAgICAgIGEgKz0gMTY7CisgICAgICAgYiArPSAxNjsKKyAgICAgICBuIC09IDE2Owor ICAgIH0KKyAgICB2c3RyYnFfdTggKGMsIHZ4KTsKK30KKworLyogVXNpbmcgYSBWUFIgdGhhdCBn ZXRzIG1vZGlmaWVkIHdpdGhpbiB0aGUgbG9vcC4gICovCit2b2lkIHRlc3Q5IChpbnQzMl90ICph LCBpbnQzMl90ICpiLCBpbnQzMl90ICpjLCBpbnQgbikKK3sKKyAgd2hpbGUgKG4gPiAwKQorICAg IHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDMycSAobik7CisgICAgICBpbnQzMng0X3Qg dmEgPSB2bGRyd3Ffel9zMzIgKGEsIHApOworICAgICAgcCsrOworICAgICAgaW50MzJ4NF90IHZi ID0gdmxkcndxX3pfczMyIChiLCBwKTsKKyAgICAgIGludDMyeDRfdCB2YyA9IHZhZGRxX3hfczMy ICh2YSwgdmIsIHApOworICAgICAgdnN0cndxX3BfczMyIChjLCB2YywgcCk7CisgICAgICBjICs9 IDQ7CisgICAgICBhICs9IDQ7CisgICAgICBiICs9IDQ7CisgICAgICBuIC09IDQ7CisgICAgfQor fQorCisvKiBVc2luZyBhIFZQUiB0aGF0IGdldHMgcmUtZ2VuZXJhdGVkIHdpdGhpbiB0aGUgbG9v cC4gICovCit2b2lkIHRlc3QxMCAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50MzJfdCAqYywg aW50IG4pCit7CisgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDMycSAobik7CisgIHdoaWxlIChuID4g MCkKKyAgICB7CisgICAgICBpbnQzMng0X3QgdmEgPSB2bGRyd3Ffel9zMzIgKGEsIHApOworICAg ICAgcCA9IHZjdHAzMnEgKG4pOworICAgICAgaW50MzJ4NF90IHZiID0gdmxkcndxX3pfczMyIChi LCBwKTsKKyAgICAgIGludDMyeDRfdCB2YyA9IHZhZGRxX3hfczMyICh2YSwgdmIsIHApOworICAg ICAgdnN0cndxX3BfczMyIChjLCB2YywgcCk7CisgICAgICBjICs9IDQ7CisgICAgICBhICs9IDQ7 CisgICAgICBiICs9IDQ7CisgICAgICBuIC09IDQ7CisgICAgfQorfQorCisvKiBVc2luZyB2Y3Rw MzJxX20gaW5zdGVhZCBvZiB2Y3RwMzJxLiAgKi8KK3ZvaWQgdGVzdDExIChpbnQzMl90ICphLCBp bnQzMl90ICpiLCBpbnQzMl90ICpjLCBpbnQgbiwgbXZlX3ByZWQxNl90IHAwKQoreworICB3aGls ZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxX20gKG4sIHAw KTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7CisgICAgICBpbnQz Mng0X3QgdmIgPSB2bGRyd3Ffel9zMzIgKGIsIHApOworICAgICAgaW50MzJ4NF90IHZjID0gdmFk ZHFfeF9zMzIgKHZhLCB2YiwgcCk7CisgICAgICB2c3Ryd3FfcF9zMzIgKGMsIHZjLCBwKTsKKyAg ICAgIGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIgKz0gNDsKKyAgICAgIG4gLT0gNDsK KyAgICB9Cit9CisKKy8qIFVzaW5nIGFuIHVucHJlZGljYXRlZCBvcCB3aXRoIGEgc2NhbGFyIG91 dHB1dCwgd2hlcmUgdGhlIHJlc3VsdCBpcyB2YWxpZAorICAgb3V0c2lkZSB0aGUgYmIuICBUaGlz IGlzIGludmFsaWQsIGJlY2F1c2Ugb25lIG9mIHRoZSBpbnB1dHMgdG8gdGhlCisgICB1bnByZWRp Y2F0ZWQgb3AgaXMgYWxzbyB1bnByZWRpY2F0ZWQuICAqLwordWludDhfdCB0ZXN0MTIgKHVpbnQ4 X3QgKmEsIHVpbnQ4X3QgKmIsIHVpbnQ4X3QgKmMsIGludCBuLCB1aW50OHgxNl90IHZ4KQorewor ICAgIHVpbnQ4X3Qgc3VtID0gMDsKKyAgICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgIG12 ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAgICB1aW50OHgxNl90IHZhID0gdmxkcmJx X3pfdTggKGEsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFfdTggKGIpOworICAg ICAgIHVpbnQ4eDE2X3QgdmMgPSB2YWRkcV91OCAodmEsIHZiKTsKKyAgICAgICBzdW0gKz0gdmFk ZHZxX3U4ICh2Yyk7CisgICAgICAgYSArPSAxNjsKKyAgICAgICBiICs9IDE2OworICAgICAgIG4g LT0gMTY7CisgICAgfQorICAgIHJldHVybiBzdW07Cit9CisKKy8qIFVzaW5nIGFuIHVucHJlZGlj YXRlZCB2Y21wIHRvIGdlbmVyYXRlIGEgbmV3IHByZWRpY2F0ZSB2YWx1ZSBpbiB0aGUKKyAgIGxv b3AgYW5kIHRoZW4gdXNpbmcgdGhhdCBWUFIgdG8gcHJlZGljYXRlIGEgc3RvcmUgaW5zbi4gICov Cit2b2lkIHRlc3QxMyAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50MzJ4NF90IHZjLCBpbnQz Ml90ICpjLCBpbnQgbikKK3sKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVk MTZfdCBwID0gdmN0cDMycSAobik7CisgICAgICBpbnQzMng0X3QgdmEgPSB2bGRyd3FfczMyIChh KTsKKyAgICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3cV96X3MzMiAoYiwgcCk7CisgICAgICBpbnQz Mng0X3QgdmMgPSB2YWRkcV9zMzIgKHZhLCB2Yik7CisgICAgICBtdmVfcHJlZDE2X3QgcDEgPSB2 Y21wZXFxX3MzMiAodmEsIHZjKTsKKyAgICAgIHZzdHJ3cV9wX3MzMiAoYywgdmMsIHAxKTsKKyAg ICAgIGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIgKz0gNDsKKyAgICAgIG4gLT0gNDsK KyAgICB9Cit9CisKKy8qIFVzaW5nIGFuIGFjcm9zcy12ZWN0b3IgdW5wcmVkaWNhdGVkIGluc3Ry dWN0aW9uLiAidmIiIGlzIHRoZSByaXNrLiAgKi8KK3VpbnQxNl90IHRlc3QxNCAodWludDE2X3Qg KmEsIHVpbnQxNl90ICpiLCAgdWludDE2X3QgKmMsIGludCBuKQoreworICB1aW50MTZ4OF90IHZi ID0gdmxkcmhxX3UxNiAoYik7CisgIHVpbnQxNl90IHJlcyA9IDA7CisgIHdoaWxlIChuID4gMCkK KyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAxNnEgKG4pOworICAgICAgdWludDE2 eDhfdCB2YSA9IHZsZHJocV96X3UxNiAoYSwgcCk7CisgICAgICB2YiA9IHZhZGRxX3UxNiAodmEs IHZiKTsKKyAgICAgIHJlcyA9IHZhZGR2cV91MTYgKHZiKTsKKyAgICAgIGMgKz0gODsKKyAgICAg IGEgKz0gODsKKyAgICAgIGIgKz0gODsKKyAgICAgIG4gLT0gODsKKyAgICB9CisgIHJldHVybiBy ZXM7Cit9CisKKy8qIFVzaW5nIGFuIGFjcm9zcy12ZWN0b3IgdW5wcmVkaWNhdGVkIGluc3RydWN0 aW9uLiAidmMiIGlzIHRoZSByaXNrLiAqLwordWludDE2X3QgdGVzdDE1ICh1aW50MTZfdCAqYSwg dWludDE2X3QgKmIsICB1aW50MTZfdCAqYywgaW50IG4pCit7CisgIHVpbnQxNng4X3QgdmIgPSB2 bGRyaHFfdTE2IChiKTsKKyAgdWludDE2X3QgcmVzID0gMDsKKyAgd2hpbGUgKG4gPiAwKQorICAg IHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDE2cSAobik7CisgICAgICB1aW50MTZ4OF90 IHZhID0gdmxkcmhxX3pfdTE2IChhLCBwKTsKKyAgICAgIHVpbnQxNng4X3QgdmMgPSB2YWRkcV91 MTYgKHZhLCB2Yik7CisgICAgICByZXMgPSB2YWRkdmFxX3UxNiAocmVzLCB2Yyk7CisgICAgICBj ICs9IDg7CisgICAgICBhICs9IDg7CisgICAgICBiICs9IDg7CisgICAgICBuIC09IDg7CisgICAg fQorICByZXR1cm4gcmVzOworfQorCit1aW50MTZfdCB0ZXN0MTYgKHVpbnQxNl90ICphLCB1aW50 MTZfdCAqYiwgIHVpbnQxNl90ICpjLCBpbnQgbikKK3sKKyAgdWludDE2X3QgcmVzID0wOworICB3 aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMTZxIChuKTsK KyAgICAgIHVpbnQxNng4X3QgdmIgPSB2bGRyaHFfdTE2IChiKTsKKyAgICAgIHVpbnQxNng4X3Qg dmEgPSB2bGRyaHFfel91MTYgKGEsIHApOworICAgICAgcmVzID0gdmFkZHZhcV91MTYgKHJlcywg dmIpOworICAgICAgcmVzID0gdmFkZHZhcV9wX3UxNiAocmVzLCB2YSwgcCk7CisgICAgICBjICs9 IDg7CisgICAgICBhICs9IDg7CisgICAgICBiICs9IDg7CisgICAgICBuIC09IDg7CisgICAgfQor ICByZXR1cm4gcmVzOworfQorCit1aW50MTZ4OF90IHRlc3QxNyAodWludDE2X3QgKmEsIHVpbnQx Nl90ICpiLCAgdWludDE2X3QgKmMsIGludCBuKQoreworICB1aW50MTZ4OF90IHJlcyA9IHZkdXBx X25fdTE2ICgwKTsKKyAgdWludDMyX3QgY2FycnkgPSAwOworICB3aGlsZSAobiA+IDApCisgICAg eworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMTZxIChuKTsKKyAgICAgIHVpbnQxNng4X3Qg dmIgPSB2bGRyaHFfdTE2IChiKTsKKyAgICAgIHJlcyA9IHZzaGxjcV91MTYgKHZiLCAmY2Fycnks IDEpOworICAgICAgcmVzID0gdnNobGNxX21fdTE2IChyZXMsICZjYXJyeSwgMSAsIHApOworICAg ICAgYyArPSA4OworICAgICAgYSArPSA4OworICAgICAgYiArPSA4OworICAgICAgbiAtPSA4Owor ICAgIH0KKyAgcmV0dXJuIHJlczsKK30KKworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVy LW5vdCAiXHRkbHN0cCIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90 ICJcdGxldHAiIH0gfSAqLwo= --------------3LrfgnLK0nMae9dg2jrXjlSZ--