From eb40dfd1e798821c71114a414c898bc967e2990f Mon Sep 17 00:00:00 2001 From: Ray Donnelly Date: Thu, 17 Jun 2021 18:51:10 +0530 Subject: [PATCH 001/138] sysconfig: make _sysconfigdata.py relocatable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: lovetox <8661218+lovetox@users.noreply.github.com> --- Lib/sysconfig.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index daf9f000060a35..eadb99c3a3bcc0 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -2,6 +2,7 @@ import os import sys +import textwrap from os.path import pardir, realpath __all__ = [ @@ -460,11 +461,30 @@ def _generate_posix_vars(): os.makedirs(pybuilddir, exist_ok=True) destfile = os.path.join(pybuilddir, name + '.py') + replacement = """ + keys_to_replace = [ + 'BINDIR', 'BINLIBDEST', 'CONFINCLUDEDIR', + 'CONFINCLUDEPY', 'DESTDIRS', 'DESTLIB', 'DESTSHARED', + 'INCLDIRSTOMAKE', 'INCLUDEDIR', 'INCLUDEPY', + 'LIBDEST', 'LIBDIR', 'LIBPC', 'LIBPL', 'MACHDESTLIB', + 'MANDIR', 'SCRIPTDIR', 'datarootdir', 'exec_prefix', + 'TZPATH', + ] + + prefix = build_time_vars['BINDIR'][:-4] + + for key in keys_to_replace: + value = build_time_vars[key] + build_time_vars[key] = value.replace(prefix, sys.prefix) + """ + with open(destfile, 'w', encoding='utf8') as f: + f.write('import sys\n') f.write('# system configuration generated and used by' ' the sysconfig module\n') f.write('build_time_vars = ') pprint.pprint(vars, stream=f) + f.write('\n%s' % textwrap.dedent(replacement)) # Create file used for sys.path fixup -- see Modules/getpath.c with open('pybuilddir.txt', 'w', encoding='utf8') as f: From 461d489bdb3ba9e6bf0d52e139daf5ec85696aed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:12 +0530 Subject: [PATCH 002/138] restore setup config --- Makefile.pre.in | 4 ++++ Modules/Setup.config.in | 5 +++++ configure.ac | 4 ++-- 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 Modules/Setup.config.in diff --git a/Makefile.pre.in b/Makefile.pre.in index 8ee44bfc0adb6a..cad42bc57f9228 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -710,10 +710,12 @@ oldsharedmods: $(SHAREDMODS) Makefile Modules/config.c: Makefile.pre \ $(srcdir)/Modules/config.c.in \ $(MAKESETUP) \ + Modules/Setup.config \ $(srcdir)/Modules/Setup \ Modules/Setup.local $(SHELL) $(MAKESETUP) -c $(srcdir)/Modules/config.c.in \ -s Modules \ + Modules/Setup.config \ Modules/Setup.local \ $(srcdir)/Modules/Setup @mv config.c Modules @@ -1722,6 +1724,7 @@ libainstall: @DEF_MAKE_RULE@ python-config $(INSTALL_DATA) Makefile $(DESTDIR)$(LIBPL)/Makefile $(INSTALL_DATA) $(srcdir)/Modules/Setup $(DESTDIR)$(LIBPL)/Setup $(INSTALL_DATA) Modules/Setup.local $(DESTDIR)$(LIBPL)/Setup.local + $(INSTALL_DATA) Modules/Setup.config $(DESTDIR)$(LIBPL)/Setup.config $(INSTALL_DATA) Misc/python.pc $(DESTDIR)$(LIBPC)/python-$(VERSION).pc $(INSTALL_DATA) Misc/python-embed.pc $(DESTDIR)$(LIBPC)/python-$(VERSION)-embed.pc $(INSTALL_SCRIPT) $(srcdir)/Modules/makesetup $(DESTDIR)$(LIBPL)/makesetup @@ -1947,6 +1950,7 @@ distclean: clobber docclean if test "$$file" != "$(srcdir)/Lib/test/data/README"; then rm "$$file"; fi; \ done -rm -f core Makefile Makefile.pre config.status Modules/Setup.local \ + Modules/Setup.config \ Modules/ld_so_aix Modules/python.exp Misc/python.pc \ Misc/python-embed.pc Misc/python-config.sh -rm -f python*-gdb.py diff --git a/Modules/Setup.config.in b/Modules/Setup.config.in new file mode 100644 index 00000000000000..5c1299dcc4fc3d --- /dev/null +++ b/Modules/Setup.config.in @@ -0,0 +1,5 @@ +# This file is transmogrified into Setup.config by config.status. + +# The purpose of this file is to conditionally enable certain modules +# based on configure-time options. + diff --git a/configure.ac b/configure.ac index cc69015b102bb7..a468f614cd9733 100644 --- a/configure.ac +++ b/configure.ac @@ -6006,7 +6006,7 @@ AC_SUBST(TEST_MODULES) # generate output files -AC_CONFIG_FILES(Makefile.pre Misc/python.pc Misc/python-embed.pc Misc/python-config.sh) +AC_CONFIG_FILES(Makefile.pre Modules/Setup.config Misc/python.pc Misc/python-embed.pc Misc/python-config.sh) AC_CONFIG_FILES([Modules/ld_so_aix], [chmod +x Modules/ld_so_aix]) AC_OUTPUT @@ -6018,7 +6018,7 @@ fi echo "creating Makefile" >&AS_MESSAGE_FD $SHELL $srcdir/Modules/makesetup -c $srcdir/Modules/config.c.in \ - -s Modules \ + -s Modules Modules/Setup.config \ Modules/Setup.local $srcdir/Modules/Setup mv config.c Modules From bdf37e4e5fd9d6b17b339d7b775b606dd2ba02cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:12 +0530 Subject: [PATCH 003/138] build: add --with-nt-threads and make it default on mingw MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Christoph Reiter --- Include/internal/pycore_condvar.h | 10 ++ Include/pythread.h | 6 ++ Modules/_multiprocessing/multiprocessing.h | 3 + configure.ac | 101 ++++++++++++++++++++- pyconfig.h.in | 3 + 5 files changed, 121 insertions(+), 2 deletions(-) diff --git a/Include/internal/pycore_condvar.h b/Include/internal/pycore_condvar.h index 8b89d709510a33..dd98245596ad01 100644 --- a/Include/internal/pycore_condvar.h +++ b/Include/internal/pycore_condvar.h @@ -5,6 +5,12 @@ # error "this header requires Py_BUILD_CORE define" #endif +#ifdef __MINGW32__ +# if !defined(HAVE_PTHREAD_H) || defined(NT_THREADS) +# undef _POSIX_THREADS +# endif +#endif + #ifndef _POSIX_THREADS /* This means pthreads are not implemented in libc headers, hence the macro not present in unistd.h. But they still can be implemented as an external @@ -37,6 +43,10 @@ /* include windows if it hasn't been done before */ #define WIN32_LEAN_AND_MEAN #include +/* winpthreads are involved via windows header, so need undef _POSIX_THREADS after header include */ +#if defined(_POSIX_THREADS) +#undef _POSIX_THREADS +#endif /* options */ /* non-emulated condition variables are provided for those that want diff --git a/Include/pythread.h b/Include/pythread.h index bb9d86412218ad..f1e52c60956a6c 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -8,6 +8,12 @@ typedef void *PyThread_type_lock; extern "C" { #endif +#ifdef __MINGW32__ +# if !defined(HAVE_PTHREAD_H) || defined(NT_THREADS) +# undef _POSIX_THREADS +# endif +#endif + /* Return status codes for Python lock acquisition. Chosen for maximum * backwards compatibility, ie failure -> 0, success -> 1. */ typedef enum PyLockStatus { diff --git a/Modules/_multiprocessing/multiprocessing.h b/Modules/_multiprocessing/multiprocessing.h index 277963bc1575bb..07bb04731658b8 100644 --- a/Modules/_multiprocessing/multiprocessing.h +++ b/Modules/_multiprocessing/multiprocessing.h @@ -21,6 +21,9 @@ # endif # define SEM_HANDLE HANDLE # define SEM_VALUE_MAX LONG_MAX +# if defined(HAVE_SEM_OPEN) && defined(_POSIX_THREADS) +# include +# endif #else # include /* O_CREAT and O_EXCL */ # if defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED) diff --git a/configure.ac b/configure.ac index a468f614cd9733..a2a7abfa862f68 100644 --- a/configure.ac +++ b/configure.ac @@ -2044,6 +2044,53 @@ then BASECFLAGS="$BASECFLAGS $ac_arch_flags" fi +dnl NOTE: +dnl - GCC 4.4+ for mingw* require and use posix threads(pthreads-w32) +dnl - Host may contain installed pthreads-w32. +dnl - On windows platform only NT-thread model is supported. +dnl To avoid miss detection scipt first will check for NT-thread model +dnl and if is not found will try to detect build options for pthread +dnl model. Autodetection could be overiden if variable with_nt_threads +dnl is set in "Site Configuration" (see autoconf manual). +dnl If NT-thread model is enabled script skips some checks that +dnl impact build process. When a new functionality is added, developers +dnl are responsible to update configure script to avoid thread models +dnl to be mixed. + +AC_MSG_CHECKING([for --with-nt-threads]) +AC_ARG_WITH(nt-threads, + AS_HELP_STRING([--with-nt-threads], [build with windows threads (default is system-dependent)]), +[ + case $withval in + no) with_nt_threads=no;; + yes) with_nt_threads=yes;; + *) with_nt_threads=yes;; + esac +], [ + case $host in + *-*-mingw*) with_nt_threads=yes;; + *) with_nt_threads=no;; + esac +]) +AC_MSG_RESULT([$with_nt_threads]) + +if test $with_nt_threads = yes ; then +AC_MSG_CHECKING([whether linking with nt-threads work]) +AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[]],[[_beginthread(0, 0, 0);]]) + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_ERROR([failed to link with nt-threads])]) +fi + +if test $with_nt_threads = yes ; then + dnl temporary default flag to avoid additional pthread checks + dnl and initilize other ac..thread flags to no + ac_cv_pthread_is_default=no + ac_cv_kthread=no + ac_cv_pthread=no + dnl ac_cv_kpthread is set to no if default is yes (see below) +else # On some compilers, pthreads are available without further options # (e.g. MacOS X). On some of these systems, the compiler will not # complain if unaccepted options are passed (e.g. gcc on Mac OS X). @@ -2162,6 +2209,8 @@ CC="$ac_save_cc"]) AC_MSG_RESULT($ac_cv_pthread) fi +fi + # If we have set a CC compiler flag for thread support then # check if it works for CXX, too. ac_cv_cxx_thread=no @@ -2182,6 +2231,10 @@ elif test "$ac_cv_pthread" = "yes" then CXX="$CXX -pthread" ac_cv_cxx_thread=yes +elif test $with_nt_threads = yes +then + dnl set to always to skip extra pthread check below + ac_cv_cxx_thread=always fi if test $ac_cv_cxx_thread = yes @@ -2214,8 +2267,8 @@ dnl AC_MSG_RESULT($cpp_type) AC_HEADER_STDC AC_CHECK_HEADERS(asm/types.h crypt.h conio.h direct.h dlfcn.h errno.h \ fcntl.h grp.h \ -ieeefp.h io.h langinfo.h libintl.h process.h pthread.h \ -sched.h shadow.h signal.h stropts.h termios.h \ +ieeefp.h io.h langinfo.h libintl.h process.h \ +shadow.h signal.h stropts.h termios.h \ utime.h \ poll.h sys/devpoll.h sys/epoll.h sys/poll.h \ sys/audioio.h sys/xattr.h sys/bsdtty.h sys/event.h sys/file.h sys/ioctl.h \ @@ -2230,6 +2283,14 @@ sys/mman.h sys/eventfd.h) AC_HEADER_DIRENT AC_HEADER_MAJOR +# If using nt threads, don't look for pthread.h or thread.h +if test "x$with_nt_threads" = xno ; then +AC_HEADER_STDC +AC_CHECK_HEADERS(pthread.h sched.h thread.h) +AC_HEADER_DIRENT +AC_HEADER_MAJOR +fi + # bluetooth/bluetooth.h has been known to not compile with -std=c99. # http://permalink.gmane.org/gmane.linux.bluez.kernel/22294 SAVE_CFLAGS=$CFLAGS @@ -2429,6 +2490,10 @@ fi AC_MSG_CHECKING(for pthread_t) have_pthread_t=no +if test $with_nt_threads = yes ; then + dnl skip check for pthread_t if NT-thread model is enabled + have_pthread_t=skip +else AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[#include ]], [[pthread_t x; x = *(pthread_t*)0;]]) ],[have_pthread_t=yes],[]) @@ -2459,6 +2524,7 @@ if test "$ac_cv_sizeof_pthread_key_t" -eq "$ac_cv_sizeof_int" ; then else AC_MSG_RESULT(no) fi +fi CC="$ac_save_cc" AC_SUBST(OTHER_LIBTOOL_OPT) @@ -2949,10 +3015,15 @@ void *x = uuid_enc_be [AC_MSG_RESULT(no)] ) +if test $with_nt_threads = yes ; then + dnl do not search for sem_init if NT-thread model is enabled + : +else # 'Real Time' functions on Solaris # posix4 on Solaris 2.6 # pthread (first!) on Linux AC_SEARCH_LIBS(sem_init, pthread rt posix4) +fi # check if we need libintl for locale functions AC_CHECK_LIB(intl, textdomain, @@ -3252,6 +3323,11 @@ then CXX="$CXX -pthread" fi posix_threads=yes +elif test $with_nt_threads = yes +then + posix_threads=no + AC_DEFINE(NT_THREADS, 1, + [Define to 1 if you want to use native NT threads]) else if test ! -z "$withval" -a -d "$withval" then LDFLAGS="$LDFLAGS -L$withval" @@ -3706,6 +3782,15 @@ else fi # checks for library functions +if test $with_nt_threads = yes ; then + dnl GCC(mingw) 4.4+ require and use posix threads(pthreads-w32) + dnl and host may contain installed pthreads-w32. + dnl Skip checks for some functions declared in pthreads-w32 if + dnl NT-thread model is enabled. + ac_cv_func_pthread_kill=skip + ac_cv_func_sem_open=skip + ac_cv_func_sched_setscheduler=skip +fi AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ clock confstr close_range copy_file_range ctermid dup3 execv explicit_bzero \ explicit_memset faccessat fchmod fchmodat fchown fchownat \ @@ -4637,6 +4722,10 @@ AC_CHECK_DECLS([isinf, isnan, isfinite], [], [], [[#include ]]) # the kernel module that provides POSIX semaphores # isn't loaded by default, so an attempt to call # sem_open results in a 'Signal 12' error. +if test $with_nt_threads = yes ; then + dnl skip posix semaphores test if NT-thread model is enabled + ac_cv_posix_semaphores_enabled=no +fi AC_MSG_CHECKING(whether POSIX semaphores are enabled) AC_CACHE_VAL(ac_cv_posix_semaphores_enabled, AC_RUN_IFELSE([AC_LANG_SOURCE([[ @@ -4670,6 +4759,14 @@ fi # Multiprocessing check for broken sem_getvalue AC_MSG_CHECKING(for broken sem_getvalue) +if test $with_nt_threads = yes ; then + dnl Skip test if NT-thread model is enabled. + dnl NOTE the test case below fail for pthreads-w32 as: + dnl - SEM_FAILED is not defined; + dnl - sem_open is a stub; + dnl - sem_getvalue work(!). + ac_cv_broken_sem_getvalue=skip +fi AC_CACHE_VAL(ac_cv_broken_sem_getvalue, AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include diff --git a/pyconfig.h.in b/pyconfig.h.in index 57c84e5f8fac01..3bb38bfd1ae17b 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -1389,6 +1389,9 @@ /* Define if mvwdelch in curses.h is an expression. */ #undef MVWDELCH_IS_EXPRESSION +/* Define to 1 if you want to use native NT threads */ +#undef NT_THREADS + /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT From 43133b521e79f62d4d473a2c5ad9a1b8dafacbdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:13 +0530 Subject: [PATCH 004/138] MINGW translate gcc internal defines to python platf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Christoph Reiter --- Include/pyport.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Include/pyport.h b/Include/pyport.h index 6ab0ae4007922a..a27bedf4a2fe7e 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -26,6 +26,21 @@ #endif +#ifdef __MINGW32__ +/* Translate GCC[mingw*] platform specific defines to those + * used in python code. + */ +#if !defined(MS_WIN64) && defined(_WIN64) +# define MS_WIN64 +#endif +#if !defined(MS_WIN32) && defined(_WIN32) +# define MS_WIN32 +#endif +#if !defined(MS_WINDOWS) && defined(MS_WIN32) +# define MS_WINDOWS +#endif +#endif /* __MINGW32__*/ + /************************************************************************** Symbols and macros to supply platform-independent interfaces to basic C language & library operations whose spellings vary across platforms. From 07eb1b65a25cc13f8e60647dbb9a49f51e0242bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:14 +0530 Subject: [PATCH 005/138] MINGW configure MACHDEP and platform for build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- configure.ac | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/configure.ac b/configure.ac index a2a7abfa862f68..f7c34a46e7e7b9 100644 --- a/configure.ac +++ b/configure.ac @@ -400,6 +400,9 @@ then *-*-cygwin*) ac_sys_system=Cygwin ;; + *-*-mingw*) + ac_sys_system=MINGW + ;; *-*-vxworks*) ac_sys_system=VxWorks ;; @@ -429,6 +432,7 @@ then linux*) MACHDEP="linux";; cygwin*) MACHDEP="cygwin";; darwin*) MACHDEP="darwin";; + mingw*) MACHDEP="win32";; '') MACHDEP="unknown";; esac fi @@ -452,12 +456,23 @@ if test "$cross_compiling" = yes; then *-*-vxworks*) _host_cpu=$host_cpu ;; + *-*-mingw*) + _host_cpu= + ;; *) # for now, limit cross builds to known configurations MACHDEP="unknown" AC_MSG_ERROR([cross build not supported for $host]) esac _PYTHON_HOST_PLATFORM="$MACHDEP${_host_cpu:+-$_host_cpu}" + + case "$host_os" in + mingw*) + # As sys.platform() return 'win32' to build python and extantions + # we will use 'mingw' (in setup.py and etc.) + _PYTHON_HOST_PLATFORM=mingw + ;; + esac fi # Some systems cannot stand _XOPEN_SOURCE being defined at all; they From afb9a2b539e23db3ea55e1831f33fd87721e8066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:15 +0530 Subject: [PATCH 006/138] MINGW preset configure defaults MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Christoph Reiter --- Misc/config_mingw | 12 ++++++++++++ Misc/cross_mingw32 | 11 +++++++++++ configure.ac | 22 ++++++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 Misc/config_mingw create mode 100644 Misc/cross_mingw32 diff --git a/Misc/config_mingw b/Misc/config_mingw new file mode 100644 index 00000000000000..513065dec9b717 --- /dev/null +++ b/Misc/config_mingw @@ -0,0 +1,12 @@ +# configure defaults for mingw* hosts + +# mingw functions to ignore +ac_cv_func_ftruncate=ignore # implement it as _chsize + +# mingw-w64 functions to ignore +ac_cv_func_truncate=ignore +ac_cv_func_alarm=ignore + +# files to ignore +ac_cv_file__dev_ptmx=ignore #NOTE: under MSYS environment device exist +ac_cv_file__dev_ptc=no diff --git a/Misc/cross_mingw32 b/Misc/cross_mingw32 new file mode 100644 index 00000000000000..03fde9e6af3ad7 --- /dev/null +++ b/Misc/cross_mingw32 @@ -0,0 +1,11 @@ +# configure defaults for mingw32 host if cross-build + +ac_cv_little_endian_double=yes +ac_cv_big_endian_double=no +ac_cv_mixed_endian_double=no + +ac_cv_tanh_preserves_zero_sign=yes + +ac_cv_wchar_t_signed=no + +ac_cv_have_size_t_format=no diff --git a/configure.ac b/configure.ac index f7c34a46e7e7b9..1f24830dae8afa 100644 --- a/configure.ac +++ b/configure.ac @@ -910,6 +910,28 @@ if test x$MULTIARCH != x; then fi AC_SUBST(MULTIARCH_CPPFLAGS) +# initialize default configuration +py_config= +case $host in + *-*-mingw*) py_config=mingw ;; +esac +if test -n "$py_config" ; then + AC_MSG_NOTICE([loading configure defaults from .../Misc/config_$py_config"]) + . "$srcdir/Misc/config_$py_config" +fi + +# initialize defaults for cross-builds +if test "$cross_compiling" = yes; then + py_config=$host_os + case $py_config in + mingw32*) py_config=mingw32 ;; + esac + if test -f "$srcdir/Misc/cross_$py_config" ; then + AC_MSG_NOTICE([loading cross defaults from .../Misc/cross_$py_config"]) + . "$srcdir/Misc/cross_$py_config" + fi +fi + AC_MSG_CHECKING([for -Wl,--no-as-needed]) save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -Wl,--no-as-needed" From 668a889c4eb7b7bd0572156e243446dc14fb4af2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:16 +0530 Subject: [PATCH 007/138] MINGW configure largefile support for windows builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Christoph Reiter --- configure.ac | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/configure.ac b/configure.ac index 1f24830dae8afa..a0ce0df9148d43 100644 --- a/configure.ac +++ b/configure.ac @@ -2494,8 +2494,20 @@ AC_CHECK_SIZEOF(off_t, [], [ ]) AC_MSG_CHECKING(whether to enable large file support) +have_largefile_support=no if test "$ac_cv_sizeof_off_t" -gt "$ac_cv_sizeof_long" -a \ "$ac_cv_sizeof_long_long" -ge "$ac_cv_sizeof_off_t"; then + have_largefile_support=yes +else + case $host in + *-*-mingw*) + dnl Activate on windows platforms (32&64-bit) where off_t(4) < fpos_t(8) + have_largefile_support=yes + ;; + esac +fi + +if test $have_largefile_support = yes ; then AC_DEFINE(HAVE_LARGEFILE_SUPPORT, 1, [Defined to enable large file support when an off_t is bigger than a long and long long is at least as big as an off_t. You may need From 491a5b182f240b11018581670331cf4e908fc2ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:18 +0530 Subject: [PATCH 008/138] MINGW add srcdir PC to CPPFLAGS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- configure.ac | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/configure.ac b/configure.ac index a0ce0df9148d43..95434a779cc733 100644 --- a/configure.ac +++ b/configure.ac @@ -5714,8 +5714,21 @@ do THREADHEADERS="$THREADHEADERS \$(srcdir)/$h" done +case $host in + *-*-mingw*) + dnl Required for windows builds as Objects/exceptions.c require + dnl "errmap.h" from $srcdir/PC. + dnl Note we cannot use BASECPPFLAGS as autogenerated pyconfig.h + dnl has to be before customized located in ../PC. + CPPFLAGS="-I\$(srcdir)/PC $CPPFLAGS" + ;; +esac + AC_SUBST(SRCDIRS) SRCDIRS="Parser Objects Python Modules Modules/_io Programs" +case $host in + *-*-mingw*) SRCDIRS="$SRCDIRS PC";; +esac AC_MSG_CHECKING(for build directories) for dir in $SRCDIRS; do if test ! -d $dir; then From 92502cfa7067061c98af1d8210c9198564c9a0cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:19 +0530 Subject: [PATCH 009/138] MINGW init system calls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Modules/Setup | 1 - Modules/Setup.config.in | 3 +++ Modules/posixmodule.c | 29 +++++++++++++++++++++++++---- configure.ac | 8 ++++++++ 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/Modules/Setup b/Modules/Setup index 87c6a152f86eac..34d98e5e9144e7 100644 --- a/Modules/Setup +++ b/Modules/Setup @@ -101,7 +101,6 @@ PYTHONPATH=$(COREPYTHONPATH) # This only contains the minimal set of modules required to run the # setup.py script in the root of the Python source tree. -posix -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal posixmodule.c # posix (UNIX) system calls errno errnomodule.c # posix (UNIX) errno values pwd pwdmodule.c # this is needed to find out the user's home dir # if $HOME is not set diff --git a/Modules/Setup.config.in b/Modules/Setup.config.in index 5c1299dcc4fc3d..9b364fe75ff244 100644 --- a/Modules/Setup.config.in +++ b/Modules/Setup.config.in @@ -3,3 +3,6 @@ # The purpose of this file is to conditionally enable certain modules # based on configure-time options. +# init system calls(posix/nt/...) for INITFUNC (used by makesetup) +@INITSYS@ -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal posixmodule.c + diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index f92e2ae6290ad2..9bbf69a8600114 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -320,6 +320,27 @@ corresponding Unix manual entries for more information on calls."); # define HAVE_CWAIT 1 # define HAVE_FSYNC 1 # define fsync _commit +# elif defined(__MINGW32__) /* GCC for windows hosts */ +/* getlogin is detected by configure on mingw-w64 */ +# undef HAVE_GETLOGIN +/*# define HAVE_GETCWD 1 - detected by configure*/ +# define HAVE_GETPPID 1 +# define HAVE_GETLOGIN 1 +# define HAVE_SPAWNV 1 +# define HAVE_WSPAWNV 1 +# define HAVE_WEXECV 1 +/*# define HAVE_EXECV 1 - detected by configure*/ +# define HAVE_PIPE 1 +# define HAVE_POPEN 1 +# define HAVE_SYSTEM 1 +# define HAVE_CWAIT 1 +# define HAVE_FSYNC 1 +# define fsync _commit +# include +# include +# ifndef _MAX_ENV +# define _MAX_ENV 32767 +# endif # else /* Unix functions that the configure script doesn't check for */ # ifndef __VXWORKS__ @@ -420,7 +441,7 @@ extern char *ctermid_r(char *); # endif #endif -#ifdef _MSC_VER +#ifdef MS_WINDOWS # ifdef HAVE_DIRECT_H # include # endif @@ -442,7 +463,7 @@ extern char *ctermid_r(char *); # include // ShellExecute() # include // UNLEN # define HAVE_SYMLINK -#endif /* _MSC_VER */ +#endif /* MS_WINDOWS */ #ifndef MAXPATHLEN # if defined(PATH_MAX) && PATH_MAX > 1024 @@ -1591,9 +1612,9 @@ win32_get_reparse_tag(HANDLE reparse_point_handle, ULONG *reparse_tag) ** man environ(7). */ #include -#elif !defined(_MSC_VER) && (!defined(__WATCOMC__) || defined(__QNX__) || defined(__VXWORKS__)) +#elif !defined(MS_WINDOWS) && (!defined(__WATCOMC__) || defined(__QNX__) || defined(__VXWORKS__)) extern char **environ; -#endif /* !_MSC_VER */ +#endif /* !MS_WINDOWS */ static PyObject * convertenviron(void) diff --git a/configure.ac b/configure.ac index 95434a779cc733..51ff31aeaf2878 100644 --- a/configure.ac +++ b/configure.ac @@ -584,6 +584,14 @@ then AC_DEFINE(_INCLUDE__STDC_A1_SOURCE, 1, Define to include mbstate_t for mbrtowc) fi +AC_MSG_CHECKING([for init system calls]) +AC_SUBST(INITSYS) +case $host in + *-*-mingw*) INITSYS=nt;; + *) INITSYS=posix;; +esac +AC_MSG_RESULT([$INITSYS]) + # Record the configure-time value of MACOSX_DEPLOYMENT_TARGET, # it may influence the way we can build extensions, so distutils # needs to check it From c3ffc461de90502772b113ae355014c80d492d3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:20 +0530 Subject: [PATCH 010/138] MINGW build in windows modules winreg MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Christoph Reiter --- Modules/Setup.config.in | 3 +++ PC/winreg.c | 19 +++++++++++++++++++ configure.ac | 7 +++++++ 3 files changed, 29 insertions(+) diff --git a/Modules/Setup.config.in b/Modules/Setup.config.in index 9b364fe75ff244..612cabd8df32d6 100644 --- a/Modules/Setup.config.in +++ b/Modules/Setup.config.in @@ -6,3 +6,6 @@ # init system calls(posix/nt/...) for INITFUNC (used by makesetup) @INITSYS@ -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal posixmodule.c +# build-in modules for windows platform: +@USE_WIN32_MODULE@winreg ../PC/winreg.c + diff --git a/PC/winreg.c b/PC/winreg.c index 4fefcdcc942ff9..00de52b97648b1 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -18,6 +18,25 @@ #include "structmember.h" // PyMemberDef #include +#ifndef SIZEOF_HKEY +/* used only here */ +#if defined(MS_WIN64) +# define SIZEOF_HKEY 8 +#elif defined(MS_WIN32) +# define SIZEOF_HKEY 4 +#else +# error "SIZEOF_HKEY is not defined" +#endif +#endif + +#ifndef REG_LEGAL_CHANGE_FILTER +#define REG_LEGAL_CHANGE_FILTER (\ + REG_NOTIFY_CHANGE_NAME |\ + REG_NOTIFY_CHANGE_ATTRIBUTES |\ + REG_NOTIFY_CHANGE_LAST_SET |\ + REG_NOTIFY_CHANGE_SECURITY ) +#endif + static BOOL PyHKEY_AsHKEY(PyObject *ob, HKEY *pRes, BOOL bNoneOK); static BOOL clinic_HKEY_converter(PyObject *ob, void *p); static PyObject *PyHKEY_FromHKEY(HKEY h); diff --git a/configure.ac b/configure.ac index 51ff31aeaf2878..d83dedfa309654 100644 --- a/configure.ac +++ b/configure.ac @@ -3346,6 +3346,13 @@ else fi]) AC_MSG_RESULT($with_dbmliborder) +# Determine if windows modules should be used. +AC_SUBST(USE_WIN32_MODULE) +USE_WIN32_MODULE='#' +case $host in + *-*-mingw*) USE_WIN32_MODULE=;; +esac + # Templates for things AC_DEFINEd more than once. # For a single AC_DEFINE, no template is needed. AH_TEMPLATE(_REENTRANT, From 40f457711805ccd9f635ef3467a862d0f77f3c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:21 +0530 Subject: [PATCH 011/138] MINGW determine if pwdmodule should be used MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Christoph Reiter --- Modules/Setup | 2 -- Modules/Setup.config.in | 3 +++ configure.ac | 7 +++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Modules/Setup b/Modules/Setup index 34d98e5e9144e7..e765e050e58905 100644 --- a/Modules/Setup +++ b/Modules/Setup @@ -102,8 +102,6 @@ PYTHONPATH=$(COREPYTHONPATH) # setup.py script in the root of the Python source tree. errno errnomodule.c # posix (UNIX) errno values -pwd pwdmodule.c # this is needed to find out the user's home dir - # if $HOME is not set _sre -DPy_BUILD_CORE_BUILTIN _sre.c # Fredrik Lundh's new regular expressions _codecs _codecsmodule.c # access to the builtin codecs and codec registry _weakref _weakref.c # weak references diff --git a/Modules/Setup.config.in b/Modules/Setup.config.in index 612cabd8df32d6..d071a744075404 100644 --- a/Modules/Setup.config.in +++ b/Modules/Setup.config.in @@ -6,6 +6,9 @@ # init system calls(posix/nt/...) for INITFUNC (used by makesetup) @INITSYS@ -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal posixmodule.c +# This is needed to find out the user's home dir if $HOME is not set +@USE_PWD_MODULE@pwd pwdmodule.c + # build-in modules for windows platform: @USE_WIN32_MODULE@winreg ../PC/winreg.c diff --git a/configure.ac b/configure.ac index d83dedfa309654..f5acdfdd956f1e 100644 --- a/configure.ac +++ b/configure.ac @@ -3353,6 +3353,13 @@ case $host in *-*-mingw*) USE_WIN32_MODULE=;; esac +# Determine if pwdmodule should be used. +AC_SUBST(USE_PWD_MODULE) +USE_PWD_MODULE= +case $host in + *-*-mingw*) USE_PWD_MODULE='#';; +esac + # Templates for things AC_DEFINEd more than once. # For a single AC_DEFINE, no template is needed. AH_TEMPLATE(_REENTRANT, From 680a5a8aed43506aa8b474947cc3b279e40dfe50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:23 +0530 Subject: [PATCH 012/138] issue6672 v2 Add Mingw recognition to pyport.h to al MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Include/pyport.h | 20 +++++++++++--------- setup.py | 3 +++ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Include/pyport.h b/Include/pyport.h index a27bedf4a2fe7e..dedc3b892886f6 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -669,12 +669,12 @@ extern char * _getpty(int *, int, mode_t, int); */ /* - All windows ports, except cygwin, are handled in PC/pyconfig.h. + Only MSVC windows ports is handled in PC/pyconfig.h. - Cygwin is the only other autoconf platform requiring special + Cygwin and Mingw is the only other autoconf platform requiring special linkage handling and it uses __declspec(). */ -#if defined(__CYGWIN__) +#if defined(__CYGWIN__) || defined(__MINGW32__) # define HAVE_DECLSPEC_DLL #endif @@ -687,21 +687,23 @@ extern char * _getpty(int *, int, mode_t, int); # define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE # define PyAPI_DATA(RTYPE) extern Py_EXPORTED_SYMBOL RTYPE /* module init functions inside the core need no external linkage */ - /* except for Cygwin to handle embedding */ -# if defined(__CYGWIN__) + /* except for Cygwin/Mingw to handle embedding */ +# if defined(__CYGWIN__) || defined(__MINGW32__) # define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject* -# else /* __CYGWIN__ */ +# else /* __CYGWIN__ || __MINGW32__*/ # define PyMODINIT_FUNC PyObject* -# endif /* __CYGWIN__ */ +# endif /* __CYGWIN__ || __MINGW32__*/ # else /* Py_BUILD_CORE */ /* Building an extension module, or an embedded situation */ /* public Python functions and data are imported */ /* Under Cygwin, auto-import functions to prevent compilation */ /* failures similar to those described at the bottom of 4.1: */ /* http://docs.python.org/extending/windows.html#a-cookbook-approach */ -# if !defined(__CYGWIN__) +# if defined(__CYGWIN__) || defined(__MINGW32__) +# define PyAPI_FUNC(RTYPE) RTYPE +# else # define PyAPI_FUNC(RTYPE) Py_IMPORTED_SYMBOL RTYPE -# endif /* !__CYGWIN__ */ +# endif /* __CYGWIN__ || __MINGW32__*/ # define PyAPI_DATA(RTYPE) extern Py_IMPORTED_SYMBOL RTYPE /* module init functions outside the core must be exported */ # if defined(__cplusplus) diff --git a/setup.py b/setup.py index 85a2b26357db46..d97108353ebe23 100644 --- a/setup.py +++ b/setup.py @@ -474,6 +474,9 @@ def build_extensions(self): self.configure_compiler() self.init_inc_lib_dirs() + if MS_WINDOWS: + self.compiler.define_macro("Py_BUILD_CORE_MODULE") + # Detect which modules should be compiled self.detect_modules() From 6a50448af007468549e48de8985c27d81e83ccf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:24 +0530 Subject: [PATCH 013/138] MINGW configure for shared build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- configure.ac | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index f5acdfdd956f1e..73dfc741a827c3 100644 --- a/configure.ac +++ b/configure.ac @@ -1227,6 +1227,13 @@ if test $enable_shared = "yes"; then ;; esac + case $host in + *-*-mingw*) + LDLIBRARY='libpython$(LDVERSION).dll.a' + DLLLIBRARY='libpython$(LDVERSION).dll' + BLDLIBRARY='-L. -lpython$(LDVERSION)' + ;; + esac else # shared is disabled PY_ENABLE_SHARED=0 case $ac_sys_system in @@ -1235,6 +1242,10 @@ else # shared is disabled LDLIBRARY='libpython$(LDVERSION).dll.a' ;; esac + case $host in + *-*-mingw*) + LDLIBRARY='libpython$(LDVERSION).a';; + esac fi if test "$cross_compiling" = yes; then @@ -2881,6 +2892,12 @@ then LDCXXSHARED="g++ -shared -Wl,--enable-auto-image-base";; *) LDSHARED="ld";; esac + case $host in + *-*-mingw*) + LDSHARED='$(CC) -shared -Wl,--enable-auto-image-base' + LDCXXSHARED='$(CXX) -shared -Wl,--enable-auto-image-base' + ;; + esac fi AC_MSG_RESULT($LDSHARED) LDCXXSHARED=${LDCXXSHARED-$LDSHARED} @@ -5742,7 +5759,8 @@ case $host in dnl "errmap.h" from $srcdir/PC. dnl Note we cannot use BASECPPFLAGS as autogenerated pyconfig.h dnl has to be before customized located in ../PC. - CPPFLAGS="-I\$(srcdir)/PC $CPPFLAGS" + dnl (-I. at end is workaround for setup.py logic) + CPPFLAGS="-I\$(srcdir)/PC $CPPFLAGS -I." ;; esac From 66efcc595c20982aed82453b9aa0ffdcd8cfb4ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:25 +0530 Subject: [PATCH 014/138] MINGW dynamic loading support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Makefile.pre.in | 6 ++++++ Python/dynload_win.c | 9 +++++++-- configure.ac | 16 ++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index cad42bc57f9228..8a039e51574e6a 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -825,6 +825,12 @@ Python/dynload_hpux.o: $(srcdir)/Python/dynload_hpux.c Makefile -DSHLIB_EXT='"$(EXT_SUFFIX)"' \ -o $@ $(srcdir)/Python/dynload_hpux.c +Python/dynload_win.o: $(srcdir)/Python/dynload_win.c Makefile + $(CC) -c $(PY_CORE_CFLAGS) \ + -DSHLIB_SUFFIX='"$(SHLIB_SUFFIX)"' \ + -DEXT_SUFFIX='"$(EXT_SUFFIX)"' \ + -o $@ $(srcdir)/Python/dynload_win.c + Python/sysmodule.o: $(srcdir)/Python/sysmodule.c Makefile $(srcdir)/Include/pydtrace.h $(CC) -c $(PY_CORE_CFLAGS) \ -DABIFLAGS='"$(ABIFLAGS)"' \ diff --git a/Python/dynload_win.c b/Python/dynload_win.c index 5702ab2cd71ba1..6b53780f38b52e 100644 --- a/Python/dynload_win.c +++ b/Python/dynload_win.c @@ -27,6 +27,12 @@ #define PYD_UNTAGGED_SUFFIX PYD_DEBUG_SUFFIX ".pyd" const char *_PyImport_DynLoadFiletab[] = { +#ifdef EXT_SUFFIX + EXT_SUFFIX, /* include SOABI flags where is encoded debug */ +#endif +#ifdef SHLIB_SUFFIX + "-abi" PYTHON_ABI_STRING SHLIB_SUFFIX, +#endif PYD_TAGGED_SUFFIX, PYD_UNTAGGED_SUFFIX, NULL @@ -192,8 +198,7 @@ dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix, ensure DLLs adjacent to the PYD are preferred. */ Py_BEGIN_ALLOW_THREADS hDLL = LoadLibraryExW(wpathname, NULL, - LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | - LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR); + LOAD_WITH_ALTERED_SEARCH_PATH); Py_END_ALLOW_THREADS #if !USE_UNICODE_WCHAR_CACHE PyMem_Free(wpathname); diff --git a/configure.ac b/configure.ac index 73dfc741a827c3..a3a993e7a5cad2 100644 --- a/configure.ac +++ b/configure.ac @@ -2768,6 +2768,9 @@ if test -z "$SHLIB_SUFFIX"; then CYGWIN*) SHLIB_SUFFIX=.dll;; *) SHLIB_SUFFIX=.so;; esac + case $host_os in + mingw*) SHLIB_SUFFIX=.dll;; + esac fi AC_MSG_RESULT($SHLIB_SUFFIX) @@ -3845,6 +3848,13 @@ then fi ;; esac + case $host in + *-*-mingw*) + DYNLOADFILE="dynload_win.o" + extra_machdep_objs="$extra_machdep_objs PC/dl_nt.o" + CFLAGS_NODIST="$CFLAGS_NODIST -DMS_DLL_ID='\"$VERSION\"'" + ;; + esac fi AC_MSG_RESULT($DYNLOADFILE) if test "$DYNLOADFILE" != "dynload_stub.o" @@ -5739,6 +5749,12 @@ case "$ac_cv_computed_gotos" in yes*) AC_DEFINE(HAVE_COMPUTED_GOTOS, 1, [Define if the C compiler supports computed gotos.]) esac +case $host_os in + mingw*) + dnl Synchronized with _PyImport_DynLoadFiletab (dynload_win.c) + dnl Do not use more then one dot on this platform ! + EXT_SUFFIX=-$SOABI$SHLIB_SUFFIX;; +esac case $ac_sys_system in AIX*) From ed0bf4a1d8f78fe307b5c6cc5d42795960f43234 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:26 +0530 Subject: [PATCH 015/138] MINGW ignore main program for frozen scripts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Makefile.pre.in | 2 +- configure.ac | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 8a039e51574e6a..0d8ea115233d3d 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -349,7 +349,7 @@ PYTHON_OBJS= \ Python/context.o \ Python/dynamic_annotations.o \ Python/errors.o \ - Python/frozenmain.o \ + @PYTHON_OBJS_FROZENMAIN@ \ Python/future.o \ Python/getargs.o \ Python/getcompiler.o \ diff --git a/configure.ac b/configure.ac index a3a993e7a5cad2..41d01a1f665dae 100644 --- a/configure.ac +++ b/configure.ac @@ -5780,6 +5780,16 @@ case $host in ;; esac +dnl Python interpreter main program for frozen scripts +AC_SUBST(PYTHON_OBJS_FROZENMAIN) +PYTHON_OBJS_FROZENMAIN="Python/frozenmain.o" +case $host in + *-*-mingw*) + dnl 'PC/frozen_dllmain.c' - not yet + PYTHON_OBJS_FROZENMAIN= + ;; +esac + AC_SUBST(SRCDIRS) SRCDIRS="Parser Objects Python Modules Modules/_io Programs" case $host in From fc1b8748a79e636f7b6c2104b42772171503cd1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:26 +0530 Subject: [PATCH 016/138] MINGW setup _multiprocessing module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- setup.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/setup.py b/setup.py index d97108353ebe23..2528af04e9b763 100644 --- a/setup.py +++ b/setup.py @@ -1852,7 +1852,12 @@ def detect_multiprocessing(self): if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')): multiprocessing_srcs.append('_multiprocessing/semaphore.c') + multiprocessing_libs = [] + if MS_WINDOWS: + multiprocessing_libs += ['ws2_32'] self.add(Extension('_multiprocessing', multiprocessing_srcs, + define_macros={}, + libraries=multiprocessing_libs, include_dirs=["Modules/_multiprocessing"])) if (not MS_WINDOWS and From 58a2202c36f97a944885bdb4bfdc3edeb8b760fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:29 +0530 Subject: [PATCH 017/138] MINGW setup select module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Modules/selectmodule.c | 6 +++--- setup.py | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 3afcb0e2a02206..6e2903d6c312da 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -136,9 +136,9 @@ seq2set(PyObject *seq, fd_set *set, pylist fd2obj[FD_SETSIZE + 1]) v = PyObject_AsFileDescriptor( o ); if (v == -1) goto finally; -#if defined(_MSC_VER) +#if defined(MS_WIN32) max = 0; /* not used for Win32 */ -#else /* !_MSC_VER */ +#else /* !MS_WIN32 */ if (!_PyIsSelectable_fd(v)) { PyErr_SetString(PyExc_ValueError, "filedescriptor out of range in select()"); @@ -146,7 +146,7 @@ seq2set(PyObject *seq, fd_set *set, pylist fd2obj[FD_SETSIZE + 1]) } if (v > max) max = v; -#endif /* _MSC_VER */ +#endif /* MS_WIN32 */ FD_SET(v, set); /* add object and its file descriptor to the list */ diff --git a/setup.py b/setup.py index 2528af04e9b763..79542fea705ffe 100644 --- a/setup.py +++ b/setup.py @@ -1005,7 +1005,11 @@ def detect_simple_extensions(self): self.missing.append('spwd') # select(2); not on ancient System V - self.add(Extension('select', ['selectmodule.c'])) + select_libs = [] + if MS_WINDOWS: + select_libs += ['ws2_32'] + self.add(Extension('select', ['selectmodule.c'], + libraries=select_libs)) # Memory-mapped files (also works on Win32). self.add(Extension('mmap', ['mmapmodule.c'])) From 77a92f8a22d445675bd0f885cb3c23a09128d6c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:30 +0530 Subject: [PATCH 018/138] MINGW setup _ctypes module with system libffi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Christoph Reiter --- setup.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 79542fea705ffe..9e33748f3cafbf 100644 --- a/setup.py +++ b/setup.py @@ -2279,9 +2279,12 @@ def detect_ctypes(self): self.add(ext) if TEST_EXTENSIONS: # function my_sqrt() needs libm for sqrt() + ffi_test_libs = ['m'] + if MS_WINDOWS: + ffi_test_libs += ['oleaut32'] self.add(Extension('_ctypes_test', sources=['_ctypes/_ctypes_test.c'], - libraries=['m'])) + libraries=ffi_test_libs)) ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") ffi_lib = None @@ -2326,6 +2329,8 @@ def detect_ctypes(self): ext.include_dirs.append(ffi_inc) ext.libraries.append(ffi_lib) + if MS_WINDOWS: + ext.libraries.extend(['ole32', 'oleaut32', 'uuid']) self.use_system_libffi = True if sysconfig.get_config_var('HAVE_LIBDL'): From 8efb51c4e795bcd8268945915ec40ed0a3b97336 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:30 +0530 Subject: [PATCH 019/138] MINGW defect winsock2 and setup _socket module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Misc/config_mingw | 3 +++ Modules/socketmodule.c | 8 ++++++-- configure.ac | 28 +++++++++++++++++++++++----- pyconfig.h.in | 4 ++-- setup.py | 2 ++ 5 files changed, 36 insertions(+), 9 deletions(-) diff --git a/Misc/config_mingw b/Misc/config_mingw index 513065dec9b717..9be43fd3a11407 100644 --- a/Misc/config_mingw +++ b/Misc/config_mingw @@ -10,3 +10,6 @@ ac_cv_func_alarm=ignore # files to ignore ac_cv_file__dev_ptmx=ignore #NOTE: under MSYS environment device exist ac_cv_file__dev_ptc=no + +# force detection of winsock2 functionality - require wxp or newer +ac_cv_func_getpeername=yes diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 6a9ac2ceb734e8..9f2de27e620110 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -265,7 +265,7 @@ shutdown(how) -- shut down traffic in one or both directions\n\ # endif /* Macros based on the IPPROTO enum, see: https://bugs.python.org/issue29515 */ -#ifdef MS_WINDOWS +#ifdef _MSC_VER #define IPPROTO_ICMP IPPROTO_ICMP #define IPPROTO_IGMP IPPROTO_IGMP #define IPPROTO_GGP IPPROTO_GGP @@ -296,7 +296,7 @@ shutdown(how) -- shut down traffic in one or both directions\n\ #define IPPROTO_PGM IPPROTO_PGM // WinSock2 only #define IPPROTO_L2TP IPPROTO_L2TP // WinSock2 only #define IPPROTO_SCTP IPPROTO_SCTP // WinSock2 only -#endif /* MS_WINDOWS */ +#endif /* _MSC_VER */ /* Provides the IsWindows7SP1OrGreater() function */ #include @@ -389,6 +389,10 @@ remove_unusable_flags(PyObject *m) /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and * EAI_* constants are defined in (the already included) ws2tcpip.h. */ +#elif defined(__MINGW32__) + /* Do not include addrinfo.h as minimum supported version is + * _WIN32_WINNT >= WindowsXP(0x0501) + */ #else # include "addrinfo.h" #endif diff --git a/configure.ac b/configure.ac index 41d01a1f665dae..d906f58ea289a3 100644 --- a/configure.ac +++ b/configure.ac @@ -4468,21 +4468,36 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ],[]) AC_MSG_RESULT($was_it_defined) +AC_CHECK_HEADERS([ws2tcpip.h]) AC_MSG_CHECKING(for addrinfo) AC_CACHE_VAL(ac_cv_struct_addrinfo, -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[struct addrinfo a]])], +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#ifdef HAVE_WS2TCPIP_H +# include +#else +# include +#endif]], + [[struct addrinfo a]])], [ac_cv_struct_addrinfo=yes], [ac_cv_struct_addrinfo=no])) AC_MSG_RESULT($ac_cv_struct_addrinfo) if test $ac_cv_struct_addrinfo = yes; then - AC_DEFINE(HAVE_ADDRINFO, 1, [struct addrinfo (netdb.h)]) + AC_DEFINE(HAVE_ADDRINFO, 1, [struct addrinfo]) fi AC_MSG_CHECKING(for sockaddr_storage) AC_CACHE_VAL(ac_cv_struct_sockaddr_storage, AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ -# include -# include ]], [[struct sockaddr_storage s]])], +#ifdef HAVE_WS2TCPIP_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif]], + [[struct sockaddr_storage s]])], [ac_cv_struct_sockaddr_storage=yes], [ac_cv_struct_sockaddr_storage=no])) AC_MSG_RESULT($ac_cv_struct_sockaddr_storage) @@ -5670,7 +5685,10 @@ fi AC_CHECK_TYPE(socklen_t,, AC_DEFINE(socklen_t,int, - [Define to `int' if does not define.]),[ + [Define to `int' if or does not define.]),[ +#ifdef HAVE_WS2TCPIP_H +#include +#endif #ifdef HAVE_SYS_TYPES_H #include #endif diff --git a/pyconfig.h.in b/pyconfig.h.in index 3bb38bfd1ae17b..e36c3062395034 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -63,7 +63,7 @@ /* Define to 1 if you have the `acosh' function. */ #undef HAVE_ACOSH -/* struct addrinfo (netdb.h) */ +/* struct addrinfo */ #undef HAVE_ADDRINFO /* Define to 1 if you have the `alarm' function. */ @@ -1689,7 +1689,7 @@ /* Define to `unsigned int' if does not define. */ #undef size_t -/* Define to `int' if does not define. */ +/* Define to `int' if or does not define. */ #undef socklen_t /* Define to `int' if doesn't define. */ diff --git a/setup.py b/setup.py index 9e33748f3cafbf..35f904f75c1faa 100644 --- a/setup.py +++ b/setup.py @@ -1248,6 +1248,8 @@ def detect_socket(self): if MACOS: # Issue #35569: Expose RFC 3542 socket options. kwargs['extra_compile_args'] = ['-D__APPLE_USE_RFC_3542'] + if MS_WINDOWS: + kwargs['libraries'] = ['ws2_32', 'iphlpapi'] self.add(Extension('_socket', ['socketmodule.c'], **kwargs)) From 197b72839fad82f51a0934f6782586bcaf4cefe1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:31 +0530 Subject: [PATCH 020/138] MINGW exclude unix only modules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- setup.py | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/setup.py b/setup.py index 35f904f75c1faa..e9a7957e9ad60d 100644 --- a/setup.py +++ b/setup.py @@ -988,13 +988,21 @@ def detect_simple_extensions(self): if (self.config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)): # May be necessary on AIX for flock function libs = ['bsd'] - self.add(Extension('fcntl', ['fcntlmodule.c'], - libraries=libs)) + if not MS_WINDOWS: + self.add(Extension('fcntl', ['fcntlmodule.c'], + libraries=libs)) + else: + self.missing.append('fcntl') # pwd(3) - self.add(Extension('pwd', ['pwdmodule.c'])) + if not MS_WINDOWS: + self.add(Extension('pwd', ['pwdmodule.c'])) + else: + self.missing.append('pwd') # grp(3) - if not VXWORKS: + if not VXWORKS and not MS_WINDOWS: self.add(Extension('grp', ['grpmodule.c'])) + else: + self.missing.append('grp') # spwd, shadow passwords if (self.config_h_vars.get('HAVE_GETSPNAM', False) or self.config_h_vars.get('HAVE_GETSPENT', False)): @@ -1016,7 +1024,10 @@ def detect_simple_extensions(self): # Lance Ellinghaus's syslog module # syslog daemon interface - self.add(Extension('syslog', ['syslogmodule.c'])) + if not MS_WINDOWS: + self.add(Extension('syslog', ['syslogmodule.c'])) + else: + self.missing.append('syslog') # Python interface to subinterpreter C-API. self.add(Extension('_xxsubinterpreters', ['_xxsubinterpretersmodule.c'])) @@ -1042,8 +1053,11 @@ def detect_simple_extensions(self): self.add(Extension('_csv', ['_csv.c'])) # POSIX subprocess module helper. - self.add(Extension('_posixsubprocess', ['_posixsubprocess.c'], + if not MS_WINDOWS: + self.add(Extension('_posixsubprocess', ['_posixsubprocess.c'], extra_compile_args=['-DPy_BUILD_CORE_MODULE'])) + else: + self.missing.append('_posixsubprocess') def detect_test_extensions(self): # Python C API test module @@ -1235,12 +1249,15 @@ def detect_crypt(self): self.missing.append('_crypt') return - if self.compiler.find_library_file(self.lib_dirs, 'crypt'): - libs = ['crypt'] - else: - libs = [] + if not MS_WINDOWS: + if self.compiler.find_library_file(self.lib_dirs, 'crypt'): + libs = ['crypt'] + else: + libs = [] - self.add(Extension('_crypt', ['_cryptmodule.c'], libraries=libs)) + self.add(Extension('_crypt', ['_cryptmodule.c'], libraries=libs)) + else: + self.missing.append('_crypt') def detect_socket(self): # socket(2) From a046badbb7431ba7c99a98dc39ab45e38ec219c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:33 +0530 Subject: [PATCH 021/138] MINGW setup msvcrt and _winapi modules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Modules/_winapi.c | 2 ++ PC/msvcrtmodule.c | 2 ++ Python/dynamic_annotations.c | 2 +- setup.py | 21 +++++++++++++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Modules/_winapi.c b/Modules/_winapi.c index 9b30a900326192..4d88e339f41739 100644 --- a/Modules/_winapi.c +++ b/Modules/_winapi.c @@ -41,7 +41,9 @@ #define WINDOWS_LEAN_AND_MEAN #include "windows.h" +#if defined(Py_DEBUG) #include +#endif #include "winreparse.h" #if defined(MS_WIN32) && !defined(MS_WIN64) diff --git a/PC/msvcrtmodule.c b/PC/msvcrtmodule.c index 0591497871cadc..74a4131073ee11 100644 --- a/PC/msvcrtmodule.c +++ b/PC/msvcrtmodule.c @@ -21,7 +21,9 @@ #include #include #include +#ifdef _DEBUG #include +#endif #include #ifdef _MSC_VER diff --git a/Python/dynamic_annotations.c b/Python/dynamic_annotations.c index 7febaa09df1950..70d5b3dc72069c 100644 --- a/Python/dynamic_annotations.c +++ b/Python/dynamic_annotations.c @@ -27,7 +27,7 @@ * Author: Kostya Serebryany */ -#ifdef _MSC_VER +#ifdef MS_WINDOWS # include #endif diff --git a/setup.py b/setup.py index e9a7957e9ad60d..bb478968ad12b4 100644 --- a/setup.py +++ b/setup.py @@ -1701,6 +1701,27 @@ def detect_platform_specific_exts(self): '-framework', 'SystemConfiguration', '-framework', 'CoreFoundation'])) + # Modules with some Windows dependencies: + if MS_WINDOWS: + srcdir = sysconfig.get_config_var('srcdir') + pc_srcdir = os.path.abspath(os.path.join(srcdir, 'PC')) + + self.add(Extension('msvcrt', [os.path.join(pc_srcdir, p) + for p in ['msvcrtmodule.c']])) + + self.add(Extension('_winapi', ['_winapi.c'])) + + self.add(Extension('_msi', [os.path.join(pc_srcdir, p) + for p in ['_msi.c']], + libraries=['msi','cabinet','rpcrt4'])) # To link with lib(msi|cabinet|rpcrt4).a + + self.add(Extension('winsound', [os.path.join(pc_srcdir, p) + for p in ['winsound.c']], + libraries=['winmm'])) + + self.add(Extension('_overlapped', ['overlapped.c'], + libraries=['ws2_32'])) + def detect_compress_exts(self): # Andrew Kuchling's zlib module. Note that some versions of zlib # 1.1.3 have security problems. See CERT Advisory CA-2002-07: From 5db8a56abdeb66ebcf071b061738984cd7c44bbb Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Tue, 21 Sep 2021 20:52:42 +0200 Subject: [PATCH 022/138] sysconfig: MINGW build extensions with GCC --- Lib/sysconfig.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index eadb99c3a3bcc0..6381bcd14742f5 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -709,6 +709,8 @@ def get_platform(): """ if os.name == 'nt': + if 'GCC' in sys.version: + return 'mingw' if 'amd64' in sys.version.lower(): return 'win-amd64' if '(arm)' in sys.version.lower(): From 8f3d75ca9af2b4f262192bc9ee47c0c664e92fec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:37 +0530 Subject: [PATCH 023/138] MINGW setup _ssl module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- setup.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/setup.py b/setup.py index bb478968ad12b4..79a88c2b35fb11 100644 --- a/setup.py +++ b/setup.py @@ -2512,6 +2512,8 @@ def split_var(name, sep): openssl_libdirs = split_var('OPENSSL_LDFLAGS', '-L') openssl_libs = split_var('OPENSSL_LIBS', '-l') openssl_rpath = config_vars.get('OPENSSL_RPATH') + if MS_WINDOWS: + openssl_libs += tuple(['ws2_32']) if not openssl_libs: # libssl and libcrypto not found self.missing.extend(['_ssl', '_hashlib']) From 0a27e13666d43ff4e83fa68480a7d3d5ee57cc01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:38 +0530 Subject: [PATCH 024/138] MINGW generalization of posix build in sysconfig.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Lib/sysconfig.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index 6381bcd14742f5..c9ab982e43ddf8 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -59,6 +59,11 @@ }, } +# GCC[mingw*] use posix build system +_POSIX_BUILD = os.name == 'posix' or \ + (os.name == "nt" and 'GCC' in sys.version) + + # NOTE: site.py has copy of this function. # Sync it when modify this function. @@ -74,7 +79,7 @@ def _getuserbase(): def joinuser(*args): return os.path.expanduser(os.path.join(*args)) - if os.name == "nt": + if os.name == "nt" and not _POSIX_BUILD: base = os.environ.get("APPDATA") or "~" return joinuser(base, "Python") @@ -137,7 +142,6 @@ def joinuser(*args): _findvar1_rx = r"\$\(([A-Za-z][A-Za-z0-9_]*)\)" _findvar2_rx = r"\${([A-Za-z][A-Za-z0-9_]*)}" - def _safe_realpath(path): try: return realpath(path) @@ -226,7 +230,7 @@ def _expand_vars(scheme, vars): def _get_preferred_schemes(): - if os.name == 'nt': + if os.name == 'nt' and not _POSIX_BUILD: return { 'prefix': 'nt', 'home': 'posix_home', @@ -553,7 +557,7 @@ def parse_config_h(fp, vars=None): def get_config_h_filename(): """Return the path of pyconfig.h.""" if _PYTHON_BUILD: - if os.name == "nt": + if os.name == "nt" and not _POSIX_BUILD: inc_dir = os.path.join(_sys_home or _PROJECT_BASE, "PC") else: inc_dir = _sys_home or _PROJECT_BASE @@ -629,9 +633,9 @@ def get_config_vars(*args): except AttributeError: _CONFIG_VARS['py_version_nodot_plat'] = '' - if os.name == 'nt': + if os.name == 'nt' and not _POSIX_BUILD: _init_non_posix(_CONFIG_VARS) - if os.name == 'posix': + if _POSIX_BUILD: _init_posix(_CONFIG_VARS) # For backward compatibility, see issue19555 SO = _CONFIG_VARS.get('EXT_SUFFIX') @@ -645,7 +649,7 @@ def get_config_vars(*args): # Always convert srcdir to an absolute path srcdir = _CONFIG_VARS.get('srcdir', _PROJECT_BASE) - if os.name == 'posix': + if _POSIX_BUILD: if _PYTHON_BUILD: # If srcdir is a relative path (typically '.' or '..') # then it should be interpreted relative to the directory From 96ceb5402ee3276483455dc27338bacc7c0cf66a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:39 +0530 Subject: [PATCH 025/138] MINGW support stdcall without underscore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Modules/_ctypes/_ctypes.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 84378c40357b07..723edd3b8386ab 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -3403,6 +3403,18 @@ static PPROC FindAddress(void *handle, const char *name, PyObject *type) mangled_name = alloca(strlen(name) + 1 + 1 + 1 + 3); /* \0 _ @ %d */ if (!mangled_name) return NULL; + /* Issue: for stdcall decorated export functions MSVC compiler adds + * underscore, but GCC compiler create them without. This is + * visible by example for _ctypes_test.pyd module. + * As well functions from system libraries are without underscore. + * Solutions: + * - If a python module is build with gcc option --add-stdcall-alias + * the module will contain XXX as alias for function XXX@ as result + * first search in this method will succeed. + * - Distutil may use compiler to create def-file, to modify it as + * add underscore alias and with new def file to create module. + * - Or may be just to search for function without underscore. + */ for (i = 0; i < 32; ++i) { sprintf(mangled_name, "_%s@%d", name, i*4); Py_BEGIN_ALLOW_THREADS @@ -3410,6 +3422,13 @@ static PPROC FindAddress(void *handle, const char *name, PyObject *type) Py_END_ALLOW_THREADS if (address) return address; + /* search for function without underscore as weel */ + sprintf(mangled_name, "%s@%d", name, i*4); + Py_BEGIN_ALLOW_THREADS + address = (PPROC)GetProcAddress(handle, mangled_name); + Py_END_ALLOW_THREADS + if (address) + return address; } return NULL; #endif From 08569ef8ebaa7b80ee57dad5a47e8ae4e9fb2661 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:40 +0530 Subject: [PATCH 026/138] use replace instead rename to avoid failure on windo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Christoph Reiter --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 79a88c2b35fb11..48ab69fca6a312 100644 --- a/setup.py +++ b/setup.py @@ -2756,7 +2756,7 @@ def copy_scripts(self): else: newfilename = filename + minoronly log.info(f'renaming {filename} to {newfilename}') - os.rename(filename, newfilename) + os.replace(filename, newfilename) newoutfiles.append(newfilename) if filename in updated_files: newupdated_files.append(newfilename) From 78fdf2b59b174a94b430ec82987fa8aeb5656f13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:42 +0530 Subject: [PATCH 027/138] MINGW customize site MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Christoph Reiter --- Lib/site.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Lib/site.py b/Lib/site.py index 939893eb5ee93b..e460a3d881241c 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -88,6 +88,12 @@ USER_BASE = None +# Same as defined in Lib/sysconfig.py +# redeclared since sysconfig is large for site. +# GCC[mingw*] use posix build system +_POSIX_BUILD = os.name == 'posix' or \ + (os.name == "nt" and 'GCC' in sys.version) + def _trace(message): if sys.flags.verbose: print(message, file=sys.stderr) @@ -273,7 +279,7 @@ def _getuserbase(): def joinuser(*args): return os.path.expanduser(os.path.join(*args)) - if os.name == "nt": + if os.name == "nt" and not _POSIX_BUILD: base = os.environ.get("APPDATA") or "~" return joinuser(base, "Python") @@ -288,7 +294,7 @@ def joinuser(*args): def _get_path(userbase): version = sys.version_info - if os.name == 'nt': + if os.name == 'nt' and not _POSIX_BUILD: ver_nodot = sys.winver.replace('.', '') return f'{userbase}\\Python{ver_nodot}\\site-packages' @@ -365,7 +371,7 @@ def getsitepackages(prefixes=None): if sys.platlibdir != "lib": libdirs.append("lib") - if os.sep == '/': + if _POSIX_BUILD: for libdir in libdirs: path = os.path.join(prefix, libdir, "python%d.%d" % sys.version_info[:2], From dc3b1c42ba2ba89b57cf3a7e177188a9be852a07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:43 +0530 Subject: [PATCH 028/138] add python config sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Christoph Reiter --- Misc/python-config.sh.in | 62 +++++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/Misc/python-config.sh.in b/Misc/python-config.sh.in index 2602fe24c0402e..e0e048a0fac486 100644 --- a/Misc/python-config.sh.in +++ b/Misc/python-config.sh.in @@ -1,32 +1,44 @@ #!/bin/sh -# Keep this script in sync with python-config.in - exit_with_usage () { echo "Usage: $0 --prefix|--exec-prefix|--includes|--libs|--cflags|--ldflags|--extension-suffix|--help|--abiflags|--configdir|--embed" - exit $1 + exit 1 } +# Really, python-config.py (and thus .sh) should be called directly, but +# sometimes software (e.g. GDB) calls python-config.sh as if it were the +# Python executable, passing python-config.py as the first argument. +# Work around that oddness by ignoring any .py passed as first arg. +case "$1" in + *.py) + shift + ;; +esac + if [ "$1" = "" ] ; then - exit_with_usage 1 + exit_with_usage fi # Returns the actual prefix where this script was installed to. installed_prefix () { - RESULT=$(dirname $(cd $(dirname "$1") && pwd -P)) - if which readlink >/dev/null 2>&1 ; then - if readlink -f "$RESULT" >/dev/null 2>&1; then - RESULT=$(readlink -f "$RESULT") - fi + local RESULT=$(dirname $(cd $(dirname "$1") && pwd -P)) + if [ $(which readlink) ] ; then + RESULT=$(readlink -f "$RESULT") + fi + # Since we don't know where the output from this script will end up + # we keep all paths in Windows-land since MSYS2 can handle that + # while native tools can't handle paths in MSYS2-land. + if [ "$OSTYPE" = "msys" ]; then + RESULT=$(cd "$RESULT" && pwd -W) fi echo $RESULT } prefix_real=$(installed_prefix "$0") -# Use sed to fix paths from their built-to locations to their installed-to +# Use sed to fix paths from their built-to locations to their installed to # locations. Keep prefix & exec_prefix using their original values in case # they are referenced in other configure variables, to prevent double # substitution, issue #22140. @@ -41,13 +53,17 @@ LIBM="@LIBM@" LIBC="@LIBC@" SYSLIBS="$LIBM $LIBC" ABIFLAGS="@ABIFLAGS@" +# Protect against lack of substitution. +if [ "$ABIFLAGS" = "@""ABIFLAGS""@" ] ; then + ABIFLAGS= +fi LIBS="@LIBPYTHON@ @LIBS@ $SYSLIBS" LIBS_EMBED="-lpython${VERSION}${ABIFLAGS} @LIBS@ $SYSLIBS" BASECFLAGS="@BASECFLAGS@" -LDLIBRARY="@LDLIBRARY@" OPT="@OPT@" PY_ENABLE_SHARED="@PY_ENABLE_SHARED@" LDVERSION="@LDVERSION@" +LDLIBRARY="@LDLIBRARY@" LIBDEST=${prefix_real}/lib/python${VERSION} LIBPL=$(echo "@LIBPL@" | sed "s#$prefix#$prefix_real#") SO="@EXT_SUFFIX@" @@ -61,7 +77,7 @@ for ARG in $* do case $ARG in --help) - exit_with_usage 0 + exit_with_usage ;; --embed) PY_EMBED=1 @@ -69,7 +85,7 @@ do --prefix|--exec-prefix|--includes|--libs|--cflags|--ldflags|--extension-suffix|--abiflags|--configdir) ;; *) - exit_with_usage 1 + exit_with_usage ;; esac done @@ -80,37 +96,37 @@ fi for ARG in "$@" do - case "$ARG" in + case $ARG in --prefix) - echo "$prefix_real" + echo -ne "$prefix_real" ;; --exec-prefix) - echo "$exec_prefix_real" + echo -ne "$exec_prefix_real " ;; --includes) - echo "$INCDIR $PLATINCDIR" + echo -ne "$INCDIR $PLATINCDIR" ;; --cflags) - echo "$INCDIR $PLATINCDIR $BASECFLAGS $CFLAGS $OPT" + echo -ne "$INCDIR $PLATINCDIR $BASECFLAGS $CFLAGS $OPT" ;; --libs) - echo "$LIBS" + echo -ne "$LIBS" ;; --ldflags) LIBPLUSED= if [ "$PY_ENABLE_SHARED" = "0" ] ; then LIBPLUSED="-L$LIBPL" fi - echo "$LIBPLUSED -L$libdir $LIBS" + echo -ne "$LIBPLUSED -L$libdir $LIBS " ;; --extension-suffix) - echo "$SO" + echo -ne "$SO " ;; --abiflags) - echo "$ABIFLAGS" + echo -ne "$ABIFLAGS " ;; --configdir) - echo "$LIBPL" + echo -ne "$LIBPL " ;; esac done From 0ce42ef5c43c256e0c4fc4bdbf9fc9c902ec3073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:44 +0530 Subject: [PATCH 029/138] cross darwin feature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- configure.ac | 54 +++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index d906f58ea289a3..0ad6a55240e37c 100644 --- a/configure.ac +++ b/configure.ac @@ -387,6 +387,7 @@ if test -z "$MACHDEP" then # avoid using uname for cross builds if test "$cross_compiling" = yes; then + ac_sys_release= # ac_sys_system and ac_sys_release are used for setting # a lot of different things including 'define_xopen_source' # in the case statement below. @@ -403,6 +404,27 @@ then *-*-mingw*) ac_sys_system=MINGW ;; + *-*-darwin*) + ac_sys_system=Darwin + ac_sys_release=$(echo $host | sed -n 's/.*-[^0-9]\+\([0-9]\+\)/\1/p') + if test -z "$ac_sys_release"; then + # A reasonable default. + ac_sys_release=11 + fi + # Use the last released version number for old versions. + if test "$ac_sys_release" = "9" ; then + ac_sys_release=9.8 + elif test "$ac_sys_release" = "10" ; then + ac_sys_release=10.8 + elif test "$ac_sys_release" = "11" ; then + ac_sys_release=11.4.0 + elif test "$ac_sys_release" = "12" ; then + ac_sys_release=12.0.0 + else + # ..and .0.0 for unknown versions. + ac_sys_release=${ac_sys_release}.0.0 + fi + ;; *-*-vxworks*) ac_sys_system=VxWorks ;; @@ -411,7 +433,6 @@ then MACHDEP="unknown" AC_MSG_ERROR([cross build not supported for $host]) esac - ac_sys_release= else ac_sys_system=`uname -s` if test "$ac_sys_system" = "AIX" \ @@ -459,6 +480,9 @@ if test "$cross_compiling" = yes; then *-*-mingw*) _host_cpu= ;; + *-*-darwin*) + _host_cpu= + ;; *) # for now, limit cross builds to known configurations MACHDEP="unknown" @@ -1659,6 +1683,26 @@ AC_SUBST(BASECFLAGS) AC_SUBST(CFLAGS_NODIST) AC_SUBST(LDFLAGS_NODIST) +if test "x$cross_compiling" = xyes; then + function cross_arch + { + case $host in + x86_64*darwin*) + echo i386 + ;; + x86_64*) + echo x86_64 + ;; + *) + echo i386 + ;; + esac + } + ARCH_PROG=cross_arch +else + ARCH_PROG=/usr/bin/arch +fi + # The -arch flags for universal builds on macOS UNIVERSAL_ARCH_FLAGS= AC_SUBST(UNIVERSAL_ARCH_FLAGS) @@ -2037,7 +2081,7 @@ yes) ;; esac else - if test `/usr/bin/arch` = "i386" + if test "$($ARCH_PROG)" = "i386" then # 10.4 was the first release to support Intel archs cur_target="10.4" @@ -2613,7 +2657,7 @@ case $ac_sys_system/$ac_sys_release in if test "${enable_universalsdk}"; then : else - LIBTOOL_CRUFT="${LIBTOOL_CRUFT} -arch_only `/usr/bin/arch`" + LIBTOOL_CRUFT="${LIBTOOL_CRUFT} -arch_only $($ARCH_PROG)" fi LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; @@ -2638,7 +2682,7 @@ case $ac_sys_system/$ac_sys_release in ]])],[ac_osx_32bit=yes],[ac_osx_32bit=no],[ac_osx_32bit=yes]) if test "${ac_osx_32bit}" = "yes"; then - case `/usr/bin/arch` in + case $($ARCH_PROG) in i386) MACOSX_DEFAULT_ARCH="i386" ;; @@ -2650,7 +2694,7 @@ case $ac_sys_system/$ac_sys_release in ;; esac else - case `/usr/bin/arch` in + case $($ARCH_PROG) in i386) MACOSX_DEFAULT_ARCH="x86_64" ;; From 50b8169e9f39ec90aeda46c00c6b79da028c9e83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:45 +0530 Subject: [PATCH 030/138] mingw system libffi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- setup.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/setup.py b/setup.py index 48ab69fca6a312..828692f602b355 100644 --- a/setup.py +++ b/setup.py @@ -2371,6 +2371,8 @@ def detect_ctypes(self): ext.libraries.append(ffi_lib) if MS_WINDOWS: ext.libraries.extend(['ole32', 'oleaut32', 'uuid']) + ext.export_symbols.extend(['DllGetClassObject PRIVATE', + 'DllCanUnloadNow PRIVATE']) self.use_system_libffi = True if sysconfig.get_config_var('HAVE_LIBDL'): From 6ba40ced4aec171591cdff33ddd27f4f24ced764 Mon Sep 17 00:00:00 2001 From: Ray Donnelly Date: Thu, 17 Jun 2021 18:51:46 +0530 Subject: [PATCH 031/138] msys mingw prefer unix sep if MSYSTEM MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Christoph Reiter Co-authored-by: cat --- Include/pylifecycle.h | 6 ++ Lib/ntpath.py | 82 ++++++++++++++----------- Modules/posixmodule.c | 2 + Python/initconfig.c | 4 +- Python/pathconfig.c | 135 ++++++++++++++++++++++++++++++++++++++++++ Python/traceback.c | 2 +- 6 files changed, 192 insertions(+), 39 deletions(-) diff --git a/Include/pylifecycle.h b/Include/pylifecycle.h index 2df7fe6e3c83d6..17d403c3eb5c5f 100644 --- a/Include/pylifecycle.h +++ b/Include/pylifecycle.h @@ -21,6 +21,12 @@ PyAPI_FUNC(int) Py_IsInitialized(void); PyAPI_FUNC(PyThreadState *) Py_NewInterpreter(void); PyAPI_FUNC(void) Py_EndInterpreter(PyThreadState *); +PyAPI_FUNC(wchar_t) Py_GetSepW(const wchar_t *); +PyAPI_FUNC(char) Py_GetSepA(const char *); + +PyAPI_FUNC(void) Py_NormalizeSepsW(wchar_t *); +PyAPI_FUNC(void) Py_NormalizeSepsA(char *); + /* Py_PyAtExit is for the atexit module, Py_AtExit is for low-level * exit functions. diff --git a/Lib/ntpath.py b/Lib/ntpath.py index 97edfa52aaafb8..9a404ab2a2818a 100644 --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -11,9 +11,7 @@ curdir = '.' pardir = '..' extsep = '.' -sep = '\\' pathsep = ';' -altsep = '/' defpath = '.;C:\\bin' devnull = 'nul' @@ -23,6 +21,14 @@ import genericpath from genericpath import * +if sys.platform == "win32" and "MSYSTEM" in os.environ: + sep = '/' + altsep = '\\' +else: + sep = '\\' + altsep = '/' +bsep = str.encode(sep) +baltsep = str.encode(altsep) __all__ = ["normcase","isabs","join","splitdrive","split","splitext", "basename","dirname","commonprefix","getsize","getmtime", @@ -34,9 +40,27 @@ def _get_bothseps(path): if isinstance(path, bytes): - return b'\\/' + return bsep+baltsep + else: + return sep+altsep + +def _get_sep(path): + if isinstance(path, bytes): + return bsep else: - return '\\/' + return sep + +def _get_altsep(path): + if isinstance(path, bytes): + return baltsep + else: + return altsep + +def _get_colon(path): + if isinstance(path, bytes): + return b':' + else: + return ':' # Normalize the case of a pathname and map slashes to backslashes. # Other normalizations (such as optimizing '../' away) are not done @@ -58,14 +82,14 @@ def normcase(s): return s if isinstance(s, bytes): encoding = sys.getfilesystemencoding() - s = s.decode(encoding, 'surrogateescape').replace('/', '\\') + s = s.decode(encoding, 'surrogateescape').replace(altsep, sep) s = _LCMapStringEx(_LOCALE_NAME_INVARIANT, _LCMAP_LOWERCASE, s) return s.encode(encoding, 'surrogateescape') else: return _LCMapStringEx(_LOCALE_NAME_INVARIANT, _LCMAP_LOWERCASE, - s.replace('/', '\\')) + s.replace(altsep, sep)) except ImportError: def normcase(s): """Normalize case of pathname. @@ -74,8 +98,8 @@ def normcase(s): """ s = os.fspath(s) if isinstance(s, bytes): - return os.fsencode(os.fsdecode(s).replace('/', '\\').lower()) - return s.replace('/', '\\').lower() + return os.fsencode(os.fsdecode(s).replace(altsep, sep).lower()) + return s.replace(altsep, sep).lower() # Return whether a path is absolute. @@ -102,14 +126,9 @@ def isabs(s): # Join two (or more) paths. def join(path, *paths): path = os.fspath(path) - if isinstance(path, bytes): - sep = b'\\' - seps = b'\\/' - colon = b':' - else: - sep = '\\' - seps = '\\/' - colon = ':' + sep = _get_sep(path) + seps = _get_bothseps(path) + colon = _get_colon(path) try: if not paths: path[:0] + sep #23780: Ensure compatible data type even if p is null. @@ -168,14 +187,9 @@ def splitdrive(p): """ p = os.fspath(p) if len(p) >= 2: - if isinstance(p, bytes): - sep = b'\\' - altsep = b'/' - colon = b':' - else: - sep = '\\' - altsep = '/' - colon = ':' + sep = _get_sep(p) + altsep = _get_altsep(p) + colon = _get_colon(p) normp = p.replace(altsep, sep) if (normp[0:2] == sep*2) and (normp[2:3] != sep): # is a UNC path: @@ -229,9 +243,9 @@ def split(p): def splitext(p): p = os.fspath(p) if isinstance(p, bytes): - return genericpath._splitext(p, b'\\', b'/', b'.') + return genericpath._splitext(p, bsep, baltsep, b'.') else: - return genericpath._splitext(p, '\\', '/', '.') + return genericpath._splitext(p, sep, altsep, '.') splitext.__doc__ = genericpath._splitext.__doc__ @@ -489,15 +503,13 @@ def expandvars(path): def normpath(path): """Normalize path, eliminating double slashes, etc.""" path = os.fspath(path) + sep = _get_sep(path) + altsep = _get_altsep(path) if isinstance(path, bytes): - sep = b'\\' - altsep = b'/' curdir = b'.' pardir = b'..' special_prefixes = (b'\\\\.\\', b'\\\\?\\') else: - sep = '\\' - altsep = '/' curdir = '.' pardir = '..' special_prefixes = ('\\\\.\\', '\\\\?\\') @@ -709,6 +721,7 @@ def realpath(path, *, strict=False): # strip the prefix anyway. if ex.winerror == initial_winerror: path = spath + path = normpath(path) return path @@ -719,12 +732,11 @@ def realpath(path, *, strict=False): def relpath(path, start=None): """Return a relative version of a path""" path = os.fspath(path) + sep = _get_sep(path) if isinstance(path, bytes): - sep = b'\\' curdir = b'.' pardir = b'..' else: - sep = '\\' curdir = '.' pardir = '..' @@ -779,13 +791,11 @@ def commonpath(paths): raise ValueError('commonpath() arg is an empty sequence') paths = tuple(map(os.fspath, paths)) + sep = _get_sep(paths[0]) + altsep = _get_altsep(paths[0]) if isinstance(paths[0], bytes): - sep = b'\\' - altsep = b'/' curdir = b'.' else: - sep = '\\' - altsep = '/' curdir = '.' try: diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 9bbf69a8600114..057d10a1a807f4 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -3821,6 +3821,7 @@ posix_getcwd(int use_bytes) return PyErr_SetFromWindowsErr(0); } + Py_NormalizeSepsW(wbuf2); PyObject *resobj = PyUnicode_FromWideChar(wbuf2, len); if (wbuf2 != wbuf) { PyMem_RawFree(wbuf2); @@ -4384,6 +4385,7 @@ os__getfinalpathname_impl(PyObject *module, path_t *path) target_path = tmp; } + Py_NormalizeSepsW(target_path); result = PyUnicode_FromWideChar(target_path, result_length); if (result && path->narrow) { Py_SETREF(result, PyUnicode_EncodeFSDefault(result)); diff --git a/Python/initconfig.c b/Python/initconfig.c index 1e10e6659cb71f..3eb43a716c8806 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -141,7 +141,7 @@ static const char usage_6[] = "PYTHONPYCACHEPREFIX: root directory for bytecode cache (pyc) files.\n" "PYTHONWARNDEFAULTENCODING: enable opt-in EncodingWarning for 'encoding=None'.\n"; -#if defined(MS_WINDOWS) +#if defined(_MSC_VER) # define PYTHONHOMEHELP "\\python{major}{minor}" #else # define PYTHONHOMEHELP "/lib/pythonX.X" @@ -1548,7 +1548,7 @@ config_init_program_name(PyConfig *config) } /* Last fall back: hardcoded name */ -#ifdef MS_WINDOWS +#ifdef _MSC_VER const wchar_t *default_program_name = L"python"; #else const wchar_t *default_program_name = L"python3"; diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 1017a571f2b829..e037791b59e8ac 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -15,6 +15,140 @@ extern "C" { #endif +#ifdef __MINGW32__ +#define wcstok wcstok_s +#include +#endif + +static int +Py_StartsWithA(const char * str, const char * prefix) +{ + while(*prefix) + { + if(*prefix++ != *str++) + return 0; + } + + return 1; +} + +static int +Py_StartsWithW(const wchar_t * str, const wchar_t * prefix) +{ + while(*prefix) + { + if(*prefix++ != *str++) + return 0; + } + + return 1; +} + +char +Py_GetSepA(const char *name) +{ + char* msystem = (char*)2; /* So that non Windows use / as sep */ + static char sep = '\0'; +#ifdef _WIN32 + /* https://msdn.microsoft.com/en-gb/library/windows/desktop/aa365247%28v=vs.85%29.aspx + * The "\\?\" prefix .. indicate that the path should be passed to the system with minimal + * modification, which means that you cannot use forward slashes to represent path separators + */ + if (name != NULL && Py_StartsWithA(name, "\\\\?\\") != 0) + { + return '\\'; + } +#endif + if (sep != '\0') + return sep; +#if defined(__MINGW32__) + msystem = Py_GETENV("MSYSTEM"); +#endif + if (msystem != NULL) + sep = '/'; + else + sep = '\\'; + return sep; +} + +static char +Py_GetAltSepA(const char *name) +{ + char sep = Py_GetSepA(name); + if (sep == '/') + return '\\'; + return '/'; +} + +void +Py_NormalizeSepsA(char *name) +{ + assert(name != NULL); + char sep = Py_GetSepA(name); + char altsep = Py_GetAltSepA(name); + char* seps; + if (name[0] != '\0' && name[1] == ':') { + name[0] = toupper(name[0]); + } + seps = strchr(name, altsep); + while(seps) { + *seps = sep; + seps = strchr(seps, altsep); + } +} + +wchar_t +Py_GetSepW(const wchar_t *name) +{ + char* msystem = (char*)2; /* So that non Windows use / as sep */ + static wchar_t sep = L'\0'; +#ifdef _WIN32 + /* https://msdn.microsoft.com/en-gb/library/windows/desktop/aa365247%28v=vs.85%29.aspx + * The "\\?\" prefix .. indicate that the path should be passed to the system with minimal + * modification, which means that you cannot use forward slashes to represent path separators + */ + if (name != NULL && Py_StartsWithW(name, L"\\\\?\\") != 0) + { + return L'\\'; + } +#endif + if (sep != L'\0') + return sep; +#if defined(__MINGW32__) + msystem = Py_GETENV("MSYSTEM"); +#endif + if (msystem != NULL) + sep = L'/'; + else + sep = L'\\'; + return sep; +} + +static wchar_t +Py_GetAltSepW(const wchar_t *name) +{ + char sep = Py_GetSepW(name); + if (sep == L'/') + return L'\\'; + return L'/'; +} + +void +Py_NormalizeSepsW(wchar_t *name) +{ + assert(name != NULL); + wchar_t sep = Py_GetSepW(name); + wchar_t altsep = Py_GetAltSepW(name); + wchar_t* seps; + if (name[0] != L'\0' && name[1] == L':') { + name[0] = towupper(name[0]); + } + seps = wcschr(name, altsep); + while(seps) { + *seps = sep; + seps = wcschr(seps, altsep); + } +} _PyPathConfig _Py_path_config = _PyPathConfig_INIT; @@ -562,6 +696,7 @@ _Py_SetProgramFullPath(const wchar_t *program_full_path) if (_Py_path_config.program_full_path == NULL) { path_out_of_memory(__func__); } + Py_NormalizeSepsW(_Py_path_config.program_name); } diff --git a/Python/traceback.c b/Python/traceback.c index 7d6f7f435a6ba6..f49a60654bb861 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -315,7 +315,7 @@ _Py_FindSourceFile(PyObject *filename, char* namebuf, size_t namelen, PyObject * filepath = PyBytes_AS_STRING(filebytes); /* Search tail of filename in sys.path before giving up */ - tail = strrchr(filepath, SEP); + tail = strrchr(filepath, Py_GetSepA(filepath)); if (tail == NULL) tail = filepath; else From 314d9dfb18cd865fb0b42177d4d14c12311204c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:47 +0530 Subject: [PATCH 032/138] mingw use posix getpath MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Christoph Reiter --- Include/cpython/fileutils.h | 3 +- Include/pylifecycle.h | 2 +- Modules/getpath.c | 130 +++++++++++++++++++++++++++++++++--- Modules/posixmodule.c | 2 +- Python/dynload_win.c | 2 + Python/fileutils.c | 22 +++++- 6 files changed, 145 insertions(+), 16 deletions(-) diff --git a/Include/cpython/fileutils.h b/Include/cpython/fileutils.h index ccf37e9468d615..c287ab3dbaa0e4 100644 --- a/Include/cpython/fileutils.h +++ b/Include/cpython/fileutils.h @@ -135,9 +135,8 @@ PyAPI_FUNC(wchar_t*) _Py_wrealpath( size_t resolved_path_len); #endif -#ifndef MS_WINDOWS PyAPI_FUNC(int) _Py_isabs(const wchar_t *path); -#endif +PyAPI_FUNC(int) _Py_issep(const wchar_t ch); PyAPI_FUNC(int) _Py_abspath(const wchar_t *path, wchar_t **abspath_p); diff --git a/Include/pylifecycle.h b/Include/pylifecycle.h index 17d403c3eb5c5f..ce3f4116fcecd3 100644 --- a/Include/pylifecycle.h +++ b/Include/pylifecycle.h @@ -52,7 +52,7 @@ PyAPI_FUNC(wchar_t *) Py_GetPrefix(void); PyAPI_FUNC(wchar_t *) Py_GetExecPrefix(void); PyAPI_FUNC(wchar_t *) Py_GetPath(void); PyAPI_FUNC(void) Py_SetPath(const wchar_t *); -#ifdef MS_WINDOWS +#ifdef _MSC_VER int _Py_CheckPython3(void); #endif diff --git a/Modules/getpath.c b/Modules/getpath.c index ef6dd59a084d8d..4cb6738d644378 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -13,6 +13,11 @@ # include #endif +#ifdef MS_WINDOWS +#include +#include +#endif + /* Search in some common locations for the associated Python libraries. * * Two directories must be found, the platform independent directory @@ -129,6 +134,7 @@ typedef struct { wchar_t *prefix_macro; /* PREFIX macro */ wchar_t *exec_prefix_macro; /* EXEC_PREFIX macro */ wchar_t *vpath_macro; /* VPATH macro */ + wchar_t *dll_path; /* DLL Path */ wchar_t *lib_python; /* / "pythonX.Y" */ @@ -146,7 +152,7 @@ typedef struct { } PyCalculatePath; static const wchar_t delimiter[2] = {DELIM, '\0'}; -static const wchar_t separator[2] = {SEP, '\0'}; +static wchar_t separator[2] = {SEP, '\0'}; /* Get file status. Encode the path to the locale encoding. */ @@ -170,7 +176,7 @@ static void reduce(wchar_t *dir) { size_t i = wcslen(dir); - while (i > 0 && dir[i] != SEP) { + while (i > 0 && !_Py_issep(dir[i])) { --i; } dir[i] = '\0'; @@ -224,6 +230,9 @@ isdir(const wchar_t *filename) return 1; } +/* +x86_64-w64-mingw32-gcc -c -Wno-unused-result -Wsign-compare -DNDEBUG -march=x86-64 -mtune=generic -O2 -pipe -fwrapv -D__USE_MINGW_ANSI_STDIO=1 -D_WIN32_WINNT=0x0601 -DNDEBUG -DMS_DLL_ID="\"3.9\"" -flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -fprofile-generate -I../Python-3.9.4/Include/internal -IObjects -IInclude -IPython -I. -I../Python-3.9.4/Include -I../Python-3.9.4/PC -D__USE_MINGW_ANSI_STDIO=1 -IC:/msys64/mingw64/include/ncurses -I. -DPy_BUILD_CORE -DPYTHONPATH='""' -DPREFIX='"/mingw64"' -DEXEC_PREFIX='"/mingw64"' -DVERSION='"3.9"' -DVPATH='"../Python-3.9.4"' -o Modules/getpath.o ../Python-3.9.4/Modules/getpath.c +*/ /* Add a path component, by appending stuff to buffer. buflen: 'buffer' length in characters including trailing NUL. @@ -242,8 +251,8 @@ joinpath(wchar_t *path, const wchar_t *path2, size_t path_len) return PATHLEN_ERR(); } - if (n > 0 && path[n-1] != SEP) { - path[n++] = SEP; + if (n > 0 && !_Py_issep(path[n-1])) { + path[n++] = Py_GetSepW(path); } } else { @@ -285,7 +294,7 @@ joinpath2(const wchar_t *path, const wchar_t *path2) } size_t len = wcslen(path); - int add_sep = (len > 0 && path[len - 1] != SEP); + int add_sep = (len > 0 && !_Py_issep(path[len - 1])); len += add_sep; len += wcslen(path2); @@ -334,7 +343,7 @@ copy_absolute(wchar_t *abs_path, const wchar_t *path, size_t abs_path_len) } return _PyStatus_OK(); } - if (path[0] == '.' && path[1] == SEP) { + if (path[0] == '.' && _Py_issep(path[1])) { path += 2; } PyStatus status = joinpath(abs_path, path, abs_path_len); @@ -478,6 +487,7 @@ search_for_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, return _PyStatus_NO_MEMORY(); } + Py_NormalizeSepsW(path); int is_build_dir = isfile(path); PyMem_RawFree(path); @@ -502,6 +512,7 @@ search_for_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, } int module; + Py_NormalizeSepsW(prefix); status = ismodule(prefix, &module); if (_PyStatus_EXCEPTION(status)) { return status; @@ -528,6 +539,7 @@ search_for_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, } int module; + Py_NormalizeSepsW(prefix); status = ismodule(prefix, &module); if (_PyStatus_EXCEPTION(status)) { return status; @@ -551,6 +563,7 @@ search_for_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, } int module; + Py_NormalizeSepsW(prefix); status = ismodule(prefix, &module); if (_PyStatus_EXCEPTION(status)) { return status; @@ -610,6 +623,11 @@ calculate_set_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig) * return the compiled-in defaults instead. */ if (calculate->prefix_found > 0) { +#ifdef MS_WINDOWS + wchar_t drive_root[3]; + memset(drive_root, 0, sizeof(drive_root)); + wcsncpy(drive_root, calculate->prefix, 3); +#endif wchar_t *prefix = _PyMem_RawWcsdup(calculate->prefix); if (prefix == NULL) { return _PyStatus_NO_MEMORY(); @@ -625,7 +643,11 @@ calculate_set_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig) /* The prefix is the root directory, but reduce() chopped off the "/". */ +#ifdef MS_WINDOWS + pathconfig->prefix = _PyMem_RawWcsdup(drive_root); +#else pathconfig->prefix = _PyMem_RawWcsdup(separator); +#endif if (pathconfig->prefix == NULL) { return _PyStatus_NO_MEMORY(); } @@ -682,6 +704,7 @@ calculate_pybuilddir(const wchar_t *argv0_path, return PATHLEN_ERR(); } status = joinpath(exec_prefix, pybuilddir, exec_prefix_len); + Py_NormalizeSepsW(exec_prefix); PyMem_RawFree(pybuilddir); if (_PyStatus_EXCEPTION(status)) { return status; @@ -730,6 +753,7 @@ search_for_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, /* Check for pybuilddir.txt */ assert(*found == 0); + Py_NormalizeSepsW(exec_prefix); status = calculate_pybuilddir(calculate->argv0_path, exec_prefix, exec_prefix_len, found); if (_PyStatus_EXCEPTION(status)) { @@ -804,6 +828,7 @@ calculate_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig) return status; } + Py_NormalizeSepsW(exec_prefix); if (!calculate->exec_prefix_found) { if (calculate->warnings) { fprintf(stderr, @@ -836,6 +861,47 @@ calculate_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig) } +#ifdef MS_WINDOWS +wchar_t * +GetWindowsModulePaths(void) +{ + int result = 0; + wchar_t program_full_path[MAXPATHLEN+1]; + memset(program_full_path, 0, sizeof(program_full_path)); + + if (GetModuleFileNameW(NULL, program_full_path, MAXPATHLEN)) { + result = 1; + Py_NormalizeSepsW(program_full_path); + } + + return _PyMem_RawWcsdup(program_full_path); +} + + +wchar_t* +_Py_GetDLLPath(void) +{ + wchar_t dll_path[MAXPATHLEN+1]; + memset(dll_path, 0, sizeof(dll_path)); + +#ifdef Py_ENABLE_SHARED + extern HANDLE PyWin_DLLhModule; + if (PyWin_DLLhModule) { + if (GetModuleFileNameW(PyWin_DLLhModule, dll_path, MAXPATHLEN)) { + Py_NormalizeSepsW(dll_path); + } else { + dll_path[0] = 0; + } + } +#else + dll_path[0] = 0; +#endif + + return _PyMem_RawWcsdup(dll_path); +} +#endif /* MS_WINDOWS */ + + static PyStatus calculate_set_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig) @@ -846,6 +912,12 @@ calculate_set_exec_prefix(PyCalculatePath *calculate, return _PyStatus_NO_MEMORY(); } +#ifdef MS_WINDOWS + wchar_t drive_root[3]; + memset(drive_root, 0, sizeof(drive_root)); + wcsncpy(drive_root, calculate->exec_prefix, 3); +#endif + reduce(exec_prefix); reduce(exec_prefix); reduce(exec_prefix); @@ -859,7 +931,11 @@ calculate_set_exec_prefix(PyCalculatePath *calculate, /* The exec_prefix is the root directory, but reduce() chopped off the "/". */ +#ifdef MS_WINDOWS + pathconfig->exec_prefix = _PyMem_RawWcsdup(drive_root); +#else pathconfig->exec_prefix = _PyMem_RawWcsdup(separator); +#endif if (pathconfig->exec_prefix == NULL) { return _PyStatus_NO_MEMORY(); } @@ -964,13 +1040,22 @@ calculate_program_impl(PyCalculatePath *calculate, _PyPathConfig *pathconfig) * other way to find a directory to start the search from. If * $PATH isn't exported, you lose. */ - if (wcschr(pathconfig->program_name, SEP)) { + if (wcschr(pathconfig->program_name, Py_GetSepW(pathconfig->program_name))) { pathconfig->program_full_path = _PyMem_RawWcsdup(pathconfig->program_name); if (pathconfig->program_full_path == NULL) { return _PyStatus_NO_MEMORY(); } return _PyStatus_OK(); } +#ifdef MS_WINDOWS + else if(pathconfig->program_full_path == NULL) { + pathconfig->program_full_path = GetWindowsModulePaths(); + if (pathconfig->program_full_path == NULL) { + return _PyStatus_NO_MEMORY(); + } + return _PyStatus_OK(); + } +#endif /* MS_WINDOWS */ #ifdef __APPLE__ wchar_t *abs_path = NULL; @@ -1007,7 +1092,7 @@ calculate_program_impl(PyCalculatePath *calculate, _PyPathConfig *pathconfig) /* Calculate pathconfig->program_full_path */ -static PyStatus +PyStatus calculate_program(PyCalculatePath *calculate, _PyPathConfig *pathconfig) { PyStatus status; @@ -1173,7 +1258,7 @@ calculate_argv0_path_framework(PyCalculatePath *calculate, _PyPathConfig *pathco #endif -static PyStatus +PyStatus calculate_argv0_path(PyCalculatePath *calculate, _PyPathConfig *pathconfig) { @@ -1191,10 +1276,12 @@ calculate_argv0_path(PyCalculatePath *calculate, } #endif +#if defined(HAVE_READLINK) status = resolve_symlinks(&calculate->argv0_path); if (_PyStatus_EXCEPTION(status)) { return status; } +#endif reduce(calculate->argv0_path); @@ -1324,6 +1411,7 @@ calculate_zip_path(PyCalculatePath *calculate) goto done; } + Py_NormalizeSepsW(calculate->zip_path); res = _PyStatus_OK(); done: @@ -1363,7 +1451,14 @@ calculate_module_search_path(PyCalculatePath *calculate, } bufsz += wcslen(calculate->zip_path) + 1; +/* TODO :: The MS_WINDOWS bit may be unnecessary. */ +#ifdef MS_WINDOWS + if (_Py_isabs(calculate->exec_prefix)) { + bufsz += wcslen(calculate->exec_prefix) + 1; + } +#else bufsz += wcslen(calculate->exec_prefix) + 1; +#endif /* Allocate the buffer */ wchar_t *buf = PyMem_RawMalloc(bufsz * sizeof(wchar_t)); @@ -1391,7 +1486,7 @@ calculate_module_search_path(PyCalculatePath *calculate, if (!_Py_isabs(defpath)) { wcscat(buf, calculate->prefix); - if (prefixsz >= 2 && calculate->prefix[prefixsz - 2] != SEP && + if (prefixsz >= 2 && !_Py_issep(calculate->prefix[prefixsz - 2]) && defpath[0] != (delim ? DELIM : L'\0')) { /* not empty */ @@ -1413,8 +1508,15 @@ calculate_module_search_path(PyCalculatePath *calculate, } wcscat(buf, delimiter); +#ifdef MS_WINDOWS + if (_Py_isabs(calculate->exec_prefix)) { + wcscat(buf, calculate->exec_prefix); + wcscat(buf, delimiter); + } +#else /* Finally, on goes the directory for dynamic-load modules */ wcscat(buf, calculate->exec_prefix); +#endif pathconfig->module_search_path = buf; return _PyStatus_OK(); @@ -1443,14 +1545,17 @@ calculate_init(PyCalculatePath *calculate, const PyConfig *config) if (!calculate->pythonpath_macro) { return DECODE_LOCALE_ERR("PYTHONPATH macro", len); } + Py_NormalizeSepsW(calculate->pythonpath_macro); calculate->prefix_macro = Py_DecodeLocale(PREFIX, &len); if (!calculate->prefix_macro) { return DECODE_LOCALE_ERR("PREFIX macro", len); } + Py_NormalizeSepsW(calculate->prefix_macro); calculate->exec_prefix_macro = Py_DecodeLocale(EXEC_PREFIX, &len); if (!calculate->exec_prefix_macro) { return DECODE_LOCALE_ERR("EXEC_PREFIX macro", len); } + Py_NormalizeSepsW(calculate->exec_prefix_macro); calculate->vpath_macro = Py_DecodeLocale(VPATH, &len); if (!calculate->vpath_macro) { return DECODE_LOCALE_ERR("VPATH macro", len); @@ -1461,6 +1566,7 @@ calculate_init(PyCalculatePath *calculate, const PyConfig *config) if (!pyversion) { return DECODE_LOCALE_ERR("VERSION macro", len); } + calculate->lib_python = joinpath2(config->platlibdir, pyversion); PyMem_RawFree(pyversion); if (calculate->lib_python == NULL) { @@ -1477,6 +1583,7 @@ calculate_free(PyCalculatePath *calculate) PyMem_RawFree(calculate->pythonpath_macro); PyMem_RawFree(calculate->prefix_macro); PyMem_RawFree(calculate->exec_prefix_macro); + PyMem_RawFree(calculate->dll_path); PyMem_RawFree(calculate->vpath_macro); PyMem_RawFree(calculate->lib_python); PyMem_RawFree(calculate->path_env); @@ -1492,6 +1599,8 @@ calculate_path(PyCalculatePath *calculate, _PyPathConfig *pathconfig) { PyStatus status; + calculate->dll_path = _Py_GetDLLPath(); + if (pathconfig->program_full_path == NULL) { status = calculate_program(calculate, pathconfig); if (_PyStatus_EXCEPTION(status)) { @@ -1592,6 +1701,7 @@ _PyPathConfig_Calculate(_PyPathConfig *pathconfig, const PyConfig *config) { PyStatus status; PyCalculatePath calculate; + separator[0] = Py_GetSepW(NULL); memset(&calculate, 0, sizeof(calculate)); status = calculate_init(&calculate, config); diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 057d10a1a807f4..98e998e1800d43 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -4111,7 +4111,7 @@ _listdir_windows_no_opendir(path_t *path, PyObject *list) Py_END_ALLOW_THREADS /* FindNextFile sets error to ERROR_NO_MORE_FILES if it got to the end of the directory. */ - if (!result && GetLastError() != ERROR_NO_MORE_FILES) { + if (!result && GetLastError() != 0 && GetLastError() != ERROR_NO_MORE_FILES) { Py_DECREF(list); list = path_error(path); goto exit; diff --git a/Python/dynload_win.c b/Python/dynload_win.c index 6b53780f38b52e..1083fe8a95c2b9 100644 --- a/Python/dynload_win.c +++ b/Python/dynload_win.c @@ -173,7 +173,9 @@ dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix, dl_funcptr p; char funcname[258], *import_python; +#if defined(_MSC_VER) _Py_CheckPython3(); +#endif #if USE_UNICODE_WCHAR_CACHE const wchar_t *wpathname = _PyUnicode_AsUnicode(pathname); diff --git a/Python/fileutils.c b/Python/fileutils.c index 3b53baa00eeb10..1ee5476c48511d 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1976,13 +1976,31 @@ _Py_wrealpath(const wchar_t *path, #endif -#ifndef MS_WINDOWS int _Py_isabs(const wchar_t *path) { - return (path[0] == SEP); +#ifdef MS_WINDOWS + size_t i = wcslen(path); + if (i >= 3) { + if (iswalpha(path[0]) && path[1] == L':' && _Py_issep(path[2])) { + return 1; + } + } + return 0; +#else + return _Py_issep(path[0]); +#endif } + +int +_Py_issep(const wchar_t ch) +{ +#ifdef MS_WINDOWS + return ch == SEP || ch == ALTSEP; +#else + return ch == SEP; #endif +} /* Get an absolute path. From 090cda04cfcce5c0f5404d7def164024a72ddc52 Mon Sep 17 00:00:00 2001 From: Ray Donnelly Date: Thu, 17 Jun 2021 18:51:48 +0530 Subject: [PATCH 033/138] mingw add ModuleFileName dir to PATH MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Christoph Reiter --- Modules/getpath.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Modules/getpath.c b/Modules/getpath.c index 4cb6738d644378..e05787b72d8460 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -1635,6 +1635,36 @@ calculate_path(PyCalculatePath *calculate, _PyPathConfig *pathconfig) return status; } +#ifdef MS_WINDOWS + if (calculate->path_env) { + wchar_t *module_path, *norm_path; + // Add path of executable/dll to system path. This + // is so that the correct tcl??.dll and tk??.dll get used. + module_path = calculate->dll_path[0] ? calculate->dll_path : pathconfig->program_full_path; + norm_path = (wchar_t *)alloca(sizeof(wchar_t) * (wcslen(module_path) + 1)); + if (norm_path) { + wchar_t *slashes, *end, *new_path; + wcscpy(norm_path, module_path); + slashes = wcschr(norm_path, L'/'); + while (slashes) { + *slashes = L'\\'; + slashes = wcschr(slashes + 1, L'/'); + } + end = wcsrchr(norm_path, L'\\') ? wcsrchr(norm_path, L'\\') : norm_path + wcslen(norm_path); + end[1] = L'\0'; + + new_path = (wchar_t *)alloca(sizeof(wchar_t) * (wcslen(L"PATH=") + wcslen(calculate->path_env) + 1 + wcslen(norm_path) + 1)); + if (new_path) { + wcscpy(new_path, L"PATH="); + wcscat(new_path, calculate->path_env); + wcscat(new_path, L";"); + wcscat(new_path, norm_path); + _wputenv(new_path); + } + } + } +#endif + if ((!calculate->prefix_found || !calculate->exec_prefix_found) && calculate->warnings) { From da9db6ada573d508521b2ca7bf937333f0ed47e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:49 +0530 Subject: [PATCH 034/138] mingw add BUILDIN_WIN32_MODULEs time msvcrt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Modules/Setup.config.in | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Setup.config.in b/Modules/Setup.config.in index d071a744075404..825ce5dbf23672 100644 --- a/Modules/Setup.config.in +++ b/Modules/Setup.config.in @@ -11,4 +11,5 @@ # build-in modules for windows platform: @USE_WIN32_MODULE@winreg ../PC/winreg.c +@USE_WIN32_MODULE@msvcrt -DPy_BUILD_CORE ../PC/msvcrtmodule.c From bbe9a724d75d6861affbcb6726f6faa6973a5740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:50 +0530 Subject: [PATCH 035/138] msys cygwin semi native build sysconfig MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Lib/sysconfig.py | 8 +++++++ Makefile.pre.in | 7 ++++++ configure.ac | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+) diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index c9ab982e43ddf8..5c3b03c74d9d35 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -386,6 +386,14 @@ def _parse_makefile(filename, vars=None, keep_unresolved=True): if isinstance(v, str): done[k] = v.strip() + # any keys that have one with the same name suffixed with _b2h + # need to be replaced with the value of the _b2h key. + # This converts from MSYS*/Cygwin paths to Windows paths. + for k, v in dict(done).items(): + if isinstance(k, str): + if k.endswith("_b2h"): + done[k[:-4]]=v + # save the results in the global dictionary vars.update(done) return vars diff --git a/Makefile.pre.in b/Makefile.pre.in index 0d8ea115233d3d..8f762e45b3ff14 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -136,6 +136,13 @@ exec_prefix= @exec_prefix@ # Install prefix for data files datarootdir= @datarootdir@ +# Locations needed for semi-native fixup of sysconfig. +srcdir_b2h= @srcdir_b2h@ +VPATH_b2h= @VPATH_b2h@ +abs_srcdir_b2h= @abs_srcdir_b2h@ +abs_builddir_b2h= @abs_builddir_b2h@ +prefix_b2h= @prefix_b2h@ + # Expanded directories BINDIR= @bindir@ LIBDIR= @libdir@ diff --git a/configure.ac b/configure.ac index 0ad6a55240e37c..1d78c2c96a8150 100644 --- a/configure.ac +++ b/configure.ac @@ -608,6 +608,65 @@ then AC_DEFINE(_INCLUDE__STDC_A1_SOURCE, 1, Define to include mbstate_t for mbrtowc) fi +# On 'semi-native' build systems (MSYS*/Cygwin targeting MinGW-w64) +# _sysconfigdata.py will contain paths that are correct only in the +# build environment. This means external modules will fail to build +# without setting up the same env and also that the build of Python +# itself will fail as the paths are not correct for the host tools. +# +# Also, getpath.c uses GetModuleFileNameW (replacing \ with /) and +# compares that with the define VPATH (passed in via command-line) +# to determine whether it's the build- or the installed-Python. +# +# To work around these issues a set of _b2h variables are created: +# VPATH_b2h, prefix_b2h, srcdir_b2h, abs_srcdir_b2h +# and abs_builddir_b2h +# .. where b2h stands for build to host. sysconfig.py replaces path +# prefixes matching the non-b2h versions with the b2h equivalents. +# +# (note this assumes the host compilers are native and *not* cross +# - in the 'semi-native' scenario only that is.) + +AC_DEFUN([ABS_PATH_HOST], +[$1=$(cd $$2 && pwd) + case $build_os in + mingw*) + case $host_os in + mingw*) $1=$(cd $$2 && pwd -W) ;; + *) ;; + esac + ;; + cygwin*) + case $host_os in + mingw*) $1=$(cygpath -w -m $$2) ;; + *) ;; + esac + ;; + esac +AC_SUBST([$1]) +]) + +AC_MSG_CHECKING(absolute host location of VPATH) +ABS_PATH_HOST([VPATH_b2h],[srcdir]) +AC_MSG_RESULT([$VPATH_b2h]) + +AC_MSG_CHECKING(absolute host location of prefix) +ABS_PATH_HOST([prefix_b2h],[prefix]) +AC_MSG_RESULT([$prefix_b2h]) + +AC_MSG_CHECKING(absolute host location of srcdir) +ABS_PATH_HOST([srcdir_b2h],[srcdir]) +AC_MSG_RESULT([$srcdir_b2h]) + +AC_MSG_CHECKING(absolute host location of abs_srcdir) +ABS_PATH_HOST([abs_srcdir_b2h],[srcdir]) +AC_MSG_RESULT([$abs_srcdir_b2h]) + +my_builddir=. +AC_MSG_CHECKING(Absolute host location of abs_builddir) +ABS_PATH_HOST([abs_builddir_b2h],[my_builddir]) +AC_MSG_RESULT([$abs_builddir_b2h]) + AC_MSG_CHECKING([for init system calls]) AC_SUBST(INITSYS) case $host in From ec8f8d3e5fb95bf3c08cc8d1f1c892da782a8e26 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Tue, 21 Sep 2021 20:53:59 +0200 Subject: [PATCH 036/138] sysconfig: mingw sysconfig like posix --- Lib/sysconfig.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index 5c3b03c74d9d35..d435b40146bcd0 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -48,13 +48,13 @@ 'data': '{base}', }, 'nt': { - 'stdlib': '{installed_base}/Lib', - 'platstdlib': '{base}/Lib', - 'purelib': '{base}/Lib/site-packages', - 'platlib': '{base}/Lib/site-packages', - 'include': '{installed_base}/Include', - 'platinclude': '{installed_base}/Include', - 'scripts': '{base}/Scripts', + 'stdlib': '{installed_base}/lib/python{py_version_short}', + 'platstdlib': '{base}/lib/python{py_version_short}', + 'purelib': '{base}/lib/python{py_version_short}/site-packages', + 'platlib': '{base}/lib/python{py_version_short}/site-packages', + 'include': '{installed_base}/include/python{py_version_short}', + 'platinclude': '{installed_base}/include/python{py_version_short}', + 'scripts': '{base}/bin', 'data': '{base}', }, } @@ -95,12 +95,12 @@ def joinuser(*args): _INSTALL_SCHEMES |= { # NOTE: When modifying "purelib" scheme, update site._get_path() too. 'nt_user': { - 'stdlib': '{userbase}/Python{py_version_nodot_plat}', - 'platstdlib': '{userbase}/Python{py_version_nodot_plat}', - 'purelib': '{userbase}/Python{py_version_nodot_plat}/site-packages', - 'platlib': '{userbase}/Python{py_version_nodot_plat}/site-packages', - 'include': '{userbase}/Python{py_version_nodot_plat}/Include', - 'scripts': '{userbase}/Python{py_version_nodot_plat}/Scripts', + 'stdlib': '{userbase}/lib/python{py_version_short}', + 'platstdlib': '{userbase}/lib/python{py_version_short}', + 'purelib': '{userbase}/lib/python{py_version_short}/site-packages', + 'platlib': '{userbase}/lib/python{py_version_short}/site-packages', + 'include': '{userbase}/include/python{py_version_short}', + 'scripts': '{userbase}/bin', 'data': '{userbase}', }, 'posix_user': { @@ -519,7 +519,7 @@ def _init_non_posix(vars): vars['INCLUDEPY'] = get_path('include') vars['EXT_SUFFIX'] = _imp.extension_suffixes()[0] vars['EXE'] = '.exe' - vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT + vars['VERSION'] = _PY_VERSION_SHORT vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) vars['TZPATH'] = '' From e2b0ad44039dd18cbfaa18f442fca18461ff93b1 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Tue, 21 Sep 2021 21:13:57 +0200 Subject: [PATCH 037/138] build _winapi earlier so we can use it in distutils via subprocess --- Modules/Setup.config.in | 1 + setup.py | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Modules/Setup.config.in b/Modules/Setup.config.in index 825ce5dbf23672..b4e7ff71a52a74 100644 --- a/Modules/Setup.config.in +++ b/Modules/Setup.config.in @@ -12,4 +12,5 @@ # build-in modules for windows platform: @USE_WIN32_MODULE@winreg ../PC/winreg.c @USE_WIN32_MODULE@msvcrt -DPy_BUILD_CORE ../PC/msvcrtmodule.c +@USE_WIN32_MODULE@_winapi _winapi.c diff --git a/setup.py b/setup.py index 828692f602b355..5e9bcdf83c7ba6 100644 --- a/setup.py +++ b/setup.py @@ -1709,7 +1709,9 @@ def detect_platform_specific_exts(self): self.add(Extension('msvcrt', [os.path.join(pc_srcdir, p) for p in ['msvcrtmodule.c']])) - self.add(Extension('_winapi', ['_winapi.c'])) + # Added to Setup.config.in as now needed earlier since I + # use subprocess (which uses Popen) in cygwinccompiler.py + # self.add(Extension('_winapi', ['_winapi.c'])) self.add(Extension('_msi', [os.path.join(pc_srcdir, p) for p in ['_msi.c']], From 1dc74093ad8d5db0886fe319d259c2f5ca6df448 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:52 +0530 Subject: [PATCH 038/138] cross dont add multiarch paths if cross compiling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 5e9bcdf83c7ba6..5ca51b0d7cc4a6 100644 --- a/setup.py +++ b/setup.py @@ -831,10 +831,10 @@ def configure_compiler(self): if not CROSS_COMPILING: add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + self.add_multiarch_paths() # only change this for cross builds for 3.3, issues on Mageia if CROSS_COMPILING: self.add_cross_compiling_paths() - self.add_multiarch_paths() self.add_ldflags_cppflags() def init_inc_lib_dirs(self): From 04ae38b0c142d068d1220d40ae1e543e0a837172 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:53 +0530 Subject: [PATCH 039/138] mingw use backslashes in compileall py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Lib/compileall.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/compileall.py b/Lib/compileall.py index 3755e76ba813f5..046efbf12c179a 100644 --- a/Lib/compileall.py +++ b/Lib/compileall.py @@ -38,6 +38,8 @@ def _walk_dir(dir, maxlevels, quiet=0): if name == '__pycache__': continue fullname = os.path.join(dir, name) + if sys.platform == "win32" and sys.version.find("GCC") >= 0: + fullname = fullname.replace('\\','/') if not os.path.isdir(fullname): yield fullname elif (maxlevels > 0 and name != os.curdir and name != os.pardir and From f33b21255ca66937edfbb78814c167b2f624eff4 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Tue, 21 Sep 2021 21:18:36 +0200 Subject: [PATCH 040/138] msys convert_path fix and root hack --- Makefile.pre.in | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 8f762e45b3ff14..6a9f63d9cc65f0 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1760,6 +1760,12 @@ libainstall: @DEF_MAKE_RULE@ python-config else true; \ fi +ifeq ($(shell uname -o),Msys) +DESTDIRFINAL=$(DESTDIR) +else +DESTDIRFINAL=$(DESTDIR)/ +endif + # Install the dynamically loadable modules # This goes into $(exec_prefix) sharedinstall: sharedmods @@ -1767,9 +1773,9 @@ sharedinstall: sharedmods --prefix=$(prefix) \ --install-scripts=$(BINDIR) \ --install-platlib=$(DESTSHARED) \ - --root=$(DESTDIR)/ - -rm $(DESTDIR)$(DESTSHARED)/_sysconfigdata_$(ABIFLAGS)_$(MACHDEP)_$(MULTIARCH).py - -rm -r $(DESTDIR)$(DESTSHARED)/__pycache__ + --root=$(DESTDIRFINAL) + -rm $(DESTDIRFINAL)$(DESTSHARED)/_sysconfigdata_$(ABIFLAGS)_$(MACHDEP)_$(MULTIARCH).py + -rm -r $(DESTDIRFINAL)$(DESTSHARED)/__pycache__ # Here are a couple of targets for MacOSX again, to install a full # framework-based Python. frameworkinstall installs everything, the From 31edbb649b2bb34048432bf8ae3d87eb789e106d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:54 +0530 Subject: [PATCH 041/138] allow static tcltk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- setup.py | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/setup.py b/setup.py index 5ca51b0d7cc4a6..811756bbd98bfc 100644 --- a/setup.py +++ b/setup.py @@ -880,7 +880,7 @@ def init_inc_lib_dirs(self): if HOST_PLATFORM == 'hp-ux11': self.lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32'] - if MACOS: + if MACOS or MS_WINDOWS: # This should work on any unixy platform ;-) # If the user has bothered specifying additional -I and -L flags # in OPT and LDFLAGS we might as well use them here. @@ -890,6 +890,8 @@ def init_inc_lib_dirs(self): # directories with whitespace in the name to store libraries. cflags, ldflags = sysconfig.get_config_vars( 'CFLAGS', 'LDFLAGS') + cflags = cflags + ' ' + ('',os.environ.get('CC'))[os.environ.get('CC') != None] + ldflags = ldflags + ' ' + ('',os.environ.get('LDSHARED'))[os.environ.get('LDSHARED') != None] for item in cflags.split(): if item.startswith('-I'): self.inc_dirs.append(item[2:]) @@ -2172,14 +2174,19 @@ def detect_tkinter(self): # The versions with dots are used on Unix, and the versions without # dots on Windows, for detection by cygwin. tcllib = tklib = tcl_includes = tk_includes = None - for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', - '8.2', '82', '8.1', '81', '8.0', '80']: - tklib = self.compiler.find_library_file(self.lib_dirs, - 'tk' + version) - tcllib = self.compiler.find_library_file(self.lib_dirs, - 'tcl' + version) - if tklib and tcllib: - # Exit the loop when we've found the Tcl/Tk libraries + tcltk_suffix = None + for suffix in ['', 's']: + for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', + '8.2', '82', '8.1', '81', '8.0', '80', '']: + tklib = self.compiler.find_library_file(self.lib_dirs, + 'tk' + version + suffix) + tcllib = self.compiler.find_library_file(self.lib_dirs, + 'tcl' + version + suffix) + if tklib and tcllib: + # Exit the loop when we've found the Tcl/Tk libraries + tcltk_suffix = suffix + break + if tcltk_suffix != None: break # Now check for the header files @@ -2250,10 +2257,18 @@ def detect_tkinter(self): # Add the Tcl/Tk libraries libs.append('tk'+ version) libs.append('tcl'+ version) + libs.append('tk'+ version + tcltk_suffix) + libs.append('tcl'+ version + tcltk_suffix) + if MS_WINDOWS: + for winlib in ['ws2_32','gdi32','comctl32','comdlg32','imm32','uuid','oleaut32','ole32']: + libs.append( winlib ) # Finally, link with the X11 libraries (not appropriate on cygwin) - if not CYGWIN: + # ...on those platforms, define STATIC_BUILD if linking to static tcl/tk. + if not CYGWIN and not MS_WINDOWS: libs.append('X11') + elif tcllib.endswith('s.a'): + defs.append( ('STATIC_BUILD',1) ) # XXX handle these, but how to detect? # *** Uncomment and edit for PIL (TkImaging) extension only: From 45e47f24820c33adefec5e6ef6dc6def8b54c956 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:55 +0530 Subject: [PATCH 042/138] mingw pdcurses_ISPAD MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Include/py_curses.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Include/py_curses.h b/Include/py_curses.h index b70252d9d7605e..0d5cee2601d28b 100644 --- a/Include/py_curses.h +++ b/Include/py_curses.h @@ -36,6 +36,13 @@ #include #endif +#if defined(__MINGW32__) +#include +#if !defined(_ISPAD) +#define _ISPAD 0x10 +#endif +#endif + #ifdef HAVE_NCURSES_H /* configure was checking , but we will use , which has some or all these features. */ From d6f3fae0d0d57e6ef070b7024b7e1925a0a8d3a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:57 +0530 Subject: [PATCH 043/138] builddir fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Christoph Reiter --- Makefile.pre.in | 10 +++++----- Programs/_freeze_importlib.c | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 6a9f63d9cc65f0..b1630b85d7733b 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -737,20 +737,20 @@ Programs/_testembed: Programs/_testembed.o $(LIBRARY_DEPS) Programs/_freeze_importlib.o: Programs/_freeze_importlib.c Makefile -Programs/_freeze_importlib: Programs/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN) +Programs/_freeze_importlib$(EXE): Programs/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN) $(LINKCC) $(PY_CORE_LDFLAGS) -o $@ Programs/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN) $(LIBS) $(MODLIBS) $(SYSLIBS) .PHONY: regen-importlib -regen-importlib: Programs/_freeze_importlib +regen-importlib: Programs/_freeze_importlib$(EXE) # Regenerate Python/importlib_external.h # from Lib/importlib/_bootstrap_external.py using _freeze_importlib - ./Programs/_freeze_importlib importlib._bootstrap_external \ + ./Programs/_freeze_importlib$(EXE) importlib._bootstrap_external \ $(srcdir)/Lib/importlib/_bootstrap_external.py \ $(srcdir)/Python/importlib_external.h.new $(UPDATE_FILE) $(srcdir)/Python/importlib_external.h $(srcdir)/Python/importlib_external.h.new # Regenerate Python/importlib.h from Lib/importlib/_bootstrap.py # using _freeze_importlib - ./Programs/_freeze_importlib importlib._bootstrap \ + ./Programs/_freeze_importlib$(EXE) importlib._bootstrap \ $(srcdir)/Lib/importlib/_bootstrap.py \ $(srcdir)/Python/importlib.h.new $(UPDATE_FILE) $(srcdir)/Python/importlib.h $(srcdir)/Python/importlib.h.new @@ -1934,7 +1934,7 @@ clean-retain-profile: pycremoval find build -name '*.py[co]' -exec rm -f {} ';' || true -rm -f pybuilddir.txt -rm -f Lib/lib2to3/*Grammar*.pickle - -rm -f Programs/_testembed Programs/_freeze_importlib + -rm -f Programs/_testembed Programs/_freeze_importlib$(EXE) -find build -type f -a ! -name '*.gc??' -exec rm -f {} ';' -rm -f Include/pydtrace_probes.h -rm -f profile-gen-stamp diff --git a/Programs/_freeze_importlib.c b/Programs/_freeze_importlib.c index 2e4ccbb154a414..a8d5c313da87b7 100644 --- a/Programs/_freeze_importlib.c +++ b/Programs/_freeze_importlib.c @@ -20,7 +20,7 @@ static const struct _frozen _PyImport_FrozenModules[] = { {0, 0, 0} /* sentinel */ }; -#ifndef MS_WINDOWS +#ifndef _MSC_VER /* On Windows, this links with the regular pythonXY.dll, so this variable comes from frozen.obj. In the Makefile, frozen.o is not linked into this executable, so we define the variable here. */ From 979abaa57b61d27c14629f2900b46b70ec565115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:57 +0530 Subject: [PATCH 044/138] msys monkeypatch os system via sh exe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- setup.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/setup.py b/setup.py index 811756bbd98bfc..001c777afc2fe1 100644 --- a/setup.py +++ b/setup.py @@ -79,6 +79,17 @@ def get_platform(): return sys.platform +# On MSYS, os.system needs to be wrapped with sh.exe +# as otherwise all the io redirection will fail. +# Arguably, this could happen inside the real os.system +# rather than this monkey patch. +if sys.platform == "win32" and "MSYSTEM" in os.environ: + os_system = os.system + def msys_system(command): + command_in_sh = 'sh.exe -c "%s"' % command.replace("\\", "\\\\") + return os_system(command_in_sh) + os.system = msys_system + CROSS_COMPILING = ("_PYTHON_HOST_PLATFORM" in os.environ) HOST_PLATFORM = get_platform() MS_WINDOWS = (HOST_PLATFORM == 'win32') From 9afdda3edca9b762145175729fb839275d08850f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:58 +0530 Subject: [PATCH 045/138] msys replace slashes used in io redirection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Christoph Reiter Co-authored-by: Naveen M K --- setup.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/setup.py b/setup.py index 001c777afc2fe1..d9fa7de52720c3 100644 --- a/setup.py +++ b/setup.py @@ -680,7 +680,7 @@ def check_extension_import(self, ext): def add_multiarch_paths(self): # Debian/Ubuntu multiarch support. # https://wiki.ubuntu.com/MultiarchSpec - tmpfile = os.path.join(self.build_temp, 'multiarch') + tmpfile = os.path.join(self.build_temp, 'multiarch').replace('\\','/') if not os.path.exists(self.build_temp): os.makedirs(self.build_temp) ret = run_command( @@ -705,7 +705,7 @@ def add_multiarch_paths(self): opt = '' if CROSS_COMPILING: opt = '-t' + sysconfig.get_config_var('HOST_GNU_TYPE') - tmpfile = os.path.join(self.build_temp, 'multiarch') + tmpfile = os.path.join(self.build_temp, 'multiarch').replace('\\','/') if not os.path.exists(self.build_temp): os.makedirs(self.build_temp) ret = run_command( @@ -767,7 +767,7 @@ def add_search_path(line): pass def add_cross_compiling_paths(self): - tmpfile = os.path.join(self.build_temp, 'ccpaths') + tmpfile = os.path.join(self.build_temp, 'ccpaths').replace('\\','/') if not os.path.exists(self.build_temp): os.makedirs(self.build_temp) # bpo-38472: With a German locale, GCC returns "gcc-Version 9.1.0 @@ -1100,7 +1100,7 @@ def detect_readline_curses(self): readline_termcap_library = "" curses_library = "" # Cannot use os.popen here in py3k. - tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib') + tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib').replace('\\','/') if not os.path.exists(self.build_temp): os.makedirs(self.build_temp) # Determine if readline is already linked against curses or tinfo. @@ -2123,12 +2123,12 @@ def detect_tkinter_darwin(self): cflags = sysconfig.get_config_vars('CFLAGS')[0] archs = re.findall(r'-arch\s+(\w+)', cflags) - tmpfile = os.path.join(self.build_temp, 'tk.arch') + tmpfile = os.path.join(self.build_temp, 'tk.arch').replace('\\','/') if not os.path.exists(self.build_temp): os.makedirs(self.build_temp) run_command( - "file {}/Tk.framework/Tk | grep 'for architecture' > {}".format(F, tmpfile) + "file {}/Tk.framework/Tk | grep 'for architecture' > {}".format(F, tmpfile).replace('\\','/') ) with open(tmpfile) as fp: detected_archs = [] From 1b44bafe35fed270aee37e52c3cf50ea4ffb3f23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:59 +0530 Subject: [PATCH 046/138] remove_path_max.default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Include/osdefs.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Include/osdefs.h b/Include/osdefs.h index 3243944a1483e9..99d49777a69d9a 100644 --- a/Include/osdefs.h +++ b/Include/osdefs.h @@ -10,7 +10,6 @@ extern "C" { #ifdef MS_WINDOWS #define SEP L'\\' #define ALTSEP L'/' -#define MAXPATHLEN 256 #define DELIM L';' #endif From 4ff5090a7e24653791a58ff33f1f5a55e95c1120 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:52:00 +0530 Subject: [PATCH 047/138] dont link with gettext MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Modules/_localemodule.c | 7 +++++++ configure.ac | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index 564f5598edcc66..71c84124af6f2a 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -12,6 +12,13 @@ This software comes with no warranty. Use at your own risk. #define PY_SSIZE_T_CLEAN #include "Python.h" #include "pycore_fileutils.h" +#ifdef __MINGW32__ +/* The header libintl.h and library libintl may exist on mingw host. + * To be compatible with MSVC build we has to undef some defines. + */ +#undef HAVE_LIBINTL_H +#undef HAVE_BIND_TEXTDOMAIN_CODESET +#endif #include #include diff --git a/configure.ac b/configure.ac index 1d78c2c96a8150..d09fcd60440df9 100644 --- a/configure.ac +++ b/configure.ac @@ -3206,10 +3206,19 @@ AC_SEARCH_LIBS(sem_init, pthread rt posix4) fi # check if we need libintl for locale functions +case $host in + *-*-mingw*) + dnl Native windows build don't use libintl (see _localemodule.c). + dnl Also we don't like setup.py to add "intl" library to the list + dnl when build _locale module. + ;; + *) AC_CHECK_LIB(intl, textdomain, [AC_DEFINE(WITH_LIBINTL, 1, [Define to 1 if libintl is needed for locale functions.]) LIBS="-lintl $LIBS"]) + ;; +esac # checks for system dependent C++ extensions support case "$ac_sys_system" in From f7ff379c524449e14a92761143fa48c3dd94be88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:52:01 +0530 Subject: [PATCH 048/138] ctypes python dll MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Christoph Reiter --- Lib/ctypes/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py index 4afa4ebd422493..2fe2eec8ca7f4f 100644 --- a/Lib/ctypes/__init__.py +++ b/Lib/ctypes/__init__.py @@ -456,7 +456,9 @@ def LoadLibrary(self, name): cdll = LibraryLoader(CDLL) pydll = LibraryLoader(PyDLL) -if _os.name == "nt": +if _os.name == "nt" and _sys.version.find('GCC') >= 0: + pythonapi = PyDLL("libpython%d.%d%s.dll" % (_sys.version_info[:2] + (_sys.abiflags,)), None) +elif _os.name == "nt": pythonapi = PyDLL("python dll", None, _sys.dllhandle) elif _sys.platform == "cygwin": pythonapi = PyDLL("libpython%d.%d.dll" % _sys.version_info[:2]) From 07e41010f247b4ed8f8629839fbdf3bb105c4dba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:52:02 +0530 Subject: [PATCH 049/138] gdbm module includes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Modules/_gdbmmodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c index a7fb6a33c862c4..98f2c09b106c62 100644 --- a/Modules/_gdbmmodule.c +++ b/Modules/_gdbmmodule.c @@ -11,7 +11,7 @@ #include #include "gdbm.h" -#if defined(WIN32) && !defined(__CYGWIN__) +#if defined(WIN32) && !defined(__CYGWIN__) && !defined(__MINGW32__) #include "gdbmerrno.h" extern const char * gdbm_strerror(gdbm_error); #endif From 42b4b1945fdd57d5cef3a35bc7c7ee081a1f0570 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:52:03 +0530 Subject: [PATCH 050/138] use gnu_printf in format MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Include/bytesobject.h | 4 ++-- Include/pyerrors.h | 4 ++-- Include/pyport.h | 6 ++++++ Include/sysmodule.h | 4 ++-- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Include/bytesobject.h b/Include/bytesobject.h index 39c241a2dcf5f7..902d4a15583495 100644 --- a/Include/bytesobject.h +++ b/Include/bytesobject.h @@ -35,9 +35,9 @@ PyAPI_FUNC(PyObject *) PyBytes_FromStringAndSize(const char *, Py_ssize_t); PyAPI_FUNC(PyObject *) PyBytes_FromString(const char *); PyAPI_FUNC(PyObject *) PyBytes_FromObject(PyObject *); PyAPI_FUNC(PyObject *) PyBytes_FromFormatV(const char*, va_list) - Py_GCC_ATTRIBUTE((format(printf, 1, 0))); + Py_PRINTF(1, 0); PyAPI_FUNC(PyObject *) PyBytes_FromFormat(const char*, ...) - Py_GCC_ATTRIBUTE((format(printf, 1, 2))); + Py_PRINTF(1, 2); PyAPI_FUNC(Py_ssize_t) PyBytes_Size(PyObject *); PyAPI_FUNC(char *) PyBytes_AsString(PyObject *); PyAPI_FUNC(PyObject *) PyBytes_Repr(PyObject *, int); diff --git a/Include/pyerrors.h b/Include/pyerrors.h index f5d1c711577186..a532821f3739cb 100644 --- a/Include/pyerrors.h +++ b/Include/pyerrors.h @@ -308,9 +308,9 @@ PyAPI_FUNC(int) PyUnicodeTranslateError_SetReason( ); PyAPI_FUNC(int) PyOS_snprintf(char *str, size_t size, const char *format, ...) - Py_GCC_ATTRIBUTE((format(printf, 3, 4))); + Py_PRINTF(3, 4); PyAPI_FUNC(int) PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) - Py_GCC_ATTRIBUTE((format(printf, 3, 0))); + Py_PRINTF(3, 0); #ifndef Py_LIMITED_API # define Py_CPYTHON_ERRORS_H diff --git a/Include/pyport.h b/Include/pyport.h index dedc3b892886f6..78f7d53ea0455f 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -803,6 +803,12 @@ extern char * _getpty(int *, int, mode_t, int); #define Py_VA_COPY va_copy +#if defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__>= 4) || __GNUC__ > 4) +# define Py_PRINTF(X,Y) Py_GCC_ATTRIBUTE((format(gnu_printf,X,Y))) +#else +# define Py_PRINTF(X,Y) Py_GCC_ATTRIBUTE((format(printf,X,Y))) +#endif + /* * Convenient macros to deal with endianness of the platform. WORDS_BIGENDIAN is * detected by configure and defined in pyconfig.h. The code in pyconfig.h diff --git a/Include/sysmodule.h b/Include/sysmodule.h index 670e5d283f7701..d582963017ba4b 100644 --- a/Include/sysmodule.h +++ b/Include/sysmodule.h @@ -15,9 +15,9 @@ PyAPI_FUNC(void) PySys_SetArgvEx(int, wchar_t **, int); PyAPI_FUNC(void) PySys_SetPath(const wchar_t *); PyAPI_FUNC(void) PySys_WriteStdout(const char *format, ...) - Py_GCC_ATTRIBUTE((format(printf, 1, 2))); + Py_PRINTF(1, 2); PyAPI_FUNC(void) PySys_WriteStderr(const char *format, ...) - Py_GCC_ATTRIBUTE((format(printf, 1, 2))); + Py_PRINTF(1, 2); PyAPI_FUNC(void) PySys_FormatStdout(const char *format, ...); PyAPI_FUNC(void) PySys_FormatStderr(const char *format, ...); From d7e022857de1711d26702c18209ac6ec44751de1 Mon Sep 17 00:00:00 2001 From: Ray Donnelly Date: Thu, 17 Jun 2021 18:52:03 +0530 Subject: [PATCH 051/138] mingw fix ssl dont use enum_certificates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Christoph Reiter --- Lib/ssl.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/ssl.py b/Lib/ssl.py index b09d684ed0fc6a..0be1a276a4bdf7 100644 --- a/Lib/ssl.py +++ b/Lib/ssl.py @@ -250,7 +250,7 @@ class _TLSMessageType(_IntEnum): CHANGE_CIPHER_SPEC = 0x0101 -if sys.platform == "win32": +if sys.platform == "win32" and sys.version.find("GCC") == -1: from _ssl import enum_certificates, enum_crls from socket import socket, SOCK_STREAM, create_connection @@ -587,7 +587,7 @@ def _load_windows_store_certs(self, storename, purpose): def load_default_certs(self, purpose=Purpose.SERVER_AUTH): if not isinstance(purpose, _ASN1Object): raise TypeError(purpose) - if sys.platform == "win32": + if sys.platform == "win32" and sys.version.find("GCC") == -1: for storename in self._windows_cert_stores: self._load_windows_store_certs(storename, purpose) self.set_default_verify_paths() From 018544abfc2a29dc389229911aa314ab963fa0d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:52:06 +0530 Subject: [PATCH 052/138] fix using dllhandle and winver mingw MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Python/sysmodule.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 1d5a06a6b4787e..e4a15cd539b0b4 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -39,7 +39,7 @@ Data members: #include #endif /* MS_WINDOWS */ -#ifdef MS_COREDLL +#if defined(MS_WINDOWS) && defined(Py_ENABLE_SHARED) extern void *PyWin_DLLhModule; /* A string loaded from the DLL at startup: */ extern const char *PyWin_DLLVersionString; @@ -2845,7 +2845,7 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict) SET_SYS_FROM_STRING("byteorder", "little"); #endif -#ifdef MS_COREDLL +#if defined(MS_WINDOWS) && defined(Py_ENABLE_SHARED) SET_SYS("dllhandle", PyLong_FromVoidPtr(PyWin_DLLhModule)); SET_SYS_FROM_STRING("winver", PyWin_DLLVersionString); #endif From 4da557f544b9037505b920ef99ece3a8ec134519 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:52:07 +0530 Subject: [PATCH 053/138] Add AMD64 to sys config so msvccompiler get_build_version works --- Python/getcompiler.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/Python/getcompiler.c b/Python/getcompiler.c index a5d26239e8772e..3e31c80bdf4fb1 100644 --- a/Python/getcompiler.c +++ b/Python/getcompiler.c @@ -10,7 +10,22 @@ #if defined(__clang__) #define COMPILER "[Clang " __clang_version__ "]" #elif defined(__GNUC__) -#define COMPILER "[GCC " __VERSION__ "]" +/* To not break compatibility with things that determine + CPU arch by calling get_build_version in msvccompiler.py + (such as NumPy) add "32 bit" or "64 bit (AMD64)" on Windows + and also use a space as a separator rather than a newline. */ +#if defined(_WIN32) +#define COMP_SEP " " +#if defined(__x86_64__) +#define ARCH_SUFFIX " 64 bit (AMD64)" +#else +#define ARCH_SUFFIX " 32 bit" +#endif +#else +#define COMP_SEP "\n" +#define ARCH_SUFFIX "" +#endif +#define COMPILER COMP_SEP "[GCC " __VERSION__ ARCH_SUFFIX "]" // Generic fallbacks. #elif defined(__cplusplus) #define COMPILER "[C++]" From a0c62a997a91fd548eaef84af1b8a12eb6379ca5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:52:08 +0530 Subject: [PATCH 054/138] MINGW link with additional library --- configure.ac | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/configure.ac b/configure.ac index d09fcd60440df9..e6c41d7d1ac668 100644 --- a/configure.ac +++ b/configure.ac @@ -5933,6 +5933,15 @@ for dir in $SRCDIRS; do done AC_MSG_RESULT(done) +# For mingw build need additional library for linking +case $host in + *-*-mingw*) + LIBS="$LIBS -lversion -lshlwapi -lpathcch" + ;; + *) + ;; +esac + # Availability of -O2: AC_MSG_CHECKING(for -O2) saved_cflags="$CFLAGS" From 3c96c5c11fd83c3789707e03991b141afd4b88b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C3=BAl=20Ibarra=20Corretg=C3=A9?= Date: Thu, 17 Jun 2021 18:52:09 +0530 Subject: [PATCH 055/138] install msilib MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Christoph Reiter Co-authored-by: Ray Donnelly --- Makefile.pre.in | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.pre.in b/Makefile.pre.in index b1630b85d7733b..2823bea2dc2a50 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1459,6 +1459,7 @@ LIBSUBDIRS= asyncio \ sqlite3 \ tkinter \ turtledemo \ + msilib \ unittest \ urllib \ venv venv/scripts venv/scripts/common venv/scripts/posix \ From 36e63bcafe9f7610349e4b664687fd2338f52eef Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Thu, 17 Jun 2021 18:52:10 +0530 Subject: [PATCH 056/138] fix signal module build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Modules/Setup | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Setup b/Modules/Setup index e765e050e58905..ecd64fe1bb3889 100644 --- a/Modules/Setup +++ b/Modules/Setup @@ -111,7 +111,7 @@ _collections _collectionsmodule.c # Container types _abc -DPy_BUILD_CORE_BUILTIN _abc.c # Abstract base classes itertools itertoolsmodule.c # Functions creating iterators for efficient looping atexit atexitmodule.c # Register functions to be run at interpreter-shutdown -_signal -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal signalmodule.c +_signal -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal signalmodule.c -lws2_32 _stat _stat.c # stat.h interface time -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal timemodule.c # -lm # time operations and variables _thread -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal _threadmodule.c # low-level threading interface From 8742de2a646c1140075ac62dd76aa0dc00a395e0 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Thu, 17 Jun 2021 18:52:11 +0530 Subject: [PATCH 057/138] build: build winconsoleio and _testconsole MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Modules/Setup | 2 +- setup.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Modules/Setup b/Modules/Setup index ecd64fe1bb3889..3097db66c900ad 100644 --- a/Modules/Setup +++ b/Modules/Setup @@ -120,7 +120,7 @@ _thread -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal _threadmodule.c # l _locale -DPy_BUILD_CORE_BUILTIN _localemodule.c # -lintl # Standard I/O baseline -_io -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal -I$(srcdir)/Modules/_io _io/_iomodule.c _io/iobase.c _io/fileio.c _io/bytesio.c _io/bufferedio.c _io/textio.c _io/stringio.c +_io -DPy_BUILD_CORE_BUILTIN -I$(srcdir)/Include/internal -I$(srcdir)/Modules/_io _io/_iomodule.c _io/iobase.c _io/fileio.c _io/bytesio.c _io/bufferedio.c _io/textio.c _io/stringio.c _io/winconsoleio.c # faulthandler module faulthandler faulthandler.c diff --git a/setup.py b/setup.py index d9fa7de52720c3..1dddfb36c3e714 100644 --- a/setup.py +++ b/setup.py @@ -1095,6 +1095,9 @@ def detect_test_extensions(self): ['_xxtestfuzz/_xxtestfuzz.c', '_xxtestfuzz/fuzzer.c'])) + if MS_WINDOWS: + self.add(Extension('_testconsole', ['../PC/_testconsole.c'])) + def detect_readline_curses(self): # readline readline_termcap_library = "" From bfb72572d2771b608f6405d0bebfedc59281145e Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Thu, 17 Jun 2021 18:52:12 +0530 Subject: [PATCH 058/138] expose sem_unlink MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Modules/_multiprocessing/multiprocessing.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_multiprocessing/multiprocessing.c b/Modules/_multiprocessing/multiprocessing.c index bec23517fca517..72a34d0a69ce90 100644 --- a/Modules/_multiprocessing/multiprocessing.c +++ b/Modules/_multiprocessing/multiprocessing.c @@ -172,7 +172,7 @@ static PyMethodDef module_methods[] = { _MULTIPROCESSING_RECV_METHODDEF _MULTIPROCESSING_SEND_METHODDEF #endif -#if !defined(POSIX_SEMAPHORES_NOT_ENABLED) && !defined(__ANDROID__) +#if defined(MS_WINDOWS) || (!defined(POSIX_SEMAPHORES_NOT_ENABLED) && !defined(__ANDROID__)) _MULTIPROCESSING_SEM_UNLINK_METHODDEF #endif {NULL} From 17ca0d16908282291777c62b731d61d78c200901 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Thu, 17 Jun 2021 18:52:14 +0530 Subject: [PATCH 059/138] cygpty isatty MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Include/iscygpty.h | 41 ++++++++++ Makefile.pre.in | 2 + Modules/_io/fileio.c | 3 +- Modules/main.c | 3 +- Modules/posixmodule.c | 3 +- Objects/fileobject.c | 3 +- Python/bltinmodule.c | 5 +- Python/fileutils.c | 7 +- Python/frozenmain.c | 3 +- Python/iscygpty.c | 185 ++++++++++++++++++++++++++++++++++++++++++ Python/pylifecycle.c | 5 +- 11 files changed, 248 insertions(+), 12 deletions(-) create mode 100644 Include/iscygpty.h create mode 100644 Python/iscygpty.c diff --git a/Include/iscygpty.h b/Include/iscygpty.h new file mode 100644 index 00000000000000..82fd0affbd4875 --- /dev/null +++ b/Include/iscygpty.h @@ -0,0 +1,41 @@ +/* + * iscygpty.h -- part of ptycheck + * https://github.com/k-takata/ptycheck + * + * Copyright (c) 2015-2017 K.Takata + * + * You can redistribute it and/or modify it under the terms of either + * the MIT license (as described below) or the Vim license. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef _ISCYGPTY_H +#define _ISCYGPTY_H + +#ifdef _WIN32 +int is_cygpty(int fd); +int is_cygpty_used(void); +#else +#define is_cygpty(fd) 0 +#define is_cygpty_used() 0 +#endif + +#endif /* _ISCYGPTY_H */ diff --git a/Makefile.pre.in b/Makefile.pre.in index 2823bea2dc2a50..50d802b1394872 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -368,6 +368,7 @@ PYTHON_OBJS= \ Python/import.o \ Python/importdl.o \ Python/initconfig.o \ + Python/iscygpty.o \ Python/marshal.o \ Python/modsupport.o \ Python/mysnprintf.o \ @@ -1072,6 +1073,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/import.h \ $(srcdir)/Include/interpreteridobject.h \ $(srcdir)/Include/intrcheck.h \ + $(srcdir)/Include/iscygpty.h \ $(srcdir)/Include/iterobject.h \ $(srcdir)/Include/listobject.h \ $(srcdir)/Include/longintrepr.h \ diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c index b9856b3b631657..66932d7053180d 100644 --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -19,6 +19,7 @@ #endif #include /* For offsetof */ #include "_iomodule.h" +#include "iscygpty.h" /* * Known likely problems: @@ -1127,7 +1128,7 @@ _io_FileIO_isatty_impl(fileio *self) return err_closed(); Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH - res = isatty(self->fd); + res = isatty(self->fd) || is_cygpty(self->fd); _Py_END_SUPPRESS_IPH Py_END_ALLOW_THREADS return PyBool_FromLong(res); diff --git a/Modules/main.c b/Modules/main.c index 2684d230672b94..9ee34a3c639771 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -6,6 +6,7 @@ #include "pycore_pathconfig.h" // _PyPathConfig_ComputeSysPath0() #include "pycore_pylifecycle.h" // _Py_PreInitializeFromPyArgv() #include "pycore_pystate.h" // _PyInterpreterState_GET() +#include "iscygpty.h" /* Includes for exit_sigint() */ #include // perror() @@ -91,7 +92,7 @@ static inline int config_run_code(const PyConfig *config) static int stdin_is_interactive(const PyConfig *config) { - return (isatty(fileno(stdin)) || config->interactive); + return (isatty(fileno(stdin)) || config->interactive || is_cygpty(fileno(stdin))); } diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 98e998e1800d43..7977e7efd3b36f 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -42,6 +42,7 @@ #ifdef __ANDROID__ # undef HAVE_FACCESSAT #endif +#include "iscygpty.h" #include /* needed for ctermid() */ @@ -10115,7 +10116,7 @@ os_isatty_impl(PyObject *module, int fd) int return_value; Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH - return_value = isatty(fd); + return_value = isatty(fd) || is_cygpty(fd); _Py_END_SUPPRESS_IPH Py_END_ALLOW_THREADS return return_value; diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 5a2816f55244b6..4fdb3c62d87840 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -2,6 +2,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "iscygpty.h" #include "pycore_runtime.h" // _PyRuntime #if defined(HAVE_GETC_UNLOCKED) && !defined(_Py_MEMORY_SANITIZER) @@ -423,7 +424,7 @@ stdprinter_isatty(PyStdPrinter_Object *self, PyObject *Py_UNUSED(ignored)) } Py_BEGIN_ALLOW_THREADS - res = isatty(self->fd); + res = isatty(self->fd) || is_cygpty(self->fd); Py_END_ALLOW_THREADS return PyBool_FromLong(res); diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index b0162e5e87217a..af694f3abcd2c3 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -1,6 +1,7 @@ /* Built-in functions */ #include "Python.h" +#include "iscygpty.h" #include #include "pycore_ast.h" // _PyAST_Validate() #include "pycore_compile.h" // _PyAST_Compile() @@ -2098,7 +2099,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt) Py_DECREF(tmp); if (fd < 0 && PyErr_Occurred()) return NULL; - tty = fd == fileno(stdin) && isatty(fd); + tty = fd == fileno(stdin) && (isatty(fd) || is_cygpty(fd)); } if (tty) { tmp = _PyObject_CallMethodIdNoArgs(fout, &PyId_fileno); @@ -2111,7 +2112,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt) Py_DECREF(tmp); if (fd < 0 && PyErr_Occurred()) return NULL; - tty = fd == fileno(stdout) && isatty(fd); + tty = fd == fileno(stdout) && (isatty(fd) || is_cygpty(fd)); } } diff --git a/Python/fileutils.c b/Python/fileutils.c index 1ee5476c48511d..45598c2b763856 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1,4 +1,5 @@ #include "Python.h" +#include "iscygpty.h" #include "pycore_fileutils.h" // fileutils definitions #include "pycore_runtime.h" // _PyRuntime #include "osdefs.h" // SEP @@ -69,7 +70,7 @@ _Py_device_encoding(int fd) int valid; Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH - valid = isatty(fd); + valid = isatty(fd) || is_cygpty(fd); _Py_END_SUPPRESS_IPH Py_END_ALLOW_THREADS if (!valid) @@ -1785,12 +1786,12 @@ _Py_write_impl(int fd, const void *buf, size_t count, int gil_held) depending on heap usage). */ if (gil_held) { Py_BEGIN_ALLOW_THREADS - if (isatty(fd)) { + if (isatty(fd) || is_cygpty(fd)) { count = 32767; } Py_END_ALLOW_THREADS } else { - if (isatty(fd)) { + if (isatty(fd) || is_cygpty(fd)) { count = 32767; } } diff --git a/Python/frozenmain.c b/Python/frozenmain.c index dd04d609d24f93..660776281c802f 100644 --- a/Python/frozenmain.c +++ b/Python/frozenmain.c @@ -4,6 +4,7 @@ #include "Python.h" #include "pycore_runtime.h" // _PyRuntime_Initialize() #include +#include "iscygpty.h" #ifdef MS_WINDOWS extern void PyWinFreeze_ExeInit(void); @@ -107,7 +108,7 @@ Py_FrozenMain(int argc, char **argv) else sts = 0; - if (inspect && isatty((int)fileno(stdin))) + if (inspect && (isatty((int)fileno(stdin)) || is_cygpty((int)fileno(stdin)))) sts = PyRun_AnyFile(stdin, "") != 0; #ifdef MS_WINDOWS diff --git a/Python/iscygpty.c b/Python/iscygpty.c new file mode 100644 index 00000000000000..722f88f2f46dcb --- /dev/null +++ b/Python/iscygpty.c @@ -0,0 +1,185 @@ +/* + * iscygpty.c -- part of ptycheck + * https://github.com/k-takata/ptycheck + * + * Copyright (c) 2015-2017 K.Takata + * + * You can redistribute it and/or modify it under the terms of either + * the MIT license (as described below) or the Vim license. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifdef _WIN32 + +#include +#include +#include +#include + +#ifdef USE_FILEEXTD +/* VC 7.1 or earlier doesn't support SAL. */ +# if !defined(_MSC_VER) || (_MSC_VER < 1400) +# define __out +# define __in +# define __in_opt +# endif +/* Win32 FileID API Library: + * http://www.microsoft.com/en-us/download/details.aspx?id=22599 + * Needed for WinXP. */ +# include +#else /* USE_FILEEXTD */ +/* VC 8 or earlier. */ +# if defined(_MSC_VER) && (_MSC_VER < 1500) +# ifdef ENABLE_STUB_IMPL +# define STUB_IMPL +# else +# error "Win32 FileID API Library is required for VC2005 or earlier." +# endif +# endif +#endif /* USE_FILEEXTD */ + + +#include "iscygpty.h" + +//#define USE_DYNFILEID +#ifdef USE_DYNFILEID +typedef BOOL (WINAPI *pfnGetFileInformationByHandleEx)( + HANDLE hFile, + FILE_INFO_BY_HANDLE_CLASS FileInformationClass, + LPVOID lpFileInformation, + DWORD dwBufferSize +); +static pfnGetFileInformationByHandleEx pGetFileInformationByHandleEx = NULL; + +# ifndef USE_FILEEXTD +static BOOL WINAPI stub_GetFileInformationByHandleEx( + HANDLE hFile, + FILE_INFO_BY_HANDLE_CLASS FileInformationClass, + LPVOID lpFileInformation, + DWORD dwBufferSize + ) +{ + return FALSE; +} +# endif + +static void setup_fileid_api(void) +{ + if (pGetFileInformationByHandleEx != NULL) { + return; + } + pGetFileInformationByHandleEx = (pfnGetFileInformationByHandleEx) + GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), + "GetFileInformationByHandleEx"); + if (pGetFileInformationByHandleEx == NULL) { +# ifdef USE_FILEEXTD + pGetFileInformationByHandleEx = GetFileInformationByHandleEx; +# else + pGetFileInformationByHandleEx = stub_GetFileInformationByHandleEx; +# endif + } +} +#else +# define pGetFileInformationByHandleEx GetFileInformationByHandleEx +# define setup_fileid_api() +#endif + + +#define is_wprefix(s, prefix) \ + (wcsncmp((s), (prefix), sizeof(prefix) / sizeof(WCHAR) - 1) == 0) + +/* Check if the fd is a cygwin/msys's pty. */ +int is_cygpty(int fd) +{ +#ifdef STUB_IMPL + return 0; +#else + HANDLE h; + int size = sizeof(FILE_NAME_INFO) + sizeof(WCHAR) * (MAX_PATH - 1); + FILE_NAME_INFO *nameinfo; + WCHAR *p = NULL; + + setup_fileid_api(); + + h = (HANDLE) _get_osfhandle(fd); + if (h == INVALID_HANDLE_VALUE) { + return 0; + } + /* Cygwin/msys's pty is a pipe. */ + if (GetFileType(h) != FILE_TYPE_PIPE) { + return 0; + } + nameinfo = malloc(size + sizeof(WCHAR)); + if (nameinfo == NULL) { + return 0; + } + /* Check the name of the pipe: + * '\{cygwin,msys}-XXXXXXXXXXXXXXXX-ptyN-{from,to}-master' */ + if (pGetFileInformationByHandleEx(h, FileNameInfo, nameinfo, size)) { + nameinfo->FileName[nameinfo->FileNameLength / sizeof(WCHAR)] = L'\0'; + p = nameinfo->FileName; + if (is_wprefix(p, L"\\cygwin-")) { /* Cygwin */ + p += 8; + } else if (is_wprefix(p, L"\\msys-")) { /* MSYS and MSYS2 */ + p += 6; + } else { + p = NULL; + } + if (p != NULL) { + while (*p && isxdigit(*p)) /* Skip 16-digit hexadecimal. */ + ++p; + if (is_wprefix(p, L"-pty")) { + p += 4; + } else { + p = NULL; + } + } + if (p != NULL) { + while (*p && isdigit(*p)) /* Skip pty number. */ + ++p; + if (is_wprefix(p, L"-from-master")) { + //p += 12; + } else if (is_wprefix(p, L"-to-master")) { + //p += 10; + } else { + p = NULL; + } + } + } + free(nameinfo); + return (p != NULL); +#endif /* STUB_IMPL */ +} + +/* Check if at least one cygwin/msys pty is used. */ +int is_cygpty_used(void) +{ + int fd, ret = 0; + + for (fd = 0; fd < 3; fd++) { + ret |= is_cygpty(fd); + } + return ret; +} + +#endif /* _WIN32 */ + +/* vim: set ts=4 sw=4: */ diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index eeaf20b4617a20..66056212c08b1d 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -15,6 +15,7 @@ #include "pycore_sysmodule.h" // _PySys_ClearAuditHooks() #include "pycore_traceback.h" // _Py_DumpTracebackThreads() +#include "iscygpty.h" #include // setlocale() #if defined(__APPLE__) @@ -2872,7 +2873,7 @@ Py_Exit(int sts) int Py_FdIsInteractive(FILE *fp, const char *filename) { - if (isatty((int)fileno(fp))) + if (isatty((int)fileno(fp)) || is_cygpty((int)fileno(fp))) return 1; if (!Py_InteractiveFlag) return 0; @@ -2885,7 +2886,7 @@ Py_FdIsInteractive(FILE *fp, const char *filename) int _Py_FdIsInteractive(FILE *fp, PyObject *filename) { - if (isatty((int)fileno(fp))) { + if (isatty((int)fileno(fp)) || is_cygpty((int)fileno(fp))) { return 1; } if (!Py_InteractiveFlag) { From 74f8964ec444f56ebcb9464cb0c0b883db650de4 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Thu, 17 Jun 2021 18:52:15 +0530 Subject: [PATCH 060/138] disable broken gdbm module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 1dddfb36c3e714..9340053ff085f5 100644 --- a/setup.py +++ b/setup.py @@ -1505,7 +1505,7 @@ class db_found(Exception): pass if dbm_args: dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":") else: - dbm_order = "ndbm:gdbm:bdb".split(":") + dbm_order = [] dbmext = None for cand in dbm_order: if cand == "ndbm": From 8826ac6768cf435757dec6afdf0c45ae3484a868 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Thu, 17 Jun 2021 18:52:16 +0530 Subject: [PATCH 061/138] build: link win resource files and build pythonw MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Makefile.pre.in | 26 +++++++++++++++++++++----- configure.ac | 26 ++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 50d802b1394872..c0924a29794d66 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -38,6 +38,7 @@ CXX= @CXX@ MAINCC= @MAINCC@ LINKCC= @LINKCC@ AR= @AR@ +WINDRES= @WINDRES@ READELF= @READELF@ SOABI= @SOABI@ LDVERSION= @LDVERSION@ @@ -118,6 +119,7 @@ PY_CORE_CFLAGS= $(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE PY_CORE_LDFLAGS=$(PY_LDFLAGS) $(PY_LDFLAGS_NODIST) # Strict or non-strict aliasing flags used to compile dtoa.c, see above CFLAGS_ALIASING=@CFLAGS_ALIASING@ +RCFLAGS=@RCFLAGS@ # Machine-dependent subdirectories @@ -265,6 +267,7 @@ LIBOBJS= @LIBOBJS@ PYTHON= python$(EXE) BUILDPYTHON= python$(BUILDEXE) +BUILDPYTHONW= pythonw$(BUILDEXE) PYTHON_FOR_REGEN?=@PYTHON_FOR_REGEN@ UPDATE_FILE=$(PYTHON_FOR_REGEN) $(srcdir)/Tools/scripts/update_file.py @@ -479,7 +482,7 @@ DTRACE_DEPS = \ # Default target all: @DEF_MAKE_ALL_RULE@ -build_all: check-clean-src $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks \ +build_all: check-clean-src $(BUILDPYTHON) $(BUILDPYTHONW) oldsharedmods sharedmods gdbhooks \ Programs/_testembed python-config # Check that the source is clean when building out of source. @@ -592,9 +595,21 @@ coverage-report: regen-token regen-importlib clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c $(PYTHON_FOR_REGEN) $(srcdir)/Tools/clinic/clinic.py --make --srcdir $(srcdir) +python_exe.o: $(srcdir)/PC/python_exe.rc + $(WINDRES) $(RCFLAGS) -I$(srcdir)/Include -I$(srcdir)/PC -I. $(srcdir)/PC/python_exe.rc $@ + +pythonw_exe.o: $(srcdir)/PC/pythonw_exe.rc + $(WINDRES) $(RCFLAGS) -I$(srcdir)/Include -I$(srcdir)/PC -I. $(srcdir)/PC/pythonw_exe.rc $@ + +python_nt.o: $(srcdir)/PC/python_nt.rc + $(WINDRES) $(RCFLAGS) -DORIGINAL_FILENAME=\\\"$(DLLLIBRARY)\\\" -I$(srcdir)/Include -I$(srcdir)/PC -I. $(srcdir)/PC/python_nt.rc $@ + +$(BUILDPYTHONW): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) pythonw_exe.o + $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -municode -mwindows -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) pythonw_exe.o + # Build the interpreter -$(BUILDPYTHON): Programs/python.o $(LIBRARY_DEPS) - $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) +$(BUILDPYTHON): Programs/python.o $(LIBRARY_DEPS) python_exe.o + $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -municode -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) python_exe.o platform: $(BUILDPYTHON) pybuilddir.txt $(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import sys ; from sysconfig import get_platform ; print("%s-%d.%d" % (get_platform(), *sys.version_info[:2]))' >platform @@ -704,10 +719,10 @@ $(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK): \ # This rule builds the Cygwin Python DLL and import library if configured # for a shared core library; otherwise, this rule is a noop. -$(DLLLIBRARY) libpython$(LDVERSION).dll.a: $(LIBRARY_OBJS) +$(DLLLIBRARY) libpython$(LDVERSION).dll.a: $(LIBRARY_OBJS) python_nt.o if test -n "$(DLLLIBRARY)"; then \ $(LDSHARED) -Wl,--out-implib=$@ -o $(DLLLIBRARY) $^ \ - $(LIBS) $(MODLIBS) $(SYSLIBS); \ + $(LIBS) $(MODLIBS) $(SYSLIBS) python_nt.o; \ else true; \ fi @@ -1340,6 +1355,7 @@ altbininstall: $(BUILDPYTHON) @FRAMEWORKPYTHONW@ done if test "$(PYTHONFRAMEWORKDIR)" = "no-framework" ; then \ $(INSTALL_PROGRAM) $(BUILDPYTHON) $(DESTDIR)$(BINDIR)/python$(LDVERSION)$(EXE); \ + $(INSTALL_PROGRAM) $(BUILDPYTHONW) $(DESTDIR)$(BINDIR)/python3w$(EXE); \ else \ $(INSTALL_PROGRAM) $(STRIPFLAG) Mac/pythonw $(DESTDIR)$(BINDIR)/python$(LDVERSION)$(EXE); \ fi diff --git a/configure.ac b/configure.ac index e6c41d7d1ac668..f73c9e6c8443b5 100644 --- a/configure.ac +++ b/configure.ac @@ -1337,6 +1337,9 @@ fi AC_MSG_RESULT($LDLIBRARY) +AC_SUBST(WINDRES) +AC_CHECK_TOOL(WINDRES, windres) + AC_SUBST(AR) AC_CHECK_TOOLS(AR, ar aal, ar) @@ -5937,10 +5940,33 @@ AC_MSG_RESULT(done) case $host in *-*-mingw*) LIBS="$LIBS -lversion -lshlwapi -lpathcch" + AC_PROG_AWK + if test "$AWK" = "gawk"; then + awk_extra_flag="--non-decimal-data" + fi + AC_MSG_CHECKING([FIELD3]) + FIELD3=$($AWK $awk_extra_flag '\ + /^#define PY_RELEASE_LEVEL_/ {levels[$2]=$3} \ + /^#define PY_MICRO_VERSION[[:space:]]+/ {micro=$3} \ + /^#define PY_RELEASE_LEVEL[[:space:]]+/ {level=levels[$3]} \ + /^#define PY_RELEASE_SERIAL[[:space:]]+/ {serial=$3} \ + END {print micro * 1000 + level * 10 + serial}' \ + $srcdir/Include/patchlevel.h + ) + + AC_MSG_RESULT([${FIELD3}]) + RCFLAGS="$RCFLAGS -DFIELD3=$FIELD3 -O COFF" + + case $host in + i686*) RCFLAGS="$RCFLAGS --target=pe-i386" ;; + x86_64*) RCFLAGS="$RCFLAGS --target=pe-x86-64" ;; + *) ;; + esac ;; *) ;; esac +AC_SUBST(RCFLAGS) # Availability of -O2: AC_MSG_CHECKING(for -O2) From 1f53554e26ad15a0ae1162b68f8aa5174f79c0dd Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Thu, 17 Jun 2021 18:52:17 +0530 Subject: [PATCH 062/138] disable readline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- setup.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/setup.py b/setup.py index 9340053ff085f5..dd3d90258b51dd 100644 --- a/setup.py +++ b/setup.py @@ -1166,6 +1166,8 @@ def detect_readline_curses(self): # readline package if find_file('readline/rlconf.h', self.inc_dirs, []) is None: do_readline = False + if MS_WINDOWS: + do_readline = False if do_readline: if MACOS and os_release < 9: # In every directory on the search path search for a dynamic From 83aa8cc71561688ab63e240f01e64bd234b2568d Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Thu, 17 Jun 2021 18:52:18 +0530 Subject: [PATCH 063/138] fix isselectable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Include/fileobject.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/fileobject.h b/Include/fileobject.h index 6ec2994aa859b6..a80f195d89de61 100644 --- a/Include/fileobject.h +++ b/Include/fileobject.h @@ -30,7 +30,7 @@ PyAPI_DATA(int) Py_UTF8Mode; #endif /* A routine to check if a file descriptor can be select()-ed. */ -#ifdef _MSC_VER +#ifdef MS_WINDOWS /* On Windows, any socket fd can be select()-ed, no matter how high */ #define _PyIsSelectable_fd(FD) (1) #else From 1a797d60b66a3152f0056e592f4a75789eedf54c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:52:19 +0530 Subject: [PATCH 064/138] use _wcsnicmp instead wcsncasecmp --- Modules/getpath.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/getpath.c b/Modules/getpath.c index e05787b72d8460..2b4ae2823d15da 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -427,7 +427,7 @@ add_exe_suffix(wchar_t **progpath_p) /* Check for already have an executable suffix */ size_t n = wcslen(progpath); size_t s = wcslen(EXE_SUFFIX); - if (wcsncasecmp(EXE_SUFFIX, progpath + n - s, s) == 0) { + if (_wcsnicmp(EXE_SUFFIX, progpath + n - s, s) == 0) { return _PyStatus_OK(); } From d2682efdc16a5cba3f9fafa54144521e9d368e14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:52:20 +0530 Subject: [PATCH 065/138] _xxsubinterpretersmodule --- Modules/_xxsubinterpretersmodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index 9290255c66c3fa..9d2952bc95bf0f 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -1761,7 +1761,7 @@ PyDoc_STRVAR(channelid_doc, "A channel ID identifies a channel and may be used as an int."); static PyTypeObject ChannelIDtype = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) + PyVarObject_HEAD_INIT(NULL, 0) "_xxsubinterpreters.ChannelID", /* tp_name */ sizeof(channelid), /* tp_basicsize */ 0, /* tp_itemsize */ From 27d5fd93127e211401a9e38f6ad5c561d017dd1c Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Thu, 17 Jun 2021 18:52:21 +0530 Subject: [PATCH 066/138] sqlite3 module defines --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index dd3d90258b51dd..f6923e19ab4848 100644 --- a/setup.py +++ b/setup.py @@ -1657,6 +1657,7 @@ def detect_sqlite(self): '_sqlite/statement.c', '_sqlite/util.c', ] sqlite_defines = [] + sqlite_defines.append(('MODULE_NAME', '"sqlite3"')) # Enable support for loadable extensions in the sqlite3 module # if --enable-loadable-sqlite-extensions configure option is used. From 3c9cb1b60828b06793798078689400a6117af559 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Thu, 17 Jun 2021 18:52:23 +0530 Subject: [PATCH 067/138] configure.ac: fix inet_pton check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- configure.ac | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/configure.ac b/configure.ac index f73c9e6c8443b5..dc1c49aee507b7 100644 --- a/configure.ac +++ b/configure.ac @@ -4299,10 +4299,14 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([[ AC_MSG_CHECKING(for inet_pton) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#ifdef _WIN32 +#include +#else #include #include #include #include +#endif ]], [[void* p = inet_pton]])], [AC_DEFINE(HAVE_INET_PTON, 1, Define if you have the 'inet_pton' function.) AC_MSG_RESULT(yes)], From 5de0c034634afd90a79a2352af831f317d9d69ec Mon Sep 17 00:00:00 2001 From: Dan Yeaw Date: Thu, 17 Jun 2021 18:52:25 +0530 Subject: [PATCH 068/138] set venv activate path unix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Lib/venv/scripts/common/activate | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/venv/scripts/common/activate b/Lib/venv/scripts/common/activate index 6fbc2b8801da04..9c3d58dfd61ed9 100644 --- a/Lib/venv/scripts/common/activate +++ b/Lib/venv/scripts/common/activate @@ -38,7 +38,7 @@ deactivate () { # unset irrelevant variables deactivate nondestructive -VIRTUAL_ENV="__VENV_DIR__" +VIRTUAL_ENV=$(cygpath "__VENV_DIR__") export VIRTUAL_ENV _OLD_VIRTUAL_PATH="$PATH" From 8dd652fbba83e70b8ba1a2ff2d5d78d5d92bf41e Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Thu, 17 Jun 2021 18:52:26 +0530 Subject: [PATCH 069/138] venv creation fixes Co-authored-by: Naveen M K --- Lib/venv/__init__.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index 88520085153579..86f9900412a229 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -11,6 +11,7 @@ import sys import sysconfig import types +from sysconfig import _POSIX_BUILD CORE_VENV_DEPS = ('pip', 'setuptools') @@ -124,7 +125,7 @@ def create_if_needed(d): context.executable = executable context.python_dir = dirname context.python_exe = exename - if sys.platform == 'win32': + if sys.platform == 'win32' and not _POSIX_BUILD: binname = 'Scripts' incpath = 'Include' libpath = os.path.join(env_dir, 'Lib', 'site-packages') @@ -271,7 +272,7 @@ def setup_python(self, context): if not os.path.islink(path): os.chmod(path, 0o755) else: - if self.symlinks: + if self.symlinks and not _POSIX_BUILD: # For symlinking, we need a complete copy of the root directory # If symlinks fail, you'll get unnecessary copies of files, but # we assume that if you've opted into symlinks on Windows then @@ -295,7 +296,13 @@ def setup_python(self, context): if os.path.lexists(src): copier(src, os.path.join(binpath, suffix)) - if sysconfig.is_python_build(True): + if _POSIX_BUILD: + # copy from python/pythonw so the venvlauncher magic in symlink_or_copy triggers + copier(os.path.join(dirname, 'python.exe'), os.path.join(binpath, 'python3.exe')) + copier(os.path.join(dirname, 'python.exe'), os.path.join(binpath, 'python%d.%d.exe' % sys.version_info[:2])) + copier(os.path.join(dirname, 'pythonw.exe'), os.path.join(binpath, 'python3w.exe')) + + if sysconfig.is_python_build(True) and not _POSIX_BUILD: # copy init.tcl for root, dirs, files in os.walk(context.python_dir): if 'init.tcl' in files: @@ -313,9 +320,11 @@ def _setup_pip(self, context): # We run ensurepip in isolated mode to avoid side effects from # environment vars, the current directory and anything else # intended for the global Python environment + env = os.environ.copy() + env.pop("MSYSTEM", None) cmd = [context.env_exec_cmd, '-Im', 'ensurepip', '--upgrade', '--default-pip'] - subprocess.check_output(cmd, stderr=subprocess.STDOUT) + subprocess.check_call(cmd, stderr=subprocess.STDOUT, env=env) def setup_scripts(self, context): """ From a3eea4caf328a13a707a05aaf7c9e638bf6f6006 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Thu, 17 Jun 2021 18:52:27 +0530 Subject: [PATCH 070/138] pass gen profile ldflags MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Makefile.pre.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index c0924a29794d66..887770beb8dbce 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -722,7 +722,7 @@ $(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK): \ $(DLLLIBRARY) libpython$(LDVERSION).dll.a: $(LIBRARY_OBJS) python_nt.o if test -n "$(DLLLIBRARY)"; then \ $(LDSHARED) -Wl,--out-implib=$@ -o $(DLLLIBRARY) $^ \ - $(LIBS) $(MODLIBS) $(SYSLIBS) python_nt.o; \ + $(LIBS) $(LDFLAGS_NODIST) $(MODLIBS) $(SYSLIBS) python_nt.o; \ else true; \ fi From c843bf54970f70bce0b14d90b20e3e5d71fec71b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:52:29 +0530 Subject: [PATCH 071/138] pkg config windows must link ext with python lib --- Misc/python.pc.in | 2 +- configure.ac | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Misc/python.pc.in b/Misc/python.pc.in index 87e04decc2a2d5..39001902558f87 100644 --- a/Misc/python.pc.in +++ b/Misc/python.pc.in @@ -9,5 +9,5 @@ Description: Build a C extension for Python Requires: Version: @VERSION@ Libs.private: @LIBS@ -Libs: +Libs: -L${libdir} -lpython@VERSION@@ABIFLAGS@ Cflags: -I${includedir}/python@VERSION@@ABIFLAGS@ diff --git a/configure.ac b/configure.ac index dc1c49aee507b7..bc9ac120b6d8b1 100644 --- a/configure.ac +++ b/configure.ac @@ -5174,7 +5174,7 @@ AC_MSG_RESULT($LDVERSION) # On Android and Cygwin the shared libraries must be linked with libpython. AC_SUBST(LIBPYTHON) -if test -n "$ANDROID_API_LEVEL" -o "$MACHDEP" = "cygwin"; then +if test -n "$ANDROID_API_LEVEL" -o "$MACHDEP" = "cygwin" -o "$MACHDEP" = "win32"; then LIBPYTHON="-lpython${VERSION}${ABIFLAGS}" else LIBPYTHON='' From e7c49a908adfabdf7e3dbf6cd5c38bd1d4a22221 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Thu, 17 Jun 2021 18:52:30 +0530 Subject: [PATCH 072/138] importlib bootstrap path sep MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Naveen M K --- Lib/importlib/_bootstrap_external.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 49bcaea78d7650..3a9f8764b455f2 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -42,6 +42,10 @@ path_separators = ['\\', '/'] else: path_separators = ['/'] + +if 'MSYSTEM' in _os.environ: + path_separators = path_separators[::-1] + # Assumption made in _path_join() assert all(len(sep) == 1 for sep in path_separators) path_sep = path_separators[0] From e8871d5b6c8dd351a20b5549526cbb0ab4b03d64 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Thu, 17 Jun 2021 18:52:31 +0530 Subject: [PATCH 073/138] pathlib path sep --- Lib/pathlib.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 97b23ca45a3a19..035892fbf384e2 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -115,6 +115,8 @@ class _WindowsFlavour(_Flavour): sep = '\\' altsep = '/' + if 'MSYSTEM' in os.environ: + sep, altsep = altsep, sep has_drv = True pathmod = ntpath From a162a1d6105e20d0645b0b8f343676185267eec2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:52:33 +0530 Subject: [PATCH 074/138] warnings fixes --- Modules/_winapi.c | 2 +- Modules/posixmodule.c | 6 +++--- Modules/socketmodule.h | 2 ++ PC/python_exe.rc | 2 +- PC/pythonw_exe.rc | 2 +- PC/winreg.c | 1 + Python/thread_nt.h | 3 ++- 7 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Modules/_winapi.c b/Modules/_winapi.c index 4d88e339f41739..c479a92e51d611 100644 --- a/Modules/_winapi.c +++ b/Modules/_winapi.c @@ -959,7 +959,7 @@ getattributelist(PyObject *obj, const char *name, AttributeList *attribute_list) DWORD err; BOOL result; PyObject *value; - Py_ssize_t handle_list_size; + Py_ssize_t handle_list_size = 0; DWORD attribute_count = 0; SIZE_T attribute_list_size = 0; diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 7977e7efd3b36f..0334759aa9178a 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -5406,7 +5406,7 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, /*[clinic end generated code: output=cfcac69d027b82cf input=2fbd62a2f228f8f4]*/ { #ifdef MS_WINDOWS - HANDLE hFile; + HANDLE hFile = 0; FILETIME atime, mtime; #else int result; @@ -14593,7 +14593,7 @@ os__add_dll_directory_impl(PyObject *module, path_t *path) loaded. */ Py_BEGIN_ALLOW_THREADS if (!(hKernel32 = GetModuleHandleW(L"kernel32")) || - !(AddDllDirectory = (PAddDllDirectory)GetProcAddress( + !(AddDllDirectory = (PAddDllDirectory)(void *)GetProcAddress( hKernel32, "AddDllDirectory")) || !(cookie = (*AddDllDirectory)(path->wide))) { err = GetLastError(); @@ -14643,7 +14643,7 @@ os__remove_dll_directory_impl(PyObject *module, PyObject *cookie) loaded. */ Py_BEGIN_ALLOW_THREADS if (!(hKernel32 = GetModuleHandleW(L"kernel32")) || - !(RemoveDllDirectory = (PRemoveDllDirectory)GetProcAddress( + !(RemoveDllDirectory = (PRemoveDllDirectory)(void *)GetProcAddress( hKernel32, "RemoveDllDirectory")) || !(*RemoveDllDirectory)(cookieValue)) { err = GetLastError(); diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h index e4f375d5e8100a..bbdd8c0c4706d8 100644 --- a/Modules/socketmodule.h +++ b/Modules/socketmodule.h @@ -70,8 +70,10 @@ struct SOCKADDR_BTH_REDEF { */ # ifdef SIO_GET_MULTICAST_FILTER # include /* for SIO_RCVALL */ +#ifndef __MINGW32__ /* resolve by configure */ # define HAVE_ADDRINFO # define HAVE_SOCKADDR_STORAGE +#endif # define HAVE_GETADDRINFO # define HAVE_GETNAMEINFO # define ENABLE_IPV6 diff --git a/PC/python_exe.rc b/PC/python_exe.rc index c3d3bff019895e..dde0e5384201fa 100644 --- a/PC/python_exe.rc +++ b/PC/python_exe.rc @@ -12,7 +12,7 @@ // current versions of Windows. 1 RT_MANIFEST "python.manifest" -1 ICON DISCARDABLE "icons\python.ico" +1 ICON DISCARDABLE "icons/python.ico" ///////////////////////////////////////////////////////////////////////////// diff --git a/PC/pythonw_exe.rc b/PC/pythonw_exe.rc index 38570b74fa3e02..7ce1043298eac4 100644 --- a/PC/pythonw_exe.rc +++ b/PC/pythonw_exe.rc @@ -12,7 +12,7 @@ // current versions of Windows. 1 RT_MANIFEST "python.manifest" -1 ICON DISCARDABLE "icons\pythonw.ico" +1 ICON DISCARDABLE "icons/pythonw.ico" ///////////////////////////////////////////////////////////////////////////// diff --git a/PC/winreg.c b/PC/winreg.c index 00de52b97648b1..d53f028be16ab4 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -813,6 +813,7 @@ Reg2Py(BYTE *retDataBuf, DWORD retDataSize, DWORD typ) case REG_BINARY: /* ALSO handle ALL unknown data types here. Even if we can't support it natively, we should handle the bits. */ + /* fallthrough */ default: if (retDataSize == 0) { Py_INCREF(Py_None); diff --git a/Python/thread_nt.h b/Python/thread_nt.h index 0ce5e94f89bf72..6a6fe7e39653cf 100644 --- a/Python/thread_nt.h +++ b/Python/thread_nt.h @@ -349,8 +349,9 @@ PyThread_release_lock(PyThread_type_lock aLock) { dprintf(("%lu: PyThread_release_lock(%p) called\n", PyThread_get_thread_ident(),aLock)); - if (!(aLock && LeaveNonRecursiveMutex((PNRMUTEX) aLock))) + if (!(aLock && LeaveNonRecursiveMutex((PNRMUTEX) aLock))) { dprintf(("%lu: Could not PyThread_release_lock(%p) error: %ld\n", PyThread_get_thread_ident(), aLock, GetLastError())); + } } /* minimum/maximum thread stack sizes supported */ From 5101712ef1c038585bf8e80e6eec25480029c0a8 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Thu, 17 Jun 2021 18:52:34 +0530 Subject: [PATCH 075/138] fix build testinternalcapi --- setup.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/setup.py b/setup.py index f6923e19ab4848..ff49ea9db732c0 100644 --- a/setup.py +++ b/setup.py @@ -1078,7 +1078,11 @@ def detect_test_extensions(self): depends=['testcapi_long.h'])) # Python Internal C API test module + macros = [] + if MS_WINDOWS: + macros.append(('PY3_DLLNAME', 'L"%s"' % sysconfig.get_config_var('DLLLIBRARY'))) self.add(Extension('_testinternalcapi', ['_testinternalcapi.c'], + define_macros=macros, extra_compile_args=['-DPy_BUILD_CORE_MODULE'])) # Python PEP-3118 (buffer protocol) test module From 285997eefe2e38e10e751494a8002ad064652ef3 Mon Sep 17 00:00:00 2001 From: Long Nguyen Date: Thu, 17 Jun 2021 18:52:34 +0530 Subject: [PATCH 076/138] extend MS_WINDOWS flag --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ff49ea9db732c0..d48652988d5ee1 100644 --- a/setup.py +++ b/setup.py @@ -92,7 +92,7 @@ def msys_system(command): CROSS_COMPILING = ("_PYTHON_HOST_PLATFORM" in os.environ) HOST_PLATFORM = get_platform() -MS_WINDOWS = (HOST_PLATFORM == 'win32') +MS_WINDOWS = (HOST_PLATFORM == 'win32' or HOST_PLATFORM == 'mingw') CYGWIN = (HOST_PLATFORM == 'cygwin') MACOS = (HOST_PLATFORM == 'darwin') AIX = (HOST_PLATFORM.startswith('aix')) From 19e72e5452c42cedae7ab4690707cd1c88be9535 Mon Sep 17 00:00:00 2001 From: jeremyd2019 <4524874+jeremyd2019@users.noreply.github.com> Date: Thu, 17 Jun 2021 18:52:36 +0530 Subject: [PATCH 077/138] clang arm64 Co-authored-by: Naveen M K --- Python/getcompiler.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Python/getcompiler.c b/Python/getcompiler.c index 3e31c80bdf4fb1..7e7be712a6fbdd 100644 --- a/Python/getcompiler.c +++ b/Python/getcompiler.c @@ -7,7 +7,7 @@ // Note the __clang__ conditional has to come before the __GNUC__ one because // clang pretends to be GCC. -#if defined(__clang__) +#if defined(__clang__) && !defined(_WIN32) #define COMPILER "[Clang " __clang_version__ "]" #elif defined(__GNUC__) /* To not break compatibility with things that determine @@ -18,6 +18,8 @@ #define COMP_SEP " " #if defined(__x86_64__) #define ARCH_SUFFIX " 64 bit (AMD64)" +#elif defined(__aarch64__) +#define ARCH_SUFFIX " 64 bit (ARM64)" #else #define ARCH_SUFFIX " 32 bit" #endif @@ -25,7 +27,14 @@ #define COMP_SEP "\n" #define ARCH_SUFFIX "" #endif +#if defined(__clang__) +#define str(x) #x +#define xstr(x) str(x) +#define COMPILER COMP_SEP "[GCC Clang " xstr(__clang_major__) "." \ + xstr(__clang_minor__) "." xstr(__clang_patchlevel__) ARCH_SUFFIX "]" +#else #define COMPILER COMP_SEP "[GCC " __VERSION__ ARCH_SUFFIX "]" +#endif // Generic fallbacks. #elif defined(__cplusplus) #define COMPILER "[C++]" From 77ae4969234e68d4ec03ca2b357909f2d9d24b52 Mon Sep 17 00:00:00 2001 From: jeremyd2019 <4524874+jeremyd2019@users.noreply.github.com> Date: Thu, 17 Jun 2021 18:52:37 +0530 Subject: [PATCH 078/138] configure.ac: set MINGW stack reserve --- configure.ac | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/configure.ac b/configure.ac index bc9ac120b6d8b1..20514be6a727f5 100644 --- a/configure.ac +++ b/configure.ac @@ -3112,6 +3112,11 @@ then VxWorks*) LINKFORSHARED='-Wl,-export-dynamic';; esac + case $host in + *-*-mingw*) + # for https://bugs.python.org/issue40458 on MINGW + LINKFORSHARED="-Wl,--stack,2000000";; + esac fi AC_MSG_RESULT($LINKFORSHARED) From d22b4354caac766648b511ae6f6340b61599eb48 Mon Sep 17 00:00:00 2001 From: Naveen M K Date: Fri, 18 Jun 2021 12:38:11 +0530 Subject: [PATCH 079/138] Don't use os.pathsep to find EOF not all distributions in win32 have them as \ instead check using sys.platform Signed-off-by: Naveen M K --- Lib/site.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/site.py b/Lib/site.py index e460a3d881241c..49c6ce06d4cfcd 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -401,7 +401,7 @@ def setquit(): The repr of each object contains a hint at how it works. """ - if os.sep == '\\': + if sys.platform == 'win32': eof = 'Ctrl-Z plus Return' else: eof = 'Ctrl-D (i.e. EOF)' From 347d8e4b1dd5e783b02a8310495a613a22ac17ae Mon Sep 17 00:00:00 2001 From: Naveen M K Date: Wed, 23 Jun 2021 18:12:12 +0530 Subject: [PATCH 080/138] Fix extension suffix for c-extensions on mingw Python is compiled with various compilers which previously had same platform tags or extension suffix. This can be error prone while loading c-extensions, so now each compiler or runtime has a different extension suffix. Also, changed all extension to end with .pyd rather than .dll file. Fixes https://github.com/msys2/MINGW-packages/issues/8843 Signed-off-by: Naveen M K --- Makefile.pre.in | 6 ++-- Python/dynload_win.c | 6 ---- configure.ac | 77 +++++++++++++++++++++++++++++++++++++++----- 3 files changed, 72 insertions(+), 17 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 887770beb8dbce..77730b85f064d8 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -166,6 +166,7 @@ CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(LDVERSION) # Symbols used for using shared libraries SHLIB_SUFFIX= @SHLIB_SUFFIX@ EXT_SUFFIX= @EXT_SUFFIX@ +PYD_PLATFORM_TAG = @PYD_PLATFORM_TAG@ LDSHARED= @LDSHARED@ $(PY_LDFLAGS) BLDSHARED= @BLDSHARED@ $(PY_CORE_LDFLAGS) LDCXXSHARED= @LDCXXSHARED@ @@ -850,8 +851,7 @@ Python/dynload_hpux.o: $(srcdir)/Python/dynload_hpux.c Makefile Python/dynload_win.o: $(srcdir)/Python/dynload_win.c Makefile $(CC) -c $(PY_CORE_CFLAGS) \ - -DSHLIB_SUFFIX='"$(SHLIB_SUFFIX)"' \ - -DEXT_SUFFIX='"$(EXT_SUFFIX)"' \ + -DPYD_PLATFORM_TAG='"$(PYD_PLATFORM_TAG)"' \ -o $@ $(srcdir)/Python/dynload_win.c Python/sysmodule.o: $(srcdir)/Python/sysmodule.c Makefile $(srcdir)/Include/pydtrace.h @@ -1740,7 +1740,7 @@ libainstall: @DEF_MAKE_RULE@ python-config @if test "$(STATIC_LIBPYTHON)" = 1; then \ if test -d $(LIBRARY); then :; else \ if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \ - if test "$(SHLIB_SUFFIX)" = .dll; then \ + if test "$(SHLIB_SUFFIX)" = .dll -o "$(SHLIB_SUFFIX)" = .pyd; then \ $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \ else \ $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \ diff --git a/Python/dynload_win.c b/Python/dynload_win.c index 1083fe8a95c2b9..c46061c54db138 100644 --- a/Python/dynload_win.c +++ b/Python/dynload_win.c @@ -27,12 +27,6 @@ #define PYD_UNTAGGED_SUFFIX PYD_DEBUG_SUFFIX ".pyd" const char *_PyImport_DynLoadFiletab[] = { -#ifdef EXT_SUFFIX - EXT_SUFFIX, /* include SOABI flags where is encoded debug */ -#endif -#ifdef SHLIB_SUFFIX - "-abi" PYTHON_ABI_STRING SHLIB_SUFFIX, -#endif PYD_TAGGED_SUFFIX, PYD_UNTAGGED_SUFFIX, NULL diff --git a/configure.ac b/configure.ac index 20514be6a727f5..a66b92fb19b64d 100644 --- a/configure.ac +++ b/configure.ac @@ -2875,7 +2875,7 @@ if test -z "$SHLIB_SUFFIX"; then *) SHLIB_SUFFIX=.so;; esac case $host_os in - mingw*) SHLIB_SUFFIX=.dll;; + mingw*) SHLIB_SUFFIX=.pyd;; esac fi AC_MSG_RESULT($SHLIB_SUFFIX) @@ -5139,6 +5139,68 @@ esac # check for endianness AC_C_BIGENDIAN +AC_SUBST(PYD_PLATFORM_TAG) +# Special case of PYD_PLATFORM_TAG with python build with mingw. +# Python can with compiled with clang or gcc and linked +# to msvcrt or ucrt. To avoid conflicts between them +# we are selecting the extension as based on the compiler +# and the runtime they link to +# gcc + x86_64 + msvcrt = cp{version number}-x86_64 +# gcc + i686 + msvcrt = cp{version number}-i686 +# gcc + x86_64 + ucrt = cp{version number}-x86_64-ucrt +# clang + x86_64 + ucrt = cp{version number}-x86_64-clang +# clang + i686 + ucrt = cp{version number}-i686-clang + +PYD_PLATFORM_TAG="" +case $host in + *-*-mingw*) + # check if we are linking to ucrt + AC_MSG_CHECKING(whether linking to ucrt) + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ + #include + #ifndef _UCRT + #error no ucrt + #endif + int main(){ return 0; } + ]])],[linking_to_ucrt=yes],[linking_to_ucrt=no]) + AC_MSG_RESULT($linking_to_ucrt) + ;; +esac +case $host_os in + mingw*) + AC_MSG_CHECKING(PYD_PLATFORM_TAG) + case $host in + i686-*-mingw*) + if test -n "${cc_is_clang}"; then + # it is CLANG32 + PYD_PLATFORM_TAG="mingw_i686_clang" + else + if test $linking_to_ucrt = no; then + PYD_PLATFORM_TAG="mingw_i686" + else + PYD_PLATFORM_TAG="mingw_i686_ucrt" + fi + fi + ;; + x86_64-*-mingw*) + if test -n "${cc_is_clang}"; then + # it is CLANG64 + PYD_PLATFORM_TAG="mingw_x86_64_clang" + else + if test $linking_to_ucrt = no; then + PYD_PLATFORM_TAG="mingw_x86_64" + else + PYD_PLATFORM_TAG="mingw_x86_64_ucrt" + fi + fi + ;; + aarch64-*-mingw*) + PYD_PLATFORM_TAG+="mingw_aarch64" + ;; + esac + AC_MSG_RESULT($PYD_PLATFORM_TAG) +esac + # ABI version string for Python extension modules. This appears between the # periods in shared library file names, e.g. foo..so. It is calculated # from the following attributes which affect the ABI of this Python build (in @@ -5171,7 +5233,12 @@ if test "$Py_DEBUG" = 'true' -a "$with_trace_refs" != "yes"; then fi AC_SUBST(EXT_SUFFIX) -EXT_SUFFIX=.${SOABI}${SHLIB_SUFFIX} +VERSION_NO_DOTS=$(echo $LDVERSION | tr -d .) +if test -n "${PYD_PLATFORM_TAG}"; then + EXT_SUFFIX=".cp${VERSION_NO_DOTS}-${PYD_PLATFORM_TAG}${SHLIB_SUFFIX}" +else + EXT_SUFFIX=.${SOABI}${SHLIB_SUFFIX} +fi AC_MSG_CHECKING(LDVERSION) LDVERSION='$(VERSION)$(ABIFLAGS)' @@ -5891,12 +5958,6 @@ case "$ac_cv_computed_gotos" in yes*) AC_DEFINE(HAVE_COMPUTED_GOTOS, 1, [Define if the C compiler supports computed gotos.]) esac -case $host_os in - mingw*) - dnl Synchronized with _PyImport_DynLoadFiletab (dynload_win.c) - dnl Do not use more then one dot on this platform ! - EXT_SUFFIX=-$SOABI$SHLIB_SUFFIX;; -esac case $ac_sys_system in AIX*) From 8ce3fed649369681a7b0d55aaec9a8d8fa9509af Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Tue, 21 Sep 2021 21:36:58 +0200 Subject: [PATCH 081/138] Change the `get_platform()` method in sysconfig This would possibly fix building wheels when mingw python is used and would be unique to each python same as EXT_SUFFIX. Also, this modifies the `sys.version` argument to include UCRT in it. Signed-off-by: Naveen M K --- Lib/sysconfig.py | 16 ++++++++++++++-- Python/getcompiler.c | 4 ++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index d435b40146bcd0..61f3cc6a2e6390 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -721,8 +721,20 @@ def get_platform(): """ if os.name == 'nt': - if 'GCC' in sys.version: - return 'mingw' + if 'gcc' in sys.version.lower(): + if 'ucrt' in sys.version.lower(): + if 'amd64' in sys.version.lower(): + return 'mingw_x86_64_ucrt' + return 'mingw_i686_ucrt' + if 'clang' in sys.version.lower(): + if 'amd64' in sys.version.lower(): + return 'mingw_x86_64_clang' + if 'arm64' in sys.version.lower(): + return 'mingw_aarch64' + return 'mingw_i686_clang' + if 'amd64' in sys.version.lower(): + return 'mingw_x86_64' + return 'mingw_i686' if 'amd64' in sys.version.lower(): return 'win-amd64' if '(arm)' in sys.version.lower(): diff --git a/Python/getcompiler.c b/Python/getcompiler.c index 7e7be712a6fbdd..275f79997b4241 100644 --- a/Python/getcompiler.c +++ b/Python/getcompiler.c @@ -33,8 +33,12 @@ #define COMPILER COMP_SEP "[GCC Clang " xstr(__clang_major__) "." \ xstr(__clang_minor__) "." xstr(__clang_patchlevel__) ARCH_SUFFIX "]" #else +#if defined(_UCRT) +#define COMPILER COMP_SEP "[GCC UCRT " __VERSION__ ARCH_SUFFIX "]" +#else #define COMPILER COMP_SEP "[GCC " __VERSION__ ARCH_SUFFIX "]" #endif +#endif // Generic fallbacks. #elif defined(__cplusplus) #define COMPILER "[C++]" From 457dc70f46b1b4f89da88785ddb984fc67d10268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:21 +0530 Subject: [PATCH 082/138] distutils: compiler customize mingw cygwin compilers Co-authored-by: Naveen M K --- Lib/distutils/sysconfig.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py index 3414a761e76b99..cb39cd66705a3c 100644 --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -201,7 +201,23 @@ def customize_compiler(compiler): Mainly needed on Unix, so we can plug in the information that varies across Unices and is stored in Python's Makefile. """ - if compiler.compiler_type == "unix": + global _config_vars + if compiler.compiler_type in ["cygwin", "mingw32"]: + # Note that cygwin use posix build and 'unix' compiler. + # If build is not based on posix then we must predefine + # some environment variables corresponding to posix + # build rules and defaults. + if not 'GCC' in sys.version: + _config_vars['CC'] = "gcc" + _config_vars['CXX'] = "g++" + _config_vars['OPT'] = "-fwrapv -O3 -Wall -Wstrict-prototypes" + _config_vars['CFLAGS'] = "" + _config_vars['CCSHARED'] = "" + _config_vars['LDSHARED'] = "gcc -shared -Wl,--enable-auto-image-base" + _config_vars['AR'] = "ar" + _config_vars['ARFLAGS'] = "rc" + + if compiler.compiler_type in ["unix", "cygwin", "mingw32"]: if sys.platform == "darwin": # Perform first-time customization of compiler-related # config vars on OS X now that we know we need a compiler. From 09974601655abb83f0713745f365f2e00e939f01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:22 +0530 Subject: [PATCH 083/138] distutils: compiler enable new dtags MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Lib/distutils/unixccompiler.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py index d00c48981eb6d6..76a7d824760d60 100644 --- a/Lib/distutils/unixccompiler.py +++ b/Lib/distutils/unixccompiler.py @@ -249,9 +249,13 @@ def runtime_library_dir_option(self, dir): # -Wl whenever gcc was used in the past it is probably # safest to keep doing so. if sysconfig.get_config_var("GNULD") == "yes": - # GNU ld needs an extra option to get a RUNPATH + # GNU ELF ld needs an extra option to get a RUNPATH # instead of just an RPATH. - return "-Wl,--enable-new-dtags,-R" + dir + if sys.platform in ["win32", "cygwin"] or \ + "mingw" in compiler: + return [] + else: + return "-Wl,--enable-new-dtags,-R" + dir else: return "-Wl,-R" + dir else: From f8dbbfce50ed4b42c899e9ad364656f788f25a39 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Tue, 21 Sep 2021 20:52:22 +0200 Subject: [PATCH 084/138] distutils: MINGW build extensions with GCC --- Lib/distutils/command/build_ext.py | 16 +++++++++++++++- Lib/distutils/util.py | 2 ++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py index 1a9bd1200f8235..1c9d471992633b 100644 --- a/Lib/distutils/command/build_ext.py +++ b/Lib/distutils/command/build_ext.py @@ -186,7 +186,7 @@ def finalize_options(self): # for extensions under windows use different directories # for Release and Debug builds. # also Python's library directory must be appended to library_dirs - if os.name == 'nt': + if os.name == 'nt' and not self.plat_name.startswith(('mingw')): # 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. @@ -712,6 +712,20 @@ def get_libraries(self, ext): # pyconfig.h that MSVC groks. The other Windows compilers all seem # to need it mentioned explicitly, though, so that's what we do. # Append '_d' to the python import library on debug builds. + + # Use self.plat_name as it works even in case of + # cross-compilation (at least for mingw build). + if self.plat_name.startswith('mingw'): + from distutils import sysconfig + extra = [] + for lib in ( + sysconfig.get_config_var('BLDLIBRARY').split() + + sysconfig.get_config_var('SHLIBS').split() + ): + if lib.startswith('-l'): + extra.append(lib[2:]) + return ext.libraries + extra + if sys.platform == "win32": from distutils._msvccompiler import MSVCCompiler if not isinstance(self.compiler, MSVCCompiler): diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py index 2ce5c5b64d62fa..fb7d1ad3f8ab37 100644 --- a/Lib/distutils/util.py +++ b/Lib/distutils/util.py @@ -37,6 +37,8 @@ def get_host_platform(): """ if os.name == 'nt': + if 'GCC' in sys.version: + return 'mingw' if 'amd64' in sys.version.lower(): return 'win-amd64' if '(arm)' in sys.version.lower(): From 64b97c8480ede9a949be0c3e0544baab662403d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:35 +0530 Subject: [PATCH 085/138] distutils: use Mingw32CCompiler as default compiler for m MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Lib/distutils/ccompiler.py | 4 +++- Lib/distutils/cygwinccompiler.py | 11 ++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Lib/distutils/ccompiler.py b/Lib/distutils/ccompiler.py index 4c47f2ed245d4f..ab61a867292890 100644 --- a/Lib/distutils/ccompiler.py +++ b/Lib/distutils/ccompiler.py @@ -9,7 +9,7 @@ from distutils.file_util import move_file from distutils.dir_util import mkpath from distutils.dep_util import newer_group -from distutils.util import split_quoted, execute +from distutils.util import split_quoted, execute, get_platform from distutils import log class CCompiler: @@ -948,6 +948,8 @@ def get_default_compiler(osname=None, platform=None): osname = os.name if platform is None: platform = sys.platform + if get_platform().startswith('mingw'): + return 'mingw32' for pattern, compiler in _default_compilers: if re.match(pattern, platform) is not None or \ re.match(pattern, osname) is not None: diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py index 66c12dd35830b2..1960ef8c9f0494 100644 --- a/Lib/distutils/cygwinccompiler.py +++ b/Lib/distutils/cygwinccompiler.py @@ -253,11 +253,16 @@ def object_filenames(self, source_filenames, strip_dir=0, output_dir=''): output_dir = '' obj_names = [] for src_name in source_filenames: - # use normcase to make sure '.rc' is really '.rc' and not '.RC' - base, ext = os.path.splitext(os.path.normcase(src_name)) + base, ext = os.path.splitext(src_name) + # use 'normcase' only for resource suffixes + ext_normcase = os.path.normcase(ext) + if ext_normcase in ['.rc','.res']: + ext = ext_normcase if ext not in (self.src_extensions + ['.rc','.res']): raise UnknownFileError("unknown file type '%s' (from '%s')" % \ (ext, src_name)) + base = os.path.splitdrive(base)[1] # Chop off the drive + base = base[os.path.isabs(base):] # If abs, chop off leading / if strip_dir: base = os.path.basename (base) if ext in ('.res', '.rc'): @@ -313,7 +318,7 @@ def __init__(self, verbose=0, dry_run=0, force=0): # Include the appropriate MSVC runtime library if Python was built # with MSVC 7.0 or later. - self.dll_libraries = get_msvcr() + self.dll_libraries = get_msvcr() or [] # Because these compilers aren't configured in Python's pyconfig.h file by # default, we should at least warn the user if he is using an unmodified From d2b7729abf961a200b889c3534a6eb15ad7e8cc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:36 +0530 Subject: [PATCH 086/138] distutils: find import library MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Lib/distutils/cygwinccompiler.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py index 1960ef8c9f0494..39ad631fd0d7f6 100644 --- a/Lib/distutils/cygwinccompiler.py +++ b/Lib/distutils/cygwinccompiler.py @@ -91,6 +91,7 @@ class CygwinCCompiler(UnixCCompiler): obj_extension = ".o" static_lib_extension = ".a" shared_lib_extension = ".dll" + dylib_lib_extension = ".dll.a" static_lib_format = "lib%s%s" shared_lib_format = "%s%s" exe_extension = ".exe" From 1886ce36ebe4eaf3dc12c70a600d12f24ce9490a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:41 +0530 Subject: [PATCH 087/138] distutils: avoid circular dependency from time module dur MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Lib/distutils/cygwinccompiler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py index 39ad631fd0d7f6..5b281e28cd6869 100644 --- a/Lib/distutils/cygwinccompiler.py +++ b/Lib/distutils/cygwinccompiler.py @@ -48,7 +48,6 @@ import os import sys import copy -from subprocess import Popen, PIPE, check_output import re from distutils.unixccompiler import UnixCCompiler @@ -383,6 +382,7 @@ def _find_exe_version(cmd): executable = cmd.split()[0] if find_executable(executable) is None: return None + from subprocess import Popen, PIPE out = Popen(cmd, shell=True, stdout=PIPE).stdout try: out_string = out.read() From 248ecc3d2a819008923eb17ceb76e94368bc05ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:41 +0530 Subject: [PATCH 088/138] distutils: generalization of posix build in distutils sys Co-authored-by: Naveen M K --- Lib/distutils/sysconfig.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py index cb39cd66705a3c..3c7b766b608bb4 100644 --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -69,8 +69,23 @@ def parse_config_h(fp, g=None): _python_build = partial(is_python_build, check_home=True) _init_posix = partial(sysconfig_init_posix, _config_vars) -_init_nt = partial(_init_non_posix, _config_vars) +def _posix_build(): + # GCC[mingw*] use posix build system + # Check for cross builds explicitly + host_platform = os.environ.get("_PYTHON_HOST_PLATFORM") + if host_platform: + if host_platform.startswith('mingw'): + return True + return os.name == 'posix' or \ + (os.name == "nt" and 'GCC' in sys.version) +posix_build = _posix_build() + + +def _init_nt(): + if posix_build: + return _init_posix(_config_vars) + return _init_non_posix(_config_vars) # Similar function is also implemented in sysconfig as _parse_makefile # but without the parsing capabilities of distutils.text_file.TextFile. @@ -295,7 +310,7 @@ def get_python_inc(plat_specific=0, prefix=None): """ if prefix is None: prefix = plat_specific and BASE_EXEC_PREFIX or BASE_PREFIX - if os.name == "posix": + if posix_build: if python_build: # Assume the executable is in the build directory. The # pyconfig.h file should be in the same directory. Since @@ -342,7 +357,7 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None): else: prefix = plat_specific and EXEC_PREFIX or PREFIX - if os.name == "posix": + if posix_build: if plat_specific or standard_lib: # Platform-specific modules (any module from a non-pure-Python # module distribution) or standard Python library modules. From e816e9144a7a8891355bd932c500670681211c2c Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Tue, 21 Sep 2021 20:53:29 +0200 Subject: [PATCH 089/138] distutils: mingw sysconfig like posix --- Lib/distutils/command/build_ext.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py index 1c9d471992633b..1dbdfe0e30ba80 100644 --- a/Lib/distutils/command/build_ext.py +++ b/Lib/distutils/command/build_ext.py @@ -221,9 +221,10 @@ def finalize_options(self): if sys.platform[:6] == 'cygwin': if sys.executable.startswith(os.path.join(sys.exec_prefix, "bin")): # building third party extensions + config_dir_name = os.path.basename(sysconfig.get_config_var('LIBPL')) self.library_dirs.append(os.path.join(sys.prefix, "lib", "python" + get_python_version(), - "config")) + config_dir_name)) else: # building python standard extensions self.library_dirs.append('.') From 41212c0c42127688871f79fef778df187dcaf296 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Tue, 21 Sep 2021 21:14:31 +0200 Subject: [PATCH 090/138] distutils: get_versions() fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей Co-authored-by: Christoph Reiter --- Lib/distutils/cygwinccompiler.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py index 5b281e28cd6869..fba3485eb8a0f5 100644 --- a/Lib/distutils/cygwinccompiler.py +++ b/Lib/distutils/cygwinccompiler.py @@ -56,6 +56,7 @@ CompileError, UnknownFileError) from distutils.version import LooseVersion from distutils.spawn import find_executable +from subprocess import Popen, PIPE, check_output def get_msvcr(): """Include the appropriate MSVC runtime library if Python was built @@ -371,7 +372,7 @@ def check_config_h(): return (CONFIG_H_UNCERTAIN, "couldn't read '%s': %s" % (fn, exc.strerror)) -RE_VERSION = re.compile(br'(\d+\.\d+(\.\d+)*)') +RE_VERSION = re.compile(br'[\D\s]*(\d+\.\d+(\.\d+)*)[\D\s]*') def _find_exe_version(cmd): """Find the version of an executable by running `cmd` in the shell. @@ -400,7 +401,16 @@ def get_versions(): If not possible it returns None for it. """ - commands = ['gcc -dumpversion', 'ld -v', 'dllwrap --version'] + gcc = os.environ.get('CC') or 'gcc' + ld = 'ld' + out = Popen(gcc+' --print-prog-name ld', shell=True, stdout=PIPE).stdout + try: + ld = test=str(out.read(),encoding='utf-8').strip() + finally: + out.close() + dllwrap = os.environ.get('DLLWRAP') or 'dllwrap' + # MinGW64 doesn't have i686-w64-mingw32-ld, so instead we ask gcc. + commands = [gcc+' -dumpversion', ld+' -v', dllwrap+' --version'] return tuple([_find_exe_version(cmd) for cmd in commands]) def is_cygwingcc(): From ba867c3bd80c7e13919e7d3ab6391827e04f33ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:51:59 +0530 Subject: [PATCH 091/138] distutils: install layout as posix Co-authored-by: Naveen M K --- Lib/distutils/command/install.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py index 01d5331a63069b..0421a068104158 100644 --- a/Lib/distutils/command/install.py +++ b/Lib/distutils/command/install.py @@ -72,8 +72,8 @@ INSTALL_SCHEMES['nt_user'] = { 'purelib': '$usersite', 'platlib': '$usersite', - 'headers': '$userbase/Python$py_version_nodot/Include/$dist_name', - 'scripts': '$userbase/Python$py_version_nodot/Scripts', + 'headers': '$userbase/include/python$py_version_short$abiflags/$dist_name', + 'scripts': '$userbase/bin', 'data' : '$userbase', } From da04832245a33f3318b6559634f2bb48999006f8 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Tue, 21 Sep 2021 21:18:50 +0200 Subject: [PATCH 092/138] distutils: msys convert_path fix and root hack Co-authored-by: Naveen M K --- Lib/distutils/command/install.py | 3 ++- Lib/distutils/util.py | 26 ++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py index 0421a068104158..9cb3b2c17f0b81 100644 --- a/Lib/distutils/command/install.py +++ b/Lib/distutils/command/install.py @@ -363,7 +363,8 @@ def finalize_options(self): # Convert directories from Unix /-separated syntax to the local # convention. - self.convert_paths('lib', 'purelib', 'platlib', + self.convert_paths('base', 'platbase', + 'lib', 'purelib', 'platlib', 'scripts', 'data', 'headers') if HAS_USER_SITE: self.convert_paths('userbase', 'usersite') diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py index fb7d1ad3f8ab37..ed9d5098754d9f 100644 --- a/Lib/distutils/util.py +++ b/Lib/distutils/util.py @@ -132,6 +132,13 @@ def convert_path (pathname): paths.remove('.') if not paths: return os.curdir + # On Windows, if paths is ['C:','folder','subfolder'] then + # os.path.join(*paths) will return 'C:folder\subfolder' which + # is thus relative to the CWD on that drive. So we work around + # this by adding a \ to path[0] + if (len(paths) > 0 and paths[0].endswith(':') and + sys.platform == "win32" and sys.version.find("GCC") >= 0): + paths[0] += '\\' return os.path.join(*paths) # convert_path () @@ -142,6 +149,10 @@ def change_root (new_root, pathname): relative, this is equivalent to "os.path.join(new_root,pathname)". Otherwise, it requires making 'pathname' relative and then joining the two, which is tricky on DOS/Windows and Mac OS. + + If on Windows or OS/2 and both new_root and pathname are on different + drives, raises DistutilsChangeRootError as this is nonsensical, + otherwise use drive which can be in either of new_root or pathname. """ if os.name == 'posix': if not os.path.isabs(pathname): @@ -151,9 +162,20 @@ def change_root (new_root, pathname): elif os.name == 'nt': (drive, path) = os.path.splitdrive(pathname) - if path[0] == '\\': + if path[0] == os.sep: path = path[1:] - return os.path.join(new_root, path) + (drive_r, path_r) = os.path.splitdrive(new_root) + if path_r and path_r[0] == os.sep: + path_r = path_r[1:] + drive_used = '' + if len(drive) == 2 and len(drive_r) == 2 and drive != drive_r: + raise DistutilsChangeRootError("root and pathname not on same drive (%s, %s)" + % (drive_r,drive)) + elif len(drive_r) == 2: + drive_used = drive_r+os.sep + elif len(drive) == 2: + drive_used = drive+os.sep + return os.path.join(drive_used+path_r, path) else: raise DistutilsPlatformError("nothing known about platform '%s'" % os.name) From f17be501c2b0661111115d67fc7418f054b0dac2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:52:04 +0530 Subject: [PATCH 093/138] distutils: mingw build optimized ext MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Lib/distutils/cygwinccompiler.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py index fba3485eb8a0f5..bb9788018a0d18 100644 --- a/Lib/distutils/cygwinccompiler.py +++ b/Lib/distutils/cygwinccompiler.py @@ -303,9 +303,9 @@ def __init__(self, verbose=0, dry_run=0, force=0): raise CCompilerError( 'Cygwin gcc cannot be used with --compiler=mingw32') - self.set_executables(compiler='gcc -O -Wall', - compiler_so='gcc -mdll -O -Wall', - compiler_cxx='g++ -O -Wall', + self.set_executables(compiler='gcc -O2 -Wall', + compiler_so='gcc -mdll -O2 -Wall', + compiler_cxx='g++ -O2 -Wall', linker_exe='gcc', linker_so='%s %s %s' % (self.linker_dll, shared_option, From 4d516290854fac73a0778123a7d40672c242c32c Mon Sep 17 00:00:00 2001 From: Ray Donnelly Date: Thu, 17 Jun 2021 18:52:05 +0530 Subject: [PATCH 094/138] distutils: cygwinccompiler dont strip modules if pydebug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Lib/distutils/cygwinccompiler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py index bb9788018a0d18..c134525ba8dfab 100644 --- a/Lib/distutils/cygwinccompiler.py +++ b/Lib/distutils/cygwinccompiler.py @@ -236,7 +236,7 @@ def link(self, target_desc, objects, output_filename, output_dir=None, # (On my machine: 10KiB < stripped_file < ??100KiB # unstripped_file = stripped_file + XXX KiB # ( XXX=254 for a typical python extension)) - if not debug: + if not debug and not hasattr(sys, 'gettotalrefcount'): extra_preargs.append("-s") UnixCCompiler.link(self, target_desc, objects, output_filename, From 1a6ce1dfb144883a1a895b5884a73714687f9e77 Mon Sep 17 00:00:00 2001 From: Long Nguyen Date: Tue, 17 Aug 2021 20:26:05 +0700 Subject: [PATCH 095/138] distutils: get compilers from env vars Upstreamed at https://github.com/pypa/distutils/pull/26 This would allow us to bypass all gcc workarounds when we're using clang --- Lib/distutils/cygwinccompiler.py | 91 ++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 40 deletions(-) diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py index c134525ba8dfab..75bc17b7a0c4d0 100644 --- a/Lib/distutils/cygwinccompiler.py +++ b/Lib/distutils/cygwinccompiler.py @@ -44,6 +44,8 @@ # (ld supports -shared) # * mingw gcc 3.2/ld 2.13 works # (ld supports -shared) +# * llvm-mingw with Clang 11 works +# (lld supports -shared) import os import sys @@ -110,41 +112,46 @@ def __init__(self, verbose=0, dry_run=0, force=0): "Compiling may fail because of undefined preprocessor macros." % details) - self.gcc_version, self.ld_version, self.dllwrap_version = \ - get_versions() - self.debug_print(self.compiler_type + ": gcc %s, ld %s, dllwrap %s\n" % - (self.gcc_version, - self.ld_version, - self.dllwrap_version) ) - - # ld_version >= "2.10.90" and < "2.13" should also be able to use - # gcc -mdll instead of dllwrap - # Older dllwraps had own version numbers, newer ones use the - # same as the rest of binutils ( also ld ) - # dllwrap 2.10.90 is buggy - if self.ld_version >= "2.10.90": - self.linker_dll = "gcc" - else: - self.linker_dll = "dllwrap" + self.cc = os.environ.get('CC', 'gcc') + self.cxx = os.environ.get('CXX', 'g++') + + if ('gcc' in self.cc): # Start gcc workaround + self.gcc_version, self.ld_version, self.dllwrap_version = \ + get_versions() + self.debug_print(self.compiler_type + ": gcc %s, ld %s, dllwrap %s\n" % + (self.gcc_version, + self.ld_version, + self.dllwrap_version) ) + + # ld_version >= "2.10.90" and < "2.13" should also be able to use + # gcc -mdll instead of dllwrap + # Older dllwraps had own version numbers, newer ones use the + # same as the rest of binutils ( also ld ) + # dllwrap 2.10.90 is buggy + if self.ld_version >= "2.10.90": + self.linker_dll = self.cc + else: + self.linker_dll = "dllwrap" - # ld_version >= "2.13" support -shared so use it instead of - # -mdll -static - if self.ld_version >= "2.13": + # ld_version >= "2.13" support -shared so use it instead of + # -mdll -static + if self.ld_version >= "2.13": + shared_option = "-shared" + else: + shared_option = "-mdll -static" + else: # Assume linker is up to date + self.linker_dll = self.cc shared_option = "-shared" - else: - shared_option = "-mdll -static" - # Hard-code GCC because that's what this is all about. - # XXX optimization, warnings etc. should be customizable. - self.set_executables(compiler='gcc -mcygwin -O -Wall', - compiler_so='gcc -mcygwin -mdll -O -Wall', - compiler_cxx='g++ -mcygwin -O -Wall', - linker_exe='gcc -mcygwin', + self.set_executables(compiler='%s -mcygwin -O -Wall' % self.cc, + compiler_so='%s -mcygwin -mdll -O -Wall' % self.cc, + compiler_cxx='%s -mcygwin -O -Wall' % self.cxx, + linker_exe='%s -mcygwin' % self.cc, linker_so=('%s -mcygwin %s' % (self.linker_dll, shared_option))) # cygwin and mingw32 need different sets of libraries - if self.gcc_version == "2.91.57": + if ('gcc' in self.cc and self.gcc_version == "2.91.57"): # cygwin shouldn't need msvcrt, but without the dlls will crash # (gcc version 2.91.57) -- perhaps something about initialization self.dll_libraries=["msvcrt"] @@ -287,26 +294,26 @@ def __init__(self, verbose=0, dry_run=0, force=0): # ld_version >= "2.13" support -shared so use it instead of # -mdll -static - if self.ld_version >= "2.13": - shared_option = "-shared" - else: + if ('gcc' in self.cc and self.ld_version < "2.13"): shared_option = "-mdll -static" + else: + shared_option = "-shared" # A real mingw32 doesn't need to specify a different entry point, # but cygwin 2.91.57 in no-cygwin-mode needs it. - if self.gcc_version <= "2.91.57": + if ('gcc' in self.cc and self.gcc_version <= "2.91.57"): entry_point = '--entry _DllMain@12' else: entry_point = '' - if is_cygwingcc(): + if is_cygwincc(self.cc): raise CCompilerError( 'Cygwin gcc cannot be used with --compiler=mingw32') - self.set_executables(compiler='gcc -O2 -Wall', - compiler_so='gcc -mdll -O2 -Wall', - compiler_cxx='g++ -O2 -Wall', - linker_exe='gcc', + self.set_executables(compiler='%s -O2 -Wall' % self.cc, + compiler_so='%s -mdll -O2 -Wall' % self.cc, + compiler_cxx='%s -O2 -Wall' % self.cxx, + linker_exe='%s' % self.cc, linker_so='%s %s %s' % (self.linker_dll, shared_option, entry_point)) @@ -357,6 +364,10 @@ def check_config_h(): if "GCC" in sys.version: return CONFIG_H_OK, "sys.version mentions 'GCC'" + # Clang would also work + if "Clang" in sys.version: + return CONFIG_H_OK, "sys.version mentions 'Clang'" + # let's see if __GNUC__ is mentioned in python.h fn = sysconfig.get_config_h_filename() try: @@ -413,7 +424,7 @@ def get_versions(): commands = [gcc+' -dumpversion', ld+' -v', dllwrap+' --version'] return tuple([_find_exe_version(cmd) for cmd in commands]) -def is_cygwingcc(): - '''Try to determine if the gcc that would be used is from cygwin.''' - out_string = check_output(['gcc', '-dumpmachine']) +def is_cygwincc(cc): + '''Try to determine if the compiler that would be used is from cygwin.''' + out_string = check_output([cc, '-dumpmachine']) return out_string.strip().endswith(b'cygwin') From e2dd953a88e2a2ba0fb11138a9ede844dbf281ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:52:28 +0530 Subject: [PATCH 096/138] distutils: add windmc to cygwinccompiler --- Lib/distutils/cygwinccompiler.py | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py index 75bc17b7a0c4d0..6a40e809c52741 100644 --- a/Lib/distutils/cygwinccompiler.py +++ b/Lib/distutils/cygwinccompiler.py @@ -170,6 +170,28 @@ def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts): self.spawn(["windres", "-i", src, "-o", obj]) except DistutilsExecError as msg: raise CompileError(msg) + elif ext == '.mc': + # Adapted from msvc9compiler: + # + # Compile .MC to .RC file to .RES file. + # * '-h dir' specifies the directory for the generated include file + # * '-r dir' specifies the target directory of the generated RC file and the binary message resource it includes + # + # For now (since there are no options to change this), + # we use the source-directory for the include file and + # the build directory for the RC file and message + # resources. This works at least for win32all. + h_dir = os.path.dirname(src) + rc_dir = os.path.dirname(obj) + try: + # first compile .MC to .RC and .H file + self.spawn(['windmc'] + ['-h', h_dir, '-r', rc_dir] + [src]) + base, _ = os.path.splitext(os.path.basename(src)) + rc_file = os.path.join(rc_dir, base + '.rc') + # then compile .RC to .RES file + self.spawn(['windres', '-i', rc_file, '-o', obj]) + except DistutilsExecError as msg: + raise CompileError(msg) else: # for other files use the C-compiler try: self.spawn(self.compiler_so + cc_args + [src, '-o', obj] + @@ -264,9 +286,9 @@ def object_filenames(self, source_filenames, strip_dir=0, output_dir=''): base, ext = os.path.splitext(src_name) # use 'normcase' only for resource suffixes ext_normcase = os.path.normcase(ext) - if ext_normcase in ['.rc','.res']: + if ext_normcase in ['.rc', '.res', '.mc']: ext = ext_normcase - if ext not in (self.src_extensions + ['.rc','.res']): + if ext not in (self.src_extensions + ['.rc', '.res', '.mc']): raise UnknownFileError("unknown file type '%s' (from '%s')" % \ (ext, src_name)) base = os.path.splitdrive(base)[1] # Chop off the drive From b074ec65f38ded0c9f9a2cf6ab1e990639b7fa1b Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Thu, 17 Jun 2021 18:52:24 +0530 Subject: [PATCH 097/138] distutils: fix msvc9 import MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Алексей --- Lib/distutils/msvc9compiler.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/distutils/msvc9compiler.py b/Lib/distutils/msvc9compiler.py index a7976fbe3ed924..c3416797d5f55a 100644 --- a/Lib/distutils/msvc9compiler.py +++ b/Lib/distutils/msvc9compiler.py @@ -291,8 +291,6 @@ def query_vcvarsall(version, arch="x86"): # More globals VERSION = get_build_version() -if VERSION < 8.0: - raise DistutilsPlatformError("VC %0.1f is not supported by this module" % VERSION) # MACROS = MacroExpander(VERSION) class MSVCCompiler(CCompiler) : @@ -327,6 +325,8 @@ class MSVCCompiler(CCompiler) : def __init__(self, verbose=0, dry_run=0, force=0): CCompiler.__init__ (self, verbose, dry_run, force) + if VERSION < 8.0: + raise DistutilsPlatformError("VC %0.1f is not supported by this module" % VERSION) self.__version = VERSION self.__root = r"Software\Microsoft\VisualStudio" # self.__macros = MACROS From f2c94fd9d22a7449d8407f37047053f9093c9510 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:52:06 +0530 Subject: [PATCH 098/138] distutils: mingw add LIBPL to library dirs --- Lib/distutils/command/build_ext.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py index 1dbdfe0e30ba80..15987357280bb4 100644 --- a/Lib/distutils/command/build_ext.py +++ b/Lib/distutils/command/build_ext.py @@ -218,7 +218,7 @@ def finalize_options(self): # For extensions under Cygwin, Python's library directory must be # appended to library_dirs - if sys.platform[:6] == 'cygwin': + if sys.platform[:6] == 'cygwin' or self.plat_name.startswith(('mingw')): if sys.executable.startswith(os.path.join(sys.exec_prefix, "bin")): # building third party extensions config_dir_name = os.path.basename(sysconfig.get_config_var('LIBPL')) From 810193f21f4ed86dac614602b3b6066104bfb0c9 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Tue, 21 Sep 2021 21:37:23 +0200 Subject: [PATCH 099/138] distutils: Change the `get_platform()` method in distutils to match sysconfig This would possibly fix building wheels when mingw python is used and would be unique to each python same as EXT_SUFFIX. Signed-off-by: Naveen M K --- Lib/distutils/util.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py index ed9d5098754d9f..28e623b95d78fd 100644 --- a/Lib/distutils/util.py +++ b/Lib/distutils/util.py @@ -37,8 +37,20 @@ def get_host_platform(): """ if os.name == 'nt': - if 'GCC' in sys.version: - return 'mingw' + if 'gcc' in sys.version.lower(): + if 'ucrt' in sys.version.lower(): + if 'amd64' in sys.version.lower(): + return 'mingw_x86_64_ucrt' + return 'mingw_i686_ucrt' + if 'clang' in sys.version.lower(): + if 'amd64' in sys.version.lower(): + return 'mingw_x86_64_clang' + if 'arm64' in sys.version.lower(): + return 'mingw_aarch64' + return 'mingw_i686_clang' + if 'amd64' in sys.version.lower(): + return 'mingw_x86_64' + return 'mingw_i686' if 'amd64' in sys.version.lower(): return 'win-amd64' if '(arm)' in sys.version.lower(): From 6cd4db4429c38242a866fbdebd7a8b293b03fb14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 17 Jun 2021 18:52:09 +0530 Subject: [PATCH 100/138] build: Fix ncursesw include lookup Mirror what is already done for libffi; Look it up via pkg-config and use the exported path via sysconfig in setup.py --- Makefile.pre.in | 1 + configure.ac | 9 ++++++++- setup.py | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 77730b85f064d8..a4527cf5ab4757 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -318,6 +318,7 @@ IO_OBJS= \ ########################################################################## LIBFFI_INCLUDEDIR= @LIBFFI_INCLUDEDIR@ +NCURSESW_INCLUDEDIR= @NCURSESW_INCLUDEDIR@ ########################################################################## # Parser diff --git a/configure.ac b/configure.ac index a66b92fb19b64d..d9cbb5d8b29fb9 100644 --- a/configure.ac +++ b/configure.ac @@ -5629,10 +5629,17 @@ then [Define if you have struct stat.st_mtimensec]) fi +if test -n "$PKG_CONFIG"; then + NCURSESW_INCLUDEDIR="`"$PKG_CONFIG" ncursesw --cflags-only-I 2>/dev/null | sed -e 's/^-I//;s/ *$//'`" +else + NCURSESW_INCLUDEDIR="" +fi +AC_SUBST(NCURSESW_INCLUDEDIR) + # first curses header check ac_save_cppflags="$CPPFLAGS" if test "$cross_compiling" = no; then - CPPFLAGS="$CPPFLAGS -I/usr/include/ncursesw" + CPPFLAGS="$CPPFLAGS -I$NCURSESW_INCLUDEDIR" fi AC_CHECK_HEADERS(curses.h ncurses.h) diff --git a/setup.py b/setup.py index d48652988d5ee1..900d78b1a15a97 100644 --- a/setup.py +++ b/setup.py @@ -1207,7 +1207,7 @@ def detect_readline_curses(self): if curses_library == 'ncursesw': curses_defines.append(('HAVE_NCURSESW', '1')) if not CROSS_COMPILING: - curses_includes.append('/usr/include/ncursesw') + curses_includes.append(sysconfig.get_config_var("NCURSESW_INCLUDEDIR")) # Bug 1464056: If _curses.so links with ncursesw, # _curses_panel.so must link with panelw. panel_library = 'panelw' From cb3e2b22efa4b13bbe76aec344024574c7324144 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Fri, 23 Jul 2021 08:51:32 +0200 Subject: [PATCH 101/138] tests: fix test_bytes %p has different casing with mingw-w64, but it's implementation defined. Change the test to the mingw-w64 variant. --- Lib/test/test_bytes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index 72c5e1849f4f57..b830c502f7e7fa 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -1075,7 +1075,7 @@ def test_from_format(self): if os.name == 'nt': # Windows (MSCRT) - ptr_format = '0x%0{}X'.format(2 * sizeof_ptr) + ptr_format = '0x%0{}x'.format(2 * sizeof_ptr) def ptr_formatter(ptr): return (ptr_format % ptr) else: From 72dee9602032f9900cea5cb193d5df17673b437c Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Fri, 23 Jul 2021 08:52:50 +0200 Subject: [PATCH 102/138] time: fix strftime not raising for invalid year values It's crt specific and not compiler specific. This fixes a test case in test_time --- Modules/timemodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 4caacc3b64d7c8..4787fa3c0784a3 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -759,7 +759,7 @@ time_strftime(PyObject *self, PyObject *args) return NULL; } -#if defined(_MSC_VER) || (defined(__sun) && defined(__SVR4)) || defined(_AIX) || defined(__VXWORKS__) +#if defined(MS_WINDOWS) || (defined(__sun) && defined(__SVR4)) || defined(_AIX) || defined(__VXWORKS__) if (buf.tm_year + 1900 < 1 || 9999 < buf.tm_year + 1900) { PyErr_SetString(PyExc_ValueError, "strftime() requires year in [1; 9999]"); From 8c77da69b3454486f63dfedc28c66de755029f98 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Fri, 23 Jul 2021 18:23:58 +0200 Subject: [PATCH 103/138] ctypes: find_library('c') should return None with ucrt Just like with MSVC. This fixes a test in test_ctypes. --- Lib/ctypes/util.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py index 0c2510e1619c8e..48ddb3beb13c87 100644 --- a/Lib/ctypes/util.py +++ b/Lib/ctypes/util.py @@ -31,6 +31,12 @@ def _get_build_version(): # else we don't know what version of the compiler this is return None + def find_msvcrt_mingw(): + is_ucrt = 'clang' in sys.version.lower() or 'ucrt' in sys.version.lower() + if is_ucrt: + return None + return 'msvcrt.dll' + def find_msvcrt(): """Return the name of the VC runtime dll""" version = _get_build_version() @@ -54,6 +60,9 @@ def find_msvcrt(): def find_library(name): if name in ('c', 'm'): + import sysconfig + if sysconfig.get_platform().startswith('mingw'): + return find_msvcrt_mingw() return find_msvcrt() # See MSDN for the REAL search order. for directory in os.environ['PATH'].split(os.pathsep): From 9b2842a05a751f3897f3aa0abd25f392a5713ee0 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Sun, 25 Jul 2021 13:54:12 +0200 Subject: [PATCH 104/138] build: Disable checks for dlopen/dlfcn While it is (potentially) available with mingw we don't want to use it, so skip any checks for it. --- configure.ac | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index d9cbb5d8b29fb9..60332d182b9444 100644 --- a/configure.ac +++ b/configure.ac @@ -2427,7 +2427,7 @@ dnl AC_MSG_RESULT($cpp_type) # checks for header files AC_HEADER_STDC -AC_CHECK_HEADERS(asm/types.h crypt.h conio.h direct.h dlfcn.h errno.h \ +AC_CHECK_HEADERS(asm/types.h crypt.h conio.h direct.h errno.h \ fcntl.h grp.h \ ieeefp.h io.h langinfo.h libintl.h process.h \ shadow.h signal.h stropts.h termios.h \ @@ -2442,6 +2442,12 @@ libutil.h sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \ linux/tipc.h linux/random.h spawn.h util.h alloca.h endian.h \ sys/endian.h sys/sysmacros.h linux/auxvec.h sys/auxv.h linux/memfd.h linux/wait.h sys/memfd.h \ sys/mman.h sys/eventfd.h) + +case $host in + *-*-mingw*) ;; + *) AC_CHECK_HEADERS([dlfcn.h]);; +esac + AC_HEADER_DIRENT AC_HEADER_MAJOR @@ -3155,7 +3161,12 @@ AC_MSG_RESULT($SHLIBS) # checks for libraries AC_CHECK_LIB(sendfile, sendfile) -AC_CHECK_LIB(dl, dlopen) # Dynamic linking for SunOS/Solaris and SYSV + +case $host in + *-*-mingw*) ;; + *) AC_CHECK_LIB(dl, dlopen) ;; # Dynamic linking for SunOS/Solaris and SYSV +esac + AC_CHECK_LIB(dld, shl_load) # Dynamic linking for HP-UX # checks for uuid.h location @@ -5038,7 +5049,10 @@ then [define to 1 if your sem_getvalue is broken.]) fi -AC_CHECK_DECLS([RTLD_LAZY, RTLD_NOW, RTLD_GLOBAL, RTLD_LOCAL, RTLD_NODELETE, RTLD_NOLOAD, RTLD_DEEPBIND, RTLD_MEMBER], [], [], [[#include ]]) +case $host in + *-*-mingw*) ;; + *) AC_CHECK_DECLS([RTLD_LAZY, RTLD_NOW, RTLD_GLOBAL, RTLD_LOCAL, RTLD_NODELETE, RTLD_NOLOAD, RTLD_DEEPBIND, RTLD_MEMBER], [], [], [[#include ]]);; +esac # determine what size digit to use for Python's longs AC_MSG_CHECKING([digit size for Python's longs]) From a7ad326ef45a4fde11d09b4fcfcd80f790ddf7e0 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Sun, 25 Jul 2021 15:46:01 +0200 Subject: [PATCH 105/138] Fix install location of the import library --- Makefile.pre.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index a4527cf5ab4757..562a29baec920c 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1742,7 +1742,7 @@ libainstall: @DEF_MAKE_RULE@ python-config if test -d $(LIBRARY); then :; else \ if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \ if test "$(SHLIB_SUFFIX)" = .dll -o "$(SHLIB_SUFFIX)" = .pyd; then \ - $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \ + $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBDIR) ; \ else \ $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \ fi; \ From 522a0288b9acca5fb67faa818a71ca5e4ddabb45 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Sun, 25 Jul 2021 15:46:54 +0200 Subject: [PATCH 106/138] Set MSYS2_ARG_CONV_EXCL for the shared Python module install Otherwise one has to set it when calling "make install". --- Makefile.pre.in | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.pre.in b/Makefile.pre.in index 562a29baec920c..7f1f3e1555be95 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1789,6 +1789,7 @@ endif # Install the dynamically loadable modules # This goes into $(exec_prefix) sharedinstall: sharedmods + MSYS2_ARG_CONV_EXCL="--prefix=;--install-scripts=;--install-platlib=" \ $(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/setup.py install \ --prefix=$(prefix) \ --install-scripts=$(BINDIR) \ From b129ef5c3288390996be40b3fbbf4f3a4412b47f Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Sun, 25 Jul 2021 16:53:35 +0200 Subject: [PATCH 107/138] build: Integrate venvlauncher build/installation into the Makefile This is required for venv creation on Windows. Ideally this would use the venv specific launcher (PC/launcher.c), but a copy of main binary seems to work as well for now. --- Makefile.pre.in | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 7f1f3e1555be95..46d203d6201f17 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -162,6 +162,7 @@ BINLIBDEST= @BINLIBDEST@ LIBDEST= $(SCRIPTDIR)/python$(VERSION) INCLUDEPY= $(INCLUDEDIR)/python$(LDVERSION) CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(LDVERSION) +VENVLAUNCHERDIR= $(BINLIBDEST)/venv/scripts/nt # Symbols used for using shared libraries SHLIB_SUFFIX= @SHLIB_SUFFIX@ @@ -269,6 +270,8 @@ LIBOBJS= @LIBOBJS@ PYTHON= python$(EXE) BUILDPYTHON= python$(BUILDEXE) BUILDPYTHONW= pythonw$(BUILDEXE) +BUILDVENVLAUNCHER= venvlauncher$(BUILDEXE) +BUILDVENVWLAUNCHER= venvwlauncher$(BUILDEXE) PYTHON_FOR_REGEN?=@PYTHON_FOR_REGEN@ UPDATE_FILE=$(PYTHON_FOR_REGEN) $(srcdir)/Tools/scripts/update_file.py @@ -484,7 +487,7 @@ DTRACE_DEPS = \ # Default target all: @DEF_MAKE_ALL_RULE@ -build_all: check-clean-src $(BUILDPYTHON) $(BUILDPYTHONW) oldsharedmods sharedmods gdbhooks \ +build_all: check-clean-src $(BUILDPYTHON) $(BUILDPYTHONW) $(BUILDVENVLAUNCHER) $(BUILDVENVWLAUNCHER) oldsharedmods sharedmods gdbhooks \ Programs/_testembed python-config # Check that the source is clean when building out of source. @@ -613,6 +616,14 @@ $(BUILDPYTHONW): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) pythonw $(BUILDPYTHON): Programs/python.o $(LIBRARY_DEPS) python_exe.o $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -municode -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) python_exe.o +# FIXME: build these from PC/launcher.c instead +$(BUILDVENVLAUNCHER): $(BUILDPYTHON) + cp $(BUILDPYTHON) $(BUILDVENVLAUNCHER) + +# FIXME: build these from PC/launcher.c instead +$(BUILDVENVWLAUNCHER): $(BUILDPYTHONW) + cp $(BUILDPYTHONW) $(BUILDVENVWLAUNCHER) + platform: $(BUILDPYTHON) pybuilddir.txt $(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import sys ; from sysconfig import get_platform ; print("%s-%d.%d" % (get_platform(), *sys.version_info[:2]))' >platform @@ -1346,7 +1357,7 @@ $(DESTSHARED): # Install the interpreter with $(VERSION) affixed # This goes into $(exec_prefix) altbininstall: $(BUILDPYTHON) @FRAMEWORKPYTHONW@ - @for i in $(BINDIR) $(LIBDIR); \ + @for i in $(BINDIR) $(LIBDIR) $(VENVLAUNCHERDIR); \ do \ if test ! -d $(DESTDIR)$$i; then \ echo "Creating directory $$i"; \ @@ -1357,6 +1368,8 @@ altbininstall: $(BUILDPYTHON) @FRAMEWORKPYTHONW@ if test "$(PYTHONFRAMEWORKDIR)" = "no-framework" ; then \ $(INSTALL_PROGRAM) $(BUILDPYTHON) $(DESTDIR)$(BINDIR)/python$(LDVERSION)$(EXE); \ $(INSTALL_PROGRAM) $(BUILDPYTHONW) $(DESTDIR)$(BINDIR)/python3w$(EXE); \ + $(INSTALL_PROGRAM) $(BUILDPYTHON) $(DESTDIR)$(VENVLAUNCHERDIR)/python$(EXE); \ + $(INSTALL_PROGRAM) $(BUILDPYTHONW) $(DESTDIR)$(VENVLAUNCHERDIR)/pythonw$(EXE); \ else \ $(INSTALL_PROGRAM) $(STRIPFLAG) Mac/pythonw $(DESTDIR)$(BINDIR)/python$(LDVERSION)$(EXE); \ fi From 9e6fad823471e0f455d1445459a1104d1105b07b Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Sun, 1 Aug 2021 15:18:50 +0200 Subject: [PATCH 108/138] configure.ac: set _WIN32_WINNT version --- configure.ac | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/configure.ac b/configure.ac index 60332d182b9444..2ba3b29ab42f5e 100644 --- a/configure.ac +++ b/configure.ac @@ -3497,6 +3497,11 @@ else fi]) AC_MSG_RESULT($with_dbmliborder) +case $host in + *-*-mingw*) + CFLAGS_NODIST="$CFLAGS_NODIST -D_WIN32_WINNT=0x0601";; +esac + # Determine if windows modules should be used. AC_SUBST(USE_WIN32_MODULE) USE_WIN32_MODULE='#' From a021e49d19ce45434a87cc0327550b6bb8e170ba Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Sun, 1 Aug 2021 18:35:17 +0200 Subject: [PATCH 109/138] configure.ac: don't check for clock_ functions They shouldn't be exposed on Windows and lead to winpthread being linked in --- configure.ac | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/configure.ac b/configure.ac index 2ba3b29ab42f5e..c2254b61788ca3 100644 --- a/configure.ac +++ b/configure.ac @@ -4394,6 +4394,9 @@ char *r = crypt_r("", "", &d); []) ) +case $host in + *-*-mingw*) ;; + *) AC_CHECK_FUNCS(clock_gettime, [], [ AC_CHECK_LIB(rt, clock_gettime, [ LIBS="$LIBS -lrt" @@ -4414,6 +4417,8 @@ AC_CHECK_FUNCS(clock_settime, [], [ AC_DEFINE(HAVE_CLOCK_SETTIME, 1) ]) ]) + ;; +esac AC_MSG_CHECKING(for major, minor, and makedev) AC_LINK_IFELSE([AC_LANG_PROGRAM([[ From bfcf5fcf03063ed65994b74ba0440a6a1920fb3e Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Sun, 8 Aug 2021 10:17:35 +0200 Subject: [PATCH 110/138] expanduser: normpath paths coming from env vars This makes sure we get the same paths as with related functions in pathlib. --- Lib/ntpath.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/ntpath.py b/Lib/ntpath.py index 9a404ab2a2818a..5f6fad4c307656 100644 --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -344,7 +344,7 @@ def expanduser(path): if 'USERPROFILE' in os.environ: userhome = os.environ['USERPROFILE'] elif not 'HOMEPATH' in os.environ: - return path + return os.path.normpath(path) else: try: drive = os.environ['HOMEDRIVE'] @@ -371,7 +371,7 @@ def expanduser(path): if isinstance(path, bytes): userhome = os.fsencode(userhome) - return userhome + path[i:] + return os.path.normpath(userhome) + path[i:] # Expand paths containing shell variable substitutions. From eec344a21939bc677658bba448b944a01074d2b8 Mon Sep 17 00:00:00 2001 From: Naveen M K Date: Thu, 17 Jun 2021 18:52:39 +0530 Subject: [PATCH 111/138] Add support for Windows 7 Python 3.10 Co-authored-by: Naveen M K --- Modules/posixmodule.c | 22 ++++++++++------ PC/getpathp.c | 58 +++++++++++++++++++++++++++++++++++++++---- configure.ac | 2 +- 3 files changed, 69 insertions(+), 13 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 0334759aa9178a..5506e6568698af 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -20,7 +20,7 @@ FSCTL_GET_REPARSE_POINT is not exported with WIN32_LEAN_AND_MEAN. */ # include -# include +# include #endif #ifdef __VXWORKS__ @@ -4464,7 +4464,6 @@ os__path_splitroot_impl(PyObject *module, path_t *path) wchar_t *buffer; wchar_t *end; PyObject *result = NULL; - HRESULT ret; buffer = (wchar_t*)PyMem_Malloc(sizeof(wchar_t) * (wcslen(path->wide) + 1)); if (!buffer) { @@ -4476,18 +4475,26 @@ os__path_splitroot_impl(PyObject *module, path_t *path) } Py_BEGIN_ALLOW_THREADS - ret = PathCchSkipRoot(buffer, &end); + if (buffer[0] && buffer[1] == L':') { + if (buffer[2] == L'\\') { + end = &buffer[3]; + } else { + end = &buffer[2]; + } + } else { + end = PathSkipRootW(buffer); + } Py_END_ALLOW_THREADS - if (FAILED(ret)) { + if (!end || end == buffer) { result = Py_BuildValue("sO", "", path->object); - } else if (end != buffer) { + } else if (!*end) { + result = Py_BuildValue("Os", path->object, ""); + } else { size_t rootLen = (size_t)(end - buffer); result = Py_BuildValue("NN", PyUnicode_FromWideChar(path->wide, rootLen), PyUnicode_FromWideChar(path->wide + rootLen, -1) ); - } else { - result = Py_BuildValue("Os", path->object, ""); } PyMem_Free(buffer); @@ -4495,6 +4502,7 @@ os__path_splitroot_impl(PyObject *module, path_t *path) } + #endif /* MS_WINDOWS */ diff --git a/PC/getpathp.c b/PC/getpathp.c index 7c0eeab5dbab4a..2d03b74e893fab 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -90,7 +90,7 @@ #endif #include -#include +#include #ifdef HAVE_SYS_TYPES_H #include @@ -249,14 +249,43 @@ ismodule(wchar_t *filename, int update_filename) stuff as fits will be appended. */ +static int _PathCchCombineEx_Initialized = 0; +typedef HRESULT(__stdcall *PPathCchCombineEx) (PWSTR pszPathOut, size_t cchPathOut, + PCWSTR pszPathIn, PCWSTR pszMore, + unsigned long dwFlags); +static PPathCchCombineEx _PathCchCombineEx; + static void join(wchar_t *buffer, const wchar_t *stuff) { - if (FAILED(PathCchCombineEx(buffer, MAXPATHLEN+1, buffer, stuff, 0))) { - Py_FatalError("buffer overflow in getpathp.c's join()"); + if (_PathCchCombineEx_Initialized == 0) { + HMODULE pathapi = LoadLibraryExW(L"api-ms-win-core-path-l1-1-0.dll", NULL, + LOAD_LIBRARY_SEARCH_SYSTEM32); + if (pathapi) { + _PathCchCombineEx = (PPathCchCombineEx)GetProcAddress(pathapi, "PathCchCombineEx"); + } + else { + _PathCchCombineEx = NULL; + } + _PathCchCombineEx_Initialized = 1; + } + + if (_PathCchCombineEx) { + if (FAILED(_PathCchCombineEx(buffer, MAXPATHLEN+1, buffer, stuff, 0))) { + Py_FatalError("buffer overflow in getpathp.c's join()"); + } + } else { + if (!PathCombineW(buffer, buffer, stuff)) { + Py_FatalError("buffer overflow in getpathp.c's join()"); + } } } +static int _PathCchCanonicalizeEx_Initialized = 0; +typedef HRESULT(__stdcall *PPathCchCanonicalizeEx) (PWSTR pszPathOut, size_t cchPathOut, + PCWSTR pszPathIn, unsigned long dwFlags); +static PPathCchCanonicalizeEx _PathCchCanonicalizeEx; + /* Call PathCchCanonicalizeEx(path): remove navigation elements such as "." and ".." to produce a direct, well-formed path. */ static PyStatus @@ -266,8 +295,27 @@ canonicalize(wchar_t *buffer, const wchar_t *path) return _PyStatus_NO_MEMORY(); } - if (FAILED(PathCchCanonicalizeEx(buffer, MAXPATHLEN + 1, path, 0))) { - return INIT_ERR_BUFFER_OVERFLOW(); + if (_PathCchCanonicalizeEx_Initialized == 0) { + HMODULE pathapi = LoadLibraryExW(L"api-ms-win-core-path-l1-1-0.dll", NULL, + LOAD_LIBRARY_SEARCH_SYSTEM32); + if (pathapi) { + _PathCchCanonicalizeEx = (PPathCchCanonicalizeEx)GetProcAddress(pathapi, "PathCchCanonicalizeEx"); + } + else { + _PathCchCanonicalizeEx = NULL; + } + _PathCchCanonicalizeEx_Initialized = 1; + } + + if (_PathCchCanonicalizeEx) { + if (FAILED(_PathCchCanonicalizeEx(buffer, MAXPATHLEN + 1, path, 0))) { + return INIT_ERR_BUFFER_OVERFLOW(); + } + } + else { + if (!PathCanonicalizeW(buffer, path)) { + return INIT_ERR_BUFFER_OVERFLOW(); + } } return _PyStatus_OK(); } diff --git a/configure.ac b/configure.ac index c2254b61788ca3..a1131d8bb70669 100644 --- a/configure.ac +++ b/configure.ac @@ -6040,7 +6040,7 @@ AC_MSG_RESULT(done) # For mingw build need additional library for linking case $host in *-*-mingw*) - LIBS="$LIBS -lversion -lshlwapi -lpathcch" + LIBS="$LIBS -lversion -lshlwapi" AC_PROG_AWK if test "$AWK" = "gawk"; then awk_extra_flag="--non-decimal-data" From 6d5b71a3d313b6de348f044cb54310871014834e Mon Sep 17 00:00:00 2001 From: Naveen M K Date: Fri, 18 Jun 2021 17:51:59 +0530 Subject: [PATCH 112/138] CI: test the build and add some mingw specific tests --- .github/workflows/mingw.yml | 209 ++++++++++++++++++++++++ mingw_ignorefile.txt | 34 ++++ mingw_smoketests.py | 310 ++++++++++++++++++++++++++++++++++++ 3 files changed, 553 insertions(+) create mode 100644 .github/workflows/mingw.yml create mode 100644 mingw_ignorefile.txt create mode 100644 mingw_smoketests.py diff --git a/.github/workflows/mingw.yml b/.github/workflows/mingw.yml new file mode 100644 index 00000000000000..122ac03603ca84 --- /dev/null +++ b/.github/workflows/mingw.yml @@ -0,0 +1,209 @@ +name: Build +on: [push, pull_request, workflow_dispatch] + +jobs: + build: + runs-on: windows-2022 + strategy: + fail-fast: false + matrix: + msystem: ['MINGW64','MINGW32','UCRT64','CLANG64'] + include: + - msystem: MINGW64 + prefix: mingw-w64-x86_64 + - msystem: MINGW32 + prefix: mingw-w64-i686 + - msystem: UCRT64 + prefix: mingw-w64-ucrt-x86_64 + - msystem: CLANG64 + prefix: mingw-w64-clang-x86_64 + #- msystem: CLANG32 + # prefix: mingw-w64-clang-i686 + steps: + - name: Setup git + run: | + git config --global core.autocrlf false + git config --global core.eol lf + - uses: actions/checkout@v2 + - uses: msys2/setup-msys2@v2 + with: + msystem: ${{ matrix.msystem }} + release: false + update: true + install: >- + make + binutils + autoconf + autoconf-archive + automake-wrapper + tar + gzip + ${{ matrix.prefix }}-toolchain + ${{ matrix.prefix }}-expat + ${{ matrix.prefix }}-bzip2 + ${{ matrix.prefix }}-libffi + ${{ matrix.prefix }}-mpdecimal + ${{ matrix.prefix }}-ncurses + ${{ matrix.prefix }}-openssl + ${{ matrix.prefix }}-sqlite3 + ${{ matrix.prefix }}-tcl + ${{ matrix.prefix }}-tk + ${{ matrix.prefix }}-zlib + ${{ matrix.prefix }}-xz + ${{ matrix.prefix }}-tzdata + + - name: Build Python + shell: msys2 {0} + run: | + set -ex + + if [ ${{ matrix.msystem }} == "CLANG64" ] + then + export CC=clang + export CXX=clang++ + fi + autoreconf -vfi + + rm -Rf _build && mkdir _build && cd _build + + ../configure \ + --prefix=${MINGW_PREFIX} \ + --host=${MINGW_CHOST} \ + --build=${MINGW_CHOST} \ + --enable-shared \ + --with-system-expat \ + --with-system-ffi \ + --with-system-libmpdec \ + --without-ensurepip \ + --without-c-locale-coercion \ + --enable-loadable-sqlite-extensions \ + --with-tzpath=${MINGW_PREFIX}/share/zoneinfo \ + --enable-optimizations + + make -j8 + + - name: Run Smoke Test (build) + shell: msys2 {0} + run: | + SMOKETESTS="$(pwd)/mingw_smoketests.py" + cd _build + ./python.exe "$SMOKETESTS" + MSYSTEM= ./python.exe "$SMOKETESTS" + + - name: Run tests + shell: msys2 {0} + run: | + IGNOREFILE="$(pwd)/mingw_ignorefile.txt" + cd _build + MSYSTEM= ./python.exe -m test -j8 --ignorefile "$IGNOREFILE" -W + + - name: Run broken tests + continue-on-error: true + shell: msys2 {0} + run: | + IGNOREFILE="$(pwd)/mingw_ignorefile.txt" + cd _build + MSYSTEM= ./python.exe -m test -j8 --matchfile "$IGNOREFILE" -W + + - name: Install + shell: msys2 {0} + run: | + set -ex + cd _build + + pkgdir=python_pkgdir + + make -j1 install DESTDIR="${pkgdir}" + + # Fix shebangs + _pybasever=$(./python.exe -c "import sys; print(f'{sys.version_info[0]}.{sys.version_info[1]}');") + for fscripts in 2to3 2to3-${_pybasever} idle3 idle${_pybasever} pydoc3 pydoc${_pybasever}; do + sed -i "s|$(cygpath -w ${MINGW_PREFIX} | sed 's|\\|\\\\|g')/bin/python${_pybasever}.exe|/usr/bin/env python${_pybasever}.exe|g" "${pkgdir}${MINGW_PREFIX}"/bin/${fscripts} + done + sed -i "s|#!${pkgdir}${MINGW_PREFIX}/bin/python${_pybasever}.exe|#!/usr/bin/env python${_pybasever}.exe|" "${pkgdir}${MINGW_PREFIX}"/lib/python${_pybasever}/config-${_pybasever}/python-config.py + + # Create version-less aliases + cp "${pkgdir}${MINGW_PREFIX}"/bin/python3.exe "${pkgdir}${MINGW_PREFIX}"/bin/python.exe + cp "${pkgdir}${MINGW_PREFIX}"/bin/python3w.exe "${pkgdir}${MINGW_PREFIX}"/bin/pythonw.exe + cp "${pkgdir}${MINGW_PREFIX}"/bin/python3-config "${pkgdir}${MINGW_PREFIX}"/bin/python-config + cp "${pkgdir}${MINGW_PREFIX}"/bin/idle3 "${pkgdir}${MINGW_PREFIX}"/bin/idle + cp "${pkgdir}${MINGW_PREFIX}"/bin/pydoc3 "${pkgdir}${MINGW_PREFIX}"/bin/pydoc + + - name: Run Smoke Test (installed) + shell: msys2 {0} + run: | + export PYTHONTZPATH="${MINGW_PREFIX}/share/zoneinfo" + SMOKETESTS="$(pwd)/mingw_smoketests.py" + cd _build + cd python_pkgdir/${MINGW_PREFIX}/bin + ./python.exe "$SMOKETESTS" + MSYSTEM= ./python.exe "$SMOKETESTS" + + - name: Compress + if: always() + shell: msys2 {0} + run: | + cd _build + tar -zcf python.tar.gz python_pkgdir/ + + - name: Upload + uses: actions/upload-artifact@v2 + if: always() + with: + name: build-${{ matrix.msystem }} + path: _build/python.tar.gz + + cross: + runs-on: ubuntu-latest + container: + image: archlinux:base-devel + steps: + - uses: actions/checkout@v2 + - name: Install deps + run: | + pacman --noconfirm -Suuy + pacman --needed --noconfirm -S mingw-w64-gcc autoconf-archive autoconf automake python zip + + - name: Build + run: | + autoreconf -vfi + + mkdir _build && cd _build + + ../configure \ + --host=x86_64-w64-mingw32 \ + --build=x86_64-pc-linux-gnu \ + --enable-shared \ + --with-system-expat \ + --with-system-ffi \ + --with-system-libmpdec \ + --without-ensurepip \ + --without-c-locale-coercion \ + --enable-loadable-sqlite-extensions + + make -j8 + + make install DESTDIR="$(pwd)/install" + + - name: 'Zip files' + run: | + zip -r install.zip _build/install + + - name: Upload + uses: actions/upload-artifact@v2 + with: + name: build-cross + path: install.zip + + cross-test: + needs: [cross] + runs-on: windows-latest + steps: + - uses: actions/download-artifact@v2 + with: + name: build-cross + + - name: 'Run tests' + run: | + 7z x install.zip + ./_build/install/usr/local/bin/python3.exe -c "import sysconfig, pprint; pprint.pprint(sysconfig.get_config_vars())" diff --git a/mingw_ignorefile.txt b/mingw_ignorefile.txt new file mode 100644 index 00000000000000..dc3802e6c51313 --- /dev/null +++ b/mingw_ignorefile.txt @@ -0,0 +1,34 @@ +ctypes.test.test_loading.LoaderTest.test_load_dll_with_flags +distutils.tests.test_bdist_dumb.BuildDumbTestCase.test_simple_built +distutils.tests.test_cygwinccompiler.CygwinCCompilerTestCase.test_get_versions +distutils.tests.test_util.UtilTestCase.test_change_root +test.datetimetester.TestLocalTimeDisambiguation_Fast.* +test.datetimetester.TestLocalTimeDisambiguation_Pure.* +test.test_cmath.CMathTests.test_specific_values +test.test_cmd_line_script.CmdLineTest.test_consistent_sys_path_for_direct_execution +test.test_compileall.CommandLineTestsNoSourceEpoch.* +test.test_compileall.CommandLineTestsWithSourceEpoch.* +test.test_compileall.CompileallTestsWithoutSourceEpoch.* +test.test_compileall.CompileallTestsWithSourceEpoch.* +test.test_import.ImportTests.test_dll_dependency_import +test.test_math.MathTests.* +test.test_ntpath.NtCommonTest.test_import +test.test_os.StatAttributeTests.test_stat_block_device +test.test_os.TestScandir.test_attributes +test.test_os.UtimeTests.test_large_time +test.test_platform.PlatformTest.test_architecture_via_symlink +test.test_regrtest.ProgramsTestCase.test_pcbuild_rt +test.test_regrtest.ProgramsTestCase.test_tools_buildbot_test +test.test_site._pthFileTests.* +test.test_site.HelperFunctionsTests.* +test.test_site.StartupImportTests.* +test.test_ssl.* +test.test_strptime.CalculationTests.* +test.test_strptime.StrptimeTests.test_weekday +test.test_strptime.TimeRETests.test_compile +test.test_tools.test_i18n.Test_pygettext.test_POT_Creation_Date +test.test_venv.BasicTest.* +test.test_venv.EnsurePipTest.* +# flaky +test.test__xxsubinterpreters.* +test.test_asyncio.test_subprocess.SubprocessProactorTests.test_stdin_broken_pipe \ No newline at end of file diff --git a/mingw_smoketests.py b/mingw_smoketests.py new file mode 100644 index 00000000000000..70acbd12187308 --- /dev/null +++ b/mingw_smoketests.py @@ -0,0 +1,310 @@ +#!/usr/bin/env python3 +# Copyright 2017 Christoph Reiter +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +"""The goal of this test suite is collect tests for update regressions +and to test msys2 related modifications like for path handling. +Feel free to extend. +""" + +import os +import unittest +import sysconfig + +if "MSYSTEM" in os.environ: + SEP = "/" +else: + SEP = "\\" + +_UCRT = "clang" in sysconfig.get_platform() or "ucrt" in sysconfig.get_platform() + + +class Tests(unittest.TestCase): + + def test_zoneinfo(self): + # https://github.com/msys2-contrib/cpython-mingw/issues/32 + import zoneinfo + self.assertTrue(any(os.path.exists(p) for p in zoneinfo.TZPATH)) + zoneinfo.ZoneInfo("America/Sao_Paulo") + + def test_userdir_path_sep(self): + # Make sure os.path and pathlib use the same path separators + from unittest import mock + from os.path import expanduser + from pathlib import Path + + profiles = ["C:\\foo", "C:/foo"] + for profile in profiles: + with mock.patch.dict(os.environ, {"USERPROFILE": profile}): + self.assertEqual(expanduser("~"), os.path.normpath(expanduser("~"))) + self.assertEqual(str(Path("~").expanduser()), expanduser("~")) + self.assertEqual(str(Path.home()), expanduser("~")) + + def test_sysconfig_schemes(self): + # https://github.com/msys2/MINGW-packages/issues/9319 + import sysconfig + from distutils.dist import Distribution + from distutils.command.install import install + + names = ['scripts', 'purelib', 'platlib', 'data', 'include'] + for scheme in ["nt", "nt_user"]: + for name in names: + c = install(Distribution({"name": "foobar"})) + c.user = (scheme == "nt_user") + c.finalize_options() + if name == "include": + dist_path = os.path.dirname(getattr(c, "install_" + "headers")) + else: + dist_path = getattr(c, "install_" + name) + sys_path = sysconfig.get_path(name, scheme) + self.assertEqual(dist_path, sys_path, (scheme, name)) + + def test_ctypes_find_library(self): + from ctypes.util import find_library + from ctypes import cdll + self.assertTrue(cdll.msvcrt) + if _UCRT: + self.assertIsNone(find_library('c')) + else: + self.assertEqual(find_library('c'), 'msvcrt.dll') + + def test_ctypes_dlopen(self): + import ctypes + import sys + self.assertEqual(ctypes.RTLD_GLOBAL, 0) + self.assertEqual(ctypes.RTLD_GLOBAL, ctypes.RTLD_LOCAL) + self.assertFalse(hasattr(sys, 'setdlopenflags')) + self.assertFalse(hasattr(sys, 'getdlopenflags')) + self.assertFalse([n for n in dir(os) if n.startswith("RTLD_")]) + + def test_time_no_unix_stuff(self): + import time + self.assertFalse([n for n in dir(time) if n.startswith("clock_")]) + self.assertFalse([n for n in dir(time) if n.startswith("CLOCK_")]) + self.assertFalse([n for n in dir(time) if n.startswith("pthread_")]) + self.assertFalse(hasattr(time, 'tzset')) + + def test_strftime(self): + import time + with self.assertRaises(ValueError): + time.strftime('%Y', (12345,) + (0,) * 8) + + def test_sep(self): + self.assertEqual(os.sep, SEP) + + def test_module_file_path(self): + import asyncio + import zlib + self.assertEqual(zlib.__file__, os.path.normpath(zlib.__file__)) + self.assertEqual(asyncio.__file__, os.path.normpath(asyncio.__file__)) + + def test_importlib_frozen_path_sep(self): + import importlib._bootstrap_external + self.assertEqual(importlib._bootstrap_external.path_sep, SEP) + + def test_os_commonpath(self): + self.assertEqual( + os.path.commonpath( + [os.path.join("C:", os.sep, "foo", "bar"), + os.path.join("C:", os.sep, "foo")]), + os.path.join("C:", os.sep, "foo")) + + def test_pathlib(self): + import pathlib + + p = pathlib.Path("foo") / pathlib.Path("foo") + self.assertEqual(str(p), os.path.normpath(p)) + + def test_modules_import(self): + import sqlite3 + import ssl + import ctypes + import curses + + def test_socket_inet_ntop(self): + import socket + self.assertTrue(hasattr(socket, "inet_ntop")) + + def test_socket_inet_pton(self): + import socket + self.assertTrue(hasattr(socket, "inet_pton")) + + def test_multiprocessing_queue(self): + from multiprocessing import Queue + Queue(0) + + #def test_socket_timout_normal_error(self): + # import urllib.request + # from urllib.error import URLError + + # try: + # urllib.request.urlopen( + # 'http://localhost', timeout=0.0001).close() + # except URLError: + # pass + + def test_threads(self): + from concurrent.futures import ThreadPoolExecutor + + with ThreadPoolExecutor(1) as pool: + for res in pool.map(lambda *x: None, range(10000)): + pass + + def test_sysconfig(self): + import sysconfig + # This should be able to execute without exceptions + sysconfig.get_config_vars() + + def test_sqlite_enable_load_extension(self): + # Make sure --enable-loadable-sqlite-extensions is used + import sqlite3 + self.assertTrue(sqlite3.Connection.enable_load_extension) + + def test_venv_creation(self): + import tempfile + import venv + import subprocess + import shutil + with tempfile.TemporaryDirectory() as tmp: + builder = venv.EnvBuilder() + builder.create(tmp) + assert os.path.exists(os.path.join(tmp, "bin", "activate")) + assert os.path.exists(os.path.join(tmp, "bin", "python.exe")) + assert os.path.exists(os.path.join(tmp, "bin", "python3.exe")) + subprocess.check_call([shutil.which("bash.exe"), os.path.join(tmp, "bin", "activate")]) + + def test_has_mktime(self): + from time import mktime, gmtime + mktime(gmtime()) + + def test_platform_things(self): + import sys + import sysconfig + import platform + import importlib.machinery + self.assertEqual(sys.implementation.name, "cpython") + self.assertEqual(sys.platform, "win32") + self.assertTrue(sysconfig.get_platform().startswith("mingw")) + self.assertTrue(sysconfig.get_config_var('SOABI').startswith("cpython-")) + ext_suffix = sysconfig.get_config_var('EXT_SUFFIX') + self.assertTrue(ext_suffix.endswith(".pyd")) + self.assertTrue("mingw" in ext_suffix) + self.assertEqual(sysconfig.get_config_var('SHLIB_SUFFIX'), ".pyd") + ext_suffixes = importlib.machinery.EXTENSION_SUFFIXES + self.assertTrue(ext_suffix in ext_suffixes) + self.assertTrue(".pyd" in ext_suffixes) + self.assertEqual(sys.winver, ".".join(map(str, sys.version_info[:2]))) + self.assertEqual(platform.python_implementation(), "CPython") + self.assertEqual(platform.system(), "Windows") + self.assertTrue(isinstance(sys.api_version, int) and sys.api_version > 0) + + def test_c_ext_build(self): + import tempfile + import sys + import subprocess + import textwrap + from pathlib import Path + + with tempfile.TemporaryDirectory() as tmppro: + subprocess.check_call([sys.executable, "-m", "ensurepip", "--user"]) + with Path(tmppro, "setup.py").open("w") as f: + f.write( + textwrap.dedent( + """\ + from setuptools import setup, Extension + + setup( + name='cwrapper', + version='1.0', + ext_modules=[ + Extension( + 'cwrapper', + sources=['cwrapper.c']), + ], + ) + """ + ) + ) + with Path(tmppro, "cwrapper.c").open("w") as f: + f.write( + textwrap.dedent( + """\ + #include + static PyObject * + helloworld(PyObject *self, PyObject *args) + { + printf("Hello World\\n"); + return Py_None; + } + static PyMethodDef + myMethods[] = { + { "helloworld", helloworld, METH_NOARGS, "Prints Hello World" }, + { NULL, NULL, 0, NULL } + }; + static struct PyModuleDef cwrapper = { + PyModuleDef_HEAD_INIT, + "cwrapper", + "Test Module", + -1, + myMethods + }; + + PyMODINIT_FUNC + PyInit_cwrapper(void) + { + return PyModule_Create(&cwrapper); + } + """ + ) + ) + subprocess.check_call( + [sys.executable, "-c", "import struct"], + ) + subprocess.check_call( + [ + sys.executable, + "-m", + "pip", + "install", + "wheel", + ], + ) + subprocess.check_call( + [ + sys.executable, + "-m", + "pip", + "install", + tmppro, + ], + ) + subprocess.check_call( + [sys.executable, "-c", "import cwrapper"], + ) + + + +def suite(): + return unittest.TestLoader().loadTestsFromName(__name__) + + +if __name__ == '__main__': + unittest.main(defaultTest='suite') From cf3b23938a0484790267d468175a764bf17108aa Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Thu, 23 Sep 2021 09:57:56 +0200 Subject: [PATCH 113/138] smoketests: test that _decimal exists --- mingw_smoketests.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mingw_smoketests.py b/mingw_smoketests.py index 70acbd12187308..527aafbac78a2a 100644 --- a/mingw_smoketests.py +++ b/mingw_smoketests.py @@ -139,6 +139,9 @@ def test_modules_import(self): import ctypes import curses + def test_c_modules_import(self): + import _decimal + def test_socket_inet_ntop(self): import socket self.assertTrue(hasattr(socket, "inet_ntop")) From ab48de8138560997ad9fce42d9d6d2cf16af3cfc Mon Sep 17 00:00:00 2001 From: Long Nguyen Date: Fri, 1 Oct 2021 07:28:36 +0700 Subject: [PATCH 114/138] Prefer sysconfig.python_build --- Lib/distutils/command/build_ext.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py index 15987357280bb4..82a21d2c4cd8ae 100644 --- a/Lib/distutils/command/build_ext.py +++ b/Lib/distutils/command/build_ext.py @@ -219,7 +219,7 @@ def finalize_options(self): # For extensions under Cygwin, Python's library directory must be # appended to library_dirs if sys.platform[:6] == 'cygwin' or self.plat_name.startswith(('mingw')): - if sys.executable.startswith(os.path.join(sys.exec_prefix, "bin")): + if not sysconfig.python_build: # building third party extensions config_dir_name = os.path.basename(sysconfig.get_config_var('LIBPL')) self.library_dirs.append(os.path.join(sys.prefix, "lib", From 2caabd36e70ec8ca662ffb02f30b77f421493c36 Mon Sep 17 00:00:00 2001 From: Naveen M K Date: Tue, 12 Oct 2021 18:35:21 +0530 Subject: [PATCH 115/138] Define PY3_DLLNAME to fix build PY3_DLLNAME is used in Python/pathconfig.c but isn't defined. I guess it is useless but it will fix the build. Co-authored-by: jeremyd2019 --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index a1131d8bb70669..b99bb52099d33e 100644 --- a/configure.ac +++ b/configure.ac @@ -3988,7 +3988,7 @@ then *-*-mingw*) DYNLOADFILE="dynload_win.o" extra_machdep_objs="$extra_machdep_objs PC/dl_nt.o" - CFLAGS_NODIST="$CFLAGS_NODIST -DMS_DLL_ID='\"$VERSION\"'" + CFLAGS_NODIST="$CFLAGS_NODIST -DMS_DLL_ID='\"$VERSION\"' -DPY3_DLLNAME='L\"$DLLLIBRARY\"'" ;; esac fi From f3590568b8b51da9e668f40a208a0bab9d417c3f Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Sun, 7 Nov 2021 23:06:13 +0100 Subject: [PATCH 116/138] distutils: remove checks for ancient gcc/binutils The versions checked here are 20 years old. Also dllwrap has started to emit a deprecation warning in the latest release spamming the build logs. Fixes #54 --- Lib/distutils/cygwinccompiler.py | 123 +++----------------- Lib/distutils/tests/test_cygwinccompiler.py | 36 +----- 2 files changed, 15 insertions(+), 144 deletions(-) diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py index 6a40e809c52741..2804f693815045 100644 --- a/Lib/distutils/cygwinccompiler.py +++ b/Lib/distutils/cygwinccompiler.py @@ -50,15 +50,13 @@ import os import sys import copy -import re from distutils.unixccompiler import UnixCCompiler from distutils.file_util import write_file from distutils.errors import (DistutilsExecError, CCompilerError, CompileError, UnknownFileError) -from distutils.version import LooseVersion from distutils.spawn import find_executable -from subprocess import Popen, PIPE, check_output +from subprocess import Popen, check_output def get_msvcr(): """Include the appropriate MSVC runtime library if Python was built @@ -115,33 +113,8 @@ def __init__(self, verbose=0, dry_run=0, force=0): self.cc = os.environ.get('CC', 'gcc') self.cxx = os.environ.get('CXX', 'g++') - if ('gcc' in self.cc): # Start gcc workaround - self.gcc_version, self.ld_version, self.dllwrap_version = \ - get_versions() - self.debug_print(self.compiler_type + ": gcc %s, ld %s, dllwrap %s\n" % - (self.gcc_version, - self.ld_version, - self.dllwrap_version) ) - - # ld_version >= "2.10.90" and < "2.13" should also be able to use - # gcc -mdll instead of dllwrap - # Older dllwraps had own version numbers, newer ones use the - # same as the rest of binutils ( also ld ) - # dllwrap 2.10.90 is buggy - if self.ld_version >= "2.10.90": - self.linker_dll = self.cc - else: - self.linker_dll = "dllwrap" - - # ld_version >= "2.13" support -shared so use it instead of - # -mdll -static - if self.ld_version >= "2.13": - shared_option = "-shared" - else: - shared_option = "-mdll -static" - else: # Assume linker is up to date - self.linker_dll = self.cc - shared_option = "-shared" + self.linker_dll = self.cc + shared_option = "-shared" self.set_executables(compiler='%s -mcygwin -O -Wall' % self.cc, compiler_so='%s -mcygwin -mdll -O -Wall' % self.cc, @@ -150,17 +123,9 @@ def __init__(self, verbose=0, dry_run=0, force=0): linker_so=('%s -mcygwin %s' % (self.linker_dll, shared_option))) - # cygwin and mingw32 need different sets of libraries - if ('gcc' in self.cc and self.gcc_version == "2.91.57"): - # cygwin shouldn't need msvcrt, but without the dlls will crash - # (gcc version 2.91.57) -- perhaps something about initialization - self.dll_libraries=["msvcrt"] - self.warn( - "Consider upgrading to a newer version of gcc") - else: - # Include the appropriate MSVC runtime library if Python was built - # with MSVC 7.0 or later. - self.dll_libraries = get_msvcr() + # Include the appropriate MSVC runtime library if Python was built + # with MSVC 7.0 or later. + self.dll_libraries = get_msvcr() def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts): """Compiles the source by spawning GCC and windres if needed.""" @@ -244,24 +209,17 @@ def link(self, target_desc, objects, output_filename, output_dir=None, # next add options for def-file and to creating import libraries - # dllwrap uses different options than gcc/ld - if self.linker_dll == "dllwrap": - extra_preargs.extend(["--output-lib", lib_file]) - # for dllwrap we have to use a special option - extra_preargs.extend(["--def", def_file]) - # we use gcc/ld here and can be sure ld is >= 2.9.10 - else: - # doesn't work: bfd_close build\...\libfoo.a: Invalid operation - #extra_preargs.extend(["-Wl,--out-implib,%s" % lib_file]) - # for gcc/ld the def-file is specified as any object files - objects.append(def_file) + # doesn't work: bfd_close build\...\libfoo.a: Invalid operation + #extra_preargs.extend(["-Wl,--out-implib,%s" % lib_file]) + # for gcc/ld the def-file is specified as any object files + objects.append(def_file) #end: if ((export_symbols is not None) and # (target_desc != self.EXECUTABLE or self.linker_dll == "gcc")): # who wants symbols and a many times larger output file # should explicitly switch the debug mode on - # otherwise we let dllwrap/ld strip the output file + # otherwise we let ld strip the output file # (On my machine: 10KiB < stripped_file < ??100KiB # unstripped_file = stripped_file + XXX KiB # ( XXX=254 for a typical python extension)) @@ -314,19 +272,7 @@ def __init__(self, verbose=0, dry_run=0, force=0): CygwinCCompiler.__init__ (self, verbose, dry_run, force) - # ld_version >= "2.13" support -shared so use it instead of - # -mdll -static - if ('gcc' in self.cc and self.ld_version < "2.13"): - shared_option = "-mdll -static" - else: - shared_option = "-shared" - - # A real mingw32 doesn't need to specify a different entry point, - # but cygwin 2.91.57 in no-cygwin-mode needs it. - if ('gcc' in self.cc and self.gcc_version <= "2.91.57"): - entry_point = '--entry _DllMain@12' - else: - entry_point = '' + shared_option = "-shared" if is_cygwincc(self.cc): raise CCompilerError( @@ -336,9 +282,8 @@ def __init__(self, verbose=0, dry_run=0, force=0): compiler_so='%s -mdll -O2 -Wall' % self.cc, compiler_cxx='%s -O2 -Wall' % self.cxx, linker_exe='%s' % self.cc, - linker_so='%s %s %s' - % (self.linker_dll, shared_option, - entry_point)) + linker_so='%s %s' + % (self.linker_dll, shared_option)) # Maybe we should also append -mthreads, but then the finished # dlls need another dll (mingwm10.dll see Mingw32 docs) # (-mthreads: Support thread-safe exception handling on `Mingw32') @@ -405,46 +350,6 @@ def check_config_h(): return (CONFIG_H_UNCERTAIN, "couldn't read '%s': %s" % (fn, exc.strerror)) -RE_VERSION = re.compile(br'[\D\s]*(\d+\.\d+(\.\d+)*)[\D\s]*') - -def _find_exe_version(cmd): - """Find the version of an executable by running `cmd` in the shell. - - If the command is not found, or the output does not match - `RE_VERSION`, returns None. - """ - executable = cmd.split()[0] - if find_executable(executable) is None: - return None - from subprocess import Popen, PIPE - out = Popen(cmd, shell=True, stdout=PIPE).stdout - try: - out_string = out.read() - finally: - out.close() - result = RE_VERSION.search(out_string) - if result is None: - return None - # LooseVersion works with strings - # so we need to decode our bytes - return LooseVersion(result.group(1).decode()) - -def get_versions(): - """ Try to find out the versions of gcc, ld and dllwrap. - - If not possible it returns None for it. - """ - gcc = os.environ.get('CC') or 'gcc' - ld = 'ld' - out = Popen(gcc+' --print-prog-name ld', shell=True, stdout=PIPE).stdout - try: - ld = test=str(out.read(),encoding='utf-8').strip() - finally: - out.close() - dllwrap = os.environ.get('DLLWRAP') or 'dllwrap' - # MinGW64 doesn't have i686-w64-mingw32-ld, so instead we ask gcc. - commands = [gcc+' -dumpversion', ld+' -v', dllwrap+' --version'] - return tuple([_find_exe_version(cmd) for cmd in commands]) def is_cygwincc(cc): '''Try to determine if the compiler that would be used is from cygwin.''' diff --git a/Lib/distutils/tests/test_cygwinccompiler.py b/Lib/distutils/tests/test_cygwinccompiler.py index 9dc869de4c8ef0..f525ab49de3d91 100644 --- a/Lib/distutils/tests/test_cygwinccompiler.py +++ b/Lib/distutils/tests/test_cygwinccompiler.py @@ -8,7 +8,7 @@ from distutils import cygwinccompiler from distutils.cygwinccompiler import (check_config_h, CONFIG_H_OK, CONFIG_H_NOTOK, - CONFIG_H_UNCERTAIN, get_versions, + CONFIG_H_UNCERTAIN, get_msvcr) from distutils.tests import support @@ -81,40 +81,6 @@ def test_check_config_h(self): self.write_file(self.python_h, 'xxx __GNUC__ xxx') self.assertEqual(check_config_h()[0], CONFIG_H_OK) - def test_get_versions(self): - - # get_versions calls distutils.spawn.find_executable on - # 'gcc', 'ld' and 'dllwrap' - self.assertEqual(get_versions(), (None, None, None)) - - # Let's fake we have 'gcc' and it returns '3.4.5' - self._exes['gcc'] = b'gcc (GCC) 3.4.5 (mingw special)\nFSF' - res = get_versions() - self.assertEqual(str(res[0]), '3.4.5') - - # and let's see what happens when the version - # doesn't match the regular expression - # (\d+\.\d+(\.\d+)*) - self._exes['gcc'] = b'very strange output' - res = get_versions() - self.assertEqual(res[0], None) - - # same thing for ld - self._exes['ld'] = b'GNU ld version 2.17.50 20060824' - res = get_versions() - self.assertEqual(str(res[1]), '2.17.50') - self._exes['ld'] = b'@(#)PROGRAM:ld PROJECT:ld64-77' - res = get_versions() - self.assertEqual(res[1], None) - - # and dllwrap - self._exes['dllwrap'] = b'GNU dllwrap 2.17.50 20060824\nFSF' - res = get_versions() - self.assertEqual(str(res[2]), '2.17.50') - self._exes['dllwrap'] = b'Cheese Wrap' - res = get_versions() - self.assertEqual(res[2], None) - def test_get_msvcr(self): # none From 951d58c847dc548cbb1cf4793429220d8d615d80 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Sun, 7 Nov 2021 23:12:10 +0100 Subject: [PATCH 117/138] distutils: split CC env var before passing to subprocess In case CC="ccache gcc" then subprocess would interpret it as one command and fail to find it. Instead split the command line into separate arguments. Fixes #53 --- Lib/distutils/cygwinccompiler.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py index 2804f693815045..6e22555af72fef 100644 --- a/Lib/distutils/cygwinccompiler.py +++ b/Lib/distutils/cygwinccompiler.py @@ -50,6 +50,7 @@ import os import sys import copy +import shlex from distutils.unixccompiler import UnixCCompiler from distutils.file_util import write_file @@ -353,5 +354,5 @@ def check_config_h(): def is_cygwincc(cc): '''Try to determine if the compiler that would be used is from cygwin.''' - out_string = check_output([cc, '-dumpmachine']) + out_string = check_output(shlex.split(cc) + ['-dumpmachine']) return out_string.strip().endswith(b'cygwin') From ab5770169dacec08eb7bce5d3ffa57884a93f8c3 Mon Sep 17 00:00:00 2001 From: Long Nguyen Date: Sun, 14 Nov 2021 14:55:35 +0700 Subject: [PATCH 118/138] _testconsole.c: Fix casing & path sep --- PC/_testconsole.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PC/_testconsole.c b/PC/_testconsole.c index db84f73c7744f3..eecf2f952ff714 100644 --- a/PC/_testconsole.c +++ b/PC/_testconsole.c @@ -6,7 +6,7 @@ #ifdef MS_WINDOWS -#include "..\modules\_io\_iomodule.h" +#include "../Modules/_io/_iomodule.h" #define WIN32_LEAN_AND_MEAN #include @@ -104,7 +104,7 @@ _testconsole_read_output_impl(PyObject *module, PyObject *file) Py_RETURN_NONE; } -#include "clinic\_testconsole.c.h" +#include "clinic/_testconsole.c.h" PyMethodDef testconsole_methods[] = { _TESTCONSOLE_WRITE_INPUT_METHODDEF From 27de30a567cfc4d42cbb0f98ca3f5c3d1853907e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Fri, 19 Nov 2021 12:18:06 +0200 Subject: [PATCH 119/138] Return consistent architecture markers for python on mingw/armv7 --- Lib/distutils/util.py | 2 ++ Lib/sysconfig.py | 2 ++ Python/getcompiler.c | 2 ++ configure.ac | 3 +++ 4 files changed, 9 insertions(+) diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py index 28e623b95d78fd..81626b394612c2 100644 --- a/Lib/distutils/util.py +++ b/Lib/distutils/util.py @@ -47,6 +47,8 @@ def get_host_platform(): return 'mingw_x86_64_clang' if 'arm64' in sys.version.lower(): return 'mingw_aarch64' + if 'arm' in sys.version.lower(): + return 'mingw_armv7' return 'mingw_i686_clang' if 'amd64' in sys.version.lower(): return 'mingw_x86_64' diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index 61f3cc6a2e6390..a44efe09f2c856 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -731,6 +731,8 @@ def get_platform(): return 'mingw_x86_64_clang' if 'arm64' in sys.version.lower(): return 'mingw_aarch64' + if 'arm' in sys.version.lower(): + return 'mingw_armv7' return 'mingw_i686_clang' if 'amd64' in sys.version.lower(): return 'mingw_x86_64' diff --git a/Python/getcompiler.c b/Python/getcompiler.c index 275f79997b4241..4b0b9b328ba2f8 100644 --- a/Python/getcompiler.c +++ b/Python/getcompiler.c @@ -20,6 +20,8 @@ #define ARCH_SUFFIX " 64 bit (AMD64)" #elif defined(__aarch64__) #define ARCH_SUFFIX " 64 bit (ARM64)" +#elif defined(__arm__) +#define ARCH_SUFFIX " 32 bit (ARM)" #else #define ARCH_SUFFIX " 32 bit" #endif diff --git a/configure.ac b/configure.ac index b99bb52099d33e..ef7d20d2db906f 100644 --- a/configure.ac +++ b/configure.ac @@ -5221,6 +5221,9 @@ case $host_os in aarch64-*-mingw*) PYD_PLATFORM_TAG+="mingw_aarch64" ;; + armv7-*-mingw*) + PYD_PLATFORM_TAG+="mingw_armv7" + ;; esac AC_MSG_RESULT($PYD_PLATFORM_TAG) esac From 46b1b45a039656e5b9ec71bd63ffa6ecc7d5964e Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Sun, 21 Nov 2021 14:00:06 +0100 Subject: [PATCH 120/138] distutils: add back gcc_version older numpy depends on it and there are users building it directly via pip --- Lib/distutils/cygwinccompiler.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py index 6e22555af72fef..d8c8428ac0d440 100644 --- a/Lib/distutils/cygwinccompiler.py +++ b/Lib/distutils/cygwinccompiler.py @@ -56,6 +56,7 @@ from distutils.file_util import write_file from distutils.errors import (DistutilsExecError, CCompilerError, CompileError, UnknownFileError) +from distutils.version import LooseVersion from distutils.spawn import find_executable from subprocess import Popen, check_output @@ -114,6 +115,12 @@ def __init__(self, verbose=0, dry_run=0, force=0): self.cc = os.environ.get('CC', 'gcc') self.cxx = os.environ.get('CXX', 'g++') + # Older numpy dependend on this existing to check for ancient + # gcc versions. This doesn't make much sense with clang etc so + # just hardcode to something recent. + # https://github.com/numpy/numpy/pull/20333 + self.gcc_version = LooseVersion("11.2.0") + self.linker_dll = self.cc shared_option = "-shared" From 7035cb3d29504bdfab7bac343c4e16e7226b3e8f Mon Sep 17 00:00:00 2001 From: jeremyd2019 Date: Mon, 22 Nov 2021 13:15:12 -0800 Subject: [PATCH 121/138] fix mingw cross compiling in setup.py gcc outputs with `;` path delimiter on mingw, so use `os.pathsep` instead of `:` (assuming this is a host rather than target decision) clang does not output `LIBRARY_PATH` with `-E -v`, so add an extra call to `-print-search-dirs` to find its library path. --- setup.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 900d78b1a15a97..6835de5b53523c 100644 --- a/setup.py +++ b/setup.py @@ -789,14 +789,25 @@ def add_cross_compiling_paths(self): elif line.startswith("End of search list"): in_incdirs = False elif (is_gcc or is_clang) and line.startswith("LIBRARY_PATH"): - for d in line.strip().split("=")[1].split(":"): + for d in line.strip().split("=")[1].split(os.pathsep): d = os.path.normpath(d) - if '/gcc/' not in d: + if '/gcc/' not in d and '/clang/' not in d: add_dir_to_list(self.compiler.library_dirs, d) elif (is_gcc or is_clang) and in_incdirs and '/gcc/' not in line and '/clang/' not in line: add_dir_to_list(self.compiler.include_dirs, line.strip()) + if is_clang: + ret = run_command('%s -print-search-dirs >%s' % (CC, tmpfile)) + if ret == 0: + with open(tmpfile) as fp: + for line in fp.readlines(): + if line.startswith("libraries:"): + for d in line.strip().split("=")[1].split(os.pathsep): + d = os.path.normpath(d) + if '/gcc/' not in d and '/clang/' not in d: + add_dir_to_list(self.compiler.library_dirs, + d) finally: os.unlink(tmpfile) From e52e780c2843065a6c1b96aa45c6cbce082f2072 Mon Sep 17 00:00:00 2001 From: Naveen M K Date: Fri, 21 Jan 2022 19:25:44 +0530 Subject: [PATCH 122/138] Use actions/setup-python for setting up correct version in cross build Fixes https://github.com/msys2-contrib/cpython-mingw/issues/67 (Updated for python 3.10) --- .github/workflows/mingw.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/mingw.yml b/.github/workflows/mingw.yml index 122ac03603ca84..7170818724e767 100644 --- a/.github/workflows/mingw.yml +++ b/.github/workflows/mingw.yml @@ -162,7 +162,16 @@ jobs: - name: Install deps run: | pacman --noconfirm -Suuy - pacman --needed --noconfirm -S mingw-w64-gcc autoconf-archive autoconf automake python zip + pacman --needed --noconfirm -S mingw-w64-gcc autoconf-archive autoconf automake zip + + - uses: actions/setup-python@v2 + with: + python-version: '3.10' + + - name: Check Python Version + run: | + which python + python --version - name: Build run: | From f753888a47a45c157ed12ad33e637a4c5d3e0751 Mon Sep 17 00:00:00 2001 From: jeremyd2019 Date: Mon, 22 Nov 2021 16:04:41 -0800 Subject: [PATCH 123/138] handle ncursesw pkg-config when cross-compiling strip extra args from pkg-config --cflags-only-I, setup.py is only expecting a single path. Use pkg-config ncursesw include dir even if cross-compiling (PKG_CONFIG_PATH should be set in that case). --- configure.ac | 8 +++----- setup.py | 3 +-- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/configure.ac b/configure.ac index ef7d20d2db906f..34b2a03b0f0ba0 100644 --- a/configure.ac +++ b/configure.ac @@ -3406,7 +3406,7 @@ else fi if test "$with_system_ffi" = "yes" && test -n "$PKG_CONFIG"; then - LIBFFI_INCLUDEDIR="`"$PKG_CONFIG" libffi --cflags-only-I 2>/dev/null | sed -e 's/^-I//;s/ *$//'`" + LIBFFI_INCLUDEDIR="`"$PKG_CONFIG" libffi --cflags-only-I 2>/dev/null | sed -e 's/^-I//;s/ .*$//'`" else LIBFFI_INCLUDEDIR="" fi @@ -5657,7 +5657,7 @@ then fi if test -n "$PKG_CONFIG"; then - NCURSESW_INCLUDEDIR="`"$PKG_CONFIG" ncursesw --cflags-only-I 2>/dev/null | sed -e 's/^-I//;s/ *$//'`" + NCURSESW_INCLUDEDIR="`"$PKG_CONFIG" ncursesw --cflags-only-I 2>/dev/null | sed -e 's/^-I//;s/ .*$//'`" else NCURSESW_INCLUDEDIR="" fi @@ -5665,9 +5665,7 @@ AC_SUBST(NCURSESW_INCLUDEDIR) # first curses header check ac_save_cppflags="$CPPFLAGS" -if test "$cross_compiling" = no; then - CPPFLAGS="$CPPFLAGS -I$NCURSESW_INCLUDEDIR" -fi +CPPFLAGS="$CPPFLAGS -I$NCURSESW_INCLUDEDIR" AC_CHECK_HEADERS(curses.h ncurses.h) diff --git a/setup.py b/setup.py index 6835de5b53523c..1973c7d937b44f 100644 --- a/setup.py +++ b/setup.py @@ -1217,8 +1217,7 @@ def detect_readline_curses(self): panel_library = 'panel' if curses_library == 'ncursesw': curses_defines.append(('HAVE_NCURSESW', '1')) - if not CROSS_COMPILING: - curses_includes.append(sysconfig.get_config_var("NCURSESW_INCLUDEDIR")) + curses_includes.append(sysconfig.get_config_var("NCURSESW_INCLUDEDIR")) # Bug 1464056: If _curses.so links with ncursesw, # _curses_panel.so must link with panelw. panel_library = 'panelw' From 27fe82d981894031ffc9ca59586f7f281ee4ca82 Mon Sep 17 00:00:00 2001 From: Jeremy Drake Date: Fri, 21 Jan 2022 17:47:04 -0800 Subject: [PATCH 124/138] CI: add cross llvm-mingw jobs --- .github/workflows/mingw.yml | 85 ++++++++++++++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 5 deletions(-) diff --git a/.github/workflows/mingw.yml b/.github/workflows/mingw.yml index 7170818724e767..5b75c43fdcd761 100644 --- a/.github/workflows/mingw.yml +++ b/.github/workflows/mingw.yml @@ -153,7 +153,7 @@ jobs: name: build-${{ matrix.msystem }} path: _build/python.tar.gz - cross: + cross-gcc-x86_64: runs-on: ubuntu-latest container: image: archlinux:base-devel @@ -201,18 +201,93 @@ jobs: - name: Upload uses: actions/upload-artifact@v2 with: - name: build-cross + name: build-cross-gcc-x86_64 path: install.zip - cross-test: - needs: [cross] + cross-gcc-x86_64-test: + needs: [cross-gcc-x86_64] runs-on: windows-latest steps: - uses: actions/download-artifact@v2 with: - name: build-cross + name: build-cross-gcc-x86_64 - name: 'Run tests' run: | 7z x install.zip ./_build/install/usr/local/bin/python3.exe -c "import sysconfig, pprint; pprint.pprint(sysconfig.get_config_vars())" + + + cross-llvm-mingw: + runs-on: ubuntu-18.04 + container: + image: mstorsjo/llvm-mingw:latest + strategy: + matrix: + arch: ['x86_64', 'i686', 'aarch64', 'armv7'] + steps: + - uses: actions/checkout@v2 + - name: Install deps + run: | + apt-get update -qq + apt-get install -qqy autoconf-archive + + - uses: actions/setup-python@v2 + with: + python-version: '3.10' + + - name: Check Python Version + run: | + which python + python --version + + - name: Build + run: | + autoreconf -vfi + + mkdir _build && cd _build + + export CC=${{ matrix.arch }}-w64-mingw32-clang + export CXX=${CC}++ + ../configure \ + --host=${{ matrix.arch }}-w64-mingw32 \ + --build=x86_64-pc-linux-gnu \ + --enable-shared \ + --with-system-expat \ + --with-system-ffi \ + --with-system-libmpdec \ + --without-ensurepip \ + --without-c-locale-coercion \ + --enable-loadable-sqlite-extensions + + make -j8 + + make install DESTDIR="$(pwd)/install" + + - name: 'Zip files' + run: | + zip -r install.zip _build/install + + - name: Upload + uses: actions/upload-artifact@v2 + with: + name: build-cross-llvm-mingw-${{ matrix.arch }} + path: install.zip + + cross-llvm-mingw-test: + needs: [cross-llvm-mingw] + runs-on: windows-latest + strategy: + matrix: + arch: ['x86_64', 'i686'] + steps: + - uses: actions/download-artifact@v2 + with: + name: build-cross-llvm-mingw-${{ matrix.arch }} + + - name: 'Run tests' + run: | + 7z x install.zip + ./_build/install/usr/local/bin/python3.exe -c "import sysconfig, pprint; pprint.pprint(sysconfig.get_config_vars())" + + From f3a9fc208b7cb826b57b32cf383954e8e80101d5 Mon Sep 17 00:00:00 2001 From: jeremyd2019 Date: Sat, 22 Jan 2022 11:33:00 -0800 Subject: [PATCH 125/138] mingw_smoketests: fix _UCRT condition The prior detection missed ARM (32 and 64) being UCRT. Since there are fewer non-UCRT platforms, list those two instead of trying to extend the list of UCRT. --- mingw_smoketests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mingw_smoketests.py b/mingw_smoketests.py index 527aafbac78a2a..a3e50f99a762d3 100644 --- a/mingw_smoketests.py +++ b/mingw_smoketests.py @@ -34,7 +34,7 @@ else: SEP = "\\" -_UCRT = "clang" in sysconfig.get_platform() or "ucrt" in sysconfig.get_platform() +_UCRT = sysconfig.get_platform() not in ('mingw_x86_64', 'mingw_i686') class Tests(unittest.TestCase): From 055c9211173b4d80ab2729adf8c8faa8de3cc150 Mon Sep 17 00:00:00 2001 From: jeremyd2019 Date: Sat, 22 Jan 2022 12:08:33 -0800 Subject: [PATCH 126/138] CI: fix sed pattern for python-config.py shebang The shebang (`#!`) does not include `${pkgdir}` so this sed did nothing --- .github/workflows/mingw.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/mingw.yml b/.github/workflows/mingw.yml index 5b75c43fdcd761..999ccf9465e4a6 100644 --- a/.github/workflows/mingw.yml +++ b/.github/workflows/mingw.yml @@ -120,7 +120,7 @@ jobs: for fscripts in 2to3 2to3-${_pybasever} idle3 idle${_pybasever} pydoc3 pydoc${_pybasever}; do sed -i "s|$(cygpath -w ${MINGW_PREFIX} | sed 's|\\|\\\\|g')/bin/python${_pybasever}.exe|/usr/bin/env python${_pybasever}.exe|g" "${pkgdir}${MINGW_PREFIX}"/bin/${fscripts} done - sed -i "s|#!${pkgdir}${MINGW_PREFIX}/bin/python${_pybasever}.exe|#!/usr/bin/env python${_pybasever}.exe|" "${pkgdir}${MINGW_PREFIX}"/lib/python${_pybasever}/config-${_pybasever}/python-config.py + sed -i "s|#!${MINGW_PREFIX}/bin/python${_pybasever}.exe|#!/usr/bin/env python${_pybasever}.exe|" "${pkgdir}${MINGW_PREFIX}"/lib/python${_pybasever}/config-${_pybasever}/python-config.py # Create version-less aliases cp "${pkgdir}${MINGW_PREFIX}"/bin/python3.exe "${pkgdir}${MINGW_PREFIX}"/bin/python.exe From 0d9fd1576a7b4b447d92dd1fac727ea3deb5e6a9 Mon Sep 17 00:00:00 2001 From: Naveen M K Date: Wed, 19 Jan 2022 19:39:20 +0530 Subject: [PATCH 127/138] Modify `sys.winver` to match upstream With this change `sys.winver` will add the Arch for which python was compiled on, for example in 32-bits, `sys.winver` will be `3.10-32`, for arm32 it would be `3.10-arm32` and so on. See https://github.com/msys2-contrib/cpython-mingw/issues/40 --- configure.ac | 22 ++++++++++++++++++---- mingw_smoketests.py | 9 ++++++++- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index 34b2a03b0f0ba0..79a5feb442093d 100644 --- a/configure.ac +++ b/configure.ac @@ -3986,10 +3986,24 @@ then esac case $host in *-*-mingw*) - DYNLOADFILE="dynload_win.o" - extra_machdep_objs="$extra_machdep_objs PC/dl_nt.o" - CFLAGS_NODIST="$CFLAGS_NODIST -DMS_DLL_ID='\"$VERSION\"' -DPY3_DLLNAME='L\"$DLLLIBRARY\"'" - ;; + DYNLOADFILE="dynload_win.o" + extra_machdep_objs="$extra_machdep_objs PC/dl_nt.o" + CFLAGS_NODIST="$CFLAGS_NODIST -DPY3_DLLNAME='L\"$DLLLIBRARY\"'" + case $host in + i686*) + CFLAGS_NODIST="$CFLAGS_NODIST -DMS_DLL_ID='\"${VERSION}-32\"'" + ;; + armv7*) + CFLAGS_NODIST="$CFLAGS_NODIST -DMS_DLL_ID='\"${VERSION}-arm32\"'" + ;; + aarch64*) + CFLAGS_NODIST="$CFLAGS_NODIST -DMS_DLL_ID='\"${VERSION}-arm64\"'" + ;; + *) + CFLAGS_NODIST="$CFLAGS_NODIST -DMS_DLL_ID='\"$VERSION\"'" + ;; + esac + ;; esac fi AC_MSG_RESULT($DYNLOADFILE) diff --git a/mingw_smoketests.py b/mingw_smoketests.py index a3e50f99a762d3..4f17e16d405341 100644 --- a/mingw_smoketests.py +++ b/mingw_smoketests.py @@ -214,7 +214,14 @@ def test_platform_things(self): ext_suffixes = importlib.machinery.EXTENSION_SUFFIXES self.assertTrue(ext_suffix in ext_suffixes) self.assertTrue(".pyd" in ext_suffixes) - self.assertEqual(sys.winver, ".".join(map(str, sys.version_info[:2]))) + if sysconfig.get_platform().startswith('mingw_i686'): + self.assertEqual(sys.winver, ".".join(map(str, sys.version_info[:2])) + '-32') + elif sysconfig.get_platform().startswith('mingw_aarch64'): + self.assertEqual(sys.winver, ".".join(map(str, sys.version_info[:2])) + '-arm64') + elif sysconfig.get_platform().startswith('mingw_armv7'): + self.assertEqual(sys.winver, ".".join(map(str, sys.version_info[:2])) + '-arm32') + else: + self.assertEqual(sys.winver, ".".join(map(str, sys.version_info[:2]))) self.assertEqual(platform.python_implementation(), "CPython") self.assertEqual(platform.system(), "Windows") self.assertTrue(isinstance(sys.api_version, int) and sys.api_version > 0) From f29faf5cf4bab7fd6d6f9ac471b20680ee908a27 Mon Sep 17 00:00:00 2001 From: Naveen M K Date: Wed, 19 Jan 2022 20:01:45 +0530 Subject: [PATCH 128/138] Change user site-packages path to include the environment info This should avoid mixing of user site-packages between python from various environments. Previously, the user site-packages should be located at `~/.local/lib/python3.10` for all environment including 32-bits variants which caused problems with 64-bit trying to load 32-bit extensions. Now this path will be changed to `~/.local/lib/python3.10-`, for example, in CLANG64 this would be `~/.local/lib/python3.10-mingw_x86_64_clang`. Fixes https://github.com/msys2-contrib/cpython-mingw/issues/40 --- Lib/distutils/command/install.py | 5 +++-- Lib/site.py | 28 +++++++++++++++++++++++++--- Lib/sysconfig.py | 26 +++++++++++++++----------- 3 files changed, 43 insertions(+), 16 deletions(-) diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py index 9cb3b2c17f0b81..25eb3d8d10133a 100644 --- a/Lib/distutils/command/install.py +++ b/Lib/distutils/command/install.py @@ -72,7 +72,7 @@ INSTALL_SCHEMES['nt_user'] = { 'purelib': '$usersite', 'platlib': '$usersite', - 'headers': '$userbase/include/python$py_version_short$abiflags/$dist_name', + 'headers': '$userbase/include/python$py_version_short_plat$abiflags/$dist_name', 'scripts': '$userbase/bin', 'data' : '$userbase', } @@ -81,7 +81,7 @@ 'purelib': '$usersite', 'platlib': '$usersite', 'headers': - '$userbase/include/python$py_version_short$abiflags/$dist_name', + '$userbase/include/python$py_version_short_plat$abiflags/$dist_name', 'scripts': '$userbase/bin', 'data' : '$userbase', } @@ -311,6 +311,7 @@ def finalize_options(self): 'py_version': py_version, 'py_version_short': '%d.%d' % sys.version_info[:2], 'py_version_nodot': '%d%d' % sys.version_info[:2], + 'py_version_short_plat': f'{sys.version_info[0]}.{sys.version_info[1]}-{get_platform()}' if os.name == 'nt' and 'gcc' in sys.version.lower() else f'{sys.version_info[0]}.{sys.version_info[1]}', 'sys_prefix': prefix, 'prefix': prefix, 'sys_exec_prefix': exec_prefix, diff --git a/Lib/site.py b/Lib/site.py index 49c6ce06d4cfcd..877167b7a0f36d 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -289,14 +289,36 @@ def joinuser(*args): return joinuser("~", ".local") +# Copy of sysconfig.get_platform() but only for MinGW +def _get_platform(): + if os.name == 'nt': + if 'gcc' in sys.version.lower(): + if 'ucrt' in sys.version.lower(): + if 'amd64' in sys.version.lower(): + return 'mingw_x86_64_ucrt' + return 'mingw_i686_ucrt' + if 'clang' in sys.version.lower(): + if 'amd64' in sys.version.lower(): + return 'mingw_x86_64_clang' + if 'arm64' in sys.version.lower(): + return 'mingw_aarch64' + if 'arm' in sys.version.lower(): + return 'mingw_armv7' + return 'mingw_i686_clang' + if 'amd64' in sys.version.lower(): + return 'mingw_x86_64' + return 'mingw_i686' + return sys.platform # Same to sysconfig.get_path('purelib', os.name+'_user') def _get_path(userbase): version = sys.version_info - if os.name == 'nt' and not _POSIX_BUILD: - ver_nodot = sys.winver.replace('.', '') - return f'{userbase}\\Python{ver_nodot}\\site-packages' + if os.name == 'nt': + if not _POSIX_BUILD: + ver_nodot = sys.winver.replace('.', '') + return f'{userbase}\\Python{ver_nodot}\\site-packages' + return f'{userbase}/lib/python{version[0]}.{version[1]}-{_get_platform()}/site-packages' if sys.platform == 'darwin' and sys._framework: return f'{userbase}/lib/python/site-packages' diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index a44efe09f2c856..9e1df5d999bb85 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -95,20 +95,20 @@ def joinuser(*args): _INSTALL_SCHEMES |= { # NOTE: When modifying "purelib" scheme, update site._get_path() too. 'nt_user': { - 'stdlib': '{userbase}/lib/python{py_version_short}', - 'platstdlib': '{userbase}/lib/python{py_version_short}', - 'purelib': '{userbase}/lib/python{py_version_short}/site-packages', - 'platlib': '{userbase}/lib/python{py_version_short}/site-packages', - 'include': '{userbase}/include/python{py_version_short}', + 'stdlib': '{userbase}/lib/python{py_version_short_plat}', + 'platstdlib': '{userbase}/lib/python{py_version_short_plat}', + 'purelib': '{userbase}/lib/python{py_version_short_plat}/site-packages', + 'platlib': '{userbase}/lib/python{py_version_short_plat}/site-packages', + 'include': '{userbase}/include/python{py_version_short_plat}', 'scripts': '{userbase}/bin', 'data': '{userbase}', }, 'posix_user': { - 'stdlib': '{userbase}/{platlibdir}/python{py_version_short}', - 'platstdlib': '{userbase}/{platlibdir}/python{py_version_short}', - 'purelib': '{userbase}/lib/python{py_version_short}/site-packages', - 'platlib': '{userbase}/lib/python{py_version_short}/site-packages', - 'include': '{userbase}/include/python{py_version_short}', + 'stdlib': '{userbase}/{platlibdir}/python{py_version_short_plat}', + 'platstdlib': '{userbase}/{platlibdir}/python{py_version_short_plat}', + 'purelib': '{userbase}/lib/python{py_version_short_plat}/site-packages', + 'platlib': '{userbase}/lib/python{py_version_short_plat}/site-packages', + 'include': '{userbase}/include/python{py_version_short_plat}', 'scripts': '{userbase}/bin', 'data': '{userbase}', }, @@ -640,6 +640,10 @@ def get_config_vars(*args): _CONFIG_VARS['py_version_nodot_plat'] = sys.winver.replace('.', '') except AttributeError: _CONFIG_VARS['py_version_nodot_plat'] = '' + if os.name == 'nt' and _POSIX_BUILD: + _CONFIG_VARS['py_version_short_plat'] = f'{_PY_VERSION_SHORT}-{get_platform()}' + else: + _CONFIG_VARS['py_version_short_plat'] = _PY_VERSION_SHORT if os.name == 'nt' and not _POSIX_BUILD: _init_non_posix(_CONFIG_VARS) @@ -698,7 +702,7 @@ def get_config_var(name): warnings.warn('SO is deprecated, use EXT_SUFFIX', DeprecationWarning, 2) return get_config_vars().get(name) - +# make sure to change site._get_platform() while changing this function def get_platform(): """Return a string that identifies the current platform. From e82317c98a5b145b5528bd4b6dd9723c645d1e51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Thu, 21 Apr 2022 14:25:51 +0300 Subject: [PATCH 129/138] configure: Include a header in the check for _beginthread Previously, the test tried compiling a call to the _beginthread function without either declaring the function (and its parameters) or including the corresponding header. Since Clang 15 (which still is under development, so this may still change before it's released) [1], implicit function declarations are a hard error by default, when building code in C99 mode (or newer). [1] https://github.com/llvm/llvm-project/commit/7d644e1215b376ec5e915df9ea2eeb56e2d94626 --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 79a5feb442093d..8d7ec7a51debe2 100644 --- a/configure.ac +++ b/configure.ac @@ -2239,7 +2239,7 @@ AC_MSG_RESULT([$with_nt_threads]) if test $with_nt_threads = yes ; then AC_MSG_CHECKING([whether linking with nt-threads work]) AC_LINK_IFELSE([ - AC_LANG_PROGRAM([[]],[[_beginthread(0, 0, 0);]]) + AC_LANG_PROGRAM([[#include ]],[[_beginthread(0, 0, 0);]]) ], [AC_MSG_RESULT([yes])], [AC_MSG_ERROR([failed to link with nt-threads])]) From 5a6ee053758e333e1e28de40a717f663e0dcd63c Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Fri, 22 Apr 2022 17:31:19 +0200 Subject: [PATCH 130/138] configure.ac: Default to --without-c-locale-coercion on Windows --with-c-locale-coercion otherwise defaults to yes and enables code that isn't compatible on Windows, mainly because the feature is Unix related. Default to "no" on Windows instead. Fixes #36 --- configure.ac | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 8d7ec7a51debe2..6666a89321d0ed 100644 --- a/configure.ac +++ b/configure.ac @@ -3892,11 +3892,14 @@ AC_MSG_RESULT($with_pymalloc) AC_MSG_CHECKING(for --with-c-locale-coercion) AC_ARG_WITH(c-locale-coercion, AS_HELP_STRING([--with-c-locale-coercion], - [enable C locale coercion to a UTF-8 based locale (default is yes)])) + [enable C locale coercion to a UTF-8 based locale (default is yes on Unix, no on Windows)])) if test -z "$with_c_locale_coercion" then - with_c_locale_coercion="yes" + case $host in + *-*-mingw*) with_c_locale_coercion="no";; + *) with_c_locale_coercion="yes";; + esac fi if test "$with_c_locale_coercion" != "no" then From 54fe5dd7215e8f0f32e20c64927527fc6e7d9909 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Fri, 22 Apr 2022 17:37:23 +0200 Subject: [PATCH 131/138] CI: remove --without-c-locale-coercion No longer needed since the default now works on Windows --- .github/workflows/mingw.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/mingw.yml b/.github/workflows/mingw.yml index 999ccf9465e4a6..40b1d5ef8e0d6a 100644 --- a/.github/workflows/mingw.yml +++ b/.github/workflows/mingw.yml @@ -75,7 +75,6 @@ jobs: --with-system-ffi \ --with-system-libmpdec \ --without-ensurepip \ - --without-c-locale-coercion \ --enable-loadable-sqlite-extensions \ --with-tzpath=${MINGW_PREFIX}/share/zoneinfo \ --enable-optimizations @@ -187,7 +186,6 @@ jobs: --with-system-ffi \ --with-system-libmpdec \ --without-ensurepip \ - --without-c-locale-coercion \ --enable-loadable-sqlite-extensions make -j8 From 8f96f64f90057b5b2817f92ccdd3309961aa8cf3 Mon Sep 17 00:00:00 2001 From: Naveen M K Date: Sun, 5 Jun 2022 20:28:53 +0530 Subject: [PATCH 132/138] Fix failing tests - In `test_sysconfig`, ignore `test_sysconfig.TestSysConfig.test_user_similar` test failure. - Copy `get_platform()` from from distutils.utils to test_importlib/test_windows.py. - In `test_tcl`, ignore `test_tcl.TclTest.testLoadWithUNC` test failure. - Disable `test.test_asynchat.TestAsynchat.test_line_terminator2`, seems flaky. --- Lib/test/test_importlib/test_windows.py | 17 +++++++++++++++++ mingw_ignorefile.txt | 6 +++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_importlib/test_windows.py b/Lib/test/test_importlib/test_windows.py index 1b9e185c195453..12addfa8588332 100644 --- a/Lib/test/test_importlib/test_windows.py +++ b/Lib/test/test_importlib/test_windows.py @@ -25,6 +25,23 @@ def get_platform(): 'x64' : 'win-amd64', 'arm' : 'win-arm32', } + if os.name == 'nt': + if 'gcc' in sys.version.lower(): + if 'ucrt' in sys.version.lower(): + if 'amd64' in sys.version.lower(): + return 'mingw_x86_64_ucrt' + return 'mingw_i686_ucrt' + if 'clang' in sys.version.lower(): + if 'amd64' in sys.version.lower(): + return 'mingw_x86_64_clang' + if 'arm64' in sys.version.lower(): + return 'mingw_aarch64' + if 'arm' in sys.version.lower(): + return 'mingw_armv7' + return 'mingw_i686_clang' + if 'amd64' in sys.version.lower(): + return 'mingw_x86_64' + return 'mingw_i686' if ('VSCMD_ARG_TGT_ARCH' in os.environ and os.environ['VSCMD_ARG_TGT_ARCH'] in TARGET_TO_PLAT): return TARGET_TO_PLAT[os.environ['VSCMD_ARG_TGT_ARCH']] diff --git a/mingw_ignorefile.txt b/mingw_ignorefile.txt index dc3802e6c51313..02e950df4f0dd3 100644 --- a/mingw_ignorefile.txt +++ b/mingw_ignorefile.txt @@ -29,6 +29,10 @@ test.test_strptime.TimeRETests.test_compile test.test_tools.test_i18n.Test_pygettext.test_POT_Creation_Date test.test_venv.BasicTest.* test.test_venv.EnsurePipTest.* +test.test_sysconfig.TestSysConfig.test_user_similar +test.test_tcl.TclTest.testLoadWithUNC # flaky test.test__xxsubinterpreters.* -test.test_asyncio.test_subprocess.SubprocessProactorTests.test_stdin_broken_pipe \ No newline at end of file +test.test_asyncio.test_subprocess.SubprocessProactorTests.test_stdin_broken_pipe +test.test_asynchat.TestAsynchat.test_line_terminator2 + From dcd50e88196ab74dad079e0f50a856dfc4841ed5 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Mon, 6 Jun 2022 16:24:55 +0200 Subject: [PATCH 133/138] distutils: add build root to libdirs when building uninstalled The distutils test suite builds extensions which need to link to libpython despite it being uninstalled. The code currently assumes that the working directory is the build root, but that is not the case in the tests (it's in some temp dir). Explicitely pass the build root instead where the uninstalled libpython can be found. --- Lib/distutils/command/build_ext.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py index 82a21d2c4cd8ae..ab1a3e7a0ca07e 100644 --- a/Lib/distutils/command/build_ext.py +++ b/Lib/distutils/command/build_ext.py @@ -227,7 +227,7 @@ def finalize_options(self): config_dir_name)) else: # building python standard extensions - self.library_dirs.append('.') + self.library_dirs.append(sysconfig.project_base) # For building extensions with a shared Python library, # Python's library directory must be appended to library_dirs @@ -238,7 +238,7 @@ def finalize_options(self): self.library_dirs.append(sysconfig.get_config_var('LIBDIR')) else: # building python standard extensions - self.library_dirs.append('.') + self.library_dirs.append(sysconfig.project_base) # The argument parsing will result in self.define being a string, but # it has to be a list of 2-tuples. All the preprocessor symbols From a8d50d2698246b7333284ef11b299f48e002a973 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Fri, 5 Aug 2022 07:39:48 +0200 Subject: [PATCH 134/138] Avoid some macros only available in >Win7 They got added in 9041b00283737f77acbb for 3.10.6. --- Modules/_winapi.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Modules/_winapi.c b/Modules/_winapi.c index c479a92e51d611..124dbc861996ba 100644 --- a/Modules/_winapi.c +++ b/Modules/_winapi.c @@ -1528,10 +1528,16 @@ _winapi_LCMapStringEx_impl(PyObject *module, PyObject *locale, DWORD flags, PyObject *src) /*[clinic end generated code: output=8ea4c9d85a4a1f23 input=2fa6ebc92591731b]*/ { +#if WINVER >= 0x0602 if (flags & (LCMAP_SORTHANDLE | LCMAP_HASH | LCMAP_BYTEREV | LCMAP_SORTKEY)) { return PyErr_Format(PyExc_ValueError, "unsupported flags"); } +#else + if (flags & (LCMAP_BYTEREV | LCMAP_SORTKEY)) { + return PyErr_Format(PyExc_ValueError, "unsupported flags"); + } +#endif wchar_t *locale_ = PyUnicode_AsWideCharString(locale, NULL); if (!locale_) { From e3758945d7d9d101bb1a1f450bcaf95c8916f754 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Fri, 5 Aug 2022 08:04:54 +0200 Subject: [PATCH 135/138] Make sure we always use the stdlib distutils --- .github/workflows/mingw.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/mingw.yml b/.github/workflows/mingw.yml index 40b1d5ef8e0d6a..6f88865876a1db 100644 --- a/.github/workflows/mingw.yml +++ b/.github/workflows/mingw.yml @@ -84,6 +84,7 @@ jobs: - name: Run Smoke Test (build) shell: msys2 {0} run: | + export SETUPTOOLS_USE_DISTUTILS=stdlib SMOKETESTS="$(pwd)/mingw_smoketests.py" cd _build ./python.exe "$SMOKETESTS" @@ -92,6 +93,7 @@ jobs: - name: Run tests shell: msys2 {0} run: | + export SETUPTOOLS_USE_DISTUTILS=stdlib IGNOREFILE="$(pwd)/mingw_ignorefile.txt" cd _build MSYSTEM= ./python.exe -m test -j8 --ignorefile "$IGNOREFILE" -W @@ -100,6 +102,7 @@ jobs: continue-on-error: true shell: msys2 {0} run: | + export SETUPTOOLS_USE_DISTUTILS=stdlib IGNOREFILE="$(pwd)/mingw_ignorefile.txt" cd _build MSYSTEM= ./python.exe -m test -j8 --matchfile "$IGNOREFILE" -W @@ -131,6 +134,7 @@ jobs: - name: Run Smoke Test (installed) shell: msys2 {0} run: | + export SETUPTOOLS_USE_DISTUTILS=stdlib export PYTHONTZPATH="${MINGW_PREFIX}/share/zoneinfo" SMOKETESTS="$(pwd)/mingw_smoketests.py" cd _build From ba69e91559ac999ce3d494a6cd07ed097327bf3d Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Fri, 12 Aug 2022 16:04:11 +0200 Subject: [PATCH 136/138] CI: skip some more flaky tests --- mingw_ignorefile.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mingw_ignorefile.txt b/mingw_ignorefile.txt index 02e950df4f0dd3..78181a952e019a 100644 --- a/mingw_ignorefile.txt +++ b/mingw_ignorefile.txt @@ -35,4 +35,6 @@ test.test_tcl.TclTest.testLoadWithUNC test.test__xxsubinterpreters.* test.test_asyncio.test_subprocess.SubprocessProactorTests.test_stdin_broken_pipe test.test_asynchat.TestAsynchat.test_line_terminator2 - +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_gc_aclose_09 +test.test_concurrent_futures.ThreadPoolShutdownTest.test_interpreter_shutdown +test.test_asynchat.TestNotConnected.test_disallow_negative_terminator From 1583995cb212c421d0c850f8ba08a4f263ee306a Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Thu, 22 Sep 2022 17:51:33 +0200 Subject: [PATCH 137/138] Don't change os.sep with an empty MSYSTEM env var, not just a missing one Up until now this didn't really happen when calling from cygwin because empty env vars were removed before Python would run. But https://github.com/msys2/msys2-runtime/pull/101 changed that. To avoid breaking users that did something like MSYSTEM= python ... not only check that MSYSTEM isn't set but also that it isn't empty when deciding if os.sep/os.altsep should be switched. --- Lib/importlib/_bootstrap_external.py | 2 +- Lib/ntpath.py | 2 +- Lib/pathlib.py | 2 +- Python/pathconfig.c | 4 ++-- mingw_smoketests.py | 2 +- setup.py | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 3a9f8764b455f2..0781dda9afc656 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -43,7 +43,7 @@ else: path_separators = ['/'] -if 'MSYSTEM' in _os.environ: +if _os.environ.get('MSYSTEM', ''): path_separators = path_separators[::-1] # Assumption made in _path_join() diff --git a/Lib/ntpath.py b/Lib/ntpath.py index 5f6fad4c307656..e141b61868556e 100644 --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -21,7 +21,7 @@ import genericpath from genericpath import * -if sys.platform == "win32" and "MSYSTEM" in os.environ: +if sys.platform == "win32" and os.environ.get("MSYSTEM", ""): sep = '/' altsep = '\\' else: diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 035892fbf384e2..b7ea294e6b31d1 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -115,7 +115,7 @@ class _WindowsFlavour(_Flavour): sep = '\\' altsep = '/' - if 'MSYSTEM' in os.environ: + if os.environ.get('MSYSTEM', ''): sep, altsep = altsep, sep has_drv = True pathmod = ntpath diff --git a/Python/pathconfig.c b/Python/pathconfig.c index e037791b59e8ac..fea3ec4ebf6f12 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -64,7 +64,7 @@ Py_GetSepA(const char *name) #if defined(__MINGW32__) msystem = Py_GETENV("MSYSTEM"); #endif - if (msystem != NULL) + if (msystem != NULL && strcmp(msystem, "") != 0) sep = '/'; else sep = '\\'; @@ -117,7 +117,7 @@ Py_GetSepW(const wchar_t *name) #if defined(__MINGW32__) msystem = Py_GETENV("MSYSTEM"); #endif - if (msystem != NULL) + if (msystem != NULL && strcmp(msystem, "") != 0) sep = L'/'; else sep = L'\\'; diff --git a/mingw_smoketests.py b/mingw_smoketests.py index 4f17e16d405341..2d107ad6b665f5 100644 --- a/mingw_smoketests.py +++ b/mingw_smoketests.py @@ -29,7 +29,7 @@ import unittest import sysconfig -if "MSYSTEM" in os.environ: +if os.environ.get("MSYSTEM", ""): SEP = "/" else: SEP = "\\" diff --git a/setup.py b/setup.py index 1973c7d937b44f..12a9528126b770 100644 --- a/setup.py +++ b/setup.py @@ -83,7 +83,7 @@ def get_platform(): # as otherwise all the io redirection will fail. # Arguably, this could happen inside the real os.system # rather than this monkey patch. -if sys.platform == "win32" and "MSYSTEM" in os.environ: +if sys.platform == "win32" and os.environ.get("MSYSTEM", ""): os_system = os.system def msys_system(command): command_in_sh = 'sh.exe -c "%s"' % command.replace("\\", "\\\\") From eca05b9051adbc73d825e68f1363798c36124618 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Sat, 15 Oct 2022 13:02:13 +0200 Subject: [PATCH 138/138] Commit regenerated importlib It needs a native Python when building which isn't available when cross compiling Generated using "regen-importlib" with line endings normalized: * make regen-importlib * dos2unix Python/importlib*.h --- Python/importlib_external.h | 5472 ++++++++++++++++++----------------- 1 file changed, 2738 insertions(+), 2734 deletions(-) diff --git a/Python/importlib_external.h b/Python/importlib_external.h index e77ca4c21943a9..797e5be0189fdb 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -1,748 +1,818 @@ /* Auto-generated by Programs/_freeze_importlib.c */ const unsigned char _Py_M__importlib_bootstrap_external[] = { 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,64,0,0,0,115,250,2,0,0,100,0, + 0,5,0,0,0,64,0,0,0,115,22,3,0,0,100,0, 90,0,100,1,97,1,100,2,100,1,108,2,90,2,100,2, 100,1,108,3,90,3,100,2,100,1,108,4,90,4,100,2, 100,1,108,5,90,5,100,2,100,1,108,6,90,6,101,4, 106,7,100,3,107,2,90,8,101,8,114,40,100,2,100,1, 108,9,90,10,100,2,100,1,108,11,90,11,110,4,100,2, 100,1,108,12,90,10,101,8,114,51,100,4,100,5,103,2, - 90,13,110,3,100,5,103,1,90,13,101,14,100,6,100,7, - 132,0,101,13,68,0,131,1,131,1,115,65,74,0,130,1, - 101,13,100,2,25,0,90,15,101,16,101,13,131,1,90,17, - 100,8,160,18,101,13,161,1,90,13,100,9,100,10,132,0, - 101,13,68,0,131,1,90,19,100,11,90,20,100,12,90,21, - 101,21,101,20,23,0,90,22,100,13,100,14,132,0,90,23, - 101,23,131,0,90,24,100,15,100,16,132,0,90,25,100,17, - 100,18,132,0,90,26,100,19,100,20,132,0,90,27,101,8, - 114,119,100,21,100,22,132,0,90,28,110,4,100,23,100,22, - 132,0,90,28,100,24,100,25,132,0,90,29,100,26,100,27, - 132,0,90,30,100,28,100,29,132,0,90,31,100,30,100,31, - 132,0,90,32,100,32,100,33,132,0,90,33,101,8,114,150, - 100,34,100,35,132,0,90,34,110,4,100,36,100,35,132,0, - 90,34,100,112,100,38,100,39,132,1,90,35,101,36,101,35, - 106,37,131,1,90,38,100,40,160,39,100,41,100,42,161,2, - 100,43,23,0,90,40,101,41,160,42,101,40,100,42,161,2, - 90,43,100,44,90,44,100,45,90,45,100,46,103,1,90,46, - 101,8,114,192,101,46,160,47,100,47,161,1,1,0,101,2, - 160,48,161,0,90,49,100,48,103,1,90,50,101,50,4,0, - 90,51,90,52,100,113,100,1,100,49,156,1,100,50,100,51, - 132,3,90,53,100,52,100,53,132,0,90,54,100,54,100,55, - 132,0,90,55,100,56,100,57,132,0,90,56,100,58,100,59, - 132,0,90,57,100,60,100,61,132,0,90,58,100,62,100,63, - 132,0,90,59,100,64,100,65,132,0,90,60,100,66,100,67, - 132,0,90,61,100,68,100,69,132,0,90,62,100,114,100,70, - 100,71,132,1,90,63,100,115,100,72,100,73,132,1,90,64, - 100,116,100,75,100,76,132,1,90,65,100,77,100,78,132,0, - 90,66,101,67,131,0,90,68,100,113,100,1,101,68,100,79, - 156,2,100,80,100,81,132,3,90,69,71,0,100,82,100,83, - 132,0,100,83,131,2,90,70,71,0,100,84,100,85,132,0, - 100,85,131,2,90,71,71,0,100,86,100,87,132,0,100,87, - 101,71,131,3,90,72,71,0,100,88,100,89,132,0,100,89, - 131,2,90,73,71,0,100,90,100,91,132,0,100,91,101,73, - 101,72,131,4,90,74,71,0,100,92,100,93,132,0,100,93, - 101,73,101,71,131,4,90,75,71,0,100,94,100,95,132,0, - 100,95,101,73,101,71,131,4,90,76,71,0,100,96,100,97, - 132,0,100,97,131,2,90,77,71,0,100,98,100,99,132,0, - 100,99,131,2,90,78,71,0,100,100,100,101,132,0,100,101, - 131,2,90,79,71,0,100,102,100,103,132,0,100,103,131,2, - 90,80,100,113,100,104,100,105,132,1,90,81,100,106,100,107, - 132,0,90,82,100,108,100,109,132,0,90,83,100,110,100,111, - 132,0,90,84,100,1,83,0,41,117,97,94,1,0,0,67, - 111,114,101,32,105,109,112,108,101,109,101,110,116,97,116,105, - 111,110,32,111,102,32,112,97,116,104,45,98,97,115,101,100, - 32,105,109,112,111,114,116,46,10,10,84,104,105,115,32,109, - 111,100,117,108,101,32,105,115,32,78,79,84,32,109,101,97, - 110,116,32,116,111,32,98,101,32,100,105,114,101,99,116,108, - 121,32,105,109,112,111,114,116,101,100,33,32,73,116,32,104, - 97,115,32,98,101,101,110,32,100,101,115,105,103,110,101,100, - 32,115,117,99,104,10,116,104,97,116,32,105,116,32,99,97, - 110,32,98,101,32,98,111,111,116,115,116,114,97,112,112,101, - 100,32,105,110,116,111,32,80,121,116,104,111,110,32,97,115, - 32,116,104,101,32,105,109,112,108,101,109,101,110,116,97,116, - 105,111,110,32,111,102,32,105,109,112,111,114,116,46,32,65, - 115,10,115,117,99,104,32,105,116,32,114,101,113,117,105,114, - 101,115,32,116,104,101,32,105,110,106,101,99,116,105,111,110, - 32,111,102,32,115,112,101,99,105,102,105,99,32,109,111,100, - 117,108,101,115,32,97,110,100,32,97,116,116,114,105,98,117, - 116,101,115,32,105,110,32,111,114,100,101,114,32,116,111,10, - 119,111,114,107,46,32,79,110,101,32,115,104,111,117,108,100, - 32,117,115,101,32,105,109,112,111,114,116,108,105,98,32,97, - 115,32,116,104,101,32,112,117,98,108,105,99,45,102,97,99, - 105,110,103,32,118,101,114,115,105,111,110,32,111,102,32,116, - 104,105,115,32,109,111,100,117,108,101,46,10,10,78,233,0, - 0,0,0,90,5,119,105,110,51,50,250,1,92,250,1,47, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,3,0,0,0,99,0,0,0,115,28,0,0,0,129,0, - 124,0,93,9,125,1,116,0,124,1,131,1,100,0,107,2, - 86,0,1,0,113,2,100,1,83,0,41,2,233,1,0,0, - 0,78,41,1,218,3,108,101,110,41,2,218,2,46,48,218, - 3,115,101,112,169,0,114,7,0,0,0,250,38,60,102,114, - 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, - 98,111,111,116,115,116,114,97,112,95,101,120,116,101,114,110, - 97,108,62,218,9,60,103,101,110,101,120,112,114,62,46,0, - 0,0,115,4,0,0,0,2,128,26,0,114,9,0,0,0, - 218,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,4,0,0,0,67,0,0,0,115,22,0,0,0, - 104,0,124,0,93,7,125,1,100,0,124,1,155,0,157,2, - 146,2,113,2,83,0,41,1,250,1,58,114,7,0,0,0, - 41,2,114,5,0,0,0,218,1,115,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,9,60,115,101,116,99, - 111,109,112,62,50,0,0,0,115,2,0,0,0,22,0,114, - 13,0,0,0,41,1,218,3,119,105,110,41,2,90,6,99, - 121,103,119,105,110,90,6,100,97,114,119,105,110,99,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, - 0,0,3,0,0,0,115,62,0,0,0,116,0,106,1,160, - 2,116,3,161,1,114,25,116,0,106,1,160,2,116,4,161, - 1,114,15,100,1,137,0,110,2,100,2,137,0,135,0,102, - 1,100,3,100,4,132,8,125,0,124,0,83,0,100,5,100, - 4,132,0,125,0,124,0,83,0,41,6,78,90,12,80,89, - 84,72,79,78,67,65,83,69,79,75,115,12,0,0,0,80, - 89,84,72,79,78,67,65,83,69,79,75,99,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 19,0,0,0,115,20,0,0,0,116,0,106,1,106,2,12, - 0,111,9,136,0,116,3,106,4,118,0,83,0,41,1,122, - 94,84,114,117,101,32,105,102,32,102,105,108,101,110,97,109, - 101,115,32,109,117,115,116,32,98,101,32,99,104,101,99,107, - 101,100,32,99,97,115,101,45,105,110,115,101,110,115,105,116, - 105,118,101,108,121,32,97,110,100,32,105,103,110,111,114,101, - 32,101,110,118,105,114,111,110,109,101,110,116,32,102,108,97, - 103,115,32,97,114,101,32,110,111,116,32,115,101,116,46,41, - 5,218,3,115,121,115,218,5,102,108,97,103,115,218,18,105, - 103,110,111,114,101,95,101,110,118,105,114,111,110,109,101,110, - 116,218,3,95,111,115,90,7,101,110,118,105,114,111,110,114, - 7,0,0,0,169,1,218,3,107,101,121,114,7,0,0,0, - 114,8,0,0,0,218,11,95,114,101,108,97,120,95,99,97, - 115,101,67,0,0,0,243,2,0,0,0,20,2,122,37,95, - 109,97,107,101,95,114,101,108,97,120,95,99,97,115,101,46, - 60,108,111,99,97,108,115,62,46,95,114,101,108,97,120,95, - 99,97,115,101,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,83,0,0,0,243,4,0, - 0,0,100,1,83,0,41,2,122,53,84,114,117,101,32,105, - 102,32,102,105,108,101,110,97,109,101,115,32,109,117,115,116, - 32,98,101,32,99,104,101,99,107,101,100,32,99,97,115,101, - 45,105,110,115,101,110,115,105,116,105,118,101,108,121,46,70, - 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,21,0,0,0,71,0, - 0,0,243,2,0,0,0,4,2,41,5,114,15,0,0,0, - 218,8,112,108,97,116,102,111,114,109,218,10,115,116,97,114, - 116,115,119,105,116,104,218,27,95,67,65,83,69,95,73,78, - 83,69,78,83,73,84,73,86,69,95,80,76,65,84,70,79, - 82,77,83,218,35,95,67,65,83,69,95,73,78,83,69,78, - 83,73,84,73,86,69,95,80,76,65,84,70,79,82,77,83, - 95,83,84,82,95,75,69,89,41,1,114,21,0,0,0,114, - 7,0,0,0,114,19,0,0,0,114,8,0,0,0,218,16, - 95,109,97,107,101,95,114,101,108,97,120,95,99,97,115,101, - 60,0,0,0,115,16,0,0,0,12,1,12,1,6,1,4, - 2,12,2,4,7,8,253,4,3,114,29,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4, - 0,0,0,67,0,0,0,115,20,0,0,0,116,0,124,0, - 131,1,100,1,64,0,160,1,100,2,100,3,161,2,83,0, - 41,4,122,42,67,111,110,118,101,114,116,32,97,32,51,50, - 45,98,105,116,32,105,110,116,101,103,101,114,32,116,111,32, - 108,105,116,116,108,101,45,101,110,100,105,97,110,46,236,3, - 0,0,0,255,127,255,127,3,0,233,4,0,0,0,218,6, - 108,105,116,116,108,101,41,2,218,3,105,110,116,218,8,116, - 111,95,98,121,116,101,115,41,1,218,1,120,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,12,95,112,97, - 99,107,95,117,105,110,116,51,50,79,0,0,0,114,22,0, - 0,0,114,36,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,4,0,0,0,67,0,0,0, - 243,28,0,0,0,116,0,124,0,131,1,100,1,107,2,115, - 8,74,0,130,1,116,1,160,2,124,0,100,2,161,2,83, - 0,41,3,122,47,67,111,110,118,101,114,116,32,52,32,98, - 121,116,101,115,32,105,110,32,108,105,116,116,108,101,45,101, - 110,100,105,97,110,32,116,111,32,97,110,32,105,110,116,101, - 103,101,114,46,114,31,0,0,0,114,32,0,0,0,169,3, - 114,4,0,0,0,114,33,0,0,0,218,10,102,114,111,109, - 95,98,121,116,101,115,169,1,218,4,100,97,116,97,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,14,95, - 117,110,112,97,99,107,95,117,105,110,116,51,50,84,0,0, - 0,243,4,0,0,0,16,2,12,1,114,42,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 4,0,0,0,67,0,0,0,114,37,0,0,0,41,3,122, - 47,67,111,110,118,101,114,116,32,50,32,98,121,116,101,115, - 32,105,110,32,108,105,116,116,108,101,45,101,110,100,105,97, - 110,32,116,111,32,97,110,32,105,110,116,101,103,101,114,46, - 233,2,0,0,0,114,32,0,0,0,114,38,0,0,0,114, - 40,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,14,95,117,110,112,97,99,107,95,117,105,110, - 116,49,54,89,0,0,0,114,43,0,0,0,114,45,0,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,4,0,0,0,71,0,0,0,115,228,0,0,0,124, - 0,115,4,100,1,83,0,116,0,124,0,131,1,100,2,107, - 2,114,14,124,0,100,3,25,0,83,0,100,1,125,1,103, - 0,125,2,116,1,116,2,106,3,124,0,131,2,68,0,93, - 61,92,2,125,3,125,4,124,3,160,4,116,5,161,1,115, - 38,124,3,160,6,116,5,161,1,114,51,124,3,160,7,116, - 8,161,1,112,44,124,1,125,1,116,9,124,4,23,0,103, - 1,125,2,113,24,124,3,160,6,100,4,161,1,114,76,124, - 1,160,10,161,0,124,3,160,10,161,0,107,3,114,70,124, - 3,125,1,124,4,103,1,125,2,113,24,124,2,160,11,124, - 4,161,1,1,0,113,24,124,3,112,79,124,1,125,1,124, - 2,160,11,124,4,161,1,1,0,113,24,100,5,100,6,132, - 0,124,2,68,0,131,1,125,2,116,0,124,2,131,1,100, - 2,107,2,114,107,124,2,100,3,25,0,115,107,124,1,116, - 9,23,0,83,0,124,1,116,9,160,12,124,2,161,1,23, - 0,83,0,41,7,250,31,82,101,112,108,97,99,101,109,101, - 110,116,32,102,111,114,32,111,115,46,112,97,116,104,46,106, - 111,105,110,40,41,46,114,10,0,0,0,114,3,0,0,0, - 114,0,0,0,0,114,11,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,5,0,0,0,83, - 0,0,0,243,26,0,0,0,103,0,124,0,93,9,125,1, - 124,1,114,2,124,1,160,0,116,1,161,1,145,2,113,2, - 83,0,114,7,0,0,0,169,2,218,6,114,115,116,114,105, - 112,218,15,112,97,116,104,95,115,101,112,97,114,97,116,111, - 114,115,169,2,114,5,0,0,0,218,1,112,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,10,60,108,105, - 115,116,99,111,109,112,62,119,0,0,0,115,2,0,0,0, - 26,0,250,30,95,112,97,116,104,95,106,111,105,110,46,60, - 108,111,99,97,108,115,62,46,60,108,105,115,116,99,111,109, - 112,62,41,13,114,4,0,0,0,218,3,109,97,112,114,18, - 0,0,0,218,15,95,112,97,116,104,95,115,112,108,105,116, - 114,111,111,116,114,26,0,0,0,218,14,112,97,116,104,95, - 115,101,112,95,116,117,112,108,101,218,8,101,110,100,115,119, - 105,116,104,114,49,0,0,0,114,50,0,0,0,218,8,112, - 97,116,104,95,115,101,112,218,8,99,97,115,101,102,111,108, - 100,218,6,97,112,112,101,110,100,218,4,106,111,105,110,41, - 5,218,10,112,97,116,104,95,112,97,114,116,115,218,4,114, - 111,111,116,218,4,112,97,116,104,90,8,110,101,119,95,114, - 111,111,116,218,4,116,97,105,108,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,10,95,112,97,116,104,95, - 106,111,105,110,96,0,0,0,115,42,0,0,0,4,2,4, - 1,12,1,8,1,4,1,4,1,20,1,20,1,14,1,12, - 1,10,1,16,1,4,3,8,1,12,2,8,2,12,1,14, - 1,20,1,8,2,14,1,114,67,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0, - 0,71,0,0,0,115,20,0,0,0,116,0,160,1,100,1, - 100,2,132,0,124,0,68,0,131,1,161,1,83,0,41,3, - 114,46,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,5,0,0,0,83,0,0,0,114,47, - 0,0,0,114,7,0,0,0,114,48,0,0,0,41,2,114, - 5,0,0,0,218,4,112,97,114,116,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,53,0,0,0,128,0, - 0,0,115,6,0,0,0,6,0,4,1,16,255,114,54,0, - 0,0,41,2,114,59,0,0,0,114,62,0,0,0,41,1, - 114,63,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,67,0,0,0,126,0,0,0,115,6,0, - 0,0,10,2,2,1,8,255,99,1,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,4,0,0,0,3,0,0, - 0,115,66,0,0,0,116,0,135,0,102,1,100,1,100,2, - 132,8,116,1,68,0,131,1,131,1,125,1,124,1,100,3, - 107,0,114,19,100,4,136,0,102,2,83,0,136,0,100,5, - 124,1,133,2,25,0,136,0,124,1,100,6,23,0,100,5, - 133,2,25,0,102,2,83,0,41,7,122,32,82,101,112,108, - 97,99,101,109,101,110,116,32,102,111,114,32,111,115,46,112, - 97,116,104,46,115,112,108,105,116,40,41,46,99,1,0,0, + 90,13,110,3,100,5,103,1,90,13,101,10,106,14,160,15, + 100,6,100,7,161,2,114,68,101,13,100,1,100,1,100,8, + 133,3,25,0,90,13,101,16,100,9,100,10,132,0,101,13, + 68,0,131,1,131,1,115,79,74,0,130,1,101,13,100,2, + 25,0,90,17,101,18,101,13,131,1,90,19,100,7,160,20, + 101,13,161,1,90,13,100,11,100,12,132,0,101,13,68,0, + 131,1,90,21,100,13,90,22,100,14,90,23,101,23,101,22, + 23,0,90,24,100,15,100,16,132,0,90,25,101,25,131,0, + 90,26,100,17,100,18,132,0,90,27,100,19,100,20,132,0, + 90,28,100,21,100,22,132,0,90,29,101,8,114,133,100,23, + 100,24,132,0,90,30,110,4,100,25,100,24,132,0,90,30, + 100,26,100,27,132,0,90,31,100,28,100,29,132,0,90,32, + 100,30,100,31,132,0,90,33,100,32,100,33,132,0,90,34, + 100,34,100,35,132,0,90,35,101,8,114,164,100,36,100,37, + 132,0,90,36,110,4,100,38,100,37,132,0,90,36,100,114, + 100,40,100,41,132,1,90,37,101,38,101,37,106,39,131,1, + 90,40,100,42,160,41,100,43,100,44,161,2,100,45,23,0, + 90,42,101,43,160,44,101,42,100,44,161,2,90,45,100,46, + 90,46,100,47,90,47,100,48,103,1,90,48,101,8,114,206, + 101,48,160,49,100,49,161,1,1,0,101,2,160,50,161,0, + 90,51,100,50,103,1,90,52,101,52,4,0,90,53,90,54, + 100,115,100,1,100,51,156,1,100,52,100,53,132,3,90,55, + 100,54,100,55,132,0,90,56,100,56,100,57,132,0,90,57, + 100,58,100,59,132,0,90,58,100,60,100,61,132,0,90,59, + 100,62,100,63,132,0,90,60,100,64,100,65,132,0,90,61, + 100,66,100,67,132,0,90,62,100,68,100,69,132,0,90,63, + 100,70,100,71,132,0,90,64,100,116,100,72,100,73,132,1, + 90,65,100,117,100,74,100,75,132,1,90,66,100,118,100,77, + 100,78,132,1,90,67,100,79,100,80,132,0,90,68,101,69, + 131,0,90,70,100,115,100,1,101,70,100,81,156,2,100,82, + 100,83,132,3,90,71,71,0,100,84,100,85,132,0,100,85, + 131,2,90,72,71,0,100,86,100,87,132,0,100,87,131,2, + 90,73,71,0,100,88,100,89,132,0,100,89,101,73,131,3, + 90,74,71,0,100,90,100,91,132,0,100,91,131,2,90,75, + 71,0,100,92,100,93,132,0,100,93,101,75,101,74,131,4, + 90,76,71,0,100,94,100,95,132,0,100,95,101,75,101,73, + 131,4,90,77,71,0,100,96,100,97,132,0,100,97,101,75, + 101,73,131,4,90,78,71,0,100,98,100,99,132,0,100,99, + 131,2,90,79,71,0,100,100,100,101,132,0,100,101,131,2, + 90,80,71,0,100,102,100,103,132,0,100,103,131,2,90,81, + 71,0,100,104,100,105,132,0,100,105,131,2,90,82,100,115, + 100,106,100,107,132,1,90,83,100,108,100,109,132,0,90,84, + 100,110,100,111,132,0,90,85,100,112,100,113,132,0,90,86, + 100,1,83,0,41,119,97,94,1,0,0,67,111,114,101,32, + 105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111, + 102,32,112,97,116,104,45,98,97,115,101,100,32,105,109,112, + 111,114,116,46,10,10,84,104,105,115,32,109,111,100,117,108, + 101,32,105,115,32,78,79,84,32,109,101,97,110,116,32,116, + 111,32,98,101,32,100,105,114,101,99,116,108,121,32,105,109, + 112,111,114,116,101,100,33,32,73,116,32,104,97,115,32,98, + 101,101,110,32,100,101,115,105,103,110,101,100,32,115,117,99, + 104,10,116,104,97,116,32,105,116,32,99,97,110,32,98,101, + 32,98,111,111,116,115,116,114,97,112,112,101,100,32,105,110, + 116,111,32,80,121,116,104,111,110,32,97,115,32,116,104,101, + 32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32, + 111,102,32,105,109,112,111,114,116,46,32,65,115,10,115,117, + 99,104,32,105,116,32,114,101,113,117,105,114,101,115,32,116, + 104,101,32,105,110,106,101,99,116,105,111,110,32,111,102,32, + 115,112,101,99,105,102,105,99,32,109,111,100,117,108,101,115, + 32,97,110,100,32,97,116,116,114,105,98,117,116,101,115,32, + 105,110,32,111,114,100,101,114,32,116,111,10,119,111,114,107, + 46,32,79,110,101,32,115,104,111,117,108,100,32,117,115,101, + 32,105,109,112,111,114,116,108,105,98,32,97,115,32,116,104, + 101,32,112,117,98,108,105,99,45,102,97,99,105,110,103,32, + 118,101,114,115,105,111,110,32,111,102,32,116,104,105,115,32, + 109,111,100,117,108,101,46,10,10,78,233,0,0,0,0,90, + 5,119,105,110,51,50,250,1,92,250,1,47,90,7,77,83, + 89,83,84,69,77,218,0,233,255,255,255,255,99,1,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0, + 0,99,0,0,0,115,28,0,0,0,129,0,124,0,93,9, + 125,1,116,0,124,1,131,1,100,0,107,2,86,0,1,0, + 113,2,100,1,83,0,41,2,233,1,0,0,0,78,41,1, + 218,3,108,101,110,41,2,218,2,46,48,218,3,115,101,112, + 169,0,114,9,0,0,0,250,38,60,102,114,111,122,101,110, + 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, + 115,116,114,97,112,95,101,120,116,101,114,110,97,108,62,218, + 9,60,103,101,110,101,120,112,114,62,50,0,0,0,115,4, + 0,0,0,2,128,26,0,114,11,0,0,0,99,1,0,0, 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, - 0,51,0,0,0,115,26,0,0,0,129,0,124,0,93,8, - 125,1,136,0,160,0,124,1,161,1,86,0,1,0,113,2, - 100,0,83,0,169,1,78,41,1,218,5,114,102,105,110,100, - 114,51,0,0,0,169,1,114,65,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,9,0,0,0,134,0,0,0,115, - 4,0,0,0,2,128,24,0,122,30,95,112,97,116,104,95, - 115,112,108,105,116,46,60,108,111,99,97,108,115,62,46,60, - 103,101,110,101,120,112,114,62,114,0,0,0,0,114,10,0, - 0,0,78,114,3,0,0,0,41,2,218,3,109,97,120,114, - 50,0,0,0,41,2,114,65,0,0,0,218,1,105,114,7, - 0,0,0,114,71,0,0,0,114,8,0,0,0,218,11,95, - 112,97,116,104,95,115,112,108,105,116,132,0,0,0,115,8, - 0,0,0,22,2,8,1,8,1,28,1,114,74,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,3,0,0,0,67,0,0,0,115,10,0,0,0,116,0, - 160,1,124,0,161,1,83,0,41,1,122,126,83,116,97,116, - 32,116,104,101,32,112,97,116,104,46,10,10,32,32,32,32, - 77,97,100,101,32,97,32,115,101,112,97,114,97,116,101,32, - 102,117,110,99,116,105,111,110,32,116,111,32,109,97,107,101, - 32,105,116,32,101,97,115,105,101,114,32,116,111,32,111,118, - 101,114,114,105,100,101,32,105,110,32,101,120,112,101,114,105, - 109,101,110,116,115,10,32,32,32,32,40,101,46,103,46,32, - 99,97,99,104,101,32,115,116,97,116,32,114,101,115,117,108, - 116,115,41,46,10,10,32,32,32,32,41,2,114,18,0,0, - 0,90,4,115,116,97,116,114,71,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,10,95,112,97, - 116,104,95,115,116,97,116,140,0,0,0,115,2,0,0,0, - 10,7,114,75,0,0,0,99,2,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,8,0,0,0,67,0,0,0, - 115,48,0,0,0,122,6,116,0,124,0,131,1,125,2,87, - 0,110,10,4,0,116,1,121,16,1,0,1,0,1,0,89, - 0,100,1,83,0,119,0,124,2,106,2,100,2,64,0,124, - 1,107,2,83,0,41,3,122,49,84,101,115,116,32,119,104, - 101,116,104,101,114,32,116,104,101,32,112,97,116,104,32,105, - 115,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32, - 109,111,100,101,32,116,121,112,101,46,70,105,0,240,0,0, - 41,3,114,75,0,0,0,218,7,79,83,69,114,114,111,114, - 218,7,115,116,95,109,111,100,101,41,3,114,65,0,0,0, - 218,4,109,111,100,101,90,9,115,116,97,116,95,105,110,102, - 111,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,18,95,112,97,116,104,95,105,115,95,109,111,100,101,95, - 116,121,112,101,150,0,0,0,115,12,0,0,0,2,2,12, - 1,12,1,6,1,2,255,14,2,114,79,0,0,0,99,1, + 0,67,0,0,0,115,22,0,0,0,104,0,124,0,93,7, + 125,1,100,0,124,1,155,0,157,2,146,2,113,2,83,0, + 41,1,250,1,58,114,9,0,0,0,41,2,114,7,0,0, + 0,218,1,115,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,9,60,115,101,116,99,111,109,112,62,54,0, + 0,0,115,2,0,0,0,22,0,114,14,0,0,0,41,1, + 218,3,119,105,110,41,2,90,6,99,121,103,119,105,110,90, + 6,100,97,114,119,105,110,99,0,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,3,0,0,0,3,0,0,0, + 115,62,0,0,0,116,0,106,1,160,2,116,3,161,1,114, + 25,116,0,106,1,160,2,116,4,161,1,114,15,100,1,137, + 0,110,2,100,2,137,0,135,0,102,1,100,3,100,4,132, + 8,125,0,124,0,83,0,100,5,100,4,132,0,125,0,124, + 0,83,0,41,6,78,90,12,80,89,84,72,79,78,67,65, + 83,69,79,75,115,12,0,0,0,80,89,84,72,79,78,67, + 65,83,69,79,75,99,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,19,0,0,0,115,20, + 0,0,0,116,0,106,1,106,2,12,0,111,9,136,0,116, + 3,106,4,118,0,83,0,41,1,122,94,84,114,117,101,32, + 105,102,32,102,105,108,101,110,97,109,101,115,32,109,117,115, + 116,32,98,101,32,99,104,101,99,107,101,100,32,99,97,115, + 101,45,105,110,115,101,110,115,105,116,105,118,101,108,121,32, + 97,110,100,32,105,103,110,111,114,101,32,101,110,118,105,114, + 111,110,109,101,110,116,32,102,108,97,103,115,32,97,114,101, + 32,110,111,116,32,115,101,116,46,41,5,218,3,115,121,115, + 218,5,102,108,97,103,115,218,18,105,103,110,111,114,101,95, + 101,110,118,105,114,111,110,109,101,110,116,218,3,95,111,115, + 218,7,101,110,118,105,114,111,110,114,9,0,0,0,169,1, + 218,3,107,101,121,114,9,0,0,0,114,10,0,0,0,218, + 11,95,114,101,108,97,120,95,99,97,115,101,71,0,0,0, + 243,2,0,0,0,20,2,122,37,95,109,97,107,101,95,114, + 101,108,97,120,95,99,97,115,101,46,60,108,111,99,97,108, + 115,62,46,95,114,101,108,97,120,95,99,97,115,101,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,83,0,0,0,243,4,0,0,0,100,1,83,0, + 41,2,122,53,84,114,117,101,32,105,102,32,102,105,108,101, + 110,97,109,101,115,32,109,117,115,116,32,98,101,32,99,104, + 101,99,107,101,100,32,99,97,115,101,45,105,110,115,101,110, + 115,105,116,105,118,101,108,121,46,70,114,9,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,114,23,0,0,0,75,0,0,0,243,2,0,0, + 0,4,2,41,5,114,16,0,0,0,218,8,112,108,97,116, + 102,111,114,109,218,10,115,116,97,114,116,115,119,105,116,104, + 218,27,95,67,65,83,69,95,73,78,83,69,78,83,73,84, + 73,86,69,95,80,76,65,84,70,79,82,77,83,218,35,95, + 67,65,83,69,95,73,78,83,69,78,83,73,84,73,86,69, + 95,80,76,65,84,70,79,82,77,83,95,83,84,82,95,75, + 69,89,41,1,114,23,0,0,0,114,9,0,0,0,114,21, + 0,0,0,114,10,0,0,0,218,16,95,109,97,107,101,95, + 114,101,108,97,120,95,99,97,115,101,64,0,0,0,115,16, + 0,0,0,12,1,12,1,6,1,4,2,12,2,4,7,8, + 253,4,3,114,31,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0, + 0,115,20,0,0,0,116,0,124,0,131,1,100,1,64,0, + 160,1,100,2,100,3,161,2,83,0,41,4,122,42,67,111, + 110,118,101,114,116,32,97,32,51,50,45,98,105,116,32,105, + 110,116,101,103,101,114,32,116,111,32,108,105,116,116,108,101, + 45,101,110,100,105,97,110,46,236,3,0,0,0,255,127,255, + 127,3,0,233,4,0,0,0,218,6,108,105,116,116,108,101, + 41,2,218,3,105,110,116,218,8,116,111,95,98,121,116,101, + 115,41,1,218,1,120,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,12,95,112,97,99,107,95,117,105,110, + 116,51,50,83,0,0,0,114,24,0,0,0,114,38,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,4,0,0,0,67,0,0,0,243,28,0,0,0,116, + 0,124,0,131,1,100,1,107,2,115,8,74,0,130,1,116, + 1,160,2,124,0,100,2,161,2,83,0,41,3,122,47,67, + 111,110,118,101,114,116,32,52,32,98,121,116,101,115,32,105, + 110,32,108,105,116,116,108,101,45,101,110,100,105,97,110,32, + 116,111,32,97,110,32,105,110,116,101,103,101,114,46,114,33, + 0,0,0,114,34,0,0,0,169,3,114,6,0,0,0,114, + 35,0,0,0,218,10,102,114,111,109,95,98,121,116,101,115, + 169,1,218,4,100,97,116,97,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,14,95,117,110,112,97,99,107, + 95,117,105,110,116,51,50,88,0,0,0,243,4,0,0,0, + 16,2,12,1,114,44,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,4,0,0,0,67,0, + 0,0,114,39,0,0,0,41,3,122,47,67,111,110,118,101, + 114,116,32,50,32,98,121,116,101,115,32,105,110,32,108,105, + 116,116,108,101,45,101,110,100,105,97,110,32,116,111,32,97, + 110,32,105,110,116,101,103,101,114,46,233,2,0,0,0,114, + 34,0,0,0,114,40,0,0,0,114,42,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,14,95, + 117,110,112,97,99,107,95,117,105,110,116,49,54,93,0,0, + 0,114,45,0,0,0,114,47,0,0,0,99,0,0,0,0, + 0,0,0,0,0,0,0,0,5,0,0,0,4,0,0,0, + 71,0,0,0,115,228,0,0,0,124,0,115,4,100,1,83, + 0,116,0,124,0,131,1,100,2,107,2,114,14,124,0,100, + 3,25,0,83,0,100,1,125,1,103,0,125,2,116,1,116, + 2,106,3,124,0,131,2,68,0,93,61,92,2,125,3,125, + 4,124,3,160,4,116,5,161,1,115,38,124,3,160,6,116, + 5,161,1,114,51,124,3,160,7,116,8,161,1,112,44,124, + 1,125,1,116,9,124,4,23,0,103,1,125,2,113,24,124, + 3,160,6,100,4,161,1,114,76,124,1,160,10,161,0,124, + 3,160,10,161,0,107,3,114,70,124,3,125,1,124,4,103, + 1,125,2,113,24,124,2,160,11,124,4,161,1,1,0,113, + 24,124,3,112,79,124,1,125,1,124,2,160,11,124,4,161, + 1,1,0,113,24,100,5,100,6,132,0,124,2,68,0,131, + 1,125,2,116,0,124,2,131,1,100,2,107,2,114,107,124, + 2,100,3,25,0,115,107,124,1,116,9,23,0,83,0,124, + 1,116,9,160,12,124,2,161,1,23,0,83,0,41,7,250, + 31,82,101,112,108,97,99,101,109,101,110,116,32,102,111,114, + 32,111,115,46,112,97,116,104,46,106,111,105,110,40,41,46, + 114,3,0,0,0,114,5,0,0,0,114,0,0,0,0,114, + 12,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,5,0,0,0,83,0,0,0,243,26,0, + 0,0,103,0,124,0,93,9,125,1,124,1,114,2,124,1, + 160,0,116,1,161,1,145,2,113,2,83,0,114,9,0,0, + 0,169,2,218,6,114,115,116,114,105,112,218,15,112,97,116, + 104,95,115,101,112,97,114,97,116,111,114,115,169,2,114,7, + 0,0,0,218,1,112,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,10,60,108,105,115,116,99,111,109,112, + 62,123,0,0,0,115,2,0,0,0,26,0,250,30,95,112, + 97,116,104,95,106,111,105,110,46,60,108,111,99,97,108,115, + 62,46,60,108,105,115,116,99,111,109,112,62,41,13,114,6, + 0,0,0,218,3,109,97,112,114,19,0,0,0,218,15,95, + 112,97,116,104,95,115,112,108,105,116,114,111,111,116,114,28, + 0,0,0,218,14,112,97,116,104,95,115,101,112,95,116,117, + 112,108,101,218,8,101,110,100,115,119,105,116,104,114,51,0, + 0,0,114,52,0,0,0,218,8,112,97,116,104,95,115,101, + 112,218,8,99,97,115,101,102,111,108,100,218,6,97,112,112, + 101,110,100,218,4,106,111,105,110,41,5,218,10,112,97,116, + 104,95,112,97,114,116,115,218,4,114,111,111,116,218,4,112, + 97,116,104,90,8,110,101,119,95,114,111,111,116,218,4,116, + 97,105,108,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,218,10,95,112,97,116,104,95,106,111,105,110,100,0, + 0,0,115,42,0,0,0,4,2,4,1,12,1,8,1,4, + 1,4,1,20,1,20,1,14,1,12,1,10,1,16,1,4, + 3,8,1,12,2,8,2,12,1,14,1,20,1,8,2,14, + 1,114,69,0,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,4,0,0,0,71,0,0,0,115, + 20,0,0,0,116,0,160,1,100,1,100,2,132,0,124,0, + 68,0,131,1,161,1,83,0,41,3,114,48,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 5,0,0,0,83,0,0,0,114,49,0,0,0,114,9,0, + 0,0,114,50,0,0,0,41,2,114,7,0,0,0,218,4, + 112,97,114,116,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,114,55,0,0,0,132,0,0,0,115,6,0,0, + 0,6,0,4,1,16,255,114,56,0,0,0,41,2,114,61, + 0,0,0,114,64,0,0,0,41,1,114,65,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,114,69, + 0,0,0,130,0,0,0,115,6,0,0,0,10,2,2,1, + 8,255,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,4,0,0,0,3,0,0,0,115,66,0,0,0, + 116,0,135,0,102,1,100,1,100,2,132,8,116,1,68,0, + 131,1,131,1,125,1,124,1,100,3,107,0,114,19,100,4, + 136,0,102,2,83,0,136,0,100,5,124,1,133,2,25,0, + 136,0,124,1,100,6,23,0,100,5,133,2,25,0,102,2, + 83,0,41,7,122,32,82,101,112,108,97,99,101,109,101,110, + 116,32,102,111,114,32,111,115,46,112,97,116,104,46,115,112, + 108,105,116,40,41,46,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,4,0,0,0,51,0,0,0,115, + 26,0,0,0,129,0,124,0,93,8,125,1,136,0,160,0, + 124,1,161,1,86,0,1,0,113,2,100,0,83,0,169,1, + 78,41,1,218,5,114,102,105,110,100,114,53,0,0,0,169, + 1,114,67,0,0,0,114,9,0,0,0,114,10,0,0,0, + 114,11,0,0,0,138,0,0,0,115,4,0,0,0,2,128, + 24,0,122,30,95,112,97,116,104,95,115,112,108,105,116,46, + 60,108,111,99,97,108,115,62,46,60,103,101,110,101,120,112, + 114,62,114,0,0,0,0,114,3,0,0,0,78,114,5,0, + 0,0,41,2,218,3,109,97,120,114,52,0,0,0,41,2, + 114,67,0,0,0,218,1,105,114,9,0,0,0,114,73,0, + 0,0,114,10,0,0,0,218,11,95,112,97,116,104,95,115, + 112,108,105,116,136,0,0,0,115,8,0,0,0,22,2,8, + 1,8,1,28,1,114,76,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67, + 0,0,0,115,10,0,0,0,116,0,160,1,124,0,161,1, + 83,0,41,1,122,126,83,116,97,116,32,116,104,101,32,112, + 97,116,104,46,10,10,32,32,32,32,77,97,100,101,32,97, + 32,115,101,112,97,114,97,116,101,32,102,117,110,99,116,105, + 111,110,32,116,111,32,109,97,107,101,32,105,116,32,101,97, + 115,105,101,114,32,116,111,32,111,118,101,114,114,105,100,101, + 32,105,110,32,101,120,112,101,114,105,109,101,110,116,115,10, + 32,32,32,32,40,101,46,103,46,32,99,97,99,104,101,32, + 115,116,97,116,32,114,101,115,117,108,116,115,41,46,10,10, + 32,32,32,32,41,2,114,19,0,0,0,90,4,115,116,97, + 116,114,73,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,10,95,112,97,116,104,95,115,116,97, + 116,144,0,0,0,115,2,0,0,0,10,7,114,77,0,0, + 0,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,8,0,0,0,67,0,0,0,115,48,0,0,0,122, + 6,116,0,124,0,131,1,125,2,87,0,110,10,4,0,116, + 1,121,16,1,0,1,0,1,0,89,0,100,1,83,0,119, + 0,124,2,106,2,100,2,64,0,124,1,107,2,83,0,41, + 3,122,49,84,101,115,116,32,119,104,101,116,104,101,114,32, + 116,104,101,32,112,97,116,104,32,105,115,32,116,104,101,32, + 115,112,101,99,105,102,105,101,100,32,109,111,100,101,32,116, + 121,112,101,46,70,105,0,240,0,0,41,3,114,77,0,0, + 0,218,7,79,83,69,114,114,111,114,218,7,115,116,95,109, + 111,100,101,41,3,114,67,0,0,0,218,4,109,111,100,101, + 90,9,115,116,97,116,95,105,110,102,111,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,18,95,112,97,116, + 104,95,105,115,95,109,111,100,101,95,116,121,112,101,154,0, + 0,0,115,12,0,0,0,2,2,12,1,12,1,6,1,2, + 255,14,2,114,81,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, + 0,115,10,0,0,0,116,0,124,0,100,1,131,2,83,0, + 41,2,122,31,82,101,112,108,97,99,101,109,101,110,116,32, + 102,111,114,32,111,115,46,112,97,116,104,46,105,115,102,105, + 108,101,46,105,0,128,0,0,41,1,114,81,0,0,0,114, + 73,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,12,95,112,97,116,104,95,105,115,102,105,108, + 101,163,0,0,0,243,2,0,0,0,10,2,114,82,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,3,0,0,0,67,0,0,0,115,22,0,0,0,124, + 0,115,6,116,0,160,1,161,0,125,0,116,2,124,0,100, + 1,131,2,83,0,41,2,122,30,82,101,112,108,97,99,101, + 109,101,110,116,32,102,111,114,32,111,115,46,112,97,116,104, + 46,105,115,100,105,114,46,105,0,64,0,0,41,3,114,19, + 0,0,0,218,6,103,101,116,99,119,100,114,81,0,0,0, + 114,73,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,218,11,95,112,97,116,104,95,105,115,100,105, + 114,168,0,0,0,115,6,0,0,0,4,2,8,1,10,1, + 114,85,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,4,0,0,0,67,0,0,0,115,62, + 0,0,0,124,0,115,4,100,1,83,0,116,0,160,1,124, + 0,161,1,100,2,25,0,160,2,100,3,100,4,161,2,125, + 1,116,3,124,1,131,1,100,5,107,4,111,30,124,1,160, + 4,100,6,161,1,112,30,124,1,160,5,100,4,161,1,83, + 0,41,7,250,30,82,101,112,108,97,99,101,109,101,110,116, + 32,102,111,114,32,111,115,46,112,97,116,104,46,105,115,97, + 98,115,46,70,114,0,0,0,0,114,2,0,0,0,114,1, + 0,0,0,114,5,0,0,0,122,2,92,92,41,6,114,19, + 0,0,0,114,58,0,0,0,218,7,114,101,112,108,97,99, + 101,114,6,0,0,0,114,28,0,0,0,114,60,0,0,0, + 41,2,114,67,0,0,0,114,66,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,11,95,112,97, + 116,104,95,105,115,97,98,115,176,0,0,0,115,8,0,0, + 0,4,2,4,1,22,1,32,1,114,88,0,0,0,99,1, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, - 0,0,0,67,0,0,0,115,10,0,0,0,116,0,124,0, - 100,1,131,2,83,0,41,2,122,31,82,101,112,108,97,99, - 101,109,101,110,116,32,102,111,114,32,111,115,46,112,97,116, - 104,46,105,115,102,105,108,101,46,105,0,128,0,0,41,1, - 114,79,0,0,0,114,71,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,12,95,112,97,116,104, - 95,105,115,102,105,108,101,159,0,0,0,243,2,0,0,0, - 10,2,114,80,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, - 115,22,0,0,0,124,0,115,6,116,0,160,1,161,0,125, - 0,116,2,124,0,100,1,131,2,83,0,41,2,122,30,82, - 101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,111, - 115,46,112,97,116,104,46,105,115,100,105,114,46,105,0,64, - 0,0,41,3,114,18,0,0,0,218,6,103,101,116,99,119, - 100,114,79,0,0,0,114,71,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,11,95,112,97,116, - 104,95,105,115,100,105,114,164,0,0,0,115,6,0,0,0, - 4,2,8,1,10,1,114,83,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, - 67,0,0,0,115,62,0,0,0,124,0,115,4,100,1,83, - 0,116,0,160,1,124,0,161,1,100,2,25,0,160,2,100, - 3,100,4,161,2,125,1,116,3,124,1,131,1,100,5,107, - 4,111,30,124,1,160,4,100,6,161,1,112,30,124,1,160, - 5,100,4,161,1,83,0,41,7,250,30,82,101,112,108,97, - 99,101,109,101,110,116,32,102,111,114,32,111,115,46,112,97, - 116,104,46,105,115,97,98,115,46,70,114,0,0,0,0,114, - 2,0,0,0,114,1,0,0,0,114,3,0,0,0,122,2, - 92,92,41,6,114,18,0,0,0,114,56,0,0,0,218,7, - 114,101,112,108,97,99,101,114,4,0,0,0,114,26,0,0, - 0,114,58,0,0,0,41,2,114,65,0,0,0,114,64,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,11,95,112,97,116,104,95,105,115,97,98,115,172,0, - 0,0,115,8,0,0,0,4,2,4,1,22,1,32,1,114, - 86,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,3,0,0,0,67,0,0,0,115,10,0, - 0,0,124,0,160,0,116,1,161,1,83,0,41,1,114,84, - 0,0,0,41,2,114,26,0,0,0,114,50,0,0,0,114, - 71,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,86,0,0,0,180,0,0,0,114,81,0,0, - 0,233,182,1,0,0,99,3,0,0,0,0,0,0,0,0, - 0,0,0,6,0,0,0,11,0,0,0,67,0,0,0,115, - 170,0,0,0,100,1,160,0,124,0,116,1,124,0,131,1, - 161,2,125,3,116,2,160,3,124,3,116,2,106,4,116,2, - 106,5,66,0,116,2,106,6,66,0,124,2,100,2,64,0, - 161,3,125,4,122,36,116,7,160,8,124,4,100,3,161,2, - 143,13,125,5,124,5,160,9,124,1,161,1,1,0,87,0, - 100,4,4,0,4,0,131,3,1,0,110,8,49,0,115,47, - 119,1,1,0,1,0,1,0,89,0,1,0,116,2,160,10, - 124,3,124,0,161,2,1,0,87,0,100,4,83,0,4,0, - 116,11,121,84,1,0,1,0,1,0,122,7,116,2,160,12, - 124,3,161,1,1,0,87,0,130,0,4,0,116,11,121,83, - 1,0,1,0,1,0,89,0,130,0,119,0,119,0,41,5, - 122,162,66,101,115,116,45,101,102,102,111,114,116,32,102,117, - 110,99,116,105,111,110,32,116,111,32,119,114,105,116,101,32, - 100,97,116,97,32,116,111,32,97,32,112,97,116,104,32,97, - 116,111,109,105,99,97,108,108,121,46,10,32,32,32,32,66, - 101,32,112,114,101,112,97,114,101,100,32,116,111,32,104,97, - 110,100,108,101,32,97,32,70,105,108,101,69,120,105,115,116, - 115,69,114,114,111,114,32,105,102,32,99,111,110,99,117,114, - 114,101,110,116,32,119,114,105,116,105,110,103,32,111,102,32, - 116,104,101,10,32,32,32,32,116,101,109,112,111,114,97,114, - 121,32,102,105,108,101,32,105,115,32,97,116,116,101,109,112, - 116,101,100,46,250,5,123,125,46,123,125,114,87,0,0,0, - 90,2,119,98,78,41,13,218,6,102,111,114,109,97,116,218, - 2,105,100,114,18,0,0,0,90,4,111,112,101,110,90,6, - 79,95,69,88,67,76,90,7,79,95,67,82,69,65,84,90, - 8,79,95,87,82,79,78,76,89,218,3,95,105,111,218,6, - 70,105,108,101,73,79,218,5,119,114,105,116,101,114,85,0, - 0,0,114,76,0,0,0,90,6,117,110,108,105,110,107,41, - 6,114,65,0,0,0,114,41,0,0,0,114,78,0,0,0, - 90,8,112,97,116,104,95,116,109,112,90,2,102,100,218,4, - 102,105,108,101,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,13,95,119,114,105,116,101,95,97,116,111,109, - 105,99,185,0,0,0,115,36,0,0,0,16,5,6,1,22, - 1,4,255,2,2,14,3,12,1,28,255,18,2,12,1,2, - 1,12,1,2,3,12,254,2,1,2,1,2,254,2,253,114, - 95,0,0,0,105,111,13,0,0,114,44,0,0,0,114,32, - 0,0,0,115,2,0,0,0,13,10,90,11,95,95,112,121, - 99,97,99,104,101,95,95,122,4,111,112,116,45,122,3,46, - 112,121,122,4,46,112,121,119,122,4,46,112,121,99,41,1, - 218,12,111,112,116,105,109,105,122,97,116,105,111,110,99,2, - 0,0,0,0,0,0,0,1,0,0,0,12,0,0,0,5, - 0,0,0,67,0,0,0,115,80,1,0,0,124,1,100,1, - 117,1,114,26,116,0,160,1,100,2,116,2,161,2,1,0, - 124,2,100,1,117,1,114,20,100,3,125,3,116,3,124,3, - 131,1,130,1,124,1,114,24,100,4,110,1,100,5,125,2, - 116,4,160,5,124,0,161,1,125,0,116,6,124,0,131,1, - 92,2,125,4,125,5,124,5,160,7,100,6,161,1,92,3, - 125,6,125,7,125,8,116,8,106,9,106,10,125,9,124,9, - 100,1,117,0,114,57,116,11,100,7,131,1,130,1,100,4, - 160,12,124,6,114,63,124,6,110,1,124,8,124,7,124,9, - 103,3,161,1,125,10,124,2,100,1,117,0,114,86,116,8, - 106,13,106,14,100,8,107,2,114,82,100,4,125,2,110,4, - 116,8,106,13,106,14,125,2,116,15,124,2,131,1,125,2, - 124,2,100,4,107,3,114,112,124,2,160,16,161,0,115,105, - 116,17,100,9,160,18,124,2,161,1,131,1,130,1,100,10, - 160,18,124,10,116,19,124,2,161,3,125,10,124,10,116,20, - 100,8,25,0,23,0,125,11,116,8,106,21,100,1,117,1, - 114,162,116,22,124,4,131,1,115,134,116,23,116,4,160,24, - 161,0,124,4,131,2,125,4,124,4,100,5,25,0,100,11, - 107,2,114,152,124,4,100,8,25,0,116,25,118,1,114,152, - 124,4,100,12,100,1,133,2,25,0,125,4,116,23,116,8, - 106,21,124,4,160,26,116,25,161,1,124,11,131,3,83,0, - 116,23,124,4,116,27,124,11,131,3,83,0,41,13,97,254, - 2,0,0,71,105,118,101,110,32,116,104,101,32,112,97,116, - 104,32,116,111,32,97,32,46,112,121,32,102,105,108,101,44, - 32,114,101,116,117,114,110,32,116,104,101,32,112,97,116,104, - 32,116,111,32,105,116,115,32,46,112,121,99,32,102,105,108, - 101,46,10,10,32,32,32,32,84,104,101,32,46,112,121,32, - 102,105,108,101,32,100,111,101,115,32,110,111,116,32,110,101, - 101,100,32,116,111,32,101,120,105,115,116,59,32,116,104,105, - 115,32,115,105,109,112,108,121,32,114,101,116,117,114,110,115, - 32,116,104,101,32,112,97,116,104,32,116,111,32,116,104,101, - 10,32,32,32,32,46,112,121,99,32,102,105,108,101,32,99, - 97,108,99,117,108,97,116,101,100,32,97,115,32,105,102,32, - 116,104,101,32,46,112,121,32,102,105,108,101,32,119,101,114, - 101,32,105,109,112,111,114,116,101,100,46,10,10,32,32,32, - 32,84,104,101,32,39,111,112,116,105,109,105,122,97,116,105, - 111,110,39,32,112,97,114,97,109,101,116,101,114,32,99,111, - 110,116,114,111,108,115,32,116,104,101,32,112,114,101,115,117, - 109,101,100,32,111,112,116,105,109,105,122,97,116,105,111,110, - 32,108,101,118,101,108,32,111,102,10,32,32,32,32,116,104, - 101,32,98,121,116,101,99,111,100,101,32,102,105,108,101,46, - 32,73,102,32,39,111,112,116,105,109,105,122,97,116,105,111, - 110,39,32,105,115,32,110,111,116,32,78,111,110,101,44,32, - 116,104,101,32,115,116,114,105,110,103,32,114,101,112,114,101, - 115,101,110,116,97,116,105,111,110,10,32,32,32,32,111,102, - 32,116,104,101,32,97,114,103,117,109,101,110,116,32,105,115, - 32,116,97,107,101,110,32,97,110,100,32,118,101,114,105,102, - 105,101,100,32,116,111,32,98,101,32,97,108,112,104,97,110, - 117,109,101,114,105,99,32,40,101,108,115,101,32,86,97,108, - 117,101,69,114,114,111,114,10,32,32,32,32,105,115,32,114, - 97,105,115,101,100,41,46,10,10,32,32,32,32,84,104,101, - 32,100,101,98,117,103,95,111,118,101,114,114,105,100,101,32, - 112,97,114,97,109,101,116,101,114,32,105,115,32,100,101,112, - 114,101,99,97,116,101,100,46,32,73,102,32,100,101,98,117, - 103,95,111,118,101,114,114,105,100,101,32,105,115,32,110,111, - 116,32,78,111,110,101,44,10,32,32,32,32,97,32,84,114, - 117,101,32,118,97,108,117,101,32,105,115,32,116,104,101,32, - 115,97,109,101,32,97,115,32,115,101,116,116,105,110,103,32, - 39,111,112,116,105,109,105,122,97,116,105,111,110,39,32,116, - 111,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105, - 110,103,10,32,32,32,32,119,104,105,108,101,32,97,32,70, - 97,108,115,101,32,118,97,108,117,101,32,105,115,32,101,113, - 117,105,118,97,108,101,110,116,32,116,111,32,115,101,116,116, - 105,110,103,32,39,111,112,116,105,109,105,122,97,116,105,111, - 110,39,32,116,111,32,39,49,39,46,10,10,32,32,32,32, - 73,102,32,115,121,115,46,105,109,112,108,101,109,101,110,116, - 97,116,105,111,110,46,99,97,99,104,101,95,116,97,103,32, - 105,115,32,78,111,110,101,32,116,104,101,110,32,78,111,116, - 73,109,112,108,101,109,101,110,116,101,100,69,114,114,111,114, - 32,105,115,32,114,97,105,115,101,100,46,10,10,32,32,32, - 32,78,122,70,116,104,101,32,100,101,98,117,103,95,111,118, - 101,114,114,105,100,101,32,112,97,114,97,109,101,116,101,114, - 32,105,115,32,100,101,112,114,101,99,97,116,101,100,59,32, - 117,115,101,32,39,111,112,116,105,109,105,122,97,116,105,111, - 110,39,32,105,110,115,116,101,97,100,122,50,100,101,98,117, - 103,95,111,118,101,114,114,105,100,101,32,111,114,32,111,112, - 116,105,109,105,122,97,116,105,111,110,32,109,117,115,116,32, - 98,101,32,115,101,116,32,116,111,32,78,111,110,101,114,10, - 0,0,0,114,3,0,0,0,218,1,46,250,36,115,121,115, + 0,0,0,67,0,0,0,115,10,0,0,0,124,0,160,0, + 116,1,161,1,83,0,41,1,114,86,0,0,0,41,2,114, + 28,0,0,0,114,52,0,0,0,114,73,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,114,88,0, + 0,0,184,0,0,0,114,83,0,0,0,233,182,1,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,6,0,0, + 0,11,0,0,0,67,0,0,0,115,170,0,0,0,100,1, + 160,0,124,0,116,1,124,0,131,1,161,2,125,3,116,2, + 160,3,124,3,116,2,106,4,116,2,106,5,66,0,116,2, + 106,6,66,0,124,2,100,2,64,0,161,3,125,4,122,36, + 116,7,160,8,124,4,100,3,161,2,143,13,125,5,124,5, + 160,9,124,1,161,1,1,0,87,0,100,4,4,0,4,0, + 131,3,1,0,110,8,49,0,115,47,119,1,1,0,1,0, + 1,0,89,0,1,0,116,2,160,10,124,3,124,0,161,2, + 1,0,87,0,100,4,83,0,4,0,116,11,121,84,1,0, + 1,0,1,0,122,7,116,2,160,12,124,3,161,1,1,0, + 87,0,130,0,4,0,116,11,121,83,1,0,1,0,1,0, + 89,0,130,0,119,0,119,0,41,5,122,162,66,101,115,116, + 45,101,102,102,111,114,116,32,102,117,110,99,116,105,111,110, + 32,116,111,32,119,114,105,116,101,32,100,97,116,97,32,116, + 111,32,97,32,112,97,116,104,32,97,116,111,109,105,99,97, + 108,108,121,46,10,32,32,32,32,66,101,32,112,114,101,112, + 97,114,101,100,32,116,111,32,104,97,110,100,108,101,32,97, + 32,70,105,108,101,69,120,105,115,116,115,69,114,114,111,114, + 32,105,102,32,99,111,110,99,117,114,114,101,110,116,32,119, + 114,105,116,105,110,103,32,111,102,32,116,104,101,10,32,32, + 32,32,116,101,109,112,111,114,97,114,121,32,102,105,108,101, + 32,105,115,32,97,116,116,101,109,112,116,101,100,46,250,5, + 123,125,46,123,125,114,89,0,0,0,90,2,119,98,78,41, + 13,218,6,102,111,114,109,97,116,218,2,105,100,114,19,0, + 0,0,90,4,111,112,101,110,90,6,79,95,69,88,67,76, + 90,7,79,95,67,82,69,65,84,90,8,79,95,87,82,79, + 78,76,89,218,3,95,105,111,218,6,70,105,108,101,73,79, + 218,5,119,114,105,116,101,114,87,0,0,0,114,78,0,0, + 0,90,6,117,110,108,105,110,107,41,6,114,67,0,0,0, + 114,43,0,0,0,114,80,0,0,0,90,8,112,97,116,104, + 95,116,109,112,90,2,102,100,218,4,102,105,108,101,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,13,95, + 119,114,105,116,101,95,97,116,111,109,105,99,189,0,0,0, + 115,36,0,0,0,16,5,6,1,22,1,4,255,2,2,14, + 3,12,1,28,255,18,2,12,1,2,1,12,1,2,3,12, + 254,2,1,2,1,2,254,2,253,114,97,0,0,0,105,111, + 13,0,0,114,46,0,0,0,114,34,0,0,0,115,2,0, + 0,0,13,10,90,11,95,95,112,121,99,97,99,104,101,95, + 95,122,4,111,112,116,45,122,3,46,112,121,122,4,46,112, + 121,119,122,4,46,112,121,99,41,1,218,12,111,112,116,105, + 109,105,122,97,116,105,111,110,99,2,0,0,0,0,0,0, + 0,1,0,0,0,12,0,0,0,5,0,0,0,67,0,0, + 0,115,80,1,0,0,124,1,100,1,117,1,114,26,116,0, + 160,1,100,2,116,2,161,2,1,0,124,2,100,1,117,1, + 114,20,100,3,125,3,116,3,124,3,131,1,130,1,124,1, + 114,24,100,4,110,1,100,5,125,2,116,4,160,5,124,0, + 161,1,125,0,116,6,124,0,131,1,92,2,125,4,125,5, + 124,5,160,7,100,6,161,1,92,3,125,6,125,7,125,8, + 116,8,106,9,106,10,125,9,124,9,100,1,117,0,114,57, + 116,11,100,7,131,1,130,1,100,4,160,12,124,6,114,63, + 124,6,110,1,124,8,124,7,124,9,103,3,161,1,125,10, + 124,2,100,1,117,0,114,86,116,8,106,13,106,14,100,8, + 107,2,114,82,100,4,125,2,110,4,116,8,106,13,106,14, + 125,2,116,15,124,2,131,1,125,2,124,2,100,4,107,3, + 114,112,124,2,160,16,161,0,115,105,116,17,100,9,160,18, + 124,2,161,1,131,1,130,1,100,10,160,18,124,10,116,19, + 124,2,161,3,125,10,124,10,116,20,100,8,25,0,23,0, + 125,11,116,8,106,21,100,1,117,1,114,162,116,22,124,4, + 131,1,115,134,116,23,116,4,160,24,161,0,124,4,131,2, + 125,4,124,4,100,5,25,0,100,11,107,2,114,152,124,4, + 100,8,25,0,116,25,118,1,114,152,124,4,100,12,100,1, + 133,2,25,0,125,4,116,23,116,8,106,21,124,4,160,26, + 116,25,161,1,124,11,131,3,83,0,116,23,124,4,116,27, + 124,11,131,3,83,0,41,13,97,254,2,0,0,71,105,118, + 101,110,32,116,104,101,32,112,97,116,104,32,116,111,32,97, + 32,46,112,121,32,102,105,108,101,44,32,114,101,116,117,114, + 110,32,116,104,101,32,112,97,116,104,32,116,111,32,105,116, + 115,32,46,112,121,99,32,102,105,108,101,46,10,10,32,32, + 32,32,84,104,101,32,46,112,121,32,102,105,108,101,32,100, + 111,101,115,32,110,111,116,32,110,101,101,100,32,116,111,32, + 101,120,105,115,116,59,32,116,104,105,115,32,115,105,109,112, + 108,121,32,114,101,116,117,114,110,115,32,116,104,101,32,112, + 97,116,104,32,116,111,32,116,104,101,10,32,32,32,32,46, + 112,121,99,32,102,105,108,101,32,99,97,108,99,117,108,97, + 116,101,100,32,97,115,32,105,102,32,116,104,101,32,46,112, + 121,32,102,105,108,101,32,119,101,114,101,32,105,109,112,111, + 114,116,101,100,46,10,10,32,32,32,32,84,104,101,32,39, + 111,112,116,105,109,105,122,97,116,105,111,110,39,32,112,97, + 114,97,109,101,116,101,114,32,99,111,110,116,114,111,108,115, + 32,116,104,101,32,112,114,101,115,117,109,101,100,32,111,112, + 116,105,109,105,122,97,116,105,111,110,32,108,101,118,101,108, + 32,111,102,10,32,32,32,32,116,104,101,32,98,121,116,101, + 99,111,100,101,32,102,105,108,101,46,32,73,102,32,39,111, + 112,116,105,109,105,122,97,116,105,111,110,39,32,105,115,32, + 110,111,116,32,78,111,110,101,44,32,116,104,101,32,115,116, + 114,105,110,103,32,114,101,112,114,101,115,101,110,116,97,116, + 105,111,110,10,32,32,32,32,111,102,32,116,104,101,32,97, + 114,103,117,109,101,110,116,32,105,115,32,116,97,107,101,110, + 32,97,110,100,32,118,101,114,105,102,105,101,100,32,116,111, + 32,98,101,32,97,108,112,104,97,110,117,109,101,114,105,99, + 32,40,101,108,115,101,32,86,97,108,117,101,69,114,114,111, + 114,10,32,32,32,32,105,115,32,114,97,105,115,101,100,41, + 46,10,10,32,32,32,32,84,104,101,32,100,101,98,117,103, + 95,111,118,101,114,114,105,100,101,32,112,97,114,97,109,101, + 116,101,114,32,105,115,32,100,101,112,114,101,99,97,116,101, + 100,46,32,73,102,32,100,101,98,117,103,95,111,118,101,114, + 114,105,100,101,32,105,115,32,110,111,116,32,78,111,110,101, + 44,10,32,32,32,32,97,32,84,114,117,101,32,118,97,108, + 117,101,32,105,115,32,116,104,101,32,115,97,109,101,32,97, + 115,32,115,101,116,116,105,110,103,32,39,111,112,116,105,109, + 105,122,97,116,105,111,110,39,32,116,111,32,116,104,101,32, + 101,109,112,116,121,32,115,116,114,105,110,103,10,32,32,32, + 32,119,104,105,108,101,32,97,32,70,97,108,115,101,32,118, + 97,108,117,101,32,105,115,32,101,113,117,105,118,97,108,101, + 110,116,32,116,111,32,115,101,116,116,105,110,103,32,39,111, + 112,116,105,109,105,122,97,116,105,111,110,39,32,116,111,32, + 39,49,39,46,10,10,32,32,32,32,73,102,32,115,121,115, 46,105,109,112,108,101,109,101,110,116,97,116,105,111,110,46, 99,97,99,104,101,95,116,97,103,32,105,115,32,78,111,110, - 101,114,0,0,0,0,122,24,123,33,114,125,32,105,115,32, - 110,111,116,32,97,108,112,104,97,110,117,109,101,114,105,99, - 122,7,123,125,46,123,125,123,125,114,11,0,0,0,114,44, - 0,0,0,41,28,218,9,95,119,97,114,110,105,110,103,115, - 218,4,119,97,114,110,218,18,68,101,112,114,101,99,97,116, - 105,111,110,87,97,114,110,105,110,103,218,9,84,121,112,101, - 69,114,114,111,114,114,18,0,0,0,218,6,102,115,112,97, - 116,104,114,74,0,0,0,218,10,114,112,97,114,116,105,116, - 105,111,110,114,15,0,0,0,218,14,105,109,112,108,101,109, - 101,110,116,97,116,105,111,110,218,9,99,97,99,104,101,95, - 116,97,103,218,19,78,111,116,73,109,112,108,101,109,101,110, - 116,101,100,69,114,114,111,114,114,62,0,0,0,114,16,0, - 0,0,218,8,111,112,116,105,109,105,122,101,218,3,115,116, - 114,218,7,105,115,97,108,110,117,109,218,10,86,97,108,117, - 101,69,114,114,111,114,114,89,0,0,0,218,4,95,79,80, - 84,218,17,66,89,84,69,67,79,68,69,95,83,85,70,70, - 73,88,69,83,218,14,112,121,99,97,99,104,101,95,112,114, - 101,102,105,120,114,86,0,0,0,114,67,0,0,0,114,82, - 0,0,0,114,50,0,0,0,218,6,108,115,116,114,105,112, - 218,8,95,80,89,67,65,67,72,69,41,12,114,65,0,0, - 0,90,14,100,101,98,117,103,95,111,118,101,114,114,105,100, - 101,114,96,0,0,0,218,7,109,101,115,115,97,103,101,218, - 4,104,101,97,100,114,66,0,0,0,90,4,98,97,115,101, - 114,6,0,0,0,218,4,114,101,115,116,90,3,116,97,103, - 90,15,97,108,109,111,115,116,95,102,105,108,101,110,97,109, - 101,218,8,102,105,108,101,110,97,109,101,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,17,99,97,99,104, - 101,95,102,114,111,109,95,115,111,117,114,99,101,124,1,0, - 0,115,72,0,0,0,8,18,6,1,2,1,4,255,8,2, - 4,1,8,1,12,1,10,1,12,1,16,1,8,1,8,1, - 8,1,24,1,8,1,12,1,6,1,8,2,8,1,8,1, - 8,1,14,1,14,1,12,1,10,1,8,9,14,1,24,5, - 12,1,2,4,4,1,8,1,2,1,4,253,12,5,114,121, - 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, - 10,0,0,0,5,0,0,0,67,0,0,0,115,40,1,0, - 0,116,0,106,1,106,2,100,1,117,0,114,10,116,3,100, - 2,131,1,130,1,116,4,160,5,124,0,161,1,125,0,116, - 6,124,0,131,1,92,2,125,1,125,2,100,3,125,3,116, - 0,106,7,100,1,117,1,114,51,116,0,106,7,160,8,116, - 9,161,1,125,4,124,1,160,10,124,4,116,11,23,0,161, - 1,114,51,124,1,116,12,124,4,131,1,100,1,133,2,25, - 0,125,1,100,4,125,3,124,3,115,72,116,6,124,1,131, - 1,92,2,125,1,125,5,124,5,116,13,107,3,114,72,116, - 14,116,13,155,0,100,5,124,0,155,2,157,3,131,1,130, - 1,124,2,160,15,100,6,161,1,125,6,124,6,100,7,118, - 1,114,88,116,14,100,8,124,2,155,2,157,2,131,1,130, - 1,124,6,100,9,107,2,114,132,124,2,160,16,100,6,100, - 10,161,2,100,11,25,0,125,7,124,7,160,10,116,17,161, - 1,115,112,116,14,100,12,116,17,155,2,157,2,131,1,130, - 1,124,7,116,12,116,17,131,1,100,1,133,2,25,0,125, - 8,124,8,160,18,161,0,115,132,116,14,100,13,124,7,155, - 2,100,14,157,3,131,1,130,1,124,2,160,19,100,6,161, - 1,100,15,25,0,125,9,116,20,124,1,124,9,116,21,100, - 15,25,0,23,0,131,2,83,0,41,16,97,110,1,0,0, - 71,105,118,101,110,32,116,104,101,32,112,97,116,104,32,116, - 111,32,97,32,46,112,121,99,46,32,102,105,108,101,44,32, - 114,101,116,117,114,110,32,116,104,101,32,112,97,116,104,32, - 116,111,32,105,116,115,32,46,112,121,32,102,105,108,101,46, - 10,10,32,32,32,32,84,104,101,32,46,112,121,99,32,102, - 105,108,101,32,100,111,101,115,32,110,111,116,32,110,101,101, - 100,32,116,111,32,101,120,105,115,116,59,32,116,104,105,115, - 32,115,105,109,112,108,121,32,114,101,116,117,114,110,115,32, - 116,104,101,32,112,97,116,104,32,116,111,10,32,32,32,32, - 116,104,101,32,46,112,121,32,102,105,108,101,32,99,97,108, - 99,117,108,97,116,101,100,32,116,111,32,99,111,114,114,101, - 115,112,111,110,100,32,116,111,32,116,104,101,32,46,112,121, - 99,32,102,105,108,101,46,32,32,73,102,32,112,97,116,104, - 32,100,111,101,115,10,32,32,32,32,110,111,116,32,99,111, - 110,102,111,114,109,32,116,111,32,80,69,80,32,51,49,52, - 55,47,52,56,56,32,102,111,114,109,97,116,44,32,86,97, - 108,117,101,69,114,114,111,114,32,119,105,108,108,32,98,101, - 32,114,97,105,115,101,100,46,32,73,102,10,32,32,32,32, - 115,121,115,46,105,109,112,108,101,109,101,110,116,97,116,105, - 111,110,46,99,97,99,104,101,95,116,97,103,32,105,115,32, - 78,111,110,101,32,116,104,101,110,32,78,111,116,73,109,112, - 108,101,109,101,110,116,101,100,69,114,114,111,114,32,105,115, - 32,114,97,105,115,101,100,46,10,10,32,32,32,32,78,114, - 98,0,0,0,70,84,122,31,32,110,111,116,32,98,111,116, - 116,111,109,45,108,101,118,101,108,32,100,105,114,101,99,116, - 111,114,121,32,105,110,32,114,97,0,0,0,62,2,0,0, - 0,114,44,0,0,0,233,3,0,0,0,122,29,101,120,112, - 101,99,116,101,100,32,111,110,108,121,32,50,32,111,114,32, - 51,32,100,111,116,115,32,105,110,32,114,122,0,0,0,114, - 44,0,0,0,233,254,255,255,255,122,53,111,112,116,105,109, - 105,122,97,116,105,111,110,32,112,111,114,116,105,111,110,32, - 111,102,32,102,105,108,101,110,97,109,101,32,100,111,101,115, - 32,110,111,116,32,115,116,97,114,116,32,119,105,116,104,32, - 122,19,111,112,116,105,109,105,122,97,116,105,111,110,32,108, - 101,118,101,108,32,122,29,32,105,115,32,110,111,116,32,97, - 110,32,97,108,112,104,97,110,117,109,101,114,105,99,32,118, - 97,108,117,101,114,0,0,0,0,41,22,114,15,0,0,0, - 114,105,0,0,0,114,106,0,0,0,114,107,0,0,0,114, - 18,0,0,0,114,103,0,0,0,114,74,0,0,0,114,114, - 0,0,0,114,49,0,0,0,114,50,0,0,0,114,26,0, - 0,0,114,59,0,0,0,114,4,0,0,0,114,116,0,0, - 0,114,111,0,0,0,218,5,99,111,117,110,116,218,6,114, - 115,112,108,105,116,114,112,0,0,0,114,110,0,0,0,218, - 9,112,97,114,116,105,116,105,111,110,114,67,0,0,0,218, - 15,83,79,85,82,67,69,95,83,85,70,70,73,88,69,83, - 41,10,114,65,0,0,0,114,118,0,0,0,90,16,112,121, - 99,97,99,104,101,95,102,105,108,101,110,97,109,101,90,23, - 102,111,117,110,100,95,105,110,95,112,121,99,97,99,104,101, - 95,112,114,101,102,105,120,90,13,115,116,114,105,112,112,101, - 100,95,112,97,116,104,90,7,112,121,99,97,99,104,101,90, - 9,100,111,116,95,99,111,117,110,116,114,96,0,0,0,90, - 9,111,112,116,95,108,101,118,101,108,90,13,98,97,115,101, - 95,102,105,108,101,110,97,109,101,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,17,115,111,117,114,99,101, - 95,102,114,111,109,95,99,97,99,104,101,195,1,0,0,115, - 60,0,0,0,12,9,8,1,10,1,12,1,4,1,10,1, - 12,1,14,1,16,1,4,1,4,1,12,1,8,1,8,1, - 2,1,8,255,10,2,8,1,14,1,8,1,16,1,10,1, - 4,1,2,1,8,255,16,2,8,1,16,1,14,2,18,1, - 114,128,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,5,0,0,0,9,0,0,0,67,0,0,0,115,124, - 0,0,0,116,0,124,0,131,1,100,1,107,2,114,8,100, - 2,83,0,124,0,160,1,100,3,161,1,92,3,125,1,125, - 2,125,3,124,1,114,28,124,3,160,2,161,0,100,4,100, - 5,133,2,25,0,100,6,107,3,114,30,124,0,83,0,122, - 6,116,3,124,0,131,1,125,4,87,0,110,17,4,0,116, - 4,116,5,102,2,121,53,1,0,1,0,1,0,124,0,100, - 2,100,5,133,2,25,0,125,4,89,0,110,1,119,0,116, - 6,124,4,131,1,114,60,124,4,83,0,124,0,83,0,41, - 7,122,188,67,111,110,118,101,114,116,32,97,32,98,121,116, - 101,99,111,100,101,32,102,105,108,101,32,112,97,116,104,32, - 116,111,32,97,32,115,111,117,114,99,101,32,112,97,116,104, - 32,40,105,102,32,112,111,115,115,105,98,108,101,41,46,10, - 10,32,32,32,32,84,104,105,115,32,102,117,110,99,116,105, - 111,110,32,101,120,105,115,116,115,32,112,117,114,101,108,121, - 32,102,111,114,32,98,97,99,107,119,97,114,100,115,45,99, - 111,109,112,97,116,105,98,105,108,105,116,121,32,102,111,114, - 10,32,32,32,32,80,121,73,109,112,111,114,116,95,69,120, - 101,99,67,111,100,101,77,111,100,117,108,101,87,105,116,104, - 70,105,108,101,110,97,109,101,115,40,41,32,105,110,32,116, - 104,101,32,67,32,65,80,73,46,10,10,32,32,32,32,114, - 0,0,0,0,78,114,97,0,0,0,233,253,255,255,255,233, - 255,255,255,255,90,2,112,121,41,7,114,4,0,0,0,114, - 104,0,0,0,218,5,108,111,119,101,114,114,128,0,0,0, - 114,107,0,0,0,114,111,0,0,0,114,80,0,0,0,41, - 5,218,13,98,121,116,101,99,111,100,101,95,112,97,116,104, - 114,119,0,0,0,218,1,95,90,9,101,120,116,101,110,115, - 105,111,110,218,11,115,111,117,114,99,101,95,112,97,116,104, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 15,95,103,101,116,95,115,111,117,114,99,101,102,105,108,101, - 235,1,0,0,115,22,0,0,0,12,7,4,1,16,1,24, - 1,4,1,2,1,12,1,16,1,16,1,2,255,16,2,114, - 135,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,8,0,0,0,67,0,0,0,115,68,0, - 0,0,124,0,160,0,116,1,116,2,131,1,161,1,114,23, - 122,5,116,3,124,0,131,1,87,0,83,0,4,0,116,4, - 121,22,1,0,1,0,1,0,89,0,100,0,83,0,119,0, - 124,0,160,0,116,1,116,5,131,1,161,1,114,32,124,0, - 83,0,100,0,83,0,114,69,0,0,0,41,6,114,58,0, - 0,0,218,5,116,117,112,108,101,114,127,0,0,0,114,121, - 0,0,0,114,107,0,0,0,114,113,0,0,0,41,1,114, - 120,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,11,95,103,101,116,95,99,97,99,104,101,100, - 254,1,0,0,115,18,0,0,0,14,1,2,1,10,1,12, - 1,6,1,2,255,14,2,4,1,4,2,114,137,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,8,0,0,0,67,0,0,0,115,50,0,0,0,122,7, - 116,0,124,0,131,1,106,1,125,1,87,0,110,11,4,0, - 116,2,121,18,1,0,1,0,1,0,100,1,125,1,89,0, - 110,1,119,0,124,1,100,2,79,0,125,1,124,1,83,0, - 41,3,122,51,67,97,108,99,117,108,97,116,101,32,116,104, - 101,32,109,111,100,101,32,112,101,114,109,105,115,115,105,111, - 110,115,32,102,111,114,32,97,32,98,121,116,101,99,111,100, - 101,32,102,105,108,101,46,114,87,0,0,0,233,128,0,0, - 0,41,3,114,75,0,0,0,114,77,0,0,0,114,76,0, - 0,0,41,2,114,65,0,0,0,114,78,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,10,95, - 99,97,108,99,95,109,111,100,101,10,2,0,0,115,14,0, - 0,0,2,2,14,1,12,1,8,1,2,255,8,4,4,1, - 114,139,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,4,0,0,0,3,0,0,0,115,52, - 0,0,0,100,6,135,0,102,1,100,2,100,3,132,9,125, - 1,116,0,100,1,117,1,114,15,116,0,106,1,125,2,110, - 4,100,4,100,5,132,0,125,2,124,2,124,1,136,0,131, - 2,1,0,124,1,83,0,41,7,122,252,68,101,99,111,114, - 97,116,111,114,32,116,111,32,118,101,114,105,102,121,32,116, - 104,97,116,32,116,104,101,32,109,111,100,117,108,101,32,98, - 101,105,110,103,32,114,101,113,117,101,115,116,101,100,32,109, - 97,116,99,104,101,115,32,116,104,101,32,111,110,101,32,116, - 104,101,10,32,32,32,32,108,111,97,100,101,114,32,99,97, - 110,32,104,97,110,100,108,101,46,10,10,32,32,32,32,84, - 104,101,32,102,105,114,115,116,32,97,114,103,117,109,101,110, - 116,32,40,115,101,108,102,41,32,109,117,115,116,32,100,101, - 102,105,110,101,32,95,110,97,109,101,32,119,104,105,99,104, - 32,116,104,101,32,115,101,99,111,110,100,32,97,114,103,117, - 109,101,110,116,32,105,115,10,32,32,32,32,99,111,109,112, - 97,114,101,100,32,97,103,97,105,110,115,116,46,32,73,102, - 32,116,104,101,32,99,111,109,112,97,114,105,115,111,110,32, - 102,97,105,108,115,32,116,104,101,110,32,73,109,112,111,114, - 116,69,114,114,111,114,32,105,115,32,114,97,105,115,101,100, - 46,10,10,32,32,32,32,78,99,2,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,4,0,0,0,31,0,0, - 0,115,72,0,0,0,124,1,100,0,117,0,114,8,124,0, - 106,0,125,1,110,16,124,0,106,0,124,1,107,3,114,24, - 116,1,100,1,124,0,106,0,124,1,102,2,22,0,124,1, - 100,2,141,2,130,1,136,0,124,0,124,1,103,2,124,2, - 162,1,82,0,105,0,124,3,164,1,142,1,83,0,41,3, - 78,122,30,108,111,97,100,101,114,32,102,111,114,32,37,115, - 32,99,97,110,110,111,116,32,104,97,110,100,108,101,32,37, - 115,169,1,218,4,110,97,109,101,41,2,114,141,0,0,0, - 218,11,73,109,112,111,114,116,69,114,114,111,114,41,4,218, - 4,115,101,108,102,114,141,0,0,0,218,4,97,114,103,115, - 218,6,107,119,97,114,103,115,169,1,218,6,109,101,116,104, - 111,100,114,7,0,0,0,114,8,0,0,0,218,19,95,99, - 104,101,99,107,95,110,97,109,101,95,119,114,97,112,112,101, - 114,30,2,0,0,115,18,0,0,0,8,1,8,1,10,1, - 4,1,8,1,2,255,2,1,6,255,24,2,122,40,95,99, - 104,101,99,107,95,110,97,109,101,46,60,108,111,99,97,108, - 115,62,46,95,99,104,101,99,107,95,110,97,109,101,95,119, - 114,97,112,112,101,114,99,2,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,7,0,0,0,83,0,0,0,115, - 56,0,0,0,100,1,68,0,93,16,125,2,116,0,124,1, - 124,2,131,2,114,18,116,1,124,0,124,2,116,2,124,1, - 124,2,131,2,131,3,1,0,113,2,124,0,106,3,160,4, - 124,1,106,3,161,1,1,0,100,0,83,0,41,2,78,41, - 4,218,10,95,95,109,111,100,117,108,101,95,95,218,8,95, - 95,110,97,109,101,95,95,218,12,95,95,113,117,97,108,110, - 97,109,101,95,95,218,7,95,95,100,111,99,95,95,41,5, - 218,7,104,97,115,97,116,116,114,218,7,115,101,116,97,116, - 116,114,218,7,103,101,116,97,116,116,114,218,8,95,95,100, - 105,99,116,95,95,218,6,117,112,100,97,116,101,41,3,90, - 3,110,101,119,90,3,111,108,100,114,85,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,5,95, - 119,114,97,112,43,2,0,0,115,10,0,0,0,8,1,10, - 1,18,1,2,128,18,1,122,26,95,99,104,101,99,107,95, - 110,97,109,101,46,60,108,111,99,97,108,115,62,46,95,119, - 114,97,112,114,69,0,0,0,41,2,218,10,95,98,111,111, - 116,115,116,114,97,112,114,158,0,0,0,41,3,114,147,0, - 0,0,114,148,0,0,0,114,158,0,0,0,114,7,0,0, - 0,114,146,0,0,0,114,8,0,0,0,218,11,95,99,104, - 101,99,107,95,110,97,109,101,22,2,0,0,115,12,0,0, - 0,14,8,8,10,8,1,8,2,10,6,4,1,114,160,0, - 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,5, - 0,0,0,6,0,0,0,67,0,0,0,115,72,0,0,0, - 116,0,160,1,100,1,116,2,161,2,1,0,124,0,160,3, - 124,1,161,1,92,2,125,2,125,3,124,2,100,2,117,0, - 114,34,116,4,124,3,131,1,114,34,100,3,125,4,116,0, - 160,1,124,4,160,5,124,3,100,4,25,0,161,1,116,6, - 161,2,1,0,124,2,83,0,41,5,122,155,84,114,121,32, - 116,111,32,102,105,110,100,32,97,32,108,111,97,100,101,114, - 32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,105, - 101,100,32,109,111,100,117,108,101,32,98,121,32,100,101,108, - 101,103,97,116,105,110,103,32,116,111,10,32,32,32,32,115, - 101,108,102,46,102,105,110,100,95,108,111,97,100,101,114,40, - 41,46,10,10,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,32,105,110,32,102,97,118,111,114,32,111,102,32,102,105, - 110,100,101,114,46,102,105,110,100,95,115,112,101,99,40,41, - 46,10,10,32,32,32,32,122,90,102,105,110,100,95,109,111, - 100,117,108,101,40,41,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,32,97,110,100,32,115,108,97,116,101,100,32, - 102,111,114,32,114,101,109,111,118,97,108,32,105,110,32,80, - 121,116,104,111,110,32,51,46,49,50,59,32,117,115,101,32, - 102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,116, - 101,97,100,78,122,44,78,111,116,32,105,109,112,111,114,116, - 105,110,103,32,100,105,114,101,99,116,111,114,121,32,123,125, - 58,32,109,105,115,115,105,110,103,32,95,95,105,110,105,116, - 95,95,114,0,0,0,0,41,7,114,99,0,0,0,114,100, - 0,0,0,114,101,0,0,0,218,11,102,105,110,100,95,108, - 111,97,100,101,114,114,4,0,0,0,114,89,0,0,0,218, - 13,73,109,112,111,114,116,87,97,114,110,105,110,103,41,5, - 114,143,0,0,0,218,8,102,117,108,108,110,97,109,101,218, - 6,108,111,97,100,101,114,218,8,112,111,114,116,105,111,110, - 115,218,3,109,115,103,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,17,95,102,105,110,100,95,109,111,100, - 117,108,101,95,115,104,105,109,53,2,0,0,115,16,0,0, - 0,6,7,2,2,4,254,14,6,16,1,4,1,22,1,4, - 1,114,167,0,0,0,99,3,0,0,0,0,0,0,0,0, - 0,0,0,6,0,0,0,4,0,0,0,67,0,0,0,115, - 166,0,0,0,124,0,100,1,100,2,133,2,25,0,125,3, - 124,3,116,0,107,3,114,32,100,3,124,1,155,2,100,4, - 124,3,155,2,157,4,125,4,116,1,160,2,100,5,124,4, - 161,2,1,0,116,3,124,4,102,1,105,0,124,2,164,1, - 142,1,130,1,116,4,124,0,131,1,100,6,107,0,114,53, - 100,7,124,1,155,2,157,2,125,4,116,1,160,2,100,5, - 124,4,161,2,1,0,116,5,124,4,131,1,130,1,116,6, - 124,0,100,2,100,8,133,2,25,0,131,1,125,5,124,5, - 100,9,64,0,114,81,100,10,124,5,155,2,100,11,124,1, - 155,2,157,4,125,4,116,3,124,4,102,1,105,0,124,2, - 164,1,142,1,130,1,124,5,83,0,41,12,97,84,2,0, - 0,80,101,114,102,111,114,109,32,98,97,115,105,99,32,118, - 97,108,105,100,105,116,121,32,99,104,101,99,107,105,110,103, - 32,111,102,32,97,32,112,121,99,32,104,101,97,100,101,114, - 32,97,110,100,32,114,101,116,117,114,110,32,116,104,101,32, - 102,108,97,103,115,32,102,105,101,108,100,44,10,32,32,32, - 32,119,104,105,99,104,32,100,101,116,101,114,109,105,110,101, - 115,32,104,111,119,32,116,104,101,32,112,121,99,32,115,104, - 111,117,108,100,32,98,101,32,102,117,114,116,104,101,114,32, - 118,97,108,105,100,97,116,101,100,32,97,103,97,105,110,115, - 116,32,116,104,101,32,115,111,117,114,99,101,46,10,10,32, - 32,32,32,42,100,97,116,97,42,32,105,115,32,116,104,101, - 32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,101, - 32,112,121,99,32,102,105,108,101,46,32,40,79,110,108,121, - 32,116,104,101,32,102,105,114,115,116,32,49,54,32,98,121, - 116,101,115,32,97,114,101,10,32,32,32,32,114,101,113,117, - 105,114,101,100,44,32,116,104,111,117,103,104,46,41,10,10, + 101,32,116,104,101,110,32,78,111,116,73,109,112,108,101,109, + 101,110,116,101,100,69,114,114,111,114,32,105,115,32,114,97, + 105,115,101,100,46,10,10,32,32,32,32,78,122,70,116,104, + 101,32,100,101,98,117,103,95,111,118,101,114,114,105,100,101, + 32,112,97,114,97,109,101,116,101,114,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,59,32,117,115,101,32,39,111, + 112,116,105,109,105,122,97,116,105,111,110,39,32,105,110,115, + 116,101,97,100,122,50,100,101,98,117,103,95,111,118,101,114, + 114,105,100,101,32,111,114,32,111,112,116,105,109,105,122,97, + 116,105,111,110,32,109,117,115,116,32,98,101,32,115,101,116, + 32,116,111,32,78,111,110,101,114,3,0,0,0,114,5,0, + 0,0,218,1,46,250,36,115,121,115,46,105,109,112,108,101, + 109,101,110,116,97,116,105,111,110,46,99,97,99,104,101,95, + 116,97,103,32,105,115,32,78,111,110,101,114,0,0,0,0, + 122,24,123,33,114,125,32,105,115,32,110,111,116,32,97,108, + 112,104,97,110,117,109,101,114,105,99,122,7,123,125,46,123, + 125,123,125,114,12,0,0,0,114,46,0,0,0,41,28,218, + 9,95,119,97,114,110,105,110,103,115,218,4,119,97,114,110, + 218,18,68,101,112,114,101,99,97,116,105,111,110,87,97,114, + 110,105,110,103,218,9,84,121,112,101,69,114,114,111,114,114, + 19,0,0,0,218,6,102,115,112,97,116,104,114,76,0,0, + 0,218,10,114,112,97,114,116,105,116,105,111,110,114,16,0, + 0,0,218,14,105,109,112,108,101,109,101,110,116,97,116,105, + 111,110,218,9,99,97,99,104,101,95,116,97,103,218,19,78, + 111,116,73,109,112,108,101,109,101,110,116,101,100,69,114,114, + 111,114,114,64,0,0,0,114,17,0,0,0,218,8,111,112, + 116,105,109,105,122,101,218,3,115,116,114,218,7,105,115,97, + 108,110,117,109,218,10,86,97,108,117,101,69,114,114,111,114, + 114,91,0,0,0,218,4,95,79,80,84,218,17,66,89,84, + 69,67,79,68,69,95,83,85,70,70,73,88,69,83,218,14, + 112,121,99,97,99,104,101,95,112,114,101,102,105,120,114,88, + 0,0,0,114,69,0,0,0,114,84,0,0,0,114,52,0, + 0,0,218,6,108,115,116,114,105,112,218,8,95,80,89,67, + 65,67,72,69,41,12,114,67,0,0,0,90,14,100,101,98, + 117,103,95,111,118,101,114,114,105,100,101,114,98,0,0,0, + 218,7,109,101,115,115,97,103,101,218,4,104,101,97,100,114, + 68,0,0,0,90,4,98,97,115,101,114,8,0,0,0,218, + 4,114,101,115,116,90,3,116,97,103,90,15,97,108,109,111, + 115,116,95,102,105,108,101,110,97,109,101,218,8,102,105,108, + 101,110,97,109,101,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,218,17,99,97,99,104,101,95,102,114,111,109, + 95,115,111,117,114,99,101,128,1,0,0,115,72,0,0,0, + 8,18,6,1,2,1,4,255,8,2,4,1,8,1,12,1, + 10,1,12,1,16,1,8,1,8,1,8,1,24,1,8,1, + 12,1,6,1,8,2,8,1,8,1,8,1,14,1,14,1, + 12,1,10,1,8,9,14,1,24,5,12,1,2,4,4,1, + 8,1,2,1,4,253,12,5,114,123,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,10,0,0,0,5,0, + 0,0,67,0,0,0,115,40,1,0,0,116,0,106,1,106, + 2,100,1,117,0,114,10,116,3,100,2,131,1,130,1,116, + 4,160,5,124,0,161,1,125,0,116,6,124,0,131,1,92, + 2,125,1,125,2,100,3,125,3,116,0,106,7,100,1,117, + 1,114,51,116,0,106,7,160,8,116,9,161,1,125,4,124, + 1,160,10,124,4,116,11,23,0,161,1,114,51,124,1,116, + 12,124,4,131,1,100,1,133,2,25,0,125,1,100,4,125, + 3,124,3,115,72,116,6,124,1,131,1,92,2,125,1,125, + 5,124,5,116,13,107,3,114,72,116,14,116,13,155,0,100, + 5,124,0,155,2,157,3,131,1,130,1,124,2,160,15,100, + 6,161,1,125,6,124,6,100,7,118,1,114,88,116,14,100, + 8,124,2,155,2,157,2,131,1,130,1,124,6,100,9,107, + 2,114,132,124,2,160,16,100,6,100,10,161,2,100,11,25, + 0,125,7,124,7,160,10,116,17,161,1,115,112,116,14,100, + 12,116,17,155,2,157,2,131,1,130,1,124,7,116,12,116, + 17,131,1,100,1,133,2,25,0,125,8,124,8,160,18,161, + 0,115,132,116,14,100,13,124,7,155,2,100,14,157,3,131, + 1,130,1,124,2,160,19,100,6,161,1,100,15,25,0,125, + 9,116,20,124,1,124,9,116,21,100,15,25,0,23,0,131, + 2,83,0,41,16,97,110,1,0,0,71,105,118,101,110,32, + 116,104,101,32,112,97,116,104,32,116,111,32,97,32,46,112, + 121,99,46,32,102,105,108,101,44,32,114,101,116,117,114,110, + 32,116,104,101,32,112,97,116,104,32,116,111,32,105,116,115, + 32,46,112,121,32,102,105,108,101,46,10,10,32,32,32,32, + 84,104,101,32,46,112,121,99,32,102,105,108,101,32,100,111, + 101,115,32,110,111,116,32,110,101,101,100,32,116,111,32,101, + 120,105,115,116,59,32,116,104,105,115,32,115,105,109,112,108, + 121,32,114,101,116,117,114,110,115,32,116,104,101,32,112,97, + 116,104,32,116,111,10,32,32,32,32,116,104,101,32,46,112, + 121,32,102,105,108,101,32,99,97,108,99,117,108,97,116,101, + 100,32,116,111,32,99,111,114,114,101,115,112,111,110,100,32, + 116,111,32,116,104,101,32,46,112,121,99,32,102,105,108,101, + 46,32,32,73,102,32,112,97,116,104,32,100,111,101,115,10, + 32,32,32,32,110,111,116,32,99,111,110,102,111,114,109,32, + 116,111,32,80,69,80,32,51,49,52,55,47,52,56,56,32, + 102,111,114,109,97,116,44,32,86,97,108,117,101,69,114,114, + 111,114,32,119,105,108,108,32,98,101,32,114,97,105,115,101, + 100,46,32,73,102,10,32,32,32,32,115,121,115,46,105,109, + 112,108,101,109,101,110,116,97,116,105,111,110,46,99,97,99, + 104,101,95,116,97,103,32,105,115,32,78,111,110,101,32,116, + 104,101,110,32,78,111,116,73,109,112,108,101,109,101,110,116, + 101,100,69,114,114,111,114,32,105,115,32,114,97,105,115,101, + 100,46,10,10,32,32,32,32,78,114,100,0,0,0,70,84, + 122,31,32,110,111,116,32,98,111,116,116,111,109,45,108,101, + 118,101,108,32,100,105,114,101,99,116,111,114,121,32,105,110, + 32,114,99,0,0,0,62,2,0,0,0,114,46,0,0,0, + 233,3,0,0,0,122,29,101,120,112,101,99,116,101,100,32, + 111,110,108,121,32,50,32,111,114,32,51,32,100,111,116,115, + 32,105,110,32,114,124,0,0,0,114,46,0,0,0,233,254, + 255,255,255,122,53,111,112,116,105,109,105,122,97,116,105,111, + 110,32,112,111,114,116,105,111,110,32,111,102,32,102,105,108, + 101,110,97,109,101,32,100,111,101,115,32,110,111,116,32,115, + 116,97,114,116,32,119,105,116,104,32,122,19,111,112,116,105, + 109,105,122,97,116,105,111,110,32,108,101,118,101,108,32,122, + 29,32,105,115,32,110,111,116,32,97,110,32,97,108,112,104, + 97,110,117,109,101,114,105,99,32,118,97,108,117,101,114,0, + 0,0,0,41,22,114,16,0,0,0,114,107,0,0,0,114, + 108,0,0,0,114,109,0,0,0,114,19,0,0,0,114,105, + 0,0,0,114,76,0,0,0,114,116,0,0,0,114,51,0, + 0,0,114,52,0,0,0,114,28,0,0,0,114,61,0,0, + 0,114,6,0,0,0,114,118,0,0,0,114,113,0,0,0, + 218,5,99,111,117,110,116,218,6,114,115,112,108,105,116,114, + 114,0,0,0,114,112,0,0,0,218,9,112,97,114,116,105, + 116,105,111,110,114,69,0,0,0,218,15,83,79,85,82,67, + 69,95,83,85,70,70,73,88,69,83,41,10,114,67,0,0, + 0,114,120,0,0,0,90,16,112,121,99,97,99,104,101,95, + 102,105,108,101,110,97,109,101,90,23,102,111,117,110,100,95, + 105,110,95,112,121,99,97,99,104,101,95,112,114,101,102,105, + 120,90,13,115,116,114,105,112,112,101,100,95,112,97,116,104, + 90,7,112,121,99,97,99,104,101,90,9,100,111,116,95,99, + 111,117,110,116,114,98,0,0,0,90,9,111,112,116,95,108, + 101,118,101,108,90,13,98,97,115,101,95,102,105,108,101,110, + 97,109,101,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,218,17,115,111,117,114,99,101,95,102,114,111,109,95, + 99,97,99,104,101,199,1,0,0,115,60,0,0,0,12,9, + 8,1,10,1,12,1,4,1,10,1,12,1,14,1,16,1, + 4,1,4,1,12,1,8,1,8,1,2,1,8,255,10,2, + 8,1,14,1,8,1,16,1,10,1,4,1,2,1,8,255, + 16,2,8,1,16,1,14,2,18,1,114,130,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 9,0,0,0,67,0,0,0,115,124,0,0,0,116,0,124, + 0,131,1,100,1,107,2,114,8,100,2,83,0,124,0,160, + 1,100,3,161,1,92,3,125,1,125,2,125,3,124,1,114, + 28,124,3,160,2,161,0,100,4,100,5,133,2,25,0,100, + 6,107,3,114,30,124,0,83,0,122,6,116,3,124,0,131, + 1,125,4,87,0,110,17,4,0,116,4,116,5,102,2,121, + 53,1,0,1,0,1,0,124,0,100,2,100,5,133,2,25, + 0,125,4,89,0,110,1,119,0,116,6,124,4,131,1,114, + 60,124,4,83,0,124,0,83,0,41,7,122,188,67,111,110, + 118,101,114,116,32,97,32,98,121,116,101,99,111,100,101,32, + 102,105,108,101,32,112,97,116,104,32,116,111,32,97,32,115, + 111,117,114,99,101,32,112,97,116,104,32,40,105,102,32,112, + 111,115,115,105,98,108,101,41,46,10,10,32,32,32,32,84, + 104,105,115,32,102,117,110,99,116,105,111,110,32,101,120,105, + 115,116,115,32,112,117,114,101,108,121,32,102,111,114,32,98, + 97,99,107,119,97,114,100,115,45,99,111,109,112,97,116,105, + 98,105,108,105,116,121,32,102,111,114,10,32,32,32,32,80, + 121,73,109,112,111,114,116,95,69,120,101,99,67,111,100,101, + 77,111,100,117,108,101,87,105,116,104,70,105,108,101,110,97, + 109,101,115,40,41,32,105,110,32,116,104,101,32,67,32,65, + 80,73,46,10,10,32,32,32,32,114,0,0,0,0,78,114, + 99,0,0,0,233,253,255,255,255,114,4,0,0,0,90,2, + 112,121,41,7,114,6,0,0,0,114,106,0,0,0,218,5, + 108,111,119,101,114,114,130,0,0,0,114,109,0,0,0,114, + 113,0,0,0,114,82,0,0,0,41,5,218,13,98,121,116, + 101,99,111,100,101,95,112,97,116,104,114,121,0,0,0,218, + 1,95,90,9,101,120,116,101,110,115,105,111,110,218,11,115, + 111,117,114,99,101,95,112,97,116,104,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,218,15,95,103,101,116,95, + 115,111,117,114,99,101,102,105,108,101,239,1,0,0,115,22, + 0,0,0,12,7,4,1,16,1,24,1,4,1,2,1,12, + 1,16,1,16,1,2,255,16,2,114,136,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8, + 0,0,0,67,0,0,0,115,68,0,0,0,124,0,160,0, + 116,1,116,2,131,1,161,1,114,23,122,5,116,3,124,0, + 131,1,87,0,83,0,4,0,116,4,121,22,1,0,1,0, + 1,0,89,0,100,0,83,0,119,0,124,0,160,0,116,1, + 116,5,131,1,161,1,114,32,124,0,83,0,100,0,83,0, + 114,71,0,0,0,41,6,114,60,0,0,0,218,5,116,117, + 112,108,101,114,129,0,0,0,114,123,0,0,0,114,109,0, + 0,0,114,115,0,0,0,41,1,114,122,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,11,95, + 103,101,116,95,99,97,99,104,101,100,2,2,0,0,115,18, + 0,0,0,14,1,2,1,10,1,12,1,6,1,2,255,14, + 2,4,1,4,2,114,138,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,8,0,0,0,67, + 0,0,0,115,50,0,0,0,122,7,116,0,124,0,131,1, + 106,1,125,1,87,0,110,11,4,0,116,2,121,18,1,0, + 1,0,1,0,100,1,125,1,89,0,110,1,119,0,124,1, + 100,2,79,0,125,1,124,1,83,0,41,3,122,51,67,97, + 108,99,117,108,97,116,101,32,116,104,101,32,109,111,100,101, + 32,112,101,114,109,105,115,115,105,111,110,115,32,102,111,114, + 32,97,32,98,121,116,101,99,111,100,101,32,102,105,108,101, + 46,114,89,0,0,0,233,128,0,0,0,41,3,114,77,0, + 0,0,114,79,0,0,0,114,78,0,0,0,41,2,114,67, + 0,0,0,114,80,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,10,95,99,97,108,99,95,109, + 111,100,101,14,2,0,0,115,14,0,0,0,2,2,14,1, + 12,1,8,1,2,255,8,4,4,1,114,140,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 4,0,0,0,3,0,0,0,115,52,0,0,0,100,6,135, + 0,102,1,100,2,100,3,132,9,125,1,116,0,100,1,117, + 1,114,15,116,0,106,1,125,2,110,4,100,4,100,5,132, + 0,125,2,124,2,124,1,136,0,131,2,1,0,124,1,83, + 0,41,7,122,252,68,101,99,111,114,97,116,111,114,32,116, + 111,32,118,101,114,105,102,121,32,116,104,97,116,32,116,104, + 101,32,109,111,100,117,108,101,32,98,101,105,110,103,32,114, + 101,113,117,101,115,116,101,100,32,109,97,116,99,104,101,115, + 32,116,104,101,32,111,110,101,32,116,104,101,10,32,32,32, + 32,108,111,97,100,101,114,32,99,97,110,32,104,97,110,100, + 108,101,46,10,10,32,32,32,32,84,104,101,32,102,105,114, + 115,116,32,97,114,103,117,109,101,110,116,32,40,115,101,108, + 102,41,32,109,117,115,116,32,100,101,102,105,110,101,32,95, + 110,97,109,101,32,119,104,105,99,104,32,116,104,101,32,115, + 101,99,111,110,100,32,97,114,103,117,109,101,110,116,32,105, + 115,10,32,32,32,32,99,111,109,112,97,114,101,100,32,97, + 103,97,105,110,115,116,46,32,73,102,32,116,104,101,32,99, + 111,109,112,97,114,105,115,111,110,32,102,97,105,108,115,32, + 116,104,101,110,32,73,109,112,111,114,116,69,114,114,111,114, + 32,105,115,32,114,97,105,115,101,100,46,10,10,32,32,32, + 32,78,99,2,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,4,0,0,0,31,0,0,0,115,72,0,0,0, + 124,1,100,0,117,0,114,8,124,0,106,0,125,1,110,16, + 124,0,106,0,124,1,107,3,114,24,116,1,100,1,124,0, + 106,0,124,1,102,2,22,0,124,1,100,2,141,2,130,1, + 136,0,124,0,124,1,103,2,124,2,162,1,82,0,105,0, + 124,3,164,1,142,1,83,0,41,3,78,122,30,108,111,97, + 100,101,114,32,102,111,114,32,37,115,32,99,97,110,110,111, + 116,32,104,97,110,100,108,101,32,37,115,169,1,218,4,110, + 97,109,101,41,2,114,142,0,0,0,218,11,73,109,112,111, + 114,116,69,114,114,111,114,41,4,218,4,115,101,108,102,114, + 142,0,0,0,218,4,97,114,103,115,218,6,107,119,97,114, + 103,115,169,1,218,6,109,101,116,104,111,100,114,9,0,0, + 0,114,10,0,0,0,218,19,95,99,104,101,99,107,95,110, + 97,109,101,95,119,114,97,112,112,101,114,34,2,0,0,115, + 18,0,0,0,8,1,8,1,10,1,4,1,8,1,2,255, + 2,1,6,255,24,2,122,40,95,99,104,101,99,107,95,110, + 97,109,101,46,60,108,111,99,97,108,115,62,46,95,99,104, + 101,99,107,95,110,97,109,101,95,119,114,97,112,112,101,114, + 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,7,0,0,0,83,0,0,0,115,56,0,0,0,100,1, + 68,0,93,16,125,2,116,0,124,1,124,2,131,2,114,18, + 116,1,124,0,124,2,116,2,124,1,124,2,131,2,131,3, + 1,0,113,2,124,0,106,3,160,4,124,1,106,3,161,1, + 1,0,100,0,83,0,41,2,78,41,4,218,10,95,95,109, + 111,100,117,108,101,95,95,218,8,95,95,110,97,109,101,95, + 95,218,12,95,95,113,117,97,108,110,97,109,101,95,95,218, + 7,95,95,100,111,99,95,95,41,5,218,7,104,97,115,97, + 116,116,114,218,7,115,101,116,97,116,116,114,218,7,103,101, + 116,97,116,116,114,218,8,95,95,100,105,99,116,95,95,218, + 6,117,112,100,97,116,101,41,3,90,3,110,101,119,90,3, + 111,108,100,114,87,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,5,95,119,114,97,112,47,2, + 0,0,115,10,0,0,0,8,1,10,1,18,1,2,128,18, + 1,122,26,95,99,104,101,99,107,95,110,97,109,101,46,60, + 108,111,99,97,108,115,62,46,95,119,114,97,112,114,71,0, + 0,0,41,2,218,10,95,98,111,111,116,115,116,114,97,112, + 114,159,0,0,0,41,3,114,148,0,0,0,114,149,0,0, + 0,114,159,0,0,0,114,9,0,0,0,114,147,0,0,0, + 114,10,0,0,0,218,11,95,99,104,101,99,107,95,110,97, + 109,101,26,2,0,0,115,12,0,0,0,14,8,8,10,8, + 1,8,2,10,6,4,1,114,161,0,0,0,99,2,0,0, + 0,0,0,0,0,0,0,0,0,5,0,0,0,6,0,0, + 0,67,0,0,0,115,72,0,0,0,116,0,160,1,100,1, + 116,2,161,2,1,0,124,0,160,3,124,1,161,1,92,2, + 125,2,125,3,124,2,100,2,117,0,114,34,116,4,124,3, + 131,1,114,34,100,3,125,4,116,0,160,1,124,4,160,5, + 124,3,100,4,25,0,161,1,116,6,161,2,1,0,124,2, + 83,0,41,5,122,155,84,114,121,32,116,111,32,102,105,110, + 100,32,97,32,108,111,97,100,101,114,32,102,111,114,32,116, + 104,101,32,115,112,101,99,105,102,105,101,100,32,109,111,100, + 117,108,101,32,98,121,32,100,101,108,101,103,97,116,105,110, + 103,32,116,111,10,32,32,32,32,115,101,108,102,46,102,105, + 110,100,95,108,111,97,100,101,114,40,41,46,10,10,32,32, + 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, + 32,100,101,112,114,101,99,97,116,101,100,32,105,110,32,102, + 97,118,111,114,32,111,102,32,102,105,110,100,101,114,46,102, + 105,110,100,95,115,112,101,99,40,41,46,10,10,32,32,32, + 32,122,90,102,105,110,100,95,109,111,100,117,108,101,40,41, + 32,105,115,32,100,101,112,114,101,99,97,116,101,100,32,97, + 110,100,32,115,108,97,116,101,100,32,102,111,114,32,114,101, + 109,111,118,97,108,32,105,110,32,80,121,116,104,111,110,32, + 51,46,49,50,59,32,117,115,101,32,102,105,110,100,95,115, + 112,101,99,40,41,32,105,110,115,116,101,97,100,78,122,44, + 78,111,116,32,105,109,112,111,114,116,105,110,103,32,100,105, + 114,101,99,116,111,114,121,32,123,125,58,32,109,105,115,115, + 105,110,103,32,95,95,105,110,105,116,95,95,114,0,0,0, + 0,41,7,114,101,0,0,0,114,102,0,0,0,114,103,0, + 0,0,218,11,102,105,110,100,95,108,111,97,100,101,114,114, + 6,0,0,0,114,91,0,0,0,218,13,73,109,112,111,114, + 116,87,97,114,110,105,110,103,41,5,114,144,0,0,0,218, + 8,102,117,108,108,110,97,109,101,218,6,108,111,97,100,101, + 114,218,8,112,111,114,116,105,111,110,115,218,3,109,115,103, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, + 17,95,102,105,110,100,95,109,111,100,117,108,101,95,115,104, + 105,109,57,2,0,0,115,16,0,0,0,6,7,2,2,4, + 254,14,6,16,1,4,1,22,1,4,1,114,168,0,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,6,0,0, + 0,4,0,0,0,67,0,0,0,115,166,0,0,0,124,0, + 100,1,100,2,133,2,25,0,125,3,124,3,116,0,107,3, + 114,32,100,3,124,1,155,2,100,4,124,3,155,2,157,4, + 125,4,116,1,160,2,100,5,124,4,161,2,1,0,116,3, + 124,4,102,1,105,0,124,2,164,1,142,1,130,1,116,4, + 124,0,131,1,100,6,107,0,114,53,100,7,124,1,155,2, + 157,2,125,4,116,1,160,2,100,5,124,4,161,2,1,0, + 116,5,124,4,131,1,130,1,116,6,124,0,100,2,100,8, + 133,2,25,0,131,1,125,5,124,5,100,9,64,0,114,81, + 100,10,124,5,155,2,100,11,124,1,155,2,157,4,125,4, + 116,3,124,4,102,1,105,0,124,2,164,1,142,1,130,1, + 124,5,83,0,41,12,97,84,2,0,0,80,101,114,102,111, + 114,109,32,98,97,115,105,99,32,118,97,108,105,100,105,116, + 121,32,99,104,101,99,107,105,110,103,32,111,102,32,97,32, + 112,121,99,32,104,101,97,100,101,114,32,97,110,100,32,114, + 101,116,117,114,110,32,116,104,101,32,102,108,97,103,115,32, + 102,105,101,108,100,44,10,32,32,32,32,119,104,105,99,104, + 32,100,101,116,101,114,109,105,110,101,115,32,104,111,119,32, + 116,104,101,32,112,121,99,32,115,104,111,117,108,100,32,98, + 101,32,102,117,114,116,104,101,114,32,118,97,108,105,100,97, + 116,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32, + 115,111,117,114,99,101,46,10,10,32,32,32,32,42,100,97, + 116,97,42,32,105,115,32,116,104,101,32,99,111,110,116,101, + 110,116,115,32,111,102,32,116,104,101,32,112,121,99,32,102, + 105,108,101,46,32,40,79,110,108,121,32,116,104,101,32,102, + 105,114,115,116,32,49,54,32,98,121,116,101,115,32,97,114, + 101,10,32,32,32,32,114,101,113,117,105,114,101,100,44,32, + 116,104,111,117,103,104,46,41,10,10,32,32,32,32,42,110, + 97,109,101,42,32,105,115,32,116,104,101,32,110,97,109,101, + 32,111,102,32,116,104,101,32,109,111,100,117,108,101,32,98, + 101,105,110,103,32,105,109,112,111,114,116,101,100,46,32,73, + 116,32,105,115,32,117,115,101,100,32,102,111,114,32,108,111, + 103,103,105,110,103,46,10,10,32,32,32,32,42,101,120,99, + 95,100,101,116,97,105,108,115,42,32,105,115,32,97,32,100, + 105,99,116,105,111,110,97,114,121,32,112,97,115,115,101,100, + 32,116,111,32,73,109,112,111,114,116,69,114,114,111,114,32, + 105,102,32,105,116,32,114,97,105,115,101,100,32,102,111,114, + 10,32,32,32,32,105,109,112,114,111,118,101,100,32,100,101, + 98,117,103,103,105,110,103,46,10,10,32,32,32,32,73,109, + 112,111,114,116,69,114,114,111,114,32,105,115,32,114,97,105, + 115,101,100,32,119,104,101,110,32,116,104,101,32,109,97,103, + 105,99,32,110,117,109,98,101,114,32,105,115,32,105,110,99, + 111,114,114,101,99,116,32,111,114,32,119,104,101,110,32,116, + 104,101,32,102,108,97,103,115,10,32,32,32,32,102,105,101, + 108,100,32,105,115,32,105,110,118,97,108,105,100,46,32,69, + 79,70,69,114,114,111,114,32,105,115,32,114,97,105,115,101, + 100,32,119,104,101,110,32,116,104,101,32,100,97,116,97,32, + 105,115,32,102,111,117,110,100,32,116,111,32,98,101,32,116, + 114,117,110,99,97,116,101,100,46,10,10,32,32,32,32,78, + 114,33,0,0,0,122,20,98,97,100,32,109,97,103,105,99, + 32,110,117,109,98,101,114,32,105,110,32,122,2,58,32,250, + 2,123,125,233,16,0,0,0,122,40,114,101,97,99,104,101, + 100,32,69,79,70,32,119,104,105,108,101,32,114,101,97,100, + 105,110,103,32,112,121,99,32,104,101,97,100,101,114,32,111, + 102,32,233,8,0,0,0,233,252,255,255,255,122,14,105,110, + 118,97,108,105,100,32,102,108,97,103,115,32,122,4,32,105, + 110,32,41,7,218,12,77,65,71,73,67,95,78,85,77,66, + 69,82,114,160,0,0,0,218,16,95,118,101,114,98,111,115, + 101,95,109,101,115,115,97,103,101,114,143,0,0,0,114,6, + 0,0,0,218,8,69,79,70,69,114,114,111,114,114,44,0, + 0,0,41,6,114,43,0,0,0,114,142,0,0,0,218,11, + 101,120,99,95,100,101,116,97,105,108,115,90,5,109,97,103, + 105,99,114,119,0,0,0,114,17,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,13,95,99,108, + 97,115,115,105,102,121,95,112,121,99,77,2,0,0,115,28, + 0,0,0,12,16,8,1,16,1,12,1,16,1,12,1,10, + 1,12,1,8,1,16,1,8,2,16,1,16,1,4,1,114, + 177,0,0,0,99,5,0,0,0,0,0,0,0,0,0,0, + 0,6,0,0,0,4,0,0,0,67,0,0,0,115,124,0, + 0,0,116,0,124,0,100,1,100,2,133,2,25,0,131,1, + 124,1,100,3,64,0,107,3,114,31,100,4,124,3,155,2, + 157,2,125,5,116,1,160,2,100,5,124,5,161,2,1,0, + 116,3,124,5,102,1,105,0,124,4,164,1,142,1,130,1, + 124,2,100,6,117,1,114,58,116,0,124,0,100,2,100,7, + 133,2,25,0,131,1,124,2,100,3,64,0,107,3,114,60, + 116,3,100,4,124,3,155,2,157,2,102,1,105,0,124,4, + 164,1,142,1,130,1,100,6,83,0,100,6,83,0,41,8, + 97,7,2,0,0,86,97,108,105,100,97,116,101,32,97,32, + 112,121,99,32,97,103,97,105,110,115,116,32,116,104,101,32, + 115,111,117,114,99,101,32,108,97,115,116,45,109,111,100,105, + 102,105,101,100,32,116,105,109,101,46,10,10,32,32,32,32, + 42,100,97,116,97,42,32,105,115,32,116,104,101,32,99,111, + 110,116,101,110,116,115,32,111,102,32,116,104,101,32,112,121, + 99,32,102,105,108,101,46,32,40,79,110,108,121,32,116,104, + 101,32,102,105,114,115,116,32,49,54,32,98,121,116,101,115, + 32,97,114,101,10,32,32,32,32,114,101,113,117,105,114,101, + 100,46,41,10,10,32,32,32,32,42,115,111,117,114,99,101, + 95,109,116,105,109,101,42,32,105,115,32,116,104,101,32,108, + 97,115,116,32,109,111,100,105,102,105,101,100,32,116,105,109, + 101,115,116,97,109,112,32,111,102,32,116,104,101,32,115,111, + 117,114,99,101,32,102,105,108,101,46,10,10,32,32,32,32, + 42,115,111,117,114,99,101,95,115,105,122,101,42,32,105,115, + 32,78,111,110,101,32,111,114,32,116,104,101,32,115,105,122, + 101,32,111,102,32,116,104,101,32,115,111,117,114,99,101,32, + 102,105,108,101,32,105,110,32,98,121,116,101,115,46,10,10, 32,32,32,32,42,110,97,109,101,42,32,105,115,32,116,104, 101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,111, 100,117,108,101,32,98,101,105,110,103,32,105,109,112,111,114, @@ -754,2018 +824,1952 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 69,114,114,111,114,32,105,102,32,105,116,32,114,97,105,115, 101,100,32,102,111,114,10,32,32,32,32,105,109,112,114,111, 118,101,100,32,100,101,98,117,103,103,105,110,103,46,10,10, - 32,32,32,32,73,109,112,111,114,116,69,114,114,111,114,32, - 105,115,32,114,97,105,115,101,100,32,119,104,101,110,32,116, - 104,101,32,109,97,103,105,99,32,110,117,109,98,101,114,32, - 105,115,32,105,110,99,111,114,114,101,99,116,32,111,114,32, - 119,104,101,110,32,116,104,101,32,102,108,97,103,115,10,32, - 32,32,32,102,105,101,108,100,32,105,115,32,105,110,118,97, - 108,105,100,46,32,69,79,70,69,114,114,111,114,32,105,115, - 32,114,97,105,115,101,100,32,119,104,101,110,32,116,104,101, - 32,100,97,116,97,32,105,115,32,102,111,117,110,100,32,116, - 111,32,98,101,32,116,114,117,110,99,97,116,101,100,46,10, - 10,32,32,32,32,78,114,31,0,0,0,122,20,98,97,100, - 32,109,97,103,105,99,32,110,117,109,98,101,114,32,105,110, - 32,122,2,58,32,250,2,123,125,233,16,0,0,0,122,40, - 114,101,97,99,104,101,100,32,69,79,70,32,119,104,105,108, - 101,32,114,101,97,100,105,110,103,32,112,121,99,32,104,101, - 97,100,101,114,32,111,102,32,233,8,0,0,0,233,252,255, - 255,255,122,14,105,110,118,97,108,105,100,32,102,108,97,103, - 115,32,122,4,32,105,110,32,41,7,218,12,77,65,71,73, - 67,95,78,85,77,66,69,82,114,159,0,0,0,218,16,95, - 118,101,114,98,111,115,101,95,109,101,115,115,97,103,101,114, - 142,0,0,0,114,4,0,0,0,218,8,69,79,70,69,114, - 114,111,114,114,42,0,0,0,41,6,114,41,0,0,0,114, - 141,0,0,0,218,11,101,120,99,95,100,101,116,97,105,108, - 115,90,5,109,97,103,105,99,114,117,0,0,0,114,16,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,13,95,99,108,97,115,115,105,102,121,95,112,121,99, - 73,2,0,0,115,28,0,0,0,12,16,8,1,16,1,12, - 1,16,1,12,1,10,1,12,1,8,1,16,1,8,2,16, - 1,16,1,4,1,114,176,0,0,0,99,5,0,0,0,0, - 0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,67, - 0,0,0,115,124,0,0,0,116,0,124,0,100,1,100,2, - 133,2,25,0,131,1,124,1,100,3,64,0,107,3,114,31, - 100,4,124,3,155,2,157,2,125,5,116,1,160,2,100,5, - 124,5,161,2,1,0,116,3,124,5,102,1,105,0,124,4, - 164,1,142,1,130,1,124,2,100,6,117,1,114,58,116,0, - 124,0,100,2,100,7,133,2,25,0,131,1,124,2,100,3, - 64,0,107,3,114,60,116,3,100,4,124,3,155,2,157,2, - 102,1,105,0,124,4,164,1,142,1,130,1,100,6,83,0, - 100,6,83,0,41,8,97,7,2,0,0,86,97,108,105,100, - 97,116,101,32,97,32,112,121,99,32,97,103,97,105,110,115, - 116,32,116,104,101,32,115,111,117,114,99,101,32,108,97,115, - 116,45,109,111,100,105,102,105,101,100,32,116,105,109,101,46, - 10,10,32,32,32,32,42,100,97,116,97,42,32,105,115,32, - 116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32, - 116,104,101,32,112,121,99,32,102,105,108,101,46,32,40,79, - 110,108,121,32,116,104,101,32,102,105,114,115,116,32,49,54, - 32,98,121,116,101,115,32,97,114,101,10,32,32,32,32,114, - 101,113,117,105,114,101,100,46,41,10,10,32,32,32,32,42, - 115,111,117,114,99,101,95,109,116,105,109,101,42,32,105,115, - 32,116,104,101,32,108,97,115,116,32,109,111,100,105,102,105, - 101,100,32,116,105,109,101,115,116,97,109,112,32,111,102,32, - 116,104,101,32,115,111,117,114,99,101,32,102,105,108,101,46, - 10,10,32,32,32,32,42,115,111,117,114,99,101,95,115,105, - 122,101,42,32,105,115,32,78,111,110,101,32,111,114,32,116, - 104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,115, - 111,117,114,99,101,32,102,105,108,101,32,105,110,32,98,121, - 116,101,115,46,10,10,32,32,32,32,42,110,97,109,101,42, - 32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32, - 116,104,101,32,109,111,100,117,108,101,32,98,101,105,110,103, - 32,105,109,112,111,114,116,101,100,46,32,73,116,32,105,115, - 32,117,115,101,100,32,102,111,114,32,108,111,103,103,105,110, - 103,46,10,10,32,32,32,32,42,101,120,99,95,100,101,116, - 97,105,108,115,42,32,105,115,32,97,32,100,105,99,116,105, - 111,110,97,114,121,32,112,97,115,115,101,100,32,116,111,32, - 73,109,112,111,114,116,69,114,114,111,114,32,105,102,32,105, - 116,32,114,97,105,115,101,100,32,102,111,114,10,32,32,32, - 32,105,109,112,114,111,118,101,100,32,100,101,98,117,103,103, - 105,110,103,46,10,10,32,32,32,32,65,110,32,73,109,112, - 111,114,116,69,114,114,111,114,32,105,115,32,114,97,105,115, - 101,100,32,105,102,32,116,104,101,32,98,121,116,101,99,111, - 100,101,32,105,115,32,115,116,97,108,101,46,10,10,32,32, - 32,32,114,170,0,0,0,233,12,0,0,0,114,30,0,0, - 0,122,22,98,121,116,101,99,111,100,101,32,105,115,32,115, - 116,97,108,101,32,102,111,114,32,114,168,0,0,0,78,114, - 169,0,0,0,41,4,114,42,0,0,0,114,159,0,0,0, - 114,173,0,0,0,114,142,0,0,0,41,6,114,41,0,0, - 0,218,12,115,111,117,114,99,101,95,109,116,105,109,101,218, - 11,115,111,117,114,99,101,95,115,105,122,101,114,141,0,0, - 0,114,175,0,0,0,114,117,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,23,95,118,97,108, - 105,100,97,116,101,95,116,105,109,101,115,116,97,109,112,95, - 112,121,99,106,2,0,0,115,18,0,0,0,24,19,10,1, - 12,1,16,1,8,1,24,1,22,1,4,254,4,1,114,180, - 0,0,0,99,4,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,4,0,0,0,67,0,0,0,115,42,0,0, - 0,124,0,100,1,100,2,133,2,25,0,124,1,107,3,114, - 19,116,0,100,3,124,2,155,2,157,2,102,1,105,0,124, - 3,164,1,142,1,130,1,100,4,83,0,41,5,97,243,1, - 0,0,86,97,108,105,100,97,116,101,32,97,32,104,97,115, - 104,45,98,97,115,101,100,32,112,121,99,32,98,121,32,99, - 104,101,99,107,105,110,103,32,116,104,101,32,114,101,97,108, - 32,115,111,117,114,99,101,32,104,97,115,104,32,97,103,97, - 105,110,115,116,32,116,104,101,32,111,110,101,32,105,110,10, - 32,32,32,32,116,104,101,32,112,121,99,32,104,101,97,100, - 101,114,46,10,10,32,32,32,32,42,100,97,116,97,42,32, - 105,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32, - 111,102,32,116,104,101,32,112,121,99,32,102,105,108,101,46, - 32,40,79,110,108,121,32,116,104,101,32,102,105,114,115,116, - 32,49,54,32,98,121,116,101,115,32,97,114,101,10,32,32, - 32,32,114,101,113,117,105,114,101,100,46,41,10,10,32,32, - 32,32,42,115,111,117,114,99,101,95,104,97,115,104,42,32, - 105,115,32,116,104,101,32,105,109,112,111,114,116,108,105,98, - 46,117,116,105,108,46,115,111,117,114,99,101,95,104,97,115, - 104,40,41,32,111,102,32,116,104,101,32,115,111,117,114,99, - 101,32,102,105,108,101,46,10,10,32,32,32,32,42,110,97, - 109,101,42,32,105,115,32,116,104,101,32,110,97,109,101,32, - 111,102,32,116,104,101,32,109,111,100,117,108,101,32,98,101, - 105,110,103,32,105,109,112,111,114,116,101,100,46,32,73,116, - 32,105,115,32,117,115,101,100,32,102,111,114,32,108,111,103, - 103,105,110,103,46,10,10,32,32,32,32,42,101,120,99,95, - 100,101,116,97,105,108,115,42,32,105,115,32,97,32,100,105, - 99,116,105,111,110,97,114,121,32,112,97,115,115,101,100,32, - 116,111,32,73,109,112,111,114,116,69,114,114,111,114,32,105, - 102,32,105,116,32,114,97,105,115,101,100,32,102,111,114,10, - 32,32,32,32,105,109,112,114,111,118,101,100,32,100,101,98, - 117,103,103,105,110,103,46,10,10,32,32,32,32,65,110,32, - 73,109,112,111,114,116,69,114,114,111,114,32,105,115,32,114, - 97,105,115,101,100,32,105,102,32,116,104,101,32,98,121,116, - 101,99,111,100,101,32,105,115,32,115,116,97,108,101,46,10, - 10,32,32,32,32,114,170,0,0,0,114,169,0,0,0,122, - 46,104,97,115,104,32,105,110,32,98,121,116,101,99,111,100, - 101,32,100,111,101,115,110,39,116,32,109,97,116,99,104,32, - 104,97,115,104,32,111,102,32,115,111,117,114,99,101,32,78, - 41,1,114,142,0,0,0,41,4,114,41,0,0,0,218,11, - 115,111,117,114,99,101,95,104,97,115,104,114,141,0,0,0, - 114,175,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,18,95,118,97,108,105,100,97,116,101,95, - 104,97,115,104,95,112,121,99,134,2,0,0,115,14,0,0, - 0,16,17,2,1,8,1,4,255,2,2,6,254,4,255,114, - 182,0,0,0,99,4,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,5,0,0,0,67,0,0,0,115,76,0, - 0,0,116,0,160,1,124,0,161,1,125,4,116,2,124,4, - 116,3,131,2,114,28,116,4,160,5,100,1,124,2,161,2, - 1,0,124,3,100,2,117,1,114,26,116,6,160,7,124,4, - 124,3,161,2,1,0,124,4,83,0,116,8,100,3,160,9, - 124,2,161,1,124,1,124,2,100,4,141,3,130,1,41,5, - 122,35,67,111,109,112,105,108,101,32,98,121,116,101,99,111, - 100,101,32,97,115,32,102,111,117,110,100,32,105,110,32,97, - 32,112,121,99,46,122,21,99,111,100,101,32,111,98,106,101, - 99,116,32,102,114,111,109,32,123,33,114,125,78,122,23,78, - 111,110,45,99,111,100,101,32,111,98,106,101,99,116,32,105, - 110,32,123,33,114,125,169,2,114,141,0,0,0,114,65,0, - 0,0,41,10,218,7,109,97,114,115,104,97,108,90,5,108, - 111,97,100,115,218,10,105,115,105,110,115,116,97,110,99,101, - 218,10,95,99,111,100,101,95,116,121,112,101,114,159,0,0, - 0,114,173,0,0,0,218,4,95,105,109,112,90,16,95,102, - 105,120,95,99,111,95,102,105,108,101,110,97,109,101,114,142, - 0,0,0,114,89,0,0,0,41,5,114,41,0,0,0,114, - 141,0,0,0,114,132,0,0,0,114,134,0,0,0,218,4, - 99,111,100,101,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,17,95,99,111,109,112,105,108,101,95,98,121, - 116,101,99,111,100,101,158,2,0,0,115,18,0,0,0,10, - 2,10,1,12,1,8,1,12,1,4,1,10,2,4,1,6, - 255,114,189,0,0,0,99,3,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,5,0,0,0,67,0,0,0,115, - 70,0,0,0,116,0,116,1,131,1,125,3,124,3,160,2, - 116,3,100,1,131,1,161,1,1,0,124,3,160,2,116,3, - 124,1,131,1,161,1,1,0,124,3,160,2,116,3,124,2, - 131,1,161,1,1,0,124,3,160,2,116,4,160,5,124,0, - 161,1,161,1,1,0,124,3,83,0,41,2,122,43,80,114, - 111,100,117,99,101,32,116,104,101,32,100,97,116,97,32,102, - 111,114,32,97,32,116,105,109,101,115,116,97,109,112,45,98, - 97,115,101,100,32,112,121,99,46,114,0,0,0,0,41,6, - 218,9,98,121,116,101,97,114,114,97,121,114,172,0,0,0, - 218,6,101,120,116,101,110,100,114,36,0,0,0,114,184,0, - 0,0,218,5,100,117,109,112,115,41,4,114,188,0,0,0, - 218,5,109,116,105,109,101,114,179,0,0,0,114,41,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,22,95,99,111,100,101,95,116,111,95,116,105,109,101,115, - 116,97,109,112,95,112,121,99,171,2,0,0,115,12,0,0, - 0,8,2,14,1,14,1,14,1,16,1,4,1,114,194,0, - 0,0,84,99,3,0,0,0,0,0,0,0,0,0,0,0, - 5,0,0,0,5,0,0,0,67,0,0,0,115,80,0,0, - 0,116,0,116,1,131,1,125,3,100,1,124,2,100,1,62, - 0,66,0,125,4,124,3,160,2,116,3,124,4,131,1,161, - 1,1,0,116,4,124,1,131,1,100,2,107,2,115,25,74, - 0,130,1,124,3,160,2,124,1,161,1,1,0,124,3,160, - 2,116,5,160,6,124,0,161,1,161,1,1,0,124,3,83, - 0,41,3,122,38,80,114,111,100,117,99,101,32,116,104,101, - 32,100,97,116,97,32,102,111,114,32,97,32,104,97,115,104, - 45,98,97,115,101,100,32,112,121,99,46,114,3,0,0,0, - 114,170,0,0,0,41,7,114,190,0,0,0,114,172,0,0, - 0,114,191,0,0,0,114,36,0,0,0,114,4,0,0,0, - 114,184,0,0,0,114,192,0,0,0,41,5,114,188,0,0, - 0,114,181,0,0,0,90,7,99,104,101,99,107,101,100,114, - 41,0,0,0,114,16,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,17,95,99,111,100,101,95, - 116,111,95,104,97,115,104,95,112,121,99,181,2,0,0,115, - 14,0,0,0,8,2,12,1,14,1,16,1,10,1,16,1, - 4,1,114,195,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,5,0,0,0,6,0,0,0,67,0,0,0, - 115,62,0,0,0,100,1,100,2,108,0,125,1,116,1,160, - 2,124,0,161,1,106,3,125,2,124,1,160,4,124,2,161, - 1,125,3,116,1,160,5,100,2,100,3,161,2,125,4,124, - 4,160,6,124,0,160,6,124,3,100,1,25,0,161,1,161, - 1,83,0,41,4,122,121,68,101,99,111,100,101,32,98,121, - 116,101,115,32,114,101,112,114,101,115,101,110,116,105,110,103, - 32,115,111,117,114,99,101,32,99,111,100,101,32,97,110,100, - 32,114,101,116,117,114,110,32,116,104,101,32,115,116,114,105, - 110,103,46,10,10,32,32,32,32,85,110,105,118,101,114,115, - 97,108,32,110,101,119,108,105,110,101,32,115,117,112,112,111, - 114,116,32,105,115,32,117,115,101,100,32,105,110,32,116,104, - 101,32,100,101,99,111,100,105,110,103,46,10,32,32,32,32, - 114,0,0,0,0,78,84,41,7,218,8,116,111,107,101,110, - 105,122,101,114,91,0,0,0,90,7,66,121,116,101,115,73, - 79,90,8,114,101,97,100,108,105,110,101,90,15,100,101,116, - 101,99,116,95,101,110,99,111,100,105,110,103,90,25,73,110, - 99,114,101,109,101,110,116,97,108,78,101,119,108,105,110,101, - 68,101,99,111,100,101,114,218,6,100,101,99,111,100,101,41, - 5,218,12,115,111,117,114,99,101,95,98,121,116,101,115,114, - 196,0,0,0,90,21,115,111,117,114,99,101,95,98,121,116, - 101,115,95,114,101,97,100,108,105,110,101,218,8,101,110,99, - 111,100,105,110,103,90,15,110,101,119,108,105,110,101,95,100, - 101,99,111,100,101,114,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,13,100,101,99,111,100,101,95,115,111, - 117,114,99,101,192,2,0,0,115,10,0,0,0,8,5,12, - 1,10,1,12,1,20,1,114,200,0,0,0,169,2,114,164, - 0,0,0,218,26,115,117,98,109,111,100,117,108,101,95,115, - 101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,99, - 2,0,0,0,0,0,0,0,2,0,0,0,9,0,0,0, - 8,0,0,0,67,0,0,0,115,54,1,0,0,124,1,100, - 1,117,0,114,29,100,2,125,1,116,0,124,2,100,3,131, - 2,114,28,122,7,124,2,160,1,124,0,161,1,125,1,87, - 0,110,38,4,0,116,2,121,27,1,0,1,0,1,0,89, - 0,110,30,119,0,110,28,116,3,160,4,124,1,161,1,125, - 1,116,5,124,1,131,1,115,57,122,9,116,6,116,3,160, - 7,161,0,124,1,131,2,125,1,87,0,110,9,4,0,116, - 8,121,56,1,0,1,0,1,0,89,0,110,1,119,0,116, - 9,106,10,124,0,124,2,124,1,100,4,141,3,125,4,100, - 5,124,4,95,11,124,2,100,1,117,0,114,99,116,12,131, - 0,68,0,93,21,92,2,125,5,125,6,124,1,160,13,116, - 14,124,6,131,1,161,1,114,96,124,5,124,0,124,1,131, - 2,125,2,124,2,124,4,95,15,1,0,110,3,113,75,100, - 1,83,0,124,3,116,16,117,0,114,131,116,0,124,2,100, - 6,131,2,114,130,122,7,124,2,160,17,124,0,161,1,125, - 7,87,0,110,9,4,0,116,2,121,124,1,0,1,0,1, - 0,89,0,110,10,119,0,124,7,114,130,103,0,124,4,95, - 18,110,3,124,3,124,4,95,18,124,4,106,18,103,0,107, - 2,114,153,124,1,114,153,116,19,124,1,131,1,100,7,25, - 0,125,8,124,4,106,18,160,20,124,8,161,1,1,0,124, - 4,83,0,41,8,97,61,1,0,0,82,101,116,117,114,110, - 32,97,32,109,111,100,117,108,101,32,115,112,101,99,32,98, - 97,115,101,100,32,111,110,32,97,32,102,105,108,101,32,108, - 111,99,97,116,105,111,110,46,10,10,32,32,32,32,84,111, - 32,105,110,100,105,99,97,116,101,32,116,104,97,116,32,116, - 104,101,32,109,111,100,117,108,101,32,105,115,32,97,32,112, - 97,99,107,97,103,101,44,32,115,101,116,10,32,32,32,32, - 115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,104, - 95,108,111,99,97,116,105,111,110,115,32,116,111,32,97,32, - 108,105,115,116,32,111,102,32,100,105,114,101,99,116,111,114, - 121,32,112,97,116,104,115,46,32,32,65,110,10,32,32,32, - 32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,115, - 117,102,102,105,99,105,101,110,116,44,32,116,104,111,117,103, - 104,32,105,116,115,32,110,111,116,32,111,116,104,101,114,119, - 105,115,101,32,117,115,101,102,117,108,32,116,111,32,116,104, - 101,10,32,32,32,32,105,109,112,111,114,116,32,115,121,115, - 116,101,109,46,10,10,32,32,32,32,84,104,101,32,108,111, - 97,100,101,114,32,109,117,115,116,32,116,97,107,101,32,97, - 32,115,112,101,99,32,97,115,32,105,116,115,32,111,110,108, - 121,32,95,95,105,110,105,116,95,95,40,41,32,97,114,103, - 46,10,10,32,32,32,32,78,122,9,60,117,110,107,110,111, - 119,110,62,218,12,103,101,116,95,102,105,108,101,110,97,109, - 101,169,1,218,6,111,114,105,103,105,110,84,218,10,105,115, - 95,112,97,99,107,97,103,101,114,0,0,0,0,41,21,114, - 153,0,0,0,114,203,0,0,0,114,142,0,0,0,114,18, - 0,0,0,114,103,0,0,0,114,86,0,0,0,114,67,0, - 0,0,114,82,0,0,0,114,76,0,0,0,114,159,0,0, - 0,218,10,77,111,100,117,108,101,83,112,101,99,90,13,95, - 115,101,116,95,102,105,108,101,97,116,116,114,218,27,95,103, - 101,116,95,115,117,112,112,111,114,116,101,100,95,102,105,108, - 101,95,108,111,97,100,101,114,115,114,58,0,0,0,114,136, - 0,0,0,114,164,0,0,0,218,9,95,80,79,80,85,76, - 65,84,69,114,206,0,0,0,114,202,0,0,0,114,74,0, - 0,0,114,61,0,0,0,41,9,114,141,0,0,0,90,8, - 108,111,99,97,116,105,111,110,114,164,0,0,0,114,202,0, - 0,0,218,4,115,112,101,99,218,12,108,111,97,100,101,114, - 95,99,108,97,115,115,218,8,115,117,102,102,105,120,101,115, - 114,206,0,0,0,90,7,100,105,114,110,97,109,101,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,23,115, - 112,101,99,95,102,114,111,109,95,102,105,108,101,95,108,111, - 99,97,116,105,111,110,209,2,0,0,115,84,0,0,0,8, - 12,4,4,10,1,2,2,14,1,12,1,4,1,2,255,2, - 252,10,7,8,1,2,1,18,1,12,1,4,1,2,255,16, - 9,6,1,8,3,14,1,14,1,10,1,6,1,4,1,2, - 253,4,5,8,3,10,2,2,1,14,1,12,1,4,1,2, - 255,4,3,6,1,2,128,6,2,10,1,4,1,12,1,12, - 1,4,2,114,213,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,64,0,0, - 0,115,88,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,90,4,100,3,90,5,101,6,111,15,100,4, - 101,7,118,0,90,8,101,9,100,5,100,6,132,0,131,1, - 90,10,101,11,100,7,100,8,132,0,131,1,90,12,101,11, - 100,14,100,10,100,11,132,1,131,1,90,13,101,11,100,15, - 100,12,100,13,132,1,131,1,90,14,100,9,83,0,41,16, - 218,21,87,105,110,100,111,119,115,82,101,103,105,115,116,114, - 121,70,105,110,100,101,114,122,62,77,101,116,97,32,112,97, - 116,104,32,102,105,110,100,101,114,32,102,111,114,32,109,111, - 100,117,108,101,115,32,100,101,99,108,97,114,101,100,32,105, - 110,32,116,104,101,32,87,105,110,100,111,119,115,32,114,101, - 103,105,115,116,114,121,46,122,59,83,111,102,116,119,97,114, - 101,92,80,121,116,104,111,110,92,80,121,116,104,111,110,67, - 111,114,101,92,123,115,121,115,95,118,101,114,115,105,111,110, - 125,92,77,111,100,117,108,101,115,92,123,102,117,108,108,110, - 97,109,101,125,122,65,83,111,102,116,119,97,114,101,92,80, - 121,116,104,111,110,92,80,121,116,104,111,110,67,111,114,101, - 92,123,115,121,115,95,118,101,114,115,105,111,110,125,92,77, - 111,100,117,108,101,115,92,123,102,117,108,108,110,97,109,101, - 125,92,68,101,98,117,103,122,6,95,100,46,112,121,100,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 8,0,0,0,67,0,0,0,115,50,0,0,0,122,8,116, - 0,160,1,116,0,106,2,124,0,161,2,87,0,83,0,4, - 0,116,3,121,24,1,0,1,0,1,0,116,0,160,1,116, - 0,106,4,124,0,161,2,6,0,89,0,83,0,119,0,114, - 69,0,0,0,41,5,218,6,119,105,110,114,101,103,90,7, - 79,112,101,110,75,101,121,90,17,72,75,69,89,95,67,85, - 82,82,69,78,84,95,85,83,69,82,114,76,0,0,0,90, - 18,72,75,69,89,95,76,79,67,65,76,95,77,65,67,72, - 73,78,69,114,19,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,14,95,111,112,101,110,95,114, - 101,103,105,115,116,114,121,38,3,0,0,115,10,0,0,0, - 2,2,16,1,12,1,18,1,2,255,122,36,87,105,110,100, - 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101, - 114,46,95,111,112,101,110,95,114,101,103,105,115,116,114,121, - 99,2,0,0,0,0,0,0,0,0,0,0,0,6,0,0, - 0,8,0,0,0,67,0,0,0,115,134,0,0,0,124,0, - 106,0,114,7,124,0,106,1,125,2,110,3,124,0,106,2, - 125,2,124,2,106,3,124,1,100,1,116,4,106,5,100,0, - 100,2,133,2,25,0,22,0,100,3,141,2,125,3,122,32, - 124,0,160,6,124,3,161,1,143,16,125,4,116,7,160,8, - 124,4,100,4,161,2,125,5,87,0,100,0,4,0,4,0, - 131,3,1,0,87,0,124,5,83,0,49,0,115,49,119,1, - 1,0,1,0,1,0,89,0,1,0,87,0,124,5,83,0, - 4,0,116,9,121,66,1,0,1,0,1,0,89,0,100,0, - 83,0,119,0,41,5,78,122,5,37,100,46,37,100,114,44, - 0,0,0,41,2,114,163,0,0,0,90,11,115,121,115,95, - 118,101,114,115,105,111,110,114,10,0,0,0,41,10,218,11, - 68,69,66,85,71,95,66,85,73,76,68,218,18,82,69,71, - 73,83,84,82,89,95,75,69,89,95,68,69,66,85,71,218, - 12,82,69,71,73,83,84,82,89,95,75,69,89,114,89,0, - 0,0,114,15,0,0,0,218,12,118,101,114,115,105,111,110, - 95,105,110,102,111,114,216,0,0,0,114,215,0,0,0,90, - 10,81,117,101,114,121,86,97,108,117,101,114,76,0,0,0, - 41,6,218,3,99,108,115,114,163,0,0,0,90,12,114,101, - 103,105,115,116,114,121,95,107,101,121,114,20,0,0,0,90, - 4,104,107,101,121,218,8,102,105,108,101,112,97,116,104,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,16, - 95,115,101,97,114,99,104,95,114,101,103,105,115,116,114,121, - 45,3,0,0,115,32,0,0,0,6,2,8,1,6,2,6, - 1,16,1,6,255,2,2,12,1,14,1,12,255,4,4,18, - 252,4,4,12,254,6,1,2,255,122,38,87,105,110,100,111, - 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114, - 46,95,115,101,97,114,99,104,95,114,101,103,105,115,116,114, - 121,78,99,4,0,0,0,0,0,0,0,0,0,0,0,8, - 0,0,0,8,0,0,0,67,0,0,0,115,120,0,0,0, - 124,0,160,0,124,1,161,1,125,4,124,4,100,0,117,0, - 114,11,100,0,83,0,122,6,116,1,124,4,131,1,1,0, - 87,0,110,10,4,0,116,2,121,27,1,0,1,0,1,0, - 89,0,100,0,83,0,119,0,116,3,131,0,68,0,93,26, - 92,2,125,5,125,6,124,4,160,4,116,5,124,6,131,1, - 161,1,114,57,116,6,106,7,124,1,124,5,124,1,124,4, - 131,2,124,4,100,1,141,3,125,7,124,7,2,0,1,0, - 83,0,113,31,100,0,83,0,41,2,78,114,204,0,0,0, - 41,8,114,223,0,0,0,114,75,0,0,0,114,76,0,0, - 0,114,208,0,0,0,114,58,0,0,0,114,136,0,0,0, - 114,159,0,0,0,218,16,115,112,101,99,95,102,114,111,109, - 95,108,111,97,100,101,114,41,8,114,221,0,0,0,114,163, - 0,0,0,114,65,0,0,0,218,6,116,97,114,103,101,116, - 114,222,0,0,0,114,164,0,0,0,114,212,0,0,0,114, - 210,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,9,102,105,110,100,95,115,112,101,99,60,3, - 0,0,115,34,0,0,0,10,2,8,1,4,1,2,1,12, - 1,12,1,6,1,2,255,14,2,14,1,6,1,8,1,2, - 1,6,254,8,3,2,252,4,255,122,31,87,105,110,100,111, - 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114, - 46,102,105,110,100,95,115,112,101,99,99,3,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, - 0,0,0,115,42,0,0,0,116,0,160,1,100,1,116,2, - 161,2,1,0,124,0,160,3,124,1,124,2,161,2,125,3, - 124,3,100,2,117,1,114,19,124,3,106,4,83,0,100,2, - 83,0,41,3,122,106,70,105,110,100,32,109,111,100,117,108, - 101,32,110,97,109,101,100,32,105,110,32,116,104,101,32,114, - 101,103,105,115,116,114,121,46,10,10,32,32,32,32,32,32, - 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, - 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115, - 101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,110, - 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, - 122,112,87,105,110,100,111,119,115,82,101,103,105,115,116,114, - 121,70,105,110,100,101,114,46,102,105,110,100,95,109,111,100, - 117,108,101,40,41,32,105,115,32,100,101,112,114,101,99,97, - 116,101,100,32,97,110,100,32,115,108,97,116,101,100,32,102, - 111,114,32,114,101,109,111,118,97,108,32,105,110,32,80,121, - 116,104,111,110,32,51,46,49,50,59,32,117,115,101,32,102, - 105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101, - 97,100,78,169,5,114,99,0,0,0,114,100,0,0,0,114, - 101,0,0,0,114,226,0,0,0,114,164,0,0,0,169,4, - 114,221,0,0,0,114,163,0,0,0,114,65,0,0,0,114, - 210,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,11,102,105,110,100,95,109,111,100,117,108,101, - 76,3,0,0,115,14,0,0,0,6,7,2,2,4,254,12, - 3,8,1,6,1,4,2,122,33,87,105,110,100,111,119,115, - 82,101,103,105,115,116,114,121,70,105,110,100,101,114,46,102, - 105,110,100,95,109,111,100,117,108,101,169,2,78,78,114,69, - 0,0,0,41,15,114,150,0,0,0,114,149,0,0,0,114, - 151,0,0,0,114,152,0,0,0,114,219,0,0,0,114,218, - 0,0,0,218,11,95,77,83,95,87,73,78,68,79,87,83, - 218,18,69,88,84,69,78,83,73,79,78,95,83,85,70,70, - 73,88,69,83,114,217,0,0,0,218,12,115,116,97,116,105, - 99,109,101,116,104,111,100,114,216,0,0,0,218,11,99,108, - 97,115,115,109,101,116,104,111,100,114,223,0,0,0,114,226, - 0,0,0,114,229,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,214,0,0, - 0,26,3,0,0,115,30,0,0,0,8,0,4,2,2,3, - 2,255,2,4,2,255,12,3,2,2,10,1,2,6,10,1, - 2,14,12,1,2,15,16,1,114,214,0,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,64,0,0,0,115,48,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, - 4,100,5,132,0,90,5,100,6,100,7,132,0,90,6,100, - 8,100,9,132,0,90,7,100,10,83,0,41,11,218,13,95, - 76,111,97,100,101,114,66,97,115,105,99,115,122,83,66,97, - 115,101,32,99,108,97,115,115,32,111,102,32,99,111,109,109, - 111,110,32,99,111,100,101,32,110,101,101,100,101,100,32,98, - 121,32,98,111,116,104,32,83,111,117,114,99,101,76,111,97, - 100,101,114,32,97,110,100,10,32,32,32,32,83,111,117,114, - 99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114, - 46,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,4,0,0,0,67,0,0,0,115,64,0,0,0,116, - 0,124,0,160,1,124,1,161,1,131,1,100,1,25,0,125, - 2,124,2,160,2,100,2,100,1,161,2,100,3,25,0,125, - 3,124,1,160,3,100,2,161,1,100,4,25,0,125,4,124, - 3,100,5,107,2,111,31,124,4,100,5,107,3,83,0,41, - 6,122,141,67,111,110,99,114,101,116,101,32,105,109,112,108, - 101,109,101,110,116,97,116,105,111,110,32,111,102,32,73,110, - 115,112,101,99,116,76,111,97,100,101,114,46,105,115,95,112, - 97,99,107,97,103,101,32,98,121,32,99,104,101,99,107,105, - 110,103,32,105,102,10,32,32,32,32,32,32,32,32,116,104, - 101,32,112,97,116,104,32,114,101,116,117,114,110,101,100,32, - 98,121,32,103,101,116,95,102,105,108,101,110,97,109,101,32, - 104,97,115,32,97,32,102,105,108,101,110,97,109,101,32,111, - 102,32,39,95,95,105,110,105,116,95,95,46,112,121,39,46, - 114,3,0,0,0,114,97,0,0,0,114,0,0,0,0,114, - 44,0,0,0,218,8,95,95,105,110,105,116,95,95,41,4, - 114,74,0,0,0,114,203,0,0,0,114,125,0,0,0,114, - 104,0,0,0,41,5,114,143,0,0,0,114,163,0,0,0, - 114,120,0,0,0,90,13,102,105,108,101,110,97,109,101,95, - 98,97,115,101,90,9,116,97,105,108,95,110,97,109,101,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,206, - 0,0,0,98,3,0,0,115,8,0,0,0,18,3,16,1, - 14,1,16,1,122,24,95,76,111,97,100,101,114,66,97,115, - 105,99,115,46,105,115,95,112,97,99,107,97,103,101,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, - 0,0,0,67,0,0,0,114,23,0,0,0,169,2,122,42, - 85,115,101,32,100,101,102,97,117,108,116,32,115,101,109,97, - 110,116,105,99,115,32,102,111,114,32,109,111,100,117,108,101, - 32,99,114,101,97,116,105,111,110,46,78,114,7,0,0,0, - 169,2,114,143,0,0,0,114,210,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,13,99,114,101, - 97,116,101,95,109,111,100,117,108,101,106,3,0,0,243,2, - 0,0,0,4,0,122,27,95,76,111,97,100,101,114,66,97, - 115,105,99,115,46,99,114,101,97,116,101,95,109,111,100,117, - 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,5,0,0,0,67,0,0,0,115,56,0,0,0, - 124,0,160,0,124,1,106,1,161,1,125,2,124,2,100,1, - 117,0,114,18,116,2,100,2,160,3,124,1,106,1,161,1, - 131,1,130,1,116,4,160,5,116,6,124,2,124,1,106,7, - 161,3,1,0,100,1,83,0,41,3,122,19,69,120,101,99, - 117,116,101,32,116,104,101,32,109,111,100,117,108,101,46,78, - 122,52,99,97,110,110,111,116,32,108,111,97,100,32,109,111, - 100,117,108,101,32,123,33,114,125,32,119,104,101,110,32,103, - 101,116,95,99,111,100,101,40,41,32,114,101,116,117,114,110, - 115,32,78,111,110,101,41,8,218,8,103,101,116,95,99,111, - 100,101,114,150,0,0,0,114,142,0,0,0,114,89,0,0, - 0,114,159,0,0,0,218,25,95,99,97,108,108,95,119,105, - 116,104,95,102,114,97,109,101,115,95,114,101,109,111,118,101, - 100,218,4,101,120,101,99,114,156,0,0,0,41,3,114,143, - 0,0,0,218,6,109,111,100,117,108,101,114,188,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 11,101,120,101,99,95,109,111,100,117,108,101,109,3,0,0, - 115,12,0,0,0,12,2,8,1,4,1,8,1,4,255,20, - 2,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115, - 46,101,120,101,99,95,109,111,100,117,108,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, - 0,67,0,0,0,115,12,0,0,0,116,0,160,1,124,0, - 124,1,161,2,83,0,41,1,122,26,84,104,105,115,32,109, - 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, - 116,101,100,46,41,2,114,159,0,0,0,218,17,95,108,111, - 97,100,95,109,111,100,117,108,101,95,115,104,105,109,169,2, - 114,143,0,0,0,114,163,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,11,108,111,97,100,95, - 109,111,100,117,108,101,117,3,0,0,115,2,0,0,0,12, - 3,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115, - 46,108,111,97,100,95,109,111,100,117,108,101,78,41,8,114, - 150,0,0,0,114,149,0,0,0,114,151,0,0,0,114,152, - 0,0,0,114,206,0,0,0,114,239,0,0,0,114,245,0, - 0,0,114,248,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,235,0,0,0, - 93,3,0,0,115,12,0,0,0,8,0,4,2,8,3,8, - 8,8,3,12,8,114,235,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64, - 0,0,0,115,74,0,0,0,101,0,90,1,100,0,90,2, - 100,1,100,2,132,0,90,3,100,3,100,4,132,0,90,4, - 100,5,100,6,132,0,90,5,100,7,100,8,132,0,90,6, - 100,9,100,10,132,0,90,7,100,11,100,12,156,1,100,13, - 100,14,132,2,90,8,100,15,100,16,132,0,90,9,100,17, - 83,0,41,18,218,12,83,111,117,114,99,101,76,111,97,100, - 101,114,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0, - 116,0,130,1,41,1,122,165,79,112,116,105,111,110,97,108, - 32,109,101,116,104,111,100,32,116,104,97,116,32,114,101,116, - 117,114,110,115,32,116,104,101,32,109,111,100,105,102,105,99, - 97,116,105,111,110,32,116,105,109,101,32,40,97,110,32,105, - 110,116,41,32,102,111,114,32,116,104,101,10,32,32,32,32, - 32,32,32,32,115,112,101,99,105,102,105,101,100,32,112,97, - 116,104,32,40,97,32,115,116,114,41,46,10,10,32,32,32, - 32,32,32,32,32,82,97,105,115,101,115,32,79,83,69,114, - 114,111,114,32,119,104,101,110,32,116,104,101,32,112,97,116, - 104,32,99,97,110,110,111,116,32,98,101,32,104,97,110,100, - 108,101,100,46,10,32,32,32,32,32,32,32,32,41,1,114, - 76,0,0,0,169,2,114,143,0,0,0,114,65,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 10,112,97,116,104,95,109,116,105,109,101,125,3,0,0,115, - 2,0,0,0,4,6,122,23,83,111,117,114,99,101,76,111, - 97,100,101,114,46,112,97,116,104,95,109,116,105,109,101,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 4,0,0,0,67,0,0,0,115,14,0,0,0,100,1,124, - 0,160,0,124,1,161,1,105,1,83,0,41,2,97,158,1, - 0,0,79,112,116,105,111,110,97,108,32,109,101,116,104,111, - 100,32,114,101,116,117,114,110,105,110,103,32,97,32,109,101, - 116,97,100,97,116,97,32,100,105,99,116,32,102,111,114,32, - 116,104,101,32,115,112,101,99,105,102,105,101,100,10,32,32, - 32,32,32,32,32,32,112,97,116,104,32,40,97,32,115,116, - 114,41,46,10,10,32,32,32,32,32,32,32,32,80,111,115, - 115,105,98,108,101,32,107,101,121,115,58,10,32,32,32,32, - 32,32,32,32,45,32,39,109,116,105,109,101,39,32,40,109, - 97,110,100,97,116,111,114,121,41,32,105,115,32,116,104,101, - 32,110,117,109,101,114,105,99,32,116,105,109,101,115,116,97, - 109,112,32,111,102,32,108,97,115,116,32,115,111,117,114,99, - 101,10,32,32,32,32,32,32,32,32,32,32,99,111,100,101, - 32,109,111,100,105,102,105,99,97,116,105,111,110,59,10,32, - 32,32,32,32,32,32,32,45,32,39,115,105,122,101,39,32, - 40,111,112,116,105,111,110,97,108,41,32,105,115,32,116,104, - 101,32,115,105,122,101,32,105,110,32,98,121,116,101,115,32, - 111,102,32,116,104,101,32,115,111,117,114,99,101,32,99,111, - 100,101,46,10,10,32,32,32,32,32,32,32,32,73,109,112, - 108,101,109,101,110,116,105,110,103,32,116,104,105,115,32,109, - 101,116,104,111,100,32,97,108,108,111,119,115,32,116,104,101, - 32,108,111,97,100,101,114,32,116,111,32,114,101,97,100,32, - 98,121,116,101,99,111,100,101,32,102,105,108,101,115,46,10, - 32,32,32,32,32,32,32,32,82,97,105,115,101,115,32,79, - 83,69,114,114,111,114,32,119,104,101,110,32,116,104,101,32, - 112,97,116,104,32,99,97,110,110,111,116,32,98,101,32,104, - 97,110,100,108,101,100,46,10,32,32,32,32,32,32,32,32, - 114,193,0,0,0,41,1,114,251,0,0,0,114,250,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,10,112,97,116,104,95,115,116,97,116,115,133,3,0,0, - 115,2,0,0,0,14,12,122,23,83,111,117,114,99,101,76, - 111,97,100,101,114,46,112,97,116,104,95,115,116,97,116,115, - 99,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,4,0,0,0,67,0,0,0,115,12,0,0,0,124,0, - 160,0,124,2,124,3,161,2,83,0,41,1,122,228,79,112, - 116,105,111,110,97,108,32,109,101,116,104,111,100,32,119,104, - 105,99,104,32,119,114,105,116,101,115,32,100,97,116,97,32, - 40,98,121,116,101,115,41,32,116,111,32,97,32,102,105,108, - 101,32,112,97,116,104,32,40,97,32,115,116,114,41,46,10, - 10,32,32,32,32,32,32,32,32,73,109,112,108,101,109,101, - 110,116,105,110,103,32,116,104,105,115,32,109,101,116,104,111, - 100,32,97,108,108,111,119,115,32,102,111,114,32,116,104,101, - 32,119,114,105,116,105,110,103,32,111,102,32,98,121,116,101, - 99,111,100,101,32,102,105,108,101,115,46,10,10,32,32,32, - 32,32,32,32,32,84,104,101,32,115,111,117,114,99,101,32, - 112,97,116,104,32,105,115,32,110,101,101,100,101,100,32,105, - 110,32,111,114,100,101,114,32,116,111,32,99,111,114,114,101, - 99,116,108,121,32,116,114,97,110,115,102,101,114,32,112,101, - 114,109,105,115,115,105,111,110,115,10,32,32,32,32,32,32, - 32,32,41,1,218,8,115,101,116,95,100,97,116,97,41,4, - 114,143,0,0,0,114,134,0,0,0,90,10,99,97,99,104, - 101,95,112,97,116,104,114,41,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,15,95,99,97,99, - 104,101,95,98,121,116,101,99,111,100,101,147,3,0,0,115, - 2,0,0,0,12,8,122,28,83,111,117,114,99,101,76,111, - 97,100,101,114,46,95,99,97,99,104,101,95,98,121,116,101, - 99,111,100,101,99,3,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,1,0,0,0,67,0,0,0,114,23,0, - 0,0,41,2,122,150,79,112,116,105,111,110,97,108,32,109, - 101,116,104,111,100,32,119,104,105,99,104,32,119,114,105,116, - 101,115,32,100,97,116,97,32,40,98,121,116,101,115,41,32, - 116,111,32,97,32,102,105,108,101,32,112,97,116,104,32,40, - 97,32,115,116,114,41,46,10,10,32,32,32,32,32,32,32, - 32,73,109,112,108,101,109,101,110,116,105,110,103,32,116,104, - 105,115,32,109,101,116,104,111,100,32,97,108,108,111,119,115, - 32,102,111,114,32,116,104,101,32,119,114,105,116,105,110,103, - 32,111,102,32,98,121,116,101,99,111,100,101,32,102,105,108, - 101,115,46,10,32,32,32,32,32,32,32,32,78,114,7,0, - 0,0,41,3,114,143,0,0,0,114,65,0,0,0,114,41, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,253,0,0,0,157,3,0,0,114,240,0,0,0, - 122,21,83,111,117,114,99,101,76,111,97,100,101,114,46,115, - 101,116,95,100,97,116,97,99,2,0,0,0,0,0,0,0, - 0,0,0,0,5,0,0,0,10,0,0,0,67,0,0,0, - 115,70,0,0,0,124,0,160,0,124,1,161,1,125,2,122, - 10,124,0,160,1,124,2,161,1,125,3,87,0,116,4,124, - 3,131,1,83,0,4,0,116,2,121,34,1,0,125,4,1, - 0,122,7,116,3,100,1,124,1,100,2,141,2,124,4,130, - 2,100,3,125,4,126,4,119,1,119,0,41,4,122,52,67, - 111,110,99,114,101,116,101,32,105,109,112,108,101,109,101,110, - 116,97,116,105,111,110,32,111,102,32,73,110,115,112,101,99, - 116,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114, - 99,101,46,122,39,115,111,117,114,99,101,32,110,111,116,32, - 97,118,97,105,108,97,98,108,101,32,116,104,114,111,117,103, - 104,32,103,101,116,95,100,97,116,97,40,41,114,140,0,0, - 0,78,41,5,114,203,0,0,0,218,8,103,101,116,95,100, - 97,116,97,114,76,0,0,0,114,142,0,0,0,114,200,0, - 0,0,41,5,114,143,0,0,0,114,163,0,0,0,114,65, - 0,0,0,114,198,0,0,0,218,3,101,120,99,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,10,103,101, - 116,95,115,111,117,114,99,101,164,3,0,0,115,24,0,0, - 0,10,2,2,1,12,1,8,4,14,253,4,1,2,1,4, - 255,2,1,2,255,8,128,2,255,122,23,83,111,117,114,99, - 101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114, - 99,101,114,130,0,0,0,41,1,218,9,95,111,112,116,105, - 109,105,122,101,99,3,0,0,0,0,0,0,0,1,0,0, - 0,4,0,0,0,8,0,0,0,67,0,0,0,115,22,0, - 0,0,116,0,106,1,116,2,124,1,124,2,100,1,100,2, - 124,3,100,3,141,6,83,0,41,4,122,130,82,101,116,117, - 114,110,32,116,104,101,32,99,111,100,101,32,111,98,106,101, - 99,116,32,99,111,109,112,105,108,101,100,32,102,114,111,109, - 32,115,111,117,114,99,101,46,10,10,32,32,32,32,32,32, - 32,32,84,104,101,32,39,100,97,116,97,39,32,97,114,103, - 117,109,101,110,116,32,99,97,110,32,98,101,32,97,110,121, - 32,111,98,106,101,99,116,32,116,121,112,101,32,116,104,97, - 116,32,99,111,109,112,105,108,101,40,41,32,115,117,112,112, - 111,114,116,115,46,10,32,32,32,32,32,32,32,32,114,243, - 0,0,0,84,41,2,218,12,100,111,110,116,95,105,110,104, - 101,114,105,116,114,108,0,0,0,41,3,114,159,0,0,0, - 114,242,0,0,0,218,7,99,111,109,112,105,108,101,41,4, - 114,143,0,0,0,114,41,0,0,0,114,65,0,0,0,114, - 2,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,14,115,111,117,114,99,101,95,116,111,95,99, - 111,100,101,174,3,0,0,115,6,0,0,0,12,5,4,1, - 6,255,122,27,83,111,117,114,99,101,76,111,97,100,101,114, - 46,115,111,117,114,99,101,95,116,111,95,99,111,100,101,99, - 2,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0, - 9,0,0,0,67,0,0,0,115,2,2,0,0,124,0,160, - 0,124,1,161,1,125,2,100,1,125,3,100,1,125,4,100, - 1,125,5,100,2,125,6,100,3,125,7,122,6,116,1,124, - 2,131,1,125,8,87,0,110,11,4,0,116,2,121,32,1, - 0,1,0,1,0,100,1,125,8,89,0,110,144,119,0,122, - 7,124,0,160,3,124,2,161,1,125,9,87,0,110,9,4, - 0,116,4,121,49,1,0,1,0,1,0,89,0,110,127,119, - 0,116,5,124,9,100,4,25,0,131,1,125,3,122,7,124, - 0,160,6,124,8,161,1,125,10,87,0,110,9,4,0,116, - 4,121,72,1,0,1,0,1,0,89,0,110,104,119,0,124, - 1,124,8,100,5,156,2,125,11,122,71,116,7,124,10,124, - 1,124,11,131,3,125,12,116,8,124,10,131,1,100,6,100, - 1,133,2,25,0,125,13,124,12,100,7,64,0,100,8,107, - 3,125,6,124,6,114,138,124,12,100,9,64,0,100,8,107, - 3,125,7,116,9,106,10,100,10,107,3,114,137,124,7,115, - 119,116,9,106,10,100,11,107,2,114,137,124,0,160,6,124, - 2,161,1,125,4,116,9,160,11,116,12,124,4,161,2,125, - 5,116,13,124,10,124,5,124,1,124,11,131,4,1,0,110, - 10,116,14,124,10,124,3,124,9,100,12,25,0,124,1,124, - 11,131,5,1,0,87,0,110,11,4,0,116,15,116,16,102, - 2,121,160,1,0,1,0,1,0,89,0,110,16,119,0,116, - 17,160,18,100,13,124,8,124,2,161,3,1,0,116,19,124, - 13,124,1,124,8,124,2,100,14,141,4,83,0,124,4,100, - 1,117,0,114,185,124,0,160,6,124,2,161,1,125,4,124, - 0,160,20,124,4,124,2,161,2,125,14,116,17,160,18,100, - 15,124,2,161,2,1,0,116,21,106,22,115,255,124,8,100, - 1,117,1,114,255,124,3,100,1,117,1,114,255,124,6,114, - 226,124,5,100,1,117,0,114,219,116,9,160,11,124,4,161, - 1,125,5,116,23,124,14,124,5,124,7,131,3,125,10,110, - 8,116,24,124,14,124,3,116,25,124,4,131,1,131,3,125, - 10,122,10,124,0,160,26,124,2,124,8,124,10,161,3,1, - 0,87,0,124,14,83,0,4,0,116,2,121,254,1,0,1, - 0,1,0,89,0,124,14,83,0,119,0,124,14,83,0,41, - 16,122,190,67,111,110,99,114,101,116,101,32,105,109,112,108, - 101,109,101,110,116,97,116,105,111,110,32,111,102,32,73,110, - 115,112,101,99,116,76,111,97,100,101,114,46,103,101,116,95, - 99,111,100,101,46,10,10,32,32,32,32,32,32,32,32,82, - 101,97,100,105,110,103,32,111,102,32,98,121,116,101,99,111, - 100,101,32,114,101,113,117,105,114,101,115,32,112,97,116,104, - 95,115,116,97,116,115,32,116,111,32,98,101,32,105,109,112, - 108,101,109,101,110,116,101,100,46,32,84,111,32,119,114,105, - 116,101,10,32,32,32,32,32,32,32,32,98,121,116,101,99, - 111,100,101,44,32,115,101,116,95,100,97,116,97,32,109,117, - 115,116,32,97,108,115,111,32,98,101,32,105,109,112,108,101, - 109,101,110,116,101,100,46,10,10,32,32,32,32,32,32,32, - 32,78,70,84,114,193,0,0,0,114,183,0,0,0,114,169, - 0,0,0,114,3,0,0,0,114,0,0,0,0,114,44,0, - 0,0,90,5,110,101,118,101,114,90,6,97,108,119,97,121, - 115,218,4,115,105,122,101,122,13,123,125,32,109,97,116,99, - 104,101,115,32,123,125,41,3,114,141,0,0,0,114,132,0, - 0,0,114,134,0,0,0,122,19,99,111,100,101,32,111,98, - 106,101,99,116,32,102,114,111,109,32,123,125,41,27,114,203, - 0,0,0,114,121,0,0,0,114,107,0,0,0,114,252,0, - 0,0,114,76,0,0,0,114,33,0,0,0,114,255,0,0, - 0,114,176,0,0,0,218,10,109,101,109,111,114,121,118,105, - 101,119,114,187,0,0,0,90,21,99,104,101,99,107,95,104, - 97,115,104,95,98,97,115,101,100,95,112,121,99,115,114,181, - 0,0,0,218,17,95,82,65,87,95,77,65,71,73,67,95, - 78,85,77,66,69,82,114,182,0,0,0,114,180,0,0,0, - 114,142,0,0,0,114,174,0,0,0,114,159,0,0,0,114, - 173,0,0,0,114,189,0,0,0,114,5,1,0,0,114,15, - 0,0,0,218,19,100,111,110,116,95,119,114,105,116,101,95, - 98,121,116,101,99,111,100,101,114,195,0,0,0,114,194,0, - 0,0,114,4,0,0,0,114,254,0,0,0,41,15,114,143, - 0,0,0,114,163,0,0,0,114,134,0,0,0,114,178,0, - 0,0,114,198,0,0,0,114,181,0,0,0,90,10,104,97, - 115,104,95,98,97,115,101,100,90,12,99,104,101,99,107,95, - 115,111,117,114,99,101,114,132,0,0,0,218,2,115,116,114, - 41,0,0,0,114,175,0,0,0,114,16,0,0,0,90,10, - 98,121,116,101,115,95,100,97,116,97,90,11,99,111,100,101, - 95,111,98,106,101,99,116,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,241,0,0,0,182,3,0,0,115, - 166,0,0,0,10,7,4,1,4,1,4,1,4,1,4,1, - 2,1,12,1,12,1,8,1,2,255,2,3,14,1,12,1, - 4,1,2,255,12,3,2,1,14,1,12,1,4,1,2,255, - 2,4,2,1,6,254,2,4,12,1,16,1,12,1,4,1, - 12,1,10,1,2,1,2,255,10,2,10,1,4,1,2,1, - 2,1,4,254,8,4,2,1,4,255,2,128,2,3,2,1, - 2,1,6,1,2,1,2,1,4,251,4,128,16,7,4,1, - 2,255,8,3,2,1,4,255,6,2,2,1,2,1,6,254, - 8,3,10,1,12,1,12,1,14,1,8,1,4,1,8,1, - 10,1,14,1,6,2,6,1,4,255,2,2,16,1,4,3, - 12,254,2,1,4,1,2,254,4,2,122,21,83,111,117,114, - 99,101,76,111,97,100,101,114,46,103,101,116,95,99,111,100, - 101,78,41,10,114,150,0,0,0,114,149,0,0,0,114,151, - 0,0,0,114,251,0,0,0,114,252,0,0,0,114,254,0, - 0,0,114,253,0,0,0,114,1,1,0,0,114,5,1,0, - 0,114,241,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,249,0,0,0,123, - 3,0,0,115,16,0,0,0,8,0,8,2,8,8,8,14, - 8,10,8,7,14,10,12,8,114,249,0,0,0,99,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,0,0,0,0,115,92,0,0,0,101,0,90,1,100, - 0,90,2,100,1,90,3,100,2,100,3,132,0,90,4,100, - 4,100,5,132,0,90,5,100,6,100,7,132,0,90,6,101, - 7,135,0,102,1,100,8,100,9,132,8,131,1,90,8,101, - 7,100,10,100,11,132,0,131,1,90,9,100,12,100,13,132, - 0,90,10,101,7,100,14,100,15,132,0,131,1,90,11,135, - 0,4,0,90,12,83,0,41,16,218,10,70,105,108,101,76, - 111,97,100,101,114,122,103,66,97,115,101,32,102,105,108,101, - 32,108,111,97,100,101,114,32,99,108,97,115,115,32,119,104, - 105,99,104,32,105,109,112,108,101,109,101,110,116,115,32,116, - 104,101,32,108,111,97,100,101,114,32,112,114,111,116,111,99, - 111,108,32,109,101,116,104,111,100,115,32,116,104,97,116,10, - 32,32,32,32,114,101,113,117,105,114,101,32,102,105,108,101, - 32,115,121,115,116,101,109,32,117,115,97,103,101,46,99,3, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2, - 0,0,0,67,0,0,0,115,16,0,0,0,124,1,124,0, - 95,0,124,2,124,0,95,1,100,1,83,0,41,2,122,75, - 67,97,99,104,101,32,116,104,101,32,109,111,100,117,108,101, - 32,110,97,109,101,32,97,110,100,32,116,104,101,32,112,97, - 116,104,32,116,111,32,116,104,101,32,102,105,108,101,32,102, - 111,117,110,100,32,98,121,32,116,104,101,10,32,32,32,32, - 32,32,32,32,102,105,110,100,101,114,46,78,114,183,0,0, - 0,41,3,114,143,0,0,0,114,163,0,0,0,114,65,0, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,236,0,0,0,16,4,0,0,115,4,0,0,0,6, - 3,10,1,122,19,70,105,108,101,76,111,97,100,101,114,46, - 95,95,105,110,105,116,95,95,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,2,0,0,0,67,0,0, - 0,243,24,0,0,0,124,0,106,0,124,1,106,0,107,2, - 111,11,124,0,106,1,124,1,106,1,107,2,83,0,114,69, - 0,0,0,169,2,218,9,95,95,99,108,97,115,115,95,95, - 114,156,0,0,0,169,2,114,143,0,0,0,90,5,111,116, - 104,101,114,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,218,6,95,95,101,113,95,95,22,4,0,0,243,6, - 0,0,0,12,1,10,1,2,255,122,17,70,105,108,101,76, - 111,97,100,101,114,46,95,95,101,113,95,95,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, - 0,67,0,0,0,243,20,0,0,0,116,0,124,0,106,1, - 131,1,116,0,124,0,106,2,131,1,65,0,83,0,114,69, - 0,0,0,169,3,218,4,104,97,115,104,114,141,0,0,0, - 114,65,0,0,0,169,1,114,143,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,218,8,95,95,104, - 97,115,104,95,95,26,4,0,0,243,2,0,0,0,20,1, - 122,19,70,105,108,101,76,111,97,100,101,114,46,95,95,104, - 97,115,104,95,95,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,3,0,0,0,115,16, - 0,0,0,116,0,116,1,124,0,131,2,160,2,124,1,161, - 1,83,0,41,1,122,100,76,111,97,100,32,97,32,109,111, - 100,117,108,101,32,102,114,111,109,32,97,32,102,105,108,101, - 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32, - 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, - 97,116,101,100,46,32,32,85,115,101,32,101,120,101,99,95, - 109,111,100,117,108,101,40,41,32,105,110,115,116,101,97,100, - 46,10,10,32,32,32,32,32,32,32,32,41,3,218,5,115, - 117,112,101,114,114,11,1,0,0,114,248,0,0,0,114,247, - 0,0,0,169,1,114,14,1,0,0,114,7,0,0,0,114, - 8,0,0,0,114,248,0,0,0,29,4,0,0,115,2,0, - 0,0,16,10,122,22,70,105,108,101,76,111,97,100,101,114, - 46,108,111,97,100,95,109,111,100,117,108,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,243,6,0,0,0,124,0,106,0,83,0, - 169,1,122,58,82,101,116,117,114,110,32,116,104,101,32,112, - 97,116,104,32,116,111,32,116,104,101,32,115,111,117,114,99, - 101,32,102,105,108,101,32,97,115,32,102,111,117,110,100,32, - 98,121,32,116,104,101,32,102,105,110,100,101,114,46,114,71, - 0,0,0,114,247,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,203,0,0,0,41,4,0,0, - 243,2,0,0,0,6,3,122,23,70,105,108,101,76,111,97, - 100,101,114,46,103,101,116,95,102,105,108,101,110,97,109,101, - 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,8,0,0,0,67,0,0,0,115,128,0,0,0,116,0, - 124,0,116,1,116,2,102,2,131,2,114,36,116,3,160,4, - 116,5,124,1,131,1,161,1,143,12,125,2,124,2,160,6, - 161,0,87,0,2,0,100,1,4,0,4,0,131,3,1,0, - 83,0,49,0,115,29,119,1,1,0,1,0,1,0,89,0, - 1,0,100,1,83,0,116,3,160,7,124,1,100,2,161,2, - 143,12,125,2,124,2,160,6,161,0,87,0,2,0,100,1, - 4,0,4,0,131,3,1,0,83,0,49,0,115,57,119,1, - 1,0,1,0,1,0,89,0,1,0,100,1,83,0,41,3, - 122,39,82,101,116,117,114,110,32,116,104,101,32,100,97,116, - 97,32,102,114,111,109,32,112,97,116,104,32,97,115,32,114, - 97,119,32,98,121,116,101,115,46,78,218,1,114,41,8,114, - 185,0,0,0,114,249,0,0,0,218,19,69,120,116,101,110, - 115,105,111,110,70,105,108,101,76,111,97,100,101,114,114,91, - 0,0,0,90,9,111,112,101,110,95,99,111,100,101,114,109, - 0,0,0,90,4,114,101,97,100,114,92,0,0,0,41,3, - 114,143,0,0,0,114,65,0,0,0,114,94,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,255, - 0,0,0,46,4,0,0,115,14,0,0,0,14,2,16,1, - 6,1,36,255,14,3,6,1,36,255,122,19,70,105,108,101, - 76,111,97,100,101,114,46,103,101,116,95,100,97,116,97,99, - 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 2,0,0,0,67,0,0,0,115,20,0,0,0,100,1,100, - 2,108,0,109,1,125,2,1,0,124,2,124,0,131,1,83, - 0,41,3,78,114,0,0,0,0,41,1,218,10,70,105,108, - 101,82,101,97,100,101,114,41,2,218,17,105,109,112,111,114, - 116,108,105,98,46,114,101,97,100,101,114,115,114,31,1,0, - 0,41,3,114,143,0,0,0,114,244,0,0,0,114,31,1, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,19,103,101,116,95,114,101,115,111,117,114,99,101,95, - 114,101,97,100,101,114,55,4,0,0,115,4,0,0,0,12, - 2,8,1,122,30,70,105,108,101,76,111,97,100,101,114,46, - 103,101,116,95,114,101,115,111,117,114,99,101,95,114,101,97, - 100,101,114,41,13,114,150,0,0,0,114,149,0,0,0,114, - 151,0,0,0,114,152,0,0,0,114,236,0,0,0,114,16, - 1,0,0,114,22,1,0,0,114,160,0,0,0,114,248,0, - 0,0,114,203,0,0,0,114,255,0,0,0,114,33,1,0, - 0,90,13,95,95,99,108,97,115,115,99,101,108,108,95,95, - 114,7,0,0,0,114,7,0,0,0,114,25,1,0,0,114, - 8,0,0,0,114,11,1,0,0,11,4,0,0,115,24,0, - 0,0,8,0,4,2,8,3,8,6,8,4,2,3,14,1, - 2,11,10,1,8,4,2,9,18,1,114,11,1,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,64,0,0,0,115,46,0,0,0,101,0,90, - 1,100,0,90,2,100,1,90,3,100,2,100,3,132,0,90, - 4,100,4,100,5,132,0,90,5,100,6,100,7,156,1,100, - 8,100,9,132,2,90,6,100,10,83,0,41,11,218,16,83, - 111,117,114,99,101,70,105,108,101,76,111,97,100,101,114,122, - 62,67,111,110,99,114,101,116,101,32,105,109,112,108,101,109, - 101,110,116,97,116,105,111,110,32,111,102,32,83,111,117,114, - 99,101,76,111,97,100,101,114,32,117,115,105,110,103,32,116, - 104,101,32,102,105,108,101,32,115,121,115,116,101,109,46,99, - 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 3,0,0,0,67,0,0,0,115,22,0,0,0,116,0,124, - 1,131,1,125,2,124,2,106,1,124,2,106,2,100,1,156, - 2,83,0,41,2,122,33,82,101,116,117,114,110,32,116,104, - 101,32,109,101,116,97,100,97,116,97,32,102,111,114,32,116, - 104,101,32,112,97,116,104,46,41,2,114,193,0,0,0,114, - 6,1,0,0,41,3,114,75,0,0,0,218,8,115,116,95, - 109,116,105,109,101,90,7,115,116,95,115,105,122,101,41,3, - 114,143,0,0,0,114,65,0,0,0,114,10,1,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,252, - 0,0,0,65,4,0,0,115,4,0,0,0,8,2,14,1, - 122,27,83,111,117,114,99,101,70,105,108,101,76,111,97,100, - 101,114,46,112,97,116,104,95,115,116,97,116,115,99,4,0, + 32,32,32,32,65,110,32,73,109,112,111,114,116,69,114,114, + 111,114,32,105,115,32,114,97,105,115,101,100,32,105,102,32, + 116,104,101,32,98,121,116,101,99,111,100,101,32,105,115,32, + 115,116,97,108,101,46,10,10,32,32,32,32,114,171,0,0, + 0,233,12,0,0,0,114,32,0,0,0,122,22,98,121,116, + 101,99,111,100,101,32,105,115,32,115,116,97,108,101,32,102, + 111,114,32,114,169,0,0,0,78,114,170,0,0,0,41,4, + 114,44,0,0,0,114,160,0,0,0,114,174,0,0,0,114, + 143,0,0,0,41,6,114,43,0,0,0,218,12,115,111,117, + 114,99,101,95,109,116,105,109,101,218,11,115,111,117,114,99, + 101,95,115,105,122,101,114,142,0,0,0,114,176,0,0,0, + 114,119,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,218,23,95,118,97,108,105,100,97,116,101,95, + 116,105,109,101,115,116,97,109,112,95,112,121,99,110,2,0, + 0,115,18,0,0,0,24,19,10,1,12,1,16,1,8,1, + 24,1,22,1,4,254,4,1,114,181,0,0,0,99,4,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0, + 0,0,67,0,0,0,115,42,0,0,0,124,0,100,1,100, + 2,133,2,25,0,124,1,107,3,114,19,116,0,100,3,124, + 2,155,2,157,2,102,1,105,0,124,3,164,1,142,1,130, + 1,100,4,83,0,41,5,97,243,1,0,0,86,97,108,105, + 100,97,116,101,32,97,32,104,97,115,104,45,98,97,115,101, + 100,32,112,121,99,32,98,121,32,99,104,101,99,107,105,110, + 103,32,116,104,101,32,114,101,97,108,32,115,111,117,114,99, + 101,32,104,97,115,104,32,97,103,97,105,110,115,116,32,116, + 104,101,32,111,110,101,32,105,110,10,32,32,32,32,116,104, + 101,32,112,121,99,32,104,101,97,100,101,114,46,10,10,32, + 32,32,32,42,100,97,116,97,42,32,105,115,32,116,104,101, + 32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,101, + 32,112,121,99,32,102,105,108,101,46,32,40,79,110,108,121, + 32,116,104,101,32,102,105,114,115,116,32,49,54,32,98,121, + 116,101,115,32,97,114,101,10,32,32,32,32,114,101,113,117, + 105,114,101,100,46,41,10,10,32,32,32,32,42,115,111,117, + 114,99,101,95,104,97,115,104,42,32,105,115,32,116,104,101, + 32,105,109,112,111,114,116,108,105,98,46,117,116,105,108,46, + 115,111,117,114,99,101,95,104,97,115,104,40,41,32,111,102, + 32,116,104,101,32,115,111,117,114,99,101,32,102,105,108,101, + 46,10,10,32,32,32,32,42,110,97,109,101,42,32,105,115, + 32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101, + 32,109,111,100,117,108,101,32,98,101,105,110,103,32,105,109, + 112,111,114,116,101,100,46,32,73,116,32,105,115,32,117,115, + 101,100,32,102,111,114,32,108,111,103,103,105,110,103,46,10, + 10,32,32,32,32,42,101,120,99,95,100,101,116,97,105,108, + 115,42,32,105,115,32,97,32,100,105,99,116,105,111,110,97, + 114,121,32,112,97,115,115,101,100,32,116,111,32,73,109,112, + 111,114,116,69,114,114,111,114,32,105,102,32,105,116,32,114, + 97,105,115,101,100,32,102,111,114,10,32,32,32,32,105,109, + 112,114,111,118,101,100,32,100,101,98,117,103,103,105,110,103, + 46,10,10,32,32,32,32,65,110,32,73,109,112,111,114,116, + 69,114,114,111,114,32,105,115,32,114,97,105,115,101,100,32, + 105,102,32,116,104,101,32,98,121,116,101,99,111,100,101,32, + 105,115,32,115,116,97,108,101,46,10,10,32,32,32,32,114, + 171,0,0,0,114,170,0,0,0,122,46,104,97,115,104,32, + 105,110,32,98,121,116,101,99,111,100,101,32,100,111,101,115, + 110,39,116,32,109,97,116,99,104,32,104,97,115,104,32,111, + 102,32,115,111,117,114,99,101,32,78,41,1,114,143,0,0, + 0,41,4,114,43,0,0,0,218,11,115,111,117,114,99,101, + 95,104,97,115,104,114,142,0,0,0,114,176,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,18, + 95,118,97,108,105,100,97,116,101,95,104,97,115,104,95,112, + 121,99,138,2,0,0,115,14,0,0,0,16,17,2,1,8, + 1,4,255,2,2,6,254,4,255,114,183,0,0,0,99,4, + 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5, + 0,0,0,67,0,0,0,115,76,0,0,0,116,0,160,1, + 124,0,161,1,125,4,116,2,124,4,116,3,131,2,114,28, + 116,4,160,5,100,1,124,2,161,2,1,0,124,3,100,2, + 117,1,114,26,116,6,160,7,124,4,124,3,161,2,1,0, + 124,4,83,0,116,8,100,3,160,9,124,2,161,1,124,1, + 124,2,100,4,141,3,130,1,41,5,122,35,67,111,109,112, + 105,108,101,32,98,121,116,101,99,111,100,101,32,97,115,32, + 102,111,117,110,100,32,105,110,32,97,32,112,121,99,46,122, + 21,99,111,100,101,32,111,98,106,101,99,116,32,102,114,111, + 109,32,123,33,114,125,78,122,23,78,111,110,45,99,111,100, + 101,32,111,98,106,101,99,116,32,105,110,32,123,33,114,125, + 169,2,114,142,0,0,0,114,67,0,0,0,41,10,218,7, + 109,97,114,115,104,97,108,90,5,108,111,97,100,115,218,10, + 105,115,105,110,115,116,97,110,99,101,218,10,95,99,111,100, + 101,95,116,121,112,101,114,160,0,0,0,114,174,0,0,0, + 218,4,95,105,109,112,90,16,95,102,105,120,95,99,111,95, + 102,105,108,101,110,97,109,101,114,143,0,0,0,114,91,0, + 0,0,41,5,114,43,0,0,0,114,142,0,0,0,114,133, + 0,0,0,114,135,0,0,0,218,4,99,111,100,101,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,17,95, + 99,111,109,112,105,108,101,95,98,121,116,101,99,111,100,101, + 162,2,0,0,115,18,0,0,0,10,2,10,1,12,1,8, + 1,12,1,4,1,10,2,4,1,6,255,114,190,0,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,5,0,0,0,67,0,0,0,115,70,0,0,0,116,0, + 116,1,131,1,125,3,124,3,160,2,116,3,100,1,131,1, + 161,1,1,0,124,3,160,2,116,3,124,1,131,1,161,1, + 1,0,124,3,160,2,116,3,124,2,131,1,161,1,1,0, + 124,3,160,2,116,4,160,5,124,0,161,1,161,1,1,0, + 124,3,83,0,41,2,122,43,80,114,111,100,117,99,101,32, + 116,104,101,32,100,97,116,97,32,102,111,114,32,97,32,116, + 105,109,101,115,116,97,109,112,45,98,97,115,101,100,32,112, + 121,99,46,114,0,0,0,0,41,6,218,9,98,121,116,101, + 97,114,114,97,121,114,173,0,0,0,218,6,101,120,116,101, + 110,100,114,38,0,0,0,114,185,0,0,0,218,5,100,117, + 109,112,115,41,4,114,189,0,0,0,218,5,109,116,105,109, + 101,114,180,0,0,0,114,43,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,22,95,99,111,100, + 101,95,116,111,95,116,105,109,101,115,116,97,109,112,95,112, + 121,99,175,2,0,0,115,12,0,0,0,8,2,14,1,14, + 1,14,1,16,1,4,1,114,195,0,0,0,84,99,3,0, 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0, - 0,0,67,0,0,0,115,24,0,0,0,116,0,124,1,131, - 1,125,4,124,0,106,1,124,2,124,3,124,4,100,1,141, - 3,83,0,41,2,78,169,1,218,5,95,109,111,100,101,41, - 2,114,139,0,0,0,114,253,0,0,0,41,5,114,143,0, - 0,0,114,134,0,0,0,114,132,0,0,0,114,41,0,0, - 0,114,78,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,254,0,0,0,70,4,0,0,115,4, - 0,0,0,8,2,16,1,122,32,83,111,117,114,99,101,70, - 105,108,101,76,111,97,100,101,114,46,95,99,97,99,104,101, - 95,98,121,116,101,99,111,100,101,114,87,0,0,0,114,36, - 1,0,0,99,3,0,0,0,0,0,0,0,1,0,0,0, - 9,0,0,0,11,0,0,0,67,0,0,0,115,254,0,0, - 0,116,0,124,1,131,1,92,2,125,4,125,5,103,0,125, - 6,124,4,114,31,116,1,124,4,131,1,115,31,116,0,124, - 4,131,1,92,2,125,4,125,7,124,6,160,2,124,7,161, - 1,1,0,124,4,114,31,116,1,124,4,131,1,114,14,116, - 3,124,6,131,1,68,0,93,49,125,7,116,4,124,4,124, - 7,131,2,125,4,122,7,116,5,160,6,124,4,161,1,1, - 0,87,0,113,35,4,0,116,7,121,58,1,0,1,0,1, - 0,89,0,113,35,4,0,116,8,121,84,1,0,125,8,1, - 0,122,15,116,9,160,10,100,1,124,4,124,8,161,3,1, - 0,87,0,89,0,100,2,125,8,126,8,1,0,100,2,83, - 0,100,2,125,8,126,8,119,1,119,0,122,15,116,11,124, - 1,124,2,124,3,131,3,1,0,116,9,160,10,100,3,124, - 1,161,2,1,0,87,0,100,2,83,0,4,0,116,8,121, - 126,1,0,125,8,1,0,122,14,116,9,160,10,100,1,124, - 1,124,8,161,3,1,0,87,0,89,0,100,2,125,8,126, - 8,100,2,83,0,100,2,125,8,126,8,119,1,119,0,41, - 4,122,27,87,114,105,116,101,32,98,121,116,101,115,32,100, - 97,116,97,32,116,111,32,97,32,102,105,108,101,46,122,27, - 99,111,117,108,100,32,110,111,116,32,99,114,101,97,116,101, - 32,123,33,114,125,58,32,123,33,114,125,78,122,12,99,114, - 101,97,116,101,100,32,123,33,114,125,41,12,114,74,0,0, - 0,114,83,0,0,0,114,61,0,0,0,218,8,114,101,118, - 101,114,115,101,100,114,67,0,0,0,114,18,0,0,0,90, - 5,109,107,100,105,114,218,15,70,105,108,101,69,120,105,115, - 116,115,69,114,114,111,114,114,76,0,0,0,114,159,0,0, - 0,114,173,0,0,0,114,95,0,0,0,41,9,114,143,0, - 0,0,114,65,0,0,0,114,41,0,0,0,114,37,1,0, - 0,218,6,112,97,114,101,110,116,114,120,0,0,0,114,63, - 0,0,0,114,68,0,0,0,114,0,1,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,253,0,0, - 0,75,4,0,0,115,56,0,0,0,12,2,4,1,12,2, - 12,1,10,1,12,254,12,4,10,1,2,1,14,1,12,1, - 4,2,14,1,6,3,4,1,4,255,16,2,8,128,2,251, - 2,6,12,1,18,1,14,1,8,2,2,1,18,255,8,128, - 2,254,122,25,83,111,117,114,99,101,70,105,108,101,76,111, - 97,100,101,114,46,115,101,116,95,100,97,116,97,78,41,7, - 114,150,0,0,0,114,149,0,0,0,114,151,0,0,0,114, - 152,0,0,0,114,252,0,0,0,114,254,0,0,0,114,253, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,34,1,0,0,61,4,0,0, - 115,10,0,0,0,8,0,4,2,8,2,8,5,18,5,114, - 34,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,64,0,0,0,115,32,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, - 100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6, - 83,0,41,7,218,20,83,111,117,114,99,101,108,101,115,115, - 70,105,108,101,76,111,97,100,101,114,122,45,76,111,97,100, - 101,114,32,119,104,105,99,104,32,104,97,110,100,108,101,115, - 32,115,111,117,114,99,101,108,101,115,115,32,102,105,108,101, - 32,105,109,112,111,114,116,115,46,99,2,0,0,0,0,0, - 0,0,0,0,0,0,5,0,0,0,5,0,0,0,67,0, - 0,0,115,68,0,0,0,124,0,160,0,124,1,161,1,125, - 2,124,0,160,1,124,2,161,1,125,3,124,1,124,2,100, - 1,156,2,125,4,116,2,124,3,124,1,124,4,131,3,1, - 0,116,3,116,4,124,3,131,1,100,2,100,0,133,2,25, - 0,124,1,124,2,100,3,141,3,83,0,41,4,78,114,183, - 0,0,0,114,169,0,0,0,41,2,114,141,0,0,0,114, - 132,0,0,0,41,5,114,203,0,0,0,114,255,0,0,0, - 114,176,0,0,0,114,189,0,0,0,114,7,1,0,0,41, - 5,114,143,0,0,0,114,163,0,0,0,114,65,0,0,0, - 114,41,0,0,0,114,175,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,241,0,0,0,110,4, - 0,0,115,22,0,0,0,10,1,10,1,2,4,2,1,6, - 254,12,4,2,1,14,1,2,1,2,1,6,253,122,29,83, - 111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,97, - 100,101,114,46,103,101,116,95,99,111,100,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,114,23,0,0,0,41,2,122,39,82,101, - 116,117,114,110,32,78,111,110,101,32,97,115,32,116,104,101, - 114,101,32,105,115,32,110,111,32,115,111,117,114,99,101,32, - 99,111,100,101,46,78,114,7,0,0,0,114,247,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 1,1,0,0,126,4,0,0,114,24,0,0,0,122,31,83, - 111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,97, - 100,101,114,46,103,101,116,95,115,111,117,114,99,101,78,41, - 6,114,150,0,0,0,114,149,0,0,0,114,151,0,0,0, - 114,152,0,0,0,114,241,0,0,0,114,1,1,0,0,114, - 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,41,1,0,0,106,4,0,0,115,8,0,0, - 0,8,0,4,2,8,2,12,16,114,41,1,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,64,0,0,0,115,92,0,0,0,101,0,90,1, - 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, - 100,4,100,5,132,0,90,5,100,6,100,7,132,0,90,6, - 100,8,100,9,132,0,90,7,100,10,100,11,132,0,90,8, - 100,12,100,13,132,0,90,9,100,14,100,15,132,0,90,10, - 100,16,100,17,132,0,90,11,101,12,100,18,100,19,132,0, - 131,1,90,13,100,20,83,0,41,21,114,30,1,0,0,122, - 93,76,111,97,100,101,114,32,102,111,114,32,101,120,116,101, - 110,115,105,111,110,32,109,111,100,117,108,101,115,46,10,10, - 32,32,32,32,84,104,101,32,99,111,110,115,116,114,117,99, - 116,111,114,32,105,115,32,100,101,115,105,103,110,101,100,32, - 116,111,32,119,111,114,107,32,119,105,116,104,32,70,105,108, - 101,70,105,110,100,101,114,46,10,10,32,32,32,32,99,3, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2, - 0,0,0,67,0,0,0,115,16,0,0,0,124,1,124,0, - 95,0,124,2,124,0,95,1,100,0,83,0,114,69,0,0, - 0,114,183,0,0,0,41,3,114,143,0,0,0,114,141,0, - 0,0,114,65,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,236,0,0,0,139,4,0,0,115, - 4,0,0,0,6,1,10,1,122,28,69,120,116,101,110,115, - 105,111,110,70,105,108,101,76,111,97,100,101,114,46,95,95, - 105,110,105,116,95,95,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,114, - 12,1,0,0,114,69,0,0,0,114,13,1,0,0,114,15, - 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,16,1,0,0,143,4,0,0,114,17,1,0,0, - 122,26,69,120,116,101,110,115,105,111,110,70,105,108,101,76, - 111,97,100,101,114,46,95,95,101,113,95,95,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, - 0,67,0,0,0,114,18,1,0,0,114,69,0,0,0,114, - 19,1,0,0,114,21,1,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,22,1,0,0,147,4,0, - 0,114,23,1,0,0,122,28,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,95,95,104,97, - 115,104,95,95,99,2,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,5,0,0,0,67,0,0,0,115,36,0, - 0,0,116,0,160,1,116,2,106,3,124,1,161,2,125,2, - 116,0,160,4,100,1,124,1,106,5,124,0,106,6,161,3, - 1,0,124,2,83,0,41,2,122,38,67,114,101,97,116,101, - 32,97,110,32,117,110,105,116,105,97,108,105,122,101,100,32, - 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 122,38,101,120,116,101,110,115,105,111,110,32,109,111,100,117, - 108,101,32,123,33,114,125,32,108,111,97,100,101,100,32,102, - 114,111,109,32,123,33,114,125,41,7,114,159,0,0,0,114, - 242,0,0,0,114,187,0,0,0,90,14,99,114,101,97,116, - 101,95,100,121,110,97,109,105,99,114,173,0,0,0,114,141, - 0,0,0,114,65,0,0,0,41,3,114,143,0,0,0,114, - 210,0,0,0,114,244,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,239,0,0,0,150,4,0, - 0,115,14,0,0,0,4,2,6,1,4,255,6,2,8,1, - 4,255,4,2,122,33,69,120,116,101,110,115,105,111,110,70, - 105,108,101,76,111,97,100,101,114,46,99,114,101,97,116,101, - 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,5,0,0,0,67,0,0,0, - 115,36,0,0,0,116,0,160,1,116,2,106,3,124,1,161, - 2,1,0,116,0,160,4,100,1,124,0,106,5,124,0,106, - 6,161,3,1,0,100,2,83,0,41,3,122,30,73,110,105, - 116,105,97,108,105,122,101,32,97,110,32,101,120,116,101,110, - 115,105,111,110,32,109,111,100,117,108,101,122,40,101,120,116, - 101,110,115,105,111,110,32,109,111,100,117,108,101,32,123,33, - 114,125,32,101,120,101,99,117,116,101,100,32,102,114,111,109, - 32,123,33,114,125,78,41,7,114,159,0,0,0,114,242,0, - 0,0,114,187,0,0,0,90,12,101,120,101,99,95,100,121, - 110,97,109,105,99,114,173,0,0,0,114,141,0,0,0,114, - 65,0,0,0,169,2,114,143,0,0,0,114,244,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 245,0,0,0,158,4,0,0,115,8,0,0,0,14,2,6, - 1,8,1,8,255,122,31,69,120,116,101,110,115,105,111,110, - 70,105,108,101,76,111,97,100,101,114,46,101,120,101,99,95, - 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,4,0,0,0,3,0,0,0,115, - 36,0,0,0,116,0,124,0,106,1,131,1,100,1,25,0, - 137,0,116,2,135,0,102,1,100,2,100,3,132,8,116,3, - 68,0,131,1,131,1,83,0,41,4,122,49,82,101,116,117, - 114,110,32,84,114,117,101,32,105,102,32,116,104,101,32,101, - 120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,32, - 105,115,32,97,32,112,97,99,107,97,103,101,46,114,3,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,4,0,0,0,51,0,0,0,115,28,0,0,0, - 129,0,124,0,93,9,125,1,136,0,100,0,124,1,23,0, - 107,2,86,0,1,0,113,2,100,1,83,0,41,2,114,236, - 0,0,0,78,114,7,0,0,0,169,2,114,5,0,0,0, - 218,6,115,117,102,102,105,120,169,1,90,9,102,105,108,101, - 95,110,97,109,101,114,7,0,0,0,114,8,0,0,0,114, - 9,0,0,0,167,4,0,0,115,8,0,0,0,2,128,4, - 0,2,1,20,255,122,49,69,120,116,101,110,115,105,111,110, - 70,105,108,101,76,111,97,100,101,114,46,105,115,95,112,97, - 99,107,97,103,101,46,60,108,111,99,97,108,115,62,46,60, - 103,101,110,101,120,112,114,62,41,4,114,74,0,0,0,114, - 65,0,0,0,218,3,97,110,121,114,232,0,0,0,114,247, - 0,0,0,114,7,0,0,0,114,45,1,0,0,114,8,0, - 0,0,114,206,0,0,0,164,4,0,0,115,8,0,0,0, - 14,2,12,1,2,1,8,255,122,30,69,120,116,101,110,115, - 105,111,110,70,105,108,101,76,111,97,100,101,114,46,105,115, + 0,0,67,0,0,0,115,80,0,0,0,116,0,116,1,131, + 1,125,3,100,1,124,2,100,1,62,0,66,0,125,4,124, + 3,160,2,116,3,124,4,131,1,161,1,1,0,116,4,124, + 1,131,1,100,2,107,2,115,25,74,0,130,1,124,3,160, + 2,124,1,161,1,1,0,124,3,160,2,116,5,160,6,124, + 0,161,1,161,1,1,0,124,3,83,0,41,3,122,38,80, + 114,111,100,117,99,101,32,116,104,101,32,100,97,116,97,32, + 102,111,114,32,97,32,104,97,115,104,45,98,97,115,101,100, + 32,112,121,99,46,114,5,0,0,0,114,171,0,0,0,41, + 7,114,191,0,0,0,114,173,0,0,0,114,192,0,0,0, + 114,38,0,0,0,114,6,0,0,0,114,185,0,0,0,114, + 193,0,0,0,41,5,114,189,0,0,0,114,182,0,0,0, + 90,7,99,104,101,99,107,101,100,114,43,0,0,0,114,17, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,218,17,95,99,111,100,101,95,116,111,95,104,97,115, + 104,95,112,121,99,185,2,0,0,115,14,0,0,0,8,2, + 12,1,14,1,16,1,10,1,16,1,4,1,114,196,0,0, + 0,99,1,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,6,0,0,0,67,0,0,0,115,62,0,0,0,100, + 1,100,2,108,0,125,1,116,1,160,2,124,0,161,1,106, + 3,125,2,124,1,160,4,124,2,161,1,125,3,116,1,160, + 5,100,2,100,3,161,2,125,4,124,4,160,6,124,0,160, + 6,124,3,100,1,25,0,161,1,161,1,83,0,41,4,122, + 121,68,101,99,111,100,101,32,98,121,116,101,115,32,114,101, + 112,114,101,115,101,110,116,105,110,103,32,115,111,117,114,99, + 101,32,99,111,100,101,32,97,110,100,32,114,101,116,117,114, + 110,32,116,104,101,32,115,116,114,105,110,103,46,10,10,32, + 32,32,32,85,110,105,118,101,114,115,97,108,32,110,101,119, + 108,105,110,101,32,115,117,112,112,111,114,116,32,105,115,32, + 117,115,101,100,32,105,110,32,116,104,101,32,100,101,99,111, + 100,105,110,103,46,10,32,32,32,32,114,0,0,0,0,78, + 84,41,7,218,8,116,111,107,101,110,105,122,101,114,93,0, + 0,0,90,7,66,121,116,101,115,73,79,90,8,114,101,97, + 100,108,105,110,101,90,15,100,101,116,101,99,116,95,101,110, + 99,111,100,105,110,103,90,25,73,110,99,114,101,109,101,110, + 116,97,108,78,101,119,108,105,110,101,68,101,99,111,100,101, + 114,218,6,100,101,99,111,100,101,41,5,218,12,115,111,117, + 114,99,101,95,98,121,116,101,115,114,197,0,0,0,90,21, + 115,111,117,114,99,101,95,98,121,116,101,115,95,114,101,97, + 100,108,105,110,101,218,8,101,110,99,111,100,105,110,103,90, + 15,110,101,119,108,105,110,101,95,100,101,99,111,100,101,114, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, + 13,100,101,99,111,100,101,95,115,111,117,114,99,101,196,2, + 0,0,115,10,0,0,0,8,5,12,1,10,1,12,1,20, + 1,114,201,0,0,0,169,2,114,165,0,0,0,218,26,115, + 117,98,109,111,100,117,108,101,95,115,101,97,114,99,104,95, + 108,111,99,97,116,105,111,110,115,99,2,0,0,0,0,0, + 0,0,2,0,0,0,9,0,0,0,8,0,0,0,67,0, + 0,0,115,54,1,0,0,124,1,100,1,117,0,114,29,100, + 2,125,1,116,0,124,2,100,3,131,2,114,28,122,7,124, + 2,160,1,124,0,161,1,125,1,87,0,110,38,4,0,116, + 2,121,27,1,0,1,0,1,0,89,0,110,30,119,0,110, + 28,116,3,160,4,124,1,161,1,125,1,116,5,124,1,131, + 1,115,57,122,9,116,6,116,3,160,7,161,0,124,1,131, + 2,125,1,87,0,110,9,4,0,116,8,121,56,1,0,1, + 0,1,0,89,0,110,1,119,0,116,9,106,10,124,0,124, + 2,124,1,100,4,141,3,125,4,100,5,124,4,95,11,124, + 2,100,1,117,0,114,99,116,12,131,0,68,0,93,21,92, + 2,125,5,125,6,124,1,160,13,116,14,124,6,131,1,161, + 1,114,96,124,5,124,0,124,1,131,2,125,2,124,2,124, + 4,95,15,1,0,110,3,113,75,100,1,83,0,124,3,116, + 16,117,0,114,131,116,0,124,2,100,6,131,2,114,130,122, + 7,124,2,160,17,124,0,161,1,125,7,87,0,110,9,4, + 0,116,2,121,124,1,0,1,0,1,0,89,0,110,10,119, + 0,124,7,114,130,103,0,124,4,95,18,110,3,124,3,124, + 4,95,18,124,4,106,18,103,0,107,2,114,153,124,1,114, + 153,116,19,124,1,131,1,100,7,25,0,125,8,124,4,106, + 18,160,20,124,8,161,1,1,0,124,4,83,0,41,8,97, + 61,1,0,0,82,101,116,117,114,110,32,97,32,109,111,100, + 117,108,101,32,115,112,101,99,32,98,97,115,101,100,32,111, + 110,32,97,32,102,105,108,101,32,108,111,99,97,116,105,111, + 110,46,10,10,32,32,32,32,84,111,32,105,110,100,105,99, + 97,116,101,32,116,104,97,116,32,116,104,101,32,109,111,100, + 117,108,101,32,105,115,32,97,32,112,97,99,107,97,103,101, + 44,32,115,101,116,10,32,32,32,32,115,117,98,109,111,100, + 117,108,101,95,115,101,97,114,99,104,95,108,111,99,97,116, + 105,111,110,115,32,116,111,32,97,32,108,105,115,116,32,111, + 102,32,100,105,114,101,99,116,111,114,121,32,112,97,116,104, + 115,46,32,32,65,110,10,32,32,32,32,101,109,112,116,121, + 32,108,105,115,116,32,105,115,32,115,117,102,102,105,99,105, + 101,110,116,44,32,116,104,111,117,103,104,32,105,116,115,32, + 110,111,116,32,111,116,104,101,114,119,105,115,101,32,117,115, + 101,102,117,108,32,116,111,32,116,104,101,10,32,32,32,32, + 105,109,112,111,114,116,32,115,121,115,116,101,109,46,10,10, + 32,32,32,32,84,104,101,32,108,111,97,100,101,114,32,109, + 117,115,116,32,116,97,107,101,32,97,32,115,112,101,99,32, + 97,115,32,105,116,115,32,111,110,108,121,32,95,95,105,110, + 105,116,95,95,40,41,32,97,114,103,46,10,10,32,32,32, + 32,78,122,9,60,117,110,107,110,111,119,110,62,218,12,103, + 101,116,95,102,105,108,101,110,97,109,101,169,1,218,6,111, + 114,105,103,105,110,84,218,10,105,115,95,112,97,99,107,97, + 103,101,114,0,0,0,0,41,21,114,154,0,0,0,114,204, + 0,0,0,114,143,0,0,0,114,19,0,0,0,114,105,0, + 0,0,114,88,0,0,0,114,69,0,0,0,114,84,0,0, + 0,114,78,0,0,0,114,160,0,0,0,218,10,77,111,100, + 117,108,101,83,112,101,99,90,13,95,115,101,116,95,102,105, + 108,101,97,116,116,114,218,27,95,103,101,116,95,115,117,112, + 112,111,114,116,101,100,95,102,105,108,101,95,108,111,97,100, + 101,114,115,114,60,0,0,0,114,137,0,0,0,114,165,0, + 0,0,218,9,95,80,79,80,85,76,65,84,69,114,207,0, + 0,0,114,203,0,0,0,114,76,0,0,0,114,63,0,0, + 0,41,9,114,142,0,0,0,90,8,108,111,99,97,116,105, + 111,110,114,165,0,0,0,114,203,0,0,0,218,4,115,112, + 101,99,218,12,108,111,97,100,101,114,95,99,108,97,115,115, + 218,8,115,117,102,102,105,120,101,115,114,207,0,0,0,90, + 7,100,105,114,110,97,109,101,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,23,115,112,101,99,95,102,114, + 111,109,95,102,105,108,101,95,108,111,99,97,116,105,111,110, + 213,2,0,0,115,84,0,0,0,8,12,4,4,10,1,2, + 2,14,1,12,1,4,1,2,255,2,252,10,7,8,1,2, + 1,18,1,12,1,4,1,2,255,16,9,6,1,8,3,14, + 1,14,1,10,1,6,1,4,1,2,253,4,5,8,3,10, + 2,2,1,14,1,12,1,4,1,2,255,4,3,6,1,2, + 128,6,2,10,1,4,1,12,1,12,1,4,2,114,214,0, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,64,0,0,0,115,88,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,100,2,90,4, + 100,3,90,5,101,6,111,15,100,4,101,7,118,0,90,8, + 101,9,100,5,100,6,132,0,131,1,90,10,101,11,100,7, + 100,8,132,0,131,1,90,12,101,11,100,14,100,10,100,11, + 132,1,131,1,90,13,101,11,100,15,100,12,100,13,132,1, + 131,1,90,14,100,9,83,0,41,16,218,21,87,105,110,100, + 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101, + 114,122,62,77,101,116,97,32,112,97,116,104,32,102,105,110, + 100,101,114,32,102,111,114,32,109,111,100,117,108,101,115,32, + 100,101,99,108,97,114,101,100,32,105,110,32,116,104,101,32, + 87,105,110,100,111,119,115,32,114,101,103,105,115,116,114,121, + 46,122,59,83,111,102,116,119,97,114,101,92,80,121,116,104, + 111,110,92,80,121,116,104,111,110,67,111,114,101,92,123,115, + 121,115,95,118,101,114,115,105,111,110,125,92,77,111,100,117, + 108,101,115,92,123,102,117,108,108,110,97,109,101,125,122,65, + 83,111,102,116,119,97,114,101,92,80,121,116,104,111,110,92, + 80,121,116,104,111,110,67,111,114,101,92,123,115,121,115,95, + 118,101,114,115,105,111,110,125,92,77,111,100,117,108,101,115, + 92,123,102,117,108,108,110,97,109,101,125,92,68,101,98,117, + 103,122,6,95,100,46,112,121,100,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,8,0,0,0,67,0, + 0,0,115,50,0,0,0,122,8,116,0,160,1,116,0,106, + 2,124,0,161,2,87,0,83,0,4,0,116,3,121,24,1, + 0,1,0,1,0,116,0,160,1,116,0,106,4,124,0,161, + 2,6,0,89,0,83,0,119,0,114,71,0,0,0,41,5, + 218,6,119,105,110,114,101,103,90,7,79,112,101,110,75,101, + 121,90,17,72,75,69,89,95,67,85,82,82,69,78,84,95, + 85,83,69,82,114,78,0,0,0,90,18,72,75,69,89,95, + 76,79,67,65,76,95,77,65,67,72,73,78,69,114,21,0, + 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,218,14,95,111,112,101,110,95,114,101,103,105,115,116,114, + 121,42,3,0,0,115,10,0,0,0,2,2,16,1,12,1, + 18,1,2,255,122,36,87,105,110,100,111,119,115,82,101,103, + 105,115,116,114,121,70,105,110,100,101,114,46,95,111,112,101, + 110,95,114,101,103,105,115,116,114,121,99,2,0,0,0,0, + 0,0,0,0,0,0,0,6,0,0,0,8,0,0,0,67, + 0,0,0,115,134,0,0,0,124,0,106,0,114,7,124,0, + 106,1,125,2,110,3,124,0,106,2,125,2,124,2,106,3, + 124,1,100,1,116,4,106,5,100,0,100,2,133,2,25,0, + 22,0,100,3,141,2,125,3,122,32,124,0,160,6,124,3, + 161,1,143,16,125,4,116,7,160,8,124,4,100,4,161,2, + 125,5,87,0,100,0,4,0,4,0,131,3,1,0,87,0, + 124,5,83,0,49,0,115,49,119,1,1,0,1,0,1,0, + 89,0,1,0,87,0,124,5,83,0,4,0,116,9,121,66, + 1,0,1,0,1,0,89,0,100,0,83,0,119,0,41,5, + 78,122,5,37,100,46,37,100,114,46,0,0,0,41,2,114, + 164,0,0,0,90,11,115,121,115,95,118,101,114,115,105,111, + 110,114,3,0,0,0,41,10,218,11,68,69,66,85,71,95, + 66,85,73,76,68,218,18,82,69,71,73,83,84,82,89,95, + 75,69,89,95,68,69,66,85,71,218,12,82,69,71,73,83, + 84,82,89,95,75,69,89,114,91,0,0,0,114,16,0,0, + 0,218,12,118,101,114,115,105,111,110,95,105,110,102,111,114, + 217,0,0,0,114,216,0,0,0,90,10,81,117,101,114,121, + 86,97,108,117,101,114,78,0,0,0,41,6,218,3,99,108, + 115,114,164,0,0,0,90,12,114,101,103,105,115,116,114,121, + 95,107,101,121,114,22,0,0,0,90,4,104,107,101,121,218, + 8,102,105,108,101,112,97,116,104,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,218,16,95,115,101,97,114,99, + 104,95,114,101,103,105,115,116,114,121,49,3,0,0,115,32, + 0,0,0,6,2,8,1,6,2,6,1,16,1,6,255,2, + 2,12,1,14,1,12,255,4,4,18,252,4,4,12,254,6, + 1,2,255,122,38,87,105,110,100,111,119,115,82,101,103,105, + 115,116,114,121,70,105,110,100,101,114,46,95,115,101,97,114, + 99,104,95,114,101,103,105,115,116,114,121,78,99,4,0,0, + 0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0, + 0,67,0,0,0,115,120,0,0,0,124,0,160,0,124,1, + 161,1,125,4,124,4,100,0,117,0,114,11,100,0,83,0, + 122,6,116,1,124,4,131,1,1,0,87,0,110,10,4,0, + 116,2,121,27,1,0,1,0,1,0,89,0,100,0,83,0, + 119,0,116,3,131,0,68,0,93,26,92,2,125,5,125,6, + 124,4,160,4,116,5,124,6,131,1,161,1,114,57,116,6, + 106,7,124,1,124,5,124,1,124,4,131,2,124,4,100,1, + 141,3,125,7,124,7,2,0,1,0,83,0,113,31,100,0, + 83,0,41,2,78,114,205,0,0,0,41,8,114,224,0,0, + 0,114,77,0,0,0,114,78,0,0,0,114,209,0,0,0, + 114,60,0,0,0,114,137,0,0,0,114,160,0,0,0,218, + 16,115,112,101,99,95,102,114,111,109,95,108,111,97,100,101, + 114,41,8,114,222,0,0,0,114,164,0,0,0,114,67,0, + 0,0,218,6,116,97,114,103,101,116,114,223,0,0,0,114, + 165,0,0,0,114,213,0,0,0,114,211,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,9,102, + 105,110,100,95,115,112,101,99,64,3,0,0,115,34,0,0, + 0,10,2,8,1,4,1,2,1,12,1,12,1,6,1,2, + 255,14,2,14,1,6,1,8,1,2,1,6,254,8,3,2, + 252,4,255,122,31,87,105,110,100,111,119,115,82,101,103,105, + 115,116,114,121,70,105,110,100,101,114,46,102,105,110,100,95, + 115,112,101,99,99,3,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,4,0,0,0,67,0,0,0,115,42,0, + 0,0,116,0,160,1,100,1,116,2,161,2,1,0,124,0, + 160,3,124,1,124,2,161,2,125,3,124,3,100,2,117,1, + 114,19,124,3,106,4,83,0,100,2,83,0,41,3,122,106, + 70,105,110,100,32,109,111,100,117,108,101,32,110,97,109,101, + 100,32,105,110,32,116,104,101,32,114,101,103,105,115,116,114, + 121,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115, + 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, + 99,97,116,101,100,46,32,32,85,115,101,32,102,105,110,100, + 95,115,112,101,99,40,41,32,105,110,115,116,101,97,100,46, + 10,10,32,32,32,32,32,32,32,32,122,112,87,105,110,100, + 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101, + 114,46,102,105,110,100,95,109,111,100,117,108,101,40,41,32, + 105,115,32,100,101,112,114,101,99,97,116,101,100,32,97,110, + 100,32,115,108,97,116,101,100,32,102,111,114,32,114,101,109, + 111,118,97,108,32,105,110,32,80,121,116,104,111,110,32,51, + 46,49,50,59,32,117,115,101,32,102,105,110,100,95,115,112, + 101,99,40,41,32,105,110,115,116,101,97,100,78,169,5,114, + 101,0,0,0,114,102,0,0,0,114,103,0,0,0,114,227, + 0,0,0,114,165,0,0,0,169,4,114,222,0,0,0,114, + 164,0,0,0,114,67,0,0,0,114,211,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,11,102, + 105,110,100,95,109,111,100,117,108,101,80,3,0,0,115,14, + 0,0,0,6,7,2,2,4,254,12,3,8,1,6,1,4, + 2,122,33,87,105,110,100,111,119,115,82,101,103,105,115,116, + 114,121,70,105,110,100,101,114,46,102,105,110,100,95,109,111, + 100,117,108,101,169,2,78,78,114,71,0,0,0,41,15,114, + 151,0,0,0,114,150,0,0,0,114,152,0,0,0,114,153, + 0,0,0,114,220,0,0,0,114,219,0,0,0,218,11,95, + 77,83,95,87,73,78,68,79,87,83,218,18,69,88,84,69, + 78,83,73,79,78,95,83,85,70,70,73,88,69,83,114,218, + 0,0,0,218,12,115,116,97,116,105,99,109,101,116,104,111, + 100,114,217,0,0,0,218,11,99,108,97,115,115,109,101,116, + 104,111,100,114,224,0,0,0,114,227,0,0,0,114,230,0, + 0,0,114,9,0,0,0,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,114,215,0,0,0,30,3,0,0,115, + 30,0,0,0,8,0,4,2,2,3,2,255,2,4,2,255, + 12,3,2,2,10,1,2,6,10,1,2,14,12,1,2,15, + 16,1,114,215,0,0,0,99,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,64,0,0,0, + 115,48,0,0,0,101,0,90,1,100,0,90,2,100,1,90, + 3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,90, + 5,100,6,100,7,132,0,90,6,100,8,100,9,132,0,90, + 7,100,10,83,0,41,11,218,13,95,76,111,97,100,101,114, + 66,97,115,105,99,115,122,83,66,97,115,101,32,99,108,97, + 115,115,32,111,102,32,99,111,109,109,111,110,32,99,111,100, + 101,32,110,101,101,100,101,100,32,98,121,32,98,111,116,104, + 32,83,111,117,114,99,101,76,111,97,100,101,114,32,97,110, + 100,10,32,32,32,32,83,111,117,114,99,101,108,101,115,115, + 70,105,108,101,76,111,97,100,101,114,46,99,2,0,0,0, + 0,0,0,0,0,0,0,0,5,0,0,0,4,0,0,0, + 67,0,0,0,115,64,0,0,0,116,0,124,0,160,1,124, + 1,161,1,131,1,100,1,25,0,125,2,124,2,160,2,100, + 2,100,1,161,2,100,3,25,0,125,3,124,1,160,3,100, + 2,161,1,100,4,25,0,125,4,124,3,100,5,107,2,111, + 31,124,4,100,5,107,3,83,0,41,6,122,141,67,111,110, + 99,114,101,116,101,32,105,109,112,108,101,109,101,110,116,97, + 116,105,111,110,32,111,102,32,73,110,115,112,101,99,116,76, + 111,97,100,101,114,46,105,115,95,112,97,99,107,97,103,101, + 32,98,121,32,99,104,101,99,107,105,110,103,32,105,102,10, + 32,32,32,32,32,32,32,32,116,104,101,32,112,97,116,104, + 32,114,101,116,117,114,110,101,100,32,98,121,32,103,101,116, + 95,102,105,108,101,110,97,109,101,32,104,97,115,32,97,32, + 102,105,108,101,110,97,109,101,32,111,102,32,39,95,95,105, + 110,105,116,95,95,46,112,121,39,46,114,5,0,0,0,114, + 99,0,0,0,114,0,0,0,0,114,46,0,0,0,218,8, + 95,95,105,110,105,116,95,95,41,4,114,76,0,0,0,114, + 204,0,0,0,114,127,0,0,0,114,106,0,0,0,41,5, + 114,144,0,0,0,114,164,0,0,0,114,122,0,0,0,90, + 13,102,105,108,101,110,97,109,101,95,98,97,115,101,90,9, + 116,97,105,108,95,110,97,109,101,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,114,207,0,0,0,102,3,0, + 0,115,8,0,0,0,18,3,16,1,14,1,16,1,122,24, + 95,76,111,97,100,101,114,66,97,115,105,99,115,46,105,115, 95,112,97,99,107,97,103,101,99,2,0,0,0,0,0,0, 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,114,23,0,0,0,41,2,122,63,82,101,116,117,114,110, - 32,78,111,110,101,32,97,115,32,97,110,32,101,120,116,101, - 110,115,105,111,110,32,109,111,100,117,108,101,32,99,97,110, - 110,111,116,32,99,114,101,97,116,101,32,97,32,99,111,100, - 101,32,111,98,106,101,99,116,46,78,114,7,0,0,0,114, - 247,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,241,0,0,0,170,4,0,0,114,24,0,0, - 0,122,28,69,120,116,101,110,115,105,111,110,70,105,108,101, - 76,111,97,100,101,114,46,103,101,116,95,99,111,100,101,99, + 0,114,25,0,0,0,169,2,122,42,85,115,101,32,100,101, + 102,97,117,108,116,32,115,101,109,97,110,116,105,99,115,32, + 102,111,114,32,109,111,100,117,108,101,32,99,114,101,97,116, + 105,111,110,46,78,114,9,0,0,0,169,2,114,144,0,0, + 0,114,211,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,13,99,114,101,97,116,101,95,109,111, + 100,117,108,101,110,3,0,0,243,2,0,0,0,4,0,122, + 27,95,76,111,97,100,101,114,66,97,115,105,99,115,46,99, + 114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,5,0,0, + 0,67,0,0,0,115,56,0,0,0,124,0,160,0,124,1, + 106,1,161,1,125,2,124,2,100,1,117,0,114,18,116,2, + 100,2,160,3,124,1,106,1,161,1,131,1,130,1,116,4, + 160,5,116,6,124,2,124,1,106,7,161,3,1,0,100,1, + 83,0,41,3,122,19,69,120,101,99,117,116,101,32,116,104, + 101,32,109,111,100,117,108,101,46,78,122,52,99,97,110,110, + 111,116,32,108,111,97,100,32,109,111,100,117,108,101,32,123, + 33,114,125,32,119,104,101,110,32,103,101,116,95,99,111,100, + 101,40,41,32,114,101,116,117,114,110,115,32,78,111,110,101, + 41,8,218,8,103,101,116,95,99,111,100,101,114,151,0,0, + 0,114,143,0,0,0,114,91,0,0,0,114,160,0,0,0, + 218,25,95,99,97,108,108,95,119,105,116,104,95,102,114,97, + 109,101,115,95,114,101,109,111,118,101,100,218,4,101,120,101, + 99,114,157,0,0,0,41,3,114,144,0,0,0,218,6,109, + 111,100,117,108,101,114,189,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,218,11,101,120,101,99,95, + 109,111,100,117,108,101,113,3,0,0,115,12,0,0,0,12, + 2,8,1,4,1,8,1,4,255,20,2,122,25,95,76,111, + 97,100,101,114,66,97,115,105,99,115,46,101,120,101,99,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, + 12,0,0,0,116,0,160,1,124,0,124,1,161,2,83,0, + 41,1,122,26,84,104,105,115,32,109,101,116,104,111,100,32, + 105,115,32,100,101,112,114,101,99,97,116,101,100,46,41,2, + 114,160,0,0,0,218,17,95,108,111,97,100,95,109,111,100, + 117,108,101,95,115,104,105,109,169,2,114,144,0,0,0,114, + 164,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,11,108,111,97,100,95,109,111,100,117,108,101, + 121,3,0,0,115,2,0,0,0,12,3,122,25,95,76,111, + 97,100,101,114,66,97,115,105,99,115,46,108,111,97,100,95, + 109,111,100,117,108,101,78,41,8,114,151,0,0,0,114,150, + 0,0,0,114,152,0,0,0,114,153,0,0,0,114,207,0, + 0,0,114,240,0,0,0,114,246,0,0,0,114,249,0,0, + 0,114,9,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,114,236,0,0,0,97,3,0,0,115,12, + 0,0,0,8,0,4,2,8,3,8,8,8,3,12,8,114, + 236,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,64,0,0,0,115,74,0, + 0,0,101,0,90,1,100,0,90,2,100,1,100,2,132,0, + 90,3,100,3,100,4,132,0,90,4,100,5,100,6,132,0, + 90,5,100,7,100,8,132,0,90,6,100,9,100,10,132,0, + 90,7,100,11,100,12,156,1,100,13,100,14,132,2,90,8, + 100,15,100,16,132,0,90,9,100,17,83,0,41,18,218,12, + 83,111,117,114,99,101,76,111,97,100,101,114,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, + 0,67,0,0,0,115,4,0,0,0,116,0,130,1,41,1, + 122,165,79,112,116,105,111,110,97,108,32,109,101,116,104,111, + 100,32,116,104,97,116,32,114,101,116,117,114,110,115,32,116, + 104,101,32,109,111,100,105,102,105,99,97,116,105,111,110,32, + 116,105,109,101,32,40,97,110,32,105,110,116,41,32,102,111, + 114,32,116,104,101,10,32,32,32,32,32,32,32,32,115,112, + 101,99,105,102,105,101,100,32,112,97,116,104,32,40,97,32, + 115,116,114,41,46,10,10,32,32,32,32,32,32,32,32,82, + 97,105,115,101,115,32,79,83,69,114,114,111,114,32,119,104, + 101,110,32,116,104,101,32,112,97,116,104,32,99,97,110,110, + 111,116,32,98,101,32,104,97,110,100,108,101,100,46,10,32, + 32,32,32,32,32,32,32,41,1,114,78,0,0,0,169,2, + 114,144,0,0,0,114,67,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,218,10,112,97,116,104,95, + 109,116,105,109,101,129,3,0,0,115,2,0,0,0,4,6, + 122,23,83,111,117,114,99,101,76,111,97,100,101,114,46,112, + 97,116,104,95,109,116,105,109,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,4,0,0,0,67,0, + 0,0,115,14,0,0,0,100,1,124,0,160,0,124,1,161, + 1,105,1,83,0,41,2,97,158,1,0,0,79,112,116,105, + 111,110,97,108,32,109,101,116,104,111,100,32,114,101,116,117, + 114,110,105,110,103,32,97,32,109,101,116,97,100,97,116,97, + 32,100,105,99,116,32,102,111,114,32,116,104,101,32,115,112, + 101,99,105,102,105,101,100,10,32,32,32,32,32,32,32,32, + 112,97,116,104,32,40,97,32,115,116,114,41,46,10,10,32, + 32,32,32,32,32,32,32,80,111,115,115,105,98,108,101,32, + 107,101,121,115,58,10,32,32,32,32,32,32,32,32,45,32, + 39,109,116,105,109,101,39,32,40,109,97,110,100,97,116,111, + 114,121,41,32,105,115,32,116,104,101,32,110,117,109,101,114, + 105,99,32,116,105,109,101,115,116,97,109,112,32,111,102,32, + 108,97,115,116,32,115,111,117,114,99,101,10,32,32,32,32, + 32,32,32,32,32,32,99,111,100,101,32,109,111,100,105,102, + 105,99,97,116,105,111,110,59,10,32,32,32,32,32,32,32, + 32,45,32,39,115,105,122,101,39,32,40,111,112,116,105,111, + 110,97,108,41,32,105,115,32,116,104,101,32,115,105,122,101, + 32,105,110,32,98,121,116,101,115,32,111,102,32,116,104,101, + 32,115,111,117,114,99,101,32,99,111,100,101,46,10,10,32, + 32,32,32,32,32,32,32,73,109,112,108,101,109,101,110,116, + 105,110,103,32,116,104,105,115,32,109,101,116,104,111,100,32, + 97,108,108,111,119,115,32,116,104,101,32,108,111,97,100,101, + 114,32,116,111,32,114,101,97,100,32,98,121,116,101,99,111, + 100,101,32,102,105,108,101,115,46,10,32,32,32,32,32,32, + 32,32,82,97,105,115,101,115,32,79,83,69,114,114,111,114, + 32,119,104,101,110,32,116,104,101,32,112,97,116,104,32,99, + 97,110,110,111,116,32,98,101,32,104,97,110,100,108,101,100, + 46,10,32,32,32,32,32,32,32,32,114,194,0,0,0,41, + 1,114,252,0,0,0,114,251,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,10,112,97,116,104, + 95,115,116,97,116,115,137,3,0,0,115,2,0,0,0,14, + 12,122,23,83,111,117,114,99,101,76,111,97,100,101,114,46, + 112,97,116,104,95,115,116,97,116,115,99,4,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, + 0,0,0,115,12,0,0,0,124,0,160,0,124,2,124,3, + 161,2,83,0,41,1,122,228,79,112,116,105,111,110,97,108, + 32,109,101,116,104,111,100,32,119,104,105,99,104,32,119,114, + 105,116,101,115,32,100,97,116,97,32,40,98,121,116,101,115, + 41,32,116,111,32,97,32,102,105,108,101,32,112,97,116,104, + 32,40,97,32,115,116,114,41,46,10,10,32,32,32,32,32, + 32,32,32,73,109,112,108,101,109,101,110,116,105,110,103,32, + 116,104,105,115,32,109,101,116,104,111,100,32,97,108,108,111, + 119,115,32,102,111,114,32,116,104,101,32,119,114,105,116,105, + 110,103,32,111,102,32,98,121,116,101,99,111,100,101,32,102, + 105,108,101,115,46,10,10,32,32,32,32,32,32,32,32,84, + 104,101,32,115,111,117,114,99,101,32,112,97,116,104,32,105, + 115,32,110,101,101,100,101,100,32,105,110,32,111,114,100,101, + 114,32,116,111,32,99,111,114,114,101,99,116,108,121,32,116, + 114,97,110,115,102,101,114,32,112,101,114,109,105,115,115,105, + 111,110,115,10,32,32,32,32,32,32,32,32,41,1,218,8, + 115,101,116,95,100,97,116,97,41,4,114,144,0,0,0,114, + 135,0,0,0,90,10,99,97,99,104,101,95,112,97,116,104, + 114,43,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,218,15,95,99,97,99,104,101,95,98,121,116, + 101,99,111,100,101,151,3,0,0,115,2,0,0,0,12,8, + 122,28,83,111,117,114,99,101,76,111,97,100,101,114,46,95, + 99,97,99,104,101,95,98,121,116,101,99,111,100,101,99,3, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,1, + 0,0,0,67,0,0,0,114,25,0,0,0,41,2,122,150, + 79,112,116,105,111,110,97,108,32,109,101,116,104,111,100,32, + 119,104,105,99,104,32,119,114,105,116,101,115,32,100,97,116, + 97,32,40,98,121,116,101,115,41,32,116,111,32,97,32,102, + 105,108,101,32,112,97,116,104,32,40,97,32,115,116,114,41, + 46,10,10,32,32,32,32,32,32,32,32,73,109,112,108,101, + 109,101,110,116,105,110,103,32,116,104,105,115,32,109,101,116, + 104,111,100,32,97,108,108,111,119,115,32,102,111,114,32,116, + 104,101,32,119,114,105,116,105,110,103,32,111,102,32,98,121, + 116,101,99,111,100,101,32,102,105,108,101,115,46,10,32,32, + 32,32,32,32,32,32,78,114,9,0,0,0,41,3,114,144, + 0,0,0,114,67,0,0,0,114,43,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,114,254,0,0, + 0,161,3,0,0,114,241,0,0,0,122,21,83,111,117,114, + 99,101,76,111,97,100,101,114,46,115,101,116,95,100,97,116, + 97,99,2,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,10,0,0,0,67,0,0,0,115,70,0,0,0,124, + 0,160,0,124,1,161,1,125,2,122,10,124,0,160,1,124, + 2,161,1,125,3,87,0,116,4,124,3,131,1,83,0,4, + 0,116,2,121,34,1,0,125,4,1,0,122,7,116,3,100, + 1,124,1,100,2,141,2,124,4,130,2,100,3,125,4,126, + 4,119,1,119,0,41,4,122,52,67,111,110,99,114,101,116, + 101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110, + 32,111,102,32,73,110,115,112,101,99,116,76,111,97,100,101, + 114,46,103,101,116,95,115,111,117,114,99,101,46,122,39,115, + 111,117,114,99,101,32,110,111,116,32,97,118,97,105,108,97, + 98,108,101,32,116,104,114,111,117,103,104,32,103,101,116,95, + 100,97,116,97,40,41,114,141,0,0,0,78,41,5,114,204, + 0,0,0,218,8,103,101,116,95,100,97,116,97,114,78,0, + 0,0,114,143,0,0,0,114,201,0,0,0,41,5,114,144, + 0,0,0,114,164,0,0,0,114,67,0,0,0,114,199,0, + 0,0,218,3,101,120,99,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,218,10,103,101,116,95,115,111,117,114, + 99,101,168,3,0,0,115,24,0,0,0,10,2,2,1,12, + 1,8,4,14,253,4,1,2,1,4,255,2,1,2,255,8, + 128,2,255,122,23,83,111,117,114,99,101,76,111,97,100,101, + 114,46,103,101,116,95,115,111,117,114,99,101,114,4,0,0, + 0,41,1,218,9,95,111,112,116,105,109,105,122,101,99,3, + 0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,8, + 0,0,0,67,0,0,0,115,22,0,0,0,116,0,106,1, + 116,2,124,1,124,2,100,1,100,2,124,3,100,3,141,6, + 83,0,41,4,122,130,82,101,116,117,114,110,32,116,104,101, + 32,99,111,100,101,32,111,98,106,101,99,116,32,99,111,109, + 112,105,108,101,100,32,102,114,111,109,32,115,111,117,114,99, + 101,46,10,10,32,32,32,32,32,32,32,32,84,104,101,32, + 39,100,97,116,97,39,32,97,114,103,117,109,101,110,116,32, + 99,97,110,32,98,101,32,97,110,121,32,111,98,106,101,99, + 116,32,116,121,112,101,32,116,104,97,116,32,99,111,109,112, + 105,108,101,40,41,32,115,117,112,112,111,114,116,115,46,10, + 32,32,32,32,32,32,32,32,114,244,0,0,0,84,41,2, + 218,12,100,111,110,116,95,105,110,104,101,114,105,116,114,110, + 0,0,0,41,3,114,160,0,0,0,114,243,0,0,0,218, + 7,99,111,109,112,105,108,101,41,4,114,144,0,0,0,114, + 43,0,0,0,114,67,0,0,0,114,3,1,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,14,115, + 111,117,114,99,101,95,116,111,95,99,111,100,101,178,3,0, + 0,115,6,0,0,0,12,5,4,1,6,255,122,27,83,111, + 117,114,99,101,76,111,97,100,101,114,46,115,111,117,114,99, + 101,95,116,111,95,99,111,100,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,15,0,0,0,9,0,0,0,67,0, + 0,0,115,2,2,0,0,124,0,160,0,124,1,161,1,125, + 2,100,1,125,3,100,1,125,4,100,1,125,5,100,2,125, + 6,100,3,125,7,122,6,116,1,124,2,131,1,125,8,87, + 0,110,11,4,0,116,2,121,32,1,0,1,0,1,0,100, + 1,125,8,89,0,110,144,119,0,122,7,124,0,160,3,124, + 2,161,1,125,9,87,0,110,9,4,0,116,4,121,49,1, + 0,1,0,1,0,89,0,110,127,119,0,116,5,124,9,100, + 4,25,0,131,1,125,3,122,7,124,0,160,6,124,8,161, + 1,125,10,87,0,110,9,4,0,116,4,121,72,1,0,1, + 0,1,0,89,0,110,104,119,0,124,1,124,8,100,5,156, + 2,125,11,122,71,116,7,124,10,124,1,124,11,131,3,125, + 12,116,8,124,10,131,1,100,6,100,1,133,2,25,0,125, + 13,124,12,100,7,64,0,100,8,107,3,125,6,124,6,114, + 138,124,12,100,9,64,0,100,8,107,3,125,7,116,9,106, + 10,100,10,107,3,114,137,124,7,115,119,116,9,106,10,100, + 11,107,2,114,137,124,0,160,6,124,2,161,1,125,4,116, + 9,160,11,116,12,124,4,161,2,125,5,116,13,124,10,124, + 5,124,1,124,11,131,4,1,0,110,10,116,14,124,10,124, + 3,124,9,100,12,25,0,124,1,124,11,131,5,1,0,87, + 0,110,11,4,0,116,15,116,16,102,2,121,160,1,0,1, + 0,1,0,89,0,110,16,119,0,116,17,160,18,100,13,124, + 8,124,2,161,3,1,0,116,19,124,13,124,1,124,8,124, + 2,100,14,141,4,83,0,124,4,100,1,117,0,114,185,124, + 0,160,6,124,2,161,1,125,4,124,0,160,20,124,4,124, + 2,161,2,125,14,116,17,160,18,100,15,124,2,161,2,1, + 0,116,21,106,22,115,255,124,8,100,1,117,1,114,255,124, + 3,100,1,117,1,114,255,124,6,114,226,124,5,100,1,117, + 0,114,219,116,9,160,11,124,4,161,1,125,5,116,23,124, + 14,124,5,124,7,131,3,125,10,110,8,116,24,124,14,124, + 3,116,25,124,4,131,1,131,3,125,10,122,10,124,0,160, + 26,124,2,124,8,124,10,161,3,1,0,87,0,124,14,83, + 0,4,0,116,2,121,254,1,0,1,0,1,0,89,0,124, + 14,83,0,119,0,124,14,83,0,41,16,122,190,67,111,110, + 99,114,101,116,101,32,105,109,112,108,101,109,101,110,116,97, + 116,105,111,110,32,111,102,32,73,110,115,112,101,99,116,76, + 111,97,100,101,114,46,103,101,116,95,99,111,100,101,46,10, + 10,32,32,32,32,32,32,32,32,82,101,97,100,105,110,103, + 32,111,102,32,98,121,116,101,99,111,100,101,32,114,101,113, + 117,105,114,101,115,32,112,97,116,104,95,115,116,97,116,115, + 32,116,111,32,98,101,32,105,109,112,108,101,109,101,110,116, + 101,100,46,32,84,111,32,119,114,105,116,101,10,32,32,32, + 32,32,32,32,32,98,121,116,101,99,111,100,101,44,32,115, + 101,116,95,100,97,116,97,32,109,117,115,116,32,97,108,115, + 111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,100, + 46,10,10,32,32,32,32,32,32,32,32,78,70,84,114,194, + 0,0,0,114,184,0,0,0,114,170,0,0,0,114,5,0, + 0,0,114,0,0,0,0,114,46,0,0,0,90,5,110,101, + 118,101,114,90,6,97,108,119,97,121,115,218,4,115,105,122, + 101,122,13,123,125,32,109,97,116,99,104,101,115,32,123,125, + 41,3,114,142,0,0,0,114,133,0,0,0,114,135,0,0, + 0,122,19,99,111,100,101,32,111,98,106,101,99,116,32,102, + 114,111,109,32,123,125,41,27,114,204,0,0,0,114,123,0, + 0,0,114,109,0,0,0,114,253,0,0,0,114,78,0,0, + 0,114,35,0,0,0,114,0,1,0,0,114,177,0,0,0, + 218,10,109,101,109,111,114,121,118,105,101,119,114,188,0,0, + 0,90,21,99,104,101,99,107,95,104,97,115,104,95,98,97, + 115,101,100,95,112,121,99,115,114,182,0,0,0,218,17,95, + 82,65,87,95,77,65,71,73,67,95,78,85,77,66,69,82, + 114,183,0,0,0,114,181,0,0,0,114,143,0,0,0,114, + 175,0,0,0,114,160,0,0,0,114,174,0,0,0,114,190, + 0,0,0,114,6,1,0,0,114,16,0,0,0,218,19,100, + 111,110,116,95,119,114,105,116,101,95,98,121,116,101,99,111, + 100,101,114,196,0,0,0,114,195,0,0,0,114,6,0,0, + 0,114,255,0,0,0,41,15,114,144,0,0,0,114,164,0, + 0,0,114,135,0,0,0,114,179,0,0,0,114,199,0,0, + 0,114,182,0,0,0,90,10,104,97,115,104,95,98,97,115, + 101,100,90,12,99,104,101,99,107,95,115,111,117,114,99,101, + 114,133,0,0,0,218,2,115,116,114,43,0,0,0,114,176, + 0,0,0,114,17,0,0,0,90,10,98,121,116,101,115,95, + 100,97,116,97,90,11,99,111,100,101,95,111,98,106,101,99, + 116,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 114,242,0,0,0,186,3,0,0,115,166,0,0,0,10,7, + 4,1,4,1,4,1,4,1,4,1,2,1,12,1,12,1, + 8,1,2,255,2,3,14,1,12,1,4,1,2,255,12,3, + 2,1,14,1,12,1,4,1,2,255,2,4,2,1,6,254, + 2,4,12,1,16,1,12,1,4,1,12,1,10,1,2,1, + 2,255,10,2,10,1,4,1,2,1,2,1,4,254,8,4, + 2,1,4,255,2,128,2,3,2,1,2,1,6,1,2,1, + 2,1,4,251,4,128,16,7,4,1,2,255,8,3,2,1, + 4,255,6,2,2,1,2,1,6,254,8,3,10,1,12,1, + 12,1,14,1,8,1,4,1,8,1,10,1,14,1,6,2, + 6,1,4,255,2,2,16,1,4,3,12,254,2,1,4,1, + 2,254,4,2,122,21,83,111,117,114,99,101,76,111,97,100, + 101,114,46,103,101,116,95,99,111,100,101,78,41,10,114,151, + 0,0,0,114,150,0,0,0,114,152,0,0,0,114,252,0, + 0,0,114,253,0,0,0,114,255,0,0,0,114,254,0,0, + 0,114,2,1,0,0,114,6,1,0,0,114,242,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,114,250,0,0,0,127,3,0,0,115,16,0, + 0,0,8,0,8,2,8,8,8,14,8,10,8,7,14,10, + 12,8,114,250,0,0,0,99,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0, + 115,92,0,0,0,101,0,90,1,100,0,90,2,100,1,90, + 3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,90, + 5,100,6,100,7,132,0,90,6,101,7,135,0,102,1,100, + 8,100,9,132,8,131,1,90,8,101,7,100,10,100,11,132, + 0,131,1,90,9,100,12,100,13,132,0,90,10,101,7,100, + 14,100,15,132,0,131,1,90,11,135,0,4,0,90,12,83, + 0,41,16,218,10,70,105,108,101,76,111,97,100,101,114,122, + 103,66,97,115,101,32,102,105,108,101,32,108,111,97,100,101, + 114,32,99,108,97,115,115,32,119,104,105,99,104,32,105,109, + 112,108,101,109,101,110,116,115,32,116,104,101,32,108,111,97, + 100,101,114,32,112,114,111,116,111,99,111,108,32,109,101,116, + 104,111,100,115,32,116,104,97,116,10,32,32,32,32,114,101, + 113,117,105,114,101,32,102,105,108,101,32,115,121,115,116,101, + 109,32,117,115,97,103,101,46,99,3,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,0, + 0,115,16,0,0,0,124,1,124,0,95,0,124,2,124,0, + 95,1,100,1,83,0,41,2,122,75,67,97,99,104,101,32, + 116,104,101,32,109,111,100,117,108,101,32,110,97,109,101,32, + 97,110,100,32,116,104,101,32,112,97,116,104,32,116,111,32, + 116,104,101,32,102,105,108,101,32,102,111,117,110,100,32,98, + 121,32,116,104,101,10,32,32,32,32,32,32,32,32,102,105, + 110,100,101,114,46,78,114,184,0,0,0,41,3,114,144,0, + 0,0,114,164,0,0,0,114,67,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,114,237,0,0,0, + 20,4,0,0,115,4,0,0,0,6,3,10,1,122,19,70, + 105,108,101,76,111,97,100,101,114,46,95,95,105,110,105,116, + 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,2,0,0,0,67,0,0,0,243,24,0,0,0, + 124,0,106,0,124,1,106,0,107,2,111,11,124,0,106,1, + 124,1,106,1,107,2,83,0,114,71,0,0,0,169,2,218, + 9,95,95,99,108,97,115,115,95,95,114,157,0,0,0,169, + 2,114,144,0,0,0,90,5,111,116,104,101,114,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,218,6,95,95, + 101,113,95,95,26,4,0,0,243,6,0,0,0,12,1,10, + 1,2,255,122,17,70,105,108,101,76,111,97,100,101,114,46, + 95,95,101,113,95,95,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,243, + 20,0,0,0,116,0,124,0,106,1,131,1,116,0,124,0, + 106,2,131,1,65,0,83,0,114,71,0,0,0,169,3,218, + 4,104,97,115,104,114,142,0,0,0,114,67,0,0,0,169, + 1,114,144,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,8,95,95,104,97,115,104,95,95,30, + 4,0,0,243,2,0,0,0,20,1,122,19,70,105,108,101, + 76,111,97,100,101,114,46,95,95,104,97,115,104,95,95,99, 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 1,0,0,0,67,0,0,0,114,23,0,0,0,41,2,122, - 53,82,101,116,117,114,110,32,78,111,110,101,32,97,115,32, - 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 115,32,104,97,118,101,32,110,111,32,115,111,117,114,99,101, - 32,99,111,100,101,46,78,114,7,0,0,0,114,247,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,1,1,0,0,174,4,0,0,114,24,0,0,0,122,30, + 3,0,0,0,3,0,0,0,115,16,0,0,0,116,0,116, + 1,124,0,131,2,160,2,124,1,161,1,83,0,41,1,122, + 100,76,111,97,100,32,97,32,109,111,100,117,108,101,32,102, + 114,111,109,32,97,32,102,105,108,101,46,10,10,32,32,32, + 32,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100, + 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32, + 32,85,115,101,32,101,120,101,99,95,109,111,100,117,108,101, + 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32, + 32,32,32,32,32,41,3,218,5,115,117,112,101,114,114,12, + 1,0,0,114,249,0,0,0,114,248,0,0,0,169,1,114, + 15,1,0,0,114,9,0,0,0,114,10,0,0,0,114,249, + 0,0,0,33,4,0,0,115,2,0,0,0,16,10,122,22, + 70,105,108,101,76,111,97,100,101,114,46,108,111,97,100,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,243, + 6,0,0,0,124,0,106,0,83,0,169,1,122,58,82,101, + 116,117,114,110,32,116,104,101,32,112,97,116,104,32,116,111, + 32,116,104,101,32,115,111,117,114,99,101,32,102,105,108,101, + 32,97,115,32,102,111,117,110,100,32,98,121,32,116,104,101, + 32,102,105,110,100,101,114,46,114,73,0,0,0,114,248,0, + 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,114,204,0,0,0,45,4,0,0,243,2,0,0,0,6, + 3,122,23,70,105,108,101,76,111,97,100,101,114,46,103,101, + 116,95,102,105,108,101,110,97,109,101,99,2,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,67, + 0,0,0,115,128,0,0,0,116,0,124,0,116,1,116,2, + 102,2,131,2,114,36,116,3,160,4,116,5,124,1,131,1, + 161,1,143,12,125,2,124,2,160,6,161,0,87,0,2,0, + 100,1,4,0,4,0,131,3,1,0,83,0,49,0,115,29, + 119,1,1,0,1,0,1,0,89,0,1,0,100,1,83,0, + 116,3,160,7,124,1,100,2,161,2,143,12,125,2,124,2, + 160,6,161,0,87,0,2,0,100,1,4,0,4,0,131,3, + 1,0,83,0,49,0,115,57,119,1,1,0,1,0,1,0, + 89,0,1,0,100,1,83,0,41,3,122,39,82,101,116,117, + 114,110,32,116,104,101,32,100,97,116,97,32,102,114,111,109, + 32,112,97,116,104,32,97,115,32,114,97,119,32,98,121,116, + 101,115,46,78,218,1,114,41,8,114,186,0,0,0,114,250, + 0,0,0,218,19,69,120,116,101,110,115,105,111,110,70,105, + 108,101,76,111,97,100,101,114,114,93,0,0,0,90,9,111, + 112,101,110,95,99,111,100,101,114,111,0,0,0,90,4,114, + 101,97,100,114,94,0,0,0,41,3,114,144,0,0,0,114, + 67,0,0,0,114,96,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,114,0,1,0,0,50,4,0, + 0,115,14,0,0,0,14,2,16,1,6,1,36,255,14,3, + 6,1,36,255,122,19,70,105,108,101,76,111,97,100,101,114, + 46,103,101,116,95,100,97,116,97,99,2,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,2,0,0,0,67,0, + 0,0,115,20,0,0,0,100,1,100,2,108,0,109,1,125, + 2,1,0,124,2,124,0,131,1,83,0,41,3,78,114,0, + 0,0,0,41,1,218,10,70,105,108,101,82,101,97,100,101, + 114,41,2,218,17,105,109,112,111,114,116,108,105,98,46,114, + 101,97,100,101,114,115,114,32,1,0,0,41,3,114,144,0, + 0,0,114,245,0,0,0,114,32,1,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,19,103,101,116, + 95,114,101,115,111,117,114,99,101,95,114,101,97,100,101,114, + 59,4,0,0,115,4,0,0,0,12,2,8,1,122,30,70, + 105,108,101,76,111,97,100,101,114,46,103,101,116,95,114,101, + 115,111,117,114,99,101,95,114,101,97,100,101,114,41,13,114, + 151,0,0,0,114,150,0,0,0,114,152,0,0,0,114,153, + 0,0,0,114,237,0,0,0,114,17,1,0,0,114,23,1, + 0,0,114,161,0,0,0,114,249,0,0,0,114,204,0,0, + 0,114,0,1,0,0,114,34,1,0,0,90,13,95,95,99, + 108,97,115,115,99,101,108,108,95,95,114,9,0,0,0,114, + 9,0,0,0,114,26,1,0,0,114,10,0,0,0,114,12, + 1,0,0,15,4,0,0,115,24,0,0,0,8,0,4,2, + 8,3,8,6,8,4,2,3,14,1,2,11,10,1,8,4, + 2,9,18,1,114,12,1,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,64,0, + 0,0,115,46,0,0,0,101,0,90,1,100,0,90,2,100, + 1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,132, + 0,90,5,100,6,100,7,156,1,100,8,100,9,132,2,90, + 6,100,10,83,0,41,11,218,16,83,111,117,114,99,101,70, + 105,108,101,76,111,97,100,101,114,122,62,67,111,110,99,114, + 101,116,101,32,105,109,112,108,101,109,101,110,116,97,116,105, + 111,110,32,111,102,32,83,111,117,114,99,101,76,111,97,100, + 101,114,32,117,115,105,110,103,32,116,104,101,32,102,105,108, + 101,32,115,121,115,116,101,109,46,99,2,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0, + 0,0,115,22,0,0,0,116,0,124,1,131,1,125,2,124, + 2,106,1,124,2,106,2,100,1,156,2,83,0,41,2,122, + 33,82,101,116,117,114,110,32,116,104,101,32,109,101,116,97, + 100,97,116,97,32,102,111,114,32,116,104,101,32,112,97,116, + 104,46,41,2,114,194,0,0,0,114,7,1,0,0,41,3, + 114,77,0,0,0,218,8,115,116,95,109,116,105,109,101,90, + 7,115,116,95,115,105,122,101,41,3,114,144,0,0,0,114, + 67,0,0,0,114,11,1,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,114,253,0,0,0,69,4,0, + 0,115,4,0,0,0,8,2,14,1,122,27,83,111,117,114, + 99,101,70,105,108,101,76,111,97,100,101,114,46,112,97,116, + 104,95,115,116,97,116,115,99,4,0,0,0,0,0,0,0, + 0,0,0,0,5,0,0,0,5,0,0,0,67,0,0,0, + 115,24,0,0,0,116,0,124,1,131,1,125,4,124,0,106, + 1,124,2,124,3,124,4,100,1,141,3,83,0,41,2,78, + 169,1,218,5,95,109,111,100,101,41,2,114,140,0,0,0, + 114,254,0,0,0,41,5,114,144,0,0,0,114,135,0,0, + 0,114,133,0,0,0,114,43,0,0,0,114,80,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,114, + 255,0,0,0,74,4,0,0,115,4,0,0,0,8,2,16, + 1,122,32,83,111,117,114,99,101,70,105,108,101,76,111,97, + 100,101,114,46,95,99,97,99,104,101,95,98,121,116,101,99, + 111,100,101,114,89,0,0,0,114,37,1,0,0,99,3,0, + 0,0,0,0,0,0,1,0,0,0,9,0,0,0,11,0, + 0,0,67,0,0,0,115,254,0,0,0,116,0,124,1,131, + 1,92,2,125,4,125,5,103,0,125,6,124,4,114,31,116, + 1,124,4,131,1,115,31,116,0,124,4,131,1,92,2,125, + 4,125,7,124,6,160,2,124,7,161,1,1,0,124,4,114, + 31,116,1,124,4,131,1,114,14,116,3,124,6,131,1,68, + 0,93,49,125,7,116,4,124,4,124,7,131,2,125,4,122, + 7,116,5,160,6,124,4,161,1,1,0,87,0,113,35,4, + 0,116,7,121,58,1,0,1,0,1,0,89,0,113,35,4, + 0,116,8,121,84,1,0,125,8,1,0,122,15,116,9,160, + 10,100,1,124,4,124,8,161,3,1,0,87,0,89,0,100, + 2,125,8,126,8,1,0,100,2,83,0,100,2,125,8,126, + 8,119,1,119,0,122,15,116,11,124,1,124,2,124,3,131, + 3,1,0,116,9,160,10,100,3,124,1,161,2,1,0,87, + 0,100,2,83,0,4,0,116,8,121,126,1,0,125,8,1, + 0,122,14,116,9,160,10,100,1,124,1,124,8,161,3,1, + 0,87,0,89,0,100,2,125,8,126,8,100,2,83,0,100, + 2,125,8,126,8,119,1,119,0,41,4,122,27,87,114,105, + 116,101,32,98,121,116,101,115,32,100,97,116,97,32,116,111, + 32,97,32,102,105,108,101,46,122,27,99,111,117,108,100,32, + 110,111,116,32,99,114,101,97,116,101,32,123,33,114,125,58, + 32,123,33,114,125,78,122,12,99,114,101,97,116,101,100,32, + 123,33,114,125,41,12,114,76,0,0,0,114,85,0,0,0, + 114,63,0,0,0,218,8,114,101,118,101,114,115,101,100,114, + 69,0,0,0,114,19,0,0,0,90,5,109,107,100,105,114, + 218,15,70,105,108,101,69,120,105,115,116,115,69,114,114,111, + 114,114,78,0,0,0,114,160,0,0,0,114,174,0,0,0, + 114,97,0,0,0,41,9,114,144,0,0,0,114,67,0,0, + 0,114,43,0,0,0,114,38,1,0,0,218,6,112,97,114, + 101,110,116,114,122,0,0,0,114,65,0,0,0,114,70,0, + 0,0,114,1,1,0,0,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,114,254,0,0,0,79,4,0,0,115, + 56,0,0,0,12,2,4,1,12,2,12,1,10,1,12,254, + 12,4,10,1,2,1,14,1,12,1,4,2,14,1,6,3, + 4,1,4,255,16,2,8,128,2,251,2,6,12,1,18,1, + 14,1,8,2,2,1,18,255,8,128,2,254,122,25,83,111, + 117,114,99,101,70,105,108,101,76,111,97,100,101,114,46,115, + 101,116,95,100,97,116,97,78,41,7,114,151,0,0,0,114, + 150,0,0,0,114,152,0,0,0,114,153,0,0,0,114,253, + 0,0,0,114,255,0,0,0,114,254,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,114,35,1,0,0,65,4,0,0,115,10,0,0,0,8, + 0,4,2,8,2,8,5,18,5,114,35,1,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,64,0,0,0,115,32,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, + 100,4,100,5,132,0,90,5,100,6,83,0,41,7,218,20, + 83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,111, + 97,100,101,114,122,45,76,111,97,100,101,114,32,119,104,105, + 99,104,32,104,97,110,100,108,101,115,32,115,111,117,114,99, + 101,108,101,115,115,32,102,105,108,101,32,105,109,112,111,114, + 116,115,46,99,2,0,0,0,0,0,0,0,0,0,0,0, + 5,0,0,0,5,0,0,0,67,0,0,0,115,68,0,0, + 0,124,0,160,0,124,1,161,1,125,2,124,0,160,1,124, + 2,161,1,125,3,124,1,124,2,100,1,156,2,125,4,116, + 2,124,3,124,1,124,4,131,3,1,0,116,3,116,4,124, + 3,131,1,100,2,100,0,133,2,25,0,124,1,124,2,100, + 3,141,3,83,0,41,4,78,114,184,0,0,0,114,170,0, + 0,0,41,2,114,142,0,0,0,114,133,0,0,0,41,5, + 114,204,0,0,0,114,0,1,0,0,114,177,0,0,0,114, + 190,0,0,0,114,8,1,0,0,41,5,114,144,0,0,0, + 114,164,0,0,0,114,67,0,0,0,114,43,0,0,0,114, + 176,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,114,242,0,0,0,114,4,0,0,115,22,0,0, + 0,10,1,10,1,2,4,2,1,6,254,12,4,2,1,14, + 1,2,1,2,1,6,253,122,29,83,111,117,114,99,101,108, + 101,115,115,70,105,108,101,76,111,97,100,101,114,46,103,101, + 116,95,99,111,100,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,114, + 25,0,0,0,41,2,122,39,82,101,116,117,114,110,32,78, + 111,110,101,32,97,115,32,116,104,101,114,101,32,105,115,32, + 110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,78, + 114,9,0,0,0,114,248,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,114,2,1,0,0,130,4, + 0,0,114,26,0,0,0,122,31,83,111,117,114,99,101,108, + 101,115,115,70,105,108,101,76,111,97,100,101,114,46,103,101, + 116,95,115,111,117,114,99,101,78,41,6,114,151,0,0,0, + 114,150,0,0,0,114,152,0,0,0,114,153,0,0,0,114, + 242,0,0,0,114,2,1,0,0,114,9,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,114,42,1, + 0,0,110,4,0,0,115,8,0,0,0,8,0,4,2,8, + 2,12,16,114,42,1,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, + 0,115,92,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, + 90,5,100,6,100,7,132,0,90,6,100,8,100,9,132,0, + 90,7,100,10,100,11,132,0,90,8,100,12,100,13,132,0, + 90,9,100,14,100,15,132,0,90,10,100,16,100,17,132,0, + 90,11,101,12,100,18,100,19,132,0,131,1,90,13,100,20, + 83,0,41,21,114,31,1,0,0,122,93,76,111,97,100,101, + 114,32,102,111,114,32,101,120,116,101,110,115,105,111,110,32, + 109,111,100,117,108,101,115,46,10,10,32,32,32,32,84,104, + 101,32,99,111,110,115,116,114,117,99,116,111,114,32,105,115, + 32,100,101,115,105,103,110,101,100,32,116,111,32,119,111,114, + 107,32,119,105,116,104,32,70,105,108,101,70,105,110,100,101, + 114,46,10,10,32,32,32,32,99,3,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,0, + 0,115,16,0,0,0,124,1,124,0,95,0,124,2,124,0, + 95,1,100,0,83,0,114,71,0,0,0,114,184,0,0,0, + 41,3,114,144,0,0,0,114,142,0,0,0,114,67,0,0, + 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 114,237,0,0,0,143,4,0,0,115,4,0,0,0,6,1, + 10,1,122,28,69,120,116,101,110,115,105,111,110,70,105,108, + 101,76,111,97,100,101,114,46,95,95,105,110,105,116,95,95, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,2,0,0,0,67,0,0,0,114,13,1,0,0,114,71, + 0,0,0,114,14,1,0,0,114,16,1,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,114,17,1,0, + 0,147,4,0,0,114,18,1,0,0,122,26,69,120,116,101, + 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, + 95,95,101,113,95,95,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,114, + 19,1,0,0,114,71,0,0,0,114,20,1,0,0,114,22, + 1,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,114,23,1,0,0,151,4,0,0,114,24,1,0,0, + 122,28,69,120,116,101,110,115,105,111,110,70,105,108,101,76, + 111,97,100,101,114,46,95,95,104,97,115,104,95,95,99,2, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5, + 0,0,0,67,0,0,0,115,36,0,0,0,116,0,160,1, + 116,2,106,3,124,1,161,2,125,2,116,0,160,4,100,1, + 124,1,106,5,124,0,106,6,161,3,1,0,124,2,83,0, + 41,2,122,38,67,114,101,97,116,101,32,97,110,32,117,110, + 105,116,105,97,108,105,122,101,100,32,101,120,116,101,110,115, + 105,111,110,32,109,111,100,117,108,101,122,38,101,120,116,101, + 110,115,105,111,110,32,109,111,100,117,108,101,32,123,33,114, + 125,32,108,111,97,100,101,100,32,102,114,111,109,32,123,33, + 114,125,41,7,114,160,0,0,0,114,243,0,0,0,114,188, + 0,0,0,90,14,99,114,101,97,116,101,95,100,121,110,97, + 109,105,99,114,174,0,0,0,114,142,0,0,0,114,67,0, + 0,0,41,3,114,144,0,0,0,114,211,0,0,0,114,245, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,114,240,0,0,0,154,4,0,0,115,14,0,0,0, + 4,2,6,1,4,255,6,2,8,1,4,255,4,2,122,33, 69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97, - 100,101,114,46,103,101,116,95,115,111,117,114,99,101,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, - 0,0,0,67,0,0,0,114,26,1,0,0,114,27,1,0, - 0,114,71,0,0,0,114,247,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,203,0,0,0,178, - 4,0,0,114,28,1,0,0,122,32,69,120,116,101,110,115, + 100,101,114,46,99,114,101,97,116,101,95,109,111,100,117,108, + 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,5,0,0,0,67,0,0,0,115,36,0,0,0,116, + 0,160,1,116,2,106,3,124,1,161,2,1,0,116,0,160, + 4,100,1,124,0,106,5,124,0,106,6,161,3,1,0,100, + 2,83,0,41,3,122,30,73,110,105,116,105,97,108,105,122, + 101,32,97,110,32,101,120,116,101,110,115,105,111,110,32,109, + 111,100,117,108,101,122,40,101,120,116,101,110,115,105,111,110, + 32,109,111,100,117,108,101,32,123,33,114,125,32,101,120,101, + 99,117,116,101,100,32,102,114,111,109,32,123,33,114,125,78, + 41,7,114,160,0,0,0,114,243,0,0,0,114,188,0,0, + 0,90,12,101,120,101,99,95,100,121,110,97,109,105,99,114, + 174,0,0,0,114,142,0,0,0,114,67,0,0,0,169,2, + 114,144,0,0,0,114,245,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,114,246,0,0,0,162,4, + 0,0,115,8,0,0,0,14,2,6,1,8,1,8,255,122, + 31,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111, + 97,100,101,114,46,101,120,101,99,95,109,111,100,117,108,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,4,0,0,0,3,0,0,0,115,36,0,0,0,116,0, + 124,0,106,1,131,1,100,1,25,0,137,0,116,2,135,0, + 102,1,100,2,100,3,132,8,116,3,68,0,131,1,131,1, + 83,0,41,4,122,49,82,101,116,117,114,110,32,84,114,117, + 101,32,105,102,32,116,104,101,32,101,120,116,101,110,115,105, + 111,110,32,109,111,100,117,108,101,32,105,115,32,97,32,112, + 97,99,107,97,103,101,46,114,5,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, + 0,51,0,0,0,115,28,0,0,0,129,0,124,0,93,9, + 125,1,136,0,100,0,124,1,23,0,107,2,86,0,1,0, + 113,2,100,1,83,0,41,2,114,237,0,0,0,78,114,9, + 0,0,0,169,2,114,7,0,0,0,218,6,115,117,102,102, + 105,120,169,1,90,9,102,105,108,101,95,110,97,109,101,114, + 9,0,0,0,114,10,0,0,0,114,11,0,0,0,171,4, + 0,0,115,8,0,0,0,2,128,4,0,2,1,20,255,122, + 49,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111, + 97,100,101,114,46,105,115,95,112,97,99,107,97,103,101,46, + 60,108,111,99,97,108,115,62,46,60,103,101,110,101,120,112, + 114,62,41,4,114,76,0,0,0,114,67,0,0,0,218,3, + 97,110,121,114,233,0,0,0,114,248,0,0,0,114,9,0, + 0,0,114,46,1,0,0,114,10,0,0,0,114,207,0,0, + 0,168,4,0,0,115,8,0,0,0,14,2,12,1,2,1, + 8,255,122,30,69,120,116,101,110,115,105,111,110,70,105,108, + 101,76,111,97,100,101,114,46,105,115,95,112,97,99,107,97, + 103,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,1,0,0,0,67,0,0,0,114,25,0,0,0, + 41,2,122,63,82,101,116,117,114,110,32,78,111,110,101,32, + 97,115,32,97,110,32,101,120,116,101,110,115,105,111,110,32, + 109,111,100,117,108,101,32,99,97,110,110,111,116,32,99,114, + 101,97,116,101,32,97,32,99,111,100,101,32,111,98,106,101, + 99,116,46,78,114,9,0,0,0,114,248,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,114,242,0, + 0,0,174,4,0,0,114,26,0,0,0,122,28,69,120,116, + 101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114, + 46,103,101,116,95,99,111,100,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0, + 0,0,114,25,0,0,0,41,2,122,53,82,101,116,117,114, + 110,32,78,111,110,101,32,97,115,32,101,120,116,101,110,115, + 105,111,110,32,109,111,100,117,108,101,115,32,104,97,118,101, + 32,110,111,32,115,111,117,114,99,101,32,99,111,100,101,46, + 78,114,9,0,0,0,114,248,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,114,2,1,0,0,178, + 4,0,0,114,26,0,0,0,122,30,69,120,116,101,110,115, 105,111,110,70,105,108,101,76,111,97,100,101,114,46,103,101, - 116,95,102,105,108,101,110,97,109,101,78,41,14,114,150,0, - 0,0,114,149,0,0,0,114,151,0,0,0,114,152,0,0, - 0,114,236,0,0,0,114,16,1,0,0,114,22,1,0,0, - 114,239,0,0,0,114,245,0,0,0,114,206,0,0,0,114, - 241,0,0,0,114,1,1,0,0,114,160,0,0,0,114,203, - 0,0,0,114,7,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,30,1,0,0,131,4,0,0, - 115,24,0,0,0,8,0,4,2,8,6,8,4,8,4,8, - 3,8,8,8,6,8,6,8,4,2,4,14,1,114,30,1, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,64,0,0,0,115,108,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,100,2,90,4, - 100,3,100,4,132,0,90,5,100,5,100,6,132,0,90,6, - 100,7,100,8,132,0,90,7,100,9,100,10,132,0,90,8, - 100,11,100,12,132,0,90,9,100,13,100,14,132,0,90,10, - 100,15,100,16,132,0,90,11,100,17,100,18,132,0,90,12, - 100,19,100,20,132,0,90,13,100,21,100,22,132,0,90,14, - 100,23,100,24,132,0,90,15,100,25,83,0,41,26,218,14, - 95,78,97,109,101,115,112,97,99,101,80,97,116,104,97,38, - 1,0,0,82,101,112,114,101,115,101,110,116,115,32,97,32, - 110,97,109,101,115,112,97,99,101,32,112,97,99,107,97,103, - 101,39,115,32,112,97,116,104,46,32,32,73,116,32,117,115, - 101,115,32,116,104,101,32,109,111,100,117,108,101,32,110,97, - 109,101,10,32,32,32,32,116,111,32,102,105,110,100,32,105, - 116,115,32,112,97,114,101,110,116,32,109,111,100,117,108,101, - 44,32,97,110,100,32,102,114,111,109,32,116,104,101,114,101, - 32,105,116,32,108,111,111,107,115,32,117,112,32,116,104,101, - 32,112,97,114,101,110,116,39,115,10,32,32,32,32,95,95, - 112,97,116,104,95,95,46,32,32,87,104,101,110,32,116,104, - 105,115,32,99,104,97,110,103,101,115,44,32,116,104,101,32, - 109,111,100,117,108,101,39,115,32,111,119,110,32,112,97,116, - 104,32,105,115,32,114,101,99,111,109,112,117,116,101,100,44, - 10,32,32,32,32,117,115,105,110,103,32,112,97,116,104,95, - 102,105,110,100,101,114,46,32,32,70,111,114,32,116,111,112, - 45,108,101,118,101,108,32,109,111,100,117,108,101,115,44,32, - 116,104,101,32,112,97,114,101,110,116,32,109,111,100,117,108, - 101,39,115,32,112,97,116,104,10,32,32,32,32,105,115,32, - 115,121,115,46,112,97,116,104,46,114,0,0,0,0,99,4, - 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,3, - 0,0,0,67,0,0,0,115,44,0,0,0,124,1,124,0, - 95,0,124,2,124,0,95,1,116,2,124,0,160,3,161,0, - 131,1,124,0,95,4,124,0,106,5,124,0,95,6,124,3, - 124,0,95,7,100,0,83,0,114,69,0,0,0,41,8,218, - 5,95,110,97,109,101,218,5,95,112,97,116,104,114,136,0, - 0,0,218,16,95,103,101,116,95,112,97,114,101,110,116,95, - 112,97,116,104,218,17,95,108,97,115,116,95,112,97,114,101, - 110,116,95,112,97,116,104,218,6,95,101,112,111,99,104,218, - 11,95,108,97,115,116,95,101,112,111,99,104,218,12,95,112, - 97,116,104,95,102,105,110,100,101,114,169,4,114,143,0,0, - 0,114,141,0,0,0,114,65,0,0,0,90,11,112,97,116, - 104,95,102,105,110,100,101,114,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,236,0,0,0,195,4,0,0, - 115,10,0,0,0,6,1,6,1,14,1,8,1,10,1,122, - 23,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, - 95,95,105,110,105,116,95,95,99,1,0,0,0,0,0,0, + 116,95,115,111,117,114,99,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,114,27,1,0,0,114,28,1,0,0,114,73,0,0,0, + 114,248,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,114,204,0,0,0,182,4,0,0,114,29,1, + 0,0,122,32,69,120,116,101,110,115,105,111,110,70,105,108, + 101,76,111,97,100,101,114,46,103,101,116,95,102,105,108,101, + 110,97,109,101,78,41,14,114,151,0,0,0,114,150,0,0, + 0,114,152,0,0,0,114,153,0,0,0,114,237,0,0,0, + 114,17,1,0,0,114,23,1,0,0,114,240,0,0,0,114, + 246,0,0,0,114,207,0,0,0,114,242,0,0,0,114,2, + 1,0,0,114,161,0,0,0,114,204,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,114,31,1,0,0,135,4,0,0,115,24,0,0,0,8, + 0,4,2,8,6,8,4,8,4,8,3,8,8,8,6,8, + 6,8,4,2,4,14,1,114,31,1,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,64,0,0,0,115,108,0,0,0,101,0,90,1,100,0, + 90,2,100,1,90,3,100,2,90,4,100,3,100,4,132,0, + 90,5,100,5,100,6,132,0,90,6,100,7,100,8,132,0, + 90,7,100,9,100,10,132,0,90,8,100,11,100,12,132,0, + 90,9,100,13,100,14,132,0,90,10,100,15,100,16,132,0, + 90,11,100,17,100,18,132,0,90,12,100,19,100,20,132,0, + 90,13,100,21,100,22,132,0,90,14,100,23,100,24,132,0, + 90,15,100,25,83,0,41,26,218,14,95,78,97,109,101,115, + 112,97,99,101,80,97,116,104,97,38,1,0,0,82,101,112, + 114,101,115,101,110,116,115,32,97,32,110,97,109,101,115,112, + 97,99,101,32,112,97,99,107,97,103,101,39,115,32,112,97, + 116,104,46,32,32,73,116,32,117,115,101,115,32,116,104,101, + 32,109,111,100,117,108,101,32,110,97,109,101,10,32,32,32, + 32,116,111,32,102,105,110,100,32,105,116,115,32,112,97,114, + 101,110,116,32,109,111,100,117,108,101,44,32,97,110,100,32, + 102,114,111,109,32,116,104,101,114,101,32,105,116,32,108,111, + 111,107,115,32,117,112,32,116,104,101,32,112,97,114,101,110, + 116,39,115,10,32,32,32,32,95,95,112,97,116,104,95,95, + 46,32,32,87,104,101,110,32,116,104,105,115,32,99,104,97, + 110,103,101,115,44,32,116,104,101,32,109,111,100,117,108,101, + 39,115,32,111,119,110,32,112,97,116,104,32,105,115,32,114, + 101,99,111,109,112,117,116,101,100,44,10,32,32,32,32,117, + 115,105,110,103,32,112,97,116,104,95,102,105,110,100,101,114, + 46,32,32,70,111,114,32,116,111,112,45,108,101,118,101,108, + 32,109,111,100,117,108,101,115,44,32,116,104,101,32,112,97, + 114,101,110,116,32,109,111,100,117,108,101,39,115,32,112,97, + 116,104,10,32,32,32,32,105,115,32,115,121,115,46,112,97, + 116,104,46,114,0,0,0,0,99,4,0,0,0,0,0,0, 0,0,0,0,0,4,0,0,0,3,0,0,0,67,0,0, - 0,115,38,0,0,0,124,0,106,0,160,1,100,1,161,1, - 92,3,125,1,125,2,125,3,124,2,100,2,107,2,114,15, - 100,3,83,0,124,1,100,4,102,2,83,0,41,5,122,62, - 82,101,116,117,114,110,115,32,97,32,116,117,112,108,101,32, - 111,102,32,40,112,97,114,101,110,116,45,109,111,100,117,108, - 101,45,110,97,109,101,44,32,112,97,114,101,110,116,45,112, - 97,116,104,45,97,116,116,114,45,110,97,109,101,41,114,97, - 0,0,0,114,10,0,0,0,41,2,114,15,0,0,0,114, - 65,0,0,0,90,8,95,95,112,97,116,104,95,95,41,2, - 114,48,1,0,0,114,104,0,0,0,41,4,114,143,0,0, - 0,114,40,1,0,0,218,3,100,111,116,90,2,109,101,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,23, - 95,102,105,110,100,95,112,97,114,101,110,116,95,112,97,116, - 104,95,110,97,109,101,115,202,4,0,0,115,8,0,0,0, - 18,2,8,1,4,2,8,3,122,38,95,78,97,109,101,115, - 112,97,99,101,80,97,116,104,46,95,102,105,110,100,95,112, - 97,114,101,110,116,95,112,97,116,104,95,110,97,109,101,115, + 0,115,44,0,0,0,124,1,124,0,95,0,124,2,124,0, + 95,1,116,2,124,0,160,3,161,0,131,1,124,0,95,4, + 124,0,106,5,124,0,95,6,124,3,124,0,95,7,100,0, + 83,0,114,71,0,0,0,41,8,218,5,95,110,97,109,101, + 218,5,95,112,97,116,104,114,137,0,0,0,218,16,95,103, + 101,116,95,112,97,114,101,110,116,95,112,97,116,104,218,17, + 95,108,97,115,116,95,112,97,114,101,110,116,95,112,97,116, + 104,218,6,95,101,112,111,99,104,218,11,95,108,97,115,116, + 95,101,112,111,99,104,218,12,95,112,97,116,104,95,102,105, + 110,100,101,114,169,4,114,144,0,0,0,114,142,0,0,0, + 114,67,0,0,0,90,11,112,97,116,104,95,102,105,110,100, + 101,114,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,114,237,0,0,0,199,4,0,0,115,10,0,0,0,6, + 1,6,1,14,1,8,1,10,1,122,23,95,78,97,109,101, + 115,112,97,99,101,80,97,116,104,46,95,95,105,110,105,116, + 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, + 124,0,106,0,160,1,100,1,161,1,92,3,125,1,125,2, + 125,3,124,2,100,2,107,2,114,15,100,3,83,0,124,1, + 100,4,102,2,83,0,41,5,122,62,82,101,116,117,114,110, + 115,32,97,32,116,117,112,108,101,32,111,102,32,40,112,97, + 114,101,110,116,45,109,111,100,117,108,101,45,110,97,109,101, + 44,32,112,97,114,101,110,116,45,112,97,116,104,45,97,116, + 116,114,45,110,97,109,101,41,114,99,0,0,0,114,3,0, + 0,0,41,2,114,16,0,0,0,114,67,0,0,0,90,8, + 95,95,112,97,116,104,95,95,41,2,114,49,1,0,0,114, + 106,0,0,0,41,4,114,144,0,0,0,114,41,1,0,0, + 218,3,100,111,116,90,2,109,101,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,218,23,95,102,105,110,100,95, + 112,97,114,101,110,116,95,112,97,116,104,95,110,97,109,101, + 115,206,4,0,0,115,8,0,0,0,18,2,8,1,4,2, + 8,3,122,38,95,78,97,109,101,115,112,97,99,101,80,97, + 116,104,46,95,102,105,110,100,95,112,97,114,101,110,116,95, + 112,97,116,104,95,110,97,109,101,115,99,1,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67, + 0,0,0,115,28,0,0,0,124,0,160,0,161,0,92,2, + 125,1,125,2,116,1,116,2,106,3,124,1,25,0,124,2, + 131,2,83,0,114,71,0,0,0,41,4,114,58,1,0,0, + 114,156,0,0,0,114,16,0,0,0,218,7,109,111,100,117, + 108,101,115,41,3,114,144,0,0,0,90,18,112,97,114,101, + 110,116,95,109,111,100,117,108,101,95,110,97,109,101,90,14, + 112,97,116,104,95,97,116,116,114,95,110,97,109,101,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,114,51,1, + 0,0,216,4,0,0,115,4,0,0,0,12,1,16,1,122, + 31,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, + 95,103,101,116,95,112,97,114,101,110,116,95,112,97,116,104, 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,3,0,0,0,67,0,0,0,115,28,0,0,0,124,0, - 160,0,161,0,92,2,125,1,125,2,116,1,116,2,106,3, - 124,1,25,0,124,2,131,2,83,0,114,69,0,0,0,41, - 4,114,57,1,0,0,114,155,0,0,0,114,15,0,0,0, - 218,7,109,111,100,117,108,101,115,41,3,114,143,0,0,0, - 90,18,112,97,114,101,110,116,95,109,111,100,117,108,101,95, - 110,97,109,101,90,14,112,97,116,104,95,97,116,116,114,95, - 110,97,109,101,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,50,1,0,0,212,4,0,0,115,4,0,0, - 0,12,1,16,1,122,31,95,78,97,109,101,115,112,97,99, - 101,80,97,116,104,46,95,103,101,116,95,112,97,114,101,110, - 116,95,112,97,116,104,99,1,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,4,0,0,0,67,0,0,0,115, - 100,0,0,0,116,0,124,0,160,1,161,0,131,1,125,1, - 124,1,124,0,106,2,107,3,115,17,124,0,106,3,124,0, - 106,4,107,3,114,47,124,0,160,5,124,0,106,6,124,1, - 161,2,125,2,124,2,100,0,117,1,114,40,124,2,106,7, - 100,0,117,0,114,40,124,2,106,8,114,40,124,2,106,8, - 124,0,95,9,124,1,124,0,95,2,124,0,106,3,124,0, - 95,4,124,0,106,9,83,0,114,69,0,0,0,41,10,114, - 136,0,0,0,114,50,1,0,0,114,51,1,0,0,114,52, - 1,0,0,114,53,1,0,0,114,54,1,0,0,114,48,1, - 0,0,114,164,0,0,0,114,202,0,0,0,114,49,1,0, - 0,41,3,114,143,0,0,0,90,11,112,97,114,101,110,116, - 95,112,97,116,104,114,210,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,218,12,95,114,101,99,97, - 108,99,117,108,97,116,101,216,4,0,0,115,18,0,0,0, - 12,2,22,1,14,1,18,3,6,1,8,1,6,1,8,1, - 6,1,122,27,95,78,97,109,101,115,112,97,99,101,80,97, - 116,104,46,95,114,101,99,97,108,99,117,108,97,116,101,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 3,0,0,0,67,0,0,0,243,12,0,0,0,116,0,124, - 0,160,1,161,0,131,1,83,0,114,69,0,0,0,41,2, - 218,4,105,116,101,114,114,59,1,0,0,114,21,1,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 8,95,95,105,116,101,114,95,95,230,4,0,0,243,2,0, - 0,0,12,1,122,23,95,78,97,109,101,115,112,97,99,101, - 80,97,116,104,46,95,95,105,116,101,114,95,95,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0, - 0,0,67,0,0,0,115,12,0,0,0,124,0,160,0,161, - 0,124,1,25,0,83,0,114,69,0,0,0,169,1,114,59, - 1,0,0,41,2,114,143,0,0,0,218,5,105,110,100,101, - 120,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,11,95,95,103,101,116,105,116,101,109,95,95,233,4,0, - 0,114,63,1,0,0,122,26,95,78,97,109,101,115,112,97, - 99,101,80,97,116,104,46,95,95,103,101,116,105,116,101,109, - 95,95,99,3,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,3,0,0,0,67,0,0,0,115,14,0,0,0, - 124,2,124,0,106,0,124,1,60,0,100,0,83,0,114,69, - 0,0,0,41,1,114,49,1,0,0,41,3,114,143,0,0, - 0,114,65,1,0,0,114,65,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,11,95,95,115,101, - 116,105,116,101,109,95,95,236,4,0,0,115,2,0,0,0, - 14,1,122,26,95,78,97,109,101,115,112,97,99,101,80,97, - 116,104,46,95,95,115,101,116,105,116,101,109,95,95,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3, - 0,0,0,67,0,0,0,114,60,1,0,0,114,69,0,0, - 0,41,2,114,4,0,0,0,114,59,1,0,0,114,21,1, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,7,95,95,108,101,110,95,95,239,4,0,0,114,63, - 1,0,0,122,22,95,78,97,109,101,115,112,97,99,101,80, - 97,116,104,46,95,95,108,101,110,95,95,99,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, - 67,0,0,0,243,12,0,0,0,100,1,160,0,124,0,106, - 1,161,1,83,0,41,2,78,122,20,95,78,97,109,101,115, - 112,97,99,101,80,97,116,104,40,123,33,114,125,41,41,2, - 114,89,0,0,0,114,49,1,0,0,114,21,1,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,8, - 95,95,114,101,112,114,95,95,242,4,0,0,114,63,1,0, - 0,122,23,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,46,95,95,114,101,112,114,95,95,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, - 0,0,0,115,12,0,0,0,124,1,124,0,160,0,161,0, - 118,0,83,0,114,69,0,0,0,114,64,1,0,0,169,2, - 114,143,0,0,0,218,4,105,116,101,109,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,218,12,95,95,99,111, - 110,116,97,105,110,115,95,95,245,4,0,0,114,63,1,0, - 0,122,27,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,46,95,95,99,111,110,116,97,105,110,115,95,95,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3, - 0,0,0,67,0,0,0,115,16,0,0,0,124,0,106,0, - 160,1,124,1,161,1,1,0,100,0,83,0,114,69,0,0, - 0,41,2,114,49,1,0,0,114,61,0,0,0,114,71,1, - 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,61,0,0,0,248,4,0,0,243,2,0,0,0,16, - 1,122,21,95,78,97,109,101,115,112,97,99,101,80,97,116, - 104,46,97,112,112,101,110,100,78,41,16,114,150,0,0,0, - 114,149,0,0,0,114,151,0,0,0,114,152,0,0,0,114, - 52,1,0,0,114,236,0,0,0,114,57,1,0,0,114,50, - 1,0,0,114,59,1,0,0,114,62,1,0,0,114,66,1, - 0,0,114,67,1,0,0,114,68,1,0,0,114,70,1,0, - 0,114,73,1,0,0,114,61,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 47,1,0,0,184,4,0,0,115,28,0,0,0,8,0,4, - 1,4,8,8,2,8,7,8,10,8,4,8,14,8,3,8, - 3,8,3,8,3,8,3,12,3,114,47,1,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,64,0,0,0,115,88,0,0,0,101,0,90,1, - 100,0,90,2,100,1,100,2,132,0,90,3,101,4,100,3, - 100,4,132,0,131,1,90,5,100,5,100,6,132,0,90,6, - 100,7,100,8,132,0,90,7,100,9,100,10,132,0,90,8, - 100,11,100,12,132,0,90,9,100,13,100,14,132,0,90,10, - 100,15,100,16,132,0,90,11,100,17,100,18,132,0,90,12, - 100,19,83,0,41,20,218,16,95,78,97,109,101,115,112,97, - 99,101,76,111,97,100,101,114,99,4,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0, - 0,115,18,0,0,0,116,0,124,1,124,2,124,3,131,3, - 124,0,95,1,100,0,83,0,114,69,0,0,0,41,2,114, - 47,1,0,0,114,49,1,0,0,114,55,1,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,236,0, - 0,0,254,4,0,0,115,2,0,0,0,18,1,122,25,95, + 0,4,0,0,0,67,0,0,0,115,100,0,0,0,116,0, + 124,0,160,1,161,0,131,1,125,1,124,1,124,0,106,2, + 107,3,115,17,124,0,106,3,124,0,106,4,107,3,114,47, + 124,0,160,5,124,0,106,6,124,1,161,2,125,2,124,2, + 100,0,117,1,114,40,124,2,106,7,100,0,117,0,114,40, + 124,2,106,8,114,40,124,2,106,8,124,0,95,9,124,1, + 124,0,95,2,124,0,106,3,124,0,95,4,124,0,106,9, + 83,0,114,71,0,0,0,41,10,114,137,0,0,0,114,51, + 1,0,0,114,52,1,0,0,114,53,1,0,0,114,54,1, + 0,0,114,55,1,0,0,114,49,1,0,0,114,165,0,0, + 0,114,203,0,0,0,114,50,1,0,0,41,3,114,144,0, + 0,0,90,11,112,97,114,101,110,116,95,112,97,116,104,114, + 211,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,12,95,114,101,99,97,108,99,117,108,97,116, + 101,220,4,0,0,115,18,0,0,0,12,2,22,1,14,1, + 18,3,6,1,8,1,6,1,8,1,6,1,122,27,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,46,95,114,101, + 99,97,108,99,117,108,97,116,101,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, + 0,0,243,12,0,0,0,116,0,124,0,160,1,161,0,131, + 1,83,0,114,71,0,0,0,41,2,218,4,105,116,101,114, + 114,60,1,0,0,114,22,1,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,218,8,95,95,105,116,101, + 114,95,95,234,4,0,0,243,2,0,0,0,12,1,122,23, + 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95, + 95,105,116,101,114,95,95,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0, + 115,12,0,0,0,124,0,160,0,161,0,124,1,25,0,83, + 0,114,71,0,0,0,169,1,114,60,1,0,0,41,2,114, + 144,0,0,0,218,5,105,110,100,101,120,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,11,95,95,103,101, + 116,105,116,101,109,95,95,237,4,0,0,114,64,1,0,0, + 122,26,95,78,97,109,101,115,112,97,99,101,80,97,116,104, + 46,95,95,103,101,116,105,116,101,109,95,95,99,3,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, + 0,67,0,0,0,115,14,0,0,0,124,2,124,0,106,0, + 124,1,60,0,100,0,83,0,114,71,0,0,0,41,1,114, + 50,1,0,0,41,3,114,144,0,0,0,114,66,1,0,0, + 114,67,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,218,11,95,95,115,101,116,105,116,101,109,95, + 95,240,4,0,0,115,2,0,0,0,14,1,122,26,95,78, + 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,115, + 101,116,105,116,101,109,95,95,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, + 0,114,61,1,0,0,114,71,0,0,0,41,2,114,6,0, + 0,0,114,60,1,0,0,114,22,1,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,7,95,95,108, + 101,110,95,95,243,4,0,0,114,64,1,0,0,122,22,95, + 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95, + 108,101,110,95,95,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,3,0,0,0,67,0,0,0,243,12, + 0,0,0,100,1,160,0,124,0,106,1,161,1,83,0,41, + 2,78,122,20,95,78,97,109,101,115,112,97,99,101,80,97, + 116,104,40,123,33,114,125,41,41,2,114,91,0,0,0,114, + 50,1,0,0,114,22,1,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,218,8,95,95,114,101,112,114, + 95,95,246,4,0,0,114,64,1,0,0,122,23,95,78,97, + 109,101,115,112,97,99,101,80,97,116,104,46,95,95,114,101, + 112,114,95,95,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,67,0,0,0,115,12,0, + 0,0,124,1,124,0,160,0,161,0,118,0,83,0,114,71, + 0,0,0,114,65,1,0,0,169,2,114,144,0,0,0,218, + 4,105,116,101,109,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,218,12,95,95,99,111,110,116,97,105,110,115, + 95,95,249,4,0,0,114,64,1,0,0,122,27,95,78,97, + 109,101,115,112,97,99,101,80,97,116,104,46,95,95,99,111, + 110,116,97,105,110,115,95,95,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, + 0,115,16,0,0,0,124,0,106,0,160,1,124,1,161,1, + 1,0,100,0,83,0,114,71,0,0,0,41,2,114,50,1, + 0,0,114,63,0,0,0,114,72,1,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,114,63,0,0,0, + 252,4,0,0,243,2,0,0,0,16,1,122,21,95,78,97, + 109,101,115,112,97,99,101,80,97,116,104,46,97,112,112,101, + 110,100,78,41,16,114,151,0,0,0,114,150,0,0,0,114, + 152,0,0,0,114,153,0,0,0,114,53,1,0,0,114,237, + 0,0,0,114,58,1,0,0,114,51,1,0,0,114,60,1, + 0,0,114,63,1,0,0,114,67,1,0,0,114,68,1,0, + 0,114,69,1,0,0,114,71,1,0,0,114,74,1,0,0, + 114,63,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,114,48,1,0,0,188,4, + 0,0,115,28,0,0,0,8,0,4,1,4,8,8,2,8, + 7,8,10,8,4,8,14,8,3,8,3,8,3,8,3,8, + 3,12,3,114,48,1,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, + 0,115,88,0,0,0,101,0,90,1,100,0,90,2,100,1, + 100,2,132,0,90,3,101,4,100,3,100,4,132,0,131,1, + 90,5,100,5,100,6,132,0,90,6,100,7,100,8,132,0, + 90,7,100,9,100,10,132,0,90,8,100,11,100,12,132,0, + 90,9,100,13,100,14,132,0,90,10,100,15,100,16,132,0, + 90,11,100,17,100,18,132,0,90,12,100,19,83,0,41,20, + 218,16,95,78,97,109,101,115,112,97,99,101,76,111,97,100, + 101,114,99,4,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,4,0,0,0,67,0,0,0,115,18,0,0,0, + 116,0,124,1,124,2,124,3,131,3,124,0,95,1,100,0, + 83,0,114,71,0,0,0,41,2,114,48,1,0,0,114,50, + 1,0,0,114,56,1,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,114,237,0,0,0,2,5,0,0, + 115,2,0,0,0,18,1,122,25,95,78,97,109,101,115,112, + 97,99,101,76,111,97,100,101,114,46,95,95,105,110,105,116, + 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,4,0,0,0,67,0,0,0,115,24,0,0,0, + 116,0,160,1,100,1,116,2,161,2,1,0,100,2,160,3, + 124,0,106,4,161,1,83,0,41,3,122,115,82,101,116,117, + 114,110,32,114,101,112,114,32,102,111,114,32,116,104,101,32, + 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, + 32,84,104,101,32,109,101,116,104,111,100,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,46,32,32,84,104,101,32, + 105,109,112,111,114,116,32,109,97,99,104,105,110,101,114,121, + 32,100,111,101,115,32,116,104,101,32,106,111,98,32,105,116, + 115,101,108,102,46,10,10,32,32,32,32,32,32,32,32,122, + 82,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, + 114,46,109,111,100,117,108,101,95,114,101,112,114,40,41,32, + 105,115,32,100,101,112,114,101,99,97,116,101,100,32,97,110, + 100,32,115,108,97,116,101,100,32,102,111,114,32,114,101,109, + 111,118,97,108,32,105,110,32,80,121,116,104,111,110,32,51, + 46,49,50,122,25,60,109,111,100,117,108,101,32,123,33,114, + 125,32,40,110,97,109,101,115,112,97,99,101,41,62,41,5, + 114,101,0,0,0,114,102,0,0,0,114,103,0,0,0,114, + 91,0,0,0,114,151,0,0,0,41,1,114,245,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, + 11,109,111,100,117,108,101,95,114,101,112,114,5,5,0,0, + 115,8,0,0,0,6,7,2,1,4,255,12,2,122,28,95, 78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46, - 95,95,105,110,105,116,95,95,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0, - 0,115,24,0,0,0,116,0,160,1,100,1,116,2,161,2, - 1,0,100,2,160,3,124,0,106,4,161,1,83,0,41,3, - 122,115,82,101,116,117,114,110,32,114,101,112,114,32,102,111, - 114,32,116,104,101,32,109,111,100,117,108,101,46,10,10,32, - 32,32,32,32,32,32,32,84,104,101,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, - 32,32,84,104,101,32,105,109,112,111,114,116,32,109,97,99, - 104,105,110,101,114,121,32,100,111,101,115,32,116,104,101,32, - 106,111,98,32,105,116,115,101,108,102,46,10,10,32,32,32, - 32,32,32,32,32,122,82,95,78,97,109,101,115,112,97,99, - 101,76,111,97,100,101,114,46,109,111,100,117,108,101,95,114, - 101,112,114,40,41,32,105,115,32,100,101,112,114,101,99,97, - 116,101,100,32,97,110,100,32,115,108,97,116,101,100,32,102, - 111,114,32,114,101,109,111,118,97,108,32,105,110,32,80,121, - 116,104,111,110,32,51,46,49,50,122,25,60,109,111,100,117, - 108,101,32,123,33,114,125,32,40,110,97,109,101,115,112,97, - 99,101,41,62,41,5,114,99,0,0,0,114,100,0,0,0, - 114,101,0,0,0,114,89,0,0,0,114,150,0,0,0,41, - 1,114,244,0,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,218,11,109,111,100,117,108,101,95,114,101, - 112,114,1,5,0,0,115,8,0,0,0,6,7,2,1,4, - 255,12,2,122,28,95,78,97,109,101,115,112,97,99,101,76, - 111,97,100,101,114,46,109,111,100,117,108,101,95,114,101,112, - 114,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,114,23,0,0,0,41, - 2,78,84,114,7,0,0,0,114,247,0,0,0,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,114,206,0,0, - 0,12,5,0,0,243,2,0,0,0,4,1,122,27,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,105, - 115,95,112,97,99,107,97,103,101,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0, - 0,0,114,23,0,0,0,41,2,78,114,10,0,0,0,114, - 7,0,0,0,114,247,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,1,1,0,0,15,5,0, - 0,114,77,1,0,0,122,27,95,78,97,109,101,115,112,97, - 99,101,76,111,97,100,101,114,46,103,101,116,95,115,111,117, - 114,99,101,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,6,0,0,0,67,0,0,0,115,16,0,0, - 0,116,0,100,1,100,2,100,3,100,4,100,5,141,4,83, - 0,41,6,78,114,10,0,0,0,122,8,60,115,116,114,105, - 110,103,62,114,243,0,0,0,84,41,1,114,3,1,0,0, - 41,1,114,4,1,0,0,114,247,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,241,0,0,0, - 18,5,0,0,114,74,1,0,0,122,25,95,78,97,109,101, - 115,112,97,99,101,76,111,97,100,101,114,46,103,101,116,95, - 99,111,100,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,114,23,0, - 0,0,114,237,0,0,0,114,7,0,0,0,114,238,0,0, - 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,239,0,0,0,21,5,0,0,114,240,0,0,0,122,30, - 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, - 46,99,114,101,97,116,101,95,109,111,100,117,108,101,99,2, + 109,111,100,117,108,101,95,114,101,112,114,99,2,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, + 67,0,0,0,114,25,0,0,0,41,2,78,84,114,9,0, + 0,0,114,248,0,0,0,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,114,207,0,0,0,16,5,0,0,243, + 2,0,0,0,4,1,122,27,95,78,97,109,101,115,112,97, + 99,101,76,111,97,100,101,114,46,105,115,95,112,97,99,107, + 97,103,101,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,1,0,0,0,67,0,0,0,114,25,0,0, + 0,41,2,78,114,3,0,0,0,114,9,0,0,0,114,248, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,114,2,1,0,0,19,5,0,0,114,78,1,0,0, + 122,27,95,78,97,109,101,115,112,97,99,101,76,111,97,100, + 101,114,46,103,101,116,95,115,111,117,114,99,101,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,6,0, + 0,0,67,0,0,0,115,16,0,0,0,116,0,100,1,100, + 2,100,3,100,4,100,5,141,4,83,0,41,6,78,114,3, + 0,0,0,122,8,60,115,116,114,105,110,103,62,114,244,0, + 0,0,84,41,1,114,4,1,0,0,41,1,114,5,1,0, + 0,114,248,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,114,242,0,0,0,22,5,0,0,114,75, + 1,0,0,122,25,95,78,97,109,101,115,112,97,99,101,76, + 111,97,100,101,114,46,103,101,116,95,99,111,100,101,99,2, 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, - 0,0,0,67,0,0,0,115,4,0,0,0,100,0,83,0, - 114,69,0,0,0,114,7,0,0,0,114,42,1,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,245, - 0,0,0,24,5,0,0,114,77,1,0,0,122,28,95,78, - 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,101, - 120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67, - 0,0,0,115,26,0,0,0,116,0,160,1,100,1,124,0, - 106,2,161,2,1,0,116,0,160,3,124,0,124,1,161,2, - 83,0,41,2,122,98,76,111,97,100,32,97,32,110,97,109, - 101,115,112,97,99,101,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, - 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, - 32,32,32,32,32,32,32,32,122,38,110,97,109,101,115,112, - 97,99,101,32,109,111,100,117,108,101,32,108,111,97,100,101, - 100,32,119,105,116,104,32,112,97,116,104,32,123,33,114,125, - 41,4,114,159,0,0,0,114,173,0,0,0,114,49,1,0, - 0,114,246,0,0,0,114,247,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,248,0,0,0,27, - 5,0,0,115,8,0,0,0,6,7,4,1,4,255,12,3, - 122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100, - 101,114,46,108,111,97,100,95,109,111,100,117,108,101,99,2, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2, - 0,0,0,67,0,0,0,115,22,0,0,0,100,1,100,2, - 108,0,109,1,125,2,1,0,124,2,124,0,106,2,131,1, - 83,0,41,3,78,114,0,0,0,0,41,1,218,15,78,97, - 109,101,115,112,97,99,101,82,101,97,100,101,114,41,3,114, - 32,1,0,0,114,78,1,0,0,114,49,1,0,0,41,3, - 114,143,0,0,0,114,244,0,0,0,114,78,1,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,33, - 1,0,0,39,5,0,0,115,4,0,0,0,12,1,10,1, - 122,36,95,78,97,109,101,115,112,97,99,101,76,111,97,100, - 101,114,46,103,101,116,95,114,101,115,111,117,114,99,101,95, - 114,101,97,100,101,114,78,41,13,114,150,0,0,0,114,149, - 0,0,0,114,151,0,0,0,114,236,0,0,0,114,233,0, - 0,0,114,76,1,0,0,114,206,0,0,0,114,1,1,0, - 0,114,241,0,0,0,114,239,0,0,0,114,245,0,0,0, - 114,248,0,0,0,114,33,1,0,0,114,7,0,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,75, - 1,0,0,253,4,0,0,115,22,0,0,0,8,0,8,1, - 2,3,10,1,8,10,8,3,8,3,8,3,8,3,8,3, - 12,12,114,75,1,0,0,99,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,4,0,0,0,64,0,0,0, - 115,118,0,0,0,101,0,90,1,100,0,90,2,100,1,90, - 3,101,4,100,2,100,3,132,0,131,1,90,5,101,4,100, - 4,100,5,132,0,131,1,90,6,101,7,100,6,100,7,132, - 0,131,1,90,8,101,7,100,8,100,9,132,0,131,1,90, - 9,101,7,100,19,100,11,100,12,132,1,131,1,90,10,101, - 7,100,20,100,13,100,14,132,1,131,1,90,11,101,7,100, - 19,100,15,100,16,132,1,131,1,90,12,101,4,100,17,100, - 18,132,0,131,1,90,13,100,10,83,0,41,21,218,10,80, - 97,116,104,70,105,110,100,101,114,122,62,77,101,116,97,32, - 112,97,116,104,32,102,105,110,100,101,114,32,102,111,114,32, - 115,121,115,46,112,97,116,104,32,97,110,100,32,112,97,99, - 107,97,103,101,32,95,95,112,97,116,104,95,95,32,97,116, - 116,114,105,98,117,116,101,115,46,99,0,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,4,0,0,0,67,0, - 0,0,115,78,0,0,0,116,0,116,1,106,2,160,3,161, - 0,131,1,68,0,93,22,92,2,125,0,125,1,124,1,100, - 1,117,0,114,20,116,1,106,2,124,0,61,0,113,7,116, - 4,124,1,100,2,131,2,114,29,124,1,160,5,161,0,1, - 0,113,7,116,6,4,0,106,7,100,3,55,0,2,0,95, - 7,100,1,83,0,41,4,122,125,67,97,108,108,32,116,104, - 101,32,105,110,118,97,108,105,100,97,116,101,95,99,97,99, - 104,101,115,40,41,32,109,101,116,104,111,100,32,111,110,32, - 97,108,108,32,112,97,116,104,32,101,110,116,114,121,32,102, - 105,110,100,101,114,115,10,32,32,32,32,32,32,32,32,115, - 116,111,114,101,100,32,105,110,32,115,121,115,46,112,97,116, - 104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,101, - 115,32,40,119,104,101,114,101,32,105,109,112,108,101,109,101, - 110,116,101,100,41,46,78,218,17,105,110,118,97,108,105,100, - 97,116,101,95,99,97,99,104,101,115,114,3,0,0,0,41, - 8,218,4,108,105,115,116,114,15,0,0,0,218,19,112,97, - 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, - 101,218,5,105,116,101,109,115,114,153,0,0,0,114,80,1, - 0,0,114,47,1,0,0,114,52,1,0,0,41,2,114,141, - 0,0,0,218,6,102,105,110,100,101,114,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,80,1,0,0,50, - 5,0,0,115,14,0,0,0,22,4,8,1,10,1,10,1, - 8,1,2,128,18,3,122,28,80,97,116,104,70,105,110,100, - 101,114,46,105,110,118,97,108,105,100,97,116,101,95,99,97, - 99,104,101,115,99,1,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,9,0,0,0,67,0,0,0,115,76,0, - 0,0,116,0,106,1,100,1,117,1,114,14,116,0,106,1, - 115,14,116,2,160,3,100,2,116,4,161,2,1,0,116,0, - 106,1,68,0,93,18,125,1,122,7,124,1,124,0,131,1, - 87,0,2,0,1,0,83,0,4,0,116,5,121,35,1,0, - 1,0,1,0,89,0,113,17,119,0,100,1,83,0,41,3, - 122,46,83,101,97,114,99,104,32,115,121,115,46,112,97,116, - 104,95,104,111,111,107,115,32,102,111,114,32,97,32,102,105, - 110,100,101,114,32,102,111,114,32,39,112,97,116,104,39,46, - 78,122,23,115,121,115,46,112,97,116,104,95,104,111,111,107, - 115,32,105,115,32,101,109,112,116,121,41,6,114,15,0,0, - 0,218,10,112,97,116,104,95,104,111,111,107,115,114,99,0, - 0,0,114,100,0,0,0,114,162,0,0,0,114,142,0,0, - 0,41,2,114,65,0,0,0,90,4,104,111,111,107,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,95, - 112,97,116,104,95,104,111,111,107,115,63,5,0,0,115,18, - 0,0,0,16,3,12,1,10,1,2,1,14,1,12,1,4, - 1,2,255,4,3,122,22,80,97,116,104,70,105,110,100,101, - 114,46,95,112,97,116,104,95,104,111,111,107,115,99,2,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0, - 0,0,67,0,0,0,115,100,0,0,0,124,1,100,1,107, - 2,114,21,122,6,116,0,160,1,161,0,125,1,87,0,110, - 10,4,0,116,2,121,20,1,0,1,0,1,0,89,0,100, - 2,83,0,119,0,122,8,116,3,106,4,124,1,25,0,125, - 2,87,0,124,2,83,0,4,0,116,5,121,49,1,0,1, - 0,1,0,124,0,160,6,124,1,161,1,125,2,124,2,116, - 3,106,4,124,1,60,0,89,0,124,2,83,0,119,0,41, - 3,122,210,71,101,116,32,116,104,101,32,102,105,110,100,101, - 114,32,102,111,114,32,116,104,101,32,112,97,116,104,32,101, - 110,116,114,121,32,102,114,111,109,32,115,121,115,46,112,97, - 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, - 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,116, - 104,101,32,112,97,116,104,32,101,110,116,114,121,32,105,115, - 32,110,111,116,32,105,110,32,116,104,101,32,99,97,99,104, - 101,44,32,102,105,110,100,32,116,104,101,32,97,112,112,114, - 111,112,114,105,97,116,101,32,102,105,110,100,101,114,10,32, - 32,32,32,32,32,32,32,97,110,100,32,99,97,99,104,101, - 32,105,116,46,32,73,102,32,110,111,32,102,105,110,100,101, - 114,32,105,115,32,97,118,97,105,108,97,98,108,101,44,32, - 115,116,111,114,101,32,78,111,110,101,46,10,10,32,32,32, - 32,32,32,32,32,114,10,0,0,0,78,41,7,114,18,0, - 0,0,114,82,0,0,0,218,17,70,105,108,101,78,111,116, - 70,111,117,110,100,69,114,114,111,114,114,15,0,0,0,114, - 82,1,0,0,218,8,75,101,121,69,114,114,111,114,114,86, - 1,0,0,41,3,114,221,0,0,0,114,65,0,0,0,114, - 84,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,20,95,112,97,116,104,95,105,109,112,111,114, - 116,101,114,95,99,97,99,104,101,76,5,0,0,115,28,0, - 0,0,8,8,2,1,12,1,12,1,6,3,2,253,2,4, - 12,1,4,4,12,253,10,1,12,1,4,1,2,253,122,31, - 80,97,116,104,70,105,110,100,101,114,46,95,112,97,116,104, - 95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,99, - 3,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0, - 4,0,0,0,67,0,0,0,115,138,0,0,0,116,0,124, - 2,100,1,131,2,114,27,116,1,160,2,124,2,161,1,155, - 0,100,2,157,2,125,3,116,3,160,4,124,3,116,5,161, - 2,1,0,124,2,160,6,124,1,161,1,92,2,125,4,125, - 5,110,21,116,1,160,2,124,2,161,1,155,0,100,3,157, - 2,125,3,116,3,160,4,124,3,116,5,161,2,1,0,124, - 2,160,7,124,1,161,1,125,4,103,0,125,5,124,4,100, - 0,117,1,114,58,116,1,160,8,124,1,124,4,161,2,83, - 0,116,1,160,9,124,1,100,0,161,2,125,6,124,5,124, - 6,95,10,124,6,83,0,41,4,78,114,161,0,0,0,122, - 53,46,102,105,110,100,95,115,112,101,99,40,41,32,110,111, - 116,32,102,111,117,110,100,59,32,102,97,108,108,105,110,103, - 32,98,97,99,107,32,116,111,32,102,105,110,100,95,108,111, - 97,100,101,114,40,41,122,53,46,102,105,110,100,95,115,112, - 101,99,40,41,32,110,111,116,32,102,111,117,110,100,59,32, - 102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32, - 102,105,110,100,95,109,111,100,117,108,101,40,41,41,11,114, - 153,0,0,0,114,159,0,0,0,90,12,95,111,98,106,101, - 99,116,95,110,97,109,101,114,99,0,0,0,114,100,0,0, - 0,114,162,0,0,0,114,161,0,0,0,114,229,0,0,0, - 114,224,0,0,0,114,207,0,0,0,114,202,0,0,0,41, - 7,114,221,0,0,0,114,163,0,0,0,114,84,1,0,0, - 114,166,0,0,0,114,164,0,0,0,114,165,0,0,0,114, - 210,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,218,16,95,108,101,103,97,99,121,95,103,101,116, - 95,115,112,101,99,98,5,0,0,115,26,0,0,0,10,4, - 16,1,12,2,16,1,16,2,12,2,10,1,4,1,8,1, - 12,1,12,1,6,1,4,1,122,27,80,97,116,104,70,105, - 110,100,101,114,46,95,108,101,103,97,99,121,95,103,101,116, - 95,115,112,101,99,78,99,4,0,0,0,0,0,0,0,0, - 0,0,0,9,0,0,0,5,0,0,0,67,0,0,0,115, - 166,0,0,0,103,0,125,4,124,2,68,0,93,67,125,5, - 116,0,124,5,116,1,116,2,102,2,131,2,115,14,113,4, - 124,0,160,3,124,5,161,1,125,6,124,6,100,1,117,1, - 114,71,116,4,124,6,100,2,131,2,114,35,124,6,160,5, - 124,1,124,3,161,2,125,7,110,6,124,0,160,6,124,1, - 124,6,161,2,125,7,124,7,100,1,117,0,114,46,113,4, - 124,7,106,7,100,1,117,1,114,55,124,7,2,0,1,0, - 83,0,124,7,106,8,125,8,124,8,100,1,117,0,114,66, - 116,9,100,3,131,1,130,1,124,4,160,10,124,8,161,1, - 1,0,113,4,116,11,160,12,124,1,100,1,161,2,125,7, - 124,4,124,7,95,8,124,7,83,0,41,4,122,63,70,105, - 110,100,32,116,104,101,32,108,111,97,100,101,114,32,111,114, - 32,110,97,109,101,115,112,97,99,101,95,112,97,116,104,32, - 102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,47, - 112,97,99,107,97,103,101,32,110,97,109,101,46,78,114,226, - 0,0,0,122,19,115,112,101,99,32,109,105,115,115,105,110, - 103,32,108,111,97,100,101,114,41,13,114,185,0,0,0,114, - 109,0,0,0,218,5,98,121,116,101,115,114,89,1,0,0, - 114,153,0,0,0,114,226,0,0,0,114,90,1,0,0,114, - 164,0,0,0,114,202,0,0,0,114,142,0,0,0,114,191, - 0,0,0,114,159,0,0,0,114,207,0,0,0,41,9,114, - 221,0,0,0,114,163,0,0,0,114,65,0,0,0,114,225, - 0,0,0,218,14,110,97,109,101,115,112,97,99,101,95,112, - 97,116,104,90,5,101,110,116,114,121,114,84,1,0,0,114, - 210,0,0,0,114,165,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,218,9,95,103,101,116,95,115, - 112,101,99,119,5,0,0,115,42,0,0,0,4,5,8,1, - 14,1,2,1,10,1,8,1,10,1,14,1,12,2,8,1, - 2,1,10,1,8,1,6,1,8,1,8,1,10,5,2,128, - 12,2,6,1,4,1,122,20,80,97,116,104,70,105,110,100, - 101,114,46,95,103,101,116,95,115,112,101,99,99,4,0,0, - 0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,0, - 0,67,0,0,0,115,94,0,0,0,124,2,100,1,117,0, - 114,7,116,0,106,1,125,2,124,0,160,2,124,1,124,2, - 124,3,161,3,125,4,124,4,100,1,117,0,114,20,100,1, - 83,0,124,4,106,3,100,1,117,0,114,45,124,4,106,4, - 125,5,124,5,114,43,100,1,124,4,95,5,116,6,124,1, - 124,5,124,0,106,2,131,3,124,4,95,4,124,4,83,0, - 100,1,83,0,124,4,83,0,41,2,122,141,84,114,121,32, - 116,111,32,102,105,110,100,32,97,32,115,112,101,99,32,102, - 111,114,32,39,102,117,108,108,110,97,109,101,39,32,111,110, - 32,115,121,115,46,112,97,116,104,32,111,114,32,39,112,97, - 116,104,39,46,10,10,32,32,32,32,32,32,32,32,84,104, - 101,32,115,101,97,114,99,104,32,105,115,32,98,97,115,101, - 100,32,111,110,32,115,121,115,46,112,97,116,104,95,104,111, - 111,107,115,32,97,110,100,32,115,121,115,46,112,97,116,104, - 95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,46, - 10,32,32,32,32,32,32,32,32,78,41,7,114,15,0,0, - 0,114,65,0,0,0,114,93,1,0,0,114,164,0,0,0, - 114,202,0,0,0,114,205,0,0,0,114,47,1,0,0,41, - 6,114,221,0,0,0,114,163,0,0,0,114,65,0,0,0, - 114,225,0,0,0,114,210,0,0,0,114,92,1,0,0,114, - 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,226, - 0,0,0,151,5,0,0,115,26,0,0,0,8,6,6,1, - 14,1,8,1,4,1,10,1,6,1,4,1,6,3,16,1, - 4,1,4,2,4,2,122,20,80,97,116,104,70,105,110,100, - 101,114,46,102,105,110,100,95,115,112,101,99,99,3,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, - 0,67,0,0,0,115,42,0,0,0,116,0,160,1,100,1, - 116,2,161,2,1,0,124,0,160,3,124,1,124,2,161,2, - 125,3,124,3,100,2,117,0,114,18,100,2,83,0,124,3, - 106,4,83,0,41,3,122,170,102,105,110,100,32,116,104,101, - 32,109,111,100,117,108,101,32,111,110,32,115,121,115,46,112, - 97,116,104,32,111,114,32,39,112,97,116,104,39,32,98,97, - 115,101,100,32,111,110,32,115,121,115,46,112,97,116,104,95, - 104,111,111,107,115,32,97,110,100,10,32,32,32,32,32,32, - 32,32,115,121,115,46,112,97,116,104,95,105,109,112,111,114, - 116,101,114,95,99,97,99,104,101,46,10,10,32,32,32,32, - 32,32,32,32,84,104,105,115,32,109,101,116,104,111,100,32, - 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,32, - 85,115,101,32,102,105,110,100,95,115,112,101,99,40,41,32, + 0,0,0,67,0,0,0,114,25,0,0,0,114,238,0,0, + 0,114,9,0,0,0,114,239,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,114,240,0,0,0,25, + 5,0,0,114,241,0,0,0,122,30,95,78,97,109,101,115, + 112,97,99,101,76,111,97,100,101,114,46,99,114,101,97,116, + 101,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, + 0,115,4,0,0,0,100,0,83,0,114,71,0,0,0,114, + 9,0,0,0,114,43,1,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,114,246,0,0,0,28,5,0, + 0,114,78,1,0,0,122,28,95,78,97,109,101,115,112,97, + 99,101,76,111,97,100,101,114,46,101,120,101,99,95,109,111, + 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,4,0,0,0,67,0,0,0,115,26,0, + 0,0,116,0,160,1,100,1,124,0,106,2,161,2,1,0, + 116,0,160,3,124,0,124,1,161,2,83,0,41,2,122,98, + 76,111,97,100,32,97,32,110,97,109,101,115,112,97,99,101, + 32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,32, + 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, + 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115, + 101,32,101,120,101,99,95,109,111,100,117,108,101,40,41,32, 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32, - 32,32,122,101,80,97,116,104,70,105,110,100,101,114,46,102, - 105,110,100,95,109,111,100,117,108,101,40,41,32,105,115,32, - 100,101,112,114,101,99,97,116,101,100,32,97,110,100,32,115, - 108,97,116,101,100,32,102,111,114,32,114,101,109,111,118,97, - 108,32,105,110,32,80,121,116,104,111,110,32,51,46,49,50, - 59,32,117,115,101,32,102,105,110,100,95,115,112,101,99,40, - 41,32,105,110,115,116,101,97,100,78,114,227,0,0,0,114, - 228,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,229,0,0,0,175,5,0,0,115,14,0,0, - 0,6,8,2,2,4,254,12,3,8,1,4,1,6,1,122, - 22,80,97,116,104,70,105,110,100,101,114,46,102,105,110,100, - 95,109,111,100,117,108,101,99,0,0,0,0,0,0,0,0, - 0,0,0,0,3,0,0,0,4,0,0,0,79,0,0,0, - 115,28,0,0,0,100,1,100,2,108,0,109,1,125,2,1, - 0,124,2,106,2,124,0,105,0,124,1,164,1,142,1,83, - 0,41,3,97,32,1,0,0,10,32,32,32,32,32,32,32, - 32,70,105,110,100,32,100,105,115,116,114,105,98,117,116,105, - 111,110,115,46,10,10,32,32,32,32,32,32,32,32,82,101, - 116,117,114,110,32,97,110,32,105,116,101,114,97,98,108,101, - 32,111,102,32,97,108,108,32,68,105,115,116,114,105,98,117, - 116,105,111,110,32,105,110,115,116,97,110,99,101,115,32,99, - 97,112,97,98,108,101,32,111,102,10,32,32,32,32,32,32, - 32,32,108,111,97,100,105,110,103,32,116,104,101,32,109,101, - 116,97,100,97,116,97,32,102,111,114,32,112,97,99,107,97, - 103,101,115,32,109,97,116,99,104,105,110,103,32,96,96,99, - 111,110,116,101,120,116,46,110,97,109,101,96,96,10,32,32, - 32,32,32,32,32,32,40,111,114,32,97,108,108,32,110,97, - 109,101,115,32,105,102,32,96,96,78,111,110,101,96,96,32, - 105,110,100,105,99,97,116,101,100,41,32,97,108,111,110,103, - 32,116,104,101,32,112,97,116,104,115,32,105,110,32,116,104, - 101,32,108,105,115,116,10,32,32,32,32,32,32,32,32,111, - 102,32,100,105,114,101,99,116,111,114,105,101,115,32,96,96, - 99,111,110,116,101,120,116,46,112,97,116,104,96,96,46,10, - 32,32,32,32,32,32,32,32,114,0,0,0,0,41,1,218, - 18,77,101,116,97,100,97,116,97,80,97,116,104,70,105,110, - 100,101,114,41,3,90,18,105,109,112,111,114,116,108,105,98, - 46,109,101,116,97,100,97,116,97,114,94,1,0,0,218,18, - 102,105,110,100,95,100,105,115,116,114,105,98,117,116,105,111, - 110,115,41,3,114,144,0,0,0,114,145,0,0,0,114,94, - 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,95,1,0,0,191,5,0,0,115,4,0,0,0, - 12,10,16,1,122,29,80,97,116,104,70,105,110,100,101,114, - 46,102,105,110,100,95,100,105,115,116,114,105,98,117,116,105, - 111,110,115,114,69,0,0,0,114,230,0,0,0,41,14,114, - 150,0,0,0,114,149,0,0,0,114,151,0,0,0,114,152, - 0,0,0,114,233,0,0,0,114,80,1,0,0,114,86,1, - 0,0,114,234,0,0,0,114,89,1,0,0,114,90,1,0, - 0,114,93,1,0,0,114,226,0,0,0,114,229,0,0,0, - 114,95,1,0,0,114,7,0,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,79,1,0,0,46,5, - 0,0,115,36,0,0,0,8,0,4,2,2,2,10,1,2, - 12,10,1,2,12,10,1,2,21,10,1,2,20,12,1,2, - 31,12,1,2,23,12,1,2,15,14,1,114,79,1,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,64,0,0,0,115,90,0,0,0,101,0, - 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, - 90,4,100,4,100,5,132,0,90,5,101,6,90,7,100,6, - 100,7,132,0,90,8,100,8,100,9,132,0,90,9,100,19, - 100,11,100,12,132,1,90,10,100,13,100,14,132,0,90,11, - 101,12,100,15,100,16,132,0,131,1,90,13,100,17,100,18, - 132,0,90,14,100,10,83,0,41,20,218,10,70,105,108,101, - 70,105,110,100,101,114,122,172,70,105,108,101,45,98,97,115, - 101,100,32,102,105,110,100,101,114,46,10,10,32,32,32,32, - 73,110,116,101,114,97,99,116,105,111,110,115,32,119,105,116, - 104,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101, - 109,32,97,114,101,32,99,97,99,104,101,100,32,102,111,114, - 32,112,101,114,102,111,114,109,97,110,99,101,44,32,98,101, - 105,110,103,10,32,32,32,32,114,101,102,114,101,115,104,101, - 100,32,119,104,101,110,32,116,104,101,32,100,105,114,101,99, - 116,111,114,121,32,116,104,101,32,102,105,110,100,101,114,32, - 105,115,32,104,97,110,100,108,105,110,103,32,104,97,115,32, - 98,101,101,110,32,109,111,100,105,102,105,101,100,46,10,10, - 32,32,32,32,99,2,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,6,0,0,0,7,0,0,0,115,112,0, - 0,0,103,0,125,3,124,2,68,0,93,16,92,2,137,0, - 125,4,124,3,160,0,135,0,102,1,100,1,100,2,132,8, - 124,4,68,0,131,1,161,1,1,0,113,4,124,3,124,0, - 95,1,124,1,112,27,100,3,124,0,95,2,116,3,124,0, - 106,2,131,1,115,43,116,4,116,5,160,6,161,0,124,0, - 106,2,131,2,124,0,95,2,100,4,124,0,95,7,116,8, - 131,0,124,0,95,9,116,8,131,0,124,0,95,10,100,5, - 83,0,41,6,122,154,73,110,105,116,105,97,108,105,122,101, - 32,119,105,116,104,32,116,104,101,32,112,97,116,104,32,116, - 111,32,115,101,97,114,99,104,32,111,110,32,97,110,100,32, - 97,32,118,97,114,105,97,98,108,101,32,110,117,109,98,101, - 114,32,111,102,10,32,32,32,32,32,32,32,32,50,45,116, - 117,112,108,101,115,32,99,111,110,116,97,105,110,105,110,103, - 32,116,104,101,32,108,111,97,100,101,114,32,97,110,100,32, - 116,104,101,32,102,105,108,101,32,115,117,102,102,105,120,101, - 115,32,116,104,101,32,108,111,97,100,101,114,10,32,32,32, - 32,32,32,32,32,114,101,99,111,103,110,105,122,101,115,46, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,3,0,0,0,51,0,0,0,115,24,0,0,0,129,0, - 124,0,93,7,125,1,124,1,136,0,102,2,86,0,1,0, - 113,2,100,0,83,0,114,69,0,0,0,114,7,0,0,0, - 114,43,1,0,0,169,1,114,164,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,9,0,0,0,220,5,0,0,115, - 4,0,0,0,2,128,22,0,122,38,70,105,108,101,70,105, - 110,100,101,114,46,95,95,105,110,105,116,95,95,46,60,108, - 111,99,97,108,115,62,46,60,103,101,110,101,120,112,114,62, - 114,97,0,0,0,114,130,0,0,0,78,41,11,114,191,0, - 0,0,218,8,95,108,111,97,100,101,114,115,114,65,0,0, - 0,114,86,0,0,0,114,67,0,0,0,114,18,0,0,0, - 114,82,0,0,0,218,11,95,112,97,116,104,95,109,116,105, - 109,101,218,3,115,101,116,218,11,95,112,97,116,104,95,99, - 97,99,104,101,218,19,95,114,101,108,97,120,101,100,95,112, - 97,116,104,95,99,97,99,104,101,41,5,114,143,0,0,0, - 114,65,0,0,0,218,14,108,111,97,100,101,114,95,100,101, - 116,97,105,108,115,90,7,108,111,97,100,101,114,115,114,212, - 0,0,0,114,7,0,0,0,114,97,1,0,0,114,8,0, - 0,0,114,236,0,0,0,214,5,0,0,115,20,0,0,0, - 4,4,12,1,26,1,6,1,10,2,10,1,18,1,6,1, - 8,1,12,1,122,19,70,105,108,101,70,105,110,100,101,114, - 46,95,95,105,110,105,116,95,95,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,2,0,0,0,67,0, - 0,0,115,10,0,0,0,100,1,124,0,95,0,100,2,83, - 0,41,3,122,31,73,110,118,97,108,105,100,97,116,101,32, - 116,104,101,32,100,105,114,101,99,116,111,114,121,32,109,116, - 105,109,101,46,114,130,0,0,0,78,41,1,114,99,1,0, - 0,114,21,1,0,0,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,80,1,0,0,230,5,0,0,114,81, - 0,0,0,122,28,70,105,108,101,70,105,110,100,101,114,46, - 105,110,118,97,108,105,100,97,116,101,95,99,97,99,104,101, - 115,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,4,0,0,0,67,0,0,0,115,54,0,0,0,116, - 0,160,1,100,1,116,2,161,2,1,0,124,0,160,3,124, - 1,161,1,125,2,124,2,100,2,117,0,114,19,100,2,103, - 0,102,2,83,0,124,2,106,4,124,2,106,5,112,25,103, - 0,102,2,83,0,41,3,122,197,84,114,121,32,116,111,32, - 102,105,110,100,32,97,32,108,111,97,100,101,114,32,102,111, - 114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32, - 109,111,100,117,108,101,44,32,111,114,32,116,104,101,32,110, - 97,109,101,115,112,97,99,101,10,32,32,32,32,32,32,32, - 32,112,97,99,107,97,103,101,32,112,111,114,116,105,111,110, - 115,46,32,82,101,116,117,114,110,115,32,40,108,111,97,100, - 101,114,44,32,108,105,115,116,45,111,102,45,112,111,114,116, - 105,111,110,115,41,46,10,10,32,32,32,32,32,32,32,32, - 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, - 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32, + 32,32,122,38,110,97,109,101,115,112,97,99,101,32,109,111, + 100,117,108,101,32,108,111,97,100,101,100,32,119,105,116,104, + 32,112,97,116,104,32,123,33,114,125,41,4,114,160,0,0, + 0,114,174,0,0,0,114,50,1,0,0,114,247,0,0,0, + 114,248,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,114,249,0,0,0,31,5,0,0,115,8,0, + 0,0,6,7,4,1,4,255,12,3,122,28,95,78,97,109, + 101,115,112,97,99,101,76,111,97,100,101,114,46,108,111,97, + 100,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,0, + 0,115,22,0,0,0,100,1,100,2,108,0,109,1,125,2, + 1,0,124,2,124,0,106,2,131,1,83,0,41,3,78,114, + 0,0,0,0,41,1,218,15,78,97,109,101,115,112,97,99, + 101,82,101,97,100,101,114,41,3,114,33,1,0,0,114,79, + 1,0,0,114,50,1,0,0,41,3,114,144,0,0,0,114, + 245,0,0,0,114,79,1,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,114,34,1,0,0,43,5,0, + 0,115,4,0,0,0,12,1,10,1,122,36,95,78,97,109, + 101,115,112,97,99,101,76,111,97,100,101,114,46,103,101,116, + 95,114,101,115,111,117,114,99,101,95,114,101,97,100,101,114, + 78,41,13,114,151,0,0,0,114,150,0,0,0,114,152,0, + 0,0,114,237,0,0,0,114,234,0,0,0,114,77,1,0, + 0,114,207,0,0,0,114,2,1,0,0,114,242,0,0,0, + 114,240,0,0,0,114,246,0,0,0,114,249,0,0,0,114, + 34,1,0,0,114,9,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,114,76,1,0,0,1,5,0, + 0,115,22,0,0,0,8,0,8,1,2,3,10,1,8,10, + 8,3,8,3,8,3,8,3,8,3,12,12,114,76,1,0, + 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,64,0,0,0,115,118,0,0,0,101, + 0,90,1,100,0,90,2,100,1,90,3,101,4,100,2,100, + 3,132,0,131,1,90,5,101,4,100,4,100,5,132,0,131, + 1,90,6,101,7,100,6,100,7,132,0,131,1,90,8,101, + 7,100,8,100,9,132,0,131,1,90,9,101,7,100,19,100, + 11,100,12,132,1,131,1,90,10,101,7,100,20,100,13,100, + 14,132,1,131,1,90,11,101,7,100,19,100,15,100,16,132, + 1,131,1,90,12,101,4,100,17,100,18,132,0,131,1,90, + 13,100,10,83,0,41,21,218,10,80,97,116,104,70,105,110, + 100,101,114,122,62,77,101,116,97,32,112,97,116,104,32,102, + 105,110,100,101,114,32,102,111,114,32,115,121,115,46,112,97, + 116,104,32,97,110,100,32,112,97,99,107,97,103,101,32,95, + 95,112,97,116,104,95,95,32,97,116,116,114,105,98,117,116, + 101,115,46,99,0,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,4,0,0,0,67,0,0,0,115,78,0,0, + 0,116,0,116,1,106,2,160,3,161,0,131,1,68,0,93, + 22,92,2,125,0,125,1,124,1,100,1,117,0,114,20,116, + 1,106,2,124,0,61,0,113,7,116,4,124,1,100,2,131, + 2,114,29,124,1,160,5,161,0,1,0,113,7,116,6,4, + 0,106,7,100,3,55,0,2,0,95,7,100,1,83,0,41, + 4,122,125,67,97,108,108,32,116,104,101,32,105,110,118,97, + 108,105,100,97,116,101,95,99,97,99,104,101,115,40,41,32, + 109,101,116,104,111,100,32,111,110,32,97,108,108,32,112,97, + 116,104,32,101,110,116,114,121,32,102,105,110,100,101,114,115, + 10,32,32,32,32,32,32,32,32,115,116,111,114,101,100,32, + 105,110,32,115,121,115,46,112,97,116,104,95,105,109,112,111, + 114,116,101,114,95,99,97,99,104,101,115,32,40,119,104,101, + 114,101,32,105,109,112,108,101,109,101,110,116,101,100,41,46, + 78,218,17,105,110,118,97,108,105,100,97,116,101,95,99,97, + 99,104,101,115,114,5,0,0,0,41,8,218,4,108,105,115, + 116,114,16,0,0,0,218,19,112,97,116,104,95,105,109,112, + 111,114,116,101,114,95,99,97,99,104,101,218,5,105,116,101, + 109,115,114,154,0,0,0,114,81,1,0,0,114,48,1,0, + 0,114,53,1,0,0,41,2,114,142,0,0,0,218,6,102, + 105,110,100,101,114,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,114,81,1,0,0,54,5,0,0,115,14,0, + 0,0,22,4,8,1,10,1,10,1,8,1,2,128,18,3, + 122,28,80,97,116,104,70,105,110,100,101,114,46,105,110,118, + 97,108,105,100,97,116,101,95,99,97,99,104,101,115,99,1, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,9, + 0,0,0,67,0,0,0,115,76,0,0,0,116,0,106,1, + 100,1,117,1,114,14,116,0,106,1,115,14,116,2,160,3, + 100,2,116,4,161,2,1,0,116,0,106,1,68,0,93,18, + 125,1,122,7,124,1,124,0,131,1,87,0,2,0,1,0, + 83,0,4,0,116,5,121,35,1,0,1,0,1,0,89,0, + 113,17,119,0,100,1,83,0,41,3,122,46,83,101,97,114, + 99,104,32,115,121,115,46,112,97,116,104,95,104,111,111,107, + 115,32,102,111,114,32,97,32,102,105,110,100,101,114,32,102, + 111,114,32,39,112,97,116,104,39,46,78,122,23,115,121,115, + 46,112,97,116,104,95,104,111,111,107,115,32,105,115,32,101, + 109,112,116,121,41,6,114,16,0,0,0,218,10,112,97,116, + 104,95,104,111,111,107,115,114,101,0,0,0,114,102,0,0, + 0,114,163,0,0,0,114,143,0,0,0,41,2,114,67,0, + 0,0,90,4,104,111,111,107,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,11,95,112,97,116,104,95,104, + 111,111,107,115,67,5,0,0,115,18,0,0,0,16,3,12, + 1,10,1,2,1,14,1,12,1,4,1,2,255,4,3,122, + 22,80,97,116,104,70,105,110,100,101,114,46,95,112,97,116, + 104,95,104,111,111,107,115,99,2,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,8,0,0,0,67,0,0,0, + 115,100,0,0,0,124,1,100,1,107,2,114,21,122,6,116, + 0,160,1,161,0,125,1,87,0,110,10,4,0,116,2,121, + 20,1,0,1,0,1,0,89,0,100,2,83,0,119,0,122, + 8,116,3,106,4,124,1,25,0,125,2,87,0,124,2,83, + 0,4,0,116,5,121,49,1,0,1,0,1,0,124,0,160, + 6,124,1,161,1,125,2,124,2,116,3,106,4,124,1,60, + 0,89,0,124,2,83,0,119,0,41,3,122,210,71,101,116, + 32,116,104,101,32,102,105,110,100,101,114,32,102,111,114,32, + 116,104,101,32,112,97,116,104,32,101,110,116,114,121,32,102, + 114,111,109,32,115,121,115,46,112,97,116,104,95,105,109,112, + 111,114,116,101,114,95,99,97,99,104,101,46,10,10,32,32, + 32,32,32,32,32,32,73,102,32,116,104,101,32,112,97,116, + 104,32,101,110,116,114,121,32,105,115,32,110,111,116,32,105, + 110,32,116,104,101,32,99,97,99,104,101,44,32,102,105,110, + 100,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116, + 101,32,102,105,110,100,101,114,10,32,32,32,32,32,32,32, + 32,97,110,100,32,99,97,99,104,101,32,105,116,46,32,73, + 102,32,110,111,32,102,105,110,100,101,114,32,105,115,32,97, + 118,97,105,108,97,98,108,101,44,32,115,116,111,114,101,32, + 78,111,110,101,46,10,10,32,32,32,32,32,32,32,32,114, + 3,0,0,0,78,41,7,114,19,0,0,0,114,84,0,0, + 0,218,17,70,105,108,101,78,111,116,70,111,117,110,100,69, + 114,114,111,114,114,16,0,0,0,114,83,1,0,0,218,8, + 75,101,121,69,114,114,111,114,114,87,1,0,0,41,3,114, + 222,0,0,0,114,67,0,0,0,114,85,1,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,20,95, + 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97, + 99,104,101,80,5,0,0,115,28,0,0,0,8,8,2,1, + 12,1,12,1,6,3,2,253,2,4,12,1,4,4,12,253, + 10,1,12,1,4,1,2,253,122,31,80,97,116,104,70,105, + 110,100,101,114,46,95,112,97,116,104,95,105,109,112,111,114, + 116,101,114,95,99,97,99,104,101,99,3,0,0,0,0,0, + 0,0,0,0,0,0,7,0,0,0,4,0,0,0,67,0, + 0,0,115,138,0,0,0,116,0,124,2,100,1,131,2,114, + 27,116,1,160,2,124,2,161,1,155,0,100,2,157,2,125, + 3,116,3,160,4,124,3,116,5,161,2,1,0,124,2,160, + 6,124,1,161,1,92,2,125,4,125,5,110,21,116,1,160, + 2,124,2,161,1,155,0,100,3,157,2,125,3,116,3,160, + 4,124,3,116,5,161,2,1,0,124,2,160,7,124,1,161, + 1,125,4,103,0,125,5,124,4,100,0,117,1,114,58,116, + 1,160,8,124,1,124,4,161,2,83,0,116,1,160,9,124, + 1,100,0,161,2,125,6,124,5,124,6,95,10,124,6,83, + 0,41,4,78,114,162,0,0,0,122,53,46,102,105,110,100, + 95,115,112,101,99,40,41,32,110,111,116,32,102,111,117,110, + 100,59,32,102,97,108,108,105,110,103,32,98,97,99,107,32, + 116,111,32,102,105,110,100,95,108,111,97,100,101,114,40,41, + 122,53,46,102,105,110,100,95,115,112,101,99,40,41,32,110, + 111,116,32,102,111,117,110,100,59,32,102,97,108,108,105,110, + 103,32,98,97,99,107,32,116,111,32,102,105,110,100,95,109, + 111,100,117,108,101,40,41,41,11,114,154,0,0,0,114,160, + 0,0,0,90,12,95,111,98,106,101,99,116,95,110,97,109, + 101,114,101,0,0,0,114,102,0,0,0,114,163,0,0,0, + 114,162,0,0,0,114,230,0,0,0,114,225,0,0,0,114, + 208,0,0,0,114,203,0,0,0,41,7,114,222,0,0,0, + 114,164,0,0,0,114,85,1,0,0,114,167,0,0,0,114, + 165,0,0,0,114,166,0,0,0,114,211,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,16,95, + 108,101,103,97,99,121,95,103,101,116,95,115,112,101,99,102, + 5,0,0,115,26,0,0,0,10,4,16,1,12,2,16,1, + 16,2,12,2,10,1,4,1,8,1,12,1,12,1,6,1, + 4,1,122,27,80,97,116,104,70,105,110,100,101,114,46,95, + 108,101,103,97,99,121,95,103,101,116,95,115,112,101,99,78, + 99,4,0,0,0,0,0,0,0,0,0,0,0,9,0,0, + 0,5,0,0,0,67,0,0,0,115,166,0,0,0,103,0, + 125,4,124,2,68,0,93,67,125,5,116,0,124,5,116,1, + 116,2,102,2,131,2,115,14,113,4,124,0,160,3,124,5, + 161,1,125,6,124,6,100,1,117,1,114,71,116,4,124,6, + 100,2,131,2,114,35,124,6,160,5,124,1,124,3,161,2, + 125,7,110,6,124,0,160,6,124,1,124,6,161,2,125,7, + 124,7,100,1,117,0,114,46,113,4,124,7,106,7,100,1, + 117,1,114,55,124,7,2,0,1,0,83,0,124,7,106,8, + 125,8,124,8,100,1,117,0,114,66,116,9,100,3,131,1, + 130,1,124,4,160,10,124,8,161,1,1,0,113,4,116,11, + 160,12,124,1,100,1,161,2,125,7,124,4,124,7,95,8, + 124,7,83,0,41,4,122,63,70,105,110,100,32,116,104,101, + 32,108,111,97,100,101,114,32,111,114,32,110,97,109,101,115, + 112,97,99,101,95,112,97,116,104,32,102,111,114,32,116,104, + 105,115,32,109,111,100,117,108,101,47,112,97,99,107,97,103, + 101,32,110,97,109,101,46,78,114,227,0,0,0,122,19,115, + 112,101,99,32,109,105,115,115,105,110,103,32,108,111,97,100, + 101,114,41,13,114,186,0,0,0,114,111,0,0,0,218,5, + 98,121,116,101,115,114,90,1,0,0,114,154,0,0,0,114, + 227,0,0,0,114,91,1,0,0,114,165,0,0,0,114,203, + 0,0,0,114,143,0,0,0,114,192,0,0,0,114,160,0, + 0,0,114,208,0,0,0,41,9,114,222,0,0,0,114,164, + 0,0,0,114,67,0,0,0,114,226,0,0,0,218,14,110, + 97,109,101,115,112,97,99,101,95,112,97,116,104,90,5,101, + 110,116,114,121,114,85,1,0,0,114,211,0,0,0,114,166, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,218,9,95,103,101,116,95,115,112,101,99,123,5,0, + 0,115,42,0,0,0,4,5,8,1,14,1,2,1,10,1, + 8,1,10,1,14,1,12,2,8,1,2,1,10,1,8,1, + 6,1,8,1,8,1,10,5,2,128,12,2,6,1,4,1, + 122,20,80,97,116,104,70,105,110,100,101,114,46,95,103,101, + 116,95,115,112,101,99,99,4,0,0,0,0,0,0,0,0, + 0,0,0,6,0,0,0,5,0,0,0,67,0,0,0,115, + 94,0,0,0,124,2,100,1,117,0,114,7,116,0,106,1, + 125,2,124,0,160,2,124,1,124,2,124,3,161,3,125,4, + 124,4,100,1,117,0,114,20,100,1,83,0,124,4,106,3, + 100,1,117,0,114,45,124,4,106,4,125,5,124,5,114,43, + 100,1,124,4,95,5,116,6,124,1,124,5,124,0,106,2, + 131,3,124,4,95,4,124,4,83,0,100,1,83,0,124,4, + 83,0,41,2,122,141,84,114,121,32,116,111,32,102,105,110, + 100,32,97,32,115,112,101,99,32,102,111,114,32,39,102,117, + 108,108,110,97,109,101,39,32,111,110,32,115,121,115,46,112, + 97,116,104,32,111,114,32,39,112,97,116,104,39,46,10,10, + 32,32,32,32,32,32,32,32,84,104,101,32,115,101,97,114, + 99,104,32,105,115,32,98,97,115,101,100,32,111,110,32,115, + 121,115,46,112,97,116,104,95,104,111,111,107,115,32,97,110, + 100,32,115,121,115,46,112,97,116,104,95,105,109,112,111,114, + 116,101,114,95,99,97,99,104,101,46,10,32,32,32,32,32, + 32,32,32,78,41,7,114,16,0,0,0,114,67,0,0,0, + 114,94,1,0,0,114,165,0,0,0,114,203,0,0,0,114, + 206,0,0,0,114,48,1,0,0,41,6,114,222,0,0,0, + 114,164,0,0,0,114,67,0,0,0,114,226,0,0,0,114, + 211,0,0,0,114,93,1,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,114,227,0,0,0,155,5,0, + 0,115,26,0,0,0,8,6,6,1,14,1,8,1,4,1, + 10,1,6,1,4,1,6,3,16,1,4,1,4,2,4,2, + 122,20,80,97,116,104,70,105,110,100,101,114,46,102,105,110, + 100,95,115,112,101,99,99,3,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,4,0,0,0,67,0,0,0,115, + 42,0,0,0,116,0,160,1,100,1,116,2,161,2,1,0, + 124,0,160,3,124,1,124,2,161,2,125,3,124,3,100,2, + 117,0,114,18,100,2,83,0,124,3,106,4,83,0,41,3, + 122,170,102,105,110,100,32,116,104,101,32,109,111,100,117,108, + 101,32,111,110,32,115,121,115,46,112,97,116,104,32,111,114, + 32,39,112,97,116,104,39,32,98,97,115,101,100,32,111,110, + 32,115,121,115,46,112,97,116,104,95,104,111,111,107,115,32, + 97,110,100,10,32,32,32,32,32,32,32,32,115,121,115,46, + 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97, + 99,104,101,46,10,10,32,32,32,32,32,32,32,32,84,104, + 105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112, + 114,101,99,97,116,101,100,46,32,32,85,115,101,32,102,105, + 110,100,95,115,112,101,99,40,41,32,105,110,115,116,101,97, + 100,46,10,10,32,32,32,32,32,32,32,32,122,101,80,97, + 116,104,70,105,110,100,101,114,46,102,105,110,100,95,109,111, + 100,117,108,101,40,41,32,105,115,32,100,101,112,114,101,99, + 97,116,101,100,32,97,110,100,32,115,108,97,116,101,100,32, + 102,111,114,32,114,101,109,111,118,97,108,32,105,110,32,80, + 121,116,104,111,110,32,51,46,49,50,59,32,117,115,101,32, 102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,116, - 101,97,100,46,10,10,32,32,32,32,32,32,32,32,122,101, - 70,105,108,101,70,105,110,100,101,114,46,102,105,110,100,95, - 108,111,97,100,101,114,40,41,32,105,115,32,100,101,112,114, - 101,99,97,116,101,100,32,97,110,100,32,115,108,97,116,101, - 100,32,102,111,114,32,114,101,109,111,118,97,108,32,105,110, - 32,80,121,116,104,111,110,32,51,46,49,50,59,32,117,115, - 101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,110, - 115,116,101,97,100,78,41,6,114,99,0,0,0,114,100,0, - 0,0,114,101,0,0,0,114,226,0,0,0,114,164,0,0, - 0,114,202,0,0,0,41,3,114,143,0,0,0,114,163,0, - 0,0,114,210,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,161,0,0,0,236,5,0,0,115, - 14,0,0,0,6,7,2,2,4,254,10,3,8,1,8,1, - 16,1,122,22,70,105,108,101,70,105,110,100,101,114,46,102, - 105,110,100,95,108,111,97,100,101,114,99,6,0,0,0,0, - 0,0,0,0,0,0,0,7,0,0,0,6,0,0,0,67, - 0,0,0,115,26,0,0,0,124,1,124,2,124,3,131,2, - 125,6,116,0,124,2,124,3,124,6,124,4,100,1,141,4, - 83,0,41,2,78,114,201,0,0,0,41,1,114,213,0,0, - 0,41,7,114,143,0,0,0,114,211,0,0,0,114,163,0, - 0,0,114,65,0,0,0,90,4,115,109,115,108,114,225,0, - 0,0,114,164,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,93,1,0,0,251,5,0,0,115, - 8,0,0,0,10,1,8,1,2,1,6,255,122,20,70,105, - 108,101,70,105,110,100,101,114,46,95,103,101,116,95,115,112, - 101,99,78,99,3,0,0,0,0,0,0,0,0,0,0,0, - 14,0,0,0,9,0,0,0,67,0,0,0,115,122,1,0, - 0,100,1,125,3,124,1,160,0,100,2,161,1,100,3,25, - 0,125,4,122,12,116,1,124,0,106,2,112,17,116,3,160, - 4,161,0,131,1,106,5,125,5,87,0,110,11,4,0,116, - 6,121,32,1,0,1,0,1,0,100,4,125,5,89,0,110, - 1,119,0,124,5,124,0,106,7,107,3,114,45,124,0,160, - 8,161,0,1,0,124,5,124,0,95,7,116,9,131,0,114, - 56,124,0,106,10,125,6,124,4,160,11,161,0,125,7,110, - 5,124,0,106,12,125,6,124,4,125,7,124,7,124,6,118, - 0,114,108,116,13,124,0,106,2,124,4,131,2,125,8,124, - 0,106,14,68,0,93,29,92,2,125,9,125,10,100,5,124, - 9,23,0,125,11,116,13,124,8,124,11,131,2,125,12,116, - 15,124,12,131,1,114,103,124,0,160,16,124,10,124,1,124, - 12,124,8,103,1,124,2,161,5,2,0,1,0,83,0,113, - 74,116,17,124,8,131,1,125,3,124,0,106,14,68,0,93, - 55,92,2,125,9,125,10,122,10,116,13,124,0,106,2,124, - 4,124,9,23,0,131,2,125,12,87,0,110,11,4,0,116, - 18,121,136,1,0,1,0,1,0,89,0,1,0,100,6,83, - 0,119,0,116,19,106,20,100,7,124,12,100,3,100,8,141, - 3,1,0,124,7,124,9,23,0,124,6,118,0,114,166,116, - 15,124,12,131,1,114,166,124,0,160,16,124,10,124,1,124, - 12,100,6,124,2,161,5,2,0,1,0,83,0,113,111,124, - 3,114,187,116,19,160,20,100,9,124,8,161,2,1,0,116, - 19,160,21,124,1,100,6,161,2,125,13,124,8,103,1,124, - 13,95,22,124,13,83,0,100,6,83,0,41,10,122,111,84, - 114,121,32,116,111,32,102,105,110,100,32,97,32,115,112,101, - 99,32,102,111,114,32,116,104,101,32,115,112,101,99,105,102, - 105,101,100,32,109,111,100,117,108,101,46,10,10,32,32,32, - 32,32,32,32,32,82,101,116,117,114,110,115,32,116,104,101, - 32,109,97,116,99,104,105,110,103,32,115,112,101,99,44,32, - 111,114,32,78,111,110,101,32,105,102,32,110,111,116,32,102, - 111,117,110,100,46,10,32,32,32,32,32,32,32,32,70,114, - 97,0,0,0,114,44,0,0,0,114,130,0,0,0,114,236, - 0,0,0,78,122,9,116,114,121,105,110,103,32,123,125,41, - 1,90,9,118,101,114,98,111,115,105,116,121,122,25,112,111, - 115,115,105,98,108,101,32,110,97,109,101,115,112,97,99,101, - 32,102,111,114,32,123,125,41,23,114,104,0,0,0,114,75, - 0,0,0,114,65,0,0,0,114,18,0,0,0,114,82,0, - 0,0,114,35,1,0,0,114,76,0,0,0,114,99,1,0, - 0,218,11,95,102,105,108,108,95,99,97,99,104,101,114,21, - 0,0,0,114,102,1,0,0,114,131,0,0,0,114,101,1, - 0,0,114,67,0,0,0,114,98,1,0,0,114,80,0,0, - 0,114,93,1,0,0,114,83,0,0,0,114,111,0,0,0, - 114,159,0,0,0,114,173,0,0,0,114,207,0,0,0,114, - 202,0,0,0,41,14,114,143,0,0,0,114,163,0,0,0, - 114,225,0,0,0,90,12,105,115,95,110,97,109,101,115,112, - 97,99,101,90,11,116,97,105,108,95,109,111,100,117,108,101, - 114,193,0,0,0,90,5,99,97,99,104,101,90,12,99,97, - 99,104,101,95,109,111,100,117,108,101,90,9,98,97,115,101, - 95,112,97,116,104,114,44,1,0,0,114,211,0,0,0,90, - 13,105,110,105,116,95,102,105,108,101,110,97,109,101,90,9, - 102,117,108,108,95,112,97,116,104,114,210,0,0,0,114,7, - 0,0,0,114,7,0,0,0,114,8,0,0,0,114,226,0, - 0,0,0,6,0,0,115,86,0,0,0,4,5,14,1,2, - 1,24,1,12,1,8,1,2,255,10,2,8,1,6,1,6, - 2,6,1,10,1,6,2,4,1,8,2,12,1,14,1,8, - 1,10,1,8,1,24,1,2,255,8,5,14,2,2,1,20, - 1,12,1,8,1,2,255,16,2,12,1,8,1,10,1,4, - 1,8,255,2,128,4,2,12,1,12,1,8,1,4,1,4, - 1,122,20,70,105,108,101,70,105,110,100,101,114,46,102,105, - 110,100,95,115,112,101,99,99,1,0,0,0,0,0,0,0, - 0,0,0,0,9,0,0,0,10,0,0,0,67,0,0,0, - 115,192,0,0,0,124,0,106,0,125,1,122,11,116,1,160, - 2,124,1,112,11,116,1,160,3,161,0,161,1,125,2,87, - 0,110,14,4,0,116,4,116,5,116,6,102,3,121,28,1, - 0,1,0,1,0,103,0,125,2,89,0,110,1,119,0,116, - 7,106,8,160,9,100,1,161,1,115,41,116,10,124,2,131, - 1,124,0,95,11,110,37,116,10,131,0,125,3,124,2,68, - 0,93,28,125,4,124,4,160,12,100,2,161,1,92,3,125, - 5,125,6,125,7,124,6,114,67,100,3,160,13,124,5,124, - 7,160,14,161,0,161,2,125,8,110,2,124,5,125,8,124, - 3,160,15,124,8,161,1,1,0,113,46,124,3,124,0,95, - 11,116,7,106,8,160,9,116,16,161,1,114,94,100,4,100, - 5,132,0,124,2,68,0,131,1,124,0,95,17,100,6,83, - 0,100,6,83,0,41,7,122,68,70,105,108,108,32,116,104, - 101,32,99,97,99,104,101,32,111,102,32,112,111,116,101,110, - 116,105,97,108,32,109,111,100,117,108,101,115,32,97,110,100, - 32,112,97,99,107,97,103,101,115,32,102,111,114,32,116,104, - 105,115,32,100,105,114,101,99,116,111,114,121,46,114,14,0, - 0,0,114,97,0,0,0,114,88,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, - 0,83,0,0,0,115,20,0,0,0,104,0,124,0,93,6, - 125,1,124,1,160,0,161,0,146,2,113,2,83,0,114,7, - 0,0,0,41,1,114,131,0,0,0,41,2,114,5,0,0, - 0,90,2,102,110,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,13,0,0,0,80,6,0,0,115,2,0, - 0,0,20,0,122,41,70,105,108,101,70,105,110,100,101,114, - 46,95,102,105,108,108,95,99,97,99,104,101,46,60,108,111, - 99,97,108,115,62,46,60,115,101,116,99,111,109,112,62,78, - 41,18,114,65,0,0,0,114,18,0,0,0,90,7,108,105, - 115,116,100,105,114,114,82,0,0,0,114,87,1,0,0,218, - 15,80,101,114,109,105,115,115,105,111,110,69,114,114,111,114, - 218,18,78,111,116,65,68,105,114,101,99,116,111,114,121,69, - 114,114,111,114,114,15,0,0,0,114,25,0,0,0,114,26, - 0,0,0,114,100,1,0,0,114,101,1,0,0,114,126,0, - 0,0,114,89,0,0,0,114,131,0,0,0,218,3,97,100, - 100,114,27,0,0,0,114,102,1,0,0,41,9,114,143,0, - 0,0,114,65,0,0,0,90,8,99,111,110,116,101,110,116, - 115,90,21,108,111,119,101,114,95,115,117,102,102,105,120,95, - 99,111,110,116,101,110,116,115,114,72,1,0,0,114,141,0, - 0,0,114,56,1,0,0,114,44,1,0,0,90,8,110,101, - 119,95,110,97,109,101,114,7,0,0,0,114,7,0,0,0, - 114,8,0,0,0,114,104,1,0,0,51,6,0,0,115,38, - 0,0,0,6,2,2,1,22,1,18,1,8,3,2,253,12, - 6,12,1,6,7,8,1,16,1,4,1,18,1,4,2,12, - 1,6,1,12,1,20,1,4,255,122,22,70,105,108,101,70, - 105,110,100,101,114,46,95,102,105,108,108,95,99,97,99,104, - 101,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,3,0,0,0,7,0,0,0,115,18,0,0,0,135, - 0,135,1,102,2,100,1,100,2,132,8,125,2,124,2,83, - 0,41,3,97,20,1,0,0,65,32,99,108,97,115,115,32, - 109,101,116,104,111,100,32,119,104,105,99,104,32,114,101,116, - 117,114,110,115,32,97,32,99,108,111,115,117,114,101,32,116, - 111,32,117,115,101,32,111,110,32,115,121,115,46,112,97,116, - 104,95,104,111,111,107,10,32,32,32,32,32,32,32,32,119, - 104,105,99,104,32,119,105,108,108,32,114,101,116,117,114,110, - 32,97,110,32,105,110,115,116,97,110,99,101,32,117,115,105, - 110,103,32,116,104,101,32,115,112,101,99,105,102,105,101,100, - 32,108,111,97,100,101,114,115,32,97,110,100,32,116,104,101, - 32,112,97,116,104,10,32,32,32,32,32,32,32,32,99,97, - 108,108,101,100,32,111,110,32,116,104,101,32,99,108,111,115, - 117,114,101,46,10,10,32,32,32,32,32,32,32,32,73,102, - 32,116,104,101,32,112,97,116,104,32,99,97,108,108,101,100, - 32,111,110,32,116,104,101,32,99,108,111,115,117,114,101,32, - 105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111, - 114,121,44,32,73,109,112,111,114,116,69,114,114,111,114,32, - 105,115,10,32,32,32,32,32,32,32,32,114,97,105,115,101, - 100,46,10,10,32,32,32,32,32,32,32,32,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0, - 0,19,0,0,0,115,36,0,0,0,116,0,124,0,131,1, - 115,10,116,1,100,1,124,0,100,2,141,2,130,1,136,0, - 124,0,103,1,136,1,162,1,82,0,142,0,83,0,41,3, - 122,45,80,97,116,104,32,104,111,111,107,32,102,111,114,32, - 105,109,112,111,114,116,108,105,98,46,109,97,99,104,105,110, - 101,114,121,46,70,105,108,101,70,105,110,100,101,114,46,122, - 30,111,110,108,121,32,100,105,114,101,99,116,111,114,105,101, - 115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,114, - 71,0,0,0,41,2,114,83,0,0,0,114,142,0,0,0, - 114,71,0,0,0,169,2,114,221,0,0,0,114,103,1,0, - 0,114,7,0,0,0,114,8,0,0,0,218,24,112,97,116, - 104,95,104,111,111,107,95,102,111,114,95,70,105,108,101,70, - 105,110,100,101,114,92,6,0,0,115,6,0,0,0,8,2, - 12,1,16,1,122,54,70,105,108,101,70,105,110,100,101,114, - 46,112,97,116,104,95,104,111,111,107,46,60,108,111,99,97, - 108,115,62,46,112,97,116,104,95,104,111,111,107,95,102,111, - 114,95,70,105,108,101,70,105,110,100,101,114,114,7,0,0, - 0,41,3,114,221,0,0,0,114,103,1,0,0,114,109,1, - 0,0,114,7,0,0,0,114,108,1,0,0,114,8,0,0, - 0,218,9,112,97,116,104,95,104,111,111,107,82,6,0,0, - 115,4,0,0,0,14,10,4,6,122,20,70,105,108,101,70, - 105,110,100,101,114,46,112,97,116,104,95,104,111,111,107,99, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 3,0,0,0,67,0,0,0,114,69,1,0,0,41,2,78, - 122,16,70,105,108,101,70,105,110,100,101,114,40,123,33,114, - 125,41,41,2,114,89,0,0,0,114,65,0,0,0,114,21, - 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,70,1,0,0,100,6,0,0,114,63,1,0,0, - 122,19,70,105,108,101,70,105,110,100,101,114,46,95,95,114, - 101,112,114,95,95,114,69,0,0,0,41,15,114,150,0,0, - 0,114,149,0,0,0,114,151,0,0,0,114,152,0,0,0, - 114,236,0,0,0,114,80,1,0,0,114,167,0,0,0,114, - 229,0,0,0,114,161,0,0,0,114,93,1,0,0,114,226, - 0,0,0,114,104,1,0,0,114,234,0,0,0,114,110,1, - 0,0,114,70,1,0,0,114,7,0,0,0,114,7,0,0, - 0,114,7,0,0,0,114,8,0,0,0,114,96,1,0,0, - 205,5,0,0,115,24,0,0,0,8,0,4,2,8,7,8, - 16,4,4,8,2,8,15,10,5,8,51,2,31,10,1,12, - 17,114,96,1,0,0,99,4,0,0,0,0,0,0,0,0, - 0,0,0,6,0,0,0,8,0,0,0,67,0,0,0,115, - 144,0,0,0,124,0,160,0,100,1,161,1,125,4,124,0, - 160,0,100,2,161,1,125,5,124,4,115,33,124,5,114,18, - 124,5,106,1,125,4,110,15,124,2,124,3,107,2,114,28, - 116,2,124,1,124,2,131,2,125,4,110,5,116,3,124,1, - 124,2,131,2,125,4,124,5,115,42,116,4,124,1,124,2, - 124,4,100,3,141,3,125,5,122,19,124,5,124,0,100,2, - 60,0,124,4,124,0,100,1,60,0,124,2,124,0,100,4, - 60,0,124,3,124,0,100,5,60,0,87,0,100,0,83,0, - 4,0,116,5,121,71,1,0,1,0,1,0,89,0,100,0, - 83,0,119,0,41,6,78,218,10,95,95,108,111,97,100,101, - 114,95,95,218,8,95,95,115,112,101,99,95,95,114,97,1, - 0,0,90,8,95,95,102,105,108,101,95,95,90,10,95,95, - 99,97,99,104,101,100,95,95,41,6,218,3,103,101,116,114, - 164,0,0,0,114,41,1,0,0,114,34,1,0,0,114,213, - 0,0,0,218,9,69,120,99,101,112,116,105,111,110,41,6, - 90,2,110,115,114,141,0,0,0,90,8,112,97,116,104,110, - 97,109,101,90,9,99,112,97,116,104,110,97,109,101,114,164, - 0,0,0,114,210,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,14,95,102,105,120,95,117,112, - 95,109,111,100,117,108,101,106,6,0,0,115,36,0,0,0, - 10,2,10,1,4,1,4,1,8,1,8,1,12,1,10,2, - 4,1,14,1,2,1,8,1,8,1,8,1,14,1,12,1, - 6,2,2,254,114,115,1,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0, - 0,0,115,38,0,0,0,116,0,116,1,160,2,161,0,102, - 2,125,0,116,3,116,4,102,2,125,1,116,5,116,6,102, - 2,125,2,124,0,124,1,124,2,103,3,83,0,41,1,122, - 95,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32, - 111,102,32,102,105,108,101,45,98,97,115,101,100,32,109,111, - 100,117,108,101,32,108,111,97,100,101,114,115,46,10,10,32, - 32,32,32,69,97,99,104,32,105,116,101,109,32,105,115,32, - 97,32,116,117,112,108,101,32,40,108,111,97,100,101,114,44, - 32,115,117,102,102,105,120,101,115,41,46,10,32,32,32,32, - 41,7,114,30,1,0,0,114,187,0,0,0,218,18,101,120, - 116,101,110,115,105,111,110,95,115,117,102,102,105,120,101,115, - 114,34,1,0,0,114,127,0,0,0,114,41,1,0,0,114, - 113,0,0,0,41,3,90,10,101,120,116,101,110,115,105,111, - 110,115,90,6,115,111,117,114,99,101,90,8,98,121,116,101, - 99,111,100,101,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,208,0,0,0,129,6,0,0,115,8,0,0, - 0,12,5,8,1,8,1,10,1,114,208,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1, - 0,0,0,67,0,0,0,115,8,0,0,0,124,0,97,0, - 100,0,83,0,114,69,0,0,0,41,1,114,159,0,0,0, - 41,1,218,17,95,98,111,111,116,115,116,114,97,112,95,109, - 111,100,117,108,101,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,21,95,115,101,116,95,98,111,111,116,115, - 116,114,97,112,95,109,111,100,117,108,101,140,6,0,0,115, - 2,0,0,0,8,2,114,118,1,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, - 67,0,0,0,115,50,0,0,0,116,0,124,0,131,1,1, - 0,116,1,131,0,125,1,116,2,106,3,160,4,116,5,106, - 6,124,1,142,0,103,1,161,1,1,0,116,2,106,7,160, - 8,116,9,161,1,1,0,100,1,83,0,41,2,122,41,73, - 110,115,116,97,108,108,32,116,104,101,32,112,97,116,104,45, - 98,97,115,101,100,32,105,109,112,111,114,116,32,99,111,109, - 112,111,110,101,110,116,115,46,78,41,10,114,118,1,0,0, - 114,208,0,0,0,114,15,0,0,0,114,85,1,0,0,114, - 191,0,0,0,114,96,1,0,0,114,110,1,0,0,218,9, - 109,101,116,97,95,112,97,116,104,114,61,0,0,0,114,79, - 1,0,0,41,2,114,117,1,0,0,90,17,115,117,112,112, - 111,114,116,101,100,95,108,111,97,100,101,114,115,114,7,0, - 0,0,114,7,0,0,0,114,8,0,0,0,218,8,95,105, - 110,115,116,97,108,108,145,6,0,0,115,8,0,0,0,8, - 2,6,1,20,1,16,1,114,120,1,0,0,41,1,114,87, - 0,0,0,114,69,0,0,0,41,3,78,78,78,41,2,114, - 0,0,0,0,114,0,0,0,0,41,1,84,41,85,114,152, - 0,0,0,114,159,0,0,0,114,187,0,0,0,114,91,0, - 0,0,114,15,0,0,0,114,99,0,0,0,114,184,0,0, - 0,114,25,0,0,0,114,231,0,0,0,90,2,110,116,114, - 18,0,0,0,114,215,0,0,0,90,5,112,111,115,105,120, - 114,50,0,0,0,218,3,97,108,108,114,59,0,0,0,114, - 136,0,0,0,114,57,0,0,0,114,62,0,0,0,90,20, - 95,112,97,116,104,115,101,112,115,95,119,105,116,104,95,99, - 111,108,111,110,114,28,0,0,0,90,37,95,67,65,83,69, - 95,73,78,83,69,78,83,73,84,73,86,69,95,80,76,65, - 84,70,79,82,77,83,95,66,89,84,69,83,95,75,69,89, - 114,27,0,0,0,114,29,0,0,0,114,21,0,0,0,114, - 36,0,0,0,114,42,0,0,0,114,45,0,0,0,114,67, - 0,0,0,114,74,0,0,0,114,75,0,0,0,114,79,0, - 0,0,114,80,0,0,0,114,83,0,0,0,114,86,0,0, - 0,114,95,0,0,0,218,4,116,121,112,101,218,8,95,95, - 99,111,100,101,95,95,114,186,0,0,0,114,34,0,0,0, - 114,172,0,0,0,114,33,0,0,0,114,39,0,0,0,114, - 8,1,0,0,114,116,0,0,0,114,112,0,0,0,114,127, - 0,0,0,114,61,0,0,0,114,116,1,0,0,114,232,0, - 0,0,114,113,0,0,0,90,23,68,69,66,85,71,95,66, - 89,84,69,67,79,68,69,95,83,85,70,70,73,88,69,83, - 90,27,79,80,84,73,77,73,90,69,68,95,66,89,84,69, - 67,79,68,69,95,83,85,70,70,73,88,69,83,114,121,0, - 0,0,114,128,0,0,0,114,135,0,0,0,114,137,0,0, - 0,114,139,0,0,0,114,160,0,0,0,114,167,0,0,0, - 114,176,0,0,0,114,180,0,0,0,114,182,0,0,0,114, - 189,0,0,0,114,194,0,0,0,114,195,0,0,0,114,200, - 0,0,0,218,6,111,98,106,101,99,116,114,209,0,0,0, - 114,213,0,0,0,114,214,0,0,0,114,235,0,0,0,114, - 249,0,0,0,114,11,1,0,0,114,34,1,0,0,114,41, - 1,0,0,114,30,1,0,0,114,47,1,0,0,114,75,1, - 0,0,114,79,1,0,0,114,96,1,0,0,114,115,1,0, - 0,114,208,0,0,0,114,118,1,0,0,114,120,1,0,0, - 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,8,60,109,111,100,117,108,101,62,1,0, - 0,0,115,180,0,0,0,4,0,4,22,8,3,8,1,8, - 1,8,1,8,1,10,3,4,1,8,1,10,1,8,2,4, - 3,10,1,6,2,22,2,8,1,8,1,10,1,14,1,4, - 4,4,1,2,1,2,1,4,255,8,4,6,16,8,3,8, - 5,8,5,4,6,10,1,8,30,8,6,8,8,8,10,8, - 9,8,5,4,7,10,1,8,8,10,5,10,22,0,127,16, - 30,12,1,4,2,4,1,6,2,4,1,10,1,8,2,6, - 2,8,2,16,2,8,71,8,40,8,19,8,12,8,12,8, - 31,8,20,8,33,8,28,10,24,10,13,10,10,8,11,6, - 14,4,3,2,1,12,255,14,73,14,67,16,30,0,127,14, - 17,18,50,18,45,18,25,14,53,14,69,14,49,0,127,14, - 32,0,127,10,30,8,23,8,11,12,5, + 101,97,100,78,114,228,0,0,0,114,229,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,114,230,0, + 0,0,179,5,0,0,115,14,0,0,0,6,8,2,2,4, + 254,12,3,8,1,4,1,6,1,122,22,80,97,116,104,70, + 105,110,100,101,114,46,102,105,110,100,95,109,111,100,117,108, + 101,99,0,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,4,0,0,0,79,0,0,0,115,28,0,0,0,100, + 1,100,2,108,0,109,1,125,2,1,0,124,2,106,2,124, + 0,105,0,124,1,164,1,142,1,83,0,41,3,97,32,1, + 0,0,10,32,32,32,32,32,32,32,32,70,105,110,100,32, + 100,105,115,116,114,105,98,117,116,105,111,110,115,46,10,10, + 32,32,32,32,32,32,32,32,82,101,116,117,114,110,32,97, + 110,32,105,116,101,114,97,98,108,101,32,111,102,32,97,108, + 108,32,68,105,115,116,114,105,98,117,116,105,111,110,32,105, + 110,115,116,97,110,99,101,115,32,99,97,112,97,98,108,101, + 32,111,102,10,32,32,32,32,32,32,32,32,108,111,97,100, + 105,110,103,32,116,104,101,32,109,101,116,97,100,97,116,97, + 32,102,111,114,32,112,97,99,107,97,103,101,115,32,109,97, + 116,99,104,105,110,103,32,96,96,99,111,110,116,101,120,116, + 46,110,97,109,101,96,96,10,32,32,32,32,32,32,32,32, + 40,111,114,32,97,108,108,32,110,97,109,101,115,32,105,102, + 32,96,96,78,111,110,101,96,96,32,105,110,100,105,99,97, + 116,101,100,41,32,97,108,111,110,103,32,116,104,101,32,112, + 97,116,104,115,32,105,110,32,116,104,101,32,108,105,115,116, + 10,32,32,32,32,32,32,32,32,111,102,32,100,105,114,101, + 99,116,111,114,105,101,115,32,96,96,99,111,110,116,101,120, + 116,46,112,97,116,104,96,96,46,10,32,32,32,32,32,32, + 32,32,114,0,0,0,0,41,1,218,18,77,101,116,97,100, + 97,116,97,80,97,116,104,70,105,110,100,101,114,41,3,90, + 18,105,109,112,111,114,116,108,105,98,46,109,101,116,97,100, + 97,116,97,114,95,1,0,0,218,18,102,105,110,100,95,100, + 105,115,116,114,105,98,117,116,105,111,110,115,41,3,114,145, + 0,0,0,114,146,0,0,0,114,95,1,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,114,96,1,0, + 0,195,5,0,0,115,4,0,0,0,12,10,16,1,122,29, + 80,97,116,104,70,105,110,100,101,114,46,102,105,110,100,95, + 100,105,115,116,114,105,98,117,116,105,111,110,115,114,71,0, + 0,0,114,231,0,0,0,41,14,114,151,0,0,0,114,150, + 0,0,0,114,152,0,0,0,114,153,0,0,0,114,234,0, + 0,0,114,81,1,0,0,114,87,1,0,0,114,235,0,0, + 0,114,90,1,0,0,114,91,1,0,0,114,94,1,0,0, + 114,227,0,0,0,114,230,0,0,0,114,96,1,0,0,114, + 9,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,114,80,1,0,0,50,5,0,0,115,36,0,0, + 0,8,0,4,2,2,2,10,1,2,12,10,1,2,12,10, + 1,2,21,10,1,2,20,12,1,2,31,12,1,2,23,12, + 1,2,15,14,1,114,80,1,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64, + 0,0,0,115,90,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5, + 132,0,90,5,101,6,90,7,100,6,100,7,132,0,90,8, + 100,8,100,9,132,0,90,9,100,19,100,11,100,12,132,1, + 90,10,100,13,100,14,132,0,90,11,101,12,100,15,100,16, + 132,0,131,1,90,13,100,17,100,18,132,0,90,14,100,10, + 83,0,41,20,218,10,70,105,108,101,70,105,110,100,101,114, + 122,172,70,105,108,101,45,98,97,115,101,100,32,102,105,110, + 100,101,114,46,10,10,32,32,32,32,73,110,116,101,114,97, + 99,116,105,111,110,115,32,119,105,116,104,32,116,104,101,32, + 102,105,108,101,32,115,121,115,116,101,109,32,97,114,101,32, + 99,97,99,104,101,100,32,102,111,114,32,112,101,114,102,111, + 114,109,97,110,99,101,44,32,98,101,105,110,103,10,32,32, + 32,32,114,101,102,114,101,115,104,101,100,32,119,104,101,110, + 32,116,104,101,32,100,105,114,101,99,116,111,114,121,32,116, + 104,101,32,102,105,110,100,101,114,32,105,115,32,104,97,110, + 100,108,105,110,103,32,104,97,115,32,98,101,101,110,32,109, + 111,100,105,102,105,101,100,46,10,10,32,32,32,32,99,2, + 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,6, + 0,0,0,7,0,0,0,115,112,0,0,0,103,0,125,3, + 124,2,68,0,93,16,92,2,137,0,125,4,124,3,160,0, + 135,0,102,1,100,1,100,2,132,8,124,4,68,0,131,1, + 161,1,1,0,113,4,124,3,124,0,95,1,124,1,112,27, + 100,3,124,0,95,2,116,3,124,0,106,2,131,1,115,43, + 116,4,116,5,160,6,161,0,124,0,106,2,131,2,124,0, + 95,2,100,4,124,0,95,7,116,8,131,0,124,0,95,9, + 116,8,131,0,124,0,95,10,100,5,83,0,41,6,122,154, + 73,110,105,116,105,97,108,105,122,101,32,119,105,116,104,32, + 116,104,101,32,112,97,116,104,32,116,111,32,115,101,97,114, + 99,104,32,111,110,32,97,110,100,32,97,32,118,97,114,105, + 97,98,108,101,32,110,117,109,98,101,114,32,111,102,10,32, + 32,32,32,32,32,32,32,50,45,116,117,112,108,101,115,32, + 99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,108, + 111,97,100,101,114,32,97,110,100,32,116,104,101,32,102,105, + 108,101,32,115,117,102,102,105,120,101,115,32,116,104,101,32, + 108,111,97,100,101,114,10,32,32,32,32,32,32,32,32,114, + 101,99,111,103,110,105,122,101,115,46,99,1,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,51, + 0,0,0,115,24,0,0,0,129,0,124,0,93,7,125,1, + 124,1,136,0,102,2,86,0,1,0,113,2,100,0,83,0, + 114,71,0,0,0,114,9,0,0,0,114,44,1,0,0,169, + 1,114,165,0,0,0,114,9,0,0,0,114,10,0,0,0, + 114,11,0,0,0,224,5,0,0,115,4,0,0,0,2,128, + 22,0,122,38,70,105,108,101,70,105,110,100,101,114,46,95, + 95,105,110,105,116,95,95,46,60,108,111,99,97,108,115,62, + 46,60,103,101,110,101,120,112,114,62,114,99,0,0,0,114, + 4,0,0,0,78,41,11,114,192,0,0,0,218,8,95,108, + 111,97,100,101,114,115,114,67,0,0,0,114,88,0,0,0, + 114,69,0,0,0,114,19,0,0,0,114,84,0,0,0,218, + 11,95,112,97,116,104,95,109,116,105,109,101,218,3,115,101, + 116,218,11,95,112,97,116,104,95,99,97,99,104,101,218,19, + 95,114,101,108,97,120,101,100,95,112,97,116,104,95,99,97, + 99,104,101,41,5,114,144,0,0,0,114,67,0,0,0,218, + 14,108,111,97,100,101,114,95,100,101,116,97,105,108,115,90, + 7,108,111,97,100,101,114,115,114,213,0,0,0,114,9,0, + 0,0,114,98,1,0,0,114,10,0,0,0,114,237,0,0, + 0,218,5,0,0,115,20,0,0,0,4,4,12,1,26,1, + 6,1,10,2,10,1,18,1,6,1,8,1,12,1,122,19, + 70,105,108,101,70,105,110,100,101,114,46,95,95,105,110,105, + 116,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,2,0,0,0,67,0,0,0,115,10,0,0, + 0,100,1,124,0,95,0,100,2,83,0,41,3,122,31,73, + 110,118,97,108,105,100,97,116,101,32,116,104,101,32,100,105, + 114,101,99,116,111,114,121,32,109,116,105,109,101,46,114,4, + 0,0,0,78,41,1,114,100,1,0,0,114,22,1,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,114, + 81,1,0,0,234,5,0,0,114,83,0,0,0,122,28,70, + 105,108,101,70,105,110,100,101,114,46,105,110,118,97,108,105, + 100,97,116,101,95,99,97,99,104,101,115,99,2,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,4,0,0,0, + 67,0,0,0,115,54,0,0,0,116,0,160,1,100,1,116, + 2,161,2,1,0,124,0,160,3,124,1,161,1,125,2,124, + 2,100,2,117,0,114,19,100,2,103,0,102,2,83,0,124, + 2,106,4,124,2,106,5,112,25,103,0,102,2,83,0,41, + 3,122,197,84,114,121,32,116,111,32,102,105,110,100,32,97, + 32,108,111,97,100,101,114,32,102,111,114,32,116,104,101,32, + 115,112,101,99,105,102,105,101,100,32,109,111,100,117,108,101, + 44,32,111,114,32,116,104,101,32,110,97,109,101,115,112,97, + 99,101,10,32,32,32,32,32,32,32,32,112,97,99,107,97, + 103,101,32,112,111,114,116,105,111,110,115,46,32,82,101,116, + 117,114,110,115,32,40,108,111,97,100,101,114,44,32,108,105, + 115,116,45,111,102,45,112,111,114,116,105,111,110,115,41,46, + 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, + 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,46,32,32,85,115,101,32,102,105,110,100,95,115, + 112,101,99,40,41,32,105,110,115,116,101,97,100,46,10,10, + 32,32,32,32,32,32,32,32,122,101,70,105,108,101,70,105, + 110,100,101,114,46,102,105,110,100,95,108,111,97,100,101,114, + 40,41,32,105,115,32,100,101,112,114,101,99,97,116,101,100, + 32,97,110,100,32,115,108,97,116,101,100,32,102,111,114,32, + 114,101,109,111,118,97,108,32,105,110,32,80,121,116,104,111, + 110,32,51,46,49,50,59,32,117,115,101,32,102,105,110,100, + 95,115,112,101,99,40,41,32,105,110,115,116,101,97,100,78, + 41,6,114,101,0,0,0,114,102,0,0,0,114,103,0,0, + 0,114,227,0,0,0,114,165,0,0,0,114,203,0,0,0, + 41,3,114,144,0,0,0,114,164,0,0,0,114,211,0,0, + 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 114,162,0,0,0,240,5,0,0,115,14,0,0,0,6,7, + 2,2,4,254,10,3,8,1,8,1,16,1,122,22,70,105, + 108,101,70,105,110,100,101,114,46,102,105,110,100,95,108,111, + 97,100,101,114,99,6,0,0,0,0,0,0,0,0,0,0, + 0,7,0,0,0,6,0,0,0,67,0,0,0,115,26,0, + 0,0,124,1,124,2,124,3,131,2,125,6,116,0,124,2, + 124,3,124,6,124,4,100,1,141,4,83,0,41,2,78,114, + 202,0,0,0,41,1,114,214,0,0,0,41,7,114,144,0, + 0,0,114,212,0,0,0,114,164,0,0,0,114,67,0,0, + 0,90,4,115,109,115,108,114,226,0,0,0,114,165,0,0, + 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 114,94,1,0,0,255,5,0,0,115,8,0,0,0,10,1, + 8,1,2,1,6,255,122,20,70,105,108,101,70,105,110,100, + 101,114,46,95,103,101,116,95,115,112,101,99,78,99,3,0, + 0,0,0,0,0,0,0,0,0,0,14,0,0,0,9,0, + 0,0,67,0,0,0,115,122,1,0,0,100,1,125,3,124, + 1,160,0,100,2,161,1,100,3,25,0,125,4,122,12,116, + 1,124,0,106,2,112,17,116,3,160,4,161,0,131,1,106, + 5,125,5,87,0,110,11,4,0,116,6,121,32,1,0,1, + 0,1,0,100,4,125,5,89,0,110,1,119,0,124,5,124, + 0,106,7,107,3,114,45,124,0,160,8,161,0,1,0,124, + 5,124,0,95,7,116,9,131,0,114,56,124,0,106,10,125, + 6,124,4,160,11,161,0,125,7,110,5,124,0,106,12,125, + 6,124,4,125,7,124,7,124,6,118,0,114,108,116,13,124, + 0,106,2,124,4,131,2,125,8,124,0,106,14,68,0,93, + 29,92,2,125,9,125,10,100,5,124,9,23,0,125,11,116, + 13,124,8,124,11,131,2,125,12,116,15,124,12,131,1,114, + 103,124,0,160,16,124,10,124,1,124,12,124,8,103,1,124, + 2,161,5,2,0,1,0,83,0,113,74,116,17,124,8,131, + 1,125,3,124,0,106,14,68,0,93,55,92,2,125,9,125, + 10,122,10,116,13,124,0,106,2,124,4,124,9,23,0,131, + 2,125,12,87,0,110,11,4,0,116,18,121,136,1,0,1, + 0,1,0,89,0,1,0,100,6,83,0,119,0,116,19,106, + 20,100,7,124,12,100,3,100,8,141,3,1,0,124,7,124, + 9,23,0,124,6,118,0,114,166,116,15,124,12,131,1,114, + 166,124,0,160,16,124,10,124,1,124,12,100,6,124,2,161, + 5,2,0,1,0,83,0,113,111,124,3,114,187,116,19,160, + 20,100,9,124,8,161,2,1,0,116,19,160,21,124,1,100, + 6,161,2,125,13,124,8,103,1,124,13,95,22,124,13,83, + 0,100,6,83,0,41,10,122,111,84,114,121,32,116,111,32, + 102,105,110,100,32,97,32,115,112,101,99,32,102,111,114,32, + 116,104,101,32,115,112,101,99,105,102,105,101,100,32,109,111, + 100,117,108,101,46,10,10,32,32,32,32,32,32,32,32,82, + 101,116,117,114,110,115,32,116,104,101,32,109,97,116,99,104, + 105,110,103,32,115,112,101,99,44,32,111,114,32,78,111,110, + 101,32,105,102,32,110,111,116,32,102,111,117,110,100,46,10, + 32,32,32,32,32,32,32,32,70,114,99,0,0,0,114,46, + 0,0,0,114,4,0,0,0,114,237,0,0,0,78,122,9, + 116,114,121,105,110,103,32,123,125,41,1,90,9,118,101,114, + 98,111,115,105,116,121,122,25,112,111,115,115,105,98,108,101, + 32,110,97,109,101,115,112,97,99,101,32,102,111,114,32,123, + 125,41,23,114,106,0,0,0,114,77,0,0,0,114,67,0, + 0,0,114,19,0,0,0,114,84,0,0,0,114,36,1,0, + 0,114,78,0,0,0,114,100,1,0,0,218,11,95,102,105, + 108,108,95,99,97,99,104,101,114,23,0,0,0,114,103,1, + 0,0,114,132,0,0,0,114,102,1,0,0,114,69,0,0, + 0,114,99,1,0,0,114,82,0,0,0,114,94,1,0,0, + 114,85,0,0,0,114,113,0,0,0,114,160,0,0,0,114, + 174,0,0,0,114,208,0,0,0,114,203,0,0,0,41,14, + 114,144,0,0,0,114,164,0,0,0,114,226,0,0,0,90, + 12,105,115,95,110,97,109,101,115,112,97,99,101,90,11,116, + 97,105,108,95,109,111,100,117,108,101,114,194,0,0,0,90, + 5,99,97,99,104,101,90,12,99,97,99,104,101,95,109,111, + 100,117,108,101,90,9,98,97,115,101,95,112,97,116,104,114, + 45,1,0,0,114,212,0,0,0,90,13,105,110,105,116,95, + 102,105,108,101,110,97,109,101,90,9,102,117,108,108,95,112, + 97,116,104,114,211,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,114,227,0,0,0,4,6,0,0, + 115,86,0,0,0,4,5,14,1,2,1,24,1,12,1,8, + 1,2,255,10,2,8,1,6,1,6,2,6,1,10,1,6, + 2,4,1,8,2,12,1,14,1,8,1,10,1,8,1,24, + 1,2,255,8,5,14,2,2,1,20,1,12,1,8,1,2, + 255,16,2,12,1,8,1,10,1,4,1,8,255,2,128,4, + 2,12,1,12,1,8,1,4,1,4,1,122,20,70,105,108, + 101,70,105,110,100,101,114,46,102,105,110,100,95,115,112,101, + 99,99,1,0,0,0,0,0,0,0,0,0,0,0,9,0, + 0,0,10,0,0,0,67,0,0,0,115,192,0,0,0,124, + 0,106,0,125,1,122,11,116,1,160,2,124,1,112,11,116, + 1,160,3,161,0,161,1,125,2,87,0,110,14,4,0,116, + 4,116,5,116,6,102,3,121,28,1,0,1,0,1,0,103, + 0,125,2,89,0,110,1,119,0,116,7,106,8,160,9,100, + 1,161,1,115,41,116,10,124,2,131,1,124,0,95,11,110, + 37,116,10,131,0,125,3,124,2,68,0,93,28,125,4,124, + 4,160,12,100,2,161,1,92,3,125,5,125,6,125,7,124, + 6,114,67,100,3,160,13,124,5,124,7,160,14,161,0,161, + 2,125,8,110,2,124,5,125,8,124,3,160,15,124,8,161, + 1,1,0,113,46,124,3,124,0,95,11,116,7,106,8,160, + 9,116,16,161,1,114,94,100,4,100,5,132,0,124,2,68, + 0,131,1,124,0,95,17,100,6,83,0,100,6,83,0,41, + 7,122,68,70,105,108,108,32,116,104,101,32,99,97,99,104, + 101,32,111,102,32,112,111,116,101,110,116,105,97,108,32,109, + 111,100,117,108,101,115,32,97,110,100,32,112,97,99,107,97, + 103,101,115,32,102,111,114,32,116,104,105,115,32,100,105,114, + 101,99,116,111,114,121,46,114,15,0,0,0,114,99,0,0, + 0,114,90,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,4,0,0,0,83,0,0,0,115, + 20,0,0,0,104,0,124,0,93,6,125,1,124,1,160,0, + 161,0,146,2,113,2,83,0,114,9,0,0,0,41,1,114, + 132,0,0,0,41,2,114,7,0,0,0,90,2,102,110,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,114,14, + 0,0,0,84,6,0,0,115,2,0,0,0,20,0,122,41, + 70,105,108,101,70,105,110,100,101,114,46,95,102,105,108,108, + 95,99,97,99,104,101,46,60,108,111,99,97,108,115,62,46, + 60,115,101,116,99,111,109,112,62,78,41,18,114,67,0,0, + 0,114,19,0,0,0,90,7,108,105,115,116,100,105,114,114, + 84,0,0,0,114,88,1,0,0,218,15,80,101,114,109,105, + 115,115,105,111,110,69,114,114,111,114,218,18,78,111,116,65, + 68,105,114,101,99,116,111,114,121,69,114,114,111,114,114,16, + 0,0,0,114,27,0,0,0,114,28,0,0,0,114,101,1, + 0,0,114,102,1,0,0,114,128,0,0,0,114,91,0,0, + 0,114,132,0,0,0,218,3,97,100,100,114,29,0,0,0, + 114,103,1,0,0,41,9,114,144,0,0,0,114,67,0,0, + 0,90,8,99,111,110,116,101,110,116,115,90,21,108,111,119, + 101,114,95,115,117,102,102,105,120,95,99,111,110,116,101,110, + 116,115,114,73,1,0,0,114,142,0,0,0,114,57,1,0, + 0,114,45,1,0,0,90,8,110,101,119,95,110,97,109,101, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,114, + 105,1,0,0,55,6,0,0,115,38,0,0,0,6,2,2, + 1,22,1,18,1,8,3,2,253,12,6,12,1,6,7,8, + 1,16,1,4,1,18,1,4,2,12,1,6,1,12,1,20, + 1,4,255,122,22,70,105,108,101,70,105,110,100,101,114,46, + 95,102,105,108,108,95,99,97,99,104,101,99,1,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, + 7,0,0,0,115,18,0,0,0,135,0,135,1,102,2,100, + 1,100,2,132,8,125,2,124,2,83,0,41,3,97,20,1, + 0,0,65,32,99,108,97,115,115,32,109,101,116,104,111,100, + 32,119,104,105,99,104,32,114,101,116,117,114,110,115,32,97, + 32,99,108,111,115,117,114,101,32,116,111,32,117,115,101,32, + 111,110,32,115,121,115,46,112,97,116,104,95,104,111,111,107, + 10,32,32,32,32,32,32,32,32,119,104,105,99,104,32,119, + 105,108,108,32,114,101,116,117,114,110,32,97,110,32,105,110, + 115,116,97,110,99,101,32,117,115,105,110,103,32,116,104,101, + 32,115,112,101,99,105,102,105,101,100,32,108,111,97,100,101, + 114,115,32,97,110,100,32,116,104,101,32,112,97,116,104,10, + 32,32,32,32,32,32,32,32,99,97,108,108,101,100,32,111, + 110,32,116,104,101,32,99,108,111,115,117,114,101,46,10,10, + 32,32,32,32,32,32,32,32,73,102,32,116,104,101,32,112, + 97,116,104,32,99,97,108,108,101,100,32,111,110,32,116,104, + 101,32,99,108,111,115,117,114,101,32,105,115,32,110,111,116, + 32,97,32,100,105,114,101,99,116,111,114,121,44,32,73,109, + 112,111,114,116,69,114,114,111,114,32,105,115,10,32,32,32, + 32,32,32,32,32,114,97,105,115,101,100,46,10,10,32,32, + 32,32,32,32,32,32,99,1,0,0,0,0,0,0,0,0, + 0,0,0,1,0,0,0,4,0,0,0,19,0,0,0,115, + 36,0,0,0,116,0,124,0,131,1,115,10,116,1,100,1, + 124,0,100,2,141,2,130,1,136,0,124,0,103,1,136,1, + 162,1,82,0,142,0,83,0,41,3,122,45,80,97,116,104, + 32,104,111,111,107,32,102,111,114,32,105,109,112,111,114,116, + 108,105,98,46,109,97,99,104,105,110,101,114,121,46,70,105, + 108,101,70,105,110,100,101,114,46,122,30,111,110,108,121,32, + 100,105,114,101,99,116,111,114,105,101,115,32,97,114,101,32, + 115,117,112,112,111,114,116,101,100,114,73,0,0,0,41,2, + 114,85,0,0,0,114,143,0,0,0,114,73,0,0,0,169, + 2,114,222,0,0,0,114,104,1,0,0,114,9,0,0,0, + 114,10,0,0,0,218,24,112,97,116,104,95,104,111,111,107, + 95,102,111,114,95,70,105,108,101,70,105,110,100,101,114,96, + 6,0,0,115,6,0,0,0,8,2,12,1,16,1,122,54, + 70,105,108,101,70,105,110,100,101,114,46,112,97,116,104,95, + 104,111,111,107,46,60,108,111,99,97,108,115,62,46,112,97, + 116,104,95,104,111,111,107,95,102,111,114,95,70,105,108,101, + 70,105,110,100,101,114,114,9,0,0,0,41,3,114,222,0, + 0,0,114,104,1,0,0,114,110,1,0,0,114,9,0,0, + 0,114,109,1,0,0,114,10,0,0,0,218,9,112,97,116, + 104,95,104,111,111,107,86,6,0,0,115,4,0,0,0,14, + 10,4,6,122,20,70,105,108,101,70,105,110,100,101,114,46, + 112,97,116,104,95,104,111,111,107,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0, + 0,0,114,70,1,0,0,41,2,78,122,16,70,105,108,101, + 70,105,110,100,101,114,40,123,33,114,125,41,41,2,114,91, + 0,0,0,114,67,0,0,0,114,22,1,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,114,71,1,0, + 0,104,6,0,0,114,64,1,0,0,122,19,70,105,108,101, + 70,105,110,100,101,114,46,95,95,114,101,112,114,95,95,114, + 71,0,0,0,41,15,114,151,0,0,0,114,150,0,0,0, + 114,152,0,0,0,114,153,0,0,0,114,237,0,0,0,114, + 81,1,0,0,114,168,0,0,0,114,230,0,0,0,114,162, + 0,0,0,114,94,1,0,0,114,227,0,0,0,114,105,1, + 0,0,114,235,0,0,0,114,111,1,0,0,114,71,1,0, + 0,114,9,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,114,97,1,0,0,209,5,0,0,115,24, + 0,0,0,8,0,4,2,8,7,8,16,4,4,8,2,8, + 15,10,5,8,51,2,31,10,1,12,17,114,97,1,0,0, + 99,4,0,0,0,0,0,0,0,0,0,0,0,6,0,0, + 0,8,0,0,0,67,0,0,0,115,144,0,0,0,124,0, + 160,0,100,1,161,1,125,4,124,0,160,0,100,2,161,1, + 125,5,124,4,115,33,124,5,114,18,124,5,106,1,125,4, + 110,15,124,2,124,3,107,2,114,28,116,2,124,1,124,2, + 131,2,125,4,110,5,116,3,124,1,124,2,131,2,125,4, + 124,5,115,42,116,4,124,1,124,2,124,4,100,3,141,3, + 125,5,122,19,124,5,124,0,100,2,60,0,124,4,124,0, + 100,1,60,0,124,2,124,0,100,4,60,0,124,3,124,0, + 100,5,60,0,87,0,100,0,83,0,4,0,116,5,121,71, + 1,0,1,0,1,0,89,0,100,0,83,0,119,0,41,6, + 78,218,10,95,95,108,111,97,100,101,114,95,95,218,8,95, + 95,115,112,101,99,95,95,114,98,1,0,0,90,8,95,95, + 102,105,108,101,95,95,90,10,95,95,99,97,99,104,101,100, + 95,95,41,6,218,3,103,101,116,114,165,0,0,0,114,42, + 1,0,0,114,35,1,0,0,114,214,0,0,0,218,9,69, + 120,99,101,112,116,105,111,110,41,6,90,2,110,115,114,142, + 0,0,0,90,8,112,97,116,104,110,97,109,101,90,9,99, + 112,97,116,104,110,97,109,101,114,165,0,0,0,114,211,0, + 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, + 0,218,14,95,102,105,120,95,117,112,95,109,111,100,117,108, + 101,110,6,0,0,115,36,0,0,0,10,2,10,1,4,1, + 4,1,8,1,8,1,12,1,10,2,4,1,14,1,2,1, + 8,1,8,1,8,1,14,1,12,1,6,2,2,254,114,116, + 1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,3,0,0,0,67,0,0,0,115,38,0,0, + 0,116,0,116,1,160,2,161,0,102,2,125,0,116,3,116, + 4,102,2,125,1,116,5,116,6,102,2,125,2,124,0,124, + 1,124,2,103,3,83,0,41,1,122,95,82,101,116,117,114, + 110,115,32,97,32,108,105,115,116,32,111,102,32,102,105,108, + 101,45,98,97,115,101,100,32,109,111,100,117,108,101,32,108, + 111,97,100,101,114,115,46,10,10,32,32,32,32,69,97,99, + 104,32,105,116,101,109,32,105,115,32,97,32,116,117,112,108, + 101,32,40,108,111,97,100,101,114,44,32,115,117,102,102,105, + 120,101,115,41,46,10,32,32,32,32,41,7,114,31,1,0, + 0,114,188,0,0,0,218,18,101,120,116,101,110,115,105,111, + 110,95,115,117,102,102,105,120,101,115,114,35,1,0,0,114, + 129,0,0,0,114,42,1,0,0,114,115,0,0,0,41,3, + 90,10,101,120,116,101,110,115,105,111,110,115,90,6,115,111, + 117,114,99,101,90,8,98,121,116,101,99,111,100,101,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,114,209,0, + 0,0,133,6,0,0,115,8,0,0,0,12,5,8,1,8, + 1,10,1,114,209,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,1,0,0,0,67,0,0, + 0,115,8,0,0,0,124,0,97,0,100,0,83,0,114,71, + 0,0,0,41,1,114,160,0,0,0,41,1,218,17,95,98, + 111,111,116,115,116,114,97,112,95,109,111,100,117,108,101,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,21, + 95,115,101,116,95,98,111,111,116,115,116,114,97,112,95,109, + 111,100,117,108,101,144,6,0,0,115,2,0,0,0,8,2, + 114,119,1,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,4,0,0,0,67,0,0,0,115,50, + 0,0,0,116,0,124,0,131,1,1,0,116,1,131,0,125, + 1,116,2,106,3,160,4,116,5,106,6,124,1,142,0,103, + 1,161,1,1,0,116,2,106,7,160,8,116,9,161,1,1, + 0,100,1,83,0,41,2,122,41,73,110,115,116,97,108,108, + 32,116,104,101,32,112,97,116,104,45,98,97,115,101,100,32, + 105,109,112,111,114,116,32,99,111,109,112,111,110,101,110,116, + 115,46,78,41,10,114,119,1,0,0,114,209,0,0,0,114, + 16,0,0,0,114,86,1,0,0,114,192,0,0,0,114,97, + 1,0,0,114,111,1,0,0,218,9,109,101,116,97,95,112, + 97,116,104,114,63,0,0,0,114,80,1,0,0,41,2,114, + 118,1,0,0,90,17,115,117,112,112,111,114,116,101,100,95, + 108,111,97,100,101,114,115,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,218,8,95,105,110,115,116,97,108,108, + 149,6,0,0,115,8,0,0,0,8,2,6,1,20,1,16, + 1,114,121,1,0,0,41,1,114,89,0,0,0,114,71,0, + 0,0,41,3,78,78,78,41,2,114,0,0,0,0,114,0, + 0,0,0,41,1,84,41,87,114,153,0,0,0,114,160,0, + 0,0,114,188,0,0,0,114,93,0,0,0,114,16,0,0, + 0,114,101,0,0,0,114,185,0,0,0,114,27,0,0,0, + 114,232,0,0,0,90,2,110,116,114,19,0,0,0,114,216, + 0,0,0,90,5,112,111,115,105,120,114,52,0,0,0,114, + 20,0,0,0,114,114,1,0,0,218,3,97,108,108,114,61, + 0,0,0,114,137,0,0,0,114,59,0,0,0,114,64,0, + 0,0,90,20,95,112,97,116,104,115,101,112,115,95,119,105, + 116,104,95,99,111,108,111,110,114,30,0,0,0,90,37,95, + 67,65,83,69,95,73,78,83,69,78,83,73,84,73,86,69, + 95,80,76,65,84,70,79,82,77,83,95,66,89,84,69,83, + 95,75,69,89,114,29,0,0,0,114,31,0,0,0,114,23, + 0,0,0,114,38,0,0,0,114,44,0,0,0,114,47,0, + 0,0,114,69,0,0,0,114,76,0,0,0,114,77,0,0, + 0,114,81,0,0,0,114,82,0,0,0,114,85,0,0,0, + 114,88,0,0,0,114,97,0,0,0,218,4,116,121,112,101, + 218,8,95,95,99,111,100,101,95,95,114,187,0,0,0,114, + 36,0,0,0,114,173,0,0,0,114,35,0,0,0,114,41, + 0,0,0,114,9,1,0,0,114,118,0,0,0,114,114,0, + 0,0,114,129,0,0,0,114,63,0,0,0,114,117,1,0, + 0,114,233,0,0,0,114,115,0,0,0,90,23,68,69,66, + 85,71,95,66,89,84,69,67,79,68,69,95,83,85,70,70, + 73,88,69,83,90,27,79,80,84,73,77,73,90,69,68,95, + 66,89,84,69,67,79,68,69,95,83,85,70,70,73,88,69, + 83,114,123,0,0,0,114,130,0,0,0,114,136,0,0,0, + 114,138,0,0,0,114,140,0,0,0,114,161,0,0,0,114, + 168,0,0,0,114,177,0,0,0,114,181,0,0,0,114,183, + 0,0,0,114,190,0,0,0,114,195,0,0,0,114,196,0, + 0,0,114,201,0,0,0,218,6,111,98,106,101,99,116,114, + 210,0,0,0,114,214,0,0,0,114,215,0,0,0,114,236, + 0,0,0,114,250,0,0,0,114,12,1,0,0,114,35,1, + 0,0,114,42,1,0,0,114,31,1,0,0,114,48,1,0, + 0,114,76,1,0,0,114,80,1,0,0,114,97,1,0,0, + 114,116,1,0,0,114,209,0,0,0,114,119,1,0,0,114, + 121,1,0,0,114,9,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,218,8,60,109,111,100,117,108, + 101,62,1,0,0,0,115,184,0,0,0,4,0,4,22,8, + 3,8,1,8,1,8,1,8,1,10,3,4,1,8,1,10, + 1,8,2,4,3,10,1,6,2,14,2,14,1,22,3,8, + 1,8,1,10,1,14,1,4,4,4,1,2,1,2,1,4, + 255,8,4,6,16,8,3,8,5,8,5,4,6,10,1,8, + 30,8,6,8,8,8,10,8,9,8,5,4,7,10,1,8, + 8,10,5,10,22,0,127,16,30,12,1,4,2,4,1,6, + 2,4,1,10,1,8,2,6,2,8,2,16,2,8,71,8, + 40,8,19,8,12,8,12,8,31,8,20,8,33,8,28,10, + 24,10,13,10,10,8,11,6,14,4,3,2,1,12,255,14, + 73,14,67,16,30,0,127,14,17,18,50,18,45,18,25,14, + 53,14,69,14,49,0,127,14,32,0,127,10,30,8,23,8, + 11,12,5, };