From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.65; helo=mga03.intel.com; envelope-from=yi.qian@intel.com; receiver=edk2-devel@lists.01.org Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id F1264211C64B4 for ; Fri, 1 Feb 2019 20:51:18 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 01 Feb 2019 20:51:18 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,551,1539673200"; d="scan'208";a="317022978" Received: from shwde6656.ccr.corp.intel.com ([10.239.9.129]) by fmsmga005.fm.intel.com with ESMTP; 01 Feb 2019 20:51:16 -0800 From: yqian4 To: edk2-devel@lists.01.org Cc: Yi Qian , David Wei , Zailiang Sun Date: Sat, 2 Feb 2019 12:50:56 +0800 Message-Id: <20190202045056.6364-1-yi.qian@intel.com> X-Mailer: git-send-email 2.16.2.windows.1 Subject: [Patch V2] edk2-platforms/devel-IntelAtomProcessorE3900: Enable tracehub X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 02 Feb 2019 04:51:19 -0000 https://bugzilla.tianocore.org/show_bug.cgi?id=1508 Expose npk related setup options and convey right settings to fsp upd for tracehub enabling. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Yi Qian CC: David Wei CC: Zailiang Sun --- Platform/BroxtonPlatformPkg/BuildBxtBios.bat | 4 ++-- Platform/BroxtonPlatformPkg/Common/Include/Guid/SetupVariable.h | 19 +++++++++++++++++++ Platform/BroxtonPlatformPkg/Common/Library/PeiFspPolicyInitLib/PeiFspSaPolicyInitLib.c | 43 ++++++++++++++++++++++++++++++------------- Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformSetupDxe/DebugConfig.vfi | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformSetupDxe/VfrStrings.uni | Bin 306466 -> 320330 bytes 5 files changed, 192 insertions(+), 15 deletions(-) diff --git a/Platform/BroxtonPlatformPkg/BuildBxtBios.bat b/Platform/BroxtonPlatformPkg/BuildBxtBios.bat index 9bd71198e5..492eb1cd3c 100644 --- a/Platform/BroxtonPlatformPkg/BuildBxtBios.bat +++ b/Platform/BroxtonPlatformPkg/BuildBxtBios.bat @@ -523,7 +523,7 @@ if not exist "%STITCH_PATH%\FlashMap.h" ( call :FindVariableInFile _PCD_VALUE_PcdFlashNvStorageSize 3 NvStorageSize "%STITCH_PATH%\FlashMap.h" :: Find image offset as opposed to memory offset del /f /q temp.pcd >NUL 2>&1 - PowerShell ([uint32]$env:NvStorageBase - [uint32]$env:BaseAddress) > temp.pcd + PowerShell ([uint64]$env:NvStorageBase - [uint64]$env:BaseAddress) > temp.pcd set /p VpdOffset=NUL 2>&1 :: Force the variables we care about into DEC string format @@ -566,7 +566,7 @@ if not exist "%WORKSPACE%\%PLATFORM_PATH%\PlatformDsc\Defines.dsc" ( echo - BLD_IBBM_SIZE = %BldIbbmSize% :: Find magic number del /f /q temp.pcd >NUL 2>&1 - PowerShell ([uint32]$env:CarBaseAddress + [uint32]$env:BldRamDataSize + [uint32]$env:FspRamDataSize + [uint32]$env:FspEmpDataSize + [uint32]$env:BldIbbmSize) > temp.pcd + PowerShell ([uint64]$env:CarBaseAddress + [uint64]$env:BldRamDataSize + [uint64]$env:FspRamDataSize + [uint64]$env:FspEmpDataSize + [uint64]$env:BldIbbmSize) > temp.pcd set /p FspBaseAddress=NUL 2>&1 call :ForceToHex FspBaseAddress diff --git a/Platform/BroxtonPlatformPkg/Common/Include/Guid/SetupVariable.h b/Platform/BroxtonPlatformPkg/Common/Include/Guid/SetupVariable.h index 2d81068778..de4c70d819 100644 --- a/Platform/BroxtonPlatformPkg/Common/Include/Guid/SetupVariable.h +++ b/Platform/BroxtonPlatformPkg/Common/Include/Guid/SetupVariable.h @@ -908,6 +908,25 @@ typedef struct { UINT8 PkgCStateDemotion; UINT8 PkgCStateUnDemotion; + // + // NPK debug Options + // + UINT8 NpkEn; + UINT8 FwTraceEn; + UINT8 FwTraceDestination; + UINT8 RecoverDump; + UINT32 Msc0Size; + UINT8 Msc0Wrap; + UINT32 Msc1Size; + UINT8 Msc1Wrap; + UINT8 PtiMode; + UINT8 PtiTraining; + UINT8 PtiSpeed; + UINT8 NpkDCIEn; + UINT8 PunitMlvl; + UINT8 PmcMlvl; + UINT8 SwTraceEn; + UINT8 ProcTraceMemSize; UINT8 ProcTraceEnable; UINT8 ProcTraceOutputScheme; diff --git a/Platform/BroxtonPlatformPkg/Common/Library/PeiFspPolicyInitLib/PeiFspSaPolicyInitLib.c b/Platform/BroxtonPlatformPkg/Common/Library/PeiFspPolicyInitLib/PeiFspSaPolicyInitLib.c index 2fb3bd9d3e..0863706645 100644 --- a/Platform/BroxtonPlatformPkg/Common/Library/PeiFspPolicyInitLib/PeiFspSaPolicyInitLib.c +++ b/Platform/BroxtonPlatformPkg/Common/Library/PeiFspPolicyInitLib/PeiFspSaPolicyInitLib.c @@ -155,19 +155,36 @@ PeiFspSaPolicyInitPreMem ( FspmUpd->FspmConfig.Igd = SystemConfiguration->Igd; FspmUpd->FspmConfig.PrimaryVideoAdaptor = SystemConfiguration->PrimaryVideoAdaptor; - FspmUpd->FspmConfig.FwTraceEn = 1; - FspmUpd->FspmConfig.FwTraceDestination = 4; - FspmUpd->FspmConfig.RecoverDump = 0; - FspmUpd->FspmConfig.Msc0Size = 0; - FspmUpd->FspmConfig.Msc0Wrap = 1; - FspmUpd->FspmConfig.Msc1Size = 0; - FspmUpd->FspmConfig.Msc1Wrap = 1; - FspmUpd->FspmConfig.PtiMode = 1; - FspmUpd->FspmConfig.PtiTraining = 0; - FspmUpd->FspmConfig.PtiSpeed = 2; - FspmUpd->FspmConfig.PunitMlvl = 1; - FspmUpd->FspmConfig.PmcMlvl = 1; - FspmUpd->FspmConfig.SwTraceEn = 0; + FspmUpd->FspmConfig.NpkEn = SystemConfiguration->NpkEn; ///< 0-disabled, 1-enabled, 2-debugger, 3-auto + FspmUpd->FspmConfig.FwTraceEn = SystemConfiguration->FwTraceEn; + FspmUpd->FspmConfig.FwTraceDestination = SystemConfiguration->FwTraceDestination; + FspmUpd->FspmConfig.RecoverDump = SystemConfiguration->RecoverDump; + FspmUpd->FspmConfig.Msc0Size = SystemConfiguration->Msc0Size; + FspmUpd->FspmConfig.Msc0Wrap = SystemConfiguration->Msc0Wrap; + FspmUpd->FspmConfig.Msc1Size = SystemConfiguration->Msc1Size; + FspmUpd->FspmConfig.Msc1Wrap = SystemConfiguration->Msc1Wrap; + FspmUpd->FspmConfig.PtiMode = SystemConfiguration->PtiMode; + FspmUpd->FspmConfig.PtiTraining = SystemConfiguration->PtiTraining; + FspmUpd->FspmConfig.PtiSpeed = SystemConfiguration->PtiSpeed; + FspmUpd->FspmConfig.PunitMlvl = SystemConfiguration->PunitMlvl; + FspmUpd->FspmConfig.PmcMlvl = SystemConfiguration->PmcMlvl; + FspmUpd->FspmConfig.SwTraceEn = SystemConfiguration->SwTraceEn; + + DEBUG ((DEBUG_INFO, "NpkEn: %x\n", FspmUpd->FspmConfig.NpkEn)); + DEBUG ((DEBUG_INFO, "FwTraceEn: %x\n", FspmUpd->FspmConfig.FwTraceEn)); + DEBUG ((DEBUG_INFO, "FwTraceDestination: %x\n", FspmUpd->FspmConfig.FwTraceDestination)); + DEBUG ((DEBUG_INFO, "RecoverDump: %x\n", FspmUpd->FspmConfig.RecoverDump)); + DEBUG ((DEBUG_INFO, "Msc0Size: %x\n", FspmUpd->FspmConfig.Msc0Size)); + DEBUG ((DEBUG_INFO, "Msc0Wrap: %x\n", FspmUpd->FspmConfig.Msc0Wrap)); + DEBUG ((DEBUG_INFO, "Msc1Size: %x\n", FspmUpd->FspmConfig.Msc1Size)); + DEBUG ((DEBUG_INFO, "Msc1Wrap: %x\n", FspmUpd->FspmConfig.Msc1Wrap)); + DEBUG ((DEBUG_INFO, "PtiMode: %x\n", FspmUpd->FspmConfig.PtiMode)); + DEBUG ((DEBUG_INFO, "PtiTraining: %x\n", FspmUpd->FspmConfig.PtiTraining)); + DEBUG ((DEBUG_INFO, "PtiSpeed: %x\n", FspmUpd->FspmConfig.PtiSpeed)); + DEBUG ((DEBUG_INFO, "PunitMlvl: %x\n", FspmUpd->FspmConfig.PunitMlvl)); + DEBUG ((DEBUG_INFO, "PmcMlvl: %x\n", FspmUpd->FspmConfig.PmcMlvl)); + DEBUG ((DEBUG_INFO, "SwTraceEn: %x\n", FspmUpd->FspmConfig.SwTraceEn)); + } DEBUG ((DEBUG_INFO, "Wrapper-PeiFspSaPolicyInitPreMem - End\n")); diff --git a/Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformSetupDxe/DebugConfig.vfi b/Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformSetupDxe/DebugConfig.vfi index 235ce44371..16460a71ac 100644 --- a/Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformSetupDxe/DebugConfig.vfi +++ b/Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformSetupDxe/DebugConfig.vfi @@ -159,6 +159,147 @@ form formid = DEBUG_CONFIGURATION_FORM_ID, flags = INTERACTIVE, key = 0x1239; //KEY_DATA_CLEAR_KEYS; + subtitle text = STRING_TOKEN(STR_NULL_STRING); + + goto DEBUG_NPK_FORM_ID, + prompt = STRING_TOKEN(STR_DEBUG_NPK_TITLE), + help = STRING_TOKEN(STR_DEBUG_NPK_HELP); endform; + // + // NPK Configuration + // + form formid = DEBUG_NPK_FORM_ID, + title = STRING_TOKEN(STR_DEBUG_NPK_TITLE); + + oneof varid = Setup.NpkEn, + prompt = STRING_TOKEN(STR_NPK_ENABLE_PROMPT), + help = STRING_TOKEN(STR_NPK_ENABLE_HELP), + option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_DEBUGGER), value = 2, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_AUTO), value = 3, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED; + endoneof; + + suppressif ideqval Setup.NpkEn == 2; + + oneof varid = Setup.FwTraceEn, + prompt = STRING_TOKEN(STR_NPK_FWEN_PROMPT), + help = STRING_TOKEN(STR_NPK_FWEN_HELP), + option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = DEFAULT | MANUFACTURING |RESET_REQUIRED; + endoneof; + + oneof varid = Setup.SwTraceEn, + prompt = STRING_TOKEN(STR_NPK_SWEN_PROMPT), + help = STRING_TOKEN(STR_NPK_SWEN_HELP), + option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = DEFAULT | MANUFACTURING |RESET_REQUIRED; + option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = RESET_REQUIRED; + endoneof; + + oneof varid = Setup.FwTraceDestination, + prompt = STRING_TOKEN(STR_NPK_FWDESTINATION_PROMPT), + help = STRING_TOKEN(STR_NPK_FWDESTINATION_HELP), + option text = STRING_TOKEN(STR_MEMORY0), value = 1, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_PTI), value = 4, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED; + option text = STRING_TOKEN(STR_USB3), value = 2, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_BSSB), value = 3, flags = RESET_REQUIRED; + endoneof; + + oneof varid = Setup.RecoverDump, + prompt = STRING_TOKEN(STR_NPK_RECOVERY_DUMP_PROMPT), + help = STRING_TOKEN(STR_NPK_RECOVERY_DUMP_HELP), + option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = DEFAULT | MANUFACTURING |RESET_REQUIRED; + option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = RESET_REQUIRED; + endoneof; + + oneof varid = Setup.Msc0Size, + prompt = STRING_TOKEN(STR_NPK_MSC0SIZE_PROMPT), + help = STRING_TOKEN(STR_NPK_MSC0SIZE_HELP), + option text = STRING_TOKEN(STR_NONE), value = 0, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED; + option text = STRING_TOKEN(STR_1MB), value = 1, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_8MB), value = 8, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_64MB), value = 64, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_128MB), value = 128, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_256MB), value = 256, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_512MB), value = 512, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_1GB), value = 1024, flags = RESET_REQUIRED; + endoneof; + oneof varid = Setup.Msc0Wrap, + prompt = STRING_TOKEN(STR_NPK_MSC0WRAP_PROMPT), + help = STRING_TOKEN(STR_NPK_MSC0WRAP_HELP), + option text = STRING_TOKEN(STR_NOWRAP), value = 0, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_WRAP), value = 1, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED; + endoneof; + oneof varid = Setup.Msc1Size, + prompt = STRING_TOKEN(STR_NPK_MSC1SIZE_PROMPT), + help = STRING_TOKEN(STR_NPK_MSC1SIZE_HELP), + option text = STRING_TOKEN(STR_NONE), value = 0, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED; + option text = STRING_TOKEN(STR_1MB), value = 1, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_8MB), value = 8, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_64MB), value = 64, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_128MB), value = 128, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_256MB), value = 256, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_512MB), value = 512, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_1GB), value = 1024, flags = RESET_REQUIRED; + endoneof; + oneof varid = Setup.Msc1Wrap, + prompt = STRING_TOKEN(STR_NPK_MSC1WRAP_PROMPT), + help = STRING_TOKEN(STR_NPK_MSC1WRAP_HELP), + option text = STRING_TOKEN(STR_NOWRAP), value = 0, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_WRAP), value = 1, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED; + endoneof; + + oneof varid = Setup.PtiMode, + prompt = STRING_TOKEN(STR_NPK_PTIMODE_PROMPT), + help = STRING_TOKEN(STR_NPK_PTIMODE_HELP), + option text = STRING_TOKEN(STR_OFF), value = 4, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_X4), value = 1, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED; + option text = STRING_TOKEN(STR_X8), value = 2, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_X16), value = 8, flags = RESET_REQUIRED; + endoneof; + + oneof varid = Setup.PtiTraining, + prompt = STRING_TOKEN(STR_NPK_PTITRAINING_PROMPT), + help = STRING_TOKEN(STR_NPK_PTITRAINING_HELP), + option text = STRING_TOKEN(STR_OFF), value = 0, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED; + option text = STRING_TOKEN(STR_1), value = 1, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_2), value = 2, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_3), value = 3, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_4), value = 4, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_5), value = 5, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_6), value = 6, flags = RESET_REQUIRED; + endoneof; + + oneof varid = Setup.PtiSpeed, + prompt = STRING_TOKEN(STR_NPK_PTISPEED_PROMPT), + help = STRING_TOKEN(STR_NPK_PTISPEED_HELP), + option text = STRING_TOKEN(STR_FULL), value = 0, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_HALF), value = 1, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_QUARTER), value = 2, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED; + endoneof; + + oneof varid = Setup.PunitMlvl, + prompt = STRING_TOKEN(STR_PUINT_MESSAGE_LEVEL_PROMPT), + help = STRING_TOKEN(STR_PUINT_MESSAGE_LEVEL_HELP), + option text = STRING_TOKEN(STR_DEBUG_MESSAGE_LEVEL_0), value = 0, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_DEBUG_MESSAGE_LEVEL_1), value = 1, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED; + option text = STRING_TOKEN(STR_DEBUG_MESSAGE_LEVEL_2), value = 2, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_DEBUG_MESSAGE_LEVEL_3), value = 3, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_DEBUG_MESSAGE_LEVEL_4), value = 4, flags = RESET_REQUIRED; + endoneof; + + oneof varid = Setup.PmcMlvl, + prompt = STRING_TOKEN(STR_PMC_MESSAGE_LEVEL_PROMPT), + help = STRING_TOKEN(STR_PMC_MESSAGE_LEVEL_HELP), + option text = STRING_TOKEN(STR_DEBUG_MESSAGE_LEVEL_0), value = 0, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_DEBUG_MESSAGE_LEVEL_1), value = 1, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED; + option text = STRING_TOKEN(STR_DEBUG_MESSAGE_LEVEL_2), value = 2, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_DEBUG_MESSAGE_LEVEL_3), value = 3, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_DEBUG_MESSAGE_LEVEL_4), value = 4, flags = RESET_REQUIRED; + endoneof; + + endif; + + endform; //End of DEBUG_NPK_FORM_ID diff --git a/Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformSetupDxe/VfrStrings.uni b/Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformSetupDxe/VfrStrings.uni index bb53da281824b22ebff1c370df87c7e0409b1fb9..3debc2856aa54861345c1d42d744298d6206ceca 100644 GIT binary patch delta 3971 zcmbVP+fS576rb;#4-u8Zx}nxkbQe(6ZDAJ#K}}_4mrJ={1lq(4B3e@J3fhNOXiQ8S zW5KD;lWD0hHfdU{ZETvRkv{lfjm9QT6Vs%SSQBh2;6Gr0XTEQ5u-qB~yEAjnZ_ed+ z&K$mYwEpfL``|h4ocEI)bTRB&7o#?XEyH`|Cf^n= zqB%sb%VnKw>)RvG|WH@ZeK>xWJ&klKORH5UU`ZRaJ-FKvFKKnxG$i7MCX*b{*7vo2UmZXRaE ztO-&>TrZRE=URF^tsSfZVlAvy&fep8`CEeFhzm-~NkcCaM`8@o6PN0V5GUgSxTs;u zxuhT(^TGFe+*ih`WXoP{pR!{6d{`gAPbzOIQbDg3+=i%d%qu1z?30PBHTUxI5Vy^8 z=1aa#UK%kf$VD-8=p|bnZa)!>v>Wu8>~(TjEj%xm%fvc;M{JF9!XZ7UwJmc0b-qK6 zjq9b--L0+RIZznMb@F;vFTGE=Uk-nux#RZ3@p`u3%16BEL?yP0ShJ{}E~DEw)A|6y zYVM!Gw^o(!c?Y~xH*~P~U^Zl8)V>^Q&=rLj z5{nP0ds!9pDRC7UG5nE{ViGXE_o~`QcVBrz=tAM%^LAp$KC=%eel0hj(@Bd zh}+5OP7-tAs7(c80H1wiD8%|%C+o4$k{3afH}d%|#o&qa?i{P$qaYp&AhP4Qg-F+r zy8;Dj56_nySt?_1i{96Y0-Q;i#~Gx$A5a9=C--G)X<{aOO+?z=@`YRTlWB^!u1bh@ zs)j)xE)S4bvnt_itfWqbzJ%T&h7z1I`zbG_1{CW7mB2Yg^gsWxHuJ5`(aAJ<@n7yE z$+$eW)7qYW?3AxQ4M6+q}mnpEdsX;5uRvuf84NHQu5>HtP7;1_{ zkjb+onNTxJlgYCJGA#rc5i}3Ev1mT#z$`x>CiG(YSP8WCw5g6PAAZf#L{05BG4@${ z0=+ZTOS?gfKp}@qiyH^g&hcWv@j0@TX{}j~UNBC_rm|+#hN>an%<|PEKs-_h`N0E^ z9N(+g2HwipX69kp<{^N-Id3#kuTa~07D=s#(Y(BYNTVLcPaf%6Vk~{<#(-7k``iwC z({JD%SU}tJ*OJ<`_qkL2bh$wlG5AVdN)@UY{MOv$NPt=Jo6Z^oaw1bR)abxqR+KS&I}r7Vp3Ty@J1({^5T#&fF&GO9b(&u>U5Xoe|RpW zbGKejS+kj$s7G^e!%v`~BV@hT3_sNt3Td9Ss?lP+A{BBn!!RFTQFzC&bzt6dpx8pV zvzIj|_d?LN+wjQ3PR*B8iq79b;RqKb$hEbA^dd(M)|e%axb(c_T6CQjbe~f&6|+{j zmZUJp7D3?vtC8d1^D;6yxmt~J{V+p~e-RqvnTGS$#5BLJ%gmelD`*{Nhpa~}hL3Hu zUU+Q7X>e@2l$xFuCQD_ol9`PziaxVNn4n;nF|*Bq3!m9mhG%uEM&zRiLqh}e%7?j{ zT^9b1C+l|d)|B}}w<(*YWUuCGS@uA1=YaT0-#b@71LLRzV@el(yck%ju=1g?bRzpy zl#xR{NGnErwm1(^J>$m1XhJmj)7{=yGf8%O?`^Yk9HjqKg^|+N|nTgLsUQ^ za+1`N;la2{gowaWp;0plXfp>zMI|k|nW3mSRR3~qjDQVgky=f?o+Br&>FM@R?5Y$` z{HAX5g1YRmnEb_~lx-p93Miv+(Ry5qsnVNc>TU?>(p5er1(WnL5WLs9i#k)1#YvU- iQmB`((k1<_9W+e8H-@gC!x?$w1y8>9^K*Xe$NvDx+=i$C delta 46 zcmV+}0MY--#uK925`csOgaWh!#_yA$^ca^=OaTO!&>933w=fz6xB{1q8vzct