From nobody Mon Feb 9 23:57:54 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+61604+1787277+3901457@groups.io; arc=fail (BodyHash is different from the expected one) Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1592919821337174.53710112849205; Tue, 23 Jun 2020 06:43:41 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id BBhPYY1788612x32DHmmyl3o; Tue, 23 Jun 2020 06:43:41 -0700 X-Received: from EUR04-VI1-obe.outbound.protection.outlook.com (EUR04-VI1-obe.outbound.protection.outlook.com [40.107.8.85]) by mx.groups.io with SMTP id smtpd.web10.7132.1592919816787416437 for ; Tue, 23 Jun 2020 06:43:37 -0700 X-Received: from AM7PR04CA0014.eurprd04.prod.outlook.com (2603:10a6:20b:110::24) by HE1PR0802MB2330.eurprd08.prod.outlook.com (2603:10a6:3:c8::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3109.23; Tue, 23 Jun 2020 13:43:33 +0000 X-Received: from AM5EUR03FT007.eop-EUR03.prod.protection.outlook.com (2603:10a6:20b:110:cafe::8a) by AM7PR04CA0014.outlook.office365.com (2603:10a6:20b:110::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3109.22 via Frontend Transport; Tue, 23 Jun 2020 13:43:33 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; edk2.groups.io; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;edk2.groups.io; dmarc=bestguesspass action=none header.from=arm.com; Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+61604+1787277+3901457@groups.io; helo=web01.groups.io; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; X-Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by AM5EUR03FT007.mail.protection.outlook.com (10.152.16.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3109.22 via Frontend Transport; Tue, 23 Jun 2020 13:43:33 +0000 X-Received: ("Tessian outbound f44be76249db:v59"); Tue, 23 Jun 2020 13:43:33 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 45f1059b2c20f3fc X-CR-MTA-TID: 64aa7808 X-Received: from b1d2ee627343.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 17A44993-0C83-48FC-87DF-D772B37DD06C.1; Tue, 23 Jun 2020 13:43:27 +0000 X-Received: from EUR05-AM6-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id b1d2ee627343.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Tue, 23 Jun 2020 13:43:27 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=c66wzFAKDrkIgEyJizWR26JOH574euRZfRrWZUa+AmjFIoJoIAp86VDYAUFC+sKfEcK48gvo9/2kMoZf5e/vj3NTEFHhJTYWcdp3Pn72Gnr9jGYKt05HvgEuhfw/IniF/iE3279VbIrCl2GziV3EqK+eKjO8l7Uf9zNIrc8pw+Ia4b2dI+u3sh05MMzjSg34G0hqsr2rDQDa5cBW2HtcoaP/yqphujgrcsS0r/f/U3b+u2qJzAyxW28x0DE01QbNK7bE8mcEz0fTbHdS0fseMrqPR8QqRAToMGWcfUPzs7C0Xi3zxuprIgW2zxE0NQsZOz/P5mSKfkpTadUXdylrdg== 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=zhAuSgA9qxy+CAa6wKlD9Sn+gxZTGXrPNGZhJq1ABzU=; b=eU+kd4oL03rem4DNizLdC0pfNNBkZLaFHcM16BPobdjsIighugHu9ZJsrFOFOpC/94KtBrWGxJMr418wvtEfM1ykj1gol91Xz/5EXkMJs2igtWSdmZTtMRkTUH55ORI4Z+A5V59whQdZYOfWCvVLAOBshHNNKnJDwN7omdwn7yfVMXT0rW9IamnuSCII7nxBrFPxSskvMMNvcmE3SIkwYFRwEcrJYXQKEpzspnNRyvvaeSE9r47+/2y/Z8m1rdNc5R7ScmvokGJo5Q2pHwMDXQ0U8CQS91R7lO9Ql9AcbumdnHYs7o6K+bBAjb4ODv3UChplmqn2mShaF5nhI2AQAw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 40.67.248.234) smtp.rcpttodomain=edk2.groups.io smtp.mailfrom=arm.com; dmarc=bestguesspass action=none header.from=arm.com; dkim=none (message not signed); arc=none X-Received: from AM5PR0402CA0005.eurprd04.prod.outlook.com (2603:10a6:203:90::15) by DB8PR08MB5354.eurprd08.prod.outlook.com (2603:10a6:10:114::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3109.22; Tue, 23 Jun 2020 13:43:26 +0000 X-Received: from AM5EUR03FT029.eop-EUR03.prod.protection.outlook.com (2603:10a6:203:90:cafe::15) by AM5PR0402CA0005.outlook.office365.com (2603:10a6:203:90::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3109.22 via Frontend Transport; Tue, 23 Jun 2020 13:43:26 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 40.67.248.234) smtp.mailfrom=arm.com; edk2.groups.io; dkim=none (message not signed) header.d=none;edk2.groups.io; dmarc=bestguesspass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 40.67.248.234 as permitted sender) receiver=protection.outlook.com; client-ip=40.67.248.234; helo=nebula.arm.com; X-Received: from nebula.arm.com (40.67.248.234) by AM5EUR03FT029.mail.protection.outlook.com (10.152.16.150) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.3109.22 via Frontend Transport; Tue, 23 Jun 2020 13:43:26 +0000 X-Received: from AZ-NEU-EX01.Emea.Arm.com (10.251.26.4) by AZ-NEU-EX04.Arm.com (10.251.24.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.1.1415.2; Tue, 23 Jun 2020 13:43:25 +0000 X-Received: from AZ-NEU-EX03.Arm.com (10.251.24.31) by AZ-NEU-EX01.Emea.Arm.com (10.251.26.4) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1779.2; Tue, 23 Jun 2020 13:43:24 +0000 X-Received: from localhost.localdomain (10.57.20.205) by mail.arm.com (10.251.24.31) with Microsoft SMTP Server id 15.1.1415.2 via Frontend Transport; Tue, 23 Jun 2020 13:43:24 +0000 From: "Tomas Pilar (tpilar)" To: CC: , , Ray Ni , "Zhichao Gao" Subject: [edk2-devel] [PATCH v4 6/7] ShellPkg: Add AcpiViewCommandLib Date: Tue, 23 Jun 2020 14:43:03 +0100 Message-ID: <20200623134304.2619-7-Tomas.Pilar@arm.com> In-Reply-To: <20200623134304.2619-1-Tomas.Pilar@arm.com> References: <20200623134304.2619-1-Tomas.Pilar@arm.com> MIME-Version: 1.0 X-EOPAttributedMessage: 1 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report-Untrusted: CIP:40.67.248.234;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:nebula.arm.com;PTR:InfoDomainNonexistent;CAT:NONE;SFTY:;SFS:(4636009)(136003)(346002)(39860400002)(396003)(376002)(46966005)(336012)(478600001)(8676002)(8936002)(6666004)(81166007)(2906002)(82310400002)(82740400003)(426003)(26005)(47076004)(186003)(356005)(83380400001)(2616005)(4326008)(70206006)(70586007)(36756003)(5660300002)(19627235002)(316002)(6916009)(54906003)(86362001)(1076003);DIR:OUT;SFP:1101; X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 6c4998ba-a52d-4737-40c7-08d8177b6c16 X-MS-TrafficTypeDiagnostic: DB8PR08MB5354:|HE1PR0802MB2330: X-Microsoft-Antispam-PRVS: x-checkrecipientrouted: true NoDisclaimer: true X-MS-Oob-TLC-OOBClassifiers: OLM:8882;OLM:8882; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: c3ZpW7cIXyKKdf+Ga5ndNAFkxVD13HgAYnbPzbB3f1qK/YnZGiMkwNwrI6oR/7Kw6S0ysLIF+z+RnGCCV6kl15FH4Lx8BA8n64vv2NCw1NEXgUcKxNX49SLCzuc3LoztE6pEN0c+XzgflELGPgk1m+uqwFEIRRLli/9JwXK94pN1lH0j/5kWQB2C2A0Zcc9MkmaG4eddBF1x+6E3F+7Alg+TiYoQOiJdHRPUSCBP/a0MoqN60N1xmya/CbFRzSfy2FBXeE0geeJH0o8CtG9Ua0mlCBhOvPgYgRnXCfWMBHfoqj5kV64iill3o39JM/XyEqOCzhbt1CjpePDSQYWwpaHEcubc0R8p19WJYS6HzFcvwR12GmwqBDsJV4yb0ecazaP5ZP0gGKeeqtKKKy3Vig== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB8PR08MB5354 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM5EUR03FT007.eop-EUR03.prod.protection.outlook.com X-MS-Office365-Filtering-Correlation-Id-Prvs: 82141ed4-04ec-477e-f8e7-08d8177b67de X-Microsoft-Antispam-Message-Info: T89IRBHkFMneUziT93x1cR4282F671frN1zEgaAJPmXrhhpS8GOIrykrmGX2a2TTUk7+LkXo3Y6IVjiT/28wpqWwR4mQwAUgjmsmN9B8x3ysaCYWiI1o75NCajp/CBxHOfSwIA1lBjhuv2Hd946BAiDM4PrQvEz+WOXsCXoj6MWSww9uJQfoFbut6uiEWL4ux14UwC7UVZc+mRTmMCuMlk3ck3paEsGM+qyK58tIVZUrFeJ1mzIaTgKdR7h898Wk3QPRtJOZDi3Wz2q1hc0MhmJCbMvpPGwTw0ymUlEe47/G8Lu/wpGwJBZhhjbw557wqn2/NRB6PDs6f+/bgfH73PDHigpDx5TtH4hXTqw3JLoFpIdoyeQiGLgQQTxSyRiA3mTrjtje9QIJR53dzZKojw== X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jun 2020 13:43:33.4129 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6c4998ba-a52d-4737-40c7-08d8177b6c16 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0802MB2330 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,Tomas.Pilar@arm.com X-Gm-Message-State: M6NHlUe39Y4pVL6RLr9H9IqTx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1592919821; bh=qux8SmzJ5q5hK1ghX6xKDRLBtACyFPXxoQwASV07/nc=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=ukxndgv98zhaDKYyWZ0XpnFHbeo0wtnDINZWmi83WIrBlgki8OccNN0Xc53cUYn5Wm2 hF0MV0VWa5DsxrO8b8ngq6fAqNox+CNZUCHT/1Bpk2GS5nOIzrz+bNOmrZSYHaWFfa9qL mdEtBXI1Ov3QVBIomJFnWiT3uJuoUGnULF8= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" The UefiShellAcpiViewCommandLib is converted from NULL library to a named library so that it may be used in modules other than shell. The library interface exposes the main method for to AcpiView functionality as well as a helper method to dump a buffer to a file. The Shell module is still built by pulling UefiShellAcpiViewCommandLib as a NULL library to preserve the modularity of shell builds. Cc: Ray Ni Cc: Zhichao Gao Reviewed-by: Zhichao Gao Signed-off-by: Tomas Pilar --- .../Library/AcpiViewCommandLib.h} | 15 ++++++++------- .../UefiShellAcpiViewCommandLib/AcpiView.c | 2 +- .../UefiShellAcpiViewCommandLib.c | 2 +- .../UefiShellAcpiViewCommandLib.inf | 3 +-- ShellPkg/ShellPkg.dec | 3 +++ ShellPkg/ShellPkg.dsc | 3 ++- 6 files changed, 16 insertions(+), 12 deletions(-) rename ShellPkg/{Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewComm= andLib.h =3D> Include/Library/AcpiViewCommandLib.h} (72%) diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiView= CommandLib.h b/ShellPkg/Include/Library/AcpiViewCommandLib.h similarity index 72% rename from ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewC= ommandLib.h rename to ShellPkg/Include/Library/AcpiViewCommandLib.h index b1b1ffe63e28..11cf96c6e0d7 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommand= Lib.h +++ b/ShellPkg/Include/Library/AcpiViewCommandLib.h @@ -1,12 +1,13 @@ /** @file - Header file for 'acpiview' Shell command functions. + Library providing 'acpiview' functionality to display and + validate installed ACPI tables. =20 Copyright (c) 2016 - 2020, ARM Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ =20 -#ifndef UEFI_SHELL_ACPIVIEW_COMMAND_LIB_H_ -#define UEFI_SHELL_ACPIVIEW_COMMAND_LIB_H_ +#ifndef ACPI_VIEW_COMMAND_LIB_H_ +#define ACPI_VIEW_COMMAND_LIB_H_ =20 /** Dump a buffer to a file. Print error message if a file cannot be created. @@ -26,14 +27,14 @@ ShellDumpBufferToFile ( ); =20 /** - Function for 'acpiview' command. + Display and validate ACPI tables. =20 @param[in] ImageHandle Handle to the Image (NULL if internal). @param[in] SystemTable Pointer to the System Table (NULL if internal). =20 - @retval SHELL_INVALID_PARAMETER The command line invocation could not be= parsed - @retval SHELL_NOT_FOUND The command failed - @retval SHELL_SUCCESS The command was successful + @retval SHELL_INVALID_PARAMETER The command line invocation could not be= parsed. + @retval SHELL_NOT_FOUND The command failed. + @retval SHELL_SUCCESS The command was successful. **/ SHELL_STATUS EFIAPI diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiView.c b/Shel= lPkg/Library/UefiShellAcpiViewCommandLib/AcpiView.c index d2240b2e89d5..9a5b013fb234 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiView.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiView.c @@ -17,11 +17,11 @@ #include #include #include +#include #include "AcpiParser.h" #include "AcpiTableParser.h" #include "AcpiView.h" #include "AcpiViewConfig.h" -#include "UefiShellAcpiViewCommandLib.h" =20 #if defined(MDE_CPU_ARM) || defined (MDE_CPU_AARCH64) #include "Arm/SbbrValidator.h" diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiView= CommandLib.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiVi= ewCommandLib.c index e6a65d5bc5f7..d2f26ff89f12 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommand= Lib.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommand= Lib.c @@ -16,13 +16,13 @@ #include #include #include +#include #include =20 #include "AcpiParser.h" #include "AcpiTableParser.h" #include "AcpiView.h" #include "AcpiViewConfig.h" -#include "UefiShellAcpiViewCommandLib.h" =20 CONST CHAR16 gShellAcpiViewFileName[] =3D L"ShellCommand"; EFI_HII_HANDLE gShellAcpiViewHiiHandle =3D NULL; diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiView= CommandLib.inf b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpi= ViewCommandLib.inf index 92de2391b09f..91459f9ec632 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommand= Lib.inf +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommand= Lib.inf @@ -14,7 +14,7 @@ [Defines] FILE_GUID =3D FB5B305E-84F5-461F-940D-82D345757AFA MODULE_TYPE =3D UEFI_APPLICATION VERSION_STRING =3D 1.0 - LIBRARY_CLASS =3D NULL|UEFI_APPLICATION UEFI_DRIVER + LIBRARY_CLASS =3D AcpiViewCommandLib|UEFI_APPLICATION U= EFI_DRIVER CONSTRUCTOR =3D UefiShellAcpiViewCommandLibConstructor DESTRUCTOR =3D UefiShellAcpiViewCommandLibDestructor =20 @@ -46,7 +46,6 @@ [Sources.common] Parsers/Ssdt/SsdtParser.c Parsers/Xsdt/XsdtParser.c UefiShellAcpiViewCommandLib.c - UefiShellAcpiViewCommandLib.h UefiShellAcpiViewCommandLib.uni =20 [Sources.ARM, Sources.AARCH64] diff --git a/ShellPkg/ShellPkg.dec b/ShellPkg/ShellPkg.dec index c17e358d15ed..d0843d338126 100644 --- a/ShellPkg/ShellPkg.dec +++ b/ShellPkg/ShellPkg.dec @@ -34,6 +34,9 @@ [LibraryClasses] ## @libraryclass provides BCFG command BcfgCommandLib|Include/Library/BcfgCommandLib.h =20 + ## @libraryclass provides the AcpiView command + AcpiViewCommandLib|Include/Library/AcpiViewCommandLib.h + [Guids] gEfiShellEnvironment2ExtGuid =3D {0xd2c18636, 0x40e5, 0x4eb5, {0xa3, = 0x1b, 0x36, 0x69, 0x5f, 0xd4, 0x2c, 0x87}} gEfiShellPkgTokenSpaceGuid =3D {0x171e9188, 0x31d3, 0x40f5, {0xb1, = 0x0c, 0x53, 0x9b, 0x2d, 0xb9, 0x40, 0xcd}} diff --git a/ShellPkg/ShellPkg.dsc b/ShellPkg/ShellPkg.dsc index b7ee856b3a16..5d2d96ab071c 100644 --- a/ShellPkg/ShellPkg.dsc +++ b/ShellPkg/ShellPkg.dsc @@ -2,7 +2,7 @@ # Shell Package # # Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.
-# Copyright (c) 2018, Arm Limited. All rights reserved.
+# Copyright (c) 2018 - 2020, Arm Limited. All rights reserved.
# Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All right= s reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent @@ -50,6 +50,7 @@ [LibraryClasses.common] =20 PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeC= offGetEntryPointLib.inf BcfgCommandLib|ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCom= mandLib.inf + AcpiViewCommandLib|ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShel= lAcpiViewCommandLib.inf IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf =20 UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManag= erLib.inf --=20 2.24.1.windows.2 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#61604): https://edk2.groups.io/g/devel/message/61604 Mute This Topic: https://groups.io/mt/75059843/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-