From 495cf99aaf40fb1c0859e528d5b2c52018fba09f Mon Sep 17 00:00:00 2001 From: Mark Hammond Date: Mon, 7 Apr 2008 01:53:39 +0000 Subject: [PATCH] Issue #2513: enable 64bit cross compilation on windows. --- Doc/distutils/builtdist.rst | 36 ++++++++ Lib/distutils/command/bdist.py | 6 +- Lib/distutils/command/bdist_msi.py | 20 +++-- Lib/distutils/command/bdist_wininst.py | 28 ++++-- Lib/distutils/command/build.py | 18 +++- Lib/distutils/command/build_ext.py | 30 ++++++- Lib/distutils/command/install.py | 9 ++ Lib/distutils/command/wininst-9.0-amd64.exe | Bin 0 -> 76288 bytes Lib/distutils/msvc9compiler.py | 72 ++++++++------- Lib/distutils/msvccompiler.py | 2 +- Lib/distutils/util.py | 4 +- Misc/NEWS | 4 + PC/example_nt/readme.txt | 34 +++++-- PC/example_nt/setup.py | 22 +++++ PCbuild/bdist_wininst.vcproj | 95 +++++++++++++++++++- PCbuild/pcbuild.sln | 8 +- 16 files changed, 323 insertions(+), 65 deletions(-) create mode 100644 Lib/distutils/command/wininst-9.0-amd64.exe create mode 100644 PC/example_nt/setup.py diff --git a/Doc/distutils/builtdist.rst b/Doc/distutils/builtdist.rst index 2ebc9860f1e9..f009bbb9288d 100644 --- a/Doc/distutils/builtdist.rst +++ b/Doc/distutils/builtdist.rst @@ -329,6 +329,42 @@ version number. This can be changed to another text by using the The installer file will be written to the "distribution directory" --- normally :file:`dist/`, but customizable with the :option:`--dist-dir` option. +.. _cross-compile-windows: + +Cross-compiling on Windows +===================== + +Starting with Python 2.6, distutils is capable of cross-compiling between +Windows platforms. In practice, this means that with the correct tools +installed, you can use a 32bit version of Windows to create 64bit extensions +and vice-versa. + +To build for an alternate platform, specify the :option:`--plat-name` option +to the build command. Valid values are currently 'win32', 'win-amd64' and +'win-ia64'. For example, on a 32bit version of Windows, you could execute:: + + python setup.py build --plat-name=win-amd64 + +to build a 64bit version of your extension. The Windows Installers also +support this option, so the command:: + + python setup.py build --plat-name=win-amd64 bdist_wininst + +would create a 64bit installation executable on your 32bit version of Windows. + +To cross-compile, you must download the Python source code and cross-compile +Python itself for the platform you are targetting - it is not possible from a +binary installtion of Python (as the .lib etc file for other platforms are +not included.) In practice, this means the user of a 32 bit operating +system will need to use Visual Studio 2008 to open the +:file:`PCBuild/PCbuild.sln` solution in the Python source tree and build the +"x64" configuration of the 'pythoncore' project before cross-compiling +extensions is possible. + +Note that by default, Visual Studio 2008 does not install 64bit compilers or +tools. You may need to reexecute the Visual Studio setup process and select +these tools (using Control Panel->[Add/Remove] Programs is a convenient way to +check or modify your existing install.) .. _postinstallation-script: diff --git a/Lib/distutils/command/bdist.py b/Lib/distutils/command/bdist.py index d6897d2d09b1..ca3da74c0672 100644 --- a/Lib/distutils/command/bdist.py +++ b/Lib/distutils/command/bdist.py @@ -97,7 +97,10 @@ class bdist (Command): def finalize_options (self): # have to finalize 'plat_name' before 'bdist_base' if self.plat_name is None: - self.plat_name = get_platform() + if self.skip_build: + self.plat_name = get_platform() + else: + self.plat_name = self.get_finalized_command('build').plat_name # 'bdist_base' -- parent of per-built-distribution-format # temporary directories (eg. we'll probably have @@ -121,7 +124,6 @@ class bdist (Command): # finalize_options() - def run (self): # Figure out which sub-commands we need to run. diff --git a/Lib/distutils/command/bdist_msi.py b/Lib/distutils/command/bdist_msi.py index a4014525b72c..f94d9579d216 100644 --- a/Lib/distutils/command/bdist_msi.py +++ b/Lib/distutils/command/bdist_msi.py @@ -9,11 +9,11 @@ Implements the bdist_msi command. import sys, os from distutils.core import Command -from distutils.util import get_platform from distutils.dir_util import remove_tree from distutils.sysconfig import get_python_version from distutils.version import StrictVersion from distutils.errors import DistutilsOptionError +from distutils.util import get_platform from distutils import log import msilib from msilib import schema, sequence, text @@ -87,6 +87,9 @@ class bdist_msi (Command): user_options = [('bdist-dir=', None, "temporary directory for creating the distribution"), + ('plat-name=', 'p', + "platform name to embed in generated filenames " + "(default: %s)" % get_platform()), ('keep-temp', 'k', "keep the pseudo-installation tree around after " + "creating the distribution archive"), @@ -116,6 +119,7 @@ class bdist_msi (Command): def initialize_options (self): self.bdist_dir = None + self.plat_name = None self.keep_temp = 0 self.no_target_compile = 0 self.no_target_optimize = 0 @@ -139,7 +143,10 @@ class bdist_msi (Command): else: self.target_version = short_version - self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) + self.set_undefined_options('bdist', + ('dist_dir', 'dist_dir'), + ('plat_name', 'plat_name'), + ) if self.pre_install_script: raise DistutilsOptionError, "the pre-install-script feature is not yet implemented" @@ -181,7 +188,7 @@ class bdist_msi (Command): if not target_version: assert self.skip_build, "Should have already checked this" target_version = sys.version[0:3] - plat_specifier = ".%s-%s" % (get_platform(), target_version) + plat_specifier = ".%s-%s" % (self.plat_name, target_version) build = self.get_finalized_command('build') build.build_lib = os.path.join(build.build_base, 'lib' + plat_specifier) @@ -633,8 +640,7 @@ class bdist_msi (Command): def get_installer_filename(self, fullname): # Factored out to allow overriding in subclasses - plat = get_platform() - installer_name = os.path.join(self.dist_dir, - "%s.%s-py%s.msi" % - (fullname, plat, self.target_version)) + base_name = "%s.%s-py%s.msi" % (fullname, self.plat_name, + self.target_version) + installer_name = os.path.join(self.dist_dir, base_name) return installer_name diff --git a/Lib/distutils/command/bdist_wininst.py b/Lib/distutils/command/bdist_wininst.py index b0691fb823b6..02542afbd3fc 100644 --- a/Lib/distutils/command/bdist_wininst.py +++ b/Lib/distutils/command/bdist_wininst.py @@ -21,6 +21,9 @@ class bdist_wininst (Command): user_options = [('bdist-dir=', None, "temporary directory for creating the distribution"), + ('plat-name=', 'p', + "platform name to embed in generated filenames " + "(default: %s)" % get_platform()), ('keep-temp', 'k', "keep the pseudo-installation tree around after " + "creating the distribution archive"), @@ -54,6 +57,7 @@ class bdist_wininst (Command): def initialize_options (self): self.bdist_dir = None + self.plat_name = None self.keep_temp = 0 self.no_target_compile = 0 self.no_target_optimize = 0 @@ -82,7 +86,10 @@ class bdist_wininst (Command): " option must be specified" % (short_version,) self.target_version = short_version - self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) + self.set_undefined_options('bdist', + ('dist_dir', 'dist_dir'), + ('plat_name', 'plat_name'), + ) if self.install_script: for script in self.distribution.scripts: @@ -110,6 +117,7 @@ class bdist_wininst (Command): install.root = self.bdist_dir install.skip_build = self.skip_build install.warn_dir = 0 + install.plat_name = self.plat_name install_lib = self.reinitialize_command('install_lib') # we do not want to include pyc or pyo files @@ -127,7 +135,7 @@ class bdist_wininst (Command): if not target_version: assert self.skip_build, "Should have already checked this" target_version = sys.version[0:3] - plat_specifier = ".%s-%s" % (get_platform(), target_version) + plat_specifier = ".%s-%s" % (self.plat_name, target_version) build = self.get_finalized_command('build') build.build_lib = os.path.join(build.build_base, 'lib' + plat_specifier) @@ -285,11 +293,11 @@ class bdist_wininst (Command): # if we create an installer for a specific python version, # it's better to include this in the name installer_name = os.path.join(self.dist_dir, - "%s.win32-py%s.exe" % - (fullname, self.target_version)) + "%s.%s-py%s.exe" % + (fullname, self.plat_name, self.target_version)) else: installer_name = os.path.join(self.dist_dir, - "%s.win32.exe" % fullname) + "%s.%s.exe" % (fullname, self.plat_name)) return installer_name # get_installer_filename() @@ -312,9 +320,9 @@ class bdist_wininst (Command): bv = get_build_version() else: if self.target_version < "2.4": - bv = "6" + bv = 6.0 else: - bv = "7.1" + bv = 7.1 else: # for current version - use authoritative check. bv = get_build_version() @@ -323,6 +331,10 @@ class bdist_wininst (Command): directory = os.path.dirname(__file__) # we must use a wininst-x.y.exe built with the same C compiler # used for python. XXX What about mingw, borland, and so on? - filename = os.path.join(directory, "wininst-%.1f.exe" % bv) + if self.plat_name == 'win32': + sfix = '' + else: + sfix = self.plat_name[3:] # strip 'win' - leaves eg '-amd64' + filename = os.path.join(directory, "wininst-%.1f%s.exe" % (bv, sfix)) return open(filename, "rb").read() # class bdist_wininst diff --git a/Lib/distutils/command/build.py b/Lib/distutils/command/build.py index bca031f73013..7462e9348fcd 100644 --- a/Lib/distutils/command/build.py +++ b/Lib/distutils/command/build.py @@ -8,6 +8,7 @@ __revision__ = "$Id$" import sys, os from distutils.core import Command +from distutils.errors import DistutilsOptionError from distutils.util import get_platform @@ -34,6 +35,9 @@ class build (Command): "build directory for scripts"), ('build-temp=', 't', "temporary build directory"), + ('plat-name=', 'p', + "platform name to build for, if supported " + "(default: %s)" % get_platform()), ('compiler=', 'c', "specify the compiler type"), ('debug', 'g', @@ -61,13 +65,25 @@ class build (Command): self.build_temp = None self.build_scripts = None self.compiler = None + self.plat_name = None self.debug = None self.force = 0 self.executable = None def finalize_options (self): - plat_specifier = ".%s-%s" % (get_platform(), sys.version[0:3]) + if self.plat_name is None: + self.plat_name = get_platform() + else: + # plat-name only supported for windows (other platforms are + # supported via ./configure flags, if at all). Avoid misleading + # other platforms. + if os.name != 'nt': + raise DistutilsOptionError( + "--plat-name only supported on Windows (try " + "using './configure --help' on your platform)") + + plat_specifier = ".%s-%s" % (self.plat_name, sys.version[0:3]) # Make it so Python 2.x and Python 2.x with --with-pydebug don't # share the same build directories. Doing so confuses the build diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py index 3042fe022344..bf5ad7e00b76 100644 --- a/Lib/distutils/command/build_ext.py +++ b/Lib/distutils/command/build_ext.py @@ -15,6 +15,7 @@ from distutils.errors import * from distutils.sysconfig import customize_compiler, get_python_version from distutils.dep_util import newer_group from distutils.extension import Extension +from distutils.util import get_platform from distutils import log if os.name == 'nt': @@ -60,6 +61,9 @@ class build_ext (Command): "directory for compiled extension modules"), ('build-temp=', 't', "directory for temporary files (build by-products)"), + ('plat-name=', 'p', + "platform name to cross-compile for, if supported " + "(default: %s)" % get_platform()), ('inplace', 'i', "ignore build-lib and put compiled extensions into the source " + "directory alongside your pure Python modules"), @@ -101,6 +105,7 @@ class build_ext (Command): def initialize_options (self): self.extensions = None self.build_lib = None + self.plat_name = None self.build_temp = None self.inplace = 0 self.package = None @@ -127,7 +132,9 @@ class build_ext (Command): ('build_temp', 'build_temp'), ('compiler', 'compiler'), ('debug', 'debug'), - ('force', 'force')) + ('force', 'force'), + ('plat_name', 'plat_name'), + ) if self.package is None: self.package = self.distribution.ext_package @@ -171,6 +178,9 @@ class build_ext (Command): # for Release and Debug builds. # also Python's library directory must be appended to library_dirs if os.name == 'nt': + # the 'libs' directory is for binary installs - we assume that + # must be the *native* platform. But we don't really support + # cross-compiling via a binary install anyway, so we let it go. self.library_dirs.append(os.path.join(sys.exec_prefix, 'libs')) if self.debug: self.build_temp = os.path.join(self.build_temp, "Debug") @@ -181,8 +191,17 @@ class build_ext (Command): # this allows distutils on windows to work in the source tree self.include_dirs.append(os.path.join(sys.exec_prefix, 'PC')) if MSVC_VERSION == 9: - self.library_dirs.append(os.path.join(sys.exec_prefix, - 'PCbuild')) + # Use the .lib files for the correct architecture + if self.plat_name == 'win32': + suffix = '' + else: + # win-amd64 or win-ia64 + suffix = self.plat_name[4:] + new_lib = os.path.join(sys.exec_prefix, 'PCbuild') + if suffix: + new_lib = os.path.join(new_lib, suffix) + self.library_dirs.append(new_lib) + elif MSVC_VERSION == 8: self.library_dirs.append(os.path.join(sys.exec_prefix, 'PC', 'VS8.0', 'win32release')) @@ -275,6 +294,11 @@ class build_ext (Command): dry_run=self.dry_run, force=self.force) customize_compiler(self.compiler) + # If we are cross-compiling, init the compiler now (if we are not + # cross-compiling, init would not hurt, but people may rely on + # late initialization of compiler even if they shouldn't...) + if os.name == 'nt' and self.plat_name != get_platform(): + self.compiler.initialize(self.plat_name) # And make sure that any compile/link-related options (which might # come from the command-line or from the setup script) are set in diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py index 0d39b91cc3e8..33a1212b0a9d 100644 --- a/Lib/distutils/command/install.py +++ b/Lib/distutils/command/install.py @@ -16,6 +16,7 @@ from distutils.sysconfig import get_config_vars from distutils.errors import DistutilsPlatformError from distutils.file_util import write_file from distutils.util import convert_path, subst_vars, change_root +from distutils.util import get_platform from distutils.errors import DistutilsOptionError if sys.version < "2.2": @@ -503,6 +504,14 @@ class install (Command): # Obviously have to build before we can install if not self.skip_build: self.run_command('build') + # If we built for any other platform, we can't install. + build_plat = self.distribution.get_command_obj('build').plat_name + # check warn_dir - it is a clue that the 'install' is happening + # internally, and not to sys.path, so we don't check the platform + # matches what we are running. + if self.warn_dir and build_plat != get_platform(): + raise DistutilsPlatformError("Can't install when " + "cross-compiling") # Run all sub-commands (at least those that need to be run) for cmd_name in self.get_sub_commands(): diff --git a/Lib/distutils/command/wininst-9.0-amd64.exe b/Lib/distutils/command/wininst-9.0-amd64.exe new file mode 100644 index 0000000000000000000000000000000000000000..c99ede4b3fcebe39b1a1e33283307e12c42b7b2e GIT binary patch literal 76288 zc-ri}3wTpi)-Zh1G&Gdf6NNxkE&*DtMzC6N3K8vrgq}!BD|e;PmXboHw6#6qA{W85 z*l>uqaps+O#+lb~9B<<|H(w}><1{VM76G}4qBsh8O9+gJ3gvpfwbtGzX$$zy_q_8z z&;LKq-v{>-UVH6z+t=hj_>^E21R)XrYnmW53G6Rd_!s^Rf^f}{E!PNd_TDwL z$>7;FblSp-I$KR`^@7^c#kR82s;X+mHqUFT^;Ov_s%*}JskX({^SvWeQA2(NpbYtPk6k{w~J!GFGOX}`l=}33g3GaSJL-= zRTUIZsVG~B@Ow6)&?N}-*O`RZZv8q>Pdh0L7y2ah7KD0ud4Z+f9fZKbNMjKAbAlk4 zFc9Lgu*N{dRQn`g${M|p9$o(4?NLy!GYHS)Ly18+-VYHp2nUUqlYY%_1!17@fAI%E zWz*F^k5s(N6o?=8bA;+SQ*`;W0ahbx=a(v_f-vJT29xqNcFzaAlRJ`S6HX3+AdAsN zNHO%x*F3U@Wu!J1@_ZJ<uS?tKY~C`^5U6ASXHm zv3>(QY$-x`>N}cs<}>(kP;O{emdNVv?Vwt$txthag#DeG@Am9{kf>Q-g_MS7Uw^ql zQ?8YR)@uP;P&Rqg?b-*?WLbTGGj^}`LGI~o7T?g#oAAY2`4r;J3LJh`5Fqzv6J^_O z1k_s%V#6X$(`26jyzJ4CH)vdkACbS2d6=ReHVNZ>)h>XIN>vE)}`2hml4}c#5Q}M zD<~y88C5=ef^y1gShE&jDgQ;yXNB6u`daL$pw<0jL5LLMGXSvh=1Rf)6J&LlX8kdh z-vtfStRj|gIL(V^v*M?K*&^3cpKtdBi_#0->TF=sMVW53F3YWcCe4wGid*A-K2u(M z90@3?XNi*|lE2d|HoON(z?jfhn=?3mR(Ka^!(g5P%h~>lTo3@ltM%!BB;uG70coCj z(#+u0lkhbM!DodZn}P_xm5!DaI`JCh);j^uEr4fq2$k7_N-kV6O%NQdN}A5jYaxSE zZQe|#_=D_2lr`+AATY696ME)CBF%ULk$Ns2+l8Dq+X4hggT@!Px`5d}^pr8g!x!rW zfm#!7V{%}bK7;sQnjs-!o;M)!rqzQDf}Fio4%DYVWk5!HF&(X$TRkYL5!E^9oV{|; zX_xwqJ?v3i>Lmw&VS@cKJ%Rb@vy>!YxG)rUWq)4oa?Bt6 zolCtS2KPdWTy{z}ek+%)zBQP5yQeJdF-F(kQ#i?x;M*y!T_qGwGA8<3#J^9r`CCTH zWi7H1deNC)DE@uoU}HOk1C4v!;@@32828G-6bE1-!|U{cvT=`GwoNwfkb}<>MdYB< zJlL(ayX|`rK+SqXV`8$bg`}}tec#Id4h@7k_!eb7^+v3awnIL%cg@OcwIXa_iE_Q3 z2TPoKL)>ICKP?F5fjnTs4fH{?zP$lk)h-9?Qz$3Ywoq14a{M`hGQk5lsAFVxT6!U? z7OFe5*AtX9x7u5?9^8OkE!GRv2|z=)wl!bf=?)!9^cXwb{xO2DIUgI$AjE1Fg4jj# z(@XTE@J;7XntC)$T?xpX**kvC%Ar~j=AWe$iJK;-IMvB%*i~8O$l{Q4jZOnlAlV(5 zY74g`MBu|)A+rl`Fhi++h(`?;&4eDe$!dG}Cl^q=iS=gCa`_FPD^|$sgf0&j7*N;r zLb=o4lPFQr+MJF~F}NL>7CO%Zgjxn%68Zch3NxsheB5@$b^s zo9jE2hy7Z@l1f=?UURm{H)~B!*2)LhC|+3@k^sJuvQid=3{RPoz#c5*OQ!B2O6m@ zPXHXWh&K54}VZX0e8&|%rY=m3oQlPboTC5$nVV8yM_pKFgdClKvcrp0LYM@;d* zNc=9Kjb11~FpD0SQCLV}i2$goA8FP->#=>y2LclLM7Y#@03|S5nsppt68Y3XIyrro zC#X9c_34dVU*_VMg-|r%NtTd<3CoZV;02mnpRTLcO#D)VPte9g!;mOGv^M)W{6eyH zo?vR;PE1HWc>+zmQ*Gr%au}W|P}yQ2R%9wU5uWry>{?K!*6L3XdxK`-xrSh_5qd6J zeU@PjIi7l6h{5_0)Nv%KYp$nwuEHFi--F2DHB3z(se9jTj^`yE!^Svlcy$*h0Z*e<8bLeIi(ZP@_{sgL*3NZ?yZFm3y9dhWrpyChZB- zDM*R#|S^9K6>tW5>8rL>Cm4MgwMf38Po959DOWj55aYdzz-_u+XnJ--WPg37#bfMr;8foB@8an*PJtns9QY;ar@(*zjH16$b5+wL zh-3CPIp8Y9aZ=Da6lmuONi zZ#U2kfmnYNJmfc=5bFog!{=gsKl*f9tnWi9@Q`3&QdWN!ojELZl8ueU`osF%#s_R< zh(b97s!>nkKzo>G-OEsWjc{m{gK~*x{clJMPE3safoPaIcm(tTJYUF;W>KY{lb4@g+kVM%LTAD03oz&=0 zl>LWKhR@ePP4>e;uHZ`aFFw$$udKn+tNY4713ucGn3KHSnPULI`v45zwD)lMzIqLg z6Qe0jID-&lp8P^Ndsq08a(reyp)#IO8BYYgB|1AX-&F-YHwz?uA$Y7cAmqzzjKNUA zJt}An>xo7r&JoS}+@nOSi;dWiJBa}TEa@4RB&!EC>k^jqq@D!5UB;5$)RUlK;iEL+ z0e!1Da2n$-92?&u!|QE0M7bFR^0(l=X#1hbP$sOL*I;t$b9A>VMFBw1Db)z;)T8Xx z@}Pp_6950eUKmpr`=DH-yO$9kdHezfQp_qE?W&_e@OF|;e_rk}>Mr!^oD;Pa&AO_<=3?lzU$l>lCL5hv0j)b5u)2DxPO~PiWWEf(Z5hetQ&*BrP$s~@%|Pzh zNt$i@_9b7Io;B?GM$@800rVmrv7^gvH^;BE#VKmgPpk%-a;5BWz2bqN^dW21}qb)+;t^(U$LN08@ayCrM6!iI2 zvR(iq0VQ_I^0=GzHf7Z`JKnLf30LL4iIQ-7Sx$LH8y#Pg3Jc}t-a%dOjDPyr#C~awz#rS+oze&<*P>^ zI-MWz3HgCL{KtmLWgp4L57(|V)7+)lFc@;Lb*z{%>N=$_^ko@(i5=mcU_&A%oWF6r zFK#%8KKYnBvyvv4O-Mv)+S}pDj8PzUA@~{gsocCr4C++oi})pheygb%6fm;`{e%|xz#$GTV0Wf zt5!u_bZRae(yM1R>&HtN@&lK0KF2ylcmYo%%LyLH-8id}LkiZZ9#oy_qn!2*J0v;n zd+g5iyCq|*6E*CA+FSN^I@RVN4D!`?=?&Sqeu+MeWO_Y!YEv#U!L##qCYYBPV}dLT zjo|&~CX4mBPh#ykT)7t;{)TH1$Ijv;)1cYVIr-qE4+L5Nn-)Gmf`W9It zFYV&&=H69IFa(--nySRVJiaO}GMaS^eLWCLUde!ks{Tr0~}&oOMz=9j(4Te0Z=1 zk{sv7XIq(bC3E*Cw!UJT3ER*6K^~pG$z3 zN8x1^F46SI)SdAy6U;u)R8mtRsL-&lL{|?Jg!rNheDNQfEUVuDg+Vy8wYA4uaF3JS ze-4HXCn4!?mmny2I<|=oN8rgF3R~c%3VNkkn&(eR!i5`$ZOo&3KSVNDHntSaLy`u?Sw1z*t z01wjNj4|~F18lD0o~j|sB{ennXzK!2*2AW_iZtt7%o)tT)J;L&Pt7p>9L(pIuk}{! zWQh%!cv4T?1c~dd4?|j`H5(e(XdM9(8#zN#n^1!d+tm&9>1te3JuNl;r;b^E47nZE zSi`s|F6ya`W|G7YfQ!eTN7mc3-rSgy0IDu`?7O~i^I`lLL+uW#Xt&g~zDIMH0Yt4C z2H~K;7E>=HmsL>SKs+yTnTKjmJ&;DO#-G#3HsSb)<|al~;Xa=P-!P||ir<{7=}DI5 z^JO%}Gdc+eFke^k{8fu_>SDcV1_)-ODGffV)<>X#nmP-@a5YT~e&A7?$FENri;LQx zez#-8PT~xHhlW#qS-1|43u3rQ!EmWaNkc~y(qr2bDr(r;wOcJTcPoc8`^jBq_L)tM z^_l^i8l4fdl%8x9j4dc(jAJGp!ft1JW(`|t0Z(w`S@KGYagee0 zEXjUw+!&IRj9M%pIy=!AB89B49NJh6~WbDqD`Pc&DuBqXkJ9s1(xxW9*`#!$=FMaXiB9Gmy+4|s2@xD z?*YWes~Il$F2l@cX&EQ==akvncNtAlf!_+rs`X0qKBXj_Uq`w zNz`xS#$Li*oAsY12whxW)NiKEY#8*|65ZQC`O~b!D%eIx)2{){`osj7m*^~bPD|t)TVf+?v*RfX2l|=e6 zZ=-~J8^3ll%~5l$t~nNU*&nPX$m+G^M~+Rg_;ANueTVNWt2Fvj+lvh=%KQ1 zKyIw#6B$#wr+-$<)5r4klT4>Z_4Hw7{Na9h`0GL;<|MRc?+bsG$G1v>nj#A*<9;>1 zs|w7wDZQLE@MO$@Lr#72mi7xdaZ0p4{dIO82=u~pG)cg$Nw9?WI8P^&9h~|N@M#IQ z*9&2Asz@SNN-2{d+_FaBlsLL1Hl)9yG-mM!l*AqrOPS844uH5n)Nk;)JeMlT8TQcVapt1_a{sBsSC0G75!5(JkW`ThfCQyk#Rd2 zgg^h2ky4g}GY!(_UVMs#vHP~Ux?TKi9*IzTwXTe0^?hhB^iA|$nu3snQw^XeSOFMw zCMcl7e$PtX^KiFP+B`-NS+m|fmrF_CQhkv`twc4h(6T4ZCtQ^#kC*hI$xln-G->Nj zlNBX#n!K)m8mH4_P6^*n@ia?8fAYi+(B=1Ybh^AlGGj`q>ej+R^Lo&wXihh}{DhUd zr>0w}uS#QdNuR^%a=!SgbYb%>TgFoReo-8ouDV{G0^+w#)`gMOrM|XUUVn{oCKXdb54x5<7lg!Zg$^C z%bRgX(~tqz_y%w}2wK0d)a~Z*xm^7v%t1^B&ecEQx)qEkV()j-`-M5WLA{mUkH_Ax zW01?rxv@MqhcC|cw60)Lx6g?$oPIQi7kCvOJY|Q*Z+8yN71pc-Ck^?2|6JnWXBYEz zK;2Isjx@3VbNw}qDI=jvaic_RS~8bUOusvxkDo2wEgGAayz2hDrV`}17LU$xPaThO z971y8fd6w>_UY^sGCSRo>k3vU`_CGcAwYops&&(hXri7XydrI69Ba)mP8beZX#D@} zOGA zGRMd$UkJmSEl6|C`b81fJHHdU4qpn{BB$0Nmz|Z>55>1VcNb{Z=Zi>(41gSW7s%SX z+B@RgqGkfm`)PvX zjx5CUdX{fr@})w}fB1^*|C(rO_;{Ed0vToCl#BE-usy0VsN-~~-#thV2>9CY@6KUC zWtF6DkL(wE6gjmB3AnXu{s}C9zNBr9{HACA*C_w9vHZ%OZlCMuvo8+r#&A1OKRQ>l zHqWA#DpUQPMrE?LEqY(Kl0&JaBVIBo{6Z&`Oz)QKvxhL3^+857Gh_`X0=jN(TfXCK zal;~7aaf7+USI({W)e#dhn7U|(5!DisLwAkpBC5O0bXPSIM>=X%{q7%RzA}L+AkZl zpG)2Cf*~_j-*AF7feRPxB!0ldB@Ow*!q2Jd7tZ; zMfdQf4@+$6BNxWpa%_%{kGp%Wi9N+e;iJOwX*!lNFM=xp>PNVLK|K;plGR+Zq&1_U ze+TYD)MyYSaZ~e_C`fteu*Df1-=8lQp&#`C`4ro6-fHN|bQ|S@&yWk0|I74sgn%`i zmT~JRE*hUXbmJlaXDJ@lg(CF3hxGNt?V5G&1N=qO-lMI7ZJ5g$oKyxmm&bBi?|Oi5 zt0t`${>4Ywd8xUG1x;QN8lJM<3=P`@Xb)V7=pe|#cYeM`$SpP_UJcdIk7^suYw$?} z<2XLAam6L3AKr)P#Fa+t+G4(+I%@_gi>Hg@L%cyO>89fN=ILaXG+a*tx9`k!N@}l& zZ<79;CH=M{z7c!xbXv?Glln6ddD?uGCp*q6_sWiMl(DiSqKx)9jwo3kc(u!pkaCmL z5fOh93V>xuO$Fx$_g_jX?abVM5y)^*JMgb<$AqS4%IXe&6xF(THj?$TlY+jje<1C^ zV_npF5Or_r_YY#8#|^ZLKNI=1JB(Wh#(!M~11(zkO$Osn1Y<%R2H$tY7RFb&bTjJy zLg>0M?msr!t$u@6ryjRh@TIS^wa2~z1+9#xC9qzAEAdXg+McZ;_waeIf6Snx&3sG@ zda`mR&Kod3!)+go=lg5czd+9L6Cd-#XOWF;cKi##He0*;qS>k$qy`3`VEfe;#yH(G z}{QM3MYdTiJqTQ)d4omaUx_7Q+O&c?A*(IE*yN+z3>D%&H z&Znl+^t9m^?TTY>H&(;`X>2~5)$liOtcESqs0Iht@cvGOcMxmn&o@c6hi{=u0K~%kd+xY6 z{iE293%;L>&A%AfPJG-lo9+bupC7*IM*`Qu+08@QrW|K5w+Lre-emjsX9|%ZKzvx>Td11Zp=h>@Lpu-y&(V2x0QM%k=mQ@Q@+&~FNSN@u zX)>E-G0-dvntSsMrUsQQe^f)owu8P~>}DZBSF6xIlVx>3jrZ(3jfxu#XS3kN0)`7%=_Emo%?Os}-s1 z&QX>DkR@PR{v}am>;+aGu?4F$nd)3iUE#TMq!@Ung7T{crLTMIe<^yOKD|0%ios`dTPsl=HuHTdK?wtQs6d9^Q?ayh)8h6YLDnc!kXACdjzI&jl2 zE)$yeK*RhwhShy#)%q4ZtKgkq7v6mmGTskRE577+nP}FDli3vC&9cAQpbP~xgfeVE zFMXcUM@(jYdmh`sg>xM9XrTJsyZUi(|JEGxk5{Ifooa_i{m3b9+AD=37Rldf@ZBbE zOxXMlm@lVsPm?IXpwO|m)(9^y;|`~zLwsy~0)A_cJeEMGM1AJqcthk-G`#*!OI@A| zs_iR@8;x$Qm6ekG&6@87g9)(A3@Si>cumq8>CBPPF>%p8Q3@tr3*NQVrzLVH0NYF- z*LMEV3ijkNa2|xFKfGEsS2}YzbgYkhPFmYscudo_%*IW=Sed`o0wCdW!Z(O0dps3? z{5JmhUHtL;_~YsLfy|1oIV zy{u_hWSak(Ja}Tm)n|vKhR``T^F69gb)TdjbgCapp{RxP*;l}J%IlDa+Hj5kgI@NwZb!P98{H>brW66KsCO$R{#ZNsihrTvB zv-@KHP}m}F+yhTewf?8HVnv19F(teH2{PZIaGEnaaUIYd)7A+o(4y=KiAWr^IR>G* z2L!hox&nky7YOG6HH4J^H3ZB58bUuP1VG{tu%r&O1aGBmw!v-+BSih7ND(!7|TwNACyW zyZsS^?@z9VL;n-69wA}CfwTo>H4WGta$jXG0c7HD0*DxpX7~XRAP^8x44?`kX;SE@ z8K8r(WPwo}z75iy#=Trud7tWA;lz%LA&tpz{z;IaHU-)TrmjG>JXR!Sabo~rVH4ET) zmkHPp)Imb_dlFUy$LU;Wej%v2fLGO0i|@!GaXWLPq!KHiZYg@?hj|8$8~V8 zrrg@Sc&48D8hVGEmoBlKzE`t9!AVfWS-;1uj@@Inlh56O3ykx0rtnRjc*hk^$aOgf zNS90Gc+}ENr}{AT#Tbt&S@LnqfE)Uy#04}TCE+ZiOP!YPl+}ppPIGJR_Px&FW(|;# zAnQW4#SM<0_O5IP?s2ByCi%CY53sv6@I4Ec#4M2TGrA}W#@uX50|s(wvpUG;~2t!}Luv$`77BK`zc%zso=>`uqNx@%>v4Qh|qXy(8fU;tt~=(O+qmr!Nb z`5?ya>Zm88Hxs^iSV7!WpS~VH?I2q1KPsy!>DrFr`@zVJdRpC{D{g#0@FtxC>w-J9 zS$PW(4gJ%CnBL4VMHG3ZKZrjdtvA7V5)_NwnQn2M6xZP)K6SUf-LZk)c=-5l4eaoC znkRUlhF2QeRo2_~kjL0AIo=Wd8wlQqZY>0)^oKNQy+LXed|yYaBz2n|Jkm&=Y~(Cr z-^EJRJ$R)OREHy4H%?M_x$OVA9O6J;df=5x<2m_ukG&mKU&4|cDLCn3)9+q;?X@#U z_8tq~XOPxQ2Dd*1!?R|i)R=n--a$#WUX($d!MhISASyKBt+6FvvM?Sdt8B z3GCei>}!rbpl)}A^{}^N-Y$SST!cv=5uK%n5bW^Fq4tXbjrJz6^xbi(ZbH7Jt?nMW z7b|k=f~K8ru_?(?TVi@2+~k!3?)&LFc(B03fjV~R!Sp(Ag9^B8nC(Uq$Q>?wXDDKn z*0$lW6)aF-Rhn$?1mESb(P=;9wC|CFz_kADCK(U726GM0fX|FKl`s)fckDmx0%3HL z7}2&T7_xV{rfoLU&$6RknI)_DXUdK}Nn*QsjVSYm+>5Lu5i=d}3fcB#pNP z#@`kgpA{HCDlk4bFy1K#AH&;s<-lX?0Oa@*_&+PVxovzuyd$`^33QK!_29^)p+gz# zQQevO@NkF!oaNEmT&m=B1^Zb*2yIITbN+S(?suY|Y1i5%VDiI~LCVc;=Ah#Dsj25= z^}~GB{CF%+T9b2!*zgy+^Xcp?vEfyA2dpodiqVmJ*G8?qzW`BuUIP+=rI<+m- znFuVc0d35yjQ+30U|y%cGim8{vVUFZDw4YL4tL%M>C-fL_zN z*wwE3U9K+NNdB1PxxL)4lEiKZB-}TW>_(5%%oAiLn-M5TXXtH{k$yu)K&()7SYQ*i>Dc0|yDXrz1ZpQ_-56&~D)FRezrl+C4WapSt zv)J$&Hu&B?zFuufDReKDI}Hu3N4?+TQODrn^Bfn7;0BsbcJkx9>Qbj#or|e-2p4yh zNPorE?JamEtt$G@UL!ua&WuYLdA$U|u|s?kFRm5qRXlWp*d@XE2$Yyo41ri573fW@ zFE;RpzvvHJ@!>2yYyqo7JPqxi)lHgRj_<_!^VgBbm!$5NwB7p;yR|lB*uUK@Ilis^ zG*E5HU31Z_qyW#n2|N=y0JWdlCL9(7N?U_zAzGg*umSOuWOW-@E&pLdz#wi}VCh{q zJh!njJu7s=OcT)fa)(-w#&#`*N1xHOKpuGJ$0hZn7wq)5fMiBw)Lr1l2ILfm%q>6E;t5bStE&qFh%A;(u3e$GEzuJwv9u+b^e>|S z3*?VtS#o?LiFuz$j*rFqc4Aa2z}ELYs%*(eCc&#o)WS4X9%!E_2NU}`LQ5*_JE9Ay zdC5Q6ygXZ=TIS?U`xpA~;qSW;GvY=^_Z_Di!bQao+{TXZPX@9k^sc)W3OUi2{UCfd zE2OqM?caKgowpRr&M^yQv7s8rMS%r!TT(AwCa`Rux|M`E&ZJA~$N6d-ZH~*cxx|e& z4ShPdBZNAl5NNSi5!C|OA!pVlIUCcj)$(MQbpxro_D@qfZBD~?&tzk=EISH>)#VHR0vz_g z2j%4n_}-Re(3$o-=xZ46GQFni*9m|oi`+r$n0ZJe3lYpO=W0-=f!&V|BD0J1L+FUv z*xuA&8E-ywL=D+n_J)lup>X1&<{^%DUxm6YUA)_@^auTt>w|Fx_&9Az=;1^@0IL@| zk?7xkLEYs)BKkvSM?vP2-jMNA1*G=?a|Ws?VjrqVs55l9^UpAM8!tDEgNH9V62cP!pS# zD5>KVT`%9QKPcTEKvOr&fST3a!*}dIVgH8fqB*HoSA^;|anr6ddqBN`Lx$@3*WeOH z?u3>F3S?cmTtkR2kh43Sz(4f^af6)WOP84UCGZnOM=1Gp3SRcU6=fEN73#;~Pttm{ z*Ja=7vVZ3>?)MnaJ8xMace7zSg*Z`=K{L*Be*8ts53~UIVGGW-g$`SWL%rV_+quR@ z9vR+Z3>mjULwM)4B_-2sGYeA0`rawLr-6T8`vP|mUZIbub7F=2@ILaNH;MJ86oQnf z+^+6!OM=DwRogDAa`dkHXBT|0v32ir;xx7SmoByy;0$v&G592*h5TxOH)*a9x zoey{AtmxpjB$4it!RzmfPNP&^hwtD+q~dt*M1p_&rO4?s9D~w6SC?dQQ(l@QOufDW zDv8{Uvq044x`i5`=2=3Wy%9<2Zsg~-+}xOa0M(klW{NvTo5;-<5Tic41FHcI|JnZH zlNr6y0eRYt+$t(FiDiGI`yH!vCjN6Gf0)~gKRnlqv-P6@DRMH2t4cNbDs;UD`5|<| zS!6)h05UzCx400e3T<*usv{m;% z8e=#1;xa96U6T5SUj-oz@cUVHqgIZuf)I%EH$xFZ3o0gfiEL&>~QQ}`d7Re$Wo3Y z@Ip2f;rOO5gCMt=b;tk@##`EM0xoWJrjK@?&V3pts_{@^J$F1%PRObekI>Y~UOw;mJ$e=<76*8zkvyMh&IDiDf z@~FkLq|IzLB?N+D52@`WVv?GuMn@A1tv7XJAt;q^JZlU?0VYhbGBL4?iR9mycPPh1$~sUTYY`nk_I3FUxOjRD>kvA21MwUTrzA4rI3CG z7!X?6medyoQ?JrdPbU0dbd<+_O3ljx`bx&;F?pUPh|H$BfXp!(kKoT>-!IHPC6ugS=Z62ad+o zW@^M90Ax{;!XJT895scX{0RH)3NA4^!sz;;2kycdV$0ei=!okRR^*727oLI1>^05U zj^IVtE=NHcF$bPEk2Igseb2U}>zRjcW+OhzO|ucaRd`+a)mr7K9;nR0y`x@$S$PVb z;GIgz`aGFY9%ZEKn1djwGD``kc79F4l4bCst z!yl(n+2&7#1LnfQf8>ZPLBN#;5VKDJ%rVus`TF?pO>pE& zJ!kuzdhWo%n0v0~CDM7|GY8deH+J}s!+|M_{qe?mXxamh$3v=+N5|VHpThjK( z>eS4x^Uid)I-f?g@jDWG&KpbWNxbV#J&Sep!&zj!mAa3Ag;`LB_#Mg05C-8&^Rn>S zm!S_%KKKCncDt+|P}{>h;KeZ^O-Ul(EE-a0rr`i;LWDLprnVW8;3P`X-{KsxqwcmP z1D)!G+hp~9{G}t~fv}j2dTaJ=&cN)f=m7j=-;Gy-7(r_v2!8|qQJ^lXZ36u)Uv_h3 zHX;d4xIrh=wWo8<2}&P1P-yed%N1ga3p;o2bgI2w+50@SrmWm8`OhZS-6d{JhKGb3 zo6msWZ+5i%Op+Fg_N(tuOs?#XXdgPHFWEbssHj^&xwssAYPY%qee``P@wW>N`*oMB~1wVhYI0=bUrW7EUN=BJ&Zd7 z4S6ZI9aL79lyXQR|l?Mt^oPoT7ZN2&sVRa6o-_D75JzrD0 z9yl)(A1wYcsXogX$?5AuHX%mrtNdOa5a=VkSP*G6j_$GFr=PidB$IByznNafXVGay z`so}0BRSw#iYYMO-(>(fa(Y`iT--5p+&gzC6>7I)`2lTYtBSbH}lI5X&Z zX_m+SsmK1IJ9IwbzF_^Y*rM6QS!ly$dz)+z$)U~!Iat4re<|S}^_4!ZW529&La_q& zvN|(I+W&>D?t(^yzwd<^s&cZM-FWv+mmcbR{s@mAbvfT=?(th`>}uL6e~RsQXLshm zP8;rB*(cNw(V5Rz_u~404qkDM$6TafzJ<=F!hm|4M?FdhY%zySzaQrc`V8gY{?6st zwglvT2l(RRCR}?>D0dnZXQA8vzVDwd^?HAY_BPI{KsgI;<*$OVWu~u>@f+D6PLLd@ z>%Mk6K5^2V`S-q&ZZ&y(VtTH#QAszH;}7#CsEO$TgWI2w2%p%4D{u$sfK_;&4u4F* znLdR;rn-!~Wq)%5NVd4-gv;@vq`ohymt5lb57jo~K5>)BS!mxYHcIHF887)YamiPb zjM|_A~xRc zR^I~zZdLk=n-Z{=n)1NPd?>{TQ3G|!{uXFzXYE0#N*OCTK2iF4f}=kwp?l)+9t6qX zu0=;QB_zi1GpU)s-+AgS-r4+ri4%)c_-X221o zIXD4q{Q*D?*kB<1?+1zL&~a(L>(-wCBXC=7GCO~Tn;r0{$IR0D5cJ-y+Zvte254$N zkfC`M>P%;2zx3$f)qSB&khngvpfNEWr(GsTdqE$SWH&<|aAip})ej{5F8l#D?63V_ zNH8iZO3&PX%(&lv!2S;@koc_R_{jGy`ZzgK(5>;!714yf#~MEHoy$Jt*sml9$7{pe zf_EoG6V&s#%K?1&&G=KlT1&YBI*(d0#Oc^A)*mPS#U&+l3jo3Cf>Yd-B1cV>3eo}o z%sb*b8!5;6>FLhlUpXD~)4|&@^WQr%XE#e~#OVkFgiJ!mB|4*WFlDV|KY@c=vlJ{E zA*j3dA9Z|EHyGLq)f52-NsfK1leJcDn{l7xliFj{B!JOR-Nie@*h<|&9RTURKI4$? zqQCwU9+XPJmN{VrZ5iKq+w*R`%>^)?*jV(u0XQ7nW9Isye0;$9>x9Tm^i4++W;URr^8}uBWB1>?pQ5X9eDzme(DBS>k0zCq{ZT~T9dLZ%X zD|AB7E^wUp{RSH*hYlyW4GD-ExZG)xM=#KiJ;;0$4W6a=I)Pp9PglLH-AZHoEnQ9;VSfs36h1@YvlRZ6!k%@S-4xzKVJ?N^DRg$hU#9TbAPiShxSGPO!59vsupfoJDC`^*&;K!n zyD4m@@Xr*!Na0NsHd6Qqg_RV}rLd5~@f42gl0S{YWC|}3wfkR>p_#&SX&4?)i>Dt< zi>F_p@K+ShqVPcq>nU79;leKI9t!Va`KiVSDRfe}ohZ{z;f@=S37B8(Qq#zZ=#c!M zbxNm&M31^x=_{$Z=KQk4#4`sy#=UY`yJz@bcUkLwYCnstPOzx5SvF2GpO%cGk|J)D zjQ+zX<)3+s?Vju%ZncB_S<26ZG|iXrZL1vWuta_h?jw}Cfm$(;!od{UC>%y%I)yh;m`UNS zv0Cu&hx2I}xBWlHm-i7KURh1d$l~%!XQEP9fiDuy?1irSpl|*_M?t^*15F^#evRED z`5GNEk|;{O^)(!?4!ZZX*kNAF4S1{!(;J$XCvV18x$r^cu~&$3kZ%`C;Eb z3=o8;Vi?KlGIRFn?BO&x8%B)VfUnz}hm$2$E`Ci;(Lri^n`z-TcBU79*ZD@m`xIaq{_kFNP^w>(hQ<DxBzQ#~(%A2bHxbnikIJfbptn(<^wH*|Rtd^_lTl*c)k>@Eb}<(X9WGhOK)V zUZbUJ?j7b!&2EOV%(KlZ{%o*K+$d_+$~3~-tkRK>_w=;xd?>diOVJT$W#=)*SUKL}3P7?T+=SBx;4lgmsw3OgrX2az$fHmA@9 z@IDte$!TlP;;&>WH$n_l_wDgFp@d$uq%FH+Oe3Bxjb7tlrd+dR6Tai|Q1K@rHKgy; z)$4i=0Mn1p706|&@6^!-twyS>eeD>k>@#tbls1m)x?vnuwKu!jznN8b{g}0^Do9!m zmGvI8mQ~eEli~rB?PX-j_pR*K7tQ*fm5wNS2hi_yo^GM&ObZg{m#;$sgREL}2jJ^^ zd`$?q0i5t%xQsXMcfUnqrUE&J(cyB-08D)vQZ-+1f_}O`9d~5c08l%_eG-{Mi{RNw zlr`Moxb}D>`(e0zLQm{R=QDF&VFxp3;SqLrS-U5FR`{JnCdn|~fKh>%EvAN)4-Qe)J{R0dnXFbZKmVD<#Mc=Dqf8JqOr-#pKCPheSNVXieBPtFX1~QDUzC?i)tB?Yt`ywgtdI<@f%<`=xbu#TbLD+&-(Q(TDeTiWkWBL(>ZHBcuWp#@W z`|SQ@X^FlJHP<%IX8Q50qoB1eS~*7;18x*U%oEZ zec-qBBfka0uD@fuvzg9)_KjUv+o|C_?eA#TTOlpFnrYXgz%)-m?q5;vv{-I6wVqOX z_0@mOlzxw(FP#>R{e*f>__+jjp%wmAgJ!i+ZqxnEu^)`OhNb)nQdouF1oq<*?EWz1 zyF7Hb&m6q5`OHDBowc^hZ|DXG`RN+?aVznsr>>DzqfGak?2-MgX4&y+?TIeiD7%%L z&B{&t7s`Qu(ids?JcTb%_#%ZbQTPhAJG7ap0y9@R^4%c&+09(~Q?{VUmyfwW4fNr+ ztvfws(%r7?4m|H*#N&gx{aoUvS-tKHdW1CGUp!d7KgHwNSDUO#W@C%Tv8Ps)v=9s< zGht*>dlYM6N{Iil^AjOYF!j1>94B;yAEG<+m0|hzkQ*1eI>L<_`)zAc%}o!5hn(5t zKWvC5=sculoV*TObBe<6C_H@~+H$Cj{(~QQE%|};dtgPe=_}KZejU48?eBNK@ac&E zv{kIHW%xn4DVta4aeV3#od-REL9c-saG%)^Pp>>5{~aZqhXOyyLVgg1w^Dc; zg(E4

VxOel>+v6qZmpg+eEVcTt#0;SCg~PJmRIEfVf6n7Z9xvf>Igh9Cco>iMzuGkR zUXs>5{mX&ueK(Ka=J6XmevZedd7Q}Mel)N`oW5h|@n9Zj z^7u|3kLR(6$1`|5m&XfvT+8D%JYLV^pYiww9>2!pKl6ACk6U=WlgID#_%M%;^Y}E6 zg&~|CJWk{BFdmQOaSo5i^Y}g4ewN2C^7t(t@8I!19v|lMF&>}d z@dX~6IoaTC3bYEdB5kmw$il*01xZE$|;NbV*Dx2#MdZZxd?0rHa>CQR^*Js%w|qGBfIK!Swvn zni&<|r3K{^D=NLQR6Rc?LXMh>ss;R8Je?&}RFzjkf~#u2t=6mfYOCsO8S|k$Pw$=> zPj^>UD0g=Kc*n>)M`j~G^0qAY*433R@D|UjUPkZpba|A)wN2QPZ1_ebvr%96ALC!o66cx z?}bwe@}@}nQ}y==1^M{}le;AI^r_RNDbuDG3O(}0lX<$+HFeUofXfRJ@SSPp{zrk2%K)F^dD zvG)m6+=b9~*(Et$Q>F@q9%-7#JwC=;h0~|F@ZDWir<7Jg7gkhP*~&|S`twJUJXG82 zd}Rx5jK*MOWs$N=UBRqL>9o8r3d6lWGV4h>2y_J>OcaEH2SxImwQq?x4+Qxd)ruU@n=8U?VZ6j>n+S=+`Th_7+#y?ZN%FOE8 zMZm~08OXe)XC{`}P?-v$Qg2tm#A!37DXyZz<;ue9DjrR!uJsmW%paLCzlbviHj4P=foXEV zWVs;UH7*1DyI`sdfeSNAD}7$}NPoq}^L!PRN<~$1G2^r4@UeJeb?xF(g}np0iwjF@ z>%7x^HOL8^AD0)8hl2A79=%VP$XTa&vUe%G7tDJI`ned`Oj4BEsY)&My%0~I+B4m~ zxCS_=m__;3^LopP00|##?2psjh=I5CulC-nV7cB{MuH zR#Xw0Io<%VcxuIBXp3GqOP{*Du9$Jx5>_tWK{2`%LIFi@KeAA5^@7^c#gj`H>x3x) z38*f&E%q)34j&4B$vl>>w?kRzwbj&mM^to`V~#OngVbbdUuo6NimkG`biR#sHAr@C z*OI&t<}GFLm5Rk)o8Gl|WM$d%OXquSAZ}whEk@QX7w&{~vK|wvYnJm5UDzT1y`h7SBVi zROj{D=FJB=DqdPqg$)6en4X#j$k*AXR4*>A(&f`vV(ciV+1pok`0f_n4OKoM9 zrFC^I|48pLZ(I-fYGzW736!Cy9bZ^cXPa5^NNMeS00iXJ$(m7T17a_)_SM?Tsu$Pz zpr(vg)DirEohB|{iGN#w6%ax_2Agx!B z-@2Z{OZ-KhJ_FSb#DG<1d9@F$d_@(fKrK=3>TnqxXEpK>+5pZ+H`m#^@t(502D5@J zlvXY93N@4|V?HPqQuRIYKwZQ66FY;0g7HPQ&Zpg=$8bi%=y;Eew{JJxEY(^VNCB5}fH({1aCW z!=QJjfG{udX4D~j4YQ5#*)TDqZiLRmmDLM|VcDf1>pijyS);OSQ@jgo&ha)Q0gtud>)A3MxIJU>?TCy#HY48# z`I1>ZJt%W!ea*3o|2=~G=(x~6*yCP<#*d})I0 zp6n8?-0pH{5;#FuYj|PY0L9cfFEKKisSo7eiIirW=Tj8Mcs;bnQeA6c{c)OgwFB^l z<5vrojMvGk91A1>eFf$&?n=yJ7?#(1iSTvG{AzHwyS_tKLC6NZ4>p9`**HHH^>9=R zE4`(4UJy<|8{`xWMJ=~%HJ4EUt@VhQhT!9ma%^&)f-*GBwxAkFFvVK~oXQz+J}6WC zr1Rt0E?<`te~p}no=KcGP{JGM^UKniIDsGB-96Cp8Bt5p8kc+CMc(;C={xi@+P6Ae zDJUU$(Z@j*UQ{z!bpF4ZFFBS6dZz35vKY?uyxoBQo8==$gDXe~;MTSKV}=*gyQwe! zC7#X|NId`L?n9S!-R%(K`MbI)1hqt3d|1pYwkR zdke6rn)dO3X^>oy1_eP<8VNyQ>0S_|1f;t`TBN&MP`bO8?otF{>5@hSQAsI5{s-ZC zAK(3b|JTd8?rY|=Q|HV*_c`~RomqeiflSWV_rv?ff5!bEx0c2Mm_Gxj1XL;XSDgJO zq+xQpnmsXJ`w2sOwi*h>z@Je-xUDQ zSl}LI?)(7o8n4T#zxRtje(is<{NM2CYfY#htA{WHGcBAvo*OKIy;uas#uTJ=3VWB!PfXC zj=Ce(grI?XpQg%6*0Jee5z-#`a$=5Rdws!H6*h7BE@(VJBh`kev&h=S^VI0#+kj~} zR2S*?tPQ%c@nih6pSYM&?`iCW^a(5#*C7UzPLAd|qw6TbG83o@7eTmV*05XoXGO4w zHmNn@Qv)sYVyCTTYc@07FLalrMsTM-X+ItIcGLh$33+DDqO{b?j z?a>nL4WyINRR){6Q&T<(quIUPGXhWcm!Ny*Eu-d|tpy9{Fi{1*8reBk+!;m6Ta`!h zD0~K$J3z)n6k)+-48AH?2id&Vvn@j`Qh7M+^gBAYe2O)GbU2G)qWrk^tWrfkn z_@%X>)QAm<`|7Q%A7i-F>H(S(-6hCngHXWz@UbdQE_?wk$I9xV>OybMFiMV3R&zvB$KgZ?2?5Pj5R@T9RqV+TQZQ!L`Dg zOK?Yrh2{Yk2DYsL72yG&^imCmUcaNd!*@%-#%mX`W%uACQfRAIbX7_q-vGfA7H z0`WW+i|-5U)CgaC95}bjZd$#h?1KoiENY=aJ$5C1jJ879pxymc>hnn9#ED`pcu@hH zbOqhB0v))0SptfOEwnL($+w1+qlmCTL%OnD(^3&eXLcXdR@~I}TAGP%vT~LbbIB@kq$&i1Ftf1nAQtbdL+I zFHARdHoWg+4QiSQz?E|=;*eG|!^voe3V94JT3ISr=*xe=MeEoC2s3SJu!2kJWe2_z ztHGJ2eSTTEnXVprh;lT@((}1cVo^V2Aw=D8Ra2;ql6~T^XzIbW<74pqVBIK=T;i;hL=rklj!x}A3mHnY?O=(R3H&TP->GJS3p**QANb48Z4fq?{Go$aHlu1uzP1RdG=_l6{Dgk zimJhSk?Rf14olE?59<$QvJT_+lzJ!ZEYd40e2ZpT7=5pd)i>4enI0&8KBz&?>n^4= zj|=2v$jW4Htms=m&0M^AG;}cKb+I|pYF+Gmp;Pl(1S_-Vl|W!=6+P91Jz|W9+|n#} zoZYxE>Q)?Nf5NR*`2wUp-D>oVm8Z`J@i$h+hG0XdQGwIT@`TBi*mP0#?;WzD8=eNoo60T{RWK`@Ae7!=^xUizAeP7{gg~xLJ3m; ztiuI8e{EzmJ)`C^ObT6*)9^V{Nn)G!nxGmoA_|XUd(x838@JhV7e1SX{_Vg=zr5R2 z#x73Qh9gVu#U>x&qhbs!IxBU0Ojc7-@VZA~a=vV9j2UHI9wSS5+j8sRes&am+i3Bk zlWu2Ywr!>L_Bp%|S2Q4;!KWrpw22<>a6&w2DI~oi?&)^%3}$Wm=}^a~j~`3zhpT|> zadib&<8CHlHqVe~xYGrF!j=8=TXiGZO$4H7w@V{`D#F6p?jA(1@s2_bB7vecsuJPF z2#w-T1*PDw>^#LWIio(+$5< zbT5^X{e)SPzu$jIc$s=kRKQRTj#G3dxUC~hOvm~Awr6xBiPE|!>9Vwv!1RL{!RYt_ zp{5h;N5VfOMX>{eMV>tB6gE{seyl~R&u9Pg4L@Jc+(V>dGTy)rO|II>B+jqa`0X;2Kojc3j#b#D%gL7ubTOv${ zRE}&tuC))+-v4AT&*A6jj7oDj{-Whrp?$~sHP0s}s{09UtWZ@~r#(^^sr1Pg?w`VZ zp!Eu`NHB3<(i)9;=ehWLB-{~q|B!|1dGVp&tBSqVCPdQ5cJWNWek=CO&L$XU{p_2Y z74j1Oqx;dnMGMHo6`(V%aUdj%PHSg zQ}B2ZCx33d2pzve&oeD1Yut`EaGd@p$>iNcHM$zVn)Ht?-8R?C&q!=8d1xa6Q)rrFxQ}r`D6Mi*plc;${aGv3;Q7eayaXkw9 zF@oRveT<23dVN^t`sKvP-VJGJcK;Gi>dEmR?@HPPcNSGD4QBSm0Gb+jzX!%1aKVrq zlCTZ_NHN|y!q$X5ES6ju=XP!z%P!6uPtLTJ@J6H{xm4XGW&i8Fq(0x}#FKZenIq*s z8OcNfZ?Zkk-qPE{Qi;&qUdy*|rN10KNaK7M7KQO#AyR(@H`+2{B<9;&-|+ck@d$r8 z)G!!be`u&lT0jS$mj6c89pBNpPk!n{34z81szHy)NJDU)CWEu!tHmkJG)2RxW+kU~ zd8OX&+Z76g%$0;?_T~5c%gf08_6j++c?w*gzQ}`!Hstp*pJW|KJjyP)@Xmdk(w+l% z?uC6JN3Uxy6sr&W=-+@d|FK4>8o$;EU#|M8X+)L9z3Gs_P4fV!kw4 zZnH-UL7Hytn37+ZvD)WxTUyp2FxJY{Bv(1(%-_77NpR+PQYQYs(`%``@SV8?rqc@s z`{9ocuga5%$-r#C8uCOl;AA0;nFiw@P3>=V}A z-pmwP7S4M*P|b|hBYU}5379|My(|=)BLW|e%zDMbNG@~H>`enf zj*mGcINp>kdaQLjT}!lxu0EEUYy3Dn%xc8-Hh$5EvK5S1?STe8=wl99`VFL18`_P< zhr&z5ia}qxN0)tlEb%x7y{u*3dUEh_2j5v#J2SsSHB`)Moc)<Y36Dt(t-gP!Dlaz_hl-+V-tX14xnP|880+C(y9AVD1|hT9w17}ij=1ky3C!vS zl671dCpb$*N_Uz^_6oi&#s3a#WS2H4O;<;DVEoo1yX&~fp*X*ljPqnZD@szu%tugzHD*7_m7Ttn8^6fRDG%%`&?t) z{}GqgqX4X!!VNo~yO>?UxV8n4V0kNIZC%0VXdKLPr1Hu?D-T@naVLW_!rj|hQ>kZD zXcPtx-PtQ-J3Ems#`4V|R#f`Q#~y+#(3Ip%z5PA9&uHYfp1hD_6t9Bu-OyqP}Dv z&Ibp3HMp$2!~Zx-5MR_@#v%vDQqLWU2+Ud z#q4&~bm4hE#=wWKv$MZ$QfD|{+{_?!)QfZ@S>YXK=PNFi3kOSWh@#N=1+=)v zEw2$B={~#A-jYiddAdi7?r$S$C^Atp9ML~g%g<*EJGT$~Jc<;iEeDBe@Z3suv%8xF`+bmne;2>`{F;~^n=gycPL(RUki;yw+i_0h z!J_>Gxu)^NT|ZQ;q>aXEFFD-YJM7hzvLa&=Y}$6edXDC|3gXOF?-o}Lc@E>aBpNoE z?V+PB{(1k3!I}I6&+x%(EY)TV+g@@9tHYQr&@66 zyMBViBF#IZr;gFI?o1M}I93ORq1VIiW_GOSZ#GWwxMK|D;Db(ild+1TSMXBFURmL` zVA?)ri!-rF*)Y~cvbI(|q_QzI3Nq!K**5|y+n^_Xr$oy4^2a>v`ibAGX<9YgPuQ@f z64BoH^}H$6+h~D$iFl4pE^^%a;MatrsZx!h)+3neaBeHeWuk?1RemWS@^~g`I&ZYs zc6{pamxSe(6|ddwdAWJ0^qfH>ToRSdnFodXbIC2m=L@*r11e~a!i>m}l6GtYf&m#K;MMjOtzd1j!K0+_5`I`xchy-M^2GH1&K<%?HVC_#Ex5(ZBqjpmYrzXI&F$Lt?LQf9G2bg_)if7{p)bhR z@F~pTvd&fBqEzHVkw1cB~YGe1z-4Y(~Vh#R}?llkTc- z#`_E}ta9HV+a}z4gN0tajmIbIgkc_p2GS%->X7$eZS=hDRn1y~Q%@-nKNg+-d9oeX z`_oPX_WTlU@c7uo-o&c7#X{}L-MIiezjl(3M@vTm)qPvegLP(}?<7euM;E;MH_gd30?%UQ}OiP*W# zSBzT8&ra!l5?jJHfmK01=8n4W)iOz)=1N|7rPnmZLSn-9>Bl!EC$fe_0^c_=~a|S zN@s4{TMse0I$T%^a#>f@1fNnFOLtwUBAgd3Tw&hUqR&rqsQB?A(E>>4kNn_lC}f<{;L6Ww?L|Qd~tYS$O6uPvH(YAi|@R6>@A3TmzUPh_KNJxmuJ z419LDzHA)){(aHiF$s_J9vaMg91zZTmKKN6Qr)WVUQ}o*C=`&Ya4)s^78dMmfS_V9 z^!bh+RQk{c&vsVyqf0klNS)jfbg?E*$oe^zIyL z?sOL>9?d3CR$#PlHBdzrz2RE44r1A1`C#qwecVB|>_m^!enpyv-E5I>7BKxc zRyr`fhg@^;nX+2ewi<(Rr^xv^z#$wyPHaP zs9%d$__l;N`O{~05al_POJ~~1==HFN+Kk)^lvL%+N5gBHEy-wzYJx2)oQOBM<;mTa z%{cU|S-8H>!8aMx?s6O1IJ*~WSsafD`8MgWFp4qh)vdsyrmV?@9_ul!viW&&lxA(= zER6eut;^f+sO-**MWfk`9lG1CD{Z)i@Nk$Sp3Jb0L#~@{Um(2|DNbL^%7joP(a|U7)LCubNlvhPCAmtXirkl zbtM5M>1Dx~2h&0W@zIa4Pntv}e+Y{N2Vx6%K6>&PS;dr3pHz$g%}e`-b3J^#WW`8a znjL|hNt3nQX9Y#=)Oc?vNJM>8SPP*!hljh0`aV*KP^-sa#c| ztS+Q`PA?|YrF_CZxxZ4VhrYzcB=H_GqV@1~$#WOKli-P(^}(zE!-Y*NdzGz^WQe`M z*`nQ9?3Ohw*v883+cOKUC&-ou0uPNUUtt>C5{nwLmYNxCb*Y*bOi!4Yw5^%lLuoc& zwv3XU9;A^Y&L&k*yQ?f8_re3ZXnd|rg*B+C(-5zex{xp3o0ckrzFR3JrhFvnPu~Uk z$So;`ujMQ*x4|M25lOASXQA?x2iaWnMXQKL!xWa!K|CW=X@!jCiaFb(oed~MZ_;x8@_*YBawhN-h-Sg40cfV6? zGA^H@7oSlOJoq)^NqL&lD}JI|@!|lqCA;4p@M<^kF~gp;CioBwlK69wHTO6w>Ffx4 z`Ek}=&tRsRUvus}3~yd!O>oiiXX{dJX2ilz+Obdk3ZJK~ab~89&2}bsX6h%|YW(0v zd8ngV!#v{~4pw9I6ncI7zX^KZBr^8TvG}|r6O-%K)EMeX68_aS?w`{M-b@-)sx0~t z)0g>vz^i`%8@x9piQ)1w*j8esbDUxrxrr^VGFdFv_S`L=Rh&Ixi-|nBK;%t|iF#?$ zy|4R;%f5Y?t?y1Ue9A}O2oNQ|J@d#;h1t`;c0(gd=W3BpI~aW#750!bQsFs9H13Li z%t(Y~xbNF<5#q=5VW@Kcq5X8QfHad(e=WQY-#b+sexK$>0~3bSgH#KQLrBRU1y4HR z7O%pyifEcsO3YA)OY`hbE4JOeE13xu%I(Vt%gX!j7w-9y74U3xlGC2@7S`(wuR|yQQZH86-r)Z+tmfl9PAz`5P_-PsQB{QL)0XLb7R|)6 z&l}Z_(3|4kaJ4Rm*R@eC2XyG@&$XxWe*d%grPbWD1nYeSA*}L8j8Tdv|Kcw9ee36+ z-cAcN_0=)$yu^ft+qW&7Oe2LL$xn4O?pw_)EHAn7Xc-e|sE})BZsv2Ioe^Z-7B4$- zT=MFCZ~m^Z{Dl*y#K&QKhNSXW4s2jDV$r;YUm;}h42qFW#vJDu@v45BGE7gIfh_Jy z5whs_&u$5s!)ii6a1Ip#%am`=ae}mWS08^)2{8>08C`g^TsIN})p6rt68*YP5d1{T zZB6X^4DN|)hs7@INw#cCX0OgYPL|aSP3S8*`=fV1F%u@m3SZiucalBKgeynUHLzwT zll3vOyvl06kReBg(0CIZ#>5xNZXT!K)_P1=B&x+l9a|rkeLQ~Kb;PRdLlJ)aD~uKN z9)m#rEQhfTD$<6-;zn&n;w9nH?k_=>KEBIdgB*B0ZnD;cxcE8F)fVpzQQtAoHfAYG z+Nb_JAHR(KVW#4vF~?7d*Tkq)k0!>HSGChmg%g_VH(x~|Xg>Xlb<903!S3#%5W_J_ zKw7L>9EWHqbAs0QI!Oa{oD&SLJ4!`M1$!gSzvGv_NwYVGsi%{ge`9n&cHEV18BpX{ zoImyDG?x1E)LJy_&3M4O(=I*>Qjc(ar*%F4LEROV3T5?6v7^n@`xOzP&LsRhB&hyk zC#@okZ)vyg(!YM{4vAQvuH@0J`tV)5Ug+uPQGFQ|pQ_7mhXV?ovK8!O7f78}5VQQ_WPK_qi=c;IW^&4By1jiRYjU)o z(>?}Yj7FoMFV=5&V?{slgl+L#fTU;Pt+cJ7OI%+$jWuHKO`RI1S!JMNv=y{Mmjcm;#;->taB6U=^ODQhnhAO}nP=DX6(^qajf@I)eT8majG z!FeEEGjH$S4q39yMY&+H6j*=ARp|%%@LrhlCrO4VlM~41DTjwDB;gLP8bkHmcG^@& z?P>oOwp4Z``7WMOwxT75aJp)HAS2&=a{TLu?Cif)7}T3yXKXH>N9s8e@~)7$74xwV zgTv)YQA9VSS_1rN)|TU3pXnYE$!%$0>^&7pwed%%oe(jU?2i~O@!>BXnR*2guk364enf+o)1_{BHBH^wx=23#f^Uj{`_dD?{tQh2 zv7@O}?Sjon3Pt7|yC2vuK1dvIlEXsv+pTWgNXo^P^P;R~zaudwBKylun{8|Us7KX2 zu3)ID_^u1iu%}s*Vd5eh`rbb)4z3pO{#oblVsB4lX6Qs?WN2*tXMF@hy0N{9>0h7Q zSh|=x8QO5znA(}USp1Xv@1McdFFRtY073w|jp+;`#JCH@9RT43fv`G31XsVFj%jeU zkqO`|(AB?H1Y!CDA_nj>kd6+-wE!UlI2J^NAq2$T0TBQg4gzCxCjWZ@&^JU3GgOR{;ED* zK&Svt1>MF_1LEF*2m?F=Tn{M_w*lkPqN14twwiU6Mg-o_H%*u>3}%k zc42Y@>AgVv*g)I}kb3~<0U1hkJ2#LWO<0JsbYulhR} z5NUwF0p+oPxIQ3v0Dc3sZw$nJ01*NB6VN^-5Vr$_9pF|V!~-N65M_YRZ}hJU2pG8j zfE)cg0>TBPci-sW5D;2`bAS*D5I;a50I%NYUmFl|fa7oU?*WJ)z+*T1w*-V4;2I#j zI^QrrE8_yejt7LM*rr3Falfwgjel_03rkMj~o3z2L#X?R>qC~UjZTt@ZydB?E&Ec zxE%Wcvc3h?j$VgFqS_MeSl|0@XgABSN7qX_n2jbQ(K|HJ+V5bVDg!Tz@p?Ef`_ z{m&xUe-ncJpZ*W~??bTvd<6Udj9~vs2=+gTVE-@#`~Uer?EfQz{g)%y|91rYe~V!M z3kde#hG72}|HJ-!5bQq}!T#3}>^}j){>KsQzZSv%5B`V!4G=lv%AlU!$|FHiN1pBWTzd`_DwM|0M+b z??ABsOArAX5{MKH35f^|45CCsA^@YIfymL2P>InXAZj!uF#lLXBVBnF&10U9z;-VZ2GepQ|fjD~Sl9-SD?@T$B40UGL6d6e5|Tvz2e z3DIz`%HxorbzPSSfk9Wl$czcX0AYd9LAO9?AZ!pS2nU1$!UZ9N@IXi){6GGTvAxsP z(ruc5JQ)kqD+lP`&;M+Dy7?3Yx^k0juNI`7Uep(~T_ub4E^oR?Ppi-u|EcSb)PtgIM@#|GcT;)qYW9Cu160OJ`d{7h{Y6 zuGhx?YU{%FCZWGRcXqMA+F)~?d{ZyzzxwB&n*Zsa>vA`nww(XjkN401)SKL9HiqW^ zb$hiu%OoDXS~44tfL zASO0IGax{#sDOsi0c~Rf`o0C|8W+$n7(@gj1yO?Tg6Kf3ARdqqNCKn=G6p$=0zkQ- z9?%*H`DW8M0m1>kIS6kKqMPIP%|U!~5P$|iy;twjfH8G_4p-w17br;%q6Kk*ARt4K zAE*n2gye^Wgp7oOgo=cYgo%WMM1VwwM1#bMB!*=0cl-ae`A=I{ZIA#5DR7Vh2RU$1 z00$*-Pyq)uaEJlNm7Z)J3|%aZY)onXvs(FTJ+he@&_SmEYzefq`)h~6e^$wZKz~NL z>AxEXon4$v4Q>DZYaacr+T6K-@FWk(|mnoNsu#x31a2s zeCw-56_O3d{g_A~_asXRb7r^BdajB^R2tl$vzW%Y@4L*chJ zIu3WT*xSh0zf*FvEI$r`;}JLkffErp3xTr{7>>ZB2t0vP+#Ne8!LsN;TzFYlT>PbHW@R&KvHhp`XqTNxcb zyT!CQ3XThbaqn$u>UDGQvM_kT!I8y){jqgydYX>OF#g33;TA86`hoV+uiAUM0ur~u z3F`wm?V3rFcnA`i#=xm%D@?D?*Y7UO*y25q|IKxNUVZF6p@l;6 zl9wFHeF|0SX7RboV5dy6`g=!@+erF&BEj!v>6=Eusgpqd`jEM-%>ycDqOfSn`^)AV@O7 zs$<}mdXPbim$V|SZBm?T{3tk{0^p@*6UGSTO%QmGuM;IW8xHoD2ikuo5dbOBFn3&p zg99k9*%Tpv!u&(aP1+&F_NL6Wcb?3iPXq)`#?ME=1x?rOp?bG&>vN5P>p8AjtUXy# zHx9VoaiBi=O@6V@aaC&pBj7@!>+1)FpuV`f1L!*x$iG;23fhi66eAq{4==N;Jn;p_ zPgp6?es>Dnsybthi`2jA5QA=)QHN1*gAOo0&`f^E=G*j&3Xg%?H$b2hv=5pWybf6< zHtKR^qA58}B&Xr1D#)ASR6zOzAb-*0Y-H#jJ(U;m`~qC)6I8lqMMW5>im9&b>0|K{2)M-`7$0rJ*tG~; zhrk3;D@YMaW8fgYKmBPAg00B$Nsoh5j)D55;I(=QX`y#g2o;)e=$8goK5ypW@BP+) zh_0OAmrg%@JQT_x`%dk3DUVWF9vA6PYW`4AuI23I7r=gnuJ2FutA2voKgYq*kAV6t z_$TipFarWJB5-N#HWh()np_@f{0EZW!2l+N^tC)%>8V|3neaE#U%W_V#j>T>Ce@C) zUX0W>}k8r7gHwB;TG7ts6}E1l8NtnOen zb1ZgVe&*I-sZiqQhN8c_vAK*k6$0)X0f${ZFVG;&v>m#5&qo3KN4mEEDunx+? zr28MPJ8ae`QMCoeL-}>ONrAA-HZD;9{&o2}pRNK^wy`Vw{FCmYr7mdXs4v|Rz>*yT z-SG=24&vm8qMN1PABl0oQ}cz(-J&kSGA$KU$@M>#gnw7Q)(kM8J_geq!haxNc!1E}Tma^#Lkq(-vRTWx7ch|B7f5W{DvUtE`T zRo>h06Z0>>_Wr;gE7C=is}SnAeHmP9n@Cl)Gx=QU+Yy0;dBT z1R%8d~Qo6j(CP)^= z@}1$a8)>;kxKcu@uH zyFl4&UN*~P=|u(_*73uy`Tieg`(%=tSM)d>mF<)#1d)DQ?aKwnKCb+*aoI?&3C?4m zqLwT1{-O}ER%MRMThfcaZ!BB6bKPA}yPzj#xbri?_K zYE`5S_vmpYz3lh(PeoFGtLGl3n0&nRLG>c1rbmidkJfffoiZN>G1l%i+mArsKJ|)z zMeGolmraxJOL_!tBO`H^=&K~z^rL^+&Z8>c9Atp;;rqy2Jy(3ztxiWsY&2#8xDk3J z6#i*8uz_8o&`$@E{;w|?Q4b>y zB&her6VS{Tv6;^4VuEb+@8KE9r2YQNLt5|X%;~qvb4S@#IzT5?P*r@Sf%rnV8#yIn1^3FvrOm1#;VQ+4dCido-AM64dFbWU$xIqyni*yrYEQ zg7c?^`%|YeBaB;pRSLQOmM=d#rTf0?ieG#cUbT1SG6-+kHP8_Wh%QJ$4*vn-LDX=UDH3~k) zj*MCIoHszzaJH*<&+CM9T$h$u-Ww~$T4_j@NjV3VnK>=F#GA`TJr$ZVTnu4*J&cyi z_>)yGg2Ko3EOlz#an^9LRUa9eTWsSWrmu?{yQ;)5N@yw-XCl}euP^PDu4wYO@h&Gc zUFyhz?zu-N>LcoxEsMmEq!AA0IcAzU+TFY-FT9FnGp!XuatK;u)Mec@2K!m1{VYS* zRLUCt+4=Me&s7?rWemXc1s2ZUN73LS7o_)>McAdCsBYk3l=9Br^i-Q=zNF4f&v6B=nG*<$R7O6OaR z#V{@Rl2#ZE`nu$zdq757LkrKc)^JNmygo$0u49H%J`4FoBb8StvG`f=A5#gJnyJv^Lc2Lp8IBEeaVLS7*8^Gf_&R!dQo@3iFk|ia)q*95}B+lCA|`B zd=Xaqq5Ixxs!-o$PiCgy?c(YE_#amtKT9XaKKq!dSyI~*)M|^N=cHKZ_UfBE#sl;w z-W`SD!WUxAp*XB>!-``L{rslG=+MpZrE5kzWwpHfA>z-vH_lSg3H%XRpE2r-Qz*j?Pn`W zt+BBIQoX)MB__{XPi564o+rOOlMu+Vaueg45!KJMesZ0288t{~D)r*CTp(jD}|LS81J z=xja5v?V{%C0bPZo9w5GB_d8sB^txnWSWLI(*2ot$w!Ta!`@4gDz%f}6Z%5AW(r+w zHN}83LIVmZ&hwUDE=0_4)iv`9D#C_HvfCa&s8DX+lm0W`A3^$WMn*`dMqn}oCP!eJ z|A+DZi)j(kK?v>RA*3TCq%$Be0YZKpgmf$f#z)BCX`Q)Gt1=8OAqIggk(fo15b|?A za>k)z83vbs2K+5ax5qdL<#7=h8<7#}yM@RI`B4zk(GZvrAwNDsx(Wi{M_^UN{zmLi z1SUaf&%pZUq>wfR0qpAi16zkDoC~T={t6DRPW z?-L`z!5z3j|1~a+kq2dIy{CUDSLZJ}L&x(7%4_xC^_?Ry-15IUs~3}i$aMsqwg=3= z?VJuDBb=`Y0*fKAB;xh%et4}983Bjh2F?#=`7=vvx|mdY1e|mZumx^itdcFBfcXeG z8S|PwCk{AeOh&=c!dKTPU|Vs7-Rd3+%)hs;=EMCHyzj}QJpST)2>mCG(0)8Z{hSE- zxe%Befq4-4J_0i%FbnAa8Q)ZYk8e4I^V@8~*-rKt1BbAKKqr`(+N=oW84y?sp}Y(N z%OdcHM;!CP96*1f{uwW6g9to?z#kEK7=cF+81voRWLI5aeiVH5exyosG1eoIX=n_b zbqw--9u!mEg>XKd2;7grlL$P4z{3dq6j#8BH7Zvkh=|qh;5P3TFG7FyuxIp2sZRaY02X_oz258gIu}(+ssCac??|7w-f(c7=rxPJ z!znmlhJ#a7uFLCh(1mw%!NFlv*Y&T6{s@=_=HpG=*Sw0r4!dr!RiA(B1DS(J%0mDa zyXL*Y+Agcme|aB)*AVLS@rqQ_2j;^m;@9WnvD@w)SfU`=>R_=>81S`~Okp^2yml1a zRCm>XlT{h7ojT>tM!{K?*Zl*Eau33=0Q!gE`hDuM*PzYcygS=Np-VanPHG3{*C}72 zOVHh6r{93R3RC-T?)aHdQ<}8of#cTk!N{YGg%9$hdO56N}73 zLR3}$sWrKD?XGgk9lehY<`&f!BMBSkvxJZk}rOh8>DhRSw!}>z9gVhG!u<^VR}gE8m#a>R}F@#8TRiF%T03G?yS0XQSte67Z%~4 z?$RhmZbQr@Uej`hqaTXLI+V1?ynwb*VFSgnD2+ouw;+YOtcsj3u(HJBQfpP!lbHmUE+%5!gA5G zD_GMDBM{yn1|L6L^ppYk?KR`RTn>1SV+`q_FsN}syCYUnw<^_B4UA`w>+cT&m?w4R z5&`?YdLQRezUu_Ol>7A6Rx&<_*hH;Bf(q{ZtLxFX90eF*pNCU_DQHJK;1E!>0_ibMdUVEElx(lgG{o_35HvILp^q%Vypu z5z+Q!DsBd+G$&|<$P}(X7#&rgVki0&kV8-}<$a0HZaHIPe;p#yrrp*og_i1kKJ)s@ zVzW2BOKo1mq!d9wxXO*3-^Hl)A5KXO{Z z-+n{^+;3_Dz7<<`et+HVbPz+L*{Vg8(M7{>-FDRDM=7mX)Y~}A8pA0~@q-Hu+Y2~2 zDI6I816i?2a%={Vs?)^_?8qOkLnTP((nb~Y?{mx7Ht>4=c(!J(UEur}{#jh9vQw3| zSzI^j8Gdpohq#xrFOf4u&9A2?xq!WMDEN+CI-QH4JgQ`onW#11Xlkcy&b?oYE~~%# zT2kXmz74U-w0|ehJ8~BFM2^Y7qccejsmjPOEu%Gf_O6YR@5cs_a=Vt+Dm{)LKCFIx z38!mIA?T>U(((}bs4p%zX(EG3F%YRV1KlwLY+La;dBuuKAr_}!7Oy0fiQR|l0Un#S zSiqe-_WnG&?5d5KI0K)zC2}2h&Ao_16m@Ox!^loISW{l~fkc7|=e}gXG4v2JDr_Y@25v368sE(GRj5A| zlNaIO2vI;k;LXpPB=dFC4*IguBKCtix@5>7J~`eyceyPY)6i#)R<=6bUIE4o!B$ty za8i#vl0&kV!d*7Jj4@D-S2pFZCm~$m+mDF+M)6!OH8F0|TiC*$(Frz2_c%!*p;L}^ zLcK@hBWkF|^x(hmLzC`y$^@-EfWZ2oj7!NnU+_DN`(l87_HctU*tyE~X|Lh;B@GER%%($Z2;WuD++%Bz>GQeiJ#inN%<)%jFU z#C_)9NCfSzW9Sh*e^2+ZHE{9yykbROrAgys_tH=&@5%BB3z>H0x5-J|vj!An7aO7^ zFXY}t7GzT9I`E2{f%%B0QxwtzTmp;Xs64l@)s(>-Zi=~Ov0U(bOq7<{u6Gkp%fw>d zV`*=O$PoB8&y=%*;NTei>+ieXODqwzQ;&lqc(3381}e6WIf*`zFF^GgJV<@e0wJ7t z4!Ywf6%8%ALyaG)nGMQSj7lE`N8G!~C#r3P2-p*$Q1vT(_db-{1UB;%3TjR>BFRQSq# zc6BLVlPyRRD$c6h!}Z({F02mUlZ=uWJMXZjf`1T=eR(=XAREA)XoKXoD&yjKi(YMt zTE1X>B2oC)@5hr#`)>AZFW~zUa5k43!N* zN!-MXTok2r4+$?6yenT)o16ZIw{Z4Foi;<`j|SNoj9Pa;eA$s)LVsk&`YoAIjV^K1 zr^?VEkLiS&+Ca$wGV=!uS;)gvrv0b;-Qe2`9V&I$+|{6cZMEk@R9MvQyDS%q7DT_@`wYXdjZPXx z11jk+U$Q;?J>e`K_XwBFVoJJJYs%1JVcqOG#>k_2$1{1qUD4i){rtx2twNQZzrODT zA+AqR;5%qC9R?RSUw_|f@F41XJsEsgx_5 z37hJm`2D1D`swJ=zIe%t5T@*!F_V6E24N>>YiKRO(<#CjxiPS}fAklgE`=KL$l2`f zTGV$A4W4v(o=V|4bfgp(I=fut~%+M{OYAJ36FKYtBpbjt<>V1NtEm&tMPJ*7ameMW>fZ0kcV362CHc- zESr=YCJJmpaPJ>M#;1-`3*)j`T@~n?RZo9WVe#0VjETv>^x46qGM*2z;J1!eJ`YO4 zC{~_jMlkd8(@Snx*gSzIEX1>#uyl@}#Xc+|(PyXC@&D zk4(ZOBoJ^&1rZ@6VN}4NnIt>{M8{;*5NIcpnKQ|hc`*+lJ}RPCtk|NK+t%8O4^p+( z(tg(ZSuN?~tM*zodaa+gx3$=6#flgo7ZJVW{?^{-%qxktt@n@nmE_xJt-bbMd#%0p zTKk-tGv};xZu>=i@y_cHJX`Y9GYjafA51sB{Nb-}z4PD;YaTrEr&8tId#4@ryb+6i z(bRlX@|{YTidPYxCVAyd0|7({?D&}?!mIA+Y_%_zFBlt$K&@;h^qC^mfZIoKJWeP zv?--cc@LaKkbFjuY0EC#_QmJ z-T!^y@xs#emu>lB)9sJ699dcR&f_6VU*(V9eWvC5DJ797zy0*v>J-KL*iVKXJOBLV zU7KfX*Ic`>C;#HU?v@*0zNd2bgH>zazw$d|-FI&5k7qx1?8)K{>nBfNFg*LG&gPx_ z`wpMkeAVLZS3YO|`H}lQjl=89&s%e^YirlOD+jNBz_R3P-`KNr z?YG;)ukYH^{yU3Z5npNS*P(bGSI;%W-|d#B-#z-mEwFVb`?;ueF7ENPmC)0D&^O!wMvnh ziXgA3K0jJ{N*+zNFQCcFe9DhXUN%zY3=InV`^w9cU9g>%ntzif1pk zS52ZS-(;$C0oseGs=i{l{Gimoa_QtbXCx}7VG+b~nf5<$j>N@lL zT9uiTXl7y}&GZ$~OjjZL7SPQ4%7fE}$_78KP3p88I_*m7(B$SR_u7-Y>hQL$2>8spcZ zz4Ej|DswHSGJ8FhL60eelcE#5Gvo{YLZPd%rj_=IRGp|(t9`XVjQiPis4DI~L9GMMM9Eg*3xuQD@kT)fq~WnmOl2w#nI( zX^yWo(Ko+4qYsaRtw70BDKDW&Xjf!hCQMZ1)9X_UXllYt#Xb{F zbYTscX6RBnfl7U+A@1kGCr>4|f2ysdkV<+c59j)6W_*vi$5;!=dS~{ok;i<-nvBK6 zI{PyA60uLAz=jpDVMV-?huMpjVvfvhdpEmku+BFk5 z^ws+rO=m#+a)m<9y+luB(B7M_(0fPi&D%$`x-3n*^c00^?>w0o^JHGklX)>u=EXdj7xVur zFXlDmj76eaEYaW5r)dcXKPe|O-(}IAo?Z=Y%@?#ayVe=$0*6ftiD zg5%$nRhr1I$4TJ=J;{U?2i0uK%8yBxj?Rn8(x^EYiEFFz83uh0u{7?$DaGhnYKg>K zz``|GBt`!V%gfNIKVxJEtuS8{4rNJx%p8m-VnHnoc{X*GNd4w@_CC=o6Ne25q@jf zql2H6>tu;8Efi%6=Y&F!E`uf$H_}n&ka_c@B|y8*)UL&on0Oy1=ff^*5=rXP+P zn)V0P74wAS{1Bo}#46H?u+QlcNdq_YSRMUw2yW9b1urz4LQS0MMDMW&R`Sc7b;7%d z-c~P)`Y@m*;_R$;^hLHBwO-x&vc3YdJ{!8r?08~vF~SQ9dnT4L9*H@qP;G?`ehts@c) z_?lwLcpuTKmR4O2Kifv6^%R+mF!E}qtOzGVYqfs1-h8f$tpo(>&F;?~5Obhi5Y@su z$5yUGy>yRyF@{h>?<3YkP8SphIns4q5l73#4yU0eMW{K#*{IUVC#|Ehj1oDrGKhjJ zsObaD%ELzG?SmEHGl#U0c$RjUF>kaV`#!gZy`BV}qq>8<0dd;Mv+THHG`V&3OzxA2 zK$rW?e%_wwRWm1%iFk?LRo$FWDZGWQP~3iKlQ_#BSX@tcoBcAx=w@=e1Cbs#XObnF zkf$fuqWgF(Y$Okw{Rs_v{?P1?BdF+3v!7GW&>pkj%eKe0iP`TDiq-p`S7Q2-9f*f|dV*s2 z{eawFIqFSj315UPZ^#!6)6?h)R{(Q}o=M|w4WI7aBGXlGLhRdOy)`-jJ>V9}xW?z4 zK9T>efP02Q;VX+6o_UM=SC zi$pfzoO~YZfSD(>#>VxI&dx5n+vHA$`GIk|7Cf+5BrK+~TzKLpdPQ~Xl!Xe0%aS|C z+!55YC@tmlK?mnDN=945{)mI>%q~Naar&YroWG@ceJi$kHIWNgH!oH4d2HO~C)L(? zi#`)4PVT(-ea+OK2woh3NKf#hFh9YLwPo5m%rqG_^4_ipC-~v$>$#=b6HO#zS~K<~ zY-Du4No*ueE#~L*JR-O`k`(jui?evZyGao6Ib+nBw-wU9JNg_A@&#(@jKbG6j(FGz*R-q6QYxU|8M?A^uJU- z*tUQ-7U2|s8|4{3zESrdJ(cUmRK`R3Iq5su&(9C#)St+y59)Bg4)4xs&;2vT-<>o5 z?oVla&EYwm*{ol_rx~6Zv5W4K(9~G>&FIUeVQ>Zy>9$| zdPuKZjo#rwJl#}86PybcHf!{{iHc6rP01uVo`W`sL z<5Lkoz&`@K0*?D2@ZEsR;N&j?Zvaf790I&?HQ-NB%u^J46tHtXVih>UucOogXE<>IVj1`(z;7;uKLfuF@RS;&C~zBK z-6EpPf!hI_>ah0!Zvng&Wk2@^%&#YU6!-$b+s}e-!1n?^y$tpNJ_Oj!ua+uSBs>p$ z1@L)*ziosLz+VLXD?SUX1AZ7#Z3Yi;GhhQs0=R%Emjh?`pDT#20secym20qGz*htA zTZ{Doe$QGF+jJN>!z1hXRcQ*xGu5}jCcy20_c);saE9l!<0Wjz-!$^+kx)|d>-Yiz!~1#O>`UZ`vHH^&G!Z2 z8-R0gRq-(J7Xcr`HTV$lV}OTxvA)0=9=sgu3!LF1eoa=1LbZUFFQ5S51$fz&M5hA3 z8*uJbm<#ZEfRA1a+X6p!9nl89=L($f%k-mc1Ah7SL@%T41pW%(UvGe~0C(+zPu>W9 zfHwf1kMbgLC*ZALhEBk51N;NZA>aoAkD&|$H-80jgF>Z>fKQ^>fd2;2yc@9qoFU&g zu>(H{IQu5V0&pjw>1Nm#_#ohvTVPL&$@hBr{>*OR3|F8WV|@TOqcoQO{X3&PFPOyn z2;s6lkH5&2^%=eP+H3UEOE1w2FT6mHJ@yz~bImo>)YQbe z*r~3rj!r-QbgHPRKrCCRfZtE}(g^MIO8z7N*x$bj-&-RiIslS!92rF)$>QTH5DDa^ zh;bZE7j=X0Em=22Wc}sRGx7ajhXw`?jG*!m9~sZ44=~8&`>=fj4|TlV(bR?G z`t~k?Z(#a~BX0?uDGW0Cj@srj-#%Orlzo4n#cJUrHq&2$e&UFr&lN|So5gp$aShl$ zys*yUsO!2AzR5?2qbq~nC61Og+43x9Q2nT_Y+#?I4C1VO)RJEuu#|)Es7>IawLC{& z31-HlA8%aMxDx-XKyfs63VFv<_y>)-@}PPdj}FQDKSvAT_hCjIFCQ68o};c)m$$mT zQ_8d8*mWE=iLW_+;i&mpHJ@dUMb58$U_i{z$5PAofG%;MG?qMJLtW}>9WSXf=zOfp zmB)`&$~7w+z?xw_b=+z(=zO&1%?0^TzP{a{8=WYer!p54@7u@=_6@!x0e>vKVo}<*03L4xjXV1L||km}jb< z9q&hskt94SZJJ?MS?9TD^GVMik?@H0)Xa61bz^(UkS9EUA8jrMT_7_xLpEVX=J$~SZ5l?b0euy+~q^e7PWR$W*(jyy{5ExJ4- z>W=DrzO(K)xCHQ0@W;r9+E&zp z__qP_hzYdF`W(?a0;-Mr0h8dckr!A9`XtelCD(w~jQ#<%Yyy5hsN2wHLy749!@zm; zB-(hynBd_VctHuK`Z8xg=j{`H)AP^PyC(ayOTm83_Y}cG%xaOXsk~1In z>!Z6!F-v=ljD&Npv{j687seGtW7WCH8Vnn1DqjIlaF*alUqRpQb|Ks~&T-ZTIdM|1V#F*(BHK8|SxjV)u+X=>x ze&I#1<+otVDfEVke) zxiXf0!Z>g`a(&D6sqQah`<7u->GynA=o2266zi9{vwZxHymh=a`Gm1A_w9LN-#(lX z`wgCWTnqIC`)%7o!Ek(ebut!S7WejPAy0f^$heQN&>IOY^Tb0nTk5L$Rp|l07B_At zEU&JssjWVDa*@r}kccJY3BKj~2}fHj`M??1yh;AKl3oWTrfp6_ipIZW+7bwAy;?lg znAyBy8(8_??mBIY7PJNVxV+jEZw+sWY|>)Ywq(HJ<-4)VtNor}T&q5}VbM6uY2k~; zm)@`_OV@@)sY%PaPm5|{pBDBSb4gJW4&ByiIfnIHxfw%>x418_-WmumuCKO*Jt0(5 zcXMhkZeChj)7_OH1qdt2#S% K some 64bit + plat_spec = PLAT_TO_VCVARS[get_platform()] + '_' + \ + PLAT_TO_VCVARS[plat_name] + + vc_env = query_vcvarsall(VERSION, plat_spec) + + self.__paths = vc_env['path'].split(os.pathsep) + os.environ['lib'] = vc_env['lib'] + os.environ['include'] = vc_env['include'] if len(self.__paths) == 0: raise DistutilsPlatformError("Python was built with %s, " diff --git a/Lib/distutils/msvccompiler.py b/Lib/distutils/msvccompiler.py index f3acb53477e5..30a9fc6f223e 100644 --- a/Lib/distutils/msvccompiler.py +++ b/Lib/distutils/msvccompiler.py @@ -656,5 +656,5 @@ if get_build_version() >= 8.0: log.debug("Importing new compiler from distutils.msvc9compiler") OldMSVCCompiler = MSVCCompiler from distutils.msvc9compiler import MSVCCompiler - from distutils.msvc9compiler import get_build_architecture + # get_build_architecture not really relevant now we support cross-compile from distutils.msvc9compiler import MacroExpander diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py index deb9a0a0f1a5..69d90cffb87d 100644 --- a/Lib/distutils/util.py +++ b/Lib/distutils/util.py @@ -30,7 +30,7 @@ def get_platform (): irix64-6.2 Windows will return one of: - win-x86_64 (64bit Windows on x86_64 (AMD64)) + win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) win-ia64 (64bit Windows on Itanium) win32 (all others - specifically, sys.platform is returned) @@ -45,7 +45,7 @@ def get_platform (): j = string.find(sys.version, ")", i) look = sys.version[i+len(prefix):j].lower() if look=='amd64': - return 'win-x86_64' + return 'win-amd64' if look=='itanium': return 'win-ia64' return sys.platform diff --git a/Misc/NEWS b/Misc/NEWS index a87d3e0a935b..eaabcb2f7dd2 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -18,6 +18,10 @@ Extensions Modules Library ------- +- Issue #2513: distutils on Windows is now capable of cross-compiling + extension modules between 32 and 64 bit platforms. See the distutls + build documentation for more information. + - Issue #815646: Individual file objects may now be used from multiple threads at once without fear of crashing the Python interpreter. If file.close() is called while an object is in use by another thread diff --git a/PC/example_nt/readme.txt b/PC/example_nt/readme.txt index 37a9c29cafc9..b83888c99164 100644 --- a/PC/example_nt/readme.txt +++ b/PC/example_nt/readme.txt @@ -2,12 +2,34 @@ Example Python extension for Windows NT ======================================= This directory contains everything needed (except for the Python -distribution!) to build a Python extension module using Microsoft VC++ -("Developer Studio") version 7.1. It has been tested with VC++ 7.1 on -Python 2.4. You can also use earlier versions of VC to build Python -extensions, but the sample VC project file (example.dsw in this directory) -is in VC 7.1 format. Notice that you need to use the same compiler version -that was used to build Python itself. +distribution!) to build a Python extension module using Microsoft VC++. +Notice that you need to use the same compiler version that was used to build +Python itself. + +The simplest way to build this example is to use the distutils script +'setup.py'. To do this, simply execute: + + % python setup.py install + +after everything builds and installs, you can test it: + + % python -c "import example; example.foo()" + Hello, world + +See setup.py for more details. alternatively, see below for instructions on +how to build inside the Visual Studio environment. + +Visual Studio Build Instructions +================================ + +These are instructions how to build an extension using Visual C++. The +instructions and project files have not been updated to the latest VC +version. In general, it is recommended you use the 'setup.py' instructions +above. + +It has been tested with VC++ 7.1 on Python 2.4. You can also use earlier +versions of VC to build Python extensions, but the sample VC project file +(example.dsw in this directory) is in VC 7.1 format. COPY THIS DIRECTORY! -------------------- diff --git a/PC/example_nt/setup.py b/PC/example_nt/setup.py new file mode 100644 index 000000000000..0443bc700094 --- /dev/null +++ b/PC/example_nt/setup.py @@ -0,0 +1,22 @@ +# This is an example of a distutils 'setup' script for the example_nt +# sample. This provides a simpler way of building your extension +# and means you can avoid keeping MSVC solution files etc in source-control. +# It also means it should magically build with all compilers supported by +# python. + +# USAGE: you probably want 'setup.py install' - but execute 'setup.py --help' +# for all the details. + +# NOTE: This is *not* a sample for distutils - it is just the smallest +# script that can build this. See distutils docs for more info. + +from distutils.core import setup, Extension + +example_mod = Extension('example', sources = ['example.c']) + + +setup(name = "example", + version = "1.0", + description = "A sample extension module", + ext_modules = [example_mod], +) diff --git a/PCbuild/bdist_wininst.vcproj b/PCbuild/bdist_wininst.vcproj index 414f7edae503..1f96826bfa38 100644 --- a/PCbuild/bdist_wininst.vcproj +++ b/PCbuild/bdist_wininst.vcproj @@ -1,7 +1,7 @@ + @@ -104,6 +107,96 @@ Name="VCPostBuildEventTool" /> + + + + + + + + + + + + + + + + + + + diff --git a/PCbuild/pcbuild.sln b/PCbuild/pcbuild.sln index a12c05592317..d534d7ee540d 100644 --- a/PCbuild/pcbuild.sln +++ b/PCbuild/pcbuild.sln @@ -482,13 +482,13 @@ Global {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|x64.ActiveCfg = Release|x64 {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|x64.Build.0 = Release|x64 {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|Win32.ActiveCfg = Release|Win32 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|x64.ActiveCfg = Release|Win32 + {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|x64.ActiveCfg = Release|x64 {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|Win32.ActiveCfg = Release|Win32 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|x64.ActiveCfg = Release|Win32 + {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|x64.ActiveCfg = Release|x64 {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|Win32.ActiveCfg = Release|Win32 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|x64.ActiveCfg = Release|Win32 + {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|x64.ActiveCfg = Release|x64 {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|Win32.ActiveCfg = Release|Win32 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|x64.ActiveCfg = Release|Win32 + {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|x64.ActiveCfg = Release|x64 {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|Win32.ActiveCfg = Debug|Win32 {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|Win32.Build.0 = Debug|Win32 {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|x64.ActiveCfg = Debug|x64 -- 2.47.3