From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-he1eur04on2050.outbound.protection.outlook.com [40.107.7.50]) by sourceware.org (Postfix) with ESMTPS id A2EC43858D32 for ; Thu, 30 Nov 2023 12:56:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A2EC43858D32 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org A2EC43858D32 Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=40.107.7.50 ARC-Seal: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1701348986; cv=pass; b=WUO41GE2ZgPzajmyt5CKcMy8dCIeqP3+PZ6YEixL1OSS546eS4jWIyH7oMkEfxcqBvPWO3vDjcF19ryABkCDaQpFzrSIPDBRQlJG5WtoVrKjaEUPrg6SWnCxLIvcPjNgSs6UdOzfZ/7eEaubW7nRAPCzL5PDa0JfQk530Wowm9w= ARC-Message-Signature: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1701348986; c=relaxed/simple; bh=a51fV22rQOFJvkQHNem46oNS6X/JI926ZDk3BnbYS50=; h=DKIM-Signature:DKIM-Signature:Message-ID:Date:Subject:To:From: MIME-Version; b=LPtFQTfsAZPYf1vERB2/vsfMIKijAk+2TSc4ZgYJFGD5hUHI+KTaPl/CaSiwlpDLlIqurmwfUueaKQVIotbgU99EzXluUmnXhXyq5/ecyQic6wR9Z+t6CLkHFTbwjjkPunyNJZd7M18ey6/Tm/NW8Xp9w7tWIZuiivSSgLNJIg8= ARC-Authentication-Results: i=3; server2.sourceware.org ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=F8ilQdLoBiSlf6qZn8+lk4c5hItbR9V8Bte8q3jeq7TYreCWV7j2v5m9JhQtZE+e/bbFSljMwY9lgCa0KNFqKxl64BS2EUtCaclaEVKHUTC6CT/IgNtlE7/UFMgpTFSeKfGWj4471HuZ2i1W3ouU7GS7U0aRwqAgKnduBvJv+7I6fCW5hBKowYtoBY1Y+cK2fpsOQLPvubbPSTpAvD6iDZUUHQ57EFwHULfUq1c7MmDoF/GzfUAEvuMflxag5Ujlxsku3qbxoNVA2fpg7xpYnnub9kHA/KPsSCcHaA9JVtF7NI/QbRcytnbyYn3kv/5rhZSj1s72YeVgIRyw10T1SQ== ARC-Message-Signature: i=2; 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=x5DudOZXwXIoie6a7MCpIlUidNWmPnzecav1M9yy2w0=; b=Pt9qu5dC91Gp3wMSwC2v0p/9qJEZhI8ycC7W3B4hpSxAjPUbB4zExq9Mxbg2NqGrLMOMFLaLx6+xvB6Z3Vo1a091zEaalsR0wBwVjqTZuQvFSNfeGPOG5LJ2O93Wd3dlCWYti7ILwKB6G/qLpld2qr0Zplrlxht5UqI46lb9WpRO7wWQHzGNPyq4fGTtTaibiD3IeNj6ClxRLsng/evFsMARBn5zBK4JCkgewiMeUISTbeP1/GWB5YruVBrTNNWuc5LRXT6iDnDUYoSHDZ1zNs4XuR4tm+2t61myyFqgZHiv+CSyHISAeO9GbP/568rHoGQPKcTri2wllZRJCrkpAg== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=gcc.gnu.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=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=x5DudOZXwXIoie6a7MCpIlUidNWmPnzecav1M9yy2w0=; b=pmu62soL/00UkNDOrEJtYZ/x6CFz5gC0fTTwChL0rjUhXpPPG8DX3FxXw5vU4VedJEY6t6gcGy7sEIZ8vLdNnJVDMq9HQeBBszD5nN9OWt3uhcnmuCxXhlNCvKH9sTH7gLLCCeNY7fL9EFBcsKHk37gTD1pztfvshP+T2Uv32lE= Received: from AM0PR10CA0060.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:150::40) by GVXPR08MB10452.eurprd08.prod.outlook.com (2603:10a6:150:149::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7046.24; Thu, 30 Nov 2023 12:56:13 +0000 Received: from AM4PEPF00027A69.eurprd04.prod.outlook.com (2603:10a6:20b:150:cafe::55) by AM0PR10CA0060.outlook.office365.com (2603:10a6:20b:150::40) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7025.29 via Frontend Transport; Thu, 30 Nov 2023 12:56:13 +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 AM4PEPF00027A69.mail.protection.outlook.com (10.167.16.87) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7046.17 via Frontend Transport; Thu, 30 Nov 2023 12:56:12 +0000 Received: ("Tessian outbound 8289ea11ec17:v228"); Thu, 30 Nov 2023 12:56:12 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 764b0c9cf8a619f0 X-CR-MTA-TID: 64aa7808 Received: from 8539b4cb0cfc.2 by 64aa7808-outbound-1.mta.getcheckrecipient.com id BEDC6E7F-151A-4DA9-BEA5-5654CD033296.1; Thu, 30 Nov 2023 12:56:05 +0000 Received: from EUR04-VI1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 8539b4cb0cfc.2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Thu, 30 Nov 2023 12:56:05 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=HUuHqAG0TaMyME5E5k9+Kmr5CaIH8o7H4fiel7avxRgF7vrirVhnRfospPdIS/8x2l0TU6gWPwzsRqFSEmUx7sbdI4HAc7bPHxwTwIH0BJKfolCd1Ka4v0PitNARXJihA99j1P54c1KCjr9eDCcH+mgTUTNgE1PV4DFutEbhSYIyTbw2S0Obm7adAVWVvWUWNowFd8bcNnFnGNJWXPJE3iRX2S/2xEPjOpMgm2p9ZhguRuISeKGmNFrFUMi9hdq86yFFZfumljzWtLmilcrnqpTsHh/DsZdJMm9BQqQmC8bU0HCLSZp0HXdhdNUtSFGYpdb9bbprRu7/yjQrW1YpQQ== 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=x5DudOZXwXIoie6a7MCpIlUidNWmPnzecav1M9yy2w0=; b=l/eLUGs4ke0vQXEagIYb9PmlEWSvwd9hyudXduzaRdU9CKdDWAH/++A8aVkhNcuhDj2H6L15L5HhpprtwZN2cGz9f5Bc8FnKl6owvqXb17rAHlZ7FSzGLFLJb/vhFT4myMu/oIIaFccq8ShUQGNN2rQ2FK73d2uQqhVKz5q+qpE1FGdSiZ1SzbxrizFCS1eDMt3Wzmcb2FcVQf3wmMqoSFmDPCZuWWRZJbJZz4FeV4D7z7O8bZlOq7k8ivz6QATyvbAmu582d/iaJSa3U61yzo7xIYxNdrbAoDP7TL4KXZmUywYdVOldtQgovIgOJroTjk30Cmt6MhSfIDpciigDQQ== 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=x5DudOZXwXIoie6a7MCpIlUidNWmPnzecav1M9yy2w0=; b=pmu62soL/00UkNDOrEJtYZ/x6CFz5gC0fTTwChL0rjUhXpPPG8DX3FxXw5vU4VedJEY6t6gcGy7sEIZ8vLdNnJVDMq9HQeBBszD5nN9OWt3uhcnmuCxXhlNCvKH9sTH7gLLCCeNY7fL9EFBcsKHk37gTD1pztfvshP+T2Uv32lE= 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 PA4PR08MB7410.eurprd08.prod.outlook.com (2603:10a6:102:2a2::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7046.24; Thu, 30 Nov 2023 12:56:01 +0000 Received: from DB9PR08MB6507.eurprd08.prod.outlook.com ([fe80::d19b:3dd9:3cf:6b5b]) by DB9PR08MB6507.eurprd08.prod.outlook.com ([fe80::d19b:3dd9:3cf:6b5b%4]) with mapi id 15.20.7025.022; Thu, 30 Nov 2023 12:56:01 +0000 Content-Type: multipart/mixed; boundary="------------366m3l4s0tG03NCqD8hhX7PW" Message-ID: <8000eb76-0abf-45db-92c1-d307ac8fccfc@arm.com> Date: Thu, 30 Nov 2023 12:55:57 +0000 User-Agent: Mozilla Thunderbird Subject: Re: [PING][PATCH 2/2] arm: Add support for MVE Tail-Predicated Low Overhead Loops To: "Andre Vieira (lists)" , Stamatis Markianos-Wright via Gcc-patches , Richard Earnshaw , Richard Sandiford , Kyrylo Tkachov References: <949f5dd0-cdf0-715a-f04c-3de80c9b974f@arm.com> <32452185-e459-4521-9b77-e80d06573ee2@arm.com> <5793c5af-9c01-48a8-9bf3-f289e7f32640@arm.com> <05ab69cf-dea0-44d2-875c-983985a26b99@arm.com> <6cab7952-9b00-4d85-8fbb-c8058d2142d2@arm.com> <76426214-33e6-40eb-aa9c-94f357945c4b@arm.com> Content-Language: en-US From: Stamatis Markianos-Wright In-Reply-To: <76426214-33e6-40eb-aa9c-94f357945c4b@arm.com> X-ClientProxiedBy: LO2P265CA0203.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:9e::23) To DB9PR08MB6507.eurprd08.prod.outlook.com (2603:10a6:10:25a::6) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: DB9PR08MB6507:EE_|PA4PR08MB7410:EE_|AM4PEPF00027A69:EE_|GVXPR08MB10452:EE_ X-MS-Office365-Filtering-Correlation-Id: da31af7d-21a1-4c7c-0e1f-08dbf1a3bb67 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: gRS0bpBrKLRpEE+DXdA/Ha+1nsP9MEuOkXrmRDoVrFP2LLDSNoK3JqmT8ilOocgoqubAU5CXub4OrnWVQBfebzVS68hZCS2+kJcIteQg3THTwj3NjqQD48ghy6ZBJbDoUUyhEfTBHIMFH9oeE8HVdZRSPNzpv6nGVdKdlQS+v8+A9JFgliwnAt6AyYIiU7qAJ1uy4VMMY5YXWgDT/PBxfkSNvzLEVaErdM7HfWqAMy+NygoczXVbk1/nTzQZ/4fo0vXn4gIVvLsaTT5jjkqxnAQWj4UYF8kljnOJIqtxmNcufwHWfbWylo37UTJPqF0bxTNMwGsOjkCOeRdzBmZZ+YTuvzbQ+RfF2rExTnlmX0JWXriDO5hzUAphmZhPxKHqawG1liZ+WtT2njrV47U6gbaL2VmDCTOiyWPjRUuvUTkV0nQbExIS2+Ora0HoJCCRjNAdFr5DkCrMRHPtRJl1It/mFfOFhj7bzCNv3xP2sKMEjXMS5TtU42UGoqe+qPikO4iG3MUZ2UFwdV5SW6OQxlFMaPzgwLit8MGpaF6ncaQO7xQ0US0+a9EmC9A77YeWU6S/Pc9fSaSruY2yZI4tBolrkdXOEOcQq9QgSK3DkHV1ebSFYUsyqzwfD0uyNFPbmdbhNDdPMebtEjQX2dF9ew== 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:(13230031)(136003)(376002)(396003)(346002)(366004)(39860400002)(230922051799003)(1800799012)(451199024)(186009)(64100799003)(2616005)(6512007)(26005)(33964004)(6506007)(21480400003)(83380400001)(2906002)(478600001)(235185007)(5660300002)(30864003)(41300700001)(110136005)(8936002)(6486002)(66946007)(8676002)(6636002)(66556008)(66476007)(316002)(53546011)(6666004)(38100700002)(31696002)(86362001)(36756003)(31686004)(43740500002)(45980500001);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA4PR08MB7410 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: AM4PEPF00027A69.eurprd04.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 87413010-b40e-4ac5-a586-08dbf1a3b449 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: /OkOl1SzZsGvH4TuIbQtgORgIjhBQKeKrCBa8zQlnZ//g9WjKytx+NsDpVq57YG7KNCCU5ADQr2GO9Gg+0YBa66YRQHB0Gos0+uJlMNFyFsStAWnoBsLTRVdmVzTY/zl9ZCtJ3JP0mBI97VWx0ZuH03o6HC6XoZQqkAm1i20u7/bHy+5KCJNfucUevCRAWX4Ng+RPGI25aBK6qhKfF9HWJXvsx4q7+K/PMz9i8f6GUMRdpjnN8D00yifCi0KYs36YjCQY5t9Nobwc8jrGtYcsLgp8pRvSOiOBRWnc2xfhabsb0LFx9SSYqOxCEOlvCJcasrRzVwtkr89cdg3F8S/gU3DG/llo0xmR146S3fKfq9bhiPvezfzbzHN2kuUiLcfVSH1hHEmx2/NywmA/53IMQEs4AyxSus2CjkcZlqwiAWwBCTELzJH3KAemVfc9YzSjFpImt80jvy/Rcv1cVb10GCUqLlg8I1CEZrCI3/YicJ66fkaUJGWyQTvlHiy+0KUS61HYX2JgS6PaB1uWac0vlDnJFcIL13cTNJzJ3nq1YC5eKm/rher4LI2u8Wt5LrItH97AVKWQ89ow6aThkDuKyQR9diQ4QCwy2AV24EL2Hszvr9/2JI9wyfj+fA60uQfH9Q3GzUOnzXCibbxVOxFuGGpYcHmW1HGd6/P/0et7xXJ8GUKYkHqiKI2/yusFvKyCVvI3vEgUqiEIK11OQO///GgkZ8duz0H0+Wa8LqSMfvkY4IuPAcmsHosWoNh1tuL1biH7yQqcxIVGVLfrsvYsQ== 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:(13230031)(4636009)(39860400002)(396003)(376002)(136003)(346002)(230922051799003)(451199024)(64100799003)(82310400011)(1800799012)(186009)(36840700001)(46966006)(40470700004)(235185007)(5660300002)(40460700003)(2906002)(30864003)(8936002)(82740400003)(8676002)(356005)(81166007)(31696002)(36756003)(41300700001)(86362001)(40480700001)(47076005)(31686004)(478600001)(6512007)(6506007)(6666004)(36860700001)(21480400003)(33964004)(53546011)(6486002)(83380400001)(336012)(26005)(6636002)(316002)(110136005)(70586007)(70206006)(2616005)(43740500002);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Nov 2023 12:56:12.8488 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: da31af7d-21a1-4c7c-0e1f-08dbf1a3bb67 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: AM4PEPF00027A69.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: GVXPR08MB10452 X-Spam-Status: No, score=-10.7 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,FORGED_SPF_HELO,GIT_PATCH_0,KAM_DMARC_NONE,KAM_LOTSOFHASH,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: --------------366m3l4s0tG03NCqD8hhX7PW Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi Andre, Thanks for the comments, see latest revision attached. On 27/11/2023 12:47, Andre Vieira (lists) wrote: > Hi Stam, > > Just some comments. > > +/* Recursively scan through the DF chain backwards within the basic > block and > +   determine if any of the USEs of the original insn (or the USEs of > the insns > s/Recursively scan/Scan/ as you no longer recurse, thanks for that by > the way :) +   where thy were DEF-ed, etc., recursively) were affected > by implicit VPT > remove recursively for the same reasons. > > +      if (!CONST_INT_P (cond_counter_iv.step) || !CONST_INT_P > (cond_temp_iv.step)) > +    return NULL; > +      /* Look at the steps and swap around the rtx's if needed. Error > out if > +     one of them cannot be identified as constant.  */ > +      if (INTVAL (cond_counter_iv.step) != 0 && INTVAL > (cond_temp_iv.step) != 0) > +    return NULL; > > Move the comment above the if before, as the erroring out it talks > about is there. Done > > +      emit_note_after ((enum insn_note)NOTE_KIND (insn), BB_END (body)); >  space after 'insn_note)' > > @@ -173,14 +176,14 @@ doloop_condition_get (rtx_insn *doloop_pat) >    if (! REG_P (reg)) >      return 0; >  -  /* Check if something = (plus (reg) (const_int -1)). > +  /* Check if something = (plus (reg) (const_int -n)). >       On IA-64, this decrement is wrapped in an if_then_else.  */ >    inc_src = SET_SRC (inc); >    if (GET_CODE (inc_src) == IF_THEN_ELSE) >      inc_src = XEXP (inc_src, 1); >    if (GET_CODE (inc_src) != PLUS >        || XEXP (inc_src, 0) != reg > -      || XEXP (inc_src, 1) != constm1_rtx) > +      || !CONST_INT_P (XEXP (inc_src, 1))) > > Do we ever check that inc_src is negative? We used to check if it was > -1, now we only check it's a constnat, but not a negative one, so I > suspect this needs a: > || INTVAL (XEXP (inc_src, 1)) >= 0 Good point. Done > > @@ -492,7 +519,8 @@ doloop_modify (class loop *loop, class niter_desc > *desc, >      case GE: >        /* Currently only GE tests against zero are supported.  */ >        gcc_assert (XEXP (condition, 1) == const0_rtx); > - > +      /* FALLTHRU */ > +    case GTU: >        noloop = constm1_rtx; > > I spent a very long time staring at this trying to understand why > noloop = constm1_rtx for GTU, where I thought it should've been (count > & (n-1)). For the current use of doloop it doesn't matter because ARM > is the only target using it and you set desc->noloop_assumptions to > null_rtx in 'arm_attempt_dlstp_transform' so noloop is never used. > However, if a different target accepts this GTU pattern then this > target agnostic code will do the wrong thing.  I suggest we either: >  - set noloop to what we think might be the correct value, which if > you ask me should be 'count & (XEXP (condition, 1))', >  - or add a gcc_assert (GET_CODE (condition) != GTU); under the if > (desc->noloop_assumption); part and document why.  I have a slight > preference for the assert given otherwise we are adding code that we > can't test. Yea, that's true tbh. I've done the latter, but also separated out the "case GTU:" and added a comment, so that it's more clear that the noloop things aren't used in the only implemented GTU case (Arm) Thank you :) > > LGTM otherwise (but I don't have the power to approve this ;)). > > Kind regards, > Andre > ________________________________________ > From: Stamatis Markianos-Wright > Sent: Thursday, November 16, 2023 11:36 AM > To: Stamatis Markianos-Wright via Gcc-patches; Richard Earnshaw; > Richard Sandiford; Kyrylo Tkachov > Subject: [PING][PATCH 2/2] arm: Add support for MVE Tail-Predicated > Low Overhead Loops > > Pinging back to the top of reviewers' inboxes due to worry about Stage 1 > End in a few days :) > > > See the last email for the latest version of the 2/2 patch. The 1/2 > patch is A-Ok from Kyrill's earlier target-backend review. > > > On 10/11/2023 12:41, Stamatis Markianos-Wright wrote: >> >> On 06/11/2023 17:29, Stamatis Markianos-Wright wrote: >>> >>> On 06/11/2023 11:24, Richard Sandiford wrote: >>>> Stamatis Markianos-Wright writes: >>>>>> One of the main reasons for reading the arm bits was to try to >>>>>> answer >>>>>> the question: if we switch to a downcounting loop with a GE >>>>>> condition, >>>>>> how do we make sure that the start value is not a large unsigned >>>>>> number that is interpreted as negative by GE?  E.g. if the loop >>>>>> originally counted up in steps of N and used an LTU condition, >>>>>> it could stop at a value in the range [INT_MAX + 1, UINT_MAX]. >>>>>> But the loop might never iterate if we start counting down from >>>>>> most values in that range. >>>>>> >>>>>> Does the patch handle that? >>>>> So AFAICT this is actually handled in the generic code in >>>>> `doloop_valid_p`: >>>>> >>>>> This kind of loops fail because of they are "desc->infinite", then no >>>>> loop-doloop conversion is attempted at all (even for standard >>>>> dls/le loops) >>>>> >>>>> Thanks to that check I haven't been able to trigger anything like the >>>>> behaviour you describe, do you think the doloop_valid_p checks are >>>>> robust enough? >>>> The loops I was thinking of are provably not infinite though. E.g.: >>>> >>>>    for (unsigned int i = 0; i < UINT_MAX - 100; ++i) >>>>      ... >>>> >>>> is known to terminate.  And doloop conversion is safe with the normal >>>> count-down-by-1 approach, so I don't think current code would need >>>> to reject it.  I.e. a conversion to: >>>> >>>>    unsigned int i = UINT_MAX - 101; >>>>    do >>>>      ... >>>>    while (--i != ~0U); >>>> >>>> would be safe, but a conversion to: >>>> >>>>    int i = UINT_MAX - 101; >>>>    do >>>>      ... >>>>    while ((i -= step, i > 0)); >>>> >>>> wouldn't, because the loop body would only be executed once. >>>> >>>> I'm only going off the name "infinite" though :)  It's possible that >>>> it has more connotations than that. >>>> >>>> Thanks, >>>> Richard >>> >>> Ack, yep, I see what you mean now, and yep, that kind of loop does >>> indeed pass through doloop_valid_p >>> >>> Interestingly , in the v8-M Arm ARM this is done with: >>> >>> ``` >>> >>> boolean IsLastLowOverheadLoop(INSTR_EXEC_STATE_Type state) >>> // This does not check whether a loop is currently active. >>> // If the PE were in a loop, would this be the last one? >>> return UInt(state.LoopCount) <= (1 << (4 - LTPSIZE)); >>> >>> ``` >>> >>> So architecturally the asm we output would be ok (except maybe the >>> "branch too far subs;bgt;lctp" fallback at >>> `predicated_doloop_end_internal` (maybe that should be `bhi`))... But >>> now GE: isn't looking like an accurate representation of this >>> operation in the compiler. >>> >>> I'm wondering if I should try to make >>> `predicated_doloop_end_internal` contain a comparison along the lines >>> of: >>> (gtu: (plus: (LR) (const_int -num_lanes)) (const_int >>> num_lanes_minus_1)) >>> >>> I'll give that a try :) >>> >>> The only reason I'd chosen to go with GE earlier, tbh, was because of >>> the existing handling of GE in loop-doloop.cc >>> >>> Let me know if any other ideas come to your mind! >>> >>> >>> Cheers, >>> >>> Stam >> >> >> It looks like I've had success with the below (diff to previous patch), >> trimmed a bit to only the functionally interesting things:: >> >> >> >> >> diff --git a/gcc/config/arm/thumb2.md b/gcc/config/arm/thumb2.md >> index 368d5138ca1..54dd4ee564b 100644 >> --- a/gcc/config/arm/thumb2.md >> +++ b/gcc/config/arm/thumb2.md >> @@ -1649,16 +1649,28 @@ >>            && (decrement_num = arm_attempt_dlstp_transform >> (operands[1])) >>            && (INTVAL (decrement_num) != 1)) >>          { >> -          insn = emit_insn >> -              (gen_thumb2_addsi3_compare0 >> -              (s0, s0, GEN_INT ((-1) * (INTVAL (decrement_num))))); >> -          cmp = XVECEXP (PATTERN (insn), 0, 0); >> -          cc_reg = SET_DEST (cmp); >> -          bcomp = gen_rtx_GE (VOIDmode, cc_reg, const0_rtx); >>            loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[1]); >> -          emit_jump_insn (gen_rtx_SET (pc_rtx, >> -                       gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp, >> -                                 loc_ref, pc_rtx))); >> +          switch (INTVAL (decrement_num)) >> +        { >> +          case 2: >> +            insn = emit_jump_insn (gen_predicated_doloop_end_internal2 >> +                        (s0, loc_ref)); >> +            break; >> +          case 4: >> +            insn = emit_jump_insn (gen_predicated_doloop_end_internal4 >> +                        (s0, loc_ref)); >> +            break; >> +          case 8: >> +            insn = emit_jump_insn (gen_predicated_doloop_end_internal8 >> +                        (s0, loc_ref)); >> +            break; >> +          case 16: >> +            insn = emit_jump_insn (gen_predicated_doloop_end_internal16 >> +                        (s0, loc_ref)); >> +            break; >> +          default: >> +            gcc_unreachable (); >> +        } >>            DONE; >>          } >>      } >> >> diff --git a/gcc/config/arm/mve.md b/gcc/config/arm/mve.md >> index 93905583b18..c083f965fa9 100644 >> --- a/gcc/config/arm/mve.md >> +++ b/gcc/config/arm/mve.md >> @@ -6922,23 +6922,24 @@ >>  ;; Originally expanded by 'predicated_doloop_end'. >>  ;; In the rare situation where the branch is too far, we do also >> need to >>  ;; revert FPSCR.LTPSIZE back to 0x100 after the last iteration. >> -(define_insn "*predicated_doloop_end_internal" >> +(define_insn "predicated_doloop_end_internal" >>    [(set (pc) >>      (if_then_else >> -       (ge (plus:SI (reg:SI LR_REGNUM) >> -            (match_operand:SI 0 "const_int_operand" "")) >> -        (const_int 0)) >> -     (label_ref (match_operand 1 "" "")) >> +       (gtu (unspec:SI [(plus:SI (match_operand:SI 0 >> "s_register_operand" "=r") >> +                     (const_int ))] >> +        LETP) >> +        (const_int )) >> +     (match_operand 1 "" "") >>       (pc))) >> -   (set (reg:SI LR_REGNUM) >> -    (plus:SI (reg:SI LR_REGNUM) (match_dup 0))) >> +   (set (match_dup 0) >> +    (plus:SI (match_dup 0) (const_int ))) >>     (clobber (reg:CC CC_REGNUM))] >>    "TARGET_HAVE_MVE" >>    { >>      if (get_attr_length (insn) == 4) >>        return "letp\t%|lr, %l1"; >>      else >> -      return "subs\t%|lr, #%n0\n\tbgt\t%l1\n\tlctp"; >> +      return "subs\t%|lr, #\n\tbhi\t%l1\n\tlctp"; >>    } >>    [(set (attr "length") >>      (if_then_else >> @@ -6947,11 +6948,11 @@ >>          (const_int 6))) >>     (set_attr "type" "branch")]) >> >> -(define_insn "dlstp_insn" >> +(define_insn "dlstp_insn" >>    [ >>      (set (reg:SI LR_REGNUM) >>       (unspec:SI [(match_operand:SI 0 "s_register_operand" "r")] >>        DLSTP)) >>    ] >>    "TARGET_HAVE_MVE" >> -  "dlstp.\t%|lr, %0") >> +  "dlstp.\t%|lr, %0") >> >> diff --git a/gcc/loop-doloop.cc b/gcc/loop-doloop.cc >> index 6a72700a127..47fdef989b4 100644 >> --- a/gcc/loop-doloop.cc >> +++ b/gcc/loop-doloop.cc >> @@ -185,6 +185,7 @@ doloop_condition_get (rtx_insn *doloop_pat) >>        || XEXP (inc_src, 0) != reg >>        || !CONST_INT_P (XEXP (inc_src, 1))) >>      return 0; >> +  int dec_num = abs (INTVAL (XEXP (inc_src, 1))); >> >>    /* Check for (set (pc) (if_then_else (condition) >>                                         (label_ref (label)) >> @@ -199,21 +200,32 @@ doloop_condition_get (rtx_insn *doloop_pat) >>    /* Extract loop termination condition.  */ >>    condition = XEXP (SET_SRC (cmp), 0); >> >> -  /* We expect a GE or NE comparison with 0 or 1.  */ >> -  if ((GET_CODE (condition) != GE >> -       && GET_CODE (condition) != NE) >> -      || (XEXP (condition, 1) != const0_rtx >> -          && XEXP (condition, 1) != const1_rtx)) >> +  /* We expect a GE or NE comparison with 0 or 1, or a GTU comparison >> with >> +     dec_num - 1.  */ >> +  if (!((GET_CODE (condition) == GE >> +     || GET_CODE (condition) == NE) >> +    && (XEXP (condition, 1) == const0_rtx >> +        || XEXP (condition, 1) == const1_rtx )) >> +      &&!(GET_CODE (condition) == GTU >> +      && ((INTVAL (XEXP (condition, 1))) == (dec_num - 1)))) >>      return 0; >> >> -  if ((XEXP (condition, 0) == reg) >> +  /* For the ARM special case of having a GTU: re-form the condition >> without >> +     the unspec for the benefit of the middle-end.  */ >> +  if (GET_CODE (condition) == GTU) >> +    { >> +      condition = gen_rtx_fmt_ee (GTU, VOIDmode, inc_src, GEN_INT >> (dec_num - 1)); >> +      return condition; >> +    } >> +  else if ((XEXP (condition, 0) == reg) >>        /* For the third case:  */ >>        || ((cc_reg != NULL_RTX) >>        && (XEXP (condition, 0) == cc_reg) >>        && (reg_orig == reg)) >> @@ -245,20 +257,11 @@ doloop_condition_get (rtx_insn *doloop_pat) >>                         (label_ref (label)) >>                         (pc))))]) >> >> -    So we return the second form instead for the two cases when n == 1. >> - >> -    For n > 1, the final value may be exceeded, so use GE instead of >> NE. >> +    So we return the second form instead for the two cases. >>       */ >> -     if (GET_CODE (pattern) != PARALLEL) >> -       { >> -    if (INTVAL (XEXP (inc_src, 1)) != -1) >> -      condition = gen_rtx_fmt_ee (GE, VOIDmode, inc_src, const0_rtx); >> -    else >> -      condition = gen_rtx_fmt_ee (NE, VOIDmode, inc_src, const1_rtx);; >> -       } >> - >> +    condition = gen_rtx_fmt_ee (NE, VOIDmode, inc_src, const1_rtx); >>      return condition; >> -   } >> +    } >> >>    /* ??? If a machine uses a funny comparison, we could return a >>       canonicalized form here.  */ >> @@ -501,7 +504,8 @@ doloop_modify (class loop *loop, class niter_desc >> *desc, >>      case GE: >>        /* Currently only GE tests against zero are supported. */ >>        gcc_assert (XEXP (condition, 1) == const0_rtx); >> - >> +      /* FALLTHRU */ >> +    case GTU: >>        noloop = constm1_rtx; >> diff --git a/gcc/config/arm/iterators.md b/gcc/config/arm/iterators.md >> index a6a7ff507a5..9398702cddd 100644 >> --- a/gcc/config/arm/iterators.md >> +++ b/gcc/config/arm/iterators.md >> @@ -2673,8 +2673,16 @@ >>  (define_int_attr mrrc [(VUNSPEC_MRRC "mrrc") (VUNSPEC_MRRC2 "mrrc2")]) >>  (define_int_attr MRRC [(VUNSPEC_MRRC "MRRC") (VUNSPEC_MRRC2 "MRRC2")]) >> >> -(define_int_attr mode1 [(DLSTP8 "8") (DLSTP16 "16") (DLSTP32 "32") >> -            (DLSTP64 "64")]) >> +(define_int_attr dlstp_elemsize [(DLSTP8 "8") (DLSTP16 "16") (DLSTP32 >> "32") >> +                 (DLSTP64 "64")]) >> + >> +(define_int_attr letp_num_lanes [(LETP8 "16") (LETP16 "8") (LETP32 "4") >> +                 (LETP64 "2")]) >> +(define_int_attr letp_num_lanes_neg [(LETP8 "-16") (LETP16 "-8") >> (LETP32 "-4") >> +                     (LETP64 "-2")]) >> + >> +(define_int_attr letp_num_lanes_minus_1 [(LETP8 "15") (LETP16 "7") >> (LETP32 "3") >> +                     (LETP64 "1")]) >> >>  (define_int_attr opsuffix [(UNSPEC_DOT_S "s8") >>                 (UNSPEC_DOT_U "u8") >> @@ -2921,6 +2929,8 @@ >>  (define_int_iterator VQSHLUQ_N [VQSHLUQ_N_S]) >>  (define_int_iterator DLSTP [DLSTP8 DLSTP16 DLSTP32 >>                     DLSTP64]) >> +(define_int_iterator LETP [LETP8 LETP16 LETP32 >> +               LETP64]) >> >>  ;; Define iterators for VCMLA operations >>  (define_int_iterator VCMLA_OP [UNSPEC_VCMLA >>        /* The iteration count does not need incrementing for a GE >> test.  */ >> diff --git a/gcc/config/arm/unspecs.md b/gcc/config/arm/unspecs.md >> index 12ae4c4f820..2d6f27c14f4 100644 >> --- a/gcc/config/arm/unspecs.md >> +++ b/gcc/config/arm/unspecs.md >> @@ -587,6 +587,10 @@ >>    DLSTP16 >>    DLSTP32 >>    DLSTP64 >> +  LETP8 >> +  LETP16 >> +  LETP32 >> +  LETP64 >>    VPNOT >>    VCREATEQ_F >>    VCVTQ_N_TO_F_S >> >> >> I've attached the whole [2/2] patch diff with this change and >> the required comment changes in doloop_condition_get. >> WDYT? >> >> >> Thanks, >> >> Stam >> >> >>> >>> --------------366m3l4s0tG03NCqD8hhX7PW Content-Type: text/plain; charset=UTF-8; name="diff.txt" Content-Disposition: attachment; filename="diff.txt" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYXJtL2FybS1wcm90b3MuaCBiL2djYy9jb25maWcvYXJt L2FybS1wcm90b3MuaAppbmRleCAyZjVjYTc5ZWQ4ZGRkNjQ3YjIxMjc4MmEwNDU0ZWU0ZmVmYzA3 MjU3Li40ZjE2NGM1NDc0MDZjNDMyMTk5MDBjMTExNDAxNTQwYzdlZjlkN2QxIDEwMDY0NAotLS0g YS9nY2MvY29uZmlnL2FybS9hcm0tcHJvdG9zLmgKKysrIGIvZ2NjL2NvbmZpZy9hcm0vYXJtLXBy b3Rvcy5oCkBAIC02NSw4ICs2NSw4IEBAIGV4dGVybiB2b2lkIGFybV9lbWl0X3NwZWN1bGF0aW9u X2JhcnJpZXJfZnVuY3Rpb24gKHZvaWQpOwogZXh0ZXJuIHZvaWQgYXJtX2RlY29tcG9zZV9kaV9i aW5vcCAocnR4LCBydHgsIHJ0eCAqLCBydHggKiwgcnR4ICosIHJ0eCAqKTsKIGV4dGVybiBib29s IGFybV9xX2JpdF9hY2Nlc3MgKHZvaWQpOwogZXh0ZXJuIGJvb2wgYXJtX2dlX2JpdHNfYWNjZXNz ICh2b2lkKTsKLWV4dGVybiBib29sIGFybV90YXJnZXRfaW5zbl9va19mb3JfbG9iIChydHgpOwot CitleHRlcm4gYm9vbCBhcm1fdGFyZ2V0X2JiX29rX2Zvcl9sb2IgKGJhc2ljX2Jsb2NrKTsKK2V4 dGVybiBydHggYXJtX2F0dGVtcHRfZGxzdHBfdHJhbnNmb3JtIChydHgpOwogI2lmZGVmIFJUWF9D T0RFCiBlbnVtIHJlZ19jbGFzcwogYXJtX21vZGVfYmFzZV9yZWdfY2xhc3MgKG1hY2hpbmVfbW9k ZSk7CmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL2FybS9hcm0uY2MgYi9nY2MvY29uZmlnL2FybS9h cm0uY2MKaW5kZXggNjIwZWY3YmZiMmYzYWY5YjhkZTU3NjM1OWE2MTU3MTkwYzQzOWFhZC4uNjA1 NmQ5Y2RiN2JjODM5MTc1YTk1YzE0MjFlYWQ5NGIwMmEyYmMxOCAxMDA2NDQKLS0tIGEvZ2NjL2Nv bmZpZy9hcm0vYXJtLmNjCisrKyBiL2djYy9jb25maWcvYXJtL2FybS5jYwpAQCAtNjU5LDYgKzY1 OSwxMiBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9zcGVjIGFybV9hdHRyaWJ1dGVf dGFibGVbXSA9CiAjdW5kZWYgVEFSR0VUX0hBVkVfQ09ORElUSU9OQUxfRVhFQ1VUSU9OCiAjZGVm aW5lIFRBUkdFVF9IQVZFX0NPTkRJVElPTkFMX0VYRUNVVElPTiBhcm1faGF2ZV9jb25kaXRpb25h bF9leGVjdXRpb24KIAorI3VuZGVmIFRBUkdFVF9MT09QX1VOUk9MTF9BREpVU1QKKyNkZWZpbmUg VEFSR0VUX0xPT1BfVU5ST0xMX0FESlVTVCBhcm1fbG9vcF91bnJvbGxfYWRqdXN0CisKKyN1bmRl ZiBUQVJHRVRfUFJFRElDVF9ET0xPT1BfUAorI2RlZmluZSBUQVJHRVRfUFJFRElDVF9ET0xPT1Bf UCBhcm1fcHJlZGljdF9kb2xvb3BfcAorCiAjdW5kZWYgVEFSR0VUX0xFR0lUSU1BVEVfQ09OU1RB TlRfUAogI2RlZmluZSBUQVJHRVRfTEVHSVRJTUFURV9DT05TVEFOVF9QIGFybV9sZWdpdGltYXRl X2NvbnN0YW50X3AKIApAQCAtMzQ0NzIsMTkgKzM0NDc4LDExMDMgQEAgYXJtX2ludmFsaWRfd2l0 aGluX2RvbG9vcCAoY29uc3QgcnR4X2luc24gKmluc24pCiB9CiAKIGJvb2wKLWFybV90YXJnZXRf aW5zbl9va19mb3JfbG9iIChydHggaW5zbikKK2FybV90YXJnZXRfYmJfb2tfZm9yX2xvYiAoYmFz aWNfYmxvY2sgYmIpCiB7Ci0gIGJhc2ljX2Jsb2NrIGJiID0gQkxPQ0tfRk9SX0lOU04gKGluc24p OwogICAvKiBNYWtlIHN1cmUgdGhlIGJhc2ljIGJsb2NrIG9mIHRoZSB0YXJnZXQgaW5zbiBpcyBh IHNpbXBsZSBsYXRjaAogICAgICBoYXZpbmcgYXMgc2luZ2xlIHByZWRlY2Vzc29yIGFuZCBzdWNj ZXNzb3IgdGhlIGJvZHkgb2YgdGhlIGxvb3AKICAgICAgaXRzZWxmLiAgT25seSBzaW1wbGUgbG9v cHMgd2l0aCBhIHNpbmdsZSBiYXNpYyBibG9jayBhcyBib2R5IGFyZQogICAgICBzdXBwb3J0ZWQg Zm9yICdsb3cgb3ZlciBoZWFkIGxvb3AnIG1ha2luZyBzdXJlIHRoYXQgTEUgdGFyZ2V0IGlzCiAg ICAgIGFib3ZlIExFIGl0c2VsZiBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuICAqLwotCiAgIHJldHVy biBzaW5nbGVfc3VjY19wIChiYikKLSAgICAmJiBzaW5nbGVfcHJlZF9wIChiYikKLSAgICAmJiBz aW5nbGVfc3VjY19lZGdlIChiYiktPmRlc3QgPT0gc2luZ2xlX3ByZWRfZWRnZSAoYmIpLT5zcmMK LSAgICAmJiBjb250YWluc19ub19hY3RpdmVfaW5zbl9wIChiYik7CisJICYmIHNpbmdsZV9wcmVk X3AgKGJiKQorCSAmJiBzaW5nbGVfc3VjY19lZGdlIChiYiktPmRlc3QgPT0gc2luZ2xlX3ByZWRf ZWRnZSAoYmIpLT5zcmM7Cit9CisKKy8qIFV0aWxpdHkgZnVjdGlvbjogR2l2ZW4gYSBWQ1RQIG9y IGEgVkNUUF9NIGluc24sIHJldHVybiB0aGUgbnVtYmVyIG9mIE1WRQorICAgbGFuZXMgYmFzZWQg b24gdGhlIG1hY2hpbmUgbW9kZSBiZWluZyB1c2VkLiAgKi8KKworc3RhdGljIGludAorYXJtX212 ZV9nZXRfdmN0cF9sYW5lcyAocnR4IHgpCit7CisgIGlmIChHRVRfQ09ERSAoeCkgPT0gU0VUICYm IEdFVF9DT0RFIChYRVhQICh4LCAxKSkgPT0gVU5TUEVDCisgICAgICAmJiAoWElOVCAoWEVYUCAo eCwgMSksIDEpID09IFZDVFAgfHwgWElOVCAoWEVYUCAoeCwgMSksIDEpID09IFZDVFBfTSkpCisg ICAgeworICAgICAgbWFjaGluZV9tb2RlIG1vZGUgPSBHRVRfTU9ERSAoWEVYUCAoeCwgMSkpOwor ICAgICAgcmV0dXJuIChWRUNUT1JfTU9ERV9QIChtb2RlKSAmJiBWQUxJRF9NVkVfUFJFRF9NT0RF IChtb2RlKSkKKwkgICAgID8gR0VUX01PREVfTlVOSVRTIChtb2RlKSA6IDA7CisgICAgfQorICBy ZXR1cm4gMDsKK30KKworLyogQ2hlY2sgaWYgSU5TTiByZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSBW UFIgcmVnLCBpZiBpdCBkb2VzLCByZXR1cm4gdGhlCisgICBzdWItcnR4IG9mIHRoZSBWUFIgcmVn LiAgVGhlIFRZUEUgYXJndW1lbnQgY29udHJvbHMgd2hldGhlcgorICAgdGhpcyBmdW5jdGlvbiBz aG91bGQ6CisgICAqIEZvciBUWVBFID09IDAsIGNoZWNrIGFsbCBvcGVyYW5kcywgaW5jbHVkaW5n IHRoZSBPVVQgb3BlcmFuZHMsCisgICAgIGFuZCByZXR1cm4gdGhlIGZpcnN0IG9jY3VycmVuY2Ug b2YgdGhlIFZQUiByZWcuCisgICAqIEZvciBUWVBFID09IDEsIG9ubHkgY2hlY2sgdGhlIGlucHV0 IG9wZXJhbmRzLgorICAgKiBGb3IgVFlQRSA9PSAyLCBvbmx5IGNoZWNrIHRoZSBvdXRwdXQgb3Bl cmFuZHMuCisgICAoSU5PVVQgb3BlcmFuZHMgYXJlIGNvbnNpZGVyZWQgYm90aCBhcyBpbnB1dCBh bmQgb3V0cHV0IG9wZXJhbmRzKQorKi8KK3N0YXRpYyBydHgKK2FybV9nZXRfcmVxdWlyZWRfdnBy X3JlZyAocnR4X2luc24gKmluc24sIHVuc2lnbmVkIGludCB0eXBlID0gMCkKK3sKKyAgZ2NjX2Fz c2VydCAodHlwZSA8IDMpOworICBpZiAoIU5PTkpVTVBfSU5TTl9QIChpbnNuKSkKKyAgICByZXR1 cm4gTlVMTF9SVFg7CisKKyAgYm9vbCByZXF1aXJlc192cHI7CisgIGV4dHJhY3RfY29uc3RyYWlu X2luc24gKGluc24pOworICBpbnQgbl9vcGVyYW5kcyA9IHJlY29nX2RhdGEubl9vcGVyYW5kczsK KyAgaWYgKHJlY29nX2RhdGEubl9hbHRlcm5hdGl2ZXMgPT0gMCkKKyAgICByZXR1cm4gTlVMTF9S VFg7CisKKyAgLyogRmlsbCBpbiByZWNvZ19vcF9hbHQgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0 aGUgY29uc3RyYWludHMgb2YKKyAgICAgdGhpcyBpbnNuLiAgKi8KKyAgcHJlcHJvY2Vzc19jb25z dHJhaW50cyAoaW5zbik7CisKKyAgZm9yIChpbnQgb3AgPSAwOyBvcCA8IG5fb3BlcmFuZHM7IG9w KyspCisgICAgeworICAgICAgcmVxdWlyZXNfdnByID0gdHJ1ZTsKKyAgICAgIGlmICh0eXBlID09 IDEgJiYgcmVjb2dfZGF0YS5vcGVyYW5kX3R5cGVbb3BdID09IE9QX09VVCkKKwljb250aW51ZTsK KyAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMiAmJiByZWNvZ19kYXRhLm9wZXJhbmRfdHlwZVtvcF0g PT0gT1BfSU4pCisJY29udGludWU7CisKKyAgICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCBhbHRlcm5h dGl2ZXMgb2Ygb3BlcmFuZCAib3AiIGluIHJlY29nX29wX2FsdCBhbmQKKwkgaWRlbnRpZnkgaWYg dGhlIG9wZXJhbmQgaXMgcmVxdWlyZWQgdG8gYmUgdGhlIFZQUi4gICovCisgICAgICBmb3IgKGlu dCBhbHQgPSAwOyBhbHQgPCByZWNvZ19kYXRhLm5fYWx0ZXJuYXRpdmVzOyBhbHQrKykKKwl7CisJ ICBjb25zdCBvcGVyYW5kX2FsdGVybmF0aXZlICpvcF9hbHQKKwkgICAgICA9ICZyZWNvZ19vcF9h bHRbYWx0ICogbl9vcGVyYW5kc107CisJICAvKiBGZXRjaCB0aGUgcmVnX2NsYXNzIGZvciBlYWNo IGVudHJ5IGFuZCBjaGVjayBpdCBhZ2FpbnN0IHRoZQorCSAgICAgVlBSX1JFRyByZWdfY2xhc3Mu ICAqLworCSAgaWYgKGFsdGVybmF0aXZlX2NsYXNzIChvcF9hbHQsIG9wKSAhPSBWUFJfUkVHKQor CSAgICByZXF1aXJlc192cHIgPSBmYWxzZTsKKwl9CisgICAgICAvKiBJZiBhbGwgYWx0ZXJuYXRp dmVzIG9mIHRoZSBpbnNuIHJlcXVpcmUgdGhlIFZQUiByZWcgZm9yIHRoaXMgb3BlcmFuZCwKKwkg aXQgbWVhbnMgdGhhdCBlaXRoZXIgdGhpcyBpcyBWUFItZ2VuZXJhdGluZyBpbnN0cnVjdGlvbiwg bGlrZSBhIHZjdHAsCisJIHZjbXAsIGV0Yy4sIG9yIGl0IGlzIGEgVlBULXByZWRpY2F0ZWQgaW5z cnVjdGlvbi4gIFJldHVybiB0aGUgc3VicnR4CisJIG9mIHRoZSBWUFIgcmVnIG9wZXJhbmQuICAq LworICAgICAgaWYgKHJlcXVpcmVzX3ZwcikKKwlyZXR1cm4gcmVjb2dfZGF0YS5vcGVyYW5kW29w XTsKKyAgICB9CisgIHJldHVybiBOVUxMX1JUWDsKK30KKworLyogV3JhcHBlciBmdW5jdGlvbiBv ZiBhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWcgd2l0aCBUWVBFID09IDEsIHNvIHJldHVybgorICAg c29tZXRoaW5nIG9ubHkgaWYgdGhlIFZQUiByZWcgaXMgYW4gaW5wdXQgb3BlcmFuZCB0byB0aGUg aW5zbi4gICovCisKK3N0YXRpYyBydHgKK2FybV9nZXRfcmVxdWlyZWRfdnByX3JlZ19wYXJhbSAo cnR4X2luc24gKmluc24pCit7CisgIHJldHVybiBhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWcgKGlu c24sIDEpOworfQorCisvKiBXcmFwcGVyIGZ1bmN0aW9uIG9mIGFybV9nZXRfcmVxdWlyZWRfdnBy X3JlZyB3aXRoIFRZUEUgPT0gMiwgc28gcmV0dXJuCisgICBzb21ldGhpbmcgb25seSBpZiB0aGUg VlBSIHJlZyBpcyB0aGUgcmV0dXJuIHZhbHVlLCBhbiBvdXRwdXQgb2YsIG9yIGlzCisgICBjbG9i YmVyZWQgYnkgdGhlIGluc24uICAqLworCitzdGF0aWMgcnR4Cithcm1fZ2V0X3JlcXVpcmVkX3Zw cl9yZWdfcmV0X3ZhbCAocnR4X2luc24gKmluc24pCit7CisgIHJldHVybiBhcm1fZ2V0X3JlcXVp cmVkX3Zwcl9yZWcgKGluc24sIDIpOworfQorCisvKiBTY2FuIHRoZSBiYXNpYyBibG9jayBvZiBh IGxvb3AgYm9keSBmb3IgYSB2Y3RwIGluc3RydWN0aW9uLiAgSWYgdGhlcmUgaXMKKyAgIGF0IGxl YXN0IHZjdHAgaW5zdHJ1Y3Rpb24sIHJldHVybiB0aGUgZmlyc3QgcnR4X2luc24gKi4gICovCisK K3N0YXRpYyBydHhfaW5zbiAqCithcm1fbXZlX2dldF9sb29wX3ZjdHAgKGJhc2ljX2Jsb2NrIGJi KQoreworICBydHhfaW5zbiAqaW5zbiA9IEJCX0hFQUQgKGJiKTsKKworICAvKiBOb3cgc2NhbiB0 aHJvdWdoIGFsbCB0aGUgaW5zdHJ1Y3Rpb24gcGF0dGVybnMgYW5kIHBpY2sgb3V0IHRoZSBWQ1RQ CisgICAgIGluc3RydWN0aW9uLiAgV2UgcmVxdWlyZSBhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWdf cGFyYW0gdG8gYmUgZmFsc2UKKyAgICAgdG8gbWFrZSBzdXJlIHdlIHBpY2sgdXAgYSBWQ1RQLCBy YXRoZXIgdGhhbiBhIFZDVFBfTS4gICovCisgIEZPUl9CQl9JTlNOUyAoYmIsIGluc24pCisgICAg aWYgKE5PTkRFQlVHX0lOU05fUCAoaW5zbikpCisgICAgICBpZiAoYXJtX2dldF9yZXF1aXJlZF92 cHJfcmVnX3JldF92YWwgKGluc24pCisJICAmJiAoYXJtX212ZV9nZXRfdmN0cF9sYW5lcyAoUEFU VEVSTiAoaW5zbikpICE9IDApCisJICAmJiAhYXJtX2dldF9yZXF1aXJlZF92cHJfcmVnX3BhcmFt IChpbnNuKSkKKwlyZXR1cm4gaW5zbjsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJldHVybiB0 cnVlIGlmIElOU04gaXMgYSBNVkUgaW5zdHJ1Y3Rpb24gdGhhdCBpcyBWUFQtcHJlZGljYWJsZSwg YnV0IGluCisgICBpdHMgdW5wcmVkaWNhdGVkIGZvcm0sIG9yIGlmIGl0IGlzIHByZWRpY2F0ZWQs IGJ1dCBvbiBhIHByZWRpY2F0ZSBvdGhlcgorICAgdGhhbiBWUFJfUkVHLiAgKi8KKworc3RhdGlj IGJvb2wKK2FybV9tdmVfdmVjX2luc25faXNfdW5wcmVkaWNhdGVkX29yX3VzZXNfb3RoZXJfcHJl ZGljYXRlIChydHhfaW5zbiAqaW5zbiwKKwkJCQkJCQkgIHJ0eCB2cHJfcmVnKQoreworICBydHgg aW5zbl92cHJfcmVnX29wZXJhbmQ7CisgIGlmIChNVkVfVlBUX1VOUFJFRElDQVRFRF9JTlNOX1Ag KGluc24pCisgICAgICB8fCAoTVZFX1ZQVF9QUkVESUNBVEVEX0lOU05fUCAoaW5zbikKKwkgICYm IChpbnNuX3Zwcl9yZWdfb3BlcmFuZCA9IGFybV9nZXRfcmVxdWlyZWRfdnByX3JlZ19wYXJhbSAo aW5zbikpCisJICAmJiAhcnR4X2VxdWFsX3AgKHZwcl9yZWcsIGluc25fdnByX3JlZ19vcGVyYW5k KSkpCisgICAgcmV0dXJuIHRydWU7CisgIGVsc2UKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8q IFJldHVybiB0cnVlIGlmIElOU04gaXMgYSBNVkUgaW5zdHJ1Y3Rpb24gdGhhdCBpcyBWUFQtcHJl ZGljYWJsZSBhbmQgaXMKKyAgIHByZWRpY2F0ZWQgb24gVlBSX1JFRy4gICovCisKK3N0YXRpYyBi b29sCithcm1fbXZlX3ZlY19pbnNuX2lzX3ByZWRpY2F0ZWRfd2l0aF90aGlzX3ByZWRpY2F0ZSAo cnR4X2luc24gKmluc24sCisJCQkJCQkgICAgcnR4IHZwcl9yZWcpCit7CisgIHJ0eCBpbnNuX3Zw cl9yZWdfb3BlcmFuZDsKKyAgaWYgKE1WRV9WUFRfUFJFRElDQVRFRF9JTlNOX1AgKGluc24pCisg ICAgICAmJiAoaW5zbl92cHJfcmVnX29wZXJhbmQgPSBhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWdf cGFyYW0gKGluc24pKQorICAgICAgJiYgcnR4X2VxdWFsX3AgKHZwcl9yZWcsIGluc25fdnByX3Jl Z19vcGVyYW5kKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZWxzZQorICAgIHJldHVybiBmYWxzZTsK K30KKworLyogVXRpbGl0eSBmdW5jdGlvbiB0byBpZGVudGlmeSBpZiBJTlNOIGlzIGFuIE1WRSBp bnN0cnVjdGlvbiB0aGF0IHBlcmZvcm1zCisgICBzb21lIGFjcm9zcy12ZWN0b3Igb3BlcmF0aW9u IChhbmQgYXMgYSByZXN1bHQgZG9lcyBub3QgYWxpZ24gd2l0aCBub3JtYWwKKyAgIGxhbmUgcHJl ZGljYXRpb24gcnVsZXMpLiAgQWxsIHN1Y2ggaW5zdHJ1Y3Rpb25zIGdpdmUgb25lIG9ubHkgc2Nh bGFyCisgICBvdXRwdXQsIGV4Y2VwdCBmb3IgdnNobGNxIHdoaWNoIGdpdmVzIGEgUEFSQUxMRUwg b2YgYSB2ZWN0b3IgYW5kIGEgc2NhbGFyCisgICAob25lIHZlY3RvciByZXN1bHQgYW5kIG9uZSBj YXJyeSBvdXRwdXQpLiAgKi8KKworc3RhdGljIGJvb2wKK2FybV9pc19tdmVfYWNyb3NzX3ZlY3Rv cl9pbnNuIChydHhfaW5zbiogaW5zbikKK3sKKyAgZGZfcmVmIGluc25fZGVmcyA9IE5VTEw7Cisg IGlmICghTVZFX1ZQVF9QUkVESUNBQkxFX0lOU05fUCAoaW5zbikpCisgICAgcmV0dXJuIGZhbHNl OworCisgIGJvb2wgaXNfYWNyb3NzX3ZlY3RvciA9IGZhbHNlOworICBGT1JfRUFDSF9JTlNOX0RF RiAoaW5zbl9kZWZzLCBpbnNuKQorICAgIGlmICghVkFMSURfTVZFX01PREUgKEdFVF9NT0RFIChE Rl9SRUZfUkVHIChpbnNuX2RlZnMpKSkKKwkmJiAhYXJtX2dldF9yZXF1aXJlZF92cHJfcmVnX3Jl dF92YWwgKGluc24pKQorICAgICAgaXNfYWNyb3NzX3ZlY3RvciA9IHRydWU7CisKKyAgcmV0dXJu IGlzX2Fjcm9zc192ZWN0b3I7Cit9CisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gaWRlbnRpZnkg aWYgSU5TTiBpcyBhbiBNVkUgbG9hZCBvciBzdG9yZSBpbnN0cnVjdGlvbi4KKyAgICogRm9yIFRZ UEUgPT0gMCwgY2hlY2sgYWxsIG9wZXJhbmRzLiAgSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1 ZSwKKyAgICAgSU5TTiBpcyBhIGxvYWQgb3IgYSBzdG9yZSBpbnNuLgorICAgKiBGb3IgVFlQRSA9 PSAxLCBvbmx5IGNoZWNrIHRoZSBpbnB1dCBvcGVyYW5kcy4gIElmIHRoZSBmdW5jdGlvbiByZXR1 cm5zCisgICAgIHRydWUsIElOU04gaXMgYSBsb2FkIGluc24uCisgICAqIEZvciBUWVBFID09IDIs IG9ubHkgY2hlY2sgdGhlIG91dHB1dCBvcGVyYW5kcy4gIElmIHRoZSBmdW5jdGlvbiByZXR1cm5z CisgICAgIHRydWUsIElOU04gaXMgYSBzdG9yZSBpbnNuLiAgKi8KKworc3RhdGljIGJvb2wKK2Fy bV9pc19tdmVfbG9hZF9zdG9yZV9pbnNuIChydHhfaW5zbiogaW5zbiwgaW50IHR5cGUgPSAwKQor eworICBpbnQgbl9vcGVyYW5kcyA9IHJlY29nX2RhdGEubl9vcGVyYW5kczsKKyAgZXh0cmFjdF9p bnNuIChpbnNuKTsKKworICBmb3IgKGludCBvcCA9IDA7IG9wIDwgbl9vcGVyYW5kczsgb3ArKykK KyAgICB7CisgICAgICBpZiAodHlwZSA9PSAxICYmIHJlY29nX2RhdGEub3BlcmFuZF90eXBlW29w XSA9PSBPUF9PVVQpCisJY29udGludWU7CisgICAgICBlbHNlIGlmICh0eXBlID09IDIgJiYgcmVj b2dfZGF0YS5vcGVyYW5kX3R5cGVbb3BdID09IE9QX0lOKQorCWNvbnRpbnVlOworICAgICAgaWYg KG12ZV9tZW1vcnlfb3BlcmFuZCAocmVjb2dfZGF0YS5vcGVyYW5kW29wXSwKKwkJCSAgICAgIEdF VF9NT0RFIChyZWNvZ19kYXRhLm9wZXJhbmRbb3BdKSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAg ICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLyogV2hlbiB0cmFuc2Zvcm1pbmcgYW4gTVZFIGlu dHJpbnNpYyBsb29wIGludG8gYW4gTVZFIFRhaWwgUHJlZGljYXRlZCBMb3cKKyAgIE92ZXJoZWFk IExvb3AsIHRoZXJlIGFyZSBhIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdGhhdCwgaWYgaW4gdGhl aXIKKyAgIHVucHJlZGljYXRlZCBmb3JtLCBhY3QgYWNyb3NzIHZlY3RvciBsYW5lcywgYnV0IGFy ZSBzdGlsbCBzYWZlIHRvIGluY2x1ZGUKKyAgIHdpdGhpbiB0aGUgbG9vcCwgZGVzcGl0ZSB0aGUg aW1wbGljaXQgcHJlZGljYXRpb24gYWRkZWQgdG8gdGhlIHZlY3RvciBsYW5lcy4KKyAgIFRoaXMg bGlzdCBoYXMgYmVlbiBjb21waWxlZCBieSBjYXJlZnVsbHkgYW5hbHl6aW5nIHRoZSBpbnN0cnVj dGlvbgorICAgcHNldWRvY29kZSBpbiB0aGUgQXJtLUFSTS4KKyAgIEFsbCBvdGhlciBhY3Jvc3Mt dmVjdG9yIGluc3RydWN0aW9ucyBhcmVuJ3QgYWxsb3dlZCwgYmVjYXVzZSB0aGUgYWRkaXRpb24K KyAgIG9mIGltcGxpY2l0IHByZWRpY2F0aW9uIGNvdWxkIGluZmx1bmNlIHRoZSByZXN1bHQgb2Yg dGhlIG9wZXJhdGlvbi4KKyAgIEFueSBuZXcgYWNyb3NzLXZlY3RvciBpbnN0cnVjdGlvbnMgdG8g dGhlIE1WRSBJU0Egd2lsbCBoYXZlIHRvIGFzc2Vzc2VkIGZvcgorICAgaW5jbHVzaW9uIHRvIHRo aXMgbGlzdC4gICovCisKK3N0YXRpYyBib29sCithcm1fbXZlX2lzX2FsbG93ZWRfdW5wcmVkaWNf YWNyb3NzX3ZlY3Rvcl9pbnNuIChydHhfaW5zbiogaW5zbikKK3sKKyAgZ2NjX2Fzc2VydCAoTVZF X1ZQVF9VTlBSRURJQ0FURURfSU5TTl9QIChpbnNuKQorCSAgICAgICYmIGFybV9pc19tdmVfYWNy b3NzX3ZlY3Rvcl9pbnNuIChpbnNuKSk7CisgIHJ0eCBpbnNuX3BhdHRlcm4gPSBQQVRURVJOIChp bnNuKTsKKyAgaWYgKEdFVF9DT0RFIChpbnNuX3BhdHRlcm4pID09IFNFVAorICAgICAgJiYgR0VU X0NPREUgKFhFWFAgKGluc25fcGF0dGVybiwgMSkpID09IFVOU1BFQworICAgICAgJiYgKFhJTlQg KFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZBRERWUV9VCisJICB8fCBYSU5UIChYRVhQ IChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWQUREVlFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5z bl9wYXR0ZXJuLCAxKSwgMSkgPT0gVkFERFZBUV9VCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3Bh dHRlcm4sIDEpLCAxKSA9PSBWQUREVkFRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVy biwgMSksIDEpID09IFZNTEFEQVZRX1UKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwg MSksIDEpID09IFZNTEFEQVZRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSks IDEpID09IFZNTEFEQVZYUV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAx KSA9PSBWTUxBREFWQVFfVQorCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkg PT0gVk1MQURBVkFRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09 IFZNTEFEQVZBWFFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0g VkFCQVZRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZBQkFW UV9VCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWQURETFZRX1MK KwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZBRERMVlFfVQorCSAg fHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVkFERExWQVFfUworCSAgfHwg WElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVkFERExWQVFfVQorCSAgfHwgWElO VCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVkFERFZBUV9TCisJICB8fCBYSU5UIChY RVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWQUREVkFRX1UKKwkgIHx8IFhJTlQgKFhFWFAg KGluc25fcGF0dGVybiwgMSksIDEpID09IFZNQVhWUV9VCisJICB8fCBYSU5UIChYRVhQIChpbnNu X3BhdHRlcm4sIDEpLCAxKSA9PSBWTUFYQVZRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0 dGVybiwgMSksIDEpID09IFZNTEFMREFWUV9VCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRl cm4sIDEpLCAxKSA9PSBWTUxBTERBVlhRX1UKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVy biwgMSksIDEpID09IFZNTEFMREFWWFFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJu LCAxKSwgMSkgPT0gVk1MQUxEQVZRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwg MSksIDEpID09IFZNTEFMREFWQVFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAx KSwgMSkgPT0gVk1MQUxEQVZBUV9VCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEp LCAxKSA9PSBWTUxBTERBVkFYUV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEp LCAxKSA9PSBWTUxBTERBVkFYUV9VCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEp LCAxKSA9PSBWTUxTREFWUV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAx KSA9PSBWTUxTREFWWFFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkg PT0gVk1MU0RBVkFYUV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9 PSBWTUxTREFWQVFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0g Vk1MU0xEQVZRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZN TFNMREFWWFFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVk1M U0xEQVZBUV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWTUxT TERBVkFYUV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWUk1M QUxEQVZIWFFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVlJN TEFMREFWSFFfVQorCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVlJN TEFMREFWSFFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVlJN TEFMREFWSEFRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZS TUxBTERBVkhBUV9VCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBW Uk1MQUxEQVZIQVhRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09 IFZSTUxTTERBVkhRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09 IFZSTUxTTERBVkhYUV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9 PSBWUk1MU0xEQVZIQVFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkg PT0gVlJNTFNMREFWSEFYUV9TKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGZhbHNlOwor fQorCisvKiBTY2FuIHRocm91Z2ggdGhlIERGIGNoYWluIGJhY2t3YXJkcyB3aXRoaW4gdGhlIGJh c2ljIGJsb2NrIGFuZAorICAgZGV0ZXJtaW5lIGlmIGFueSBvZiB0aGUgVVNFcyBvZiB0aGUgb3Jp Z2luYWwgaW5zbiAob3IgdGhlIFVTRXMgb2YgdGhlIGluc25zCisgICB3aGVyZSB0aHkgd2VyZSBE RUYtZWQsIGV0Yy4pIHdlcmUgYWZmZWN0ZWQgYnkgaW1wbGljaXQgVlBUCisgICBwcmVkaWNhdGlv biBvZiBhbiBNVkVfVlBUX1VOUFJFRElDQVRFRF9JTlNOX1AgaW4gYSBkbHN0cC9sZXRwIGxvb3Au CisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5zbiBpcyBhZmZlY3RlZCBp bXBsaWNpdCBwcmVkaWNhdGlvbgorICAgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgIEhhdmluZyBz dWNoIGltcGxpY2l0IHByZWRpY2F0aW9uIG9uIGFuIHVucHJlZGljYXRlZCBpbnNuIHdvdWxkbid0 IGluIGl0c2VsZgorICAgYmxvY2sgdGFpbCBwcmVkaWNhdGlvbiwgYmVjYXVzZSB0aGUgb3V0cHV0 IG9mIHRoYXQgaW5zbiBtaWdodCB0aGVuIGJlIHVzZWQKKyAgIGluIGEgY29ycmVjdGx5IHByZWRp Y2F0ZWQgc3RvcmUgaW5zbiwgd2hlcmUgdGhlIGRpc2FibGVkIGxhbmVzIHdpbGwgYmUKKyAgIGln bm9yZWQuICBUbyB2ZXJpZnkgdGhpcyB3ZSBsYXRlciBjYWxsOgorICAgYGFybV9tdmVfY2hlY2tf ZGZfY2hhaW5fZndkX2Zvcl9pbXBsaWNfcHJlZGljX2ltcGFjdGAsIHdoaWNoIHdpbGwgY2hlY2sg dGhlCisgICBERiBjaGFpbnMgZm9yd2FyZCB0byBzZWUgaWYgYW55IGltcGxpY2l0bHktcHJlZGlj YXRlZCBvcGVyYW5kIGdldHMgdXNlZCBpbgorICAgYW4gaW1wcm9wZXIgd2F5LiAgKi8KKworc3Rh dGljIGJvb2wKK2FybV9tdmVfY2hlY2tfZGZfY2hhaW5fYmFja19mb3JfaW1wbGljX3ByZWRpYwor ICAoaGFzaF9tYXAgPHJ0eF9pbnNuICosIGJvb2w+ICpzYWZlX2luc25fbWFwLCBydHhfaW5zbiAq aW5zbl9pbiwKKyAgIHJ0eCB2Y3RwX3Zwcl9nZW5lcmF0ZWQpCit7CisKKyAgYXV0b192ZWM8cnR4 X2luc24gKj4gd29ya2xpc3Q7CisgIHdvcmtsaXN0LnNhZmVfcHVzaCAoaW5zbl9pbik7CisKKyAg Ym9vbCAqdGVtcCA9IE5VTEw7CisKKyAgd2hpbGUgKHdvcmtsaXN0Lmxlbmd0aCAoKSA+IDApCisg ICAgeworICAgICAgcnR4X2luc24gKmluc24gPSB3b3JrbGlzdC5wb3AgKCk7CisKKyAgICAgIGlm ICgodGVtcCA9IHNhZmVfaW5zbl9tYXAtPmdldCAoaW5zbikpKQorCXJldHVybiAqdGVtcDsKKwor ICAgICAgYmFzaWNfYmxvY2sgYm9keSA9IEJMT0NLX0ZPUl9JTlNOIChpbnNuKTsKKworICAgICAg LyogVGhlIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2ggYW4gaW5zdHJ1Y3Rpb24gaXMgYWZmZWN0 ZWQgYnkgImltcGxpY2l0CisJIHByZWRpY2F0aW9uIiBhcmUgYXMgZm9sbG93czoKKwkgICogSXQg aXMgYW4gVU5QUkVESUNBVEVEX0lOU05fUDoKKwkgICAgKiBUaGF0IGxvYWRzL3N0b3JlcyBmcm9t L3RvIG1lbW9yeS4KKwkgICAgKiBXaGVyZSBhbnkgb25lIG9mIGl0cyBvcGVyYW5kcyBpcyBhbiBN VkUgdmVjdG9yIGZyb20gb3V0c2lkZSB0aGUKKwkgICAgICBsb29wIGJvZHkgYmIuCisJIE9yOgor CSAgKiBBbnkgb2YgaXQncyBvcGVyYW5kcyB3ZXJlIGFmZmVjdGVkIGVhcmxpZXIgaW4gdGhlIGlu c24gY2hhaW4uICAqLworICAgICAgaWYgKE1WRV9WUFRfVU5QUkVESUNBVEVEX0lOU05fUCAoaW5z bikKKwkgICYmIChhcm1faXNfbXZlX2xvYWRfc3RvcmVfaW5zbiAoaW5zbikKKwkgICAgICB8fCAo YXJtX2lzX212ZV9hY3Jvc3NfdmVjdG9yX2luc24gKGluc24pCisJCSAgJiYgIWFybV9tdmVfaXNf YWxsb3dlZF91bnByZWRpY19hY3Jvc3NfdmVjdG9yX2luc24gKGluc24pKSkpCisJeworCSAgc2Fm ZV9pbnNuX21hcC0+cHV0IChpbnNuLCB0cnVlKTsKKwkgIHJldHVybiB0cnVlOworCX0KKworICAg ICAgZGZfcmVmIGluc25fdXNlcyA9IE5VTEw7CisgICAgICBGT1JfRUFDSF9JTlNOX1VTRSAoaW5z bl91c2VzLCBpbnNuKQorICAgICAgeworCS8qIElmIHRoZSBvcGVyYW5kIGlzIGluIHRoZSBpbnB1 dCByZWcgc2V0IHRvIHRoZSB0aGUgYmFzaWMgYmxvY2ssCisJICAgKGkuZS4gaXQgaGFzIGNvbWUg ZnJvbSBvdXRzaWRlIHRoZSBsb29wISksIGNvbnNpZGVyIGl0IHVuc2FmZSBpZjoKKwkgICAgICog SXQncyBiZWluZyB1c2VkIGluIGFuIHVucHJlZGljYXRlZCBpbnNuLgorCSAgICAgKiBJdCBpcyBh IHByZWRpY2FibGUgTVZFIHZlY3Rvci4gICovCisJaWYgKE1WRV9WUFRfVU5QUkVESUNBVEVEX0lO U05fUCAoaW5zbikKKwkgICAgJiYgVkFMSURfTVZFX01PREUgKEdFVF9NT0RFIChERl9SRUZfUkVH IChpbnNuX3VzZXMpKSkKKwkgICAgJiYgUkVHTk9fUkVHX1NFVF9QIChERl9MUl9JTiAoYm9keSks IERGX1JFRl9SRUdOTyAoaW5zbl91c2VzKSkpCisJICB7CisJICAgIHNhZmVfaW5zbl9tYXAtPnB1 dCAoaW5zbiwgdHJ1ZSk7CisJICAgIHJldHVybiB0cnVlOworCSAgfQorCisJLyogU2NhbiBiYWNr d2FyZHMgZnJvbSB0aGUgY3VycmVudCBJTlNOIHRocm91Z2ggdGhlIGluc3RydWN0aW9uIGNoYWlu CisJICAgdW50aWwgdGhlIHN0YXJ0IG9mIHRoZSBiYXNpYyBibG9jay4gICovCisJZm9yIChydHhf aW5zbiAqcHJldl9pbnNuID0gUFJFVl9JTlNOIChpbnNuKTsKKwkgICAgIHByZXZfaW5zbiAmJiBw cmV2X2luc24gIT0gUFJFVl9JTlNOIChCQl9IRUFEIChib2R5KSk7CisJICAgICBwcmV2X2luc24g PSBQUkVWX0lOU04gKHByZXZfaW5zbikpCisJICB7CisJICAgIC8qIElmIGEgcHJldmlvdXMgaW5z biBkZWZpbmVzIGEgcmVnaXN0ZXIgdGhhdCBJTlNOIHVzZXMsIHRoZW4KKwkgICAgICAgYWRkIHRv IHRoZSB3b3JrbGlzdCB0byBjaGVjayB0aGF0IGluc24ncyBVU0VzLiAgSWYgYW55IG9mIHRoZXNl CisJICAgICAgIGluc25zIHJldHVybiB0cnVlIGFzIE1WRV9WUFRfVU5QUkVESUNBVEVEX0lOU05f UHMsIHRoZW4gdGhlCisJICAgICAgIHdob2xlIGNoYWluIGlzIGFmZmVjdGVkIGJ5IHRoZSBjaGFu Z2UgaW4gYmVoYXZpb3VyIGZyb20gYmVpbmcKKwkgICAgICAgcGxhY2VkIGluIGRsc3RwL2xldHAg bG9vcC4gICovCisJICAgIGRmX3JlZiBwcmV2X2luc25fZGVmcyA9IE5VTEw7CisJICAgIEZPUl9F QUNIX0lOU05fREVGIChwcmV2X2luc25fZGVmcywgcHJldl9pbnNuKQorCSAgICB7CisJICAgICAg aWYgKERGX1JFRl9SRUdOTyAoaW5zbl91c2VzKSA9PSBERl9SRUZfUkVHTk8gKHByZXZfaW5zbl9k ZWZzKQorCQkgICYmICFhcm1fbXZlX3ZlY19pbnNuX2lzX3ByZWRpY2F0ZWRfd2l0aF90aGlzX3By ZWRpY2F0ZQorCQkgICAgICAgKGluc24sIHZjdHBfdnByX2dlbmVyYXRlZCkpCisJCXdvcmtsaXN0 LnNhZmVfcHVzaCAocHJldl9pbnNuKTsKKwkgICAgfQorCSAgfQorICAgICAgfQorICAgIH0KKyAg c2FmZV9pbnNuX21hcC0+cHV0IChpbnNuX2luLCBmYWxzZSk7CisgIHJldHVybiBmYWxzZTsKK30K KworLyogSWYgd2UgaGF2ZSBpZGVudGlmaWVkIHRoYXQgdGhlIGN1cnJlbnQgREVGIHdpbGwgYmUg bW9kaWZpZWQKKyAgIGJ5IHN1Y2ggaW1wbGljaXQgcHJlZGljYXRpb24sIHNjYW4gdGhyb3VnaCBh bGwgdGhlCisgICBpbnNucyB0aGF0IFVTRSBpdCBhbmQgYmFpbCBvdXQgaWYgYW55IG9uZSBpcyBv dXRzaWRlIHRoZQorICAgY3VycmVudCBiYXNpYyBibG9jayAoaS5lLiB0aGUgcmVnIGlzIGxpdmUg YWZ0ZXIgdGhlIGxvb3ApCisgICBvciBpZiBhbnkgYXJlIHN0b3JlIGluc25zIHRoYXQgYXJlIHVu cHJlZGljYXRlZCBvciB1c2luZyBhCisgICBwcmVkaWNhdGUgb3RoZXIgdGhhbiB0aGUgbG9vcCBW UFIuCisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5zbiBpcyBub3Qgc3Vp dGFibGUgZm9yCisgICBpbXBsaWNpdCBwcmVkaWNhdGlvbiBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiov CisKK3N0YXRpYyBib29sCithcm1fbXZlX2NoZWNrX2RmX2NoYWluX2Z3ZF9mb3JfaW1wbGljX3By ZWRpY19pbXBhY3QgKHJ0eF9pbnNuICppbnNuLAorCQkJCQkJICAgICBydHggdmN0cF92cHJfZ2Vu ZXJhdGVkKQoreworCisgIC8qIElmIHRoaXMgaW5zbiBpcyBpbmRlZWQgYW4gdW5wcmVkaWNhdGVk IHN0b3JlIHRvIG1lbW9yeSwgYmFpbCBvdXQuICAqLworICBpZiAoYXJtX212ZV92ZWNfaW5zbl9p c191bnByZWRpY2F0ZWRfb3JfdXNlc19vdGhlcl9wcmVkaWNhdGUKKwkoaW5zbiwgdmN0cF92cHJf Z2VuZXJhdGVkKQorICAgICAgJiYgKGFybV9pc19tdmVfbG9hZF9zdG9yZV9pbnNuIChpbnNuLCAy KQorCSAgfHwgYXJtX2lzX212ZV9hY3Jvc3NfdmVjdG9yX2luc24gKGluc24pKSkKKyAgICByZXR1 cm4gdHJ1ZTsKKworICAvKiBOZXh0LCBzY2FuIGZvcndhcmQgdG8gdGhlIHZhcmlvdXMgVVNFcyBv ZiB0aGUgREVGcyBpbiB0aGlzIGluc24uICAqLworICBkZl9yZWYgaW5zbl9kZWYgPSBOVUxMOwor ICBGT1JfRUFDSF9JTlNOX0RFRiAoaW5zbl9kZWYsIGluc24pCisgICAgeworICAgICAgZm9yIChk Zl9yZWYgdXNlID0gREZfUkVHX1VTRV9DSEFJTiAoREZfUkVGX1JFR05PIChpbnNuX2RlZikpOyB1 c2U7CisJICAgdXNlID0gREZfUkVGX05FWFRfUkVHICh1c2UpKQorCXsKKwkgIHJ0eF9pbnNuICpu ZXh0X3VzZV9pbnNuID0gREZfUkVGX0lOU04gKHVzZSk7CisJICBpZiAobmV4dF91c2VfaW5zbiAh PSBpbnNuCisJICAgICAgJiYgTk9OREVCVUdfSU5TTl9QIChuZXh0X3VzZV9pbnNuKSkKKwkgICAg eworCSAgICAgIC8qIElmIHRoZSBVU0UgaXMgb3V0c2lkZSB0aGUgbG9vcCBib2R5IGJiLCBvciBp dCBpcyBpbnNpZGUsIGJ1dAorCQkgaXMgYW4gZGlmZmVyZW50bHktcHJlZGljYXRlZCBzdG9yZSB0 byBtZW1vcnkgb3IgaXQgaXMgYW55CisJCSBhY3Jvc3MtdmVjdG9yIGluc3RydWN0aW9uLiAgKi8K KwkgICAgICBpZiAoQkxPQ0tfRk9SX0lOU04gKGluc24pICE9IEJMT0NLX0ZPUl9JTlNOIChuZXh0 X3VzZV9pbnNuKQorCQkgIHx8IChhcm1fbXZlX3ZlY19pbnNuX2lzX3VucHJlZGljYXRlZF9vcl91 c2VzX290aGVyX3ByZWRpY2F0ZQorCQkgICAgICAgKG5leHRfdXNlX2luc24sIHZjdHBfdnByX2dl bmVyYXRlZCkKKwkJICAgICAmJiAoYXJtX2lzX212ZV9sb2FkX3N0b3JlX2luc24gKG5leHRfdXNl X2luc24sIDIpCisJCQkgfHwgYXJtX2lzX212ZV9hY3Jvc3NfdmVjdG9yX2luc24gKG5leHRfdXNl X2luc24pKSkpCisJCXJldHVybiB0cnVlOworCSAgICB9CisJfQorICAgIH0KKyAgcmV0dXJuIGZh bHNlOworfQorCisvKiBIZWxwZXIgZnVuY3Rpb24gdG8gYGFybV9tdmVfZGxzdHBfY2hlY2tfaW5j X2NvdW50ZXJgIGFuZCB0bworICAgYGFybV9tdmVfZGxzdHBfY2hlY2tfZGVjX2NvdW50ZXJgLiAg SW4gdGhlIHNpdHVhdGlvbnMgd2hlcmUgdGhlIGxvb3AgY291bnRlcgorICAgaXMgaW5jcmVtZW50 aW5nIGJ5IDEgb3IgZGVjcmVtZW50aW5nIGJ5IDEgaW4gZWFjaCBpdGVyYXRpb24sIGVuc3VyZSB0 aGF0IHRoZQorICAgdGFyZ2V0IHZhbHVlIG9yIHRoZSBpbml0aWFsaXNhdGlvbiB2YWx1ZSwgcmVz cGVjdGl2ZWx5LCB3YXMgYSBjYWxjdWxhdGlvbgorICAgb2YgdGhlIG51bWJlciBvZiBpdGVyYXRp b25zIG9mIHRoZSBsb29wLCB3aGljaCBpcyBleHBlY3RlZCB0byBiZSBhbiBBU0hJRlRSVAorICAg YnkgVkNUUF9TVEVQLiAgKi8KKworc3RhdGljIGJvb2wKK2FybV9tdmVfY2hlY2tfcmVnX29yaWdp bl9pc19udW1fZWxlbXMgKGJhc2ljX2Jsb2NrIGJvZHksIHJ0eCByZWcsIHJ0eCB2Y3RwX3N0ZXAp Cit7CisgIC8qIE9rLCB3ZSBub3cga25vdyB0aGUgbG9vcCBzdGFydHMgZnJvbSB6ZXJvIGFuZCBp bmNyZW1lbnRzIGJ5IG9uZS4KKyAgICAgTm93IGp1c3Qgc2hvdyB0aGF0IHRoZSBtYXggdmFsdWUg b2YgdGhlIGNvdW50ZXIgY2FtZSBmcm9tIGFuCisgICAgIGFwcHJvcHJpYXRlIEFTSElGUlQgZXhw ciBvZiB0aGUgY29ycmVjdCBhbW91bnQuICAqLworICBiYXNpY19ibG9jayBwcmVfbG9vcF9iYiA9 IGJvZHktPnByZXZfYmI7CisgIHdoaWxlIChwcmVfbG9vcF9iYiAmJiBCQl9FTkQgKHByZV9sb29w X2JiKQorCSAmJiAhZGZfYmJfcmVnbm9fb25seV9kZWZfZmluZCAocHJlX2xvb3BfYmIsIFJFR05P IChyZWcpKSkKKyAgICBwcmVfbG9vcF9iYiA9IHByZV9sb29wX2JiLT5wcmV2X2JiOworCisgIGRm X3JlZiBjb3VudGVyX21heF9sYXN0X2RlZiA9IGRmX2JiX3JlZ25vX29ubHlfZGVmX2ZpbmQgKHBy ZV9sb29wX2JiLCBSRUdOTyAocmVnKSk7CisgIHJ0eCBjb3VudGVyX21heF9sYXN0X3NldDsKKyAg aWYgKGNvdW50ZXJfbWF4X2xhc3RfZGVmKQorICAgIGNvdW50ZXJfbWF4X2xhc3Rfc2V0ID0gUEFU VEVSTiAoREZfUkVGX0lOU04gKGNvdW50ZXJfbWF4X2xhc3RfZGVmKSk7CisgIGVsc2UKKyAgICBy ZXR1cm4gZmFsc2U7CisKKyAgLyogSWYgd2UgZW5jb3VudGVyIGEgc2ltcGxlIFNFVCBmcm9tIGEg UkVHLCBmb2xsb3cgaXQgdGhyb3VnaC4gICovCisgIGlmIChHRVRfQ09ERSAoY291bnRlcl9tYXhf bGFzdF9zZXQpID09IFNFVAorICAgICAgJiYgUkVHX1AgKFhFWFAgKGNvdW50ZXJfbWF4X2xhc3Rf c2V0LCAxKSkpCisgICAgcmV0dXJuIGFybV9tdmVfY2hlY2tfcmVnX29yaWdpbl9pc19udW1fZWxl bXMKKwkgICAgIChwcmVfbG9vcF9iYi0+bmV4dF9iYiwgWEVYUCAoY291bnRlcl9tYXhfbGFzdF9z ZXQsIDEpLCB2Y3RwX3N0ZXApOworCisgIC8qIElmIHdlIGVuY291bnRlciBhIFNFVCBmcm9tIGFu IElGX1RIRU5fRUxTRSB3aGVyZSBvbmUgb2YgdGhlIG9wZXJhbmRzIGlzIGEKKyAgICAgY29uc3Rh bnQgYW5kIHRoZSBvdGhlciBpcyBhIFJFRywgZm9sbG93IHRocm91Z2ggdG8gdGhhdCBSRUcuICAq LworICBpZiAoR0VUX0NPREUgKGNvdW50ZXJfbWF4X2xhc3Rfc2V0KSA9PSBTRVQKKyAgICAgICYm IEdFVF9DT0RFIChYRVhQIChjb3VudGVyX21heF9sYXN0X3NldCwgMSkpID09IElGX1RIRU5fRUxT RQorICAgICAgJiYgUkVHX1AgKFhFWFAgKFhFWFAgKGNvdW50ZXJfbWF4X2xhc3Rfc2V0LCAxKSwg MSkpCisgICAgICAmJiBDT05TVF9JTlRfUCAoWEVYUCAoWEVYUCAoY291bnRlcl9tYXhfbGFzdF9z ZXQsIDEpLCAyKSkpCisgICAgcmV0dXJuIGFybV9tdmVfY2hlY2tfcmVnX29yaWdpbl9pc19udW1f ZWxlbXMKKwkgICAgIChwcmVfbG9vcF9iYi0+bmV4dF9iYiwgWEVYUCAoWEVYUCAoY291bnRlcl9t YXhfbGFzdF9zZXQsIDEpLCAxKSwgdmN0cF9zdGVwKTsKKworICBpZiAoR0VUX0NPREUgKFhFWFAg KGNvdW50ZXJfbWF4X2xhc3Rfc2V0LCAxKSkgPT0gQVNISUZUUlQKKyAgICAgICYmIENPTlNUX0lO VF9QIChYRVhQIChYRVhQIChjb3VudGVyX21heF9sYXN0X3NldCwgMSksIDEpKQorICAgICAgJiYg KCgxIDw8IElOVFZBTCAoWEVYUCAoWEVYUCAoY291bnRlcl9tYXhfbGFzdF9zZXQsIDEpLCAxKSkp CisJICAgPT0gYWJzIChJTlRWQUwgKHZjdHBfc3RlcCkpKSkKKyAgICByZXR1cm4gdHJ1ZTsKKwor ICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIElmIHdlIGhhdmUgaWRlbnRpZmllZCB0aGUgbG9vcCB0 byBoYXZlIGFuIGluY3JlbWVudGluZyBjb3VudGVyLCB3ZSBuZWVkIHRvCisgICBtYWtlIHN1cmUg dGhhdCBpdCBpbmNyZW1lbnRzIGJ5IDEgYW5kIHRoYXQgdGhlIGxvb3AgaXMgc3RydWN0dXJlZCBj b3JyZWN0bHk6CisgICAgKiBUaGUgY291bnRlciBzdGFydHMgZnJvbSAwCisgICAgKiBUaGUgY291 bnRlciB0ZXJtaW5hdGVzIGF0IChudW1fb2ZfZWxlbSArIG51bV9vZl9sYW5lcyAtIDEpIC8gbnVt X29mX2xhbmVzCisgICAgKiBUaGUgdmN0cCBpbnNuIHVzZXMgYSByZWcgdGhhdCBkZWNyZW1lbnRz IGFwcHJvcHJpYXRlbHkgaW4gZWFjaCBpdGVyYXRpb24uCisqLworCitzdGF0aWMgcnR4X2luc24q Cithcm1fbXZlX2Rsc3RwX2NoZWNrX2luY19jb3VudGVyIChiYXNpY19ibG9jayBib2R5LCBydHhf aW5zbiogdmN0cF9pbnNuLAorCQkJCSBydHggY29uZGNvbnN0LCBydHggY29uZGNvdW50KQorewor ICBydHggdmN0cF9yZWcgPSBYVkVDRVhQIChYRVhQIChQQVRURVJOICh2Y3RwX2luc24pLCAxKSwg MCwgMCk7CisgIC8qIFRoZSBsb29wIGxhdGNoIGhhcyB0byBiZSBlbXB0eS4gIFdoZW4gY29tcGls aW5nIGFsbCB0aGUga25vd24gTVZFIExvTHMgaW4KKyAgICAgdXNlciBhcHBsaWNhdGlvbnMsIG5v bmUgb2YgdGhvc2Ugd2l0aCBpbmNyZW1lbnRpbmcgY291bnRlcnMgaGFkIGFueSByZWFsCisgICAg IGluc25zIGluIHRoZSBsb29wIGxhdGNoLiAgQXMgc3VjaCwgdGhpcyBmdW5jdGlvbiBoYXMgb25s eSBiZWVuIHRlc3RlZCB3aXRoCisgICAgIGFuIGVtcHR5IGxhdGNoIGFuZCBtYXkgbWlzYmVoYXZl IG9yIElDRSBpZiB3ZSBzb21laG93IGdldCBoZXJlIHdpdGggYW4KKyAgICAgaW5jcmVtZW50IGlu IHRoZSBsYXRjaCwgc28sIGZvciBjb3JyZWN0bmVzcywgZXJyb3Igb3V0IGVhcmx5LiAgKi8KKyAg aWYgKCFlbXB0eV9ibG9ja19wIChib2R5LT5sb29wX2ZhdGhlci0+bGF0Y2gpKQorICAgIHJldHVy biBOVUxMOworCisgIGNsYXNzIHJ0eF9pdiB2Y3RwX3JlZ19pdjsKKyAgLyogRm9yIGxvb3BzIG9m IHR5cGUgQikgdGhlIGxvb3AgY291bnRlciBpcyBpbmRlcGVuZGVudCBvZiB0aGUgZGVjcmVtZW50 CisgICAgIG9mIHRoZSByZWcgdXNlZCBpbiB0aGUgdmN0cF9pbnNuLiBTbyBydW4gaXYgYW5hbHlz aXMgb24gdGhhdCByZWcuICBUaGlzCisgICAgIGhhcyB0byBzdWNjZWVkIGZvciBzdWNoIGxvb3Bz IHRvIGJlIHN1cHBvcnRlZC4gICovCisgIGlmICghaXZfYW5hbHl6ZSAodmN0cF9pbnNuLCBhc19h PHNjYWxhcl9pbnRfbW9kZT4gKEdFVF9NT0RFICh2Y3RwX3JlZykpLAorICAgICAgdmN0cF9yZWcs ICZ2Y3RwX3JlZ19pdikpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogRXh0cmFjdCB0aGUgZGVj cmVtZW50bnVtIG9mIHRoZSB2Y3RwIHJlZyBmcm9tIHRoZSBpdi4gICovCisgIGludCBkZWNyZW1l bnRudW0gPSBhYnMgKElOVFZBTCAodmN0cF9yZWdfaXYuc3RlcCkpOworCisgIC8qIEZpbmQgd2hl cmUgYm90aCBvZiB0aG9zZSBhcmUgbW9kaWZpZWQgaW4gdGhlIGxvb3AgYm9keSBiYi4gICovCisg IGRmX3JlZiBjb25kY291bnRfcmVnX3NldF9kZiA9IGRmX2JiX3JlZ25vX29ubHlfZGVmX2ZpbmQg KGJvZHksIFJFR05PIChjb25kY291bnQpKTsKKyAgZGZfcmVmIHZjdHBfcmVnX3NldF9kZiA9IGRm X2JiX3JlZ25vX29ubHlfZGVmX2ZpbmQgKGJvZHksIFJFR05PICh2Y3RwX3JlZykpOworICBpZiAo IWNvbmRjb3VudF9yZWdfc2V0X2RmIHx8ICF2Y3RwX3JlZ19zZXRfZGYpCisgICAgcmV0dXJuIE5V TEw7CisgIHJ0eCBjb25kY291bnRfcmVnX3NldCA9IFBBVFRFUk4gKERGX1JFRl9JTlNOIChjb25k Y291bnRfcmVnX3NldF9kZikpOworICBydHhfaW5zbiogdmN0cF9yZWdfc2V0ID0gREZfUkVGX0lO U04gKHZjdHBfcmVnX3NldF9kZik7CisgIC8qIEVuc3VyZSB0aGUgbW9kaWZpY2F0aW9uIG9mIHRo ZSB2Y3RwIHJlZyBmcm9tIGRmIGlzIGNvbnNpc3RlbnQgd2l0aAorICAgICB0aGUgaXYgYW5kIHRo ZSBudW1iZXIgb2YgbGFuZXMgb24gdGhlIHZjdHAgaW5zbi4gICovCisgIGlmICghKEdFVF9DT0RF IChYRVhQIChQQVRURVJOICh2Y3RwX3JlZ19zZXQpLCAxKSkgPT0gUExVUworICAgICAgJiYgUkVH Tk8gKFhFWFAgKFBBVFRFUk4gKHZjdHBfcmVnX3NldCksIDApKQorCSAgPT0gUkVHTk8gKFhFWFAg KFhFWFAgKFBBVFRFUk4gKHZjdHBfcmVnX3NldCksIDEpLCAwKSkpKQorICAgIHJldHVybiBOVUxM OworICBpZiAoZGVjcmVtZW50bnVtICE9IGFicyAoSU5UVkFMIChYRVhQIChYRVhQIChQQVRURVJO ICh2Y3RwX3JlZ19zZXQpLCAxKSwgMSkpKQorICAgICAgfHwgZGVjcmVtZW50bnVtICE9IGFybV9t dmVfZ2V0X3ZjdHBfbGFuZXMgKFBBVFRFUk4gKHZjdHBfaW5zbikpKQorICAgIHJldHVybiBOVUxM OworCisgIGlmIChSRUdfUCAoY29uZGNvdW50KSAmJiBSRUdfUCAoY29uZGNvbnN0KSkKKyAgICB7 CisgICAgICAvKiBGaXJzdCB3ZSBuZWVkIHRvIHByb3ZlIHRoYXQgdGhlIGxvb3AgaXMgZ29pbmcg MC4uY29uZGNvbnN0IHdpdGggYW4KKwkgaW5jIG9mIDEgaW4gZWFjaCBpdGVyYXRpb24uICAqLwor ICAgICAgaWYgKEdFVF9DT0RFIChYRVhQIChjb25kY291bnRfcmVnX3NldCwgMSkpID09IFBMVVMK KwkgICYmIENPTlNUX0lOVF9QIChYRVhQIChYRVhQIChjb25kY291bnRfcmVnX3NldCwgMSksIDEp KQorCSAgJiYgSU5UVkFMIChYRVhQIChYRVhQIChjb25kY291bnRfcmVnX3NldCwgMSksIDEpKSA9 PSAxKQorCXsKKwkgICAgcnR4IGNvdW50ZXJfcmVnID0gWEVYUCAoY29uZGNvdW50X3JlZ19zZXQs IDApOworCSAgICAvKiBDaGVjayB0aGF0IHRoZSBjb3VudGVyIGRpZCBpbmRlZWQgc3RhcnQgZnJv bSB6ZXJvLiAgKi8KKwkgICAgZGZfcmVmIHRoaXNfc2V0ID0gREZfUkVHX0RFRl9DSEFJTiAoUkVH Tk8gKGNvdW50ZXJfcmVnKSk7CisJICAgIGlmICghdGhpc19zZXQpCisJICAgICAgcmV0dXJuIE5V TEw7CisJICAgIGRmX3JlZiBsYXN0X3NldCA9IERGX1JFRl9ORVhUX1JFRyAodGhpc19zZXQpOwor CSAgICBpZiAoIWxhc3Rfc2V0KQorCSAgICAgIHJldHVybiBOVUxMOworCSAgICBydHhfaW5zbiog bGFzdF9zZXRfaW5zbiA9IERGX1JFRl9JTlNOIChsYXN0X3NldCk7CisJICAgIGlmICghc2luZ2xl X3NldCAobGFzdF9zZXRfaW5zbikpCisJICAgICAgcmV0dXJuIE5VTEw7CisJICAgIHJ0eCBjb3Vu dGVyX29yaWdfc2V0OworCSAgICBjb3VudGVyX29yaWdfc2V0ID0gWEVYUCAoUEFUVEVSTiAobGFz dF9zZXRfaW5zbiksIDEpOworCSAgICBpZiAoIUNPTlNUX0lOVF9QIChjb3VudGVyX29yaWdfc2V0 KQorCQl8fCAoSU5UVkFMIChjb3VudGVyX29yaWdfc2V0KSAhPSAwKSkKKwkgICAgICByZXR1cm4g TlVMTDsKKwkgICAgLyogQW5kIGZpbmFsbHkgY2hlY2sgdGhhdCB0aGUgdGFyZ2V0IHZhbHVlIG9m IHRoZSBjb3VudGVyLAorCSAgICAgICBjb25kY29uc3QsIGlzIG9mIHRoZSBjb3JyZWN0IHNoYXBl LiAgKi8KKwkgICAgaWYgKCFhcm1fbXZlX2NoZWNrX3JlZ19vcmlnaW5faXNfbnVtX2VsZW1zIChi b2R5LCBjb25kY29uc3QsCisJCQkJCQkJdmN0cF9yZWdfaXYuc3RlcCkpCisJICAgICAgcmV0dXJu IE5VTEw7CisJfQorICAgICAgZWxzZQorCXJldHVybiBOVUxMOworICAgIH0KKyAgZWxzZQorICAg IHJldHVybiBOVUxMOworCisgIC8qIEV2ZXJ5dGhpbmcgbG9va3MgdmFsaWQuICAqLworICByZXR1 cm4gdmN0cF9pbnNuOworfQorCisvKiBIZWxwZXIgZnVuY3Rpb24gdG8gYGFybV9tdmVfbG9vcF92 YWxpZF9mb3JfZGxzdHBgLiAgSW4gdGhlIGNhc2Ugb2YgYQorICAgY291bnRlciB0aGF0IGlzIGRl Y3JlbWVudGluZywgZW5zdXJlIHRoYXQgaXQgaXMgZGVjcmVtZW50aW5nIGJ5IHRoZQorICAgcmln aHQgYW1vdW50IGluIGVhY2ggaXRlcmF0aW9uIGFuZCB0aGF0IHRoZSB0YXJnZXQgY29uZGl0aW9u IGlzIHdoYXQKKyAgIHdlIGV4cGVjdC4gICovCisKK3N0YXRpYyBydHhfaW5zbioKK2FybV9tdmVf ZGxzdHBfY2hlY2tfZGVjX2NvdW50ZXIgKGJhc2ljX2Jsb2NrIGJvZHksIHJ0eF9pbnNuKiB2Y3Rw X2luc24sCisJCQkJIHJ0eCBjb25kY29uc3QsIHJ0eCBjb25kY291bnQpCit7CisgIHJ0eCB2Y3Rw X3JlZyA9IFhWRUNFWFAgKFhFWFAgKFBBVFRFUk4gKHZjdHBfaW5zbiksIDEpLCAwLCAwKTsKKyAg Y2xhc3MgcnR4X2l2IHZjdHBfcmVnX2l2OworICBpbnQgZGVjcmVtZW50bnVtOworICAvKiBGb3Ig ZGVjcmVtZW50aW5nIGxvb3BzIG9mIHR5cGUgQSksIHRoZSBjb3VudGVyIGlzIHVzdWFsbHkgcHJl c2VudCBpbiB0aGUKKyAgICAgbG9vcCBsYXRjaC4gIEhlcmUgd2Ugc2ltcGx5IG5lZWQgdG8gdmVy aWZ5IHRoYXQgdGhpcyBjb3VudGVyIGlzIHRoZSBzYW1lCisgICAgIHJlZyB0aGF0IGlzIGFsc28g dXNlZCBpbiB0aGUgdmN0cF9pbnNuIGFuZCB0aGF0IGl0IGlzIG5vdCBvdGhlcndpc2UKKyAgICAg bW9kaWZpZWQuICAqLworICBydHhfaW5zbiAqZGVjX2luc24gPSBCQl9FTkQgKGJvZHktPmxvb3Bf ZmF0aGVyLT5sYXRjaCk7CisgIC8qIElmIG5vdCBpbiB0aGUgbG9vcCBsYXRjaCwgdHJ5IHRvIGZp bmQgdGhlIGRlY3JlbWVudCBpbiB0aGUgbG9vcCBib2R5LiAgKi8KKyAgaWYgKCFOT05ERUJVR19J TlNOX1AgKGRlY19pbnNuKSkKKyAgeworICAgIGRmX3JlZiB0ZW1wID0gZGZfYmJfcmVnbm9fb25s eV9kZWZfZmluZCAoYm9keSwgUkVHTk8gKGNvbmRjb3VudCkpOworICAgIC8qIElmIHdlIGhhdmVu J3QgYmVlbiBhYmxlIHRvIGZpbmQgdGhlIGRlY3JlbWVudCwgYmFpbCBvdXQuICAqLworICAgIGlm ICghdGVtcCkKKyAgICAgIHJldHVybiBOVUxMOworICAgIGRlY19pbnNuID0gREZfUkVGX0lOU04g KHRlbXApOworICB9CisKKyAgLyogTmV4dCwgZW5zdXJlIHRoYXQgaXQgaXMgYSBQTFVTIG9mIHRo ZSBmb3JtOgorICAgICAoc2V0IChyZWcgYSkgKHBsdXMgKHJlZyBhKSAoY29uc3RfaW50KSkpCisg ICAgIHdoZXJlIChyZWcgYSkgaXMgdGhlIHNhbWUgYXMgY29uZGNvdW50LiAgKi8KKyAgaWYgKEdF VF9DT0RFIChYRVhQIChQQVRURVJOIChkZWNfaW5zbiksIDEpKSA9PSBQTFVTCisgICAgICAmJiBS RUdOTyAoWEVYUCAoUEFUVEVSTiAoZGVjX2luc24pLCAwKSkKKwkgID09IFJFR05PIChYRVhQIChY RVhQIChQQVRURVJOIChkZWNfaW5zbiksIDEpLCAwKSkKKyAgICAgICYmIFJFR05PIChYRVhQIChQ QVRURVJOIChkZWNfaW5zbiksIDApKSA9PSBSRUdOTyAoY29uZGNvdW50KSkKKyAgICBkZWNyZW1l bnRudW0gPSBhYnMgKElOVFZBTCAoWEVYUCAoWEVYUCAoUEFUVEVSTiAoZGVjX2luc24pLCAxKSwg MSkpKTsKKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworCisgIC8qIE9rLCBzbyB3ZSBub3cga25v dyB0aGUgbG9vcCBkZWNyZW1lbnQuICBJZiBpdCBpcyBhIDEsIHRoZW4gd2UgbmVlZCB0bworICAg ICBsb29rIGF0IHRoZSBsb29wIHZjdHBfcmVnIGFuZCB2ZXJpZnkgdGhhdCBpdCBhbHNvIGRlY3Jl bWVudHMgY29ycmVjdGx5LgorICAgICBUaGVuLCB3ZSBuZWVkIHRvIGVzdGFibGlzaCB0aGF0IHRo ZSBzdGFydGluZyB2YWx1ZSBvZiB0aGUgbG9vcCBkZWNyZW1lbnQKKyAgICAgb3JpZ2luYXRlcyBm cm9tIHRoZSBzdGFydGluZyB2YWx1ZSBvZiB0aGUgdmN0cCBkZWNyZW1lbnQuICAqLworICBpZiAo ZGVjcmVtZW50bnVtID09IDEpCisgICAgeworICAgICAgY2xhc3MgcnR4X2l2IHZjdHBfcmVnX2l2 OworICAgICAgLyogVGhlIGxvb3AgY291bnRlciBpcyBmb3VuZCB0byBiZSBpbmRlcGVuZGVudCBv ZiB0aGUgZGVjcmVtZW50CisJIG9mIHRoZSByZWcgdXNlZCBpbiB0aGUgdmN0cF9pbnNuLCBhZ2Fp bi4gIEVuc3VyZSB0aGF0IElWIGFuYWx5c2lzCisJIHN1Y2NlZWRzIGFuZCBjaGVjayB0aGUgc3Rl cC4gICovCisgICAgICBpZiAoIWl2X2FuYWx5emUgKHZjdHBfaW5zbiwgYXNfYTxzY2FsYXJfaW50 X21vZGU+IChHRVRfTU9ERSAodmN0cF9yZWcpKSwKKwkJICAgICAgIHZjdHBfcmVnLCAmdmN0cF9y ZWdfaXYpKQorCXJldHVybiBOVUxMOworICAgICAgLyogRW5zdXJlIGl0IG1hdGNoZXMgdGhlIG51 bWJlciBvZiBsYW5lcyBvZiB0aGUgdmN0cCBpbnN0cnVjdGlvbi4gICovCisgICAgICBpZiAoYWJz IChJTlRWQUwgKHZjdHBfcmVnX2l2LnN0ZXApKQorCSAgIT0gYXJtX212ZV9nZXRfdmN0cF9sYW5l cyAoUEFUVEVSTiAodmN0cF9pbnNuKSkpCisJcmV0dXJuIE5VTEw7CisgICAgICBpZiAoIWFybV9t dmVfY2hlY2tfcmVnX29yaWdpbl9pc19udW1fZWxlbXMgKGJvZHksIGNvbmRjb3VudCwgdmN0cF9y ZWdfaXYuc3RlcCkpCisJcmV0dXJuIE5VTEw7CisgICAgfQorICAvKiBJZiB0aGUgZGVjcmVtZW50 cyBhcmUgdGhlIHNhbWUsIHRoZW4gdGhlIHNpdHVhdGlvbiBpcyBzaW1wbGU6IGVpdGhlciB0aGV5 CisgICAgIGFyZSBhbHNvIHRoZSBzYW1lIHJlZywgd2hpY2ggaXMgc2FmZSwgb3IgdGhleSBhcmUg ZGlmZmVyZW50IHJlZ2lzdGVycywgaW4KKyAgICAgd2hpY2ggY2FzZSBtYWtzZSBzdXJlIHRoYXQg dGhlcmUgaXMgYSBvbmx5IHNpbXBsZSBTRVQgZnJvbSBvbmUgdG8gdGhlCisgICAgIG90aGVyIGlu c2lkZSB0aGUgbG9vcC4qLworICBlbHNlIGlmIChkZWNyZW1lbnRudW0gPT0gYXJtX212ZV9nZXRf dmN0cF9sYW5lcyAoUEFUVEVSTiAodmN0cF9pbnNuKSkpCisgICAgeworICAgICAgaWYgKFJFR05P IChjb25kY291bnQpICE9IFJFR05PICh2Y3RwX3JlZykpCisJeworCSAgLyogSXQgd2Fzbid0IHRo ZSBzYW1lIHJlZywgYnV0IGl0IGNvdWxkIGJlIGJlaGlsZCBhCisJICAgICAoc2V0ICh2Y3RwX3Jl ZykgKGNvbmRjb3VudCkpLCBzbyBpbnN0ZWFkIGZpbmQgd2hlcmUKKwkgICAgIHRoZSBWQ1RQIGlu c24gaXMgREVGJ2QgaW5zaWRlIHRoZSBsb29wLiAgKi8KKwkgIHJ0eCB2Y3RwX3JlZ19zZXQgPQor CQlQQVRURVJOIChERl9SRUZfSU5TTiAoZGZfYmJfcmVnbm9fb25seV9kZWZfZmluZAorCQkJCQko Ym9keSwgUkVHTk8gKHZjdHBfcmVnKSkpKTsKKwkgIC8qIFRoaXMgbXVzdCBqdXN0IGJlIGEgc2lt cGxlIFNFVCBmcm9tIHRoZSBjb25kY291bnQuICAqLworCSAgaWYgKEdFVF9DT0RFICh2Y3RwX3Jl Z19zZXQpICE9IFNFVCB8fCAhUkVHX1AgKFhFWFAgKHZjdHBfcmVnX3NldCwgMSkpCisJICAgICAg fHwgUkVHTk8gKFhFWFAgKHZjdHBfcmVnX3NldCwgMSkpICE9IFJFR05PIChjb25kY291bnQpKQor CSAgICByZXR1cm4gTlVMTDsKKwl9CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIE5VTEw7CisK KyAgLyogV2Ugbm93IG9ubHkgbmVlZCB0byBmaW5kIG91dCB0aGF0IHRoZSBsb29wIHRlcm1pbmF0 ZXMgd2l0aCBhIExFCisgICAgIHplcm8gY29uZGl0aW9uLiAgSWYgY29uZGNvbnN0IGlzIGEgY29u c3RfaW50LCB0aGVuIHRoaXMgaXMgZWFzeS4KKyAgICAgSWYgaXRzIGEgUkVHLCBsb29rIGF0IHRo ZSBsYXN0IGNvbmRpdGlvbitqdW1wIGluIGEgYmIgYmVmb3JlCisgICAgIHRoZSBsb29wLCBiZWNh dXNlIHRoYXQgdXN1YWxseSB3aWxsIGhhdmUgYSBicmFuY2gganVtcGluZyBvdmVyCisgICAgIHRo ZSBsb29wIGJvZHkuICAqLworICBpZiAoQ09OU1RfSU5UX1AgKGNvbmRjb25zdCkKKyAgICAgICYm ICEoSU5UVkFMIChjb25kY29uc3QpID09IDAgJiYgSlVNUF9QIChCQl9FTkQgKGJvZHkpKQorCSAg ICYmIEdFVF9DT0RFIChYRVhQIChQQVRURVJOIChCQl9FTkQgKGJvZHkpKSwgMSkpID09IElGX1RI RU5fRUxTRQorCSAgICYmIChHRVRfQ09ERSAoWEVYUCAoWEVYUCAoUEFUVEVSTiAoQkJfRU5EIChi b2R5KSksIDEpLCAwKSkgPT0gTkUKKwkgICAgICAgfHxHRVRfQ09ERSAoWEVYUCAoWEVYUCAoUEFU VEVSTiAoQkJfRU5EIChib2R5KSksIDEpLCAwKSkgPT0gR1QpKSkKKyAgICByZXR1cm4gTlVMTDsK KyAgZWxzZSBpZiAoUkVHX1AgKGNvbmRjb25zdCkpCisgICAgeworICAgICAgYmFzaWNfYmxvY2sg cHJlX2xvb3BfYmIgPSBib2R5OworICAgICAgd2hpbGUgKHByZV9sb29wX2JiLT5wcmV2X2JiICYm IEJCX0VORCAocHJlX2xvb3BfYmItPnByZXZfYmIpCisJICAgICAmJiAhSlVNUF9QIChCQl9FTkQg KHByZV9sb29wX2JiLT5wcmV2X2JiKSkpCisJcHJlX2xvb3BfYmIgPSBwcmVfbG9vcF9iYi0+cHJl dl9iYjsKKyAgICAgIGlmIChwcmVfbG9vcF9iYiAmJiBCQl9FTkQgKHByZV9sb29wX2JiKSkKKwlw cmVfbG9vcF9iYiA9IHByZV9sb29wX2JiLT5wcmV2X2JiOworICAgICAgZWxzZQorCXJldHVybiBO VUxMOworICAgICAgcnR4IGluaXRpYWxfY29tcGFyZSA9IE5VTExfUlRYOworICAgICAgaWYgKCEo cHJldl9ub25ub3RlX25vbmRlYnVnX2luc25fYmIgKEJCX0VORCAocHJlX2xvb3BfYmIpKQorCSAg ICAmJiBJTlNOX1AgKHByZXZfbm9ubm90ZV9ub25kZWJ1Z19pbnNuX2JiIChCQl9FTkQgKHByZV9s b29wX2JiKSkpKSkKKwlyZXR1cm4gTlVMTDsKKyAgICAgIGVsc2UKKwlpbml0aWFsX2NvbXBhcmUK KwkgICAgPSBQQVRURVJOIChwcmV2X25vbm5vdGVfbm9uZGVidWdfaW5zbl9iYiAoQkJfRU5EIChw cmVfbG9vcF9iYikpKTsKKyAgICAgIGlmICghKGluaXRpYWxfY29tcGFyZSAmJiBHRVRfQ09ERSAo aW5pdGlhbF9jb21wYXJlKSA9PSBTRVQKKwkgICAgJiYgY2NfcmVnaXN0ZXIgKFhFWFAgKGluaXRp YWxfY29tcGFyZSwgMCksIFZPSURtb2RlKQorCSAgICAmJiBHRVRfQ09ERSAoWEVYUCAoaW5pdGlh bF9jb21wYXJlLCAxKSkgPT0gQ09NUEFSRQorCSAgICAmJiBDT05TVF9JTlRfUCAoWEVYUCAoWEVY UCAoaW5pdGlhbF9jb21wYXJlLCAxKSwgMSkpCisJICAgICYmIElOVFZBTCAoWEVYUCAoWEVYUCAo aW5pdGlhbF9jb21wYXJlLCAxKSwgMSkpID09IDApKQorCXJldHVybiBOVUxMOworCisgICAgICAv KiBVc3VhbGx5IHRoaXMgaXMgYSBMRSBjb25kaXRpb24sIGJ1dCBpdCBjYW4gYWxzbyBqdXN0IGJl IGEgR1Qgb3IgYW4gRVEKKwkgY29uZGl0aW9uIChpZiB0aGUgdmFsdWUgaXMgdW5zaWduZWQgb3Ig dGhlIGNvbXBpbGVyIGtub3dzIGl0cyBub3QgbmVnYXRpdmUpICAqLworICAgICAgcnR4X2luc24g Kmxvb3BfanVtcG92ZXIgPSBCQl9FTkQgKHByZV9sb29wX2JiKTsKKyAgICAgIGlmICghKEpVTVBf UCAobG9vcF9qdW1wb3ZlcikKKwkgICAgJiYgR0VUX0NPREUgKFhFWFAgKFBBVFRFUk4gKGxvb3Bf anVtcG92ZXIpLCAxKSkgPT0gSUZfVEhFTl9FTFNFCisJICAgICYmIChHRVRfQ09ERSAoWEVYUCAo WEVYUCAoUEFUVEVSTiAobG9vcF9qdW1wb3ZlciksIDEpLCAwKSkgPT0gTEUKKwkJfHwgR0VUX0NP REUgKFhFWFAgKFhFWFAgKFBBVFRFUk4gKGxvb3BfanVtcG92ZXIpLCAxKSwgMCkpID09IEdUCisJ CXx8IEdFVF9DT0RFIChYRVhQIChYRVhQIChQQVRURVJOIChsb29wX2p1bXBvdmVyKSwgMSksIDAp KSA9PSBFUSkpKQorCXJldHVybiBOVUxMOworICAgIH0KKworICAvKiBFdmVyeXRoaW5nIGxvb2tz IHZhbGlkLiAgKi8KKyAgcmV0dXJuIHZjdHBfaW5zbjsKK30KKworLyogRnVuY3Rpb24gdG8gY2hl Y2sgYSBsb29wJ3Mgc3RydWN0dXJlIHRvIHNlZSBpZiBpdCBpcyBhIHZhbGlkIGNhbmRpZGF0ZSBm b3IKKyAgIGFuIE1WRSBUYWlsIFByZWRpY2F0ZWQgTG93LU92ZXJoZWFkIExvb3AuICBSZXR1cm5z IHRoZSBsb29wJ3MgVkNUUF9JTlNOIGlmCisgICBpdCBpcyB2YWxpZCwgb3IgTlVMTCBpZiBpdCBp c24ndC4gICovCisKK3N0YXRpYyBydHhfaW5zbioKK2FybV9tdmVfbG9vcF92YWxpZF9mb3JfZGxz dHAgKGJhc2ljX2Jsb2NrIGJvZHkpCit7CisgIC8qIERvbG9vcCBjYW4gb25seSBiZSBkb25lICJl bGVtZW50d2lzZSIgd2l0aCBwcmVkaWNhdGVkIGRsc3RwL2xldHAgaWYgaXQKKyAgICAgY29udGFp bnMgYSBWQ1RQIG9uIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcHJvY2Vzc2VkIGJ5IHRoZSBsb29w LgorICAgICBGaW5kIHRoZSBWQ1RQIHByZWRpY2F0ZSBnZW5lcmF0aW9uIGluc2lkZSB0aGUgbG9v cCBib2R5IEJCLiAgKi8KKyAgcnR4X2luc24gKnZjdHBfaW5zbiA9IGFybV9tdmVfZ2V0X2xvb3Bf dmN0cCAoYm9keSk7CisgIGlmICghdmN0cF9pbnNuKQorICAgIHJldHVybiBOVUxMOworCisgIC8q IFRoZXJlIGFyZSBvbmx5IHR3byB0eXBlcyBvZiBsb29wcyB0aGF0IGNhbiBiZSB0dXJuZWQgaW50 byBkbHN0cC9sZXRwCisgICAgIGxvb3BzOgorICAgICAgQSkgTG9vcHMgb2YgdGhlIGZvcm06CisJ ICB3aGlsZSAobnVtX29mX2VsZW0gPiAwKQorCSAgICB7CisJICAgICAgcCA9IHZjdHA8c2l6ZT4g KG51bV9vZl9lbGVtKQorCSAgICAgIG4gLT0gbnVtX29mX2xhbmVzOworCSAgICB9CisgICAgICBC KSBMb29wcyBvZiB0aGUgZm9ybToKKwkgIGludCBudW1fb2ZfaXRlcnMgPSAobnVtX29mX2VsZW0g KyBudW1fb2ZfbGFuZXMgLSAxKSAvIG51bV9vZl9sYW5lcworCSAgZm9yIChpID0gMDsgaSA8IG51 bV9vZl9pdGVyczsgaSsrKQorCSAgICB7CisJICAgICAgcCA9IHZjdHA8c2l6ZT4gKG51bV9vZl9l bGVtKQorCSAgICAgIG4gLT0gbnVtX29mX2xhbmVzOworCSAgICB9CisKKyAgICBUaGVuLCBkZXBl bmRpbmcgb24gdGhlIHR5cGUgb2YgbG9vcCBhYm92ZSB3ZSBuZWVkIHdpbGwgbmVlZCB0byBkbwor ICAgIGRpZmZlcmVudCBzZXRzIG9mIGNoZWNrcy4gICovCisgIGl2X2FuYWx5c2lzX2xvb3BfaW5p dCAoYm9keS0+bG9vcF9mYXRoZXIpOworCisgIC8qIEluIG9yZGVyIHRvIGZpbmQgb3V0IGlmIHRo ZSBsb29wIGlzIG9mIHR5cGUgQSBvciBCIGFib3ZlIGxvb2sgZm9yIHRoZQorICAgICBsb29wIGNv dW50ZXI6IGl0IHdpbGwgZWl0aGVyIGJlIGluY3JlbWVudGluZyBieSBvbmUgcGVyIGl0ZXJhdGlv biBvcgorICAgICBpdCB3aWxsIGJlIGRlY3JlbWVudGluZyBieSBudW1fb2ZfbGFuZXMuICBXZSBj YW4gZmluZCB0aGUgbG9vcCBjb3VudGVyCisgICAgIGluIHRoZSBjb25kaXRpb24gYXQgdGhlIGVu ZCBvZiB0aGUgbG9vcC4gICovCisgIHJ0eF9pbnNuICpsb29wX2NvbmQgPSBwcmV2X25vbm5vdGVf bm9uZGVidWdfaW5zbl9iYiAoQkJfRU5EIChib2R5KSk7CisgIGlmICghKGNjX3JlZ2lzdGVyIChY RVhQIChQQVRURVJOIChsb29wX2NvbmQpLCAwKSwgVk9JRG1vZGUpCisJJiYgR0VUX0NPREUgKFhF WFAgKFBBVFRFUk4gKGxvb3BfY29uZCksIDEpKSA9PSBDT01QQVJFKSkKKyAgICByZXR1cm4gTlVM TDsKKworICAvKiBUaGUgb3BlcmFuZHMgaW4gdGhlIGNvbmRpdGlvbjogIFRyeSB0byBpZGVudGlm eSB3aGljaCBvbmUgaXMgdGhlCisgICAgIGNvbnN0YW50IGFuZCB3aGljaCBpcyB0aGUgY291bnRl ciBhbmQgcnVuIElWIGFuYWx5c2lzIG9uIHRoZSBsYXR0ZXIuICAqLworICBydHggY29uZF9hcmdf MSA9IFhFWFAgKFhFWFAgKFBBVFRFUk4gKGxvb3BfY29uZCksIDEpLCAwKTsKKyAgcnR4IGNvbmRf YXJnXzIgPSBYRVhQIChYRVhQIChQQVRURVJOIChsb29wX2NvbmQpLCAxKSwgMSk7CisKKyAgcnR4 IGxvb3BfY29uZF9jb25zdGFudDsKKyAgcnR4IGxvb3BfY291bnRlcjsKKyAgY2xhc3MgcnR4X2l2 IGNvbmRfY291bnRlcl9pdiwgY29uZF90ZW1wX2l2OworCisgIGlmIChDT05TVF9JTlRfUCAoY29u ZF9hcmdfMSkpCisgICAgeworICAgICAgLyogY29uZF9hcmdfMSBpcyB0aGUgY29uc3RhbnQgYW5k IGNvbmRfYXJnXzIgaXMgdGhlIGNvdW50ZXIuICAqLworICAgICAgbG9vcF9jb25kX2NvbnN0YW50 ID0gY29uZF9hcmdfMTsKKyAgICAgIGxvb3BfY291bnRlciA9IGNvbmRfYXJnXzI7CisgICAgICBp dl9hbmFseXplIChsb29wX2NvbmQsIGFzX2E8c2NhbGFyX2ludF9tb2RlPiAoR0VUX01PREUgKGNv bmRfYXJnXzIpKSwKKwkJICBjb25kX2FyZ18yLCAmY29uZF9jb3VudGVyX2l2KTsKKyAgICB9Cisg IGVsc2UgaWYgKENPTlNUX0lOVF9QIChjb25kX2FyZ18yKSkKKyAgICB7CisgICAgICAvKiBjb25k X2FyZ18yIGlzIHRoZSBjb25zdGFudCBhbmQgY29uZF9hcmdfMSBpcyB0aGUgY291bnRlci4gICov CisgICAgICBsb29wX2NvbmRfY29uc3RhbnQgPSBjb25kX2FyZ18yOworICAgICAgbG9vcF9jb3Vu dGVyID0gY29uZF9hcmdfMTsKKyAgICAgIGl2X2FuYWx5emUgKGxvb3BfY29uZCwgYXNfYTxzY2Fs YXJfaW50X21vZGU+IChHRVRfTU9ERSAoY29uZF9hcmdfMSkpLAorCQkgIGNvbmRfYXJnXzEsICZj b25kX2NvdW50ZXJfaXYpOworICAgIH0KKyAgZWxzZSBpZiAoUkVHX1AgKGNvbmRfYXJnXzEpICYm IFJFR19QIChjb25kX2FyZ18yKSkKKyAgICB7CisgICAgICAvKiBJZiBib3RoIG9wZXJhbmRzIHRv IHRoZSBjb21wYXJlIGFyZSBSRUdzLCB3ZSBjYW4gc2FmZWx5CisJIHJ1biBJViBhbmFseXNpcyBv biBib3RoIGFuZCB0aGVuIGRldGVybWluZSB3aGljaCBpcyB0aGUKKwkgY29uc3RhbnQgYnkgbG9v a2luZyBhdCB0aGUgc3RlcC4KKwkgRmlyc3QgYXNzdW1lIGNvbmRfYXJnXzEgaXMgdGhlIGNvdW50 ZXIuICAqLworICAgICAgbG9vcF9jb3VudGVyID0gY29uZF9hcmdfMTsKKyAgICAgIGxvb3BfY29u ZF9jb25zdGFudCA9IGNvbmRfYXJnXzI7CisgICAgICBpdl9hbmFseXplIChsb29wX2NvbmQsIGFz X2E8c2NhbGFyX2ludF9tb2RlPiAoR0VUX01PREUgKGNvbmRfYXJnXzEpKSwKKwkJICBjb25kX2Fy Z18xLCAmY29uZF9jb3VudGVyX2l2KTsKKyAgICAgIGl2X2FuYWx5emUgKGxvb3BfY29uZCwgYXNf YTxzY2FsYXJfaW50X21vZGU+IChHRVRfTU9ERSAoY29uZF9hcmdfMikpLAorCQkgIGNvbmRfYXJn XzIsICZjb25kX3RlbXBfaXYpOworCisgICAgICAvKiBMb29rIGF0IHRoZSBzdGVwcyBhbmQgc3dh cCBhcm91bmQgdGhlIHJ0eCdzIGlmIG5lZWRlZC4gIEVycm9yIG91dCBpZgorCSBvbmUgb2YgdGhl bSBjYW5ub3QgYmUgaWRlbnRpZmllZCBhcyBjb25zdGFudC4gICovCisgICAgICBpZiAoIUNPTlNU X0lOVF9QIChjb25kX2NvdW50ZXJfaXYuc3RlcCkgfHwgIUNPTlNUX0lOVF9QIChjb25kX3RlbXBf aXYuc3RlcCkpCisJcmV0dXJuIE5VTEw7CisgICAgICBpZiAoSU5UVkFMIChjb25kX2NvdW50ZXJf aXYuc3RlcCkgIT0gMCAmJiBJTlRWQUwgKGNvbmRfdGVtcF9pdi5zdGVwKSAhPSAwKQorCXJldHVy biBOVUxMOworICAgICAgaWYgKElOVFZBTCAoY29uZF9jb3VudGVyX2l2LnN0ZXApID09IDAgJiYg SU5UVkFMIChjb25kX3RlbXBfaXYuc3RlcCkgIT0gMCkKKwl7CisJICBsb29wX2NvdW50ZXIgPSBj b25kX2FyZ18yOworCSAgbG9vcF9jb25kX2NvbnN0YW50ID0gY29uZF9hcmdfMTsKKwkgIGNvbmRf Y291bnRlcl9pdiA9IGNvbmRfdGVtcF9pdjsKKwl9CisgICAgfQorICBlbHNlCisgICAgcmV0dXJu IE5VTEw7CisKKyAgaWYgKCFSRUdfUCAobG9vcF9jb3VudGVyKSkKKyAgICByZXR1cm4gTlVMTDsK KyAgaWYgKCEoUkVHX1AgKGxvb3BfY29uZF9jb25zdGFudCkgfHwgQ09OU1RfSU5UX1AgKGxvb3Bf Y29uZF9jb25zdGFudCkpKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIE5vdyB3ZSBoYXZlIGV4 dHJhY3RlZCB0aGUgSVYgc3RlcCBvZiB0aGUgbG9vcCBjb3VudGVyLCBjYWxsIHRoZQorICAgICBh cHByb3ByaWF0ZSBjaGVja2luZyBmdW5jdGlvbi4gICovCisgIGlmIChJTlRWQUwgKGNvbmRfY291 bnRlcl9pdi5zdGVwKSA+IDApCisgICAgcmV0dXJuIGFybV9tdmVfZGxzdHBfY2hlY2tfaW5jX2Nv dW50ZXIgKGJvZHksIHZjdHBfaW5zbiwKKwkJCQkJICAgIGxvb3BfY29uZF9jb25zdGFudCwgbG9v cF9jb3VudGVyKTsKKyAgZWxzZSBpZiAoSU5UVkFMIChjb25kX2NvdW50ZXJfaXYuc3RlcCkgPCAw KQorICAgIHJldHVybiBhcm1fbXZlX2Rsc3RwX2NoZWNrX2RlY19jb3VudGVyIChib2R5LCB2Y3Rw X2luc24sCisJCQkJCSAgICBsb29wX2NvbmRfY29uc3RhbnQsIGxvb3BfY291bnRlcik7CisgIGVs c2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogUHJlZGljdCB3aGV0aGVyIHRoZSBnaXZlbiBs b29wIGluIGdpbXBsZSB3aWxsIGJlIHRyYW5zZm9ybWVkIGluIHRoZSBSVEwKKyAgIGRvbG9vcF9v cHRpbWl6ZSBwYXNzLiAgKi8KKworc3RhdGljIGJvb2wKK2FybV9wcmVkaWN0X2RvbG9vcF9wIChz dHJ1Y3QgbG9vcCAqbG9vcCkKK3sKKyAgZ2NjX2Fzc2VydCAobG9vcCk7CisgIC8qIE9uIGFybSwg dGFyZ2V0bS5jYW5fdXNlX2RvbG9vcF9wIGlzIGFjdHVhbGx5CisgICAgIGNhbl91c2VfZG9sb29w X2lmX2lubmVybW9zdC4gIEVuc3VyZSB0aGUgbG9vcCBpcyBpbm5lcm1vc3QsCisgICAgIGl0IGlz IHZhbGlkIGFuZCBhcyBwZXIgYXJtX3RhcmdldF9iYl9va19mb3JfbG9iIGFuZCB0aGUKKyAgICAg Y29ycmVjdCBhcmNoaXRlY3R1cmUgZmxhZ3MgYXJlIGVuYWJsZWQuICAqLworICBpZiAoIShUQVJH RVRfMzJCSVQgJiYgVEFSR0VUX0hBVkVfTE9CICYmIG9wdGltaXplID4gMCkpCisgICAgeworICAg ICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKKwlmcHJpbnRm IChkdW1wX2ZpbGUsICJQcmVkaWN0IGRvbG9vcCBmYWlsdXJlIGR1ZSB0byIKKwkJCSAgICAiIHRh cmdldCBhcmNoaXRlY3R1cmUgb3Igb3B0aW1pc2F0aW9uIGZsYWdzLlxuIik7CisgICAgICByZXR1 cm4gZmFsc2U7CisgICAgfQorICBlbHNlIGlmIChsb29wLT5pbm5lciAhPSBOVUxMKQorICAgIHsK KyAgICAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCisJZnBy aW50ZiAoZHVtcF9maWxlLCAiUHJlZGljdCBkb2xvb3AgZmFpbHVyZSBkdWUgdG8iCisJCQkgICAg IiBsb29wIG5lc3RpbmcuXG4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIGVsc2Ug aWYgKCFhcm1fdGFyZ2V0X2JiX29rX2Zvcl9sb2IgKGxvb3AtPmhlYWRlci0+bmV4dF9iYikpCisg ICAgeworICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkK KwlmcHJpbnRmIChkdW1wX2ZpbGUsICJQcmVkaWN0IGRvbG9vcCBmYWlsdXJlIGR1ZSB0byIKKwkJ CSAgICAiIGxvb3AgYmIgY29tcGxleGl0eS5cbiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAg IH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyogSW1wbGVtZW50IHRhcmdldG0ubG9vcF91bnJv bGxfYWRqdXN0LiAgVXNlIHRoaXMgdG8gYmxvY2sgdW5yb2xsaW5nIG9mIGxvb3BzCisgICB0aGF0 IG1heSBsYXRlciBiZSB0dXJuZWQgaW50byBNVkUgVGFpbCBQcmVkaWNhdGVkIExvdyBPdmVyaGVh ZCBMb29wcy4gIFRoZQorICAgcGVyZm9ybWFuY2UgYmVuZWZpdCBvZiBhbiBNVkUgTG9MIGlzIGxp a2VseSB0byBiZSBtdWNoIGhpZ2hlciB0aGFuIHRoYXQgb2YKKyAgIHRoZSB1bnJvbGxpbmcuICAq LworCit1bnNpZ25lZAorYXJtX2xvb3BfdW5yb2xsX2FkanVzdCAodW5zaWduZWQgbnVucm9sbCwg c3RydWN0IGxvb3AgKmxvb3ApCit7CisgIGlmIChUQVJHRVRfSEFWRV9NVkUKKyAgICAgICYmIGFy bV90YXJnZXRfYmJfb2tfZm9yX2xvYiAobG9vcC0+bGF0Y2gpCisgICAgICAmJiBhcm1fbXZlX2xv b3BfdmFsaWRfZm9yX2Rsc3RwIChsb29wLT5oZWFkZXIpKQorICAgIHJldHVybiAwOworICBlbHNl CisgICAgcmV0dXJuIG51bnJvbGw7Cit9CisKKy8qIEZ1bmN0aW9uIHRvIGhhZGxlIGVtaXR0aW5n IGEgVlBULXVucHJlZGljYXRlZCB2ZXJzaW9uIG9mIGEgVlBULXByZWRpY2F0ZWQKKyAgIGluc24g dG8gYSBzZXF1ZW5jZS4gICovCisKK3N0YXRpYyBib29sCithcm1fZW1pdF9tdmVfdW5wcmVkaWNh dGVkX2luc25fdG9fc2VxIChydHhfaW5zbiogaW5zbikKK3sKKyAgcnR4IGluc25fdnByX3JlZ19v cGVyYW5kID0gYXJtX2dldF9yZXF1aXJlZF92cHJfcmVnX3BhcmFtIChpbnNuKTsKKyAgaW50IG5l d19pY29kZSA9IGdldF9hdHRyX212ZV91bnByZWRpY2F0ZWRfaW5zbiAoaW5zbik7CisgIGlmICgh aW5fc2VxdWVuY2VfcCAoKQorICAgICAgfHwgIU1WRV9WUFRfUFJFRElDQVRFRF9JTlNOX1AgKGlu c24pCisgICAgICB8fCAoIWluc25fdnByX3JlZ19vcGVyYW5kKQorICAgICAgfHwgKCFuZXdfaWNv ZGUpKQorICAgIHJldHVybiBmYWxzZTsKKworICBleHRyYWN0X2luc24gKGluc24pOworICBydHgg YXJyWzhdOworICBpbnQgaiA9IDA7CisKKyAgLyogV2hlbiB0cmFuc2Zvcm1pbmcgYSBWUFQtcHJl ZGljYXRlZCBpbnN0cnVjdGlvbgorICAgICBpbnRvIGl0cyB1bnByZWRpY2F0ZWQgZXF1aXZhbGVu dCB3ZSBuZWVkIHRvIGRyb3AKKyAgICAgdGhlIFZQUiBvcGVyYW5kIGFuZCB3ZSBtYXkgbmVlZCB0 byBhbHNvIGRyb3AgYQorICAgICBtZXJnZSAidnVuaW5pdCIgaW5wdXQgb3BlcmFuZCwgZGVwZW5k aW5nIG9uIHRoZQorICAgICBpbnN0cnVjdGlvbiBwYXR0ZXJuLiAgSGVyZSBlbnN1cmUgdGhhdCB3 ZSBoYXZlIGF0CisgICAgIG1vc3QgYSB0d28tb3BlcmFuZCBkaWZmZXJlbmNlIGJldHdlZW4gdGhl IHR3bworICAgICBpbnN0cnVuY3Rpb25zLiAgKi8KKyAgaW50IG5fb3BlcmFuZHNfZGlmZgorICAg ICAgPSByZWNvZ19kYXRhLm5fb3BlcmFuZHMgLSBpbnNuX2RhdGFbbmV3X2ljb2RlXS5uX29wZXJh bmRzOworICBpZiAoIShuX29wZXJhbmRzX2RpZmYgPiAwICYmIG5fb3BlcmFuZHNfZGlmZiA8PSAy KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogVGhlbiwgbG9vcCB0aHJvdWdoIHRoZSBvcGVy YW5kcyBvZiB0aGUgcHJlZGljYXRlZAorICAgICBpbnN0cnVjdGlvbiwgYW5kIHJldGFpbiB0aGUg b25lcyB0aGF0IG1hcCB0byB0aGUKKyAgICAgdW5wcmVkaWNhdGVkIGluc3RydWN0aW9uLiAgKi8K KyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWNvZ19kYXRhLm5fb3BlcmFuZHM7IGkrKykKKyAgICB7 CisgICAgICAvKiBJZ25vcmUgdGhlIFZQUiBhbmQsIGlmIG5lZWRlZCwgdGhlIHZ1bmluaXQKKwkg b3BlcmFuZC4gICovCisgICAgICBpZiAoaW5zbl92cHJfcmVnX29wZXJhbmQgPT0gcmVjb2dfZGF0 YS5vcGVyYW5kW2ldCisJICB8fCAobl9vcGVyYW5kc19kaWZmID09IDIKKwkgICAgICAmJiAhc3Ry Y21wIChyZWNvZ19kYXRhLmNvbnN0cmFpbnRzW2ldLCAiMCIpKSkKKwljb250aW51ZTsKKyAgICAg IGVsc2UKKwl7CisJICBhcnJbal0gPSByZWNvZ19kYXRhLm9wZXJhbmRbaV07CisJICBqKys7CisJ fQorICAgIH0KKworICAvKiBGaW5hbGx5LCBlbWl0IHRoZSB1cHJlZGljYXRlZCBpbnN0cnVjdGlv bi4gICovCisgIHN3aXRjaCAoaikKKyAgICB7CisgICAgICBjYXNlIDE6CisJZW1pdF9pbnNuIChH RU5fRkNOIChuZXdfaWNvZGUpIChhcnJbMF0pKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMjoKKwll bWl0X2luc24gKEdFTl9GQ04gKG5ld19pY29kZSkgKGFyclswXSwgYXJyWzFdKSk7CisJYnJlYWs7 CisgICAgICBjYXNlIDM6CisJZW1pdF9pbnNuIChHRU5fRkNOIChuZXdfaWNvZGUpIChhcnJbMF0s IGFyclsxXSwgYXJyWzJdKSk7CisJYnJlYWs7CisgICAgICBjYXNlIDQ6CisJZW1pdF9pbnNuIChH RU5fRkNOIChuZXdfaWNvZGUpIChhcnJbMF0sIGFyclsxXSwgYXJyWzJdLAorCQkJCQlhcnJbM10p KTsKKwlicmVhazsKKyAgICAgIGNhc2UgNToKKwllbWl0X2luc24gKEdFTl9GQ04gKG5ld19pY29k ZSkgKGFyclswXSwgYXJyWzFdLCBhcnJbMl0sIGFyclszXSwKKwkJCQkJYXJyWzRdKSk7CisJYnJl YWs7CisgICAgICBjYXNlIDY6CisJZW1pdF9pbnNuIChHRU5fRkNOIChuZXdfaWNvZGUpIChhcnJb MF0sIGFyclsxXSwgYXJyWzJdLCBhcnJbM10sCisJCQkJCWFycls0XSwgYXJyWzVdKSk7CisJYnJl YWs7CisgICAgICBjYXNlIDc6CisJZW1pdF9pbnNuIChHRU5fRkNOIChuZXdfaWNvZGUpIChhcnJb MF0sIGFyclsxXSwgYXJyWzJdLCBhcnJbM10sCisJCQkJCWFycls0XSwgYXJyWzVdLCBhcnJbNl0p KTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJZ2NjX3VucmVhY2hhYmxlICgpOworICAgIH0K KyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFdoZW4gYSB2Y3RwIGluc24gaXMgdXNlZCwgaXRzIG91 dCBpcyBvZnRlbiBmb2xsb3dlZCBieQorICAgYSB6ZXJvLWV4dGVuZCBpbnNuIHRvIFNJbW9kZSwg d2hpY2ggaXMgdGhlbiBTVUJSRUcnZCBpbnRvIGEKKyAgIHZlY3RvciBmb3JtIG9mIG1vZGUgVkFM SURfTVZFX1BSRURfTU9ERTogdGhpcyB2ZWN0b3IgZm9ybSBpcworICAgd2hhdCBpcyB0aGVuIHVz ZWQgYXMgYW4gaW5wdXQgdG8gdGhlIGluc3RydWN0aW9ucyB3aXRoaW4gdGhlCisgICBsb29wLiAg SGVuY2UsIHN0b3JlIHRoYXQgdmVjdG9yIGZvcm0gb2YgdGhlIFZQUiByZWcgaW50bworICAgdmN0 cF92cHJfZ2VuZXJhdGVkLCBzbyB0aGF0IHdlIGNhbiBtYXRjaCBpdCB3aXRoIGluc3RydWN0aW9u cworICAgaW4gdGhlIGxvb3AgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIHByZWRpY2F0ZWQgb24g dGhpcyBzYW1lCisgICBWUFIuICBJZiB0aGVyZSBpcyBubyB6ZXJvLWV4dGVuZCBhbmQgc3VicmVn IG9yIGl0IGlzIG90aGVyd2lzZQorICAgaW52YWxpZCwgdGhlbiByZXR1cm4gTlVMTCB0byBjYW5j ZWwgdGhlIGRsc3RwIHRyYW5zZm9ybS4gICovCisKK3N0YXRpYyBydHgKK2FybV9tdmVfZ2V0X3Zj dHBfdmVjX2Zvcm0gKHJ0eF9pbnNuICppbnNuKQoreworICBydHggdmN0cF92cHJfZ2VuZXJhdGVk ID0gTlVMTF9SVFg7CisgIHJ0eF9pbnNuICpuZXh0X3VzZTEgPSBOVUxMOworICBkZl9yZWYgdXNl OworICBmb3IgKHVzZQorCT0gREZfUkVHX1VTRV9DSEFJTgorCSAgIChERl9SRUZfUkVHTk8gKERG X0lOU05fSU5GT19ERUZTIChERl9JTlNOX0lORk9fR0VUIChpbnNuKSkpKTsKKyAgICAgICB1c2U7 IHVzZSA9IERGX1JFRl9ORVhUX1JFRyAodXNlKSkKKyAgICBpZiAoIW5leHRfdXNlMSAmJiBOT05E RUJVR19JTlNOX1AgKERGX1JFRl9JTlNOICh1c2UpKSkKKyAgICAgIG5leHRfdXNlMSA9IERGX1JF Rl9JTlNOICh1c2UpOworCisgIGlmIChzaW5nbGVfc2V0IChuZXh0X3VzZTEpCisgICAgICAmJiBH RVRfQ09ERSAoU0VUX1NSQyAoc2luZ2xlX3NldCAobmV4dF91c2UxKSkpID09IFpFUk9fRVhURU5E KQorICAgIHsKKyAgICAgIHJ0eF9pbnNuICpuZXh0X3VzZTIgPSBOVUxMOworICAgICAgZm9yICh1 c2UKKwkgICAgPSBERl9SRUdfVVNFX0NIQUlOCisJICAgICAgIChERl9SRUZfUkVHTk8KKwkJIChE Rl9JTlNOX0lORk9fREVGUyAoREZfSU5TTl9JTkZPX0dFVCAobmV4dF91c2UxKSkpKTsKKwkgICB1 c2U7IHVzZSA9IERGX1JFRl9ORVhUX1JFRyAodXNlKSkKKwlpZiAoIW5leHRfdXNlMiAmJiBOT05E RUJVR19JTlNOX1AgKERGX1JFRl9JTlNOICh1c2UpKSkKKwkgIG5leHRfdXNlMiA9IERGX1JFRl9J TlNOICh1c2UpOworCisgICAgICBpZiAoc2luZ2xlX3NldCAobmV4dF91c2UyKQorCSAgJiYgR0VU X0NPREUgKFNFVF9TUkMgKHNpbmdsZV9zZXQgKG5leHRfdXNlMikpKSA9PSBTVUJSRUcpCisJdmN0 cF92cHJfZ2VuZXJhdGVkID0gWEVYUCAoUEFUVEVSTiAobmV4dF91c2UyKSwgMCk7CisgICAgfQor CisgIGlmICghdmN0cF92cHJfZ2VuZXJhdGVkIHx8ICFSRUdfUCAodmN0cF92cHJfZ2VuZXJhdGVk KQorICAgICAgfHwgIVZBTElEX01WRV9QUkVEX01PREUgKEdFVF9NT0RFICh2Y3RwX3Zwcl9nZW5l cmF0ZWQpKSkKKyAgICByZXR1cm4gTlVMTF9SVFg7CisKKyAgcmV0dXJuIHZjdHBfdnByX2dlbmVy YXRlZDsKK30KKworLyogQXR0ZW1wdCB0byB0cmFuc2Zvcm0gdGhlIGxvb3AgY29udGVudHMgb2Yg bG9vcCBiYXNpYyBibG9jayBmcm9tIFZQVAorICAgcHJlZGljYXRlZCBpbnNucyBpbnRvIHVucHJl ZGljYXRlZCBpbnNucyBmb3IgYSBkbHN0cC9sZXRwIGxvb3AuICAqLworCitydHgKK2FybV9hdHRl bXB0X2Rsc3RwX3RyYW5zZm9ybSAocnR4IGxhYmVsKQoreworICBiYXNpY19ibG9jayBib2R5ID0g QkxPQ0tfRk9SX0lOU04gKGxhYmVsKS0+cHJldl9iYjsKKworICAvKiBFbnN1cmUgdGhhdCB0aGUg YmIgaXMgd2l0aGluIGEgbG9vcCB0aGF0IGhhcyBhbGwgcmVxdWlyZWQgbWV0YWRhdGEuICAqLwor ICBpZiAoIWJvZHktPmxvb3BfZmF0aGVyIHx8ICFib2R5LT5sb29wX2ZhdGhlci0+aGVhZGVyCisg ICAgICB8fCAhYm9keS0+bG9vcF9mYXRoZXItPnNpbXBsZV9sb29wX2Rlc2MpCisgICAgcmV0dXJu IEdFTl9JTlQgKDEpOworCisgIHJ0eF9pbnNuICp2Y3RwX2luc24gPSBhcm1fbXZlX2xvb3BfdmFs aWRfZm9yX2Rsc3RwIChib2R5KTsKKyAgaWYgKCF2Y3RwX2luc24pCisgICAgcmV0dXJuIEdFTl9J TlQgKDEpOworICBydHggdmN0cF9yZWcgPSBYVkVDRVhQIChYRVhQIChQQVRURVJOICh2Y3RwX2lu c24pLCAxKSwgMCwgMCk7CisKKyAgcnR4IHZjdHBfdnByX2dlbmVyYXRlZCA9IGFybV9tdmVfZ2V0 X3ZjdHBfdmVjX2Zvcm0gKHZjdHBfaW5zbik7CisgIGlmICghdmN0cF92cHJfZ2VuZXJhdGVkKQor ICAgIHJldHVybiBHRU5fSU5UICgxKTsKKworICAvKiBkZWNyZW1lbnR1bnVtIGlzIGFscmVhZHkg a25vd24gdG8gYmUgdmFsaWQgYXQgdGhpcyBwb2ludC4gICovCisgIGludCBkZWNyZW1lbnRudW0g PSBhcm1fbXZlX2dldF92Y3RwX2xhbmVzIChQQVRURVJOICh2Y3RwX2luc24pKTsKKworICBydHhf aW5zbiAqaW5zbiA9IDA7CisgIHJ0eF9pbnNuICpjdXJfaW5zbiA9IDA7CisgIHJ0eF9pbnNuICpz ZXE7CisgIGhhc2hfbWFwIDxydHhfaW5zbiAqLCBib29sPiAqc2FmZV9pbnNuX21hcAorICAgICAg PSBuZXcgaGFzaF9tYXAgPHJ0eF9pbnNuICosIGJvb2w+OworCisgIC8qIFNjYW4gdGhyb3VnaCB0 aGUgaW5zbnMgaW4gdGhlIGxvb3AgYmIgYW5kIGVtaXQgdGhlIHRyYW5zZm9ybWVkIGJiCisgICAg IGluc25zIHRvIGEgc2VxdWVuY2UuICAqLworICBzdGFydF9zZXF1ZW5jZSAoKTsKKyAgRk9SX0JC X0lOU05TIChib2R5LCBpbnNuKQorICAgIHsKKyAgICAgIGlmIChHRVRfQ09ERSAoaW5zbikgPT0g Q09ERV9MQUJFTCB8fCBOT1RFX0lOU05fQkFTSUNfQkxPQ0tfUCAoaW5zbikpCisJY29udGludWU7 CisgICAgICBlbHNlIGlmIChOT1RFX1AgKGluc24pKQorCWVtaXRfbm90ZSAoKGVudW0gaW5zbl9u b3RlKU5PVEVfS0lORCAoaW5zbikpOworICAgICAgZWxzZSBpZiAoREVCVUdfSU5TTl9QIChpbnNu KSkKKwllbWl0X2RlYnVnX2luc24gKFBBVFRFUk4gKGluc24pKTsKKyAgICAgIGVsc2UgaWYgKCFJ TlNOX1AgKGluc24pKQorCXsKKwkgIGVuZF9zZXF1ZW5jZSAoKTsKKwkgIHJldHVybiBHRU5fSU5U ICgxKTsKKwl9CisgICAgICAvKiBXaGVuIHdlIGZpbmQgdGhlIHZjdHAgaW5zdHJ1Y3Rpb246IGNv bnRpbnVlLiAgKi8KKyAgICAgIGVsc2UgaWYgKGluc24gPT0gdmN0cF9pbnNuKQorCWNvbnRpbnVl OworICAgICAgIC8qIElmIHRoZSBpbnNuIHBhdHRlcm4gcmVxdWlyZXMgdGhlIHVzZSBvZiB0aGUg VlBSIHZhbHVlIGZyb20gdGhlCisJICB2Y3RwIGFzIGFuIGlucHV0IHBhcmFtZXRlciBmb3IgcHJl ZGljYXRpb24uICAqLworICAgICAgZWxzZSBpZiAoYXJtX212ZV92ZWNfaW5zbl9pc19wcmVkaWNh dGVkX3dpdGhfdGhpc19wcmVkaWNhdGUKKwkJKGluc24sIHZjdHBfdnByX2dlbmVyYXRlZCkpCisJ eworCSAgYm9vbCBzdWNjZXNzID0gYXJtX2VtaXRfbXZlX3VucHJlZGljYXRlZF9pbnNuX3RvX3Nl cSAoaW5zbik7CisJICBpZiAoIXN1Y2Nlc3MpCisJICAgIHsKKwkgICAgICBlbmRfc2VxdWVuY2Ug KCk7CisJICAgICAgcmV0dXJuIEdFTl9JTlQgKDEpOworCSAgICB9CisJfQorICAgICAgLyogSWYg dGhlIGluc24gaXNuJ3QgVlBUIHByZWRpY2F0ZWQgb24gdmN0cF92cHJfZ2VuZXJhdGVkLCB3ZSBu ZWVkIHRvCisJIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHN0aWxsIHZhbGlkIHdpdGhpbiB0aGUgZGxz dHAvbGV0cCBsb29wLiAgKi8KKyAgICAgIGVsc2UKKwl7CisJICAvKiBJZiB0aGlzIGluc3RydWN0 aW9uIFVTRS1zIHRoZSB2Y3RwX3Zwcl9nZW5lcmF0ZWQgb3RoZXIgdGhhbiBmb3IKKwkgICAgIHBy ZWRpY2F0aW9uLCB0aGlzIGJsb2NrcyB0aGUgdHJhbnNmb3JtYXRpb24gYXMgd2UgYXJlIG5vdCBh bGxvd2VkCisJICAgICB0byBvcHRpbWlzZSB0aGUgVlBSIHZhbHVlIGF3YXkuICAqLworCSAgZGZf cmVmIGluc25fdXNlcyA9IE5VTEw7CisJICBGT1JfRUFDSF9JTlNOX1VTRSAoaW5zbl91c2VzLCBp bnNuKQorCSAgeworCSAgICBpZiAocnR4X2VxdWFsX3AgKHZjdHBfdnByX2dlbmVyYXRlZCwgREZf UkVGX1JFRyAoaW5zbl91c2VzKSkpCisJICAgICAgeworCQllbmRfc2VxdWVuY2UgKCk7CisJCXJl dHVybiBHRU5fSU5UICgxKTsKKwkgICAgICB9CisJICB9CisJICAvKiBJZiB3aXRoaW4gdGhlIGxv b3Agd2UgaGF2ZSBhbiBNVkUgdmVjdG9yIGluc3RydWN0aW9uIHRoYXQgaXMKKwkgICAgIHVucHJl ZGljYXRlZCwgdGhlIGRsc3RwL2xldHAgbG9vcGluZyB3aWxsIGFkZCBpbXBsaWNpdAorCSAgICAg cHJlZGljYXRpb24gdG8gaXQuICBUaGlzIHdpbGwgcmVzdWx0IGluIGEgY2hhbmdlIGluIGJlaGF2 aW91cgorCSAgICAgb2YgdGhlIGluc3RydWN0aW9uLCBzbyB3ZSBuZWVkIHRvIGZpbmQgb3V0IGlm IGFueSBpbnN0cnVjdGlvbnMKKwkgICAgIHRoYXQgZmVlZCBpbnRvIHRoZSBjdXJyZW50IGluc3Ry dWN0aW9uIHdlcmUgaW1wbGljaXRseQorCSAgICAgcHJlZGljYXRlZC4gICovCisJICBpZiAoYXJt X212ZV9jaGVja19kZl9jaGFpbl9iYWNrX2Zvcl9pbXBsaWNfcHJlZGljCisJICAgICAgIChzYWZl X2luc25fbWFwLCBpbnNuLCB2Y3RwX3Zwcl9nZW5lcmF0ZWQpKQorCSAgICB7CisJICAgICAgaWYg KGFybV9tdmVfY2hlY2tfZGZfY2hhaW5fZndkX2Zvcl9pbXBsaWNfcHJlZGljX2ltcGFjdAorCQkg ICAgKGluc24sIHZjdHBfdnByX2dlbmVyYXRlZCkpCisJCXsKKwkJICBlbmRfc2VxdWVuY2UgKCk7 CisJCSAgcmV0dXJuIEdFTl9JTlQgKDEpOworCQl9CisJICAgIH0KKwkgIGVtaXRfaW5zbiAoUEFU VEVSTiAoaW5zbikpOworCX0KKyAgICB9CisgIHNlcSA9IGdldF9pbnNucyAoKTsKKyAgZW5kX3Nl cXVlbmNlICgpOworCisgIC8qIFJlLXdyaXRlIHRoZSBlbnRpcmUgQkIgY29udGVudHMgd2l0aCB0 aGUgdHJhbnNmb3JtZWQKKyAgICAgc2VxdWVuY2UuICAqLworICBGT1JfQkJfSU5TTlNfU0FGRSAo Ym9keSwgaW5zbiwgY3VyX2luc24pCisgICAgaWYgKCEoR0VUX0NPREUgKGluc24pID09IENPREVf TEFCRUwgfHwgTk9URV9JTlNOX0JBU0lDX0JMT0NLX1AgKGluc24pKSkKKyAgICAgIGRlbGV0ZV9p bnNuIChpbnNuKTsKKyAgZm9yIChpbnNuID0gc2VxOyBORVhUX0lOU04gKGluc24pOyBpbnNuID0g TkVYVF9JTlNOIChpbnNuKSkKKyAgICBpZiAoTk9URV9QIChpbnNuKSkKKyAgICAgIGVtaXRfbm90 ZV9hZnRlciAoKGVudW0gaW5zbl9ub3RlKU5PVEVfS0lORCAoaW5zbiksIEJCX0VORCAoYm9keSkp OworICAgIGVsc2UgaWYgKERFQlVHX0lOU05fUCAoaW5zbikpCisgICAgICBlbWl0X2RlYnVnX2lu c25fYWZ0ZXIgKFBBVFRFUk4gKGluc24pLCBCQl9FTkQgKGJvZHkpKTsKKyAgICBlbHNlCisgICAg ICBlbWl0X2luc25fYWZ0ZXIgKFBBVFRFUk4gKGluc24pLCBCQl9FTkQgKGJvZHkpKTsKKworICBl bWl0X2p1bXBfaW5zbl9hZnRlciAoUEFUVEVSTiAoaW5zbiksIEJCX0VORCAoYm9keSkpOworICAv KiBUaGUgdHJhbnNmb3JtYXRpb24gaGFzIHN1Y2NlZWRlZCwgc28gbm93IG1vZGlmeSB0aGUgImNv dW50IgorICAgICAoYS5rLmEuIG5pdGVyX2V4cHIpIGZvciB0aGUgbWlkZGxlLWVuZC4gIEFsc28g c2V0IG5vbG9vcF9hc3N1bXB0aW9ucworICAgICB0byBOVUxMIHRvIHN0b3AgdGhlIG1pZGRsZS1l bmQgZnJvbSBtYWtpbmcgYXNzdW1wdGlvbnMgYWJvdXQgdGhlCisgICAgIG51bWJlciBvZiBpdGVy YXRpb25zLiAgKi8KKyAgc2ltcGxlX2xvb3BfZGVzYyAoYm9keS0+bG9vcF9mYXRoZXIpLT5uaXRl cl9leHByID0gdmN0cF9yZWc7CisgIHNpbXBsZV9sb29wX2Rlc2MgKGJvZHktPmxvb3BfZmF0aGVy KS0+bm9sb29wX2Fzc3VtcHRpb25zID0gTlVMTF9SVFg7CisgIHJldHVybiBHRU5fSU5UIChkZWNy ZW1lbnRudW0pOwogfQogCiAjaWYgQ0hFQ0tJTkdfUApkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9h cm0vYXJtLm1kIGIvZ2NjL2NvbmZpZy9hcm0vYXJtLm1kCmluZGV4IDhlZmRlYmVjYzNjYWI1M2Ji OTljYjJhNTAwMGQ2ZDNjNmM4ZTM3OTguLmRhNzQ1Mjg4ZjI2Njk0MjdlNDhhYWE1YzExNmJiYzZj MDhhZDJiMzAgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvYXJtL2FybS5tZAorKysgYi9nY2MvY29u ZmlnL2FybS9hcm0ubWQKQEAgLTEyNCw2ICsxMjQsMTEgQEAKIDsgYW5kIG5vdCBhbGwgQVJNIGlu c25zIGRvLgogKGRlZmluZV9hdHRyICJwcmVkaWNhdGVkIiAieWVzLG5vIiAoY29uc3Rfc3RyaW5n ICJubyIpKQogCisKKzsgQW4gYXR0cmlidXRlIHRoYXQgZW5jb2RlcyB0aGUgQ09ERV9GT1JfPGlu c24+IG9mIHRoZSBNVkUgVlBUIHVucHJlZGljYXRlZAorOyB2ZXJzaW9uIG9mIGEgVlBULXByZWRp Y2F0ZWQgaW5zdHJ1Y3Rpb24uICBGb3IgdW5wcmVkaWNhdGVkIGluc3RydWN0aW9ucworOyB0aGF0 IGFyZSBwcmVkaWNhYmxlLCBlbmNvZGUgdGhlIHNhbWUgcGF0dGVybidzIENPREVfRk9SXzxpbnNu PiBhcyBhIHdheSB0bworOyBlbmNvZGUgdGhhdCBpdCBpcyBhIHByZWRpY2FibGUgaW5zdHJ1Y3Rp b24uCiAoZGVmaW5lX2F0dHIgIm12ZV91bnByZWRpY2F0ZWRfaW5zbiIgIiIgKGNvbnN0X2ludCAw KSkKIAogOyBMRU5HVEggb2YgYW4gaW5zdHJ1Y3Rpb24gKGluIGJ5dGVzKQpkaWZmIC0tZ2l0IGEv Z2NjL2NvbmZpZy9hcm0vaXRlcmF0b3JzLm1kIGIvZ2NjL2NvbmZpZy9hcm0vaXRlcmF0b3JzLm1k CmluZGV4IDVlYTJkOWU4NjY4OTFiZGIzZGM3M2ZjZjZjYmQ2Y2RkMmY5ODk5NTEuLjkzOTg3MDJj ZGRkMDc2YTdlYWNmMWNhNmVhYzZjNWExZmJkOWEzZDAgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcv YXJtL2l0ZXJhdG9ycy5tZAorKysgYi9nY2MvY29uZmlnL2FybS9pdGVyYXRvcnMubWQKQEAgLTI2 NzMsNiArMjY3MywxNyBAQAogKGRlZmluZV9pbnRfYXR0ciBtcnJjIFsoVlVOU1BFQ19NUlJDICJt cnJjIikgKFZVTlNQRUNfTVJSQzIgIm1ycmMyIildKQogKGRlZmluZV9pbnRfYXR0ciBNUlJDIFso VlVOU1BFQ19NUlJDICJNUlJDIikgKFZVTlNQRUNfTVJSQzIgIk1SUkMyIildKQogCisoZGVmaW5l X2ludF9hdHRyIGRsc3RwX2VsZW1zaXplIFsoRExTVFA4ICI4IikgKERMU1RQMTYgIjE2IikgKERM U1RQMzIgIjMyIikKKwkJCQkgKERMU1RQNjQgIjY0IildKQorCisoZGVmaW5lX2ludF9hdHRyIGxl dHBfbnVtX2xhbmVzIFsoTEVUUDggIjE2IikgKExFVFAxNiAiOCIpIChMRVRQMzIgIjQiKQorCQkJ CSAoTEVUUDY0ICIyIildKQorKGRlZmluZV9pbnRfYXR0ciBsZXRwX251bV9sYW5lc19uZWcgWyhM RVRQOCAiLTE2IikgKExFVFAxNiAiLTgiKSAoTEVUUDMyICItNCIpCisJCQkJICAgICAoTEVUUDY0 ICItMiIpXSkKKworKGRlZmluZV9pbnRfYXR0ciBsZXRwX251bV9sYW5lc19taW51c18xIFsoTEVU UDggIjE1IikgKExFVFAxNiAiNyIpIChMRVRQMzIgIjMiKQorCQkJCQkgKExFVFA2NCAiMSIpXSkK KwogKGRlZmluZV9pbnRfYXR0ciBvcHN1ZmZpeCBbKFVOU1BFQ19ET1RfUyAiczgiKQogCQkJICAg KFVOU1BFQ19ET1RfVSAidTgiKQogCQkJICAgKFVOU1BFQ19ET1RfVVMgInM4IikKQEAgLTI5MTYs NiArMjkyNywxMCBAQAogKGRlZmluZV9pbnRfaXRlcmF0b3IgVlNITENRX00gW1ZTSExDUV9NX1Mg VlNITENRX01fVV0pCiAoZGVmaW5lX2ludF9pdGVyYXRvciBWUVNITFVRX01fTiBbVlFTSExVUV9N X05fU10pCiAoZGVmaW5lX2ludF9pdGVyYXRvciBWUVNITFVRX04gW1ZRU0hMVVFfTl9TXSkKKyhk ZWZpbmVfaW50X2l0ZXJhdG9yIERMU1RQIFtETFNUUDggRExTVFAxNiBETFNUUDMyCisJCQkJICAg RExTVFA2NF0pCisoZGVmaW5lX2ludF9pdGVyYXRvciBMRVRQIFtMRVRQOCBMRVRQMTYgTEVUUDMy CisJCQkgICBMRVRQNjRdKQogCiA7OyBEZWZpbmUgaXRlcmF0b3JzIGZvciBWQ01MQSBvcGVyYXRp b25zCiAoZGVmaW5lX2ludF9pdGVyYXRvciBWQ01MQV9PUCBbVU5TUEVDX1ZDTUxBCmRpZmYgLS1n aXQgYS9nY2MvY29uZmlnL2FybS9tdmUubWQgYi9nY2MvY29uZmlnL2FybS9tdmUubWQKaW5kZXgg NDRhMDRiODZjYjU4MDZmY2Y1MDkxNzgyNjUxMmZkMjAzZDQyMTA2Yy4uYzA4M2Y5NjVmYTlhNDA3 ODFiYzg2YmViNmU2MzY1NGFmZDE0ZWFjNCAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9hcm0vbXZl Lm1kCisrKyBiL2djYy9jb25maWcvYXJtL212ZS5tZApAQCAtNjkyMiwyMyArNjkyMiwyNCBAQAog OzsgT3JpZ2luYWxseSBleHBhbmRlZCBieSAncHJlZGljYXRlZF9kb2xvb3BfZW5kJy4KIDs7IElu IHRoZSByYXJlIHNpdHVhdGlvbiB3aGVyZSB0aGUgYnJhbmNoIGlzIHRvbyBmYXIsIHdlIGRvIGFs c28gbmVlZCB0bwogOzsgcmV2ZXJ0IEZQU0NSLkxUUFNJWkUgYmFjayB0byAweDEwMCBhZnRlciB0 aGUgbGFzdCBpdGVyYXRpb24uCi0oZGVmaW5lX2luc24gIipwcmVkaWNhdGVkX2RvbG9vcF9lbmRf aW50ZXJuYWwiCisoZGVmaW5lX2luc24gInByZWRpY2F0ZWRfZG9sb29wX2VuZF9pbnRlcm5hbDxs ZXRwX251bV9sYW5lcz4iCiAgIFsoc2V0IChwYykKIAkoaWZfdGhlbl9lbHNlCi0JICAgKGdlIChw bHVzOlNJIChyZWc6U0kgTFJfUkVHTlVNKQotCQkJKG1hdGNoX29wZXJhbmQ6U0kgMCAiY29uc3Rf aW50X29wZXJhbmQiICIiKSkKLQkJKGNvbnN0X2ludCAwKSkKLQkgKGxhYmVsX3JlZiAobWF0Y2hf b3BlcmFuZCAxICIiICIiKSkKKwkgICAoZ3R1ICh1bnNwZWM6U0kgWyhwbHVzOlNJIChtYXRjaF9v cGVyYW5kOlNJIDAgInNfcmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKKwkJCQkgICAgIChjb25zdF9p bnQgPGxldHBfbnVtX2xhbmVzX25lZz4pKV0KKwkJTEVUUCkKKwkJKGNvbnN0X2ludCA8bGV0cF9u dW1fbGFuZXNfbWludXNfMT4pKQorCSAobWF0Y2hfb3BlcmFuZCAxICIiICIiKQogCSAocGMpKSkK LSAgIChzZXQgKHJlZzpTSSBMUl9SRUdOVU0pCi0JKHBsdXM6U0kgKHJlZzpTSSBMUl9SRUdOVU0p IChtYXRjaF9kdXAgMCkpKQorICAgKHNldCAobWF0Y2hfZHVwIDApCisJKHBsdXM6U0kgKG1hdGNo X2R1cCAwKSAoY29uc3RfaW50IDxsZXRwX251bV9sYW5lc19uZWc+KSkpCiAgICAoY2xvYmJlciAo cmVnOkNDIENDX1JFR05VTSkpXQotICAiVEFSR0VUXzMyQklUICYmIFRBUkdFVF9IQVZFX0xPQiAm JiBUQVJHRVRfSEFWRV9NVkUgJiYgVEFSR0VUX1RIVU1CMiIKKyAgIlRBUkdFVF9IQVZFX01WRSIK ICAgewogICAgIGlmIChnZXRfYXR0cl9sZW5ndGggKGluc24pID09IDQpCiAgICAgICByZXR1cm4g ImxldHBcdCV8bHIsICVsMSI7CiAgICAgZWxzZQotICAgICAgcmV0dXJuICJzdWJzXHQlfGxyLCAj JW4wXG5cdGJndFx0JWwxXG5cdGxjdHAiOworICAgICAgcmV0dXJuICJzdWJzXHQlfGxyLCAjPGxl dHBfbnVtX2xhbmVzPlxuXHRiaGlcdCVsMVxuXHRsY3RwIjsKICAgfQogICBbKHNldCAoYXR0ciAi bGVuZ3RoIikKIAkoaWZfdGhlbl9lbHNlCkBAIC02OTQ3LDExICs2OTQ4LDExIEBACiAJICAgIChj b25zdF9pbnQgNikpKQogICAgKHNldF9hdHRyICJ0eXBlIiAiYnJhbmNoIildKQogCi0oZGVmaW5l X2luc24gImRsc3RwPG1vZGUxPl9pbnNuIgorKGRlZmluZV9pbnNuICJkbHN0cDxkbHN0cF9lbGVt c2l6ZT5faW5zbiIKICAgWwogICAgIChzZXQgKHJlZzpTSSBMUl9SRUdOVU0pCiAJICh1bnNwZWM6 U0kgWyhtYXRjaF9vcGVyYW5kOlNJIDAgInNfcmVnaXN0ZXJfb3BlcmFuZCIgInIiKV0KIAkgIERM U1RQKSkKICAgXQotICAiVEFSR0VUXzMyQklUICYmIFRBUkdFVF9IQVZFX0xPQiAmJiBUQVJHRVRf SEFWRV9NVkUgJiYgVEFSR0VUX1RIVU1CMiIKLSAgImRsc3RwLjxtb2RlMT5cdCV8bHIsICUwIikK KyAgIlRBUkdFVF9IQVZFX01WRSIKKyAgImRsc3RwLjxkbHN0cF9lbGVtc2l6ZT5cdCV8bHIsICUw IikKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYXJtL3RodW1iMi5tZCBiL2djYy9jb25maWcvYXJt L3RodW1iMi5tZAppbmRleCBlMWUwMTNiZWZhN2E2N2RkYmY1MTdiZjIyNzk3YmRhZWViOTZiOTRm Li41NGRkNGVlNTY0YjcxZDhlMGI5YjI3NmZjYTM4OGRlYjQwMThjZTdkIDEwMDY0NAotLS0gYS9n Y2MvY29uZmlnL2FybS90aHVtYjIubWQKKysrIGIvZ2NjL2NvbmZpZy9hcm0vdGh1bWIyLm1kCkBA IC0xNjEzLDcgKzE2MTMsNyBAQAogICAgKHVzZSAobWF0Y2hfb3BlcmFuZCAxICIiICIiKSldICAg ICA7IGxhYmVsCiAgICJUQVJHRVRfMzJCSVQiCiAgICIKLSB7Cit7CiAgICAvKiBDdXJyZW50bHkg U01TIHJlbGllcyBvbiB0aGUgZG8tbG9vcCBwYXR0ZXJuIHRvIHJlY29nbml6ZSBsb29wcwogICAg ICAgd2hlcmUgKDEpIHRoZSBjb250cm9sIHBhcnQgY29uc2lzdHMgb2YgYWxsIGluc25zIGRlZmlu aW5nIGFuZC9vcgogICAgICAgdXNpbmcgYSBjZXJ0YWluICdjb3VudCcgcmVnaXN0ZXIgYW5kICgy KSB0aGUgbG9vcCBjb3VudCBjYW4gYmUKQEAgLTE2MjMsNDEgKzE2MjMsNzcgQEAKIAogICAgICAg QWxzbyB1c2VkIHRvIGltcGxlbWVudCB0aGUgbG93IG92ZXIgaGVhZCBsb29wcyBmZWF0dXJlLCB3 aGljaCBpcyBwYXJ0IG9mCiAgICAgICB0aGUgQXJtdjguMS1NIE1haW5saW5lIExvdyBPdmVyaGVh ZCBCcmFuY2ggKExPQikgZXh0ZW5zaW9uLiAgKi8KLSAgIGlmIChvcHRpbWl6ZSA+IDAgJiYgKGZs YWdfbW9kdWxvX3NjaGVkIHx8IFRBUkdFVF9IQVZFX0xPQikpCi0gICB7Ci0gICAgIHJ0eCBzMDsK LSAgICAgcnR4IGJjb21wOwotICAgICBydHggbG9jX3JlZjsKLSAgICAgcnR4IGNjX3JlZzsKLSAg ICAgcnR4IGluc247Ci0gICAgIHJ0eCBjbXA7Ci0KLSAgICAgaWYgKEdFVF9NT0RFIChvcGVyYW5k c1swXSkgIT0gU0ltb2RlKQotICAgICAgIEZBSUw7Ci0KLSAgICAgczAgPSBvcGVyYW5kcyBbMF07 Ci0KLSAgICAgLyogTG93IG92ZXIgaGVhZCBsb29wIGluc3RydWN0aW9ucyByZXF1aXJlIHRoZSBm aXJzdCBvcGVyYW5kIHRvIGJlIExSLiAgKi8KLSAgICAgaWYgKFRBUkdFVF9IQVZFX0xPQiAmJiBh cm1fdGFyZ2V0X2luc25fb2tfZm9yX2xvYiAob3BlcmFuZHMgWzFdKSkKLSAgICAgICBzMCA9IGdl bl9ydHhfUkVHIChTSW1vZGUsIExSX1JFR05VTSk7Ci0KLSAgICAgaWYgKFRBUkdFVF9USFVNQjIp Ci0gICAgICAgaW5zbiA9IGVtaXRfaW5zbiAoZ2VuX3RodW1iMl9hZGRzaTNfY29tcGFyZTAgKHMw LCBzMCwgR0VOX0lOVCAoLTEpKSk7Ci0gICAgIGVsc2UKLSAgICAgICBpbnNuID0gZW1pdF9pbnNu IChnZW5fYWRkc2kzX2NvbXBhcmUwIChzMCwgczAsIEdFTl9JTlQgKC0xKSkpOwotCi0gICAgIGNt cCA9IFhWRUNFWFAgKFBBVFRFUk4gKGluc24pLCAwLCAwKTsKLSAgICAgY2NfcmVnID0gU0VUX0RF U1QgKGNtcCk7Ci0gICAgIGJjb21wID0gZ2VuX3J0eF9ORSAoVk9JRG1vZGUsIGNjX3JlZywgY29u c3QwX3J0eCk7Ci0gICAgIGxvY19yZWYgPSBnZW5fcnR4X0xBQkVMX1JFRiAoVk9JRG1vZGUsIG9w ZXJhbmRzIFsxXSk7Ci0gICAgIGVtaXRfanVtcF9pbnNuIChnZW5fcnR4X1NFVCAocGNfcnR4LAot ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9ydHhfSUZfVEhFTl9FTFNFIChW T0lEbW9kZSwgYmNvbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGxvY19yZWYsIHBjX3J0eCkpKTsKLSAgICAgRE9ORTsKLSAgIH0KLSBl bHNlCi0gICBGQUlMOwotIH0iKQorICBpZiAob3B0aW1pemUgPiAwICYmIChmbGFnX21vZHVsb19z Y2hlZCB8fCBUQVJHRVRfSEFWRV9MT0IpKQorICAgIHsKKyAgICAgIHJ0eCBzMDsKKyAgICAgIHJ0 eCBiY29tcDsKKyAgICAgIHJ0eCBsb2NfcmVmOworICAgICAgcnR4IGNjX3JlZzsKKyAgICAgIHJ0 eCBpbnNuOworICAgICAgcnR4IGNtcDsKKyAgICAgIHJ0eCBkZWNyZW1lbnRfbnVtOworCisgICAg ICBpZiAoR0VUX01PREUgKG9wZXJhbmRzWzBdKSAhPSBTSW1vZGUpCisJRkFJTDsKKworICAgICAg czAgPSBvcGVyYW5kc1swXTsKKworICAgICAgIGlmIChUQVJHRVRfSEFWRV9MT0IgJiYgYXJtX3Rh cmdldF9iYl9va19mb3JfbG9iIChCTE9DS19GT1JfSU5TTiAob3BlcmFuZHNbMV0pKSkKKwl7CisJ ICBzMCA9IGdlbl9ydHhfUkVHIChTSW1vZGUsIExSX1JFR05VTSk7CisKKwkgIC8qIElmIHdlIGhh dmUgYSBjb21wYXRpYmUgTVZFIHRhcmdldCwgdHJ5IGFuZCBhbmFseXNlIHRoZSBsb29wCisJICAg ICBjb250ZW50cyB0byBkZXRlcm1pbmUgaWYgd2UgY2FuIHVzZSBwcmVkaWNhdGVkIGRsc3RwL2xl dHAKKwkgICAgIGxvb3BpbmcuICAqLworCSAgaWYgKFRBUkdFVF9IQVZFX01WRQorCSAgICAgICYm IChkZWNyZW1lbnRfbnVtID0gYXJtX2F0dGVtcHRfZGxzdHBfdHJhbnNmb3JtIChvcGVyYW5kc1sx XSkpCisJICAgICAgJiYgKElOVFZBTCAoZGVjcmVtZW50X251bSkgIT0gMSkpCisJICAgIHsKKwkg ICAgICBsb2NfcmVmID0gZ2VuX3J0eF9MQUJFTF9SRUYgKFZPSURtb2RlLCBvcGVyYW5kc1sxXSk7 CisJICAgICAgc3dpdGNoIChJTlRWQUwgKGRlY3JlbWVudF9udW0pKQorCQl7CisJCSAgY2FzZSAy OgorCQkgICAgaW5zbiA9IGVtaXRfanVtcF9pbnNuIChnZW5fcHJlZGljYXRlZF9kb2xvb3BfZW5k X2ludGVybmFsMgorCQkJCQkgICAgKHMwLCBsb2NfcmVmKSk7CisJCSAgICBicmVhazsKKwkJICBj YXNlIDQ6CisJCSAgICBpbnNuID0gZW1pdF9qdW1wX2luc24gKGdlbl9wcmVkaWNhdGVkX2RvbG9v cF9lbmRfaW50ZXJuYWw0CisJCQkJCSAgICAoczAsIGxvY19yZWYpKTsKKwkJICAgIGJyZWFrOwor CQkgIGNhc2UgODoKKwkJICAgIGluc24gPSBlbWl0X2p1bXBfaW5zbiAoZ2VuX3ByZWRpY2F0ZWRf ZG9sb29wX2VuZF9pbnRlcm5hbDgKKwkJCQkJICAgIChzMCwgbG9jX3JlZikpOworCQkgICAgYnJl YWs7CisJCSAgY2FzZSAxNjoKKwkJICAgIGluc24gPSBlbWl0X2p1bXBfaW5zbiAoZ2VuX3ByZWRp Y2F0ZWRfZG9sb29wX2VuZF9pbnRlcm5hbDE2CisJCQkJCSAgICAoczAsIGxvY19yZWYpKTsKKwkJ ICAgIGJyZWFrOworCQkgIGRlZmF1bHQ6CisJCSAgICBnY2NfdW5yZWFjaGFibGUgKCk7CisJCX0K KwkgICAgICBET05FOworCSAgICB9CisJfQorCisJLyogT3RoZXJ3aXNlLCB0cnkgc3RhbmRhcmQg ZGVjcmVtZW50LWJ5LW9uZSBkbHMvbGUgbG9vcGluZy4gICovCisJaWYgKFRBUkdFVF9USFVNQjIp CisJICBpbnNuID0gZW1pdF9pbnNuIChnZW5fdGh1bWIyX2FkZHNpM19jb21wYXJlMCAoczAsIHMw LAorCQkJCQkJCUdFTl9JTlQgKC0xKSkpOworCWVsc2UKKwkgIGluc24gPSBlbWl0X2luc24gKGdl bl9hZGRzaTNfY29tcGFyZTAgKHMwLCBzMCwgR0VOX0lOVCAoLTEpKSk7CisKKwljbXAgPSBYVkVD RVhQIChQQVRURVJOIChpbnNuKSwgMCwgMCk7CisJY2NfcmVnID0gU0VUX0RFU1QgKGNtcCk7CisJ YmNvbXAgPSBnZW5fcnR4X05FIChWT0lEbW9kZSwgY2NfcmVnLCBjb25zdDBfcnR4KTsKKwlsb2Nf cmVmID0gZ2VuX3J0eF9MQUJFTF9SRUYgKFZPSURtb2RlLCBvcGVyYW5kc1sxXSk7CisJZW1pdF9q dW1wX2luc24gKGdlbl9ydHhfU0VUIChwY19ydHgsCisJCQkJICAgICBnZW5fcnR4X0lGX1RIRU5f RUxTRSAoVk9JRG1vZGUsIGJjb21wLAorCQkJCQkJCSAgIGxvY19yZWYsIHBjX3J0eCkpKTsKKwlE T05FOworICAgIH0KKyAgZWxzZQorICAgIEZBSUw7Cit9IikKIAogKGRlZmluZV9pbnNuICIqY2xl YXJfYXBzciIKICAgWyh1bnNwZWNfdm9sYXRpbGU6U0kgWyhjb25zdF9pbnQgMCldIFZVTlNQRUNf Q0xSTV9BUFNSKQpAQCAtMTc1NSw3ICsxNzkxLDM3IEBACiAgIHsKICAgICBpZiAoUkVHTk8gKG9w ZXJhbmRzWzBdKSA9PSBMUl9SRUdOVU0pCiAgICAgICB7Ci0JZW1pdF9pbnNuIChnZW5fZGxzX2lu c24gKG9wZXJhbmRzWzBdKSk7CisJLyogUGljayBvdXQgdGhlIG51bWJlciBieSB3aGljaCB3ZSBh cmUgZGVjcmVtZW50aW5nIHRoZSBsb29wIGNvdW50ZXIKKwkgICBpbiBldmVyeSBpdGVyYXRpb24u ICBJZiBpdCdzID4gMSwgdGhlbiB1c2UgZGxzdHAuICAqLworCWludCBjb25zdF9pbnRfZGVjX251 bQorCSAgICAgPSBhYnMgKElOVFZBTCAoWEVYUCAoWEVYUCAoWFZFQ0VYUCAoUEFUVEVSTiAob3Bl cmFuZHNbMV0pLCAwLCAxKSwKKwkJCQkgIDEpLAorCQkJICAgIDEpKSk7CisJc3dpdGNoIChjb25z dF9pbnRfZGVjX251bSkKKwkgIHsKKwkgICAgY2FzZSAxNjoKKwkgICAgICBlbWl0X2luc24gKGdl bl9kbHN0cDhfaW5zbiAob3BlcmFuZHNbMF0pKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNl IDg6CisJICAgICAgZW1pdF9pbnNuIChnZW5fZGxzdHAxNl9pbnNuIChvcGVyYW5kc1swXSkpOwor CSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgNDoKKwkgICAgICBlbWl0X2luc24gKGdlbl9kbHN0 cDMyX2luc24gKG9wZXJhbmRzWzBdKSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAyOgor CSAgICAgIGVtaXRfaW5zbiAoZ2VuX2Rsc3RwNjRfaW5zbiAob3BlcmFuZHNbMF0pKTsKKwkgICAg ICBicmVhazsKKworCSAgICBjYXNlIDE6CisJICAgICAgZW1pdF9pbnNuIChnZW5fZGxzX2luc24g KG9wZXJhbmRzWzBdKSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBn Y2NfdW5yZWFjaGFibGUgKCk7CisJICB9CiAJRE9ORTsKICAgICAgIH0KICAgICBlbHNlCmRpZmYg LS1naXQgYS9nY2MvY29uZmlnL2FybS91bnNwZWNzLm1kIGIvZ2NjL2NvbmZpZy9hcm0vdW5zcGVj cy5tZAppbmRleCA0NzEzZWM4NDBhYmFlNDhjYTcwZjQxOGRiYzBkNDAyOGFkNGFkNTI3Li4yZDZm MjdjMTRmNGExZTdkYjA1Yjk2ODRhODk1OGE3NmExYzc5ZWYyIDEwMDY0NAotLS0gYS9nY2MvY29u ZmlnL2FybS91bnNwZWNzLm1kCisrKyBiL2djYy9jb25maWcvYXJtL3Vuc3BlY3MubWQKQEAgLTU4 Myw2ICs1ODMsMTQgQEAKICAgVkFERExWUV9VCiAgIFZDVFAKICAgVkNUUF9NCisgIERMU1RQOAor ICBETFNUUDE2CisgIERMU1RQMzIKKyAgRExTVFA2NAorICBMRVRQOAorICBMRVRQMTYKKyAgTEVU UDMyCisgIExFVFA2NAogICBWUE5PVAogICBWQ1JFQVRFUV9GCiAgIFZDVlRRX05fVE9fRl9TCmRp ZmYgLS1naXQgYS9nY2MvZGYtY29yZS5jYyBiL2djYy9kZi1jb3JlLmNjCmluZGV4IGQ0ODEyYjA0 YTdjYjk3ZWExNjA2MDgyZTI2ZTkxMDQ3MmRhNWJjYzEuLjRmY2MxNGJmNzkwZDQzZTc5MmIzYzky NmZlMWY4MDA3M2Q5MDhjMTcgMTAwNjQ0Ci0tLSBhL2djYy9kZi1jb3JlLmNjCisrKyBiL2djYy9k Zi1jb3JlLmNjCkBAIC0xOTY0LDYgKzE5NjQsMjEgQEAgZGZfYmJfcmVnbm9fbGFzdF9kZWZfZmlu ZCAoYmFzaWNfYmxvY2sgYmIsIHVuc2lnbmVkIGludCByZWdubykKICAgcmV0dXJuIE5VTEw7CiB9 CiAKKy8qIFJldHVybiB0aGUgb25lIGFuZCBvbmx5IGRlZiBvZiBSRUdOTyB3aXRoaW4gQkIuICBJ ZiB0aGVyZSBpcyBubyBkZWYgb3IKKyAgIHRoZXJlIGFyZSBtdWx0aXBsZSBkZWZzLCByZXR1cm4g TlVMTC4gICovCisKK2RmX3JlZgorZGZfYmJfcmVnbm9fb25seV9kZWZfZmluZCAoYmFzaWNfYmxv Y2sgYmIsIHVuc2lnbmVkIGludCByZWdubykKK3sKKyAgZGZfcmVmIHRlbXAgPSBkZl9iYl9yZWdu b19maXJzdF9kZWZfZmluZCAoYmIsIHJlZ25vKTsKKyAgaWYgKCF0ZW1wKQorICAgIHJldHVybiBO VUxMOworICBlbHNlIGlmICh0ZW1wID09IGRmX2JiX3JlZ25vX2xhc3RfZGVmX2ZpbmQgKGJiLCBy ZWdubykpCisgICAgcmV0dXJuIHRlbXA7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKwog LyogRmluZHMgdGhlIHJlZmVyZW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZWZpbml0aW9uIG9m IFJFRyBpbiBJTlNOLgogICAgREYgaXMgdGhlIGRhdGFmbG93IG9iamVjdC4gICovCiAKZGlmZiAt LWdpdCBhL2djYy9kZi5oIGIvZ2NjL2RmLmgKaW5kZXggNDAyNjU3YTcwNzZmMWJjYWQyNGU5YzUw NjgyZTAzM2U1N2Y0MzJmOS4uOTg2MjM2MzdmOWM4MzljNzk5MjIyZTk5ZGYyYTcxNzNhNzcwYjJh YyAxMDA2NDQKLS0tIGEvZ2NjL2RmLmgKKysrIGIvZ2NjL2RmLmgKQEAgLTk4Nyw2ICs5ODcsNyBA QCBleHRlcm4gdm9pZCBkZl9jaGVja19jZmdfY2xlYW4gKHZvaWQpOwogI2VuZGlmCiBleHRlcm4g ZGZfcmVmIGRmX2JiX3JlZ25vX2ZpcnN0X2RlZl9maW5kIChiYXNpY19ibG9jaywgdW5zaWduZWQg aW50KTsKIGV4dGVybiBkZl9yZWYgZGZfYmJfcmVnbm9fbGFzdF9kZWZfZmluZCAoYmFzaWNfYmxv Y2ssIHVuc2lnbmVkIGludCk7CitleHRlcm4gZGZfcmVmIGRmX2JiX3JlZ25vX29ubHlfZGVmX2Zp bmQgKGJhc2ljX2Jsb2NrLCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIGRmX3JlZiBkZl9maW5kX2Rl ZiAocnR4X2luc24gKiwgcnR4KTsKIGV4dGVybiBib29sIGRmX3JlZ19kZWZpbmVkIChydHhfaW5z biAqLCBydHgpOwogZXh0ZXJuIGRmX3JlZiBkZl9maW5kX3VzZSAocnR4X2luc24gKiwgcnR4KTsK ZGlmZiAtLWdpdCBhL2djYy9sb29wLWRvbG9vcC5jYyBiL2djYy9sb29wLWRvbG9vcC5jYwppbmRl eCA0ZmViMGEyNWFiOTMzMWI3MTI0ZGY5MDBmNzNjOWZjNmZiM2ViMTBiLi5kOTE5MjA3NTA1YzQ3 MmM4YTU0YTJjOWM5ODJhMDkwNjE1ODQxNzdiIDEwMDY0NAotLS0gYS9nY2MvbG9vcC1kb2xvb3Au Y2MKKysrIGIvZ2NjL2xvb3AtZG9sb29wLmNjCkBAIC04NSwxMCArODUsMTAgQEAgZG9sb29wX2Nv bmRpdGlvbl9nZXQgKHJ0eF9pbnNuICpkb2xvb3BfcGF0KQogICAgICBmb3JtczoKIAogICAgICAx KSAgKHBhcmFsbGVsIFsoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAoY29uZGl0aW9uKQotCSAgCQkJ ICAgICAgICAgICAgKGxhYmVsX3JlZiAobGFiZWwpKQotCQkJCSAgICAgICAgICAgIChwYykpKQot CSAgICAgICAgICAgICAoc2V0IChyZWcpIChwbHVzIChyZWcpIChjb25zdF9pbnQgLTEpKSkKLQkg ICAgICAgICAgICAgKGFkZGl0aW9uYWwgY2xvYmJlcnMgYW5kIHVzZXMpXSkKKwkJCQkJICAgIChs YWJlbF9yZWYgKGxhYmVsKSkKKwkJCQkJICAgIChwYykpKQorCQkgICAgIChzZXQgKHJlZykgKHBs dXMgKHJlZykgKGNvbnN0X2ludCAtMSkpKQorCQkgICAgIChhZGRpdGlvbmFsIGNsb2JiZXJzIGFu ZCB1c2VzKV0pCiAKICAgICAgVGhlIGJyYW5jaCBtdXN0IGJlIHRoZSBmaXJzdCBlbnRyeSBvZiB0 aGUgcGFyYWxsZWwgKGFsc28gcmVxdWlyZWQKICAgICAgYnkganVtcC5jYyksIGFuZCB0aGUgc2Vj b25kIGVudHJ5IG9mIHRoZSBwYXJhbGxlbCBtdXN0IGJlIGEgc2V0IG9mCkBAIC05NiwxOSArOTYs MzQgQEAgZG9sb29wX2NvbmRpdGlvbl9nZXQgKHJ0eF9pbnNuICpkb2xvb3BfcGF0KQogICAgICB0 aGUgbG9vcCBjb3VudGVyIGluIGFuIGlmX3RoZW5fZWxzZSB0b28uCiAKICAgICAgMikgIChzZXQg KHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkpCi0gICAgICAgICAoc2V0IChwYykgKGlm X3RoZW5fZWxzZSAocmVnICE9IDApCi0JICAgICAgICAgICAgICAgICAgICAgICAgIChsYWJlbF9y ZWYgKGxhYmVsKSkKLQkJCSAgICAgICAgIChwYykpKS4gIAorCSAoc2V0IChwYykgKGlmX3RoZW5f ZWxzZSAocmVnICE9IDApCisJCQkJIChsYWJlbF9yZWYgKGxhYmVsKSkKKwkJCQkgKHBjKSkpLgog CiAgICAgIFNvbWUgdGFyZ2V0cyAoQVJNKSBkbyB0aGUgY29tcGFyaXNvbiBiZWZvcmUgdGhlIGJy YW5jaCwgYXMgaW4gdGhlCiAgICAgIGZvbGxvd2luZyBmb3JtOgogCi0gICAgIDMpIChwYXJhbGxl bCBbKHNldCAoY2MpIChjb21wYXJlICgocGx1cyAocmVnKSAoY29uc3RfaW50IC0xKSwgMCkpKQot ICAgICAgICAgICAgICAgICAgIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkp KV0pCi0gICAgICAgIChzZXQgKHBjKSAoaWZfdGhlbl9lbHNlIChjYyA9PSBORSkKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKGxhYmVsX3JlZiAobGFiZWwpKQotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAocGMpKSkgKi8KLQorICAgICAzKSAocGFyYWxsZWwgWyhzZXQg KGNjKSAoY29tcGFyZSAocGx1cyAocmVnKSAoY29uc3RfaW50IC0xKSkgMCkpCisJCSAgIChzZXQg KHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkpKV0pCisJKHNldCAocGMpIChpZl90aGVu X2Vsc2UgKGNjID09IE5FKQorCQkJCShsYWJlbF9yZWYgKGxhYmVsKSkKKwkJCQkocGMpKSkKKwor ICAgICAgVGhlIEFSTSB0YXJnZXQgYWxzbyBzdXBwb3J0cyBhIHNwZWNpYWwgY2FzZSBvZiBhIGNv dW50ZXIgdGhhdCBkZWNyZW1lbnRzCisgICAgICBieSBgbmAgYW5kIHRlcm1pbmF0aW5nIGluIGEg R1RVIGNvbmRpdGlvbi4gIEluIHRoYXQgY2FzZSwgdGhlIGNvbXBhcmUgYW5kCisgICAgICBicmFu Y2ggYXJlIGFsbCBwYXJ0IG9mIG9uZSBpbnNuLCBjb250YWluaW5nIGFuIFVOU1BFQzoKKworICAg ICAgNCkgKHBhcmFsbGVsIFsKKwkgICAgKHNldCAocGMpCisJCShpZl90aGVuX2Vsc2UgKGd0dSAo dW5zcGVjOlNJIFsocGx1czpTSSAocmVnOlNJIDE0IGxyKQorCQkJCQkJCShjb25zdF9pbnQgLW4p KV0pCisJCQkJICAgKGNvbnN0X2ludCBuLTFdKSkKKwkJICAgIChsYWJlbF9yZWYpCisJCSAgICAo cGMpKSkKKwkgICAgKHNldCAocmVnOlNJIDE0IGxyKQorCQkgKHBsdXM6U0kgKHJlZzpTSSAxNCBs cikKKwkJCSAgKGNvbnN0X2ludCAtbikpKQorICAgICAqLwogICBwYXR0ZXJuID0gUEFUVEVSTiAo ZG9sb29wX3BhdCk7CiAKICAgaWYgKEdFVF9DT0RFIChwYXR0ZXJuKSAhPSBQQVJBTExFTCkKQEAg LTE0Myw3ICsxNTgsNyBAQCBkb2xvb3BfY29uZGl0aW9uX2dldCAocnR4X2luc24gKmRvbG9vcF9w YXQpCiAJICAgICAgfHwgR0VUX0NPREUgKGNtcF9hcmcxKSAhPSBQTFVTKQogCSAgICByZXR1cm4g MDsKIAkgIHJlZ19vcmlnID0gWEVYUCAoY21wX2FyZzEsIDApOwotCSAgaWYgKFhFWFAgKGNtcF9h cmcxLCAxKSAhPSBHRU5fSU5UICgtMSkgCisJICBpZiAoWEVYUCAoY21wX2FyZzEsIDEpICE9IEdF Tl9JTlQgKC0xKQogCSAgICAgIHx8ICFSRUdfUCAocmVnX29yaWcpKQogCSAgICByZXR1cm4gMDsK IAkgIGNjX3JlZyA9IFNFVF9ERVNUIChjbXBfb3JpZyk7CkBAIC0xNzMsMTUgKzE4OCwxNyBAQCBk b2xvb3BfY29uZGl0aW9uX2dldCAocnR4X2luc24gKmRvbG9vcF9wYXQpCiAgIGlmICghIFJFR19Q IChyZWcpKQogICAgIHJldHVybiAwOwogCi0gIC8qIENoZWNrIGlmIHNvbWV0aGluZyA9IChwbHVz IChyZWcpIChjb25zdF9pbnQgLTEpKS4KKyAgLyogQ2hlY2sgaWYgc29tZXRoaW5nID0gKHBsdXMg KHJlZykgKGNvbnN0X2ludCAtbikpLgogICAgICBPbiBJQS02NCwgdGhpcyBkZWNyZW1lbnQgaXMg d3JhcHBlZCBpbiBhbiBpZl90aGVuX2Vsc2UuICAqLwogICBpbmNfc3JjID0gU0VUX1NSQyAoaW5j KTsKICAgaWYgKEdFVF9DT0RFIChpbmNfc3JjKSA9PSBJRl9USEVOX0VMU0UpCiAgICAgaW5jX3Ny YyA9IFhFWFAgKGluY19zcmMsIDEpOwogICBpZiAoR0VUX0NPREUgKGluY19zcmMpICE9IFBMVVMK ICAgICAgIHx8IFhFWFAgKGluY19zcmMsIDApICE9IHJlZwotICAgICAgfHwgWEVYUCAoaW5jX3Ny YywgMSkgIT0gY29uc3RtMV9ydHgpCisgICAgICB8fCAhQ09OU1RfSU5UX1AgKFhFWFAgKGluY19z cmMsIDEpKQorICAgICAgfHwgSU5UVkFMIChYRVhQIChpbmNfc3JjLCAxKSkgPj0gMCkKICAgICBy ZXR1cm4gMDsKKyAgaW50IGRlY19udW0gPSBhYnMgKElOVFZBTCAoWEVYUCAoaW5jX3NyYywgMSkp KTsKIAogICAvKiBDaGVjayBmb3IgKHNldCAocGMpIChpZl90aGVuX2Vsc2UgKGNvbmRpdGlvbikK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYWJlbF9yZWYgKGxhYmVs KSkKQEAgLTE5Niw2MCArMjEzLDcxIEBAIGRvbG9vcF9jb25kaXRpb25fZ2V0IChydHhfaW5zbiAq ZG9sb29wX3BhdCkKICAgLyogRXh0cmFjdCBsb29wIHRlcm1pbmF0aW9uIGNvbmRpdGlvbi4gICov CiAgIGNvbmRpdGlvbiA9IFhFWFAgKFNFVF9TUkMgKGNtcCksIDApOwogCi0gIC8qIFdlIGV4cGVj dCBhIEdFIG9yIE5FIGNvbXBhcmlzb24gd2l0aCAwIG9yIDEuICAqLwotICBpZiAoKEdFVF9DT0RF IChjb25kaXRpb24pICE9IEdFCi0gICAgICAgJiYgR0VUX0NPREUgKGNvbmRpdGlvbikgIT0gTkUp Ci0gICAgICB8fCAoWEVYUCAoY29uZGl0aW9uLCAxKSAhPSBjb25zdDBfcnR4Ci0gICAgICAgICAg JiYgWEVYUCAoY29uZGl0aW9uLCAxKSAhPSBjb25zdDFfcnR4KSkKKyAgLyogV2UgZXhwZWN0IGEg R0Ugb3IgTkUgY29tcGFyaXNvbiB3aXRoIDAgb3IgMSwgb3IgYSBHVFUgY29tcGFyaXNvbiB3aXRo CisgICAgIGRlY19udW0gLSAxLiAgKi8KKyAgaWYgKCEoKEdFVF9DT0RFIChjb25kaXRpb24pID09 IEdFCisJIHx8IEdFVF9DT0RFIChjb25kaXRpb24pID09IE5FKQorCSYmIChYRVhQIChjb25kaXRp b24sIDEpID09IGNvbnN0MF9ydHgKKwkgICAgfHwgWEVYUCAoY29uZGl0aW9uLCAxKSA9PSBjb25z dDFfcnR4ICkpCisgICAgICAmJiEoR0VUX0NPREUgKGNvbmRpdGlvbikgPT0gR1RVCisJICAmJiAo KElOVFZBTCAoWEVYUCAoY29uZGl0aW9uLCAxKSkpID09IChkZWNfbnVtIC0gMSkpKSkKICAgICBy ZXR1cm4gMDsKIAotICBpZiAoKFhFWFAgKGNvbmRpdGlvbiwgMCkgPT0gcmVnKQorICAvKiBGb3Ig dGhlIEFSTSBzcGVjaWFsIGNhc2Ugb2YgaGF2aW5nIGEgR1RVOiByZS1mb3JtIHRoZSBjb25kaXRp b24gd2l0aG91dAorICAgICB0aGUgdW5zcGVjIGZvciB0aGUgYmVuZWZpdCBvZiB0aGUgbWlkZGxl LWVuZC4gICovCisgIGlmIChHRVRfQ09ERSAoY29uZGl0aW9uKSA9PSBHVFUpCisgICAgeworICAg ICAgY29uZGl0aW9uID0gZ2VuX3J0eF9mbXRfZWUgKEdUVSwgVk9JRG1vZGUsIGluY19zcmMsCisJ CQkJICBHRU5fSU5UIChkZWNfbnVtIC0gMSkpOworICAgICAgcmV0dXJuIGNvbmRpdGlvbjsKKyAg ICB9CisgIGVsc2UgaWYgKChYRVhQIChjb25kaXRpb24sIDApID09IHJlZykKICAgICAgIC8qIEZv ciB0aGUgdGhpcmQgY2FzZTogICovICAKICAgICAgIHx8ICgoY2NfcmVnICE9IE5VTExfUlRYKQog CSAgJiYgKFhFWFAgKGNvbmRpdGlvbiwgMCkgPT0gY2NfcmVnKQogCSAgJiYgKHJlZ19vcmlnID09 IHJlZykpCiAgICAgICB8fCAoR0VUX0NPREUgKFhFWFAgKGNvbmRpdGlvbiwgMCkpID09IFBMVVMK IAkgICYmIFhFWFAgKFhFWFAgKGNvbmRpdGlvbiwgMCksIDApID09IHJlZykpCi0gICB7CisgICAg ewogICAgICBpZiAoR0VUX0NPREUgKHBhdHRlcm4pICE9IFBBUkFMTEVMKQogICAgICAvKiAgRm9y IHRoZSBzZWNvbmQgZm9ybSB3ZSBleHBlY3Q6CiAKLSAgICAgICAgIChzZXQgKHJlZykgKHBsdXMg KHJlZykgKGNvbnN0X2ludCAtMSkpCi0gICAgICAgICAoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAo cmVnICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFiZWxfcmVmIChs YWJlbCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGMpKSkuCisJIChzZXQg KHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkpCisJIChzZXQgKHBjKSAoaWZfdGhlbl9l bHNlIChyZWcgIT0gMCkKKwkJCQkgKGxhYmVsX3JlZiAobGFiZWwpKQorCQkJCSAocGMpKSkuCiAK LSAgICAgICAgIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKKwkgaXMgZXF1aXZhbGVu dCB0byB0aGUgZm9sbG93aW5nOgogCi0gICAgICAgICAocGFyYWxsZWwgWyhzZXQgKHBjKSAoaWZf dGhlbl9lbHNlIChyZWcgIT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKGxhYmVsX3JlZiAobGFiZWwpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAocGMpKSkKLSAgICAgICAgICAgICAgICAgICAgIChzZXQgKHJlZykg KHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkpKQotICAgICAgICAgICAgICAgICAgICAgKGFkZGl0 aW9uYWwgY2xvYmJlcnMgYW5kIHVzZXMpXSkKKwkgKHBhcmFsbGVsIFsoc2V0IChwYykgKGlmX3Ro ZW5fZWxzZSAocmVnICE9IDEpCisJCQkJCSAgICAobGFiZWxfcmVmIChsYWJlbCkpCisJCQkJCSAg ICAocGMpKSkKKwkJICAgICAoc2V0IChyZWcpIChwbHVzIChyZWcpIChjb25zdF9pbnQgLTEpKSkK KwkJICAgICAoYWRkaXRpb25hbCBjbG9iYmVycyBhbmQgdXNlcyldKQogCi0gICAgICAgIEZvciB0 aGUgdGhpcmQgZm9ybSB3ZSBleHBlY3Q6CisJRm9yIHRoZSB0aGlyZCBmb3JtIHdlIGV4cGVjdDoK IAotICAgICAgICAocGFyYWxsZWwgWyhzZXQgKGNjKSAoY29tcGFyZSAoKHBsdXMgKHJlZykgKGNv bnN0X2ludCAtMSkpLCAwKSkKLSAgICAgICAgICAgICAgICAgICAoc2V0IChyZWcpIChwbHVzIChy ZWcpIChjb25zdF9pbnQgLTEpKSldKQotICAgICAgICAoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAo Y2MgPT0gTkUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYWJlbF9yZWYgKGxh YmVsKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBjKSkpIAorCShwYXJhbGxl bCBbKHNldCAoY2MpIChjb21wYXJlICgocGx1cyAocmVnKSAoY29uc3RfaW50IC0xKSksIDApKQor CQkgICAoc2V0IChyZWcpIChwbHVzIChyZWcpIChjb25zdF9pbnQgLTEpKSldKQorCShzZXQgKHBj KSAoaWZfdGhlbl9lbHNlIChjYyA9PSBORSkKKwkJCQkobGFiZWxfcmVmIChsYWJlbCkpCisJCQkJ KHBjKSkpIAogCi0gICAgICAgIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoK Kwl3aGljaCBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6CiAKLSAgICAgICAgKHBhcmFs bGVsIFsoc2V0IChjYykgKGNvbXBhcmUgKHJlZywgIDEpKQotICAgICAgICAgICAgICAgICAgIChz ZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkpKQotICAgICAgICAgICAgICAgICAg IChzZXQgKHBjKSAoaWZfdGhlbl9lbHNlIChORSA9PSBjYykKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAobGFiZWxfcmVmIChsYWJlbCkpCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBjKSkpKV0pCisJKHBhcmFsbGVsIFsoc2V0 IChjYykgKGNvbXBhcmUgKHJlZywgIDEpKQorCQkgICAoc2V0IChyZWcpIChwbHVzIChyZWcpIChj b25zdF9pbnQgLTEpKSkKKwkJICAgKHNldCAocGMpIChpZl90aGVuX2Vsc2UgKE5FID09IGNjKQor CQkJCQkgICAobGFiZWxfcmVmIChsYWJlbCkpCisJCQkJCSAgIChwYykpKSldKQogCi0gICAgICAg IFNvIHdlIHJldHVybiB0aGUgc2Vjb25kIGZvcm0gaW5zdGVhZCBmb3IgdGhlIHR3byBjYXNlcy4K KwlTbyB3ZSByZXR1cm4gdGhlIHNlY29uZCBmb3JtIGluc3RlYWQgZm9yIHRoZSB0d28gY2FzZXMu CiAKICAgICAgKi8KLSAgICAgICAgY29uZGl0aW9uID0gZ2VuX3J0eF9mbXRfZWUgKE5FLCBWT0lE bW9kZSwgaW5jX3NyYywgY29uc3QxX3J0eCk7CisJY29uZGl0aW9uID0gZ2VuX3J0eF9mbXRfZWUg KE5FLCBWT0lEbW9kZSwgaW5jX3NyYywgY29uc3QxX3J0eCk7CiAKICAgICByZXR1cm4gY29uZGl0 aW9uOwotICAgfQorICAgIH0KIAogICAvKiA/Pz8gSWYgYSBtYWNoaW5lIHVzZXMgYSBmdW5ueSBj b21wYXJpc29uLCB3ZSBjb3VsZCByZXR1cm4gYQogICAgICBjYW5vbmljYWxpemVkIGZvcm0gaGVy ZS4gICovCkBAIC01MDcsNiArNTM1LDExIEBAIGRvbG9vcF9tb2RpZnkgKGNsYXNzIGxvb3AgKmxv b3AsIGNsYXNzIG5pdGVyX2Rlc2MgKmRlc2MsCiAJbm9ubmVnID0gMTsKICAgICAgIGJyZWFrOwog CisgICAgY2FzZSBHVFU6CisgICAgICAvKiBUaGUgaXRlcmF0aW9uIGNvdW50IGRvZXMgbm90IG5l ZWQgaW5jcmVtZW50aW5nIGZvciBhIEdUVSB0ZXN0LiAgKi8KKyAgICAgIGluY3JlbWVudF9jb3Vu dCA9IGZhbHNlOworICAgICAgYnJlYWs7CisKICAgICAgIC8qIEFib3J0IGlmIGFuIGludmFsaWQg ZG9sb29wIHBhdHRlcm4gaGFzIGJlZW4gZ2VuZXJhdGVkLiAgKi8KICAgICBkZWZhdWx0OgogICAg ICAgZ2NjX3VucmVhY2hhYmxlICgpOwpAQCAtNTI5LDYgKzU2MiwxMCBAQCBkb2xvb3BfbW9kaWZ5 IChjbGFzcyBsb29wICpsb29wLCBjbGFzcyBuaXRlcl9kZXNjICpkZXNjLAogCiAgIGlmIChkZXNj LT5ub2xvb3BfYXNzdW1wdGlvbnMpCiAgICAgeworICAgICAgLyogVGhlIEdUVSBjYXNlIGhhcyBv bmx5IGJlZW4gaW1wbGVtZW50ZWQgZm9yIHRoZSBBUk0gdGFyZ2V0LCB3aGVyZQorCSBub2xvb3Bf YXNzdW1wdGlvbnMgZ2V0cyBleHBsaWNpdGx5IHNldCB0byBOVUxMIGZvciB0aGF0IGNhc2UsIHNv CisJIGFzc2VydCBoZXJlIGZvciBzYWZldHkuICAqLworICAgICAgZ2NjX2Fzc2VydCAoR0VUX0NP REUgKGNvbmRpdGlvbikgIT0gR1RVKTsKICAgICAgIHJ0eCBhc3MgPSBjb3B5X3J0eCAoZGVzYy0+ bm9sb29wX2Fzc3VtcHRpb25zKTsKICAgICAgIGJhc2ljX2Jsb2NrIHByZWhlYWRlciA9IGxvb3Bf cHJlaGVhZGVyX2VkZ2UgKGxvb3ApLT5zcmM7CiAgICAgICBiYXNpY19ibG9jayBzZXRfemVybyA9 IHNwbGl0X2VkZ2UgKGxvb3BfcHJlaGVhZGVyX2VkZ2UgKGxvb3ApKTsKQEAgLTY0Miw3ICs2Nzks NyBAQCBkb2xvb3Bfb3B0aW1pemUgKGNsYXNzIGxvb3AgKmxvb3ApCiB7CiAgIHNjYWxhcl9pbnRf bW9kZSBtb2RlOwogICBydHggZG9sb29wX3JlZzsKLSAgcnR4IGNvdW50OworICBydHggY291bnQg PSBOVUxMX1JUWDsKICAgd2lkZXN0X2ludCBpdGVyYXRpb25zLCBpdGVyYXRpb25zX21heDsKICAg cnR4X2NvZGVfbGFiZWwgKnN0YXJ0X2xhYmVsOwogICBydHggY29uZGl0aW9uOwpAQCAtNjg1LDE3 ICs3MjIsNiBAQCBkb2xvb3Bfb3B0aW1pemUgKGNsYXNzIGxvb3AgKmxvb3ApCiAgICAgICByZXR1 cm4gZmFsc2U7CiAgICAgfQogCi0gIG1heF9jb3N0Ci0gICAgPSBDT1NUU19OX0lOU05TIChwYXJh bV9tYXhfaXRlcmF0aW9uc19jb21wdXRhdGlvbl9jb3N0KTsKLSAgaWYgKHNldF9zcmNfY29zdCAo ZGVzYy0+bml0ZXJfZXhwciwgbW9kZSwgb3B0aW1pemVfbG9vcF9mb3Jfc3BlZWRfcCAobG9vcCkp Ci0gICAgICA+IG1heF9jb3N0KQotICAgIHsKLSAgICAgIGlmIChkdW1wX2ZpbGUpCi0JZnByaW50 ZiAoZHVtcF9maWxlLAotCQkgIkRvbG9vcDogbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG9vIGNvc3Rs eSB0byBjb21wdXRlLlxuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCiAgIGlmIChk ZXNjLT5jb25zdF9pdGVyKQogICAgIGl0ZXJhdGlvbnMgPSB3aWRlc3RfaW50Ojpmcm9tIChydHhf bW9kZV90IChkZXNjLT5uaXRlcl9leHByLCBtb2RlKSwKIAkJCQkgICBVTlNJR05FRCk7CkBAIC03 MTYsMTIgKzc0MiwyNSBAQCBkb2xvb3Bfb3B0aW1pemUgKGNsYXNzIGxvb3AgKmxvb3ApCiAKICAg LyogR2VuZXJhdGUgbG9vcGluZyBpbnNuLiAgSWYgdGhlIHBhdHRlcm4gRkFJTHMgdGhlbiBnaXZl IHVwIHRyeWluZwogICAgICB0byBtb2RpZnkgdGhlIGxvb3Agc2luY2UgdGhlcmUgaXMgc29tZSBh c3BlY3QgdGhlIGJhY2stZW5kIGRvZXMKLSAgICAgbm90IGxpa2UuICAqLwotICBjb3VudCA9IGNv cHlfcnR4IChkZXNjLT5uaXRlcl9leHByKTsKKyAgICAgbm90IGxpa2UuICBJZiB0aGlzIHN1Y2Nl ZWRzLCB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IHRoZSBsb29wCisgICAgIGRlc2MtPm5pdGVyX2V4 cHIgaGFzIGJlZW4gYWx0ZXJlZCBieSB0aGUgYmFja2VuZCwgc28gb25seSBleHRyYWN0CisgICAg IHRoYXQgZGF0YSBhZnRlciB0aGUgZ2VuX2RvbG9vcF9lbmQuICAqLwogICBzdGFydF9sYWJlbCA9 IGJsb2NrX2xhYmVsIChkZXNjLT5pbl9lZGdlLT5kZXN0KTsKICAgZG9sb29wX3JlZyA9IGdlbl9y ZWdfcnR4IChtb2RlKTsKICAgcnR4X2luc24gKmRvbG9vcF9zZXEgPSB0YXJnZXRtLmdlbl9kb2xv b3BfZW5kIChkb2xvb3BfcmVnLCBzdGFydF9sYWJlbCk7CiAKKyAgbWF4X2Nvc3QKKyAgICA9IENP U1RTX05fSU5TTlMgKHBhcmFtX21heF9pdGVyYXRpb25zX2NvbXB1dGF0aW9uX2Nvc3QpOworICBp ZiAoc2V0X3NyY19jb3N0IChkZXNjLT5uaXRlcl9leHByLCBtb2RlLCBvcHRpbWl6ZV9sb29wX2Zv cl9zcGVlZF9wIChsb29wKSkKKyAgICAgID4gbWF4X2Nvc3QpCisgICAgeworICAgICAgaWYgKGR1 bXBfZmlsZSkKKwlmcHJpbnRmIChkdW1wX2ZpbGUsCisJCSAiRG9sb29wOiBudW1iZXIgb2YgaXRl cmF0aW9ucyB0b28gY29zdGx5IHRvIGNvbXB1dGUuXG4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsK KyAgICB9CisKKyAgY291bnQgPSBjb3B5X3J0eCAoZGVzYy0+bml0ZXJfZXhwcik7CiAgIHdvcmRf bW9kZV9zaXplID0gR0VUX01PREVfUFJFQ0lTSU9OICh3b3JkX21vZGUpOwogICB3b3JkX21vZGVf bWF4ID0gKEhPU1RfV0lERV9JTlRfMVUgPDwgKHdvcmRfbW9kZV9zaXplIC0gMSkgPDwgMSkgLSAx OwogICBpZiAoISBkb2xvb3Bfc2VxCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJn ZXQvYXJtL2xvYi5oIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9sb2IuaAppbmRleCBm ZWFhZTdjYzg5OTU5YjMxNDczNjg5ODAxMjA3MDBiYmMzZTg1ZWNiLi4zOTQxZmU3YThiNjIwZTYy YTVmNzQyNzIyYmUxYmEyZDAzMWY1YThkIDEwMDY0NAotLS0gYS9nY2MvdGVzdHN1aXRlL2djYy50 YXJnZXQvYXJtL2xvYi5oCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbG9iLmgK QEAgLTEsMTUgKzEsMTMxIEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0KKyNpbmNsdWRlIDxzdGRp bnQuaD4KIC8qIENvbW1vbiBjb2RlIGZvciBsb2IgdGVzdHMuICAqLwogCiAjZGVmaW5lIE5PX0xP QiBhc20gdm9sYXRpbGUgKCJAIGNsb2JiZXIgbHIiIDogOiA6ICJsciIgKQogCi0jZGVmaW5lIE4g MTAwMDAKKyNkZWZpbmUgTiAxMDAKKworc3RhdGljIHZvaWQKK3Jlc2V0X2RhdGEgKGludCAqYSwg aW50ICpiLCBpbnQgKmMsIGludCB4KQoreworICBtZW1zZXQgKGEsIC0xLCB4ICogc2l6ZW9mICgq YSkpOworICBtZW1zZXQgKGIsIC0xLCB4ICogc2l6ZW9mICgqYikpOworICBtZW1zZXQgKGMsIDAs IHggKiBzaXplb2YgKCpjKSk7Cit9CisKK3N0YXRpYyB2b2lkCityZXNldF9kYXRhOCAoaW50OF90 ICphLCBpbnQ4X3QgKmIsIGludDhfdCAqYywgaW50IHgpCit7CisgIG1lbXNldCAoYSwgLTEsIHgg KiBzaXplb2YgKCphKSk7CisgIG1lbXNldCAoYiwgLTEsIHggKiBzaXplb2YgKCpiKSk7CisgIG1l bXNldCAoYywgMCwgeCAqIHNpemVvZiAoKmMpKTsKK30KKworc3RhdGljIHZvaWQKK3Jlc2V0X2Rh dGExNiAoaW50MTZfdCAqYSwgaW50MTZfdCAqYiwgaW50MTZfdCAqYywgaW50IHgpCit7CisgIG1l bXNldCAoYSwgLTEsIHggKiBzaXplb2YgKCphKSk7CisgIG1lbXNldCAoYiwgLTEsIHggKiBzaXpl b2YgKCpiKSk7CisgIG1lbXNldCAoYywgMCwgeCAqIHNpemVvZiAoKmMpKTsKK30KKworc3RhdGlj IHZvaWQKK3Jlc2V0X2RhdGEzMiAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50MzJfdCAqYywg aW50IHgpCit7CisgIG1lbXNldCAoYSwgLTEsIHggKiBzaXplb2YgKCphKSk7CisgIG1lbXNldCAo YiwgLTEsIHggKiBzaXplb2YgKCpiKSk7CisgIG1lbXNldCAoYywgMCwgeCAqIHNpemVvZiAoKmMp KTsKK30KKworc3RhdGljIHZvaWQKK3Jlc2V0X2RhdGE2NCAoaW50NjRfdCAqYSwgaW50NjRfdCAq YywgaW50IHgpCit7CisgIG1lbXNldCAoYSwgLTEsIHggKiBzaXplb2YgKCphKSk7CisgIG1lbXNl dCAoYywgMCwgeCAqIHNpemVvZiAoKmMpKTsKK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3BsdXMg KGludCAqYSwgaW50ICpiLCBpbnQgKmMsIGludCB4KQoreworICBmb3IgKGludCBpID0gMDsgaSA8 IE47IGkrKykKKyAgICB7CisgICAgICBOT19MT0I7CisgICAgICBpZiAoaSA8IHgpCisJeworCSAg aWYgKGNbaV0gIT0gKGFbaV0gKyBiW2ldKSkgYWJvcnQgKCk7CisJfQorICAgICAgZWxzZQorCXsK KwkgIGlmIChjW2ldICE9IDApIGFib3J0ICgpOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lk CitjaGVja19wbHVzOCAoaW50OF90ICphLCBpbnQ4X3QgKmIsIGludDhfdCAqYywgaW50IHgpCit7 CisgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKQorICAgIHsKKyAgICAgIE5PX0xPQjsKKyAg ICAgIGlmIChpIDwgeCkKKwl7CisJICBpZiAoY1tpXSAhPSAoYVtpXSArIGJbaV0pKSBhYm9ydCAo KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKGNbaV0gIT0gMCkgYWJvcnQgKCk7CisJfQor ICAgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX3BsdXMxNiAoaW50MTZfdCAqYSwgaW50MTZf dCAqYiwgaW50MTZfdCAqYywgaW50IHgpCit7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsr KQorICAgIHsKKyAgICAgIE5PX0xPQjsKKyAgICAgIGlmIChpIDwgeCkKKwl7CisJICBpZiAoY1tp XSAhPSAoYVtpXSArIGJbaV0pKSBhYm9ydCAoKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYg KGNbaV0gIT0gMCkgYWJvcnQgKCk7CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK2NoZWNr X3BsdXMzMiAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50MzJfdCAqYywgaW50IHgpCit7Cisg IGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKQorICAgIHsKKyAgICAgIE5PX0xPQjsKKyAgICAg IGlmIChpIDwgeCkKKwl7CisJICBpZiAoY1tpXSAhPSAoYVtpXSArIGJbaV0pKSBhYm9ydCAoKTsK Kwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKGNbaV0gIT0gMCkgYWJvcnQgKCk7CisJfQorICAg IH0KK30KIAogc3RhdGljIHZvaWQKLXJlc2V0X2RhdGEgKGludCAqYSwgaW50ICpiLCBpbnQgKmMp CitjaGVja19tZW1jcHk2NCAoaW50NjRfdCAqYSwgaW50NjRfdCAqYywgaW50IHgpCiB7Ci0gIG1l bXNldCAoYSwgLTEsIE4gKiBzaXplb2YgKCphKSk7Ci0gIG1lbXNldCAoYiwgLTEsIE4gKiBzaXpl b2YgKCpiKSk7Ci0gIG1lbXNldCAoYywgLTEsIE4gKiBzaXplb2YgKCpjKSk7CisgIGZvciAoaW50 IGkgPSAwOyBpIDwgTjsgaSsrKQorICAgIHsKKyAgICAgIE5PX0xPQjsKKyAgICAgIGlmIChpIDwg eCkKKwl7CisJICBpZiAoY1tpXSAhPSBhW2ldKSBhYm9ydCAoKTsKKwl9CisgICAgICBlbHNlCisJ eworCSAgaWYgKGNbaV0gIT0gMCkgYWJvcnQgKCk7CisJfQorICAgIH0KIH0KZGlmZiAtLWdpdCBh L2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbG9iMS5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2Mu dGFyZ2V0L2FybS9sb2IxLmMKaW5kZXggYmE1YzgyY2Q1NWM1ODJjOTZhMThhZDQxN2EzMDQxZTQz ZDg0MzYxMy4uYzhjZTY1M2E1YzM5ZmIxZmZjZjgyYTZlNTg0ZDlhMDQ2N2ExMzBjMCAxMDA2NDQK LS0tIGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9sb2IxLmMKKysrIGIvZ2NjL3Rlc3Rz dWl0ZS9nY2MudGFyZ2V0L2FybS9sb2IxLmMKQEAgLTU0LDI5ICs1NCwxOCBAQCBsb29wMyAoaW50 ICphLCBpbnQgKmIsIGludCAqYykKICAgICB9IHdoaWxlIChpIDwgTik7CiB9CiAKLXZvaWQKLWNo ZWNrIChpbnQgKmEsIGludCAqYiwgaW50ICpjKQotewotICBmb3IgKGludCBpID0gMDsgaSA8IE47 IGkrKykKLSAgICB7Ci0gICAgICBOT19MT0I7Ci0gICAgICBpZiAoY1tpXSAhPSBhW2ldICsgYltp XSkKLQlhYm9ydCAoKTsKLSAgICB9Ci19Ci0KIGludAogbWFpbiAodm9pZCkKIHsKLSAgcmVzZXRf ZGF0YSAoYSwgYiwgYyk7CisgIHJlc2V0X2RhdGEgKGEsIGIsIGMsIE4pOwogICBsb29wMSAoYSwg YiAsYyk7Ci0gIGNoZWNrIChhLCBiICxjKTsKLSAgcmVzZXRfZGF0YSAoYSwgYiwgYyk7CisgIGNo ZWNrX3BsdXMgKGEsIGIsIGMsIE4pOworICByZXNldF9kYXRhIChhLCBiLCBjLCBOKTsKICAgbG9v cDIgKGEsIGIgLGMpOwotICBjaGVjayAoYSwgYiAsYyk7Ci0gIHJlc2V0X2RhdGEgKGEsIGIsIGMp OworICBjaGVja19wbHVzIChhLCBiLCBjLCBOKTsKKyAgcmVzZXRfZGF0YSAoYSwgYiwgYywgTik7 CiAgIGxvb3AzIChhLCBiICxjKTsKLSAgY2hlY2sgKGEsIGIgLGMpOworICBjaGVja19wbHVzIChh LCBiLCBjLCBOKTsKIAogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUv Z2NjLnRhcmdldC9hcm0vbG9iNi5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9sb2I2 LmMKaW5kZXggMTdiNjEyNDI5NWU4YWU5ZTFjYjU3ZTQxZmE0M2E5NTRiMzM5MGVlYy4uNGZlMTE2 ZTJjMmJlMzc0OGQxYmI2ZGE3YmI5MDkyZGI4Zjk2MmFiYyAxMDA2NDQKLS0tIGEvZ2NjL3Rlc3Rz dWl0ZS9nY2MudGFyZ2V0L2FybS9sb2I2LmMKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L2FybS9sb2I2LmMKQEAgLTc5LDE0ICs3OSwxNCBAQCBjaGVjayAodm9pZCkKIGludAogbWFpbiAo dm9pZCkKIHsKLSAgcmVzZXRfZGF0YSAoYTEsIGIxLCBjMSk7Ci0gIHJlc2V0X2RhdGEgKGEyLCBi MiwgYzIpOworICByZXNldF9kYXRhIChhMSwgYjEsIGMxLCBOKTsKKyAgcmVzZXRfZGF0YSAoYTIs IGIyLCBjMiwgTik7CiAgIGxvb3AxIChhMSwgYjEsIGMxKTsKICAgcmVmMSAoYTIsIGIyLCBjMik7 CiAgIGNoZWNrICgpOwogCi0gIHJlc2V0X2RhdGEgKGExLCBiMSwgYzEpOwotICByZXNldF9kYXRh IChhMiwgYjIsIGMyKTsKKyAgcmVzZXRfZGF0YSAoYTEsIGIxLCBjMSwgTik7CisgIHJlc2V0X2Rh dGEgKGEyLCBiMiwgYzIsIE4pOwogICBsb29wMiAoYTEsIGIxLCBjMSk7CiAgIHJlZjIgKGEyLCBi MiwgYzIpOwogICBjaGVjayAoKTsKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdl dC9hcm0vbXZlL2Rsc3RwLWNvbXBpbGUtYXNtLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQv YXJtL212ZS9kbHN0cC1jb21waWxlLWFzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjVkZGQ5OTRlNTNkNTVjN2I0 ZDA1YmZiODU4ZTYwNzhjZTdkYTRjZTQKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRl L2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1jb21waWxlLWFzbS5jCkBAIC0wLDAgKzEsNTYxIEBA CisvKiB7IGRnLWRvIGNvbXBpbGUgeyB0YXJnZXQgeyBhcm0qLSotKiB9IH0gfSAqLworLyogeyBk Zy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgYXJtX3Y4XzFtX212ZV9vayB9ICovCisvKiB7IGRn LW9wdGlvbnMgIi1PMyAtc2F2ZS10ZW1wcyIgfSAqLworLyogeyBkZy1hZGQtb3B0aW9ucyBhcm1f djhfMW1fbXZlIH0gKi8KKworI2luY2x1ZGUgPGFybV9tdmUuaD4KKworI2RlZmluZSBJTU0gNQor CisjZGVmaW5lIFRFU1RfQ09NUElMRV9JTl9ETFNUUF9URVJOQVJZKEJJVFMsIExBTkVTLCBMRFJT VFJZVFBFLCBUWVBFLCBTSUdOLCBOQU1FLCBQUkVEKQkJCQlcCit2b2lkIHRlc3RfIyNOQU1FIyNQ UkVEIyNfIyNTSUdOIyNCSVRTIChUWVBFIyNCSVRTIyNfdCAqYSwgVFlQRSMjQklUUyMjX3QgKmIs ICBUWVBFIyNCSVRTIyNfdCAqYywgaW50IG4pCVwKK3sJCQkJCQkJCQkJCVwKKyAgd2hpbGUgKG4g PiAwKQkJCQkJCQkJCQlcCisgICAgewkJCQkJCQkJCQkJXAorICAgICAgbXZlX3ByZWQxNl90IHAg PSB2Y3RwIyNCSVRTIyNxIChuKTsJCQkJCQlcCisgICAgICBUWVBFIyNCSVRTIyN4IyNMQU5FUyMj X3QgdmEgPSB2bGRyIyNMRFJTVFJZVFBFIyNxX3pfIyNTSUdOIyNCSVRTIChhLCBwKTsJCVwKKyAg ICAgIFRZUEUjI0JJVFMjI3gjI0xBTkVTIyNfdCB2YiA9IHZsZHIjI0xEUlNUUllUUEUjI3Ffel8j I1NJR04jI0JJVFMgKGIsIHApOwkJXAorICAgICAgVFlQRSMjQklUUyMjeCMjTEFORVMjI190IHZj ID0gTkFNRSMjUFJFRCMjXyMjU0lHTiMjQklUUyAodmEsIHZiLCBwKTsJCVwKKyAgICAgIHZzdHIj I0xEUlNUUllUUEUjI3FfcF8jI1NJR04jI0JJVFMgKGMsIHZjLCBwKTsJCQkJCVwKKyAgICAgIGMg Kz0gTEFORVM7CQkJCQkJCQkJXAorICAgICAgYSArPSBMQU5FUzsJCQkJCQkJCQlcCisgICAgICBi ICs9IExBTkVTOwkJCQkJCQkJCVwKKyAgICAgIG4gLT0gTEFORVM7CQkJCQkJCQkJXAorICAgIH0J CQkJCQkJCQkJCVwKK30KKworI2RlZmluZSBURVNUX0NPTVBJTEVfSU5fRExTVFBfU0lHTkVEX1VO U0lHTkVEX1RFUk5BUlkoQklUUywgTEFORVMsIExEUlNUUllUUEUsIE5BTUUsIFBSRUQpCVwKK1RF U1RfQ09NUElMRV9JTl9ETFNUUF9URVJOQVJZIChCSVRTLCBMQU5FUywgTERSU1RSWVRQRSwgaW50 LCBzLCBOQU1FLCBQUkVEKQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9URVJOQVJZIChCSVRT LCBMQU5FUywgTERSU1RSWVRQRSwgdWludCwgdSwgTkFNRSwgUFJFRCkKKworI2RlZmluZSBURVNU X0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWShOQU1FLCBQ UkVEKQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVSTkFSWSAo OCwgMTYsIGIsIE5BTUUsIFBSRUQpCQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURf VU5TSUdORURfVEVSTkFSWSAoMTYsIDgsIGgsIE5BTUUsIFBSRUQpCQkJCVwKK1RFU1RfQ09NUElM RV9JTl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVSTkFSWSAoMzIsIDQsIHcsIE5BTUUsIFBSRUQp CisKKworVEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5B UlkgKHZhZGRxLCBfeCkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJ R05FRF9URVJOQVJZICh2bXVscSwgX3gpCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19T SUdORURfVU5TSUdORURfVEVSTkFSWSAodnN1YnEsIF94KQorVEVTVF9DT01QSUxFX0lOX0RMU1RQ X0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUlkgKHZoYWRkcSwgX3gpCitURVNUX0NPTVBJ TEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWSAodm9ycnEsIF94KQor CisKKyNkZWZpbmUgVEVTVF9DT01QSUxFX0lOX0RMU1RQX1RFUk5BUllfTShCSVRTLCBMQU5FUywg TERSU1RSWVRQRSwgVFlQRSwgU0lHTiwgTkFNRSwgUFJFRCkJCQkJXAordm9pZCB0ZXN0XyMjTkFN RSMjUFJFRCMjXyMjU0lHTiMjQklUUyAoVFlQRSMjQklUUyMjeCMjTEFORVMjI190IF9faW5hY3Rp dmUsIFRZUEUjI0JJVFMjI190ICphLCBUWVBFIyNCSVRTIyNfdCAqYiwgIFRZUEUjI0JJVFMjI190 ICpjLCBpbnQgbikJXAorewkJCQkJCQkJCQkJXAorICB3aGlsZSAobiA+IDApCQkJCQkJCQkJCVwK KyAgICB7CQkJCQkJCQkJCQlcCisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAjI0JJVFMjI3Eg KG4pOwkJCQkJCVwKKyAgICAgIFRZUEUjI0JJVFMjI3gjI0xBTkVTIyNfdCB2YSA9IHZsZHIjI0xE UlNUUllUUEUjI3Ffel8jI1NJR04jI0JJVFMgKGEsIHApOwkJXAorICAgICAgVFlQRSMjQklUUyMj eCMjTEFORVMjI190IHZiID0gdmxkciMjTERSU1RSWVRQRSMjcV96XyMjU0lHTiMjQklUUyAoYiwg cCk7CQlcCisgICAgICBUWVBFIyNCSVRTIyN4IyNMQU5FUyMjX3QgdmMgPSBOQU1FIyNQUkVEIyNf IyNTSUdOIyNCSVRTIChfX2luYWN0aXZlLCB2YSwgdmIsIHApOwkJXAorICAgICAgdnN0ciMjTERS U1RSWVRQRSMjcV9wXyMjU0lHTiMjQklUUyAoYywgdmMsIHApOwkJCQkJXAorICAgICAgYyArPSBM QU5FUzsJCQkJCQkJCQlcCisgICAgICBhICs9IExBTkVTOwkJCQkJCQkJCVwKKyAgICAgIGIgKz0g TEFORVM7CQkJCQkJCQkJXAorICAgICAgbiAtPSBMQU5FUzsJCQkJCQkJCQlcCisgICAgfQkJCQkJ CQkJCQkJXAorfQorCisjZGVmaW5lIFRFU1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURfVU5TSUdO RURfVEVSTkFSWV9NKEJJVFMsIExBTkVTLCBMRFJTVFJZVFBFLCBOQU1FLCBQUkVEKQlcCitURVNU X0NPTVBJTEVfSU5fRExTVFBfVEVSTkFSWV9NIChCSVRTLCBMQU5FUywgTERSU1RSWVRQRSwgaW50 LCBzLCBOQU1FLCBQUkVEKQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9URVJOQVJZX00gKEJJ VFMsIExBTkVTLCBMRFJTVFJZVFBFLCB1aW50LCB1LCBOQU1FLCBQUkVEKQorCisjZGVmaW5lIFRF U1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX00oTkFN RSwgUFJFRCkJCQlcCitURVNUX0NPTVBJTEVfSU5fRExTVFBfU0lHTkVEX1VOU0lHTkVEX1RFUk5B UllfTSAoOCwgMTYsIGIsIE5BTUUsIFBSRUQpCQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9T SUdORURfVU5TSUdORURfVEVSTkFSWV9NICgxNiwgOCwgaCwgTkFNRSwgUFJFRCkJCQkJXAorVEVT VF9DT01QSUxFX0lOX0RMU1RQX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX00gKDMyLCA0LCB3LCBO QU1FLCBQUkVEKQorCisKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJ R05FRF9URVJOQVJZX00gKHZhZGRxLCBfbSkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRT X1NJR05FRF9VTlNJR05FRF9URVJOQVJZX00gKHZtdWxxLCBfbSkKK1RFU1RfQ09NUElMRV9JTl9E TFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX00gKHZzdWJxLCBfbSkKK1RFU1Rf Q09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX00gKHZoYWRk cSwgX20pCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVS TkFSWV9NICh2b3JycSwgX20pCisKKyNkZWZpbmUgVEVTVF9DT01QSUxFX0lOX0RMU1RQX1RFUk5B UllfTihCSVRTLCBMQU5FUywgTERSU1RSWVRQRSwgVFlQRSwgU0lHTiwgTkFNRSwgUFJFRCkJXAor dm9pZCB0ZXN0XyMjTkFNRSMjUFJFRCMjX25fIyNTSUdOIyNCSVRTIChUWVBFIyNCSVRTIyNfdCAq YSwgIFRZUEUjI0JJVFMjI190ICpjLCBpbnQgbikJXAorewkJCQkJCQkJCQkJXAorICB3aGlsZSAo biA+IDApCQkJCQkJCQkJCVwKKyAgICB7CQkJCQkJCQkJCQlcCisgICAgICBtdmVfcHJlZDE2X3Qg cCA9IHZjdHAjI0JJVFMjI3EgKG4pOwkJCQkJCVwKKyAgICAgIFRZUEUjI0JJVFMjI3gjI0xBTkVT IyNfdCB2YSA9IHZsZHIjI0xEUlNUUllUUEUjI3Ffel8jI1NJR04jI0JJVFMgKGEsIHApOwkJXAor ICAgICAgVFlQRSMjQklUUyMjeCMjTEFORVMjI190IHZjID0gTkFNRSMjUFJFRCMjX25fIyNTSUdO IyNCSVRTICh2YSwgSU1NLCBwKTsJCVwKKyAgICAgIHZzdHIjI0xEUlNUUllUUEUjI3FfcF8jI1NJ R04jI0JJVFMgKGMsIHZjLCBwKTsJCQkJCVwKKyAgICAgIGMgKz0gTEFORVM7CQkJCQkJCQkJXAor ICAgICAgYSArPSBMQU5FUzsJCQkJCQkJCQlcCisgICAgICBuIC09IExBTkVTOwkJCQkJCQkJCVwK KyAgICB9CQkJCQkJCQkJCQlcCit9CisKKyNkZWZpbmUgVEVTVF9DT01QSUxFX0lOX0RMU1RQX1NJ R05FRF9VTlNJR05FRF9URVJOQVJZX04oQklUUywgTEFORVMsIExEUlNUUllUUEUsIE5BTUUsIFBS RUQpCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9URVJOQVJZX04gKEJJVFMsIExBTkVTLCBMRFJT VFJZVFBFLCBpbnQsIHMsIE5BTUUsIFBSRUQpCQkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1RF Uk5BUllfTiAoQklUUywgTEFORVMsIExEUlNUUllUUEUsIHVpbnQsIHUsIE5BTUUsIFBSRUQpCisK KyNkZWZpbmUgVEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RF Uk5BUllfTihOQU1FLCBQUkVEKQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURfVU5T SUdORURfVEVSTkFSWV9OICg4LCAxNiwgYiwgTkFNRSwgUFJFRCkJCQkJXAorVEVTVF9DT01QSUxF X0lOX0RMU1RQX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX04gKDE2LCA4LCBoLCBOQU1FLCBQUkVE KQkJCQlcCitURVNUX0NPTVBJTEVfSU5fRExTVFBfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTiAo MzIsIDQsIHcsIE5BTUUsIFBSRUQpCisKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJ R05FRF9VTlNJR05FRF9URVJOQVJZX04gKHZhZGRxLCBfeCkKK1RFU1RfQ09NUElMRV9JTl9ETFNU UF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX04gKHZtdWxxLCBfeCkKK1RFU1RfQ09N UElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX04gKHZzdWJxLCBf eCkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZ X04gKHZoYWRkcSwgX3gpCisKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9V TlNJR05FRF9URVJOQVJZX04gKHZicnNycSwgX3gpCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5U QklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWV9OICh2c2hscSwgX3gpCitURVNUX0NPTVBJTEVf SU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWV9OICh2c2hycSwgX3gpCisK KyNkZWZpbmUgVEVTVF9DT01QSUxFX0lOX0RMU1RQX1RFUk5BUllfTV9OKEJJVFMsIExBTkVTLCBM RFJTVFJZVFBFLCBUWVBFLCBTSUdOLCBOQU1FLCBQUkVEKQlcCit2b2lkIHRlc3RfIyNOQU1FIyNQ UkVEIyNfbl8jI1NJR04jI0JJVFMgKFRZUEUjI0JJVFMjI3gjI0xBTkVTIyNfdCBfX2luYWN0aXZl LCBUWVBFIyNCSVRTIyNfdCAqYSwgIFRZUEUjI0JJVFMjI190ICpjLCBpbnQgbikJXAorewkJCQkJ CQkJCQkJXAorICB3aGlsZSAobiA+IDApCQkJCQkJCQkJCVwKKyAgICB7CQkJCQkJCQkJCQlcCisg ICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAjI0JJVFMjI3EgKG4pOwkJCQkJCVwKKyAgICAgIFRZ UEUjI0JJVFMjI3gjI0xBTkVTIyNfdCB2YSA9IHZsZHIjI0xEUlNUUllUUEUjI3Ffel8jI1NJR04j I0JJVFMgKGEsIHApOwkJXAorICAgICAgVFlQRSMjQklUUyMjeCMjTEFORVMjI190IHZjID0gTkFN RSMjUFJFRCMjX25fIyNTSUdOIyNCSVRTIChfX2luYWN0aXZlLCB2YSwgSU1NLCBwKTsJCVwKKyAg ICAgIHZzdHIjI0xEUlNUUllUUEUjI3FfcF8jI1NJR04jI0JJVFMgKGMsIHZjLCBwKTsJCQkJCVwK KyAgICAgIGMgKz0gTEFORVM7CQkJCQkJCQkJXAorICAgICAgYSArPSBMQU5FUzsJCQkJCQkJCQlc CisgICAgICBuIC09IExBTkVTOwkJCQkJCQkJCVwKKyAgICB9CQkJCQkJCQkJCQlcCit9CisKKyNk ZWZpbmUgVEVTVF9DT01QSUxFX0lOX0RMU1RQX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX01fTihC SVRTLCBMQU5FUywgTERSU1RSWVRQRSwgTkFNRSwgUFJFRCkJXAorVEVTVF9DT01QSUxFX0lOX0RM U1RQX1RFUk5BUllfTV9OIChCSVRTLCBMQU5FUywgTERSU1RSWVRQRSwgaW50LCBzLCBOQU1FLCBQ UkVEKQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9URVJOQVJZX01fTiAoQklUUywgTEFORVMs IExEUlNUUllUUEUsIHVpbnQsIHUsIE5BTUUsIFBSRUQpCisKKyNkZWZpbmUgVEVTVF9DT01QSUxF X0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTV9OKE5BTUUsIFBSRUQp CQkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX01fTiAo OCwgMTYsIGIsIE5BTUUsIFBSRUQpCQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURf VU5TSUdORURfVEVSTkFSWV9NX04gKDE2LCA4LCBoLCBOQU1FLCBQUkVEKQkJCQlcCitURVNUX0NP TVBJTEVfSU5fRExTVFBfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTV9OICgzMiwgNCwgdywgTkFN RSwgUFJFRCkKKworVEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVE X1RFUk5BUllfTV9OICh2YWRkcSwgX20pCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19T SUdORURfVU5TSUdORURfVEVSTkFSWV9NX04gKHZtdWxxLCBfbSkKK1RFU1RfQ09NUElMRV9JTl9E TFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX01fTiAodnN1YnEsIF9tKQorVEVT VF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTV9OICh2 aGFkZHEsIF9tKQorCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdO RURfVEVSTkFSWV9NX04gKHZicnNycSwgX20pCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklU U19TSUdORURfVU5TSUdORURfVEVSTkFSWV9NX04gKHZzaGxxLCBfbSkKK1RFU1RfQ09NUElMRV9J Tl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX01fTiAodnNocnEsIF9tKQor CisvKiBOb3cgdGVzdCBzb21lIG1vcmUgY29uZmlndXJhdGlvbnMuICAqLworCisvKiBVc2luZyBh ID49MSBjb25kaXRpb24uICAqLwordm9pZCB0ZXN0MSAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwg aW50MzJfdCAqYywgaW50IG4pCit7CisgIHdoaWxlIChuID49IDEpCisgICAgeworICAgICAgbXZl X3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96 X3MzMiAoYSwgcCk7CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRyd3Ffel9zMzIgKGIsIHApOwor ICAgICAgaW50MzJ4NF90IHZjID0gdmFkZHFfeF9zMzIgKHZhLCB2YiwgcCk7CisgICAgICB2c3Ry d3FfcF9zMzIgKGMsIHZjLCBwKTsKKyAgICAgIGMrPTQ7CisgICAgICBhKz00OworICAgICAgYis9 NDsKKyAgICAgIG4tPTQ7CisgICAgfQorfQorCisvKiBUZXN0IGEgZm9yIGxvb3AgZm9ybWF0IG9m IGRlY3JlbWVudGluZyB0byB6ZXJvICovCitpbnQzMl90IGFbXSA9IHswLCAxLCAyLCAzLCA0LCA1 LCA2LCA3fTsKK3ZvaWQgdGVzdDIgKGludDMyX3QgKmIsIGludCBudW1fZWxlbXMpCit7CisgICAg Zm9yIChpbnQgaSA9IG51bV9lbGVtczsgaSA+IDA7IGktPSA0KQorICAgIHsKKyAgICAgICAgbXZl X3ByZWQxNl90IHAgPSB2Y3RwMzJxIChpKTsKKyAgICAgICAgaW50MzJ4NF90IHZhID0gdmxkcndx X3pfczMyICgmKGFbaV0pLCBwKTsKKyAgICAgICAgdnN0cndxX3BfczMyIChiICsgaSwgdmEsIHAp OworICAgIH0KK30KKworLyogSXRlcmF0aW9uIGNvdW50ZXIgY291bnRpbmcgdXAgdG8gbnVtX2l0 ZXIuICAqLwordm9pZCB0ZXN0MyAodWludDhfdCAqYSwgdWludDhfdCAqYiwgdWludDhfdCAqYywg aW50IG4pCit7CisgICAgaW50IG51bV9pdGVyID0gKG4gKyAxNSkvMTY7CisgICAgZm9yIChpbnQg aSA9IDA7IGkgPCBudW1faXRlcjsgaSsrKQorICAgIHsKKyAgICAgICAgbXZlX3ByZWQxNl90IHAg PSB2Y3RwOHEgKG4pOworICAgICAgICB1aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTggKGEsIHAp OworICAgICAgICB1aW50OHgxNl90IHZiID0gdmxkcmJxX3pfdTggKGIsIHApOworICAgICAgICB1 aW50OHgxNl90IHZjID0gdmFkZHFfeF91OCAodmEsIHZiLCBwKTsKKyAgICAgICAgdnN0cmJxX3Bf dTggKGMsIHZjLCBwKTsKKyAgICAgICAgbi09MTY7CisgICAgfQorfQorCisvKiBJdGVyYXRpb24g Y291bnRlciBjb3VudGluZyBkb3duIGZyb20gbnVtX2l0ZXIuICAqLwordm9pZCB0ZXN0NCAodWlu dDhfdCAqYSwgdWludDhfdCAqYiwgdWludDhfdCAqYywgaW50IG4pCit7CisgICAgaW50IG51bV9p dGVyID0gKG4gKyAxNSkvMTY7CisgICAgZm9yIChpbnQgaSA9IG51bV9pdGVyOyBpID4gMDsgaS0t KQorICAgIHsKKyAgICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwOHEgKG4pOworICAgICAgICB1 aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTggKGEsIHApOworICAgICAgICB1aW50OHgxNl90IHZi ID0gdmxkcmJxX3pfdTggKGIsIHApOworICAgICAgICB1aW50OHgxNl90IHZjID0gdmFkZHFfeF91 OCAodmEsIHZiLCBwKTsKKyAgICAgICAgdnN0cmJxX3BfdTggKGMsIHZjLCBwKTsKKyAgICAgICAg bi09MTY7CisgICAgfQorfQorCisvKiBVc2luZyBhbiB1bnByZWRpY2F0ZWQgYXJpdGhtZXRpYyBp bnN0cnVjdGlvbiB3aXRoaW4gdGhlIGxvb3AuICAqLwordm9pZCB0ZXN0NSAodWludDhfdCAqYSwg dWludDhfdCAqYiwgdWludDhfdCAqYywgIHVpbnQ4X3QgKmQsIGludCBuKQoreworICAgIHdoaWxl IChuID4gMCkKKyAgICB7CisgICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAg ICAgICAgdWludDh4MTZfdCB2YSA9IHZsZHJicV96X3U4IChhLCBwKTsKKyAgICAgICAgdWludDh4 MTZfdCB2YiA9IHZsZHJicV91OCAoYik7CisJLyogSXMgYWZmZWN0ZWQgYnkgaW1wbGljaXQgcHJl ZGljYXRpb24sIGJlY2F1c2UgdmIgYWxzbworCWNhbWUgZnJvbSBhbiB1bnByZWRpY2F0ZWQgbG9h ZCwgYnV0IHRoZXJlIGlzIG5vIGZ1bmN0aW9uYWwKKwlwcm9ibGVtLCBiZWNhdXNlIHRoZSByZXN1 bHQgaXMgdXNlZCBpbiBhIHByZWRpY2F0ZWQgc3RvcmUuICAqLyAKKyAgICAgICAgdWludDh4MTZf dCB2YyA9IHZhZGRxX3U4ICh2YSwgdmIpOworICAgICAgICB1aW50OHgxNl90IHZkID0gdmFkZHFf eF91OCAodmEsIHZiLCBwKTsKKyAgICAgICAgdnN0cmJxX3BfdTggKGMsIHZjLCBwKTsKKyAgICAg ICAgdnN0cmJxX3BfdTggKGQsIHZkLCBwKTsKKyAgICAgICAgbi09MTY7CisgICAgfQorfQorCisv KiBVc2luZyBhIGRpZmZlcmVudCBWUFIgdmFsdWUgZm9yIG9uZSBpbnN0cnVjdGlvbiBpbiB0aGUg bG9vcC4gICovCit2b2lkIHRlc3Q2IChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90ICpj LCBpbnQgbiwgbXZlX3ByZWQxNl90IHAxKQoreworICB3aGlsZSAobiA+IDApCisgICAgeworICAg ICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZs ZHJ3cV96X3MzMiAoYSwgcCk7CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRyd3Ffel9zMzIgKGIs IHAxKTsKKyAgICAgIGludDMyeDRfdCB2YyA9IHZhZGRxX3hfczMyICh2YSwgdmIsIHApOworICAg ICAgdnN0cndxX3BfczMyIChjLCB2YywgcCk7CisgICAgICBjICs9IDQ7CisgICAgICBhICs9IDQ7 CisgICAgICBiICs9IDQ7CisgICAgICBuIC09IDQ7CisgICAgfQorfQorCisvKiBHZW5lcmF0aW5n IGFuZCB1c2luZyBhbm90aGVyIFZQUiB2YWx1ZSBpbiB0aGUgbG9vcCwgd2l0aCBhIHZjdHAuCisg ICBUaGUgZG9sb29wIGxvZ2ljIHdpbGwgYWx3YXlzIHRyeSB0byBkbyB0aGUgdHJhbnNmb3JtIG9u IHRoZSBmaXJzdAorICAgdmN0cCBpdCBlbmNvdW50ZXJzLCBzbyB0aGlzIGlzIHN0aWxsIGV4cGVj dGVkIHRvIHdvcmsuICAqLwordm9pZCB0ZXN0NyAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50 MzJfdCAqYywgaW50IG4sIGludCBnKQoreworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAg bXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3 cV96X3MzMiAoYSwgcCk7CisgICAgICBtdmVfcHJlZDE2X3QgcDEgPSB2Y3RwMzJxIChnKTsKKyAg ICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3cV96X3MzMiAoYiwgcDEpOworICAgICAgaW50MzJ4NF90 IHZjID0gdmFkZHFfeF9zMzIgKHZhLCB2YiwgcCk7CisgICAgICB2c3Ryd3FfcF9zMzIgKGMsIHZj LCBwKTsKKyAgICAgIGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIgKz0gNDsKKyAgICAg IG4gLT0gNDsKKyAgICB9Cit9CisKKy8qIEdlbmVyYXRpbmcgYW5kIHVzaW5nIGEgZGlmZmVyZW50 IFZQUiB2YWx1ZSBpbiB0aGUgbG9vcCwgd2l0aCBhIHZjdHAsCisgICBidXQgdGhpcyB0aW1lIHRo ZSBwMSB3aWxsIGFsc28gY2hhbmdlIGluIGV2ZXJ5IGxvb3AgKHN0aWxsIGZpbmUpICAqLwordm9p ZCB0ZXN0OCAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50MzJfdCAqYywgaW50IG4sIGludCBn KQoreworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3Rw MzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7CisgICAg ICBtdmVfcHJlZDE2X3QgcDEgPSB2Y3RwMzJxIChnKTsKKyAgICAgIGludDMyeDRfdCB2YiA9IHZs ZHJ3cV96X3MzMiAoYiwgcDEpOworICAgICAgaW50MzJ4NF90IHZjID0gdmFkZHFfeF9zMzIgKHZh LCB2YiwgcCk7CisgICAgICB2c3Ryd3FfcF9zMzIgKGMsIHZjLCBwKTsKKyAgICAgIGMgKz0gNDsK KyAgICAgIGEgKz0gNDsKKyAgICAgIGIgKz0gNDsKKyAgICAgIG4gLT0gNDsKKyAgICAgIGcrKzsK KyAgICB9Cit9CisKKy8qIEdlbmVyYXRpbmcgYW5kIHVzaW5nIGEgZGlmZmVyZW50IFZQUiB2YWx1 ZSBpbiB0aGUgbG9vcCwgd2l0aCBhIHZjdHBfbQorICAgdGhhdCBpcyBpbmRlcGVuZGVudCBvZiB0 aGUgbG9vcCB2Y3RwIFZQUi4gICovCit2b2lkIHRlc3Q5IChpbnQzMl90ICphLCBpbnQzMl90ICpi LCBpbnQzMl90ICpjLCBpbnQgbiwgbXZlX3ByZWQxNl90IHAxKQoreworICB3aGlsZSAobiA+IDAp CisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMy eDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7CisgICAgICBtdmVfcHJlZDE2X3QgcDIgPSB2 Y3RwMzJxX20gKG4sIHAxKTsKKyAgICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3cV96X3MzMiAoYiwg cDEpOworICAgICAgaW50MzJ4NF90IHZjID0gdmFkZHFfeF9zMzIgKHZhLCB2YiwgcDIpOworICAg ICAgdnN0cndxX3BfczMyIChjLCB2YywgcCk7CisgICAgICBjICs9IDQ7CisgICAgICBhICs9IDQ7 CisgICAgICBiICs9IDQ7CisgICAgICBuIC09IDQ7CisgICAgfQorfQorCisvKiBHZW5lcmF0aW5n IGFuZCB1c2luZyBhIGRpZmZlcmVudCBWUFIgdmFsdWUgaW4gdGhlIGxvb3AsCisgICB3aXRoIGEg dmN0cF9tIHRoYXQgaXMgdGllZCB0byB0aGUgYmFzZSB2Y3RwIFZQUi4gIFRoaXMKKyAgIGlzIHN0 aWxsIGZpbmUsIGJlY2F1c2UgdGhlIHZjdHBfbSB3aWxsIGJlIHRyYW5zZm9ybWVkCisgICBpbnRv IGEgdmN0cCBhbmQgYmUgaW1wbGljaXRseSBwcmVkaWNhdGVkLiAgKi8KK3ZvaWQgdGVzdDEwIChp bnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90ICpjLCBpbnQgbikKK3sKKyAgd2hpbGUgKG4g PiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDMycSAobik7CisgICAgICBp bnQzMng0X3QgdmEgPSB2bGRyd3Ffel9zMzIgKGEsIHApOworICAgICAgbXZlX3ByZWQxNl90IHAx ID0gdmN0cDMycV9tIChuLCBwKTsKKyAgICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3cV96X3MzMiAo YiwgcDEpOworICAgICAgaW50MzJ4NF90IHZjID0gdmFkZHFfeF9zMzIgKHZhLCB2YiwgcDEpOwor ICAgICAgdnN0cndxX3BfczMyIChjLCB2YywgcCk7CisgICAgICBjICs9IDQ7CisgICAgICBhICs9 IDQ7CisgICAgICBiICs9IDQ7CisgICAgICBuIC09IDQ7CisgICAgfQorfQorCisvKiBHZW5lcmF0 aW5nIGFuZCB1c2luZyBhIGRpZmZlcmVudCBWUFIgdmFsdWUgaW4gdGhlIGxvb3AsIHdpdGggYSB2 Y21wLiAgKi8KK3ZvaWQgdGVzdDExIChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90ICpj LCBpbnQgbikKK3sKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBw ID0gdmN0cDMycSAobik7CisgICAgICBpbnQzMng0X3QgdmEgPSB2bGRyd3Ffel9zMzIgKGEsIHAp OworICAgICAgaW50MzJ4NF90IHZiID0gdmxkcndxX3pfczMyIChiLCBwKTsKKyAgICAgIG12ZV9w cmVkMTZfdCBwMSA9IHZjbXBlcXFfczMyICh2YSwgdmIpOworICAgICAgaW50MzJ4NF90IHZjID0g dmFkZHFfeF9zMzIgKHZhLCB2YiwgcDEpOworICAgICAgdnN0cndxX3BfczMyIChjLCB2YywgcCk7 CisgICAgICBjICs9IDQ7CisgICAgICBhICs9IDQ7CisgICAgICBiICs9IDQ7CisgICAgICBuIC09 IDQ7CisgICAgfQorfQorCisvKiBHZW5lcmF0aW5nIGFuZCB1c2luZyBhIGRpZmZlcmVudCBWUFIg dmFsdWUgaW4gdGhlIGxvb3AsIHdpdGggYSB2Y21wX20uICAqLwordm9pZCB0ZXN0MTIgKGludDMy X3QgKmEsIGludDMyX3QgKmIsIGludDMyX3QgKmMsIGludCBuLCBtdmVfcHJlZDE2X3QgcDEpCit7 CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAzMnEg KG4pOworICAgICAgaW50MzJ4NF90IHZhID0gdmxkcndxX3pfczMyIChhLCBwKTsKKyAgICAgIGlu dDMyeDRfdCB2YiA9IHZsZHJ3cV96X3MzMiAoYiwgcCk7CisgICAgICBtdmVfcHJlZDE2X3QgcDIg PSB2Y21wZXFxX21fczMyICh2YSwgdmIsIHAxKTsKKyAgICAgIGludDMyeDRfdCB2YyA9IHZhZGRx X3hfczMyICh2YSwgdmIsIHAyKTsKKyAgICAgIHZzdHJ3cV9wX3MzMiAoYywgdmMsIHApOworICAg ICAgYyArPSA0OworICAgICAgYSArPSA0OworICAgICAgYiArPSA0OworICAgICAgbiAtPSA0Owor ICAgIH0KK30KKworLyogR2VuZXJhdGluZyBhbmQgdXNpbmcgYSBkaWZmZXJlbnQgVlBSIHZhbHVl IGluIHRoZSBsb29wLCB3aXRoIGEgdmNtcF9tIAorICAgdGhhdCBpcyB0aWVkIHRvIHRoZSBiYXNl IHZjdHAgVlBSIChzYW1lIGFzIGFib3ZlLCB0aGlzIHdpbGwgYmUgdHVybmVkCisgICBpbnRvIGEg dmNtcCBhbmQgYmUgaW1wbGljaXRseSBwcmVkaWNhdGVkKS4gICovCit2b2lkIHRlc3QxMyAoaW50 MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50MzJfdCAqYywgaW50IG4sIG12ZV9wcmVkMTZfdCBwMSkK K3sKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDMy cSAobik7CisgICAgICBpbnQzMng0X3QgdmEgPSB2bGRyd3Ffel9zMzIgKGEsIHApOworICAgICAg aW50MzJ4NF90IHZiID0gdmxkcndxX3pfczMyIChiLCBwKTsKKyAgICAgIG12ZV9wcmVkMTZfdCBw MiA9IHZjbXBlcXFfbV9zMzIgKHZhLCB2YiwgcCk7CisgICAgICBpbnQzMng0X3QgdmMgPSB2YWRk cV94X3MzMiAodmEsIHZiLCBwMik7CisgICAgICB2c3Ryd3FfcF9zMzIgKGMsIHZjLCBwKTsKKyAg ICAgIGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIgKz0gNDsKKyAgICAgIG4gLT0gNDsK KyAgICB9Cit9CisKKy8qIFVzaW5nIGFuIHVucHJlZGljYXRlZCBvcCB3aXRoIGEgc2NhbGFyIG91 dHB1dCwgd2hlcmUgdGhlIHJlc3VsdCBpcyB2YWxpZAorICAgb3V0c2lkZSB0aGUgYmIuICBUaGlz IGlzIHZhbGlkLCBiZWNhdXNlIGFsbCB0aGUgaW5wdXRzIHRvIHRoZSB1bnByZWRpY2F0ZWQKKyAg IG9wIGFyZSBjb3JyZWN0bHkgcHJlZGljYXRlZC4gICovCit1aW50OF90IHRlc3QxNCAodWludDhf dCAqYSwgdWludDhfdCAqYiwgdWludDhfdCAqYywgaW50IG4sIHVpbnQ4eDE2X3QgdngpCit7Cisg ICAgdWludDhfdCBzdW0gPSAwOworICAgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICAgbXZl X3ByZWQxNl90IHAgPSB2Y3RwOHEgKG4pOworICAgICAgIHVpbnQ4eDE2X3QgdmEgPSB2bGRyYnFf el91OCAoYSwgcCk7CisgICAgICAgdWludDh4MTZfdCB2YiA9IHZsZHJicV96X3U4IChiLCBwKTsK KyAgICAgICB1aW50OHgxNl90IHZjID0gdmFkZHFfbV91OCAodngsIHZhLCB2YiwgcCk7CisgICAg ICAgc3VtICs9IHZhZGR2cV91OCAodmMpOworICAgICAgIGEgKz0gMTY7CisgICAgICAgYiArPSAx NjsKKyAgICAgICBuIC09IDE2OworICAgIH0KKyAgICByZXR1cm4gc3VtOworfQorCisvKiBTYW1l IGFzIGFib3ZlLCBidXQgd2l0aCBhbm90aGVyIHNjYWxhciBvcCBiZXR3ZWVuIHRoZSB1bnByZWRp Y2F0ZWQgb3AgYW5kCisgICB0aGUgc2NhbGFyIG9wIG91dHNpZGUgdGhlIGxvb3AuICAqLwordWlu dDhfdCB0ZXN0MTUgKHVpbnQ4X3QgKmEsIHVpbnQ4X3QgKmIsIHVpbnQ4X3QgKmMsIGludCBuLCB1 aW50OHgxNl90IHZ4LCBpbnQgZykKK3sKKyAgICB1aW50OF90IHN1bSA9IDA7CisgICAgd2hpbGUg KG4gPiAwKQorICAgIHsKKyAgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHA4cSAobik7CisgICAg ICAgdWludDh4MTZfdCB2YSA9IHZsZHJicV96X3U4IChhLCBwKTsKKyAgICAgICB1aW50OHgxNl90 IHZiID0gdmxkcmJxX3pfdTggKGIsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmMgPSB2YWRkcV9t X3U4ICh2eCwgdmEsIHZiLCBwKTsKKyAgICAgICBzdW0gKz0gdmFkZHZxX3U4ICh2Yyk7CisgICAg ICAgc3VtICs9IGc7CisgICAgICAgYSArPSAxNjsKKyAgICAgICBiICs9IDE2OworICAgICAgIG4g LT0gMTY7CisgICAgfQorICAgIHJldHVybiBzdW07Cit9CisKKy8qIFVzaW5nIGFuIHVucHJlZGlj YXRlZCB2Y21wIHRvIGdlbmVyYXRlIGEgbmV3IHByZWRpY2F0ZSB2YWx1ZSBpbiB0aGUKKyAgIGxv b3AgYW5kIHRoZW4gdXNpbmcgaXQgaW4gYSBwcmVkaWNhdGVkIHN0b3JlIGluc24uICAqLwordm9p ZCB0ZXN0MTYgKGludDMyX3QgKmEsIGludDMyX3QgKmIsIGludDMyX3QgKmMsIGludCBuKQorewor ICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxIChu KTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7CisgICAgICBpbnQz Mng0X3QgdmIgPSB2bGRyd3FfczMyIChiKTsKKyAgICAgIGludDMyeDRfdCB2YyA9IHZhZGRxX3hf czMyICh2YSwgdmIsIHApOworICAgICAgbXZlX3ByZWQxNl90IHAxID0gdmNtcGVxcV9zMzIgKHZh LCB2Yyk7CisgICAgICB2c3Ryd3FfcF9zMzIgKGMsIHZjLCBwMSk7CisgICAgICBjICs9IDQ7Cisg ICAgICBhICs9IDQ7CisgICAgICBiICs9IDQ7CisgICAgICBuIC09IDQ7CisgICAgfQorfQorCisv KiBVc2luZyBhIHByZWRpY2F0ZWQgdmNtcCB0byBnZW5lcmF0ZSBhIG5ldyBwcmVkaWNhdGUgdmFs dWUgaW4gdGhlCisgICBsb29wIGFuZCB0aGVuIHVzaW5nIGl0IGluIGEgcHJlZGljYXRlZCBzdG9y ZSBpbnNuLiAgKi8KK3ZvaWQgdGVzdDE3IChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90 ICpjLCBpbnQgbikKK3sKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZf dCBwID0gdmN0cDMycSAobik7CisgICAgICBpbnQzMng0X3QgdmEgPSB2bGRyd3Ffel9zMzIgKGEs IHApOworICAgICAgaW50MzJ4NF90IHZiID0gdmxkcndxX3pfczMyIChiLCBwKTsKKyAgICAgIGlu dDMyeDRfdCB2YyA9IHZhZGRxX3MzMiAodmEsIHZiKTsKKyAgICAgIG12ZV9wcmVkMTZfdCBwMSA9 IHZjbXBlcXFfbV9zMzIgKHZhLCB2YywgcCk7CisgICAgICB2c3Ryd3FfcF9zMzIgKGMsIHZjLCBw MSk7CisgICAgICBjICs9IDQ7CisgICAgICBhICs9IDQ7CisgICAgICBiICs9IDQ7CisgICAgICBu IC09IDQ7CisgICAgfQorfQorCisvKiBVc2luZyBhbiBhY3Jvc3MtdmVjdG9yIHVucHJlZGljYXRl ZCBpbnN0cnVjdGlvbiBpbiBhIHZhbGlkIHdheS4KKyAgIFRoaXMgdGVzdHMgdGhhdCAidmMiIGhh cyBjb3JyZWN0bHkgbWFza2VkIHRoZSByaXNreSAidmIiLiAgKi8KK3VpbnQxNl90IHRlc3QxOCAo dWludDE2X3QgKmEsIHVpbnQxNl90ICpiLCAgdWludDE2X3QgKmMsIGludCBuKQoreworICB1aW50 MTZ4OF90IHZiID0gdmxkcmhxX3UxNiAoYik7CisgIHVpbnQxNl90IHJlcyA9IDA7CisgIHdoaWxl IChuID4gMCkKKyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAxNnEgKG4pOworICAg ICAgdWludDE2eDhfdCB2YSA9IHZsZHJocV96X3UxNiAoYSwgcCk7CisgICAgICB1aW50MTZ4OF90 IHZjID0gdmFkZHFfeF91MTYgKHZhLCB2YiwgcCk7CisgICAgICByZXMgPSB2YWRkdnFfdTE2ICh2 Yyk7CisgICAgICBjICs9IDg7CisgICAgICBhICs9IDg7CisgICAgICBiICs9IDg7CisgICAgICBu IC09IDg7CisgICAgfQorICByZXR1cm4gcmVzOworfQorCisvKiBVc2luZyBhbiBhY3Jvc3MtdmVj dG9yIHVucHJlZGljYXRlZCBpbnN0cnVjdGlvbiB3aXRoIGEgc2NhbGFyIGZyb20gb3V0c2lkZSB0 aGUgbG9vcC4gICovCit1aW50MTZfdCB0ZXN0MTkgKHVpbnQxNl90ICphLCB1aW50MTZfdCAqYiwg IHVpbnQxNl90ICpjLCBpbnQgbikKK3sKKyAgdWludDE2eDhfdCB2YiA9IHZsZHJocV91MTYgKGIp OworICB1aW50MTZfdCByZXMgPSAwOworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZl X3ByZWQxNl90IHAgPSB2Y3RwMTZxIChuKTsKKyAgICAgIHVpbnQxNng4X3QgdmEgPSB2bGRyaHFf el91MTYgKGEsIHApOworICAgICAgdWludDE2eDhfdCB2YyA9IHZhZGRxX3hfdTE2ICh2YSwgdmIs IHApOworICAgICAgcmVzID0gdmFkZHZhcV91MTYgKHJlcywgdmMpOworICAgICAgYyArPSA4Owor ICAgICAgYSArPSA4OworICAgICAgYiArPSA4OworICAgICAgbiAtPSA4OworICAgIH0KKyAgcmV0 dXJuIHJlczsKK30KKworLyogVXNpbmcgYW4gYWNyb3NzLXZlY3RvciBwcmVkaWNhdGVkIGluc3Ry dWN0aW9uIGluIGEgdmFsaWQgd2F5LiAgKi8KK3VpbnQxNl90ICB0ZXN0MjAgKHVpbnQxNl90ICph LCB1aW50MTZfdCAqYiwgIHVpbnQxNl90ICpjLCBpbnQgbikKK3sKKyAgdWludDE2X3QgcmVzID0g MDsKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDE2 cSAobik7CisgICAgICB1aW50MTZ4OF90IHZiID0gdmxkcmhxX3UxNiAoYik7CisgICAgICB1aW50 MTZ4OF90IHZhID0gdmxkcmhxX3pfdTE2IChhLCBwKTsKKyAgICAgIHJlcyA9IHZhZGR2YXFfcF91 MTYgKHJlcywgdmIsIHApOworICAgICAgYyArPSA4OworICAgICAgYSArPSA4OworICAgICAgYiAr PSA4OworICAgICAgbiAtPSA4OworICAgIH0KKyAgcmV0dXJuIHJlczsKK30KKworLyogVXNpbmcg YW4gYWNyb3NzLXZlY3RvciBwcmVkaWNhdGVkIGluc3RydWN0aW9uIGluIGEgdmFsaWQgd2F5LiAg Ki8KK3VpbnQxNl90ICB0ZXN0MjEgKHVpbnQxNl90ICphLCB1aW50MTZfdCAqYiwgIHVpbnQxNl90 ICpjLCBpbnQgbikKK3sKKyAgdWludDE2X3QgcmVzID0gMDsKKyAgd2hpbGUgKG4gPiAwKQorICAg IHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDE2cSAobik7CisgICAgICB1aW50MTZ4OF90 IHZiID0gdmxkcmhxX3UxNiAoYik7CisgICAgICB1aW50MTZ4OF90IHZhID0gdmxkcmhxX3pfdTE2 IChhLCBwKTsKKyAgICAgIHJlcysrOworICAgICAgcmVzID0gdmFkZHZhcV9wX3UxNiAocmVzLCB2 YiwgcCk7CisgICAgICBjICs9IDg7CisgICAgICBhICs9IDg7CisgICAgICBiICs9IDg7CisgICAg ICBuIC09IDg7CisgICAgfQorICByZXR1cm4gcmVzOworfQorCitpbnQgdGVzdDIyICh1aW50OF90 ICphLCB1aW50OF90ICpiLCB1aW50OF90ICpjLCBpbnQgbikKK3sKKyAgICBpbnQgcmVzID0gMDsK KyAgICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHA4 cSAobik7CisgICAgICAgIHVpbnQ4eDE2X3QgdmEgPSB2bGRyYnFfel91OCAoYSwgcCk7CisgICAg ICAgIHJlcyA9IHZtYXh2cSAocmVzLCB2YSk7CisgICAgICAgIG4tPTE2OworICAgICAgICBhKz0x NjsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworaW50IHRlc3QyMyAoaW50OF90ICphLCBp bnQ4X3QgKmIsIGludDhfdCAqYywgaW50IG4pCit7CisgICAgaW50IHJlcyA9IDA7CisgICAgd2hp bGUgKG4gPiAwKQorICAgIHsKKyAgICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwOHEgKG4pOwor ICAgICAgICBpbnQ4eDE2X3QgdmEgPSB2bGRyYnFfel9zOCAoYSwgcCk7CisgICAgICAgIHJlcyA9 IHZtYXhhdnEgKHJlcywgdmEpOworICAgICAgICBuLT0xNjsKKyAgICAgICAgYSs9MTY7CisgICAg fQorICAgIHJldHVybiByZXM7Cit9CisKKy8qIFRoZSBmaW5hbCBudW1iZXIgb2YgRExTVFBzIGN1 cnJlbnRseSBpcyBjYWxjdWxhdGVkIGJ5IHRoZSBudW1iZXIgb2YKKyAgYFRFU1RfQ09NUElMRV9J Tl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZLipgIG1hY3JvcyAqIDYgKyAy My4gICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMge1x0ZGxzdHB9IDE2 NyB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7XHRsZXRwfSAx NjcgfSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9k bHN0cC1pbnQxNng4LmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1p bnQxNng4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMC4uMDEyNWEyYTE1ZmFhMWE3MDcxZmM4MjFiNmRiNjZkMTBmMWJm ZjZkYQotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbXZl L2Rsc3RwLWludDE2eDguYwpAQCAtMCwwICsxLDY5IEBACisvKiB7IGRnLWRvIHJ1biB7IHRhcmdl dCB7IGFybSotKi0qIH0gfSB9ICovCisvKiB7IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdldCBh cm1fdjhfMW1fbXZlX29rIH0gKi8KKy8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IGFy bV9tdmVfaHcgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLXNhdmUtdGVtcHMiIH0gKi8KKy8q IHsgZGctYWRkLW9wdGlvbnMgYXJtX3Y4XzFtX212ZSB9ICovCisKKyNpbmNsdWRlIDxhcm1fbXZl Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICIu Li9sb2IuaCIKKwordm9pZCAgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkgdGVzdCAoaW50MTZf dCAqYSwgaW50MTZfdCAqYiwgaW50MTZfdCAqYywgaW50IG4pCit7CisgIHdoaWxlIChuID4gMCkK KyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAxNnEgKG4pOworICAgICAgaW50MTZ4 OF90IHZhID0gdmxkcmhxX3pfczE2IChhLCBwKTsKKyAgICAgIGludDE2eDhfdCB2YiA9IHZsZHJo cV96X3MxNiAoYiwgcCk7CisgICAgICBpbnQxNng4X3QgdmMgPSB2YWRkcV94X3MxNiAodmEsIHZi LCBwKTsKKyAgICAgIHZzdHJocV9wX3MxNiAoYywgdmMsIHApOworICAgICAgYys9ODsKKyAgICAg IGErPTg7CisgICAgICBiKz04OworICAgICAgbi09ODsKKyAgICB9Cit9CisKK2ludCBtYWluICgp Cit7CisgIGludCBpOworICBpbnQxNl90IHRlbXAxW05dOworICBpbnQxNl90IHRlbXAyW05dOwor ICBpbnQxNl90IHRlbXAzW05dOworICByZXNldF9kYXRhMTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMs IE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAwKTsKKyAgY2hlY2tfcGx1czE2ICh0 ZW1wMSwgdGVtcDIsIHRlbXAzLCAwKTsKKworICByZXNldF9kYXRhMTYgKHRlbXAxLCB0ZW1wMiwg dGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxKTsKKyAgY2hlY2tfcGx1 czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxKTsKKworICByZXNldF9kYXRhMTYgKHRlbXAxLCB0 ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA3KTsKKyAgY2hl Y2tfcGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA3KTsKKworICByZXNldF9kYXRhMTYgKHRl bXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA4KTsK KyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA4KTsKKworICByZXNldF9kYXRh MTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAz LCA5KTsKKyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA5KTsKKworICByZXNl dF9kYXRhMTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIs IHRlbXAzLCAxNik7CisgIGNoZWNrX3BsdXMxNiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgMTYpOwor CisgIHJlc2V0X2RhdGExNiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAx LCB0ZW1wMiwgdGVtcDMsIDE3KTsKKyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAz LCAxNyk7CisKKyAgcmVzZXRfZGF0YTE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCBOKTsKK30KKwor LyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzIHtcdGRsc3RwLjE2fSAxIH0gfSAq LworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzIHtcdGxldHB9IDEgfSB9ICov CisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJcdHZjdHAiIH0gfSAqLworLyog eyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAiXHR2cHN0IiB9IH0gKi8KKy8qIHsgZGct ZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgInAwIiB9IH0gKi8KZGlmZiAtLWdpdCBhL2djYy90 ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludDMyeDQuYyBiL2djYy90ZXN0c3Vp dGUvZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludDMyeDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4wNmI5NjBh ZDljYWFkYjQyMmUwNDAwN2QxN2I2NDY3NmYzNzljNzc2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Nj L3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50MzJ4NC5jCkBAIC0wLDAgKzEs NjkgQEAKKy8qIHsgZGctZG8gcnVuIHsgdGFyZ2V0IHsgYXJtKi0qLSogfSB9IH0gKi8KKy8qIHsg ZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IGFybV92OF8xbV9tdmVfb2sgfSAqLworLyogeyBk Zy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgYXJtX212ZV9odyB9ICovCisvKiB7IGRnLW9wdGlv bnMgIi1PMiAtc2F2ZS10ZW1wcyIgfSAqLworLyogeyBkZy1hZGQtb3B0aW9ucyBhcm1fdjhfMW1f bXZlIH0gKi8KKworI2luY2x1ZGUgPGFybV9tdmUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2lu Y2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIi4uL2xvYi5oIgorCit2b2lkICBfX2F0dHJpYnV0 ZV9fICgobm9pbmxpbmUpKSB0ZXN0IChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90ICpj LCBpbnQgbikKK3sKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBw ID0gdmN0cDMycSAobik7CisgICAgICBpbnQzMng0X3QgdmEgPSB2bGRyd3Ffel9zMzIgKGEsIHAp OworICAgICAgaW50MzJ4NF90IHZiID0gdmxkcndxX3pfczMyIChiLCBwKTsKKyAgICAgIGludDMy eDRfdCB2YyA9IHZhZGRxX3hfczMyICh2YSwgdmIsIHApOworICAgICAgdnN0cndxX3BfczMyIChj LCB2YywgcCk7CisgICAgICBjKz00OworICAgICAgYSs9NDsKKyAgICAgIGIrPTQ7CisgICAgICBu LT00OworICAgIH0KK30KKworaW50IG1haW4gKCkKK3sKKyAgaW50IGk7CisgIGludDMyX3QgdGVt cDFbTl07CisgIGludDMyX3QgdGVtcDJbTl07CisgIGludDMyX3QgdGVtcDNbTl07CisgIHJlc2V0 X2RhdGEzMiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwg dGVtcDMsIDApOworICBjaGVja19wbHVzMzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDApOworCisg IHJlc2V0X2RhdGEzMiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0 ZW1wMiwgdGVtcDMsIDEpOworICBjaGVja19wbHVzMzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDEp OworCisgIHJlc2V0X2RhdGEzMiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRl bXAxLCB0ZW1wMiwgdGVtcDMsIDMpOworICBjaGVja19wbHVzMzIgKHRlbXAxLCB0ZW1wMiwgdGVt cDMsIDMpOworCisgIHJlc2V0X2RhdGEzMiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRl c3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDQpOworICBjaGVja19wbHVzMzIgKHRlbXAxLCB0ZW1w MiwgdGVtcDMsIDQpOworCisgIHJlc2V0X2RhdGEzMiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7 CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDUpOworICBjaGVja19wbHVzMzIgKHRlbXAx LCB0ZW1wMiwgdGVtcDMsIDUpOworCisgIHJlc2V0X2RhdGEzMiAodGVtcDEsIHRlbXAyLCB0ZW1w MywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDgpOworICBjaGVja19wbHVzMzIg KHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDgpOworCisgIHJlc2V0X2RhdGEzMiAodGVtcDEsIHRlbXAy LCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDkpOworICBjaGVja19w bHVzMzIgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDkpOworCisgIHJlc2V0X2RhdGEzMiAodGVtcDEs IHRlbXAyLCB0ZW1wMywgTik7Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10 aW1lcyB7XHRkbHN0cC4zMn0gMSB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxl ci10aW1lcyB7XHRsZXRwfSAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVy LW5vdCAiXHR2Y3RwIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3Qg Ilx0dnBzdCIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJwMCIg fSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0 cC1pbnQ2NHgyLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1pbnQ2 NHgyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMC4uNWE3ODJkZDdmNzQyZDZlOGQxNzdlYzg2MzJiMmFlNGRjZmY2NjRm NQotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbXZlL2Rs c3RwLWludDY0eDIuYwpAQCAtMCwwICsxLDY5IEBACisvKiB7IGRnLWRvIHJ1biB7IHRhcmdldCB7 IGFybSotKi0qIH0gfSB9ICovCisvKiB7IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdldCBhcm1f djhfMW1fbXZlX29rIH0gKi8KKy8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IGFybV9t dmVfaHcgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLXNhdmUtdGVtcHMiIH0gKi8KKy8qIHsg ZGctYWRkLW9wdGlvbnMgYXJtX3Y4XzFtX212ZSB9ICovCisKKyNpbmNsdWRlIDxhcm1fbXZlLmg+ CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICIuLi9s b2IuaCIKKwordm9pZCAgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkgdGVzdCAoaW50NjRfdCAq YSwgaW50NjRfdCAqYywgaW50IG4pCit7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBt dmVfcHJlZDE2X3QgcCA9IHZjdHA2NHEgKG4pOworICAgICAgaW50NjR4Ml90IHZhID0gdmxkcmRx X2dhdGhlcl9vZmZzZXRfel9zNjQgKGEsIHZjcmVhdGVxX3U2NCAoMCwgOCksIHApOworICAgICAg dnN0cmRxX3NjYXR0ZXJfb2Zmc2V0X3BfczY0IChjLCB2Y3JlYXRlcV91NjQgKDAsIDgpLCB2YSwg cCk7CisgICAgICBjKz0yOworICAgICAgYSs9MjsKKyAgICAgIG4tPTI7CisgICAgfQorfQorCitp bnQgbWFpbiAoKQoreworICBpbnQgaTsKKyAgaW50NjRfdCB0ZW1wMVtOXTsKKyAgaW50NjRfdCB0 ZW1wM1tOXTsKKyAgcmVzZXRfZGF0YTY0ICAodGVtcDEsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVt cDEsIHRlbXAzLCAwKTsKKyAgY2hlY2tfbWVtY3B5NjQgKHRlbXAxLCB0ZW1wMywgMCk7CisKKyAg cmVzZXRfZGF0YTY0ICAodGVtcDEsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAzLCAx KTsKKyAgY2hlY2tfbWVtY3B5NjQgKHRlbXAxLCB0ZW1wMywgMSk7CisKKyAgcmVzZXRfZGF0YTY0 ICAodGVtcDEsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAzLCAyKTsKKyAgY2hlY2tf bWVtY3B5NjQgKHRlbXAxLCB0ZW1wMywgMik7CisKKyAgcmVzZXRfZGF0YTY0ICAodGVtcDEsIHRl bXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAzLCAzKTsKKyAgY2hlY2tfbWVtY3B5NjQgKHRl bXAxLCB0ZW1wMywgMyk7CisKKyAgcmVzZXRfZGF0YTY0ICAodGVtcDEsIHRlbXAzLCBOKTsKKyAg dGVzdCAodGVtcDEsIHRlbXAzLCA0KTsKKyAgY2hlY2tfbWVtY3B5NjQgKHRlbXAxLCB0ZW1wMywg NCk7CisKKyAgcmVzZXRfZGF0YTY0ICAodGVtcDEsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEs IHRlbXAzLCA1KTsKKyAgY2hlY2tfbWVtY3B5NjQgKHRlbXAxLCB0ZW1wMywgNSk7CisKKyAgcmVz ZXRfZGF0YTY0ICAodGVtcDEsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAzLCA2KTsK KyAgY2hlY2tfbWVtY3B5NjQgKHRlbXAxLCB0ZW1wMywgNik7CisKKyAgcmVzZXRfZGF0YTY0ICAo dGVtcDEsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAzLCA3KTsKKyAgY2hlY2tfbWVt Y3B5NjQgKHRlbXAxLCB0ZW1wMywgNyk7CisKKyAgcmVzZXRfZGF0YTY0ICAodGVtcDEsIHRlbXAz LCBOKTsKK30KKworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzIHtcdGRsc3Rw LjY0fSAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzIHtcdGxl dHB9IDEgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJcdHZjdHAi IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAiXHR2cHN0IiB9IH0g Ki8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgInAwIiB9IH0gKi8KZGlmZiAt LWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludDh4MTYuYyBi L2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludDh4MTYuYwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwLi44ZWExODFjODJkNDVhMDA4ZDYwYTY2YzFmOWU5YjI4OWM1ZjA1NjExCi0tLSAvZGV2L251 bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50OHgxNi5j CkBAIC0wLDAgKzEsNjkgQEAKKy8qIHsgZGctZG8gcnVuIHsgdGFyZ2V0IHsgYXJtKi0qLSogfSB9 IH0gKi8KKy8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IGFybV92OF8xbV9tdmVfb2sg fSAqLworLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgYXJtX212ZV9odyB9ICovCisv KiB7IGRnLW9wdGlvbnMgIi1PMiAtc2F2ZS10ZW1wcyIgfSAqLworLyogeyBkZy1hZGQtb3B0aW9u cyBhcm1fdjhfMW1fbXZlIH0gKi8KKworI2luY2x1ZGUgPGFybV9tdmUuaD4KKyNpbmNsdWRlIDxz dGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIi4uL2xvYi5oIgorCit2b2lk ICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKSB0ZXN0IChpbnQ4X3QgKmEsIGludDhfdCAqYiwg aW50OF90ICpjLCBpbnQgbikKK3sKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9w cmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAgIGludDh4MTZfdCB2YSA9IHZsZHJicV96X3M4 IChhLCBwKTsKKyAgICAgIGludDh4MTZfdCB2YiA9IHZsZHJicV96X3M4IChiLCBwKTsKKyAgICAg IGludDh4MTZfdCB2YyA9IHZhZGRxX3hfczggKHZhLCB2YiwgcCk7CisgICAgICB2c3RyYnFfcF9z OCAoYywgdmMsIHApOworICAgICAgYys9MTY7CisgICAgICBhKz0xNjsKKyAgICAgIGIrPTE2Owor ICAgICAgbi09MTY7CisgICAgfQorfQorCitpbnQgbWFpbiAoKQoreworICBpbnQgaTsKKyAgaW50 OF90IHRlbXAxW05dOworICBpbnQ4X3QgdGVtcDJbTl07CisgIGludDhfdCB0ZW1wM1tOXTsKKyAg cmVzZXRfZGF0YTggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVt cDIsIHRlbXAzLCAwKTsKKyAgY2hlY2tfcGx1czggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDApOwor CisgIHJlc2V0X2RhdGE4ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEs IHRlbXAyLCB0ZW1wMywgMSk7CisgIGNoZWNrX3BsdXM4ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAx KTsKKworICByZXNldF9kYXRhOCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRl bXAxLCB0ZW1wMiwgdGVtcDMsIDE1KTsKKyAgY2hlY2tfcGx1czggKHRlbXAxLCB0ZW1wMiwgdGVt cDMsIDE1KTsKKworICByZXNldF9kYXRhOCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRl c3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE2KTsKKyAgY2hlY2tfcGx1czggKHRlbXAxLCB0ZW1w MiwgdGVtcDMsIDE2KTsKKworICByZXNldF9kYXRhOCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7 CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE3KTsKKyAgY2hlY2tfcGx1czggKHRlbXAx LCB0ZW1wMiwgdGVtcDMsIDE3KTsKKworICByZXNldF9kYXRhOCAodGVtcDEsIHRlbXAyLCB0ZW1w MywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDMyKTsKKyAgY2hlY2tfcGx1czgg KHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDMyKTsKKworICByZXNldF9kYXRhOCAodGVtcDEsIHRlbXAy LCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDMzKTsKKyAgY2hlY2tf cGx1czggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDMzKTsKKworICByZXNldF9kYXRhOCAodGVtcDEs IHRlbXAyLCB0ZW1wMywgTik7Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10 aW1lcyB7XHRkbHN0cC44fSAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVy LXRpbWVzIHtcdGxldHB9IDEgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXIt bm90ICJcdHZjdHAiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAi XHR2cHN0IiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgInAwIiB9 IH0gKi8KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3Rw LWludmFsaWQtYXNtLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1p bnZhbGlkLWFzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmY3YzNlMDRmODgzMWU2YjZlYjcwOWM4ZjNiMGEwYTg5 NjMxM2NhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJt L212ZS9kbHN0cC1pbnZhbGlkLWFzbS5jCkBAIC0wLDAgKzEsMzkxIEBACisvKiB7IGRnLWRvIGNv bXBpbGUgeyB0YXJnZXQgeyBhcm0qLSotKiB9IH0gfSAqLworLyogeyBkZy1yZXF1aXJlLWVmZmVj dGl2ZS10YXJnZXQgYXJtX3Y4XzFtX212ZV9vayB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMyAt c2F2ZS10ZW1wcyIgfSAqLworLyogeyBkZy1hZGQtb3B0aW9ucyBhcm1fdjhfMW1fbXZlIH0gKi8K KworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGFybV9tdmUuaD4KKworLyogVGVybWlu YXRpbmcgb24gYSBub24temVybyBudW1iZXIgb2YgZWxlbWVudHMuICAqLwordm9pZCB0ZXN0MCAo dWludDhfdCAqYSwgdWludDhfdCAqYiwgdWludDhfdCAqYywgaW50IG4pCit7CisgICAgd2hpbGUg KG4gPiAxKQorICAgIHsKKyAgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHA4cSAobik7CisgICAg ICAgdWludDh4MTZfdCB2YSA9IHZsZHJicV96X3U4IChhLCBwKTsKKyAgICAgICB1aW50OHgxNl90 IHZiID0gdmxkcmJxX3pfdTggKGIsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmMgPSB2YWRkcV94 X3U4ICh2YSwgdmIsIHApOworICAgICAgIHZzdHJicV9wX3U4IChjLCB2YywgcCk7CisgICAgICAg biAtPSAxNjsKKyAgICB9Cit9CisKKy8qIFRlcm1pbmF0aW5nIG9uIG4gPj0gMC4gICovCit2b2lk IHRlc3QxICh1aW50OF90ICphLCB1aW50OF90ICpiLCB1aW50OF90ICpjLCBpbnQgbikKK3sKKyAg ICB3aGlsZSAobiA+PSAwKQorICAgIHsKKyAgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHA4cSAo bik7CisgICAgICAgdWludDh4MTZfdCB2YSA9IHZsZHJicV96X3U4IChhLCBwKTsKKyAgICAgICB1 aW50OHgxNl90IHZiID0gdmxkcmJxX3pfdTggKGIsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmMg PSB2YWRkcV94X3U4ICh2YSwgdmIsIHApOworICAgICAgIHZzdHJicV9wX3U4IChjLCB2YywgcCk7 CisgICAgICAgbiAtPSAxNjsKKyAgICB9Cit9CisKKy8qIFNpbWlsYXIsIHRlcm1pbmF0aW5nIG9u IGEgbm9uLXplcm8gbnVtYmVyIG9mIGVsZW1lbnRzLCBidXQgaW4gYSBmb3IgbG9vcAorICAgZm9y bWF0LiAgKi8KK2ludDMyX3QgYVtdID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDd9Owordm9pZCB0 ZXN0MiAoaW50MzJfdCAqYiwgaW50IG51bV9lbGVtcykKK3sKKyAgICBmb3IgKGludCBpID0gbnVt X2VsZW1zOyBpID49IDI7IGktPSA0KQorICAgIHsKKyAgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZj dHAzMnEgKGkpOworICAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoJihhW2ldKSwg cCk7CisgICAgICAgdnN0cndxX3BfczMyIChiICsgaSwgdmEsIHApOworICAgIH0KK30KKworLyog SXRlcmF0aW9uIGNvdW50ZXIgY291bnRpbmcgdXAgdG8gbnVtX2l0ZXIsIHdpdGggYSBub24temVy byBzdGFydGluZyBudW0uICAqLwordm9pZCB0ZXN0MyAodWludDhfdCAqYSwgdWludDhfdCAqYiwg dWludDhfdCAqYywgaW50IG4pCit7CisgICAgaW50IG51bV9pdGVyID0gKG4gKyAxNSkvMTY7Cisg ICAgZm9yIChpbnQgaSA9IDE7IGkgPCBudW1faXRlcjsgaSsrKQorICAgIHsKKyAgICAgICBtdmVf cHJlZDE2X3QgcCA9IHZjdHA4cSAobik7CisgICAgICAgdWludDh4MTZfdCB2YSA9IHZsZHJicV96 X3U4IChhLCBwKTsKKyAgICAgICB1aW50OHgxNl90IHZiID0gdmxkcmJxX3pfdTggKGIsIHApOwor ICAgICAgIHVpbnQ4eDE2X3QgdmMgPSB2YWRkcV94X3U4ICh2YSwgdmIsIHApOworICAgICAgIHZz dHJicV9wX3U4IChjLCB2YywgcCk7CisgICAgICAgbiAtPSAxNjsKKyAgICB9Cit9CisKKy8qIEl0 ZXJhdGlvbiBjb3VudGVyIGNvdW50aW5nIHVwIHRvIG51bV9pdGVyLCB3aXRoIGEgbGFyZ2VyIGlu Y3JlbWVudCAgKi8KK3ZvaWQgdGVzdDQgKHVpbnQ4X3QgKmEsIHVpbnQ4X3QgKmIsIHVpbnQ4X3Qg KmMsIGludCBuKQoreworICAgIGludCBudW1faXRlciA9IChuICsgMTUpLzE2OworICAgIGZvciAo aW50IGkgPSAwOyBpIDwgbnVtX2l0ZXI7IGkrPTIpCisgICAgeworICAgICAgIG12ZV9wcmVkMTZf dCBwID0gdmN0cDhxIChuKTsKKyAgICAgICB1aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTggKGEs IHApOworICAgICAgIHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFfel91OCAoYiwgcCk7CisgICAgICAg dWludDh4MTZfdCB2YyA9IHZhZGRxX3hfdTggKHZhLCB2YiwgcCk7CisgICAgICAgdnN0cmJxX3Bf dTggKGMsIHZjLCBwKTsKKyAgICAgICBuIC09IDE2OworICAgIH0KK30KKworLyogVXNpbmcgYW4g dW5wcmVkaWNhdGVkIHN0b3JlIGluc3RydWN0aW9uIHdpdGhpbiB0aGUgbG9vcC4gICovCit2b2lk IHRlc3Q1ICh1aW50OF90ICphLCB1aW50OF90ICpiLCB1aW50OF90ICpjLCAgdWludDhfdCAqZCwg aW50IG4pCit7CisgICAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgICBtdmVfcHJlZDE2X3Qg cCA9IHZjdHA4cSAobik7CisgICAgICAgdWludDh4MTZfdCB2YSA9IHZsZHJicV96X3U4IChhLCBw KTsKKyAgICAgICB1aW50OHgxNl90IHZiID0gdmxkcmJxX3pfdTggKGIsIHApOworICAgICAgIHVp bnQ4eDE2X3QgdmMgPSB2YWRkcV91OCAodmEsIHZiKTsKKyAgICAgICB1aW50OHgxNl90IHZkID0g dmFkZHFfeF91OCAodmEsIHZiLCBwKTsKKyAgICAgICB2c3RyYnFfdTggKGQsIHZkKTsKKyAgICAg ICBuIC09IDE2OworICAgIH0KK30KKworLyogVXNpbmcgYW4gdW5wcmVkaWNhdGVkIHN0b3JlIG91 dHNpZGUgdGhlIGxvb3AuICAqLwordm9pZCB0ZXN0NiAodWludDhfdCAqYSwgdWludDhfdCAqYiwg dWludDhfdCAqYywgaW50IG4sIHVpbnQ4eDE2X3QgdngpCit7CisgICAgd2hpbGUgKG4gPiAwKQor ICAgIHsKKyAgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHA4cSAobik7CisgICAgICAgdWludDh4 MTZfdCB2YSA9IHZsZHJicV96X3U4IChhLCBwKTsKKyAgICAgICB1aW50OHgxNl90IHZiID0gdmxk cmJxX3pfdTggKGIsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmMgPSB2YWRkcV9tX3U4ICh2eCwg dmEsIHZiLCBwKTsKKyAgICAgICB2eCA9IHZhZGRxX3U4ICh2eCwgdmMpOworICAgICAgIGEgKz0g MTY7CisgICAgICAgYiArPSAxNjsKKyAgICAgICBuIC09IDE2OworICAgIH0KKyAgICB2c3RyYnFf dTggKGMsIHZ4KTsKK30KKworLyogVXNpbmcgYSBWUFIgdGhhdCBnZXRzIG1vZGlmaWVkIHdpdGhp biB0aGUgbG9vcC4gICovCit2b2lkIHRlc3Q5IChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQz Ml90ICpjLCBpbnQgbikKK3sKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVk MTZfdCBwID0gdmN0cDMycSAobik7CisgICAgICBpbnQzMng0X3QgdmEgPSB2bGRyd3Ffel9zMzIg KGEsIHApOworICAgICAgcCsrOworICAgICAgaW50MzJ4NF90IHZiID0gdmxkcndxX3pfczMyIChi LCBwKTsKKyAgICAgIGludDMyeDRfdCB2YyA9IHZhZGRxX3hfczMyICh2YSwgdmIsIHApOworICAg ICAgdnN0cndxX3BfczMyIChjLCB2YywgcCk7CisgICAgICBjICs9IDQ7CisgICAgICBhICs9IDQ7 CisgICAgICBiICs9IDQ7CisgICAgICBuIC09IDQ7CisgICAgfQorfQorCisvKiBVc2luZyBhIFZQ UiB0aGF0IGdldHMgcmUtZ2VuZXJhdGVkIHdpdGhpbiB0aGUgbG9vcC4gICovCit2b2lkIHRlc3Qx MCAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50MzJfdCAqYywgaW50IG4pCit7CisgIG12ZV9w cmVkMTZfdCBwID0gdmN0cDMycSAobik7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBp bnQzMng0X3QgdmEgPSB2bGRyd3Ffel9zMzIgKGEsIHApOworICAgICAgcCA9IHZjdHAzMnEgKG4p OworICAgICAgaW50MzJ4NF90IHZiID0gdmxkcndxX3pfczMyIChiLCBwKTsKKyAgICAgIGludDMy eDRfdCB2YyA9IHZhZGRxX3hfczMyICh2YSwgdmIsIHApOworICAgICAgdnN0cndxX3BfczMyIChj LCB2YywgcCk7CisgICAgICBjICs9IDQ7CisgICAgICBhICs9IDQ7CisgICAgICBiICs9IDQ7Cisg ICAgICBuIC09IDQ7CisgICAgfQorfQorCisvKiBVc2luZyB2Y3RwMzJxX20gaW5zdGVhZCBvZiB2 Y3RwMzJxLiAgKi8KK3ZvaWQgdGVzdDExIChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90 ICpjLCBpbnQgbiwgbXZlX3ByZWQxNl90IHAwKQoreworICB3aGlsZSAobiA+IDApCisgICAgewor ICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxX20gKG4sIHAwKTsKKyAgICAgIGludDMyeDRf dCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRyd3Ff el9zMzIgKGIsIHApOworICAgICAgaW50MzJ4NF90IHZjID0gdmFkZHFfeF9zMzIgKHZhLCB2Yiwg cCk7CisgICAgICB2c3Ryd3FfcF9zMzIgKGMsIHZjLCBwKTsKKyAgICAgIGMgKz0gNDsKKyAgICAg IGEgKz0gNDsKKyAgICAgIGIgKz0gNDsKKyAgICAgIG4gLT0gNDsKKyAgICB9Cit9CisKKy8qIFVz aW5nIGFuIHVucHJlZGljYXRlZCBvcCB3aXRoIGEgc2NhbGFyIG91dHB1dCwgd2hlcmUgdGhlIHJl c3VsdCBpcyB2YWxpZAorICAgb3V0c2lkZSB0aGUgYmIuICBUaGlzIGlzIGludmFsaWQsIGJlY2F1 c2Ugb25lIG9mIHRoZSBpbnB1dHMgdG8gdGhlCisgICB1bnByZWRpY2F0ZWQgb3AgaXMgYWxzbyB1 bnByZWRpY2F0ZWQuICAqLwordWludDhfdCB0ZXN0MTIgKHVpbnQ4X3QgKmEsIHVpbnQ4X3QgKmIs IHVpbnQ4X3QgKmMsIGludCBuLCB1aW50OHgxNl90IHZ4KQoreworICAgIHVpbnQ4X3Qgc3VtID0g MDsKKyAgICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0 cDhxIChuKTsKKyAgICAgICB1aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTggKGEsIHApOworICAg ICAgIHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFfdTggKGIpOworICAgICAgIHVpbnQ4eDE2X3QgdmMg PSB2YWRkcV91OCAodmEsIHZiKTsKKyAgICAgICBzdW0gKz0gdmFkZHZxX3U4ICh2Yyk7CisgICAg ICAgYSArPSAxNjsKKyAgICAgICBiICs9IDE2OworICAgICAgIG4gLT0gMTY7CisgICAgfQorICAg IHJldHVybiBzdW07Cit9CisKKy8qIFVzaW5nIGFuIHVucHJlZGljYXRlZCB2Y21wIHRvIGdlbmVy YXRlIGEgbmV3IHByZWRpY2F0ZSB2YWx1ZSBpbiB0aGUKKyAgIGxvb3AgYW5kIHRoZW4gdXNpbmcg dGhhdCBWUFIgdG8gcHJlZGljYXRlIGEgc3RvcmUgaW5zbi4gICovCit2b2lkIHRlc3QxMyAoaW50 MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50MzJ4NF90IHZjLCBpbnQzMl90ICpjLCBpbnQgbikKK3sK KyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDMycSAo bik7CisgICAgICBpbnQzMng0X3QgdmEgPSB2bGRyd3FfczMyIChhKTsKKyAgICAgIGludDMyeDRf dCB2YiA9IHZsZHJ3cV96X3MzMiAoYiwgcCk7CisgICAgICBpbnQzMng0X3QgdmMgPSB2YWRkcV9z MzIgKHZhLCB2Yik7CisgICAgICBtdmVfcHJlZDE2X3QgcDEgPSB2Y21wZXFxX3MzMiAodmEsIHZj KTsKKyAgICAgIHZzdHJ3cV9wX3MzMiAoYywgdmMsIHAxKTsKKyAgICAgIGMgKz0gNDsKKyAgICAg IGEgKz0gNDsKKyAgICAgIGIgKz0gNDsKKyAgICAgIG4gLT0gNDsKKyAgICB9Cit9CisKKy8qIFVz aW5nIGFuIGFjcm9zcy12ZWN0b3IgdW5wcmVkaWNhdGVkIGluc3RydWN0aW9uLiAidmIiIGlzIHRo ZSByaXNrLiAgKi8KK3VpbnQxNl90IHRlc3QxNCAodWludDE2X3QgKmEsIHVpbnQxNl90ICpiLCAg dWludDE2X3QgKmMsIGludCBuKQoreworICB1aW50MTZ4OF90IHZiID0gdmxkcmhxX3UxNiAoYik7 CisgIHVpbnQxNl90IHJlcyA9IDA7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBtdmVf cHJlZDE2X3QgcCA9IHZjdHAxNnEgKG4pOworICAgICAgdWludDE2eDhfdCB2YSA9IHZsZHJocV96 X3UxNiAoYSwgcCk7CisgICAgICB2YiA9IHZhZGRxX3UxNiAodmEsIHZiKTsKKyAgICAgIHJlcyA9 IHZhZGR2cV91MTYgKHZiKTsKKyAgICAgIGMgKz0gODsKKyAgICAgIGEgKz0gODsKKyAgICAgIGIg Kz0gODsKKyAgICAgIG4gLT0gODsKKyAgICB9CisgIHJldHVybiByZXM7Cit9CisKKy8qIFVzaW5n IGFuIGFjcm9zcy12ZWN0b3IgdW5wcmVkaWNhdGVkIGluc3RydWN0aW9uLiAidmMiIGlzIHRoZSBy aXNrLiAqLwordWludDE2X3QgdGVzdDE1ICh1aW50MTZfdCAqYSwgdWludDE2X3QgKmIsICB1aW50 MTZfdCAqYywgaW50IG4pCit7CisgIHVpbnQxNng4X3QgdmIgPSB2bGRyaHFfdTE2IChiKTsKKyAg dWludDE2X3QgcmVzID0gMDsKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVk MTZfdCBwID0gdmN0cDE2cSAobik7CisgICAgICB1aW50MTZ4OF90IHZhID0gdmxkcmhxX3pfdTE2 IChhLCBwKTsKKyAgICAgIHVpbnQxNng4X3QgdmMgPSB2YWRkcV91MTYgKHZhLCB2Yik7CisgICAg ICByZXMgPSB2YWRkdmFxX3UxNiAocmVzLCB2Yyk7CisgICAgICBjICs9IDg7CisgICAgICBhICs9 IDg7CisgICAgICBiICs9IDg7CisgICAgICBuIC09IDg7CisgICAgfQorICByZXR1cm4gcmVzOwor fQorCit1aW50MTZfdCB0ZXN0MTYgKHVpbnQxNl90ICphLCB1aW50MTZfdCAqYiwgIHVpbnQxNl90 ICpjLCBpbnQgbikKK3sKKyAgdWludDE2X3QgcmVzID0wOworICB3aGlsZSAobiA+IDApCisgICAg eworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMTZxIChuKTsKKyAgICAgIHVpbnQxNng4X3Qg dmIgPSB2bGRyaHFfdTE2IChiKTsKKyAgICAgIHVpbnQxNng4X3QgdmEgPSB2bGRyaHFfel91MTYg KGEsIHApOworICAgICAgcmVzID0gdmFkZHZhcV91MTYgKHJlcywgdmIpOworICAgICAgcmVzID0g dmFkZHZhcV9wX3UxNiAocmVzLCB2YSwgcCk7CisgICAgICBjICs9IDg7CisgICAgICBhICs9IDg7 CisgICAgICBiICs9IDg7CisgICAgICBuIC09IDg7CisgICAgfQorICByZXR1cm4gcmVzOworfQor CitpbnQgdGVzdDE3IChpbnQ4X3QgKmEsIGludDhfdCAqYiwgaW50OF90ICpjLCBpbnQgbikKK3sK KyAgICBpbnQgcmVzID0gMDsKKyAgICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgICBtdmVf cHJlZDE2X3QgcCA9IHZjdHA4cSAobik7CisgICAgICAgIGludDh4MTZfdCB2YSA9IHZsZHJicV96 X3M4IChhLCBwKTsKKyAgICAgICAgcmVzID0gdm1heHZxIChyZXMsIHZhKTsKKyAgICAgICAgbi09 MTY7CisgICAgICAgIGErPTE2OworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisKKworaW50 IHRlc3QxOCAoaW50OF90ICphLCBpbnQ4X3QgKmIsIGludDhfdCAqYywgaW50IG4pCit7CisgICAg aW50IHJlcyA9IDA7CisgICAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgICAgbXZlX3ByZWQx Nl90IHAgPSB2Y3RwOHEgKG4pOworICAgICAgICBpbnQ4eDE2X3QgdmEgPSB2bGRyYnFfel9zOCAo YSwgcCk7CisgICAgICAgIHJlcyA9IHZtaW52cSAocmVzLCB2YSk7CisgICAgICAgIG4tPTE2Owor ICAgICAgICBhKz0xNjsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworaW50IHRlc3QxOSAo aW50OF90ICphLCBpbnQ4X3QgKmIsIGludDhfdCAqYywgaW50IG4pCit7CisgICAgaW50IHJlcyA9 IDA7CisgICAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgICAgbXZlX3ByZWQxNl90IHAgPSB2 Y3RwOHEgKG4pOworICAgICAgICBpbnQ4eDE2X3QgdmEgPSB2bGRyYnFfel9zOCAoYSwgcCk7Cisg ICAgICAgIHJlcyA9IHZtaW5hdnEgKHJlcywgdmEpOworICAgICAgICBuLT0xNjsKKyAgICAgICAg YSs9MTY7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK2ludCB0ZXN0MjAgKHVpbnQ4X3Qg KmEsIHVpbnQ4X3QgKmIsIHVpbnQ4X3QgKmMsIGludCBuKQoreworICAgIGludCByZXMgPSAwOwor ICAgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhx IChuKTsKKyAgICAgICAgdWludDh4MTZfdCB2YSA9IHZsZHJicV96X3U4IChhLCBwKTsKKyAgICAg ICAgcmVzID0gdm1pbnZxIChyZXMsIHZhKTsKKyAgICAgICAgbi09MTY7CisgICAgICAgIGErPTE2 OworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit1aW50OHgxNl90IHRlc3QyMSAodWludDhf dCAqYSwgdWludDMyX3QgKmIsIGludCBuLCB1aW50OHgxNl90IHJlcykKK3sKKyAgICB3aGlsZSAo biA+IDApCisgICAgeworICAgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHA4cSAobik7CisgICAg ICAgIHVpbnQ4eDE2X3QgdmEgPSB2bGRyYnFfel91OCAoYSwgcCk7CisgICAgICAgIHJlcyA9IHZz aGxjcV91OCAodmEsIGIsIDEpOworICAgICAgICBuLT0xNjsKKyAgICAgICAgYSs9MTY7CisgICAg fQorICAgIHJldHVybiByZXM7Cit9CisKK2ludDh4MTZfdCB0ZXN0MjIgKGludDhfdCAqYSwgaW50 MzJfdCAqYiwgaW50IG4sIGludDh4MTZfdCByZXMpCit7CisgICAgd2hpbGUgKG4gPiAwKQorICAg IHsKKyAgICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwOHEgKG4pOworICAgICAgICBpbnQ4eDE2 X3QgdmEgPSB2bGRyYnFfel9zOCAoYSwgcCk7CisgICAgICAgIHJlcyA9IHZzaGxjcV9zOCAodmEs IGIsIDEpOworICAgICAgICBuLT0xNjsKKyAgICAgICAgYSs9MTY7CisgICAgfQorICAgIHJldHVy biByZXM7Cit9CisKKy8qIFVzaW5nIGFuIHVuc2lnbmVkIG51bWJlciBvZiBlbGVtZW50cyB0byBj b3VudCBkb3duIGZyb20sIHdpdGggYSA+MCovCit2b2lkIHRlc3QyMyAoaW50MzJfdCAqYSwgaW50 MzJfdCAqYiwgaW50MzJfdCAqYywgdW5zaWduZWQgaW50IG4pCit7CisgIHdoaWxlIChuID4gMCkK KyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAzMnEgKG4pOworICAgICAgaW50MzJ4 NF90IHZhID0gdmxkcndxX3pfczMyIChhLCBwKTsKKyAgICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3 cV96X3MzMiAoYiwgcCk7CisgICAgICBpbnQzMng0X3QgdmMgPSB2YWRkcV94X3MzMiAodmEsIHZi LCBwKTsKKyAgICAgIHZzdHJ3cV9wX3MzMiAoYywgdmMsIHApOworICAgICAgYys9NDsKKyAgICAg IGErPTQ7CisgICAgICBiKz00OworICAgICAgbi09NDsKKyAgICB9Cit9CisKKy8qIFVzaW5nIGFu IHVuc2lnbmVkIG51bWJlciBvZiBlbGVtZW50cyB0byBjb3VudCB1cCB0bywgd2l0aCBhIDxuKi8K K3ZvaWQgdGVzdDI0ICh1aW50OF90ICphLCB1aW50OF90ICpiLCB1aW50OF90ICpjLCB1bnNpZ25l ZCBpbnQgbikKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrPTE2KQorICAgIHsKKyAg ICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwOHEgKG4taSk7CisgICAgICAgIHVpbnQ4eDE2X3Qg dmEgPSB2bGRyYnFfel91OCAoYSwgcCk7CisgICAgICAgIHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFf el91OCAoYiwgcCk7CisgICAgICAgIHVpbnQ4eDE2X3QgdmMgPSB2YWRkcV94X3U4ICh2YSwgdmIs IHApOworICAgICAgICB2c3RyYnFfcF91OCAoYywgdmMsIHApOworICAgICAgICBuLT0xNjsKKyAg ICB9Cit9CisKKworLyogVXNpbmcgYW4gdW5zaWduZWQgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGNv dW50IHVwIHRvLCB3aXRoIGEgPD1uKi8KK3ZvaWQgdGVzdDI1ICh1aW50OF90ICphLCB1aW50OF90 ICpiLCB1aW50OF90ICpjLCB1bnNpZ25lZCBpbnQgbikKK3sKKyAgICBmb3IgKGludCBpID0gMTsg aSA8PSBuOyBpKz0xNikKKyAgICB7CisgICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChu LWkrMSk7CisgICAgICAgIHVpbnQ4eDE2X3QgdmEgPSB2bGRyYnFfel91OCAoYSwgcCk7CisgICAg ICAgIHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFfel91OCAoYiwgcCk7CisgICAgICAgIHVpbnQ4eDE2 X3QgdmMgPSB2YWRkcV94X3U4ICh2YSwgdmIsIHApOworICAgICAgICB2c3RyYnFfcF91OCAoYywg dmMsIHApOworICAgICAgICBuLT0xNjsKKyAgICB9Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2Fu LWFzc2VtYmxlci1ub3QgIlx0ZGxzdHAiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNz ZW1ibGVyLW5vdCAiXHRsZXRwIiB9IH0gKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCg== --------------366m3l4s0tG03NCqD8hhX7PW--