cpython: 1da623513b26 (original) (raw)
Mercurial > cpython
changeset 76478:1da623513b26
Issue #14605: Expose importlib.abc.FileLoader and importlib.machinery.(FileFinder, SourceFileLoader, _SourcelessFileLoader, ExtensionFileLoader). This exposes all of importlib's mechanisms that will become public on the sys module. [#14605]
line wrap: on
line diff
--- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -237,6 +237,34 @@ are also provided to help in implementin module. +.. class:: FileLoader(fullname, path) +
- An abstract base class which inherits from :class:
ResourceLoader
and - :class:
ExecutionLoader
, providing concreate implementations of - :meth:
ResourceLoader.get_data
and :meth:ExecutionLoader.get_filename
. + - The fullname argument is a fully resolved name of the module the loader is
- to handle. The path argument is the path to the file for the module. +
- .. versionadded:: 3.3 +
- .. attribute:: name +
The name of the module the loader can handle.[](#l1.20)
+
+
.. class:: SourceLoader
An abstract base class for implementing source (and optionally bytecode)
@@ -498,6 +526,163 @@ find and load modules.
module. If no finder is ever found then None
is returned.
+.. class:: FileFinder(path, *loader_details)
+
- A concrete implementation of :class:
importlib.abc.Finder
which caches - results from the file system. +
- The path argument is the directory for which the finder is in charge of
- searching. +
- The loader_details argument is a variable number of 3-item tuples each
- containing a loader, file suffixes the loader recognizes, and a boolean
- representing whether the loader handles packages. +
- The finder will cache the directory contents as necessary, making stat calls
- for each module search to verify the cache is not outdated. Because cache
- staleness relies upon the granularity of the operating system's state
- information of the file system, there is a potential race condition of
- searching for a module, creating a new file, and then searching for the
- module the new file represents. If the operations happen fast enough to fit
- within the granularity of stat calls, then the module search will fail. To
- prevent this from happening, when you create a module dynamically, make sure
- to call :func:
importlib.invalidate_caches
. + - .. versionadded:: 3.3 +
- .. attribute:: path +
The path the finder will search in.[](#l1.68)
- .. method:: find_module(fullname) +
Attempt to find the loader to handle *fullname* within :attr:`path`.[](#l1.72)
- .. classmethod:: path_hook(*loader_details) +
A class method which returns a closure for use on :attr:`sys.path_hooks`.[](#l1.80)
An instance of :class:`FileFinder` is returned by the closure using the[](#l1.81)
path argument given to the closure directly and *loader_details*[](#l1.82)
indirectly.[](#l1.83)
If the argument to the closure is not an existing directory,[](#l1.85)
:exc:`ImportError` is raised.[](#l1.86)
+ + +.. class:: SourceFileLoader(fullname, path) +
- A concrete implementation of :class:
importlib.abc.SourceLoader
by - subclassing :class:
importlib.abc.FileLoader
and providing some concrete - implementations of other methods. +
- .. versionadded:: 3.3 +
- .. attribute:: name +
The name of the module that this loader will handle.[](#l1.99)
- .. method:: is_package(fullname) +
Return true if :attr:`path` appears to be for a package.[](#l1.107)
- .. method:: path_stats(path) +
Concrete implementation of :meth:`importlib.abc.SourceLoader.path_stats`.[](#l1.111)
- .. method:: set_data(path, data) +
Concrete implementation of :meth:`importlib.abc.SourceLoader.set_data`.[](#l1.115)
- .. method:: load_module(fullname) +
Load the specified module if it is the same as :attr:`name`.[](#l1.119)
+ + +.. class:: _SourcelessFileLoader(fullname, path) +
- A concrete implementation of :class:
importlib.abc.FileLoader
which can - import bytecode files (i.e. no source code files exist). +
- It is strongly suggested you do not rely on this loader (hence the
- leading underscore of the class). Direct use of bytecode files (and thus not
- source code files) inhibits your modules from being usable by all Python
- implementations. It also runs the risk of your bytecode files not being
- usable by new versions of Python which change the bytecode format. This
- class is only documented as it is directly used by import and thus can
- potentially have instances show up as a module's
__loader__
attribute. + - .. versionadded:: 3.3 +
- .. attribute:: name +
The name of the module the loader will handle.[](#l1.139)
- .. method:: is_package(fullname) +
Determines if the module is a package based on :attr:`path`.[](#l1.147)
- .. method:: get_code(fullname) +
Returns the code object for :attr:`name` created from :attr:`path`.[](#l1.151)
- .. method:: get_source(fullname) +
Returns ``None`` as bytecode files have no source when this loader is[](#l1.155)
used.[](#l1.156)
- .. method:: load_module(fullname) +
Loads the specified module if it is the same as :attr:`name`.[](#l1.160)
+ + +.. class:: ExtensionFileLoader(fullname, path) +
- A concrete implementation of :class:
importlib.abc.InspectLoader
for - extension modules. +
- The fullname argument specifies the name of the module the loader is to
- support. The path argument is the path to the extension module's file. +
- .. versionadded:: 3.3 +
- .. attribute:: name +
Name of the module the loader supports.[](#l1.175)
- .. method:: load_module(fullname) +
Loads the extension module if and only if *fullname** is the same as[](#l1.183)
:attr:`name`.[](#l1.184)
- .. method:: is_package(fullname) +
Returns ``False`` as extension modules can never be packages.[](#l1.188)
- .. method:: get_code(fullname) +
Returns ``None`` as extension modules lack a code object.[](#l1.192)
- .. method:: get_source(fullname) +
Returns ``None`` as extension modules do not have source code.[](#l1.196)
+
+
:mod:importlib.util
-- Utility code for importers
---------------------------------------------------
--- a/Lib/imp.py +++ b/Lib/imp.py @@ -71,7 +71,7 @@ class HackedGetData: def get_data(self, path): """Gross hack to contort loader to deal w/ load*()'s bad API."""
if self.file and path == self._path:[](#l2.7)
if self.file and path == self.path:[](#l2.8) with self.file:[](#l2.9) # Technically should be returning bytes, but[](#l2.10) # SourceLoader.get_code() just passed what is returned to[](#l2.11)
@@ -83,7 +83,7 @@ class _HackedGetData: return super().get_data(path) -class _LoadSourceCompatibility(_HackedGetData, _bootstrap._SourceFileLoader): +class _LoadSourceCompatibility(_HackedGetData, _bootstrap.SourceFileLoader): """Compatibility support for implementing load_source().""" @@ -115,7 +115,7 @@ def load_package(name, path): break else: raise ValueError('{!r} is not a package'.format(path))
XXX deprecate
--- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -13,6 +13,9 @@ work. One should use importlib as the pu
reference any injected objects! This includes not only global code but also
anything specified at the class level.
+# XXX Make sure all public names have no single leading underscore and all +# others do. +
Bootstrap-related code ######################################################
@@ -283,7 +286,7 @@ def _check_name(method): """ def _check_name_wrapper(self, name, *args, **kwargs):
if self._name != name:[](#l3.17)
_wrap(_check_name_wrapper, method) @@ -423,7 +426,7 @@ class FrozenImporter: class _LoaderBasics: """Base class of common code needed by both SourceLoader andif self.name != name:[](#l3.18) raise ImportError("loader cannot handle %s" % name, name=name)[](#l3.19) return method(self, name, *args, **kwargs)[](#l3.20)
def is_package(self, fullname): """Concrete implementation of InspectLoader.is_package by checking if @@ -608,7 +611,7 @@ class SourceLoader(_LoaderBasics): return self._load_module(fullname) -class _FileLoader: +class FileLoader: """Base file loader class which implements the loader protocol methods that require file system usage.""" @@ -616,13 +619,13 @@ class _FileLoader: def init(self, fullname, path): """Cache the module name and the path to the file found by the finder."""
self._name = fullname[](#l3.44)
self._path = path[](#l3.45)
self.name = fullname[](#l3.46)
self.path = path[](#l3.47)
@_check_name def get_filename(self, fullname): """Return the path to the source file as found by the finder."""
return self._path[](#l3.52)
return self.path[](#l3.53)
def get_data(self, path): """Return the data from path as raw bytes.""" @@ -630,7 +633,7 @@ class _FileLoader: return file.read() -class _SourceFileLoader(_FileLoader, SourceLoader): +class SourceFileLoader(FileLoader, SourceLoader): """Concrete implementation of SourceLoader using the file system.""" @@ -668,7 +671,7 @@ class _SourceFileLoader(_FileLoader, Sou pass -class _SourcelessFileLoader(_FileLoader, _LoaderBasics): +class _SourcelessFileLoader(FileLoader, _LoaderBasics): """Loader which handles sourceless file imports.""" @@ -692,7 +695,7 @@ class _SourcelessFileLoader(_FileLoader, return None -class _ExtensionFileLoader: +class ExtensionFileLoader: """Loader for extension modules. @@ -701,8 +704,8 @@ class _ExtensionFileLoader: """ def init(self, name, path):
self._name = name[](#l3.88)
self._path = path[](#l3.89)
self.name = name[](#l3.90)
self.path = path[](#l3.91)
@_check_name @set_package @@ -711,8 +714,8 @@ class _ExtensionFileLoader: """Load an extension module.""" is_reload = fullname in sys.modules try:
module = _imp.load_dynamic(fullname, self._path)[](#l3.99)
verbose_message('extension module loaded from {!r}', self._path)[](#l3.100)
module = _imp.load_dynamic(fullname, self.path)[](#l3.101)
verbose_message('extension module loaded from {!r}', self.path)[](#l3.102) return module[](#l3.103) except:[](#l3.104) if not is_reload and fullname in sys.modules:[](#l3.105)
@@ -805,24 +808,25 @@ class PathFinder: return None -class _FileFinder: +class FileFinder: """File-based finder.
- Constructor takes a list of objects detailing what file extensions their
- loader supports along with whether it can be used for a package.
- Interactions with the file system are cached for performance, being
- refreshed when the directory the finder is handling has been modified.
""" def init(self, path, *details):
"""Initialize with finder details."""[](#l3.123)
"""Initialize with the path to search on and a variable number of[](#l3.124)
3-tuples containing the loader, file suffixes the loader recognizes, and[](#l3.125)
a boolean of whether the loader handles packages."""[](#l3.126) packages = [][](#l3.127) modules = [][](#l3.128)
for detail in details:[](#l3.129)
modules.extend((suffix, detail.loader) for suffix in detail.suffixes)[](#l3.130)
if detail.supports_packages:[](#l3.131)
packages.extend((suffix, detail.loader)[](#l3.132)
for suffix in detail.suffixes)[](#l3.133)
for loader, suffixes, supports_packages in details:[](#l3.134)
modules.extend((suffix, loader) for suffix in suffixes)[](#l3.135)
if supports_packages:[](#l3.136)
packages.extend((suffix, loader) for suffix in suffixes)[](#l3.137) self.packages = packages[](#l3.138) self.modules = modules[](#l3.139) # Base (directory) path[](#l3.140)
@@ -898,46 +902,29 @@ class _FileFinder: if sys.platform.startswith(CASE_INSENSITIVE_PLATFORMS): self._relaxed_path_cache = set(fn.lower() for fn in contents) - -class _SourceFinderDetails:
- @classmethod
- def path_hook(cls, *loader_details):
"""A class method which returns a closure to use on sys.path_hook[](#l3.149)
which will return an instance using the specified loaders and the path[](#l3.150)
called on the closure.[](#l3.151)
- -class _SourcelessFinderDetails:
If the path called on the closure is not a directory, ImportError is[](#l3.160)
raised.[](#l3.161)
"""[](#l3.169)
def path_hook_for_FileFinder(path):[](#l3.170)
"""Path hook for importlib.machinery.FileFinder."""[](#l3.171)
if not _path_isdir(path):[](#l3.172)
raise ImportError("only directories are supported", path=path)[](#l3.173)
return cls(path, *loader_details)[](#l3.174)
-class _ExtensionFinderDetails:
return path_hook_for_FileFinder[](#l3.177)
Import itself ###############################################################
- """If the path is a directory, return a file-based finder."""
- if _path_isdir(path):
return _FileFinder(path, _ExtensionFinderDetails(),[](#l3.191)
_SourceFinderDetails(),[](#l3.192)
_SourcelessFinderDetails())[](#l3.193)
- else:
raise ImportError("only directories are supported", path=path)[](#l3.195)
- - -_DEFAULT_PATH_HOOK = _file_path_hook +_DEFAULT_PATH_HOOK = None # Set in _setup() class _DefaultPathFinder(PathFinder): @@ -1209,6 +1196,12 @@ def _setup(sys_module, _imp_module): if builtin_os == 'nt': SOURCE_SUFFIXES.append('.pyw')
- supported_loaders = [(ExtensionFileLoader, _suffix_list(3), False),
(SourceFileLoader, _suffix_list(1), True),[](#l3.208)
(_SourcelessFileLoader, _suffix_list(2), True)][](#l3.209)
- setattr(self_module, '_DEFAULT_PATH_HOOK',
FileFinder.path_hook(*supported_loaders))[](#l3.211)
+ def _install(sys_module, _imp_module): """Install importlib as the implementation of import.
--- a/Lib/importlib/abc.py +++ b/Lib/importlib/abc.py @@ -1,6 +1,12 @@ """Abstract base classes related to import.""" from . import _bootstrap from . import machinery +try:
import abc import imp import marshal @@ -9,6 +15,14 @@ import tokenize import warnings +def _register(abstract_cls, *classes):
- for cls in classes:
abstract_cls.register(cls)[](#l4.22)
if _frozen_importlib is not None:[](#l4.23)
frozen_cls = getattr(_frozen_importlib, cls.__name__)[](#l4.24)
abstract_cls.register(frozen_cls)[](#l4.25)
+ + class Loader(metaclass=abc.ABCMeta): """Abstract base class for import loaders.""" @@ -32,9 +46,8 @@ class Finder(metaclass=abc.ABCMeta): """ raise NotImplementedError -Finder.register(machinery.BuiltinImporter) -Finder.register(machinery.FrozenImporter) -Finder.register(machinery.PathFinder) +_register(Finder, machinery.BuiltinImporter, machinery.FrozenImporter,
machinery.PathFinder, machinery.FileFinder)[](#l4.39)
class ResourceLoader(Loader): @@ -80,8 +93,8 @@ class InspectLoader(Loader): module. The fullname is a str. Returns a str.""" raise NotImplementedError -InspectLoader.register(machinery.BuiltinImporter) -InspectLoader.register(machinery.FrozenImporter) +_register(InspectLoader, machinery.BuiltinImporter, machinery.FrozenImporter,
machinery.ExtensionFileLoader)[](#l4.50)
class ExecutionLoader(InspectLoader): @@ -100,6 +113,15 @@ class ExecutionLoader(InspectLoader): raise NotImplementedError +class FileLoader(_bootstrap.FileLoader, ResourceLoader, ExecutionLoader): +
+ +_register(FileLoader, machinery.SourceFileLoader,
machinery._SourcelessFileLoader)[](#l4.64)
+ + class SourceLoader(_bootstrap.SourceLoader, ResourceLoader, ExecutionLoader): """Abstract base class for loading source code (and optionally any @@ -146,6 +168,7 @@ class SourceLoader(_bootstrap.SourceLoad """ raise NotImplementedError +_register(SourceLoader, machinery.SourceFileLoader) class PyLoader(SourceLoader):
--- a/Lib/importlib/machinery.py +++ b/Lib/importlib/machinery.py @@ -3,3 +3,7 @@ from ._bootstrap import BuiltinImporter from ._bootstrap import FrozenImporter from ._bootstrap import PathFinder +from ._bootstrap import FileFinder +from ._bootstrap import SourceFileLoader +from ._bootstrap import _SourcelessFileLoader +from ._bootstrap import ExtensionFileLoader
--- a/Lib/importlib/test/extension/test_case_sensitivity.py +++ b/Lib/importlib/test/extension/test_case_sensitivity.py @@ -1,3 +1,4 @@ +import imp import sys from test import support import unittest @@ -13,8 +14,10 @@ class ExtensionModuleCaseSensitivityTest good_name = ext_util.NAME bad_name = good_name.upper() assert good_name != bad_name
finder = _bootstrap._FileFinder(ext_util.PATH,[](#l6.12)
_bootstrap._ExtensionFinderDetails())[](#l6.13)
finder = _bootstrap.FileFinder(ext_util.PATH,[](#l6.14)
(_bootstrap.ExtensionFileLoader,[](#l6.15)
_bootstrap._suffix_list(imp.C_EXTENSION),[](#l6.16)
False))[](#l6.17) return finder.find_module(bad_name)[](#l6.18)
def test_case_sensitive(self):
--- a/Lib/importlib/test/extension/test_finder.py +++ b/Lib/importlib/test/extension/test_finder.py @@ -2,6 +2,7 @@ from importlib import _bootstrap from .. import abc from . import util +import imp import unittest class FinderTests(abc.FinderTests): @@ -9,8 +10,10 @@ class FinderTests(abc.FinderTests): """Test the finder for extension modules.""" def find_module(self, fullname):
importer = _bootstrap._FileFinder(util.PATH,[](#l7.15)
_bootstrap._ExtensionFinderDetails())[](#l7.16)
importer = _bootstrap.FileFinder(util.PATH,[](#l7.17)
(_bootstrap.ExtensionFileLoader,[](#l7.18)
_bootstrap._suffix_list(imp.C_EXTENSION),[](#l7.19)
False))[](#l7.20) return importer.find_module(fullname)[](#l7.21)
--- a/Lib/importlib/test/extension/test_loader.py +++ b/Lib/importlib/test/extension/test_loader.py @@ -12,7 +12,7 @@ class LoaderTests(abc.LoaderTests): """Test load_module() for extension modules.""" def load_module(self, fullname):
loader = _bootstrap._ExtensionFileLoader(ext_util.NAME,[](#l8.7)
loader = _bootstrap.ExtensionFileLoader(ext_util.NAME,[](#l8.8) ext_util.FILEPATH)[](#l8.9) return loader.load_module(fullname)[](#l8.10)
@@ -25,7 +25,7 @@ class LoaderTests(abc.LoaderTests): self.assertEqual(getattr(module, attr), value) self.assertTrue(ext_util.NAME in sys.modules) self.assertTrue(isinstance(module.loader,
_bootstrap._ExtensionFileLoader))[](#l8.16)
_bootstrap.ExtensionFileLoader))[](#l8.17)
def test_package(self): # Extensions are not found in packages.
--- a/Lib/importlib/test/extension/test_path_hook.py +++ b/Lib/importlib/test/extension/test_path_hook.py @@ -14,7 +14,8 @@ class PathHookTests(unittest.TestCase): # XXX Should it only work for directories containing an extension module? def hook(self, entry):
return _bootstrap._file_path_hook(entry)[](#l9.7)
return _bootstrap.FileFinder.path_hook((_bootstrap.ExtensionFileLoader,[](#l9.8)
_bootstrap._suffix_list(imp.C_EXTENSION), False))(entry)[](#l9.9)
def test_success(self): # Path hook should handle a directory where a known extension module
--- a/Lib/importlib/test/source/test_case_sensitivity.py +++ b/Lib/importlib/test/source/test_case_sensitivity.py @@ -2,6 +2,7 @@ from importlib import _bootstrap from .. import util from . import util as source_util +import imp import os import sys from test import support as test_support @@ -19,9 +20,13 @@ class CaseSensitivityTest(unittest.TestC assert name != name.lower() def find(self, path):
finder = _bootstrap._FileFinder(path,[](#l10.15)
_bootstrap._SourceFinderDetails(),[](#l10.16)
_bootstrap._SourcelessFinderDetails())[](#l10.17)
finder = _bootstrap.FileFinder(path,[](#l10.18)
(_bootstrap.SourceFileLoader,[](#l10.19)
_bootstrap._suffix_list(imp.PY_SOURCE),[](#l10.20)
True),[](#l10.21)
(_bootstrap._SourcelessFileLoader,[](#l10.22)
_bootstrap._suffix_list(imp.PY_COMPILED),[](#l10.23)
True))[](#l10.24) return finder.find_module(self.name)[](#l10.25)
--- a/Lib/importlib/test/source/test_file_loader.py +++ b/Lib/importlib/test/source/test_file_loader.py @@ -27,7 +27,7 @@ class SimpleTest(unittest.TestCase): # [basic] def test_module(self): with source_util.create_modules('_temp') as mapping:
loader = _bootstrap._SourceFileLoader('_temp', mapping['_temp'])[](#l11.7)
loader = _bootstrap.SourceFileLoader('_temp', mapping['_temp'])[](#l11.8) module = loader.load_module('_temp')[](#l11.9) self.assertTrue('_temp' in sys.modules)[](#l11.10) check = {'__name__': '_temp', '__file__': mapping['_temp'],[](#l11.11)
@@ -37,7 +37,7 @@ class SimpleTest(unittest.TestCase): def test_package(self): with source_util.create_modules('_pkg.init') as mapping:
loader = _bootstrap._SourceFileLoader('_pkg',[](#l11.16)
loader = _bootstrap.SourceFileLoader('_pkg',[](#l11.17) mapping['_pkg.__init__'])[](#l11.18) module = loader.load_module('_pkg')[](#l11.19) self.assertTrue('_pkg' in sys.modules)[](#l11.20)
@@ -50,7 +50,7 @@ class SimpleTest(unittest.TestCase): def test_lacking_parent(self): with source_util.create_modules('_pkg.init', '_pkg.mod')as mapping:
loader = _bootstrap._SourceFileLoader('_pkg.mod',[](#l11.25)
loader = _bootstrap.SourceFileLoader('_pkg.mod',[](#l11.26) mapping['_pkg.mod'])[](#l11.27) module = loader.load_module('_pkg.mod')[](#l11.28) self.assertTrue('_pkg.mod' in sys.modules)[](#l11.29)
@@ -65,7 +65,7 @@ class SimpleTest(unittest.TestCase): def test_module_reuse(self): with source_util.create_modules('_temp') as mapping:
loader = _bootstrap._SourceFileLoader('_temp', mapping['_temp'])[](#l11.34)
loader = _bootstrap.SourceFileLoader('_temp', mapping['_temp'])[](#l11.35) module = loader.load_module('_temp')[](#l11.36) module_id = id(module)[](#l11.37) module_dict_id = id(module.__dict__)[](#l11.38)
@@ -90,7 +90,7 @@ class SimpleTest(unittest.TestCase): setattr(orig_module, attr, value) with open(mapping[name], 'w') as file: file.write('+++ bad syntax +++')
loader = _bootstrap._SourceFileLoader('_temp', mapping['_temp'])[](#l11.43)
loader = _bootstrap.SourceFileLoader('_temp', mapping['_temp'])[](#l11.44) with self.assertRaises(SyntaxError):[](#l11.45) loader.load_module(name)[](#l11.46) for attr in attributes:[](#l11.47)
@@ -101,7 +101,7 @@ class SimpleTest(unittest.TestCase): with source_util.create_modules('_temp') as mapping: with open(mapping['_temp'], 'w') as file: file.write('=')
loader = _bootstrap._SourceFileLoader('_temp', mapping['_temp'])[](#l11.52)
loader = _bootstrap.SourceFileLoader('_temp', mapping['_temp'])[](#l11.53) with self.assertRaises(SyntaxError):[](#l11.54) loader.load_module('_temp')[](#l11.55) self.assertTrue('_temp' not in sys.modules)[](#l11.56)
@@ -114,7 +114,7 @@ class SimpleTest(unittest.TestCase): file.write("# test file for importlib") try: with util.uncache('_temp'):
loader = _bootstrap._SourceFileLoader('_temp', file_path)[](#l11.61)
loader = _bootstrap.SourceFileLoader('_temp', file_path)[](#l11.62) mod = loader.load_module('_temp')[](#l11.63) self.assertEqual(file_path, mod.__file__)[](#l11.64) self.assertEqual(imp.cache_from_source(file_path),[](#l11.65)
@@ -140,7 +140,7 @@ class SimpleTest(unittest.TestCase): if e.errno != getattr(errno, 'EOVERFLOW', None): raise self.skipTest("cannot set modification time to large integer ({})".format(e))
loader = _bootstrap._SourceFileLoader('_temp', mapping['_temp'])[](#l11.70)
loader = _bootstrap.SourceFileLoader('_temp', mapping['_temp'])[](#l11.71) mod = loader.load_module('_temp')[](#l11.72) # Sanity checks.[](#l11.73) self.assertEqual(mod.__cached__, compiled)[](#l11.74)
@@ -255,7 +255,7 @@ class BadBytecodeTest(unittest.TestCase) class SourceLoaderBadBytecodeTest(BadBytecodeTest):
@source_util.writes_bytecode_files def test_empty_file(self):
--- a/Lib/importlib/test/source/test_finder.py +++ b/Lib/importlib/test/source/test_finder.py @@ -3,6 +3,7 @@ from . import util as source_util from importlib import bootstrap import errno +import imp import os import py_compile from test.support import make_legacy_pyc @@ -35,9 +36,11 @@ class FinderTests(abc.FinderTests): """ def import(self, root, module):
finder = _bootstrap._FileFinder(root,[](#l12.15)
_bootstrap._SourceFinderDetails(),[](#l12.16)
_bootstrap._SourcelessFinderDetails())[](#l12.17)
loader_details = [(_bootstrap.SourceFileLoader,[](#l12.18)
_bootstrap._suffix_list(imp.PY_SOURCE), True),[](#l12.19)
(_bootstrap._SourcelessFileLoader,[](#l12.20)
_bootstrap._suffix_list(imp.PY_COMPILED), True)][](#l12.21)
finder = _bootstrap.FileFinder(root, *loader_details)[](#l12.22) return finder.find_module(module)[](#l12.23)
def run_test(self, test, create=None, *, compile_=None, unlink=None): @@ -135,7 +138,8 @@ class FinderTests(abc.FinderTests): def test_empty_string_for_dir(self): # The empty string from sys.path means to search in the cwd.
finder = _bootstrap._FileFinder('', _bootstrap._SourceFinderDetails())[](#l12.30)
finder = _bootstrap.FileFinder('', (_bootstrap.SourceFileLoader,[](#l12.31)
_bootstrap._suffix_list(imp.PY_SOURCE), True))[](#l12.32) with open('mod.py', 'w') as file:[](#l12.33) file.write("# test file for importlib")[](#l12.34) try:[](#l12.35)
@@ -146,7 +150,8 @@ class FinderTests(abc.FinderTests): def test_invalidate_caches(self): # invalidate_caches() should reset the mtime.
finder = _bootstrap._FileFinder('', _bootstrap._SourceFinderDetails())[](#l12.40)
finder = _bootstrap.FileFinder('', (_bootstrap.SourceFileLoader,[](#l12.41)
_bootstrap._suffix_list(imp.PY_SOURCE), True))[](#l12.42) finder._path_mtime = 42[](#l12.43) finder.invalidate_caches()[](#l12.44) self.assertEqual(finder._path_mtime, -1)[](#l12.45)
--- a/Lib/importlib/test/source/test_path_hook.py +++ b/Lib/importlib/test/source/test_path_hook.py @@ -1,6 +1,7 @@ from . import util as source_util from importlib import _bootstrap +import imp import unittest @@ -8,14 +9,18 @@ class PathHookTest(unittest.TestCase): """Test the path hook for source."""
- def path_hook(self):
return _bootstrap.FileFinder.path_hook((_bootstrap.SourceFileLoader,[](#l13.16)
_bootstrap._suffix_list(imp.PY_SOURCE), True))[](#l13.17)
+ def test_success(self): with source_util.create_modules('dummy') as mapping:
self.assertTrue(hasattr(_bootstrap._file_path_hook(mapping['.root']),[](#l13.21)
self.assertTrue(hasattr(self.path_hook()(mapping['.root']),[](#l13.22) 'find_module'))[](#l13.23)
def test_empty_string(self): # The empty string represents the cwd.
self.assertTrue(hasattr(_bootstrap._file_path_hook(''), 'find_module'))[](#l13.27)
self.assertTrue(hasattr(self.path_hook()(''), 'find_module'))[](#l13.28)
--- a/Lib/importlib/test/source/test_source_encoding.py +++ b/Lib/importlib/test/source/test_source_encoding.py @@ -35,7 +35,7 @@ class EncodingTest(unittest.TestCase): with source_util.create_modules(self.module_name) as mapping: with open(mapping[self.module_name], 'wb') as file: file.write(source)
loader = _bootstrap._SourceFileLoader(self.module_name,[](#l14.7)
loader = _bootstrap.SourceFileLoader(self.module_name,[](#l14.8) mapping[self.module_name])[](#l14.9) return loader.load_module(self.module_name)[](#l14.10)
@@ -97,7 +97,7 @@ class LineEndingTest(unittest.TestCase): with source_util.create_modules(module_name) as mapping: with open(mapping[module_name], 'wb') as file: file.write(source)
loader = _bootstrap._SourceFileLoader(module_name,[](#l14.16)
loader = _bootstrap.SourceFileLoader(module_name,[](#l14.17) mapping[module_name])[](#l14.18) return loader.load_module(module_name)[](#l14.19)
--- a/Lib/importlib/test/test_abc.py +++ b/Lib/importlib/test/test_abc.py @@ -50,7 +50,7 @@ class InspectLoader(InheritanceTests, un superclasses = [abc.Loader] subclasses = [abc.PyLoader, machinery.BuiltinImporter,
machinery.FrozenImporter][](#l15.7)
machinery.FrozenImporter, machinery.ExtensionFileLoader][](#l15.8)
class ExecutionLoader(InheritanceTests, unittest.TestCase): @@ -59,9 +59,16 @@ class ExecutionLoader(InheritanceTests, subclasses = [abc.PyLoader] +class FileLoader(InheritanceTests, unittest.TestCase): +
- superclasses = [abc.ResourceLoader, abc.ExecutionLoader]
- subclasses = [machinery.SourceFileLoader, machinery._SourcelessFileLoader]
+ + class SourceLoader(InheritanceTests, unittest.TestCase): superclasses = [abc.ResourceLoader, abc.ExecutionLoader]
class PyLoader(InheritanceTests, unittest.TestCase):
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -61,6 +61,9 @@ Core and Builtins Library ------- +- Issue #14605: Add importlib.abc.FileLoader, importlib.machinery.(FileFinder,
- Issue #13959: imp.cache_from_source()/source_from_cache() now follow os.path.join()/split() semantics for path manipulation instead of its prior, custom semantics of caring the right-most path separator forward in path
index 4b1001d92beda7856a0d2afd30bbc602a5b4f83f..bc4c0d9638e4f8f252a80b871ad40a9fa85bf97e
GIT binary patch
literal 174135
zc%1FM^UJ{k|n0+{)&8VxKvKxU4kC;0RzmtAT+8+rI~_ex(B81hmxRwSCFjn9)f0
z8?{AFtFkg9;$C;|wjEpeo4^0%fBDycRD)sKmP8Ye)osp{>$(F_h0_;kH7r;KmN;q z
saW8&HwR--I0Y{@p+P{=fX!fBwV2{O8Q<Nxqq|M<(|K{)h^HK)-~Y#d
g-y|
z{HNdk;g^5-_ka9{fA<gi(Es|s{qjHm^8ftZFJJ$=?`iJ*bCmy<r@sE!=+l(;Db3Sb
z|CsBC_pHz6&(fUgr->fg=;xk)t#0ZURdb6gMOa&nUy}icqsXg+djk1CmvKvG8}zs
z=P$X(v<AcBVInP4f^EI4;)c)!@l?`Q;9Vbkmm$4}3|%kYrj5k9=>PrT5}hJ#w%
z&}HTe&vH3~Q6mUg$KXf(Xi?YC0e2UOa0?Ym=W(6Q6?<hqdy2RySK&tnyJkptN%3 z(>kt|Ta{H?H#|?g7VA!rEi}BkYF~p~Rv!A-!#uFWXD!t??y{PEu%xR45Bkcx&LiS= zU1cV
a@0+IjL*=<&2DZb7IWM;-nY%|@&1JZ8)sW?Yk
a#^c-0U|6e=E02D2>rn( zYUXBlH~N(i(7xcXb~pO63umfN3X9nNiIh+Cfufx$d&{qyE!mL};RAj3sITf9Jlp;D zuip06@=Dor>iXa(kK|shAIu5f$qlVEh6~yd2FS}Jdjg;8@NamP7p-!x-H(CkvL3?x z%SDX|o4Dx^a*KRG4!?{CkTAA*N{h9z1dW+PeE8Kp-0E&}Sm^zepFI8Q(g*cb<
acD
z_GuibM>#TdcL%4OXxR|5I1Is>-5Wf@-lC{RVy5q?SO_v#)Dfc^O3{-b|$VTRx$u z7kp-gFK+E}^tdsbxC}jBjvk4gQ>Cu*%YmnuxW~%#+nHZnwD~))
n8J9j+f{56Vr z(+rH~d+~f}MTAS-{9@gFH{YE_{mlcqb*g&s_d1
Qc7cDYZevGvOXqw7c-p6#5AVG2
z75RAQeYp7+-EQ@;VL(
aJzj!(qz=F{PEXrZu$56P!?!s{w$S0zNj}P=6PQdux##9
zCY|Q{>%08>RfTx|JO50%jUx{+|0sY6Gax}zjKGarTlU3<m<I9znTAk<xV#q^j;Ln z^4?9&)DiP2xXJp|7Xf@7{fl1b*S;PrgRA2#<2g!WU%%ea%uG#5?<p^6oz&N3OS=>> zfx09
rZH>&Vj<k&Nn;#cIcBAPx?-zHSgU2S_jQ7FZKJc+2>)++e9;x)(;aEq?j?
z>sgw;nQs2A3_sCw?DUgnU10$8
W@fo5F6FK&{Th6m#JUZWjJfA6PAUIg>&Xlac
zRu<vd*&=aED08BNv0?u!9kpG)7)+(?R6Pe@ZA<@yVV99C{6?KcZHyZj9DFYbg*Y# z?4$e(B)r$n=4I4b(6CoH$#M{ZhG?(L;@$A*NsD{la!z?#Lc!%>9yN7!(lZbAbSV?~ z8vpPprP^#c-IrOxtuE?)$
U7%P5G5eCd-ruTcs1={o+m^xl-k3Y?S41R^hfVjIYlR
zaF+rNl5tdb0iGvko6Ist~bsT{bXie6~I#lvsam4|2U|JgY5AG4DU=Iq<WMuzxo&L zU5rW*=B%+SBrEeISj39aIC=e@pI$16Pz4nO3MU<h0TQw36iI0jBtrh+;U<7BbjEd^ zYsV-b_tiAL(fXhE5EC=vKlyOg4V!P3D(3W@!h0=$W)@G(;e^+T*l(tYa^!Y6FS~TD z=lVdI%Ivm^wT<{cPx&eu)z>u7LfloDU0FH!;-g=y^QDo0ef*
x@9t}bTctkek*5A
z26icDC8DbosZsniwTm_$VAzpOL1P#R^x;VU#nnWUn0NYZdN&Bo|2}RvKbP#Fs^ z;;YI0=u$q_U6TD<kp32#S8Z
U{UXk_g}I)#PdfUVQCXTgC3>LzwP$m(PS|pU-nJX
zF>GlLxDGFcp}Y;BW9sV?n9vsO(T4;Ev_<YII1SWL|{N$%xXR(Fr+OSfDqVO&TzsxGiRH1 z-Dz
5e<M0j)BmfX59k1vr4_et=s<{vh7gYFIkhm=!d<h1PpfzH;Guur4Vo zBWgBu7G
XSXCxw(XLe?R#v~T2o^S28Nr=r_oeE8F-T&K<(IEdG6P++Ra>9Aieb+X zO#ZSM>R-0@d9qao6Q(6aZaOA=b7<%_$2LbN1*B8RHlI!k=zAgC<dY&AkFYlC
89tl
zJao7FzSBXdj40FKRJhMq$1C>>yyQ)sz*dPVVY+1k5RDrtQtitx5|H^@<G~;XjY5E z7ry?kpEFmSKu6=3iLoA=wxiAW-pFG<R(ZLeOl)EF@+vN$HSXTOY-c-H&93
$LgkZN
zqOU8hF#D{ul5lqk#ZWavPj59NzW%$XjAL!gm{=J(&@fWFew9Wnd|<2;Hoe3O04YJ>
z0-0-qcCe^fi)hQ%^hNAzw>dlM992%>}Wkc)<0nk%B3ltyQI0j#%b3N#H_F1&3
zZB|f_9oALFEO)JIbYRh}+|ofcBc|toSN%8Iu+8<A@3qtao%?7x$R|_J)M=FORvVsSe|9su+1PER7}98Fj@h| zmcur9gR%)}xWom}M$)CM%eW-fVuTN!%EK3K5$3^=1{^!+peRhC*#Aj7FEh2f%E^0g zkB<||d-eFyz%x%y
NvdNE6<<imiW(i-LOj0<Hg1tF}(PY!{r!g9mj6CZp1e8M<pJ
z6lCz$R^L)@()8vn5n9yY?p@r#S4!wtG;iTVnw1CR*{ z%b4XluHhIZGm&R**<qB3v<<ms%qVH*LvG3Q4Vfe;PF+r^OwuTLrH>BJT;TWm@ByE! z_$2UBW6?PyE#hRA2KVUDcxL$XbyLG~HsR8K({~r-0-TNag)~t8PuRK=4zwPa*+!@d zAePK1bVGsdDU)DdDDCwZ1H4!A8816vabMpr)Mj<_XAr!
LnyI@F0I!UNhRCL?a;U
zONzA>pH|+v)wNq^g&H6zhB6-d<vJ$|C(Z;_N`s0yR)^fmES%s+)GCEWvMwQrMkQF9
zfS8!tsDm&VWK>N!dNMy?%z?4oS3M@-xy=Bq_q_f9@r1at1%2i}Mn_3ID~<NTAg} z08SmKL&}R8)mBy8jQeJ%O5$%UI&c7OqOl$|L~m+q
EeO+yE;a;JG;Ieq_SV4f5Dd&
z{hq1oyYosNkP)xunMiSi@qMVc=?>*NaLM&Y<lysaDuu@w8%ztwifImGhC|vwlcdr
zSfk61<U-=hJSE#Ji;8N;LT8-4(&R}56$SxbC(>|gOBBt>NtKs?ioUSi{%676yz;
z1BV)JMa=UuoRWU2BdRl9;9*tplv9B>q>k@iCg#rkbEBU-y(3sd{-cI6)Ch<cOj;LQ
z$7@kCd&9=Mj3t<vodjOs+P#We&uP74JlJ#A1kPnsR<${0QC^0)5AiR6@1f&GDGc
zlfOj)K=*S(WrHr2MiplC=A*$qjSvC|*)S9^c)2kpJsd!Ft&<jP*%us^_v}j*>Cdz?
zW?w1;V&u?Z%x33xe(liZ(KpOLrJ;FNUvI?7jd>i-qNY8M$El}PKkq=WhTmu^<Zr z;l9
Cs(Jzvg$p+Y>XQgMJQ1i>!wUcJ%@BH1i0B#P4)!?>ywU!p3nOEjlTK|1S
zB_-v##z{Cnt9RT%w!kKl_BnJJ6wnOhT$=sDWZsc?dQEeZ9Psf%<(GXkUs+k0}@
zi35B{D;Sa@R2$-Q_m|ijUD*FTw$EKav!!AIhU;H>H(4q?+33-8}?H1;rw>4&Dri>9XSXA_jd+PSraPZ*B zl>TmTIKfIPw?+EofgR?o7y7&d
b5%H$euNYE|n%3NuknpK&6EgFI55->RrN9r;4YG
z33PG;EQt{_l@JhyP}E(T)nPg={GCSLARKOkabV{aA*nkMy}<mliGyOPj}VQ-+wj{5
zArG|$vYB#FK9cV|U<#HW7!AM66bwHAboGfTFh6M6KEc9%hJLF;14Ok4wU}%(fxTm<
zcJHEmv+WvyK<OXqDPwP$PCa$O%HF#<JIbx+E-xx<=oZ&n
z<wdC(OFRsbRL^5^K1QpI(aPQte3(j5B>W_^AZ6Q>$$(hKD^^n6tL}G3-IY+-tjx
zZX34h@Y!w4!9D$gM7H;hUvUpa%msT_E*CAM{3J(-ik#Q5aM!r9VJzBmXZ2G;3NW7Sxi5MHs#6UQ zS
QpH=Aehh{VMxFXIW;yU^t&hU^>GXfC$|7aAr7?1yh8`RUr!=ZCA%tz3LOP@Ec>u
zf;E>-NrF-=BMht^CA*gTgu+44lYl5<IW$(3HIBeh3ZdHH$#QgN^ z2KP<z+M+?qEZL
8169(CF3bjC7fzW=|GDJ9zY$*iAWh_V1dlQn2U;(Z3<)Y^MGZs
z?rRWxM$D|y3SqcQ_!f&;!RoUSijaRgOeC?@wbxmof3;don1FGV{%!Cu^#LA)kUSI
zTV3a3%$9-bs9OmtZdp>RXF1D0(*XF(d#yXrt_8@0wY0LJvYgr!nw!fkE`E)0SIS8
zG4=^;k6or<ATfvlZIRdP$ev+ky4&j>X9SZiY%*r
VHSD#Lk$Wy$aJavIhbb3Iy#
zAX89JJVWD&m8=UK5TS;9ovilDXN@+Wlpb5OmS7J;vhr#7u?Hz#ty_H@1H;2=3o0
zAgUM0s3LwT)3AETPzBMZK@X{a2hd2QIv
s6oj@+=ThjnV^$jHm@WM);IAoBUs7
z>-n8?h51}HXKkP0aL1aJj#04*+JadC3PmnF1BO(&l#@X?kM7cTEgR=IjWlv00>i zJ2U6?j$qvR2jvR%D(ZunlZkuPXC-oErsSmn$ZA5|PX)3Mrrb)sLI^J9tAkvAI~qFh zCAQdG<F!Te4fOa&ZP0P(9}om5>mRZtJaU){02
84<JqyURie|P7+UPJe6&q4h_Q3R
zj>He5?sls_if(AQzvYLQ3PaYmqOj)FVxnklB@V;jEHj2O(J_jjYvB_3u-HY1`RJgJ
zW-#SA=U$zviIS+ZpNL+(kPWkniNzJtwowE^2y4Cxva@OwF-3NKoyz5l?sc5F{c?P
z?NQKT1k{5&Lmo12Pu#);aDsSK;B4isCkpRjbqI$_Zsw4U#V3M%0CXACWBc%<!N6N z2L%Oz+=tCnBw8U_<k-Slr2vF5x)?lQN6fK(3}Q
Z<&4hSS7TA{Hz9y!+ZRJ2fD$_
z3|PR9nOBf;XJh*g>0Y2rb%>krK&8-3VpwVC6S64ELNTgkiEk2pl8Fjcihdh0Vdb
zZ&}fsQ>-=_plSi?M6k=uNbw+sQ3U#W}d?!PgRv+zSdTfo$DgUs@M^s_H(rTRmD
zEsbXVWin8VB1d;-zVP6r#RL6rZUC9tVu$)ZHC<FtDjI|&(D&=tEVOZ>8vuDzq&rRO
z2jXhx9JdUa?Q0C-QNEfsw6Vpq6y&Q&;q@wd)Jn+(w}hvyES9X2C3svgG>1r}sXH{I
zSHZe-qkM4ND7M>Rb6gCD5iLxlS4K5eep-^MDuz_GkX<w=qnmlGZea>yhqlQ%GkOVN
zc5N$sl3CN53TRgwrC+jc0k)}t{$i*?B(SMDpeHtAw)s@zvqU<5ZTMAEJ5O|Q z(9r0SGb?Cc57x9LG=%B{7ZJ-<B9pTl_NZiU2Pt$25jCX|dopt_)oqs@4iJ!af&tHl zTAUJDo
TgLI&)F+({&TOwK74+ww{7I)GafM$K`BPY|!mT&V=C)WfR66yyMLN>Pjt zJ#e5L_rSg&)Spi~IeClJxcRJuJm1CK<a2SiSh^U4aQ1h@b@>xx73yQO$?oBr1}TtO z@UAeE(+#c)ll!I*sxXsCAzpsX@RwpYC}xSho|XlXMwgEGS#FU7P5aMY?U?7?=z+RG zcxdX
n3eC6&)qRfmE7hal-hyo)W5b@=i2)=i!5s9aOXL0Dzm#*LVd0?l?i<gB&z&
zxEF$X)n?h*X3Zls4YqBuHQI9znpC?uGFk96;$YUSX>qkE{^|sO3Gdu(aGYSdK4-X
zTe^fCr!Z|(gUY`ubLEhJAdOju>8%Bm3aM<6GUu_9#tC(=MZ^HFZa%;GC%hK?Xa
zhbp^Ml}o3jOaz0{|p^+fxI81Lqsn^)Q4}GJD$&5MxU+TSTBMwS?cusgk!+<g83aMGC!@No%GQ?SRzqIk&lm<(8bIxo)|ReNB;q^*Kx
rLH%E}=zv
z`Kx($?d5Epn@Mj z|6Hxr={*{U&w5X-V92VCglEu)1~f{lrYJXI2gxF+mXFr20s4o^O^iEm5&sAMJn3h( zt|rv~4ti*lpN#Kl0Zsw1s$PgC23XCzCXZhw#jm*V<~m{IuMzs
NJO_MBfXcQGPZ(P
zn+buF23vtcW7IITZ0JphOB5WU=^9`Zr7>=?rscHP3)Z9ab|k2QL{u$rC4rPXlV
z*x(hF%>#dr9lgW_I@nMr>EHB7t<-EpwDCMb4p(m%JC<**XV23a2l4=9<SdjHyo
zS6i?yfVqiUKLk{lTb(OO^h+0UmIU=p^RHQuODUDPXkBw$#
z*9v+vP<yynHEB@di)N5t1-&{+LBX7_TE2)C6xnq?&4S*7T%2d2WjF{PcmOC-mb^cw
z62L05+%Hcq%*n;1qWQqkF;SkV1Y(c7D%sg2_NM+Maeh#-3KtKaquIhM
SEa$${{CUdR-ODe8l9}7@^J?B zU~WcAfe|N;fk*&W-GQz^(3cOaupllPt&hiLp40?SI
VD?Ji2Nt!N<2;jE|=LIFY8 zS5}-fBKl#(VjM3L9&i;*^vG3=&!RLP2i48XpR+Y_(}Q=3Vam@I#4}fhqCR*8Tx#zs zk@#(Uy{2kE+TJ*d48oBtmX$C%+@
+9@WXx+W|-Mvdu-lHs5$A#SS9vk?Y6S7h
zuomOWi&GG4-h88@3<7$RQC0igV8jTjQERbrkP$akabloZoI6HSI1%CG&dQ17O}jP
zq-$(uq(cRP1wP-9k>m@?ihwcSwTq6f)DJdeL=y%$i2-(q
z31tdQ2zWcskUlL@N4s8Wfze0gQ&WOW+V|#KXS=F2h&Y<S;V@vmXQcd-+~bNT>z<vp
zdb*6|nw9d=wXj8lXTSl9&7W-+Gld-+-Jv52Tu;$yQ zn@YIRCSHfz8Za<tGMP(
p_GUye=cW`PrwSy+Y!0JhypVxm1FdJQ&qkVRH0-56v0cc
7&Q+PExsxRYW&AV^`LGU2)c2ZLm}ryowK5Tw7}=
z?+O)mG#KitKs1yr(7GGG+atjh=Hqo+WF(2eJ|)mxGeD0qlFIOII`sH_!#hE7)Y5
zi?e{TlZ$<28hnFHD8
z(TPE;GjNqQagpdMW%gAq9N=ac<58_F{$S|iOh$2db<`W!{KT4LDV&pc;VQ0gMAA0B
zHRqaSW8wP9@LPeCp@ekD&w+eN5Lji1a5k<VP48GVNrD218}ZVSEXF1FU^hgP1(f=s
z-C)wGi4UQBrMKhWiz*&6Cilfyi(ovEH?^p-i|}CmES<Ve#=Rql=<ay!knb3KQ9#b7_|CI&h$|kJ$Q>JEzJmv7KOiZh3+t z$DzarFV?RBjnifBZX?5I-tvKkSQ1Kb6SulZPS
GiTKQbO=vctG{th&Jo7U9UIh&2>
zUafm(<)V^{35?h1c@O|n2_yMb0Qwv6Q%Ul55aTI%rOth$=48^+?5CNsSP7IN5)78 zi$LUCd_W;CAJ$s}(%
dis?};SPZDe{(@x})mNsYKscs6CNU|Yu6T$6so8im5R(BIn
z&v}z3K{jI)-Q8}hx#q>Xf_Kv-cFyHICXnAO*tOad^eU=jaYEKsB@lXp0AW+p^=z$B5bY3FYBx=r
zZzl<_Z@qfx_DzB9!@CCblt>bgso)xKzFpF+ywh#^(WJu{WNdkSC9l>-7dMCQZi>
ze9?KX=>$#33P;Q_9j$sN6X!v(!To)qnq%&qu8+Y94R(N_+OgL0XR94(PB1zph&2 zjeS!*B2;Un63AGqVU=K8#GhCpW4E~Gf*8;&HrYdLdYwQ=na#(%&cFj$J>bdNbywZp zFMeYM;e^Lh{Tp3jo}
5unK6|evo>-^jsjxwTHcx%(U<ZT)q%J27D)bE^42(uhB#fw
z*VRf4X>K5Gm(>l*0M
-kwB_8p6G#VXCR$1RM~1r%7e)#FM7&ngOQ>c?FlGW&T
zPP5#F6
)|9q4hUYt(FnSMYb*!<B+sKZ
+H37bscUP%OJN{7zx74Sx%)gbXPEA_H
za>B-7?p?^^ku3QAk6zaGF3R#a?v;strdbP96u%GE<IR*=3Uj;{$$$}|=kCXQ<D
zL@#K9fF4?L)pkr8jt;=E;c&Zb@ZA(g2uh2yUlkEPHlX3T967_nm7CRxvcpJLD^yKf
zkQo4UExfHBs22j>qUO(R$NV5NC%w6#xkz46@DonHm|=NG>hl}
XRsB1kna4+~Y
zc-pM1hflTK8OQ;e{rFArDn!9a5QQLu$@(7`iAlj&A|tj}cjm?S(1y%D>97**QGG6W
zUngFsY9N%s2#)XNQ?eThw)Yo1Y``95<vC61OUN?dwC*Jv2b3q05UKUIMR;f
zchLdU=$;3NL6zE<6HHsSv4BSAXedd-m1aFxVH|I}@0q(Hy+qlFY;h&A1-h zD348i!}b72)At9r;WI7wy)jX6HWAVR<M3e|PaBUBF)*j9<Wk-S=tF!_Ytn6?L
yWL
zcn{?ELp%Uo^7>#0KV;w*ZLq5gyeFZ9-h|j8_y1@c!Tlxl@A(%OZMI|>Xt9Bm@Bt8 zN5l)_-A-mUg2R|XxL)-%^g}X(aAZZ^P%X9aKVTyxuei?vm$2Xs62}3}=aelIGn
dK
z_Gc^d{?K$C7mO#tO9xumDSO=+1PRP?;{;%%ep}Rcpyf$cGMY%y<I$(IJdP;oh-}t zAoP?sK2JVzqmz!*yD(58
(AO`LlShBw^h9vZ+Q&44igKZw!eLwVGg=HTs38TwClW+(UcFbiF
z7&{&QJg($2QG#xs*PH2Kuq;YhHO^m2%GZDVe(%K{=U4M2FzfDyFB|7^mM-JEa*oi
z=qGT9L6Bd-AqIN0D8%E|E5Sd_C7y<!*P$EYd7wW4ygNH<WlYG|Yqf06Epv*b<dc0B
z;7&Xgrm(@cPnwf
T=zYUTFd|Jj^28FAmI@9n1n!IttA2FpFUGd{P!6^)Ak0c$GKn
zAr_Vm%EefHza(#x8+xfbBc3Hi%K%S11AeA*+#m5+XqGCv-M5UtS<@vvjjP_r zj)@B)BK2e
71#RshNy*KG1c!^R3kwHdy
>oAkLEu=aIZ8soZeohK-+)>q!gdb{>-
zjX<|%+#cNYD`H^b^pYz@ycb8mD<V~_jLL@LlQAoD^(vYQh}PnS+x7W-6wXK38l za}^!hz{)WZzs!@2k+X{eXUag#&UreYlom;{sZ18(V$}1OMOmA%V2A@s<yJ8UVi#n6 zyknJEa9LAv&T8q@Sv*rQWH|_S)W?
tCa6Yhw_v1IE=Fn2#*XNp7YHcO^UrWB152a zvNYpxLm0(=T6-Wg8H$o(Tn)~IV5^FYcFsSyQVpgGK_GsOYY<JZK_Lg4X+Ba@Plu_F z$67)
!+Pl1a13qtRtsl|*r?(!S)VV7u2<#n>#)oovqOE_15A=+*Mz@#xn~_U^}#* zplPROb<
H=tqyTkdkSeYuB=UOLAXzIZUj9DmOs*#11&k!mdT&^CX9L3fRs03%t_^2
z9PJ}PF{&(EOFrWJ}ApQ=-u&O)oHs>i}SN^SPUy5R5h{gMvV(HtL_aKkpxW-Hw-L
zo0YZLr(W#3aT#F<(EZVh>}6%0bl&UNNwL2$nbC<EkY=Bcc?<hn*MIX!EhK=|Kh ze}z@<r0$k^iP}k%Gq<Y&Eg*<l-dT9>f+6ux0<5tyx4q2Yr=IFz&OPWKsCrmtseDbQ zN%YdyggPq91Jnr%*ytNWED^&GJ
X2pR^-EQ62W&omWXJnSiJa|#(O_(|C7jDfbW~w
zryT%A3S_qd@)25sQjS0Vk|uJYIGd^kXRVZxuE*+Ey6g(_G?d0Hy8Cmap2L#oh
z?OM^RpX|GwFT)VV0awYC6ZqDVQ}vAZst*zxUUK!Dkq%AY7fh0o$wowkab_9_DFro
z2qOe7^qUx=QD9!HJ)rT>5OxM%B5utJk7M>7g#YRMuxN(JQ}S<g1ANsPXKs6&}=e
zNdFxvJgDo);921jiL44wtLu2QgMxNOl5n6}3&X|azyxIL4CtmT2G>Ns<a;AtwNp
ze5AgJ-S=L70iWMz>Pyd)9jh;@5B}|=VHe!Rm%2f3sAEZub!=Ub(f?|B$q3{8{aTt
z=h?wYoqhY?5VQ|vPW+a7a)x-c3GRWRZa@WF0A(d47%Wo7DS<yE0w5jl7D0c zV4?QZ;4mPwoW9cOSGdk6Cyn(K2M$On2J;gTOIiOBJX0Ce1j>q+spNae+6La
5WaO
zL&&W`2TZukY)0vIiQEu(WSXS@7wQr&V!W)MK2w8U>pE5(KqA5kQh9Qk>^ucFFN=<
zo|E6QcNzy;q%3Jyih)Y+>FSh_HY-sDyWUdw?d&-
8(D+=oaa#7FdeqUSeGc3;bL zHg8L;9lX~7$R2(*6D*X@-yKDVX@ZtIo96G0O>bVh_jViH+W!#9KoUe)8o_CI-b)tM z2V%X#<O^|E#<CiW@a6{NWpaITWY2?e?2lFfu{z0)ss)N7@bpu&rOlOG{V9NWZpsiR z{lmVjM*HJgiLMpyw%chE#
rS?-ou@bGzDOy2}RwPHLLfhDir)w*w3{2Pu@^4~_7 z9wxzl*Bck=@j9wHuI@G!Wo2NqG4XD58$*)&_7XpYcQzz)
WZ2I*Wu~Qi7uo{wZum@
zz|m&p9(HPQp1>TXpJX%I5A#H3Aw3QOTD6I0r4~M!<w^TjE;9H#E{6&N3Pf4R)?1 zGaAr}>yy+THn;91DKCvmLjW6f9PR>Y<kvPE2Fx)@dSg^mY<MIF#MBl*W$esRhebc< zCk!<@3}Iek$cGM1y)Fr~m<0UK#I|q<1sBvxfG+?}<f~-WWxwwiLt&7KXJ6hY-c{Bq z&Zj5UO~EA#VEGuYy22utI3R?^Y04Q#sbB31;70J!B{qi-DF0*fA|+JM+=q^_Ii
va
z$K=!k-&-{i_zSw-6STHYqC(y%PC}Rtl%UK
HF2qW^|pC+GydHjL)4a&+S4qjSCb z<PMGOS|NIisPXmySUGbhhFwl8OZA6~l1<oPYyfa1TqP(>YLkJ87~@d6#EK5v9~<_p zARUE-DQzbu+wp>}3l
#wY5)Z}4u<&!sGaDgkN|LBW3KB9Z6FKQL#es5>RXKMRyK<
z1s7xrAR@a9Mde8^%}5g)>f9fgitirl4Wxk8pKol#qGQkK=L1Y)`
z;SX^oGG)WS$w-HNF0%zHz-=_^iU-$i(FDE1?)c>vNZDMK
fSI7LF1WdppXf+v{Zm
z%tbS(uc;>DF@^b*s}w4mOW@*BoIb+m@!I80{3!&^OW<Ld^l9EU5!!wr^0XT%?MQ8+
zp9}?gP!1q5X0mYND&1U?^(c&?6Ttv9EBv>nUG;($XhKQIwHN&FGp-)Fin$Ll@lSWN
z(QED^oqfh#R5%ece4p&ZT-I=%nBffJ@plf+S
ZKkgd6Dhd)SOyV=xIU}clJ9qu;c
zl8mHr1?vZl=v-m_Mqy$#xMi!$}YTF6EdK=S@I=Hn#Q5>Rqnytl|lW0$K!^J!JL84hf*gZ}
xR
zB!5}Qh*;LA6eh$4Gkc;iod^KB$&#rcu^kZytxY{s~swCnla4
@JFB-1DUz8JjD(I
zi5NAir4u9(fW>y!QUW?@NdzJDCprm8B-BRwbkdTDh3t2F3N-tOfmQ{QyHk*v
(1
z9U}4c;rLsRNDO_zPW%LnQHVCeadoNHIG{xfsD%i{#FxLL7EdTN(}-F+XFvptqnv<h
z%qEPfrfyStc;^;gQ4JkSUGUGSrW5KB!9-#!YAleVV!CUlBqWQF#%p8p_CEu30*0| z7R1MfqXM}Bl{f-XU&pugw7M3b-&$b~mC-yq1veS|0TnHzk$^k^@p=W2ZigQcpSX5d zq%fc@VRCy1<$VmJxG|
tqoe9u?FG5QGv#ndOV{JtC)magTU0)mfuBm?9n*$C&p
z!5u}PyO%j$iCI|p<dk(DycuWImG}MvQI!rDAE}
G_Y9Vfmh$jBDis0y%%q(GYVaI
zXFGPNis}1!8-u#PzRj@2;j!
GTC6C%U=V{o<D(H!t6RnQ<Ma<
M-9ozixQjSjf
zE#LJnPtsqB$2uIQm9Vyuvg>QIwb>tBpw9slx+Nw^#pY$<QAuo
uLM+4v&35cAM zwGH$~)}
rq>H^Q5QcC0nZ2gfuoX{!RHXgfa!PiG({oBj{>Z_Aqy)0@M|vU
UO$Hv
zNk^=sWCNq!q&l+qMasK<hve87HV$9c_De5oh$OC7m|HCtt;}C7gF?{))o263+X_1 z<BELch2-%EuE-Z&NCgNQSL7Qnqyln1pRn^n$^qpMLoejwPV!TfJTD{PFFaS8crb6| z!o_o*P|q>GFMlc#RU0@FtLC}-E<cDxe~MxrTlV!-K=(t-Uik13{tBF3pgy%8ub-tN zd|S0G0t
?RG;OMyDN4eLhcV{0FCAPWTSl<B2bO7&vegl3UACTGmoqbqJxW%2Yb1m
z99#@mtCwqjaBvA`)g6d+aCtY_$JPEi4ld)MP%qabR{)0K82T&M7C<wfy0*lU7_b(w
zXUyp$5w&-x)cCch4vo&5J>1_zm|}}&&Eq^X3cBAR?4+q-1d(hTUBl?C69|8TaNhz
zeCKcA)C$Eq1k6FmWKXQyVw@^M?#JSlC8R8i8AyzkldyP{BY1_3&eTwGO_U-xZK;
z?Nph71qepzFiB3bn_b^0rmX0VK700O-P+Yn1XVD&+EK7cl;abv={0PVVPudWE{9o
zFeXN$ebc0R;}0b<VnmV8Vvo$D&vfwXXoc0k$us38-LhK8VFFb_nt6o;C$){Ye28D zC(QV%UU<Tsx8jv2?1yG}Jfn{ak?rTm6K1bk9MZ^uJR(|s@
4#+Rayxp5g|!V9Q7m-
z>$5)iVBj9JW@2U6LDc4B;NLJ&UA<%K{xU_w00MpzJWfYAv8t+SXr1vgPaYxA-O{&z
zLV(oIwm7X<XSiL^jp)W&Pge!h#YX1KoG|S-sje5{b;KFCQ>r6?oRI^>$XG;jg
zXL8g()YAet*jxA6=VTdPI%=$yVZmCv+Y+?v-NvIo0!o0;5$nb$2V<b*ID_cJP59{ zKZ83XOyh$C0p2+!rqdP
dGwmypmH}}vo>juUJ-=2mxp)LpL5b{Q+(pEJxwUh*<a
z3H2bM(5MP#?}@M>FYFEG>n(?I5b&(2TPk|IlqsObrP9W%}=Z?VUjU3j!Fn^^r2@
zarf>kW37VCI5G|N2CdkXnur&zkKZS#}=0{J$hbwfx7#r0+JPiIXeB9tZV?e4Qtw
z=<9!mCg$luqOfe93pvyW7Q3#gonN<4Iqt`wC9^*<8_1%yshyE^mF=ca}!#
zo<g?BOKj70>fFH_2ZsqxT;?F;88dfd5PZ_zo30qdbmA__v9+$s<N=U?4LZCZjOV
zD-wp`sZSPH4vhVfN<s?^%1Q{{q)Hf??#8dmmd^N9-Gx=}vtd{a@-ZkL<)}N9M|;Z_
zG-8@%Zv7tR?loD>r{7cH$5ZW5Hk=n)v=2UuyDT_K4{q$E#T5lu<<b^*6kUJWD<btN
zqR9>#NIp2dzhz|9e^wjPyJ9nO7iRk|YNU4aVMuUb%hG3vs5(pwRkcgx4e0#4 z8f1bTu_cD#^Af={gqf=nQw!>><tOod(#7oaR+DL;Kiu=I0d1Y<PkNrq-OVH?_#%Kx z#8od61<1)Tex1e7vMa5N=kn_zR)DbNj3
g+lUzjEa!|9b5q{>2cM_e92)P|G_Ju
zL+V8}e2x32JkZEjSrQtc~{IgzOZqrZiE9qCqGtMQ62EI@Ygj?$&S_Nl+l3gSY-=(
z1Lm>LIA4h|qqUR-^s6M9=6mK?w>gypHjPc2>5#!V%V@CuA|DUQyQz{UqVCCws56 zH(3;llikUgf6F1j4csP;q{c<fFHIWiHB
bL7gadnf?p5L^=c3560Cfx*Ks%32l3
z{Cl2FuJ@DwPP&}5lCszBaxMq1XF(b+Nw#$hdin+BQ=ny0^e7#kNLc^!zJQgX=QbZ
zR_RQSDRku%Cazu@Fd0x4}VQ`!l81wXE_kiWkf6Mx|35f?+0?wRl4Y42GfJyP>7
ztcIH3v>I$@=tY2myN^BX|eK+AmikuG*nQb>C{MQgD38u^lXCLg<+a+9QptZ;R4
zlIht2fc9PIxb%x7SaT8Y35s1DJ5EX{OSV!x0c|#pjbFq9CHtfXM{GoNm(}<RLObT=
z#H;G2KFb}n%e?y5c0H$+6&<RPH=CQe=uol2);P5X!Z5w>!hy4npn@df^V!Q-6+N)
ztm^m1D5&J#4F0nt?8dB@Q6MyCSEfD3CIkptDqdk({5u#D>9uMz4OxXfm^>jh5WtaT
zqb*=OXtpS$p}Cw{;oi-^U~43+5a$&_EbGhx!e?pZC|8Pn9mT7BUe(r8!S||mLa%5q
zZ*K$KkFQh`BZnY(S2bOYsnW2B6@sn)$?6gggHFBcM&jU@l9aoo#Cg>pgJB7Ic{1v
zmAE}E1b1?hoyiz(ryEz09e{LQmcaVO-E>!k4it+7^JRw5{a_o|^EqtF&h}-ID!+
zqXp(Jz58E)o!&kNjoZ}PzC{G6dU)h4Yo{0WCw5-W7NAAlzo7g2e<#GhgP$n4zvi*
zV|QI{cvoCTEi(eNx_Ms)>n731B;;iOfT#?;er1oeHmoj?X7*<d(Ex{-Wg_e+}T<0
z@e8_)my_#@X3Fcu*5XWZ}zh~rkxuoo}8Hj7WZ0dn4V|dk6-8K>l5aAGREo2B~j${ z3Q-IeWP$VAM_RfIOmD;Xzgl2+3>t{&g&)9Ya
Vxa>l67HksV%5}Fe`hB5wKOnn^>
zSVU^%)Q8!;G||;d_;Bs%-tB!$3r+a&1}hJX8vN9TB?W-F?#zF*!1?k4is2a5OyK z)}|vfbmeez5gE}~y$3}2ukHG#;V-*u=fKqz2i?+X9g9xUg#4WhH<{bz3@$ihzubxE zP#u5<v}vnfUy|ar=ov*Hh-l7MUwakpEYw&nsavg7)_#-qAJDR3?Ci?pV$o)@vii}1 zpev1@^fZaai#1!;_
Y7Xd%@e#^FBLHQpQ13vt0131D-*K#88iL3v!?>ww+eB6%y375rxQlEnwj-CWk
zbZZ|bHDfC=B?DdX@(+#oWHNtzICkwO45v4T^JPJ(zvi7+Sn+y>SD&}mgN9-(U!Q$
zSm$jNz@w^VOV#4YQNilk_4Rr2j@bMCdph;!v4%nc4OegqXa6D!A137jPo(zaXrq<
z3adT)FTxpHilO+rrKB5+ zZ$fwQ>04lHNLBL@B(tg--GB{P$=X%ZG@U&k+=FhUE{fhpE9nHEJOU<?Nc5|>4x!7v z8G4ia;Ofe
TZzT1X}z1HP!-6o5X(Y(Q=2?9j#;H$9yAy%+iaBCy!WqBCy3o?7TQ)Q|hKexQA|QL7QrL_{Ny3E&A&U?I zd!x5nVjkl|-=2<;zxXo!cCYPu^Ra$mn4dXj9~hSgWBrbCDJqX+2#+CMY#6pgmrQ94 zWy1%XXGf*~qL^;
#Dwnpl+Aua=n$_5M5MbU95GGj$8DeVZ5GdU313
F2Q%E5WIC|
z%QJ1g3idPkAig$C4N1reYQM=wsGQElGqV$#O&ivVyH!aC|;;GXicP4d{lxgKysMb
zO|sz!W;eylzs|-QiY|9a)vH4E&!kB9wJF{3xM%r!??lULE6?JKuV5O?9fuCN33#Y
z1(gQ}><zkBJZmj?k&xj7Abrs>(EPEc7g|9N70WTAZB%UBmas-A8|d1}M4GuEGn1EM
zyRQmL^$qp>eVrPH;yeVY<@VQTar#n^ls{A=VvbevNcgbnl27#jDlue#7>KxPL;h zQ){6FDC@G_lM8oh(ovYR6YEeqeF~wa_&qxc5PEhfopfUvTNwK)+KrMRNCU;mT-;4z zK-BWSg*Osx#Myucf!@_)L?I7Sj$_tN!w{?84uO=~80$2rzRwRCdu+@)tULTe79o@z zK_nL2(b!Vgdt@|Mj%e6M3OGm8>owCf75H~xQ*nAHbxoBh>1)K2w!+O;4noJhX8wKi zfY~oN<IV^j=a2wo=fWzR{b2QzH+$p#)b)DhGS;Blwr0^WM8n4NWVHeM^E-Lyu!>43 z
AH5wcA_vR2<r}@TIY?I#Ax<TCa3N1rOfxPB0Cua?oUlFShF!MolzF+=;zd;wk4)
z5zHggUjRf!#!_ydr$1s8pPPsoQ5+e0RQ4OuR2S&y_DH)S%$U#1et>a
#p)HrGL
zzfmCtXR6U}T@G5I}jQ6cpF4pfNNfxYY?c)bQeJPuU|IBMTgArwSyhH^)@A>n36
z8iYetUYRPYZS5bMDj-(n!wuk&Y(AcnwX-MBdL7BXokus0|vGkCya2qFl{4L`K#%&
zVq}?@*&JD*Qa^G(*ky;lYYaJUjCcRK&^sV!PoaWmIptTEx(*lzLn+xCH^smKPQh
zE-Ov<jfG^dZ88jUY$18dw2lQloIn4vB#n?^obgV78RTF67d4d?kc3Pm=vWrOKyL z#6<D~puT&6j0OpWY;HG5e1m|^7rm_6f65dG=?m38pC+lxs6w(ET2SK<Ff_m15?uGN zVs0dbN+f-O+v-2eI~jp90G%0KA{I
=ad#j=ZX>6m9Q3!WrMTP0Xrw@Qn1^PlKno1#
zG17>cDs?><b^G&65)-lc4@AMiAOcq{wu&d?z93590id2HP?>X%;S
Eg=E!X(SUdvu*
zAjk44y^>yklj83({pyZg<te?}a1blNro<r<rOb+=YAe5vBN%36oF|T%fH9Zu=lI{2
zgnz<58MnkicRvW?3ig0RUT8bDbW+WU{u08#Kk8$QWg=4;Qtlpqo>;+eou zQ1POVqi5rHRmGntJiO|UHX_eRV-@2V*(lkdu$g#+l+&T={BV7ApfjB43p%VVYeAQl zNzl9+(b!irCvVW*w0Zy(+Ju7)!+T|>QXOp5HKy+mx73m6Z<{p|v||maQI}qqnrng& z-kkT5x%DOtb>JDbLkAA3M@zLVI$sdbJ$HAINNKc-KR=39Eyee>#g-XWC!H5X6==|C zi3GhlO0@iv1w6#4R?89&%ZIww2O_6eflQ9pDx9OKLAJ__A7E)w4i-N6^pFW9WTi__ z&!kF~C|lxAglx(~!ZMA<#zR_z-egGmOxx_g;<%bxWsL<@
G=DKjDj=
{U@z-ArO?
z@;B>rf^n7?4xB8!bu{A?;dlDMrb1TjK+79fWd_UTdN)C&q=WCX|O7*d>f7G)KO{l zZCyeRq)p5nmu8r^I+}Znnv61UGC*NR*E-$A+NA
LmMlzu0alaqi4&hK2g-}py1Oo zQf^+<+7n-7ZI;Kg=y-VitBilvIARTMy(X#p&TGpHsMj?}g6yF=u0Gax$MN
F(OyRQ
zjEl+#!sNgE{A0B?4p!apZ5_0LJ!Or3K!(
+i;~8+&Ep)g>9Avig7PBdIJ;RBSs;Q
zL4LIuj{dRS7l&CdXfSncorP#g}>pbT>5jx&I<7@XKk|ws&cWPP}PP$U(?G>8qYD
zs*8)4Urb%zU_*JFEFPTn_IY`(u!^;=Z@_3pd0aBLFg&5Wa$OUqE+@5u+dQjuvsAM-
zqE%4UQ2f9RGZQoif?Vis*|+{$^pkKx>Up1^-WZg;(PidxcJoKKdiDu6I?{$dYc
z)fmJ!&Oi04zF&PcgXR3oOHUQz4%G;EZgFK+Cwz*H2+;VH8QycT_E-<mN^mNlXW
zrxE&#z-@xARtRb1d{vqP&q<V8yUCE;s_DQTk5?L&C)a39*X{x#8^*%h8hRj_>s-1E
z?oZc65JwGAKo<k{apfcfW}TmbCuSMBoEav?4f}%wYaLX#E)(!5whADzJ175Eq<cp0
zhe$~abvz;^$v^>7(!#q`2-y?2x>5B}X9&JvDcGeX5i3&FmN3>OY%8e_|J_cy-T39
zufERjGme+fQoRjW_w#$1vlFZyB%H;k%w93<7CVZOt_P(7r!poK#W^J{Yj<haac zKY=juc+Jhh?J&HXh_|f!f>Rw|YI5Lrh*B>z$o_Y<dLYjnB>JCr3e+c42zH@k4?r|
zz12S9tuI220SlysY31*vuk1q{NsEi>Ty_%n4{P3VdVr@G{G!rD!ZaY$dhv=0JQF(
zueD;?i0&hwSvcOrz2&Glpw9a5L>V$z{IJ>py`nD958z9+-=xJ5attIV8Prp}djUx;
zPS<{ocVd)_o^Zyi&FhC<px8u{G!K;n-E6Ji53{AZm=zK=n4_MnBoE<kl<hq{Si
z)T0Wetz
MyXx9hvU;xkV;X?1nkAkrJOHK_p+F5$=uHm*pJJTJC}l9_<MOMe|7V7 zr(~GzoHv&L%^zoI<KX8i;(M8=rN??(l8mwf$@$xokhaJW%4AM6P63knI6Ps<!cAVA zq(1YX|LNRb0eb=#NFO;C%%r
&g8u^3UbX-4n)cRSicR}&bOXj3J}2|FaWaurFGbbj
zas<OWc6$D&X(4ZJs9@KepGfUS7ug63Hooyu|DkITh|R>@U(EB*w*|$^x
5y83hQP
z?t1J1IjGnK>zBSlFi4VmrTr8y=@3Gluwy}(ClhM)YVKADJ<sZ)6xyOD=7&!mS>-
zbLs{3b#WHMZyp23!gx}rAh+y3<Mb8C-bLzd42rXi=1jTIKOkD7<zagMXAvaKIB-p
z4Gc3JzgkXI5-wGRVa@5=XfBXx$?}H!N+N1g+Mes!h%YjFX^EPbL%EcF`n3zvwXz
z%kCp}gZD61)?p&!ct0!dK5}*&Q{eq|Cl+^jpYtAuiu%p#Cp4G0UR+s%t-7XWwrq|
z4{q6yu|2FpLqF%yOMlB^(V?nd|@W@{^IOr6djEnf_Qggw$qP(+P|kxI9D8;vq){
zqc9(@BH{SJdek4UBH_#FNnNkcL|2l)g(BgVB&Tf{h5^jR?mgxaPqC(dM}3OwIYyH z#k*v=D9=gMfS_betD|sh>-csO)(cD|{tIP^2LEaLjFOY_{0N75yx$(WGknh73Gdug zs3?z?&|p
GOdOOPz#@gbqg)KNcSJDSY)(w)F;WruaJyQO?}WpZ+#o<CIH(PKVGN
z&9;;E4a|0}5u_l$#A#pecxQ0MV-LS8TDN3-JnBm_&5zF!OTc1~c2upo^*+Rd;B$ zKjEaEGMkMM-h38LN0GETr0|(XyzN(eU42+&iT7d
Jt2R3f>v2645;cR2t!>w%2mbu
z=wCTB=$NgxC@)(@8LuHyGFB|C$7O;v_Qqq67T7n&9_A5IU@41&_E5y?FI|3Pkr5# zXKqo(?-t(QGz!PqGV$%-uo?Cz
Da&8HF}P#1T+^tztclnw68M^gQ^EKBq@;wHa7P>
z>+#ULYX$AYI}I2LEMjq6IqD89P|SGYK(5QT7r#8OSZVkw0pRNJ@%@MYNP)JG9zH
zg9QHBkf@0eNrky9hfkvVksMqMFzcG&6TGpo77s0<bcEVy!Jc8q34i
z@0?g2gj3ja_VcOt6W{@v})q{^D)f(+ZAyi!}GT5dNNFH&KM{O5ew?hKKvu9#Wj&B
zUG2g+!^Gq<nCpB7tI#lLUSsa^!&IX&!riOdX6DxiIjkmVaJe3}ctTM{;3c&<LJ{k*
zBkOoP9i|HE?&t-)=;8E5LD0*%C(Kp3)wO?9?XZABi%l+afYhDf+K5C*^z!
oCL
zIkHMLOkR>OlTmTB9>eh<#bN51{T1)E{J63k81S9Md!sr>WddSkfG;vNRA#jvDCT5D
z<&GJgsaSC!y68P_VsYIx0Y(YEvZQRX1>S6B}JeNDpynl!Tws)#N?z0@Bz!56M302 zCARMS&WNs^
Z_0|okRvPZLHpk;BbE0CBvTZ=ylZ9dgdxS|duDaF{cAz8&31cUq3j
z{wRp$=a(ON@M5TF1TV%C=}je>PO7q$+3^N+0Bp<L9(+(wA*Uke0t?Nf>FgS2)OCi zVYGvz{CknBA6NQWB>;r8apGEb{_iF|E~lz-7tCCQ^p&~T2WM;nBQJunaAwOc%m^$o zbA{kk3{}n$TMD0;bs>F9S$^lZrhBb7Z%bbZOCvxkn#n-Hf(@GRl@1wZm{!O6D3uH3 z4(fSt6Y9zZO{xAPk$$Dv!(Cc{mxC)9HI=TmKx{kPsPKBpZsFhM!rfE@yUQ_@BLnh4 za%+H5OrTsqKn>*Jlyp5>CK$HNJ;>HuR$W-l%%PcFIH|}WRYD~R17QN4m<Wh|=*ELI zg?{Aiiu78?ttu)ILxEtkyEM(;E05Mh1ZN4$V3mhe;&-n~L^4}4q<Hb0r@qO-#u!wH z_aN2p*gD~8>85V99g
nUU1n28ZXjBX2%k?-d0{RR816VT1v1GJAh&&rF87mxF>)n
zK^T)}*=qtMDNC7$}FLhbj2Z8=E{uV#<O=3@0HU%mmpAO!HD|-#uB>z)v}Q8PM(5
znA>kMM*?9_?{4OxZ7S>|AIk=u-)T6pasxo|U(<!}ikR%G95-0din#6S?j%_FDuRWg
zKCc?nxzvEqI=h_%KF=EKxlHuSS|dLtZMWMH)Fy=FMpyjNX49Bp2Af;
gFivh4+PY
zu%Hg<ha-S2pxKHfIh{*6Z?tYMe?Y&2+FVpt%e6AtR3xF!XrVdly-{v8(LA#bZ8Cq zXhqlYTaLl{dLNYNA3+h92uhF&R997w+EJpb$t{vYU8V;p1bT(}4a&w_)JSw9reoqr zCh)~p*&NpNr$5E7!-~}qHKMkmhW
LH5;E!py70$TlYn_J2D&Vu&J6eo76>ff(>MG@
zPRb_ALLcU7B3cy83%ESf6E>n1EWFmpnEY39dVMh7UICeY)WO>f_Adb#>EU)mhq19
zaiHRGtbT)JVKsQhPFLaYJ9Xl=+>jF13v-EOBm~o)aM@|3<yR-weu4$I*|<t?Rvl zX8Y$R)C~o~yC
BM2s75h|2-jnlaI2jgNxLMFD{BVwK9=>1-1;RgJHvwZs)$ z%Fo0_Ee@!n=u0j#ev=LZsEFQhPGGW=R$d>MTTz+;nadJOS)+9l*kFe6G
-EyS9f8V
z0!+qWFZ%FeDhZQdWd%mT{{kWG-3R^C<%aMzmG6-d};CD^B;0do33EgC>CzKIYM
z(iWR5^em2@iolk;d2rtETr$al$nH@(IWF=Yrxylc-A@;7<NaA;)9oUeP1ZIOii;-Y
zoJLS
zY8E3D@-O83gJa|=3shtf{$pb))orYY6c3TDMQ4LDsg#k7tZiA7^dD92a>d
PB8;hIdDxG2{(fcbWDe_2!#y^GrsH*yA64=0fQ z
0!?N!0%q-3PIpN=g9fDc08(4K-$m0oa{LrLdp2JL2gT}joBoDR<^d;G}4vQN2N>N<FY!AO5#AYGs5dJz6xT8F*ICN ze1$k4A}ZT#zs|i+9sc;~r3)<r_n_<kXfk<|ZKSW#>Am8z<h8}s2OWJx0xwMdAku0u z*m@Wcz_lS)a!5ZxzQQENH^>)Q6dxg9x0bW;p;RB{>b>KQ#;g8eMp}uWGC24P+)Olw zSGd{VHlW^?#rg}J@N~5CR;-a#Jgq=!D<_n-2#{LL9|@j6A;V1aUJz(YCeud6&R;&o zED>y$Bu}hG;CM+pg&gJ1%k&J>!8><57%jSa$L}Q2xRZpEiRU<_;5A;GB>0oYQJcE% z$x;lt_Cy6_DW_h!4=~@%)g-vR2MdCvl+Vi7595IBsL<8GG1z6LFy|<jNpg3>F>m8; zh_K59D4+-j2T&s_iafxXYD&(PTl$2MTN=xrSB<>7Cv{+!j{HiqMKw=O;4vR|6Medg z$d&vcfo(7!n*uk=eiMbtLJVN(kFUTSW>ldeCD~l9?$!k#zu(PB&inxXj0+HtL#yu% z7v9EbB}v>
xGhts<YPtv1TM<fLxNYYthv-=i_R%Ej<snRbqe#FvR)9;@Au{rfHKZ
zzVx)g()<-Nj0c+dC5c!9l?Gu+^O69QHQ7bfyzQvp(i63V31CDTl59sbJBvE<6H1cQ
z#!)w}$_b)UjSH#=YLs-dfRD!-<o>*l7Fl3r&CX$8jgaAW1GNphk_wWo1MY@L}^5v z
Vqwhw;;hU8jA*B73%+QrFpHp-UzeEjK~-n8J~*T0c|29*LB&mqE2u0n(_uZ$
xM
z!r-OfPu4Qf*(1W1q&f;sMs2twvC7+VsiuI?B_H34-7gvRE!LV=+!<+fJ#Yhs=Z{k za
DFtgIMK!^8gM$SlkUY1lx(FH6c8uaxmeS!G6s*~Iks5iFyU>@N_kxe4fKK&*Gn z5G=7L#&zG=riJg7Tvsex%^{fOH_o6^YOSPt<mvcKXy)^CV}S!G_J+cZmhu)4quqGn z
(-LL0^u9kQLqm->-^YygFbI%X`{9or!rD(x=nLbkV!uy{mk^Z<67v(<L3TnP
zlrt+$#pEQKMqBdYkQ8GjC*{8lDjWjBmX=;|pD``I&jQML~XZG2<rmSm?=EjG?cR z*0i{N4!A}$M3G~_8D#N0z}XPoYrxrb^8@a3dWStOsgZ0=QaxBRe+hB*s???noCrje z*@3Z$BF=2DntF1wSaOnnK8IL3XfZWKd{UKcBB;PMqbz9XpRukPm~x+7lu|^RKa-22 z6m_ILYlVMXm^qol^$vSqmZspYr<+I^4Xv$L!iY7Ecf+I;&}e2av*GQ^w62+fS4Q3o zT{8o(OweJafG
^#qpCm2h8O8K&W1Ntzjd|8ii%Zl!jSPR+S&(ilM+;D_QopJSX+6P
z6V5&H&X4J%?0TvGjgLx^goII^ifsG^|
EVqEWtKQdZc4IEW1473eR#>cKm8VVGmG
zwlt>I&x2K6X!r=aB8i^0csyoCg6hszE_Nms|rt?-qB8uBvLr_+a0jr;1v2?ke$A
zCGj>1{t>yaoVSTRRsyh=g7OSnixwdiD0b9;-T-w(|?#(MpO&pAbRW>uTF$ZG+I z80>@dRLVrV6&xap=?8w0HlrP(xLWE8S)jmQ<#Mt%p^ihmQsF<ftu1T;(7IO0)1lkR zepjAW+4+{HxK5!B>Iz*oN!gkYcIEraYoh2zSK=i
jZG#n-}K2%&AGJDENFC1^W8Rl
zLDF}9o-ZDoN;50x?G^y3u1a&edQjxGcqsPU7x3v+m-WH<@b{s5@2<fscpenY)EZ* zN4qXuJ>V{?u1<nZIGN3$wM6%iae+$$Wku($XKG>9*&nlxPxQ9wv*Xjx;QD$uWOR?} zcguVAX1qGc^^V7RJ8!6r8ib)t8AG~eTlGWi1lk>;*mq?4?y|k2wkt~)
y?XhU}Mbs
zp0fNs|Mi!my<I^>vgxMEtfK5{9P9I)#AKXm4#dJ(h;rTX4sec%43se8sf7ZJy8{
zAUOV9ujZl1s)2
ShllJ1Qr+CJ@hN6yW~>NU+&+s?o$ZwRxeziS!><x6&rC{!)We
zneFD4kUBF@LLAMycFdjOikx!zU-Tmb7;uR-PUbZ)hVeLRS23t8)7a%C|(72jt-
z<$dZc&?M)m1Vi!D0zot-7cT3_ok<!A$u=Sh5?R)#@f_l*-A)pP^qQ!TUgRga9Cm3w
zQC;Cr9F(r=2BK3R1uw
beDIJSP^Ez1Y3u2#Ew;o-q7)Hf=KGErXt-8niF;uhy zyrOZ=!4yQsI;a|aNKv
V+g}8^>5aA5p($VNppt<l-LBRuOQPN@7-;LrVPwXez0VW zkJRg0PATQM#9$|^ShEJ2C
F5kU+Zz8XmB4UCj=jz7bsp-<WM?lRPI6E~(CYG9XG z2Gx!T*%T{-x*fHDi1UIci+(?=yGp8R?Wc1?r7
&6nqH#D=Ys<y;4{dbO6g-B8!MO=
z4%Z>fco#9QKOY{-fO)u!Sg`n=6ptJK1B-#@JvnsYP}dsxKHhQw$wE)U+7s<WU%o
z5xi;KUh^fV0m@uCR&EozK2D7MObF!UW<!K$BI@@4vq@)$>@m!9a4@>ZBieyLi)3 z!4zzX-5ag|O+S1{6U_h2LJCpTljgUiZp|GZ)cz7NdG_A4rU4^X-ahD>2JY6
?zw6V
z78IVwcW%rDXDPsJ{&x2(;>E-7&?x9RJ{iS9w3}!J;}V&R(Xdd&C>FL!kONmrDA)fK
ztK;zDLuyzEjrRkahqDuX@6EX<sTNuvawZ1Whe8KZyHl+XR=KNM-9l}1h_c-#<6NOO
zsi-F?8^du%6E|u)sPCKFESic^7iaS}O9lESfZXVLS1yh-;xnsc3xM<H%Nu*gmf+8K
zHbK&cla|DHg7pl(r#^7?=S-1L{1!eow=^9|o_=sBO5LuZfSS1q5QW+dkFF@$eWBo&
zaRC^n9kEsYj>TFn^BDyjO-PZ3&x8sYJ%DFLsmC
StHc!FUSKUNGxPEeNj0OF#}(;
zTQ(Eu;e_ERia|A(ILRTz)r7Cm{*dJ1+qu2e?0a+M!O&U!DRy(yJu|V!R`?!Cdpy
zPzw7EfVi9g5(w^KSz5&=<;*%z&ajuh?DTsDV^@9(6Bu68D4bysbRiEv_4FncR;;EE
zQ(@V^7R6Ci8e%@2b|4XRce!rvfOS!tgL>b5ij$LS06dB%(TzFI!8cBq2)lmkOvhF zQEqM=@?Ze{pH<vCgttRmU|BJpJqaf@mFo&QUsK
Q<+tUSIB;J2EYH5e)t^EX!uuNQ
z4*87QZ-yw?XoR{jtIMeEmaS8bu#*pK%GQbKvH7nMupm{GWZ>PjSIMxQCE-;dGn4ho
zs~hK7h9{xCcP{aZ+fF3gt5o(&N$-f(fj=ovX@WJ
|dZ3UMz2S==q&`+J}yO>cs
zjnD@BRjizx+&w_q0YRb+tcx9IMnzD!6&|P-U4atF@Z-L6mQX-&5tb@cwMUA<(n
z7;2Z6n5$O)K?5G%tQI=OJhT^-HEE@6MEB|T%Qgq4+hKbu$zcYG0KZ;76kYk&}4@X zh1FduMnD%8!<0(gODVN%(Q<h-i7p|FHdFAukg0mgdprHq3thpktYp2bAOk)nOrX{{ z+l1xi$G
gY$@-TNhSKcscclQL4V?0Foo9o{Skw-ou;bKlz#Y^Qe1z7xD|JOD9>L%
zZlhKS*<4UOP}U(R#VJ=$G8O7@K-URn#j?8rhKg-V#L|2F|Gx3vvPyBlb*+2SQqOJ
z6Ckjz
+9MW&IDs%N8p!uWe$=7o}+UxvcXE@gH*IZ#v$<?dO2+(Mv9k$^&w0}TA@
z|9g=Y>Yu|LSklNVpvHA2oR0>!WuFqvAa}Ivb3?jKPLjpq~L4G0N0WA
)XV^o|&de
zt0L^6@$Jm}4TRBOJ=rbP``DFtqKWIRz?h9BvLFS+q#{2|cb=I}TmmDcsLjOCd$l
z>UTRvaxWH?WTJ$77ST7KR=DbvuZXwVoJ;=W+7o?%Vqmba_PEOjv#ntE?_3QjXq zOi|sRH)z4nGa}3gR_T?Uf
AomIY@fV1VDH>8$4B&DRA#Zpb_g69~SZIbdClvGz44 z2J1RgfYH07DuaDGs<>@0jw-lsUK~~HP#PUoc=G*G6^j9ydN
{5%8b1~997})-$1iK
zLX6O?&QVpyZa4c#ouew4D>yRCkSE!N{O7Xkzm=iwyVnnNA-VgkE=eYFLg6k7zo0{
z_Oil4RPN;=4o_gM&W&dV$2MUINIYS?F^qFJ@3G}mHI;={aqf(^6LJ20VTr20&yLr5
z0#ZW&H73NS^Mpz7yX{T+s=xqJkT?kXqLst6$+9mk&MmXt3UGaJ@rXR!@>lkaP4!<=bPCFS3nq@oJuG+n
zAPVELNq>OfHf=envC0{HJ9a0&sNmr+S=% z^!
V$a*tC0=KX|wM`aHqN|n}7Iklcj4@E41p2R@tWY0a=BGa!eqDA$b9FE@S)500qVXgE5}OhaEu^
z!L^6PqRj#Xe41D^9$Pv#Zy2HJaJHTGxJy3azTW9e(fL;-h@>nCoj}7qj5+x(>kOM
z<+7*?xUfOEJn4b*u^pEBtDeW!OIFuXLvTwfJXcn3Pm^K<9PhxS(d3{py-;v9SK?Z@
z5?7F$q;b?H%t5kzcEzXlsyq&Ns1P)UJ5=J=L?gzhIn=v}dN2XgJd}gl<vSenvfIJx
z<$H{wnAV7_su5ts5nUO;Z{^0f<QkXEJB8l#I@vlGtL2mfw0)At6Z6%Bv(fVV%y$yli z;
kB9(Dr>IGBPNY)o6ip}#3I`70umX?&?Y@9n}?6@x^ju4_trAR)%pd@C@^p zbX&m92XB!vz^rdKY&u5AB&!Gx2^jby$ANz)d|vMCB+*eW-Yl<B&<mrYb#HQis)FZv z^J*j}g>;2W$O~-dQM#jjV?r+nKRD;bPgz&^yy6uW{R@wYtZ;i
s-!i?rh8&aOEjR|
z-1AmgZcV7CDQ9|gk8a43K|^!LR)f97V4BP&YBmJ|G73JkpY$LMB5YW*hkUYYzKNB zf_bZOX3ZdQ3OK)kT5
6o-^#U&YaUAT3s<vz0_bSLA$DZ*u;fFtu*Hx;ns&b5D|50 zVZUVJ9Kf4!sHNR_{5*L2%Iiv0$P{4)WZ
t+@BVdoupKHinT^M)!dDa;-eBZ<1
zUhL3tWx0OdH*+Qn!c$N#;+O-
s!N1L7$BUEbpq>eFEd_zZjd&LSelzX&xe<=Q>du
z>l+lIACQd^7t#9Cp|=|8Gibr5U&%;beT}j-^-)G0Sr<b^qCmSWZ^Jb+^MsUXDL1Q zeclJ9dEYV?8IuYFaX!Fx
jM#bWnK-1Jflk%nsl-53Ax6fwN#M}>_a25VU68TJ}
O
zBy6GtW3);x%{^x4F*+Ugj7wOYzHuVjp4okZp{Jd!5%Me(zWF<+>XUlaJ}9%?e7H
zjnoD47T}%yY1_?V7H<)M&_34rUhvt%gu>Ok|olXPMEYB=_juQ{uuhiSFB37=^0u
zX{$?3U05nIl{LWnn7~%$iK?Q{1Wt(e|FJAQ;DBHbIfMMk?s0Ye1%yrLoyAB~3%q zr~PevJA^+pDG6=3{xX5#z=08ZK^{#KU&{U@W4~$$2sRx=5KyieyaiTkH3UjL7Z@gx zBf*vcTXj50j*F1zB{Gb{PfXYe8#7?_Nqor4fn>Z6Y$NG)4
l1Kbl(RH8+GYMrcC5
zgcy{>tEHB!2_Mx%Hdh{d3uxZ(F$hElRv9%*CniI8>7J+QY3AgUee<%feEFqw=D_KAAG@LKE%+p)49S$VR4# z7eW8SVJs>
URMB$Hqs?@cO;+OCi9d9sSy%nJ4GcM9oBtXE^TaeAUW(U>zzpkUK
z0d!dHfD%%ARnM-MU0azls{&yqr+bo_cNt^@(czmFO)5Io?JN^1_C5v2t2vedUQhs z+L?ABPT!^gfftbpYRlI6ou6L}WDsFMOFd8Ew#
v%{Sbrdn2}X}lwaysAx+gR*Rwy zRLzi(gXd@iIs>j2%+LopvY}ON=YUJL!<7Ps^m}PYXd#jLsO0KQ4
ag%Uykn^s<e1
zd*MIEDZcU_n;NAr5ec-Zz*%AptC1CK&;qIS!zwos7+f5D>;yTms(%)&v3^#6TFGA z%707B)z>puxq#we^s(Uj8M|0=4Y
Y|ZuO0SC81jaVFdw zbvDi#NrN@N_X#Z_OSyuQMEzhFcF1x>lAP_qJvt^
jk9t1xQwhd;Alu}%#7}-O*{G(
zT@wBY8!dRT^6|^criD$Ol?<FIwwjYBZ#(0;9|zGckU+TWlhx%n!&Z-|3l`U>{
z!DHZ5)L{u;kfU0C!JzxZ+>gzvGp2pdw&gRGbQ~j#0fTbmU|x*-5_Otgxqheane
z8{yEUR>W#o&|lIy0bkQ33swY0%SZ}|f{35>AWrvZBS+>8C25F?w%Um+)kM1x?gV
zl38x(bh!dIU=?h$2h-odVuBfIgviZ+fB4vuwM+a2jH1v9%!6+uJk#B<Qi3KdL1K
zS_!OGr#jD$&0yWZwcP*JBBjzs1lNz0kujx+Pg
z58?%91@%TAI%l-Lhz^Y$IPI(N=>^Pev3@!hmLIIO%wq1!+1PC?D44xr9nhazY^Sq0
zfoLUXfia!#_9ET7^m$-b)^{2vLJ+Qm%F-(1!k1>LvJb72!F5APS)FFG#!=qGIN
ztLH(ulii+iGIO887LlEMNOkJRqX0&3?H<4NDy#3(8twVRH+
F?@fd0^}JLa`Dv+v
zuUV^seu{K7fqO)o%<34KA)W;|%Boo*0@cj&b7|fZl#Cu?Q+qv(J<gHf3FC9xyS+B%
zy+MHvih4&L5?H!{B!wf1;*^xhTbZcJd$DKxTl5El{uu%Hp^&u5|Yh=K^o#|^1W@c*g7Q!jTvoR
bFs06d{S-QLrOpOx
zos&p0CpDQXO-tdUDiWkdOl6VZq!KlL>@WzfLZ0>CM$L>jUBnp?jvO%gJh+{CK}cH
zv0LvMO|kDt9)+3khK!45v<9Je8d!tlgBu>3@y#OEaCuQ?!rv-Zx(^o{0zUg#R6LN zgU8n=I6dS{bt_;W8Yq!tX(b{!k1{KBwVuveXkj_JT|SAIUK*y?=g~ECTB-0*WrGTA z2%=WM^A~}*BzFsLumf_n2E$FxId%y|4Yi&;454*5i_p8(FkrPqX&gAh!DeGqVDWuz zzru
|ZxCdgV?S;^{tl5_ujCC3Wz}Cf1@|N1QQdOiQ56M;qy(gSFt3q@I9Gv^mOYS
zbcUu+ya}lC=G0DC&Oyju?K%1dT?(fuXEsi{mQ!Qu*kPi10NQ?&124KKpbWdmC!|5
zk}EwDh5B+aar8(F#$ziaz8Q;D$nDxvHOM8XgJ|5dV2IDHy<VNf56Qx)!J<h=9=X z72qt17_wi&UITK}9<iqjDnw98jae)vr}s;M0sC3hVt2CU)pu5??bh;^?D#3*?6qe% z&$W@ur@WIt{yJNQT)zJMb*A(G(R(qA#?rk!
(5E!$}-i(ov*^69>wGQ{$g^JyLtq z9vbf={EkgC-y9DW-N8avKf~cYIC)(VJ2!S5s5Cf^xYls8xw=Ra1(6|6R1chP^hlx& zgc+0FE3z>;S7tBTq<UxZ?pO
4VPrtX$Hmo|nmzZ4V=P<NiNE)r;}FPW5ao!AWc zVGVyhIV?K?w?+5D2>CV4Jc9RuaXeN&MNvUGz2gy{<ti@%9q3&RQ($9*A$fzw1XhiC zt7EIxSZ3bpWM{zpUZ9B1;6c3M1<x|H@<WWA=dBy
JlMK(aLC^dK4%Eu?+#Nq?7r
zZJPAU5a3ctzTy#N-+Nr7zrcw-T)(jJ%0p@+!j{ee_WR4-hB@%rM1k^@?_r+y11
zu|b}n&e9y;H4M>5k%ytulRZaE$}%mG;T}r$lae1n-Tx+aWGhb4_IxQOvXUl0|e$HvNm) z+D|Zt1Po%7&Tg3QpNMm
cbiJv&(%aZ?7VKq6vYtZij69E^M$ZAfcH43CLoFn(nts!
z#H#fkrg#w!X=opJlL*sQn8^9+eQ|wdZBgaf2G-{F0oje@GyAeUs;8Pb zTggQrY=bYl+<{;_N@Ps4c8bFO#FTCGre2tN#OvJXi0@n95G||aU%lWyUJ_t?Gp-Ks zFcHfi=I8(q1LNW~4>OUU%*Wl~O{{k13!5=|*syd
bz1rg{Xehi3+lGGN{4oAUoEL$
zhgBd%vAU-mWZH{U9{Jo3?(te+xEA;^@46*opQ2=l+;Tft3>I#+JY?(N(_gPak&92 z2ya;zS^b-p6sAql#dxRoN3sh*N+3Iowsq?jcsGddwxB1I1sEqr%A9T@g@vX@Hc+MR z&g1H&D(r!*CL1r<_K>6!bDq!z2_b<x)Z+^fBk*0m080C7zQ7BIN-a~R@$IF1Haua* zMIoL5Dsu-xI}bfuAMykql8{&Zss%Rx+b}C
gs%x%P_rzHrhlIXU1-RtKIYXUWmD>
zmpz){qvOmPiEk!sC_cM;W><tATV#x{jMd})uG;hbwS3O=buIeH{Jvf?1a%IlLpFz ztm
MbORp9aIZcS4QZ1&<WGk|phM$M(|H(8i}F-%zjJyaYxxAf&X6NG+ZaX3c?5w@ zWudU5b#DDSC$I}<y!72w%Lbg2zk>T{jXT84_HxEZW+i}BG<FrFnize%JWMtKn)@KO zq;xbe3096%0$E;vyG^7Vk4hsbAfT9_$MP*68dsmw%vsWSIA+l(&>G12a@GTga@8vK zOM)@aIQ#t4w%g_64kXUJSDa!tg$ZWEbm0<q%7fhQ
j^)t6K1GvlLnY+8D)
nwOv!
zfZ?py;q{7o{MtB7)9;{&MdyC_APL8oLhYCIunAn?>C$C4Iv=isI@^@>nyL-4%n;G
z0dzY6wLS_olf%h^LojT$2_qKJ(J0cr$8M)mNr14GnsBpA{eeNZfE1d(y;{-nVU2e zAd&o$vxbOkQ<5;0aVrI_l;2YsFe4}I4dhzA%LpM5F5F%{)DuXi
JHG8wDi@|997q zb4kCGo<6ZOU5O)!UZB=W;jn}A&}-eb(hd=J
ODrs=xs!QmL-mlmm$oboUd3J@0( zhINV|=4w9llU3E$aS2TK8DPidP=fB6lP|fZZppFy
rzv{)eOx1{h1NKuiuZ|JC0O=
z{zhq##(xytx8+Olh!$fb06Ut#SzcI}O?Bki&aMs4QAlux49qS6X@>1t1D^kgYjwk
z@%Cpj1XMQW^%+^_4gKNO{STbCy7>7bu39HXc<Ypz*uwYep+)y;jH%JjneW1$4vN+
zAtT;hF4|zC$Mts(4Z*zwfL%)5%l=1l{HPGm9N3FV%z5ap#D%hIMMPIFMPoXeyHw#H
O3=Li(=#uh-G{^VFJhTmD87uP}5WTLmz&NV)b
z3n6tTn-^DQk&I3F=Rvt{c}I zmwMsx-7
+ZT%6Y1zIj$%FSvt;|F{%D0EhI#A
BiGDNOXkW9$<l-fjVRg%eSDY8tn
zuv7pH@Risg;tqPLDYWWj*+}eKt1JkjtI0WndCUk|Kw(o#FZy6HvxXmn1A)TSO+y
zSdJ#ew0d`aCKxkAwa}%t4cL@VbzU03_{1A!Od)Dpp4*NEbQvJavoxNc?riF$ev89
zdd<=;uCQjB5c}fHofZgxGB_L2B-#o-r}s}2am=O7G|(?Wt^UMHSsbVQ|P>juV$mo+G+_j+Mf1l3xq$^N)$!0z%^+yM908H
zoW0n33xvo6lh~+g-FqBdO_RVH{x#R@GnOYXZgrbWX8s74)vQ0kC+>b)FHQ2{ z%BH|mvRcEn84Nox8ikS
EJsvRv^$574?km? zvKrauJ;eCk^
j*4fxSJG>Qj9qw&c2YJ3dD#oqQITXi$)E5r-bd!PQK`#u<=OKG
zK}9}+-ik^&&89X5oT0;}c}sbFQzu_-Y}Qip2*vVcU63olS3QO%%{tJ|#p@8*#oBT>
z15itSqg);D()#fJDK)mq9_Mcr6{h|T;F6?1i#@6T<5<4yLrb~ntP=VQ{!Km)k*WB
z>;qN+ORuYFiL$D*TNSN>Z*@eYptZ_(5=HH*fd?dz@*7u8%j1Q;@ny(nP<3Al6mBy7
zn<jhFE-dSU+rUb+QG{Kg0jpehMqjF=ojB*-c{pVx#pc2a`cf3pmpULuHL?(2EvRJ
zUTe%$GV8Wr|iAHVS1&Li>W_6sQwfdhSPN~bjVef^x)R0EMz!=WZW0*+u-Nx&J#Po zXiZPErVN}lhhZ*T_(e!N+z<g3DzQBOO<@u=BG_pj(S;+*!#NKbj*JAy^~A_v9@;yx z)JoTN29~aAahdC7u1)_CiPe{Yy3E8W<lV?*x$L$|83VVdD@NibjK153G!1o~xVSzj zEHos3V879Z@iFki;6$Zn(_jGfKj}wc6Ako_Ry<}aa1X?0Zf3E4g081#QqMvXXsGpa zw>8>0BA~7ddiVxNVsh)hY0Hdq?eLRLC|7E*r~8i7UeVoOOsu?XyetQ+cxnXR)-gCT z7ci)_)XKXSf^>6@y}B}oS(v_EA=?Qq@5V>dad<
Gn<2pg2I%ljNm(8y{j0n0iHKi
zrzKEHX+-r>Age_1DMzBktdajoPC}hlHXtMLZ!oPln0rfu$G?06F8%$UUfI3YD) zF@sv|225gPLb0KB{9v%VMzc4jDcENoJC~#C0CfA@04Dg+!Jo-&M+|X;jBDK^3o}%R zg2DUBiXL#2kyj_VSL}V^96QG26_a22*-~MBQTuRV3$g^7)rW6M_+QCztgU5Czo-@~ zzggN42~{7v*s?T{!gdXWCPoXP7~))U|Hc*suMyML;e7B}bJEaA2mBX<4Aeok0!VEH z(3st%s&i#1L@uyu8rAj$yXNxeOz}pi=cw3iRhpVfpFFr5Q&wE{Zqm4{S6CzZRYgsU zxu2f3@dHN>)#zD4HTBt9{au@v)P50pGQ)s0cfIUYrL}7c)y$11&uV6E_Nti|M!OcZ zp2x9hSF{3GQBRHGRn=1TIPNoPiKG05Ry!3A$%1)f?xL6<1}1j_U>m|=ax0VNSn3#X zVq-Iz4Fau=6x3Fo_Qj(am}ivL)=Xf4PT_FW$br2}1_p8BuWy@+=V>qoXJQMW^%Y3t zyz;Cw8pnG*9ARa_4E6fL@WzimOMN=fL(Qh+@2r6Y1uXm_SmiYl)C#}y0&=<FnNf5& z1@ok{<408OND%NS=
LyF;{1F!N<2RkRtp$lXXnc-8O4(k>f0TqWk3fftRWeMS_ElS
zltZFI0jY~Jd!bsYKP
G%Y5Qn(4I}Fdv}vx{IWGip>gJjMl2h>D{;)CeuO7ldPa>%
z6r@M{63z%3z?s|G&Zps%BQ)}6)1gIT2UF3Qzit2Wmxiw$X~IjGaB>LUQ#a76&H
z-$tXUW!yL7<1l352p=WD{rSw@fidpASPJ1jo1D(t1Xq<cIpuC$BC@5il;PE}-q@&&
zDye{uoFP}TdhSV-%zf%g_z&ZdhR!YZYoS8gac)I+kIEu2u*}BC_VKSE5UDA;8g7yA
zb>T9Da=InbBIB{?V6&uF>72<@QB$UTnV-7(p^L2+F=XDIo{)=%!AZ36hMJ87_iT%b
zz{T5=}N@P$vzNskreCE;v_nPMlqHMych6v!ZyJiP|Y3^986G+dKl;lngQP)t+B70
zecVFFGmYg%IW>iVs7JUMsfNt%c)>JvkSYzJeaAkV-3?S1)Vrr-^z0Q&V(n4l3GIoR
zHN{g2W=(yG=1{BZiXx++&E3Uw%GLwSCk*Nzp_}^^8<
hsdGw*)77IOq(Y?i-}bf
zrcGL|{9tGkNzs?SCO!->F}({uWdyNCTUqFyS+_>VkZDtsJ&b3Xeej|(pe<KkJtw0%
zT8%D9GJ)zK4?#c_bJSDoqE)Gi@450O8ixf0jYVnLE)fJw3%RT0)D!9liaRzmDRc_f
z0Ay{SOiKxXGg|jU2_BIE5nUe-+suBd8$PSfHIf_&K}=!<un#a*SIR{eE6+B@ZgI8 z?ASQ6>Z>-r(cA5}RP}K($==gNAMTo~^fe(-M;35_d~wr-xhY3}8qs37KKL#%r1SgN zky+NqtgC_Xn@h<+7t%|~G+8e$!}5ef|Io~u!Odmvs;?^8P@(b{m#rp(^WJsM=Lxgp zSxpDh*37M4iRZbdd1ur>y&F&TO_Eu85B)995fmJr#$@s{vHlcfumaMkuC9j&EIXN8 z9aDL^A!JL#*cPx-IyKf%>$;-U^lhstjjKjl1ECE8d~Lhf8<ii9%LfiHiwP|Liow*3 zl^-4WDtp9CD&#k;q<e?V(pOf}p?j&q;9CT^n>2|+?dnp>&1H^Wq5~88aq2kfTHu8& zspS@j(!yRI<Fx)3m!Ku7Bkjs7S0cnDc${*wAXW%ug_=-k%%~kRW89SbOHLbpWTFDq zZ{(dJm>#!5H)0I2&0&lnGHRrCA)%F8acLfH6{h;Utji%a67E}0HvrC{?drioL*NnV zRE#OM1a1w&X>@)QY4X^Sjlu!M=ukxcM3Vp^wNTTookLVRacP4$!HZ&6kZSDs8_w6^ z$+q9~!q>Tz79>tmPbP9TG#(C6%5@(bcai5}kPuM5Zz{6*wP&(6MYdBtM
@0CI>dXP
zw;kn$d8<?EqgA8vRJ*tymJJ#YCf!uMGb%Q$stHH;13T))If<U2CM$Rb*=MCzh0|VL
zME|Pl(}n6&AB&VlP;3w+;|yK>m{@sKhHl_t_a1U4KSPR3TS2o;D(kqDU1ZoSpyAFU
z4MxDY-s3Qu5%8OOzUnGP)!
7k!Cs7Qkgv_YSa2^?%KjPjvL_za<06wll)jdb$Vk zsT2$%B@P@A#WRpLv
;n{%dh0d)+6RSKOAye{*O<6vAGCLJ+eCccUhAX!12N0d}j
zJ)pIeUjvK%tyBY#QsaUzP;_2bfYS>GNgN-8jC0ZqAr3WmdDzx=&|j!^aGq)yhA
z)esKx$M{PD9=SQlPbUBAPpthQ*?&Y>X)>kV%;$j)?TJPgy6n{{W5^l@Hg=8?D>gR
zm}oC&(n>4<^!JV;pwiw6L+3CwaH@m9VrEER$$2C_BC-u$kH}7aF<t+1-T6MgIL#Y zz
t)^RZ988qwSmMOJ*XL!c#%wn<^@Sx13kFvh(fs7z%<t#JXET@^X6k5B>?LfpmR zjzj?1<LHQuM{1&=0XQ(clL9aaHND$tV>nadZEwPj)ZFwo?gybfJ?mEJX
7kWOFmwm
z4@34xvo{Yg_y`rfN1fw_B>?s)
Tq9MghCkQW!3GdChQGFe@j$vVaw&y(<DK_ik
z$u5dbvKG#eHwBxrb3@=VQECji$cK=7=cu?-B9PizfI+(brTSi0e@L2%xnp0OXIc$B
zR!qKf1bOL)M}%pw`gJnGGLm*aF2|P(t9A#Xl^rLvqOm>JZ8cbB(W1+~)L8F}Tqu
zK_$11edfi7io<ku?5uh;vJ}8h9IZHuomQWC|V#dbxFr;r3v2$18|i3Z1ozYYc<}Q
z(lWO<@62uVPXn!CC&qMqA9fP#;LAvtQ#+hh$sw4Q!IkCLbb(&qCoV=qedM(lcG7=
ziHu9OIv27!uM&u|lI6KkSjxs2=bCNNjcdJrJ{(u8teSA<K!@;6vpXMXf_VtY{40 zCmAK2rOLL2EGQjOEnK#8@H>~a;lLHO2AepSy
Blu1-%20(^6H$ylrPb<u#08Eaau=Bx(CmjL^OBZeGc#ComKoO#h2HBN6pOT{FBb
@sajGd
zO<M9p*&|tMY>|mfWOa&
zHW}M&@o^S2=f18v)l3Sj@q|xiOv)k_L8dSIdAo-f+E}}5^TX4SGrUL^#6dfdF1FGS
z*@1M(U3vE+$>1mb<TPvUE}10YRE>2##k8@$B9q9bW#=<VIRvwq+qCzDXJ5Fb^E|W=F{&F z1xH}jeW(dB?e3m>9!u93VEzk%7pc}kkB$
QEGx-zLzvl2yQ7fNEks(r_UAe!H-}r(
zjBrW7S#i@bra4eNR6QeQ8pM;6u1@iewj;KQ8>^#Mb61DQMMHYx32l=BgRV zY$R)hX(f2!!WZu6=QTYgkCG{r)45aFfV407bqG?&jKhvpI
G{u0FU^+W9K(s;BWU
zOby^ZJE{Z4g(Kb1q$3@Th57$63JTU6SS<&zR4*nZwNHV{6&i)m<0EG0?v}3U+_g
z47?Eh;yU{mH=Me5JAN_SBQmZ5xt|gFg~}y<(mhG)NJ%3X+*Hb
Bgc!6{pi0Us+$$
zYRc9@Ay()J=z$QbiUKU@(Tww;mH4rUrzkL>4sQxQqdbCbpTO801+lN_$eFoa9YMt
zOxPI=%;iE6q}JH0VwFeu-oW=llQ(+5HLEydHS&xd;8|0{3ZOByzG0F+-su^sVzEO z-8#}6hi
%=u{49#J-v6Z9i$MShb>LKJ{RFhyZ@qEZ%5Vn~mC3_w>$tS_gCMfF2B3 zd4>ZPu{a)LdJ;&8HIvxFRq9HD_jzQRW;>1<YzzXko(8kFro7m}Y;3oe)#POn
+PPe
zrM4)w)S+&rsTL=YrXh9!yv|^!RMMryU@-|U@dNEWq|Syld-}pH#h;saxCK=k7I5
z{wC0r@H)xWq9SY-t+gI;6CP=@j6sf|X4Zs7idN@tPoDQCMAD!T=&x4LBrKjxA81gd
zNlPFY^XDg%v=?Cv10U0NyP!vzA4fh)iJBYe6ND;{@_XTo1{^+GWDx2n=IS7q@Uk;y
zYyCLQAt?JMufGf}HBfaB7;e00Eg;ez+|9K(qNPB0F5
zc2RP6GL1km{spN><|x^j8hs4=IIhu_Tfy_D3}t
yyaxR!zn4i9
z0FAW1GAUL%P(!8CNnVC-rjSemRggWU;3iKtA2S<T^EcVy?3hCO$A=6E}(Q*7I&$}
zPhQ*=_R*ZoGMX3nbXOg*xlmT_lC3NQ-Mj{84Ml^O3ZNAXMMESN^xd&&0I66s+@J@ zX1(^vEwkk<{;r5FZtdfM;S5nSBA>$J2q%>1GAbD$uH&K9RwJd6+8<%;!#Xr3?$?0H zMtivTZeMjgeqo6@x=3oHak$Kc(xz1EX4ra%#j^f@%4}
QDEFb?mlK7$OsCHx7-C=BR0b+jmCS4dU+KpiN<SC7<M6Z|ar
l3yI_
zDAx+yC7L8Nlafl7FC8dM=E4F#tR|kcbSmHFtcXHzo0xY?LMZ?wpRC#Q>5!*MDnq? zHH(3AJjo6s@x-(hMU+GFIdrfv!#{M5Kz@>lsbuuoc=?oH+oWuuwz+^<DvN9qP^CXK zY)Y*2sDGpS8=m7|L-viv8ok$e>s0u<JLNa;QE;)3%6c7V0n<U*i*<S
Pk;07lQSz|
zePVoF<pe$OzGNcMJ0h-d-G=$<0me&x2CqLA+JY5^)#VdNlwX@RB01G!|-dXe*tyu zSq}tBiYGBVMShR!yVj
%+$xA)0a2{H8%cR|4PS){KTrH};^pJSFHx1r2tpwgSS)!Y
zE<93lCbHw^n5fQIN$|+lg}|VAv&UXtm-N|^jmoWfHyFFG<-ux9?ar@dza70^N>H==
zfz$3ep@e;-2mfagPg5CJEnT)q<Zc=8#okm#hih{Gi#56L$<Q<Zv$&cMX^m4=uts2
z_GC`zUtw>SIzstzdg#_l)#8|{AH!u&^Atb>SFbVNKs#3ABN#g1v@>6?1089^JJ
z1X^t&2v<sz<VDA$=||LrNzX2$SOHLgqGs*{C%iUtMK4?fn=wxd|Bb{S3tBog+;of}5Lw!>-U;nFDjst8FDgv z
q;L}a{;&;q_6{A!w3K7u7E4*y+km%DBS zp
xkDKNqbt1mIh1_&$c@zU1Jg^i98&_M)8gVTVW=I*7H(Aa%~+Y><7xO(9s+Abxx zSY+Xaw#IT6G|bo9+W1{Rt)~c=AAKjTzY^CT1jB;!MYjq>URD&HRVv<-iZh=LHE23Y zVlp!9hPOdb-gWnj#dzy7_~(k	)m!m9K_wN>6vMVAf;4m=w~Z0Bv8Qt=gpdPP~i$ ztiROj@J^c1b+GYTqIn4Tnv03MP<drA?ZD5$2K8$*-5g(-SHZ?qiBw3;)hwVcI*%fY z=%laJ_>5%s&VrkZ)x1Hi2FH{zv*r0!#;i?nA#tbc#enyam+*QY6W)lUwnjU!pivFR zA91C@>ocBkGMCTct8&=UuPhM3VOES6c?(-q-&esNZw~Y%TQqUM)HVRL)ak7}lODXG zngMHJ0u-5SGoFfaFGN%QwupeU=;Gb%Cy}#tC_e7G-!Xuflakg5kgTtA^wf0|3&}TU zE)~*?(60)7F|_!AehF4{T=L3sl;_K&^6&L#&eHo=4;7)8W~;LR+BWh%k7y<cUz(DB zqV{}K-ir%pfEfBKsuqB2^Rf+w@4I
<eZ{kKQ;dO}c|Hj)idk4ygSpX&jR;e?_f_$D
z>U?d_oB^?gNHxN_eRJ--X@T?xQ%g@+zNsoJaN0yWHRf_i_8A3G6T>LVKoh-Q&%7W zYxu=3N>Gd#iG=mSZscP0M?fxb7UR*20#>F&ycg7Aka6$)H)<!2{5MiZbM6ni<5@86 zcy1nJ$j71n0b;j1t_dwQLB}4Y?!wY(#%+3yW?TKK)9F)Vh8zO?djNeaZuNS^)*7(x zh>tuGjeE{;0lx3C>I4p0|FZ$|Z@j-O0(;)ypdIaJCf(!|
WQE^{WG;O1tU^0%Ns
z!PcPmG^ow1=tB3(_J)Ie=fV?LUs%;#UXZHKSPqQ!h0Qs<`I_&SH+<U-HP}PvCK+Yn
zpA^ysN5O}MbmL$XWf>1uf#mc(B{ZSPa%Jj2OlnKO07pqR4vjIm$sL7+#Lze5qP_h
zkN6x&q;td4GsU=6|)#$2ut;rpX0c=a0D?Gem!YmmD-}j59D*ssZ{m9hj{Af1N{H2
z|1HlI4sp9TmfZ$vieY4sP2)Qu3ym<ii<8?x#@WsLupL{CJXndF8kEHUD=jT;l88 zEOhwp{2OPStXHY_u$3oEUq^YjL@Z>NN*(V_T~{_!
q|5W&+2(Os)J>#qb^@9a&u_ ztTWB8e338F
G5bXzx&PK|MKsC_lN)RuYdUcZ~yZz|M>fV`t2Y7{)F!?HTn-Hi#
N{N=y<<?ny<{{a<dc(MQh