From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM10-BN7-obe.outbound.protection.outlook.com (NAM10-BN7-obe.outbound.protection.outlook.com [40.107.92.139]) by mx.groups.io with SMTP id smtpd.web12.3754.1623214227257683775 for ; Tue, 08 Jun 2021 21:50:27 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@os.amperecomputing.com header.s=selector2 header.b=B02MoBzj; spf=pass (domain: os.amperecomputing.com, ip: 40.107.92.139, mailfrom: nhi@os.amperecomputing.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=OKWLpxrUGnRn06HleXbXgkp2HnBb25qe28uwgr/ECvGm2sbrT5qB5786a/MPSzZ9yIfov/rJ7DiQQuvx/CzHaR63mOToJ70Mtf6p/xds0d/16yM4NV07rybs6b3Mu5pe8fx1FK01izBtofZfvfZ/Jpm2bz+FpONGRSfTAnd1Yy/lpE+gLGszR69hS+Va7IO3BpfhOlBrZf0Y/pruYeUZs7cuGjdSETR70gCscZ7MXTdrC0E5TMj8n580QGBVMBBmbpHO40a2v0Sg6j52l5SBhxAVKmgGT0cT9OIn6C3xazFGOHMT4rUdJUfi0d4xK/4cnlGfVAhi9TeDNE+3DmEMcw== 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-SenderADCheck; bh=4ORkdv3zAtemxIfqaGCDj9hiFBUJm/7wfuhI+IeZ3c8=; b=hwLt5J5RHUq5uVKX3Vj+hkeKFjMFSpD+9WyNe6w1TL858e2ETIm494puMsX0sAKyD2ukRUjniTX06OBoatnLY5kTHioNfAhH0aySINmlizZjyeZtKrp3RI4AEomTolTkuev52ztAkGksKhauzdO2owjlh12KK79wq1/HHZNvUgNWY4Rx0Z9Rf9fIIu4Qfbs+UoHEGzj26dlLOXSWYC7nyzeZGcnfQZTyQqqrKC697OoCQW5SiQi5xE1r+RIab+tFhuvvjuoSR6pPBlii85jhEO4J3lRhfYGeOrL8n3C35IWWf7C7UKfr1FVM2TYRv6SQdzU55nviQ6TOw7eitGMYUQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=os.amperecomputing.com; dmarc=pass action=none header.from=os.amperecomputing.com; dkim=pass header.d=os.amperecomputing.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=os.amperecomputing.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=4ORkdv3zAtemxIfqaGCDj9hiFBUJm/7wfuhI+IeZ3c8=; b=B02MoBzjv1DiAF+zGvYl8Yxca8V3ytdJ7xvGJdMA4CVlWTLjgYGJIeSBL7KJkLY2KdDGIBJ5tDd2attXd99wRnT0Bd040Ool3L4X5xdHxjhyR5OMwXQ0EgyLNaBmSO2CXAf3YgLLivZRhYCxJ3dW7o85mFx7F9z4LGpHJhdxGUE= Authentication-Results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=os.amperecomputing.com; Received: from DM6PR01MB5849.prod.exchangelabs.com (2603:10b6:5:205::20) by DM6PR01MB4842.prod.exchangelabs.com (2603:10b6:5:6c::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4195.24; Wed, 9 Jun 2021 04:50:21 +0000 Received: from DM6PR01MB5849.prod.exchangelabs.com ([fe80::60d2:86dd:1f1c:51dd]) by DM6PR01MB5849.prod.exchangelabs.com ([fe80::60d2:86dd:1f1c:51dd%7]) with mapi id 15.20.4195.030; Wed, 9 Jun 2021 04:50:21 +0000 Subject: Re: [edk2-platforms][PATCH v2 01/32] Ampere: Initial support for Ampere Altra processor and Mt. Jade platform To: Leif Lindholm Cc: devel@edk2.groups.io, Vu Nguyen , Thang Nguyen , Chuong Tran , Phong Vo , Michael D Kinney , Ard Biesheuvel , Nate DeSimone References: <20210526100724.5359-1-nhi@os.amperecomputing.com> <20210526100724.5359-2-nhi@os.amperecomputing.com> <20210604230410.s7vuarxir2fqkqtw@leviathan> From: "Nhi Pham" Message-ID: <8f7dde81-8337-9b9b-3b80-f575fad568fb@os.amperecomputing.com> Date: Wed, 9 Jun 2021 11:50:07 +0700 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 In-Reply-To: <20210604230410.s7vuarxir2fqkqtw@leviathan> X-Originating-IP: [118.69.219.201] X-ClientProxiedBy: HK0PR03CA0111.apcprd03.prod.outlook.com (2603:1096:203:b0::27) To DM6PR01MB5849.prod.exchangelabs.com (2603:10b6:5:205::20) Return-Path: nhi@os.amperecomputing.com MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [10.38.32.216] (118.69.219.201) by HK0PR03CA0111.apcprd03.prod.outlook.com (2603:1096:203:b0::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4219.21 via Frontend Transport; Wed, 9 Jun 2021 04:50:15 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 18fb7c62-2a2c-4170-064f-08d92b0214d0 X-MS-TrafficTypeDiagnostic: DM6PR01MB4842: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:8882; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: RTquH1oUwwOtkKLOdOMMKFZWl+IdtofpgiUT0z/UY4JG9TgnPec5zrSF3oz7IsFzUjF9kY4ZYivcNjfZSpNflXXITaa8wFyA5YZWx7R4reaAeB+uTcgdP2q86zmS/88kj+9khrNSxksc/3nTU3+eRq0BNJxtogce1co86c6uuFZnt1USZgYSB1sf3o8WM3asT166stMtaU0yUp/I+e8y7hZJpkT0/zdMTVcor7OPmvetkqmkSh8reMm6wMqXmZHCMl7yE1HIv1CIEi3HCweqBEJhXcuugmSplanQ4E8LaZ53yrqVDwMxtuT0QQNzy6/ihGTi3Gd6j5r/e/W4r5S7RQytC1PgkoQP9FsU5JsfAFWjYB9DUz24eA1EKBr368PawKwB0uhEX7CxwxWm6uWwi5ZI85cLmTP7s9bRXYY8CV2xwSEVKpvEdKVYRmSdCImPP58OoVO5+bFyP1Xh5eKWVkfmN9RYoT4Kw+D2UNX+hRvgEexRGlhWn8nvp/+bSV5u5LNHQOCpcLquvcEfVX6XIUJMCSOVLU7CZU0eJRF3qCMFhydvTyFo/r4Pk1YGGg+VvacwirBnU8yty7/PxyWR4iltbZm12Ws6jKIsZYnyxYFuDE7pmLa0l7G73KPfKJm/BvMUOaH31onRBYOg4aliKDNqtuxMAa25+8BmZm4L2z65XEZK7/avtF5g7NswvkDvyE9PNp6qo+ydrnoKe9tO9RbJEs1noz00pwGtiXG/RYCC8zmRKP1NTOZOmWHDfGjhQIo5calnnhV4yeYoBkQ6rA2VAC9MrIiBqZWC6S0djJt+uWRhO7xV+py5VpFZ0PEAL5yFu4t16tX2z37iTtN0aA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM6PR01MB5849.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(4636009)(376002)(396003)(346002)(366004)(39830400003)(136003)(52116002)(2906002)(2616005)(478600001)(5660300002)(956004)(8676002)(53546011)(33964004)(16576012)(26005)(6916009)(31686004)(6666004)(83380400001)(166002)(30864003)(86362001)(8936002)(38100700002)(4326008)(316002)(38350700002)(54906003)(31696002)(19627235002)(66556008)(16526019)(66946007)(66476007)(186003)(6486002)(45980500001)(43740500002)(579004)(559001);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?NGJ1SEtaT0lPYWw5TGFXSEVVRWpoRW9WV1B3YnRQSk9IUklYdm1MVjQ1S2lM?= =?utf-8?B?VGtHQVBCN0ZyMEhvcGJNMlV4b3hKUlBBeVM0dGRlckZMR3llcDRGOURXeVFp?= =?utf-8?B?R1ZwNXMyM1pUSytUWXFIM1lyV2N6Y2hsWXhjMXFtbVBKY0lEdkVic05IZ29O?= =?utf-8?B?MzhnY2s4VTVqMVhic092ZENTQ0ZMUVpOUXFmMHhlYXBxSkVaeGs3N3JlRHdC?= =?utf-8?B?RDJzaVNjWVFKU2wvR1hBL3V1a21UMUFZRHh2RWlrOEhDYVZkeUM2YUhoQ0d0?= =?utf-8?B?U3hDdlRnMXdoK3lJNHE3d0pEcVJzQVdpNVFzMSs2b3NKSWJ1UnFEc2VPb3Mz?= =?utf-8?B?Y3lrVGhEbzNCRXBZYjdCcGp6Z24yTG5xT2hmRGZSWFA5bUZnWHRXVnYrMnpX?= =?utf-8?B?K1NjSmc0c1ZKK0ZyY1FHVFhHaFN4TExLMVBSbjdyMTdQeWhzWkdBTXFRbnV0?= =?utf-8?B?Wi9XSW9rWkc5eDd1YlBpN1hxbVNreFFSemh5NUhqYVcwQ2hXZ21UR1lzZm9L?= =?utf-8?B?UENGcWppYUhXU3JNV1Q4aE56SDFwNTQ0UFIveXdhWlZHc3Vyd1pkZ2hWc2dD?= =?utf-8?B?eTZMeDNXOFo4OTZva2JqMGVmckhFeVBaZ0ErN24wMDI0dHBEMXFKdkJwbjlu?= =?utf-8?B?MGZYTUlCbUhIRi9rbFlTeUVqSHNOYldNSUp4ZGgzRUxLcDNTNXJtMkNIa2ls?= =?utf-8?B?TERwdnVGWHRucFprSEIrdmhKMGI5Tm1sN1RBRkh3ZExTWVFDdTQ0SVVrNFRL?= =?utf-8?B?SkdVenZkb3FOTXUxbFAvNnlXZERueWkvb2pJa0JQbGFXRXhxZ3prNVdraXVQ?= =?utf-8?B?NGVUdFBMRmxCU3lIdWU1eGdidTRlRVZtaFQ2T0QvYitVQmRBdmhGaUhUZEVw?= =?utf-8?B?TmptQjlnSWhLSG8xLytqeE5jNUVqb3RUZzN0WGl3RzlHK2JXRVN1RUY3NkJ2?= =?utf-8?B?dHJyVXJWWHlSMDhHMVdQM1A5bEFwTmUxWkZ5THVYcW9aWHI3OTBMMkM0VnM5?= =?utf-8?B?UXIyY3pLS0lwc05FajJpMkNhYTVyTE5uTEk3a2dnbXF2QzVaQ2EyTHorTkpi?= =?utf-8?B?ZjREemU1bm9HZmJPQzhkd3JhTEhWMXphYnVEQVF0QzJlcGxlcDJReVVmSVZr?= =?utf-8?B?ZkZXMXJybU5qLzh4bmppSmwzUTBHemErckxYaW1VZ3BCUmVhUGpWelJVS1lZ?= =?utf-8?B?NGxYTnYzc2tGU2RGVlFMQXpTb2h4YWVJMXg3WTI1T3k4dGhyeDNobVBKNWZR?= =?utf-8?B?L29vcmtWVVdKWkdWazdaaGZqTERGUi9jQm5uYjhtS0xaUTRjRTJWWmpmWkdW?= =?utf-8?B?Qld6YVVJbTE0RDhUOFJMSmVHaHQ2a1g2anYrWlFHd2w3VHJGNDd4ekpOR3U3?= =?utf-8?B?Q3hScWVNUjFIMkF4alByYzlveVV5V0ljN2s2bGtZNWlMYW16UkF5TDUvTVlP?= =?utf-8?B?Mk9ybndPb1lIZmVFNlh0SkR0UU5GQ0ViWk9sdzBJb2pMak56RUZaM0RMTElq?= =?utf-8?B?VHI3VkVUazFMTmNkOTh1S3F1NmtlZG9oNkdCQUNvOHdVWXN4elZQYXJNNnl5?= =?utf-8?B?K2RIWlRyaHhjM2Y2MFNLOEZuSTFwU2U0Z1BJYnQ3YWwzd3BERjIyYVRodXRv?= =?utf-8?B?c2p3T2pYalpmTnAvWXdKWVRmT3JwUDBIM25IaUNxaUxNODlBcDJGTDV4RjA5?= =?utf-8?B?UnFKZXhMazBGOG5lbHhqdVFVc3RzZTZnNk9XajVEVXd4bHpCbm1NL3g2VS9L?= =?utf-8?Q?PNriY8tzg9eN6k0CA+Xq2tzzjoNNkNVcqigRnHa?= X-OriginatorOrg: os.amperecomputing.com X-MS-Exchange-CrossTenant-Network-Message-Id: 18fb7c62-2a2c-4170-064f-08d92b0214d0 X-MS-Exchange-CrossTenant-AuthSource: DM6PR01MB5849.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Jun 2021 04:50:21.0369 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3bc2b170-fd94-476d-b0ce-4229bdc904a7 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 6mft04AAI6cKhdmCDE3HbOXCWkGxlMLnpJ6mwIHufTWPvr7FQJwYVjw1vCCGuyoqKN6TrEiPJE2djM5aEX0voCaBVYQx5oQqtlwGHBF3thE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR01MB4842 Content-Type: multipart/alternative; boundary="------------4BF9D6D8EBC1A676687FE92C" Content-Language: en-US --------------4BF9D6D8EBC1A676687FE92C Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit On 6/5/21 06:04, Leif Lindholm wrote: > On Wed, May 26, 2021 at 17:06:52 +0700, Nhi Pham wrote: >> From: Vu Nguyen >> >> This commit adds the support for Ampere’s Altra processor-based Mt. Jade >> platform that provides up to 160 processor cores in a dual socket >> configuration. The essential modules are wired up enough to boot system >> to EDK2 UiApp. >> >> Cc: Thang Nguyen >> Cc: Chuong Tran >> Cc: Phong Vo >> Cc: Leif Lindholm >> Cc: Michael D Kinney >> Cc: Ard Biesheuvel >> Cc: Nate DeSimone >> >> Signed-off-by: Vu Nguyen >> --- >> Platform/Ampere/AmperePlatformPkg/AmperePlatformPkg.dec | 28 + >> Silicon/Ampere/AmpereAltraPkg/AmpereAltraPkg.dec | 42 ++ >> Silicon/Ampere/AmpereSiliconPkg/AmpereSiliconPkg.dec | 46 ++ >> Silicon/Ampere/AmpereAltraPkg/AmpereAltraPkg.dsc.inc | 674 +++++++++++++++++++ >> Platform/Ampere/JadePkg/Jade.dsc | 100 +++ >> Platform/Ampere/JadePkg/Jade.fdf | 225 +++++++ >> Silicon/Ampere/AmpereAltraPkg/Drivers/ATFHobPei/ATFHobPeim.inf | 41 ++ >> Silicon/Ampere/AmpereAltraPkg/Drivers/MemoryInitPeim/MemoryInitPeim.inf | 64 ++ >> Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLib.inf | 44 ++ >> Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformLib.inf | 57 ++ >> Silicon/Ampere/AmpereAltraPkg/Library/MailboxInterfaceLib/MailboxInterfaceLib.inf | 37 + >> Silicon/Ampere/AmpereAltraPkg/Library/MemoryInitPeiLib/MemoryInitPeiLib.inf | 63 ++ >> Silicon/Ampere/AmpereAltraPkg/Library/MmCommunicationLib/MmCommunicationLib.inf | 35 + >> Silicon/Ampere/AmpereAltraPkg/Library/NVParamLib/NVParamLib.inf | 32 + >> Silicon/Ampere/AmpereAltraPkg/Library/PlatformPeiLib/PlatformPeiLib.inf | 42 ++ >> Silicon/Ampere/AmpereAltraPkg/Library/RngLib/RngLib.inf | 29 + >> Silicon/Ampere/AmpereAltraPkg/Library/SystemFirmwareInterfaceLib/SystemFirmwareInterfaceLib.inf | 30 + >> Silicon/Ampere/AmpereAltraPkg/Library/TrngLib/TrngLib.inf | 29 + >> Silicon/Ampere/AmpereAltraPkg/Include/Guid/PlatformInfoHobGuid.h | 17 + >> Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h | 282 ++++++++ >> Silicon/Ampere/AmpereAltraPkg/Include/Library/MailboxInterfaceLib.h | 172 +++++ >> Silicon/Ampere/AmpereAltraPkg/Include/Library/MmCommunicationLib.h | 19 + >> Silicon/Ampere/AmpereAltraPkg/Include/Library/NVParamLib.h | 133 ++++ >> Silicon/Ampere/AmpereAltraPkg/Include/Library/SystemFirmwareInterfaceLib.h | 282 ++++++++ >> Silicon/Ampere/AmpereAltraPkg/Include/Library/TrngLib.h | 31 + >> Silicon/Ampere/AmpereAltraPkg/Include/MmLib.h | 79 +++ >> Silicon/Ampere/AmpereAltraPkg/Include/NVParamDef.h | 515 ++++++++++++++ >> Silicon/Ampere/AmpereAltraPkg/Include/Platform/Ac01.h | 146 ++++ >> Silicon/Ampere/AmpereAltraPkg/Include/PlatformInfoHob.h | 182 +++++ >> Silicon/Ampere/AmpereAltraPkg/Drivers/ATFHobPei/ATFHobPeim.c | 52 ++ >> Silicon/Ampere/AmpereAltraPkg/Drivers/MemoryInitPeim/MemoryInitPeim.c | 151 +++++ >> Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLib.c | 706 ++++++++++++++++++++ >> Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformLib.c | 169 +++++ >> Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformLibMemory.c | 399 +++++++++++ >> Silicon/Ampere/AmpereAltraPkg/Library/MailboxInterfaceLib/MailboxInterfaceLib.c | 282 ++++++++ >> Silicon/Ampere/AmpereAltraPkg/Library/MemoryInitPeiLib/MemoryInitPeiLib.c | 93 +++ >> Silicon/Ampere/AmpereAltraPkg/Library/MmCommunicationLib/MmCommunicationLib.c | 184 +++++ >> Silicon/Ampere/AmpereAltraPkg/Library/NVParamLib/NVParamLib.c | 202 ++++++ >> Silicon/Ampere/AmpereAltraPkg/Library/PlatformPeiLib/PlatformPeiLib.c | 40 ++ >> Silicon/Ampere/AmpereAltraPkg/Library/RngLib/RngLib.c | 141 ++++ >> Silicon/Ampere/AmpereAltraPkg/Library/SystemFirmwareInterfaceLib/SystemFirmwareInterfaceLib.c | 328 +++++++++ >> Silicon/Ampere/AmpereAltraPkg/Library/TrngLib/TrngLib.c | 63 ++ >> Platform/Ampere/AmperePlatformPkg/FvRules.fdf.inc | 176 +++++ >> Platform/Ampere/JadePkg/JadeBoardSetting.cfg | 209 ++++++ >> Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformHelper.S | 45 ++ >> Silicon/Ampere/AmpereAltraPkg/Library/RngLib/RngLib.uni | 13 + >> 46 files changed, 6729 insertions(+) >> >> diff --git a/Platform/Ampere/JadePkg/Jade.dsc b/Platform/Ampere/JadePkg/Jade.dsc >> new file mode 100755 >> index 000000000000..f68af24a0d78 >> --- /dev/null >> +++ b/Platform/Ampere/JadePkg/Jade.dsc >> @@ -0,0 +1,100 @@ >> +## @file >> +# >> +# Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.
>> +# >> +# SPDX-License-Identifier: BSD-2-Clause-Patent >> +# >> +## >> + >> +################################################################################ >> +# >> +# Defines Section - statements that will be processed to create a Makefile. >> +# >> +################################################################################ >> +[Defines] >> + PLATFORM_NAME = Jade >> + PLATFORM_GUID = 7BDD00C0-68F3-4CC1-8775-F0F00572019F >> + PLATFORM_VERSION = 0.1 >> + DSC_SPECIFICATION = 0x0001001B >> + OUTPUT_DIRECTORY = Build/Jade >> + SUPPORTED_ARCHITECTURES = AARCH64 >> + BUILD_TARGETS = DEBUG|RELEASE|NOOPT >> + SKUID_IDENTIFIER = DEFAULT >> + FLASH_DEFINITION = Platform/Ampere/JadePkg/Jade.fdf >> + >> + # >> + # Defines for default states. These can be changed on the command line. >> + # -D FLAG=VALUE >> + # >> + >> + # DEBUG_INIT 0x00000001 // Initialization >> + # DEBUG_WARN 0x00000002 // Warnings >> + # DEBUG_LOAD 0x00000004 // Load events >> + # DEBUG_FS 0x00000008 // EFI File system >> + # DEBUG_POOL 0x00000010 // Alloc & Free (pool) >> + # DEBUG_PAGE 0x00000020 // Alloc & Free (page) >> + # DEBUG_INFO 0x00000040 // Informational debug messages >> + # DEBUG_DISPATCH 0x00000080 // PEI/DXE/SMM Dispatchers >> + # DEBUG_VARIABLE 0x00000100 // Variable >> + # DEBUG_BM 0x00000400 // Boot Manager >> + # DEBUG_BLKIO 0x00001000 // BlkIo Driver >> + # DEBUG_NET 0x00004000 // SNP Driver >> + # DEBUG_UNDI 0x00010000 // UNDI Driver >> + # DEBUG_LOADFILE 0x00020000 // LoadFile >> + # DEBUG_EVENT 0x00080000 // Event messages >> + # DEBUG_GCD 0x00100000 // Global Coherency Database changes >> + # DEBUG_CACHE 0x00200000 // Memory range cachability changes >> + # DEBUG_VERBOSE 0x00400000 // Detailed debug messages that may >> + # // significantly impact boot performance >> + # DEBUG_ERROR 0x80000000 // Error >> + DEFINE DEBUG_PRINT_ERROR_LEVEL = 0x8000000F >> + DEFINE FIRMWARE_VER = 0.01.001 >> + DEFINE EDK2_SKIP_PEICORE = TRUE >> + DEFINE SECURE_BOOT_ENABLE = FALSE >> + DEFINE INCLUDE_TFTP_COMMAND = TRUE >> + >> + # >> + # Network definition >> + # >> + DEFINE NETWORK_IP6_ENABLE = FALSE >> + DEFINE NETWORK_HTTP_BOOT_ENABLE = TRUE >> + DEFINE NETWORK_ALLOW_HTTP_CONNECTIONS = TRUE >> + DEFINE NETWORK_TLS_ENABLE = FALSE >> + > You'll want to include that !include MdePkg/MdeLibs.dsc.inc bit > somewhere here. > >> +# Include default Ampere Platform DSC file >> +!include Silicon/Ampere/AmpereAltraPkg/AmpereAltraPkg.dsc.inc >> + >> +################################################################################ >> +# >> +# Specific Platform Library >> +# >> +################################################################################ >> +[LibraryClasses] >> + # >> + # RTC Library: Common RTC >> + # >> + RealTimeClockLib|EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf >> + >> +################################################################################ >> +# >> +# Specific Platform Pcds >> +# >> +################################################################################ >> +[PcdsFeatureFlag.common] >> +[PcdsFixedAtBuild.common] >> + >> +!if $(SECURE_BOOT_ENABLE) == TRUE >> + # Override the default values from SecurityPkg to ensure images >> + # from all sources are verified in secure boot >> + gEfiSecurityPkgTokenSpaceGuid.PcdOptionRomImageVerificationPolicy|0x04 >> + gEfiSecurityPkgTokenSpaceGuid.PcdFixedMediaImageVerificationPolicy|0x04 >> + gEfiSecurityPkgTokenSpaceGuid.PcdRemovableMediaImageVerificationPolicy|0x04 >> +!endif >> + >> + >> +################################################################################ >> +# >> +# Specific Platform Component >> +# >> +################################################################################ >> +[Components.common] > > >> diff --git a/Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h b/Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h >> new file mode 100644 >> index 000000000000..de576474fb48 >> --- /dev/null >> +++ b/Silicon/Ampere/AmpereAltraPkg/Include/Library/AmpereCpuLib.h >> @@ -0,0 +1,282 @@ >> +/** @file >> + >> + Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.
>> + >> + SPDX-License-Identifier: BSD-2-Clause-Patent >> + >> +**/ >> + >> +#ifndef AMPERE_CPU_LIB_H_ >> +#define AMPERE_CPU_LIB_H_ >> + >> +/* Ctypen, bits[3(n - 1) + 2 : 3(n - 1)], for n = 1 to 7 */ >> +#define CLIDR_CTYPE_SHIFT(Level) (3 * (Level - 1)) >> +#define CLIDR_CTYPE_MASK(Level) (7 << CLIDR_CTYPE_SHIFT(Level)) >> +#define CLIDR_CTYPE(Clidr, Level) \ >> + (((Clidr) & CLIDR_CTYPE_MASK(Level)) >> CLIDR_CTYPE_SHIFT(Level)) >> + >> +#define CCSIDR_NUMSETS_SHIFT 13 >> +#define CCSIDR_NUMSETS_MASK 0xFFFE000 >> +#define CCSIDR_NUMSETS(Ccsidr) \ >> + (((Ccsidr) & CCSIDR_NUMSETS_MASK) >> CCSIDR_NUMSETS_SHIFT) >> +#define CCSIDR_ASSOCIATIVITY_SHIFT 3 >> +#define CCSIDR_ASSOCIATIVITY_MASK 0x1FF8 >> +#define CCSIDR_ASSOCIATIVITY(Ccsidr) \ >> + (((Ccsidr) & CCSIDR_ASSOCIATIVITY_MASK) >> CCSIDR_ASSOCIATIVITY_SHIFT) >> +#define CCSIDR_LINE_SIZE_SHIFT 0 >> +#define CCSIDR_LINE_SIZE_MASK 0x7 >> +#define CCSIDR_LINE_SIZE(Ccsidr) \ >> + (((Ccsidr) & CCSIDR_LINE_SIZE_MASK) >> CCSIDR_LINE_SIZE_SHIFT) > All of the above (CLIDR/CCSIDR) are architectural. > We've also developed some new accessors and stuff for these, as part > of ArmPkg/Universal/SmbiosDxe work that's gone on since v1 of this set. > We may need to clean some interfaces up, but ideally I'd prefer if you > could use some accessors from ArmLib or such. > >> + >> +#define SUBNUMA_MODE_MONOLITHIC 0 >> +#define SUBNUMA_MODE_HEMISPHERE 1 >> +#define SUBNUMA_MODE_QUADRANT 2 >> + >> +#define MONOLITIC_NUM_OF_REGION 1 >> +#define HEMISPHERE_NUM_OF_REGION 2 >> +#define QUADRANT_NUM_OF_REGION 4 >> +#define SUBNUMA_CPM_REGION_SIZE 4 >> +#define NUM_OF_CPM_PER_MESH_ROW 8 >> + >> +#define CPM_PER_ROW_OFFSET(CpmId) ((CpmId) % NUM_OF_CPM_PER_MESH_ROW) >> +#define CPM_ROW_NUMBER(CpmId) ((CpmId) / NUM_OF_CPM_PER_MESH_ROW) >> + >> +#define SOCKET_ID(CpuId) ((CpuId) / (PLATFORM_CPU_MAX_CPM * PLATFORM_CPU_NUM_CORES_PER_CPM)) >> +#define CLUSTER_ID(CpuId) (((CpuId) / PLATFORM_CPU_NUM_CORES_PER_CPM) % PLATFORM_CPU_MAX_CPM) >> + >> + >> +/** >> + Get the SubNUMA mode. >> + >> + @return UINT8 The SubNUMA mode. >> + >> +**/ >> +UINT8 >> +EFIAPI >> +CpuGetSubNumaMode ( >> + VOID >> + ); >> + >> +/** >> + Get the number of SubNUMA region. >> + >> + @return UINT8 The number of SubNUMA region. >> + >> +**/ >> +UINT8 >> +EFIAPI >> +CpuGetNumberOfSubNumaRegion ( >> + VOID >> + ); >> + >> +/** >> + Get the SubNUMA node of a CPM. >> + >> + @param SocketId Socket index. >> + @param Cpm CPM index. >> + @return UINT8 The SubNUMA node of a CPM. >> + >> +**/ >> +UINT8 >> +EFIAPI >> +CpuGetSubNumNode ( >> + UINT8 Socket, >> + UINT16 Cpm >> + ); >> + >> +/** >> + Get the associativity of cache. >> + >> + @param Level Cache level. >> + @return UINT32 Associativity of cache. >> + >> +**/ >> +UINT32 >> +EFIAPI >> +CpuGetAssociativity ( >> + UINT32 Level >> + ); >> + >> +/** >> + Get the cache size. >> + >> + @param Level Cache level. >> + @return UINT32 Cache size. >> + >> +**/ >> +UINT32 >> +EFIAPI >> +CpuGetCacheSize ( >> + UINT32 Level >> + ); >> + >> +/** >> + Get the number of supported socket. >> + >> + @return UINT8 Number of supported socket. >> + >> +**/ >> +UINT8 >> +EFIAPI >> +GetNumberOfSupportedSockets ( >> + VOID >> + ); >> + >> +/** >> + Get the number of active socket. >> + >> + @return UINT8 Number of active socket. >> + >> +**/ >> +UINT8 >> +EFIAPI >> +GetNumberOfActiveSockets ( >> + VOID >> + ); >> + >> +/** >> + Get the number of active CPM per socket. >> + >> + @param SocketId Socket index. >> + @return UINT16 Number of CPM. >> + >> +**/ >> +UINT16 >> +EFIAPI >> +GetNumberOfActiveCPMsPerSocket ( >> + UINT8 SocketId >> + ); >> + >> +/** >> + Get the number of configured CPM per socket. >> + >> + @param SocketId Socket index. >> + @return UINT16 Number of configured CPM. >> + >> +**/ >> +UINT16 >> +EFIAPI >> +GetNumberOfConfiguredCPMs ( >> + UINT8 SocketId >> + ); >> + >> +/** >> + Set the number of configured CPM per socket. >> + >> + @param SocketId Socket index. >> + @param NumberOfCPMs Number of CPM to be configured. >> + @return EFI_SUCCESS Operation succeeded. >> + @return Others An error has occurred. >> + >> +**/ >> +EFI_STATUS >> +EFIAPI >> +SetNumberOfConfiguredCPMs ( >> + UINT8 SocketId, >> + UINT16 NumberOfCPMs >> + ); >> + >> +/** >> + Get the maximum number of core per socket. This number >> + should be the same for all sockets. >> + >> + @return UINT16 Maximum number of core. >> + >> +**/ >> +UINT16 >> +EFIAPI >> +GetMaximumNumberOfCores ( >> + VOID >> + ); >> + >> +/** >> + Get the maximum number of CPM per socket. This number >> + should be the same for all sockets. >> + >> + @return UINT32 Maximum number of CPM. >> + >> +**/ >> +UINT16 >> +EFIAPI >> +GetMaximumNumberOfCPMs ( >> + VOID >> + ); >> + >> +/** >> + Get the number of active cores of a sockets. >> + >> + @return UINT16 Number of active core. >> + >> +**/ >> +UINT16 >> +EFIAPI >> +GetNumberOfActiveCoresPerSocket ( >> + UINT8 SocketId >> + ); >> + >> +/** >> + Get the number of active cores of all socket. >> + >> + @return UINT16 Number of active core. >> + >> +**/ >> +UINT16 >> +EFIAPI >> +GetNumberOfActiveCores ( >> + VOID >> + ); >> + >> +/** >> + Check if the logical CPU is enabled or not. >> + >> + @param CpuId The logical Cpu ID. Started from 0. >> + @return BOOLEAN TRUE if the Cpu enabled >> + FALSE if the Cpu disabled. >> + >> +**/ >> +BOOLEAN >> +EFIAPI >> +IsCpuEnabled ( >> + UINT16 CpuId >> + ); >> + >> + >> +/** >> + Check if the slave socket is present >> + >> + @return BOOLEAN TRUE if the Slave Cpu is present >> + FALSE if the Slave Cpu is not present >> + >> +**/ >> +BOOLEAN >> +EFIAPI >> +IsSlaveSocketPresent ( >> + VOID >> + ); >> + >> +/** >> + Check if the slave socket is active >> + >> + @return BOOLEAN TRUE if the Slave CPU Socket is active. >> + FALSE if the Slave CPU Socket is not active. >> + >> +**/ >> +BOOLEAN >> +EFIAPI >> +IsSlaveSocketActive ( >> + VOID >> + ); >> + >> +/** >> + Check if the CPU product ID is Ac01 >> + @return BOOLEAN TRUE if the Product ID is Ac01 >> + FALSE otherwise. >> + >> +**/ >> +BOOLEAN >> +EFIAPI >> +IsAc01Processor ( >> + VOID >> + ); >> + >> +#endif /* AMPERE_CPU_LIB_H_ */ > >> diff --git a/Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLib.c b/Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLib.c >> new file mode 100644 >> index 000000000000..8da698e0b855 >> --- /dev/null >> +++ b/Silicon/Ampere/AmpereAltraPkg/Library/AmpereCpuLib/AmpereCpuLib.c >> @@ -0,0 +1,706 @@ >> +/** @file >> + >> + Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.
>> + >> + SPDX-License-Identifier: BSD-2-Clause-Patent >> + >> +**/ >> + >> +#include >> +#include >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +STATIC PLATFORM_INFO_HOB *mPlatformInfoHob = NULL; >> + >> +PLATFORM_INFO_HOB * >> +GetPlatformHob ( >> + VOID >> + ) >> +{ >> + VOID *Hob; >> + >> + if (mPlatformInfoHob == NULL) { >> + Hob = GetNextGuidHob ( >> + &gPlatformHobGuid, >> + (CONST VOID *)FixedPcdGet64 (PcdSystemMemoryBase) >> + ); >> + ASSERT (Hob != NULL); >> + if (Hob == NULL) { >> + DEBUG ((DEBUG_ERROR, "%a: Failed to get gPlatformHobGuid!\n", __FUNCTION__)); >> + return NULL; >> + } >> + >> + mPlatformInfoHob = (PLATFORM_INFO_HOB *)GET_GUID_HOB_DATA (Hob); >> + } >> + >> + return mPlatformInfoHob; >> +} >> + >> +/** >> + Get the SubNUMA mode. >> + >> + @return UINT8 The SubNUMA mode. >> + >> +**/ >> +UINT8 >> +EFIAPI >> +CpuGetSubNumaMode ( >> + VOID >> + ) >> +{ >> + PLATFORM_INFO_HOB *PlatformHob; >> + >> + PlatformHob = GetPlatformHob (); >> + if (PlatformHob == NULL) { >> + return SUBNUMA_MODE_MONOLITHIC; >> + } >> + >> + return PlatformHob->SubNumaMode[0]; >> +} >> + >> +/** >> + Get the number of SubNUMA region. >> + >> + @return UINT8 The number of SubNUMA region. >> + >> +**/ >> +UINT8 >> +EFIAPI >> +CpuGetNumberOfSubNumaRegion ( >> + VOID >> + ) >> +{ >> + UINT8 SubNumaMode; >> + UINT8 NumberOfSubNumaRegion; >> + >> + SubNumaMode = CpuGetSubNumaMode (); >> + ASSERT (SubNumaMode <= SUBNUMA_MODE_QUADRANT); >> + >> + switch (SubNumaMode) { >> + case SUBNUMA_MODE_MONOLITHIC: >> + NumberOfSubNumaRegion = MONOLITIC_NUM_OF_REGION; >> + break; >> + >> + case SUBNUMA_MODE_HEMISPHERE: >> + NumberOfSubNumaRegion = HEMISPHERE_NUM_OF_REGION; >> + break; >> + >> + case SUBNUMA_MODE_QUADRANT: >> + NumberOfSubNumaRegion = QUADRANT_NUM_OF_REGION; >> + break; >> + >> + default: >> + // Should never reach there. >> + ASSERT (FALSE); >> + break; >> + } >> + >> + return NumberOfSubNumaRegion; >> +} >> + >> +/** >> + Get the SubNUMA node of a CPM. >> + >> + @param SocketId Socket index. >> + @param Cpm CPM index. >> + @return UINT8 The SubNUMA node of a CPM. >> + >> +**/ >> +UINT8 >> +EFIAPI >> +CpuGetSubNumNode ( >> + UINT8 SocketId, >> + UINT16 Cpm >> + ) >> +{ >> + BOOLEAN IsAsymMesh; >> + UINT8 SubNumaNode; >> + UINT16 MaxNumberOfCPM; >> + UINT8 MiddleRow; >> + UINT8 QuadrantHigherRowNodeNumber[NUM_OF_CPM_PER_MESH_ROW] = {1, 1, 1, 1, 3, 3, 3, 3}; >> + UINT8 QuadrantLowerRowNodeNumber[NUM_OF_CPM_PER_MESH_ROW] = {0, 0, 0, 0, 2, 2, 2, 2}; >> + UINT8 QuadrantMiddleRowNodeNumber[NUM_OF_CPM_PER_MESH_ROW] = {0, 0, 1, 1, 3, 3, 2, 2}; >> + UINT8 SubNumaMode; >> + >> + MaxNumberOfCPM = GetMaximumNumberOfCPMs (); >> + SubNumaMode = CpuGetSubNumaMode (); >> + ASSERT (SubNumaMode <= SUBNUMA_MODE_QUADRANT); >> + >> + switch (SubNumaMode) { >> + case SUBNUMA_MODE_MONOLITHIC: >> + SubNumaNode = (SocketId == 0) ? 0 : 1; >> + break; >> + >> + case SUBNUMA_MODE_HEMISPHERE: >> + if (CPM_PER_ROW_OFFSET (Cpm) >= SUBNUMA_CPM_REGION_SIZE) { >> + SubNumaNode = 1; >> + } else { >> + SubNumaNode = 0; >> + } >> + >> + if (SocketId == 1) { >> + SubNumaNode += HEMISPHERE_NUM_OF_REGION; >> + } >> + break; >> + >> + case SUBNUMA_MODE_QUADRANT: >> + // >> + // CPM Mesh Rows >> + // >> + // |---------------------------------------| >> + // | 00 ----------- 03 | 04 ----------- 07 | Row 0 >> + // |-------------------|-------------------| >> + // | 08 ----------- 11 | 12 ----------- 15 | Row 1 >> + // |-------------------|-------------------| >> + // | 16 - 17 | 18 - 19 | 20 - 21 | 22 - 23 | Middle Row >> + // |-------------------|-------------------| >> + // | 24 ----------- 27 | 28 ----------- 31 | Row 3 >> + // |-------------------|-------------------| >> + // | 32 ----------- 35 | 36 ----------- 39 | Row 4 >> + // |---------------------------------------| >> + // >> + >> + IsAsymMesh = (BOOLEAN)(CPM_ROW_NUMBER (MaxNumberOfCPM) % 2 != 0); >> + MiddleRow = CPM_ROW_NUMBER (MaxNumberOfCPM) / 2; >> + if (IsAsymMesh >> + && CPM_ROW_NUMBER (Cpm) == MiddleRow) >> + { >> + SubNumaNode = QuadrantMiddleRowNodeNumber[CPM_PER_ROW_OFFSET (Cpm)]; >> + >> + } else if (CPM_ROW_NUMBER (Cpm) >= MiddleRow) { >> + SubNumaNode = QuadrantHigherRowNodeNumber[CPM_PER_ROW_OFFSET (Cpm)]; >> + >> + } else { >> + SubNumaNode = QuadrantLowerRowNodeNumber[CPM_PER_ROW_OFFSET (Cpm)]; >> + } >> + >> + if (SocketId == 1) { >> + SubNumaNode += QUADRANT_NUM_OF_REGION; >> + } >> + break; >> + >> + default: >> + // Should never reach there. >> + ASSERT (FALSE); >> + break; >> + } >> + >> + return SubNumaNode; >> +} >> + >> +/** >> + Get the associativity of cache. >> + >> + @param Level Cache level. >> + @return UINT32 Associativity of cache. >> + >> +**/ >> +UINT32 >> +EFIAPI >> +CpuGetAssociativity ( >> + UINT32 Level >> + ) >> +{ > I do feel some of this stuff could be replaced by the common functions > we now have in ArmLib (that we didn't when v1 went out). > >> + UINT64 CacheCCSIDR; >> + UINT64 CacheCLIDR; >> + UINT32 Value = 0x2; /* Unknown Set-Associativity */ >> + >> + CacheCLIDR = ReadCLIDR (); >> + if (!CLIDR_CTYPE (CacheCLIDR, Level)) { >> + return Value; >> + } >> + >> + CacheCCSIDR = ReadCCSIDR (Level); >> + switch (CCSIDR_ASSOCIATIVITY (CacheCCSIDR)) { >> + case 0: >> + /* Direct mapped */ >> + Value = 0x3; >> + break; >> + >> + case 1: >> + /* 2-way Set-Associativity */ >> + Value = 0x4; >> + break; >> + >> + case 3: >> + /* 4-way Set-Associativity */ >> + Value = 0x5; >> + break; >> + >> + case 7: >> + /* 8-way Set-Associativity */ >> + Value = 0x7; >> + break; >> + >> + case 15: >> + /* 16-way Set-Associativity */ >> + Value = 0x8; >> + break; >> + >> + case 11: >> + /* 12-way Set-Associativity */ >> + Value = 0x9; >> + break; >> + >> + case 23: >> + /* 24-way Set-Associativity */ >> + Value = 0xA; >> + break; >> + >> + case 31: >> + /* 32-way Set-Associativity */ >> + Value = 0xB; >> + break; >> + >> + case 47: >> + /* 48-way Set-Associativity */ >> + Value = 0xC; >> + break; >> + >> + case 63: >> + /* 64-way Set-Associativity */ >> + Value = 0xD; >> + break; >> + >> + case 19: >> + /* 20-way Set-Associativity */ >> + Value = 0xE; >> + break; >> + } >> + >> + return Value; >> +} >> + >> +/** >> + Get the cache size. >> + >> + @param Level Cache level. >> + @return UINT32 Cache size. >> + >> +**/ >> +UINT32 >> +EFIAPI >> +CpuGetCacheSize ( >> + UINT32 Level >> + ) >> +{ >> + UINT32 CacheLineSize; >> + UINT32 Count; >> + UINT64 CacheCCSIDR; >> + UINT64 CacheCLIDR; >> + >> + CacheCLIDR = ReadCLIDR (); >> + if (!CLIDR_CTYPE (CacheCLIDR, Level)) { >> + return 0; >> + } >> + >> + CacheCCSIDR = ReadCCSIDR (Level); >> + CacheLineSize = 1; >> + Count = CCSIDR_LINE_SIZE (CacheCCSIDR) + 4; >> + while (Count-- > 0) { >> + CacheLineSize *= 2; >> + } >> + >> + return ((CCSIDR_NUMSETS (CacheCCSIDR) + 1) * >> + (CCSIDR_ASSOCIATIVITY (CacheCCSIDR) + 1) * >> + CacheLineSize); >> +} >> + >> +/** >> + Get the number of supported socket. >> + >> + @return UINT8 Number of supported socket. >> + >> +**/ >> +UINT8 >> +EFIAPI >> +GetNumberOfSupportedSockets ( >> + VOID >> + ) >> +{ >> + PLATFORM_INFO_HOB *PlatformHob; >> + >> + PlatformHob = GetPlatformHob (); >> + if (PlatformHob == NULL) { >> + // >> + // By default, the number of supported sockets is 1. >> + // >> + return 1; >> + } >> + >> + return (sizeof (PlatformHob->ClusterEn) / sizeof (PLATFORM_CLUSTER_EN)); >> +} >> + >> +/** >> + Get the number of active socket. >> + >> + @return UINT8 Number of active socket. >> + >> +**/ >> +UINT8 >> +EFIAPI >> +GetNumberOfActiveSockets ( >> + VOID >> + ) >> +{ >> + UINT8 NumberOfActiveSockets, Count, Index, Index1; >> + PLATFORM_CLUSTER_EN *Socket; >> + PLATFORM_INFO_HOB *PlatformHob; >> + >> + PlatformHob = GetPlatformHob (); >> + if (PlatformHob == NULL) { >> + // >> + // By default, the number of active sockets is 1. >> + // >> + return 1; >> + } >> + >> + NumberOfActiveSockets = 0; >> + >> + for (Index = 0; Index < GetNumberOfSupportedSockets (); Index++) { >> + Socket = &PlatformHob->ClusterEn[Index]; >> + Count = ARRAY_SIZE (Socket->EnableMask); >> + for (Index1 = 0; Index1 < Count; Index1++) { >> + if (Socket->EnableMask[Index1] != 0) { >> + NumberOfActiveSockets++; >> + break; >> + } >> + } >> + } >> + >> + return NumberOfActiveSockets; >> +} >> + >> +/** >> + Get the number of active CPM per socket. >> + >> + @param SocketId Socket index. >> + @return UINT16 Number of CPM. >> + >> +**/ >> +UINT16 >> +EFIAPI >> +GetNumberOfActiveCPMsPerSocket ( >> + UINT8 SocketId >> + ) >> +{ >> + UINT16 NumberOfCPMs, Count, Index; >> + UINT32 Val32; >> + PLATFORM_CLUSTER_EN *Socket; >> + PLATFORM_INFO_HOB *PlatformHob; >> + >> + PlatformHob = GetPlatformHob (); >> + if (PlatformHob == NULL) { >> + return 0; >> + } >> + >> + if (SocketId >= GetNumberOfActiveSockets ()) { >> + return 0; >> + } >> + >> + NumberOfCPMs = 0; >> + Socket = &PlatformHob->ClusterEn[SocketId]; >> + Count = ARRAY_SIZE (Socket->EnableMask); >> + for (Index = 0; Index < Count; Index++) { >> + Val32 = Socket->EnableMask[Index]; >> + while (Val32 > 0) { >> + if ((Val32 & 0x1) != 0) { >> + NumberOfCPMs++; >> + } >> + Val32 >>= 1; >> + } >> + } >> + >> + return NumberOfCPMs; >> +} >> + >> +/** >> + Get the number of configured CPM per socket. This number >> + should be the same for all sockets. >> + >> + @param SocketId Socket index. >> + @return UINT8 Number of configured CPM. >> + >> +**/ >> +UINT16 >> +EFIAPI >> +GetNumberOfConfiguredCPMs ( >> + UINT8 SocketId >> + ) >> +{ >> + EFI_STATUS Status; >> + UINT32 Value; >> + UINT32 Param, ParamStart, ParamEnd; >> + UINT16 Count; >> + >> + Count = 0; >> + ParamStart = NV_SI_S0_PCP_ACTIVECPM_0_31 + SocketId * NV_PARAM_ENTRYSIZE * (PLATFORM_CPU_MAX_CPM / 32); >> + ParamEnd = ParamStart + NV_PARAM_ENTRYSIZE * (PLATFORM_CPU_MAX_CPM / 32); >> + for (Param = ParamStart; Param < ParamEnd; Param += NV_PARAM_ENTRYSIZE) { >> + Status = NVParamGet ( >> + Param, >> + NV_PERM_ATF | NV_PERM_BIOS | NV_PERM_MANU | NV_PERM_BMC, >> + &Value >> + ); >> + if (EFI_ERROR (Status)) { >> + break; >> + } >> + while (Value != 0) { >> + if ((Value & 0x01) != 0) { >> + Count++; >> + } >> + Value >>= 1; >> + } >> + } >> + >> + return Count; >> +} >> + >> +/** >> + Set the number of configured CPM per socket. >> + >> + @param SocketId Socket index. >> + @param NumberOfCPMs Number of CPM to be configured. >> + @return EFI_SUCCESS Operation succeeded. >> + @return Others An error has occurred. >> + >> +**/ >> +EFI_STATUS >> +EFIAPI >> +SetNumberOfConfiguredCPMs ( >> + UINT8 SocketId, >> + UINT16 NumberOfCPMs >> + ) >> +{ >> + EFI_STATUS Status; >> + UINT32 Value; >> + UINT32 Param, ParamStart, ParamEnd; >> + BOOLEAN IsClear; >> + >> + IsClear = FALSE; >> + if (NumberOfCPMs == 0) { >> + IsClear = TRUE; >> + } >> + >> + Status = EFI_SUCCESS; >> + >> + ParamStart = NV_SI_S0_PCP_ACTIVECPM_0_31 + SocketId * NV_PARAM_ENTRYSIZE * (PLATFORM_CPU_MAX_CPM / 32); >> + ParamEnd = ParamStart + NV_PARAM_ENTRYSIZE * (PLATFORM_CPU_MAX_CPM / 32); >> + for (Param = ParamStart; Param < ParamEnd; Param += NV_PARAM_ENTRYSIZE) { >> + if (NumberOfCPMs >= 32) { >> + Value = 0xffffffff; >> + NumberOfCPMs -= 32; >> + } else { >> + Value = 0; >> + while (NumberOfCPMs > 0) { >> + Value |= (1 << (--NumberOfCPMs)); >> + } >> + } >> + if (IsClear) { >> + /* Clear this param */ >> + Status = NVParamClr ( >> + Param, >> + NV_PERM_BIOS | NV_PERM_MANU >> + ); >> + } else { >> + Status = NVParamSet ( >> + Param, >> + NV_PERM_ATF | NV_PERM_BIOS | NV_PERM_MANU | NV_PERM_BMC, >> + NV_PERM_BIOS | NV_PERM_MANU, >> + Value >> + ); >> + } >> + } >> + >> + return Status; >> +} >> + >> +/** >> + Get the maximum number of core per socket. >> + >> + @return UINT16 Maximum number of core. >> + >> +**/ >> +UINT16 >> +EFIAPI >> +GetMaximumNumberOfCores ( >> + VOID >> + ) >> +{ >> + PLATFORM_INFO_HOB *PlatformHob; >> + >> + PlatformHob = GetPlatformHob (); >> + if (PlatformHob == NULL) { >> + return 0; >> + } >> + >> + return PlatformHob->MaxNumOfCore[0]; >> +} >> + >> +/** >> + Get the maximum number of CPM per socket. This number >> + should be the same for all sockets. >> + >> + @return UINT16 Maximum number of CPM. >> + >> +**/ >> +UINT16 >> +EFIAPI >> +GetMaximumNumberOfCPMs ( >> + VOID >> + ) >> +{ >> + return GetMaximumNumberOfCores () / PLATFORM_CPU_NUM_CORES_PER_CPM; >> +} >> + >> +/** >> + Get the number of active cores of a sockets. >> + >> + @param SocketId Socket Index. >> + @return UINT16 Number of active core. >> + >> +**/ >> +UINT16 >> +EFIAPI >> +GetNumberOfActiveCoresPerSocket ( >> + UINT8 SocketId >> + ) >> +{ >> + return GetNumberOfActiveCPMsPerSocket (SocketId) * PLATFORM_CPU_NUM_CORES_PER_CPM; >> +} >> + >> +/** >> + Get the number of active cores of all sockets. >> + >> + @return UINT16 Number of active core. >> + >> +**/ >> +UINT16 >> +EFIAPI >> +GetNumberOfActiveCores ( >> + VOID >> + ) >> +{ >> + UINT16 NumberOfActiveCores; >> + UINT8 Index; >> + >> + NumberOfActiveCores = 0; >> + >> + for (Index = 0; Index < GetNumberOfActiveSockets (); Index++) { >> + NumberOfActiveCores += GetNumberOfActiveCoresPerSocket (Index); >> + } >> + >> + return NumberOfActiveCores; >> +} >> + >> +/** >> + Check if the logical CPU is enabled or not. >> + >> + @param CpuId The logical Cpu ID. Started from 0. >> + @return BOOLEAN TRUE if the Cpu enabled >> + FALSE if the Cpu disabled. >> + >> +**/ >> +BOOLEAN >> +EFIAPI >> +IsCpuEnabled ( >> + UINT16 CpuId >> + ) >> +{ >> + PLATFORM_CLUSTER_EN *Socket; >> + PLATFORM_INFO_HOB *PlatformHob; >> + UINT8 SocketId; >> + UINT16 ClusterId; >> + >> + SocketId = SOCKET_ID (CpuId); >> + ClusterId = CLUSTER_ID (CpuId); >> + >> + PlatformHob = GetPlatformHob (); >> + if (PlatformHob == NULL) { >> + return FALSE; >> + } >> + >> + if (SocketId >= GetNumberOfActiveSockets ()) { >> + return FALSE; >> + } >> + >> + Socket = &PlatformHob->ClusterEn[SocketId]; >> + if ((Socket->EnableMask[ClusterId / 32] & (1 << (ClusterId % 32))) != 0) { >> + return TRUE; >> + } >> + >> + return FALSE; >> +} >> + >> +/** >> + Check if the slave socket is present >> + >> + @return BOOLEAN TRUE if the Slave Cpu is present >> + FALSE if the Slave Cpu is not present >> + >> +**/ >> +BOOLEAN >> +EFIAPI >> +IsSlaveSocketPresent ( >> + VOID >> + ) >> +{ >> + UINT32 Value; >> + >> + Value = MmioRead32 (SMPRO_EFUSE_SHADOW0 + CFG2P_OFFSET); >> + >> + return ((Value & SLAVE_PRESENT_N) != 0) ? FALSE : TRUE; >> +} >> + >> +/** >> + Check if the slave socket is active >> + >> + @return BOOLEAN TRUE if the Slave CPU Socket is active. >> + FALSE if the Slave CPU Socket is not active. >> + >> +**/ >> +BOOLEAN >> +EFIAPI >> +IsSlaveSocketActive ( >> + VOID >> + ) >> +{ >> + return (GetNumberOfActiveSockets () > 1) ? TRUE : FALSE; >> +} >> + >> +/** >> + Check if the CPU product ID is Ac01 >> + @return BOOLEAN TRUE if the Product ID is Ac01 >> + FALSE otherwise. >> + >> +**/ >> +BOOLEAN >> +EFIAPI >> +IsAc01Processor ( >> + VOID >> + ) >> +{ >> + PLATFORM_INFO_HOB *PlatformHob; >> + >> + PlatformHob = GetPlatformHob (); >> + ASSERT (PlatformHob != NULL); >> + >> + if (PlatformHob != NULL) { >> + if ((PlatformHob->ScuProductId[0] & 0xFF) == 0x01) { >> + return TRUE; >> + } >> + } >> + >> + return FALSE; >> +} > > >> diff --git a/Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformLib.c b/Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformLib.c >> new file mode 100644 >> index 000000000000..8c1eb93f00fd >> --- /dev/null >> +++ b/Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformLib.c >> @@ -0,0 +1,169 @@ >> +/** @file >> + >> + Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.
>> + >> + SPDX-License-Identifier: BSD-2-Clause-Patent >> + >> +**/ >> + >> +#include >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +ARM_CORE_INFO mArmPlatformMpCoreInfoTable[PLATFORM_CPU_MAX_NUM_CORES]; >> + >> +/** >> + Return the current Boot Mode >> + >> + This function returns the boot reason on the platform >> + >> + @return Return the current Boot Mode of the platform >> + >> +**/ >> +EFI_BOOT_MODE >> +ArmPlatformGetBootMode ( >> + VOID >> + ) >> +{ >> + return BOOT_WITH_FULL_CONFIGURATION; >> +} >> + >> +/** >> + Initialize controllers that must setup in the normal world >> + >> + This function is called by the ArmPlatformPkg/PrePi or ArmPlatformPkg/PlatformPei >> + in the PEI phase. >> + >> +**/ >> +EFI_STATUS >> +ArmPlatformInitialize ( >> + IN UINTN MpId >> + ) >> +{ >> + RETURN_STATUS Status; >> + UINT64 BaudRate; >> + UINT32 ReceiveFifoDepth; >> + EFI_PARITY_TYPE Parity; >> + UINT8 DataBits; >> + EFI_STOP_BITS_TYPE StopBits; >> + >> + Status = EFI_SUCCESS; >> + >> + if (FixedPcdGet64 (PcdSerialRegisterBase) != 0) { >> + /* Debug port should use the same parameters with console */ >> + BaudRate = FixedPcdGet64 (PcdUartDefaultBaudRate); >> + ReceiveFifoDepth = FixedPcdGet32 (PcdUartDefaultReceiveFifoDepth); >> + Parity = (EFI_PARITY_TYPE)FixedPcdGet8 (PcdUartDefaultParity); >> + DataBits = FixedPcdGet8 (PcdUartDefaultDataBits); >> + StopBits = (EFI_STOP_BITS_TYPE)FixedPcdGet8 (PcdUartDefaultStopBits); >> + >> + /* Initialize uart debug port */ >> + Status = PL011UartInitializePort ( >> + (UINTN)FixedPcdGet64 (PcdSerialRegisterBase), >> + FixedPcdGet32 (PL011UartClkInHz), >> + &BaudRate, >> + &ReceiveFifoDepth, >> + &Parity, >> + &DataBits, >> + &StopBits >> + ); >> + } >> + >> + return Status; >> +} >> + >> +EFI_STATUS >> +PrePeiCoreGetMpCoreInfo ( >> + OUT UINTN *CoreCount, >> + OUT ARM_CORE_INFO **ArmCoreTable >> + ) >> +{ >> + UINTN mArmPlatformCoreCount; >> + UINTN ClusterId; >> + UINTN SocketId; >> + UINTN Index; >> + >> + ASSERT (CoreCount != NULL); >> + ASSERT (ArmCoreTable != NULL); >> + ASSERT (*ArmCoreTable != NULL); >> + >> + mArmPlatformCoreCount = 0; >> + for (Index = 0; Index < PLATFORM_CPU_MAX_NUM_CORES; Index++) { >> + if (!IsCpuEnabled (Index)) { >> + continue; >> + } >> + SocketId = SOCKET_ID (Index); >> + ClusterId = CLUSTER_ID (Index); >> + mArmPlatformMpCoreInfoTable[mArmPlatformCoreCount].ClusterId = SocketId; >> + mArmPlatformMpCoreInfoTable[mArmPlatformCoreCount].CoreId = >> + (ClusterId << 8) | (Index % PLATFORM_CPU_NUM_CORES_PER_CPM); >> + mArmPlatformMpCoreInfoTable[mArmPlatformCoreCount].MailboxClearAddress = 0; >> + mArmPlatformMpCoreInfoTable[mArmPlatformCoreCount].MailboxClearValue = 0; >> + mArmPlatformMpCoreInfoTable[mArmPlatformCoreCount].MailboxGetAddress = 0; >> + mArmPlatformMpCoreInfoTable[mArmPlatformCoreCount].MailboxSetAddress = 0; >> + mArmPlatformCoreCount++; >> + } >> + >> + *CoreCount = mArmPlatformCoreCount; >> + >> + *ArmCoreTable = mArmPlatformMpCoreInfoTable; >> + ASSERT (*ArmCoreTable != NULL); >> + >> + return EFI_SUCCESS; >> +} >> + >> +// Needs to be declared in the file. Otherwise gArmMpCoreInfoPpiGuid is undefined in the contect of PrePeiCore >> +EFI_GUID mArmMpCoreInfoPpiGuid = ARM_MP_CORE_INFO_PPI_GUID; >> +ARM_MP_CORE_INFO_PPI mMpCoreInfoPpi = { PrePeiCoreGetMpCoreInfo }; >> + >> +EFI_PEI_PPI_DESCRIPTOR gPlatformPpiTable[] = { >> + { >> + EFI_PEI_PPI_DESCRIPTOR_PPI, >> + &mArmMpCoreInfoPpiGuid, >> + &mMpCoreInfoPpi >> + }, >> +}; >> + >> +/** >> + Return the Platform specific PPIs >> + >> + This function exposes the Platform Specific PPIs. They can be used by any PrePi modules or passed >> + to the PeiCore by PrePeiCore. >> + >> + @param[out] PpiListSize Size in Bytes of the Platform PPI List >> + @param[out] PpiList Platform PPI List >> + >> +**/ >> +VOID >> +ArmPlatformGetPlatformPpiList ( >> + OUT UINTN *PpiListSize, >> + OUT EFI_PEI_PPI_DESCRIPTOR **PpiList >> + ) >> +{ >> + ASSERT (PpiListSize != NULL); >> + ASSERT (PpiList != NULL); >> + ASSERT (*PpiList != NULL); >> + >> + if (ArmIsMpCore ()) { >> + *PpiListSize = sizeof (gPlatformPpiTable); >> + *PpiList = gPlatformPpiTable; >> + } else { >> + *PpiListSize = 0; >> + *PpiList = NULL; >> + } >> +} >> diff --git a/Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformLibMemory.c b/Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformLibMemory.c >> new file mode 100644 >> index 000000000000..117c9cc56ac2 >> --- /dev/null >> +++ b/Silicon/Ampere/AmpereAltraPkg/Library/ArmPlatformLib/ArmPlatformLibMemory.c >> @@ -0,0 +1,399 @@ >> +/** @file >> + >> + Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.
>> + >> + SPDX-License-Identifier: BSD-2-Clause-Patent >> + >> +**/ >> + >> +#include >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +/* Number of Virtual Memory Map Descriptors */ >> +#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 50 >> + >> +/* DDR attributes */ >> +#define DDR_ATTRIBUTES_CACHED ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK >> +#define DDR_ATTRIBUTES_UNCACHED ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED >> + >> +/** >> + Return the Virtual Memory Map of your platform >> + >> + This Virtual Memory Map is used by MemoryInitPei Module to initialize the MMU on your platform. >> + >> + @param[out] VirtualMemoryMap Array of ARM_MEMORY_REGION_DESCRIPTOR describing a Physical-to- >> + Virtual Memory mapping. This array must be ended by a zero-filled >> + entry >> + >> +**/ >> +VOID >> +ArmPlatformGetVirtualMemoryMap ( >> + OUT ARM_MEMORY_REGION_DESCRIPTOR **VirtualMemoryMap >> + ) >> +{ >> + UINTN Index = 0; >> + ARM_MEMORY_REGION_DESCRIPTOR *VirtualMemoryTable; >> + UINT32 NumRegion; >> + UINTN Count; >> + VOID *Hob; >> + PLATFORM_INFO_HOB *PlatformHob; >> + >> + Hob = GetFirstGuidHob (&gPlatformHobGuid); >> + ASSERT (Hob != NULL); >> + if (Hob == NULL) { >> + return; >> + } >> + >> + PlatformHob = (PLATFORM_INFO_HOB *)GET_GUID_HOB_DATA (Hob); >> + >> + ASSERT (VirtualMemoryMap != NULL); >> + >> + VirtualMemoryTable = (ARM_MEMORY_REGION_DESCRIPTOR *)AllocatePages (EFI_SIZE_TO_PAGES (sizeof (ARM_MEMORY_REGION_DESCRIPTOR) * MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS)); >> + if (VirtualMemoryTable == NULL) { >> + return; >> + } >> + >> + /* For Address space 0x1000_0000_0000 to 0x1001_00FF_FFFF >> + * - Device memory >> + */ >> + VirtualMemoryTable[Index].PhysicalBase = 0x100000000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x100000000000ULL; >> + VirtualMemoryTable[Index].Length = 0x102000000ULL; > Please move all of these live-coded addresses/sizes to a private .h > and use symbolic names here. > >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* For Address space 0x5000_0000_0000 to 0x5001_00FF_FFFF >> + * - Device memory >> + */ >> + if (IsSlaveSocketActive ()) >> + { >> + VirtualMemoryTable[++Index].PhysicalBase = 0x500000000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x500000000000ULL; >> + VirtualMemoryTable[Index].Length = 0x101000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + } >> + >> + /* >> + * - PCIe RCA0 Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x300000000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x300000000000ULL; >> + VirtualMemoryTable[Index].Length = 0x40000000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - 2P/PCIe Socket0 RCA0 32-bit Device memory >> + * - 1P/PCIe consolidated to RCB2 32-bit Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x20000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x20000000ULL; >> + VirtualMemoryTable[Index].Length = 0x8000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - PCIe RCA1 Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x340000000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x340000000000ULL; >> + VirtualMemoryTable[Index].Length = 0x40000000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - 2P/PCIe Socket0 RCA1 32-bit Device memory >> + * - 1P/PCIe consolidated to RCB2 32-bit Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x28000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x28000000ULL; >> + VirtualMemoryTable[Index].Length = 0x8000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - PCIe RCA2 Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x380000000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x380000000000ULL; >> + VirtualMemoryTable[Index].Length = 0x40000000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - 2P/PCIe Socket0 RCA2 32-bit Device memory >> + * - 1P/PCIe consolidated to RCB3 32-bit Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x30000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x30000000ULL; >> + VirtualMemoryTable[Index].Length = 0x8000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - PCIe RCA3 Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x3C0000000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x3C0000000000ULL; >> + VirtualMemoryTable[Index].Length = 0x40000000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - 2P/PCIe Socket0 RCA3 32-bit Device memory >> + * - 1P/PCIe consolidated to RCB3 32-bit Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x38000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x38000000ULL; >> + VirtualMemoryTable[Index].Length = 0x8000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - PCIe RCB0 Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x200000000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x200000000000ULL; >> + VirtualMemoryTable[Index].Length = 0x40000000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - 2P/PCIe Socket0 RCB0 32-bit Device memory >> + * - 1P/PCIe consolidated to RCB0 32-bit Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x00000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x00000000ULL; >> + VirtualMemoryTable[Index].Length = 0x8000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - PCIe RCB1 Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x240000000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x240000000000ULL; >> + VirtualMemoryTable[Index].Length = 0x40000000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - 2P/PCIe Socket0 RCB1 32-bit Device memory >> + * - 1P/PCIe consolidated to RCB0 32-bit Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x08000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x08000000ULL; >> + VirtualMemoryTable[Index].Length = 0x8000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - PCIe RCB2 Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x280000000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x280000000000ULL; >> + VirtualMemoryTable[Index].Length = 0x40000000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - 2P/PCIe Socket0 RCB2 32-bit Device memory >> + * - 1P/PCIe consolidated to RCB1 32-bit Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x10000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x10000000ULL; >> + VirtualMemoryTable[Index].Length = 0x8000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - PCIe RCB3 Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x2C0000000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x2C0000000000ULL; >> + VirtualMemoryTable[Index].Length = 0x40000000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - 2P/PCIe Socket0 RCB3 32-bit Device memory >> + * - 1P/PCIe consolidated to RCB1 32-bit Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x18000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x18000000ULL; >> + VirtualMemoryTable[Index].Length = 0x8000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + if (IsSlaveSocketActive ()) { >> + // Slave socket exist >> + /* >> + * - PCIe RCA0 Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x700000000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x700000000000ULL; >> + VirtualMemoryTable[Index].Length = 0x40000000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - PCIe RCA1 Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x740000000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x740000000000ULL; >> + VirtualMemoryTable[Index].Length = 0x40000000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - PCIe RCA2 Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x780000000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x780000000000ULL; >> + VirtualMemoryTable[Index].Length = 0x40000000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - PCIe RCA3 Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x7C0000000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x7C0000000000ULL; >> + VirtualMemoryTable[Index].Length = 0x40000000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - PCIe RCB0 Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x600000000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x600000000000ULL; >> + VirtualMemoryTable[Index].Length = 0x40000000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - PCIe RCB1 Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x640000000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x640000000000ULL; >> + VirtualMemoryTable[Index].Length = 0x40000000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - PCIe RCB2 Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x680000000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x680000000000ULL; >> + VirtualMemoryTable[Index].Length = 0x40000000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - PCIe RCB3 Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x6C0000000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x6C0000000000ULL; >> + VirtualMemoryTable[Index].Length = 0x40000000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + } >> + >> + /* >> + * - 2P/PCIe Socket1 RCA0 32-bit Device memory >> + * - 1P/PCIe consolidated to RCA2 32-bit Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x60000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x60000000ULL; >> + VirtualMemoryTable[Index].Length = 0x8000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - 2P/PCIe Socket1 RCA1 32-bit Device memory >> + * - 1P/PCIe consolidated to RCA2 32-bit Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x68000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x68000000ULL; >> + VirtualMemoryTable[Index].Length = 0x8000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - 2P/PCIe Socket1 RCA2 32-bit Device memory >> + * - 1P/PCIe consolidated to RCA3 32-bit Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x70000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x70000000ULL; >> + VirtualMemoryTable[Index].Length = 0x8000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - 2P/PCIe Socket1 RCA3 32-bit Device memory >> + * - 1P/PCIe consolidated to RCA3 32-bit Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x78000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x78000000ULL; >> + VirtualMemoryTable[Index].Length = 0x8000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - 2P/PCIe Socket1 RCB0 32-bit Device memory >> + * - 1P/PCIe consolidated to RCA0 32-bit Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x40000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x40000000ULL; >> + VirtualMemoryTable[Index].Length = 0x8000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - 2P/PCIe Socket1 RCB1 32-bit Device memory >> + * - 1P/PCIe consolidated to RCA0 32-bit Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x48000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x48000000ULL; >> + VirtualMemoryTable[Index].Length = 0x8000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - 2P/PCIe Socket1 RCB2 32-bit Device memory >> + * - 1P/PCIe consolidated to RCA1 32-bit Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x50000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x50000000ULL; >> + VirtualMemoryTable[Index].Length = 0x8000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - 2P/PCIe Socket1 RCB3 32-bit Device memory >> + * - 1P/PCIe consolidated to RCA1 32-bit Device memory >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x58000000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x58000000ULL; >> + VirtualMemoryTable[Index].Length = 0x8000000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - BERT memory region >> + */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0x88230000ULL; >> + VirtualMemoryTable[Index].VirtualBase = 0x88230000ULL; >> + VirtualMemoryTable[Index].Length = 0x50000ULL; >> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; >> + >> + /* >> + * - DDR memory region >> + */ >> + NumRegion = PlatformHob->DramInfo.NumRegion; >> + Count = 0; >> + while (NumRegion-- > 0) { >> + if (PlatformHob->DramInfo.NvdRegion[Count]) { /* Skip NVDIMM Region */ >> + Count++; >> + continue; >> + } >> + >> + VirtualMemoryTable[++Index].PhysicalBase = PlatformHob->DramInfo.Base[Count]; >> + VirtualMemoryTable[Index].VirtualBase = PlatformHob->DramInfo.Base[Count]; >> + VirtualMemoryTable[Index].Length = PlatformHob->DramInfo.Size[Count]; >> + VirtualMemoryTable[Index].Attributes = DDR_ATTRIBUTES_CACHED; >> + Count++; >> + } >> + >> + /* SPM MM NS Buffer for MmCommunicateDxe */ >> + VirtualMemoryTable[++Index].PhysicalBase = PcdGet64 (PcdMmBufferBase); >> + VirtualMemoryTable[Index].VirtualBase = PcdGet64 (PcdMmBufferBase); >> + VirtualMemoryTable[Index].Length = PcdGet64 (PcdMmBufferSize); >> + VirtualMemoryTable[Index].Attributes = DDR_ATTRIBUTES_CACHED; >> + >> + /* End of Table */ >> + VirtualMemoryTable[++Index].PhysicalBase = 0; >> + VirtualMemoryTable[Index].VirtualBase = 0; >> + VirtualMemoryTable[Index].Length = 0; >> + VirtualMemoryTable[Index].Attributes = (ARM_MEMORY_REGION_ATTRIBUTES)0; >> + >> + ASSERT ((Index + 1) <= MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS); >> + >> + *VirtualMemoryMap = VirtualMemoryTable; >> +} > > >> diff --git a/Silicon/Ampere/AmpereAltraPkg/Library/MailboxInterfaceLib/MailboxInterfaceLib.c b/Silicon/Ampere/AmpereAltraPkg/Library/MailboxInterfaceLib/MailboxInterfaceLib.c >> new file mode 100644 >> index 000000000000..0da1f90699f6 >> --- /dev/null >> +++ b/Silicon/Ampere/AmpereAltraPkg/Library/MailboxInterfaceLib/MailboxInterfaceLib.c >> @@ -0,0 +1,282 @@ >> +/** @file >> + The library implements the hardware Mailbox (Doorbell) interface for communication >> + between the Application Processor (ARMv8) and the System Control Processors (SMpro/PMpro). >> + >> + Copyright (c) 2021, Ampere Computing LLC. All rights reserved.
>> + >> + SPDX-License-Identifier: BSD-2-Clause-Patent >> + >> +**/ >> + >> +#include >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +// >> +// Hardware Doorbells >> +// >> +#define SMPRO_DB0_IRQ_OFST 40 >> +#define SMPRO_DB0_BASE_ADDRESS (FixedPcdGet64 (PcdSmproDbBaseReg)) >> + >> +#define PMPRO_DB0_IRQ_OFST 56 >> +#define PMPRO_DB0_BASE_ADDRESS (FixedPcdGet64 (PcdPmproDbBaseReg)) >> + >> +#define SLAVE_SOCKET_BASE_ADDRESS_OFFSET 0x400000000000 >> + >> +// >> +// The base SPI interrupt number of the Slave socket >> +// >> +#define SLAVE_SOCKET_SPI_INTERRUPT 352 >> + >> +#define SLAVE_SOCKET_DOORBELL_INTERRUPT_BASE(Socket) ((Socket) * SLAVE_SOCKET_SPI_INTERRUPT - 32) >> + >> +// >> +// Doorbell base register stride size >> +// >> +#define DB_BASE_REG_STRIDE 0x00001000 >> + >> +#define SMPRO_DBx_ADDRESS(socket, db) \ >> + ((socket) * SLAVE_SOCKET_BASE_ADDRESS_OFFSET + SMPRO_DB0_BASE_ADDRESS + DB_BASE_REG_STRIDE * (db)) >> + >> +#define PMPRO_DBx_ADDRESS(socket, db) \ >> + ((socket) * SLAVE_SOCKET_BASE_ADDRESS_OFFSET + PMPRO_DB0_BASE_ADDRESS + DB_BASE_REG_STRIDE * (db)) >> + >> +// >> +// Doorbell Status Bits >> +// >> +#define DB_STATUS_AVAIL_BIT BIT16 >> +#define DB_STATUS_ACK_BIT BIT0 >> + >> +/** >> + Get the base address of a doorbell. >> + >> + @param[in] Socket Active socket index. >> + @param[in] Doorbell Doorbell channel for communication with the SMpro/PMpro. >> + >> + @retval UINT32 The base address of the doorbell. >> + The returned value is 0 indicate that the input parameters are invalid. >> + >> +**/ >> +UINTN >> +EFIAPI >> +MailboxGetDoorbellAddress ( >> + IN UINT8 Socket, >> + IN DOORBELL_CHANNELS Doorbell >> + ) >> +{ >> + UINTN DoorbellAddress; >> + >> + if (Socket >= GetNumberOfActiveSockets () >> + || Doorbell >= NUMBER_OF_DOORBELLS_PER_SOCKET) >> + { >> + return 0; >> + } > Coding style is > if () { > } > > This file gets it consistently wrong. I agree that it should be consistent. But that coding style conforms to "5.2.1.6 Each sub-expression of a complex predicate expression must be on a separate line" in EDK II Coding Standards Spec (https://edk2-docs.gitbook.io/edk-ii-c-coding-standards-specification/5_source_files/52_spacing#5-2-1-6-each-sub-expression-of-a-complex-predicate-expression-must-be-on-a-separate-line). "Predicate expressions containing multiple operators with sub-expressions joined by && or || must have each sub-expression on a separate line. The opening brace, '|{|' of the body shall be on a line by itself and aligned in the starting column of the associated keyword. while ( ( Code == MEETS_STANDARD)   && ( Code == FUNCTIONAL)) {   ShipIt(); } " However, I'm OK to change it as your suggestion. Thanks, Nhi > >> + >> + if (Doorbell >= SMproDoorbellChannel0) { >> + DoorbellAddress = SMPRO_DBx_ADDRESS (Socket, (UINT8)(Doorbell - SMproDoorbellChannel0)); >> + } else { >> + DoorbellAddress = PMPRO_DBx_ADDRESS (Socket, (UINT8)Doorbell); >> + } >> + >> + return DoorbellAddress; >> +} >> + >> +/** >> + Get the interrupt number of a doorbell. >> + >> + @param[in] Socket Active socket index. >> + @param[in] Doorbell Doorbell channel for communication with the SMpro/PMpro. >> + >> + @retval UINT32 The interrupt number. >> + The returned value is 0 indicate that the input parameters are invalid. >> + >> +**/ >> +UINT32 >> +EFIAPI >> +MailboxGetDoorbellInterruptNumber ( >> + IN UINT8 Socket, >> + IN DOORBELL_CHANNELS Doorbell >> + ) >> +{ >> + UINT32 DoorbellInterruptNumber; >> + >> + if (Socket >= GetNumberOfActiveSockets () >> + || Doorbell >= NUMBER_OF_DOORBELLS_PER_SOCKET) >> + { >> + return 0; >> + } >> + >> + DoorbellInterruptNumber = 0; >> + >> + if (Socket > 0) { >> + DoorbellInterruptNumber = SLAVE_SOCKET_DOORBELL_INTERRUPT_BASE (Socket); >> + } >> + >> + if (Doorbell >= SMproDoorbellChannel0) { >> + DoorbellInterruptNumber += SMPRO_DB0_IRQ_OFST + (UINT8)(Doorbell - SMproDoorbellChannel0); >> + } else { >> + DoorbellInterruptNumber += PMPRO_DB0_IRQ_OFST + (UINT8)Doorbell; >> + } >> + >> + return DoorbellInterruptNumber; >> +} >> + >> +/** >> + Read a message via the hardware Doorbell interface. >> + >> + @param[in] Socket Active socket index. >> + @param[in] Doorbell Doorbell channel for communication with the SMpro/PMpro. >> + @param[out] Message Pointer to the Mailbox message. >> + >> + @retval EFI_SUCCESS Read the message successfully. >> + @retval EFI_TIMEOUT Timeout occurred when waiting for available message in the mailbox. >> + @retval EFI_INVALID_PARAMETER A parameter is invalid. >> +**/ >> +EFI_STATUS >> +EFIAPI >> +MailboxRead ( >> + IN UINT8 Socket, >> + IN DOORBELL_CHANNELS Doorbell, >> + OUT MAILBOX_MESSAGE_DATA *Message >> + ) >> +{ >> + UINTN TimeoutCount; >> + UINTN DoorbellAddress; >> + >> + if (Socket >= GetNumberOfActiveSockets () >> + || Doorbell >= NUMBER_OF_DOORBELLS_PER_SOCKET >> + || Message == NULL) >> + { >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + TimeoutCount = MAILBOX_POLL_COUNT; >> + >> + DoorbellAddress = MailboxGetDoorbellAddress (Socket, Doorbell); >> + ASSERT (DoorbellAddress != 0); >> + >> + // >> + // Polling Doorbell status >> + // >> + while ((MmioRead32 ((DoorbellAddress + DB_STATUS_REG_OFST)) & DB_STATUS_AVAIL_BIT) == 0) { >> + MicroSecondDelay (MAILBOX_POLL_INTERVAL_US); >> + if (--TimeoutCount == 0) { >> + return EFI_TIMEOUT; >> + } >> + } >> + >> + Message->ExtendedData[0] = MmioRead32 (DoorbellAddress + DB_DIN0_REG_OFST); >> + Message->ExtendedData[1] = MmioRead32 (DoorbellAddress + DB_DIN1_REG_OFST); >> + Message->Data = MmioRead32 (DoorbellAddress + DB_IN_REG_OFST); >> + >> + // >> + // Write 1 to clear the AVAIL status >> + // >> + MmioWrite32 (DoorbellAddress + DB_STATUS_REG_OFST, DB_STATUS_AVAIL_BIT); >> + >> + return EFI_SUCCESS; >> +} >> + >> +/** >> + Write a message via the hardware Doorbell interface. >> + >> + @param[in] Socket Active socket index. >> + @param[in] Doorbell Doorbel channel for communication with the SMpro/PMpro. >> + @param[in] Message Pointer to the Mailbox message. >> + >> + @retval EFI_SUCCESS Write the message successfully. >> + @retval EFI_TIMEOUT Timeout occurred when waiting for acknowledge signal from the mailbox. >> + @retval EFI_INVALID_PARAMETER A parameter is invalid. >> +**/ >> +EFI_STATUS >> +EFIAPI >> +MailboxWrite ( >> + IN UINT8 Socket, >> + IN DOORBELL_CHANNELS Doorbell, >> + IN MAILBOX_MESSAGE_DATA *Message >> + ) >> +{ >> + UINTN TimeoutCount; >> + UINTN DoorbellAddress; >> + >> + if (Socket >= GetNumberOfActiveSockets () >> + || Doorbell >= NUMBER_OF_DOORBELLS_PER_SOCKET >> + || Message == NULL) >> + { >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + TimeoutCount = MAILBOX_POLL_COUNT; >> + >> + DoorbellAddress = MailboxGetDoorbellAddress (Socket, Doorbell); >> + ASSERT (DoorbellAddress != 0); >> + >> + // >> + // Clear previous pending ack if any >> + // >> + if ((MmioRead32 (DoorbellAddress + DB_STATUS_REG_OFST) & DB_STATUS_ACK_BIT) != 0) { >> + MmioWrite32 (DoorbellAddress + DB_STATUS_REG_OFST, DB_STATUS_ACK_BIT); >> + } >> + >> + // >> + // Send message >> + // >> + MmioWrite32 (DoorbellAddress + DB_DOUT0_REG_OFST, Message->ExtendedData[0]); >> + MmioWrite32 (DoorbellAddress + DB_DOUT1_REG_OFST, Message->ExtendedData[1]); >> + MmioWrite32 (DoorbellAddress + DB_OUT_REG_OFST, Message->Data); >> + >> + // >> + // Wait for ACK >> + // >> + while ((MmioRead32 (DoorbellAddress + DB_STATUS_REG_OFST) & DB_STATUS_ACK_BIT) == 0) { >> + MicroSecondDelay (MAILBOX_POLL_INTERVAL_US); >> + if (--TimeoutCount == 0) { >> + return EFI_TIMEOUT; >> + } >> + } >> + >> + // >> + // Write 1 to clear the ACK status >> + // >> + MmioWrite32 (DoorbellAddress + DB_STATUS_REG_OFST, DB_STATUS_ACK_BIT); >> + >> + return EFI_SUCCESS; >> +} >> + >> +/** >> + Unmask the Doorbell interrupt status. >> + >> + @param Socket Active socket index. >> + @param Doorbell Doorbel channel for communication with the SMpro/PMpro. >> + >> + @retval EFI_SUCCESS Unmask the Doorbell interrupt successfully. >> + @retval EFI_INVALID_PARAMETER A parameter is invalid. >> + >> +**/ >> +EFI_STATUS >> +EFIAPI >> +MailboxUnmaskInterrupt ( >> + IN UINT8 Socket, >> + IN UINT16 Doorbell >> + ) >> +{ >> + UINTN DoorbellAddress; >> + >> + if (Socket >= GetNumberOfActiveSockets () >> + || Doorbell >= NUMBER_OF_DOORBELLS_PER_SOCKET) >> + { >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + DoorbellAddress = MailboxGetDoorbellAddress (Socket, Doorbell); >> + ASSERT (DoorbellAddress != 0); >> + >> + MmioWrite32 (DoorbellAddress + DB_STATUS_MASK_REG_OFST, ~DB_STATUS_AVAIL_BIT); >> + >> + return EFI_SUCCESS; >> +} > >> diff --git a/Silicon/Ampere/AmpereAltraPkg/Library/MmCommunicationLib/MmCommunicationLib.c b/Silicon/Ampere/AmpereAltraPkg/Library/MmCommunicationLib/MmCommunicationLib.c >> new file mode 100644 >> index 000000000000..bf400ec0a835 >> --- /dev/null >> +++ b/Silicon/Ampere/AmpereAltraPkg/Library/MmCommunicationLib/MmCommunicationLib.c >> @@ -0,0 +1,184 @@ >> +/** @file >> + >> + Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.
>> + >> + SPDX-License-Identifier: BSD-2-Clause-Patent >> + >> +**/ >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +// >> +// Address, Length of the pre-allocated buffer for communication with the secure >> +// world. >> +// >> +STATIC ARM_MEMORY_REGION_DESCRIPTOR mNsCommBuffMemRegion; >> + >> +EFI_STATUS >> +EFIAPI >> +MmCommunicationLibConstructor ( >> + VOID >> + ) >> +{ >> + mNsCommBuffMemRegion.PhysicalBase = PcdGet64 (PcdMmBufferBase); >> + // During boot , Virtual and Physical are same > Ideally, use UEFI-defined terms. "During boot" is quite ambiguous. > > >> + mNsCommBuffMemRegion.VirtualBase = mNsCommBuffMemRegion.PhysicalBase; >> + mNsCommBuffMemRegion.Length = PcdGet64 (PcdMmBufferSize); >> + >> + return EFI_SUCCESS; >> +} >> + >> +/** >> + Communicates with a registered handler. >> + >> + This function provides an interface to send and receive messages to the >> + Standalone MM environment in UEFI PEI phase. >> + >> + @param[in, out] CommBuffer A pointer to the buffer to convey >> + into MMRAM. >> + @param[in, out] CommSize The size of the data buffer being >> + passed in. This is optional. >> + >> + @retval EFI_SUCCESS The message was successfully posted. >> + @retval EFI_INVALID_PARAMETER The CommBuffer was NULL. >> + @retval EFI_BAD_BUFFER_SIZE The buffer size is incorrect for the MM >> + implementation. If this error is >> + returned, the MessageLength field in >> + the CommBuffer header or the integer >> + pointed by CommSize are updated to reflect >> + the maximum payload size the >> + implementation can accommodate. >> + @retval EFI_ACCESS_DENIED The CommunicateBuffer parameter >> + or CommSize parameter, if not omitted, >> + are in address range that cannot be >> + accessed by the MM environment >> +**/ >> +EFI_STATUS >> +EFIAPI >> +MmCommunicationCommunicate ( >> + IN OUT VOID *CommBuffer, >> + IN OUT UINTN *CommSize OPTIONAL >> + ) >> +{ >> + EFI_MM_COMMUNICATE_HEADER *CommunicateHeader; >> + ARM_SMC_ARGS CommunicateSmcArgs; >> + EFI_STATUS Status; >> + UINTN BufferSize; >> + >> + Status = EFI_ACCESS_DENIED; >> + BufferSize = 0; >> + >> + ZeroMem (&CommunicateSmcArgs, sizeof (ARM_SMC_ARGS)); >> + >> + // >> + // Check parameters >> + // >> + if (CommBuffer == NULL) { >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + CommunicateHeader = CommBuffer; >> + // CommBuffer is a mandatory parameter. Hence, Rely on >> + // MessageLength + Header to ascertain the >> + // total size of the communication payload rather than >> + // rely on optional CommSize parameter >> + BufferSize = CommunicateHeader->MessageLength + >> + sizeof (CommunicateHeader->HeaderGuid) + >> + sizeof (CommunicateHeader->MessageLength); >> + >> + // If the length of the CommBuffer is 0 then return the expected length. >> + if (CommSize != NULL) { >> + // This case can be used by the consumer of this driver to find out the >> + // max size that can be used for allocating CommBuffer. >> + if ((*CommSize == 0) || >> + (*CommSize > mNsCommBuffMemRegion.Length)) >> + { > { at end of preceding line. > Please address throughout this file. > >> + *CommSize = mNsCommBuffMemRegion.Length; >> + return EFI_BAD_BUFFER_SIZE; >> + } >> + // >> + // CommSize must match MessageLength + sizeof (EFI_MM_COMMUNICATE_HEADER); >> + // >> + if (*CommSize != BufferSize) { >> + return EFI_INVALID_PARAMETER; >> + } >> + } >> + >> + // >> + // If the buffer size is 0 or greater than what can be tolerated by the MM >> + // environment then return the expected size. >> + // >> + if ((BufferSize == 0) || >> + (BufferSize > mNsCommBuffMemRegion.Length)) >> + { >> + CommunicateHeader->MessageLength = mNsCommBuffMemRegion.Length - >> + sizeof (CommunicateHeader->HeaderGuid) - >> + sizeof (CommunicateHeader->MessageLength); >> + return EFI_BAD_BUFFER_SIZE; >> + } >> + >> + // SMC Function ID >> + CommunicateSmcArgs.Arg0 = ARM_SMC_ID_MM_COMMUNICATE_AARCH64; >> + >> + // Cookie >> + CommunicateSmcArgs.Arg1 = 0; >> + >> + // Copy Communication Payload >> + CopyMem ((VOID *)mNsCommBuffMemRegion.VirtualBase, CommBuffer, BufferSize); >> + >> + // comm_buffer_address (64-bit physical address) >> + CommunicateSmcArgs.Arg2 = (UINTN)mNsCommBuffMemRegion.PhysicalBase; >> + >> + // comm_size_address (not used, indicated by setting to zero) >> + CommunicateSmcArgs.Arg3 = 0; >> + >> + // Call the Standalone MM environment. >> + ArmCallSmc (&CommunicateSmcArgs); >> + >> + switch (CommunicateSmcArgs.Arg0) { >> + case ARM_SMC_MM_RET_SUCCESS: >> + ZeroMem (CommBuffer, BufferSize); >> + // On successful return, the size of data being returned is inferred from >> + // MessageLength + Header. >> + CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)mNsCommBuffMemRegion.VirtualBase; >> + BufferSize = CommunicateHeader->MessageLength + >> + sizeof (CommunicateHeader->HeaderGuid) + >> + sizeof (CommunicateHeader->MessageLength); >> + >> + CopyMem ( >> + CommBuffer, >> + (VOID *)mNsCommBuffMemRegion.VirtualBase, >> + BufferSize >> + ); >> + Status = EFI_SUCCESS; >> + break; >> + >> + case ARM_SMC_MM_RET_INVALID_PARAMS: >> + Status = EFI_INVALID_PARAMETER; >> + break; >> + >> + case ARM_SMC_MM_RET_DENIED: >> + Status = EFI_ACCESS_DENIED; >> + break; >> + >> + case ARM_SMC_MM_RET_NO_MEMORY: >> + // Unexpected error since the CommSize was checked for zero length >> + // prior to issuing the SMC >> + Status = EFI_OUT_OF_RESOURCES; >> + ASSERT (0); >> + break; >> + >> + default: >> + Status = EFI_ACCESS_DENIED; >> + ASSERT (0); >> + } >> + >> + return Status; >> +} >> diff --git a/Platform/Ampere/JadePkg/JadeBoardSetting.cfg b/Platform/Ampere/JadePkg/JadeBoardSetting.cfg >> new file mode 100644 >> index 000000000000..5a67e8fc6a75 >> --- /dev/null >> +++ b/Platform/Ampere/JadePkg/JadeBoardSetting.cfg >> @@ -0,0 +1,209 @@ >> +# Sample board setting >> +# >> +# This is a sample board setting as used for the >> +# Ampere Altra reference design. > What is a board setting? > >> +# >> +# Name, offset (hex), value >> +# value can be hex or decimal >> +# >> + >> +NV_SI_RO_BOARD_VENDOR, 0x0000, 0x0000CD3A >> +NV_SI_RO_BOARD_TYPE, 0x0008, 0x00000000 >> +NV_SI_RO_BOARD_REV, 0x0010, 0x00000000 >> +NV_SI_RO_BOARD_CFG, 0x0018, 0x00000000 >> +NV_SI_RO_BOARD_S0_DIMM_AVAIL, 0x0020, 0x0000FFFF >> +NV_SI_RO_BOARD_S1_DIMM_AVAIL, 0x0028, 0x0000FFFF >> +NV_SI_RO_BOARD_SPI0CS0_FREQ_KHZ, 0x0030, 0x000080E8 >> +NV_SI_RO_BOARD_SPI0CS1_FREQ_KHZ, 0x0038, 0x000080E8 >> +NV_SI_RO_BOARD_SPI1CS0_FREQ_KHZ, 0x0040, 0x00002710 >> +NV_SI_RO_BOARD_SPI1CS1_FREQ_KHZ, 0x0048, 0x00002710 >> +NV_SI_RO_BOARD_TPM_LOC, 0x0050, 0x00000000 >> +NV_SI_RO_BOARD_I2C0_FREQ_KHZ, 0x0058, 0x00000190 >> +NV_SI_RO_BOARD_I2C1_FREQ_KHZ, 0x0060, 0x00000190 >> +NV_SI_RO_BOARD_I2C2_10_FREQ_KHZ, 0x0068, 0x00000190 >> +NV_SI_RO_BOARD_I2C3_FREQ_KHZ, 0x0070, 0x00000190 >> +NV_SI_RO_BOARD_I2C9_FREQ_KHZ, 0x0078, 0x00000190 >> +NV_SI_RO_BOARD_2P_CFG, 0x0080, 0xFFFFFF01 >> +NV_SI_RO_BOARD_S0_RCA0_CFG, 0x0088, 0x00000000 >> +NV_SI_RO_BOARD_S0_RCA1_CFG, 0x0090, 0x00000000 >> +NV_SI_RO_BOARD_S0_RCA2_CFG, 0x0098, 0x00000004 >> +NV_SI_RO_BOARD_S0_RCA3_CFG, 0x00A0, 0x00000004 >> +NV_SI_RO_BOARD_S0_RCB0_LO_CFG, 0x00A8, 0x00020002 >> +NV_SI_RO_BOARD_S0_RCB0_HI_CFG, 0x00B0, 0x00020002 >> +NV_SI_RO_BOARD_S0_RCB1_LO_CFG, 0x00B8, 0x00020002 >> +NV_SI_RO_BOARD_S0_RCB1_HI_CFG, 0x00C0, 0x00020002 >> +NV_SI_RO_BOARD_S0_RCB2_LO_CFG, 0x00C8, 0x00020002 >> +NV_SI_RO_BOARD_S0_RCB2_HI_CFG, 0x00D0, 0x00000003 >> +NV_SI_RO_BOARD_S0_RCB3_LO_CFG, 0x00D8, 0x00000003 >> +NV_SI_RO_BOARD_S0_RCB3_HI_CFG, 0x00E0, 0x00020002 >> +NV_SI_RO_BOARD_S1_RCA0_CFG, 0x00E8, 0x00000000 >> +NV_SI_RO_BOARD_S1_RCA1_CFG, 0x00F0, 0x00000000 >> +NV_SI_RO_BOARD_S1_RCA2_CFG, 0x00F8, 0x02020202 >> +NV_SI_RO_BOARD_S1_RCA3_CFG, 0x0100, 0x00030003 >> +NV_SI_RO_BOARD_S1_RCB0_LO_CFG, 0x0108, 0x00000003 >> +NV_SI_RO_BOARD_S1_RCB0_HI_CFG, 0x0110, 0x00020002 >> +NV_SI_RO_BOARD_S1_RCB1_LO_CFG, 0x0118, 0x00020002 >> +NV_SI_RO_BOARD_S1_RCB1_HI_CFG, 0x0120, 0x00000003 >> +NV_SI_RO_BOARD_S1_RCB2_LO_CFG, 0x0128, 0x00020002 >> +NV_SI_RO_BOARD_S1_RCB2_HI_CFG, 0x0130, 0x00020002 >> +NV_SI_RO_BOARD_S1_RCB3_LO_CFG, 0x0138, 0x00020002 >> +NV_SI_RO_BOARD_S1_RCB3_HI_CFG, 0x0140, 0x00020002 >> +NV_SI_RO_BOARD_T_LTLM_DELTA_P0, 0x0148, 0x00000001 >> +NV_SI_RO_BOARD_T_LTLM_DELTA_P1, 0x0150, 0x00000002 >> +NV_SI_RO_BOARD_T_LTLM_DELTA_P2, 0x0158, 0x00000003 >> +NV_SI_RO_BOARD_T_LTLM_DELTA_P3, 0x0160, 0x00000004 >> +NV_SI_RO_BOARD_T_LTLM_DELTA_M1, 0x0168, 0xFFFFFFFF >> +NV_SI_RO_BOARD_T_LTLM_DELTA_M2, 0x0170, 0xFFFFFFFE >> +NV_SI_RO_BOARD_T_LTLM_DELTA_M3, 0x0178, 0xFFFFFFFD >> +NV_SI_RO_BOARD_P_LM_PID_P, 0x0180, 0x00000000 >> +NV_SI_RO_BOARD_P_LM_PID_I, 0x0188, 0x00000000 >> +NV_SI_RO_BOARD_P_LM_PID_I_L_THOLD, 0x0190, 0x00000000 >> +NV_SI_RO_BOARD_P_LM_PID_I_H_THOLD, 0x0198, 0x00000000 >> +NV_SI_RO_BOARD_P_LM_PID_D, 0x01A0, 0x00000000 >> +NV_SI_RO_BOARD_P_LM_EXP_SMOOTH_CONST, 0x01A8, 0x00000000 >> +NV_SI_RO_BOARD_TPM_ALG_ID, 0x01B0, 0x00000002 >> +NV_SI_RO_BOARD_DDR_SPEED_GRADE, 0x01B8, 0x00000C80 >> +NV_SI_RO_BOARD_DDR_S0_RTT_WR, 0x01C0, 0x00020000 >> +NV_SI_RO_BOARD_DDR_S1_RTT_WR, 0x01C8, 0x00020000 >> +NV_SI_RO_BOARD_DDR_S0_RTT_NOM, 0x01D0, 0xFF060177 >> +NV_SI_RO_BOARD_DDR_S1_RTT_NOM, 0x01D8, 0xFF060177 >> +NV_SI_RO_BOARD_DDR_S0_RTT_PARK, 0x01E0, 0x00060070 >> +NV_SI_RO_BOARD_DDR_S1_RTT_PARK, 0x01E8, 0x00060070 >> +NV_SI_RO_BOARD_DDR_CS0_RDODT_MASK_1DPC, 0x01F0, 0x00000000 >> +NV_SI_RO_BOARD_DDR_CS1_RDODT_MASK_1DPC, 0x01F8, 0x00000000 >> +NV_SI_RO_BOARD_DDR_CS2_RDODT_MASK_1DPC, 0x0200, 0x00000000 >> +NV_SI_RO_BOARD_DDR_CS3_RDODT_MASK_1DPC, 0x0208, 0x00000000 >> +NV_SI_RO_BOARD_DDR_CS0_RDODT_MASK_2DPC, 0x0210, 0x000C0CCC >> +NV_SI_RO_BOARD_DDR_CS1_RDODT_MASK_2DPC, 0x0218, 0x000C0CCC >> +NV_SI_RO_BOARD_DDR_CS2_RDODT_MASK_2DPC, 0x0220, 0x00030333 >> +NV_SI_RO_BOARD_DDR_CS3_RDODT_MASK_2DPC, 0x0228, 0x00030333 >> +NV_SI_RO_BOARD_DDR_CS0_WRODT_MASK_1DPC, 0x0230, 0x00030333 >> +NV_SI_RO_BOARD_DDR_CS1_WRODT_MASK_1DPC, 0x0238, 0x00030333 >> +NV_SI_RO_BOARD_DDR_CS2_WRODT_MASK_1DPC, 0x0240, 0x00030333 >> +NV_SI_RO_BOARD_DDR_CS3_WRODT_MASK_1DPC, 0x0248, 0x00030333 >> +NV_SI_RO_BOARD_DDR_CS0_WRODT_MASK_2DPC, 0x0250, 0x000EDEED >> +NV_SI_RO_BOARD_DDR_CS1_WRODT_MASK_2DPC, 0x0258, 0x000DEDDE >> +NV_SI_RO_BOARD_DDR_CS2_WRODT_MASK_2DPC, 0x0260, 0x000B7BB7 >> +NV_SI_RO_BOARD_DDR_CS3_WRODT_MASK_2DPC, 0x0268, 0x0007B77B >> +NV_SI_RO_BOARD_DDR_PHY_TERM_DQ_CTRL_1DPC, 0x0270, 0x00000005 >> +NV_SI_RO_BOARD_DDR_PHY_TERM_DQ_VAL_1DPC, 0x0278, 0x0090DD90 >> +NV_SI_RO_BOARD_DDR_PHY_TERM_DQS_CTRL_1DPC, 0x0280, 0x00000005 >> +NV_SI_RO_BOARD_DDR_PHY_TERM_DQS_VAL_1DPC, 0x0288, 0x0090DD90 >> +NV_SI_RO_BOARD_DDR_PHY_TERM_DQ_CTRL_2DPC, 0x0290, 0x00000005 >> +NV_SI_RO_BOARD_DDR_PHY_TERM_DQ_VAL_2DPC, 0x0298, 0x0090DD90 >> +NV_SI_RO_BOARD_DDR_PHY_TERM_DQS_CTRL_2DPC, 0x02A0, 0x00000005 >> +NV_SI_RO_BOARD_DDR_PHY_TERM_DQS_VAL_2DPC, 0x02A8, 0x0090DD90 >> +NV_SI_RO_BOARD_DDR_PHY_VREFDQ_RANGE_VAL_1DPC, 0x02B0, 0x00000024 >> +NV_SI_RO_BOARD_DDR_DRAM_VREFDQ_RANGE_VAL_1DPC, 0x02B8, 0x0000001A >> +NV_SI_RO_BOARD_DDR_PHY_VREFDQ_RANGE_VAL_2DPC, 0x02C0, 0x00000050 >> +NV_SI_RO_BOARD_DDR_DRAM_VREFDQ_RANGE_VAL_2DPC, 0x02C8, 0x00000020 >> +NV_SI_RO_BOARD_DDR_CLK_WRDQ_DLY_DEFAULT, 0x02D0, 0x02800280 >> +NV_SI_RO_BOARD_DDR_RDDQS_DQ_DLY_DEFAULT, 0x02D8, 0x90909090 >> +NV_SI_RO_BOARD_DDR_WRDQS_SHIFT_DEFAULT, 0x02E0, 0x00000000 >> +NV_SI_RO_BOARD_DDR_ADCMD_DLY_DEFAULT, 0x02E8, 0x00C000C0 >> +NV_SI_RO_BOARD_DDR_CLK_WRDQ_DLY_ADJ, 0x02F0, 0x00000000 >> +NV_SI_RO_BOARD_DDR_RDDQS_DQ_DLY_ADJ, 0x02F8, 0x00000000 >> +NV_SI_RO_BOARD_DDR_PHY_VREF_ADJ, 0x0300, 0x00000000 >> +NV_SI_RO_BOARD_DDR_DRAM_VREF_ADJ, 0x0308, 0x00000000 >> +NV_SI_RO_BOARD_DDR_WR_PREAMBLE_CYCLE, 0x0310, 0x02010201 >> +NV_SI_RO_BOARD_DDR_ADCMD_2T_MODE, 0x0318, 0x00000000 >> +NV_SI_RO_BOARD_I2C_VRD_CONFIG_INFO, 0x0320, 0x00000000 >> +NV_SI_RO_BOARD_DDR_PHY_FEATURE_CTRL, 0x0328, 0x00000000 >> +NV_SI_RO_BOARD_BMC_HANDSHAKE_SPI_ACCESS, 0x0330, 0x01050106 >> +NV_SI_RO_BOARD_DIMM_TEMP_THRESHOLD, 0x0338, 0x000005F4 >> +NV_SI_RO_BOARD_DIMM_SPD_COMPARE_DISABLE, 0x0340, 0x00000000 >> +NV_SI_RO_BOARD_S0_PCIE_CLK_CFG, 0x0348, 0x00000000 >> +NV_SI_RO_BOARD_S0_RCA4_CFG, 0x0350, 0x02020202 >> +NV_SI_RO_BOARD_S0_RCA5_CFG, 0x0358, 0x02020202 >> +NV_SI_RO_BOARD_S0_RCA6_CFG, 0x0360, 0x02020202 >> +NV_SI_RO_BOARD_S0_RCA7_CFG, 0x0368, 0x02020003 >> +NV_SI_RO_BOARD_S0_RCA0_TXRX_G3PRESET, 0x0370, 0x00000000 >> +NV_SI_RO_BOARD_S0_RCA1_TXRX_G3PRESET, 0x0378, 0x00000000 >> +NV_SI_RO_BOARD_S0_RCA2_TXRX_G3PRESET, 0x0380, 0x00000000 >> +NV_SI_RO_BOARD_S0_RCA3_TXRX_G3PRESET, 0x0388, 0x00000000 >> +NV_SI_RO_BOARD_S0_RCB0A_TXRX_G3PRESET, 0x0390, 0x00000000 >> +NV_SI_RO_BOARD_S0_RCB0B_TXRX_G3PRESET, 0x0398, 0x00000000 >> +NV_SI_RO_BOARD_S0_RCB1A_TXRX_G3PRESET, 0x03A0, 0x00000000 >> +NV_SI_RO_BOARD_S0_RCB1B_TXRX_G3PRESET, 0x03A8, 0x00000000 >> +NV_SI_RO_BOARD_S0_RCB2A_TXRX_G3PRESET, 0x03B0, 0x00000000 >> +NV_SI_RO_BOARD_S0_RCB2B_TXRX_G3PRESET, 0x03B8, 0x00000000 >> +NV_SI_RO_BOARD_S0_RCB3A_TXRX_G3PRESET, 0x03C0, 0x00000000 >> +NV_SI_RO_BOARD_S0_RCB3B_TXRX_G3PRESET, 0x03C8, 0x00000000 >> +NV_SI_RO_BOARD_S0_RCA4_TXRX_G3PRESET, 0x03D0, 0x00000000 >> +NV_SI_RO_BOARD_S0_RCA5_TXRX_G3PRESET, 0x03D8, 0x00000000 >> +NV_SI_RO_BOARD_S0_RCA6_TXRX_G3PRESET, 0x03E0, 0x00000000 >> +NV_SI_RO_BOARD_S0_RCA7_TXRX_G3PRESET, 0x03E8, 0x00000000 >> +NV_SI_RO_BOARD_S0_RCA0_TXRX_G4PRESET, 0x03F0, 0x57575757 >> +NV_SI_RO_BOARD_S0_RCA1_TXRX_G4PRESET, 0x03F8, 0x57575757 >> +NV_SI_RO_BOARD_S0_RCA2_TXRX_G4PRESET, 0x0400, 0x57575757 >> +NV_SI_RO_BOARD_S0_RCA3_TXRX_G4PRESET, 0x0408, 0x57575757 >> +NV_SI_RO_BOARD_S0_RCB0A_TXRX_G4PRESET, 0x0410, 0x57575757 >> +NV_SI_RO_BOARD_S0_RCB0B_TXRX_G4PRESET, 0x0418, 0x57575757 >> +NV_SI_RO_BOARD_S0_RCB1A_TXRX_G4PRESET, 0x0420, 0x57575757 >> +NV_SI_RO_BOARD_S0_RCB1B_TXRX_G4PRESET, 0x0428, 0x57575757 >> +NV_SI_RO_BOARD_S0_RCB2A_TXRX_G4PRESET, 0x0430, 0x57575757 >> +NV_SI_RO_BOARD_S0_RCB2B_TXRX_G4PRESET, 0x0438, 0x57575757 >> +NV_SI_RO_BOARD_S0_RCB3A_TXRX_G4PRESET, 0x0440, 0x57575757 >> +NV_SI_RO_BOARD_S0_RCB3B_TXRX_G4PRESET, 0x0448, 0x57575757 >> +NV_SI_RO_BOARD_S0_RCA4_TXRX_G4PRESET, 0x0450, 0x57575757 >> +NV_SI_RO_BOARD_S0_RCA5_TXRX_G4PRESET, 0x0458, 0x57575757 >> +NV_SI_RO_BOARD_S0_RCA6_TXRX_G4PRESET, 0x0460, 0x57575757 >> +NV_SI_RO_BOARD_S0_RCA7_TXRX_G4PRESET, 0x0468, 0x57575757 >> +NV_SI_RO_BOARD_S1_PCIE_CLK_CFG, 0x0470, 0x00000000 >> +NV_SI_RO_BOARD_S1_RCA4_CFG, 0x0478, 0x02020202 >> +NV_SI_RO_BOARD_S1_RCA5_CFG, 0x0480, 0x02020202 >> +NV_SI_RO_BOARD_S1_RCA6_CFG, 0x0488, 0x02020202 >> +NV_SI_RO_BOARD_S1_RCA7_CFG, 0x0490, 0x02020003 >> +NV_SI_RO_BOARD_S1_RCA2_TXRX_G3PRESET, 0x0498, 0x00000000 >> +NV_SI_RO_BOARD_S1_RCA3_TXRX_G3PRESET, 0x04A0, 0x00000000 >> +NV_SI_RO_BOARD_S1_RCB0A_TXRX_G3PRESET, 0x04A8, 0x00000000 >> +NV_SI_RO_BOARD_S1_RCB0B_TXRX_G3PRESET, 0x04B0, 0x00000000 >> +NV_SI_RO_BOARD_S1_RCB1A_TXRX_G3PRESET, 0x04B8, 0x00000000 >> +NV_SI_RO_BOARD_S1_RCB1B_TXRX_G3PRESET, 0x04C0, 0x00000000 >> +NV_SI_RO_BOARD_S1_RCB2A_TXRX_G3PRESET, 0x04C8, 0x00000000 >> +NV_SI_RO_BOARD_S1_RCB2B_TXRX_G3PRESET, 0x04D0, 0x00000000 >> +NV_SI_RO_BOARD_S1_RCB3A_TXRX_G3PRESET, 0x04D8, 0x00000000 >> +NV_SI_RO_BOARD_S1_RCB3B_TXRX_G3PRESET, 0x04E0, 0x00000000 >> +NV_SI_RO_BOARD_S1_RCA4_TXRX_G3PRESET, 0x04E8, 0x00000000 >> +NV_SI_RO_BOARD_S1_RCA5_TXRX_G3PRESET, 0x04F0, 0x00000000 >> +NV_SI_RO_BOARD_S1_RCA6_TXRX_G3PRESET, 0x04F8, 0x00000000 >> +NV_SI_RO_BOARD_S1_RCA7_TXRX_G3PRESET, 0x0500, 0x00000000 >> +NV_SI_RO_BOARD_S1_RCA2_TXRX_G4PRESET, 0x0508, 0x57575757 >> +NV_SI_RO_BOARD_S1_RCA3_TXRX_G4PRESET, 0x0510, 0x57575757 >> +NV_SI_RO_BOARD_S1_RCB0A_TXRX_G4PRESET, 0x0518, 0x57575757 >> +NV_SI_RO_BOARD_S1_RCB0B_TXRX_G4PRESET, 0x0520, 0x57575757 >> +NV_SI_RO_BOARD_S1_RCB1A_TXRX_G4PRESET, 0x0528, 0x57575757 >> +NV_SI_RO_BOARD_S1_RCB1B_TXRX_G4PRESET, 0x0530, 0x57575757 >> +NV_SI_RO_BOARD_S1_RCB2A_TXRX_G4PRESET, 0x0538, 0x57575757 >> +NV_SI_RO_BOARD_S1_RCB2B_TXRX_G4PRESET, 0x0540, 0x57575757 >> +NV_SI_RO_BOARD_S1_RCB3A_TXRX_G4PRESET, 0x0548, 0x57575757 >> +NV_SI_RO_BOARD_S1_RCB3B_TXRX_G4PRESET, 0x0550, 0x57575757 >> +NV_SI_RO_BOARD_S1_RCA4_TXRX_G4PRESET, 0x0558, 0x57575757 >> +NV_SI_RO_BOARD_S1_RCA5_TXRX_G4PRESET, 0x0560, 0x57575757 >> +NV_SI_RO_BOARD_S1_RCA6_TXRX_G4PRESET, 0x0568, 0x57575757 >> +NV_SI_RO_BOARD_S1_RCA7_TXRX_G4PRESET, 0x0570, 0x57575757 >> +NV_SI_RO_BOARD_2P_CE_MASK_THRESHOLD, 0x0578, 0x00000003 >> +NV_SI_RO_BOARD_2P_CE_MASK_INTERVAL, 0x0580, 0x000001A4 >> +NV_SI_RO_BOARD_SX_PHY_CFG_SETTING, 0x0588, 0x00000000 >> +NV_SI_RO_BOARD_DDR_PHY_DC_CLK, 0x0590, 0x00018000 >> +NV_SI_RO_BOARD_DDR_PHY_DC_DATA, 0x0598, 0x80018000 >> +NV_SI_RO_BOARD_SX_RCA0_TXRX_20GPRESET, 0x05A0, 0x00000000 >> +NV_SI_RO_BOARD_SX_RCA1_TXRX_20GPRESET, 0x05A8, 0x00000000 >> +NV_SI_RO_BOARD_SX_RCA2_TXRX_20GPRESET, 0x05B0, 0x00000000 >> +NV_SI_RO_BOARD_SX_RCA3_TXRX_20GPRESET, 0x05B8, 0x00000000 >> +NV_SI_RO_BOARD_SX_RCA0_TXRX_25GPRESET, 0x05C0, 0x00000000 >> +NV_SI_RO_BOARD_SX_RCA1_TXRX_25GPRESET, 0x05C8, 0x00000000 >> +NV_SI_RO_BOARD_SX_RCA2_TXRX_25GPRESET, 0x05D0, 0x00000000 >> +NV_SI_RO_BOARD_SX_RCA3_TXRX_25GPRESET, 0x05D8, 0x00000000 >> +NV_SI_RO_BOARD_DDR_2X_REFRESH_TEMP_THRESHOLD, 0x05E0, 0x00550055 >> +NV_SI_RO_BOARD_PCP_VRD_VOUT_WAIT_US, 0x05E8, 0x00000064 >> +NV_SI_RO_BOARD_PCP_VRD_VOUT_RESOLUTION_MV, 0x05F0, 0x00000005 >> +NV_SI_RO_BOARD_DVFS_VOLT_READ_BACK_EN, 0x05F8, 0x00000001 >> +NV_SI_RO_BOARD_DVFS_VOLT_READ_BACK_TIME, 0x0600, 0x00000002 >> +NV_SI_RO_BOARD_DVFS_VOUT_20MV_RAMP_TIME_US, 0x0608, 0x00000005 >> +NV_SI_RO_BOARD_PCIE_AER_FW_FIRST, 0x0610, 0x00000000 >> +NV_SI_RO_BOARD_RTC_GPI_LOCK_BYPASS, 0x0618, 0x00000000 >> +NV_SI_RO_BOARD_TPM_DISABLE, 0x0620, 0x00000000 >> +NV_SI_RO_BOARD_MESH_S0_CXG_RC_STRONG_ORDERING_EN, 0x0628, 0x00000000 >> +NV_SI_RO_BOARD_MESH_S1_CXG_RC_STRONG_ORDERING_EN, 0x0630, 0x00000000 >> +NV_SI_RO_BOARD_GPIO_SW_WATCHDOG_EN, 0x0638, 0x00000000 > There was also a few things in this patch where I felt names had > insufficient namespace - such as starting with TRNG_ or NV_. > I'm not going to insist on adding prefixes to those, I'm just going to > say I have warned you, and those might get you in trouble in the > future :) > > Best Regards, > > Leif --------------4BF9D6D8EBC1A676687FE92C Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: base64 PGh0bWw+PGhlYWQ+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRl eHQvaHRtbDsgY2hhcnNldD11dGYtOCI+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBjbGFz cz0ibW96LWNpdGUtcHJlZml4Ij5PbiA2LzUvMjEgMDY6MDQsIExlaWYgTGluZGhvbG0gd3JvdGU6 PGJyPgogICAgPC9kaXY+CiAgICA8YmxvY2txdW90ZSB0eXBlPSJjaXRlIiBjaXRlPSJtaWQ6MjAy MTA2MDQyMzA0MTAuczd2dWFyeGlyMmZxa3F0d0BsZXZpYXRoYW4iPgogICAgICA8cHJlIGNsYXNz PSJtb3otcXVvdGUtcHJlIiB3cmFwPSIiPk9uIFdlZCwgTWF5IDI2LCAyMDIxIGF0IDE3OjA2OjUy ICswNzAwLCBOaGkgUGhhbSB3cm90ZToKPC9wcmU+CiAgICAgIDxibG9ja3F1b3RlIHR5cGU9ImNp dGUiPgogICAgICAgIDxwcmUgY2xhc3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+RnJvbTogVnUg Tmd1eWVuIDxhIGNsYXNzPSJtb3otdHh0LWxpbmstcmZjMjM5NkUiIGhyZWY9Im1haWx0bzp2dW5n dXllbkBvcy5hbXBlcmVjb21wdXRpbmcuY29tIj4mbHQ7dnVuZ3V5ZW5Ab3MuYW1wZXJlY29tcHV0 aW5nLmNvbSZndDs8L2E+CgpUaGlzIGNvbW1pdCBhZGRzIHRoZSBzdXBwb3J0IGZvciBBbXBlcmXi gJlzIEFsdHJhIHByb2Nlc3Nvci1iYXNlZCBNdC4gSmFkZQpwbGF0Zm9ybSB0aGF0IHByb3ZpZGVz IHVwIHRvIDE2MCBwcm9jZXNzb3IgY29yZXMgaW4gYSBkdWFsIHNvY2tldApjb25maWd1cmF0aW9u LiBUaGUgZXNzZW50aWFsIG1vZHVsZXMgYXJlIHdpcmVkIHVwIGVub3VnaCB0byBib290IHN5c3Rl bQp0byBFREsyIFVpQXBwLgoKQ2M6IFRoYW5nIE5ndXllbiA8YSBjbGFzcz0ibW96LXR4dC1saW5r LXJmYzIzOTZFIiBocmVmPSJtYWlsdG86dGhhbmdAb3MuYW1wZXJlY29tcHV0aW5nLmNvbSI+Jmx0 O3RoYW5nQG9zLmFtcGVyZWNvbXB1dGluZy5jb20mZ3Q7PC9hPgpDYzogQ2h1b25nIFRyYW4gPGEg Y2xhc3M9Im1vei10eHQtbGluay1yZmMyMzk2RSIgaHJlZj0ibWFpbHRvOmNodW9uZ0Bvcy5hbXBl cmVjb21wdXRpbmcuY29tIj4mbHQ7Y2h1b25nQG9zLmFtcGVyZWNvbXB1dGluZy5jb20mZ3Q7PC9h PgpDYzogUGhvbmcgVm8gPGEgY2xhc3M9Im1vei10eHQtbGluay1yZmMyMzk2RSIgaHJlZj0ibWFp bHRvOnBob25nQG9zLmFtcGVyZWNvbXB1dGluZy5jb20iPiZsdDtwaG9uZ0Bvcy5hbXBlcmVjb21w dXRpbmcuY29tJmd0OzwvYT4KQ2M6IExlaWYgTGluZGhvbG0gPGEgY2xhc3M9Im1vei10eHQtbGlu ay1yZmMyMzk2RSIgaHJlZj0ibWFpbHRvOmxlaWZAbnV2aWFpbmMuY29tIj4mbHQ7bGVpZkBudXZp YWluYy5jb20mZ3Q7PC9hPgpDYzogTWljaGFlbCBEIEtpbm5leSA8YSBjbGFzcz0ibW96LXR4dC1s aW5rLXJmYzIzOTZFIiBocmVmPSJtYWlsdG86bWljaGFlbC5kLmtpbm5leUBpbnRlbC5jb20iPiZs dDttaWNoYWVsLmQua2lubmV5QGludGVsLmNvbSZndDs8L2E+CkNjOiBBcmQgQmllc2hldXZlbCA8 YSBjbGFzcz0ibW96LXR4dC1saW5rLXJmYzIzOTZFIiBocmVmPSJtYWlsdG86YXJkYit0aWFub2Nv cmVAa2VybmVsLm9yZyI+Jmx0O2FyZGIrdGlhbm9jb3JlQGtlcm5lbC5vcmcmZ3Q7PC9hPgpDYzog TmF0ZSBEZVNpbW9uZSA8YSBjbGFzcz0ibW96LXR4dC1saW5rLXJmYzIzOTZFIiBocmVmPSJtYWls dG86bmF0aGFuaWVsLmwuZGVzaW1vbmVAaW50ZWwuY29tIj4mbHQ7bmF0aGFuaWVsLmwuZGVzaW1v bmVAaW50ZWwuY29tJmd0OzwvYT4KClNpZ25lZC1vZmYtYnk6IFZ1IE5ndXllbiA8YSBjbGFzcz0i bW96LXR4dC1saW5rLXJmYzIzOTZFIiBocmVmPSJtYWlsdG86dnVuZ3V5ZW5Ab3MuYW1wZXJlY29t cHV0aW5nLmNvbSI+Jmx0O3Z1bmd1eWVuQG9zLmFtcGVyZWNvbXB1dGluZy5jb20mZ3Q7PC9hPgot LS0KIFBsYXRmb3JtL0FtcGVyZS9BbXBlcmVQbGF0Zm9ybVBrZy9BbXBlcmVQbGF0Zm9ybVBrZy5k ZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDI4ICsKIFNpbGlj b24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0FtcGVyZUFsdHJhUGtnLmRlYyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDQyICsrCiBTaWxpY29uL0FtcGVy ZS9BbXBlcmVTaWxpY29uUGtnL0FtcGVyZVNpbGljb25Qa2cuZGVjICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0NiArKwogU2lsaWNvbi9BbXBlcmUvQW1wZXJl QWx0cmFQa2cvQW1wZXJlQWx0cmFQa2cuZHNjLmluYyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCA2NzQgKysrKysrKysrKysrKysrKysrKwogUGxhdGZvcm0vQW1w ZXJlL0phZGVQa2cvSmFkZS5kc2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMDAgKysrCiBQbGF0Zm9ybS9BbXBlcmUvSmFk ZVBrZy9KYWRlLmZkZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8IDIyNSArKysrKysrCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVB bHRyYVBrZy9Ecml2ZXJzL0FURkhvYlBlaS9BVEZIb2JQZWltLmluZiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICA0MSArKwogU2lsaWNvbi9BbXBlcmUvQW1wZXJlQWx0cmFQa2cv RHJpdmVycy9NZW1vcnlJbml0UGVpbS9NZW1vcnlJbml0UGVpbS5pbmYgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgNjQgKysKIFNpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0xpYnJhcnkv QW1wZXJlQ3B1TGliL0FtcGVyZUNwdUxpYi5pbmYgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgIDQ0ICsrCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5L0FybVBsYXRm b3JtTGliL0FybVBsYXRmb3JtTGliLmluZiAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1NyAr KwogU2lsaWNvbi9BbXBlcmUvQW1wZXJlQWx0cmFQa2cvTGlicmFyeS9NYWlsYm94SW50ZXJmYWNl TGliL01haWxib3hJbnRlcmZhY2VMaWIuaW5mICAgICAgICAgICAgICAgfCAgMzcgKwogU2lsaWNv bi9BbXBlcmUvQW1wZXJlQWx0cmFQa2cvTGlicmFyeS9NZW1vcnlJbml0UGVpTGliL01lbW9yeUlu aXRQZWlMaWIuaW5mICAgICAgICAgICAgICAgICAgICAgfCAgNjMgKysKIFNpbGljb24vQW1wZXJl L0FtcGVyZUFsdHJhUGtnL0xpYnJhcnkvTW1Db21tdW5pY2F0aW9uTGliL01tQ29tbXVuaWNhdGlv bkxpYi5pbmYgICAgICAgICAgICAgICAgIHwgIDM1ICsKIFNpbGljb24vQW1wZXJlL0FtcGVyZUFs dHJhUGtnL0xpYnJhcnkvTlZQYXJhbUxpYi9OVlBhcmFtTGliLmluZiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgIDMyICsKIFNpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0xp YnJhcnkvUGxhdGZvcm1QZWlMaWIvUGxhdGZvcm1QZWlMaWIuaW5mICAgICAgICAgICAgICAgICAg ICAgICAgIHwgIDQyICsrCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5L1Ju Z0xpYi9SbmdMaWIuaW5mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAyOSArCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5L1N5c3RlbUZpcm13 YXJlSW50ZXJmYWNlTGliL1N5c3RlbUZpcm13YXJlSW50ZXJmYWNlTGliLmluZiB8ICAzMCArCiBT aWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5L1RybmdMaWIvVHJuZ0xpYi5pbmYg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyOSArCiBTaWxpY29uL0Ft cGVyZS9BbXBlcmVBbHRyYVBrZy9JbmNsdWRlL0d1aWQvUGxhdGZvcm1JbmZvSG9iR3VpZC5oICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxNyArCiBTaWxpY29uL0FtcGVyZS9BbXBl cmVBbHRyYVBrZy9JbmNsdWRlL0xpYnJhcnkvQW1wZXJlQ3B1TGliLmggICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8IDI4MiArKysrKysrKwogU2lsaWNvbi9BbXBlcmUvQW1wZXJl QWx0cmFQa2cvSW5jbHVkZS9MaWJyYXJ5L01haWxib3hJbnRlcmZhY2VMaWIuaCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAxNzIgKysrKysKIFNpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJh UGtnL0luY2x1ZGUvTGlicmFyeS9NbUNvbW11bmljYXRpb25MaWIuaCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgIDE5ICsKIFNpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0luY2x1 ZGUvTGlicmFyeS9OVlBhcmFtTGliLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgMTMzICsrKysKIFNpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0luY2x1ZGUvTGli cmFyeS9TeXN0ZW1GaXJtd2FyZUludGVyZmFjZUxpYi5oICAgICAgICAgICAgICAgICAgICAgIHwg MjgyICsrKysrKysrCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9JbmNsdWRlL0xpYnJh cnkvVHJuZ0xpYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAz MSArCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9JbmNsdWRlL01tTGliLmggICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3OSArKysKIFNp bGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0luY2x1ZGUvTlZQYXJhbURlZi5oICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNTE1ICsrKysrKysrKysrKysr CiBTaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9JbmNsdWRlL1BsYXRmb3JtL0FjMDEuaCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE0NiArKysrCiBTaWxp Y29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9JbmNsdWRlL1BsYXRmb3JtSW5mb0hvYi5oICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE4MiArKysrKwogU2lsaWNvbi9B bXBlcmUvQW1wZXJlQWx0cmFQa2cvRHJpdmVycy9BVEZIb2JQZWkvQVRGSG9iUGVpbS5jICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgNTIgKysKIFNpbGljb24vQW1wZXJlL0Ft cGVyZUFsdHJhUGtnL0RyaXZlcnMvTWVtb3J5SW5pdFBlaW0vTWVtb3J5SW5pdFBlaW0uYyAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgMTUxICsrKysrCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVB bHRyYVBrZy9MaWJyYXJ5L0FtcGVyZUNwdUxpYi9BbXBlcmVDcHVMaWIuYyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8IDcwNiArKysrKysrKysrKysrKysrKysrKwogU2lsaWNvbi9BbXBl cmUvQW1wZXJlQWx0cmFQa2cvTGlicmFyeS9Bcm1QbGF0Zm9ybUxpYi9Bcm1QbGF0Zm9ybUxpYi5j ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjkgKysrKysKIFNpbGljb24vQW1wZXJlL0Ft cGVyZUFsdHJhUGtnL0xpYnJhcnkvQXJtUGxhdGZvcm1MaWIvQXJtUGxhdGZvcm1MaWJNZW1vcnku YyAgICAgICAgICAgICAgICAgICAgIHwgMzk5ICsrKysrKysrKysrCiBTaWxpY29uL0FtcGVyZS9B bXBlcmVBbHRyYVBrZy9MaWJyYXJ5L01haWxib3hJbnRlcmZhY2VMaWIvTWFpbGJveEludGVyZmFj ZUxpYi5jICAgICAgICAgICAgICAgICB8IDI4MiArKysrKysrKwogU2lsaWNvbi9BbXBlcmUvQW1w ZXJlQWx0cmFQa2cvTGlicmFyeS9NZW1vcnlJbml0UGVpTGliL01lbW9yeUluaXRQZWlMaWIuYyAg ICAgICAgICAgICAgICAgICAgICAgfCAgOTMgKysrCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRy YVBrZy9MaWJyYXJ5L01tQ29tbXVuaWNhdGlvbkxpYi9NbUNvbW11bmljYXRpb25MaWIuYyAgICAg ICAgICAgICAgICAgICB8IDE4NCArKysrKwogU2lsaWNvbi9BbXBlcmUvQW1wZXJlQWx0cmFQa2cv TGlicmFyeS9OVlBhcmFtTGliL05WUGFyYW1MaWIuYyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAyMDIgKysrKysrCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJy YXJ5L1BsYXRmb3JtUGVpTGliL1BsYXRmb3JtUGVpTGliLmMgICAgICAgICAgICAgICAgICAgICAg ICAgICB8ICA0MCArKwogU2lsaWNvbi9BbXBlcmUvQW1wZXJlQWx0cmFQa2cvTGlicmFyeS9SbmdM aWIvUm5nTGliLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAx NDEgKysrKwogU2lsaWNvbi9BbXBlcmUvQW1wZXJlQWx0cmFQa2cvTGlicmFyeS9TeXN0ZW1GaXJt d2FyZUludGVyZmFjZUxpYi9TeXN0ZW1GaXJtd2FyZUludGVyZmFjZUxpYi5jICAgfCAzMjggKysr KysrKysrCiBTaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5L1RybmdMaWIvVHJu Z0xpYi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2MyArKwog UGxhdGZvcm0vQW1wZXJlL0FtcGVyZVBsYXRmb3JtUGtnL0Z2UnVsZXMuZmRmLmluYyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNzYgKysrKysKIFBsYXRm b3JtL0FtcGVyZS9KYWRlUGtnL0phZGVCb2FyZFNldHRpbmcuY2ZnICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjA5ICsrKysrKwogU2lsaWNvbi9B bXBlcmUvQW1wZXJlQWx0cmFQa2cvTGlicmFyeS9Bcm1QbGF0Zm9ybUxpYi9Bcm1QbGF0Zm9ybUhl bHBlci5TICAgICAgICAgICAgICAgICAgICAgICAgfCAgNDUgKysKIFNpbGljb24vQW1wZXJlL0Ft cGVyZUFsdHJhUGtnL0xpYnJhcnkvUm5nTGliL1JuZ0xpYi51bmkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgIDEzICsKIDQ2IGZpbGVzIGNoYW5nZWQsIDY3MjkgaW5z ZXJ0aW9ucygrKQoKPC9wcmU+CiAgICAgIDwvYmxvY2txdW90ZT4KICAgICAgPHByZSBjbGFzcz0i bW96LXF1b3RlLXByZSIgd3JhcD0iIj4KPC9wcmU+CiAgICAgIDxibG9ja3F1b3RlIHR5cGU9ImNp dGUiPgogICAgICAgIDxwcmUgY2xhc3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+ZGlmZiAtLWdp dCBhL1BsYXRmb3JtL0FtcGVyZS9KYWRlUGtnL0phZGUuZHNjIGIvUGxhdGZvcm0vQW1wZXJlL0ph ZGVQa2cvSmFkZS5kc2MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMDAwMDAwLi5m NjhhZjI0YTBkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9QbGF0Zm9ybS9BbXBlcmUvSmFkZVBrZy9K YWRlLmRzYwpAQCAtMCwwICsxLDEwMCBAQAorIyMgQGZpbGUKKyMKKyMgQ29weXJpZ2h0IChjKSAy MDIwIC0gMjAyMSwgQW1wZXJlIENvbXB1dGluZyBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuJmx0 O0JSJmd0OworIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTItQ2xhdXNlLVBhdGVu dAorIworIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgRGVmaW5lcyBTZWN0aW9u IC0gc3RhdGVtZW50cyB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIHRvIGNyZWF0ZSBhIE1ha2VmaWxl LgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK1tEZWZpbmVzXQorICBQTEFURk9STV9OQU1F ICAgICAgICAgICAgICAgICAgPSBKYWRlCisgIFBMQVRGT1JNX0dVSUQgICAgICAgICAgICAgICAg ICA9IDdCREQwMEMwLTY4RjMtNENDMS04Nzc1LUYwRjAwNTcyMDE5RgorICBQTEFURk9STV9WRVJT SU9OICAgICAgICAgICAgICAgPSAwLjEKKyAgRFNDX1NQRUNJRklDQVRJT04gICAgICAgICAgICAg ID0gMHgwMDAxMDAxQgorICBPVVRQVVRfRElSRUNUT1JZICAgICAgICAgICAgICAgPSBCdWlsZC9K YWRlCisgIFNVUFBPUlRFRF9BUkNISVRFQ1RVUkVTICAgICAgICA9IEFBUkNINjQKKyAgQlVJTERf VEFSR0VUUyAgICAgICAgICAgICAgICAgID0gREVCVUd8UkVMRUFTRXxOT09QVAorICBTS1VJRF9J REVOVElGSUVSICAgICAgICAgICAgICAgPSBERUZBVUxUCisgIEZMQVNIX0RFRklOSVRJT04gICAg ICAgICAgICAgICA9IFBsYXRmb3JtL0FtcGVyZS9KYWRlUGtnL0phZGUuZmRmCisKKyAgIworICAj IERlZmluZXMgZm9yIGRlZmF1bHQgc3RhdGVzLiBUaGVzZSBjYW4gYmUgY2hhbmdlZCBvbiB0aGUg Y29tbWFuZCBsaW5lLgorICAjIC1EIEZMQUc9VkFMVUUKKyAgIworCisgICMgIERFQlVHX0lOSVQg ICAgICAweDAwMDAwMDAxICAvLyBJbml0aWFsaXphdGlvbgorICAjICBERUJVR19XQVJOICAgICAg MHgwMDAwMDAwMiAgLy8gV2FybmluZ3MKKyAgIyAgREVCVUdfTE9BRCAgICAgIDB4MDAwMDAwMDQg IC8vIExvYWQgZXZlbnRzCisgICMgIERFQlVHX0ZTICAgICAgICAweDAwMDAwMDA4ICAvLyBFRkkg RmlsZSBzeXN0ZW0KKyAgIyAgREVCVUdfUE9PTCAgICAgIDB4MDAwMDAwMTAgIC8vIEFsbG9jICZh bXA7IEZyZWUgKHBvb2wpCisgICMgIERFQlVHX1BBR0UgICAgICAweDAwMDAwMDIwICAvLyBBbGxv YyAmYW1wOyBGcmVlIChwYWdlKQorICAjICBERUJVR19JTkZPICAgICAgMHgwMDAwMDA0MCAgLy8g SW5mb3JtYXRpb25hbCBkZWJ1ZyBtZXNzYWdlcworICAjICBERUJVR19ESVNQQVRDSCAgMHgwMDAw MDA4MCAgLy8gUEVJL0RYRS9TTU0gRGlzcGF0Y2hlcnMKKyAgIyAgREVCVUdfVkFSSUFCTEUgIDB4 MDAwMDAxMDAgIC8vIFZhcmlhYmxlCisgICMgIERFQlVHX0JNICAgICAgICAweDAwMDAwNDAwICAv LyBCb290IE1hbmFnZXIKKyAgIyAgREVCVUdfQkxLSU8gICAgIDB4MDAwMDEwMDAgIC8vIEJsa0lv IERyaXZlcgorICAjICBERUJVR19ORVQgICAgICAgMHgwMDAwNDAwMCAgLy8gU05QIERyaXZlcgor ICAjICBERUJVR19VTkRJICAgICAgMHgwMDAxMDAwMCAgLy8gVU5ESSBEcml2ZXIKKyAgIyAgREVC VUdfTE9BREZJTEUgIDB4MDAwMjAwMDAgIC8vIExvYWRGaWxlCisgICMgIERFQlVHX0VWRU5UICAg ICAweDAwMDgwMDAwICAvLyBFdmVudCBtZXNzYWdlcworICAjICBERUJVR19HQ0QgICAgICAgMHgw MDEwMDAwMCAgLy8gR2xvYmFsIENvaGVyZW5jeSBEYXRhYmFzZSBjaGFuZ2VzCisgICMgIERFQlVH X0NBQ0hFICAgICAweDAwMjAwMDAwICAvLyBNZW1vcnkgcmFuZ2UgY2FjaGFiaWxpdHkgY2hhbmdl cworICAjICBERUJVR19WRVJCT1NFICAgMHgwMDQwMDAwMCAgLy8gRGV0YWlsZWQgZGVidWcgbWVz c2FnZXMgdGhhdCBtYXkKKyAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ25p ZmljYW50bHkgaW1wYWN0IGJvb3QgcGVyZm9ybWFuY2UKKyAgIyAgREVCVUdfRVJST1IgICAgIDB4 ODAwMDAwMDAgIC8vIEVycm9yCisgIERFRklORSBERUJVR19QUklOVF9FUlJPUl9MRVZFTCA9IDB4 ODAwMDAwMEYKKyAgREVGSU5FIEZJUk1XQVJFX1ZFUiAgICAgICAgICAgID0gMC4wMS4wMDEKKyAg REVGSU5FIEVESzJfU0tJUF9QRUlDT1JFICAgICAgID0gVFJVRQorICBERUZJTkUgU0VDVVJFX0JP T1RfRU5BQkxFICAgICAgPSBGQUxTRQorICBERUZJTkUgSU5DTFVERV9URlRQX0NPTU1BTkQgICAg PSBUUlVFCisKKyAgIworICAjIE5ldHdvcmsgZGVmaW5pdGlvbgorICAjCisgIERFRklORSBORVRX T1JLX0lQNl9FTkFCTEUgICAgICAgICAgICAgICAgICA9IEZBTFNFCisgIERFRklORSBORVRXT1JL X0hUVFBfQk9PVF9FTkFCTEUgICAgICAgICAgICA9IFRSVUUKKyAgREVGSU5FIE5FVFdPUktfQUxM T1dfSFRUUF9DT05ORUNUSU9OUyAgICAgID0gVFJVRQorICBERUZJTkUgTkVUV09SS19UTFNfRU5B QkxFICAgICAgICAgICAgICAgICAgPSBGQUxTRQorCjwvcHJlPgogICAgICA8L2Jsb2NrcXVvdGU+ CiAgICAgIDxwcmUgY2xhc3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+CllvdSdsbCB3YW50IHRv IGluY2x1ZGUgdGhhdCAhaW5jbHVkZSBNZGVQa2cvTWRlTGlicy5kc2MuaW5jIGJpdApzb21ld2hl cmUgaGVyZS4KCjwvcHJlPgogICAgICA8YmxvY2txdW90ZSB0eXBlPSJjaXRlIj4KICAgICAgICA8 cHJlIGNsYXNzPSJtb3otcXVvdGUtcHJlIiB3cmFwPSIiPisjIEluY2x1ZGUgZGVmYXVsdCBBbXBl cmUgUGxhdGZvcm0gRFNDIGZpbGUKKyFpbmNsdWRlIFNpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJh UGtnL0FtcGVyZUFsdHJhUGtnLmRzYy5pbmMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMK KyMgU3BlY2lmaWMgUGxhdGZvcm0gTGlicmFyeQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMK K1tMaWJyYXJ5Q2xhc3Nlc10KKyAgIworICAjIFJUQyBMaWJyYXJ5OiBDb21tb24gUlRDCisgICMK KyAgUmVhbFRpbWVDbG9ja0xpYnxFbWJlZGRlZFBrZy9MaWJyYXJ5L1ZpcnR1YWxSZWFsVGltZUNs b2NrTGliL1ZpcnR1YWxSZWFsVGltZUNsb2NrTGliLmluZgorCisjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIworIworIyBTcGVjaWZpYyBQbGF0Zm9ybSBQY2RzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIworW1BjZHNGZWF0dXJlRmxhZy5jb21tb25dCitbUGNkc0ZpeGVkQXRCdWlsZC5jb21tb25d CisKKyFpZiAkKFNFQ1VSRV9CT09UX0VOQUJMRSkgPT0gVFJVRQorICAjIE92ZXJyaWRlIHRoZSBk ZWZhdWx0IHZhbHVlcyBmcm9tIFNlY3VyaXR5UGtnIHRvIGVuc3VyZSBpbWFnZXMKKyAgIyBmcm9t IGFsbCBzb3VyY2VzIGFyZSB2ZXJpZmllZCBpbiBzZWN1cmUgYm9vdAorICBnRWZpU2VjdXJpdHlQ a2dUb2tlblNwYWNlR3VpZC5QY2RPcHRpb25Sb21JbWFnZVZlcmlmaWNhdGlvblBvbGljeXwweDA0 CisgIGdFZmlTZWN1cml0eVBrZ1Rva2VuU3BhY2VHdWlkLlBjZEZpeGVkTWVkaWFJbWFnZVZlcmlm aWNhdGlvblBvbGljeXwweDA0CisgIGdFZmlTZWN1cml0eVBrZ1Rva2VuU3BhY2VHdWlkLlBjZFJl bW92YWJsZU1lZGlhSW1hZ2VWZXJpZmljYXRpb25Qb2xpY3l8MHgwNAorIWVuZGlmCisKKworIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU3BlY2lmaWMgUGxhdGZvcm0gQ29tcG9uZW50Cisj CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworW0NvbXBvbmVudHMuY29tbW9uXQo8L3ByZT4KICAg ICAgPC9ibG9ja3F1b3RlPgogICAgICA8cHJlIGNsYXNzPSJtb3otcXVvdGUtcHJlIiB3cmFwPSIi PgoKCjwvcHJlPgogICAgICA8YmxvY2txdW90ZSB0eXBlPSJjaXRlIj4KICAgICAgICA8cHJlIGNs YXNzPSJtb3otcXVvdGUtcHJlIiB3cmFwPSIiPmRpZmYgLS1naXQgYS9TaWxpY29uL0FtcGVyZS9B bXBlcmVBbHRyYVBrZy9JbmNsdWRlL0xpYnJhcnkvQW1wZXJlQ3B1TGliLmggYi9TaWxpY29uL0Ft cGVyZS9BbXBlcmVBbHRyYVBrZy9JbmNsdWRlL0xpYnJhcnkvQW1wZXJlQ3B1TGliLmgKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5kZTU3NjQ3NGZiNDgKLS0tIC9kZXYv bnVsbAorKysgYi9TaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9JbmNsdWRlL0xpYnJhcnkv QW1wZXJlQ3B1TGliLmgKQEAgLTAsMCArMSwyODIgQEAKKy8qKiBAZmlsZQorCisgIENvcHlyaWdo dCAoYykgMjAyMCAtIDIwMjEsIEFtcGVyZSBDb21wdXRpbmcgTExDLiBBbGwgcmlnaHRzIHJlc2Vy dmVkLiZsdDtCUiZndDsKKworICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTItQ2xhdXNl LVBhdGVudAorCisqKi8KKworI2lmbmRlZiBBTVBFUkVfQ1BVX0xJQl9IXworI2RlZmluZSBBTVBF UkVfQ1BVX0xJQl9IXworCisvKiBDdHlwZW4sIGJpdHNbMyhuIC0gMSkgKyAyIDogMyhuIC0gMSld LCBmb3IgbiA9IDEgdG8gNyAqLworI2RlZmluZSBDTElEUl9DVFlQRV9TSElGVChMZXZlbCkgICAg KDMgKiAoTGV2ZWwgLSAxKSkKKyNkZWZpbmUgQ0xJRFJfQ1RZUEVfTUFTSyhMZXZlbCkgICAgICg3 ICZsdDsmbHQ7IENMSURSX0NUWVBFX1NISUZUKExldmVsKSkKKyNkZWZpbmUgQ0xJRFJfQ1RZUEUo Q2xpZHIsIExldmVsKSBcCisgICgoKENsaWRyKSAmYW1wOyBDTElEUl9DVFlQRV9NQVNLKExldmVs KSkgJmd0OyZndDsgQ0xJRFJfQ1RZUEVfU0hJRlQoTGV2ZWwpKQorCisjZGVmaW5lIENDU0lEUl9O VU1TRVRTX1NISUZUICAgICAgICAxMworI2RlZmluZSBDQ1NJRFJfTlVNU0VUU19NQVNLICAgICAg ICAgMHhGRkZFMDAwCisjZGVmaW5lIENDU0lEUl9OVU1TRVRTKENjc2lkcikgXAorICAoKChDY3Np ZHIpICZhbXA7IENDU0lEUl9OVU1TRVRTX01BU0spICZndDsmZ3Q7IENDU0lEUl9OVU1TRVRTX1NI SUZUKQorI2RlZmluZSBDQ1NJRFJfQVNTT0NJQVRJVklUWV9TSElGVCAgMworI2RlZmluZSBDQ1NJ RFJfQVNTT0NJQVRJVklUWV9NQVNLICAgMHgxRkY4CisjZGVmaW5lIENDU0lEUl9BU1NPQ0lBVElW SVRZKENjc2lkcikgXAorICAoKChDY3NpZHIpICZhbXA7IENDU0lEUl9BU1NPQ0lBVElWSVRZX01B U0spICZndDsmZ3Q7IENDU0lEUl9BU1NPQ0lBVElWSVRZX1NISUZUKQorI2RlZmluZSBDQ1NJRFJf TElORV9TSVpFX1NISUZUICAgICAgMAorI2RlZmluZSBDQ1NJRFJfTElORV9TSVpFX01BU0sgICAg ICAgMHg3CisjZGVmaW5lIENDU0lEUl9MSU5FX1NJWkUoQ2NzaWRyKSBcCisgICgoKENjc2lkcikg JmFtcDsgQ0NTSURSX0xJTkVfU0laRV9NQVNLKSAmZ3Q7Jmd0OyBDQ1NJRFJfTElORV9TSVpFX1NI SUZUKQo8L3ByZT4KICAgICAgPC9ibG9ja3F1b3RlPgogICAgICA8cHJlIGNsYXNzPSJtb3otcXVv dGUtcHJlIiB3cmFwPSIiPgpBbGwgb2YgdGhlIGFib3ZlIChDTElEUi9DQ1NJRFIpIGFyZSBhcmNo aXRlY3R1cmFsLgpXZSd2ZSBhbHNvIGRldmVsb3BlZCBzb21lIG5ldyBhY2Nlc3NvcnMgYW5kIHN0 dWZmIGZvciB0aGVzZSwgYXMgcGFydApvZiBBcm1Qa2cvVW5pdmVyc2FsL1NtYmlvc0R4ZSB3b3Jr IHRoYXQncyBnb25lIG9uIHNpbmNlIHYxIG9mIHRoaXMgc2V0LgpXZSBtYXkgbmVlZCB0byBjbGVh biBzb21lIGludGVyZmFjZXMgdXAsIGJ1dCBpZGVhbGx5IEknZCBwcmVmZXIgaWYgeW91CmNvdWxk IHVzZSBzb21lIGFjY2Vzc29ycyBmcm9tIEFybUxpYiBvciBzdWNoLgoKPC9wcmU+CiAgICAgIDxi bG9ja3F1b3RlIHR5cGU9ImNpdGUiPgogICAgICAgIDxwcmUgY2xhc3M9Im1vei1xdW90ZS1wcmUi IHdyYXA9IiI+KworI2RlZmluZSBTVUJOVU1BX01PREVfTU9OT0xJVEhJQyAgICAgICAgMAorI2Rl ZmluZSBTVUJOVU1BX01PREVfSEVNSVNQSEVSRSAgICAgICAgMQorI2RlZmluZSBTVUJOVU1BX01P REVfUVVBRFJBTlQgICAgICAgICAgMgorCisjZGVmaW5lIE1PTk9MSVRJQ19OVU1fT0ZfUkVHSU9O ICAgICAgICAxCisjZGVmaW5lIEhFTUlTUEhFUkVfTlVNX09GX1JFR0lPTiAgICAgICAyCisjZGVm aW5lIFFVQURSQU5UX05VTV9PRl9SRUdJT04gICAgICAgICA0CisjZGVmaW5lIFNVQk5VTUFfQ1BN X1JFR0lPTl9TSVpFICAgICAgICA0CisjZGVmaW5lIE5VTV9PRl9DUE1fUEVSX01FU0hfUk9XICAg ICAgICA4CisKKyNkZWZpbmUgQ1BNX1BFUl9ST1dfT0ZGU0VUKENwbUlkKSAgICAgICgoQ3BtSWQp ICUgTlVNX09GX0NQTV9QRVJfTUVTSF9ST1cpCisjZGVmaW5lIENQTV9ST1dfTlVNQkVSKENwbUlk KSAgICAgICAgICAoKENwbUlkKSAvIE5VTV9PRl9DUE1fUEVSX01FU0hfUk9XKQorCisjZGVmaW5l IFNPQ0tFVF9JRChDcHVJZCkgICAgICAgICAgICAgICAoKENwdUlkKSAvIChQTEFURk9STV9DUFVf TUFYX0NQTSAqIFBMQVRGT1JNX0NQVV9OVU1fQ09SRVNfUEVSX0NQTSkpCisjZGVmaW5lIENMVVNU RVJfSUQoQ3B1SWQpICAgICAgICAgICAgICAoKChDcHVJZCkgLyBQTEFURk9STV9DUFVfTlVNX0NP UkVTX1BFUl9DUE0pICUgUExBVEZPUk1fQ1BVX01BWF9DUE0pCisKKworLyoqCisgIEdldCB0aGUg U3ViTlVNQSBtb2RlLgorCisgIEByZXR1cm4gICBVSU5UOCAgICAgIFRoZSBTdWJOVU1BIG1vZGUu CisKKyoqLworVUlOVDgKK0VGSUFQSQorQ3B1R2V0U3ViTnVtYU1vZGUgKAorICBWT0lECisgICk7 CisKKy8qKgorICBHZXQgdGhlIG51bWJlciBvZiBTdWJOVU1BIHJlZ2lvbi4KKworICBAcmV0dXJu ICAgVUlOVDggICAgICBUaGUgbnVtYmVyIG9mIFN1Yk5VTUEgcmVnaW9uLgorCisqKi8KK1VJTlQ4 CitFRklBUEkKK0NwdUdldE51bWJlck9mU3ViTnVtYVJlZ2lvbiAoCisgIFZPSUQKKyAgKTsKKwor LyoqCisgIEdldCB0aGUgU3ViTlVNQSBub2RlIG9mIGEgQ1BNLgorCisgIEBwYXJhbSAgICBTb2Nr ZXRJZCAgICBTb2NrZXQgaW5kZXguCisgIEBwYXJhbSAgICBDcG0gICAgICAgICBDUE0gaW5kZXgu CisgIEByZXR1cm4gICBVSU5UOCAgICAgICBUaGUgU3ViTlVNQSBub2RlIG9mIGEgQ1BNLgorCisq Ki8KK1VJTlQ4CitFRklBUEkKK0NwdUdldFN1Yk51bU5vZGUgKAorICBVSU5UOCAgU29ja2V0LAor ICBVSU5UMTYgQ3BtCisgICk7CisKKy8qKgorICBHZXQgdGhlIGFzc29jaWF0aXZpdHkgb2YgY2Fj aGUuCisKKyAgQHBhcmFtICAgIExldmVsICAgICAgIENhY2hlIGxldmVsLgorICBAcmV0dXJuICAg VUlOVDMyICAgICAgQXNzb2NpYXRpdml0eSBvZiBjYWNoZS4KKworKiovCitVSU5UMzIKK0VGSUFQ SQorQ3B1R2V0QXNzb2NpYXRpdml0eSAoCisgIFVJTlQzMiBMZXZlbAorICApOworCisvKioKKyAg R2V0IHRoZSBjYWNoZSBzaXplLgorCisgIEBwYXJhbSAgICBMZXZlbCAgICAgICBDYWNoZSBsZXZl bC4KKyAgQHJldHVybiAgIFVJTlQzMiAgICAgIENhY2hlIHNpemUuCisKKyoqLworVUlOVDMyCitF RklBUEkKK0NwdUdldENhY2hlU2l6ZSAoCisgIFVJTlQzMiBMZXZlbAorICApOworCisvKioKKyAg R2V0IHRoZSBudW1iZXIgb2Ygc3VwcG9ydGVkIHNvY2tldC4KKworICBAcmV0dXJuICAgVUlOVDgg ICAgICBOdW1iZXIgb2Ygc3VwcG9ydGVkIHNvY2tldC4KKworKiovCitVSU5UOAorRUZJQVBJCitH ZXROdW1iZXJPZlN1cHBvcnRlZFNvY2tldHMgKAorICBWT0lECisgICk7CisKKy8qKgorICBHZXQg dGhlIG51bWJlciBvZiBhY3RpdmUgc29ja2V0LgorCisgIEByZXR1cm4gICBVSU5UOCAgICAgIE51 bWJlciBvZiBhY3RpdmUgc29ja2V0LgorCisqKi8KK1VJTlQ4CitFRklBUEkKK0dldE51bWJlck9m QWN0aXZlU29ja2V0cyAoCisgIFZPSUQKKyAgKTsKKworLyoqCisgIEdldCB0aGUgbnVtYmVyIG9m IGFjdGl2ZSBDUE0gcGVyIHNvY2tldC4KKworICBAcGFyYW0gICAgU29ja2V0SWQgICAgU29ja2V0 IGluZGV4LgorICBAcmV0dXJuICAgVUlOVDE2ICAgICAgTnVtYmVyIG9mIENQTS4KKworKiovCitV SU5UMTYKK0VGSUFQSQorR2V0TnVtYmVyT2ZBY3RpdmVDUE1zUGVyU29ja2V0ICgKKyAgVUlOVDgg U29ja2V0SWQKKyAgKTsKKworLyoqCisgIEdldCB0aGUgbnVtYmVyIG9mIGNvbmZpZ3VyZWQgQ1BN IHBlciBzb2NrZXQuCisKKyAgQHBhcmFtICAgIFNvY2tldElkICAgIFNvY2tldCBpbmRleC4KKyAg QHJldHVybiAgIFVJTlQxNiAgICAgIE51bWJlciBvZiBjb25maWd1cmVkIENQTS4KKworKiovCitV SU5UMTYKK0VGSUFQSQorR2V0TnVtYmVyT2ZDb25maWd1cmVkQ1BNcyAoCisgIFVJTlQ4IFNvY2tl dElkCisgICk7CisKKy8qKgorICBTZXQgdGhlIG51bWJlciBvZiBjb25maWd1cmVkIENQTSBwZXIg c29ja2V0LgorCisgIEBwYXJhbSAgICBTb2NrZXRJZCAgICAgICAgU29ja2V0IGluZGV4LgorICBA cGFyYW0gICAgTnVtYmVyT2ZDUE1zICAgIE51bWJlciBvZiBDUE0gdG8gYmUgY29uZmlndXJlZC4K KyAgQHJldHVybiAgIEVGSV9TVUNDRVNTICAgICBPcGVyYXRpb24gc3VjY2VlZGVkLgorICBAcmV0 dXJuICAgT3RoZXJzICAgICAgICAgIEFuIGVycm9yIGhhcyBvY2N1cnJlZC4KKworKiovCitFRklf U1RBVFVTCitFRklBUEkKK1NldE51bWJlck9mQ29uZmlndXJlZENQTXMgKAorICBVSU5UOCAgU29j a2V0SWQsCisgIFVJTlQxNiBOdW1iZXJPZkNQTXMKKyAgKTsKKworLyoqCisgIEdldCB0aGUgbWF4 aW11bSBudW1iZXIgb2YgY29yZSBwZXIgc29ja2V0LiBUaGlzIG51bWJlcgorICBzaG91bGQgYmUg dGhlIHNhbWUgZm9yIGFsbCBzb2NrZXRzLgorCisgIEByZXR1cm4gICBVSU5UMTYgICAgICBNYXhp bXVtIG51bWJlciBvZiBjb3JlLgorCisqKi8KK1VJTlQxNgorRUZJQVBJCitHZXRNYXhpbXVtTnVt YmVyT2ZDb3JlcyAoCisgIFZPSUQKKyAgKTsKKworLyoqCisgIEdldCB0aGUgbWF4aW11bSBudW1i ZXIgb2YgQ1BNIHBlciBzb2NrZXQuIFRoaXMgbnVtYmVyCisgIHNob3VsZCBiZSB0aGUgc2FtZSBm b3IgYWxsIHNvY2tldHMuCisKKyAgQHJldHVybiAgIFVJTlQzMiAgICAgIE1heGltdW0gbnVtYmVy IG9mIENQTS4KKworKiovCitVSU5UMTYKK0VGSUFQSQorR2V0TWF4aW11bU51bWJlck9mQ1BNcyAo CisgIFZPSUQKKyAgKTsKKworLyoqCisgIEdldCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBjb3JlcyBv ZiBhIHNvY2tldHMuCisKKyAgQHJldHVybiAgIFVJTlQxNiAgICAgIE51bWJlciBvZiBhY3RpdmUg Y29yZS4KKworKiovCitVSU5UMTYKK0VGSUFQSQorR2V0TnVtYmVyT2ZBY3RpdmVDb3Jlc1BlclNv Y2tldCAoCisgIFVJTlQ4IFNvY2tldElkCisgICk7CisKKy8qKgorICBHZXQgdGhlIG51bWJlciBv ZiBhY3RpdmUgY29yZXMgb2YgYWxsIHNvY2tldC4KKworICBAcmV0dXJuICAgVUlOVDE2ICAgICAg TnVtYmVyIG9mIGFjdGl2ZSBjb3JlLgorCisqKi8KK1VJTlQxNgorRUZJQVBJCitHZXROdW1iZXJP ZkFjdGl2ZUNvcmVzICgKKyAgVk9JRAorICApOworCisvKioKKyAgQ2hlY2sgaWYgdGhlIGxvZ2lj YWwgQ1BVIGlzIGVuYWJsZWQgb3Igbm90LgorCisgIEBwYXJhbSAgICBDcHVJZCAgICAgICBUaGUg bG9naWNhbCBDcHUgSUQuIFN0YXJ0ZWQgZnJvbSAwLgorICBAcmV0dXJuICAgQk9PTEVBTiAgICAg VFJVRSBpZiB0aGUgQ3B1IGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIGlm IHRoZSBDcHUgZGlzYWJsZWQuCisKKyoqLworQk9PTEVBTgorRUZJQVBJCitJc0NwdUVuYWJsZWQg KAorICBVSU5UMTYgQ3B1SWQKKyAgKTsKKworCisvKioKKyAgQ2hlY2sgaWYgdGhlIHNsYXZlIHNv Y2tldCBpcyBwcmVzZW50CisKKyAgQHJldHVybiAgIEJPT0xFQU4gICAgIFRSVUUgaWYgdGhlIFNs YXZlIENwdSBpcyBwcmVzZW50CisgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBpZiB0aGUg U2xhdmUgQ3B1IGlzIG5vdCBwcmVzZW50CisKKyoqLworQk9PTEVBTgorRUZJQVBJCitJc1NsYXZl U29ja2V0UHJlc2VudCAoCisgIFZPSUQKKyAgKTsKKworLyoqCisgIENoZWNrIGlmIHRoZSBzbGF2 ZSBzb2NrZXQgaXMgYWN0aXZlCisKKyAgQHJldHVybiAgIEJPT0xFQU4gICAgIFRSVUUgaWYgdGhl IFNsYXZlIENQVSBTb2NrZXQgaXMgYWN0aXZlLgorICAgICAgICAgICAgICAgICAgICAgICAgRkFM U0UgaWYgdGhlIFNsYXZlIENQVSBTb2NrZXQgaXMgbm90IGFjdGl2ZS4KKworKiovCitCT09MRUFO CitFRklBUEkKK0lzU2xhdmVTb2NrZXRBY3RpdmUgKAorICBWT0lECisgICk7CisKKy8qKgorICBD aGVjayBpZiB0aGUgQ1BVIHByb2R1Y3QgSUQgaXMgQWMwMQorICBAcmV0dXJuICAgQk9PTEVBTiAg ICAgVFJVRSBpZiB0aGUgUHJvZHVjdCBJRCBpcyBBYzAxCisgICAgICAgICAgICAgICAgICAgICAg ICBGQUxTRSBvdGhlcndpc2UuCisKKyoqLworQk9PTEVBTgorRUZJQVBJCitJc0FjMDFQcm9jZXNz b3IgKAorICBWT0lECisgICk7CisKKyNlbmRpZiAvKiBBTVBFUkVfQ1BVX0xJQl9IXyAqLwo8L3By ZT4KICAgICAgPC9ibG9ja3F1b3RlPgogICAgICA8cHJlIGNsYXNzPSJtb3otcXVvdGUtcHJlIiB3 cmFwPSIiPgoKPC9wcmU+CiAgICAgIDxibG9ja3F1b3RlIHR5cGU9ImNpdGUiPgogICAgICAgIDxw cmUgY2xhc3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+ZGlmZiAtLWdpdCBhL1NpbGljb24vQW1w ZXJlL0FtcGVyZUFsdHJhUGtnL0xpYnJhcnkvQW1wZXJlQ3B1TGliL0FtcGVyZUNwdUxpYi5jIGIv U2lsaWNvbi9BbXBlcmUvQW1wZXJlQWx0cmFQa2cvTGlicmFyeS9BbXBlcmVDcHVMaWIvQW1wZXJl Q3B1TGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi44ZGE2OThl MGI4NTUKLS0tIC9kZXYvbnVsbAorKysgYi9TaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9M aWJyYXJ5L0FtcGVyZUNwdUxpYi9BbXBlcmVDcHVMaWIuYwpAQCAtMCwwICsxLDcwNiBAQAorLyoq IEBmaWxlCisKKyAgQ29weXJpZ2h0IChjKSAyMDIwIC0gMjAyMSwgQW1wZXJlIENvbXB1dGluZyBM TEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuJmx0O0JSJmd0OworCisgIFNQRFgtTGljZW5zZS1JZGVu dGlmaWVyOiBCU0QtMi1DbGF1c2UtUGF0ZW50CisKKyoqLworCisjaW5jbHVkZSAmbHQ7UGlQZWku aCZndDsKKyNpbmNsdWRlICZsdDtVZWZpLmgmZ3Q7CisKKyNpbmNsdWRlICZsdDtHdWlkL1BsYXRm b3JtSW5mb0hvYkd1aWQuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJyYXJ5L0FtcGVyZUNwdUxpYi5o Jmd0OworI2luY2x1ZGUgJmx0O0xpYnJhcnkvQXJtTGliL0FybUxpYlByaXZhdGUuaCZndDsKKyNp bmNsdWRlICZsdDtMaWJyYXJ5L0Jhc2VNZW1vcnlMaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJy YXJ5L0RlYnVnTGliLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7TGlicmFyeS9Ib2JMaWIuaCZndDsKKyNp bmNsdWRlICZsdDtMaWJyYXJ5L0lvTGliLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7TGlicmFyeS9OVlBh cmFtTGliLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7TlZQYXJhbURlZi5oJmd0OworI2luY2x1ZGUgJmx0 O1BsYXRmb3JtL0FjMDEuaCZndDsKKyNpbmNsdWRlICZsdDtQbGF0Zm9ybUluZm9Ib2IuaCZndDsK KworU1RBVElDIFBMQVRGT1JNX0lORk9fSE9CICptUGxhdGZvcm1JbmZvSG9iID0gTlVMTDsKKwor UExBVEZPUk1fSU5GT19IT0IgKgorR2V0UGxhdGZvcm1Ib2IgKAorICBWT0lECisgICkKK3sKKyAg Vk9JRCAqSG9iOworCisgIGlmIChtUGxhdGZvcm1JbmZvSG9iID09IE5VTEwpIHsKKyAgICBIb2Ig PSBHZXROZXh0R3VpZEhvYiAoCisgICAgICAgICAgICAmYW1wO2dQbGF0Zm9ybUhvYkd1aWQsCisg ICAgICAgICAgICAoQ09OU1QgVk9JRCAqKUZpeGVkUGNkR2V0NjQgKFBjZFN5c3RlbU1lbW9yeUJh c2UpCisgICAgICAgICAgICApOworICAgIEFTU0VSVCAoSG9iICE9IE5VTEwpOworICAgIGlmIChI b2IgPT0gTlVMTCkgeworICAgICAgREVCVUcgKChERUJVR19FUlJPUiwgJnF1b3Q7JWE6IEZhaWxl ZCB0byBnZXQgZ1BsYXRmb3JtSG9iR3VpZCFcbiZxdW90OywgX19GVU5DVElPTl9fKSk7CisgICAg ICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBtUGxhdGZvcm1JbmZvSG9iID0gKFBMQVRGT1JN X0lORk9fSE9CICopR0VUX0dVSURfSE9CX0RBVEEgKEhvYik7CisgIH0KKworICByZXR1cm4gbVBs YXRmb3JtSW5mb0hvYjsKK30KKworLyoqCisgIEdldCB0aGUgU3ViTlVNQSBtb2RlLgorCisgIEBy ZXR1cm4gICBVSU5UOCAgICAgIFRoZSBTdWJOVU1BIG1vZGUuCisKKyoqLworVUlOVDgKK0VGSUFQ SQorQ3B1R2V0U3ViTnVtYU1vZGUgKAorICBWT0lECisgICkKK3sKKyAgUExBVEZPUk1fSU5GT19I T0IgICpQbGF0Zm9ybUhvYjsKKworICBQbGF0Zm9ybUhvYiA9IEdldFBsYXRmb3JtSG9iICgpOwor ICBpZiAoUGxhdGZvcm1Ib2IgPT0gTlVMTCkgeworICAgIHJldHVybiBTVUJOVU1BX01PREVfTU9O T0xJVEhJQzsKKyAgfQorCisgIHJldHVybiBQbGF0Zm9ybUhvYi0mZ3Q7U3ViTnVtYU1vZGVbMF07 Cit9CisKKy8qKgorICBHZXQgdGhlIG51bWJlciBvZiBTdWJOVU1BIHJlZ2lvbi4KKworICBAcmV0 dXJuICAgVUlOVDggICAgICBUaGUgbnVtYmVyIG9mIFN1Yk5VTUEgcmVnaW9uLgorCisqKi8KK1VJ TlQ4CitFRklBUEkKK0NwdUdldE51bWJlck9mU3ViTnVtYVJlZ2lvbiAoCisgIFZPSUQKKyAgKQor eworICBVSU5UOCBTdWJOdW1hTW9kZTsKKyAgVUlOVDggTnVtYmVyT2ZTdWJOdW1hUmVnaW9uOwor CisgIFN1Yk51bWFNb2RlID0gQ3B1R2V0U3ViTnVtYU1vZGUgKCk7CisgIEFTU0VSVCAoU3ViTnVt YU1vZGUgJmx0Oz0gU1VCTlVNQV9NT0RFX1FVQURSQU5UKTsKKworICBzd2l0Y2ggKFN1Yk51bWFN b2RlKSB7CisgIGNhc2UgU1VCTlVNQV9NT0RFX01PTk9MSVRISUM6CisgICAgTnVtYmVyT2ZTdWJO dW1hUmVnaW9uID0gTU9OT0xJVElDX05VTV9PRl9SRUdJT047CisgICAgYnJlYWs7CisKKyAgY2Fz ZSBTVUJOVU1BX01PREVfSEVNSVNQSEVSRToKKyAgICBOdW1iZXJPZlN1Yk51bWFSZWdpb24gPSBI RU1JU1BIRVJFX05VTV9PRl9SRUdJT047CisgICAgYnJlYWs7CisKKyAgY2FzZSBTVUJOVU1BX01P REVfUVVBRFJBTlQ6CisgICAgTnVtYmVyT2ZTdWJOdW1hUmVnaW9uID0gUVVBRFJBTlRfTlVNX09G X1JFR0lPTjsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8vIFNob3VsZCBuZXZlciBy ZWFjaCB0aGVyZS4KKyAgICBBU1NFUlQgKEZBTFNFKTsKKyAgICBicmVhazsKKyAgfQorCisgIHJl dHVybiBOdW1iZXJPZlN1Yk51bWFSZWdpb247Cit9CisKKy8qKgorICBHZXQgdGhlIFN1Yk5VTUEg bm9kZSBvZiBhIENQTS4KKworICBAcGFyYW0gICAgU29ja2V0SWQgICAgU29ja2V0IGluZGV4Lgor ICBAcGFyYW0gICAgQ3BtICAgICAgICAgQ1BNIGluZGV4LgorICBAcmV0dXJuICAgVUlOVDggICAg ICAgVGhlIFN1Yk5VTUEgbm9kZSBvZiBhIENQTS4KKworKiovCitVSU5UOAorRUZJQVBJCitDcHVH ZXRTdWJOdW1Ob2RlICgKKyAgVUlOVDggIFNvY2tldElkLAorICBVSU5UMTYgQ3BtCisgICkKK3sK KyAgQk9PTEVBTiBJc0FzeW1NZXNoOworICBVSU5UOCAgIFN1Yk51bWFOb2RlOworICBVSU5UMTYg IE1heE51bWJlck9mQ1BNOworICBVSU5UOCAgIE1pZGRsZVJvdzsKKyAgVUlOVDggICBRdWFkcmFu dEhpZ2hlclJvd05vZGVOdW1iZXJbTlVNX09GX0NQTV9QRVJfTUVTSF9ST1ddID0gezEsIDEsIDEs IDEsIDMsIDMsIDMsIDN9OworICBVSU5UOCAgIFF1YWRyYW50TG93ZXJSb3dOb2RlTnVtYmVyW05V TV9PRl9DUE1fUEVSX01FU0hfUk9XXSAgPSB7MCwgMCwgMCwgMCwgMiwgMiwgMiwgMn07CisgIFVJ TlQ4ICAgUXVhZHJhbnRNaWRkbGVSb3dOb2RlTnVtYmVyW05VTV9PRl9DUE1fUEVSX01FU0hfUk9X XSA9IHswLCAwLCAxLCAxLCAzLCAzLCAyLCAyfTsKKyAgVUlOVDggICBTdWJOdW1hTW9kZTsKKwor ICBNYXhOdW1iZXJPZkNQTSA9IEdldE1heGltdW1OdW1iZXJPZkNQTXMgKCk7CisgIFN1Yk51bWFN b2RlID0gQ3B1R2V0U3ViTnVtYU1vZGUgKCk7CisgIEFTU0VSVCAoU3ViTnVtYU1vZGUgJmx0Oz0g U1VCTlVNQV9NT0RFX1FVQURSQU5UKTsKKworICBzd2l0Y2ggKFN1Yk51bWFNb2RlKSB7CisgIGNh c2UgU1VCTlVNQV9NT0RFX01PTk9MSVRISUM6CisgICAgU3ViTnVtYU5vZGUgPSAoU29ja2V0SWQg PT0gMCkgPyAwIDogMTsKKyAgICBicmVhazsKKworICBjYXNlIFNVQk5VTUFfTU9ERV9IRU1JU1BI RVJFOgorICAgIGlmIChDUE1fUEVSX1JPV19PRkZTRVQgKENwbSkgJmd0Oz0gU1VCTlVNQV9DUE1f UkVHSU9OX1NJWkUpIHsKKyAgICAgIFN1Yk51bWFOb2RlID0gMTsKKyAgICB9IGVsc2UgeworICAg ICAgU3ViTnVtYU5vZGUgPSAwOworICAgIH0KKworICAgIGlmIChTb2NrZXRJZCA9PSAxKSB7Cisg ICAgICBTdWJOdW1hTm9kZSArPSBIRU1JU1BIRVJFX05VTV9PRl9SRUdJT047CisgICAgfQorICAg IGJyZWFrOworCisgIGNhc2UgU1VCTlVNQV9NT0RFX1FVQURSQU5UOgorICAgIC8vCisgICAgLy8g Q1BNIE1lc2ggUm93cworICAgIC8vCisgICAgLy8gfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLXwKKyAgICAvLyB8IDAwIC0tLS0tLS0tLS0tIDAzIHwgMDQgLS0tLS0tLS0t LS0gMDcgfCBSb3cgMAorICAgIC8vIHwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0t LS0tLS18CisgICAgLy8gfCAwOCAtLS0tLS0tLS0tLSAxMSB8IDEyIC0tLS0tLS0tLS0tIDE1IHwg Um93IDEKKyAgICAvLyB8LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfAor ICAgIC8vIHwgMTYgLSAxNyB8IDE4IC0gMTkgfCAyMCAtIDIxIHwgMjIgLSAyMyB8IE1pZGRsZSBS b3cKKyAgICAvLyB8LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfAorICAg IC8vIHwgMjQgLS0tLS0tLS0tLS0gMjcgfCAyOCAtLS0tLS0tLS0tLSAzMSB8IFJvdyAzCisgICAg Ly8gfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAvLyB8IDMy IC0tLS0tLS0tLS0tIDM1IHwgMzYgLS0tLS0tLS0tLS0gMzkgfCBSb3cgNAorICAgIC8vIHwtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgLy8KKworICAgIElzQXN5 bU1lc2ggPSAoQk9PTEVBTikoQ1BNX1JPV19OVU1CRVIgKE1heE51bWJlck9mQ1BNKSAlIDIgIT0g MCk7CisgICAgTWlkZGxlUm93ID0gQ1BNX1JPV19OVU1CRVIgKE1heE51bWJlck9mQ1BNKSAvIDI7 CisgICAgaWYgKElzQXN5bU1lc2gKKyAgICAgICAgJmFtcDsmYW1wOyBDUE1fUk9XX05VTUJFUiAo Q3BtKSA9PSBNaWRkbGVSb3cpCisgICAgeworICAgICAgU3ViTnVtYU5vZGUgPSBRdWFkcmFudE1p ZGRsZVJvd05vZGVOdW1iZXJbQ1BNX1BFUl9ST1dfT0ZGU0VUIChDcG0pXTsKKworICAgIH0gZWxz ZSBpZiAoQ1BNX1JPV19OVU1CRVIgKENwbSkgJmd0Oz0gTWlkZGxlUm93KSB7CisgICAgICBTdWJO dW1hTm9kZSA9IFF1YWRyYW50SGlnaGVyUm93Tm9kZU51bWJlcltDUE1fUEVSX1JPV19PRkZTRVQg KENwbSldOworCisgICAgfSBlbHNlIHsKKyAgICAgIFN1Yk51bWFOb2RlID0gUXVhZHJhbnRMb3dl clJvd05vZGVOdW1iZXJbQ1BNX1BFUl9ST1dfT0ZGU0VUIChDcG0pXTsKKyAgICB9CisKKyAgICBp ZiAoU29ja2V0SWQgPT0gMSkgeworICAgICAgU3ViTnVtYU5vZGUgKz0gUVVBRFJBTlRfTlVNX09G X1JFR0lPTjsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvLyBTaG91bGQg bmV2ZXIgcmVhY2ggdGhlcmUuCisgICAgQVNTRVJUIChGQUxTRSk7CisgICAgYnJlYWs7CisgIH0K KworICByZXR1cm4gU3ViTnVtYU5vZGU7Cit9CisKKy8qKgorICBHZXQgdGhlIGFzc29jaWF0aXZp dHkgb2YgY2FjaGUuCisKKyAgQHBhcmFtICAgIExldmVsICAgICAgIENhY2hlIGxldmVsLgorICBA cmV0dXJuICAgVUlOVDMyICAgICAgQXNzb2NpYXRpdml0eSBvZiBjYWNoZS4KKworKiovCitVSU5U MzIKK0VGSUFQSQorQ3B1R2V0QXNzb2NpYXRpdml0eSAoCisgIFVJTlQzMiBMZXZlbAorICApCit7 CjwvcHJlPgogICAgICA8L2Jsb2NrcXVvdGU+CiAgICAgIDxwcmUgY2xhc3M9Im1vei1xdW90ZS1w cmUiIHdyYXA9IiI+CkkgZG8gZmVlbCBzb21lIG9mIHRoaXMgc3R1ZmYgY291bGQgYmUgcmVwbGFj ZWQgYnkgdGhlIGNvbW1vbiBmdW5jdGlvbnMKd2Ugbm93IGhhdmUgaW4gQXJtTGliICh0aGF0IHdl IGRpZG4ndCB3aGVuIHYxIHdlbnQgb3V0KS4KCjwvcHJlPgogICAgICA8YmxvY2txdW90ZSB0eXBl PSJjaXRlIj4KICAgICAgICA8cHJlIGNsYXNzPSJtb3otcXVvdGUtcHJlIiB3cmFwPSIiPisgIFVJ TlQ2NCBDYWNoZUNDU0lEUjsKKyAgVUlOVDY0IENhY2hlQ0xJRFI7CisgIFVJTlQzMiBWYWx1ZSA9 IDB4MjsgLyogVW5rbm93biBTZXQtQXNzb2NpYXRpdml0eSAqLworCisgIENhY2hlQ0xJRFIgPSBS ZWFkQ0xJRFIgKCk7CisgIGlmICghQ0xJRFJfQ1RZUEUgKENhY2hlQ0xJRFIsIExldmVsKSkgewor ICAgIHJldHVybiBWYWx1ZTsKKyAgfQorCisgIENhY2hlQ0NTSURSID0gUmVhZENDU0lEUiAoTGV2 ZWwpOworICBzd2l0Y2ggKENDU0lEUl9BU1NPQ0lBVElWSVRZIChDYWNoZUNDU0lEUikpIHsKKyAg Y2FzZSAwOgorICAgIC8qIERpcmVjdCBtYXBwZWQgKi8KKyAgICBWYWx1ZSA9IDB4MzsKKyAgICBi cmVhazsKKworICBjYXNlIDE6CisgICAgLyogMi13YXkgU2V0LUFzc29jaWF0aXZpdHkgKi8KKyAg ICBWYWx1ZSA9IDB4NDsKKyAgICBicmVhazsKKworICBjYXNlIDM6CisgICAgLyogNC13YXkgU2V0 LUFzc29jaWF0aXZpdHkgKi8KKyAgICBWYWx1ZSA9IDB4NTsKKyAgICBicmVhazsKKworICBjYXNl IDc6CisgICAgLyogOC13YXkgU2V0LUFzc29jaWF0aXZpdHkgKi8KKyAgICBWYWx1ZSA9IDB4NzsK KyAgICBicmVhazsKKworICBjYXNlIDE1OgorICAgIC8qIDE2LXdheSBTZXQtQXNzb2NpYXRpdml0 eSAqLworICAgIFZhbHVlID0gMHg4OworICAgIGJyZWFrOworCisgIGNhc2UgMTE6CisgICAgLyog MTItd2F5IFNldC1Bc3NvY2lhdGl2aXR5ICovCisgICAgVmFsdWUgPSAweDk7CisgICAgYnJlYWs7 CisKKyAgY2FzZSAyMzoKKyAgICAvKiAyNC13YXkgU2V0LUFzc29jaWF0aXZpdHkgKi8KKyAgICBW YWx1ZSA9IDB4QTsKKyAgICBicmVhazsKKworICBjYXNlIDMxOgorICAgIC8qIDMyLXdheSBTZXQt QXNzb2NpYXRpdml0eSAqLworICAgIFZhbHVlID0gMHhCOworICAgIGJyZWFrOworCisgIGNhc2Ug NDc6CisgICAgLyogNDgtd2F5IFNldC1Bc3NvY2lhdGl2aXR5ICovCisgICAgVmFsdWUgPSAweEM7 CisgICAgYnJlYWs7CisKKyAgY2FzZSA2MzoKKyAgICAvKiA2NC13YXkgU2V0LUFzc29jaWF0aXZp dHkgKi8KKyAgICBWYWx1ZSA9IDB4RDsKKyAgICBicmVhazsKKworICBjYXNlIDE5OgorICAgIC8q IDIwLXdheSBTZXQtQXNzb2NpYXRpdml0eSAqLworICAgIFZhbHVlID0gMHhFOworICAgIGJyZWFr OworICB9CisKKyAgcmV0dXJuIFZhbHVlOworfQorCisvKioKKyAgR2V0IHRoZSBjYWNoZSBzaXpl LgorCisgIEBwYXJhbSAgICBMZXZlbCAgICAgICBDYWNoZSBsZXZlbC4KKyAgQHJldHVybiAgIFVJ TlQzMiAgICAgIENhY2hlIHNpemUuCisKKyoqLworVUlOVDMyCitFRklBUEkKK0NwdUdldENhY2hl U2l6ZSAoCisgIFVJTlQzMiBMZXZlbAorICApCit7CisgIFVJTlQzMiBDYWNoZUxpbmVTaXplOwor ICBVSU5UMzIgQ291bnQ7CisgIFVJTlQ2NCBDYWNoZUNDU0lEUjsKKyAgVUlOVDY0IENhY2hlQ0xJ RFI7CisKKyAgQ2FjaGVDTElEUiA9IFJlYWRDTElEUiAoKTsKKyAgaWYgKCFDTElEUl9DVFlQRSAo Q2FjaGVDTElEUiwgTGV2ZWwpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBDYWNoZUNDU0lE UiA9IFJlYWRDQ1NJRFIgKExldmVsKTsKKyAgQ2FjaGVMaW5lU2l6ZSA9IDE7CisgIENvdW50ID0g Q0NTSURSX0xJTkVfU0laRSAoQ2FjaGVDQ1NJRFIpICsgNDsKKyAgd2hpbGUgKENvdW50LS0gJmd0 OyAwKSB7CisgICAgQ2FjaGVMaW5lU2l6ZSAqPSAyOworICB9CisKKyAgcmV0dXJuICgoQ0NTSURS X05VTVNFVFMgKENhY2hlQ0NTSURSKSArIDEpICoKKyAgICAgICAgICAoQ0NTSURSX0FTU09DSUFU SVZJVFkgKENhY2hlQ0NTSURSKSArIDEpICoKKyAgICAgICAgICBDYWNoZUxpbmVTaXplKTsKK30K KworLyoqCisgIEdldCB0aGUgbnVtYmVyIG9mIHN1cHBvcnRlZCBzb2NrZXQuCisKKyAgQHJldHVy biAgIFVJTlQ4ICAgICAgTnVtYmVyIG9mIHN1cHBvcnRlZCBzb2NrZXQuCisKKyoqLworVUlOVDgK K0VGSUFQSQorR2V0TnVtYmVyT2ZTdXBwb3J0ZWRTb2NrZXRzICgKKyAgVk9JRAorICApCit7Cisg IFBMQVRGT1JNX0lORk9fSE9CICAqUGxhdGZvcm1Ib2I7CisKKyAgUGxhdGZvcm1Ib2IgPSBHZXRQ bGF0Zm9ybUhvYiAoKTsKKyAgaWYgKFBsYXRmb3JtSG9iID09IE5VTEwpIHsKKyAgICAvLworICAg IC8vIEJ5IGRlZmF1bHQsIHRoZSBudW1iZXIgb2Ygc3VwcG9ydGVkIHNvY2tldHMgaXMgMS4KKyAg ICAvLworICAgIHJldHVybiAxOworICB9CisKKyAgcmV0dXJuIChzaXplb2YgKFBsYXRmb3JtSG9i LSZndDtDbHVzdGVyRW4pIC8gc2l6ZW9mIChQTEFURk9STV9DTFVTVEVSX0VOKSk7Cit9CisKKy8q KgorICBHZXQgdGhlIG51bWJlciBvZiBhY3RpdmUgc29ja2V0LgorCisgIEByZXR1cm4gICBVSU5U OCAgICAgIE51bWJlciBvZiBhY3RpdmUgc29ja2V0LgorCisqKi8KK1VJTlQ4CitFRklBUEkKK0dl dE51bWJlck9mQWN0aXZlU29ja2V0cyAoCisgIFZPSUQKKyAgKQoreworICBVSU5UOCAgICAgICAg ICAgICAgIE51bWJlck9mQWN0aXZlU29ja2V0cywgQ291bnQsIEluZGV4LCBJbmRleDE7CisgIFBM QVRGT1JNX0NMVVNURVJfRU4gKlNvY2tldDsKKyAgUExBVEZPUk1fSU5GT19IT0IgICAqUGxhdGZv cm1Ib2I7CisKKyAgUGxhdGZvcm1Ib2IgPSBHZXRQbGF0Zm9ybUhvYiAoKTsKKyAgaWYgKFBsYXRm b3JtSG9iID09IE5VTEwpIHsKKyAgICAvLworICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSBudW1iZXIg b2YgYWN0aXZlIHNvY2tldHMgaXMgMS4KKyAgICAvLworICAgIHJldHVybiAxOworICB9CisKKyAg TnVtYmVyT2ZBY3RpdmVTb2NrZXRzID0gMDsKKworICBmb3IgKEluZGV4ID0gMDsgSW5kZXggJmx0 OyBHZXROdW1iZXJPZlN1cHBvcnRlZFNvY2tldHMgKCk7IEluZGV4KyspIHsKKyAgICBTb2NrZXQg PSAmYW1wO1BsYXRmb3JtSG9iLSZndDtDbHVzdGVyRW5bSW5kZXhdOworICAgIENvdW50ID0gQVJS QVlfU0laRSAoU29ja2V0LSZndDtFbmFibGVNYXNrKTsKKyAgICBmb3IgKEluZGV4MSA9IDA7IElu ZGV4MSAmbHQ7IENvdW50OyBJbmRleDErKykgeworICAgICAgaWYgKFNvY2tldC0mZ3Q7RW5hYmxl TWFza1tJbmRleDFdICE9IDApIHsKKyAgICAgICAgTnVtYmVyT2ZBY3RpdmVTb2NrZXRzKys7Cisg ICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBOdW1iZXJPZkFj dGl2ZVNvY2tldHM7Cit9CisKKy8qKgorICBHZXQgdGhlIG51bWJlciBvZiBhY3RpdmUgQ1BNIHBl ciBzb2NrZXQuCisKKyAgQHBhcmFtICAgIFNvY2tldElkICAgIFNvY2tldCBpbmRleC4KKyAgQHJl dHVybiAgIFVJTlQxNiAgICAgIE51bWJlciBvZiBDUE0uCisKKyoqLworVUlOVDE2CitFRklBUEkK K0dldE51bWJlck9mQWN0aXZlQ1BNc1BlclNvY2tldCAoCisgIFVJTlQ4IFNvY2tldElkCisgICkK K3sKKyAgVUlOVDE2ICAgICAgICAgICAgICBOdW1iZXJPZkNQTXMsIENvdW50LCBJbmRleDsKKyAg VUlOVDMyICAgICAgICAgICAgICBWYWwzMjsKKyAgUExBVEZPUk1fQ0xVU1RFUl9FTiAqU29ja2V0 OworICBQTEFURk9STV9JTkZPX0hPQiAgICpQbGF0Zm9ybUhvYjsKKworICBQbGF0Zm9ybUhvYiA9 IEdldFBsYXRmb3JtSG9iICgpOworICBpZiAoUGxhdGZvcm1Ib2IgPT0gTlVMTCkgeworICAgIHJl dHVybiAwOworICB9CisKKyAgaWYgKFNvY2tldElkICZndDs9IEdldE51bWJlck9mQWN0aXZlU29j a2V0cyAoKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgTnVtYmVyT2ZDUE1zID0gMDsKKyAg U29ja2V0ID0gJmFtcDtQbGF0Zm9ybUhvYi0mZ3Q7Q2x1c3RlckVuW1NvY2tldElkXTsKKyAgQ291 bnQgPSBBUlJBWV9TSVpFIChTb2NrZXQtJmd0O0VuYWJsZU1hc2spOworICBmb3IgKEluZGV4ID0g MDsgSW5kZXggJmx0OyBDb3VudDsgSW5kZXgrKykgeworICAgIFZhbDMyID0gU29ja2V0LSZndDtF bmFibGVNYXNrW0luZGV4XTsKKyAgICB3aGlsZSAoVmFsMzIgJmd0OyAwKSB7CisgICAgICBpZiAo KFZhbDMyICZhbXA7IDB4MSkgIT0gMCkgeworICAgICAgICBOdW1iZXJPZkNQTXMrKzsKKyAgICAg IH0KKyAgICAgIFZhbDMyICZndDsmZ3Q7PSAxOworICAgIH0KKyAgfQorCisgIHJldHVybiBOdW1i ZXJPZkNQTXM7Cit9CisKKy8qKgorICBHZXQgdGhlIG51bWJlciBvZiBjb25maWd1cmVkIENQTSBw ZXIgc29ja2V0LiBUaGlzIG51bWJlcgorICBzaG91bGQgYmUgdGhlIHNhbWUgZm9yIGFsbCBzb2Nr ZXRzLgorCisgIEBwYXJhbSAgICBTb2NrZXRJZCAgICBTb2NrZXQgaW5kZXguCisgIEByZXR1cm4g ICBVSU5UOCAgICAgICBOdW1iZXIgb2YgY29uZmlndXJlZCBDUE0uCisKKyoqLworVUlOVDE2CitF RklBUEkKK0dldE51bWJlck9mQ29uZmlndXJlZENQTXMgKAorICBVSU5UOCBTb2NrZXRJZAorICAp Cit7CisgIEVGSV9TVEFUVVMgU3RhdHVzOworICBVSU5UMzIgICAgIFZhbHVlOworICBVSU5UMzIg ICAgIFBhcmFtLCBQYXJhbVN0YXJ0LCBQYXJhbUVuZDsKKyAgVUlOVDE2ICAgICBDb3VudDsKKwor ICBDb3VudCA9IDA7CisgIFBhcmFtU3RhcnQgPSBOVl9TSV9TMF9QQ1BfQUNUSVZFQ1BNXzBfMzEg KyBTb2NrZXRJZCAqIE5WX1BBUkFNX0VOVFJZU0laRSAqIChQTEFURk9STV9DUFVfTUFYX0NQTSAv IDMyKTsKKyAgUGFyYW1FbmQgPSBQYXJhbVN0YXJ0ICsgTlZfUEFSQU1fRU5UUllTSVpFICogKFBM QVRGT1JNX0NQVV9NQVhfQ1BNIC8gMzIpOworICBmb3IgKFBhcmFtID0gUGFyYW1TdGFydDsgUGFy YW0gJmx0OyBQYXJhbUVuZDsgUGFyYW0gKz0gTlZfUEFSQU1fRU5UUllTSVpFKSB7CisgICAgU3Rh dHVzID0gTlZQYXJhbUdldCAoCisgICAgICAgICAgICAgICBQYXJhbSwKKyAgICAgICAgICAgICAg IE5WX1BFUk1fQVRGIHwgTlZfUEVSTV9CSU9TIHwgTlZfUEVSTV9NQU5VIHwgTlZfUEVSTV9CTUMs CisgICAgICAgICAgICAgICAmYW1wO1ZhbHVlCisgICAgICAgICAgICAgICApOworICAgIGlmIChF RklfRVJST1IgKFN0YXR1cykpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB3aGlsZSAoVmFs dWUgIT0gMCkgeworICAgICAgaWYgKChWYWx1ZSAmYW1wOyAweDAxKSAhPSAwKSB7CisgICAgICAg IENvdW50Kys7CisgICAgICB9CisgICAgICBWYWx1ZSAmZ3Q7Jmd0Oz0gMTsKKyAgICB9CisgIH0K KworICByZXR1cm4gQ291bnQ7Cit9CisKKy8qKgorICBTZXQgdGhlIG51bWJlciBvZiBjb25maWd1 cmVkIENQTSBwZXIgc29ja2V0LgorCisgIEBwYXJhbSAgICBTb2NrZXRJZCAgICAgICAgU29ja2V0 IGluZGV4LgorICBAcGFyYW0gICAgTnVtYmVyT2ZDUE1zICAgIE51bWJlciBvZiBDUE0gdG8gYmUg Y29uZmlndXJlZC4KKyAgQHJldHVybiAgIEVGSV9TVUNDRVNTICAgICBPcGVyYXRpb24gc3VjY2Vl ZGVkLgorICBAcmV0dXJuICAgT3RoZXJzICAgICAgICAgIEFuIGVycm9yIGhhcyBvY2N1cnJlZC4K KworKiovCitFRklfU1RBVFVTCitFRklBUEkKK1NldE51bWJlck9mQ29uZmlndXJlZENQTXMgKAor ICBVSU5UOCAgU29ja2V0SWQsCisgIFVJTlQxNiBOdW1iZXJPZkNQTXMKKyAgKQoreworICBFRklf U1RBVFVTIFN0YXR1czsKKyAgVUlOVDMyICAgICBWYWx1ZTsKKyAgVUlOVDMyICAgICBQYXJhbSwg UGFyYW1TdGFydCwgUGFyYW1FbmQ7CisgIEJPT0xFQU4gICAgSXNDbGVhcjsKKworICBJc0NsZWFy ID0gRkFMU0U7CisgIGlmIChOdW1iZXJPZkNQTXMgPT0gMCkgeworICAgIElzQ2xlYXIgPSBUUlVF OworICB9CisKKyAgU3RhdHVzID0gRUZJX1NVQ0NFU1M7CisKKyAgUGFyYW1TdGFydCA9IE5WX1NJ X1MwX1BDUF9BQ1RJVkVDUE1fMF8zMSArIFNvY2tldElkICogTlZfUEFSQU1fRU5UUllTSVpFICog KFBMQVRGT1JNX0NQVV9NQVhfQ1BNIC8gMzIpOworICBQYXJhbUVuZCA9IFBhcmFtU3RhcnQgKyBO Vl9QQVJBTV9FTlRSWVNJWkUgKiAoUExBVEZPUk1fQ1BVX01BWF9DUE0gLyAzMik7CisgIGZvciAo UGFyYW0gPSBQYXJhbVN0YXJ0OyBQYXJhbSAmbHQ7IFBhcmFtRW5kOyBQYXJhbSArPSBOVl9QQVJB TV9FTlRSWVNJWkUpIHsKKyAgICBpZiAoTnVtYmVyT2ZDUE1zICZndDs9IDMyKSB7CisgICAgICBW YWx1ZSA9IDB4ZmZmZmZmZmY7CisgICAgICBOdW1iZXJPZkNQTXMgLT0gMzI7CisgICAgfSBlbHNl IHsKKyAgICAgIFZhbHVlID0gMDsKKyAgICAgIHdoaWxlIChOdW1iZXJPZkNQTXMgJmd0OyAwKSB7 CisgICAgICAgIFZhbHVlIHw9ICgxICZsdDsmbHQ7ICgtLU51bWJlck9mQ1BNcykpOworICAgICAg fQorICAgIH0KKyAgICBpZiAoSXNDbGVhcikgeworICAgICAgLyogQ2xlYXIgdGhpcyBwYXJhbSAq LworICAgICAgU3RhdHVzID0gTlZQYXJhbUNsciAoCisgICAgICAgICAgICAgICAgIFBhcmFtLAor ICAgICAgICAgICAgICAgICBOVl9QRVJNX0JJT1MgfCBOVl9QRVJNX01BTlUKKyAgICAgICAgICAg ICAgICAgKTsKKyAgICB9IGVsc2UgeworICAgICAgU3RhdHVzID0gTlZQYXJhbVNldCAoCisgICAg ICAgICAgICAgICAgIFBhcmFtLAorICAgICAgICAgICAgICAgICBOVl9QRVJNX0FURiB8IE5WX1BF Uk1fQklPUyB8IE5WX1BFUk1fTUFOVSB8IE5WX1BFUk1fQk1DLAorICAgICAgICAgICAgICAgICBO Vl9QRVJNX0JJT1MgfCBOVl9QRVJNX01BTlUsCisgICAgICAgICAgICAgICAgIFZhbHVlCisgICAg ICAgICAgICAgICAgICk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFN0YXR1czsKK30KKworLyoq CisgIEdldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29yZSBwZXIgc29ja2V0LgorCisgIEByZXR1 cm4gICBVSU5UMTYgICAgICBNYXhpbXVtIG51bWJlciBvZiBjb3JlLgorCisqKi8KK1VJTlQxNgor RUZJQVBJCitHZXRNYXhpbXVtTnVtYmVyT2ZDb3JlcyAoCisgIFZPSUQKKyAgKQoreworICBQTEFU Rk9STV9JTkZPX0hPQiAgKlBsYXRmb3JtSG9iOworCisgIFBsYXRmb3JtSG9iID0gR2V0UGxhdGZv cm1Ib2IgKCk7CisgIGlmIChQbGF0Zm9ybUhvYiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7Cisg IH0KKworICByZXR1cm4gUGxhdGZvcm1Ib2ItJmd0O01heE51bU9mQ29yZVswXTsKK30KKworLyoq CisgIEdldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgQ1BNIHBlciBzb2NrZXQuIFRoaXMgbnVtYmVy CisgIHNob3VsZCBiZSB0aGUgc2FtZSBmb3IgYWxsIHNvY2tldHMuCisKKyAgQHJldHVybiAgIFVJ TlQxNiAgICAgIE1heGltdW0gbnVtYmVyIG9mIENQTS4KKworKiovCitVSU5UMTYKK0VGSUFQSQor R2V0TWF4aW11bU51bWJlck9mQ1BNcyAoCisgIFZPSUQKKyAgKQoreworICByZXR1cm4gR2V0TWF4 aW11bU51bWJlck9mQ29yZXMgKCkgLyBQTEFURk9STV9DUFVfTlVNX0NPUkVTX1BFUl9DUE07Cit9 CisKKy8qKgorICBHZXQgdGhlIG51bWJlciBvZiBhY3RpdmUgY29yZXMgb2YgYSBzb2NrZXRzLgor CisgIEBwYXJhbSAgICBTb2NrZXRJZCAgICBTb2NrZXQgSW5kZXguCisgIEByZXR1cm4gICBVSU5U MTYgICAgICBOdW1iZXIgb2YgYWN0aXZlIGNvcmUuCisKKyoqLworVUlOVDE2CitFRklBUEkKK0dl dE51bWJlck9mQWN0aXZlQ29yZXNQZXJTb2NrZXQgKAorICBVSU5UOCBTb2NrZXRJZAorICApCit7 CisgIHJldHVybiBHZXROdW1iZXJPZkFjdGl2ZUNQTXNQZXJTb2NrZXQgKFNvY2tldElkKSAqIFBM QVRGT1JNX0NQVV9OVU1fQ09SRVNfUEVSX0NQTTsKK30KKworLyoqCisgIEdldCB0aGUgbnVtYmVy IG9mIGFjdGl2ZSBjb3JlcyBvZiBhbGwgc29ja2V0cy4KKworICBAcmV0dXJuICAgVUlOVDE2ICAg ICAgTnVtYmVyIG9mIGFjdGl2ZSBjb3JlLgorCisqKi8KK1VJTlQxNgorRUZJQVBJCitHZXROdW1i ZXJPZkFjdGl2ZUNvcmVzICgKKyAgVk9JRAorICApCit7CisgIFVJTlQxNiBOdW1iZXJPZkFjdGl2 ZUNvcmVzOworICBVSU5UOCAgSW5kZXg7CisKKyAgTnVtYmVyT2ZBY3RpdmVDb3JlcyA9IDA7CisK KyAgZm9yIChJbmRleCA9IDA7IEluZGV4ICZsdDsgR2V0TnVtYmVyT2ZBY3RpdmVTb2NrZXRzICgp OyBJbmRleCsrKSB7CisgICAgTnVtYmVyT2ZBY3RpdmVDb3JlcyArPSBHZXROdW1iZXJPZkFjdGl2 ZUNvcmVzUGVyU29ja2V0IChJbmRleCk7CisgIH0KKworICByZXR1cm4gTnVtYmVyT2ZBY3RpdmVD b3JlczsKK30KKworLyoqCisgIENoZWNrIGlmIHRoZSBsb2dpY2FsIENQVSBpcyBlbmFibGVkIG9y IG5vdC4KKworICBAcGFyYW0gICAgQ3B1SWQgICAgICAgVGhlIGxvZ2ljYWwgQ3B1IElELiBTdGFy dGVkIGZyb20gMC4KKyAgQHJldHVybiAgIEJPT0xFQU4gICAgIFRSVUUgaWYgdGhlIENwdSBlbmFi bGVkCisgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBpZiB0aGUgQ3B1IGRpc2FibGVkLgor CisqKi8KK0JPT0xFQU4KK0VGSUFQSQorSXNDcHVFbmFibGVkICgKKyAgVUlOVDE2IENwdUlkCisg ICkKK3sKKyAgUExBVEZPUk1fQ0xVU1RFUl9FTiAqU29ja2V0OworICBQTEFURk9STV9JTkZPX0hP QiAgICpQbGF0Zm9ybUhvYjsKKyAgVUlOVDggICAgICAgICAgICAgICBTb2NrZXRJZDsKKyAgVUlO VDE2ICAgICAgICAgICAgICBDbHVzdGVySWQ7CisKKyAgU29ja2V0SWQgPSBTT0NLRVRfSUQgKENw dUlkKTsKKyAgQ2x1c3RlcklkID0gQ0xVU1RFUl9JRCAoQ3B1SWQpOworCisgIFBsYXRmb3JtSG9i ID0gR2V0UGxhdGZvcm1Ib2IgKCk7CisgIGlmIChQbGF0Zm9ybUhvYiA9PSBOVUxMKSB7CisgICAg cmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKFNvY2tldElkICZndDs9IEdldE51bWJlck9mQWN0 aXZlU29ja2V0cyAoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIFNvY2tldCA9ICZh bXA7UGxhdGZvcm1Ib2ItJmd0O0NsdXN0ZXJFbltTb2NrZXRJZF07CisgIGlmICgoU29ja2V0LSZn dDtFbmFibGVNYXNrW0NsdXN0ZXJJZCAvIDMyXSAmYW1wOyAoMSAmbHQ7Jmx0OyAoQ2x1c3Rlcklk ICUgMzIpKSkgIT0gMCkgeworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIEZBTFNF OworfQorCisvKioKKyAgQ2hlY2sgaWYgdGhlIHNsYXZlIHNvY2tldCBpcyBwcmVzZW50CisKKyAg QHJldHVybiAgIEJPT0xFQU4gICAgIFRSVUUgaWYgdGhlIFNsYXZlIENwdSBpcyBwcmVzZW50Cisg ICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBpZiB0aGUgU2xhdmUgQ3B1IGlzIG5vdCBwcmVz ZW50CisKKyoqLworQk9PTEVBTgorRUZJQVBJCitJc1NsYXZlU29ja2V0UHJlc2VudCAoCisgIFZP SUQKKyAgKQoreworICBVSU5UMzIgVmFsdWU7CisKKyAgVmFsdWUgPSBNbWlvUmVhZDMyIChTTVBS T19FRlVTRV9TSEFET1cwICsgQ0ZHMlBfT0ZGU0VUKTsKKworICByZXR1cm4gKChWYWx1ZSAmYW1w OyBTTEFWRV9QUkVTRU5UX04pICE9IDApID8gRkFMU0UgOiBUUlVFOworfQorCisvKioKKyAgQ2hl Y2sgaWYgdGhlIHNsYXZlIHNvY2tldCBpcyBhY3RpdmUKKworICBAcmV0dXJuICAgQk9PTEVBTiAg ICAgVFJVRSBpZiB0aGUgU2xhdmUgQ1BVIFNvY2tldCBpcyBhY3RpdmUuCisgICAgICAgICAgICAg ICAgICAgICAgICBGQUxTRSBpZiB0aGUgU2xhdmUgQ1BVIFNvY2tldCBpcyBub3QgYWN0aXZlLgor CisqKi8KK0JPT0xFQU4KK0VGSUFQSQorSXNTbGF2ZVNvY2tldEFjdGl2ZSAoCisgIFZPSUQKKyAg KQoreworICByZXR1cm4gKEdldE51bWJlck9mQWN0aXZlU29ja2V0cyAoKSAmZ3Q7IDEpID8gVFJV RSA6IEZBTFNFOworfQorCisvKioKKyAgQ2hlY2sgaWYgdGhlIENQVSBwcm9kdWN0IElEIGlzIEFj MDEKKyAgQHJldHVybiAgIEJPT0xFQU4gICAgIFRSVUUgaWYgdGhlIFByb2R1Y3QgSUQgaXMgQWMw MQorICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0Ugb3RoZXJ3aXNlLgorCisqKi8KK0JPT0xF QU4KK0VGSUFQSQorSXNBYzAxUHJvY2Vzc29yICgKKyAgVk9JRAorICApCit7CisgIFBMQVRGT1JN X0lORk9fSE9CICAqUGxhdGZvcm1Ib2I7CisKKyAgUGxhdGZvcm1Ib2IgPSBHZXRQbGF0Zm9ybUhv YiAoKTsKKyAgQVNTRVJUIChQbGF0Zm9ybUhvYiAhPSBOVUxMKTsKKworICBpZiAoUGxhdGZvcm1I b2IgIT0gTlVMTCkgeworICAgIGlmICgoUGxhdGZvcm1Ib2ItJmd0O1NjdVByb2R1Y3RJZFswXSAm YW1wOyAweEZGKSA9PSAweDAxKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKwor ICByZXR1cm4gRkFMU0U7Cit9CjwvcHJlPgogICAgICA8L2Jsb2NrcXVvdGU+CiAgICAgIDxwcmUg Y2xhc3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+CgoKPC9wcmU+CiAgICAgIDxibG9ja3F1b3Rl IHR5cGU9ImNpdGUiPgogICAgICAgIDxwcmUgY2xhc3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+ ZGlmZiAtLWdpdCBhL1NpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0xpYnJhcnkvQXJtUGxh dGZvcm1MaWIvQXJtUGxhdGZvcm1MaWIuYyBiL1NpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtn L0xpYnJhcnkvQXJtUGxhdGZvcm1MaWIvQXJtUGxhdGZvcm1MaWIuYwpuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjhjMWViOTNmMDBmZAotLS0gL2Rldi9udWxsCisrKyBi L1NpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0xpYnJhcnkvQXJtUGxhdGZvcm1MaWIvQXJt UGxhdGZvcm1MaWIuYwpAQCAtMCwwICsxLDE2OSBAQAorLyoqIEBmaWxlCisKKyAgQ29weXJpZ2h0 IChjKSAyMDIwIC0gMjAyMSwgQW1wZXJlIENvbXB1dGluZyBMTEMuIEFsbCByaWdodHMgcmVzZXJ2 ZWQuJmx0O0JSJmd0OworCisgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMi1DbGF1c2Ut UGF0ZW50CisKKyoqLworCisjaW5jbHVkZSAmbHQ7VWVmaS5oJmd0OworCisjaW5jbHVkZSAmbHQ7 R3VpZC9QbGF0Zm9ybUluZm9Ib2JHdWlkLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7TGlicmFyeS9BbXBl cmVDcHVMaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJyYXJ5L0FybUxpYi5oJmd0OworI2luY2x1 ZGUgJmx0O0xpYnJhcnkvQXJtUGxhdGZvcm1MaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJyYXJ5 L0Jhc2VNZW1vcnlMaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJyYXJ5L0RlYnVnTGliLmgmZ3Q7 CisjaW5jbHVkZSAmbHQ7TGlicmFyeS9Ib2JMaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJyYXJ5 L0lvTGliLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7TGlicmFyeS9NZW1vcnlBbGxvY2F0aW9uTGliLmgm Z3Q7CisjaW5jbHVkZSAmbHQ7TGlicmFyeS9QY2RMaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJy YXJ5L1BMMDExVWFydExpYi5oJmd0OworI2luY2x1ZGUgJmx0O0xpYnJhcnkvU2VyaWFsUG9ydExp Yi5oJmd0OworI2luY2x1ZGUgJmx0O1BsYXRmb3JtL0FjMDEuaCZndDsKKyNpbmNsdWRlICZsdDtQ bGF0Zm9ybUluZm9Ib2IuaCZndDsKKyNpbmNsdWRlICZsdDtQcGkvQXJtTXBDb3JlSW5mby5oJmd0 OworI2luY2x1ZGUgJmx0O1BwaS9UZW1wb3JhcnlSYW1TdXBwb3J0LmgmZ3Q7CisKK0FSTV9DT1JF X0lORk8gbUFybVBsYXRmb3JtTXBDb3JlSW5mb1RhYmxlW1BMQVRGT1JNX0NQVV9NQVhfTlVNX0NP UkVTXTsKKworLyoqCisgIFJldHVybiB0aGUgY3VycmVudCBCb290IE1vZGUKKworICBUaGlzIGZ1 bmN0aW9uIHJldHVybnMgdGhlIGJvb3QgcmVhc29uIG9uIHRoZSBwbGF0Zm9ybQorCisgIEByZXR1 cm4gICBSZXR1cm4gdGhlIGN1cnJlbnQgQm9vdCBNb2RlIG9mIHRoZSBwbGF0Zm9ybQorCisqKi8K K0VGSV9CT09UX01PREUKK0FybVBsYXRmb3JtR2V0Qm9vdE1vZGUgKAorICBWT0lECisgICkKK3sK KyAgcmV0dXJuIEJPT1RfV0lUSF9GVUxMX0NPTkZJR1VSQVRJT047Cit9CisKKy8qKgorICBJbml0 aWFsaXplIGNvbnRyb2xsZXJzIHRoYXQgbXVzdCBzZXR1cCBpbiB0aGUgbm9ybWFsIHdvcmxkCisK KyAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEFybVBsYXRmb3JtUGtnL1ByZVBpIG9y IEFybVBsYXRmb3JtUGtnL1BsYXRmb3JtUGVpCisgIGluIHRoZSBQRUkgcGhhc2UuCisKKyoqLwor RUZJX1NUQVRVUworQXJtUGxhdGZvcm1Jbml0aWFsaXplICgKKyAgSU4gVUlOVE4gTXBJZAorICAp Cit7CisgIFJFVFVSTl9TVEFUVVMgICAgICBTdGF0dXM7CisgIFVJTlQ2NCAgICAgICAgICAgICBC YXVkUmF0ZTsKKyAgVUlOVDMyICAgICAgICAgICAgIFJlY2VpdmVGaWZvRGVwdGg7CisgIEVGSV9Q QVJJVFlfVFlQRSAgICBQYXJpdHk7CisgIFVJTlQ4ICAgICAgICAgICAgICBEYXRhQml0czsKKyAg RUZJX1NUT1BfQklUU19UWVBFIFN0b3BCaXRzOworCisgIFN0YXR1cyA9IEVGSV9TVUNDRVNTOwor CisgIGlmIChGaXhlZFBjZEdldDY0IChQY2RTZXJpYWxSZWdpc3RlckJhc2UpICE9IDApIHsKKyAg ICAvKiBEZWJ1ZyBwb3J0IHNob3VsZCB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyB3aXRoIGNvbnNv bGUgKi8KKyAgICBCYXVkUmF0ZSA9IEZpeGVkUGNkR2V0NjQgKFBjZFVhcnREZWZhdWx0QmF1ZFJh dGUpOworICAgIFJlY2VpdmVGaWZvRGVwdGggPSBGaXhlZFBjZEdldDMyIChQY2RVYXJ0RGVmYXVs dFJlY2VpdmVGaWZvRGVwdGgpOworICAgIFBhcml0eSA9IChFRklfUEFSSVRZX1RZUEUpRml4ZWRQ Y2RHZXQ4IChQY2RVYXJ0RGVmYXVsdFBhcml0eSk7CisgICAgRGF0YUJpdHMgPSBGaXhlZFBjZEdl dDggKFBjZFVhcnREZWZhdWx0RGF0YUJpdHMpOworICAgIFN0b3BCaXRzID0gKEVGSV9TVE9QX0JJ VFNfVFlQRSlGaXhlZFBjZEdldDggKFBjZFVhcnREZWZhdWx0U3RvcEJpdHMpOworCisgICAgLyog SW5pdGlhbGl6ZSB1YXJ0IGRlYnVnIHBvcnQgKi8KKyAgICBTdGF0dXMgPSBQTDAxMVVhcnRJbml0 aWFsaXplUG9ydCAoCisgICAgICAgICAgICAgICAoVUlOVE4pRml4ZWRQY2RHZXQ2NCAoUGNkU2Vy aWFsUmVnaXN0ZXJCYXNlKSwKKyAgICAgICAgICAgICAgIEZpeGVkUGNkR2V0MzIgKFBMMDExVWFy dENsa0luSHopLAorICAgICAgICAgICAgICAgJmFtcDtCYXVkUmF0ZSwKKyAgICAgICAgICAgICAg ICZhbXA7UmVjZWl2ZUZpZm9EZXB0aCwKKyAgICAgICAgICAgICAgICZhbXA7UGFyaXR5LAorICAg ICAgICAgICAgICAgJmFtcDtEYXRhQml0cywKKyAgICAgICAgICAgICAgICZhbXA7U3RvcEJpdHMK KyAgICAgICAgICAgICAgICk7CisgIH0KKworICByZXR1cm4gU3RhdHVzOworfQorCitFRklfU1RB VFVTCitQcmVQZWlDb3JlR2V0TXBDb3JlSW5mbyAoCisgIE9VVCBVSU5UTiAgICAgICAgICpDb3Jl Q291bnQsCisgIE9VVCBBUk1fQ09SRV9JTkZPICoqQXJtQ29yZVRhYmxlCisgICkKK3sKKyAgVUlO VE4gICAgICAgICAgICAgIG1Bcm1QbGF0Zm9ybUNvcmVDb3VudDsKKyAgVUlOVE4gICAgICAgICAg ICAgIENsdXN0ZXJJZDsKKyAgVUlOVE4gICAgICAgICAgICAgIFNvY2tldElkOworICBVSU5UTiAg ICAgICAgICAgICAgSW5kZXg7CisKKyAgQVNTRVJUIChDb3JlQ291bnQgIT0gTlVMTCk7CisgIEFT U0VSVCAoQXJtQ29yZVRhYmxlICE9IE5VTEwpOworICBBU1NFUlQgKCpBcm1Db3JlVGFibGUgIT0g TlVMTCk7CisKKyAgbUFybVBsYXRmb3JtQ29yZUNvdW50ID0gMDsKKyAgZm9yICAoSW5kZXggPSAw OyBJbmRleCAmbHQ7IFBMQVRGT1JNX0NQVV9NQVhfTlVNX0NPUkVTOyBJbmRleCsrKSB7CisgICAg aWYgKCFJc0NwdUVuYWJsZWQgKEluZGV4KSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAg IFNvY2tldElkID0gU09DS0VUX0lEIChJbmRleCk7CisgICAgQ2x1c3RlcklkID0gQ0xVU1RFUl9J RCAoSW5kZXgpOworICAgIG1Bcm1QbGF0Zm9ybU1wQ29yZUluZm9UYWJsZVttQXJtUGxhdGZvcm1D b3JlQ291bnRdLkNsdXN0ZXJJZCA9IFNvY2tldElkOworICAgIG1Bcm1QbGF0Zm9ybU1wQ29yZUlu Zm9UYWJsZVttQXJtUGxhdGZvcm1Db3JlQ291bnRdLkNvcmVJZCA9CisgICAgICAoQ2x1c3Rlcklk ICZsdDsmbHQ7IDgpIHwgKEluZGV4ICUgUExBVEZPUk1fQ1BVX05VTV9DT1JFU19QRVJfQ1BNKTsK KyAgICBtQXJtUGxhdGZvcm1NcENvcmVJbmZvVGFibGVbbUFybVBsYXRmb3JtQ29yZUNvdW50XS5N YWlsYm94Q2xlYXJBZGRyZXNzID0gMDsKKyAgICBtQXJtUGxhdGZvcm1NcENvcmVJbmZvVGFibGVb bUFybVBsYXRmb3JtQ29yZUNvdW50XS5NYWlsYm94Q2xlYXJWYWx1ZSA9IDA7CisgICAgbUFybVBs YXRmb3JtTXBDb3JlSW5mb1RhYmxlW21Bcm1QbGF0Zm9ybUNvcmVDb3VudF0uTWFpbGJveEdldEFk ZHJlc3MgPSAwOworICAgIG1Bcm1QbGF0Zm9ybU1wQ29yZUluZm9UYWJsZVttQXJtUGxhdGZvcm1D b3JlQ291bnRdLk1haWxib3hTZXRBZGRyZXNzID0gMDsKKyAgICBtQXJtUGxhdGZvcm1Db3JlQ291 bnQrKzsKKyAgfQorCisgICpDb3JlQ291bnQgPSBtQXJtUGxhdGZvcm1Db3JlQ291bnQ7CisKKyAg KkFybUNvcmVUYWJsZSA9IG1Bcm1QbGF0Zm9ybU1wQ29yZUluZm9UYWJsZTsKKyAgQVNTRVJUICgq QXJtQ29yZVRhYmxlICE9IE5VTEwpOworCisgIHJldHVybiBFRklfU1VDQ0VTUzsKK30KKworLy8g TmVlZHMgdG8gYmUgZGVjbGFyZWQgaW4gdGhlIGZpbGUuIE90aGVyd2lzZSBnQXJtTXBDb3JlSW5m b1BwaUd1aWQgaXMgdW5kZWZpbmVkIGluIHRoZSBjb250ZWN0IG9mIFByZVBlaUNvcmUKK0VGSV9H VUlEICAgICAgICAgICAgIG1Bcm1NcENvcmVJbmZvUHBpR3VpZCA9IEFSTV9NUF9DT1JFX0lORk9f UFBJX0dVSUQ7CitBUk1fTVBfQ09SRV9JTkZPX1BQSSBtTXBDb3JlSW5mb1BwaSA9IHsgUHJlUGVp Q29yZUdldE1wQ29yZUluZm8gfTsKKworRUZJX1BFSV9QUElfREVTQ1JJUFRPUiBnUGxhdGZvcm1Q cGlUYWJsZVtdID0geworICB7CisgICAgRUZJX1BFSV9QUElfREVTQ1JJUFRPUl9QUEksCisgICAg JmFtcDttQXJtTXBDb3JlSW5mb1BwaUd1aWQsCisgICAgJmFtcDttTXBDb3JlSW5mb1BwaQorICB9 LAorfTsKKworLyoqCisgIFJldHVybiB0aGUgUGxhdGZvcm0gc3BlY2lmaWMgUFBJcworCisgIFRo aXMgZnVuY3Rpb24gZXhwb3NlcyB0aGUgUGxhdGZvcm0gU3BlY2lmaWMgUFBJcy4gVGhleSBjYW4g YmUgdXNlZCBieSBhbnkgUHJlUGkgbW9kdWxlcyBvciBwYXNzZWQKKyAgdG8gdGhlIFBlaUNvcmUg YnkgUHJlUGVpQ29yZS4KKworICBAcGFyYW1bb3V0XSAgIFBwaUxpc3RTaXplICAgICAgICAgU2l6 ZSBpbiBCeXRlcyBvZiB0aGUgUGxhdGZvcm0gUFBJIExpc3QKKyAgQHBhcmFtW291dF0gICBQcGlM aXN0ICAgICAgICAgICAgIFBsYXRmb3JtIFBQSSBMaXN0CisKKyoqLworVk9JRAorQXJtUGxhdGZv cm1HZXRQbGF0Zm9ybVBwaUxpc3QgKAorICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAqUHBp TGlzdFNpemUsCisgIE9VVCBFRklfUEVJX1BQSV9ERVNDUklQVE9SICoqUHBpTGlzdAorICApCit7 CisgIEFTU0VSVCAoUHBpTGlzdFNpemUgIT0gTlVMTCk7CisgIEFTU0VSVCAoUHBpTGlzdCAhPSBO VUxMKTsKKyAgQVNTRVJUICgqUHBpTGlzdCAhPSBOVUxMKTsKKworICBpZiAoQXJtSXNNcENvcmUg KCkpIHsKKyAgICAqUHBpTGlzdFNpemUgPSBzaXplb2YgKGdQbGF0Zm9ybVBwaVRhYmxlKTsKKyAg ICAqUHBpTGlzdCA9IGdQbGF0Zm9ybVBwaVRhYmxlOworICB9IGVsc2UgeworICAgICpQcGlMaXN0 U2l6ZSA9IDA7CisgICAgKlBwaUxpc3QgPSBOVUxMOworICB9Cit9CmRpZmYgLS1naXQgYS9TaWxp Y29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5L0FybVBsYXRmb3JtTGliL0FybVBsYXRm b3JtTGliTWVtb3J5LmMgYi9TaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5L0Fy bVBsYXRmb3JtTGliL0FybVBsYXRmb3JtTGliTWVtb3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAwMDAwLi4xMTdjOWNjNTZhYzIKLS0tIC9kZXYvbnVsbAorKysgYi9TaWxp Y29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5L0FybVBsYXRmb3JtTGliL0FybVBsYXRm b3JtTGliTWVtb3J5LmMKQEAgLTAsMCArMSwzOTkgQEAKKy8qKiBAZmlsZQorCisgIENvcHlyaWdo dCAoYykgMjAyMCAtIDIwMjEsIEFtcGVyZSBDb21wdXRpbmcgTExDLiBBbGwgcmlnaHRzIHJlc2Vy dmVkLiZsdDtCUiZndDsKKworICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTItQ2xhdXNl LVBhdGVudAorCisqKi8KKworI2luY2x1ZGUgJmx0O1VlZmkuaCZndDsKKworI2luY2x1ZGUgJmx0 O0d1aWQvUGxhdGZvcm1JbmZvSG9iR3VpZC5oJmd0OworI2luY2x1ZGUgJmx0O0xpYnJhcnkvQW1w ZXJlQ3B1TGliLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7TGlicmFyeS9Bcm1QbGF0Zm9ybUxpYi5oJmd0 OworI2luY2x1ZGUgJmx0O0xpYnJhcnkvRGVidWdMaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJy YXJ5L0hvYkxpYi5oJmd0OworI2luY2x1ZGUgJmx0O0xpYnJhcnkvTWVtb3J5QWxsb2NhdGlvbkxp Yi5oJmd0OworI2luY2x1ZGUgJmx0O0xpYnJhcnkvUGNkTGliLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7 UGxhdGZvcm1JbmZvSG9iLmgmZ3Q7CisKKy8qIE51bWJlciBvZiBWaXJ0dWFsIE1lbW9yeSBNYXAg RGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgTUFYX1ZJUlRVQUxfTUVNT1JZX01BUF9ERVNDUklQVE9S UyAgICAgICAgICA1MAorCisvKiBERFIgYXR0cmlidXRlcyAqLworI2RlZmluZSBERFJfQVRUUklC VVRFU19DQUNIRUQgICAgICAgICAgIEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVURV9XUklURV9C QUNLCisjZGVmaW5lIEREUl9BVFRSSUJVVEVTX1VOQ0FDSEVEICAgICAgICAgQVJNX01FTU9SWV9S RUdJT05fQVRUUklCVVRFX1VOQ0FDSEVEX1VOQlVGRkVSRUQKKworLyoqCisgIFJldHVybiB0aGUg VmlydHVhbCBNZW1vcnkgTWFwIG9mIHlvdXIgcGxhdGZvcm0KKworICBUaGlzIFZpcnR1YWwgTWVt b3J5IE1hcCBpcyB1c2VkIGJ5IE1lbW9yeUluaXRQZWkgTW9kdWxlIHRvIGluaXRpYWxpemUgdGhl IE1NVSBvbiB5b3VyIHBsYXRmb3JtLgorCisgIEBwYXJhbVtvdXRdICAgVmlydHVhbE1lbW9yeU1h cCAgICBBcnJheSBvZiBBUk1fTUVNT1JZX1JFR0lPTl9ERVNDUklQVE9SIGRlc2NyaWJpbmcgYSBQ aHlzaWNhbC10by0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpcnR1YWwg TWVtb3J5IG1hcHBpbmcuIFRoaXMgYXJyYXkgbXVzdCBiZSBlbmRlZCBieSBhIHplcm8tZmlsbGVk CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeQorCisqKi8KK1ZPSUQK K0FybVBsYXRmb3JtR2V0VmlydHVhbE1lbW9yeU1hcCAoCisgIE9VVCBBUk1fTUVNT1JZX1JFR0lP Tl9ERVNDUklQVE9SICoqVmlydHVhbE1lbW9yeU1hcAorICApCit7CisgIFVJTlROICAgICAgICAg ICAgICAgICAgICAgICAgSW5kZXggPSAwOworICBBUk1fTUVNT1JZX1JFR0lPTl9ERVNDUklQVE9S ICpWaXJ0dWFsTWVtb3J5VGFibGU7CisgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgTnVt UmVnaW9uOworICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50OworICBWT0lEICAg ICAgICAgICAgICAgICAgICAgICAgICpIb2I7CisgIFBMQVRGT1JNX0lORk9fSE9CICAgICAgICAg ICAgKlBsYXRmb3JtSG9iOworCisgIEhvYiA9IEdldEZpcnN0R3VpZEhvYiAoJmFtcDtnUGxhdGZv cm1Ib2JHdWlkKTsKKyAgQVNTRVJUIChIb2IgIT0gTlVMTCk7CisgIGlmIChIb2IgPT0gTlVMTCkg eworICAgIHJldHVybjsKKyAgfQorCisgIFBsYXRmb3JtSG9iID0gKFBMQVRGT1JNX0lORk9fSE9C ICopR0VUX0dVSURfSE9CX0RBVEEgKEhvYik7CisKKyAgQVNTRVJUIChWaXJ0dWFsTWVtb3J5TWFw ICE9IE5VTEwpOworCisgIFZpcnR1YWxNZW1vcnlUYWJsZSA9IChBUk1fTUVNT1JZX1JFR0lPTl9E RVNDUklQVE9SICopQWxsb2NhdGVQYWdlcyAoRUZJX1NJWkVfVE9fUEFHRVMgKHNpemVvZiAoQVJN X01FTU9SWV9SRUdJT05fREVTQ1JJUFRPUikgKiBNQVhfVklSVFVBTF9NRU1PUllfTUFQX0RFU0NS SVBUT1JTKSk7CisgIGlmIChWaXJ0dWFsTWVtb3J5VGFibGUgPT0gTlVMTCkgeworICAgIHJldHVy bjsKKyAgfQorCisgIC8qIEZvciBBZGRyZXNzIHNwYWNlIDB4MTAwMF8wMDAwXzAwMDAgdG8gMHgx MDAxXzAwRkZfRkZGRgorICAgKiAgLSBEZXZpY2UgbWVtb3J5CisgICAqLworICBWaXJ0dWFsTWVt b3J5VGFibGVbSW5kZXhdLlBoeXNpY2FsQmFzZSA9IDB4MTAwMDAwMDAwMDAwVUxMOworICBWaXJ0 dWFsTWVtb3J5VGFibGVbSW5kZXhdLlZpcnR1YWxCYXNlICA9IDB4MTAwMDAwMDAwMDAwVUxMOwor ICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkxlbmd0aCAgICAgICA9IDB4MTAyMDAwMDAwVUxM Owo8L3ByZT4KICAgICAgPC9ibG9ja3F1b3RlPgogICAgICA8cHJlIGNsYXNzPSJtb3otcXVvdGUt cHJlIiB3cmFwPSIiPgpQbGVhc2UgbW92ZSBhbGwgb2YgdGhlc2UgbGl2ZS1jb2RlZCBhZGRyZXNz ZXMvc2l6ZXMgdG8gYSBwcml2YXRlIC5oCmFuZCB1c2Ugc3ltYm9saWMgbmFtZXMgaGVyZS4KCjwv cHJlPgogICAgICA8YmxvY2txdW90ZSB0eXBlPSJjaXRlIj4KICAgICAgICA8cHJlIGNsYXNzPSJt b3otcXVvdGUtcHJlIiB3cmFwPSIiPisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uQXR0cmli dXRlcyAgID0gQVJNX01FTU9SWV9SRUdJT05fQVRUUklCVVRFX0RFVklDRTsKKworICAvKiBGb3Ig QWRkcmVzcyBzcGFjZSAweDUwMDBfMDAwMF8wMDAwIHRvIDB4NTAwMV8wMEZGX0ZGRkYKKyAgICog IC0gRGV2aWNlIG1lbW9yeQorICAgKi8KKyAgaWYgKElzU2xhdmVTb2NrZXRBY3RpdmUgKCkpCisg IHsKKyAgICBWaXJ0dWFsTWVtb3J5VGFibGVbKytJbmRleF0uUGh5c2ljYWxCYXNlID0gMHg1MDAw MDAwMDAwMDBVTEw7CisgICAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5WaXJ0dWFsQmFzZSAg PSAweDUwMDAwMDAwMDAwMFVMTDsKKyAgICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkxlbmd0 aCAgICAgICA9IDB4MTAxMDAwMDAwVUxMOworICAgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0u QXR0cmlidXRlcyAgID0gQVJNX01FTU9SWV9SRUdJT05fQVRUUklCVVRFX0RFVklDRTsKKyAgfQor CisgIC8qCisgICAqICAtIFBDSWUgUkNBMCBEZXZpY2UgbWVtb3J5CisgICAqLworICBWaXJ0dWFs TWVtb3J5VGFibGVbKytJbmRleF0uUGh5c2ljYWxCYXNlID0gMHgzMDAwMDAwMDAwMDBVTEw7Cisg IFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMHgzMDAwMDAwMDAwMDBV TEw7CisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uTGVuZ3RoICAgICAgID0gMHg0MDAwMDAw MDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5BdHRyaWJ1dGVzICAgPSBBUk1f TUVNT1JZX1JFR0lPTl9BVFRSSUJVVEVfREVWSUNFOworCisgIC8qCisgICAqICAtIDJQL1BDSWUg U29ja2V0MCBSQ0EwIDMyLWJpdCBEZXZpY2UgbWVtb3J5CisgICAqICAtIDFQL1BDSWUgY29uc29s aWRhdGVkIHRvIFJDQjIgMzItYml0IERldmljZSBtZW1vcnkKKyAgICovCisgIFZpcnR1YWxNZW1v cnlUYWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSAweDIwMDAwMDAwVUxMOworICBWaXJ0dWFs TWVtb3J5VGFibGVbSW5kZXhdLlZpcnR1YWxCYXNlICA9IDB4MjAwMDAwMDBVTEw7CisgIFZpcnR1 YWxNZW1vcnlUYWJsZVtJbmRleF0uTGVuZ3RoICAgICAgID0gMHg4MDAwMDAwVUxMOworICBWaXJ0 dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0dHJpYnV0ZXMgICA9IEFSTV9NRU1PUllfUkVHSU9OX0FU VFJJQlVURV9ERVZJQ0U7CisKKyAgLyoKKyAgICogIC0gUENJZSBSQ0ExIERldmljZSBtZW1vcnkK KyAgICovCisgIFZpcnR1YWxNZW1vcnlUYWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSAweDM0 MDAwMDAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5WaXJ0dWFsQmFzZSAg PSAweDM0MDAwMDAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGgg ICAgICAgPSAweDQwMDAwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0 dHJpYnV0ZXMgICA9IEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJQ0U7CisKKyAgLyoK KyAgICogIC0gMlAvUENJZSBTb2NrZXQwIFJDQTEgMzItYml0IERldmljZSBtZW1vcnkKKyAgICog IC0gMVAvUENJZSBjb25zb2xpZGF0ZWQgdG8gUkNCMiAzMi1iaXQgRGV2aWNlIG1lbW9yeQorICAg Ki8KKyAgVmlydHVhbE1lbW9yeVRhYmxlWysrSW5kZXhdLlBoeXNpY2FsQmFzZSA9IDB4MjgwMDAw MDBVTEw7CisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMHgyODAw MDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGggICAgICAgPSAweDgw MDAwMDBVTEw7CisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uQXR0cmlidXRlcyAgID0gQVJN X01FTU9SWV9SRUdJT05fQVRUUklCVVRFX0RFVklDRTsKKworICAvKgorICAgKiAgLSBQQ0llIFJD QTIgRGV2aWNlIG1lbW9yeQorICAgKi8KKyAgVmlydHVhbE1lbW9yeVRhYmxlWysrSW5kZXhdLlBo eXNpY2FsQmFzZSA9IDB4MzgwMDAwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5k ZXhdLlZpcnR1YWxCYXNlICA9IDB4MzgwMDAwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFi bGVbSW5kZXhdLkxlbmd0aCAgICAgICA9IDB4NDAwMDAwMDAwMDBVTEw7CisgIFZpcnR1YWxNZW1v cnlUYWJsZVtJbmRleF0uQXR0cmlidXRlcyAgID0gQVJNX01FTU9SWV9SRUdJT05fQVRUUklCVVRF X0RFVklDRTsKKworICAvKgorICAgKiAgLSAyUC9QQ0llIFNvY2tldDAgUkNBMiAzMi1iaXQgRGV2 aWNlIG1lbW9yeQorICAgKiAgLSAxUC9QQ0llIGNvbnNvbGlkYXRlZCB0byBSQ0IzIDMyLWJpdCBE ZXZpY2UgbWVtb3J5CisgICAqLworICBWaXJ0dWFsTWVtb3J5VGFibGVbKytJbmRleF0uUGh5c2lj YWxCYXNlID0gMHgzMDAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5WaXJ0 dWFsQmFzZSAgPSAweDMwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkxl bmd0aCAgICAgICA9IDB4ODAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5B dHRyaWJ1dGVzICAgPSBBUk1fTUVNT1JZX1JFR0lPTl9BVFRSSUJVVEVfREVWSUNFOworCisgIC8q CisgICAqICAtIFBDSWUgUkNBMyBEZXZpY2UgbWVtb3J5CisgICAqLworICBWaXJ0dWFsTWVtb3J5 VGFibGVbKytJbmRleF0uUGh5c2ljYWxCYXNlID0gMHgzQzAwMDAwMDAwMDBVTEw7CisgIFZpcnR1 YWxNZW1vcnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMHgzQzAwMDAwMDAwMDBVTEw7Cisg IFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uTGVuZ3RoICAgICAgID0gMHg0MDAwMDAwMDAwMFVM TDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5BdHRyaWJ1dGVzICAgPSBBUk1fTUVNT1JZ X1JFR0lPTl9BVFRSSUJVVEVfREVWSUNFOworCisgIC8qCisgICAqICAtIDJQL1BDSWUgU29ja2V0 MCBSQ0EzIDMyLWJpdCBEZXZpY2UgbWVtb3J5CisgICAqICAtIDFQL1BDSWUgY29uc29saWRhdGVk IHRvIFJDQjMgMzItYml0IERldmljZSBtZW1vcnkKKyAgICovCisgIFZpcnR1YWxNZW1vcnlUYWJs ZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSAweDM4MDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5 VGFibGVbSW5kZXhdLlZpcnR1YWxCYXNlICA9IDB4MzgwMDAwMDBVTEw7CisgIFZpcnR1YWxNZW1v cnlUYWJsZVtJbmRleF0uTGVuZ3RoICAgICAgID0gMHg4MDAwMDAwVUxMOworICBWaXJ0dWFsTWVt b3J5VGFibGVbSW5kZXhdLkF0dHJpYnV0ZXMgICA9IEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVU RV9ERVZJQ0U7CisKKyAgLyoKKyAgICogIC0gUENJZSBSQ0IwIERldmljZSBtZW1vcnkKKyAgICov CisgIFZpcnR1YWxNZW1vcnlUYWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSAweDIwMDAwMDAw MDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5WaXJ0dWFsQmFzZSAgPSAweDIw MDAwMDAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGggICAgICAg PSAweDQwMDAwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0dHJpYnV0 ZXMgICA9IEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJQ0U7CisKKyAgLyoKKyAgICog IC0gMlAvUENJZSBTb2NrZXQwIFJDQjAgMzItYml0IERldmljZSBtZW1vcnkKKyAgICogIC0gMVAv UENJZSBjb25zb2xpZGF0ZWQgdG8gUkNCMCAzMi1iaXQgRGV2aWNlIG1lbW9yeQorICAgKi8KKyAg VmlydHVhbE1lbW9yeVRhYmxlWysrSW5kZXhdLlBoeXNpY2FsQmFzZSA9IDB4MDAwMDAwMDBVTEw7 CisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMHgwMDAwMDAwMFVM TDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGggICAgICAgPSAweDgwMDAwMDBV TEw7CisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uQXR0cmlidXRlcyAgID0gQVJNX01FTU9S WV9SRUdJT05fQVRUUklCVVRFX0RFVklDRTsKKworICAvKgorICAgKiAgLSBQQ0llIFJDQjEgRGV2 aWNlIG1lbW9yeQorICAgKi8KKyAgVmlydHVhbE1lbW9yeVRhYmxlWysrSW5kZXhdLlBoeXNpY2Fs QmFzZSA9IDB4MjQwMDAwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLlZp cnR1YWxCYXNlICA9IDB4MjQwMDAwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5k ZXhdLkxlbmd0aCAgICAgICA9IDB4NDAwMDAwMDAwMDBVTEw7CisgIFZpcnR1YWxNZW1vcnlUYWJs ZVtJbmRleF0uQXR0cmlidXRlcyAgID0gQVJNX01FTU9SWV9SRUdJT05fQVRUUklCVVRFX0RFVklD RTsKKworICAvKgorICAgKiAgLSAyUC9QQ0llIFNvY2tldDAgUkNCMSAzMi1iaXQgRGV2aWNlIG1l bW9yeQorICAgKiAgLSAxUC9QQ0llIGNvbnNvbGlkYXRlZCB0byBSQ0IwIDMyLWJpdCBEZXZpY2Ug bWVtb3J5CisgICAqLworICBWaXJ0dWFsTWVtb3J5VGFibGVbKytJbmRleF0uUGh5c2ljYWxCYXNl ID0gMHgwODAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5WaXJ0dWFsQmFz ZSAgPSAweDA4MDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkxlbmd0aCAg ICAgICA9IDB4ODAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5BdHRyaWJ1 dGVzICAgPSBBUk1fTUVNT1JZX1JFR0lPTl9BVFRSSUJVVEVfREVWSUNFOworCisgIC8qCisgICAq ICAtIFBDSWUgUkNCMiBEZXZpY2UgbWVtb3J5CisgICAqLworICBWaXJ0dWFsTWVtb3J5VGFibGVb KytJbmRleF0uUGh5c2ljYWxCYXNlID0gMHgyODAwMDAwMDAwMDBVTEw7CisgIFZpcnR1YWxNZW1v cnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMHgyODAwMDAwMDAwMDBVTEw7CisgIFZpcnR1 YWxNZW1vcnlUYWJsZVtJbmRleF0uTGVuZ3RoICAgICAgID0gMHg0MDAwMDAwMDAwMFVMTDsKKyAg VmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5BdHRyaWJ1dGVzICAgPSBBUk1fTUVNT1JZX1JFR0lP Tl9BVFRSSUJVVEVfREVWSUNFOworCisgIC8qCisgICAqICAtIDJQL1BDSWUgU29ja2V0MCBSQ0Iy IDMyLWJpdCBEZXZpY2UgbWVtb3J5CisgICAqICAtIDFQL1BDSWUgY29uc29saWRhdGVkIHRvIFJD QjEgMzItYml0IERldmljZSBtZW1vcnkKKyAgICovCisgIFZpcnR1YWxNZW1vcnlUYWJsZVsrK0lu ZGV4XS5QaHlzaWNhbEJhc2UgPSAweDEwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVb SW5kZXhdLlZpcnR1YWxCYXNlICA9IDB4MTAwMDAwMDBVTEw7CisgIFZpcnR1YWxNZW1vcnlUYWJs ZVtJbmRleF0uTGVuZ3RoICAgICAgID0gMHg4MDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFi bGVbSW5kZXhdLkF0dHJpYnV0ZXMgICA9IEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJ Q0U7CisKKyAgLyoKKyAgICogIC0gUENJZSBSQ0IzIERldmljZSBtZW1vcnkKKyAgICovCisgIFZp cnR1YWxNZW1vcnlUYWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSAweDJDMDAwMDAwMDAwMFVM TDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5WaXJ0dWFsQmFzZSAgPSAweDJDMDAwMDAw MDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGggICAgICAgPSAweDQw MDAwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0dHJpYnV0ZXMgICA9 IEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJQ0U7CisKKyAgLyoKKyAgICogIC0gMlAv UENJZSBTb2NrZXQwIFJDQjMgMzItYml0IERldmljZSBtZW1vcnkKKyAgICogIC0gMVAvUENJZSBj b25zb2xpZGF0ZWQgdG8gUkNCMSAzMi1iaXQgRGV2aWNlIG1lbW9yeQorICAgKi8KKyAgVmlydHVh bE1lbW9yeVRhYmxlWysrSW5kZXhdLlBoeXNpY2FsQmFzZSA9IDB4MTgwMDAwMDBVTEw7CisgIFZp cnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMHgxODAwMDAwMFVMTDsKKyAg VmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGggICAgICAgPSAweDgwMDAwMDBVTEw7Cisg IFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uQXR0cmlidXRlcyAgID0gQVJNX01FTU9SWV9SRUdJ T05fQVRUUklCVVRFX0RFVklDRTsKKworICBpZiAoSXNTbGF2ZVNvY2tldEFjdGl2ZSAoKSkgewor ICAgIC8vIFNsYXZlIHNvY2tldCBleGlzdAorICAgIC8qCisgICAgICogIC0gUENJZSBSQ0EwIERl dmljZSBtZW1vcnkKKyAgICAgKi8KKyAgICBWaXJ0dWFsTWVtb3J5VGFibGVbKytJbmRleF0uUGh5 c2ljYWxCYXNlID0gMHg3MDAwMDAwMDAwMDBVTEw7CisgICAgVmlydHVhbE1lbW9yeVRhYmxlW0lu ZGV4XS5WaXJ0dWFsQmFzZSAgPSAweDcwMDAwMDAwMDAwMFVMTDsKKyAgICBWaXJ0dWFsTWVtb3J5 VGFibGVbSW5kZXhdLkxlbmd0aCAgICAgICA9IDB4NDAwMDAwMDAwMDBVTEw7CisgICAgVmlydHVh bE1lbW9yeVRhYmxlW0luZGV4XS5BdHRyaWJ1dGVzICAgPSBBUk1fTUVNT1JZX1JFR0lPTl9BVFRS SUJVVEVfREVWSUNFOworCisgICAgLyoKKyAgICAgKiAgLSBQQ0llIFJDQTEgRGV2aWNlIG1lbW9y eQorICAgICAqLworICAgIFZpcnR1YWxNZW1vcnlUYWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2Ug PSAweDc0MDAwMDAwMDAwMFVMTDsKKyAgICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLlZpcnR1 YWxCYXNlICA9IDB4NzQwMDAwMDAwMDAwVUxMOworICAgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRl eF0uTGVuZ3RoICAgICAgID0gMHg0MDAwMDAwMDAwMFVMTDsKKyAgICBWaXJ0dWFsTWVtb3J5VGFi bGVbSW5kZXhdLkF0dHJpYnV0ZXMgICA9IEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJ Q0U7CisKKyAgICAvKgorICAgICAqICAtIFBDSWUgUkNBMiBEZXZpY2UgbWVtb3J5CisgICAgICov CisgICAgVmlydHVhbE1lbW9yeVRhYmxlWysrSW5kZXhdLlBoeXNpY2FsQmFzZSA9IDB4NzgwMDAw MDAwMDAwVUxMOworICAgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0g MHg3ODAwMDAwMDAwMDBVTEw7CisgICAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGgg ICAgICAgPSAweDQwMDAwMDAwMDAwVUxMOworICAgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0u QXR0cmlidXRlcyAgID0gQVJNX01FTU9SWV9SRUdJT05fQVRUUklCVVRFX0RFVklDRTsKKworICAg IC8qCisgICAgICogIC0gUENJZSBSQ0EzIERldmljZSBtZW1vcnkKKyAgICAgKi8KKyAgICBWaXJ0 dWFsTWVtb3J5VGFibGVbKytJbmRleF0uUGh5c2ljYWxCYXNlID0gMHg3QzAwMDAwMDAwMDBVTEw7 CisgICAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5WaXJ0dWFsQmFzZSAgPSAweDdDMDAwMDAw MDAwMFVMTDsKKyAgICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkxlbmd0aCAgICAgICA9IDB4 NDAwMDAwMDAwMDBVTEw7CisgICAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5BdHRyaWJ1dGVz ICAgPSBBUk1fTUVNT1JZX1JFR0lPTl9BVFRSSUJVVEVfREVWSUNFOworCisgICAgLyoKKyAgICAg KiAgLSBQQ0llIFJDQjAgRGV2aWNlIG1lbW9yeQorICAgICAqLworICAgIFZpcnR1YWxNZW1vcnlU YWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSAweDYwMDAwMDAwMDAwMFVMTDsKKyAgICBWaXJ0 dWFsTWVtb3J5VGFibGVbSW5kZXhdLlZpcnR1YWxCYXNlICA9IDB4NjAwMDAwMDAwMDAwVUxMOwor ICAgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uTGVuZ3RoICAgICAgID0gMHg0MDAwMDAwMDAw MFVMTDsKKyAgICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0dHJpYnV0ZXMgICA9IEFSTV9N RU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJQ0U7CisKKyAgICAvKgorICAgICAqICAtIFBDSWUg UkNCMSBEZXZpY2UgbWVtb3J5CisgICAgICovCisgICAgVmlydHVhbE1lbW9yeVRhYmxlWysrSW5k ZXhdLlBoeXNpY2FsQmFzZSA9IDB4NjQwMDAwMDAwMDAwVUxMOworICAgIFZpcnR1YWxNZW1vcnlU YWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMHg2NDAwMDAwMDAwMDBVTEw7CisgICAgVmlydHVh bE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGggICAgICAgPSAweDQwMDAwMDAwMDAwVUxMOworICAg IFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uQXR0cmlidXRlcyAgID0gQVJNX01FTU9SWV9SRUdJ T05fQVRUUklCVVRFX0RFVklDRTsKKworICAgIC8qCisgICAgICogIC0gUENJZSBSQ0IyIERldmlj ZSBtZW1vcnkKKyAgICAgKi8KKyAgICBWaXJ0dWFsTWVtb3J5VGFibGVbKytJbmRleF0uUGh5c2lj YWxCYXNlID0gMHg2ODAwMDAwMDAwMDBVTEw7CisgICAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4 XS5WaXJ0dWFsQmFzZSAgPSAweDY4MDAwMDAwMDAwMFVMTDsKKyAgICBWaXJ0dWFsTWVtb3J5VGFi bGVbSW5kZXhdLkxlbmd0aCAgICAgICA9IDB4NDAwMDAwMDAwMDBVTEw7CisgICAgVmlydHVhbE1l bW9yeVRhYmxlW0luZGV4XS5BdHRyaWJ1dGVzICAgPSBBUk1fTUVNT1JZX1JFR0lPTl9BVFRSSUJV VEVfREVWSUNFOworCisgICAgLyoKKyAgICAgKiAgLSBQQ0llIFJDQjMgRGV2aWNlIG1lbW9yeQor ICAgICAqLworICAgIFZpcnR1YWxNZW1vcnlUYWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSAw eDZDMDAwMDAwMDAwMFVMTDsKKyAgICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLlZpcnR1YWxC YXNlICA9IDB4NkMwMDAwMDAwMDAwVUxMOworICAgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0u TGVuZ3RoICAgICAgID0gMHg0MDAwMDAwMDAwMFVMTDsKKyAgICBWaXJ0dWFsTWVtb3J5VGFibGVb SW5kZXhdLkF0dHJpYnV0ZXMgICA9IEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJQ0U7 CisgIH0KKworICAvKgorICAgKiAgLSAyUC9QQ0llIFNvY2tldDEgUkNBMCAzMi1iaXQgRGV2aWNl IG1lbW9yeQorICAgKiAgLSAxUC9QQ0llIGNvbnNvbGlkYXRlZCB0byBSQ0EyIDMyLWJpdCBEZXZp Y2UgbWVtb3J5CisgICAqLworICBWaXJ0dWFsTWVtb3J5VGFibGVbKytJbmRleF0uUGh5c2ljYWxC YXNlID0gMHg2MDAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5WaXJ0dWFs QmFzZSAgPSAweDYwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkxlbmd0 aCAgICAgICA9IDB4ODAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5BdHRy aWJ1dGVzICAgPSBBUk1fTUVNT1JZX1JFR0lPTl9BVFRSSUJVVEVfREVWSUNFOworCisgIC8qCisg ICAqICAtIDJQL1BDSWUgU29ja2V0MSBSQ0ExIDMyLWJpdCBEZXZpY2UgbWVtb3J5CisgICAqICAt IDFQL1BDSWUgY29uc29saWRhdGVkIHRvIFJDQTIgMzItYml0IERldmljZSBtZW1vcnkKKyAgICov CisgIFZpcnR1YWxNZW1vcnlUYWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSAweDY4MDAwMDAw VUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLlZpcnR1YWxCYXNlICA9IDB4NjgwMDAw MDBVTEw7CisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uTGVuZ3RoICAgICAgID0gMHg4MDAw MDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0dHJpYnV0ZXMgICA9IEFSTV9N RU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJQ0U7CisKKyAgLyoKKyAgICogIC0gMlAvUENJZSBT b2NrZXQxIFJDQTIgMzItYml0IERldmljZSBtZW1vcnkKKyAgICogIC0gMVAvUENJZSBjb25zb2xp ZGF0ZWQgdG8gUkNBMyAzMi1iaXQgRGV2aWNlIG1lbW9yeQorICAgKi8KKyAgVmlydHVhbE1lbW9y eVRhYmxlWysrSW5kZXhdLlBoeXNpY2FsQmFzZSA9IDB4NzAwMDAwMDBVTEw7CisgIFZpcnR1YWxN ZW1vcnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMHg3MDAwMDAwMFVMTDsKKyAgVmlydHVh bE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGggICAgICAgPSAweDgwMDAwMDBVTEw7CisgIFZpcnR1 YWxNZW1vcnlUYWJsZVtJbmRleF0uQXR0cmlidXRlcyAgID0gQVJNX01FTU9SWV9SRUdJT05fQVRU UklCVVRFX0RFVklDRTsKKworICAvKgorICAgKiAgLSAyUC9QQ0llIFNvY2tldDEgUkNBMyAzMi1i aXQgRGV2aWNlIG1lbW9yeQorICAgKiAgLSAxUC9QQ0llIGNvbnNvbGlkYXRlZCB0byBSQ0EzIDMy LWJpdCBEZXZpY2UgbWVtb3J5CisgICAqLworICBWaXJ0dWFsTWVtb3J5VGFibGVbKytJbmRleF0u UGh5c2ljYWxCYXNlID0gMHg3ODAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4 XS5WaXJ0dWFsQmFzZSAgPSAweDc4MDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5k ZXhdLkxlbmd0aCAgICAgICA9IDB4ODAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRhYmxlW0lu ZGV4XS5BdHRyaWJ1dGVzICAgPSBBUk1fTUVNT1JZX1JFR0lPTl9BVFRSSUJVVEVfREVWSUNFOwor CisgIC8qCisgICAqICAtIDJQL1BDSWUgU29ja2V0MSBSQ0IwIDMyLWJpdCBEZXZpY2UgbWVtb3J5 CisgICAqICAtIDFQL1BDSWUgY29uc29saWRhdGVkIHRvIFJDQTAgMzItYml0IERldmljZSBtZW1v cnkKKyAgICovCisgIFZpcnR1YWxNZW1vcnlUYWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSAw eDQwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLlZpcnR1YWxCYXNlICA9 IDB4NDAwMDAwMDBVTEw7CisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uTGVuZ3RoICAgICAg ID0gMHg4MDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0dHJpYnV0ZXMg ICA9IEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJQ0U7CisKKyAgLyoKKyAgICogIC0g MlAvUENJZSBTb2NrZXQxIFJDQjEgMzItYml0IERldmljZSBtZW1vcnkKKyAgICogIC0gMVAvUENJ ZSBjb25zb2xpZGF0ZWQgdG8gUkNBMCAzMi1iaXQgRGV2aWNlIG1lbW9yeQorICAgKi8KKyAgVmly dHVhbE1lbW9yeVRhYmxlWysrSW5kZXhdLlBoeXNpY2FsQmFzZSA9IDB4NDgwMDAwMDBVTEw7Cisg IFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMHg0ODAwMDAwMFVMTDsK KyAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5MZW5ndGggICAgICAgPSAweDgwMDAwMDBVTEw7 CisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uQXR0cmlidXRlcyAgID0gQVJNX01FTU9SWV9S RUdJT05fQVRUUklCVVRFX0RFVklDRTsKKworICAvKgorICAgKiAgLSAyUC9QQ0llIFNvY2tldDEg UkNCMiAzMi1iaXQgRGV2aWNlIG1lbW9yeQorICAgKiAgLSAxUC9QQ0llIGNvbnNvbGlkYXRlZCB0 byBSQ0ExIDMyLWJpdCBEZXZpY2UgbWVtb3J5CisgICAqLworICBWaXJ0dWFsTWVtb3J5VGFibGVb KytJbmRleF0uUGh5c2ljYWxCYXNlID0gMHg1MDAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRh YmxlW0luZGV4XS5WaXJ0dWFsQmFzZSAgPSAweDUwMDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5 VGFibGVbSW5kZXhdLkxlbmd0aCAgICAgICA9IDB4ODAwMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9y eVRhYmxlW0luZGV4XS5BdHRyaWJ1dGVzICAgPSBBUk1fTUVNT1JZX1JFR0lPTl9BVFRSSUJVVEVf REVWSUNFOworCisgIC8qCisgICAqICAtIDJQL1BDSWUgU29ja2V0MSBSQ0IzIDMyLWJpdCBEZXZp Y2UgbWVtb3J5CisgICAqICAtIDFQL1BDSWUgY29uc29saWRhdGVkIHRvIFJDQTEgMzItYml0IERl dmljZSBtZW1vcnkKKyAgICovCisgIFZpcnR1YWxNZW1vcnlUYWJsZVsrK0luZGV4XS5QaHlzaWNh bEJhc2UgPSAweDU4MDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLlZpcnR1 YWxCYXNlICA9IDB4NTgwMDAwMDBVTEw7CisgIFZpcnR1YWxNZW1vcnlUYWJsZVtJbmRleF0uTGVu Z3RoICAgICAgID0gMHg4MDAwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0 dHJpYnV0ZXMgICA9IEFSTV9NRU1PUllfUkVHSU9OX0FUVFJJQlVURV9ERVZJQ0U7CisKKyAgLyoK KyAgICogIC0gQkVSVCBtZW1vcnkgcmVnaW9uCisgICAqLworICBWaXJ0dWFsTWVtb3J5VGFibGVb KytJbmRleF0uUGh5c2ljYWxCYXNlID0gMHg4ODIzMDAwMFVMTDsKKyAgVmlydHVhbE1lbW9yeVRh YmxlW0luZGV4XS5WaXJ0dWFsQmFzZSAgPSAweDg4MjMwMDAwVUxMOworICBWaXJ0dWFsTWVtb3J5 VGFibGVbSW5kZXhdLkxlbmd0aCAgICAgICA9IDB4NTAwMDBVTEw7CisgIFZpcnR1YWxNZW1vcnlU YWJsZVtJbmRleF0uQXR0cmlidXRlcyAgID0gQVJNX01FTU9SWV9SRUdJT05fQVRUUklCVVRFX0RF VklDRTsKKworICAvKgorICAgKiAgLSBERFIgbWVtb3J5IHJlZ2lvbgorICAgKi8KKyAgTnVtUmVn aW9uID0gUGxhdGZvcm1Ib2ItJmd0O0RyYW1JbmZvLk51bVJlZ2lvbjsKKyAgQ291bnQgPSAwOwor ICB3aGlsZSAoTnVtUmVnaW9uLS0gJmd0OyAwKSB7CisgICAgaWYgKFBsYXRmb3JtSG9iLSZndDtE cmFtSW5mby5OdmRSZWdpb25bQ291bnRdKSB7IC8qIFNraXAgTlZESU1NIFJlZ2lvbiAqLworICAg ICAgQ291bnQrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIFZpcnR1YWxNZW1vcnlU YWJsZVsrK0luZGV4XS5QaHlzaWNhbEJhc2UgPSBQbGF0Zm9ybUhvYi0mZ3Q7RHJhbUluZm8uQmFz ZVtDb3VudF07CisgICAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5WaXJ0dWFsQmFzZSAgPSBQ bGF0Zm9ybUhvYi0mZ3Q7RHJhbUluZm8uQmFzZVtDb3VudF07CisgICAgVmlydHVhbE1lbW9yeVRh YmxlW0luZGV4XS5MZW5ndGggICAgICAgPSBQbGF0Zm9ybUhvYi0mZ3Q7RHJhbUluZm8uU2l6ZVtD b3VudF07CisgICAgVmlydHVhbE1lbW9yeVRhYmxlW0luZGV4XS5BdHRyaWJ1dGVzICAgPSBERFJf QVRUUklCVVRFU19DQUNIRUQ7CisgICAgQ291bnQrKzsKKyAgfQorCisgIC8qIFNQTSBNTSBOUyBC dWZmZXIgZm9yIE1tQ29tbXVuaWNhdGVEeGUgKi8KKyAgVmlydHVhbE1lbW9yeVRhYmxlWysrSW5k ZXhdLlBoeXNpY2FsQmFzZSA9IFBjZEdldDY0IChQY2RNbUJ1ZmZlckJhc2UpOworICBWaXJ0dWFs TWVtb3J5VGFibGVbSW5kZXhdLlZpcnR1YWxCYXNlICA9IFBjZEdldDY0IChQY2RNbUJ1ZmZlckJh c2UpOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkxlbmd0aCAgICAgICA9IFBjZEdldDY0 IChQY2RNbUJ1ZmZlclNpemUpOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0dHJpYnV0 ZXMgICA9IEREUl9BVFRSSUJVVEVTX0NBQ0hFRDsKKworICAvKiBFbmQgb2YgVGFibGUgKi8KKyAg VmlydHVhbE1lbW9yeVRhYmxlWysrSW5kZXhdLlBoeXNpY2FsQmFzZSA9IDA7CisgIFZpcnR1YWxN ZW1vcnlUYWJsZVtJbmRleF0uVmlydHVhbEJhc2UgID0gMDsKKyAgVmlydHVhbE1lbW9yeVRhYmxl W0luZGV4XS5MZW5ndGggICAgICAgPSAwOworICBWaXJ0dWFsTWVtb3J5VGFibGVbSW5kZXhdLkF0 dHJpYnV0ZXMgICA9IChBUk1fTUVNT1JZX1JFR0lPTl9BVFRSSUJVVEVTKTA7CisKKyAgQVNTRVJU ICgoSW5kZXggKyAxKSAmbHQ7PSBNQVhfVklSVFVBTF9NRU1PUllfTUFQX0RFU0NSSVBUT1JTKTsK KworICAqVmlydHVhbE1lbW9yeU1hcCA9IFZpcnR1YWxNZW1vcnlUYWJsZTsKK30KPC9wcmU+CiAg ICAgIDwvYmxvY2txdW90ZT4KICAgICAgPHByZSBjbGFzcz0ibW96LXF1b3RlLXByZSIgd3JhcD0i Ij4KCgo8L3ByZT4KICAgICAgPGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSI+CiAgICAgICAgPHByZSBj bGFzcz0ibW96LXF1b3RlLXByZSIgd3JhcD0iIj5kaWZmIC0tZ2l0IGEvU2lsaWNvbi9BbXBlcmUv QW1wZXJlQWx0cmFQa2cvTGlicmFyeS9NYWlsYm94SW50ZXJmYWNlTGliL01haWxib3hJbnRlcmZh Y2VMaWIuYyBiL1NpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0xpYnJhcnkvTWFpbGJveElu dGVyZmFjZUxpYi9NYWlsYm94SW50ZXJmYWNlTGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMDAwLi4wZGExZjkwNjk5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9TaWxpY29u L0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5L01haWxib3hJbnRlcmZhY2VMaWIvTWFpbGJv eEludGVyZmFjZUxpYi5jCkBAIC0wLDAgKzEsMjgyIEBACisvKiogQGZpbGUKKyAgVGhlIGxpYnJh cnkgaW1wbGVtZW50cyB0aGUgaGFyZHdhcmUgTWFpbGJveCAoRG9vcmJlbGwpIGludGVyZmFjZSBm b3IgY29tbXVuaWNhdGlvbgorICBiZXR3ZWVuIHRoZSBBcHBsaWNhdGlvbiBQcm9jZXNzb3IgKEFS TXY4KSBhbmQgdGhlIFN5c3RlbSBDb250cm9sIFByb2Nlc3NvcnMgKFNNcHJvL1BNcHJvKS4KKwor ICBDb3B5cmlnaHQgKGMpIDIwMjEsIEFtcGVyZSBDb21wdXRpbmcgTExDLiBBbGwgcmlnaHRzIHJl c2VydmVkLiZsdDtCUiZndDsKKworICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTItQ2xh dXNlLVBhdGVudAorCisqKi8KKworI2luY2x1ZGUgJmx0O1VlZmkuaCZndDsKKworI2luY2x1ZGUg Jmx0O0xpYnJhcnkvQW1wZXJlQ3B1TGliLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7TGlicmFyeS9CYXNl TWVtb3J5TGliLmgmZ3Q7CisjaW5jbHVkZSAmbHQ7TGlicmFyeS9EZWJ1Z0xpYi5oJmd0OworI2lu Y2x1ZGUgJmx0O0xpYnJhcnkvTWFpbGJveEludGVyZmFjZUxpYi5oJmd0OworI2luY2x1ZGUgJmx0 O0xpYnJhcnkvVGltZXJMaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJyYXJ5L0lvTGliLmgmZ3Q7 CisKKy8vCisvLyBIYXJkd2FyZSBEb29yYmVsbHMKKy8vCisjZGVmaW5lIFNNUFJPX0RCMF9JUlFf T0ZTVCAgICAgICAgICAgICAgIDQwCisjZGVmaW5lIFNNUFJPX0RCMF9CQVNFX0FERFJFU1MgICAg ICAgICAgIChGaXhlZFBjZEdldDY0IChQY2RTbXByb0RiQmFzZVJlZykpCisKKyNkZWZpbmUgUE1Q Uk9fREIwX0lSUV9PRlNUICAgICAgICAgICAgICAgNTYKKyNkZWZpbmUgUE1QUk9fREIwX0JBU0Vf QUREUkVTUyAgICAgICAgICAgKEZpeGVkUGNkR2V0NjQgKFBjZFBtcHJvRGJCYXNlUmVnKSkKKwor I2RlZmluZSBTTEFWRV9TT0NLRVRfQkFTRV9BRERSRVNTX09GRlNFVCAweDQwMDAwMDAwMDAwMAor CisvLworLy8gVGhlIGJhc2UgU1BJIGludGVycnVwdCBudW1iZXIgb2YgdGhlIFNsYXZlIHNvY2tl dAorLy8KKyNkZWZpbmUgU0xBVkVfU09DS0VUX1NQSV9JTlRFUlJVUFQgMzUyCisKKyNkZWZpbmUg U0xBVkVfU09DS0VUX0RPT1JCRUxMX0lOVEVSUlVQVF9CQVNFKFNvY2tldCkgKChTb2NrZXQpICog U0xBVkVfU09DS0VUX1NQSV9JTlRFUlJVUFQgLSAzMikKKworLy8KKy8vIERvb3JiZWxsIGJhc2Ug cmVnaXN0ZXIgc3RyaWRlIHNpemUKKy8vCisjZGVmaW5lIERCX0JBU0VfUkVHX1NUUklERSAweDAw MDAxMDAwCisKKyNkZWZpbmUgU01QUk9fREJ4X0FERFJFU1Moc29ja2V0LCBkYikgXAorICAgICAg ICAoKHNvY2tldCkgKiBTTEFWRV9TT0NLRVRfQkFTRV9BRERSRVNTX09GRlNFVCArIFNNUFJPX0RC MF9CQVNFX0FERFJFU1MgKyBEQl9CQVNFX1JFR19TVFJJREUgKiAoZGIpKQorCisjZGVmaW5lIFBN UFJPX0RCeF9BRERSRVNTKHNvY2tldCwgZGIpIFwKKyAgICAgICAgKChzb2NrZXQpICogU0xBVkVf U09DS0VUX0JBU0VfQUREUkVTU19PRkZTRVQgKyBQTVBST19EQjBfQkFTRV9BRERSRVNTICsgREJf QkFTRV9SRUdfU1RSSURFICogKGRiKSkKKworLy8KKy8vIERvb3JiZWxsIFN0YXR1cyBCaXRzCisv LworI2RlZmluZSBEQl9TVEFUVVNfQVZBSUxfQklUICAgICAgIEJJVDE2CisjZGVmaW5lIERCX1NU QVRVU19BQ0tfQklUICAgICAgICAgQklUMAorCisvKioKKyAgR2V0IHRoZSBiYXNlIGFkZHJlc3Mg b2YgYSBkb29yYmVsbC4KKworICBAcGFyYW1baW5dICBTb2NrZXQgICAgICAgICAgICBBY3RpdmUg c29ja2V0IGluZGV4LgorICBAcGFyYW1baW5dICBEb29yYmVsbCAgICAgICAgICBEb29yYmVsbCBj aGFubmVsIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIFNNcHJvL1BNcHJvLgorCisgIEByZXR2 YWwgVUlOVDMyICAgICAgICAgICAgICAgIFRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRvb3JiZWxs LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMg MCBpbmRpY2F0ZSB0aGF0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLgorCisqKi8K K1VJTlROCitFRklBUEkKK01haWxib3hHZXREb29yYmVsbEFkZHJlc3MgKAorICBJTiBVSU5UOCAg ICAgICAgICAgICBTb2NrZXQsCisgIElOIERPT1JCRUxMX0NIQU5ORUxTIERvb3JiZWxsCisgICkK K3sKKyAgVUlOVE4gRG9vcmJlbGxBZGRyZXNzOworCisgIGlmIChTb2NrZXQgJmd0Oz0gR2V0TnVt YmVyT2ZBY3RpdmVTb2NrZXRzICgpCisgICAgICB8fCBEb29yYmVsbCAmZ3Q7PSBOVU1CRVJfT0Zf RE9PUkJFTExTX1BFUl9TT0NLRVQpCisgIHsKKyAgICByZXR1cm4gMDsKKyAgfQo8L3ByZT4KICAg ICAgPC9ibG9ja3F1b3RlPgogICAgICA8cHJlIGNsYXNzPSJtb3otcXVvdGUtcHJlIiB3cmFwPSIi PgpDb2Rpbmcgc3R5bGUgaXMKIGlmICgpIHsKIH0KClRoaXMgZmlsZSBnZXRzIGl0IGNvbnNpc3Rl bnRseSB3cm9uZy48L3ByZT4KICAgIDwvYmxvY2txdW90ZT4KICAgIDxwPkkgYWdyZWUgdGhhdCBp dCBzaG91bGQgYmUgY29uc2lzdGVudC4gQnV0IHRoYXQgY29kaW5nIHN0eWxlCiAgICAgIGNvbmZv cm1zIHRvICZxdW90OzUuMi4xLjYgRWFjaCBzdWItZXhwcmVzc2lvbiBvZiBhIGNvbXBsZXggcHJl ZGljYXRlCiAgICAgIGV4cHJlc3Npb24gbXVzdCBiZSBvbiBhIHNlcGFyYXRlIGxpbmUmcXVvdDsg aW4gRURLIElJIENvZGluZyBTdGFuZGFyZHMKICAgICAgU3BlYwooPGEgY2xhc3M9Im1vei10eHQt bGluay1mcmVldGV4dCIgaHJlZj0iaHR0cHM6Ly9lZGsyLWRvY3MuZ2l0Ym9vay5pby9lZGstaWkt Yy1jb2Rpbmctc3RhbmRhcmRzLXNwZWNpZmljYXRpb24vNV9zb3VyY2VfZmlsZXMvNTJfc3BhY2lu ZyM1LTItMS02LWVhY2gtc3ViLWV4cHJlc3Npb24tb2YtYS1jb21wbGV4LXByZWRpY2F0ZS1leHBy ZXNzaW9uLW11c3QtYmUtb24tYS1zZXBhcmF0ZS1saW5lIj5odHRwczovL2VkazItZG9jcy5naXRi b29rLmlvL2Vkay1paS1jLWNvZGluZy1zdGFuZGFyZHMtc3BlY2lmaWNhdGlvbi81X3NvdXJjZV9m aWxlcy81Ml9zcGFjaW5nIzUtMi0xLTYtZWFjaC1zdWItZXhwcmVzc2lvbi1vZi1hLWNvbXBsZXgt cHJlZGljYXRlLWV4cHJlc3Npb24tbXVzdC1iZS1vbi1hLXNlcGFyYXRlLWxpbmU8L2E+KS48L3A+ CiAgICA8cD4mcXVvdDs8c3BhbiBkYXRhLW9mZnNldC1rZXk9IjYwMjYzOWQ4ZmFjNjQwZTI5OTE4 YzEwOTg2MDliYTg3OjAiPlByZWRpY2F0ZQogICAgICAgIGV4cHJlc3Npb25zIGNvbnRhaW5pbmcg bXVsdGlwbGUgb3BlcmF0b3JzIHdpdGggc3ViLWV4cHJlc3Npb25zCiAgICAgICAgam9pbmVkIGJ5 ICZhbXA7JmFtcDsgb3IgfHwgbXVzdCBoYXZlIGVhY2ggc3ViLWV4cHJlc3Npb24gb24gYQogICAg ICAgIHNlcGFyYXRlIGxpbmUuIFRoZSBvcGVuaW5nIGJyYWNlLCAnPC9zcGFuPjxzcGFuIGRhdGEt b2Zmc2V0LWtleT0iNjAyNjM5ZDhmYWM2NDBlMjk5MThjMTA5ODYwOWJhODc6MSI+PGNvZGUgc3Bl bGxjaGVjaz0iZmFsc2UiIGNsYXNzPSJjb2RlLTA0NThlMjFlIiBkYXRhLXNsYXRlLWxlYWY9InRy dWUiPns8L2NvZGU+PC9zcGFuPjxzcGFuIGRhdGEtb2Zmc2V0LWtleT0iNjAyNjM5ZDhmYWM2NDBl Mjk5MThjMTA5ODYwOWJhODc6MiIgZGF0YS1zbGF0ZS1mcmFnbWVudD0iSlRkQ0pUSXliMkpxWldO MEpUSXlKVE5CSlRJeVpHOWpkVzFsYm5RbE1qSWxNa01sTWpKa1lYUmhKVEl5SlROQkpUZENKVGRF SlRKREpUSXlibTlrWlhNbE1qSWxNMEVsTlVJbE4wSWxNakp2WW1wbFkzUWxNaklsTTBFbE1qSmli RzlqYXlVeU1pVXlReVV5TW5SNWNHVWxNaklsTTBFbE1qSndZWEpoWjNKaGNHZ2xNaklsTWtNbE1q SnBjMVp2YVdRbE1qSWxNMEZtWVd4elpTVXlReVV5TW1SaGRHRWxNaklsTTBFbE4wSWxOMFFsTWtN bE1qSnViMlJsY3lVeU1pVXpRU1UxUWlVM1FpVXlNbTlpYW1WamRDVXlNaVV6UVNVeU1uUmxlSFFs TWpJbE1rTWxNakpzWldGMlpYTWxNaklsTTBFbE5VSWxOMElsTWpKdlltcGxZM1FsTWpJbE0wRWxN akpzWldGbUpUSXlKVEpESlRJeWRHVjRkQ1V5TWlVelFTVXlNbEJ5WldScFkyRjBaU1V5TUdWNGNI SmxjM05wYjI1ekpUSXdZMjl1ZEdGcGJtbHVaeVV5TUcxMWJIUnBjR3hsSlRJd2IzQmxjbUYwYjNK ekpUSXdkMmwwYUNVeU1ITjFZaTFsZUhCeVpYTnphVzl1Y3lVeU1HcHZhVzVsWkNVeU1HSjVKVEl3 SlRJMkpUSTJKVEl3YjNJbE1qQWxOME1sTjBNbE1qQnRkWE4wSlRJd2FHRjJaU1V5TUdWaFkyZ2xN akJ6ZFdJdFpYaHdjbVZ6YzJsdmJpVXlNRzl1SlRJd1lTVXlNSE5sY0dGeVlYUmxKVEl3YkdsdVpT NGxNakJVYUdVbE1qQnZjR1Z1YVc1bkpUSXdZbkpoWTJVbE1rTWxNakFuSlRJeUpUSkRKVEl5YldG eWEzTWxNaklsTTBFbE5VSWxOVVFsTjBRbE1rTWxOMElsTWpKdlltcGxZM1FsTWpJbE0wRWxNakpz WldGbUpUSXlKVEpESlRJeWRHVjRkQ1V5TWlVelFTVXlNaVUzUWlVeU1pVXlReVV5TW0xaGNtdHpK VEl5SlROQkpUVkNKVGRDSlRJeWIySnFaV04wSlRJeUpUTkJKVEl5YldGeWF5VXlNaVV5UXlVeU1u UjVjR1VsTWpJbE0wRWxNakpqYjJSbEpUSXlKVEpESlRJeVpHRjBZU1V5TWlVelFTVTNRaVUzUkNV M1JDVTFSQ1UzUkNVeVF5VTNRaVV5TW05aWFtVmpkQ1V5TWlVelFTVXlNbXhsWVdZbE1qSWxNa01s TWpKMFpYaDBKVEl5SlROQkpUSXlKeVV5TUc5bUpUSXdkR2hsSlRJd1ltOWtlU1V5TUhOb1lXeHNK VEl3WW1VbE1qQnZiaVV5TUdFbE1qQnNhVzVsSlRJd1lua2xNakJwZEhObGJHWWxNakJoYm1RbE1q QmhiR2xuYm1Wa0pUSXdhVzRsTWpCMGFHVWxNakJ6ZEdGeWRHbHVaeVV5TUdOdmJIVnRiaVV5TUc5 bUpUSXdkR2hsSlRJd1lYTnpiMk5wWVhSbFpDVXlNR3RsZVhkdmNtUXVKVEl5SlRKREpUSXliV0Z5 YTNNbE1qSWxNMEVsTlVJbE5VUWxOMFFsTlVRbE4wUWxOVVFsTjBRbE5VUWxOMFE9Ij4nCiAgICAg ICAgb2YgdGhlIGJvZHkgc2hhbGwgYmUgb24gYSBsaW5lIGJ5IGl0c2VsZiBhbmQgYWxpZ25lZCBp biB0aGUKICAgICAgICBzdGFydGluZyBjb2x1bW4gb2YgdGhlIGFzc29jaWF0ZWQga2V5d29yZC48 L3NwYW4+PC9wPgogICAgPHA+PHNwYW4gZGF0YS1vZmZzZXQta2V5PSI2MDI2MzlkOGZhYzY0MGUy OTkxOGMxMDk4NjA5YmE4NzoyIiBkYXRhLXNsYXRlLWZyYWdtZW50PSJKVGRDSlRJeWIySnFaV04w SlRJeUpUTkJKVEl5Wkc5amRXMWxiblFsTWpJbE1rTWxNakprWVhSaEpUSXlKVE5CSlRkQ0pUZEVK VEpESlRJeWJtOWtaWE1sTWpJbE0wRWxOVUlsTjBJbE1qSnZZbXBsWTNRbE1qSWxNMEVsTWpKaWJH OWpheVV5TWlVeVF5VXlNblI1Y0dVbE1qSWxNMEVsTWpKd1lYSmhaM0poY0dnbE1qSWxNa01sTWpK cGMxWnZhV1FsTWpJbE0wRm1ZV3h6WlNVeVF5VXlNbVJoZEdFbE1qSWxNMEVsTjBJbE4wUWxNa01s TWpKdWIyUmxjeVV5TWlVelFTVTFRaVUzUWlVeU1tOWlhbVZqZENVeU1pVXpRU1V5TW5SbGVIUWxN aklsTWtNbE1qSnNaV0YyWlhNbE1qSWxNMEVsTlVJbE4wSWxNakp2WW1wbFkzUWxNaklsTTBFbE1q SnNaV0ZtSlRJeUpUSkRKVEl5ZEdWNGRDVXlNaVV6UVNVeU1sQnlaV1JwWTJGMFpTVXlNR1Y0Y0hK bGMzTnBiMjV6SlRJd1kyOXVkR0ZwYm1sdVp5VXlNRzExYkhScGNHeGxKVEl3YjNCbGNtRjBiM0p6 SlRJd2QybDBhQ1V5TUhOMVlpMWxlSEJ5WlhOemFXOXVjeVV5TUdwdmFXNWxaQ1V5TUdKNUpUSXdK VEkySlRJMkpUSXdiM0lsTWpBbE4wTWxOME1sTWpCdGRYTjBKVEl3YUdGMlpTVXlNR1ZoWTJnbE1q QnpkV0l0Wlhod2NtVnpjMmx2YmlVeU1HOXVKVEl3WVNVeU1ITmxjR0Z5WVhSbEpUSXdiR2x1WlM0 bE1qQlVhR1VsTWpCdmNHVnVhVzVuSlRJd1luSmhZMlVsTWtNbE1qQW5KVEl5SlRKREpUSXliV0Z5 YTNNbE1qSWxNMEVsTlVJbE5VUWxOMFFsTWtNbE4wSWxNakp2WW1wbFkzUWxNaklsTTBFbE1qSnNa V0ZtSlRJeUpUSkRKVEl5ZEdWNGRDVXlNaVV6UVNVeU1pVTNRaVV5TWlVeVF5VXlNbTFoY210ekpU SXlKVE5CSlRWQ0pUZENKVEl5YjJKcVpXTjBKVEl5SlROQkpUSXliV0Z5YXlVeU1pVXlReVV5TW5S NWNHVWxNaklsTTBFbE1qSmpiMlJsSlRJeUpUSkRKVEl5WkdGMFlTVXlNaVV6UVNVM1FpVTNSQ1Uz UkNVMVJDVTNSQ1V5UXlVM1FpVXlNbTlpYW1WamRDVXlNaVV6UVNVeU1teGxZV1lsTWpJbE1rTWxN akowWlhoMEpUSXlKVE5CSlRJeUp5VXlNRzltSlRJd2RHaGxKVEl3WW05a2VTVXlNSE5vWVd4c0pU SXdZbVVsTWpCdmJpVXlNR0VsTWpCc2FXNWxKVEl3WW5rbE1qQnBkSE5sYkdZbE1qQmhibVFsTWpC aGJHbG5ibVZrSlRJd2FXNGxNakIwYUdVbE1qQnpkR0Z5ZEdsdVp5VXlNR052YkhWdGJpVXlNRzlt SlRJd2RHaGxKVEl3WVhOemIyTnBZWFJsWkNVeU1HdGxlWGR2Y21RdUpUSXlKVEpESlRJeWJXRnlh M01sTWpJbE0wRWxOVUlsTlVRbE4wUWxOVVFsTjBRbE5VUWxOMFFsTlVRbE4wUT0iPndoaWxlCiAg ICAgICAgKCAoIENvZGUgPT0gTUVFVFNfU1RBTkRBUkQpPGJyPgogICAgICAgICZuYnNwOyAmYW1w OyZhbXA7ICggQ29kZSA9PSBGVU5DVElPTkFMKSk8YnI+CiAgICAgICAgezxicj4KICAgICAgICAm bmJzcDsgU2hpcEl0KCk7PGJyPgogICAgICAgIH08L3NwYW4+PGJyPgogICAgPC9wPgogICAgPHA+ JnF1b3Q7PGJyPgogICAgPC9wPgogICAgPHA+SG93ZXZlciwgSSdtIE9LIHRvIGNoYW5nZSBpdCBh cyB5b3VyIHN1Z2dlc3Rpb24uPGJyPgogICAgPC9wPgogICAgPHA+PGJyPgogICAgPC9wPgogICAg PHA+VGhhbmtzLDwvcD4KICAgIDxwPk5oaTxicj4KICAgIDwvcD4KICAgIDxibG9ja3F1b3RlIHR5 cGU9ImNpdGUiIGNpdGU9Im1pZDoyMDIxMDYwNDIzMDQxMC5zN3Z1YXJ4aXIyZnFrcXR3QGxldmlh dGhhbiI+CiAgICAgIDxwcmUgY2xhc3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+Cgo8L3ByZT4K ICAgICAgPGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSI+CiAgICAgICAgPHByZSBjbGFzcz0ibW96LXF1 b3RlLXByZSIgd3JhcD0iIj4rCisgIGlmIChEb29yYmVsbCAmZ3Q7PSBTTXByb0Rvb3JiZWxsQ2hh bm5lbDApIHsKKyAgICBEb29yYmVsbEFkZHJlc3MgPSBTTVBST19EQnhfQUREUkVTUyAoU29ja2V0 LCAoVUlOVDgpKERvb3JiZWxsIC0gU01wcm9Eb29yYmVsbENoYW5uZWwwKSk7CisgIH0gZWxzZSB7 CisgICAgRG9vcmJlbGxBZGRyZXNzID0gUE1QUk9fREJ4X0FERFJFU1MgKFNvY2tldCwgKFVJTlQ4 KURvb3JiZWxsKTsKKyAgfQorCisgIHJldHVybiBEb29yYmVsbEFkZHJlc3M7Cit9CisKKy8qKgor ICBHZXQgdGhlIGludGVycnVwdCBudW1iZXIgb2YgYSBkb29yYmVsbC4KKworICBAcGFyYW1baW5d ICBTb2NrZXQgICAgICAgICAgICBBY3RpdmUgc29ja2V0IGluZGV4LgorICBAcGFyYW1baW5dICBE b29yYmVsbCAgICAgICAgICBEb29yYmVsbCBjaGFubmVsIGZvciBjb21tdW5pY2F0aW9uIHdpdGgg dGhlIFNNcHJvL1BNcHJvLgorCisgIEByZXR2YWwgVUlOVDMyICAgICAgICAgICAgICAgIFRoZSBp bnRlcnJ1cHQgbnVtYmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmV0 dXJuZWQgdmFsdWUgaXMgMCBpbmRpY2F0ZSB0aGF0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBp bnZhbGlkLgorCisqKi8KK1VJTlQzMgorRUZJQVBJCitNYWlsYm94R2V0RG9vcmJlbGxJbnRlcnJ1 cHROdW1iZXIgKAorICBJTiBVSU5UOCAgICAgICAgICAgICBTb2NrZXQsCisgIElOIERPT1JCRUxM X0NIQU5ORUxTIERvb3JiZWxsCisgICkKK3sKKyAgVUlOVDMyIERvb3JiZWxsSW50ZXJydXB0TnVt YmVyOworCisgIGlmIChTb2NrZXQgJmd0Oz0gR2V0TnVtYmVyT2ZBY3RpdmVTb2NrZXRzICgpCisg ICAgICB8fCBEb29yYmVsbCAmZ3Q7PSBOVU1CRVJfT0ZfRE9PUkJFTExTX1BFUl9TT0NLRVQpCisg IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIERvb3JiZWxsSW50ZXJydXB0TnVtYmVyID0gMDsK KworICBpZiAoU29ja2V0ICZndDsgMCkgeworICAgIERvb3JiZWxsSW50ZXJydXB0TnVtYmVyID0g U0xBVkVfU09DS0VUX0RPT1JCRUxMX0lOVEVSUlVQVF9CQVNFIChTb2NrZXQpOworICB9CisKKyAg aWYgKERvb3JiZWxsICZndDs9IFNNcHJvRG9vcmJlbGxDaGFubmVsMCkgeworICAgIERvb3JiZWxs SW50ZXJydXB0TnVtYmVyICs9IFNNUFJPX0RCMF9JUlFfT0ZTVCArIChVSU5UOCkoRG9vcmJlbGwg LSBTTXByb0Rvb3JiZWxsQ2hhbm5lbDApOworICB9IGVsc2UgeworICAgIERvb3JiZWxsSW50ZXJy dXB0TnVtYmVyICs9IFBNUFJPX0RCMF9JUlFfT0ZTVCArIChVSU5UOClEb29yYmVsbDsKKyAgfQor CisgIHJldHVybiBEb29yYmVsbEludGVycnVwdE51bWJlcjsKK30KKworLyoqCisgIFJlYWQgYSBt ZXNzYWdlIHZpYSB0aGUgaGFyZHdhcmUgRG9vcmJlbGwgaW50ZXJmYWNlLgorCisgIEBwYXJhbVtp bl0gIFNvY2tldCAgICAgICAgICAgIEFjdGl2ZSBzb2NrZXQgaW5kZXguCisgIEBwYXJhbVtpbl0g IERvb3JiZWxsICAgICAgICAgIERvb3JiZWxsIGNoYW5uZWwgZm9yIGNvbW11bmljYXRpb24gd2l0 aCB0aGUgU01wcm8vUE1wcm8uCisgIEBwYXJhbVtvdXRdIE1lc3NhZ2UgICAgICAgICAgIFBvaW50 ZXIgdG8gdGhlIE1haWxib3ggbWVzc2FnZS4KKworICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAg ICAgICBSZWFkIHRoZSBtZXNzYWdlIHN1Y2Nlc3NmdWxseS4KKyAgQHJldHZhbCBFRklfVElNRU9V VCAgICAgICAgICAgVGltZW91dCBvY2N1cnJlZCB3aGVuIHdhaXRpbmcgZm9yIGF2YWlsYWJsZSBt ZXNzYWdlIGluIHRoZSBtYWlsYm94LgorICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBB IHBhcmFtZXRlciBpcyBpbnZhbGlkLgorKiovCitFRklfU1RBVFVTCitFRklBUEkKK01haWxib3hS ZWFkICgKKyAgSU4gIFVJTlQ4ICAgICAgICAgICAgICAgIFNvY2tldCwKKyAgSU4gIERPT1JCRUxM X0NIQU5ORUxTICAgIERvb3JiZWxsLAorICBPVVQgTUFJTEJPWF9NRVNTQUdFX0RBVEEgKk1lc3Nh Z2UKKyAgKQoreworICBVSU5UTiBUaW1lb3V0Q291bnQ7CisgIFVJTlROIERvb3JiZWxsQWRkcmVz czsKKworICBpZiAoU29ja2V0ICZndDs9IEdldE51bWJlck9mQWN0aXZlU29ja2V0cyAoKQorICAg ICAgfHwgRG9vcmJlbGwgJmd0Oz0gTlVNQkVSX09GX0RPT1JCRUxMU19QRVJfU09DS0VUCisgICAg ICB8fCBNZXNzYWdlID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gRUZJX0lOVkFMSURfUEFSQU1F VEVSOworICB9CisKKyAgVGltZW91dENvdW50ID0gTUFJTEJPWF9QT0xMX0NPVU5UOworCisgIERv b3JiZWxsQWRkcmVzcyA9IE1haWxib3hHZXREb29yYmVsbEFkZHJlc3MgKFNvY2tldCwgRG9vcmJl bGwpOworICBBU1NFUlQgKERvb3JiZWxsQWRkcmVzcyAhPSAwKTsKKworICAvLworICAvLyBQb2xs aW5nIERvb3JiZWxsIHN0YXR1cworICAvLworICB3aGlsZSAoKE1taW9SZWFkMzIgKChEb29yYmVs bEFkZHJlc3MgKyBEQl9TVEFUVVNfUkVHX09GU1QpKSAmYW1wOyBEQl9TVEFUVVNfQVZBSUxfQklU KSA9PSAwKSB7CisgICAgTWljcm9TZWNvbmREZWxheSAoTUFJTEJPWF9QT0xMX0lOVEVSVkFMX1VT KTsKKyAgICBpZiAoLS1UaW1lb3V0Q291bnQgPT0gMCkgeworICAgICAgcmV0dXJuIEVGSV9USU1F T1VUOworICAgIH0KKyAgfQorCisgIE1lc3NhZ2UtJmd0O0V4dGVuZGVkRGF0YVswXSA9IE1taW9S ZWFkMzIgKERvb3JiZWxsQWRkcmVzcyArIERCX0RJTjBfUkVHX09GU1QpOworICBNZXNzYWdlLSZn dDtFeHRlbmRlZERhdGFbMV0gPSBNbWlvUmVhZDMyIChEb29yYmVsbEFkZHJlc3MgKyBEQl9ESU4x X1JFR19PRlNUKTsKKyAgTWVzc2FnZS0mZ3Q7RGF0YSA9IE1taW9SZWFkMzIgKERvb3JiZWxsQWRk cmVzcyArIERCX0lOX1JFR19PRlNUKTsKKworICAvLworICAvLyBXcml0ZSAxIHRvIGNsZWFyIHRo ZSBBVkFJTCBzdGF0dXMKKyAgLy8KKyAgTW1pb1dyaXRlMzIgKERvb3JiZWxsQWRkcmVzcyArIERC X1NUQVRVU19SRUdfT0ZTVCwgREJfU1RBVFVTX0FWQUlMX0JJVCk7CisKKyAgcmV0dXJuIEVGSV9T VUNDRVNTOworfQorCisvKioKKyAgV3JpdGUgYSBtZXNzYWdlIHZpYSB0aGUgaGFyZHdhcmUgRG9v cmJlbGwgaW50ZXJmYWNlLgorCisgIEBwYXJhbVtpbl0gIFNvY2tldCAgICAgICAgICAgIEFjdGl2 ZSBzb2NrZXQgaW5kZXguCisgIEBwYXJhbVtpbl0gIERvb3JiZWxsICAgICAgICAgIERvb3JiZWwg Y2hhbm5lbCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBTTXByby9QTXByby4KKyAgQHBhcmFt W2luXSAgTWVzc2FnZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgTWFpbGJveCBtZXNzYWdlLgor CisgIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFdyaXRlIHRoZSBtZXNzYWdlIHN1Y2Nl c3NmdWxseS4KKyAgQHJldHZhbCBFRklfVElNRU9VVCAgICAgICAgICAgVGltZW91dCBvY2N1cnJl ZCB3aGVuIHdhaXRpbmcgZm9yIGFja25vd2xlZGdlIHNpZ25hbCBmcm9tIHRoZSBtYWlsYm94Lgor ICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBBIHBhcmFtZXRlciBpcyBpbnZhbGlkLgor KiovCitFRklfU1RBVFVTCitFRklBUEkKK01haWxib3hXcml0ZSAoCisgIElOIFVJTlQ4ICAgICAg ICAgICAgICAgIFNvY2tldCwKKyAgSU4gRE9PUkJFTExfQ0hBTk5FTFMgICAgRG9vcmJlbGwsCisg IElOIE1BSUxCT1hfTUVTU0FHRV9EQVRBICpNZXNzYWdlCisgICkKK3sKKyAgVUlOVE4gVGltZW91 dENvdW50OworICBVSU5UTiBEb29yYmVsbEFkZHJlc3M7CisKKyAgaWYgKFNvY2tldCAmZ3Q7PSBH ZXROdW1iZXJPZkFjdGl2ZVNvY2tldHMgKCkKKyAgICAgIHx8IERvb3JiZWxsICZndDs9IE5VTUJF Ul9PRl9ET09SQkVMTFNfUEVSX1NPQ0tFVAorICAgICAgfHwgTWVzc2FnZSA9PSBOVUxMKQorICB7 CisgICAgcmV0dXJuIEVGSV9JTlZBTElEX1BBUkFNRVRFUjsKKyAgfQorCisgIFRpbWVvdXRDb3Vu dCA9IE1BSUxCT1hfUE9MTF9DT1VOVDsKKworICBEb29yYmVsbEFkZHJlc3MgPSBNYWlsYm94R2V0 RG9vcmJlbGxBZGRyZXNzIChTb2NrZXQsIERvb3JiZWxsKTsKKyAgQVNTRVJUIChEb29yYmVsbEFk ZHJlc3MgIT0gMCk7CisKKyAgLy8KKyAgLy8gQ2xlYXIgcHJldmlvdXMgcGVuZGluZyBhY2sgaWYg YW55CisgIC8vCisgIGlmICgoTW1pb1JlYWQzMiAoRG9vcmJlbGxBZGRyZXNzICsgREJfU1RBVFVT X1JFR19PRlNUKSAmYW1wOyBEQl9TVEFUVVNfQUNLX0JJVCkgIT0gMCkgeworICAgIE1taW9Xcml0 ZTMyIChEb29yYmVsbEFkZHJlc3MgKyBEQl9TVEFUVVNfUkVHX09GU1QsIERCX1NUQVRVU19BQ0tf QklUKTsKKyAgfQorCisgIC8vCisgIC8vIFNlbmQgbWVzc2FnZQorICAvLworICBNbWlvV3JpdGUz MiAoRG9vcmJlbGxBZGRyZXNzICsgREJfRE9VVDBfUkVHX09GU1QsIE1lc3NhZ2UtJmd0O0V4dGVu ZGVkRGF0YVswXSk7CisgIE1taW9Xcml0ZTMyIChEb29yYmVsbEFkZHJlc3MgKyBEQl9ET1VUMV9S RUdfT0ZTVCwgTWVzc2FnZS0mZ3Q7RXh0ZW5kZWREYXRhWzFdKTsKKyAgTW1pb1dyaXRlMzIgKERv b3JiZWxsQWRkcmVzcyArIERCX09VVF9SRUdfT0ZTVCwgTWVzc2FnZS0mZ3Q7RGF0YSk7CisKKyAg Ly8KKyAgLy8gV2FpdCBmb3IgQUNLCisgIC8vCisgIHdoaWxlICgoTW1pb1JlYWQzMiAoRG9vcmJl bGxBZGRyZXNzICsgREJfU1RBVFVTX1JFR19PRlNUKSAmYW1wOyBEQl9TVEFUVVNfQUNLX0JJVCkg PT0gMCkgeworICAgIE1pY3JvU2Vjb25kRGVsYXkgKE1BSUxCT1hfUE9MTF9JTlRFUlZBTF9VUyk7 CisgICAgaWYgKC0tVGltZW91dENvdW50ID09IDApIHsKKyAgICAgIHJldHVybiBFRklfVElNRU9V VDsKKyAgICB9CisgIH0KKworICAvLworICAvLyBXcml0ZSAxIHRvIGNsZWFyIHRoZSBBQ0sgc3Rh dHVzCisgIC8vCisgIE1taW9Xcml0ZTMyIChEb29yYmVsbEFkZHJlc3MgKyBEQl9TVEFUVVNfUkVH X09GU1QsIERCX1NUQVRVU19BQ0tfQklUKTsKKworICByZXR1cm4gRUZJX1NVQ0NFU1M7Cit9CisK Ky8qKgorICBVbm1hc2sgdGhlIERvb3JiZWxsIGludGVycnVwdCBzdGF0dXMuCisKKyAgQHBhcmFt ICBTb2NrZXQgICAgQWN0aXZlIHNvY2tldCBpbmRleC4KKyAgQHBhcmFtICBEb29yYmVsbCAgRG9v cmJlbCBjaGFubmVsIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIFNNcHJvL1BNcHJvLgorCisg IEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgICBVbm1hc2sgdGhlIERvb3JiZWxsIGludGVy cnVwdCBzdWNjZXNzZnVsbHkuCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSICBBIHBh cmFtZXRlciBpcyBpbnZhbGlkLgorCisqKi8KK0VGSV9TVEFUVVMKK0VGSUFQSQorTWFpbGJveFVu bWFza0ludGVycnVwdCAoCisgIElOIFVJTlQ4ICBTb2NrZXQsCisgIElOIFVJTlQxNiBEb29yYmVs bAorICApCit7CisgIFVJTlROIERvb3JiZWxsQWRkcmVzczsKKworICBpZiAoU29ja2V0ICZndDs9 IEdldE51bWJlck9mQWN0aXZlU29ja2V0cyAoKQorICAgICAgfHwgRG9vcmJlbGwgJmd0Oz0gTlVN QkVSX09GX0RPT1JCRUxMU19QRVJfU09DS0VUKQorICB7CisgICAgcmV0dXJuIEVGSV9JTlZBTElE X1BBUkFNRVRFUjsKKyAgfQorCisgIERvb3JiZWxsQWRkcmVzcyA9IE1haWxib3hHZXREb29yYmVs bEFkZHJlc3MgKFNvY2tldCwgRG9vcmJlbGwpOworICBBU1NFUlQgKERvb3JiZWxsQWRkcmVzcyAh PSAwKTsKKworICBNbWlvV3JpdGUzMiAoRG9vcmJlbGxBZGRyZXNzICsgREJfU1RBVFVTX01BU0tf UkVHX09GU1QsIH5EQl9TVEFUVVNfQVZBSUxfQklUKTsKKworICByZXR1cm4gRUZJX1NVQ0NFU1M7 Cit9CjwvcHJlPgogICAgICA8L2Jsb2NrcXVvdGU+CiAgICAgIDxwcmUgY2xhc3M9Im1vei1xdW90 ZS1wcmUiIHdyYXA9IiI+Cgo8L3ByZT4KICAgICAgPGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSI+CiAg ICAgICAgPHByZSBjbGFzcz0ibW96LXF1b3RlLXByZSIgd3JhcD0iIj5kaWZmIC0tZ2l0IGEvU2ls aWNvbi9BbXBlcmUvQW1wZXJlQWx0cmFQa2cvTGlicmFyeS9NbUNvbW11bmljYXRpb25MaWIvTW1D b21tdW5pY2F0aW9uTGliLmMgYi9TaWxpY29uL0FtcGVyZS9BbXBlcmVBbHRyYVBrZy9MaWJyYXJ5 L01tQ29tbXVuaWNhdGlvbkxpYi9NbUNvbW11bmljYXRpb25MaWIuYwpuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmJmNDAwZWMwYTgzNQotLS0gL2Rldi9udWxsCisrKyBi L1NpbGljb24vQW1wZXJlL0FtcGVyZUFsdHJhUGtnL0xpYnJhcnkvTW1Db21tdW5pY2F0aW9uTGli L01tQ29tbXVuaWNhdGlvbkxpYi5jCkBAIC0wLDAgKzEsMTg0IEBACisvKiogQGZpbGUKKworICBD b3B5cmlnaHQgKGMpIDIwMjAgLSAyMDIxLCBBbXBlcmUgQ29tcHV0aW5nIExMQy4gQWxsIHJpZ2h0 cyByZXNlcnZlZC4mbHQ7QlImZ3Q7CisKKyAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0y LUNsYXVzZS1QYXRlbnQKKworKiovCisKKyNpbmNsdWRlICZsdDtJbmR1c3RyeVN0YW5kYXJkL0Fy bVN0ZFNtYy5oJmd0OworI2luY2x1ZGUgJmx0O0xpYnJhcnkvQXJtTGliLmgmZ3Q7CisjaW5jbHVk ZSAmbHQ7TGlicmFyeS9Bcm1TbWNMaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJyYXJ5L0Jhc2VN ZW1vcnlMaWIuaCZndDsKKyNpbmNsdWRlICZsdDtMaWJyYXJ5L0RlYnVnTGliLmgmZ3Q7CisjaW5j bHVkZSAmbHQ7TGlicmFyeS9NbUNvbW11bmljYXRpb25MaWIuaCZndDsKKyNpbmNsdWRlICZsdDtM aWJyYXJ5L1BjZExpYi5oJmd0OworI2luY2x1ZGUgJmx0O1Byb3RvY29sL01tQ29tbXVuaWNhdGlv bi5oJmd0OworCisvLworLy8gQWRkcmVzcywgTGVuZ3RoIG9mIHRoZSBwcmUtYWxsb2NhdGVkIGJ1 ZmZlciBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBzZWN1cmUKKy8vIHdvcmxkLgorLy8KK1NU QVRJQyBBUk1fTUVNT1JZX1JFR0lPTl9ERVNDUklQVE9SIG1Oc0NvbW1CdWZmTWVtUmVnaW9uOwor CitFRklfU1RBVFVTCitFRklBUEkKK01tQ29tbXVuaWNhdGlvbkxpYkNvbnN0cnVjdG9yICgKKyAg Vk9JRAorICApCit7CisgIG1Oc0NvbW1CdWZmTWVtUmVnaW9uLlBoeXNpY2FsQmFzZSA9IFBjZEdl dDY0IChQY2RNbUJ1ZmZlckJhc2UpOworICAvLyBEdXJpbmcgYm9vdCAsIFZpcnR1YWwgYW5kIFBo eXNpY2FsIGFyZSBzYW1lCjwvcHJlPgogICAgICA8L2Jsb2NrcXVvdGU+CiAgICAgIDxwcmUgY2xh c3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+CklkZWFsbHksIHVzZSBVRUZJLWRlZmluZWQgdGVy bXMuICZxdW90O0R1cmluZyBib290JnF1b3Q7IGlzIHF1aXRlIGFtYmlndW91cy4KCgo8L3ByZT4K ICAgICAgPGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSI+CiAgICAgICAgPHByZSBjbGFzcz0ibW96LXF1 b3RlLXByZSIgd3JhcD0iIj4rICBtTnNDb21tQnVmZk1lbVJlZ2lvbi5WaXJ0dWFsQmFzZSA9IG1O c0NvbW1CdWZmTWVtUmVnaW9uLlBoeXNpY2FsQmFzZTsKKyAgbU5zQ29tbUJ1ZmZNZW1SZWdpb24u TGVuZ3RoID0gUGNkR2V0NjQgKFBjZE1tQnVmZmVyU2l6ZSk7CisKKyAgcmV0dXJuIEVGSV9TVUND RVNTOworfQorCisvKioKKyAgQ29tbXVuaWNhdGVzIHdpdGggYSByZWdpc3RlcmVkIGhhbmRsZXIu CisKKyAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gc2VuZCBhbmQgcmVj ZWl2ZSBtZXNzYWdlcyB0byB0aGUKKyAgU3RhbmRhbG9uZSBNTSBlbnZpcm9ubWVudCBpbiBVRUZJ IFBFSSBwaGFzZS4KKworICBAcGFyYW1baW4sIG91dF0gQ29tbUJ1ZmZlciAgICAgICAgICBBIHBv aW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBjb252ZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgaW50byBNTVJBTS4KKyAgQHBhcmFtW2luLCBvdXRdIENvbW1TaXplICAgICAg ICAgICAgVGhlIHNpemUgb2YgdGhlIGRhdGEgYnVmZmVyIGJlaW5nCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCBpbi4gVGhpcyBpcyBvcHRpb25hbC4KKworICBA cmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICAgICAgICBUaGUgbWVzc2FnZSB3YXMgc3VjY2Vz c2Z1bGx5IHBvc3RlZC4KKyAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgICAgICAgVGhl IENvbW1CdWZmZXIgd2FzIE5VTEwuCisgIEByZXR2YWwgRUZJX0JBRF9CVUZGRVJfU0laRSAgICAg ICAgIFRoZSBidWZmZXIgc2l6ZSBpcyBpbmNvcnJlY3QgZm9yIHRoZSBNTQorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbi4gSWYgdGhpcyBlcnJvciBp cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCwgdGhlIE1l c3NhZ2VMZW5ndGggZmllbGQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgdGhlIENvbW1CdWZmZXIgaGVhZGVyIG9yIHRoZSBpbnRlZ2VyCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgQ29tbVNpemUgYXJlIHVwZGF0ZWQgdG8g cmVmbGVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWF4aW11 bSBwYXlsb2FkIHNpemUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGltcGxlbWVudGF0aW9uIGNhbiBhY2NvbW1vZGF0ZS4KKyAgQHJldHZhbCBFRklfQUNDRVNTX0RF TklFRCAgICAgICAgICAgVGhlIENvbW11bmljYXRlQnVmZmVyIHBhcmFtZXRlcgorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBDb21tU2l6ZSBwYXJhbWV0ZXIsIGlmIG5v dCBvbWl0dGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgaW4g YWRkcmVzcyByYW5nZSB0aGF0IGNhbm5vdCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBhY2Nlc3NlZCBieSB0aGUgTU0gZW52aXJvbm1lbnQKKyoqLworRUZJX1NUQVRV UworRUZJQVBJCitNbUNvbW11bmljYXRpb25Db21tdW5pY2F0ZSAoCisgIElOIE9VVCBWT0lEICAq Q29tbUJ1ZmZlciwKKyAgSU4gT1VUIFVJTlROICpDb21tU2l6ZSBPUFRJT05BTAorICApCit7Cisg IEVGSV9NTV9DT01NVU5JQ0FURV9IRUFERVIgKkNvbW11bmljYXRlSGVhZGVyOworICBBUk1fU01D X0FSR1MgICAgICAgICAgICAgIENvbW11bmljYXRlU21jQXJnczsKKyAgRUZJX1NUQVRVUyAgICAg ICAgICAgICAgICBTdGF0dXM7CisgIFVJTlROICAgICAgICAgICAgICAgICAgICAgQnVmZmVyU2l6 ZTsKKworICBTdGF0dXMgPSBFRklfQUNDRVNTX0RFTklFRDsKKyAgQnVmZmVyU2l6ZSA9IDA7CisK KyAgWmVyb01lbSAoJmFtcDtDb21tdW5pY2F0ZVNtY0FyZ3MsIHNpemVvZiAoQVJNX1NNQ19BUkdT KSk7CisKKyAgLy8KKyAgLy8gQ2hlY2sgcGFyYW1ldGVycworICAvLworICBpZiAoQ29tbUJ1ZmZl ciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEVGSV9JTlZBTElEX1BBUkFNRVRFUjsKKyAgfQorCisg IENvbW11bmljYXRlSGVhZGVyID0gQ29tbUJ1ZmZlcjsKKyAgLy8gQ29tbUJ1ZmZlciBpcyBhIG1h bmRhdG9yeSBwYXJhbWV0ZXIuIEhlbmNlLCBSZWx5IG9uCisgIC8vIE1lc3NhZ2VMZW5ndGggKyBI ZWFkZXIgdG8gYXNjZXJ0YWluIHRoZQorICAvLyB0b3RhbCBzaXplIG9mIHRoZSBjb21tdW5pY2F0 aW9uIHBheWxvYWQgcmF0aGVyIHRoYW4KKyAgLy8gcmVseSBvbiBvcHRpb25hbCBDb21tU2l6ZSBw YXJhbWV0ZXIKKyAgQnVmZmVyU2l6ZSA9IENvbW11bmljYXRlSGVhZGVyLSZndDtNZXNzYWdlTGVu Z3RoICsKKyAgICAgICAgICAgICAgIHNpemVvZiAoQ29tbXVuaWNhdGVIZWFkZXItJmd0O0hlYWRl ckd1aWQpICsKKyAgICAgICAgICAgICAgIHNpemVvZiAoQ29tbXVuaWNhdGVIZWFkZXItJmd0O01l c3NhZ2VMZW5ndGgpOworCisgIC8vIElmIHRoZSBsZW5ndGggb2YgdGhlIENvbW1CdWZmZXIgaXMg MCB0aGVuIHJldHVybiB0aGUgZXhwZWN0ZWQgbGVuZ3RoLgorICBpZiAoQ29tbVNpemUgIT0gTlVM TCkgeworICAgIC8vIFRoaXMgY2FzZSBjYW4gYmUgdXNlZCBieSB0aGUgY29uc3VtZXIgb2YgdGhp cyBkcml2ZXIgdG8gZmluZCBvdXQgdGhlCisgICAgLy8gbWF4IHNpemUgdGhhdCBjYW4gYmUgdXNl ZCBmb3IgYWxsb2NhdGluZyBDb21tQnVmZmVyLgorICAgIGlmICgoKkNvbW1TaXplID09IDApIHx8 CisgICAgICAgICgqQ29tbVNpemUgJmd0OyBtTnNDb21tQnVmZk1lbVJlZ2lvbi5MZW5ndGgpKQor ICAgIHsKPC9wcmU+CiAgICAgIDwvYmxvY2txdW90ZT4KICAgICAgPHByZSBjbGFzcz0ibW96LXF1 b3RlLXByZSIgd3JhcD0iIj4KeyBhdCBlbmQgb2YgcHJlY2VkaW5nIGxpbmUuClBsZWFzZSBhZGRy ZXNzIHRocm91Z2hvdXQgdGhpcyBmaWxlLgoKPC9wcmU+CiAgICAgIDxibG9ja3F1b3RlIHR5cGU9 ImNpdGUiPgogICAgICAgIDxwcmUgY2xhc3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+KyAgICAg ICpDb21tU2l6ZSA9IG1Oc0NvbW1CdWZmTWVtUmVnaW9uLkxlbmd0aDsKKyAgICAgIHJldHVybiBF RklfQkFEX0JVRkZFUl9TSVpFOworICAgIH0KKyAgICAvLworICAgIC8vIENvbW1TaXplIG11c3Qg bWF0Y2ggTWVzc2FnZUxlbmd0aCArIHNpemVvZiAoRUZJX01NX0NPTU1VTklDQVRFX0hFQURFUik7 CisgICAgLy8KKyAgICBpZiAoKkNvbW1TaXplICE9IEJ1ZmZlclNpemUpIHsKKyAgICAgIHJldHVy biBFRklfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICB9CisKKyAgLy8KKyAgLy8gSWYgdGhl IGJ1ZmZlciBzaXplIGlzIDAgb3IgZ3JlYXRlciB0aGFuIHdoYXQgY2FuIGJlIHRvbGVyYXRlZCBi eSB0aGUgTU0KKyAgLy8gZW52aXJvbm1lbnQgdGhlbiByZXR1cm4gdGhlIGV4cGVjdGVkIHNpemUu CisgIC8vCisgIGlmICgoQnVmZmVyU2l6ZSA9PSAwKSB8fAorICAgICAgKEJ1ZmZlclNpemUgJmd0 OyBtTnNDb21tQnVmZk1lbVJlZ2lvbi5MZW5ndGgpKQorICB7CisgICAgQ29tbXVuaWNhdGVIZWFk ZXItJmd0O01lc3NhZ2VMZW5ndGggPSBtTnNDb21tQnVmZk1lbVJlZ2lvbi5MZW5ndGggLQorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChDb21tdW5pY2F0ZUhl YWRlci0mZ3Q7SGVhZGVyR3VpZCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgc2l6ZW9mIChDb21tdW5pY2F0ZUhlYWRlci0mZ3Q7TWVzc2FnZUxlbmd0aCk7CisgICAg cmV0dXJuIEVGSV9CQURfQlVGRkVSX1NJWkU7CisgIH0KKworICAvLyBTTUMgRnVuY3Rpb24gSUQK KyAgQ29tbXVuaWNhdGVTbWNBcmdzLkFyZzAgPSBBUk1fU01DX0lEX01NX0NPTU1VTklDQVRFX0FB UkNINjQ7CisKKyAgLy8gQ29va2llCisgIENvbW11bmljYXRlU21jQXJncy5BcmcxID0gMDsKKwor ICAvLyBDb3B5IENvbW11bmljYXRpb24gUGF5bG9hZAorICBDb3B5TWVtICgoVk9JRCAqKW1Oc0Nv bW1CdWZmTWVtUmVnaW9uLlZpcnR1YWxCYXNlLCBDb21tQnVmZmVyLCBCdWZmZXJTaXplKTsKKwor ICAvLyBjb21tX2J1ZmZlcl9hZGRyZXNzICg2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcykKKyAgQ29t bXVuaWNhdGVTbWNBcmdzLkFyZzIgPSAoVUlOVE4pbU5zQ29tbUJ1ZmZNZW1SZWdpb24uUGh5c2lj YWxCYXNlOworCisgIC8vIGNvbW1fc2l6ZV9hZGRyZXNzIChub3QgdXNlZCwgaW5kaWNhdGVkIGJ5 IHNldHRpbmcgdG8gemVybykKKyAgQ29tbXVuaWNhdGVTbWNBcmdzLkFyZzMgPSAwOworCisgIC8v IENhbGwgdGhlIFN0YW5kYWxvbmUgTU0gZW52aXJvbm1lbnQuCisgIEFybUNhbGxTbWMgKCZhbXA7 Q29tbXVuaWNhdGVTbWNBcmdzKTsKKworICBzd2l0Y2ggKENvbW11bmljYXRlU21jQXJncy5Bcmcw KSB7CisgIGNhc2UgQVJNX1NNQ19NTV9SRVRfU1VDQ0VTUzoKKyAgICBaZXJvTWVtIChDb21tQnVm ZmVyLCBCdWZmZXJTaXplKTsKKyAgICAvLyBPbiBzdWNjZXNzZnVsIHJldHVybiwgdGhlIHNpemUg b2YgZGF0YSBiZWluZyByZXR1cm5lZCBpcyBpbmZlcnJlZCBmcm9tCisgICAgLy8gTWVzc2FnZUxl bmd0aCArIEhlYWRlci4KKyAgICBDb21tdW5pY2F0ZUhlYWRlciA9IChFRklfTU1fQ09NTVVOSUNB VEVfSEVBREVSICopbU5zQ29tbUJ1ZmZNZW1SZWdpb24uVmlydHVhbEJhc2U7CisgICAgQnVmZmVy U2l6ZSA9IENvbW11bmljYXRlSGVhZGVyLSZndDtNZXNzYWdlTGVuZ3RoICsKKyAgICAgICAgICAg ICAgICAgc2l6ZW9mIChDb21tdW5pY2F0ZUhlYWRlci0mZ3Q7SGVhZGVyR3VpZCkgKworICAgICAg ICAgICAgICAgICBzaXplb2YgKENvbW11bmljYXRlSGVhZGVyLSZndDtNZXNzYWdlTGVuZ3RoKTsK KworICAgIENvcHlNZW0gKAorICAgICAgQ29tbUJ1ZmZlciwKKyAgICAgIChWT0lEICopbU5zQ29t bUJ1ZmZNZW1SZWdpb24uVmlydHVhbEJhc2UsCisgICAgICBCdWZmZXJTaXplCisgICAgICApOwor ICAgIFN0YXR1cyA9IEVGSV9TVUNDRVNTOworICAgIGJyZWFrOworCisgIGNhc2UgQVJNX1NNQ19N TV9SRVRfSU5WQUxJRF9QQVJBTVM6CisgICAgU3RhdHVzID0gRUZJX0lOVkFMSURfUEFSQU1FVEVS OworICAgIGJyZWFrOworCisgIGNhc2UgQVJNX1NNQ19NTV9SRVRfREVOSUVEOgorICAgIFN0YXR1 cyA9IEVGSV9BQ0NFU1NfREVOSUVEOworICAgIGJyZWFrOworCisgIGNhc2UgQVJNX1NNQ19NTV9S RVRfTk9fTUVNT1JZOgorICAgIC8vIFVuZXhwZWN0ZWQgZXJyb3Igc2luY2UgdGhlIENvbW1TaXpl IHdhcyBjaGVja2VkIGZvciB6ZXJvIGxlbmd0aAorICAgIC8vIHByaW9yIHRvIGlzc3VpbmcgdGhl IFNNQworICAgIFN0YXR1cyA9IEVGSV9PVVRfT0ZfUkVTT1VSQ0VTOworICAgIEFTU0VSVCAoMCk7 CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICBTdGF0dXMgPSBFRklfQUNDRVNTX0RFTklF RDsKKyAgICBBU1NFUlQgKDApOworICB9CisKKyAgcmV0dXJuIFN0YXR1czsKK30KPC9wcmU+CiAg ICAgIDwvYmxvY2txdW90ZT4KICAgICAgPHByZSBjbGFzcz0ibW96LXF1b3RlLXByZSIgd3JhcD0i Ij4KPC9wcmU+CiAgICAgIDxibG9ja3F1b3RlIHR5cGU9ImNpdGUiPgogICAgICAgIDxwcmUgY2xh c3M9Im1vei1xdW90ZS1wcmUiIHdyYXA9IiI+ZGlmZiAtLWdpdCBhL1BsYXRmb3JtL0FtcGVyZS9K YWRlUGtnL0phZGVCb2FyZFNldHRpbmcuY2ZnIGIvUGxhdGZvcm0vQW1wZXJlL0phZGVQa2cvSmFk ZUJvYXJkU2V0dGluZy5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw Li41YTY3ZThmYzZhNzUKLS0tIC9kZXYvbnVsbAorKysgYi9QbGF0Zm9ybS9BbXBlcmUvSmFkZVBr Zy9KYWRlQm9hcmRTZXR0aW5nLmNmZwpAQCAtMCwwICsxLDIwOSBAQAorIyBTYW1wbGUgYm9hcmQg c2V0dGluZworIworIyBUaGlzIGlzIGEgc2FtcGxlIGJvYXJkIHNldHRpbmcgYXMgdXNlZCBmb3Ig dGhlCisjIEFtcGVyZSBBbHRyYSByZWZlcmVuY2UgZGVzaWduLgo8L3ByZT4KICAgICAgPC9ibG9j a3F1b3RlPgogICAgICA8cHJlIGNsYXNzPSJtb3otcXVvdGUtcHJlIiB3cmFwPSIiPgpXaGF0IGlz IGEgYm9hcmQgc2V0dGluZz8KCjwvcHJlPgogICAgICA8YmxvY2txdW90ZSB0eXBlPSJjaXRlIj4K ICAgICAgICA8cHJlIGNsYXNzPSJtb3otcXVvdGUtcHJlIiB3cmFwPSIiPisjCisjIE5hbWUsIG9m ZnNldCAoaGV4KSwgdmFsdWUKKyMgdmFsdWUgY2FuIGJlIGhleCBvciBkZWNpbWFsCisjCisKK05W X1NJX1JPX0JPQVJEX1ZFTkRPUiwgMHgwMDAwLCAweDAwMDBDRDNBCitOVl9TSV9ST19CT0FSRF9U WVBFLCAweDAwMDgsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1JFViwgMHgwMDEwLCAweDAw MDAwMDAwCitOVl9TSV9ST19CT0FSRF9DRkcsIDB4MDAxOCwgMHgwMDAwMDAwMAorTlZfU0lfUk9f Qk9BUkRfUzBfRElNTV9BVkFJTCwgMHgwMDIwLCAweDAwMDBGRkZGCitOVl9TSV9ST19CT0FSRF9T MV9ESU1NX0FWQUlMLCAweDAwMjgsIDB4MDAwMEZGRkYKK05WX1NJX1JPX0JPQVJEX1NQSTBDUzBf RlJFUV9LSFosIDB4MDAzMCwgMHgwMDAwODBFOAorTlZfU0lfUk9fQk9BUkRfU1BJMENTMV9GUkVR X0tIWiwgMHgwMDM4LCAweDAwMDA4MEU4CitOVl9TSV9ST19CT0FSRF9TUEkxQ1MwX0ZSRVFfS0ha LCAweDAwNDAsIDB4MDAwMDI3MTAKK05WX1NJX1JPX0JPQVJEX1NQSTFDUzFfRlJFUV9LSFosIDB4 MDA0OCwgMHgwMDAwMjcxMAorTlZfU0lfUk9fQk9BUkRfVFBNX0xPQywgMHgwMDUwLCAweDAwMDAw MDAwCitOVl9TSV9ST19CT0FSRF9JMkMwX0ZSRVFfS0haLCAweDAwNTgsIDB4MDAwMDAxOTAKK05W X1NJX1JPX0JPQVJEX0kyQzFfRlJFUV9LSFosIDB4MDA2MCwgMHgwMDAwMDE5MAorTlZfU0lfUk9f Qk9BUkRfSTJDMl8xMF9GUkVRX0tIWiwgMHgwMDY4LCAweDAwMDAwMTkwCitOVl9TSV9ST19CT0FS RF9JMkMzX0ZSRVFfS0haLCAweDAwNzAsIDB4MDAwMDAxOTAKK05WX1NJX1JPX0JPQVJEX0kyQzlf RlJFUV9LSFosIDB4MDA3OCwgMHgwMDAwMDE5MAorTlZfU0lfUk9fQk9BUkRfMlBfQ0ZHLCAweDAw ODAsIDB4RkZGRkZGMDEKK05WX1NJX1JPX0JPQVJEX1MwX1JDQTBfQ0ZHLCAweDAwODgsIDB4MDAw MDAwMDAKK05WX1NJX1JPX0JPQVJEX1MwX1JDQTFfQ0ZHLCAweDAwOTAsIDB4MDAwMDAwMDAKK05W X1NJX1JPX0JPQVJEX1MwX1JDQTJfQ0ZHLCAweDAwOTgsIDB4MDAwMDAwMDQKK05WX1NJX1JPX0JP QVJEX1MwX1JDQTNfQ0ZHLCAweDAwQTAsIDB4MDAwMDAwMDQKK05WX1NJX1JPX0JPQVJEX1MwX1JD QjBfTE9fQ0ZHLCAweDAwQTgsIDB4MDAwMjAwMDIKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjBfSElf Q0ZHLCAweDAwQjAsIDB4MDAwMjAwMDIKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjFfTE9fQ0ZHLCAw eDAwQjgsIDB4MDAwMjAwMDIKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjFfSElfQ0ZHLCAweDAwQzAs IDB4MDAwMjAwMDIKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjJfTE9fQ0ZHLCAweDAwQzgsIDB4MDAw MjAwMDIKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjJfSElfQ0ZHLCAweDAwRDAsIDB4MDAwMDAwMDMK K05WX1NJX1JPX0JPQVJEX1MwX1JDQjNfTE9fQ0ZHLCAweDAwRDgsIDB4MDAwMDAwMDMKK05WX1NJ X1JPX0JPQVJEX1MwX1JDQjNfSElfQ0ZHLCAweDAwRTAsIDB4MDAwMjAwMDIKK05WX1NJX1JPX0JP QVJEX1MxX1JDQTBfQ0ZHLCAweDAwRTgsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1MxX1JD QTFfQ0ZHLCAweDAwRjAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1MxX1JDQTJfQ0ZHLCAw eDAwRjgsIDB4MDIwMjAyMDIKK05WX1NJX1JPX0JPQVJEX1MxX1JDQTNfQ0ZHLCAweDAxMDAsIDB4 MDAwMzAwMDMKK05WX1NJX1JPX0JPQVJEX1MxX1JDQjBfTE9fQ0ZHLCAweDAxMDgsIDB4MDAwMDAw MDMKK05WX1NJX1JPX0JPQVJEX1MxX1JDQjBfSElfQ0ZHLCAweDAxMTAsIDB4MDAwMjAwMDIKK05W X1NJX1JPX0JPQVJEX1MxX1JDQjFfTE9fQ0ZHLCAweDAxMTgsIDB4MDAwMjAwMDIKK05WX1NJX1JP X0JPQVJEX1MxX1JDQjFfSElfQ0ZHLCAweDAxMjAsIDB4MDAwMDAwMDMKK05WX1NJX1JPX0JPQVJE X1MxX1JDQjJfTE9fQ0ZHLCAweDAxMjgsIDB4MDAwMjAwMDIKK05WX1NJX1JPX0JPQVJEX1MxX1JD QjJfSElfQ0ZHLCAweDAxMzAsIDB4MDAwMjAwMDIKK05WX1NJX1JPX0JPQVJEX1MxX1JDQjNfTE9f Q0ZHLCAweDAxMzgsIDB4MDAwMjAwMDIKK05WX1NJX1JPX0JPQVJEX1MxX1JDQjNfSElfQ0ZHLCAw eDAxNDAsIDB4MDAwMjAwMDIKK05WX1NJX1JPX0JPQVJEX1RfTFRMTV9ERUxUQV9QMCwgMHgwMTQ4 LCAweDAwMDAwMDAxCitOVl9TSV9ST19CT0FSRF9UX0xUTE1fREVMVEFfUDEsIDB4MDE1MCwgMHgw MDAwMDAwMgorTlZfU0lfUk9fQk9BUkRfVF9MVExNX0RFTFRBX1AyLCAweDAxNTgsIDB4MDAwMDAw MDMKK05WX1NJX1JPX0JPQVJEX1RfTFRMTV9ERUxUQV9QMywgMHgwMTYwLCAweDAwMDAwMDA0CitO Vl9TSV9ST19CT0FSRF9UX0xUTE1fREVMVEFfTTEsIDB4MDE2OCwgMHhGRkZGRkZGRgorTlZfU0lf Uk9fQk9BUkRfVF9MVExNX0RFTFRBX00yLCAweDAxNzAsIDB4RkZGRkZGRkUKK05WX1NJX1JPX0JP QVJEX1RfTFRMTV9ERUxUQV9NMywgMHgwMTc4LCAweEZGRkZGRkZECitOVl9TSV9ST19CT0FSRF9Q X0xNX1BJRF9QLCAweDAxODAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1BfTE1fUElEX0ks IDB4MDE4OCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfUF9MTV9QSURfSV9MX1RIT0xELCAw eDAxOTAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1BfTE1fUElEX0lfSF9USE9MRCwgMHgw MTk4LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9QX0xNX1BJRF9ELCAweDAxQTAsIDB4MDAw MDAwMDAKK05WX1NJX1JPX0JPQVJEX1BfTE1fRVhQX1NNT09USF9DT05TVCwgMHgwMUE4LCAweDAw MDAwMDAwCitOVl9TSV9ST19CT0FSRF9UUE1fQUxHX0lELCAweDAxQjAsIDB4MDAwMDAwMDIKK05W X1NJX1JPX0JPQVJEX0REUl9TUEVFRF9HUkFERSwgMHgwMUI4LCAweDAwMDAwQzgwCitOVl9TSV9S T19CT0FSRF9ERFJfUzBfUlRUX1dSLCAweDAxQzAsIDB4MDAwMjAwMDAKK05WX1NJX1JPX0JPQVJE X0REUl9TMV9SVFRfV1IsIDB4MDFDOCwgMHgwMDAyMDAwMAorTlZfU0lfUk9fQk9BUkRfRERSX1Mw X1JUVF9OT00sIDB4MDFEMCwgMHhGRjA2MDE3NworTlZfU0lfUk9fQk9BUkRfRERSX1MxX1JUVF9O T00sIDB4MDFEOCwgMHhGRjA2MDE3NworTlZfU0lfUk9fQk9BUkRfRERSX1MwX1JUVF9QQVJLLCAw eDAxRTAsIDB4MDAwNjAwNzAKK05WX1NJX1JPX0JPQVJEX0REUl9TMV9SVFRfUEFSSywgMHgwMUU4 LCAweDAwMDYwMDcwCitOVl9TSV9ST19CT0FSRF9ERFJfQ1MwX1JET0RUX01BU0tfMURQQywgMHgw MUYwLCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9ERFJfQ1MxX1JET0RUX01BU0tfMURQQywg MHgwMUY4LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9ERFJfQ1MyX1JET0RUX01BU0tfMURQ QywgMHgwMjAwLCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9ERFJfQ1MzX1JET0RUX01BU0tf MURQQywgMHgwMjA4LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9ERFJfQ1MwX1JET0RUX01B U0tfMkRQQywgMHgwMjEwLCAweDAwMEMwQ0NDCitOVl9TSV9ST19CT0FSRF9ERFJfQ1MxX1JET0RU X01BU0tfMkRQQywgMHgwMjE4LCAweDAwMEMwQ0NDCitOVl9TSV9ST19CT0FSRF9ERFJfQ1MyX1JE T0RUX01BU0tfMkRQQywgMHgwMjIwLCAweDAwMDMwMzMzCitOVl9TSV9ST19CT0FSRF9ERFJfQ1Mz X1JET0RUX01BU0tfMkRQQywgMHgwMjI4LCAweDAwMDMwMzMzCitOVl9TSV9ST19CT0FSRF9ERFJf Q1MwX1dST0RUX01BU0tfMURQQywgMHgwMjMwLCAweDAwMDMwMzMzCitOVl9TSV9ST19CT0FSRF9E RFJfQ1MxX1dST0RUX01BU0tfMURQQywgMHgwMjM4LCAweDAwMDMwMzMzCitOVl9TSV9ST19CT0FS RF9ERFJfQ1MyX1dST0RUX01BU0tfMURQQywgMHgwMjQwLCAweDAwMDMwMzMzCitOVl9TSV9ST19C T0FSRF9ERFJfQ1MzX1dST0RUX01BU0tfMURQQywgMHgwMjQ4LCAweDAwMDMwMzMzCitOVl9TSV9S T19CT0FSRF9ERFJfQ1MwX1dST0RUX01BU0tfMkRQQywgMHgwMjUwLCAweDAwMEVERUVECitOVl9T SV9ST19CT0FSRF9ERFJfQ1MxX1dST0RUX01BU0tfMkRQQywgMHgwMjU4LCAweDAwMERFRERFCitO Vl9TSV9ST19CT0FSRF9ERFJfQ1MyX1dST0RUX01BU0tfMkRQQywgMHgwMjYwLCAweDAwMEI3QkI3 CitOVl9TSV9ST19CT0FSRF9ERFJfQ1MzX1dST0RUX01BU0tfMkRQQywgMHgwMjY4LCAweDAwMDdC NzdCCitOVl9TSV9ST19CT0FSRF9ERFJfUEhZX1RFUk1fRFFfQ1RSTF8xRFBDLCAweDAyNzAsIDB4 MDAwMDAwMDUKK05WX1NJX1JPX0JPQVJEX0REUl9QSFlfVEVSTV9EUV9WQUxfMURQQywgMHgwMjc4 LCAweDAwOTBERDkwCitOVl9TSV9ST19CT0FSRF9ERFJfUEhZX1RFUk1fRFFTX0NUUkxfMURQQywg MHgwMjgwLCAweDAwMDAwMDA1CitOVl9TSV9ST19CT0FSRF9ERFJfUEhZX1RFUk1fRFFTX1ZBTF8x RFBDLCAweDAyODgsIDB4MDA5MEREOTAKK05WX1NJX1JPX0JPQVJEX0REUl9QSFlfVEVSTV9EUV9D VFJMXzJEUEMsIDB4MDI5MCwgMHgwMDAwMDAwNQorTlZfU0lfUk9fQk9BUkRfRERSX1BIWV9URVJN X0RRX1ZBTF8yRFBDLCAweDAyOTgsIDB4MDA5MEREOTAKK05WX1NJX1JPX0JPQVJEX0REUl9QSFlf VEVSTV9EUVNfQ1RSTF8yRFBDLCAweDAyQTAsIDB4MDAwMDAwMDUKK05WX1NJX1JPX0JPQVJEX0RE Ul9QSFlfVEVSTV9EUVNfVkFMXzJEUEMsIDB4MDJBOCwgMHgwMDkwREQ5MAorTlZfU0lfUk9fQk9B UkRfRERSX1BIWV9WUkVGRFFfUkFOR0VfVkFMXzFEUEMsIDB4MDJCMCwgMHgwMDAwMDAyNAorTlZf U0lfUk9fQk9BUkRfRERSX0RSQU1fVlJFRkRRX1JBTkdFX1ZBTF8xRFBDLCAweDAyQjgsIDB4MDAw MDAwMUEKK05WX1NJX1JPX0JPQVJEX0REUl9QSFlfVlJFRkRRX1JBTkdFX1ZBTF8yRFBDLCAweDAy QzAsIDB4MDAwMDAwNTAKK05WX1NJX1JPX0JPQVJEX0REUl9EUkFNX1ZSRUZEUV9SQU5HRV9WQUxf MkRQQywgMHgwMkM4LCAweDAwMDAwMDIwCitOVl9TSV9ST19CT0FSRF9ERFJfQ0xLX1dSRFFfRExZ X0RFRkFVTFQsIDB4MDJEMCwgMHgwMjgwMDI4MAorTlZfU0lfUk9fQk9BUkRfRERSX1JERFFTX0RR X0RMWV9ERUZBVUxULCAweDAyRDgsIDB4OTA5MDkwOTAKK05WX1NJX1JPX0JPQVJEX0REUl9XUkRR U19TSElGVF9ERUZBVUxULCAweDAyRTAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX0REUl9B RENNRF9ETFlfREVGQVVMVCwgMHgwMkU4LCAweDAwQzAwMEMwCitOVl9TSV9ST19CT0FSRF9ERFJf Q0xLX1dSRFFfRExZX0FESiwgMHgwMkYwLCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9ERFJf UkREUVNfRFFfRExZX0FESiwgMHgwMkY4LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9ERFJf UEhZX1ZSRUZfQURKLCAweDAzMDAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX0REUl9EUkFN X1ZSRUZfQURKLCAweDAzMDgsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX0REUl9XUl9QUkVB TUJMRV9DWUNMRSwgMHgwMzEwLCAweDAyMDEwMjAxCitOVl9TSV9ST19CT0FSRF9ERFJfQURDTURf MlRfTU9ERSwgMHgwMzE4LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9JMkNfVlJEX0NPTkZJ R19JTkZPLCAweDAzMjAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX0REUl9QSFlfRkVBVFVS RV9DVFJMLCAweDAzMjgsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX0JNQ19IQU5EU0hBS0Vf U1BJX0FDQ0VTUywgMHgwMzMwLCAweDAxMDUwMTA2CitOVl9TSV9ST19CT0FSRF9ESU1NX1RFTVBf VEhSRVNIT0xELCAweDAzMzgsIDB4MDAwMDA1RjQKK05WX1NJX1JPX0JPQVJEX0RJTU1fU1BEX0NP TVBBUkVfRElTQUJMRSwgMHgwMzQwLCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9TMF9QQ0lF X0NMS19DRkcsIDB4MDM0OCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfUzBfUkNBNF9DRkcs IDB4MDM1MCwgMHgwMjAyMDIwMgorTlZfU0lfUk9fQk9BUkRfUzBfUkNBNV9DRkcsIDB4MDM1OCwg MHgwMjAyMDIwMgorTlZfU0lfUk9fQk9BUkRfUzBfUkNBNl9DRkcsIDB4MDM2MCwgMHgwMjAyMDIw MgorTlZfU0lfUk9fQk9BUkRfUzBfUkNBN19DRkcsIDB4MDM2OCwgMHgwMjAyMDAwMworTlZfU0lf Uk9fQk9BUkRfUzBfUkNBMF9UWFJYX0czUFJFU0VULCAweDAzNzAsIDB4MDAwMDAwMDAKK05WX1NJ X1JPX0JPQVJEX1MwX1JDQTFfVFhSWF9HM1BSRVNFVCwgMHgwMzc4LCAweDAwMDAwMDAwCitOVl9T SV9ST19CT0FSRF9TMF9SQ0EyX1RYUlhfRzNQUkVTRVQsIDB4MDM4MCwgMHgwMDAwMDAwMAorTlZf U0lfUk9fQk9BUkRfUzBfUkNBM19UWFJYX0czUFJFU0VULCAweDAzODgsIDB4MDAwMDAwMDAKK05W X1NJX1JPX0JPQVJEX1MwX1JDQjBBX1RYUlhfRzNQUkVTRVQsIDB4MDM5MCwgMHgwMDAwMDAwMAor TlZfU0lfUk9fQk9BUkRfUzBfUkNCMEJfVFhSWF9HM1BSRVNFVCwgMHgwMzk4LCAweDAwMDAwMDAw CitOVl9TSV9ST19CT0FSRF9TMF9SQ0IxQV9UWFJYX0czUFJFU0VULCAweDAzQTAsIDB4MDAwMDAw MDAKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjFCX1RYUlhfRzNQUkVTRVQsIDB4MDNBOCwgMHgwMDAw MDAwMAorTlZfU0lfUk9fQk9BUkRfUzBfUkNCMkFfVFhSWF9HM1BSRVNFVCwgMHgwM0IwLCAweDAw MDAwMDAwCitOVl9TSV9ST19CT0FSRF9TMF9SQ0IyQl9UWFJYX0czUFJFU0VULCAweDAzQjgsIDB4 MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjNBX1RYUlhfRzNQUkVTRVQsIDB4MDNDMCwg MHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfUzBfUkNCM0JfVFhSWF9HM1BSRVNFVCwgMHgwM0M4 LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9TMF9SQ0E0X1RYUlhfRzNQUkVTRVQsIDB4MDNE MCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfUzBfUkNBNV9UWFJYX0czUFJFU0VULCAweDAz RDgsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1MwX1JDQTZfVFhSWF9HM1BSRVNFVCwgMHgw M0UwLCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9TMF9SQ0E3X1RYUlhfRzNQUkVTRVQsIDB4 MDNFOCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfUzBfUkNBMF9UWFJYX0c0UFJFU0VULCAw eDAzRjAsIDB4NTc1NzU3NTcKK05WX1NJX1JPX0JPQVJEX1MwX1JDQTFfVFhSWF9HNFBSRVNFVCwg MHgwM0Y4LCAweDU3NTc1NzU3CitOVl9TSV9ST19CT0FSRF9TMF9SQ0EyX1RYUlhfRzRQUkVTRVQs IDB4MDQwMCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRfUzBfUkNBM19UWFJYX0c0UFJFU0VU LCAweDA0MDgsIDB4NTc1NzU3NTcKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjBBX1RYUlhfRzRQUkVT RVQsIDB4MDQxMCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRfUzBfUkNCMEJfVFhSWF9HNFBS RVNFVCwgMHgwNDE4LCAweDU3NTc1NzU3CitOVl9TSV9ST19CT0FSRF9TMF9SQ0IxQV9UWFJYX0c0 UFJFU0VULCAweDA0MjAsIDB4NTc1NzU3NTcKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjFCX1RYUlhf RzRQUkVTRVQsIDB4MDQyOCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRfUzBfUkNCMkFfVFhS WF9HNFBSRVNFVCwgMHgwNDMwLCAweDU3NTc1NzU3CitOVl9TSV9ST19CT0FSRF9TMF9SQ0IyQl9U WFJYX0c0UFJFU0VULCAweDA0MzgsIDB4NTc1NzU3NTcKK05WX1NJX1JPX0JPQVJEX1MwX1JDQjNB X1RYUlhfRzRQUkVTRVQsIDB4MDQ0MCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRfUzBfUkNC M0JfVFhSWF9HNFBSRVNFVCwgMHgwNDQ4LCAweDU3NTc1NzU3CitOVl9TSV9ST19CT0FSRF9TMF9S Q0E0X1RYUlhfRzRQUkVTRVQsIDB4MDQ1MCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRfUzBf UkNBNV9UWFJYX0c0UFJFU0VULCAweDA0NTgsIDB4NTc1NzU3NTcKK05WX1NJX1JPX0JPQVJEX1Mw X1JDQTZfVFhSWF9HNFBSRVNFVCwgMHgwNDYwLCAweDU3NTc1NzU3CitOVl9TSV9ST19CT0FSRF9T MF9SQ0E3X1RYUlhfRzRQUkVTRVQsIDB4MDQ2OCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRf UzFfUENJRV9DTEtfQ0ZHLCAweDA0NzAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1MxX1JD QTRfQ0ZHLCAweDA0NzgsIDB4MDIwMjAyMDIKK05WX1NJX1JPX0JPQVJEX1MxX1JDQTVfQ0ZHLCAw eDA0ODAsIDB4MDIwMjAyMDIKK05WX1NJX1JPX0JPQVJEX1MxX1JDQTZfQ0ZHLCAweDA0ODgsIDB4 MDIwMjAyMDIKK05WX1NJX1JPX0JPQVJEX1MxX1JDQTdfQ0ZHLCAweDA0OTAsIDB4MDIwMjAwMDMK K05WX1NJX1JPX0JPQVJEX1MxX1JDQTJfVFhSWF9HM1BSRVNFVCwgMHgwNDk4LCAweDAwMDAwMDAw CitOVl9TSV9ST19CT0FSRF9TMV9SQ0EzX1RYUlhfRzNQUkVTRVQsIDB4MDRBMCwgMHgwMDAwMDAw MAorTlZfU0lfUk9fQk9BUkRfUzFfUkNCMEFfVFhSWF9HM1BSRVNFVCwgMHgwNEE4LCAweDAwMDAw MDAwCitOVl9TSV9ST19CT0FSRF9TMV9SQ0IwQl9UWFJYX0czUFJFU0VULCAweDA0QjAsIDB4MDAw MDAwMDAKK05WX1NJX1JPX0JPQVJEX1MxX1JDQjFBX1RYUlhfRzNQUkVTRVQsIDB4MDRCOCwgMHgw MDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfUzFfUkNCMUJfVFhSWF9HM1BSRVNFVCwgMHgwNEMwLCAw eDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9TMV9SQ0IyQV9UWFJYX0czUFJFU0VULCAweDA0Qzgs IDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1MxX1JDQjJCX1RYUlhfRzNQUkVTRVQsIDB4MDRE MCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfUzFfUkNCM0FfVFhSWF9HM1BSRVNFVCwgMHgw NEQ4LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9TMV9SQ0IzQl9UWFJYX0czUFJFU0VULCAw eDA0RTAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1MxX1JDQTRfVFhSWF9HM1BSRVNFVCwg MHgwNEU4LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9TMV9SQ0E1X1RYUlhfRzNQUkVTRVQs IDB4MDRGMCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfUzFfUkNBNl9UWFJYX0czUFJFU0VU LCAweDA0RjgsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1MxX1JDQTdfVFhSWF9HM1BSRVNF VCwgMHgwNTAwLCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9TMV9SQ0EyX1RYUlhfRzRQUkVT RVQsIDB4MDUwOCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRfUzFfUkNBM19UWFJYX0c0UFJF U0VULCAweDA1MTAsIDB4NTc1NzU3NTcKK05WX1NJX1JPX0JPQVJEX1MxX1JDQjBBX1RYUlhfRzRQ UkVTRVQsIDB4MDUxOCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRfUzFfUkNCMEJfVFhSWF9H NFBSRVNFVCwgMHgwNTIwLCAweDU3NTc1NzU3CitOVl9TSV9ST19CT0FSRF9TMV9SQ0IxQV9UWFJY X0c0UFJFU0VULCAweDA1MjgsIDB4NTc1NzU3NTcKK05WX1NJX1JPX0JPQVJEX1MxX1JDQjFCX1RY UlhfRzRQUkVTRVQsIDB4MDUzMCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRfUzFfUkNCMkFf VFhSWF9HNFBSRVNFVCwgMHgwNTM4LCAweDU3NTc1NzU3CitOVl9TSV9ST19CT0FSRF9TMV9SQ0Iy Ql9UWFJYX0c0UFJFU0VULCAweDA1NDAsIDB4NTc1NzU3NTcKK05WX1NJX1JPX0JPQVJEX1MxX1JD QjNBX1RYUlhfRzRQUkVTRVQsIDB4MDU0OCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRfUzFf UkNCM0JfVFhSWF9HNFBSRVNFVCwgMHgwNTUwLCAweDU3NTc1NzU3CitOVl9TSV9ST19CT0FSRF9T MV9SQ0E0X1RYUlhfRzRQUkVTRVQsIDB4MDU1OCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9BUkRf UzFfUkNBNV9UWFJYX0c0UFJFU0VULCAweDA1NjAsIDB4NTc1NzU3NTcKK05WX1NJX1JPX0JPQVJE X1MxX1JDQTZfVFhSWF9HNFBSRVNFVCwgMHgwNTY4LCAweDU3NTc1NzU3CitOVl9TSV9ST19CT0FS RF9TMV9SQ0E3X1RYUlhfRzRQUkVTRVQsIDB4MDU3MCwgMHg1NzU3NTc1NworTlZfU0lfUk9fQk9B UkRfMlBfQ0VfTUFTS19USFJFU0hPTEQsIDB4MDU3OCwgMHgwMDAwMDAwMworTlZfU0lfUk9fQk9B UkRfMlBfQ0VfTUFTS19JTlRFUlZBTCwgMHgwNTgwLCAweDAwMDAwMUE0CitOVl9TSV9ST19CT0FS RF9TWF9QSFlfQ0ZHX1NFVFRJTkcsIDB4MDU4OCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRf RERSX1BIWV9EQ19DTEssIDB4MDU5MCwgMHgwMDAxODAwMAorTlZfU0lfUk9fQk9BUkRfRERSX1BI WV9EQ19EQVRBLCAweDA1OTgsIDB4ODAwMTgwMDAKK05WX1NJX1JPX0JPQVJEX1NYX1JDQTBfVFhS WF8yMEdQUkVTRVQsIDB4MDVBMCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfU1hfUkNBMV9U WFJYXzIwR1BSRVNFVCwgMHgwNUE4LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9TWF9SQ0Ey X1RYUlhfMjBHUFJFU0VULCAweDA1QjAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX1NYX1JD QTNfVFhSWF8yMEdQUkVTRVQsIDB4MDVCOCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfU1hf UkNBMF9UWFJYXzI1R1BSRVNFVCwgMHgwNUMwLCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9T WF9SQ0ExX1RYUlhfMjVHUFJFU0VULCAweDA1QzgsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJE X1NYX1JDQTJfVFhSWF8yNUdQUkVTRVQsIDB4MDVEMCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9B UkRfU1hfUkNBM19UWFJYXzI1R1BSRVNFVCwgMHgwNUQ4LCAweDAwMDAwMDAwCitOVl9TSV9ST19C T0FSRF9ERFJfMlhfUkVGUkVTSF9URU1QX1RIUkVTSE9MRCwgMHgwNUUwLCAweDAwNTUwMDU1CitO Vl9TSV9ST19CT0FSRF9QQ1BfVlJEX1ZPVVRfV0FJVF9VUywgMHgwNUU4LCAweDAwMDAwMDY0CitO Vl9TSV9ST19CT0FSRF9QQ1BfVlJEX1ZPVVRfUkVTT0xVVElPTl9NViwgMHgwNUYwLCAweDAwMDAw MDA1CitOVl9TSV9ST19CT0FSRF9EVkZTX1ZPTFRfUkVBRF9CQUNLX0VOLCAweDA1RjgsIDB4MDAw MDAwMDEKK05WX1NJX1JPX0JPQVJEX0RWRlNfVk9MVF9SRUFEX0JBQ0tfVElNRSwgMHgwNjAwLCAw eDAwMDAwMDAyCitOVl9TSV9ST19CT0FSRF9EVkZTX1ZPVVRfMjBNVl9SQU1QX1RJTUVfVVMsIDB4 MDYwOCwgMHgwMDAwMDAwNQorTlZfU0lfUk9fQk9BUkRfUENJRV9BRVJfRldfRklSU1QsIDB4MDYx MCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfUlRDX0dQSV9MT0NLX0JZUEFTUywgMHgwNjE4 LCAweDAwMDAwMDAwCitOVl9TSV9ST19CT0FSRF9UUE1fRElTQUJMRSwgMHgwNjIwLCAweDAwMDAw MDAwCitOVl9TSV9ST19CT0FSRF9NRVNIX1MwX0NYR19SQ19TVFJPTkdfT1JERVJJTkdfRU4sIDB4 MDYyOCwgMHgwMDAwMDAwMAorTlZfU0lfUk9fQk9BUkRfTUVTSF9TMV9DWEdfUkNfU1RST05HX09S REVSSU5HX0VOLCAweDA2MzAsIDB4MDAwMDAwMDAKK05WX1NJX1JPX0JPQVJEX0dQSU9fU1dfV0FU Q0hET0dfRU4sIDB4MDYzOCwgMHgwMDAwMDAwMAo8L3ByZT4KICAgICAgPC9ibG9ja3F1b3RlPgog ICAgICA8cHJlIGNsYXNzPSJtb3otcXVvdGUtcHJlIiB3cmFwPSIiPgpUaGVyZSB3YXMgYWxzbyBh IGZldyB0aGluZ3MgaW4gdGhpcyBwYXRjaCB3aGVyZSBJIGZlbHQgbmFtZXMgaGFkCmluc3VmZmlj aWVudCBuYW1lc3BhY2UgLSBzdWNoIGFzIHN0YXJ0aW5nIHdpdGggVFJOR18gb3IgTlZfLgpJJ20g bm90IGdvaW5nIHRvIGluc2lzdCBvbiBhZGRpbmcgcHJlZml4ZXMgdG8gdGhvc2UsIEknbSBqdXN0 IGdvaW5nIHRvCnNheSBJIGhhdmUgd2FybmVkIHlvdSwgYW5kIHRob3NlIG1pZ2h0IGdldCB5b3Ug aW4gdHJvdWJsZSBpbiB0aGUKZnV0dXJlIDopCgpCZXN0IFJlZ2FyZHMsCgpMZWlmCjwvcHJlPgog ICAgPC9ibG9ja3F1b3RlPgogIDwvYm9keT4KPC9odG1sPgo= --------------4BF9D6D8EBC1A676687FE92C--