From cad28570bc8923b06a2b92a5123ebd7200f2c014 Mon Sep 17 00:00:00 2001 From: Vladislav Rassokhin Date: Thu, 1 Sep 2022 20:36:10 +0200 Subject: [PATCH] IDEA-296416 WinElevator: convert to CMake GitOrigin-RevId: f047b4332a47323b22b7e16681e0f2ae9df71252 --- native/WinElevator/CMakeLists.txt | 42 +++++ native/WinElevator/Elevator.sln | 57 ------ native/WinElevator/README.txt | 14 +- native/WinElevator/WinElevator.rc | 41 +++++ .../elevShared/elevShared.vcxitems | 19 -- .../elevShared/elevShared.vcxitems.filters | 6 - .../WinElevator/{elevShared => }/elevTools.h | 0 native/WinElevator/{elevator => }/elevator.c | 0 native/WinElevator/elevator/Resource.rc | Bin 5200 -> 0 bytes native/WinElevator/elevator/elevator.vcxproj | 173 ------------------ .../elevator/elevator.vcxproj.filters | 20 -- .../elevator/elevator.vcxproj.user | 4 - native/WinElevator/elevator/resource.h | Bin 904 -> 0 bytes native/WinElevator/{launcher => }/launcher.c | 0 native/WinElevator/launcher/Resource.rc | Bin 5200 -> 0 bytes native/WinElevator/launcher/launcher.vcxproj | 173 ------------------ .../launcher/launcher.vcxproj.filters | 20 -- .../launcher/launcher.vcxproj.user | 4 - native/WinElevator/launcher/resource.h | Bin 904 -> 0 bytes 19 files changed, 93 insertions(+), 480 deletions(-) create mode 100644 native/WinElevator/CMakeLists.txt delete mode 100644 native/WinElevator/Elevator.sln create mode 100644 native/WinElevator/WinElevator.rc delete mode 100644 native/WinElevator/elevShared/elevShared.vcxitems delete mode 100644 native/WinElevator/elevShared/elevShared.vcxitems.filters rename native/WinElevator/{elevShared => }/elevTools.h (100%) rename native/WinElevator/{elevator => }/elevator.c (100%) delete mode 100644 native/WinElevator/elevator/Resource.rc delete mode 100644 native/WinElevator/elevator/elevator.vcxproj delete mode 100644 native/WinElevator/elevator/elevator.vcxproj.filters delete mode 100644 native/WinElevator/elevator/elevator.vcxproj.user delete mode 100644 native/WinElevator/elevator/resource.h rename native/WinElevator/{launcher => }/launcher.c (100%) delete mode 100644 native/WinElevator/launcher/Resource.rc delete mode 100644 native/WinElevator/launcher/launcher.vcxproj delete mode 100644 native/WinElevator/launcher/launcher.vcxproj.filters delete mode 100644 native/WinElevator/launcher/launcher.vcxproj.user delete mode 100644 native/WinElevator/launcher/resource.h diff --git a/native/WinElevator/CMakeLists.txt b/native/WinElevator/CMakeLists.txt new file mode 100644 index 000000000000..abf57276587c --- /dev/null +++ b/native/WinElevator/CMakeLists.txt @@ -0,0 +1,42 @@ +cmake_minimum_required(VERSION 3.16 FATAL_ERROR) +project(WinElevator) + +if (NOT WIN32) + message(FATAL_ERROR "Windows only.") +endif () + +if (DEFINED ENV{BUILD_NUMBER}) + set(BUILD_NUMBER $ENV{BUILD_NUMBER}) +else() + set(BUILD_NUMBER 9999) +endif() + +string(TIMESTAMP YEAR "%Y") + +set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT") + +add_compile_definitions("UNICODE" "_UNICODE") + +include_directories("${CMAKE_CURRENT_SOURCE_DIR}") + +function(define_project_part target) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/WinElevator.rc ${CMAKE_CURRENT_BINARY_DIR}/${target}.rc @ONLY) + + add_executable(${target} "${target}.c" ${CMAKE_CURRENT_BINARY_DIR}/${target}.rc) + + target_compile_options(${target} PRIVATE "/sdl" "/Oi" "/Ob2" "/FC" "/GL" "/Zi" "/EHsc" "/Gy") + + target_link_options(${target} PRIVATE "/DEBUG" "/OPT:REF" "/OPT:ICF" "/LTCG:incremental" "/pdbaltpath:%_PDB%") + + set_target_properties(${target} PROPERTIES + MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>" + ) + + set_source_files_properties(jb.ico PROPERTIES LANGUAGE RC) +endfunction() + +define_project_part(elevator) +define_project_part(launcher) + +target_link_options(elevator PRIVATE "/MANIFESTUAC:level=requireAdministrator" "/MANIFESTUAC:uiAccess=false") +target_link_options(launcher PRIVATE "/MANIFESTUAC:level=asInvoker" "/MANIFESTUAC:uiAccess=false") diff --git a/native/WinElevator/Elevator.sln b/native/WinElevator/Elevator.sln deleted file mode 100644 index 14b657754efc..000000000000 --- a/native/WinElevator/Elevator.sln +++ /dev/null @@ -1,57 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.1169 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "launcher", "launcher\launcher.vcxproj", "{6631215A-50A4-49BE-A0B5-BDAC4C75B955}" - ProjectSection(ProjectDependencies) = postProject - {9D71A73C-2570-488A-958B-A126F4EEECB7} = {9D71A73C-2570-488A-958B-A126F4EEECB7} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "elevator", "elevator\elevator.vcxproj", "{9D71A73C-2570-488A-958B-A126F4EEECB7}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "elevShared", "elevShared\elevShared.vcxitems", "{45D41ACC-2C3C-43D2-BC10-02AA73FFC7C7}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{0AFC8DF7-8237-4909-8993-9CF44995AA42}" - ProjectSection(SolutionItems) = preProject - jb.ico = jb.ico - README.txt = README.txt - EndProjectSection -EndProject -Global - GlobalSection(SharedMSBuildProjectFiles) = preSolution - elevShared\elevShared.vcxitems*{45d41acc-2c3c-43d2-bc10-02aa73ffc7c7}*SharedItemsImports = 9 - elevShared\elevShared.vcxitems*{6631215a-50a4-49be-a0b5-bdac4c75b955}*SharedItemsImports = 4 - elevShared\elevShared.vcxitems*{9d71a73c-2570-488a-958b-a126f4eeecb7}*SharedItemsImports = 4 - EndGlobalSection - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6631215A-50A4-49BE-A0B5-BDAC4C75B955}.Debug|x64.ActiveCfg = Debug|x64 - {6631215A-50A4-49BE-A0B5-BDAC4C75B955}.Debug|x64.Build.0 = Debug|x64 - {6631215A-50A4-49BE-A0B5-BDAC4C75B955}.Debug|x86.ActiveCfg = Debug|Win32 - {6631215A-50A4-49BE-A0B5-BDAC4C75B955}.Debug|x86.Build.0 = Debug|Win32 - {6631215A-50A4-49BE-A0B5-BDAC4C75B955}.Release|x64.ActiveCfg = Release|x64 - {6631215A-50A4-49BE-A0B5-BDAC4C75B955}.Release|x64.Build.0 = Release|x64 - {6631215A-50A4-49BE-A0B5-BDAC4C75B955}.Release|x86.ActiveCfg = Release|Win32 - {6631215A-50A4-49BE-A0B5-BDAC4C75B955}.Release|x86.Build.0 = Release|Win32 - {9D71A73C-2570-488A-958B-A126F4EEECB7}.Debug|x64.ActiveCfg = Debug|x64 - {9D71A73C-2570-488A-958B-A126F4EEECB7}.Debug|x64.Build.0 = Debug|x64 - {9D71A73C-2570-488A-958B-A126F4EEECB7}.Debug|x86.ActiveCfg = Debug|Win32 - {9D71A73C-2570-488A-958B-A126F4EEECB7}.Debug|x86.Build.0 = Debug|Win32 - {9D71A73C-2570-488A-958B-A126F4EEECB7}.Release|x64.ActiveCfg = Release|x64 - {9D71A73C-2570-488A-958B-A126F4EEECB7}.Release|x64.Build.0 = Release|x64 - {9D71A73C-2570-488A-958B-A126F4EEECB7}.Release|x86.ActiveCfg = Release|Win32 - {9D71A73C-2570-488A-958B-A126F4EEECB7}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {85FF99CC-5338-4566-82A4-C1D7BE51DED1} - EndGlobalSection -EndGlobal diff --git a/native/WinElevator/README.txt b/native/WinElevator/README.txt index 13d6f68240c2..8efa17b9ab9c 100644 --- a/native/WinElevator/README.txt +++ b/native/WinElevator/README.txt @@ -21,15 +21,21 @@ The launcher then creates threads to read/write them to the console. ------- How to build. +CMake: 3.16 or newer ToolChain: VisualStudio 2017 SDK: 8.1 (for "launcher and elevator") -You may open .sln from Visual Studio or use msbuild from VS command prompt: - msbuild Elevator.sln /p:Configuration=release /property:Platform=x86 +``` +if exist build rmdir /s /q build +mkdir build && cd build +cmake -F "Visual Studio 15 2017" -T v141 -A Win32 -DCMAKE_SYSTEM_VERSION="8.1" .. +cmake --build . --config RelWithDebInfo -- -clp:ShowCommandLine -Building and signing on TC: -To sign binary you need to build and sign it on TC. +``` + +Building and signing on TeamCity: +To sign binary you need to build and sign it on TeamCity. Run https://buildserver.labs.intellij.net/viewType.html?buildTypeId=ijplatform_master_Idea_NativeHelpers_WindowsFileWatcher Download artifact and store in VCS diff --git a/native/WinElevator/WinElevator.rc b/native/WinElevator/WinElevator.rc new file mode 100644 index 000000000000..7d4af312a2fa --- /dev/null +++ b/native/WinElevator/WinElevator.rc @@ -0,0 +1,41 @@ +#define VERSION 1,0,0,@BUILD_NUMBER@ +#define VERSION_STR "1.0.0.@BUILD_NUMBER@\0" +#define FILE_NAME "elevator.exe" +#define COPYRIGHT "Copyright 2007-@YEAR@ JetBrains s.r.o." + +#pragma code_page(65001) + +1 VERSIONINFO + FILEVERSION VERSION + PRODUCTVERSION VERSION + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L // VOS_NT_WINDOWS32 + FILETYPE 0x1L // VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "0000fde9" + BEGIN + VALUE "CompanyName", "JetBrains s.r.o." + VALUE "FileDescription", "Part of elevator/launcher UAC IntelliJ kit" + VALUE "FileVersion", VERSION_STR + VALUE "InternalName", FILE_NAME + VALUE "LegalCopyright", COPYRIGHT + VALUE "OriginalFilename", FILE_NAME + VALUE "ProductName", "IntelliJ Platform" + VALUE "ProductVersion", VERSION_STR + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0, 0xfde9 + END +END + +101 ICON "jb.ico" \ No newline at end of file diff --git a/native/WinElevator/elevShared/elevShared.vcxitems b/native/WinElevator/elevShared/elevShared.vcxitems deleted file mode 100644 index 2d374beb796f..000000000000 --- a/native/WinElevator/elevShared/elevShared.vcxitems +++ /dev/null @@ -1,19 +0,0 @@ - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - true - {45d41acc-2c3c-43d2-bc10-02aa73ffc7c7} - - - - %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) - - - - - - - - - \ No newline at end of file diff --git a/native/WinElevator/elevShared/elevShared.vcxitems.filters b/native/WinElevator/elevShared/elevShared.vcxitems.filters deleted file mode 100644 index cdd7d46ee8f4..000000000000 --- a/native/WinElevator/elevShared/elevShared.vcxitems.filters +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/native/WinElevator/elevShared/elevTools.h b/native/WinElevator/elevTools.h similarity index 100% rename from native/WinElevator/elevShared/elevTools.h rename to native/WinElevator/elevTools.h diff --git a/native/WinElevator/elevator/elevator.c b/native/WinElevator/elevator.c similarity index 100% rename from native/WinElevator/elevator/elevator.c rename to native/WinElevator/elevator.c diff --git a/native/WinElevator/elevator/Resource.rc b/native/WinElevator/elevator/Resource.rc deleted file mode 100644 index 06b523e0bd72ff21ac13cadcd20a9e3dc86a368b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5200 zcmd6rZEqS!5Xa|rrGAGie$%LtZIVcRZDWjRu|eTMtz^k^Y;b68V;zttQa^j!-+!0M z-El`+XkMVxvU_v8vorsB*jfJm>&T8Qu?w5pt)(`zIc;JKXd`HITiT61@Yb*&coMs} zu|3gJ=nMKgXeqtcEg9W1PIwcysXa62(7v^A*ySkn2T-5*`oQeFFt=7(e`xQm7G`VZ zL6|oQ>%{xSde*mr4eiX@*0pPUYfY$Uj4!QYze4Hrdts+gI*fgP$*_NqOXq!JEpS=K zcmhf@dqn>Q=m>`aTK~dt8?77YDLk6cU(wbr^6xhIBj6j?74hFc#9X529ZRs1Cr!|M zH{WpNo$r42E?t73FNv%%r^ zOIA;Hmc6p$RiK$?y~H&eFC#7l=tA^8kE1N+G&JZv9ub4OTjd4KyF z2=v%%Mt)f0A&U~mZiCE6ddMU1QiP^RvkltCy>|DPtUhqREK`aZVT8=-XB?%~wi%}A z^8>i4?wzmD$Va8}eat_~3U%ri<)VB%WzuFNeOKGB6FM)AOXs~Z$Sqz_KBu)R`mz-F%Qf(R rX_S}7qsaUJ`%jDRBwzlg#j(swv0r0JxY@&>hy+Dx`G1wN-Nor2vQloJ diff --git a/native/WinElevator/elevator/elevator.vcxproj b/native/WinElevator/elevator/elevator.vcxproj deleted file mode 100644 index c60935440c33..000000000000 --- a/native/WinElevator/elevator/elevator.vcxproj +++ /dev/null @@ -1,173 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - {9D71A73C-2570-488A-958B-A126F4EEECB7} - Win32Proj - elevator - 8.1 - - - - Application - true - v141 - Unicode - - - Application - false - v141 - true - Unicode - - - Application - true - v141 - Unicode - - - Application - false - v141 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - true - $(IncludePath); - $(VC_SourcePath); - - - true - $(IncludePath); - $(VC_SourcePath); - - - false - $(IncludePath); - $(VC_SourcePath); - - - false - $(IncludePath); - $(VC_SourcePath); - - - - NotUsing - Level3 - Disabled - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - MultiThreadedDebug - - - Console - true - RequireAdministrator - - - - - NotUsing - Level3 - Disabled - _DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - MultiThreadedDebug - - - Console - true - RequireAdministrator - - - - - Level3 - NotUsing - MaxSpeed - true - true - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - MultiThreaded - - - Console - true - true - true - RequireAdministrator - - - - - Level3 - NotUsing - MaxSpeed - true - true - NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - MultiThreaded - - - Console - true - true - true - RequireAdministrator - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/native/WinElevator/elevator/elevator.vcxproj.filters b/native/WinElevator/elevator/elevator.vcxproj.filters deleted file mode 100644 index 95c15a4ebd8a..000000000000 --- a/native/WinElevator/elevator/elevator.vcxproj.filters +++ /dev/null @@ -1,20 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - - - Source Files - - - - - - - - - \ No newline at end of file diff --git a/native/WinElevator/elevator/elevator.vcxproj.user b/native/WinElevator/elevator/elevator.vcxproj.user deleted file mode 100644 index abe8dd8961e3..000000000000 --- a/native/WinElevator/elevator/elevator.vcxproj.user +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/native/WinElevator/elevator/resource.h b/native/WinElevator/elevator/resource.h deleted file mode 100644 index 2d7667c16f37b9980f17e3c89cae748edfc5a34d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 904 zcmb7@+e*Vw5JmU1;6EJbqhPK21GULRu}LMhMW2FA8>y5QlEw?-ud8cLFSH=RGEC;e zoIQJH$j^6EO?@J<`brfj)EydoFIGogqJh4UQ=L%TlvAXcG8I~?M02gkjmVX%^rSga zM`wuBv!+_01^E?rLT*MTqpBjB66a**c;|Z^hG4C$$NHcqA+lZ-NSUuSyJcjy;n57s z`Z;(9Xo_~2ELMx$G1Ah7E`5h>7YE8z?|xcio-;vaVn}90RgXAiszb4TUHu!`ZW1AFx&^hkPS+rtw2nfL knIQ4=*0FY=9*4c&q}`$(*S2HWTh{g;O#H3a+dqtd0a~|xh5!Hn diff --git a/native/WinElevator/launcher/launcher.c b/native/WinElevator/launcher.c similarity index 100% rename from native/WinElevator/launcher/launcher.c rename to native/WinElevator/launcher.c diff --git a/native/WinElevator/launcher/Resource.rc b/native/WinElevator/launcher/Resource.rc deleted file mode 100644 index c090d3ea64a4dd4bdfb328e82e6bcb4206e96abf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5200 zcmd6rZEqS!5Xa|rrGAGie$%LtZIVcRZDWjRu|eTMtz^k^Y;b68V;zttQa^j!-+!0M z-El`+XkMVxvU_v8vorsB*jfJm>&T8Qu?w5pt)(`zIc;JKXd`HITiT61@Yb*&coMs} zu|3gJ=nMKgXeqtcEg9W1PIwcysXa62(7v^A*ySkn2T-5*`oQeFFt=7(e`xQm7G`VZ zL6|oQ>%{xSde*mr4eiX@*0pPUYfY$Uj4!QYze4Hrdts+gI*fgP$*_NqOXq!JEpS=K zcmhf@dqn>Q=m>`aTK~dt8?77YDLk6cU(wbr^6xhIBj6j?74hFc#9X529ZRs1Cr!|M zH{WpNo$r42E?t73FNv%%r^ zOIA;Hmc6p$RiK$?y~H&eFC#7l=tA^8kE1N+G&JZv9ub4OTjd4KyF z2=v%%Mt)f0A&U~mZiCE6ddMU1QiP^RvkltCy>|DPtUhqREK`aZVT8=-XB?%~wi%}A z^8>i4?wzmD$Va8}eat_~3U%ri<)VB%WzuFNeOKGB6FM)AOXs~Z$Sqz_KBu)R`mz-F%Qf(R rX_S}7qsaUJ`%jDRBwzlg#j(swv0r0JxY@&>hy+Dx`G1wN-Nor2z%Oop diff --git a/native/WinElevator/launcher/launcher.vcxproj b/native/WinElevator/launcher/launcher.vcxproj deleted file mode 100644 index 54e654c7d7d5..000000000000 --- a/native/WinElevator/launcher/launcher.vcxproj +++ /dev/null @@ -1,173 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - {6631215A-50A4-49BE-A0B5-BDAC4C75B955} - Win32Proj - launcher - 8.1 - - - - Application - true - v141 - Unicode - - - Application - false - v141 - true - Unicode - - - Application - true - v141 - Unicode - - - Application - false - v141 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - true - $(IncludePath); - $(VC_SourcePath); - - - true - $(IncludePath); - $(VC_SourcePath); - - - false - $(IncludePath); - $(VC_SourcePath); - - - false - $(IncludePath); - $(VC_SourcePath); - - - - NotUsing - Level3 - Disabled - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - MultiThreadedDebug - - - Console - true - AsInvoker - - - - - NotUsing - Level3 - Disabled - _DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - MultiThreadedDebug - - - Console - true - AsInvoker - - - - - Level3 - NotUsing - MaxSpeed - true - true - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - MultiThreaded - - - Console - true - true - true - AsInvoker - - - - - Level3 - NotUsing - MaxSpeed - true - true - NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - MultiThreaded - - - Console - true - true - true - AsInvoker - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/native/WinElevator/launcher/launcher.vcxproj.filters b/native/WinElevator/launcher/launcher.vcxproj.filters deleted file mode 100644 index df5657aca5e5..000000000000 --- a/native/WinElevator/launcher/launcher.vcxproj.filters +++ /dev/null @@ -1,20 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - - - Source Files - - - - - - - - - \ No newline at end of file diff --git a/native/WinElevator/launcher/launcher.vcxproj.user b/native/WinElevator/launcher/launcher.vcxproj.user deleted file mode 100644 index abe8dd8961e3..000000000000 --- a/native/WinElevator/launcher/launcher.vcxproj.user +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/native/WinElevator/launcher/resource.h b/native/WinElevator/launcher/resource.h deleted file mode 100644 index 661a5bafe934e510a47acc370bb204f1565ef86f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 904 zcmb7?-Acni5QWdR;5#hzQm|Hhf!gGv*rw7y^eWicNTpb48h;R9UHxX)(pGA)44c^* zX3w0NldsRZ>Uzf#^^_`7tZPoM#N;R8RCqO`phml^|ul*8G~0`I<*F zEbHgs9dS}li^&o-$Q@!0o$eEw=Ci?-}(0&#B4w2O4VR*_$G5x{jIP3LPTvu&tQ$C_Y~8f)!KTj^V=`l^I>a$k?V9cD{NKo?Nf&FLs;9qRjeJThhc|Jnikc#ww=vCR6~7J%#;h;-;KWkR}+1N