diff --git a/.github/workflows/mingw.yml b/.github/workflows/mingw.yml new file mode 100644 index 00000000000000..6f88865876a1db --- /dev/null +++ b/.github/workflows/mingw.yml @@ -0,0 +1,295 @@ +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 \ + --enable-loadable-sqlite-extensions \ + --with-tzpath=${MINGW_PREFIX}/share/zoneinfo \ + --enable-optimizations + + make -j8 + + - name: Run Smoke Test (build) + shell: msys2 {0} + run: | + export SETUPTOOLS_USE_DISTUTILS=stdlib + SMOKETESTS="$(pwd)/mingw_smoketests.py" + cd _build + ./python.exe "$SMOKETESTS" + MSYSTEM= ./python.exe "$SMOKETESTS" + + - 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 + + - name: Run broken tests + 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 + + - 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|#!${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 SETUPTOOLS_USE_DISTUTILS=stdlib + 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-gcc-x86_64: + 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 zip + + - 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 + + ../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 \ + --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-gcc-x86_64 + path: install.zip + + cross-gcc-x86_64-test: + needs: [cross-gcc-x86_64] + runs-on: windows-latest + steps: + - uses: actions/download-artifact@v2 + with: + 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())" + + 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/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/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 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/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/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 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. */ 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/pylifecycle.h b/Include/pylifecycle.h index 2df7fe6e3c83d6..ce3f4116fcecd3 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. @@ -46,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/Include/pyport.h b/Include/pyport.h index 6ab0ae4007922a..78f7d53ea0455f 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. @@ -654,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 @@ -672,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) @@ -786,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/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/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, ...); 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 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]) 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): 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/command/build_ext.py b/Lib/distutils/command/build_ext.py index 1a9bd1200f8235..ab1a3e7a0ca07e 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. @@ -218,15 +218,16 @@ 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.executable.startswith(os.path.join(sys.exec_prefix, "bin")): + if sys.platform[:6] == 'cygwin' or self.plat_name.startswith(('mingw')): + 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", "python" + get_python_version(), - "config")) + 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 @@ -237,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 @@ -712,6 +713,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/command/install.py b/Lib/distutils/command/install.py index 01d5331a63069b..25eb3d8d10133a 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_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, @@ -363,7 +364,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/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py index 66c12dd35830b2..d8c8428ac0d440 100644 --- a/Lib/distutils/cygwinccompiler.py +++ b/Lib/distutils/cygwinccompiler.py @@ -44,12 +44,13 @@ # (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 import copy -from subprocess import Popen, PIPE, check_output -import re +import shlex from distutils.unixccompiler import UnixCCompiler from distutils.file_util import write_file @@ -57,6 +58,7 @@ CompileError, UnknownFileError) from distutils.version import LooseVersion from distutils.spawn import find_executable +from subprocess import Popen, check_output def get_msvcr(): """Include the appropriate MSVC runtime library if Python was built @@ -91,6 +93,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" @@ -109,50 +112,28 @@ 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++') - # 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" - - # 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', + # 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" + + 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": - # 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.""" @@ -162,6 +143,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] + @@ -214,28 +217,21 @@ 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)) - if not debug: + if not debug and not hasattr(sys, 'gettotalrefcount'): extra_preargs.append("-s") UnixCCompiler.link(self, target_desc, objects, output_filename, @@ -253,11 +249,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)) - if ext not in (self.src_extensions + ['.rc','.res']): + 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', '.mc']: + ext = ext_normcase + 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 + base = base[os.path.isabs(base):] # If abs, chop off leading / if strip_dir: base = os.path.basename (base) if ext in ('.res', '.rc'): @@ -279,31 +280,18 @@ 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 self.ld_version >= "2.13": - shared_option = "-shared" - else: - shared_option = "-mdll -static" - - # 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": - entry_point = '--entry _DllMain@12' - else: - entry_point = '' + shared_option = "-shared" - if is_cygwingcc(): + if is_cygwincc(self.cc): 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', - linker_exe='gcc', - linker_so='%s %s %s' - % (self.linker_dll, shared_option, - entry_point)) + 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' + % (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') @@ -313,7 +301,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 @@ -351,6 +339,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: @@ -366,38 +358,8 @@ def check_config_h(): return (CONFIG_H_UNCERTAIN, "couldn't read '%s': %s" % (fn, exc.strerror)) -RE_VERSION = re.compile(br'(\d+\.\d+(\.\d+)*)') - -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 - 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. - """ - 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(shlex.split(cc) + ['-dumpmachine']) return out_string.strip().endswith(b'cygwin') 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 diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py index 3414a761e76b99..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. @@ -201,7 +216,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. @@ -279,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 @@ -326,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. 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 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: diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py index 2ce5c5b64d62fa..81626b394612c2 100644 --- a/Lib/distutils/util.py +++ b/Lib/distutils/util.py @@ -37,6 +37,22 @@ def get_host_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' if 'amd64' in sys.version.lower(): return 'win-amd64' if '(arm)' in sys.version.lower(): @@ -130,6 +146,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 () @@ -140,6 +163,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): @@ -149,9 +176,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) diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 49bcaea78d7650..0781dda9afc656 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -42,6 +42,10 @@ path_separators = ['\\', '/'] else: path_separators = ['/'] + +if _os.environ.get('MSYSTEM', ''): + 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] diff --git a/Lib/ntpath.py b/Lib/ntpath.py index 97edfa52aaafb8..e141b61868556e 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 os.environ.get("MSYSTEM", ""): + 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 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 '\\/' + 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__ @@ -330,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'] @@ -357,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. @@ -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/Lib/pathlib.py b/Lib/pathlib.py index 97b23ca45a3a19..b7ea294e6b31d1 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -115,6 +115,8 @@ class _WindowsFlavour(_Flavour): sep = '\\' altsep = '/' + if os.environ.get('MSYSTEM', ''): + sep, altsep = altsep, sep has_drv = True pathmod = ntpath diff --git a/Lib/site.py b/Lib/site.py index 939893eb5ee93b..877167b7a0f36d 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") @@ -283,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': - ver_nodot = sys.winver.replace('.', '') - return f'{userbase}\\Python{ver_nodot}\\site-packages' + 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' @@ -365,7 +393,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], @@ -395,7 +423,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)' 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() diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index daf9f000060a35..9e1df5d999bb85 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__ = [ @@ -47,17 +48,22 @@ '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}', }, } +# 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. @@ -73,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") @@ -89,20 +95,20 @@ 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_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}', }, @@ -136,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) @@ -225,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', @@ -381,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 @@ -460,11 +473,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: @@ -487,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'] = '' @@ -533,7 +565,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 @@ -608,10 +640,14 @@ 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': + 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') @@ -625,7 +661,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 @@ -666,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. @@ -689,6 +725,22 @@ 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' if 'amd64' in sys.version.lower(): return 'win-amd64' if '(arm)' in sys.version.lower(): 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: 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/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): """ 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" diff --git a/Makefile.pre.in b/Makefile.pre.in index 8ee44bfc0adb6a..46d203d6201f17 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 @@ -136,6 +138,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@ @@ -153,10 +162,12 @@ 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@ EXT_SUFFIX= @EXT_SUFFIX@ +PYD_PLATFORM_TAG = @PYD_PLATFORM_TAG@ LDSHARED= @LDSHARED@ $(PY_LDFLAGS) BLDSHARED= @BLDSHARED@ $(PY_CORE_LDFLAGS) LDCXXSHARED= @LDCXXSHARED@ @@ -258,6 +269,9 @@ 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 @@ -307,6 +321,7 @@ IO_OBJS= \ ########################################################################## LIBFFI_INCLUDEDIR= @LIBFFI_INCLUDEDIR@ +NCURSESW_INCLUDEDIR= @NCURSESW_INCLUDEDIR@ ########################################################################## # Parser @@ -349,7 +364,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 \ @@ -361,6 +376,7 @@ PYTHON_OBJS= \ Python/import.o \ Python/importdl.o \ Python/initconfig.o \ + Python/iscygpty.o \ Python/marshal.o \ Python/modsupport.o \ Python/mysnprintf.o \ @@ -471,7 +487,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) $(BUILDVENVLAUNCHER) $(BUILDVENVWLAUNCHER) oldsharedmods sharedmods gdbhooks \ Programs/_testembed python-config # Check that the source is clean when building out of source. @@ -584,9 +600,29 @@ 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 + +# 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 @@ -696,10 +732,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) $(LDFLAGS_NODIST) $(MODLIBS) $(SYSLIBS) python_nt.o; \ else true; \ fi @@ -710,10 +746,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 @@ -728,20 +766,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 @@ -823,6 +861,11 @@ 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) \ + -DPYD_PLATFORM_TAG='"$(PYD_PLATFORM_TAG)"' \ + -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)"' \ @@ -1057,6 +1100,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 \ @@ -1313,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"; \ @@ -1323,6 +1367,9 @@ 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); \ + $(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 @@ -1444,6 +1491,7 @@ LIBSUBDIRS= asyncio \ sqlite3 \ tkinter \ turtledemo \ + msilib \ unittest \ urllib \ venv venv/scripts venv/scripts/common venv/scripts/posix \ @@ -1706,8 +1754,8 @@ 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 \ - $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \ + if test "$(SHLIB_SUFFIX)" = .dll -o "$(SHLIB_SUFFIX)" = .pyd; then \ + $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBDIR) ; \ else \ $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \ fi; \ @@ -1722,6 +1770,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 @@ -1744,16 +1793,23 @@ 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 + MSYS2_ARG_CONV_EXCL="--prefix=;--install-scripts=;--install-platlib=" \ $(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/setup.py install \ --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 @@ -1912,7 +1968,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 @@ -1947,6 +2003,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/Misc/config_mingw b/Misc/config_mingw new file mode 100644 index 00000000000000..9be43fd3a11407 --- /dev/null +++ b/Misc/config_mingw @@ -0,0 +1,15 @@ +# 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 + +# force detection of winsock2 functionality - require wxp or newer +ac_cv_func_getpeername=yes 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/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 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/Modules/Setup b/Modules/Setup index 87c6a152f86eac..3097db66c900ad 100644 --- a/Modules/Setup +++ b/Modules/Setup @@ -101,10 +101,7 @@ 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 _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 @@ -114,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 @@ -123,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/Modules/Setup.config.in b/Modules/Setup.config.in new file mode 100644 index 00000000000000..b4e7ff71a52a74 --- /dev/null +++ b/Modules/Setup.config.in @@ -0,0 +1,16 @@ +# 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. + +# 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 +@USE_WIN32_MODULE@msvcrt -DPy_BUILD_CORE ../PC/msvcrtmodule.c +@USE_WIN32_MODULE@_winapi _winapi.c + 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 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 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/_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/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} 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/Modules/_winapi.c b/Modules/_winapi.c index 9b30a900326192..124dbc861996ba 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) @@ -957,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; @@ -1526,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_) { 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 */ diff --git a/Modules/getpath.c b/Modules/getpath.c index ef6dd59a084d8d..2b4ae2823d15da 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); @@ -418,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(); } @@ -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)) { @@ -1526,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) { @@ -1592,6 +1731,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/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 f92e2ae6290ad2..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__ @@ -42,6 +42,7 @@ #ifdef __ANDROID__ # undef HAVE_FACCESSAT #endif +#include "iscygpty.h" #include /* needed for ctermid() */ @@ -320,6 +321,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 +442,7 @@ extern char *ctermid_r(char *); # endif #endif -#ifdef _MSC_VER +#ifdef MS_WINDOWS # ifdef HAVE_DIRECT_H # include # endif @@ -442,7 +464,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 +1613,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) @@ -3800,6 +3822,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); @@ -4089,7 +4112,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; @@ -4363,6 +4386,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)); @@ -4440,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) { @@ -4452,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); @@ -4471,6 +4502,7 @@ os__path_splitroot_impl(PyObject *module, path_t *path) } + #endif /* MS_WINDOWS */ @@ -5382,7 +5414,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; @@ -10092,7 +10124,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; @@ -14569,7 +14601,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(); @@ -14619,7 +14651,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/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/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/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/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]"); 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/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 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/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/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 4fefcdcc942ff9..d53f028be16ab4 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); @@ -794,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/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. */ 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/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/Python/dynload_win.c b/Python/dynload_win.c index 5702ab2cd71ba1..c46061c54db138 100644 --- a/Python/dynload_win.c +++ b/Python/dynload_win.c @@ -167,7 +167,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); @@ -192,8 +194,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/Python/fileutils.c b/Python/fileutils.c index 3b53baa00eeb10..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; } } @@ -1976,13 +1977,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. 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/getcompiler.c b/Python/getcompiler.c index a5d26239e8772e..4b0b9b328ba2f8 100644 --- a/Python/getcompiler.c +++ b/Python/getcompiler.c @@ -7,10 +7,40 @@ // 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__) -#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)" +#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 +#else +#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 +#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++]" 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, }; 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/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/pathconfig.c b/Python/pathconfig.c index 1017a571f2b829..fea3ec4ebf6f12 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 && strcmp(msystem, "") != 0) + 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 && strcmp(msystem, "") != 0) + 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/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) { 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 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 */ 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 diff --git a/configure.ac b/configure.ac index cc69015b102bb7..6666a89321d0ed 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. @@ -400,6 +401,30 @@ then *-*-cygwin*) ac_sys_system=Cygwin ;; + *-*-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 ;; @@ -408,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" \ @@ -429,6 +453,7 @@ then linux*) MACHDEP="linux";; cygwin*) MACHDEP="cygwin";; darwin*) MACHDEP="darwin";; + mingw*) MACHDEP="win32";; '') MACHDEP="unknown";; esac fi @@ -452,12 +477,26 @@ if test "$cross_compiling" = yes; then *-*-vxworks*) _host_cpu=$host_cpu ;; + *-*-mingw*) + _host_cpu= + ;; + *-*-darwin*) + _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 @@ -569,6 +608,73 @@ 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 + *-*-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 @@ -895,6 +1001,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" @@ -1182,6 +1310,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 @@ -1190,6 +1325,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 @@ -1198,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) @@ -1603,6 +1745,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) @@ -1981,7 +2143,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" @@ -2044,6 +2206,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([[#include ]],[[_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 +2371,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 +2393,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 @@ -2212,10 +2427,10 @@ 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 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 \ @@ -2227,9 +2442,23 @@ 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 +# 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 @@ -2396,8 +2625,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 @@ -2429,6 +2670,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 +2704,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) @@ -2479,7 +2725,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)';; @@ -2504,7 +2750,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" ;; @@ -2516,7 +2762,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" ;; @@ -2634,6 +2880,9 @@ if test -z "$SHLIB_SUFFIX"; then CYGWIN*) SHLIB_SUFFIX=.dll;; *) SHLIB_SUFFIX=.so;; esac + case $host_os in + mingw*) SHLIB_SUFFIX=.pyd;; + esac fi AC_MSG_RESULT($SHLIB_SUFFIX) @@ -2758,6 +3007,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} @@ -2863,6 +3118,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) @@ -2901,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 @@ -2949,16 +3214,30 @@ 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 +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 @@ -3127,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 @@ -3218,6 +3497,25 @@ 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='#' +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, @@ -3252,6 +3550,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" @@ -3589,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 @@ -3681,6 +3987,27 @@ 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 -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) if test "$DYNLOADFILE" != "dynload_stub.o" @@ -3706,6 +4033,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 \ @@ -4001,10 +4337,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)], @@ -4071,6 +4411,9 @@ char *r = crypt_r("", "", &d); []) ) +case $host in + *-*-mingw*) ;; + *) AC_CHECK_FUNCS(clock_gettime, [], [ AC_CHECK_LIB(rt, clock_gettime, [ LIBS="$LIBS -lrt" @@ -4091,6 +4434,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([[ @@ -4285,21 +4630,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) @@ -4637,6 +4997,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 +5034,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 @@ -4704,7 +5076,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]) @@ -4805,6 +5180,71 @@ 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" + ;; + armv7-*-mingw*) + PYD_PLATFORM_TAG+="mingw_armv7" + ;; + 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 @@ -4837,7 +5277,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)' @@ -4845,7 +5290,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='' @@ -5228,11 +5673,16 @@ 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" -fi +CPPFLAGS="$CPPFLAGS -I$NCURSESW_INCLUDEDIR" AC_CHECK_HEADERS(curses.h ncurses.h) @@ -5475,7 +5925,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 @@ -5568,8 +6021,32 @@ 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. + dnl (-I. at end is workaround for setup.py logic) + CPPFLAGS="-I\$(srcdir)/PC $CPPFLAGS -I." + ;; +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 + *-*-mingw*) SRCDIRS="$SRCDIRS PC";; +esac AC_MSG_CHECKING(for build directories) for dir in $SRCDIRS; do if test ! -d $dir; then @@ -5578,6 +6055,38 @@ 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" + 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) saved_cflags="$CFLAGS" @@ -6006,7 +6515,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 +6527,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 diff --git a/mingw_ignorefile.txt b/mingw_ignorefile.txt new file mode 100644 index 00000000000000..78181a952e019a --- /dev/null +++ b/mingw_ignorefile.txt @@ -0,0 +1,40 @@ +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.* +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 +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 diff --git a/mingw_smoketests.py b/mingw_smoketests.py new file mode 100644 index 00000000000000..2d107ad6b665f5 --- /dev/null +++ b/mingw_smoketests.py @@ -0,0 +1,320 @@ +#!/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 os.environ.get("MSYSTEM", ""): + SEP = "/" +else: + SEP = "\\" + +_UCRT = sysconfig.get_platform() not in ('mingw_x86_64', 'mingw_i686') + + +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_c_modules_import(self): + import _decimal + + 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) + 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) + + 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') diff --git a/pyconfig.h.in b/pyconfig.h.in index 57c84e5f8fac01..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. */ @@ -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 @@ -1686,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 85a2b26357db46..12a9528126b770 100644 --- a/setup.py +++ b/setup.py @@ -79,9 +79,20 @@ 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 os.environ.get("MSYSTEM", ""): + 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') +MS_WINDOWS = (HOST_PLATFORM == 'win32' or HOST_PLATFORM == 'mingw') CYGWIN = (HOST_PLATFORM == 'cygwin') MACOS = (HOST_PLATFORM == 'darwin') AIX = (HOST_PLATFORM.startswith('aix')) @@ -474,6 +485,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() @@ -666,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( @@ -691,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( @@ -753,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 @@ -775,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) @@ -828,10 +853,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): @@ -877,7 +902,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. @@ -887,6 +912,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:]) @@ -985,13 +1012,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)): @@ -1002,14 +1037,21 @@ 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'])) # 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'])) @@ -1035,8 +1077,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 @@ -1044,7 +1089,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 @@ -1061,12 +1110,15 @@ 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 = "" 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. @@ -1129,6 +1181,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 @@ -1163,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('/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' @@ -1228,12 +1281,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) @@ -1241,6 +1297,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)) @@ -1463,7 +1521,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": @@ -1613,6 +1671,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. @@ -1675,6 +1734,29 @@ 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']])) + + # 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']], + 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: @@ -1849,7 +1931,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 @@ -2056,12 +2143,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 = [] @@ -2118,14 +2205,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 @@ -2196,10 +2288,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: @@ -2267,9 +2367,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 @@ -2314,6 +2417,10 @@ def detect_ctypes(self): ext.include_dirs.append(ffi_inc) 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'): @@ -2455,6 +2562,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']) @@ -2697,7 +2806,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)